1.3.49
 
Loading...
Searching...
No Matches
CanopyGenerator.h
Go to the documentation of this file.
1
16#ifndef CANOPY_GENERATOR
17#define CANOPY_GENERATOR
18
19#include <random>
20#include "Context.h"
21
22class CanopyGenerator;
23
26
29
33 BaseCanopyParameters(const pugi::xml_node canopy_node);
34
35 virtual ~BaseCanopyParameters() = default;
36
38
41 void readParametersFromXML(const pugi::xml_node canopy_node);
42
44 virtual void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) = 0;
45
47 virtual void buildCanopy(CanopyGenerator &canopy_generator) = 0;
48
51
54};
55
58
61
65 HomogeneousCanopyParameters(const pugi::xml_node canopy_node);
66
68
71 void readParametersFromXML(const pugi::xml_node canopy_node);
72
74 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
75
77 void buildCanopy(CanopyGenerator &canopy_generator) override;
78
81
84
86 std::string leaf_texture_file;
87
90
93
96
99
102
104 std::vector<float> leaf_angle_PDF;
105
107 std::string buffer;
108};
109
112
115
119 SphericalCrownsCanopyParameters(const pugi::xml_node canopy_node);
120
122
125 void readParametersFromXML(const pugi::xml_node canopy_node);
126
128 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
129
131 void buildCanopy(CanopyGenerator &canopy_generator) override;
132
135
138
140 std::string leaf_texture_file;
141
144
147
150
153
156
159
162
164 std::vector<float> leaf_angle_PDF;
165};
166
169
172
176 ConicalCrownsCanopyParameters(const pugi::xml_node canopy_node);
177
179
182 void readParametersFromXML(const pugi::xml_node canopy_node);
183
185 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
186
188 void buildCanopy(CanopyGenerator &canopy_generator) override;
189
192
195
197 std::string leaf_texture_file;
198
201
204
207
210
213
216
219
222
224 std::vector<float> leaf_angle_PDF;
225};
226
228
231
235 BaseGrapeVineParameters(const pugi::xml_node canopy_node);
236
237 virtual ~BaseGrapeVineParameters() = default;
238
240
243 void readParametersFromXML(const pugi::xml_node canopy_node);
244
246 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
247
249 void buildCanopy(CanopyGenerator &canopy_generator) override;
250
255
258
260 std::string leaf_texture_file;
261
263 std::string wood_texture_file;
264
269
272
274
278
283
288
293
298
303
308
313
318
323
328
333
336
341
346
351
354
359
361 std::vector<float> leaf_angle_PDF;
362
365};
366
369
372
376 VSPGrapevineParameters(const pugi::xml_node canopy_node);
377
379
382 void readParametersFromXML(const pugi::xml_node canopy_node);
383
385 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
386
388 void buildCanopy(CanopyGenerator &canopy_generator) override;
389};
390
393
396
400 SplitGrapevineParameters(const pugi::xml_node canopy_node);
401
403
406 void readParametersFromXML(const pugi::xml_node canopy_node);
407
409 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
410
412 void buildCanopy(CanopyGenerator &canopy_generator) override;
413
418
423
428};
429
432
435
439 UnilateralGrapevineParameters(const pugi::xml_node canopy_node);
440
442
445 void readParametersFromXML(const pugi::xml_node canopy_node);
446
448 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
449
451 void buildCanopy(CanopyGenerator &canopy_generator) override;
452};
453
454
457
460
464 GobletGrapevineParameters(const pugi::xml_node canopy_node);
465
467
470 void readParametersFromXML(const pugi::xml_node canopy_node);
471
473 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
474
476 void buildCanopy(CanopyGenerator &canopy_generator) override;
477};
478
481
484
488 WhiteSpruceCanopyParameters(const pugi::xml_node canopy_node);
489
491
494 void readParametersFromXML(const pugi::xml_node canopy_node);
495
497 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
498
500 void buildCanopy(CanopyGenerator &canopy_generator) override;
501
504
507
510
513
515 std::string wood_texture_file;
516
519
522
525
528
531
534
537
540
543
546
549
552};
553
556
559
563 TomatoParameters(const pugi::xml_node canopy_node);
564
566
569 void readParametersFromXML(const pugi::xml_node canopy_node);
570
572 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
573
575 void buildCanopy(CanopyGenerator &canopy_generator) override;
576
579
582
584 std::string leaf_texture_file;
585
588
591
594
597
600
603
606
609
612};
613
616
619
623 StrawberryParameters(const pugi::xml_node canopy_node);
624
626
629 void readParametersFromXML(const pugi::xml_node canopy_node);
630
632 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
633
635 void buildCanopy(CanopyGenerator &canopy_generator) override;
636
639
642
644 std::string leaf_texture_file;
645
648
651
654
657
660
663
666
669
672
675
678
681};
682
685
688
692 WalnutCanopyParameters(const pugi::xml_node canopy_node);
693
695
698 void readParametersFromXML(const pugi::xml_node canopy_node);
699
701 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
702
704 void buildCanopy(CanopyGenerator &canopy_generator) override;
705
708
711
713 std::string leaf_texture_file;
714
716 std::string wood_texture_file;
717
720
723
726
729
730
733
736
739
742
745
748};
749
752
755
759 SorghumCanopyParameters(const pugi::xml_node canopy_node);
760
762
765 void readParametersFromXML(const pugi::xml_node canopy_node);
766
768 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
769
771 void buildCanopy(CanopyGenerator &canopy_generator) override;
772
775
776 // STAGE 1
777
780
783
786
789
792
795
798
801
804
807
810
811 // STAGE 2
812
815
818
821
824
827
830
833
836
839
842
845
848
851
854
857
858 // STAGE 3
859
862
865
868
871
874
877
880
883
884 // STAGE 4
885
888
891
894
897
900
903
906
909
912
915
918
919 // STAGE 5
920
923
926
929
932
935
938
941
944
947
950
953
956
957 // CANOPY
960
963
966};
967
970
973
977 BeanParameters(const pugi::xml_node canopy_node);
978
980
983 void readParametersFromXML(const pugi::xml_node canopy_node);
984
986 void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override;
987
989 void buildCanopy(CanopyGenerator &canopy_generator) override;
990
993
996
998 std::string leaf_texture_file;
999
1002
1005
1008
1011
1014
1017
1020
1023
1026
1029
1032
1035};
1036
1038public:
1040
1043 explicit CanopyGenerator(helios::Context *context);
1044
1046 static int selfTest(int argc = 0, char **argv = nullptr);
1047
1049 template<typename CanopyType, typename... Args>
1050 void storeCanopyParameters(Args &&...args);
1051
1052 std::vector<std::shared_ptr<BaseCanopyParameters>> getCanopyParametersList();
1053
1055
1059 void loadXML(const char *filename, bool build = true);
1060
1062 void buildCanopies();
1063
1065
1068 void buildCanopy(const HomogeneousCanopyParameters &params);
1069
1071
1074 void buildCanopy(const SphericalCrownsCanopyParameters &params);
1075
1077
1080 void buildCanopy(const ConicalCrownsCanopyParameters &params);
1081
1083
1086 void buildCanopy(const VSPGrapevineParameters &params);
1087
1089
1092 void buildCanopy(const SplitGrapevineParameters &params);
1093
1095
1098 void buildCanopy(const UnilateralGrapevineParameters &params);
1099
1101
1104 void buildCanopy(const GobletGrapevineParameters &params);
1105
1107
1110 void buildCanopy(const WhiteSpruceCanopyParameters &params);
1111
1113
1116 void buildCanopy(const TomatoParameters &params);
1117
1119
1122 void buildCanopy(const StrawberryParameters &params);
1123
1125
1128 void buildCanopy(const WalnutCanopyParameters &params);
1129
1131
1134 void buildCanopy(const SorghumCanopyParameters &params);
1135
1137
1140 void buildCanopy(const BeanParameters &params);
1141
1143
1150 void buildGround(const helios::vec3 &ground_origin, const helios::vec2 &ground_extent, const helios::int2 &texture_subtiles, const helios::int2 &texture_subpatches, const char *ground_texture_file);
1151
1153
1161 void buildGround(const helios::vec3 &ground_origin, const helios::vec2 &ground_extent, const helios::int2 &texture_subtiles, const helios::int2 &texture_subpatches, const char *ground_texture_file, float ground_rotation);
1162
1164
1167 std::vector<uint> getTrunkUUIDs(uint PlantID);
1168
1170 std::vector<uint> getTrunkUUIDs();
1171
1173
1176 std::vector<uint> getBranchUUIDs(uint PlantID);
1177
1179 std::vector<uint> getBranchUUIDs();
1180
1182
1186 std::vector<std::vector<uint>> getLeafUUIDs(uint PlantID);
1187
1189 std::vector<uint> getLeafUUIDs();
1190
1192
1196 std::vector<std::vector<std::vector<uint>>> getFruitUUIDs(uint PlantID);
1197
1199 std::vector<uint> getFruitUUIDs();
1200
1202 std::vector<uint> getGroundUUIDs();
1203
1205
1208 std::vector<uint> getAllUUIDs(uint PlantID);
1209
1212
1214
1217 void seedRandomGenerator(uint seed);
1218
1220 void disableMessages();
1221
1223 void enableMessages();
1224
1225 //---------- PLANT GEOMETRIES ------------ //
1226
1228
1231 void buildIndividualPlants(helios::vec3 position);
1232
1234 void buildIndividualPlants();
1235
1237
1244 std::vector<std::vector<uint>> addGrapeCluster(helios::vec3 position, float grape_rad, float cluster_rad, helios::RGBcolor grape_color, uint grape_subdiv);
1245
1247
1252 uint grapevineVSP(const VSPGrapevineParameters &params, const helios::vec3 &origin);
1253
1255
1260 uint grapevineSplit(const SplitGrapevineParameters &params, const helios::vec3 &origin);
1261
1263
1269
1271
1276 uint grapevineGoblet(const GobletGrapevineParameters &params, const helios::vec3 &origin);
1277
1279
1284 uint whitespruce(const WhiteSpruceCanopyParameters &params, const helios::vec3 &origin);
1285
1287
1292 uint tomato(const TomatoParameters &params, const helios::vec3 &origin);
1293
1295
1300 uint strawberry(const StrawberryParameters &params, const helios::vec3 &origin);
1301
1303
1308 uint walnut(const WalnutCanopyParameters &params, const helios::vec3 &origin);
1309
1311
1316 uint sorghum(const SorghumCanopyParameters &params, const helios::vec3 &origin);
1317
1319
1324 uint bean(const BeanParameters &params, const helios::vec3 &origin);
1325
1327 void createElementLabels();
1328
1330 void disableElementLabels();
1331
1332private:
1333 helios::Context *context;
1334
1336 std::vector<std::shared_ptr<BaseCanopyParameters>> canopy_parameters_list;
1337
1339
1342 std::vector<std::vector<uint>> UUID_trunk;
1343
1345
1348 std::vector<std::vector<uint>> UUID_branch;
1349
1351
1354 std::vector<std::vector<std::vector<uint>>> UUID_leaf;
1355
1357
1360 std::vector<std::vector<std::vector<std::vector<uint>>>> UUID_fruit;
1361
1363 std::vector<uint> UUID_ground;
1364
1365 std::vector<uint> leaf_prototype_global;
1366
1367 float sampleLeafAngle(const std::vector<float> &leafAngleDist);
1368
1369 float sampleLeafPDF(const char *distribution);
1370
1371 std::minstd_rand0 generator;
1372
1373 bool printmessages;
1374
1375 bool enable_element_labels;
1376
1377 void cleanDeletedUUIDs(std::vector<uint> &UUIDs);
1378
1379 void cleanDeletedUUIDs(std::vector<std::vector<uint>> &UUIDs);
1380
1381 void cleanDeletedUUIDs(std::vector<std::vector<std::vector<uint>>> &UUIDs);
1382};
1383
1385
1390float getVariation(float V, std::minstd_rand0 &generator, bool positive = false);
1391
1393
1398int getVariation(int V, std::minstd_rand0 &generator, bool positive = false);
1399
1401
1405uint getVariation(uint V, std::minstd_rand0 &generator);
1406
1408
1412helios::vec3 interpolateTube(const std::vector<helios::vec3> &P, float frac);
1413
1415
1419float interpolateTube(const std::vector<float> &P, float frac);
1420
1422
1427float evaluateCDFresid(float thetaL, std::vector<float> &ru_v, const void *a_distribution);
1428
1429#endif // CANOPY_GENERATOR