1.3.49
 
Loading...
Searching...
No Matches
ProjectBuilder.h
Go to the documentation of this file.
1
16#ifndef PROJECT_BUILDER
17#define PROJECT_BUILDER
18
19// #pragma once
20
21#include <set>
22
23#include "Context.h"
24
25// Forward Declaration
29class RadiationModel;
30class SolarPosition;
31class Visualizer;
33class CanopyGenerator;
34void BuildGeometry(const std::string &xml_input_file, PlantArchitecture *plant_architecture_ptr, helios::Context *context_ptr);
35void InitializeRadiation(const std::string &xml_input_file, SolarPosition *solarposition_ptr, RadiationModel *radiation_ptr, helios::Context *context_ptr);
36void InitializeEnergyBalance(const std::string &xml_input_file, BLConductanceModel *boundarylayerconductancemodel, EnergyBalanceModel *energybalancemodel, helios::Context *context_ptr);
37void InitializeSimulation(const std::string &xml_input_file, helios::Context *context_ptr);
38
39
40#ifdef ENABLE_BOUNDARYLAYERCONDUCTANCEMODEL
42#endif // BOUNDARYLAYERCONDUCTANCEMODEL
43
44#ifdef ENABLE_ENERGYBALANCEMODEL
45#include "EnergyBalanceModel.h"
46#endif // ENERGYBALANCEMODEL
47
48#if defined(ENABLE_BOUNDARYLAYERCONDUCTANCEMODEL) && defined(ENABLE_ENERGYBALANCEMODEL)
49#include "InitializeEnergyBalance.h"
50#endif // BOUNDARYLAYERCONDUCTANCEMODEL && ENERGYBALANCEMODEL
51
52#ifdef ENABLE_PLANT_ARCHITECTURE
53#include "BuildGeometry.h"
54#include "PlantArchitecture.h"
55#endif // PLANT_ARCHITECTURE
56
57#ifdef ENABLE_CANOPY_GENERATOR
58#include "CanopyGenerator.h"
59#endif // CANOPY_GENERATOR
60
61#ifdef ENABLE_RADIATION_MODEL
62#include "InitializeRadiation.h"
63#include "RadiationModel.h"
64#endif // RADIATION_MODEL
65
66#ifdef ENABLE_SOLARPOSITION
67#include "SolarPosition.h"
68#endif // SOLARPOSITION
69
70#ifdef ENABLE_HELIOS_VISUALIZER
71#include "Visualizer.h"
72// Forward declarations to avoid pulling in heavy OpenGL/ImGui headers
73struct ImVec2;
74struct ImVec4;
75struct ImGuiIO;
76struct ImFont;
77#endif // HELIOS_VISUALIZER
78
79
81
84std::string vec_to_string(const helios::vec2 &v);
85
87
90std::string vec_to_string(const helios::vec3 &v);
91
93
96std::string vec_to_string(const helios::int2 &v);
97
99
104[[nodiscard]] std::vector<helios::vec3> interpolate(const std::vector<int> &keypoints, const std::vector<helios::vec3> &positions, int num_points);
105
107
111void toggle_button(const char *str_id, bool *v);
112
114std::string file_dialog();
115
117
120std::string save_as_file_dialog(std::vector<std::string> extensions);
121
123
128[[nodiscard]] std::vector<std::string> get_xml_node_values(const std::string &xml_file, const std::string &label_name, const std::string &node_name);
129
131union digitPtr {
132 int *i;
133 float *f;
134};
135
137struct obj {
138 int idx;
139 bool isCanopy;
140};
141
143struct taggedPtr {
144 digitPtr ptr;
145 bool isInt;
146 bool *dirty;
147};
148
150
154[[nodiscard]] taggedPtr createTaggedPtr(int *ptr, bool *dirty);
155
157
161[[nodiscard]] taggedPtr createTaggedPtr(float *ptr, bool *dirty);
162
164
167[[nodiscard]] taggedPtr createTaggedPtr(int *ptr);
168
170
173[[nodiscard]] taggedPtr createTaggedPtr(float *ptr);
174
177 std::normal_distribution<float> *normal;
178 std::uniform_real_distribution<float> *uniform;
179 std::weibull_distribution<float> *weibull;
180};
181
184 distUnion dist;
185 int flag;
186 bool repeat;
187};
188
190struct bandGroup {
191 std::vector<std::string> bands;
192 bool grayscale;
193 bool norm;
194};
195
197struct canopy {
198 int idx;
199 float age;
200 float ground_clipping_height;
201 std::string label;
202 std::string library_name;
203 std::string library_name_verbose;
204 std::vector<uint> IDs;
205 std::vector<helios::vec3> individual_plant_locations;
206 helios::vec2 plant_spacing;
207 helios::int2 plant_count;
208 helios::vec3 origin;
209 std::string data_group;
210 bool is_dirty;
211};
212
214struct object {
215 int index;
216 std::string name;
217 std::string file;
218 std::string data_group;
219 std::vector<uint> UUIDs;
220 helios::vec3 position;
221 helios::vec3 prev_position;
222 helios::vec3 orientation;
223 helios::vec3 prev_orientation;
224 helios::vec3 scale;
225 helios::vec3 prev_scale;
226 helios::RGBcolor color;
227 helios::RGBcolor prev_color;
228 bool use_texture_file;
229 bool is_dirty;
230};
231
233struct rig {
234 std::string label;
235 std::vector<distribution> position_noise;
236 helios::RGBcolor color;
237 helios::vec3 position;
238 helios::vec3 lookat;
239 std::set<std::string> camera_labels;
240 std::set<std::string> light_labels;
241 bool write_depth;
242 bool write_norm_depth;
243};
244
245bool parse_distribution(const std::string &input_string, distribution &converted_distribution);
246
248
252distribution createDistribution(const std::normal_distribution<float> &dist, bool randomize_repeat);
253
255
259distribution createDistribution(const std::uniform_real_distribution<float> &dist, bool randomize_repeat);
260
262
266distribution createDistribution(const std::weibull_distribution<float> &dist, bool randomize_repeat);
267
268
270private:
272 pugi::xml_document xmldoc;
273
275 std::string xml_input_file = "plugins/projectbuilder/inputs/inputs.xml";
276
278 bool user_input;
279
281 bool light_coord_type = false;
282
284 bool is_dirty = false;
285
287 bool built = false;
288
290 float PAR_absorbed;
291
293 float NIR_absorbed;
294
296 float LW_absorbed;
297
299 float turbidity;
300
302 float diffuse_extinction_coeff = 0.1;
303
305 bool enforce_periodic_boundary_x = true;
306
308 bool enforce_periodic_boundary_y = true;
309
311 uint sun_ID;
312
314 std::vector<std::string> bandlabels;
315
317 std::set<std::string> band_group_names;
318
320 std::map<std::string, bandGroup> band_group_lookup;
321
323 std::string current_band_group;
324
326 std::set<std::string> bandlabels_set;
327
329 std::set<std::string> bandlabels_set_emissivity;
330
332 std::set<std::string> bandlabels_set_wavelength;
333
335 std::map<std::string, int> direct_ray_count_dict;
336
338 std::map<std::string, int> diffuse_ray_count_dict;
339
341 std::map<std::string, int> scattering_depth_dict;
342
344 std::string new_band_label;
345
347 float wavelength_min = 400.0f;
348
350 float wavelength_max = 700.0f;
351
353 bool enable_wavelength;
354
356 bool enable_emission;
357
359 std::vector<uint> ground_UUIDs;
360
362 uint ground_objID;
363
365 std::vector<uint> leaf_UUIDs;
366
368 std::vector<uint> petiolule_UUIDs;
369
371 std::vector<uint> petiole_UUIDs;
372
374 std::vector<uint> internode_UUIDs;
375
377 std::vector<uint> peduncle_UUIDs;
378
380 std::vector<uint> petal_UUIDs;
381
383 std::vector<uint> flower_UUIDs;
384
386 std::vector<uint> sepal_UUIDs;
387
389 std::vector<uint> pedicel_UUIDs;
390
392 std::vector<uint> fruit_UUIDs;
393
395 std::vector<std::string> primitive_names = {"All", "ground", "leaf", "petiolule", "petiole", "internode", "peduncle", "petal", "pedicel", "fruit"};
396
398 std::map<std::string, bool> bounding_boxes = {
399 {"plantID", false}, {"leafID", false}, {"peduncleID", false}, {"closedflowerID", false}, {"openflowerID", false}, {"fruitID", false}, {"rank", false}, {"age", false}, {"carbohydrate_concentration", false}};
400
402 std::map<std::string, int> bounding_boxes_map;
403
405 std::set<std::string> primitive_names_set = {"All", "ground", "leaf", "petiolule", "petiole", "internode", "peduncle", "petal", "pedicel", "fruit"};
406
408 std::map<std::string, std::vector<uint> *> primitive_addresses;
409
411 std::map<std::string, std::vector<uint>> primitive_UUIDs;
412
414 std::map<std::string, std::map<std::string, std::vector<uint>>> primitive_UUIDs_dict;
415
417 std::map<std::string, std::vector<bool>> primitive_continuous;
418
420 std::map<std::string, std::map<std::string, std::vector<bool>>> primitive_continuous_dict;
421
423 std::map<std::string, std::vector<std::string>> primitive_spectra;
424
426 std::map<std::string, std::map<std::string, std::vector<std::string>>> primitive_spectra_dict;
427
429 std::map<std::string, std::map<std::string, std::vector<float>>> primitive_values;
430
432 std::map<std::string, std::map<std::string, std::map<std::string, std::vector<float>>>> primitive_values_dict;
433
435 std::set<std::string> data_groups_set = {"All"};
436
438 float ground_area;
439
441 std::vector<std::string> timeseries_variables;
442
444 float air_temperature = 300.f;
445
447 float air_humidity = 0.5f;
448
450 helios::vec3 sun_dir_vec;
451
453 float R_PAR_dir;
454
456 float R_NIR_dir;
457
459 float fdiff;
460
462 std::string xml_error_string;
463
465 std::vector<std::string> rig_labels;
466
468 std::vector<std::vector<distribution>> rig_position_noise;
469
471 std::vector<std::vector<distribution>> rig_lookat_noise;
472
474 std::vector<helios::RGBcolor> rig_colors;
475
477 std::vector<helios::vec3> camera_positions;
478
480 std::vector<helios::vec3> camera_lookats;
481
483 std::vector<std::string> camera_labels;
484
486 std::vector<helios::int2> camera_resolutions;
487
489 std::vector<float> focal_plane_distances;
490
492 std::vector<float> lens_diameters;
493
495 std::vector<float> FOV_aspect_ratios;
496
498 std::vector<float> HFOVs;
499
501 std::map<std::string, int> rig_dict;
502
504 std::set<std::string> rig_labels_set;
505
507 std::vector<bool> write_depth;
508
510 std::vector<bool> write_norm_depth;
511
513 helios::vec3 camera_position = {0, 0, 0};
514
516 std::vector<std::vector<int>> keypoint_frames;
517
519 std::vector<std::vector<helios::vec3>> camera_position_vec;
520
522 std::vector<std::vector<helios::vec3>> camera_lookat_vec;
523
525 helios::vec3 camera_lookat = {0, 0, 0};
526
528 std::string camera_label = "RGB";
529
531 int num_images = 5;
532
534 std::vector<int> num_images_vec;
535
537 std::vector<std::string> camera_names;
538
540 std::set<std::string> camera_names_set;
541
543 helios::int2 camera_resolution = {1024, 1024};
544
546 float focal_plane_distance = 0.4;
547
549 float lens_diameter = 0.02;
550
552 float FOV_aspect_ratio = 1.4;
553
555 float HFOV = 50.0;
556
558 std::map<std::string, int> camera_dict;
559
561 std::vector<std::set<std::string>> rig_camera_labels;
562
564 std::vector<std::string> light_names;
565
567 std::set<std::string> light_names_set;
568
570 std::vector<std::string> light_types;
571
573 // std::vector<std::string> all_light_types = {"collimated", "sphere", "sunsphere", "rectangle", "disk"};
574 std::vector<std::string> all_light_types = {"sphere", "rectangle", "disk"};
575
577 std::vector<helios::vec3> light_direction_vec;
578
580 std::vector<helios::SphericalCoord> light_direction_sph_vec;
581
583 std::vector<helios::vec3> light_rotation_vec;
584
586 std::vector<helios::vec2> light_size_vec;
587
589 std::vector<float> light_radius_vec;
590
592 std::vector<float> light_flux_vec;
593
595 std::map<std::string, int> light_dict;
596
598 std::vector<std::set<std::string>> rig_light_labels;
599
601 std::map<std::string, std::vector<std::vector<uint>>> arrow_dict;
602
604 int arrow_count = 0;
605
607 pugi::xml_node helios;
608
610 bool enable_coordinate_axes = true;
611
613 bool enable_colorbar = false;
614
616 float latitude = 38.55;
617
619 float longitude = 121.76;
620
622 int UTC_offset = 8;
623
625 std::string csv_weather_file = "plugins/projectbuilder/inputs/weather_data.csv";
626
628 std::string cimis_weather_file;
629
631 bool is_weather_file_csv = true;
632
634 helios::vec3 domain_origin = {0, 0, 0};
635
637 helios::vec2 domain_extent = {10, 10};
638
640 helios::int2 ground_resolution = {1, 1};
641
643 std::string ground_texture_file = "plugins/projectbuilder/inputs/dirt.jpg";
644
646 int ground_flag = 1;
647
648 bool use_ground_texture = true;
649
651 float ground_color[3] = {0.0, 0.0, 0.0};
652
654 std::string ground_model_file;
655
657 std::vector<std::string> canopy_labels;
658
660 std::set<std::string> canopy_labels_set;
661
663 std::vector<std::string> canopy_data_groups;
664
666 helios::vec3 canopy_origin = {0, 0, 0};
667
669 std::vector<helios::vec3> canopy_origins;
670
672 helios::int2 plant_count = {1, 1};
673
675 std::vector<helios::int2> plant_counts;
676
678 helios::vec2 plant_spacing = {0.5, 0.5};
679
681 std::vector<helios::vec2> plant_spacings;
682
684 std::vector<std::vector<helios::vec3>> individual_plant_locations;
685
687 std::string plant_library_name = "cowpea";
688
690 std::string plant_library_name_verbose = "Cowpea (Vigna unguiculata)";
691
693 std::vector<std::string> plant_library_names;
694
696 std::vector<std::string> plant_library_names_verbose;
697
699 std::set<std::string> plant_types = {"almond", "apple", "bindweed", "butterlettuce", "cheeseweed", "bean", "cowpea", "easternredbud", "grapevine_VSP", "maize",
700 "olive", "pistachio", "puncturevine", "rice", "sorghum", "soybean", "sugarbeet", "tomato", "walnut", "wheat"};
701
703 std::set<std::string> plant_types_verbose = {"Almond Tree (Prunus dulcis)", "Apple Tree (Malus pumila)",
704 "Bindweed (Convolvulus arvensis)", "Butter Lettuce (Lactuca sativa)",
705 "Cheeseweed (Malva neglecta)", "Common Bean (Phaseolus vulgaris)",
706 "Cowpea (Vigna unguiculata)", "Eastern Redbud (Cercis canadensis)",
707 "Grapevine (Vitis vinifera)", "Maize (Zea mays)",
708 "Olive Tree (Olea europaea)", "Pistachio Tree (Pistachia vera)",
709 "Puncturevine (Tribulus terrestris)", "Rice (Oryza sativa)",
710 "Sorghum (Sorghum bicolor)", "Soybean (Glycine max)",
711 "Sugar Beet (Beta vulgaris)", "Tomato (Solanum lycopersicum)",
712 "Walnut Tree (Juglans regia)", "Wheat (Triticum aestivum)"};
713
715 std::map<std::string, std::string> plant_type_lookup = {{"Almond Tree (Prunus dulcis)", "almond"},
716 {"Apple Tree (Malus pumila)", "apple"},
717 {"Bindweed (Convolvulus arvensis)", "bindweed"},
718 {"Butter Lettuce (Lactuca sativa)", "butterlettuce"},
719 {"Cheeseweed (Malva neglecta)", "cheeseweed"},
720 {"Common Bean (Phaseolus vulgaris)", "bean"},
721 {"Cowpea (Vigna unguiculata)", "cowpea"},
722 {"Eastern Redbud (Cercis canadensis)", "easternredbud"},
723 {"Grapevine (Vitis vinifera)", "grapevine_VSP"},
724 {"Maize (Zea mays)", "maize"},
725 {"Olive Tree (Olea europaea)", "olive"},
726 {"Pistachio Tree (Pistachia vera)", "pistachio"},
727 {"Puncturevine (Tribulus terrestris)", "puncturevine"},
728 {"Rice (Oryza sativa)", "rice"},
729 {"Sorghum (Sorghum bicolor)", "sorghum"},
730 {"Soybean (Glycine max)", "soybean"},
731 {"Sugar Beet (Beta vulgaris)", "sugarbeet"},
732 {"Tomato (Solanum lycopersicum)", "tomato"},
733 {"Walnut Tree (Juglans regia)", "walnut"},
734 {"Wheat (Triticum aestivum)", "wheat"}};
735
737 std::map<std::string, std::string> plant_type_verbose_lookup = {{"almond", "Almond Tree (Prunus dulcis)"},
738 {"apple", "Apple Tree (Malus pumila)"},
739 {"bindweed", "Bindweed (Convolvulus arvensis)"},
740 {"butterlettuce", "Butter Lettuce (Lactuca sativa)"},
741 {"cheeseweed", "Cheeseweed (Malva neglecta)"},
742 {"bean", "Common Bean (Phaseolus vulgaris)"},
743 {"cowpea", "Cowpea (Vigna unguiculata)"},
744 {"easternredbud", "Eastern Redbud (Cercis canadensis)"},
745 {"grapevine_VSP", "Grapevine (Vitis vinifera)"},
746 {"maize", "Maize (Zea mays)"},
747 {"olive", "Olive Tree (Olea europaea)"},
748 {"pistachio", "Pistachio Tree (Pistachia vera)"},
749 {"puncturevine", "Puncturevine (Tribulus terrestris)"},
750 {"rice", "Rice (Oryza sativa)"},
751 {"sorghum", "Sorghum (Sorghum bicolor)"},
752 {"soybean", "Soybean (Glycine max)"},
753 {"sugarbeet", "Sugar Beet (Beta vulgaris)"},
754 {"tomato", "Tomato (Solanum lycopersicum)"},
755 {"walnut", "Walnut Tree (Juglans regia)"},
756 {"wheat", "Wheat (Triticum aestivum)"}};
757
759 float plant_age = 0;
760
762 std::vector<float> plant_ages;
763
765 float ground_clipping_height = 0;
766
768 std::vector<float> ground_clipping_heights;
769
771 std::map<std::string, int> canopy_labels_dict;
772
774 std::vector<std::vector<uint>> canopy_IDs;
775
777 int direct_ray_count = 100;
778
780 int diffuse_ray_count = 1000;
781
783 int scattering_depth = 2;
784
786 float air_turbidity = 0.05;
787
789 std::vector<std::string> obj_files;
790
792 std::vector<std::vector<uint>> obj_UUIDs;
793
795 std::vector<std::string> obj_names;
796
798 std::set<std::string> obj_names_set;
799
801 std::string current_obj;
802
804 std::map<std::string, int> obj_names_dict;
805
807 std::vector<helios::vec3> obj_positions;
808
810 std::vector<helios::vec3> prev_obj_positions;
811
813 std::vector<helios::vec3> obj_orientations;
814
816 std::vector<helios::vec3> prev_obj_orientations;
817
819 std::vector<std::string> obj_data_groups;
820
822 std::vector<helios::vec3> prev_obj_scales;
823
825 std::vector<helios::vec3> obj_scales;
826
828 std::vector<helios::RGBcolor> obj_colors;
829
831 std::set<std::string> xml_library_files = {"plugins/radiation/spectral_data/leaf_surface_spectral_library.xml", "plugins/radiation/spectral_data/soil_surface_spectral_library.xml"};
832
834 std::set<std::string> possible_spectra;
835
837 std::set<std::string> camera_xml_library_files = {"plugins/radiation/spectral_data/camera_spectral_library.xml"};
838
840 std::vector<std::string> possible_camera_calibrations;
841
843 std::vector<std::map<std::string, std::string>> camera_calibrations;
844
846 std::string current_calibration_band;
847
849 std::set<std::string> light_xml_library_files = {"plugins/radiation/spectral_data/light_spectral_library.xml"};
850
852 std::vector<std::string> possible_light_spectra;
853
855 std::vector<std::string> light_spectra;
856
858 std::string solar_direct_spectrum = "solar_spectrum_direct_ASTMG173";
859
861 float reflectivity = 0.0;
862
864 float transmissivity = 0.0;
865
867 float emissivity = 1.0;
868
870 float leaf_reflectivity = 0.0;
871
873 float leaf_transmissivity = 0.0;
874
876 float leaf_emissivity = 0.0;
877
879 float ground_reflectivity = 0.0;
880
882 float ground_transmissivity = 0.0;
883
885 float ground_emissivity = 1.0;
886
888 float petiolule_reflectivity = 0.0;
889
891 float petiolule_transmissivity = 0.0;
892
894 float petiolule_emissivity = 0.0;
895
897 float petiole_reflectivity = 0.0;
898
900 float petiole_transmissivity = 0.0;
901
903 float petiole_emissivity = 0.0;
904
906 float internode_reflectivity = 0.0;
907
909 float internode_transmissivity = 0.0;
910
912 float internode_emissivity = 0.0;
913
915 float peduncle_reflectivity = 0.0;
916
918 float peduncle_transmissivity = 0.0;
919
921 float peduncle_emissivity = 0.0;
922
924 float petal_reflectivity = 0.0;
925
927 float petal_transmissivity = 0.0;
928
930 float petal_emissivity = 0.0;
931
933 float pedicel_reflectivity = 0.0;
934
936 float pedicel_transmissivity = 0.0;
937
939 float pedicel_emissivity = 0.0;
940
942 float fruit_reflectivity = 0.0;
943
945 float fruit_transmissivity = 0.0;
946
948 float fruit_emissivity = 0.0;
949
951 std::string reflectivity_spectrum;
952
954 std::string transmissivity_spectrum;
955
957 std::string emissivity_spectrum;
958
960 std::string leaf_reflectivity_spectrum = "grape_leaf_reflectivity_0000";
961
963 std::string leaf_transmissivity_spectrum = "grape_leaf_transmissivity_0000";
964
966 std::string leaf_emissivity_spectrum;
967
969 std::string ground_reflectivity_spectrum = "soil_reflectivity_0000";
970
972 std::string ground_transmissivity_spectrum;
973
975 std::string ground_emissivity_spectrum;
976
978 std::string petiolule_reflectivity_spectrum;
979
981 std::string petiolule_transmissivity_spectrum;
982
984 std::string petiolule_emissivity_spectrum;
985
987 std::string petiole_reflectivity_spectrum;
988
990 std::string petiole_transmissivity_spectrum;
991
993 std::string petiole_emissivity_spectrum;
994
996 std::string internode_reflectivity_spectrum;
997
999 std::string internode_transmissivity_spectrum;
1000
1002 std::string internode_emissivity_spectrum;
1003
1005 std::string peduncle_reflectivity_spectrum;
1006
1008 std::string peduncle_transmissivity_spectrum;
1009
1011 std::string peduncle_emissivity_spectrum;
1012
1014 std::string petal_reflectivity_spectrum;
1015
1017 std::string petal_transmissivity_spectrum;
1018
1020 std::string petal_emissivity_spectrum;
1021
1023 std::string pedicel_reflectivity_spectrum;
1024
1026 std::string pedicel_transmissivity_spectrum;
1027
1029 std::string pedicel_emissivity_spectrum;
1030
1032 std::string fruit_reflectivity_spectrum;
1033
1035 std::string fruit_transmissivity_spectrum;
1036
1038 std::string fruit_emissivity_spectrum;
1039
1041 std::set<std::string> visualization_types_primitive = {"radiation_flux_PAR", "radiation_flux_NIR", "radiation_flux_LW"};
1042
1044 std::set<std::string> visualization_types_object = {};
1045
1047 std::map<std::string, helios::HeliosDataType> primitive_data_types;
1048
1050 std::map<std::string, helios::HeliosDataType> object_data_types;
1051
1053 std::string visualization_type = "RGB";
1054
1056 std::string current_canopy;
1057
1059 std::string current_rig;
1060
1062 std::string current_cam;
1063
1065 std::string current_light;
1066
1068 std::string current_keypoint;
1069
1071 std::string current_primitive = "All";
1072
1074 std::string current_data_group = "All";
1075
1077 std::string current_band = "red";
1078
1080 std::string current_band_reflectivity = "red";
1081
1083 std::string current_band_transmissivity = "red";
1084
1086 std::string current_band_emissivity = "red";
1087
1089 std::map<std::string, std::vector<uint>> camera_models_dict;
1090
1092 void deleteArrows();
1093
1095
1098 void deleteCanopy(const std::string &canopy);
1099
1101
1104 void deleteObject(const std::string &obj);
1105
1107
1110 void updateCanopy(const std::string &canopy);
1111
1113 void addCanopy();
1114
1116 void updateArrows();
1117
1119 void updateCameraModels();
1120
1122 void deleteCameraModels();
1123
1125 void updateDataGroups();
1126
1128 void updatePrimitiveTypes();
1129
1131 helios::int2 dragging_start_position{0, 0};
1132
1134 std::string currently_dragging;
1135
1137 std::string currently_dragging_type;
1138
1140 bool disable_dragging = false;
1141
1143 void canopyTab(std::string curr_canopy_name, int id);
1144
1146 void rigTab(std::string curr_rig_name, int id);
1147
1149 void objectTab(std::string curr_obj_name, int id);
1150
1152 void saveObject(std::string file_name, std::vector<uint> obj_UUID_vec, std::string file_extension);
1153
1155 void saveCanopy(std::string file_name, std::vector<uint> canopy_ID_vec, helios::vec3 position, std::string file_extension) const;
1156
1158 void saveCanopy(std::string file_name_base, std::vector<uint> canopy_ID_vec, std::vector<helios::vec3> positions, std::string file_extension) const;
1159
1161 bool save_plants_individually = false;
1162
1164 void addBand(std::string label, float wavelength_min, float wavelength_max, bool enable_emission);
1165
1167 void addBand(std::string label, bool enable_emission);
1168
1170 std::map<std::string, std::string> distribution_types;
1171
1173 std::map<std::string, std::vector<float>> distribution_params;
1174
1176 std::map<std::string, int> distribution_dict;
1177
1179 std::map<std::string, taggedPtr> randomized_variable_lookup;
1180
1182 std::default_random_engine generator;
1183
1185 std::string current_distribution = "Normal (Gaussian)";
1186
1188 std::string current_axis = "X";
1189
1191 std::set<std::string> possible_axes = {"X", "Y", "Z"};
1192
1194 std::vector<std::string> distribution_names = {"N/A", "Normal (Gaussian)", "Uniform", "Weibull"};
1195
1197 std::vector<distribution> distributions;
1198
1200 std::vector<float> curr_distribution_params = {0.0, 0.0};
1201
1203 bool randomize_repeatedly = false;
1204
1206 std::streambuf *old_cout_stream_buf = std::cout.rdbuf();
1207
1209 std::stringstream captured_cout;
1210
1211 std::size_t last_console_size = 0;
1212
1214 int num_recordings = 1;
1215
1217 std::map<std::string, object> objects_dict;
1218
1220 std::map<std::string, canopy> canopy_dict;
1221
1223 int obj_idx = 0;
1224
1226 int canopy_idx = 0;
1227
1229 std::set<int> dirty_objects = {};
1230
1232 std::set<int> dirty_canopies = {};
1233
1235 std::set<std::string> lighting_models = {"None", "Phong", "Phong Shadowed"};
1236
1238 std::string lighting_model = "None";
1239
1241 helios::vec3 light_direction{0, 0, 1};
1242
1244 float light_intensity = 1.0;
1245
1247 helios::int2 num_tiles{5, 5};
1248
1249public:
1252
1255
1258
1261
1264
1267
1270
1273
1276
1278 static int selfTest(int argc = 0, char **argv = nullptr);
1279
1281 void updateSpectra();
1282
1284 void updateCameras();
1285
1287 void record();
1288
1290 void buildFromXML();
1291
1293
1296 void buildFromXML(std::string xml_input_file);
1297
1299 void visualize();
1300
1302 void buildAndVisualize();
1303
1305
1308 void buildAndVisualize(std::string xml_input_file);
1309
1311 void xmlSetValues();
1312
1314
1317 void xmlSetValues(std::string xml_path);
1318
1320 void xmlGetValues();
1321
1323
1326 void xmlGetValues(std::string xml_input_file);
1327
1329
1334 std::map<std::string, int> getNodeLabels(const std::string &label_name, const std::string &node_name, std::vector<std::string> &labels_vec);
1335
1337
1342 void getKeypoints(const std::string &name, const std::string &field, std::vector<std::vector<int>> &keypoints);
1343
1345
1350 void setKeypoints(const std::string &name, const std::string &field, std::vector<std::vector<int>> &keypoints);
1351
1353
1358 void xmlGetValue(const std::string &name, const std::string &parent, int &default_value);
1359
1361
1366 void xmlGetValue(const std::string &name, const std::string &parent, float &default_value);
1367
1369
1374 void xmlGetValue(const std::string &name, const std::string &parent, std::string &default_value);
1375
1377
1382 void xmlGetValue(const std::string &name, const std::string &parent, helios::vec2 &default_value);
1383
1385
1390 void xmlGetValue(const std::string &name, const std::string &parent, helios::vec3 &default_value);
1391
1393
1398 void xmlGetValue(const std::string &name, const std::string &parent, helios::int2 &default_value);
1399
1401
1406 void xmlGetDistribution(const std::string &name, const std::string &parent, distribution &distribution);
1407
1409
1414 void xmlSetDistribution(const std::string &name, const std::string &parent, distribution &distribution);
1415
1417
1422 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<helios::vec2> &default_vec);
1423
1425
1430 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<helios::vec3> &default_vec);
1431
1433
1438 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<helios::int2> &default_vec);
1439
1441
1446 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<std::string> &default_vec);
1447
1449
1454 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<float> &default_vec);
1455
1457
1462 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<int> &default_vec);
1463
1465
1470 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<helios::RGBcolor> &default_vec);
1471
1473
1478 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<std::vector<helios::vec3>> &default_vec);
1479
1481
1486 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<std::set<std::string>> &default_vec);
1487
1489
1494 void xmlGetValues(const std::string &name, const std::string &parent, std::set<std::string> &default_set);
1495
1497
1501 void xmlRemoveField(const std::string &name, const std::string &parent);
1502
1504
1509 void xmlSetValue(const std::string &name, const std::string &parent, int &default_value);
1510
1512
1517 void xmlSetValue(const std::string &name, const std::string &parent, float &default_value);
1518
1520
1525 void xmlSetValue(const std::string &name, const std::string &parent, std::string &default_value);
1526
1528
1533 void xmlSetValue(const std::string &name, const std::string &parent, helios::vec2 &default_value);
1534
1536
1541 void xmlSetValue(const std::string &name, const std::string &parent, helios::vec3 &default_value);
1542
1544
1549 void xmlSetValue(const std::string &name, const std::string &parent, helios::int2 &default_value);
1550
1552
1558 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<helios::vec2> &values_vec, std::map<std::string, int> &node_map);
1559
1561
1567 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<helios::vec3> &values_vec, std::map<std::string, int> &node_map);
1568
1570
1576 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<helios::int2> &values_vec, std::map<std::string, int> &node_map);
1577
1579
1585 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<std::string> &values_vec, std::map<std::string, int> &node_map);
1586
1588
1594 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<int> &values_vec, std::map<std::string, int> &node_map);
1595
1597
1603 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<float> &values_vec, std::map<std::string, int> &node_map);
1604
1606
1612 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<helios::RGBcolor> &values_vec, std::map<std::string, int> &node_map);
1613
1615
1621 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<std::vector<helios::vec3>> &values_vec, std::map<std::string, int> &node_map);
1622
1624
1630 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<std::set<std::string>> &values_vec, std::map<std::string, int> &node_map);
1631
1633
1638 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::set<std::string> &values_set);
1639
1641
1646 void setNodeLabels(const std::string &label_name, const std::string &node_name, std::set<std::string> &labels_set);
1647
1648#ifdef ENABLE_HELIOS_VISUALIZER
1650
1654 void randomizePopup(std::string popup_name, taggedPtr ptr);
1655
1657
1661 void noisePopup(std::string popup_name, std::vector<distribution> &dist_vec);
1662#else
1663 void randomizePopup(std::string popup_name, taggedPtr ptr);
1664 void noisePopup(std::string popup_name, std::vector<distribution> &dist_vec);
1665#endif // ENABLE_HELIOS_VISUALIZER
1666
1668
1672 void applyDistribution(std::string var_name, taggedPtr ptr);
1673
1675
1680 void applyDistribution(std::string var_name, distribution dist, taggedPtr ptr);
1681
1683
1686 void randomize(bool randomize_all);
1687
1688#ifdef ENABLE_HELIOS_VISUALIZER
1690
1693 void randomizerParams(std::string var_name);
1694#else
1695 void randomizerParams(std::string var_name);
1696#endif // ENABLE_HELIOS_VISUALIZER
1697
1699
1702 void sample(std::string var_name);
1703
1705 void sampleAll();
1706
1707#ifdef ENABLE_HELIOS_VISUALIZER
1709 void outputConsole();
1710#else
1711 void outputConsole();
1712#endif // ENABLE_HELIOS_VISUALIZER
1713
1715
1720 void updateColor(std::string curr_obj, std::string obj_type, float *new_color);
1721
1723
1726 void updateObject(std::string curr_obj);
1727
1729 void updateRigs();
1730
1732
1735 void deleteRig(std::string curr_rig);
1736
1737#ifdef ENABLE_HELIOS_VISUALIZER
1739
1744 void dropDown(std::string widget_name, std::string &selected, std::vector<std::string> choices);
1745
1747
1752 void dropDown(std::string widget_name, std::string &selected, std::set<std::string> choices);
1753#else
1754 void dropDown(std::string widget_name, std::string &selected, std::vector<std::string> choices);
1755 void dropDown(std::string widget_name, std::string &selected, std::set<std::string> choices);
1756#endif // ENABLE_HELIOS_VISUALIZER
1757
1758#ifdef ENABLE_HELIOS_VISUALIZER
1760 void refreshVisualization();
1761
1763 void refreshVisualizationTypes();
1764#else
1765 void refreshVisualization();
1766 void refreshVisualizationTypes();
1767#endif // ENABLE_HELIOS_VISUALIZER
1768
1769#ifdef ENABLE_HELIOS_VISUALIZER
1771 void recordPopup();
1772#else
1773 void recordPopup();
1774#endif // ENABLE_HELIOS_VISUALIZER
1775
1777 void updateLocation();
1778
1780 void updateGround();
1781
1783 void deleteGround();
1784
1786 void updateContext();
1787
1789
1792 std::string shortenPath(std::string path_name);
1793
1795 void setBoundingBoxObjects();
1796
1798
1806 void buildTiledGround(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);
1807
1809
1817 void buildTiledGround(const helios::vec3 &ground_origin, const helios::vec2 &ground_extent, const helios::int2 &texture_subtiles, const helios::int2 &texture_subpatches, helios::RGBcolor ground_color, float ground_rotation);
1818
1821 std::cout.rdbuf(captured_cout.rdbuf());
1822 primitive_UUIDs = {{"ground", ground_UUIDs}, {"leaf", leaf_UUIDs}, {"petiolule", petiolule_UUIDs}, {"petiole", petiole_UUIDs}, {"internode", internode_UUIDs},
1823 {"peduncle", peduncle_UUIDs}, {"petal", petal_UUIDs}, {"pedicel", pedicel_UUIDs}, {"fruit", fruit_UUIDs}};
1824 primitive_continuous = {{"All", {false, false, false}}, {"ground", {false, false, false}}, {"leaf", {false, false, false}}, {"petiolule", {false, false, false}}, {"petiole", {false, false, false}},
1825 {"internode", {false, false, false}}, {"peduncle", {false, false, false}}, {"petal", {false, false, false}}, {"pedicel", {false, false, false}}, {"fruit", {false, false, false}}};
1826 bandlabels = {"red", "green", "blue", "PAR", "NIR", "LW"};
1827 bandlabels_set = {"All", "red", "green", "blue", "PAR", "NIR", "LW"};
1828 bandlabels_set_emissivity = {"red", "green", "blue", "PAR", "NIR", "LW"};
1829 // bandlabels = {"red", "green", "blue"};
1830 // bandlabels_set = {"All", "red", "green", "blue"};
1831 for (std::string band: bandlabels) {
1832 primitive_values[band] = {{"All", {reflectivity, transmissivity, emissivity}},
1833 {"ground", {ground_reflectivity, ground_transmissivity, ground_emissivity}},
1834 {"leaf", {leaf_reflectivity, leaf_transmissivity, leaf_emissivity}},
1835 {"petiolule", {petiolule_reflectivity, petiolule_transmissivity, petiolule_emissivity}},
1836 {"petiole", {petiole_reflectivity, petiole_transmissivity, petiole_emissivity}},
1837 {"internode", {internode_reflectivity, internode_transmissivity, internode_emissivity}},
1838 {"peduncle", {peduncle_reflectivity, peduncle_transmissivity, peduncle_emissivity}},
1839 {"petal", {petal_reflectivity, petal_transmissivity, petal_emissivity}},
1840 {"pedicel", {pedicel_reflectivity, pedicel_transmissivity, pedicel_emissivity}},
1841 {"fruit", {fruit_reflectivity, fruit_transmissivity, fruit_emissivity}}};
1842 direct_ray_count_dict[band] = direct_ray_count; // direct ray counts per band
1843 diffuse_ray_count_dict[band] = diffuse_ray_count; // diffuse ray counts per band
1844 scattering_depth_dict[band] = scattering_depth; // scattering depth per band
1845 }
1846 primitive_spectra = {{"All", {reflectivity_spectrum, transmissivity_spectrum, emissivity_spectrum}},
1847 {"ground", {ground_reflectivity_spectrum, ground_transmissivity_spectrum, ground_emissivity_spectrum}},
1848 {"leaf", {leaf_reflectivity_spectrum, leaf_transmissivity_spectrum, leaf_emissivity_spectrum}},
1849 {"petiolule", {petiolule_reflectivity_spectrum, petiolule_transmissivity_spectrum, petiolule_emissivity_spectrum}},
1850 {"petiole", {petiole_reflectivity_spectrum, petiole_transmissivity_spectrum, petiole_emissivity_spectrum}},
1851 {"internode", {internode_reflectivity_spectrum, internode_transmissivity_spectrum, internode_emissivity_spectrum}},
1852 {"peduncle", {peduncle_reflectivity_spectrum, peduncle_transmissivity_spectrum, peduncle_emissivity_spectrum}},
1853 {"petal", {petal_reflectivity_spectrum, petal_transmissivity_spectrum, petal_emissivity_spectrum}},
1854 {"pedicel", {pedicel_reflectivity_spectrum, pedicel_transmissivity_spectrum, pedicel_emissivity_spectrum}},
1855 {"fruit", {fruit_reflectivity_spectrum, fruit_transmissivity_spectrum, fruit_emissivity_spectrum}}};
1856 }
1857
1860 std::cout.rdbuf(old_cout_stream_buf);
1861
1862 delete context;
1863
1864#ifdef HELIOS_VISUALIZER
1865 delete visualizer;
1866#endif // HELIOS_VISUALIZER
1867
1868#ifdef PLANT_ARCHITECTURE
1869 delete plantarchitecture;
1870#endif // PLANT_ARCHITECTURE
1871
1872#ifdef RADIATION_MODEL
1873 delete radiation;
1874 delete cameraproperties;
1875#endif // RADIATION_MODEL
1876
1877#ifdef SOLARPOSITION
1878 delete solarposition;
1879#endif // SOLARPOSITION
1880
1881#ifdef ENERGYBALANCEMODEL
1882 delete energybalancemodel;
1883#endif // ENERGYBALANCEMODEL
1884
1885#ifdef BOUNDARYLAYERCONDUCTANCEMODEL
1887#endif // BOUNDARYLAYERCONDUCTANCEMODEL
1888 }
1889};
1890
1891#endif // PROJECT_BUILDER