1.3.64
 
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 bool hdr;
195};
196
198struct canopy {
199 int idx;
200 float age;
201 float ground_clipping_height;
202 std::string label;
203 std::string library_name;
204 std::string library_name_verbose;
205 std::vector<uint> IDs;
206 std::vector<helios::vec3> individual_plant_locations;
207 helios::vec2 plant_spacing;
208 helios::int2 plant_count;
209 helios::vec3 origin;
210 std::string data_group;
211 bool is_dirty;
212};
213
215struct object {
216 int index;
217 uint objID;
218 std::string name;
219 std::string file;
220 std::string data_group;
221 std::vector<uint> UUIDs;
222 helios::vec3 position;
223 helios::vec3 prev_position;
224 helios::vec3 orientation;
225 helios::vec3 prev_orientation;
226 helios::vec3 scale;
227 helios::vec3 prev_scale;
228 helios::RGBcolor color;
229 helios::RGBcolor prev_color;
230 bool use_texture_file;
231 bool is_dirty;
232};
233
235struct rig {
236 int num_images;
237 std::string label;
238 std::vector<distribution> position_noise;
239 std::vector<distribution> lookat_noise;
240 helios::RGBcolor color;
241 helios::vec3 position;
242 helios::vec3 lookat;
243 std::vector<helios::vec3> camera_positions;
244 std::vector<helios::vec3> camera_lookats;
245 std::vector<int> keypoint_frames;
246 std::set<std::string> camera_labels;
247 std::set<std::string> light_labels;
248 bool write_depth;
249 bool write_norm_depth;
250 bool write_segmentation_mask;
251};
252
253bool parse_distribution(const std::string &input_string, distribution &converted_distribution);
254
256
260distribution createDistribution(const std::normal_distribution<float> &dist, bool randomize_repeat);
261
263
267distribution createDistribution(const std::uniform_real_distribution<float> &dist, bool randomize_repeat);
268
270
274distribution createDistribution(const std::weibull_distribution<float> &dist, bool randomize_repeat);
275
276
278private:
280 pugi::xml_document xmldoc;
281
283 std::string xml_input_file = "plugins/projectbuilder/inputs/inputs.xml";
284
286 bool user_input;
287
289 bool light_coord_type = false;
290
292 bool is_dirty = false;
293
295 bool built = false;
296
298 float PAR_absorbed = 0.f;
299
301 float NIR_absorbed = 0.f;
302
304 float LW_absorbed = 0.f;
305
307 float turbidity;
308
310 float diffuse_extinction_coeff = 0.1;
311
313 bool enforce_periodic_boundary_x = true;
314
316 bool enforce_periodic_boundary_y = true;
317
319 uint sun_ID;
320
322 std::vector<std::string> bandlabels;
323
325 std::set<std::string> band_group_names;
326
328 std::map<std::string, bandGroup> band_group_lookup;
329
331 std::string current_band_group;
332
334 std::set<std::string> bandlabels_set;
335
337 std::set<std::string> bandlabels_set_emissivity;
338
340 std::set<std::string> bandlabels_set_wavelength;
341
343 std::map<std::string, int> direct_ray_count_dict;
344
346 std::map<std::string, int> diffuse_ray_count_dict;
347
349 std::map<std::string, int> scattering_depth_dict;
350
352 std::string new_band_label;
353
355 float wavelength_min = 400.0f;
356
358 float wavelength_max = 700.0f;
359
361 bool enable_wavelength;
362
364 bool enable_emission;
365
367 std::vector<uint> ground_UUIDs;
368
370 uint ground_objID;
371
373 std::vector<uint> leaf_UUIDs;
374
376 std::vector<uint> petiolule_UUIDs;
377
379 std::vector<uint> petiole_UUIDs;
380
382 std::vector<uint> internode_UUIDs;
383
385 std::vector<uint> peduncle_UUIDs;
386
388 std::vector<uint> petal_UUIDs;
389
391 std::vector<uint> flower_UUIDs;
392
394 std::vector<uint> sepal_UUIDs;
395
397 std::vector<uint> pedicel_UUIDs;
398
400 std::vector<uint> fruit_UUIDs;
401
403 std::vector<std::string> primitive_names = {"All", "ground", "leaf", "petiolule", "petiole", "internode", "peduncle", "petal", "pedicel", "fruit"};
404
406 std::map<std::string, bool> bounding_boxes = {
407 {"plantID", false}, {"leafID", false}, {"peduncleID", false}, {"closedflowerID", false}, {"openflowerID", false}, {"fruitID", false}, {"rank", false}, {"age", false}, {"carbohydrate_concentration", false}};
408
410 std::set<std::string> bounding_boxes_default = {"plantID", "leafID", "peduncleID", "closedflowerID", "openflowerID", "fruitID", "rank"};
411
413 std::set<std::string> bounding_boxes_primitive;
414
416 std::set<std::string> bounding_boxes_object;
417
419 std::map<std::string, int> bounding_boxes_map;
420
422 std::set<std::string> primitive_names_set = {"All", "ground", "leaf", "petiolule", "petiole", "internode", "peduncle", "petal", "pedicel", "fruit"};
423
425 std::map<std::string, std::vector<uint> *> primitive_addresses;
426
428 std::map<std::string, std::vector<uint>> primitive_UUIDs;
429
431 std::map<std::string, std::map<std::string, std::vector<uint>>> primitive_UUIDs_dict;
432
434 std::map<std::string, std::vector<bool>> primitive_continuous;
435
437 std::map<std::string, std::map<std::string, std::vector<bool>>> primitive_continuous_dict;
438
440 std::map<std::string, std::vector<std::string>> primitive_spectra;
441
443 std::map<std::string, std::map<std::string, std::vector<std::string>>> primitive_spectra_dict;
444
446 std::map<std::string, std::map<std::string, std::vector<float>>> primitive_values;
447
449 std::map<std::string, std::map<std::string, std::map<std::string, std::vector<float>>>> primitive_values_dict;
450
452 std::set<std::string> data_groups_set = {"All"};
453
454 std::vector<std::string> data_groups = {"All"};
455
457 float ground_area;
458
460 std::vector<std::string> timeseries_variables;
461
463 float air_temperature = 300.f;
464
466 float air_humidity = 0.5f;
467
469 helios::vec3 sun_dir_vec;
470
472 float R_PAR_dir;
473
475 float R_NIR_dir;
476
478 float fdiff;
479
481 std::string xml_error_string;
482
483 rig default_rig{1, "default_rig", {}, {}, helios::RGBcolor(1, 0, 0), helios::vec3(0, 0, 1), helios::vec3(0, 0, 0), {helios::vec3(0, 0, 1)}, {helios::vec3(0, 0, 0)}, {1}, {}, {}, false, false, false};
484
486 std::vector<std::string> rig_labels;
487
489 std::vector<std::vector<distribution>> rig_position_noise;
490
492 std::vector<std::vector<distribution>> rig_lookat_noise;
493
495 std::vector<helios::RGBcolor> rig_colors;
496
498 std::vector<helios::vec3> camera_positions;
499
501 std::vector<helios::vec3> camera_lookats;
502
504 std::vector<std::string> camera_labels;
505
507 std::vector<helios::int2> camera_resolutions;
508
510 std::vector<float> focal_plane_distances;
511
513 std::vector<float> lens_diameters;
514
516 std::vector<float> FOV_aspect_ratios;
517
519 std::vector<float> HFOVs;
520
522 std::map<std::string, int> rig_dict;
523
525 std::map<std::string, rig> rig_dict_;
526
528 std::set<std::string> rig_labels_set;
529
531 std::vector<bool> write_depth;
532
534 std::vector<bool> write_norm_depth;
535
537 std::vector<bool> write_segmentation_mask;
538
540 helios::vec3 camera_position = {0, 0, 0};
541
543 std::vector<std::vector<int>> keypoint_frames;
544
546 std::vector<std::vector<helios::vec3>> camera_position_vec;
547
549 std::vector<std::vector<helios::vec3>> camera_lookat_vec;
550
552 helios::vec3 camera_lookat = {0, 0, 0};
553
555 std::string camera_label = "RGB";
556
558 int num_images = 5;
559
561 std::vector<int> num_images_vec;
562
564 std::vector<std::string> camera_names;
565
567 std::set<std::string> camera_names_set;
568
570 helios::int2 camera_resolution = {1024, 1024};
571
573 float focal_plane_distance = 0.4;
574
576 float lens_diameter = 0.02;
577
579 float FOV_aspect_ratio = 1.4;
580
582 float HFOV = 50.0;
583
585 std::map<std::string, int> camera_dict;
586
588 std::vector<std::set<std::string>> rig_camera_labels;
589
591 std::vector<std::string> light_names;
592
594 std::set<std::string> light_names_set;
595
597 std::vector<std::string> light_types;
598
600 // std::vector<std::string> all_light_types = {"collimated", "sphere", "sunsphere", "rectangle", "disk"};
601 std::vector<std::string> all_light_types = {"sphere", "rectangle", "disk"};
602
604 std::vector<helios::vec3> light_direction_vec;
605
607 std::vector<helios::SphericalCoord> light_direction_sph_vec;
608
610 std::vector<helios::vec3> light_rotation_vec;
611
613 std::vector<helios::vec2> light_size_vec;
614
616 std::vector<float> light_radius_vec;
617
619 std::vector<float> light_flux_vec;
620
622 std::map<std::string, int> light_dict;
623
625 std::vector<std::set<std::string>> rig_light_labels;
626
628 std::map<std::string, std::vector<std::vector<uint>>> arrow_dict;
629
631 int arrow_count = 0;
632
634 pugi::xml_node helios;
635
637 bool enable_coordinate_axes = true;
638
640 bool enable_colorbar = false;
641
643 float latitude = 38.55;
644
646 float longitude = 121.76;
647
649 int UTC_offset = 8;
650
652 std::string csv_weather_file = "plugins/projectbuilder/inputs/weather_data.csv";
653
655 std::string cimis_weather_file;
656
658 bool is_weather_file_csv = true;
659
661 helios::vec3 domain_origin = {0, 0, 0};
662
664 helios::vec2 domain_extent = {10, 10};
665
667 helios::int2 ground_resolution = {1, 1};
668
670 std::string ground_texture_file = "plugins/projectbuilder/inputs/dirt.jpg";
671
673 int ground_flag = 1;
674
675 bool use_ground_texture = true;
676
678 float ground_color[3] = {0.0, 0.0, 0.0};
679
681 std::string ground_model_file;
682
684 std::vector<std::string> canopy_labels;
685
687 std::set<std::string> canopy_labels_set;
688
690 std::vector<std::string> canopy_data_groups;
691
693 helios::vec3 canopy_origin = {0, 0, 0};
694
696 std::vector<helios::vec3> canopy_origins;
697
699 helios::int2 plant_count = {1, 1};
700
702 std::vector<helios::int2> plant_counts;
703
705 helios::vec2 plant_spacing = {0.5, 0.5};
706
708 std::vector<helios::vec2> plant_spacings;
709
711 std::vector<std::vector<helios::vec3>> individual_plant_locations;
712
714 std::string plant_library_name = "cowpea";
715
717 std::string plant_library_name_verbose = "Cowpea (Vigna unguiculata)";
718
720 std::vector<std::string> plant_library_names;
721
723 std::vector<std::string> plant_library_names_verbose;
724
726 std::set<std::string> plant_types = {"almond", "apple", "bindweed", "butterlettuce", "cheeseweed", "bean", "cowpea", "easternredbud", "grapevine_VSP", "maize",
727 "olive", "pistachio", "puncturevine", "rice", "sorghum", "soybean", "sugarbeet", "tomato", "walnut", "wheat"};
728
730 std::set<std::string> plant_types_verbose = {"Almond Tree (Prunus dulcis)", "Apple Tree (Malus pumila)",
731 "Bindweed (Convolvulus arvensis)", "Butter Lettuce (Lactuca sativa)",
732 "Cheeseweed (Malva neglecta)", "Common Bean (Phaseolus vulgaris)",
733 "Cowpea (Vigna unguiculata)", "Eastern Redbud (Cercis canadensis)",
734 "Grapevine (Vitis vinifera)", "Maize (Zea mays)",
735 "Olive Tree (Olea europaea)", "Pistachio Tree (Pistachia vera)",
736 "Puncturevine (Tribulus terrestris)", "Rice (Oryza sativa)",
737 "Sorghum (Sorghum bicolor)", "Soybean (Glycine max)",
738 "Sugar Beet (Beta vulgaris)", "Tomato (Solanum lycopersicum)",
739 "Walnut Tree (Juglans regia)", "Wheat (Triticum aestivum)"};
740
742 std::map<std::string, std::string> plant_type_lookup = {{"Almond Tree (Prunus dulcis)", "almond"},
743 {"Apple Tree (Malus pumila)", "apple"},
744 {"Bindweed (Convolvulus arvensis)", "bindweed"},
745 {"Butter Lettuce (Lactuca sativa)", "butterlettuce"},
746 {"Cheeseweed (Malva neglecta)", "cheeseweed"},
747 {"Common Bean (Phaseolus vulgaris)", "bean"},
748 {"Cowpea (Vigna unguiculata)", "cowpea"},
749 {"Eastern Redbud (Cercis canadensis)", "easternredbud"},
750 {"Grapevine (Vitis vinifera)", "grapevine_VSP"},
751 {"Maize (Zea mays)", "maize"},
752 {"Olive Tree (Olea europaea)", "olive"},
753 {"Pistachio Tree (Pistachia vera)", "pistachio"},
754 {"Puncturevine (Tribulus terrestris)", "puncturevine"},
755 {"Rice (Oryza sativa)", "rice"},
756 {"Sorghum (Sorghum bicolor)", "sorghum"},
757 {"Soybean (Glycine max)", "soybean"},
758 {"Sugar Beet (Beta vulgaris)", "sugarbeet"},
759 {"Tomato (Solanum lycopersicum)", "tomato"},
760 {"Walnut Tree (Juglans regia)", "walnut"},
761 {"Wheat (Triticum aestivum)", "wheat"}};
762
764 std::map<std::string, std::string> plant_type_verbose_lookup = {{"almond", "Almond Tree (Prunus dulcis)"},
765 {"apple", "Apple Tree (Malus pumila)"},
766 {"bindweed", "Bindweed (Convolvulus arvensis)"},
767 {"butterlettuce", "Butter Lettuce (Lactuca sativa)"},
768 {"cheeseweed", "Cheeseweed (Malva neglecta)"},
769 {"bean", "Common Bean (Phaseolus vulgaris)"},
770 {"cowpea", "Cowpea (Vigna unguiculata)"},
771 {"easternredbud", "Eastern Redbud (Cercis canadensis)"},
772 {"grapevine_VSP", "Grapevine (Vitis vinifera)"},
773 {"maize", "Maize (Zea mays)"},
774 {"olive", "Olive Tree (Olea europaea)"},
775 {"pistachio", "Pistachio Tree (Pistachia vera)"},
776 {"puncturevine", "Puncturevine (Tribulus terrestris)"},
777 {"rice", "Rice (Oryza sativa)"},
778 {"sorghum", "Sorghum (Sorghum bicolor)"},
779 {"soybean", "Soybean (Glycine max)"},
780 {"sugarbeet", "Sugar Beet (Beta vulgaris)"},
781 {"tomato", "Tomato (Solanum lycopersicum)"},
782 {"walnut", "Walnut Tree (Juglans regia)"},
783 {"wheat", "Wheat (Triticum aestivum)"}};
784
786 float plant_age = 0;
787
789 std::vector<float> plant_ages;
790
792 float ground_clipping_height = 0;
793
795 std::vector<float> ground_clipping_heights;
796
798 std::map<std::string, int> canopy_labels_dict;
799
801 std::vector<std::vector<uint>> canopy_IDs;
802
804 int direct_ray_count = 100;
805
807 int diffuse_ray_count = 1000;
808
810 int scattering_depth = 2;
811
813 float air_turbidity = 0.05;
814
816 std::vector<std::string> obj_files;
817
819 std::vector<std::vector<uint>> obj_UUIDs;
820
822 std::vector<std::string> obj_names;
823
825 std::set<std::string> obj_names_set;
826
828 std::string current_obj;
829
831 std::map<std::string, int> obj_names_dict;
832
834 std::vector<helios::vec3> obj_positions;
835
837 std::vector<helios::vec3> prev_obj_positions;
838
840 std::vector<helios::vec3> obj_orientations;
841
843 std::vector<helios::vec3> prev_obj_orientations;
844
846 std::vector<std::string> obj_data_groups;
847
849 std::vector<helios::vec3> prev_obj_scales;
850
852 std::vector<helios::vec3> obj_scales;
853
855 std::vector<helios::RGBcolor> obj_colors;
856
858 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"};
859
861 std::set<std::string> possible_spectra;
862
864 std::set<std::string> camera_xml_library_files = {"plugins/radiation/spectral_data/camera_spectral_library.xml"};
865
867 std::vector<std::string> possible_camera_calibrations;
868
870 std::vector<std::map<std::string, std::string>> camera_calibrations;
871
873 std::string current_calibration_band;
874
876 std::set<std::string> light_xml_library_files = {"plugins/radiation/spectral_data/light_spectral_library.xml"};
877
879 std::vector<std::string> possible_light_spectra;
880
882 std::vector<std::string> light_spectra;
883
885 std::string solar_direct_spectrum = "solar_spectrum_direct_ASTMG173";
886
888 float reflectivity = 0.0;
889
891 float transmissivity = 0.0;
892
894 float emissivity = 1.0;
895
897 float leaf_reflectivity = 0.0;
898
900 float leaf_transmissivity = 0.0;
901
903 float leaf_emissivity = 0.0;
904
906 float ground_reflectivity = 0.0;
907
909 float ground_transmissivity = 0.0;
910
912 float ground_emissivity = 1.0;
913
915 float petiolule_reflectivity = 0.0;
916
918 float petiolule_transmissivity = 0.0;
919
921 float petiolule_emissivity = 0.0;
922
924 float petiole_reflectivity = 0.0;
925
927 float petiole_transmissivity = 0.0;
928
930 float petiole_emissivity = 0.0;
931
933 float internode_reflectivity = 0.0;
934
936 float internode_transmissivity = 0.0;
937
939 float internode_emissivity = 0.0;
940
942 float peduncle_reflectivity = 0.0;
943
945 float peduncle_transmissivity = 0.0;
946
948 float peduncle_emissivity = 0.0;
949
951 float petal_reflectivity = 0.0;
952
954 float petal_transmissivity = 0.0;
955
957 float petal_emissivity = 0.0;
958
960 float pedicel_reflectivity = 0.0;
961
963 float pedicel_transmissivity = 0.0;
964
966 float pedicel_emissivity = 0.0;
967
969 float fruit_reflectivity = 0.0;
970
972 float fruit_transmissivity = 0.0;
973
975 float fruit_emissivity = 0.0;
976
978 std::string reflectivity_spectrum;
979
981 std::string transmissivity_spectrum;
982
984 std::string emissivity_spectrum;
985
987 std::string leaf_reflectivity_spectrum = "grape_leaf_reflectivity_0000";
988
990 std::string leaf_transmissivity_spectrum = "grape_leaf_transmissivity_0000";
991
993 std::string leaf_emissivity_spectrum;
994
996 std::string ground_reflectivity_spectrum = "soil_reflectivity_0000";
997
999 std::string ground_transmissivity_spectrum;
1000
1002 std::string ground_emissivity_spectrum;
1003
1005 std::string petiolule_reflectivity_spectrum;
1006
1008 std::string petiolule_transmissivity_spectrum;
1009
1011 std::string petiolule_emissivity_spectrum;
1012
1014 std::string petiole_reflectivity_spectrum;
1015
1017 std::string petiole_transmissivity_spectrum;
1018
1020 std::string petiole_emissivity_spectrum;
1021
1023 std::string internode_reflectivity_spectrum;
1024
1026 std::string internode_transmissivity_spectrum;
1027
1029 std::string internode_emissivity_spectrum;
1030
1032 std::string peduncle_reflectivity_spectrum;
1033
1035 std::string peduncle_transmissivity_spectrum;
1036
1038 std::string peduncle_emissivity_spectrum;
1039
1041 std::string petal_reflectivity_spectrum;
1042
1044 std::string petal_transmissivity_spectrum;
1045
1047 std::string petal_emissivity_spectrum;
1048
1050 std::string pedicel_reflectivity_spectrum;
1051
1053 std::string pedicel_transmissivity_spectrum;
1054
1056 std::string pedicel_emissivity_spectrum;
1057
1059 std::string fruit_reflectivity_spectrum;
1060
1062 std::string fruit_transmissivity_spectrum;
1063
1065 std::string fruit_emissivity_spectrum;
1066
1068 std::set<std::string> visualization_types_primitive = {"radiation_flux_PAR", "radiation_flux_NIR", "radiation_flux_LW"};
1069
1071 std::set<std::string> visualization_types_object = {};
1072
1074 std::map<std::string, helios::HeliosDataType> primitive_data_types;
1075
1077 std::map<std::string, helios::HeliosDataType> object_data_types;
1078
1080 std::string visualization_type = "RGB";
1081
1083 std::string current_canopy;
1084
1086 std::string current_rig;
1087
1089 std::string current_cam;
1090
1092 std::string current_light;
1093
1095 std::string current_keypoint;
1096
1098 std::string current_primitive = "All";
1099
1101 std::string current_data_group = "All";
1102
1104 std::string current_band = "red";
1105
1107 std::string current_band_reflectivity = "red";
1108
1110 std::string current_band_transmissivity = "red";
1111
1113 std::string current_band_emissivity = "red";
1114
1116 std::map<std::string, std::vector<uint>> camera_models_dict;
1117
1119 void generalTab();
1120
1122 void canopyTab();
1123
1125 void cameraTab();
1126
1128 void calculationTab();
1129
1131 void objectTab();
1132
1134 void radiationTab();
1135
1137 void rigTab();
1138
1140 void lightTab();
1141
1143 void deleteArrows();
1144
1146
1149 void deleteCanopy(const std::string &canopy);
1150
1152
1155 void deleteObject(const std::string &obj);
1156
1158
1161 void updateCanopy(const std::string &canopy);
1162
1164 void addCanopy();
1165
1167 void updateArrows();
1168
1170 void updateCameraModels();
1171
1173 void deleteCameraModels();
1174
1176 void updateDataGroups();
1177
1179 void updatePrimitiveTypes();
1180
1182 helios::int2 dragging_start_position{0, 0};
1183
1185 std::string currently_dragging;
1186
1188 std::string currently_dragging_type;
1189
1191 bool disable_dragging = false;
1192
1194 void canopyTab(std::string curr_canopy_name, int id);
1195
1197 void rigTab(std::string curr_rig_name, int id);
1198
1200 void objectTab(std::string curr_obj_name, int id);
1201
1203 void saveObject(std::string file_name, std::vector<uint> obj_UUID_vec, std::string file_extension);
1204
1206 void saveCanopy(std::string file_name, std::vector<uint> canopy_ID_vec, helios::vec3 position, std::string file_extension) const;
1207
1209 void saveCanopy(std::string file_name_base, std::vector<uint> canopy_ID_vec, std::vector<helios::vec3> positions, std::string file_extension) const;
1210
1212 bool save_plants_individually = false;
1213
1215 void addBand(std::string label, float wavelength_min, float wavelength_max, bool enable_emission);
1216
1218 void addBand(std::string label, bool enable_emission);
1219
1221 std::map<std::string, std::string> distribution_types;
1222
1224 std::map<std::string, std::vector<float>> distribution_params;
1225
1227 std::map<std::string, int> distribution_dict;
1228
1230 std::map<std::string, taggedPtr> randomized_variable_lookup;
1231
1233 std::default_random_engine generator;
1234
1236 std::string current_distribution = "Normal (Gaussian)";
1237
1239 std::string current_axis = "X";
1240
1242 std::set<std::string> possible_axes = {"X", "Y", "Z"};
1243
1245 std::vector<std::string> distribution_names = {"N/A", "Normal (Gaussian)", "Uniform", "Weibull"};
1246
1248 std::vector<distribution> distributions;
1249
1251 std::vector<float> curr_distribution_params = {0.0, 0.0};
1252
1254 bool randomize_repeatedly = false;
1255
1257 std::streambuf *old_cout_stream_buf = std::cout.rdbuf();
1258
1260 std::stringstream captured_cout;
1261
1262 std::size_t last_console_size = 0;
1263
1265 int num_recordings = 1;
1266
1268 std::map<std::string, object> objects_dict;
1269
1271 std::map<std::string, canopy> canopy_dict;
1272
1274 int obj_idx = 0;
1275
1277 int canopy_idx = 0;
1278
1280 std::set<int> dirty_objects = {};
1281
1283 std::set<int> dirty_canopies = {};
1284
1286 std::set<std::string> lighting_models = {"None", "Phong", "Phong Shadowed"};
1287
1289 std::string lighting_model = "None";
1290
1292 helios::vec3 light_direction{0, 0, 1};
1293
1295 float light_intensity = 1.0;
1296
1298 helios::int2 num_tiles{5, 5};
1299
1301 std::string calculation_type = "primitive";
1302
1304 std::vector<std::string> calculation_types{"primitive", "object", "data group"};
1305
1307 std::map<std::string, bool> calculation_selection_datagroup{{"All", false}};
1308
1310 std::map<std::string, bool> calculation_selection_primitive{{"All", false}};
1311
1313 std::set<std::string> calculation_variable_choices;
1314
1316 std::string calculation_variable_global;
1317
1319 std::vector<std::string> calculation_variables_global = {""};
1320
1322 std::vector<std::string> calculation_variables_primitive = {""};
1323
1325 std::vector<float> calculation_scalars_global = {1.0};
1326
1328 std::vector<float> calculation_scalars_primitive = {1.0};
1329
1331 std::vector<std::string> calculation_operators_global = {};
1332
1334 std::vector<std::string> calculation_operators_primitive = {};
1335
1337 std::set<std::string> calculation_operators_choices = {"+", "-", "/", "x"};
1338
1340 std::set<std::string> calculation_aggregation_choices = {"None", "Mean", "Sum", "Area Weighted Mean", "Area Weighted Sum"};
1341
1343 // std::set<helios::HeliosDataType> heliosNumericTypes = {helios::HELIOS_TYPE_INT, helios::HELIOS_TYPE_UINT,
1344 // helios::HELIOS_TYPE_FLOAT, helios::HELIOS_TYPE_DOUBLE};
1345 std::set<helios::HeliosDataType> heliosNumericTypes = {helios::HELIOS_TYPE_FLOAT};
1346
1348 std::string curr_aggregation = "Mean";
1349
1350 std::vector<std::string> calculation_aggregations = {"Mean"};
1351
1352 bool by_primitive = false;
1353
1354 std::string calculation_name_primitive = "saved prim data";
1355
1356 std::string calculation_name_global = "saved global data";
1357
1359 float calculation_result_global = 0.0f;
1360
1362 void refreshBoundingBoxObjectList();
1363
1365 void globalCalculation();
1366
1368 void savePrimitiveCalculation();
1369
1371 void runRadiation();
1372
1373public:
1376
1379
1382
1385
1388
1391
1394
1397
1400
1402 static int selfTest(int argc = 0, char **argv = nullptr);
1403
1405 void updateSpectra();
1406
1408 void updateCameras();
1409
1411 void record();
1412
1414 void reload();
1415
1417 void buildFromXML();
1418
1420
1423 void buildFromXML(std::string xml_input_file);
1424
1426 void visualize();
1427
1429 void buildAndVisualize();
1430
1432
1435 void buildAndVisualize(std::string xml_input_file);
1436
1438 void xmlSetValues();
1439
1441
1444 void xmlSetValues(std::string xml_path);
1445
1447 void xmlGetValues();
1448
1450
1453 void xmlGetValues(std::string xml_input_file);
1454
1456
1461 std::map<std::string, int> getNodeLabels(const std::string &label_name, const std::string &node_name, std::vector<std::string> &labels_vec);
1462
1464
1469 void getKeypoints(const std::string &name, const std::string &field, std::vector<std::vector<int>> &keypoints);
1470
1472
1477 void setKeypoints(const std::string &name, const std::string &field, std::vector<std::vector<int>> &keypoints);
1478
1480
1485 void xmlGetValue(const std::string &name, const std::string &parent, int &default_value);
1486
1488
1493 void xmlGetValue(const std::string &name, const std::string &parent, float &default_value);
1494
1496
1501 void xmlGetValue(const std::string &name, const std::string &parent, std::string &default_value);
1502
1504
1509 void xmlGetValue(const std::string &name, const std::string &parent, helios::vec2 &default_value);
1510
1512
1517 void xmlGetValue(const std::string &name, const std::string &parent, helios::vec3 &default_value);
1518
1520
1525 void xmlGetValue(const std::string &name, const std::string &parent, helios::int2 &default_value);
1526
1528
1533 void xmlGetDistribution(const std::string &name, const std::string &parent, distribution &distribution);
1534
1536
1541 void xmlSetDistribution(const std::string &name, const std::string &parent, distribution &distribution);
1542
1544
1549 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<helios::vec2> &default_vec);
1550
1552
1557 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<helios::vec3> &default_vec);
1558
1560
1565 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<helios::int2> &default_vec);
1566
1568
1573 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<std::string> &default_vec);
1574
1576
1581 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<float> &default_vec);
1582
1584
1589 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<int> &default_vec);
1590
1592
1597 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<helios::RGBcolor> &default_vec);
1598
1600
1605 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<std::vector<helios::vec3>> &default_vec);
1606
1608
1613 void xmlGetValues(const std::string &name, const std::string &parent, std::vector<std::set<std::string>> &default_vec);
1614
1616
1621 void xmlGetValues(const std::string &name, const std::string &parent, std::set<std::string> &default_set);
1622
1624
1628 void xmlRemoveField(const std::string &name, const std::string &parent);
1629
1631
1636 void xmlSetValue(const std::string &name, const std::string &parent, int &default_value);
1637
1639
1644 void xmlSetValue(const std::string &name, const std::string &parent, float &default_value);
1645
1647
1652 void xmlSetValue(const std::string &name, const std::string &parent, std::string &default_value);
1653
1655
1660 void xmlSetValue(const std::string &name, const std::string &parent, helios::vec2 &default_value);
1661
1663
1668 void xmlSetValue(const std::string &name, const std::string &parent, helios::vec3 &default_value);
1669
1671
1676 void xmlSetValue(const std::string &name, const std::string &parent, helios::int2 &default_value);
1677
1679
1685 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);
1686
1688
1694 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);
1695
1697
1703 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);
1704
1706
1712 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);
1713
1715
1721 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<int> &values_vec, std::map<std::string, int> &node_map);
1722
1724
1730 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::vector<float> &values_vec, std::map<std::string, int> &node_map);
1731
1733
1739 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);
1740
1742
1748 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);
1749
1751
1757 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);
1758
1760
1765 void xmlSetValues(const std::string &field_name, const std::string &node_name, std::set<std::string> &values_set);
1766
1768
1773 void setNodeLabels(const std::string &label_name, const std::string &node_name, std::set<std::string> &labels_set);
1774
1775#ifdef ENABLE_HELIOS_VISUALIZER
1777
1781 void randomizePopup(std::string popup_name, taggedPtr ptr);
1782
1784
1788 void noisePopup(std::string popup_name, std::vector<distribution> &dist_vec);
1789#else
1790 void randomizePopup(std::string popup_name, taggedPtr ptr);
1791 void noisePopup(std::string popup_name, std::vector<distribution> &dist_vec);
1792#endif // ENABLE_HELIOS_VISUALIZER
1793
1795
1799 void applyDistribution(std::string var_name, taggedPtr ptr);
1800
1802
1807 void applyDistribution(std::string var_name, distribution dist, taggedPtr ptr);
1808
1810
1813 void randomize(bool randomize_all);
1814
1815#ifdef ENABLE_HELIOS_VISUALIZER
1817
1820 void randomizerParams(std::string var_name);
1821#else
1822 void randomizerParams(std::string var_name);
1823#endif // ENABLE_HELIOS_VISUALIZER
1824
1826
1829 void sample(std::string var_name);
1830
1832 void sampleAll();
1833
1834#ifdef ENABLE_HELIOS_VISUALIZER
1836 void outputConsole();
1837#else
1838 void outputConsole();
1839#endif // ENABLE_HELIOS_VISUALIZER
1840
1842
1847 void updateColor(std::string curr_obj, std::string obj_type, float *new_color);
1848
1850
1853 void updateObject(std::string curr_obj);
1854
1856 void updateRigs();
1857
1859
1862 void deleteRig(std::string curr_rig);
1863
1865
1868 void addRig(std::string new_rig_label);
1869
1870#ifdef ENABLE_HELIOS_VISUALIZER
1872
1877 void dropDown(std::string widget_name, std::string &selected, std::vector<std::string> choices);
1878
1880
1885 void dropDown(std::string widget_name, std::string &selected, std::set<std::string> choices);
1886#else
1887 void dropDown(std::string widget_name, std::string &selected, std::vector<std::string> choices);
1888 void dropDown(std::string widget_name, std::string &selected, std::set<std::string> choices);
1889#endif // ENABLE_HELIOS_VISUALIZER
1890
1891#ifdef ENABLE_HELIOS_VISUALIZER
1893 void refreshVisualization();
1894
1896 void refreshVisualizationTypes();
1897#else
1898 void refreshVisualization();
1899 void refreshVisualizationTypes();
1900#endif // ENABLE_HELIOS_VISUALIZER
1901
1902#ifdef ENABLE_HELIOS_VISUALIZER
1904 void recordPopup();
1905#else
1906 void recordPopup();
1907#endif // ENABLE_HELIOS_VISUALIZER
1908
1910 void updateLocation();
1911
1913 void updateGround();
1914
1916 void deleteGround();
1917
1919 void updateContext();
1920
1922
1925 std::string shortenPath(std::string path_name);
1926
1928 void setBoundingBoxObjects();
1929
1931
1939 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);
1940
1942
1950 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);
1951
1954 std::cout.rdbuf(captured_cout.rdbuf());
1955 primitive_UUIDs = {{"ground", ground_UUIDs}, {"leaf", leaf_UUIDs}, {"petiolule", petiolule_UUIDs}, {"petiole", petiole_UUIDs}, {"internode", internode_UUIDs},
1956 {"peduncle", peduncle_UUIDs}, {"petal", petal_UUIDs}, {"pedicel", pedicel_UUIDs}, {"fruit", fruit_UUIDs}};
1957 primitive_continuous = {{"All", {false, false, false}}, {"ground", {false, false, false}}, {"leaf", {false, false, false}}, {"petiolule", {false, false, false}}, {"petiole", {false, false, false}},
1958 {"internode", {false, false, false}}, {"peduncle", {false, false, false}}, {"petal", {false, false, false}}, {"pedicel", {false, false, false}}, {"fruit", {false, false, false}}};
1959 bandlabels = {"red", "green", "blue", "PAR", "NIR", "LW"};
1960 bandlabels_set = {"All", "red", "green", "blue", "PAR", "NIR", "LW"};
1961 bandlabels_set_emissivity = {"red", "green", "blue", "PAR", "NIR", "LW"};
1962 // bandlabels = {"red", "green", "blue"};
1963 // bandlabels_set = {"All", "red", "green", "blue"};
1964 for (std::string band: bandlabels) {
1965 primitive_values[band] = {{"All", {reflectivity, transmissivity, emissivity}},
1966 {"ground", {ground_reflectivity, ground_transmissivity, ground_emissivity}},
1967 {"leaf", {leaf_reflectivity, leaf_transmissivity, leaf_emissivity}},
1968 {"petiolule", {petiolule_reflectivity, petiolule_transmissivity, petiolule_emissivity}},
1969 {"petiole", {petiole_reflectivity, petiole_transmissivity, petiole_emissivity}},
1970 {"internode", {internode_reflectivity, internode_transmissivity, internode_emissivity}},
1971 {"peduncle", {peduncle_reflectivity, peduncle_transmissivity, peduncle_emissivity}},
1972 {"petal", {petal_reflectivity, petal_transmissivity, petal_emissivity}},
1973 {"pedicel", {pedicel_reflectivity, pedicel_transmissivity, pedicel_emissivity}},
1974 {"fruit", {fruit_reflectivity, fruit_transmissivity, fruit_emissivity}}};
1975 direct_ray_count_dict[band] = direct_ray_count; // direct ray counts per band
1976 diffuse_ray_count_dict[band] = diffuse_ray_count; // diffuse ray counts per band
1977 scattering_depth_dict[band] = scattering_depth; // scattering depth per band
1978 }
1979 primitive_spectra = {{"All", {reflectivity_spectrum, transmissivity_spectrum, emissivity_spectrum}},
1980 {"ground", {ground_reflectivity_spectrum, ground_transmissivity_spectrum, ground_emissivity_spectrum}},
1981 {"leaf", {leaf_reflectivity_spectrum, leaf_transmissivity_spectrum, leaf_emissivity_spectrum}},
1982 {"petiolule", {petiolule_reflectivity_spectrum, petiolule_transmissivity_spectrum, petiolule_emissivity_spectrum}},
1983 {"petiole", {petiole_reflectivity_spectrum, petiole_transmissivity_spectrum, petiole_emissivity_spectrum}},
1984 {"internode", {internode_reflectivity_spectrum, internode_transmissivity_spectrum, internode_emissivity_spectrum}},
1985 {"peduncle", {peduncle_reflectivity_spectrum, peduncle_transmissivity_spectrum, peduncle_emissivity_spectrum}},
1986 {"petal", {petal_reflectivity_spectrum, petal_transmissivity_spectrum, petal_emissivity_spectrum}},
1987 {"pedicel", {pedicel_reflectivity_spectrum, pedicel_transmissivity_spectrum, pedicel_emissivity_spectrum}},
1988 {"fruit", {fruit_reflectivity_spectrum, fruit_transmissivity_spectrum, fruit_emissivity_spectrum}}};
1989 }
1990
1993 std::cout.rdbuf(old_cout_stream_buf);
1994
1995 // Delete plugins BEFORE context - they hold pointers to context
1996 // and may access it during destruction
1997
1998#ifdef ENABLE_BOUNDARYLAYERCONDUCTANCEMODEL
2000#endif // ENABLE_BOUNDARYLAYERCONDUCTANCEMODEL
2001
2002#ifdef ENABLE_ENERGYBALANCEMODEL
2003 delete energybalancemodel;
2004#endif // ENABLE_ENERGYBALANCEMODEL
2005
2006#ifdef ENABLE_SOLARPOSITION
2007 delete solarposition;
2008#endif // ENABLE_SOLARPOSITION
2009
2010#ifdef ENABLE_RADIATION_MODEL
2011 delete radiation;
2012 delete cameraproperties;
2013#endif // ENABLE_RADIATION_MODEL
2014
2015#ifdef ENABLE_CANOPY_GENERATOR
2016 delete canopygenerator;
2017#endif // ENABLE_CANOPY_GENERATOR
2018
2019#ifdef ENABLE_PLANT_ARCHITECTURE
2020 delete plantarchitecture;
2021#endif // ENABLE_PLANT_ARCHITECTURE
2022
2023#ifdef ENABLE_HELIOS_VISUALIZER
2024 delete visualizer;
2025#endif // ENABLE_HELIOS_VISUALIZER
2026
2027 // Delete context LAST - all plugins depend on it
2028 delete context;
2029 }
2030};
2031
2032#endif // PROJECT_BUILDER