From bd2104e8aa6e2569dda339f739928f2cd2479222 Mon Sep 17 00:00:00 2001 From: bnbailey-psl Date: Fri, 17 Jan 2025 15:57:14 -0800 Subject: [PATCH] [1.3.26] 2025-01-17 *Context* - Definition of global PI_F variable in global.h was causing a build issue on some compilers *Visualizer* - Added mouse-based camera controls in the interactive visualizer. Credit to Sean Banks for this update. *Plant Architecture* - Added methods for querying bulk properties of a plant (total leaf count, stem height, plant height, leaf angle distribution) and write plant mesh vertices to file. Co-authored-by: Sean Banks --- core/include/global.h | 4 +- doc/CHANGELOG | 13 +- doc/UserGuide.dox | 6 +- doc/header.html | 2 +- doc/html/_a_p_i.html | 258 +- doc/html/_aerial_li_d_a_r_8cpp.html | 23 +- doc/html/_aerial_li_d_a_r_8cpp_source.html | 359 +- doc/html/_aerial_li_d_a_r_8cu.html | 23 +- doc/html/_aerial_li_d_a_r_8cu_source.html | 159 +- doc/html/_aerial_li_d_a_r_8h.html | 23 +- doc/html/_aerial_li_d_a_r_8h_source.html | 184 +- doc/html/_aerial_li_d_a_r_doc.html | 96 +- doc/html/_assets_8cpp.html | 1016 +-- doc/html/_assets_8cpp_source.html | 123 +- doc/html/_assets_8h_source.html | 27 +- doc/html/_b_l_conductance_doc.html | 97 +- ...boundary_layer_conductance_model_8cpp.html | 23 +- ...y_layer_conductance_model_8cpp_source.html | 91 +- .../_boundary_layer_conductance_model_8h.html | 23 +- ...ary_layer_conductance_model_8h_source.html | 42 +- doc/html/_c_lion_i_d_e.html | 25 +- doc/html/_camera_calibration_8cpp.html | 42 +- doc/html/_camera_calibration_8cpp_source.html | 145 +- doc/html/_camera_calibration_8h.html | 23 +- doc/html/_camera_calibration_8h_source.html | 69 +- doc/html/_canopy_generator_8cpp.html | 110 +- doc/html/_canopy_generator_8cpp_source.html | 1029 ++- doc/html/_canopy_generator_8h.html | 110 +- doc/html/_canopy_generator_8h_source.html | 712 +- doc/html/_canopy_generator_doc.html | 121 +- doc/html/_carbohydrate_model_8cpp.html | 55 +- doc/html/_carbohydrate_model_8cpp_source.html | 57 +- doc/html/_choosing_c_u_d_a.html | 25 +- doc/html/_context_8cpp.html | 23 +- doc/html/_context_8cpp_source.html | 1512 +++- doc/html/_context_8h.html | 81 +- doc/html/_context_8h_source.html | 818 +- doc/html/_context__data_8cpp.html | 23 +- doc/html/_context__data_8cpp_source.html | 769 +- doc/html/_context__file_i_o_8cpp.html | 23 +- doc/html/_context__file_i_o_8cpp_source.html | 531 +- doc/html/_convert_p_l_y.html | 25 +- doc/html/_dependent_software.html | 108 +- doc/html/_dummy.html | 34 +- doc/html/_dummy_model_8cpp.html | 23 +- doc/html/_dummy_model_8cpp_source.html | 35 +- doc/html/_dummy_model_8h.html | 23 +- doc/html/_dummy_model_8h_source.html | 34 +- doc/html/_energy_balance_doc.html | 113 +- doc/html/_energy_balance_model_8cpp.html | 23 +- .../_energy_balance_model_8cpp_source.html | 83 +- doc/html/_energy_balance_model_8cu.html | 159 +- .../_energy_balance_model_8cu_source.html | 55 +- doc/html/_energy_balance_model_8h.html | 23 +- doc/html/_energy_balance_model_8h_source.html | 46 +- doc/html/_i_o.html | 101 +- doc/html/_input_output_8cpp.html | 28 +- doc/html/_input_output_8cpp_source.html | 75 +- doc/html/_leaf_optics_8cpp.html | 23 +- doc/html/_leaf_optics_8cpp_source.html | 79 +- doc/html/_leaf_optics_8h.html | 23 +- doc/html/_leaf_optics_8h_source.html | 50 +- doc/html/_li_d_a_r_8cpp.html | 49 +- doc/html/_li_d_a_r_8cpp_source.html | 505 +- doc/html/_li_d_a_r_8cu.html | 23 +- doc/html/_li_d_a_r_8cu_source.html | 243 +- doc/html/_li_d_a_r_8h.html | 49 +- doc/html/_li_d_a_r_8h_source.html | 269 +- doc/html/_li_d_a_r_doc.html | 167 +- doc/html/_making_masks.html | 25 +- doc/html/_overview.html | 54 +- doc/html/_p_c_g_p_u_timeout.html | 25 +- doc/html/_photosynthesis_doc.html | 137 +- doc/html/_photosynthesis_model_8cpp.html | 23 +- .../_photosynthesis_model_8cpp_source.html | 123 +- doc/html/_photosynthesis_model_8h.html | 23 +- doc/html/_photosynthesis_model_8h_source.html | 68 +- doc/html/_plant_architecture_8cpp.html | 71 +- doc/html/_plant_architecture_8cpp_source.html | 407 +- doc/html/_plant_architecture_8h.html | 63 +- doc/html/_plant_architecture_8h_source.html | 266 +- doc/html/_plant_architecture_doc.html | 322 +- doc/html/_plant_library_8cpp.html | 23 +- doc/html/_plant_library_8cpp_source.html | 2488 +++--- doc/html/_plug_ins.html | 25 +- doc/html/_plugins.html | 45 +- doc/html/_radiation_doc.html | 221 +- doc/html/_radiation_model_8cpp.html | 47 +- doc/html/_radiation_model_8cpp_source.html | 603 +- doc/html/_radiation_model_8h.html | 58 +- doc/html/_radiation_model_8h_source.html | 282 +- doc/html/_ray_tracing_8cu_8h.html | 207 +- doc/html/_ray_tracing_8cu_8h_source.html | 61 +- doc/html/_solar_position_8cpp.html | 23 +- doc/html/_solar_position_8cpp_source.html | 157 +- doc/html/_solar_position_8h.html | 23 +- doc/html/_solar_position_8h_source.html | 76 +- doc/html/_solar_position_doc.html | 97 +- .../_stomatal_conductance_model_8cpp.html | 23 +- ...tomatal_conductance_model_8cpp_source.html | 133 +- doc/html/_stomatal_conductance_model_8h.html | 23 +- ..._stomatal_conductance_model_8h_source.html | 72 +- doc/html/_stomatal_doc.html | 86 +- doc/html/_synthetic_annotation_8cpp.html | 23 +- .../_synthetic_annotation_8cpp_source.html | 167 +- doc/html/_synthetic_annotation_8h.html | 23 +- doc/html/_synthetic_annotation_8h_source.html | 56 +- doc/html/_tutorials.html | 25 +- doc/html/_visualizer_8cpp.html | 528 +- doc/html/_visualizer_8cpp_source.html | 7531 +++++++++-------- doc/html/_visualizer_8h.html | 216 +- doc/html/_visualizer_8h_source.html | 1265 +-- doc/html/_visualizer_doc.html | 416 +- doc/html/_voxel_intersection_8cpp.html | 23 +- doc/html/_voxel_intersection_8cpp_source.html | 153 +- doc/html/_voxel_intersection_8cu.html | 106 +- doc/html/_voxel_intersection_8cu_source.html | 63 +- doc/html/_voxel_intersection_8h.html | 23 +- doc/html/_voxel_intersection_8h_source.html | 58 +- doc/html/_voxel_intersection_doc.html | 63 +- doc/html/_weber_penn_doc.html | 127 +- doc/html/_weber_penn_tree_8cpp.html | 23 +- doc/html/_weber_penn_tree_8cpp_source.html | 181 +- doc/html/_weber_penn_tree_8h.html | 23 +- doc/html/_weber_penn_tree_8h_source.html | 74 +- ...eriallidar_2include_2random_8h_source.html | 23 +- doc/html/aeriallidar_2src_2file_i_o_8cpp.html | 23 +- ...eriallidar_2src_2file_i_o_8cpp_source.html | 75 +- doc/html/annotated.html | 29 +- doc/html/bdwn.png | Bin 147 -> 0 bytes doc/html/bean_8cpp_source.html | 97 +- doc/html/class_aerial_li_d_a_rcloud.html | 636 +- doc/html/class_b_l_conductance_model.html | 83 +- doc/html/class_canopy_generator.html | 403 +- doc/html/class_dummy_model.html | 35 +- doc/html/class_energy_balance_model.html | 94 +- doc/html/class_glyph.html | 45 +- doc/html/class_hit_table.html | 104 +- doc/html/class_leaf_optics.html | 138 +- doc/html/class_li_d_a_rcloud.html | 1116 +-- doc/html/class_photosynthesis_model.html | 161 +- doc/html/class_plant_architecture.html | 767 +- doc/html/class_radiation_model.html | 1300 +-- doc/html/class_solar_position.html | 193 +- .../class_stomatal_conductance_model.html | 236 +- doc/html/class_synthetic_annotation.html | 156 +- doc/html/class_visualizer.html | 1306 +-- doc/html/class_voxel_intersection.html | 166 +- doc/html/class_weber_penn_tree.html | 139 +- doc/html/classes.html | 23 +- doc/html/classhelios_1_1_box.html | 206 +- doc/html/classhelios_1_1_box.png | Bin 593 -> 593 bytes doc/html/classhelios_1_1_compound_object.html | 657 +- doc/html/classhelios_1_1_compound_object.png | Bin 1889 -> 1889 bytes doc/html/classhelios_1_1_cone.html | 246 +- doc/html/classhelios_1_1_cone.png | Bin 611 -> 611 bytes doc/html/classhelios_1_1_context.html | 6027 ++++--------- doc/html/classhelios_1_1_disk.html | 202 +- doc/html/classhelios_1_1_disk.png | Bin 605 -> 605 bytes doc/html/classhelios_1_1_polymesh.html | 186 +- doc/html/classhelios_1_1_polymesh.png | Bin 648 -> 648 bytes doc/html/classhelios_1_1_sphere.html | 206 +- doc/html/classhelios_1_1_sphere.png | Bin 633 -> 633 bytes doc/html/classhelios_1_1_texture.html | 50 +- doc/html/classhelios_1_1_tile.html | 214 +- doc/html/classhelios_1_1_tile.png | Bin 593 -> 593 bytes doc/html/classhelios_1_1_tube.html | 285 +- doc/html/classhelios_1_1_tube.png | Bin 604 -> 604 bytes doc/html/classhelios_1_1_x_m_lparser.html | 311 +- doc/html/clipboard.js | 61 + doc/html/context_globaldata.html | 25 +- doc/html/context_primdata.html | 25 +- doc/html/context_primitives.html | 25 +- doc/html/context_selftest.html | 29 +- doc/html/context_vectors.html | 25 +- doc/html/cookie.js | 58 + doc/html/core_2src_2self_test_8cpp.html | 23 +- .../core_2src_2self_test_8cpp_source.html | 271 +- .../dir_000a2e4fe776603f09c56917fe929269.html | 27 +- .../dir_01af3122a6d2fc081d545f111575c8ac.html | 23 +- .../dir_0581b1fc91af6cc2594fe789a424270d.html | 23 +- .../dir_09ba98b3b490a60de71fb62d89fe47cd.html | 25 +- .../dir_0b377c449e87c33e20eed98f7cc3a6cc.html | 25 +- .../dir_0ed0e5ef04d2b4b7edd36da5802052a6.html | 23 +- .../dir_10651e710c37b90bb60afaa4d2c6a975.html | 27 +- .../dir_1736472fec890ec3b25c5f707a1ad41b.html | 35 +- .../dir_1b48a9a5d33ab4b7862a4538757abad5.html | 25 +- .../dir_1c54673618a694dbf6d60994b9e4cd26.html | 27 +- .../dir_1f4a8e9b5fbfec7b9342d55d1c70b0d3.html | 35 +- .../dir_24d671cfcbc5d5238a6bd565a49d198f.html | 29 +- .../dir_2dbe15cacd8389cc56dad1ecef740014.html | 27 +- .../dir_311a8078924eda44cf0bc3884606fa36.html | 27 +- .../dir_324b51d306f9962e8d7b85b82cd2c869.html | 23 +- .../dir_3771cc92d713de3e5272f9ad4d0b1912.html | 25 +- .../dir_38c8d24aef3972a7f87b834274e76e31.html | 23 +- .../dir_3b948ba013618d5b0560477725ec43e1.html | 27 +- .../dir_3d4da5c581737ecd0f864ccf0711fd92.html | 23 +- .../dir_3d6a603070d279a42ac417e5c8a6aba1.html | 25 +- .../dir_40ea2a4aa4adfc7dc77aa13d0834001b.html | 31 +- .../dir_418637634c2136ee3716f84b17e3fdeb.html | 25 +- .../dir_4270bfced15e0e73154b13468c7c9ad9.html | 27 +- .../dir_4942485e7dfd848fb997bfbb4ff4feb4.html | 27 +- .../dir_4ccbab8385dcba906f6a2cce80a3b511.html | 25 +- .../dir_51eab06546c34d501c6cf953a16a9cc5.html | 25 +- .../dir_53e799243804d32eb30709605e43a53b.html | 27 +- .../dir_562cb346de9113a49164a1513c42aa1c.html | 25 +- .../dir_577e0cdb3e2614f5a260ea490887b143.html | 25 +- .../dir_58badfc9ced8151ac5118cd2e12bebf1.html | 39 +- .../dir_594f7d9c1b5f727f933fa022588b0b7d.html | 25 +- .../dir_59c6a555a98729b3f6a8f77608cc74a4.html | 25 +- .../dir_615177bc4a60bdbaf2db637460677b64.html | 27 +- .../dir_6252300d35bf0f8a4d6b5ccb98672957.html | 25 +- .../dir_6576ef5c45e1ae696f88b82c16a4c6c0.html | 23 +- .../dir_676c0954ed84853013df50d94356577b.html | 27 +- .../dir_67ef339cfff2cfda5a7b1755578ee854.html | 25 +- .../dir_6d823072f66bbcb32b0d3acc588685b0.html | 27 +- .../dir_7b945ff507247f5bd903b50b5c416c04.html | 25 +- .../dir_7f186228a2612084b0fc24dff2e535bf.html | 31 +- .../dir_8a62bca5fa5119ede20b35462196f194.html | 25 +- .../dir_8add51f561986f34dfac90d296d2ac1f.html | 23 +- .../dir_9018c8dc5d181eb1cb047286a97fa87b.html | 25 +- .../dir_90fd98a0ba30abf7a6068a44995d2d6b.html | 33 +- .../dir_98f1c86a7f536ff9d6c61df9d8c64baa.html | 27 +- .../dir_9a3b5787d2329f793333f6962c777986.html | 27 +- .../dir_9a6cc15fde559dad335c1dc145a826ea.html | 23 +- .../dir_a2b45ea1295f1e42b26af05f3b546a5b.html | 27 +- .../dir_a4ee10e64f839049093220f98040855a.html | 27 +- .../dir_a604905e97bad612ecdda55ac09d6396.html | 25 +- .../dir_a8babb820ec20ecec6aebc09dbfb576c.html | 29 +- .../dir_b81f286eb903e0c3ba53b620487c01ae.html | 23 +- .../dir_b867f472847a1f099af0eb422541f49e.html | 27 +- .../dir_bc56ed6b0b97565306d951dc61815da9.html | 27 +- .../dir_c2e785b0428381d295aba3d86e865907.html | 23 +- .../dir_d11e5a89bd40b12607fdeb823ca30c1a.html | 25 +- .../dir_d346877beec799c6cac1a2fc56d1c290.html | 25 +- .../dir_d39c4dd70ac914a319fbf3979f3cb0cd.html | 23 +- .../dir_d684e7c998fb76edbfb655ffd4cf6611.html | 23 +- .../dir_d6ff66ea9f957e81b4485948f070bc7c.html | 25 +- .../dir_daed1286feb5181d9374e50e34ff739d.html | 27 +- .../dir_e68e8157741866f444e17edd764ebbae.html | 23 +- .../dir_e725f6d562ac5b3216da834679296cd3.html | 23 +- .../dir_e771e57a540d4f14ef5ec2c81b56a7b6.html | 23 +- .../dir_e8ed08f2d5f8ac3e3b5447bfe7f0fce5.html | 29 +- .../dir_ee14773baee519b082f78b85b263aa48.html | 27 +- .../dir_f54e10c7807847345da870f7da42cdf0.html | 27 +- .../dir_f93a58e1b1064abf3e9af98b74e2f5d5.html | 27 +- .../dir_fceca22ca0920a3e9321d273c935ca85.html | 25 +- doc/html/doc.png | Bin 746 -> 0 bytes doc/html/doc.svg | 12 + doc/html/docd.png | Bin 756 -> 0 bytes doc/html/docd.svg | 12 + doc/html/doxygen.css | 286 +- doc/html/doxygen.svg | 4 +- doc/html/doxygen_crawl.html | 3525 ++++++++ doc/html/dynsections.js | 257 +- doc/html/files.html | 135 +- doc/html/folderclosed.png | Bin 616 -> 0 bytes doc/html/folderclosed.svg | 11 + doc/html/folderclosedd.svg | 11 + doc/html/folderopen.png | Bin 597 -> 0 bytes doc/html/folderopen.svg | 17 + doc/html/folderopend.svg | 12 + doc/html/form_0.png | Bin 5178 -> 4853 bytes doc/html/form_1.png | Bin 2623 -> 514 bytes doc/html/form_10.png | Bin 2701 -> 650 bytes doc/html/form_100.png | Bin 4114 -> 3048 bytes doc/html/form_101.png | Bin 2622 -> 509 bytes doc/html/form_102.png | Bin 3914 -> 2802 bytes doc/html/form_103.png | Bin 2572 -> 413 bytes doc/html/form_104.png | Bin 4250 -> 3714 bytes doc/html/form_105.png | Bin 3259 -> 1602 bytes doc/html/form_106.png | Bin 2832 -> 898 bytes doc/html/form_107.png | Bin 2583 -> 455 bytes doc/html/form_108.png | Bin 3497 -> 1879 bytes doc/html/form_109.png | Bin 5226 -> 5278 bytes doc/html/form_11.png | Bin 2660 -> 587 bytes doc/html/form_110.png | Bin 3784 -> 2597 bytes doc/html/form_111.png | Bin 10934 -> 15040 bytes doc/html/form_112.png | Bin 2513 -> 341 bytes doc/html/form_113.png | Bin 2749 -> 749 bytes doc/html/form_114.png | Bin 3223 -> 1504 bytes doc/html/form_115.png | Bin 2817 -> 847 bytes doc/html/form_116.png | Bin 3261 -> 1554 bytes doc/html/form_117.png | Bin 2697 -> 656 bytes doc/html/form_118.png | Bin 2795 -> 856 bytes doc/html/form_119.png | Bin 2779 -> 830 bytes doc/html/form_12.png | Bin 4030 -> 2830 bytes doc/html/form_120.png | Bin 3097 -> 1289 bytes doc/html/form_121.png | Bin 2633 -> 525 bytes doc/html/form_122.png | Bin 2874 -> 972 bytes doc/html/form_123.png | Bin 3289 -> 1652 bytes doc/html/form_124.png | Bin 16147 -> 24408 bytes doc/html/form_125.png | Bin 2701 -> 698 bytes doc/html/form_126.png | Bin 3050 -> 1339 bytes doc/html/form_127.png | Bin 2970 -> 1135 bytes doc/html/form_128.png | Bin 3001 -> 1194 bytes doc/html/form_129.png | Bin 2879 -> 1010 bytes doc/html/form_13.png | Bin 2693 -> 651 bytes doc/html/form_130.png | Bin 3220 -> 1538 bytes doc/html/form_131.png | Bin 3224 -> 1525 bytes doc/html/form_132.png | Bin 3237 -> 1570 bytes doc/html/form_133.png | Bin 3130 -> 1407 bytes doc/html/form_134.png | Bin 3153 -> 1400 bytes doc/html/form_135.png | Bin 3160 -> 1435 bytes doc/html/form_136.png | Bin 3132 -> 1368 bytes doc/html/form_137.png | Bin 3108 -> 1333 bytes doc/html/form_138.png | Bin 3148 -> 1389 bytes doc/html/form_139.png | Bin 3620 -> 2203 bytes doc/html/form_14.png | Bin 2952 -> 1100 bytes doc/html/form_140.png | Bin 3779 -> 2550 bytes doc/html/form_141.png | Bin 2821 -> 869 bytes doc/html/form_142.png | Bin 2952 -> 1122 bytes doc/html/form_143.png | Bin 3486 -> 1890 bytes doc/html/form_144.png | Bin 2856 -> 921 bytes doc/html/form_145.png | Bin 6680 -> 8096 bytes doc/html/form_146.png | Bin 2809 -> 857 bytes doc/html/form_147.png | Bin 2840 -> 877 bytes doc/html/form_148.png | Bin 2572 -> 438 bytes doc/html/form_149.png | Bin 2726 -> 713 bytes doc/html/form_15.png | Bin 3594 -> 2094 bytes doc/html/form_150.png | Bin 4621 -> 3794 bytes doc/html/form_151.png | Bin 2732 -> 696 bytes doc/html/form_152.png | Bin 4117 -> 3161 bytes doc/html/form_153.png | Bin 3997 -> 2843 bytes doc/html/form_154.png | Bin 2549 -> 392 bytes doc/html/form_155.png | Bin 2880 -> 1066 bytes doc/html/form_156.png | Bin 2712 -> 662 bytes doc/html/form_157.png | Bin 2651 -> 571 bytes doc/html/form_158.png | Bin 2789 -> 825 bytes doc/html/form_159.png | Bin 2582 -> 443 bytes doc/html/form_16.png | Bin 2987 -> 1156 bytes doc/html/form_160.png | Bin 2711 -> 695 bytes doc/html/form_161.png | Bin 2737 -> 739 bytes doc/html/form_162.png | Bin 2615 -> 504 bytes doc/html/form_163.png | Bin 2570 -> 372 bytes doc/html/form_164.png | Bin 4095 -> 2855 bytes doc/html/form_165.png | Bin 2708 -> 687 bytes doc/html/form_166.png | Bin 2666 -> 604 bytes doc/html/form_167.png | Bin 2584 -> 445 bytes doc/html/form_168.png | Bin 2990 -> 1187 bytes doc/html/form_169.png | Bin 2765 -> 776 bytes doc/html/form_17.png | Bin 2850 -> 943 bytes doc/html/form_170.png | Bin 4672 -> 4415 bytes doc/html/form_171.png | Bin 2846 -> 894 bytes doc/html/form_172.png | Bin 2544 -> 392 bytes doc/html/form_173.png | Bin 4261 -> 3267 bytes doc/html/form_174.png | Bin 2654 -> 572 bytes doc/html/form_175.png | Bin 3052 -> 1285 bytes doc/html/form_176.png | Bin 2804 -> 885 bytes doc/html/form_177.png | Bin 2964 -> 1073 bytes doc/html/form_178.png | Bin 2812 -> 844 bytes doc/html/form_179.png | Bin 2705 -> 645 bytes doc/html/form_18.png | Bin 2816 -> 863 bytes doc/html/form_180.png | Bin 4090 -> 3130 bytes doc/html/form_181.png | Bin 3784 -> 2458 bytes doc/html/form_182.png | Bin 4472 -> 3489 bytes doc/html/form_183.png | Bin 2693 -> 640 bytes doc/html/form_184.png | Bin 2831 -> 913 bytes doc/html/form_185.png | Bin 2595 -> 460 bytes doc/html/form_186.png | Bin 2661 -> 582 bytes doc/html/form_187.png | Bin 2679 -> 616 bytes doc/html/form_188.png | Bin 5228 -> 4855 bytes doc/html/form_189.png | Bin 2793 -> 813 bytes doc/html/form_19.png | Bin 2586 -> 489 bytes doc/html/form_190.png | Bin 2681 -> 642 bytes doc/html/form_191.png | Bin 4099 -> 2900 bytes doc/html/form_192.png | Bin 8212 -> 9369 bytes doc/html/form_193.png | Bin 7421 -> 8372 bytes doc/html/form_194.png | Bin 3536 -> 2073 bytes doc/html/form_195.png | Bin 4549 -> 3532 bytes doc/html/form_196.png | Bin 4638 -> 3728 bytes doc/html/form_197.png | Bin 5086 -> 4574 bytes doc/html/form_198.png | Bin 5510 -> 5223 bytes doc/html/form_199.png | Bin 2808 -> 870 bytes doc/html/form_2.png | Bin 2711 -> 703 bytes doc/html/form_20.png | Bin 2606 -> 499 bytes doc/html/form_200.png | Bin 2682 -> 620 bytes doc/html/form_201.png | Bin 3083 -> 1288 bytes doc/html/form_202.png | Bin 3097 -> 1371 bytes doc/html/form_203.png | Bin 4667 -> 3957 bytes doc/html/form_204.png | Bin 2570 -> 427 bytes doc/html/form_205.png | Bin 3274 -> 1655 bytes doc/html/form_206.png | Bin 3365 -> 1804 bytes doc/html/form_207.png | Bin 3068 -> 1258 bytes doc/html/form_208.png | Bin 2926 -> 1054 bytes doc/html/form_209.png | Bin 3727 -> 2351 bytes doc/html/form_21.png | Bin 2557 -> 397 bytes doc/html/form_210.png | Bin 4490 -> 4151 bytes doc/html/form_211.png | Bin 3243 -> 1585 bytes doc/html/form_212.png | Bin 4258 -> 3401 bytes doc/html/form_213.png | Bin 3413 -> 1836 bytes doc/html/form_214.png | Bin 2951 -> 1078 bytes doc/html/form_215.png | Bin 2659 -> 598 bytes doc/html/form_216.png | Bin 4021 -> 2883 bytes doc/html/form_217.png | Bin 2695 -> 674 bytes doc/html/form_218.png | Bin 2782 -> 765 bytes doc/html/form_219.png | Bin 2621 -> 492 bytes doc/html/form_22.png | Bin 2749 -> 769 bytes doc/html/form_220.png | Bin 3490 -> 1940 bytes doc/html/form_221.png | Bin 2767 -> 732 bytes doc/html/form_222.png | Bin 2952 -> 1160 bytes doc/html/form_223.png | Bin 3919 -> 2776 bytes doc/html/form_224.png | Bin 3109 -> 1363 bytes doc/html/form_225.png | Bin 4695 -> 3879 bytes doc/html/form_226.png | Bin 3149 -> 1421 bytes doc/html/form_227.png | Bin 3119 -> 1345 bytes doc/html/form_228.png | Bin 2670 -> 620 bytes doc/html/form_229.png | Bin 2725 -> 684 bytes doc/html/form_23.png | Bin 2564 -> 400 bytes doc/html/form_230.png | Bin 5094 -> 4687 bytes doc/html/form_231.png | Bin 2684 -> 630 bytes doc/html/form_232.png | Bin 2701 -> 659 bytes doc/html/form_233.png | Bin 3791 -> 2557 bytes doc/html/form_234.png | Bin 5608 -> 5560 bytes doc/html/form_235.png | Bin 2839 -> 910 bytes doc/html/form_236.png | Bin 2892 -> 975 bytes doc/html/form_237.png | Bin 2628 -> 518 bytes doc/html/form_238.png | Bin 3013 -> 1147 bytes doc/html/form_239.png | Bin 5078 -> 4961 bytes doc/html/form_24.png | Bin 3899 -> 2648 bytes doc/html/form_240.png | Bin 3162 -> 1403 bytes doc/html/form_241.png | Bin 2574 -> 447 bytes doc/html/form_242.png | Bin 2748 -> 725 bytes doc/html/form_243.png | Bin 2650 -> 555 bytes doc/html/form_244.png | Bin 2593 -> 467 bytes doc/html/form_245.png | Bin 2754 -> 701 bytes doc/html/form_246.png | Bin 3444 -> 1929 bytes doc/html/form_247.png | Bin 2540 -> 352 bytes doc/html/form_248.png | Bin 2892 -> 1008 bytes doc/html/form_249.png | Bin 2874 -> 1011 bytes doc/html/form_25.png | Bin 2600 -> 503 bytes doc/html/form_250.png | Bin 2659 -> 567 bytes doc/html/form_251.png | Bin 4325 -> 3321 bytes doc/html/form_252.png | Bin 2823 -> 858 bytes doc/html/form_253.png | Bin 2795 -> 850 bytes doc/html/form_254.png | Bin 2842 -> 907 bytes doc/html/form_255.png | Bin 2851 -> 930 bytes doc/html/form_256.png | Bin 2663 -> 583 bytes doc/html/form_257.png | Bin 3906 -> 2657 bytes doc/html/form_258.png | Bin 3756 -> 2427 bytes doc/html/form_259.png | Bin 2907 -> 1027 bytes doc/html/form_26.png | Bin 2681 -> 598 bytes doc/html/form_260.png | Bin 2964 -> 1104 bytes doc/html/form_261.png | Bin 3115 -> 1444 bytes doc/html/form_262.png | Bin 3115 -> 1414 bytes doc/html/form_263.png | Bin 2699 -> 637 bytes doc/html/form_264.png | Bin 3015 -> 1214 bytes doc/html/form_27.png | Bin 2652 -> 578 bytes doc/html/form_28.png | Bin 2754 -> 786 bytes doc/html/form_29.png | Bin 2821 -> 932 bytes doc/html/form_3.png | Bin 2914 -> 962 bytes doc/html/form_30.png | Bin 3088 -> 1329 bytes doc/html/form_31.png | Bin 7440 -> 8716 bytes doc/html/form_32.png | Bin 3066 -> 1302 bytes doc/html/form_33.png | Bin 8176 -> 9893 bytes doc/html/form_34.png | Bin 2667 -> 587 bytes doc/html/form_35.png | Bin 2553 -> 386 bytes doc/html/form_36.png | Bin 2677 -> 594 bytes doc/html/form_37.png | Bin 2715 -> 679 bytes doc/html/form_38.png | Bin 2704 -> 695 bytes doc/html/form_39.png | Bin 3837 -> 2670 bytes doc/html/form_4.png | Bin 2635 -> 548 bytes doc/html/form_40.png | Bin 2593 -> 464 bytes doc/html/form_41.png | Bin 2643 -> 545 bytes doc/html/form_42.png | Bin 2844 -> 874 bytes doc/html/form_43.png | Bin 2666 -> 606 bytes doc/html/form_44.png | Bin 5238 -> 4713 bytes doc/html/form_45.png | Bin 4733 -> 3928 bytes doc/html/form_46.png | Bin 5330 -> 4858 bytes doc/html/form_47.png | Bin 4078 -> 2935 bytes doc/html/form_48.png | Bin 3317 -> 1684 bytes doc/html/form_49.png | Bin 3469 -> 1987 bytes doc/html/form_5.png | Bin 2755 -> 716 bytes doc/html/form_50.png | Bin 2924 -> 1067 bytes doc/html/form_51.png | Bin 2901 -> 1001 bytes doc/html/form_52.png | Bin 2871 -> 956 bytes doc/html/form_53.png | Bin 2705 -> 650 bytes doc/html/form_54.png | Bin 2939 -> 1085 bytes doc/html/form_55.png | Bin 2701 -> 650 bytes doc/html/form_56.png | Bin 4047 -> 2856 bytes doc/html/form_57.png | Bin 2606 -> 466 bytes doc/html/form_58.png | Bin 3470 -> 1952 bytes doc/html/form_59.png | Bin 3129 -> 1413 bytes doc/html/form_6.png | Bin 2680 -> 613 bytes doc/html/form_60.png | Bin 8052 -> 9940 bytes doc/html/form_61.png | Bin 2651 -> 580 bytes doc/html/form_62.png | Bin 2686 -> 644 bytes doc/html/form_63.png | Bin 2738 -> 731 bytes doc/html/form_64.png | Bin 2954 -> 1084 bytes doc/html/form_65.png | Bin 2654 -> 573 bytes doc/html/form_66.png | Bin 2591 -> 460 bytes doc/html/form_67.png | Bin 2832 -> 889 bytes doc/html/form_68.png | Bin 2724 -> 718 bytes doc/html/form_69.png | Bin 2994 -> 1196 bytes doc/html/form_7.png | Bin 5467 -> 6422 bytes doc/html/form_70.png | Bin 2825 -> 904 bytes doc/html/form_71.png | Bin 2644 -> 569 bytes doc/html/form_72.png | Bin 2575 -> 439 bytes doc/html/form_73.png | Bin 3430 -> 1845 bytes doc/html/form_74.png | Bin 2590 -> 447 bytes doc/html/form_75.png | Bin 2892 -> 1012 bytes doc/html/form_76.png | Bin 2946 -> 1095 bytes doc/html/form_77.png | Bin 2917 -> 1079 bytes doc/html/form_78.png | Bin 5470 -> 5708 bytes doc/html/form_79.png | Bin 3005 -> 1150 bytes doc/html/form_8.png | Bin 4204 -> 3172 bytes doc/html/form_80.png | Bin 3847 -> 2932 bytes doc/html/form_81.png | Bin 2757 -> 779 bytes doc/html/form_82.png | Bin 2886 -> 1014 bytes doc/html/form_83.png | Bin 2774 -> 745 bytes doc/html/form_84.png | Bin 8896 -> 11207 bytes doc/html/form_85.png | Bin 2640 -> 528 bytes doc/html/form_86.png | Bin 2685 -> 680 bytes doc/html/form_87.png | Bin 2711 -> 713 bytes doc/html/form_88.png | Bin 2685 -> 680 bytes doc/html/form_89.png | Bin 2711 -> 713 bytes doc/html/form_9.png | Bin 2690 -> 629 bytes doc/html/form_90.png | Bin 2813 -> 880 bytes doc/html/form_91.png | Bin 2924 -> 1051 bytes doc/html/form_92.png | Bin 2666 -> 607 bytes doc/html/form_93.png | Bin 2701 -> 698 bytes doc/html/form_94.png | Bin 2582 -> 443 bytes doc/html/form_95.png | Bin 2600 -> 452 bytes doc/html/form_96.png | Bin 2681 -> 646 bytes doc/html/form_97.png | Bin 2518 -> 331 bytes doc/html/form_98.png | Bin 4978 -> 4453 bytes doc/html/form_99.png | Bin 4143 -> 3143 bytes doc/html/formula.repository | 12 +- doc/html/functions.html | 23 +- doc/html/functions_b.html | 25 +- doc/html/functions_c.html | 23 +- doc/html/functions_d.html | 23 +- doc/html/functions_e.html | 23 +- doc/html/functions_enum.html | 25 +- doc/html/functions_eval.html | 25 +- doc/html/functions_f.html | 23 +- doc/html/functions_func.html | 25 +- doc/html/functions_func_b.html | 27 +- doc/html/functions_func_c.html | 25 +- doc/html/functions_func_d.html | 25 +- doc/html/functions_func_e.html | 25 +- doc/html/functions_func_f.html | 25 +- doc/html/functions_func_g.html | 25 +- doc/html/functions_func_h.html | 25 +- doc/html/functions_func_i.html | 25 +- doc/html/functions_func_j.html | 25 +- doc/html/functions_func_l.html | 25 +- doc/html/functions_func_m.html | 25 +- doc/html/functions_func_n.html | 25 +- doc/html/functions_func_o.html | 25 +- doc/html/functions_func_p.html | 25 +- doc/html/functions_func_q.html | 25 +- doc/html/functions_func_r.html | 25 +- doc/html/functions_func_s.html | 25 +- doc/html/functions_func_t.html | 25 +- doc/html/functions_func_u.html | 25 +- doc/html/functions_func_v.html | 25 +- doc/html/functions_func_w.html | 25 +- doc/html/functions_func_x.html | 25 +- doc/html/functions_func_~.html | 25 +- doc/html/functions_g.html | 23 +- doc/html/functions_h.html | 23 +- doc/html/functions_i.html | 23 +- doc/html/functions_j.html | 23 +- doc/html/functions_l.html | 23 +- doc/html/functions_m.html | 23 +- doc/html/functions_n.html | 23 +- doc/html/functions_o.html | 23 +- doc/html/functions_p.html | 23 +- doc/html/functions_q.html | 23 +- doc/html/functions_r.html | 23 +- doc/html/functions_rela.html | 25 +- doc/html/functions_s.html | 23 +- doc/html/functions_t.html | 23 +- doc/html/functions_u.html | 23 +- doc/html/functions_v.html | 23 +- doc/html/functions_vars.html | 25 +- doc/html/functions_vars_b.html | 25 +- doc/html/functions_vars_c.html | 25 +- doc/html/functions_vars_d.html | 25 +- doc/html/functions_vars_e.html | 25 +- doc/html/functions_vars_f.html | 25 +- doc/html/functions_vars_g.html | 25 +- doc/html/functions_vars_h.html | 25 +- doc/html/functions_vars_l.html | 25 +- doc/html/functions_vars_m.html | 25 +- doc/html/functions_vars_n.html | 25 +- doc/html/functions_vars_o.html | 25 +- doc/html/functions_vars_p.html | 25 +- doc/html/functions_vars_r.html | 25 +- doc/html/functions_vars_s.html | 25 +- doc/html/functions_vars_t.html | 25 +- doc/html/functions_vars_u.html | 25 +- doc/html/functions_vars_v.html | 25 +- doc/html/functions_vars_w.html | 25 +- doc/html/functions_vars_x.html | 25 +- doc/html/functions_vars_y.html | 25 +- doc/html/functions_vars_z.html | 25 +- doc/html/functions_w.html | 23 +- doc/html/functions_x.html | 23 +- doc/html/functions_y.html | 23 +- doc/html/functions_z.html | 23 +- doc/html/functions_~.html | 23 +- doc/html/global_8cpp.html | 76 +- doc/html/global_8cpp_source.html | 605 +- doc/html/global_8h.html | 895 +- doc/html/global_8h_source.html | 187 +- doc/html/globals.html | 34 +- doc/html/globals_enum.html | 25 +- doc/html/globals_func.html | 36 +- doc/html/grapevine_8cpp.html | 39 +- doc/html/grapevine_8cpp_source.html | 225 +- doc/html/group__compoundobjects.html | 1120 +-- doc/html/group__functions.html | 652 +- doc/html/group__primitives.html | 215 +- doc/html/group__timeseries.html | 127 +- doc/html/group__vectors.html | 194 +- doc/html/helios__vector__types_8h.html | 355 +- doc/html/helios__vector__types_8h_source.html | 729 +- doc/html/hierarchy.html | 31 +- doc/html/index.html | 26 +- doc/html/jquery.js | 190 +- .../lidar_2include_2random_8h_source.html | 23 +- doc/html/lidar_2src_2file_i_o_8cpp.html | 23 +- .../lidar_2src_2file_i_o_8cpp_source.html | 191 +- doc/html/main_8cpp_source.html | 65 +- doc/html/menu.js | 38 +- doc/html/menudata.js | 7 +- doc/html/minus.svg | 8 + doc/html/minusd.svg | 8 + doc/html/modules.html | 106 - doc/html/navtree.css | 149 + doc/html/pages.html | 91 +- .../plugins_2lidar_2src_2self_test_8cpp.html | 23 +- ...ns_2lidar_2src_2self_test_8cpp_source.html | 97 +- ...lantarchitecture_2src_2self_test_8cpp.html | 23 +- ...hitecture_2src_2self_test_8cpp_source.html | 71 +- ...ugins_2radiation_2src_2self_test_8cpp.html | 23 +- ...radiation_2src_2self_test_8cpp_source.html | 171 +- ...rposition_2src_2self_test_8cpp_source.html | 61 +- doc/html/plus.svg | 9 + doc/html/plusd.svg | 9 + doc/html/primitive_intersection_8cu.html | 177 +- .../primitive_intersection_8cu_source.html | 75 +- .../radiation_2include_2random_8h_source.html | 25 +- doc/html/radiation__beers_law.html | 25 +- doc/html/radiation_basics.html | 25 +- doc/html/ray_generation_8cu.html | 109 +- doc/html/ray_generation_8cu_source.html | 59 +- doc/html/ray_hit_8cu.html | 137 +- doc/html/ray_hit_8cu_source.html | 39 +- doc/html/resize.js | 147 + doc/html/s__hull__pro_8h_source.html | 35 +- doc/html/search/all_0.js | 4 +- doc/html/search/all_1.js | 92 +- doc/html/search/all_10.js | 40 +- doc/html/search/all_11.js | 124 +- doc/html/search/all_12.js | 246 +- doc/html/search/all_13.js | 39 +- doc/html/search/all_14.js | 101 +- doc/html/search/all_15.js | 109 +- doc/html/search/all_16.js | 51 +- doc/html/search/all_17.js | 93 +- doc/html/search/all_18.js | 165 +- doc/html/search/all_19.js | 6 +- doc/html/search/all_1a.js | 116 +- doc/html/search/all_1b.js | 332 + doc/html/search/all_1c.js | 156 + doc/html/search/all_1d.js | 52 + doc/html/search/all_1e.js | 54 + doc/html/search/all_1f.js | 77 + doc/html/search/all_2.js | 46 +- doc/html/search/all_20.js | 22 + doc/html/search/all_21.js | 6 + doc/html/search/all_22.js | 5 + doc/html/search/all_23.js | 14 + doc/html/search/all_3.js | 110 +- doc/html/search/all_4.js | 72 +- doc/html/search/all_5.js | 34 +- doc/html/search/all_6.js | 17 +- doc/html/search/all_7.js | 251 +- doc/html/search/all_8.js | 26 +- doc/html/search/all_9.js | 193 +- doc/html/search/all_a.js | 88 +- doc/html/search/all_b.js | 261 +- doc/html/search/all_c.js | 145 +- doc/html/search/all_d.js | 62 +- doc/html/search/all_e.js | 96 +- doc/html/search/all_f.js | 383 +- doc/html/search/close.svg | 19 +- doc/html/search/functions_0.js | 24 +- doc/html/search/functions_1.js | 6 +- doc/html/search/functions_10.js | 18 +- doc/html/search/functions_11.js | 235 +- doc/html/search/functions_15.js | 6 +- doc/html/search/functions_2.js | 7 +- doc/html/search/functions_3.js | 6 +- doc/html/search/functions_6.js | 14 +- doc/html/search/functions_8.js | 2 +- doc/html/search/functions_b.js | 9 +- doc/html/search/functions_d.js | 14 +- doc/html/search/functions_e.js | 6 +- doc/html/search/groups_1.js | 2 +- doc/html/search/groups_2.js | 2 +- doc/html/search/groups_3.js | 2 +- doc/html/search/groups_4.js | 2 +- doc/html/search/groups_5.js | 4 + doc/html/search/groups_6.js | 4 + doc/html/search/groups_7.js | 4 + doc/html/search/mag.svg | 19 +- doc/html/search/mag_d.svg | 19 +- doc/html/search/mag_sel.svg | 53 +- doc/html/search/mag_seld.svg | 59 +- doc/html/search/pages_0.js | 3 +- doc/html/search/pages_1.js | 4 +- doc/html/search/pages_10.js | 9 +- doc/html/search/pages_11.js | 7 +- doc/html/search/pages_12.js | 7 + doc/html/search/pages_13.js | 7 + doc/html/search/pages_14.js | 15 + doc/html/search/pages_15.js | 6 + doc/html/search/pages_16.js | 9 + doc/html/search/pages_17.js | 24 + doc/html/search/pages_18.js | 8 + doc/html/search/pages_19.js | 11 + doc/html/search/pages_1a.js | 9 + doc/html/search/pages_2.js | 3 +- doc/html/search/pages_3.js | 4 +- doc/html/search/pages_4.js | 2 +- doc/html/search/pages_5.js | 2 +- doc/html/search/pages_6.js | 2 +- doc/html/search/pages_7.js | 2 +- doc/html/search/pages_8.js | 10 +- doc/html/search/pages_9.js | 6 +- doc/html/search/pages_a.js | 11 +- doc/html/search/pages_b.js | 9 +- doc/html/search/pages_c.js | 2 +- doc/html/search/pages_d.js | 8 +- doc/html/search/pages_e.js | 16 +- doc/html/search/pages_f.js | 6 +- doc/html/search/related_0.js | 2 +- doc/html/search/search.css | 2 +- doc/html/search/search.js | 942 +-- doc/html/search/searchdata.js | 6 +- doc/html/search/variables_1.js | 4 +- doc/html/search/variables_12.js | 6 +- doc/html/search/variables_13.js | 2 +- doc/html/search/variables_14.js | 2 +- doc/html/search/variables_15.js | 2 +- doc/html/search/variables_2.js | 4 +- doc/html/search/variables_4.js | 2 +- doc/html/search/variables_5.js | 6 +- doc/html/search/variables_6.js | 2 +- doc/html/search/variables_8.js | 14 +- doc/html/search/variables_c.js | 6 +- doc/html/search/variables_d.js | 4 +- doc/html/search/variables_e.js | 8 +- doc/html/search/variables_f.js | 4 +- doc/html/sorghum_8cpp_source.html | 207 +- doc/html/strawberry_8cpp_source.html | 99 +- doc/html/struct_aerial_hit_point.html | 65 +- doc/html/struct_aerial_scan_metadata.html | 64 +- doc/html/struct_axis_rotation.html | 72 +- doc/html/struct_b_b_lcoefficients.html | 33 +- doc/html/struct_b_bcoefficients.html | 37 +- doc/html/struct_b_m_fcoefficients.html | 35 +- doc/html/struct_b_w_bcoefficients.html | 31 +- doc/html/struct_base_canopy_parameters.html | 65 +- doc/html/struct_base_canopy_parameters.png | Bin 5256 -> 5256 bytes .../struct_base_grape_vine_parameters.html | 165 +- .../struct_base_grape_vine_parameters.png | Bin 2081 -> 2081 bytes doc/html/struct_bean_parameters.html | 107 +- doc/html/struct_bean_parameters.png | Bin 653 -> 653 bytes doc/html/struct_camera_calibration.html | 267 +- ...ation_1_1_gradient_descent_parameters.html | 33 +- doc/html/struct_camera_properties.html | 47 +- doc/html/struct_colormap.html | 119 +- ...ruct_conical_crowns_canopy_parameters.html | 101 +- ...truct_conical_crowns_canopy_parameters.png | Bin 804 -> 804 bytes doc/html/struct_dupex.html | 70 +- .../struct_empirical_model_coefficients.html | 45 +- .../struct_farquhar_model_coefficients.html | 203 +- doc/html/struct_floral_bud.html | 49 +- .../struct_goblet_grapevine_parameters.html | 179 +- .../struct_goblet_grapevine_parameters.png | Bin 1079 -> 1079 bytes doc/html/struct_grid_cell.html | 75 +- doc/html/struct_hit_point.html | 65 +- .../struct_homogeneous_canopy_parameters.html | 97 +- .../struct_homogeneous_canopy_parameters.png | Bin 790 -> 790 bytes doc/html/struct_leaf_optics_properties.html | 73 +- doc/html/struct_leaf_prototype.html | 80 +- doc/html/struct_m_o_p_tcoefficients.html | 31 +- doc/html/struct_per_ray_data.html | 37 +- ...hetic_temperature_response_parameters.html | 86 +- doc/html/struct_phytomer.html | 366 +- doc/html/struct_phytomer_parameters.html | 55 +- doc/html/struct_plant_instance.html | 69 +- doc/html/struct_radiation_band.html | 76 +- doc/html/struct_radiation_camera.html | 90 +- doc/html/struct_radiation_source.html | 112 +- doc/html/struct_random_parameter__float.html | 111 +- doc/html/struct_random_parameter__int.html | 74 +- doc/html/struct_scan_metadata.html | 108 +- doc/html/struct_shader.html | 197 +- doc/html/struct_shoot.html | 258 +- doc/html/struct_shoot_parameters.html | 104 +- doc/html/struct_shx.html | 78 +- .../struct_sorghum_canopy_parameters.html | 199 +- doc/html/struct_sorghum_canopy_parameters.png | Bin 778 -> 778 bytes ...ct_spherical_crowns_canopy_parameters.html | 99 +- ...uct_spherical_crowns_canopy_parameters.png | Bin 830 -> 830 bytes .../struct_split_grapevine_parameters.html | 191 +- .../struct_split_grapevine_parameters.png | Bin 1078 -> 1078 bytes doc/html/struct_strawberry_parameters.html | 107 +- doc/html/struct_strawberry_parameters.png | Bin 708 -> 708 bytes doc/html/struct_tomato_parameters.html | 101 +- doc/html/struct_tomato_parameters.png | Bin 655 -> 655 bytes doc/html/struct_triad.html | 98 +- doc/html/struct_triangulation.html | 80 +- ...truct_unilateral_grapevine_parameters.html | 179 +- ...struct_unilateral_grapevine_parameters.png | Bin 1102 -> 1102 bytes .../struct_v_s_p_grapevine_parameters.html | 179 +- .../struct_v_s_p_grapevine_parameters.png | Bin 1079 -> 1079 bytes doc/html/struct_vegetative_bud.html | 29 +- doc/html/struct_walnut_canopy_parameters.html | 105 +- doc/html/struct_walnut_canopy_parameters.png | Bin 728 -> 728 bytes .../struct_weber_penn_tree_parameters.html | 105 +- ...struct_white_spruce_canopy_parameters.html | 111 +- .../struct_white_spruce_canopy_parameters.png | Bin 793 -> 793 bytes doc/html/structhelios_1_1_date.html | 104 +- doc/html/structhelios_1_1_global_data.html | 53 +- doc/html/structhelios_1_1_location.html | 76 +- doc/html/structhelios_1_1_r_g_b_acolor.html | 96 +- doc/html/structhelios_1_1_r_g_bcolor.html | 96 +- .../structhelios_1_1_spherical_coord.html | 88 +- doc/html/structhelios_1_1_time.html | 89 +- doc/html/structhelios_1_1_timer.html | 44 +- doc/html/structhelios_1_1int2.html | 105 +- doc/html/structhelios_1_1int3.html | 110 +- doc/html/structhelios_1_1int4.html | 115 +- doc/html/structhelios_1_1vec2.html | 140 +- doc/html/structhelios_1_1vec3.html | 145 +- doc/html/structhelios_1_1vec4.html | 150 +- doc/html/structjpg__error__mgr.html | 27 +- doc/html/structmy__error__mgr.html | 27 +- doc/html/tabs.css | 2 +- doc/html/tomato_8cpp_source.html | 83 +- doc/html/usergroup0.html | 23 +- doc/html/visualizer_basics.html | 25 +- doc/html/visualizer_pdata.html | 25 +- doc/html/walnut_8cpp_source.html | 113 +- doc/html/whitespruce_8cpp_source.html | 81 +- .../doc/PlantArchitecture.dox | 2 +- .../include/PlantArchitecture.h | 37 + .../src/PlantArchitecture.cpp | 119 +- plugins/radiation/doc/Radiation.dox | 2 +- plugins/visualizer/doc/Visualizer.dox | 141 +- plugins/visualizer/include/Visualizer.h | 11 + plugins/visualizer/src/Visualizer.cpp | 90 +- 859 files changed, 40818 insertions(+), 33887 deletions(-) delete mode 100644 doc/html/bdwn.png create mode 100644 doc/html/clipboard.js create mode 100644 doc/html/cookie.js delete mode 100644 doc/html/doc.png create mode 100644 doc/html/doc.svg delete mode 100644 doc/html/docd.png create mode 100644 doc/html/docd.svg create mode 100644 doc/html/doxygen_crawl.html delete mode 100644 doc/html/folderclosed.png create mode 100644 doc/html/folderclosed.svg create mode 100644 doc/html/folderclosedd.svg delete mode 100644 doc/html/folderopen.png create mode 100644 doc/html/folderopen.svg create mode 100644 doc/html/folderopend.svg create mode 100644 doc/html/minus.svg create mode 100644 doc/html/minusd.svg delete mode 100644 doc/html/modules.html create mode 100644 doc/html/navtree.css create mode 100644 doc/html/plus.svg create mode 100644 doc/html/plusd.svg create mode 100644 doc/html/resize.js create mode 100644 doc/html/search/all_1b.js create mode 100644 doc/html/search/all_1c.js create mode 100644 doc/html/search/all_1d.js create mode 100644 doc/html/search/all_1e.js create mode 100644 doc/html/search/all_1f.js create mode 100644 doc/html/search/all_20.js create mode 100644 doc/html/search/all_21.js create mode 100644 doc/html/search/all_22.js create mode 100644 doc/html/search/all_23.js create mode 100644 doc/html/search/groups_5.js create mode 100644 doc/html/search/groups_6.js create mode 100644 doc/html/search/groups_7.js create mode 100644 doc/html/search/pages_12.js create mode 100644 doc/html/search/pages_13.js create mode 100644 doc/html/search/pages_14.js create mode 100644 doc/html/search/pages_15.js create mode 100644 doc/html/search/pages_16.js create mode 100644 doc/html/search/pages_17.js create mode 100644 doc/html/search/pages_18.js create mode 100644 doc/html/search/pages_19.js create mode 100644 doc/html/search/pages_1a.js diff --git a/core/include/global.h b/core/include/global.h index 0e9ec482a..ed9021dca 100755 --- a/core/include/global.h +++ b/core/include/global.h @@ -26,11 +26,11 @@ #define M_PI 3.14159265358979323846 #endif -inline constexpr float PI_F = 3.14159265358979323846f; - #ifndef HELIOS_GLOBAL #define HELIOS_GLOBAL +constexpr float PI_F = 3.14159265358979323846f; + #include #include #include diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 466ee1f1b..88774f353 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -2012,4 +2012,15 @@ The radiation model has been re-designed, with the following primary additions: - All output messages were not being properly suppressed after calling disableOutputMessages(). *Canopy Generator* -- Many edits made regarding how parameters with random variation are handled, mainly to ensure proper constraints on values (e.g., always positive). \ No newline at end of file +- Many edits made regarding how parameters with random variation are handled, mainly to ensure proper constraints on values (e.g., always positive). + +[1.3.26] 2025-01-17 + +*Context* +- Definition of global PI_F variable in global.h was causing a build issue on some compilers + +*Visualizer* +- Added mouse-based camera controls in the interactive visualizer. Credit to Sean Banks for this update. + +*Plant Architecture* +- Added methods for querying bulk properties of a plant (total leaf count, stem height, plant height, leaf angle distribution) and write plant mesh vertices to file. \ No newline at end of file diff --git a/doc/UserGuide.dox b/doc/UserGuide.dox index e7030f052..b8ef1ad7e 100755 --- a/doc/UserGuide.dox +++ b/doc/UserGuide.dox @@ -1,4 +1,4 @@ -/*! \mainpage Helios Documentation v1.3.25 +/*! \mainpage Helios Documentation v1.3.26


@@ -537,8 +537,8 @@ $ git pull Note that the above colors can be directly passed to \ref helios::make_RGBAcolor() "make_RGBAcolor" to specify an alpha (transparency) value: ~~~~~~{.cpp} - RGBAcolor red_trans = make_RGBAcolor( RGB::red, 0.5 ); - ~~~~~~ + RGBAcolor red_trans = make_RGBAcolor( RGB::red, 0.5 ); + ~~~~~~ \section Coord Coordinate System diff --git a/doc/header.html b/doc/header.html index d7f03827b..b4e095298 100644 --- a/doc/header.html +++ b/doc/header.html @@ -40,7 +40,7 @@ Logo -
 v1.3.25 +
 v1.3.26
diff --git a/doc/html/_a_p_i.html b/doc/html/_a_p_i.html index 2dff3dc9d..ee6e626ad 100644 --- a/doc/html/_a_p_i.html +++ b/doc/html/_a_p_i.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
User/API Guide
+
User/API Guide

Table of Contents

-

@@ -161,7 +242,7 @@

It is generally convenient to have a separate directory in which the project is built. This makes it easy to start fresh with a new build, or create multiple builds on different systems. Usually, the build directory is a subdirectory within the project directory (see 'samples' directory for examples).

Main and auxiliary .cpp files

-

Projects using the Helios API must have a file containing a main() program, and can have any number of complimentary routines and files. Generally, the file containing the main program will include the Context.h header file, and declare the Context class (see Sect. Context below).

+

Projects using the Helios API must have a file containing a main() program, and can have any number of complimentary routines and files. Generally, the file containing the main program will include the Context.h header file, and declare the Context class (see Sect. Context below).

CMakeLists.txt File

Projects that use the Helios API are typically built using the CMake package a CMakeLists.txt file. Helios requires CMake version 3.15+. A prototypical CMakeLists.txt file used for building Helios samples and projects is given in the code sample below. Inputs for the specific case are entered in the top block of code by setting variables (see the CMake 'set' command reference). The user sets the location of the Helios base directory, the name of the executable file, any source or header files, and a list of plug-ins to use (the example below uses the 'visualizer' plug-in). The last line in the file references another file in the core/ directory that contains additional code for setting up the project.

@@ -275,7 +356,7 @@

int main(){
Context context;
}
-
Stores the state associated with simulation.
Definition: Context.h:1882
+
Stores the state associated with simulation.
Definition Context.h:1882

The Context is usually passed to plugins (see Writing Plugins), which gives them access to geometry and data.

Vector Types

@@ -360,12 +441,12 @@

Note that the above colors can be directly passed to make_RGBAcolor to specify an alpha (transparency) value:

RGBAcolor red_trans = make_RGBAcolor( RGB::red, 0.5 );
-
R-G-B-A color vector.
+
R-G-B-A color vector.

Coordinate System

-

Helios uses a right-handed Cartesian coordinate system. (x,y,z) coordinates are typically specified using the 'vec3' data structure (see Vector Types).
+

Helios uses a right-handed Cartesian coordinate system. (x,y,z) coordinates are typically specified using the 'vec3' data structure (see Vector Types).

-

Rotations are typically specified using spherical angles (see Vector Types). A rotation of the elevation angle $\theta$ rotates the object about its y-axis. A rotation of the azimuthal angle $\varphi$ rotates the object clockwise about its z-axis.

+

Rotations are typically specified using spherical angles (see Vector Types). A rotation of the elevation angle $\theta$ rotates the object about its y-axis. A rotation of the azimuthal angle $\varphi$ rotates the object clockwise about its z-axis.

When compass directions are used, +y corresponds to North, and +x corresponds East. The azimuthal angle $\varphi$ is measured clockwise from North.

@@ -435,7 +516,7 @@

Adding Patches

-

Patches are added by specifying the (x,y,z) coordinate of its center, the lengths of its sides in the x- and y-directions, and optionally its spherical rotation (see Coordinate System) and r-g-b color. The following is an example of using the 'addPatch' function to add a simple patch:

+

Patches are added by specifying the (x,y,z) coordinate of its center, the lengths of its sides in the x- and y-directions, and optionally its spherical rotation (see Coordinate System) and r-g-b color. The following is an example of using the 'addPatch' function to add a simple patch:

#include "Context.h"
using namespace helios;
@@ -450,9 +531,9 @@

UUID = context.addPatch( center, size );
}
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.

This will add the Patch shown below, with the default orientation of horizontal. (Note that the addition of the checkerboard ground and the 'Visualizer' plugin is needed to replicate this image, which is not shown in the example code.)

@@ -463,7 +544,7 @@

vec2 size = make_vec2(1,1);
SphericalCoord rotation = make_SphericalCoord(0.25*M_PI,0.5*M_PI);
context.addPatch( center, size, rotation );
-
Vector of spherical coordinates (elevation,azimuth)
+
Vector of spherical coordinates (elevation,azimuth)

This will first rotate the patch by 0.25 $\pi$ rad about the x-axis such that its normal is pointing toward the +y direction, THEN it will apply a clockwise azimuthal rotation of 0.5 $\pi$ rad such that its normal is pointing in the +x direction (which will be its final orientation). Note that in order to have more control over rotations, it is recommended to use the Primitive::rotate() function (see "Primitive Transformations" section below).

Adding Triangles

@@ -483,7 +564,7 @@

UUID = context.addTriangle( v0, v1, v2, RGB::red );
}
-
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition: Context.cpp:1328
+
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition Context.cpp:1328

This will add the Triangle shown below. (Note that the addition of the checkerboard ground and the 'Visualizer' plugin is needed to replicate this image, which is not shown in the example code.)

@@ -496,7 +577,7 @@

Right-hand rule to determine triangle normal direction based on the three vertices 0, 1, and 2.

Adding Voxels

-

Voxels are added by specifying the (x,y,z) coordinate of its center, the lengths of its sides in the x-, y-, and z-directions, and optionally its spherical rotation (see Coordinate System) and r-g-b color. The following is an example of using the 'addVoxel()' function to add a simple voxel:

+

Voxels are added by specifying the (x,y,z) coordinate of its center, the lengths of its sides in the x-, y-, and z-directions, and optionally its spherical rotation (see Coordinate System) and r-g-b color. The following is an example of using the 'addVoxel()' function to add a simple voxel:

#include "Context.h"
using namespace helios;
@@ -511,7 +592,7 @@

UUID = context.addVoxel( center, size, 0, RGB::red );
}
-
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition: Context.cpp:1372
+
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition Context.cpp:1372

This will add the Voxel shown below, with the default orientation of horizontal. (Note that the addition of the checkerboard ground and the 'visualizer' plugin is needed to replicate this image, which is not shown in the example code.)

@@ -584,7 +665,7 @@

context.translatePrimitive( UUID, translation );
}
-
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition: Context.cpp:1406
+
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition Context.cpp:1406

Primitive Properties

All primitives have a common set of data that can be accessed by the same set of functions, such as the primitive surface area, the primitive vertices, etc.

@@ -739,8 +820,8 @@

context.deletePrimitive(UUID);
}
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition: Context.cpp:1578
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition Context.cpp:1578

@@ -778,7 +859,7 @@

+ + + + +
PropertyGetter Function
-td
Sphere Spherical object tessellated with Triangle primitives.
  • @@ -791,7 +872,7 @@

-td
Tube Cylindrical tube object tessellated with Triangle primitives. Follows a specified path and can change radius along its length.
  • @@ -802,7 +883,7 @@

-td
Box Rectangular prism object tessellated with Patch primitives.
  • @@ -815,7 +896,7 @@

-td
Disk Ellipsoidal disk object tessellated with Triangle primitives.
  • @@ -832,7 +913,7 @@

-td

Objects

@@ -853,7 +934,7 @@

-td + Sphere Spherical object tessellated with Triangle primitives.

Global Data

Global data is similar to primitive data, except that it does not correspond to any particular primitive, rather it is a single instance of a certain data structure. The functions used to create global data within the Context are essentially the same as those used to create primitive data, except they do not take a primitive UUID as an argument (because they do not correspond to primitives).

@@ -1260,14 +1341,14 @@

}
}
-
uint getTimeseriesLength(const char *label) const
Get the length of timeseries data.
Definition: Context.cpp:2014
-
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition: Context.cpp:1894
-
void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
Add a data point to timeseries of data.
Definition: Context.cpp:1823
- - -
int second
Second of minute.
-
int hour
Hour of day.
-
int minute
Minute of hour.
+
uint getTimeseriesLength(const char *label) const
Get the length of timeseries data.
Definition Context.cpp:2014
+
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition Context.cpp:1894
+
void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
Add a data point to timeseries of data.
Definition Context.cpp:1823
+ + +
int second
Second of minute.
+
int hour
Hour of day.
+
int minute
Minute of hour.

Typically, data is not entered manually, but rather through an XML or text file (see Reading XML Files for information).

It is often necessary to get the number of data points in a given timeseries, which can be accomplished with the command:

uint N = context.getTimeseriesLength( "temperature" );
@@ -1275,7 +1356,8 @@

+ diff --git a/doc/html/_aerial_li_d_a_r_8cpp.html b/doc/html/_aerial_li_d_a_r_8cpp.html index 729340d97..668a22ef9 100644 --- a/doc/html/_aerial_li_d_a_r_8cpp.html +++ b/doc/html/_aerial_li_d_a_r_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
AerialLiDAR.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_aerial_li_d_a_r_8cpp_source.html b/doc/html/_aerial_li_d_a_r_8cpp_source.html index 4b6e57d96..c982a3b01 100644 --- a/doc/html/_aerial_li_d_a_r_8cpp_source.html +++ b/doc/html/_aerial_li_d_a_r_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
AerialLiDAR.cpp
@@ -98,6 +110,7 @@
18using namespace std;
19using namespace helios;
20
+
21AerialScanMetadata::AerialScanMetadata( const helios::vec3 __center, const helios::vec2 __extent, const float __coneangle, const float __scandensity, const float __exitDiameter, const float __beamDivergence ){
22
23 //Copy arguments into structure variables
@@ -109,7 +122,9 @@
29 beamDivergence = __beamDivergence;
30
31}
+
32
+
34
35 hitgridcellcomputed = false;
@@ -117,11 +132,15 @@
37 printmessages = true;
38
39}
+
40
+
44
+
46
47 float err_tol = 0.1;
@@ -356,23 +375,33 @@
276 }
277
278}
+
279
+
281 printmessages = false;
282}
+
283
+
285 printmessages = true;
286}
+
287
+
289 return scans.size();
290}
+
291
+
293 scans.push_back(newscan);
294}
+
295
+
296void AerialLiDARcloud::addHitPoint( const uint scanID, const helios::vec3 hit_xyz, helios::vec3 ray_origin ){
297
298 vec3 direction_cart = hit_xyz-ray_origin;
@@ -387,7 +416,9 @@
307 addHitPoint( scanID, hit_xyz, direction_sphere, color, data );
308
309}
+
310
+
311void AerialLiDARcloud::addHitPoint( const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction ){
312
313 //default color
@@ -399,7 +430,9 @@
319 addHitPoint( scanID, hit_xyz, direction, color, data );
320
321}
+
322
+
323void AerialLiDARcloud::addHitPoint( const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const std::map<std::string, float> data ){
324
325 //default color
@@ -408,7 +441,9 @@
328 addHitPoint( scanID, hit_xyz, direction, color, data );
329
330}
+
331
+
332void AerialLiDARcloud::addHitPoint( const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color ){
333
334 //empty data
@@ -417,7 +452,9 @@
337 addHitPoint( scanID, hit_xyz, direction, color, data );
338
339}
+
340
+
341void AerialLiDARcloud::addHitPoint( const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color, const std::map<std::string, float> data ){
342
343 //error checking
@@ -432,7 +469,9 @@
352 hits.push_back( hit );
353
354}
+
355
+
356void AerialLiDARcloud::deleteHitPoint( const uint index ){
357
358 if( index>=hits.size() ){
@@ -448,53 +487,69 @@
368 hits.pop_back();
369
370}
+
371
+
373 return hits.size();
374}
+
375
+
377 if( scanID>=scans.size() ){
378 helios_runtime_error("ERROR (AerialLiDARcloud::getScanCenter): Cannot get center of scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
379 }
380 return scans.at(scanID).center;
381}
+
382
+
384 if( scanID>=scans.size() ){
385 helios_runtime_error("ERROR (AerialLiDARcloud::getScanExtent): Cannot get extent for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
386 }
387 return scans.at(scanID).extent;
388}
+
389
+
390float AerialLiDARcloud::getScanConeAngle( const uint scanID ) const{
391 if( scanID>=scans.size() ){
392 helios_runtime_error("ERROR (AerialLiDARcloud::getScanConeAngle): Cannot get cone angle for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
393 }
394 return scans.at(scanID).coneangle;
395}
+
396
+
397float AerialLiDARcloud::getScanDensity( const uint scanID ) const{
398 if( scanID>=scans.size() ){
399 helios_runtime_error("ERROR (AerialLiDARcloud::getScanDensity): Cannot get point density for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
400 }
401 return scans.at(scanID).scandensity;
402}
+
403
+
404float AerialLiDARcloud::getScanBeamExitDiameter( const uint scanID ) const{
405 if( scanID>=scans.size() ){
406 helios_runtime_error("ERROR (AerialLiDARcloud::getScanBeamExitDiameter): Cannot get exit diameter for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
407 }
408 return scans.at(scanID).exitDiameter;
409}
+
410
+
411float AerialLiDARcloud::getScanBeamDivergence( const uint scanID ) const{
412 if( scanID>=scans.size() ){
413 helios_runtime_error("ERROR (AerialLiDARcloud::getScanBeamDivergence): Cannot get beam divergence for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
414 }
415 return scans.at(scanID).beamDivergence;
416}
+
417
+
419
420 if( index>=hits.size() ){
@@ -504,7 +559,9 @@
424 return hits.at(index).position;
425
426}
+
427
+
429
430 if( index>=hits.size() ){
@@ -515,7 +572,9 @@
435 return hits.at(index).direction;
436
437}
+
438
+
439float AerialLiDARcloud::getHitData( const uint index, const char* label ) const{
440
441 if( index>=hits.size() ){
@@ -532,7 +591,9 @@
452 return hit_data.at(label);
453
454}
+
455
+
456void AerialLiDARcloud::setHitData( const uint index, const char* label, const float value ){
457
458 if( index>=hits.size() ){
@@ -543,7 +604,9 @@
463 hits.at(index).data[label] = value;
464
465}
+
466
+
467bool AerialLiDARcloud::doesHitDataExist( const uint index, const char* label ) const{
468
469 if( index>=hits.size() ){
@@ -558,7 +621,9 @@
478 }
479
480}
+
481
+
482RGBcolor AerialLiDARcloud::getHitColor( const uint index ) const{
483
484 if( index>=hits.size() ){
@@ -569,7 +634,9 @@
489 return hits.at(index).color;
490
491}
+
492
+
493int AerialLiDARcloud::getHitScanID( const uint index ) const{
494
495 if( index>=hits.size() ){
@@ -580,7 +647,9 @@
500 return hits.at(index).scanID;
501
502}
+
503
+
505
506 if( index>=hits.size() ){
@@ -594,7 +663,9 @@
514 return hits.at(index).gridcell;
515
516}
+
517
+
518void AerialLiDARcloud::setHitGridCell( const uint index, const helios::int3 ijk ){
519
520 if( index>=hits.size() ){
@@ -617,6 +688,7 @@
537 hits.at(index).gridcell = ijk;
538
539}
+
540
541void AerialLiDARcloud::coordinateShift( const helios::vec3 shift ){
542
@@ -634,10 +706,13 @@
554
555}
556
+
557void AerialLiDARcloud::addHitsToVisualizer( Visualizer* visualizer, const uint pointsize ) const{
558 addHitsToVisualizer( visualizer, pointsize, "" );
559}
+
560
+
561void AerialLiDARcloud::addHitsToVisualizer( Visualizer* visualizer, const uint pointsize, const char* color_value ) const{
562
563 if( printmessages && scans.size()==0 ){
@@ -699,7 +774,9 @@
619 }
620
621}
+
622
+
624
625 if( printmessages && scans.size()==0 ){
@@ -753,7 +830,9 @@
673 float R = 2.f*sqrt( pow(boxmax.x-boxmin.x,2) + pow(boxmax.y-boxmin.y,2) + pow(boxmax.z-boxmin.z,2) );
674
675}
+
676
+
678
679 if( printmessages && hits.size()==0 ){
@@ -790,9 +869,11 @@
710 }
711
712}
+
713
714// -------- GRID -------- //
715
+
717
718 if( index<0 || index>=gridresolution.x*gridresolution.y*gridresolution.z ){
@@ -817,7 +898,9 @@
737 }
738
739}
+
740
+
742
743 int index = ijk.z*gridresolution.x*gridresolution.y+ijk.y*gridresolution.y+ijk.x;
@@ -829,29 +912,39 @@
749 }
750
751}
+
752
+
754
755 return gridcenter;
756}
+
757
+
759
760 return gridextent;
761
762}
+
763
+
765
766 return gridresolution;
767}
+
768
+
770
771 return gridrotation;
772
773}
+
774
+
776
777 float x = -0.5*gridextent.x+(float(ijk.x)+0.5f)*gridextent.x/float(gridresolution.x);
@@ -870,15 +963,19 @@
790 return make_vec3(xy.x,xy.y,z);
791
792}
+
793
+
795
796 return make_vec3( gridextent.x/float(gridresolution.x), gridextent.y/float(gridresolution.y), gridextent.z/float(gridresolution.z) );
797
798}
+
799
800// -------- LEAF AREA -------- //
801
+
802void AerialLiDARcloud::setCellLeafArea( const float area, const int3 ijk ){
803
804 if( ijk.x<0 || ijk.x>=gridresolution.x ){
@@ -907,7 +1004,9 @@
827 leaf_area.at(ijk.z).at(ijk.y).at(ijk.x) = area;
828
829}
+
830
+
832
833 if( leaf_area.size()!=gridresolution.z ){
@@ -931,7 +1030,9 @@
851 return leaf_area.at(ijk.z).at(ijk.y).at(ijk.x);
852
853}
+
854
+
856
857 if( leaf_area.size()!=gridresolution.z ){
@@ -957,7 +1058,9 @@
877 return leaf_area.at(ijk.z).at(ijk.y).at(ijk.x)/(gridsize.x*gridsize.y*gridsize.z);
878
879}
+
880
+
881void AerialLiDARcloud::setCellTransmissionProbability( const int P_denom, const int P_trans, const int3 ijk ){
882
883 if( ijk.x<0 || ijk.x>=gridresolution.x ){
@@ -986,7 +1089,9 @@
906 P_counts.at(ijk.z).at(ijk.y).at(ijk.x) = make_int2(P_denom,P_trans);
907
908}
+
909
+
910void AerialLiDARcloud::getCellTransmissionProbability( const int3 ijk, int& P_denom, int& P_trans ) const{
911
912 if( P_counts.size()!=gridresolution.z ){
@@ -1012,7 +1117,9 @@
932 P_trans = P_counts.at(ijk.z).at(ijk.y).at(ijk.x).y;
933
934}
+
935
+
936void AerialLiDARcloud::setCellRbar( const float rbar, const int3 ijk ){
937
938 if( ijk.x<0 || ijk.x>=gridresolution.x ){
@@ -1041,7 +1148,9 @@
961 r_bar.at(ijk.z).at(ijk.y).at(ijk.x) = rbar;
962
963}
+
964
+
965float AerialLiDARcloud::getCellRbar( const int3 ijk ) const{
966
967 if( r_bar.size()!=gridresolution.z ){
@@ -1065,6 +1174,7 @@
985 return r_bar.at(ijk.z).at(ijk.y).at(ijk.x);
986
987}
+
988
989helios::vec4 AerialLiDARcloud::RANSAC( const int maxIter, const float threshDist, const float inlierRatio, const std::vector<helios::vec3>& hits, std::vector<bool>& inliers ){
990
@@ -1119,7 +1229,7 @@
1039 }
1040
1041 //check if this model is better than the current 'best' model
-
1042 if( errsum/float(Ninlier)<bestError && float(Ninlier)/float(N)>inlierRatio ){
+
1042 if( errsum/float(Ninlier)<bestError && float(Ninlier)/float(N)>inlierRatio ){
1043
1044 //update the 'best' model
1045 bestModel = maybeModel;
@@ -1148,6 +1258,7 @@
1068
1069}
1070
+
1071void AerialLiDARcloud::generateHeightModel( const int maxIter, const float threshDist_ground, const float inlierRatio_ground, const float threshDist_vegetation, const float inlierRatio_vegetation ){
1072
1073 if( printmessages ){
@@ -1444,8 +1555,10 @@
1364 }
1365
1366}
+
1367
1368
+
1369void AerialLiDARcloud::setCellVegetationHeight( const float height, const int2 ij ){
1370
1371 if( ij.x<0 || ij.x>=gridresolution.x ){
@@ -1467,7 +1580,9 @@
1387 vegetation_height.at(ij.y).at(ij.x) = height;
1388
1389}
+
1390
+
1392
1393 if( vegetation_height.size()!=gridresolution.y ){
@@ -1487,7 +1602,9 @@
1407 return vegetation_height.at(ij.y).at(ij.x);
1408
1409}
+
1410
+
1411void AerialLiDARcloud::setCellMaximumHitHeight( const float height, const int2 ij ){
1412
1413 if( ij.x<0 || ij.x>=gridresolution.x ){
@@ -1509,7 +1626,9 @@
1429 maxhit_height.at(ij.y).at(ij.x) = height;
1430
1431}
+
1432
+
1434
1435 if( maxhit_height.size()!=gridresolution.y ){
@@ -1529,7 +1648,9 @@
1449 return maxhit_height.at(ij.y).at(ij.x);
1450
1451}
+
1452
+
1453void AerialLiDARcloud::setCellGroundHeight( const float height, const int2 ij ){
1454
1455 if( ij.x<0 || ij.x>=gridresolution.x ){
@@ -1551,7 +1672,9 @@
1471 ground_height.at(ij.y).at(ij.x) = height;
1472
1473}
+
1474
+
1476
1477 if( ground_height.size()!=gridresolution.y ){
@@ -1571,6 +1694,7 @@
1491 return ground_height.at(ij.y).at(ij.x);
1492
1493}
+
1494
1495void AerialLiDARcloud::calculateCoverFraction( void ){
1496
@@ -1624,6 +1748,7 @@
1544
1545}
1546
+
1547void AerialLiDARcloud::setCellCoverFraction( const float fcover, const int2 ij ){
1548
1549 if( ij.x<0 || ij.x>=gridresolution.x ){
@@ -1645,7 +1770,9 @@
1565 cover_fraction.at(ij.y).at(ij.x) = fcover;
1566
1567}
+
1568
+
1570
1571 if( cover_fraction.size()!=gridresolution.y ){
@@ -1665,6 +1792,7 @@
1585 return cover_fraction.at(ij.y).at(ij.x);
1586
1587}
+
1588
1589
1590
@@ -1688,6 +1816,7 @@
1608
1609}
1610
+
1612
1613 // ---- Hit Points ---- //
@@ -1732,119 +1861,121 @@
1652
1653
1654}
+
-
Primary class for aerial LiDAR scan.
Definition: AerialLiDAR.h:88
-
float getCellMaximumHitHeight(const helios::int2 ij) const
Get the height of the highest hit point at the (x,y) location of this gridcell.
-
float getScanDensity(const uint scanID) const
Get the scan point density in points/m^2.
-
void syntheticScan(helios::Context *context, const char *xml_file)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file.
Definition: AerialLiDAR.cu:625
-
float getScanConeAngle(const uint scanID) const
Get the scan cone angle in degrees.
-
void setCellRbar(const float r_bar, const helios::int3 ijk)
Set the average ray propagation distance in meters.
-
float getCellVegetationHeight(const helios::int2 ij) const
Get the height of the vegetation at the (x,y) location of this gridcell.
-
helios::vec3 getScanCenter(const uint scanID) const
Get the (x,y,z) of scan surface center.
-
float getHitData(const uint index, const char *label) const
Get floating point data value associated with a hit point.
-
helios::int3 getHitGridCell(const uint index) const
Get the grid cell in which the hit point resides.
-
void addScan(const AerialScanMetadata newscan)
Add a LiDAR scan to the point cloud.
-
void addHitsToVisualizer(Visualizer *visualizer, const uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
-
int selfTest(void)
Self-test (unit test) function.
Definition: AerialLiDAR.cpp:45
-
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
-
int gridijk2index(const helios::int3 ijk) const
Use a grid cell's local index in the x-, y-, and z-directions to retrieve the cells' global index (ra...
-
float getCellGroundHeight(const helios::int2 ij) const
Get the height of the ground at the (x,y) location of this gridcell.
-
float getScanBeamDivergence(const uint scanID) const
Divergence angle of the laser beam in radians.
-
void setCellCoverFraction(const float cover_fraction, const helios::int2 ij)
Set the ground cover fraction at the (x,y) location of this gridcell.
-
float getCellLeafAreaDensity(const helios::int3 ijk) const
Get the leaf area density of a grid cell in 1/m.
-
helios::vec3 getCellSize() const
Get the size of grid cells.
-
void calculateLeafAreaGPU(const float Gtheta)
Calculate the leaf area for each grid volume.
Definition: AerialLiDAR.cu:287
-
void setCellMaximumHitHeight(const float height, const helios::int2 ij)
Set the height of the highest hit point at the (x,y) location of this gridcell.
-
helios::vec3 getCellCenter(const helios::int3 ijk) const
Get the center of the (i,j,k)th grid cell.
-
void setCellTransmissionProbability(const int P_denom, const int P_trans, const helios::int3 ijk)
Set the cell transmission probability counts.
-
void addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
Specify a scan point as a hit by providing the (x,y,z) coordinates of the origin and hit point.
-
void getHitBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all hit points in the point cloud.
-
void setCellLeafArea(const float area, const helios::int3 ijk)
Set the leaf area of a grid cell in m^2.
-
void setCellGroundHeight(const float height, const helios::int2 ij)
Set the height of the ground at the (x,y) location of this gridcell.
-
helios::vec3 getGridExtent(void) const
Get the size of the global grid in the x-, y-, and z-directions.
-
void getCellTransmissionProbability(const helios::int3 ijk, int &P_denom, int &P_trans) const
Get the cell transmission probability counts.
-
bool doesHitDataExist(const uint index, const char *label) const
Check if scalar data exists for a hit point.
-
void deleteHitPoint(const uint index)
Delete a hit point in the scan.
-
float getCellLeafArea(const helios::int3 ijk) const
Get the leaf area of a grid cell in m^2.
-
int getHitScanID(const uint index) const
Get the scan with which a hit is associated.
-
float getGridRotation() const
Get the azimuthal rotation angle of the grid about its center point.
-
void disableMessages(void)
Disable all print messages to the screen except for fatal error messages.
-
uint getHitCount(void) const
Get the number of hit points in the point cloud.
-
uint getScanCount(void)
Get number of scans in point cloud.
-
void setHitData(const uint index, const char *label, const float value)
Set floating point data value associated with a hit point.
-
void calculateHitGridCell()
Determine the grid cell in which each hit point resides for the whole point cloud *‍/.
-
helios::SphericalCoord getHitRaydir(const uint index) const
Get ray direction of hit point in the scan based on its index.
-
float getCellCoverFraction(const helios::int2 ij) const
Get the height of the ground at the (x,y) location of this gridcell.
-
AerialLiDARcloud(void)
Aerial LiDAR point cloud constructor.
Definition: AerialLiDAR.cpp:33
-
~AerialLiDARcloud(void)
Aerial LiDAR point cloud destructor.
Definition: AerialLiDAR.cpp:41
-
helios::vec2 getScanExtent(const uint scanID) const
Get the (x,y) extent of scan surface.
-
helios::vec3 getGridCenter(void) const
Get the (x,y,z) coordinate of the grid center.
-
helios::int3 gridindex2ijk(const int index) const
Use a global index of a grid cell (ranging from 0 to Ncells-1) to retrieve the local index in the x-,...
-
float getCellRbar(const helios::int3 ijk) const
Get the average ray propagation distance in meters.
-
float getScanBeamExitDiameter(const uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
-
helios::int3 getGridResolution(void) const
Get the total number of cells in the grid.
-
void enableMessages(void)
Enable all print messages to the screen.
-
helios::RGBcolor getHitColor(const uint index) const
Get color of hit point.
-
void setCellVegetationHeight(const float height, const helios::int2 ij)
Set the height of the vegetation at the (x,y) location of this gridcell.
-
void setHitGridCell(const uint index, const helios::int3 ijk)
Set the grid cell in which the hit point resides.
-
void generateHeightModel(const int maxIter, const float threshDist_ground, const float inlierRatio_ground, const float threshDist_vegetation, const float inlierRatio_vegetation)
Determine the ground and vegetation height for each x-y grid cell. Inputs to this function are parame...
-
void addGridToVisualizer(Visualizer *visualizer) const
Add all grid cells to the visualizer plug-in.
-
Class for visualization of simulation results.
Definition: Visualizer.h:265
-
@ COORDINATES_CARTESIAN
Coordinates are specified in a 3D Cartesian system (right-handed), where +z is vertical.
Definition: Visualizer.h:316
-
void addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
Add a point by giving its coordinates and size.
-
void addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a voxel by giving the coordinates of its center.
-
Colormap getCurrentColormap() const
Get the current colormap used in Colorbar/visualization.
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
float randu()
Random number from a uniform distribution between 0 and 1.
Definition: global.cpp:223
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition: global.cpp:1084
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
Structure containing metadata for an aerial hit point.
Definition: AerialLiDAR.h:64
-
Structure containing metadata for an aerial scan.
Definition: AerialLiDAR.h:26
-
helios::vec2 extent
(x,y) size/extent of scan surface
Definition: AerialLiDAR.h:43
-
float coneangle
Width of scan cone in degrees.
Definition: AerialLiDAR.h:46
-
AerialScanMetadata(const helios::vec3 __center, const helios::vec2 __extent, const float __coneangle, const float __scandensity, const float __exitDiameter, const float __beamDivergence)
Create an aerial LiDAR scan data structure.
Definition: AerialLiDAR.cpp:21
-
float beamDivergence
Divergence angle of the laser beam in radians.
Definition: AerialLiDAR.h:59
-
helios::vec3 center
(x,y,z) position of scan surface center
Definition: AerialLiDAR.h:40
-
float exitDiameter
Diameter of laser pulse at exit from the scanner.
Definition: AerialLiDAR.h:53
-
float scandensity
Scan density in points/m^2.
Definition: AerialLiDAR.h:49
-
RGB color map.
Definition: Visualizer.h:165
-
R-G-B-A color vector.
-
R-G-B color vector.
-
Vector of spherical coordinates (elevation,azimuth)
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of three elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int y
Second element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
-
Vector of four elements of type 'float'.
-
float y
Second element in vector.
-
float w
Fourth element in vector.
-
float z
Third element in vector.
-
float x
First element in vector.
+
Primary class for aerial LiDAR scan.
Definition AerialLiDAR.h:88
+
float getCellMaximumHitHeight(const helios::int2 ij) const
Get the height of the highest hit point at the (x,y) location of this gridcell.
+
float getScanDensity(const uint scanID) const
Get the scan point density in points/m^2.
+
void syntheticScan(helios::Context *context, const char *xml_file)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file.
+
float getScanConeAngle(const uint scanID) const
Get the scan cone angle in degrees.
+
void setCellRbar(const float r_bar, const helios::int3 ijk)
Set the average ray propagation distance in meters.
+
float getCellVegetationHeight(const helios::int2 ij) const
Get the height of the vegetation at the (x,y) location of this gridcell.
+
helios::vec3 getScanCenter(const uint scanID) const
Get the (x,y,z) of scan surface center.
+
float getHitData(const uint index, const char *label) const
Get floating point data value associated with a hit point.
+
helios::int3 getHitGridCell(const uint index) const
Get the grid cell in which the hit point resides.
+
void addScan(const AerialScanMetadata newscan)
Add a LiDAR scan to the point cloud.
+
void addHitsToVisualizer(Visualizer *visualizer, const uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
+
int selfTest(void)
Self-test (unit test) function.
+
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
+
int gridijk2index(const helios::int3 ijk) const
Use a grid cell's local index in the x-, y-, and z-directions to retrieve the cells' global index (ra...
+
float getCellGroundHeight(const helios::int2 ij) const
Get the height of the ground at the (x,y) location of this gridcell.
+
float getScanBeamDivergence(const uint scanID) const
Divergence angle of the laser beam in radians.
+
void setCellCoverFraction(const float cover_fraction, const helios::int2 ij)
Set the ground cover fraction at the (x,y) location of this gridcell.
+
float getCellLeafAreaDensity(const helios::int3 ijk) const
Get the leaf area density of a grid cell in 1/m.
+
helios::vec3 getCellSize() const
Get the size of grid cells.
+
void calculateLeafAreaGPU(const float Gtheta)
Calculate the leaf area for each grid volume.
+
void setCellMaximumHitHeight(const float height, const helios::int2 ij)
Set the height of the highest hit point at the (x,y) location of this gridcell.
+
helios::vec3 getCellCenter(const helios::int3 ijk) const
Get the center of the (i,j,k)th grid cell.
+
void setCellTransmissionProbability(const int P_denom, const int P_trans, const helios::int3 ijk)
Set the cell transmission probability counts.
+
void addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
Specify a scan point as a hit by providing the (x,y,z) coordinates of the origin and hit point.
+
void getHitBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all hit points in the point cloud.
+
void setCellLeafArea(const float area, const helios::int3 ijk)
Set the leaf area of a grid cell in m^2.
+
void setCellGroundHeight(const float height, const helios::int2 ij)
Set the height of the ground at the (x,y) location of this gridcell.
+
helios::vec3 getGridExtent(void) const
Get the size of the global grid in the x-, y-, and z-directions.
+
void getCellTransmissionProbability(const helios::int3 ijk, int &P_denom, int &P_trans) const
Get the cell transmission probability counts.
+
bool doesHitDataExist(const uint index, const char *label) const
Check if scalar data exists for a hit point.
+
void deleteHitPoint(const uint index)
Delete a hit point in the scan.
+
float getCellLeafArea(const helios::int3 ijk) const
Get the leaf area of a grid cell in m^2.
+
int getHitScanID(const uint index) const
Get the scan with which a hit is associated.
+
float getGridRotation() const
Get the azimuthal rotation angle of the grid about its center point.
+
void disableMessages(void)
Disable all print messages to the screen except for fatal error messages.
+
uint getHitCount(void) const
Get the number of hit points in the point cloud.
+
uint getScanCount(void)
Get number of scans in point cloud.
+
void setHitData(const uint index, const char *label, const float value)
Set floating point data value associated with a hit point.
+
void calculateHitGridCell()
Determine the grid cell in which each hit point resides for the whole point cloud *‍/.
+
helios::SphericalCoord getHitRaydir(const uint index) const
Get ray direction of hit point in the scan based on its index.
+
float getCellCoverFraction(const helios::int2 ij) const
Get the height of the ground at the (x,y) location of this gridcell.
+
AerialLiDARcloud(void)
Aerial LiDAR point cloud constructor.
+
~AerialLiDARcloud(void)
Aerial LiDAR point cloud destructor.
+
helios::vec2 getScanExtent(const uint scanID) const
Get the (x,y) extent of scan surface.
+
helios::vec3 getGridCenter(void) const
Get the (x,y,z) coordinate of the grid center.
+
helios::int3 gridindex2ijk(const int index) const
Use a global index of a grid cell (ranging from 0 to Ncells-1) to retrieve the local index in the x-,...
+
float getCellRbar(const helios::int3 ijk) const
Get the average ray propagation distance in meters.
+
float getScanBeamExitDiameter(const uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
+
helios::int3 getGridResolution(void) const
Get the total number of cells in the grid.
+
void enableMessages(void)
Enable all print messages to the screen.
+
helios::RGBcolor getHitColor(const uint index) const
Get color of hit point.
+
void setCellVegetationHeight(const float height, const helios::int2 ij)
Set the height of the vegetation at the (x,y) location of this gridcell.
+
void setHitGridCell(const uint index, const helios::int3 ijk)
Set the grid cell in which the hit point resides.
+
void generateHeightModel(const int maxIter, const float threshDist_ground, const float inlierRatio_ground, const float threshDist_vegetation, const float inlierRatio_vegetation)
Determine the ground and vegetation height for each x-y grid cell. Inputs to this function are parame...
+
void addGridToVisualizer(Visualizer *visualizer) const
Add all grid cells to the visualizer plug-in.
+
Class for visualization of simulation results.
Definition Visualizer.h:275
+
@ COORDINATES_CARTESIAN
Coordinates are specified in a 3D Cartesian system (right-handed), where +z is vertical.
Definition Visualizer.h:326
+
void addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
Add a point by giving its coordinates and size.
+
void addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a voxel by giving the coordinates of its center.
+
Colormap getCurrentColormap() const
Get the current colormap used in Colorbar/visualization.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
float randu()
Random number from a uniform distribution between 0 and 1.
Definition global.cpp:223
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition global.cpp:1084
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
Structure containing metadata for an aerial hit point.
Definition AerialLiDAR.h:64
+
Structure containing metadata for an aerial scan.
Definition AerialLiDAR.h:26
+
helios::vec2 extent
(x,y) size/extent of scan surface
Definition AerialLiDAR.h:43
+
float coneangle
Width of scan cone in degrees.
Definition AerialLiDAR.h:46
+
AerialScanMetadata(const helios::vec3 __center, const helios::vec2 __extent, const float __coneangle, const float __scandensity, const float __exitDiameter, const float __beamDivergence)
Create an aerial LiDAR scan data structure.
+
float beamDivergence
Divergence angle of the laser beam in radians.
Definition AerialLiDAR.h:59
+
helios::vec3 center
(x,y,z) position of scan surface center
Definition AerialLiDAR.h:40
+
float exitDiameter
Diameter of laser pulse at exit from the scanner.
Definition AerialLiDAR.h:53
+
float scandensity
Scan density in points/m^2.
Definition AerialLiDAR.h:49
+
RGB color map.
Definition Visualizer.h:175
+
R-G-B-A color vector.
+
R-G-B color vector.
+
Vector of spherical coordinates (elevation,azimuth)
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of three elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int y
Second element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+
Vector of four elements of type 'float'.
+
float y
Second element in vector.
+
float w
Fourth element in vector.
+
float z
Third element in vector.
+
float x
First element in vector.
+ diff --git a/doc/html/_aerial_li_d_a_r_8cu.html b/doc/html/_aerial_li_d_a_r_8cu.html index bbbde1d55..7890275be 100644 --- a/doc/html/_aerial_li_d_a_r_8cu.html +++ b/doc/html/_aerial_li_d_a_r_8cu.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
AerialLiDAR.cu File Reference
@@ -106,7 +118,8 @@
+ diff --git a/doc/html/_aerial_li_d_a_r_8cu_source.html b/doc/html/_aerial_li_d_a_r_8cu_source.html index 27892ab12..3311997b7 100644 --- a/doc/html/_aerial_li_d_a_r_8cu_source.html +++ b/doc/html/_aerial_li_d_a_r_8cu_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
AerialLiDAR.cu
@@ -364,10 +376,13 @@
284 return v0.at(1)<v1.at(1);
285}
286
+
287void AerialLiDARcloud::calculateLeafAreaGPU( const float Gtheta ){
288 calculateLeafAreaGPU( Gtheta, 1 );
289}
+
290
+
291void AerialLiDARcloud::calculateLeafAreaGPU( const float Gtheta, const int minVoxelHits ){
292
293 if( printmessages ){
@@ -701,11 +716,15 @@
621 }
622
623}
+
624
+
625void AerialLiDARcloud::syntheticScan( helios::Context* context, const char* xml_file ){
626 syntheticScan( context, xml_file, 1, 0 );
627}
+
628
+
629void AerialLiDARcloud::syntheticScan( helios::Context* context, const char* xml_file, const int rays_per_pulse, const float pulse_distance_threshold ){
630
631 int Npulse;
@@ -1215,7 +1234,9 @@
1135 }
1136
1137}
+
1138
+
1140
1141 // float3* d_prim_xyz;
@@ -1326,6 +1347,7 @@
1246 // CUDA_CHECK_ERROR( cudaFree(d_grid_rotation) );
1247
1248}
+
1249
1250__global__ void AERIALLIDAR_CUDA::intersectBoundingBox( const size_t scanSize, float3* d_hit_origin, const float3* d_scan_xyz, const float3 bbcenter, const float3 bbsize, uint* d_boundingbox_hit ){
1251
@@ -1723,73 +1745,74 @@
1643
1644}
-
__device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
-
Primary class for aerial LiDAR scan.
Definition: AerialLiDAR.h:88
-
float getScanDensity(const uint scanID) const
Get the scan point density in points/m^2.
-
void syntheticScan(helios::Context *context, const char *xml_file)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file.
Definition: AerialLiDAR.cu:625
-
float getScanConeAngle(const uint scanID) const
Get the scan cone angle in degrees.
-
void setCellRbar(const float r_bar, const helios::int3 ijk)
Set the average ray propagation distance in meters.
-
helios::vec3 getScanCenter(const uint scanID) const
Get the (x,y,z) of scan surface center.
-
float getHitData(const uint index, const char *label) const
Get floating point data value associated with a hit point.
-
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
-
float getScanBeamDivergence(const uint scanID) const
Divergence angle of the laser beam in radians.
-
helios::vec3 getCellSize() const
Get the size of grid cells.
-
void calculateLeafAreaGPU(const float Gtheta)
Calculate the leaf area for each grid volume.
Definition: AerialLiDAR.cu:287
-
helios::vec3 getCellCenter(const helios::int3 ijk) const
Get the center of the (i,j,k)th grid cell.
-
void setCellTransmissionProbability(const int P_denom, const int P_trans, const helios::int3 ijk)
Set the cell transmission probability counts.
-
void addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
Specify a scan point as a hit by providing the (x,y,z) coordinates of the origin and hit point.
-
void setCellLeafArea(const float area, const helios::int3 ijk)
Set the leaf area of a grid cell in m^2.
-
bool doesHitDataExist(const uint index, const char *label) const
Check if scalar data exists for a hit point.
-
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition: fileIO.cpp:22
-
int getHitScanID(const uint index) const
Get the scan with which a hit is associated.
-
float getGridRotation() const
Get the azimuthal rotation angle of the grid about its center point.
-
void disableMessages(void)
Disable all print messages to the screen except for fatal error messages.
-
uint getHitCount(void) const
Get the number of hit points in the point cloud.
-
uint getScanCount(void)
Get number of scans in point cloud.
-
void calculateSyntheticLeafArea(helios::Context *context)
Calculate the surface area of all primitives in the context.
-
void calculateHitGridCell()
Determine the grid cell in which each hit point resides for the whole point cloud *‍/.
-
helios::SphericalCoord getHitRaydir(const uint index) const
Get ray direction of hit point in the scan based on its index.
-
helios::vec2 getScanExtent(const uint scanID) const
Get the (x,y) extent of scan surface.
-
helios::vec3 getGridCenter(void) const
Get the (x,y,z) coordinate of the grid center.
-
helios::int3 gridindex2ijk(const int index) const
Use a global index of a grid cell (ranging from 0 to Ncells-1) to retrieve the local index in the x-,...
-
float getScanBeamExitDiameter(const uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
-
helios::int3 getGridResolution(void) const
Get the total number of cells in the grid.
-
void enableMessages(void)
Enable all print messages to the screen.
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition: Context.cpp:7159
-
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition: Context.cpp:7175
-
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition: Context.cpp:7179
-
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition: Context.cpp:6984
-
helios::int2 getPrimitiveTextureSize(uint UUID) const
Get the size (number of pixels) of primitive texture map image.
Definition: Context.cpp:7167
-
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition: Context.cpp:2046
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition: Context.cpp:7187
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
float atan2_2pi(float y, float x)
Four quadrant arc tangent between 0 and 2*pi.
Definition: global.cpp:584
-
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition: global.cpp:617
-
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:241
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of three elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int y
Second element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
+
__device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
+
Primary class for aerial LiDAR scan.
Definition AerialLiDAR.h:88
+
float getScanDensity(const uint scanID) const
Get the scan point density in points/m^2.
+
void syntheticScan(helios::Context *context, const char *xml_file)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file.
+
float getScanConeAngle(const uint scanID) const
Get the scan cone angle in degrees.
+
void setCellRbar(const float r_bar, const helios::int3 ijk)
Set the average ray propagation distance in meters.
+
helios::vec3 getScanCenter(const uint scanID) const
Get the (x,y,z) of scan surface center.
+
float getHitData(const uint index, const char *label) const
Get floating point data value associated with a hit point.
+
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
+
float getScanBeamDivergence(const uint scanID) const
Divergence angle of the laser beam in radians.
+
helios::vec3 getCellSize() const
Get the size of grid cells.
+
void calculateLeafAreaGPU(const float Gtheta)
Calculate the leaf area for each grid volume.
+
helios::vec3 getCellCenter(const helios::int3 ijk) const
Get the center of the (i,j,k)th grid cell.
+
void setCellTransmissionProbability(const int P_denom, const int P_trans, const helios::int3 ijk)
Set the cell transmission probability counts.
+
void addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
Specify a scan point as a hit by providing the (x,y,z) coordinates of the origin and hit point.
+
void setCellLeafArea(const float area, const helios::int3 ijk)
Set the leaf area of a grid cell in m^2.
+
bool doesHitDataExist(const uint index, const char *label) const
Check if scalar data exists for a hit point.
+
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition fileIO.cpp:22
+
int getHitScanID(const uint index) const
Get the scan with which a hit is associated.
+
float getGridRotation() const
Get the azimuthal rotation angle of the grid about its center point.
+
void disableMessages(void)
Disable all print messages to the screen except for fatal error messages.
+
uint getHitCount(void) const
Get the number of hit points in the point cloud.
+
uint getScanCount(void)
Get number of scans in point cloud.
+
void calculateSyntheticLeafArea(helios::Context *context)
Calculate the surface area of all primitives in the context.
+
void calculateHitGridCell()
Determine the grid cell in which each hit point resides for the whole point cloud *‍/.
+
helios::SphericalCoord getHitRaydir(const uint index) const
Get ray direction of hit point in the scan based on its index.
+
helios::vec2 getScanExtent(const uint scanID) const
Get the (x,y) extent of scan surface.
+
helios::vec3 getGridCenter(void) const
Get the (x,y,z) coordinate of the grid center.
+
helios::int3 gridindex2ijk(const int index) const
Use a global index of a grid cell (ranging from 0 to Ncells-1) to retrieve the local index in the x-,...
+
float getScanBeamExitDiameter(const uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
+
helios::int3 getGridResolution(void) const
Get the total number of cells in the grid.
+
void enableMessages(void)
Enable all print messages to the screen.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition Context.cpp:7159
+
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition Context.cpp:7175
+
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition Context.cpp:7179
+
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition Context.cpp:6984
+
helios::int2 getPrimitiveTextureSize(uint UUID) const
Get the size (number of pixels) of primitive texture map image.
Definition Context.cpp:7167
+
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition Context.cpp:2046
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition Context.cpp:7187
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
float atan2_2pi(float y, float x)
Four quadrant arc tangent between 0 and 2*pi.
Definition global.cpp:584
+
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition global.cpp:617
+
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:241
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of three elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int y
Second element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+ diff --git a/doc/html/_aerial_li_d_a_r_8h.html b/doc/html/_aerial_li_d_a_r_8h.html index 1c97801e5..6356b35cf 100644 --- a/doc/html/_aerial_li_d_a_r_8h.html +++ b/doc/html/_aerial_li_d_a_r_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -121,7 +133,8 @@
+ diff --git a/doc/html/_aerial_li_d_a_r_8h_source.html b/doc/html/_aerial_li_d_a_r_8h_source.html index b122d44a8..f191c169e 100644 --- a/doc/html/_aerial_li_d_a_r_8h_source.html +++ b/doc/html/_aerial_li_d_a_r_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
AerialLiDAR.h
@@ -100,10 +112,11 @@
21#include "Visualizer.h"
22
24
+
27
29
-
34 AerialScanMetadata( const helios::vec3 __center, const helios::vec2 __extent, const float __coneangle, const float __scandensity, const float __exitDiameter, const float __beamDivergence );
+
34 AerialScanMetadata( const helios::vec3 __center, const helios::vec2 __extent, const float __coneangle, const float __scandensity, const float __exitDiameter, const float __beamDivergence );
35
37 std::size_t Nrays;
38
@@ -122,7 +135,9 @@
60
61};
+
62
+
65 helios::vec3 position;
66 helios::SphericalCoord direction;
@@ -145,7 +160,9 @@
83 data = __data;
84 }
85};
+
86
+
89 private:
90
@@ -403,96 +420,99 @@
585 float getCellCoverFraction( const helios::int2 ij ) const;
586
587};
+
588
589
590#endif
-
Primary class for aerial LiDAR scan.
Definition: AerialLiDAR.h:88
-
float getCellMaximumHitHeight(const helios::int2 ij) const
Get the height of the highest hit point at the (x,y) location of this gridcell.
-
float getScanDensity(const uint scanID) const
Get the scan point density in points/m^2.
-
void syntheticScan(helios::Context *context, const char *xml_file)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file.
Definition: AerialLiDAR.cu:625
-
float getScanConeAngle(const uint scanID) const
Get the scan cone angle in degrees.
-
void setCellRbar(const float r_bar, const helios::int3 ijk)
Set the average ray propagation distance in meters.
-
float getCellVegetationHeight(const helios::int2 ij) const
Get the height of the vegetation at the (x,y) location of this gridcell.
+
Primary class for aerial LiDAR scan.
Definition AerialLiDAR.h:88
+
float getCellMaximumHitHeight(const helios::int2 ij) const
Get the height of the highest hit point at the (x,y) location of this gridcell.
+
float getScanDensity(const uint scanID) const
Get the scan point density in points/m^2.
+
void syntheticScan(helios::Context *context, const char *xml_file)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file.
+
float getScanConeAngle(const uint scanID) const
Get the scan cone angle in degrees.
+
void setCellRbar(const float r_bar, const helios::int3 ijk)
Set the average ray propagation distance in meters.
+
float getCellVegetationHeight(const helios::int2 ij) const
Get the height of the vegetation at the (x,y) location of this gridcell.
void readContextXML(void)
Read all XML files currently loaded into the Helios context.
-
helios::vec3 getScanCenter(const uint scanID) const
Get the (x,y,z) of scan surface center.
-
float getHitData(const uint index, const char *label) const
Get floating point data value associated with a hit point.
-
helios::int3 getHitGridCell(const uint index) const
Get the grid cell in which the hit point resides.
-
void addScan(const AerialScanMetadata newscan)
Add a LiDAR scan to the point cloud.
-
void addHitsToVisualizer(Visualizer *visualizer, const uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
-
int selfTest(void)
Self-test (unit test) function.
Definition: AerialLiDAR.cpp:45
-
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
-
int gridijk2index(const helios::int3 ijk) const
Use a grid cell's local index in the x-, y-, and z-directions to retrieve the cells' global index (ra...
-
float getCellGroundHeight(const helios::int2 ij) const
Get the height of the ground at the (x,y) location of this gridcell.
-
float getScanBeamDivergence(const uint scanID) const
Divergence angle of the laser beam in radians.
-
void setCellCoverFraction(const float cover_fraction, const helios::int2 ij)
Set the ground cover fraction at the (x,y) location of this gridcell.
-
float getCellLeafAreaDensity(const helios::int3 ijk) const
Get the leaf area density of a grid cell in 1/m.
+
helios::vec3 getScanCenter(const uint scanID) const
Get the (x,y,z) of scan surface center.
+
float getHitData(const uint index, const char *label) const
Get floating point data value associated with a hit point.
+
helios::int3 getHitGridCell(const uint index) const
Get the grid cell in which the hit point resides.
+
void addScan(const AerialScanMetadata newscan)
Add a LiDAR scan to the point cloud.
+
void addHitsToVisualizer(Visualizer *visualizer, const uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
+
int selfTest(void)
Self-test (unit test) function.
+
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
+
int gridijk2index(const helios::int3 ijk) const
Use a grid cell's local index in the x-, y-, and z-directions to retrieve the cells' global index (ra...
+
float getCellGroundHeight(const helios::int2 ij) const
Get the height of the ground at the (x,y) location of this gridcell.
+
float getScanBeamDivergence(const uint scanID) const
Divergence angle of the laser beam in radians.
+
void setCellCoverFraction(const float cover_fraction, const helios::int2 ij)
Set the ground cover fraction at the (x,y) location of this gridcell.
+
float getCellLeafAreaDensity(const helios::int3 ijk) const
Get the leaf area density of a grid cell in 1/m.
void scalarFilter(const char *scalar_field, const float threshold, const char *comparator)
Filter hit points based on a scalar field given by a column in the ASCII data.
-
helios::vec3 getCellSize() const
Get the size of grid cells.
-
void calculateLeafAreaGPU(const float Gtheta)
Calculate the leaf area for each grid volume.
Definition: AerialLiDAR.cu:287
-
void setCellMaximumHitHeight(const float height, const helios::int2 ij)
Set the height of the highest hit point at the (x,y) location of this gridcell.
-
helios::vec3 getCellCenter(const helios::int3 ijk) const
Get the center of the (i,j,k)th grid cell.
-
void setCellTransmissionProbability(const int P_denom, const int P_trans, const helios::int3 ijk)
Set the cell transmission probability counts.
-
void addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
Specify a scan point as a hit by providing the (x,y,z) coordinates of the origin and hit point.
-
void getHitBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all hit points in the point cloud.
-
void setCellLeafArea(const float area, const helios::int3 ijk)
Set the leaf area of a grid cell in m^2.
-
void setCellGroundHeight(const float height, const helios::int2 ij)
Set the height of the ground at the (x,y) location of this gridcell.
+
helios::vec3 getCellSize() const
Get the size of grid cells.
+
void calculateLeafAreaGPU(const float Gtheta)
Calculate the leaf area for each grid volume.
+
void setCellMaximumHitHeight(const float height, const helios::int2 ij)
Set the height of the highest hit point at the (x,y) location of this gridcell.
+
helios::vec3 getCellCenter(const helios::int3 ijk) const
Get the center of the (i,j,k)th grid cell.
+
void setCellTransmissionProbability(const int P_denom, const int P_trans, const helios::int3 ijk)
Set the cell transmission probability counts.
+
void addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
Specify a scan point as a hit by providing the (x,y,z) coordinates of the origin and hit point.
+
void getHitBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all hit points in the point cloud.
+
void setCellLeafArea(const float area, const helios::int3 ijk)
Set the leaf area of a grid cell in m^2.
+
void setCellGroundHeight(const float height, const helios::int2 ij)
Set the height of the ground at the (x,y) location of this gridcell.
void exportPointCloud(const char *filename)
Export to file all points in the point cloud.
-
helios::vec3 getGridExtent(void) const
Get the size of the global grid in the x-, y-, and z-directions.
-
void getCellTransmissionProbability(const helios::int3 ijk, int &P_denom, int &P_trans) const
Get the cell transmission probability counts.
-
bool doesHitDataExist(const uint index, const char *label) const
Check if scalar data exists for a hit point.
-
void deleteHitPoint(const uint index)
Delete a hit point in the scan.
-
float getCellLeafArea(const helios::int3 ijk) const
Get the leaf area of a grid cell in m^2.
-
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition: fileIO.cpp:22
-
int getHitScanID(const uint index) const
Get the scan with which a hit is associated.
-
float getGridRotation() const
Get the azimuthal rotation angle of the grid about its center point.
-
void disableMessages(void)
Disable all print messages to the screen except for fatal error messages.
-
uint getHitCount(void) const
Get the number of hit points in the point cloud.
-
uint getScanCount(void)
Get number of scans in point cloud.
-
void calculateSyntheticLeafArea(helios::Context *context)
Calculate the surface area of all primitives in the context.
-
void setHitData(const uint index, const char *label, const float value)
Set floating point data value associated with a hit point.
-
void calculateHitGridCell()
Determine the grid cell in which each hit point resides for the whole point cloud *‍/.
-
helios::SphericalCoord getHitRaydir(const uint index) const
Get ray direction of hit point in the scan based on its index.
-
float getCellCoverFraction(const helios::int2 ij) const
Get the height of the ground at the (x,y) location of this gridcell.
-
AerialLiDARcloud(void)
Aerial LiDAR point cloud constructor.
Definition: AerialLiDAR.cpp:33
+
helios::vec3 getGridExtent(void) const
Get the size of the global grid in the x-, y-, and z-directions.
+
void getCellTransmissionProbability(const helios::int3 ijk, int &P_denom, int &P_trans) const
Get the cell transmission probability counts.
+
bool doesHitDataExist(const uint index, const char *label) const
Check if scalar data exists for a hit point.
+
void deleteHitPoint(const uint index)
Delete a hit point in the scan.
+
float getCellLeafArea(const helios::int3 ijk) const
Get the leaf area of a grid cell in m^2.
+
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition fileIO.cpp:22
+
int getHitScanID(const uint index) const
Get the scan with which a hit is associated.
+
float getGridRotation() const
Get the azimuthal rotation angle of the grid about its center point.
+
void disableMessages(void)
Disable all print messages to the screen except for fatal error messages.
+
uint getHitCount(void) const
Get the number of hit points in the point cloud.
+
uint getScanCount(void)
Get number of scans in point cloud.
+
void calculateSyntheticLeafArea(helios::Context *context)
Calculate the surface area of all primitives in the context.
+
void setHitData(const uint index, const char *label, const float value)
Set floating point data value associated with a hit point.
+
void calculateHitGridCell()
Determine the grid cell in which each hit point resides for the whole point cloud *‍/.
+
helios::SphericalCoord getHitRaydir(const uint index) const
Get ray direction of hit point in the scan based on its index.
+
float getCellCoverFraction(const helios::int2 ij) const
Get the height of the ground at the (x,y) location of this gridcell.
+
AerialLiDARcloud(void)
Aerial LiDAR point cloud constructor.
void distanceFilter(const float maxdistance)
Filter scan by imposing a maximum distance from the scanner.
-
~AerialLiDARcloud(void)
Aerial LiDAR point cloud destructor.
Definition: AerialLiDAR.cpp:41
-
helios::vec2 getScanExtent(const uint scanID) const
Get the (x,y) extent of scan surface.
-
helios::vec3 getGridCenter(void) const
Get the (x,y,z) coordinate of the grid center.
+
~AerialLiDARcloud(void)
Aerial LiDAR point cloud destructor.
+
helios::vec2 getScanExtent(const uint scanID) const
Get the (x,y) extent of scan surface.
+
helios::vec3 getGridCenter(void) const
Get the (x,y,z) coordinate of the grid center.
void reflectanceFilter(const float minreflectance)
Filter scan by imposing a minimum reflectance value.
-
helios::int3 gridindex2ijk(const int index) const
Use a global index of a grid cell (ranging from 0 to Ncells-1) to retrieve the local index in the x-,...
-
float getCellRbar(const helios::int3 ijk) const
Get the average ray propagation distance in meters.
-
float getScanBeamExitDiameter(const uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
-
helios::int3 getGridResolution(void) const
Get the total number of cells in the grid.
-
void enableMessages(void)
Enable all print messages to the screen.
-
helios::RGBcolor getHitColor(const uint index) const
Get color of hit point.
-
void setCellVegetationHeight(const float height, const helios::int2 ij)
Set the height of the vegetation at the (x,y) location of this gridcell.
-
void setHitGridCell(const uint index, const helios::int3 ijk)
Set the grid cell in which the hit point resides.
-
void generateHeightModel(const int maxIter, const float threshDist_ground, const float inlierRatio_ground, const float threshDist_vegetation, const float inlierRatio_vegetation)
Determine the ground and vegetation height for each x-y grid cell. Inputs to this function are parame...
-
void addGridToVisualizer(Visualizer *visualizer) const
Add all grid cells to the visualizer plug-in.
-
Class for visualization of simulation results.
Definition: Visualizer.h:265
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
Structure containing metadata for an aerial hit point.
Definition: AerialLiDAR.h:64
-
Structure containing metadata for an aerial scan.
Definition: AerialLiDAR.h:26
-
std::size_t Nrays
Number of laser pulses in scan.
Definition: AerialLiDAR.h:37
-
helios::vec2 extent
(x,y) size/extent of scan surface
Definition: AerialLiDAR.h:43
-
float coneangle
Width of scan cone in degrees.
Definition: AerialLiDAR.h:46
-
float beamDivergence
Divergence angle of the laser beam in radians.
Definition: AerialLiDAR.h:59
-
helios::vec3 center
(x,y,z) position of scan surface center
Definition: AerialLiDAR.h:40
-
float exitDiameter
Diameter of laser pulse at exit from the scanner.
Definition: AerialLiDAR.h:53
-
float scandensity
Scan density in points/m^2.
Definition: AerialLiDAR.h:49
-
R-G-B color vector.
-
Vector of spherical coordinates (elevation,azimuth)
-
Vector of two elements of type 'int'.
-
Vector of three elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
-
Vector of four elements of type 'float'.
+
helios::int3 gridindex2ijk(const int index) const
Use a global index of a grid cell (ranging from 0 to Ncells-1) to retrieve the local index in the x-,...
+
float getCellRbar(const helios::int3 ijk) const
Get the average ray propagation distance in meters.
+
float getScanBeamExitDiameter(const uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
+
helios::int3 getGridResolution(void) const
Get the total number of cells in the grid.
+
void enableMessages(void)
Enable all print messages to the screen.
+
helios::RGBcolor getHitColor(const uint index) const
Get color of hit point.
+
void setCellVegetationHeight(const float height, const helios::int2 ij)
Set the height of the vegetation at the (x,y) location of this gridcell.
+
void setHitGridCell(const uint index, const helios::int3 ijk)
Set the grid cell in which the hit point resides.
+
void generateHeightModel(const int maxIter, const float threshDist_ground, const float inlierRatio_ground, const float threshDist_vegetation, const float inlierRatio_vegetation)
Determine the ground and vegetation height for each x-y grid cell. Inputs to this function are parame...
+
void addGridToVisualizer(Visualizer *visualizer) const
Add all grid cells to the visualizer plug-in.
+
Class for visualization of simulation results.
Definition Visualizer.h:275
+
Stores the state associated with simulation.
Definition Context.h:1882
+
Structure containing metadata for an aerial hit point.
Definition AerialLiDAR.h:64
+
Structure containing metadata for an aerial scan.
Definition AerialLiDAR.h:26
+
std::size_t Nrays
Number of laser pulses in scan.
Definition AerialLiDAR.h:37
+
helios::vec2 extent
(x,y) size/extent of scan surface
Definition AerialLiDAR.h:43
+
float coneangle
Width of scan cone in degrees.
Definition AerialLiDAR.h:46
+
AerialScanMetadata(const helios::vec3 __center, const helios::vec2 __extent, const float __coneangle, const float __scandensity, const float __exitDiameter, const float __beamDivergence)
Create an aerial LiDAR scan data structure.
+
float beamDivergence
Divergence angle of the laser beam in radians.
Definition AerialLiDAR.h:59
+
helios::vec3 center
(x,y,z) position of scan surface center
Definition AerialLiDAR.h:40
+
float exitDiameter
Diameter of laser pulse at exit from the scanner.
Definition AerialLiDAR.h:53
+
float scandensity
Scan density in points/m^2.
Definition AerialLiDAR.h:49
+
R-G-B color vector.
+
Vector of spherical coordinates (elevation,azimuth)
+
Vector of two elements of type 'int'.
+
Vector of three elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+
Vector of four elements of type 'float'.
+ diff --git a/doc/html/_aerial_li_d_a_r_doc.html b/doc/html/_aerial_li_d_a_r_doc.html index 54b927f67..57218f947 100644 --- a/doc/html/_aerial_li_d_a_r_doc.html +++ b/doc/html/_aerial_li_d_a_r_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
-
Aerial LiDAR Point Cloud Plugin Documentation
+
Aerial LiDAR Point Cloud Plugin Documentation
+
diff --git a/doc/html/_assets_8cpp.html b/doc/html/_assets_8cpp.html index e9979f9b6..af59c576b 100644 --- a/doc/html/_assets_8cpp.html +++ b/doc/html/_assets_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -100,131 +112,131 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Functions

uint GenericLeafPrototype (helios::Context *context_ptr, LeafPrototype *prototype_parameters, int compound_leaf_index)
uint GenericLeafPrototype (helios::Context *context_ptr, LeafPrototype *prototype_parameters, int compound_leaf_index)
 
uint AlmondFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint AlmondFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint AlmondFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint AlmondFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
void AlmondPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void AlmondPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
void AlmondPhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
void AlmondPhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
 
uint AppleFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint AppleFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint AppleFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint AppleFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
void ApplePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void ApplePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
void ApplePhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
void ApplePhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
 
uint AsparagusLeafPrototype (helios::Context *context_ptr, LeafPrototype *prototype_parameters, int compound_leaf_index)
uint AsparagusLeafPrototype (helios::Context *context_ptr, LeafPrototype *prototype_parameters, int compound_leaf_index)
 
void AsparagusPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void AsparagusPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
uint BeanLeafPrototype_unifoliate_OBJ (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
uint BeanLeafPrototype_unifoliate_OBJ (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
 
uint BeanLeafPrototype_trifoliate_OBJ (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
uint BeanLeafPrototype_trifoliate_OBJ (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
 
uint BeanFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint BeanFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint BeanFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint BeanFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
void BeanPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void BeanPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
uint BindweedFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint BindweedFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
uint CheeseweedLeafPrototype (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
uint CheeseweedLeafPrototype (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
 
uint CowpeaLeafPrototype_unifoliate_OBJ (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
uint CowpeaLeafPrototype_unifoliate_OBJ (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
 
uint CowpeaLeafPrototype_trifoliate_OBJ (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
uint CowpeaLeafPrototype_trifoliate_OBJ (helios::Context *context_ptr, uint subdivisions, int compound_leaf_index)
 
uint CowpeaFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint CowpeaFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint CowpeaFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint CowpeaFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
void CowpeaPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void CowpeaPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
float random_float (float min, float max)
float random_float (float min, float max)
 
bool spheres_overlap (const helios::vec3 &center1, float radius1, const helios::vec3 &center2, float radius2)
bool spheres_overlap (const helios::vec3 &center1, float radius1, const helios::vec3 &center2, float radius2)
 
uint GrapevineFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint GrapevineFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
void GrapevinePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void GrapevinePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
uint MaizeTasselPrototype (helios::Context *context_ptr, uint subdivisions)
uint MaizeTasselPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint MaizeEarPrototype (helios::Context *context_ptr, uint subdivisions)
uint MaizeEarPrototype (helios::Context *context_ptr, uint subdivisions)
 
void MaizePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void MaizePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
uint OliveLeafPrototype (helios::Context *context_ptr, LeafPrototype *prototype_parameters, int compound_leaf_index)
uint OliveLeafPrototype (helios::Context *context_ptr, LeafPrototype *prototype_parameters, int compound_leaf_index)
 
uint OliveFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint OliveFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint OliveFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint OliveFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
void OlivePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void OlivePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
void OlivePhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
void OlivePhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
 
uint PistachioFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint PistachioFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint PistachioFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint PistachioFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
void PistachioPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void PistachioPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
void PistachioPhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
void PistachioPhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
 
uint PuncturevineFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint PuncturevineFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
uint RedbudFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint RedbudFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
uint RedbudFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint RedbudFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
void RedbudPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void RedbudPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
void RedbudPhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
void RedbudPhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
 
uint RiceSpikePrototype (helios::Context *context_ptr, uint subdivisions)
uint RiceSpikePrototype (helios::Context *context_ptr, uint subdivisions)
 
void RicePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void RicePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
void ButterLettucePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void ButterLettucePhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
uint SorghumPaniclePrototype (helios::Context *context_ptr, uint subdivisions)
uint SorghumPaniclePrototype (helios::Context *context_ptr, uint subdivisions)
 
void SorghumPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void SorghumPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
uint SoybeanFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint SoybeanFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint SoybeanFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint SoybeanFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
void SoybeanPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void SoybeanPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
uint StrawberryFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint StrawberryFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
uint StrawberryFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint StrawberryFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint TomatoFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint TomatoFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint TomatoFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint TomatoFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
void TomatoPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void TomatoPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
uint WalnutFruitPrototype (helios::Context *context_ptr, uint subdivisions)
uint WalnutFruitPrototype (helios::Context *context_ptr, uint subdivisions)
 
uint WalnutFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
uint WalnutFlowerPrototype (helios::Context *context_ptr, uint subdivisions, bool flower_is_open)
 
void WalnutPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void WalnutPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 
void WalnutPhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
void WalnutPhytomerCallbackFunction (std::shared_ptr< Phytomer > phytomer)
 
uint WheatSpikePrototype (helios::Context *context_ptr, uint subdivisions)
uint WheatSpikePrototype (helios::Context *context_ptr, uint subdivisions)
 
void WheatPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
void WheatPhytomerCreationFunction (std::shared_ptr< Phytomer > phytomer, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
 

Detailed Description

@@ -244,25 +256,17 @@

uint AlmondFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -280,19 +284,12 @@

uint AlmondFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -310,8 +307,7 @@

void AlmondPhytomerCallbackFunction ( - std::shared_ptr< Phytomer >  - phytomer) + std::shared_ptr< Phytomer > phytomer) @@ -330,37 +326,27 @@

void AlmondPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -378,25 +364,17 @@

uint AppleFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -414,19 +392,12 @@

uint AppleFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -444,8 +415,7 @@

void ApplePhytomerCallbackFunction ( - std::shared_ptr< Phytomer >  - phytomer) + std::shared_ptr< Phytomer > phytomer) @@ -464,37 +434,27 @@

void ApplePhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -512,25 +472,17 @@

uint AsparagusLeafPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - LeafPrototype *  - prototype_parameters, + LeafPrototype * prototype_parameters, - int  - compound_leaf_index  - - - - ) - + int compound_leaf_index )

@@ -548,37 +500,27 @@

void AsparagusPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -596,25 +538,17 @@

uint BeanFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -632,19 +566,12 @@

uint BeanFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -662,25 +589,17 @@

uint BeanLeafPrototype_trifoliate_OBJ ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - int  - compound_leaf_index  - - - - ) - + int compound_leaf_index )

@@ -698,25 +617,17 @@

uint BeanLeafPrototype_unifoliate_OBJ ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - int  - compound_leaf_index  - - - - ) - + int compound_leaf_index )

@@ -734,37 +645,27 @@

void BeanPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -782,25 +683,17 @@

uint BindweedFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -818,37 +711,27 @@

void ButterLettucePhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -866,25 +749,17 @@

uint CheeseweedLeafPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - int  - compound_leaf_index  - - - - ) - + int compound_leaf_index )

@@ -902,25 +777,17 @@

uint CowpeaFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -938,19 +805,12 @@

uint CowpeaFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -968,25 +828,17 @@

uint CowpeaLeafPrototype_trifoliate_OBJ ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - int  - compound_leaf_index  - - - - ) - + int compound_leaf_index )

@@ -1004,25 +856,17 @@

uint CowpeaLeafPrototype_unifoliate_OBJ ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - int  - compound_leaf_index  - - - - ) - + int compound_leaf_index )

@@ -1040,37 +884,27 @@

void CowpeaPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -1088,25 +922,17 @@

uint GenericLeafPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - LeafPrototype *  - prototype_parameters, + LeafPrototype * prototype_parameters, - int  - compound_leaf_index  - - - - ) - + int compound_leaf_index )

@@ -1124,19 +950,12 @@

uint GrapevineFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -1154,37 +973,27 @@

void GrapevinePhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -1202,19 +1011,12 @@

uint MaizeEarPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -1232,37 +1034,27 @@

void MaizePhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -1280,19 +1072,12 @@

uint MaizeTasselPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -1310,25 +1095,17 @@

uint OliveFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -1346,19 +1123,12 @@

uint OliveFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -1376,25 +1146,17 @@

uint OliveLeafPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - LeafPrototype *  - prototype_parameters, + LeafPrototype * prototype_parameters, - int  - compound_leaf_index  - - - - ) - + int compound_leaf_index )

@@ -1412,8 +1174,7 @@

void OlivePhytomerCallbackFunction ( - std::shared_ptr< Phytomer >  - phytomer) + std::shared_ptr< Phytomer > phytomer) @@ -1432,37 +1193,27 @@

void OlivePhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -1480,25 +1231,17 @@

uint PistachioFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -1516,19 +1259,12 @@

uint PistachioFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -1546,8 +1282,7 @@

void PistachioPhytomerCallbackFunction ( - std::shared_ptr< Phytomer >  - phytomer) + std::shared_ptr< Phytomer > phytomer) @@ -1566,37 +1301,27 @@

void PistachioPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -1614,25 +1339,17 @@

uint PuncturevineFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -1680,25 +1390,17 @@

uint RedbudFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -1716,19 +1418,12 @@

uint RedbudFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -1746,8 +1441,7 @@

void RedbudPhytomerCallbackFunction ( - std::shared_ptr< Phytomer >  - phytomer) + std::shared_ptr< Phytomer > phytomer) @@ -1766,37 +1460,27 @@

void RedbudPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -1814,37 +1498,27 @@

void RicePhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -1862,19 +1536,12 @@

uint RiceSpikePrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -1892,19 +1559,12 @@

uint SorghumPaniclePrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -1922,37 +1582,27 @@

void SorghumPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -1970,25 +1620,17 @@

uint SoybeanFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -2006,19 +1648,12 @@

uint SoybeanFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -2036,37 +1671,27 @@

void SoybeanPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -2084,31 +1709,22 @@

bool spheres_overlap ( - const helios::vec3 &  - center1, + const helios::vec3 & center1, - float  - radius1, + float radius1, - const helios::vec3 &  - center2, + const helios::vec3 & center2, - float  - radius2  - - - - ) - + float radius2 )

@@ -2126,25 +1742,17 @@

uint StrawberryFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -2162,19 +1770,12 @@

uint StrawberryFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -2192,25 +1793,17 @@

uint TomatoFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -2228,19 +1821,12 @@

uint TomatoFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -2258,37 +1844,27 @@

void TomatoPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -2306,25 +1882,17 @@

uint WalnutFlowerPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions, + uint subdivisions, - bool  - flower_is_open  - - - - ) - + bool flower_is_open )

@@ -2342,19 +1910,12 @@

uint WalnutFruitPrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -2372,8 +1933,7 @@

void WalnutPhytomerCallbackFunction ( - std::shared_ptr< Phytomer >  - phytomer) + std::shared_ptr< Phytomer > phytomer) @@ -2392,37 +1952,27 @@

void WalnutPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -2440,37 +1990,27 @@

void WheatPhytomerCreationFunction ( - std::shared_ptr< Phytomer >  - phytomer, + std::shared_ptr< Phytomer > phytomer, - uint  - shoot_node_index, + uint shoot_node_index, - uint  - parent_shoot_node_index, + uint parent_shoot_node_index, - uint  - shoot_max_nodes, + uint shoot_max_nodes, - float  - plant_age  - - - - ) - + float plant_age )

@@ -2488,19 +2028,12 @@

uint WheatSpikePrototype ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - uint  - subdivisions  - - - - ) - + uint subdivisions )

@@ -2512,7 +2045,8 @@

+

diff --git a/doc/html/_assets_8cpp_source.html b/doc/html/_assets_8cpp_source.html index 8d2f85007..8aac2d56b 100644 --- a/doc/html/_assets_8cpp_source.html +++ b/doc/html/_assets_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Assets.cpp
@@ -980,60 +992,61 @@
900
901}
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition: Context.cpp:7139
-
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition: Context.cpp:1406
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
void rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
Rotate a single compound object about the x, y, or z axis.
Definition: Context.cpp:2847
-
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition: Context.cpp:1420
-
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition: Context.cpp:2907
-
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition: Context.cpp:1578
-
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
-
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition: Context.cpp:1491
-
void scalePrimitiveAboutPoint(uint UUID, const helios::vec3 &S, const helios::vec3 point)
Scale a primitive using its UUID about an arbitrary point in space.
Definition: Context.cpp:1512
-
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition: global.cpp:140
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:4728
-
uint addPolymeshObject(const std::vector< uint > &UUIDs)
Add new Polymesh Compound Object.
Definition: Context.cpp:5399
-
std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition: Context.cpp:5646
-
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:5930
-
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:5809
-
float randu()
Random number from a uniform distribution between 0 and 1.
Definition: global.cpp:223
-
float min(const std::vector< float > &vect)
Minimum value of a vector of floats.
Definition: global.cpp:1100
-
float deg2rad(float deg)
Convert degrees to radians.
Definition: global.cpp:576
-
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition: global.cpp:1146
-
void resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)
Resize 2D C++ vector.
Definition: global.cpp:1239
-
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition: Context.cpp:1328
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
- -
uint subdivisions
Leaf subdivision count in each direction.
-
std::map< int, std::string > leaf_texture_file
Image texture file for the leaf.
-
RandomParameter_float lateral_curvature
Leaf curvature factor along the lateral/width (y-direction). (+curves upward, -curved downward)
-
RandomParameter_float petiole_roll
Creates a rolling at the leaf where the petiole attaches to the leaf blade.
-
bool build_petiolule
Add a petiolule to the base of the leaflet.
-
RandomParameter_float wave_period
Period factor of leaf waves (sets how many waves there are along the leaf length)
-
helios::vec3 leaf_offset
Amount to shift the leaf.
-
RandomParameter_float leaf_buckle_angle
Angle of the leaf buckle (degrees)
-
RandomParameter_float leaf_buckle_length
Fraction of the leaf length where the leaf buckles under its weight.
-
RandomParameter_float midrib_fold_fraction
Fraction of folding along the leaf midrib. =0 means leaf is flat, =1 means leaf is completely folded ...
-
RandomParameter_float wave_amplitude
Amplitude of leaf waves (sets the height of leaf waves)
-
std::string OBJ_model_file
OBJ model file to load for the leaf.
-
RandomParameter_float longitudinal_curvature
Leaf curvature factor along the longitudinal/length (x-direction). (+curves upward,...
-
R-G-B color vector.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition Context.cpp:7139
+
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition Context.cpp:1406
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
void rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
Rotate a single compound object about the x, y, or z axis.
Definition Context.cpp:2847
+
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition Context.cpp:1420
+
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition Context.cpp:2907
+
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition Context.cpp:1578
+
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
+
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition Context.cpp:1491
+
void scalePrimitiveAboutPoint(uint UUID, const helios::vec3 &S, const helios::vec3 point)
Scale a primitive using its UUID about an arbitrary point in space.
Definition Context.cpp:1512
+
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition global.cpp:140
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:4728
+
uint addPolymeshObject(const std::vector< uint > &UUIDs)
Add new Polymesh Compound Object.
Definition Context.cpp:5399
+
std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition Context.cpp:5646
+
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:5930
+
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:5809
+
float randu()
Random number from a uniform distribution between 0 and 1.
Definition global.cpp:223
+
float min(const std::vector< float > &vect)
Minimum value of a vector of floats.
Definition global.cpp:1100
+
float deg2rad(float deg)
Convert degrees to radians.
Definition global.cpp:576
+
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition global.cpp:1146
+
void resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)
Resize 2D C++ vector.
Definition global.cpp:1239
+
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition Context.cpp:1328
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+ +
uint subdivisions
Leaf subdivision count in each direction.
+
std::map< int, std::string > leaf_texture_file
Image texture file for the leaf.
+
RandomParameter_float lateral_curvature
Leaf curvature factor along the lateral/width (y-direction). (+curves upward, -curved downward)
+
RandomParameter_float petiole_roll
Creates a rolling at the leaf where the petiole attaches to the leaf blade.
+
bool build_petiolule
Add a petiolule to the base of the leaflet.
+
RandomParameter_float wave_period
Period factor of leaf waves (sets how many waves there are along the leaf length)
+
helios::vec3 leaf_offset
Amount to shift the leaf.
+
RandomParameter_float leaf_buckle_angle
Angle of the leaf buckle (degrees)
+
RandomParameter_float leaf_buckle_length
Fraction of the leaf length where the leaf buckles under its weight.
+
RandomParameter_float midrib_fold_fraction
Fraction of folding along the leaf midrib. =0 means leaf is flat, =1 means leaf is completely folded ...
+
RandomParameter_float wave_amplitude
Amplitude of leaf waves (sets the height of leaf waves)
+
std::string OBJ_model_file
OBJ model file to load for the leaf.
+
RandomParameter_float longitudinal_curvature
Leaf curvature factor along the longitudinal/length (x-direction). (+curves upward,...
+
R-G-B color vector.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+ diff --git a/doc/html/_assets_8h_source.html b/doc/html/_assets_8h_source.html index a7f5ef2d8..94cc86ff6 100644 --- a/doc/html/_assets_8h_source.html +++ b/doc/html/_assets_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Assets.h
@@ -182,12 +194,13 @@
88
89
90#endif //HELIOS_ASSETS_H
-
Stores the state associated with simulation.
Definition: Context.h:1882
- +
Stores the state associated with simulation.
Definition Context.h:1882
+
+ diff --git a/doc/html/_b_l_conductance_doc.html b/doc/html/_b_l_conductance_doc.html index 0300cec2c..7c0b34d6f 100644 --- a/doc/html/_b_l_conductance_doc.html +++ b/doc/html/_b_l_conductance_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
-
Boundary-Layer Conductance Model Plugin Documentation
+
Boundary-Layer Conductance Model Plugin Documentation


@@ -236,7 +282,7 @@

// This changes the boundary-layer conductance model for the second primitive (while the first will keep the model set above)
boundarylayerconductance.setBoundaryLayerModel( UUID1, "ground" );
-
Boundary-layer conductance model class.
+
Boundary-layer conductance model class.

Running the Model

The model can be run to calculate the boundary-layer conductance for all primitives or a sub-set of primitives using the appropriate run function below.

@@ -253,7 +299,8 @@

+
diff --git a/doc/html/_boundary_layer_conductance_model_8cpp.html b/doc/html/_boundary_layer_conductance_model_8cpp.html index 5bb9e2c2f..c20f9c89e 100644 --- a/doc/html/_boundary_layer_conductance_model_8cpp.html +++ b/doc/html/_boundary_layer_conductance_model_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
BoundaryLayerConductanceModel.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_boundary_layer_conductance_model_8cpp_source.html b/doc/html/_boundary_layer_conductance_model_8cpp_source.html index 606aa11a9..fa1976891 100644 --- a/doc/html/_boundary_layer_conductance_model_8cpp_source.html +++ b/doc/html/_boundary_layer_conductance_model_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
BoundaryLayerConductanceModel.cpp
@@ -97,6 +109,7 @@
17
18using namespace helios;
19
+
21
22 wind_speed_default = 1.f;
@@ -111,7 +124,9 @@
31 context = __context;
32
33}
+
34
+
36
37 std::cout << "Running boundary-layer conductance model self-test..." << std::flush;
@@ -162,25 +177,35 @@
82 return 0;
83
84}
+
85
+
87 message_flag = true;
88}
+
89
+
91 message_flag = false;
92}
+
93
+
94void BLConductanceModel::setBoundaryLayerModel( const char* gH_model ){
95 std::vector<uint> UUIDs = context->getAllUUIDs();
96 setBoundaryLayerModel(UUIDs,gH_model);
97}
+
98
+
99void BLConductanceModel::setBoundaryLayerModel( uint UUID, const char* gH_model ){
100 std::vector<uint> UUIDs{UUID};
101 setBoundaryLayerModel(UUIDs,gH_model);
102}
+
103
+
104void BLConductanceModel::setBoundaryLayerModel(const std::vector<uint> &UUIDs, const char* gH_model ){
105
106 uint model = 0;
@@ -203,13 +228,17 @@
123 }
124
125}
+
126
+
128
129 run( context->getAllUUIDs() );
130
131}
+
132
+
133void BLConductanceModel::run(const std::vector<uint> &UUIDs ){
134
135 for( uint UUID : UUIDs ){
@@ -268,6 +297,7 @@
188 }
189
190}
+
191
192float BLConductanceModel::calculateBoundaryLayerConductance( uint gH_model, float U, float L, char Nsides, float inclination, float TL, float Ta ){
193
@@ -350,35 +380,36 @@
270
271}
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
Boundary-layer conductance model class.
-
void disableMessages()
Disable standard output from this plug-in.
-
void setBoundaryLayerModel(const char *gH_model)
Set the boundary-layer conductance model to be used for all primitives in the Context.
- -
void run()
Run boundary-layer conductance calculations for all primitives in the Context.
-
BLConductanceModel(helios::Context *context)
Constructor.
-
void enableMessages()
Enable standard output from this plug-in (default)
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:7017
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition: Context.cpp:7920
-
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition: Context.cpp:7104
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
const float & zenith
Zenithal angle (radians)
-
Vector of three elements of type 'float'.
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
Boundary-layer conductance model class.
+
void disableMessages()
Disable standard output from this plug-in.
+
void setBoundaryLayerModel(const char *gH_model)
Set the boundary-layer conductance model to be used for all primitives in the Context.
+ +
void run()
Run boundary-layer conductance calculations for all primitives in the Context.
+
BLConductanceModel(helios::Context *context)
Constructor.
+
void enableMessages()
Enable standard output from this plug-in (default)
+
Stores the state associated with simulation.
Definition Context.h:1882
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:7017
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition Context.cpp:7920
+
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition Context.cpp:7104
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
const float & zenith
Zenithal angle (radians)
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_boundary_layer_conductance_model_8h.html b/doc/html/_boundary_layer_conductance_model_8h.html index 9c6098da4..6551ce1b3 100644 --- a/doc/html/_boundary_layer_conductance_model_8h.html +++ b/doc/html/_boundary_layer_conductance_model_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -114,7 +126,8 @@
+ diff --git a/doc/html/_boundary_layer_conductance_model_8h_source.html b/doc/html/_boundary_layer_conductance_model_8h_source.html index d784a26ac..95c3f3965 100644 --- a/doc/html/_boundary_layer_conductance_model_8h_source.html +++ b/doc/html/_boundary_layer_conductance_model_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
BoundaryLayerConductanceModel.h
@@ -99,11 +111,12 @@
19#include "Context.h"
20
22
+
24public:
25
27
- +
31
33
36 int selfTest();
@@ -142,20 +155,23 @@
88 std::map<uint,uint> boundarylayer_model;
89
90};
+
91
92#endif
-
Boundary-layer conductance model class.
-
void disableMessages()
Disable standard output from this plug-in.
-
void setBoundaryLayerModel(const char *gH_model)
Set the boundary-layer conductance model to be used for all primitives in the Context.
- -
void run()
Run boundary-layer conductance calculations for all primitives in the Context.
-
void enableMessages()
Enable standard output from this plug-in (default)
-
Stores the state associated with simulation.
Definition: Context.h:1882
+
Boundary-layer conductance model class.
+
void disableMessages()
Disable standard output from this plug-in.
+
void setBoundaryLayerModel(const char *gH_model)
Set the boundary-layer conductance model to be used for all primitives in the Context.
+ +
void run()
Run boundary-layer conductance calculations for all primitives in the Context.
+
BLConductanceModel(helios::Context *context)
Constructor.
+
void enableMessages()
Enable standard output from this plug-in (default)
+
Stores the state associated with simulation.
Definition Context.h:1882
+ diff --git a/doc/html/_c_lion_i_d_e.html b/doc/html/_c_lion_i_d_e.html index 19220f98b..3f31fd3e4 100644 --- a/doc/html/_c_lion_i_d_e.html +++ b/doc/html/_c_lion_i_d_e.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Using the CLion IDE with Helios
+
Using the CLion IDE with Helios

Using an Interactive Development Environment (IDE) can help to speed up code development, particularly in Helios. One excellent and recommended C++ IDE is CLion by JetBrains, and is available on PC, Mac, and Linux. Students and academics can get a free license for CLion the entire JetBrains suite. Visit here to get the free license.

@@ -114,7 +126,8 @@

+
diff --git a/doc/html/_camera_calibration_8cpp.html b/doc/html/_camera_calibration_8cpp.html index cdf2b0489..cd080e137 100644 --- a/doc/html/_camera_calibration_8cpp.html +++ b/doc/html/_camera_calibration_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -100,7 +112,7 @@ - +

Functions

void undistortImage (std::vector< std::vector< unsigned char > > &image, std::vector< std::vector< unsigned char > > &undistorted, std::vector< std::vector< double > > &K, std::vector< double > &distCoeffs)
void undistortImage (std::vector< std::vector< unsigned char > > &image, std::vector< std::vector< unsigned char > > &undistorted, std::vector< std::vector< double > > &K, std::vector< double > &distCoeffs)
 

Detailed Description

@@ -120,31 +132,22 @@

void undistortImage ( - std::vector< std::vector< unsigned char > > &  - image, + std::vector< std::vector< unsigned char > > & image, - std::vector< std::vector< unsigned char > > &  - undistorted, + std::vector< std::vector< unsigned char > > & undistorted, - std::vector< std::vector< double > > &  - K, + std::vector< std::vector< double > > & K, - std::vector< double > &  - distCoeffs  - - - - ) - + std::vector< double > & distCoeffs )

@@ -156,7 +159,8 @@

+

diff --git a/doc/html/_camera_calibration_8cpp_source.html b/doc/html/_camera_calibration_8cpp_source.html index 1b487eda9..fb1cd01d5 100644 --- a/doc/html/_camera_calibration_8cpp_source.html +++ b/doc/html/_camera_calibration_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
CameraCalibration.cpp
@@ -100,6 +112,7 @@
20CameraCalibration::CameraCalibration(helios::Context *context):context(context){
21}
22
+
23std::vector<uint> CameraCalibration::addCheckerboard(const helios::int2 &boardsidesize, const float &patchsize, const helios::vec3 &centrelocation,
24 const helios::vec3 &rotationrad, bool firstblack) {
25 helios::vec2 patchfullsize = make_vec2(patchsize,patchsize); //size of each patch
@@ -153,7 +166,9 @@
73 context->translatePrimitive(UUIDs,centrelocation);
74 return UUIDs;
75}
+
76
+
77std::vector<uint> CameraCalibration::addDefaultCheckerboard(const helios::vec3 &centrelocation, const helios::vec3 &rotationrad){
78 helios::int2 boardsidesize = make_int2(10,7);
79 float patchsize = 0.029;
@@ -162,7 +177,9 @@
82 return UUID_checkboard;
83
84}
+
85
+
86std::vector<uint> CameraCalibration::addColorboard(const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad, const std::vector<std::vector<helios::RGBcolor>> &colorassignment, const std::vector<std::vector<std::string>> &spectrumassignment) {
87
88 uint Nrow;
@@ -215,6 +232,7 @@
135 return UUIDs;
136
137}
+
138
139//void CameraCalibration::setColorboardReflectivity(const uint &UUID, const std::string &filename, const std::string &labelname) {
140// //\todo this needs to be updated
@@ -229,6 +247,7 @@
149//}
150
151// Add default color board (DKC-RPO) with spectral reflectivity values
+
152std::vector<uint> CameraCalibration::addDefaultColorboard(const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad) {
153
154 if (!UUIDs_colorboard.empty()){
@@ -242,11 +261,13 @@
162
163 return UUIDs;
164}
+
165
166std::vector<uint> CameraCalibration::getColorBoardUUIDs(){
167 return UUIDs_colorboard;
168}
169
+
170bool CameraCalibration::writeSpectralXMLfile(const std::string &filename, const std::string &note, const std::string &label, std::vector<vec2> *spectrum){
171
172 std::ofstream newspectraldata(filename);
@@ -280,8 +301,10 @@
200
201 }
202}
+
203
204// Load XML file and save data in spectral vectors containing both wavelengths and spectral values
+
205bool CameraCalibration::loadXMLlabeldata(const std::string &filename,const std::string &labelname,std::vector<vec2> &spectraldata){
206
207 Context context_temporary;
@@ -296,7 +319,9 @@
216 return false;
217 }
218}
+
219
+
220float CameraCalibration::GradientDescent(std::vector<std::vector<float>> *expandedcameraspectra, const std::vector<std::vector<float>> &expandedconstinput,
221 const float &learningrate, const std::vector<std::vector<float>> &truevalues) {
222
@@ -317,7 +342,7 @@
237 errors.at(iboardn)=truevalues.at(iband).at(iboardn)-output.at(iboardn);
238
239 //Calculate root mean square error as loss function
-
240 iloss += (errors.at(iboardn) * errors.at(iboardn)) / float(boardnumber)/float(bandnumber);
+
240 iloss += (errors.at(iboardn) * errors.at(iboardn)) / float(boardnumber)/float(bandnumber);
241 }
242
243 //Update extended spectrum
@@ -336,6 +361,7 @@
256 }
257 return iloss;
258}
+
259
260std::vector<float> CameraCalibration::expandSpectrum(const std::vector<helios::vec2>& targetspectrum, float normvalue=1) {
261
@@ -371,6 +397,7 @@
291}
292
293
+
294std::vector<float> CameraCalibration::updateCameraResponseSpectra(const std::vector<std::string>& camerareponselabels, const std::string &label,
295 const std::map<uint, std::vector<vec2>> &simulatedinputspectra,
296 const std::vector<std::vector<float>> &truevalues) {
@@ -442,7 +469,9 @@
362 loss.push_back(iloss);
363 return loss;
364}
+
365
+
366void CameraCalibration::writeCalibratedCameraResponses(const std::vector<std::string>& camerareponselabels, const std::string &calibratemark, float scale){
367 // write the calibrated camera response spectra in xml files and set them as global data
368
@@ -456,7 +485,9 @@
376 CameraCalibration::writeSpectralXMLfile(calibratedlabel + ".xml", "", calibratedlabel, &cameraresponsespectrum);
377 }
378}
+
379
+
380void CameraCalibration::distortImage(const std::string& cameralabel, const std::vector<std::string>& bandlabels,
381 const helios::vec2 &focalxy, std::vector<double> &distCoeffs, helios::int2 cameraresolution) {
382
@@ -510,6 +541,7 @@
430 }
431
432}
+
433
434void undistortImage(std::vector<std::vector<unsigned char>> &image,
435 std::vector<std::vector<unsigned char>> &undistorted,
@@ -553,6 +585,7 @@
473 }
474}
475
+
476void CameraCalibration::preprocessSpectra(const std::vector<std::string>& sourcelabels, const std::vector<std::string>& cameralabels,
477 std::vector<std::string>& objectlabels, vec2 &wavelengthrange, const std::string& targetlabel){
478
@@ -675,7 +708,9 @@
595 }
596
597}
+
598
+
599float CameraCalibration::getCameraResponseScale(const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector<std::string> &bandlabels,
600 const std::vector<std::vector<float>> &truevalues) {
601
@@ -715,7 +750,9 @@
635 float fluxscale = dotsimreal / dotsimsim;
636 return fluxscale;
637}
+
638
+
640 std::ifstream inputFile("plugins/radiation/spectral_data/external_data/HET01_UNI_scene.def");
641 std::vector<uint> iCUUIDs;
@@ -748,59 +785,61 @@
668 inputFile.close();
669 return iCUUIDs;
670}
+
671
-
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition: Context.h:51
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
-
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition: Context.cpp:1406
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition: Context.cpp:1420
-
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
void setGlobalData(const char *label, const int &data)
Add global data value (int)
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
float interp1(const std::vector< helios::vec2 > &points, float x)
Function to perform linear interpolation based on a vector of discrete (x,y) values.
Definition: global.cpp:3022
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
SphericalCoord nullrotation
Default null SphericalCoord that applies no rotation.
Definition: global.cpp:57
-
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition: global.cpp:1069
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
bool loadXMLlabeldata(const std::string &filename, const std::string &labelname, std::vector< helios::vec2 > &spectraldata)
Load XML file and save data in spectral vectors containing both wavelengths and spectral values.
-
void writeCalibratedCameraResponses(const std::vector< std::string > &camerareponselabels, const std::string &calibratemark, float scale)
Write calibrated camera response spectra.
-
float getCameraResponseScale(const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector< std::string > &bandlabels, const std::vector< std::vector< float > > &truevalues)
Get camera spectral response scale.
-
std::vector< uint > addDefaultColorboard(const helios::vec3 &centrelocation, float patchsize=0.5, const helios::vec3 &rotationrad=helios::make_vec3(0, 0, 0))
Set reflectivity for a specific UUID.
-
float GradientDescent(std::vector< std::vector< float > > *expandedcameraspectra, const std::vector< std::vector< float > > &expandedconstinput, const float &learningrate, const std::vector< std::vector< float > > &truevalues)
Reduce calibration error based on gradient descent.
-
std::vector< uint > addDefaultCheckerboard(const helios::vec3 &centrelocation, const helios::vec3 &rotationrad)
Add default checker board geometry into context.
-
void distortImage(const std::string &cameralabel, const std::vector< std::string > &bandlabels, const helios::vec2 &focalxy, std::vector< double > &distCoeffs, helios::int2 camerareoslution)
Get distorted image.
-
void preprocessSpectra(const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameralabels, std::vector< std::string > &objectlabels, helios::vec2 &wavelengthrange, const std::string &targetlabel="")
Preprocess all spectra for modelling.
-
std::vector< float > updateCameraResponseSpectra(const std::vector< std::string > &camerareponselabels, const std::string &label, const std::map< uint, std::vector< helios::vec2 > > &simulatedinputspectra, const std::vector< std::vector< float > > &truevalues)
Update camera response spectra.
-
bool writeSpectralXMLfile(const std::string &filename, const std::string &note, const std::string &label, std::vector< helios::vec2 > *spectrum)
Write XML file from spectral vectors containing both wavelengths and spectral values.
-
std::vector< uint > addCheckerboard(const helios::int2 &boardsidesize, const float &patchsize, const helios::vec3 &centrelocation, const helios::vec3 &rotationrad, bool firstblack=true)
Add checker board geometry into context.
-
std::vector< uint > addColorboard(const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad, const std::vector< std::vector< helios::RGBcolor > > &colorassignment={}, const std::vector< std::vector< std::string > > &spectrumassignment={})
Add color board geometry into context.
-
std::vector< uint > readROMCCanopy()
Read ROMC canopy file (Used for self test).
-
R-G-B color vector.
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
+
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition Context.h:51
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
+
Stores the state associated with simulation.
Definition Context.h:1882
+
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
+
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition Context.cpp:1406
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition Context.cpp:1420
+
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
void setGlobalData(const char *label, const int &data)
Add global data value (int)
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
float interp1(const std::vector< helios::vec2 > &points, float x)
Function to perform linear interpolation based on a vector of discrete (x,y) values.
Definition global.cpp:3022
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
SphericalCoord nullrotation
Default null SphericalCoord that applies no rotation.
Definition global.cpp:57
+
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition global.cpp:1069
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
bool loadXMLlabeldata(const std::string &filename, const std::string &labelname, std::vector< helios::vec2 > &spectraldata)
Load XML file and save data in spectral vectors containing both wavelengths and spectral values.
+
void writeCalibratedCameraResponses(const std::vector< std::string > &camerareponselabels, const std::string &calibratemark, float scale)
Write calibrated camera response spectra.
+
float getCameraResponseScale(const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector< std::string > &bandlabels, const std::vector< std::vector< float > > &truevalues)
Get camera spectral response scale.
+
std::vector< uint > addDefaultColorboard(const helios::vec3 &centrelocation, float patchsize=0.5, const helios::vec3 &rotationrad=helios::make_vec3(0, 0, 0))
Set reflectivity for a specific UUID.
+
float GradientDescent(std::vector< std::vector< float > > *expandedcameraspectra, const std::vector< std::vector< float > > &expandedconstinput, const float &learningrate, const std::vector< std::vector< float > > &truevalues)
Reduce calibration error based on gradient descent.
+
std::vector< uint > addDefaultCheckerboard(const helios::vec3 &centrelocation, const helios::vec3 &rotationrad)
Add default checker board geometry into context.
+
void distortImage(const std::string &cameralabel, const std::vector< std::string > &bandlabels, const helios::vec2 &focalxy, std::vector< double > &distCoeffs, helios::int2 camerareoslution)
Get distorted image.
+
void preprocessSpectra(const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameralabels, std::vector< std::string > &objectlabels, helios::vec2 &wavelengthrange, const std::string &targetlabel="")
Preprocess all spectra for modelling.
+
std::vector< float > updateCameraResponseSpectra(const std::vector< std::string > &camerareponselabels, const std::string &label, const std::map< uint, std::vector< helios::vec2 > > &simulatedinputspectra, const std::vector< std::vector< float > > &truevalues)
Update camera response spectra.
+
bool writeSpectralXMLfile(const std::string &filename, const std::string &note, const std::string &label, std::vector< helios::vec2 > *spectrum)
Write XML file from spectral vectors containing both wavelengths and spectral values.
+
std::vector< uint > addCheckerboard(const helios::int2 &boardsidesize, const float &patchsize, const helios::vec3 &centrelocation, const helios::vec3 &rotationrad, bool firstblack=true)
Add checker board geometry into context.
+
std::vector< uint > addColorboard(const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad, const std::vector< std::vector< helios::RGBcolor > > &colorassignment={}, const std::vector< std::vector< std::string > > &spectrumassignment={})
Add color board geometry into context.
+
std::vector< uint > readROMCCanopy()
Read ROMC canopy file (Used for self test).
+
R-G-B color vector.
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+ diff --git a/doc/html/_camera_calibration_8h.html b/doc/html/_camera_calibration_8h.html index 939f79fa6..8349978dc 100644 --- a/doc/html/_camera_calibration_8h.html +++ b/doc/html/_camera_calibration_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -117,7 +129,8 @@
+ diff --git a/doc/html/_camera_calibration_8h_source.html b/doc/html/_camera_calibration_8h_source.html index d3587279c..a9575ed5e 100644 --- a/doc/html/_camera_calibration_8h_source.html +++ b/doc/html/_camera_calibration_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
CameraCalibration.h
@@ -97,6 +109,7 @@
17#define HELIOS_CAMERACALIBRATION_H
18#include "Context.h"
19
+
22 explicit CameraCalibration(helios::Context *context);
23
@@ -135,6 +148,7 @@
112 const std::map<uint,std::vector<helios::vec2>>& simulatedinputspectra,
113 const std::vector<std::vector<float>> &truevalues);
114
+
117 {
118 float learningrate=0.000001;
@@ -143,6 +157,7 @@
121 std::vector<float> camerarescales = {1,1,1};
122 GradientDescentParameters() = default;
123 };
+
124
125 GradientDescentParameters responseupdateparameters;
126
@@ -213,34 +228,36 @@
228 {"ColorReference_13", "ColorReference_14", "ColorReference_15", "ColorReference_16", "ColorReference_17", "ColorReference_18"}};
229
230};
+
231
232#endif //HELIOS_CAMERACALIBRATION_H
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
Parameter struct for gradient descent.
-
Camera calibration structure used for camera calibration tasks.
-
bool loadXMLlabeldata(const std::string &filename, const std::string &labelname, std::vector< helios::vec2 > &spectraldata)
Load XML file and save data in spectral vectors containing both wavelengths and spectral values.
-
void writeCalibratedCameraResponses(const std::vector< std::string > &camerareponselabels, const std::string &calibratemark, float scale)
Write calibrated camera response spectra.
-
float getCameraResponseScale(const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector< std::string > &bandlabels, const std::vector< std::vector< float > > &truevalues)
Get camera spectral response scale.
-
std::vector< uint > addDefaultColorboard(const helios::vec3 &centrelocation, float patchsize=0.5, const helios::vec3 &rotationrad=helios::make_vec3(0, 0, 0))
Set reflectivity for a specific UUID.
-
float GradientDescent(std::vector< std::vector< float > > *expandedcameraspectra, const std::vector< std::vector< float > > &expandedconstinput, const float &learningrate, const std::vector< std::vector< float > > &truevalues)
Reduce calibration error based on gradient descent.
-
std::vector< uint > addDefaultCheckerboard(const helios::vec3 &centrelocation, const helios::vec3 &rotationrad)
Add default checker board geometry into context.
-
void distortImage(const std::string &cameralabel, const std::vector< std::string > &bandlabels, const helios::vec2 &focalxy, std::vector< double > &distCoeffs, helios::int2 camerareoslution)
Get distorted image.
-
void preprocessSpectra(const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameralabels, std::vector< std::string > &objectlabels, helios::vec2 &wavelengthrange, const std::string &targetlabel="")
Preprocess all spectra for modelling.
-
std::vector< float > updateCameraResponseSpectra(const std::vector< std::string > &camerareponselabels, const std::string &label, const std::map< uint, std::vector< helios::vec2 > > &simulatedinputspectra, const std::vector< std::vector< float > > &truevalues)
Update camera response spectra.
-
bool writeSpectralXMLfile(const std::string &filename, const std::string &note, const std::string &label, std::vector< helios::vec2 > *spectrum)
Write XML file from spectral vectors containing both wavelengths and spectral values.
-
std::vector< uint > addCheckerboard(const helios::int2 &boardsidesize, const float &patchsize, const helios::vec3 &centrelocation, const helios::vec3 &rotationrad, bool firstblack=true)
Add checker board geometry into context.
-
std::vector< uint > addColorboard(const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad, const std::vector< std::vector< helios::RGBcolor > > &colorassignment={}, const std::vector< std::vector< std::string > > &spectrumassignment={})
Add color board geometry into context.
-
std::vector< uint > readROMCCanopy()
Read ROMC canopy file (Used for self test).
-
R-G-B color vector.
-
Vector of two elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
Parameter struct for gradient descent.
+
Camera calibration structure used for camera calibration tasks.
+
bool loadXMLlabeldata(const std::string &filename, const std::string &labelname, std::vector< helios::vec2 > &spectraldata)
Load XML file and save data in spectral vectors containing both wavelengths and spectral values.
+
void writeCalibratedCameraResponses(const std::vector< std::string > &camerareponselabels, const std::string &calibratemark, float scale)
Write calibrated camera response spectra.
+
float getCameraResponseScale(const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector< std::string > &bandlabels, const std::vector< std::vector< float > > &truevalues)
Get camera spectral response scale.
+
std::vector< uint > addDefaultColorboard(const helios::vec3 &centrelocation, float patchsize=0.5, const helios::vec3 &rotationrad=helios::make_vec3(0, 0, 0))
Set reflectivity for a specific UUID.
+
float GradientDescent(std::vector< std::vector< float > > *expandedcameraspectra, const std::vector< std::vector< float > > &expandedconstinput, const float &learningrate, const std::vector< std::vector< float > > &truevalues)
Reduce calibration error based on gradient descent.
+
std::vector< uint > addDefaultCheckerboard(const helios::vec3 &centrelocation, const helios::vec3 &rotationrad)
Add default checker board geometry into context.
+
void distortImage(const std::string &cameralabel, const std::vector< std::string > &bandlabels, const helios::vec2 &focalxy, std::vector< double > &distCoeffs, helios::int2 camerareoslution)
Get distorted image.
+
void preprocessSpectra(const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameralabels, std::vector< std::string > &objectlabels, helios::vec2 &wavelengthrange, const std::string &targetlabel="")
Preprocess all spectra for modelling.
+
std::vector< float > updateCameraResponseSpectra(const std::vector< std::string > &camerareponselabels, const std::string &label, const std::map< uint, std::vector< helios::vec2 > > &simulatedinputspectra, const std::vector< std::vector< float > > &truevalues)
Update camera response spectra.
+
bool writeSpectralXMLfile(const std::string &filename, const std::string &note, const std::string &label, std::vector< helios::vec2 > *spectrum)
Write XML file from spectral vectors containing both wavelengths and spectral values.
+
std::vector< uint > addCheckerboard(const helios::int2 &boardsidesize, const float &patchsize, const helios::vec3 &centrelocation, const helios::vec3 &rotationrad, bool firstblack=true)
Add checker board geometry into context.
+
std::vector< uint > addColorboard(const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad, const std::vector< std::vector< helios::RGBcolor > > &colorassignment={}, const std::vector< std::vector< std::string > > &spectrumassignment={})
Add color board geometry into context.
+
std::vector< uint > readROMCCanopy()
Read ROMC canopy file (Used for self test).
+
R-G-B color vector.
+
Vector of two elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_canopy_generator_8cpp.html b/doc/html/_canopy_generator_8cpp.html index ef459f853..0e579dfc1 100644 --- a/doc/html/_canopy_generator_8cpp.html +++ b/doc/html/_canopy_generator_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -101,22 +113,22 @@ - + - + - + - + - + - +

Functions

float getVariation (float V, std::minstd_rand0 &generator, bool positive)
float getVariation (float V, std::minstd_rand0 &generator, bool positive)
 Draw a random number (float) from a uniform distribution between -V and V.
 
int getVariation (int V, std::minstd_rand0 &generator, bool positive)
int getVariation (int V, std::minstd_rand0 &generator, bool positive)
 Draw a random number (int) from a uniform distribution between -V and V.
 
uint getVariation (uint V, std::minstd_rand0 &generator)
uint getVariation (uint V, std::minstd_rand0 &generator)
 Draw a random number (uint) from a uniform distribution between 0 and V.
 
helios::vec3 interpolateTube (const std::vector< vec3 > &P, float frac)
helios::vec3 interpolateTube (const std::vector< vec3 > &P, float frac)
 Interpolate the position of a point along a tube.
 
float interpolateTube (const std::vector< float > &P, float frac)
float interpolateTube (const std::vector< float > &P, float frac)
 Interpolate the radius of a point along a tube.
 
float evaluateCDFresid (float thetaL, std::vector< float > &ru_v, const void *a_distribution)
float evaluateCDFresid (float thetaL, std::vector< float > &ru_v, const void *a_distribution)
 Evaluate the error between a predicted and actual leaf angle cumulative distribution at a given leaf angle.
 
@@ -137,25 +149,17 @@

float evaluateCDFresid ( - float  - thetaL, + float thetaL, - std::vector< float > &  - ru_v, + std::vector< float > & ru_v, - const void *  - a_distribution  - - - - ) - + const void * a_distribution )

@@ -353,19 +327,12 @@

helios::vec3 interpolateTube ( - const std::vector< helios::vec3 > &  - P, + const std::vector< helios::vec3 > & P, - float  - frac  - - - - ) - + float frac )

@@ -386,7 +353,8 @@

+

diff --git a/doc/html/_canopy_generator_8cpp_source.html b/doc/html/_canopy_generator_8cpp_source.html index 90e3c80a1..f2169e956 100644 --- a/doc/html/_canopy_generator_8cpp_source.html +++ b/doc/html/_canopy_generator_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
CanopyGenerator.cpp
@@ -102,15 +114,20 @@
24static int nullvalue_i = 99999;
26static std::string nullvalue_s = "99999";
27
+
32
+
34 readParametersFromXML(canopy_node);
35}
+
36
+
37void BaseCanopyParameters::readParametersFromXML(const pugi::xml_node canopy_node){
38 // ----- canopy origin ------ //
39 vec3 new_canopy_origin = XMLloadvec3(canopy_node, "canopy_origin");
@@ -124,7 +141,9 @@
47 canopy_rotation = new_canopy_rotation;
48 }
49}
+
50
+
52
53 leaf_size = make_vec2(0.1,0.1);
@@ -144,11 +163,15 @@
67 buffer = "z";
68
69}
+
70
+
74
+
75void HomogeneousCanopyParameters::readParametersFromXML(const pugi::xml_node canopy_node){
77
@@ -200,15 +223,21 @@
123 buffer = new_buffer;
124 }
125}
+
126
+
128 std::cout << "HomogeneousCanopyParameters::buildPlant: Cannot build a single plant of canopy type HomogeneousCanopyParameters" << std::endl;
129}
+
130
+
132 canopy_generator.buildCanopy(*this);
133}
+
134
+
156
+
160
+
161void SphericalCrownsCanopyParameters::readParametersFromXML(const pugi::xml_node canopy_node){
163
@@ -298,15 +331,21 @@
221 plant_count = new_plant_count;
222 }
223}
+
224
+
226 std::cout << "SphericalCrownsCanopyParameters::buildPlant: Cannot build a single plant of canopy type SphericalCrownsCanopyParameters" << std::endl;
227}
+
228
+
230 canopy_generator.buildCanopy(*this);
231}
+
232
+
256
+
260
+
261void ConicalCrownsCanopyParameters::readParametersFromXML(const pugi::xml_node canopy_node){
263
@@ -404,15 +447,21 @@
327 plant_count = new_plant_count;
328 }
329}
+
330
+
332 std::cout << "ConicalCrownsCanopyParameters::buildPlant: Cannot build a single plant of canopy type ConicalCrownsCanopyParameters" << std::endl;
333}
+
334
+
336 canopy_generator.buildCanopy(*this);
337}
+
338
+
340
341 leaf_texture_file = "plugins/canopygenerator/textures/GrapeLeaf.png";
@@ -461,11 +510,15 @@
385
386}
+
387
+
389 readParametersFromXML(canopy_node);
390}
+
391
+
392void BaseGrapeVineParameters::readParametersFromXML(const pugi::xml_node canopy_node){
394
@@ -685,15 +738,21 @@
608 canopy_rotation_spread = new_canopy_rotation_spread;
609 }
610}
+
611
+
613 std::cout << "BaseGrapeVineParameters::buildPlant: Cannot build a single plant of canopy type BaseGrapeVineParameters" << std::endl;
614}
+
615
+
617 std::cout << "BaseGrapeVineParameters::buildPlant: Cannot build a canopy of type BaseGrapeVineParameters" << std::endl;
618}
+
619
+
621
622 trunk_height = 0.7;
@@ -727,23 +786,33 @@
650 row_spacing = 2;
651
652}
+
653
+
655 readParametersFromXML(canopy_node);
656}
+
657
+
658void VSPGrapevineParameters::readParametersFromXML(const pugi::xml_node canopy_node){
660}
+
661
+
663 canopy_generator.grapevineVSP(*this, origin);
664}
+
665
+
667 canopy_generator.buildCanopy(*this);
668}
+
669
+
671
672 trunk_height = 1.3;
@@ -786,11 +855,15 @@
709 row_spacing = 4;
710
711}
+
712
+
714 readParametersFromXML(canopy_node);
715}
+
716
+
717void SplitGrapevineParameters::readParametersFromXML(const pugi::xml_node canopy_node){
719
@@ -809,15 +882,21 @@
732 shoot_angle_base = sab;
733 }
734}
+
735
+
737 canopy_generator.grapevineSplit(*this, origin);
738}
+
739
+
741 canopy_generator.buildCanopy(*this);
742}
+
743
+
777
+
781
+
785
+
787 canopy_generator.grapevineUnilateral(*this, origin);
788}
+
789
+
791 canopy_generator.buildCanopy(*this);
792}
+
793
+
825
+
829
+
830void GobletGrapevineParameters::readParametersFromXML(const pugi::xml_node canopy_node){
832}
+
833
+
835 canopy_generator.grapevineGoblet(*this, origin);
836}
+
837
+
839 canopy_generator.buildCanopy(*this);
840}
+
841
+
843
844 needle_width = 0.0005;
@@ -953,11 +1052,15 @@
876 plant_count = make_int2(3,3);
877
878}
+
879
+
883
+
884void WhiteSpruceCanopyParameters::readParametersFromXML(const pugi::xml_node canopy_node){
886
@@ -1041,15 +1144,21 @@
964 plant_count = new_plant_count;
965 }
966}
+
967
+
969 canopy_generator.whitespruce(*this, origin);
970}
+
971
+
973 canopy_generator.buildCanopy(*this);
974}
+
975
+
977
978 leaf_length = 0.2;
@@ -1077,11 +1186,15 @@
1000 plant_count = make_int2(3,3);
1001
1002}
+
1003
+
1004TomatoParameters::TomatoParameters(const pugi::xml_node canopy_node) : TomatoParameters(){
1005 readParametersFromXML(canopy_node);
1006}
+
1007
+
1008void TomatoParameters::readParametersFromXML(const pugi::xml_node canopy_node){
1010
@@ -1146,15 +1259,21 @@
1069 plant_count = new_plant_count;
1070 }
1071}
+
1072
+
1074 canopy_generator.tomato(*this, origin);
1075}
+
1076
+
1078 canopy_generator.buildCanopy(*this);
1079}
+
1080
+
1082
1083 leaf_length = 0.1;
@@ -1188,11 +1307,15 @@
1111 plant_count = make_int2(4,2);
1112
1113}
+
1114
+
1116 readParametersFromXML(canopy_node);
1117}
+
1118
+
1119void StrawberryParameters::readParametersFromXML(const pugi::xml_node canopy_node){
1121
@@ -1266,15 +1389,21 @@
1189 plant_count = new_plant_count;
1190 }
1191}
+
1192
+
1194 canopy_generator.strawberry(*this, origin);
1195}
+
1196
+
1198 canopy_generator.buildCanopy(*this);
1199}
+
1200
+
1202
1203 leaf_length = 0.15;
@@ -1306,11 +1435,15 @@
1229 plant_count = make_int2(4,2);
1230
1231}
+
1232
+
1234 readParametersFromXML(canopy_node);
1235}
+
1236
+
1237void WalnutCanopyParameters::readParametersFromXML(const pugi::xml_node canopy_node){
1239
@@ -1375,15 +1508,21 @@
1298 plant_count = new_plant_count;
1299 }
1300}
+
1301
+
1303 canopy_generator.walnut(*this, origin);
1304}
+
1305
+
1307 canopy_generator.buildCanopy(*this);
1308}
+
1309
+
1311 sorghum_stage = 5;
1312
@@ -1515,11 +1654,15 @@
1438 plant_count = make_int2(10 ,10);
1439
1440}
+
1441
+
1443 readParametersFromXML(canopy_node);
1444}
+
1445
+
1446void SorghumCanopyParameters::readParametersFromXML(const pugi::xml_node canopy_node){
1448
@@ -1833,15 +1976,21 @@
1756 plant_count = new_plant_count;
1757 }
1758}
+
1759
+
1761 canopy_generator.sorghum(*this, origin);
1762}
+
1763
+
1765 canopy_generator.buildCanopy(*this);
1766}
+
1767
+
1769
1770 leaf_length = 0.075;
@@ -1875,11 +2024,15 @@
1799
1800}
+
1801
+
1802BeanParameters::BeanParameters(const pugi::xml_node canopy_node) : BeanParameters(){
1803 readParametersFromXML(canopy_node);
1804}
+
1805
+
1806void BeanParameters::readParametersFromXML(const pugi::xml_node canopy_node){
1808
@@ -1958,15 +2111,21 @@
1881 germination_probability = new_germination_probability;
1882 }
1883}
+
1884
+
1886 canopy_generator.bean(*this, origin);
1887}
+
1888
+
1890 canopy_generator.buildCanopy(*this);
1891}
+
1892
+
1894
1895 context = m_context;
@@ -1980,7 +2139,9 @@
1903 enable_element_labels = false;
1904
1905}
+
1906
+
1908
1909 std::cout << "Running canopy generator plug-in self-test..." << std::endl;
@@ -2127,12 +2288,15 @@
2050 }
2051
2052}
+
2053
2054template <typename CanopyType, typename... Args>
+
2056 static_assert(std::is_base_of<BaseCanopyParameters, CanopyType>::value, "CanopyType must inherit from BaseCanopyParameters");
2057 canopy_parameters_list.push_back(std::make_shared<CanopyType>(std::forward<Args>(args)...));
2058}
+
2059
2060std::vector<std::shared_ptr<BaseCanopyParameters>> CanopyGenerator::getCanopyParametersList(){
2061 std::vector<std::shared_ptr<BaseCanopyParameters>> params_list;
@@ -2142,6 +2306,7 @@
2065 return params_list;
2066}
2067
+
2068void CanopyGenerator::loadXML( const char* filename, bool build ){
2069
2070 if( printmessages ){
@@ -2184,7 +2349,7 @@
2107 "HomogeneousCanopyParameters")) {
2108
2109 HomogeneousCanopyParameters homogeneouscanopyparameters(s);
-
2110 storeCanopyParameters<HomogeneousCanopyParameters>(homogeneouscanopyparameters);
+
2110 storeCanopyParameters<HomogeneousCanopyParameters>(homogeneouscanopyparameters);
2111 if (build)
2112 buildCanopy(homogeneouscanopyparameters);
2113
@@ -2194,7 +2359,7 @@
2117 for (pugi::xml_node s = cgen.child("SphericalCrownsCanopyParameters"); s; s = s.next_sibling("SphericalCrownsCanopyParameters")) {
2118
2119 SphericalCrownsCanopyParameters sphericalcrownscanopyparameters(s);
-
2120 storeCanopyParameters<SphericalCrownsCanopyParameters>(sphericalcrownscanopyparameters);
+
2120 storeCanopyParameters<SphericalCrownsCanopyParameters>(sphericalcrownscanopyparameters);
2121 if (build)
2122 buildCanopy(sphericalcrownscanopyparameters);
2123
@@ -2204,7 +2369,7 @@
2127 for (pugi::xml_node s = cgen.child("ConicalCrownsCanopyParameters"); s; s = s.next_sibling("ConicalCrownsCanopyParameters")) {
2128
2129 ConicalCrownsCanopyParameters conicalcrownscanopyparameters(s);
-
2130 storeCanopyParameters<ConicalCrownsCanopyParameters>(conicalcrownscanopyparameters);
+
2130 storeCanopyParameters<ConicalCrownsCanopyParameters>(conicalcrownscanopyparameters);
2131 if (build)
2132 buildCanopy(conicalcrownscanopyparameters);
2133
@@ -2215,7 +2380,7 @@
2138 for (pugi::xml_node s = cgen.child("VSPGrapevineParameters"); s; s = s.next_sibling("VSPGrapevineParameters")) {
2139
2140 VSPGrapevineParameters vspgrapevineparameters(s);
-
2141 storeCanopyParameters<VSPGrapevineParameters>(vspgrapevineparameters);
+
2141 storeCanopyParameters<VSPGrapevineParameters>(vspgrapevineparameters);
2142 if (build)
2143 buildCanopy(vspgrapevineparameters);
2144
@@ -2226,7 +2391,7 @@
2149 "SplitGrapevineParameters")) {
2150
2151 SplitGrapevineParameters splitgrapevineparameters(s);
-
2152 storeCanopyParameters<SplitGrapevineParameters>(splitgrapevineparameters);
+
2152 storeCanopyParameters<SplitGrapevineParameters>(splitgrapevineparameters);
2153 if (build)
2154 buildCanopy(splitgrapevineparameters);
2155
@@ -2238,7 +2403,7 @@
2161 "UnilateralGrapevineParameters")) {
2162
2163 UnilateralGrapevineParameters unilateralgrapevineparameters(s);
-
2164 storeCanopyParameters<UnilateralGrapevineParameters>(unilateralgrapevineparameters);
+
2164 storeCanopyParameters<UnilateralGrapevineParameters>(unilateralgrapevineparameters);
2165 if (build)
2166 buildCanopy(unilateralgrapevineparameters);
2167
@@ -2250,7 +2415,7 @@
2173 "GobletGrapevineParameters")) {
2174
2175 GobletGrapevineParameters gobletgrapevineparameters(s);
-
2176 storeCanopyParameters<GobletGrapevineParameters>(gobletgrapevineparameters);
+
2176 storeCanopyParameters<GobletGrapevineParameters>(gobletgrapevineparameters);
2177 if (build)
2178 buildCanopy(gobletgrapevineparameters);
2179
@@ -2261,7 +2426,7 @@
2184 for (pugi::xml_node s = cgen.child("WhiteSpruceCanopyParameters"); s; s = s.next_sibling("WhiteSpruceCanopyParameters")) {
2185
2186 WhiteSpruceCanopyParameters whitesprucecanopyparameters(s);
-
2187 storeCanopyParameters<WhiteSpruceCanopyParameters>(whitesprucecanopyparameters);
+
2187 storeCanopyParameters<WhiteSpruceCanopyParameters>(whitesprucecanopyparameters);
2188 if (build)
2189 buildCanopy(whitesprucecanopyparameters);
2190
@@ -2271,7 +2436,7 @@
2194 for (pugi::xml_node s = cgen.child("StrawberryParameters"); s; s = s.next_sibling("StrawberryParameters")) {
2195
2196 StrawberryParameters strawberryparameters(s);
-
2197 storeCanopyParameters<StrawberryParameters>(strawberryparameters);
+
2197 storeCanopyParameters<StrawberryParameters>(strawberryparameters);
2198 if (build)
2199 buildCanopy(strawberryparameters);
2200
@@ -2281,7 +2446,7 @@
2204 for (pugi::xml_node s = cgen.child("TomatoParameters"); s; s = s.next_sibling("TomatoParameters")) {
2205
2206 TomatoParameters tomatoparameters(s);
-
2207 storeCanopyParameters<TomatoParameters>(tomatoparameters);
+
2208 if (build)
2209 buildCanopy(tomatoparameters);
2210
@@ -2291,7 +2456,7 @@
2214 for (pugi::xml_node s = cgen.child("WalnutCanopyParameters"); s; s = s.next_sibling("WalnutCanopyParameters")) {
2215
2216 WalnutCanopyParameters walnutcanopyparameters(s);
-
2217 storeCanopyParameters<WalnutCanopyParameters>(walnutcanopyparameters);
+
2217 storeCanopyParameters<WalnutCanopyParameters>(walnutcanopyparameters);
2218 if (build)
2219 buildCanopy(walnutcanopyparameters);
2220
@@ -2301,7 +2466,7 @@
2224 for (pugi::xml_node s = cgen.child("SorghumCanopyParameters"); s; s = s.next_sibling("SorghumCanopyParameters")) {
2225
2226 SorghumCanopyParameters sorghumcanopyparameters(s);
-
2227 storeCanopyParameters<SorghumCanopyParameters>(sorghumcanopyparameters);
+
2227 storeCanopyParameters<SorghumCanopyParameters>(sorghumcanopyparameters);
2228 if (build)
2229 buildCanopy(sorghumcanopyparameters);
2230
@@ -2311,7 +2476,7 @@
2234 for (pugi::xml_node s = cgen.child("BeanParameters"); s; s = s.next_sibling("BeanParameters")) {
2235
2236 BeanParameters beanparameters(s);
-
2237 storeCanopyParameters<BeanParameters>(beanparameters);
+
2238 if (build)
2239 buildCanopy(beanparameters);
2240
@@ -2369,11 +2534,15 @@
2292 std::cout << "done." << std::endl;
2293
2294}
+
2295
+
2296void CanopyGenerator::buildGround(const vec3 &ground_origin, const vec2 &ground_extent, const int2 &texture_subtiles, const int2 &texture_subpatches, const char* ground_texture_file ){
2297 buildGround( ground_origin, ground_extent, texture_subtiles, texture_subpatches, ground_texture_file, 0.f );
2298}
+
2299
+
2300void CanopyGenerator::buildGround(const vec3 &ground_origin, const vec2 &ground_extent, const int2 &texture_subtiles, const int2 &texture_subpatches, const char* ground_texture_file, float ground_rotation ){
2301
2302 if( printmessages ){
@@ -2407,13 +2576,17 @@
2330 }
2331
2332}
+
2333
+
2335 for (const auto& canopy_parameters : canopy_parameters_list) {
2336 canopy_parameters->buildCanopy(*this);
2337 }
2338}
+
2339
+
2341
2342 if( printmessages ){
@@ -2486,7 +2659,9 @@
2409 }
2410
2411}
+
2412
+
2414
2415 if( printmessages ){
@@ -2587,7 +2762,9 @@
2510 }
2511
2512}
+
2513
+
2515
2516 if( printmessages ){
@@ -2689,7 +2866,9 @@
2612 }
2613
2614}
+
2615
+
2617
2618 if( printmessages ){
@@ -2736,7 +2915,9 @@
2659 }
2660
2661}
+
2662
+
2664
2665 if( printmessages ){
@@ -2778,7 +2959,9 @@
2701 }
2702
2703}
+
2704
+
2706
2707 if( printmessages ){
@@ -2820,7 +3003,9 @@
2743 }
2744
2745}
+
2746
+
2748
2749 if( printmessages ){
@@ -2862,7 +3047,9 @@
2785 }
2786
2787}
+
2788
+
2790
2791 if( printmessages ){
@@ -2912,7 +3099,9 @@
2835 }
2836
2837}
+
2838
+
2840
2841 if( printmessages ){
@@ -2943,7 +3132,9 @@
2866 }
2867
2868}
+
2869
+
2871
2872 if( printmessages ){
@@ -2974,7 +3165,9 @@
2897 }
2898
2899}
+
2900
+
2902
2903 if( printmessages ){
@@ -3005,7 +3198,9 @@
2928 }
2929
2930}
+
2931
+
2933
2934 if( printmessages ){
@@ -3036,7 +3231,9 @@
2959 }
2960
2961}
+
2962
+
2964
2965 if( printmessages ){
@@ -3077,7 +3274,9 @@
3000 }
3001
3002}
+
3003
+
3004float getVariation( float V, std::minstd_rand0& generator, bool positive ){
3005
3006 std::uniform_real_distribution<float> unif_distribution;
@@ -3089,7 +3288,9 @@
3012 }
3013
3014}
+
3015
+
3016int getVariation( int V, std::minstd_rand0& generator, bool positive ){
3017
3018 if ( positive ) {
@@ -3101,7 +3302,9 @@
3024 }
3025
3026}
+
3027
+
3028uint getVariation( uint V, std::minstd_rand0& generator ){
3029
3030 std::uniform_int_distribution<> unif_distribution(0,V);
@@ -3109,6 +3312,7 @@
3032 return static_cast<uint>(unif_distribution(generator));
3033
3034}
+
3035
3036float CanopyGenerator::sampleLeafAngle(const std::vector<float> &leafAngleDist ){
3037
@@ -3180,6 +3384,7 @@
3103 }
3104}
3105
+
3106std::vector<uint> CanopyGenerator::getTrunkUUIDs(uint PlantID ){
3107 if( PlantID>=UUID_trunk.size() ){
3108 throw( std::runtime_error("ERROR (CanopyGenerator::getTrunkUUIDs): Cannot get UUIDs for plant " + std::to_string(PlantID) + " because only " + std::to_string(UUID_trunk.size()) + " plants have been built.") );
@@ -3190,13 +3395,17 @@
3113 return UUID_trunk.at(PlantID);
3114
3115}
+
3116
+
3118 std::vector<uint> UUID_flat = flatten( UUID_trunk );
3119 cleanDeletedUUIDs(UUID_flat);
3120 return UUID_flat;
3121}
+
3122
+
3123std::vector<uint> CanopyGenerator::getBranchUUIDs(uint PlantID ){
3124 if( PlantID>=UUID_branch.size() ){
3125 throw(std::runtime_error("ERROR (CanopyGenerator::getBranchUUIDs): Cannot get UUIDs for plant " + std::to_string(PlantID) + " because only " + std::to_string(UUID_branch.size()) + " plants have been built."));
@@ -3207,13 +3416,17 @@
3130 return UUID_branch.at(PlantID);
3131
3132}
+
3133
+
3135 std::vector<uint> UUID_flat = flatten( UUID_branch );
3136 cleanDeletedUUIDs(UUID_flat);
3137 return UUID_flat;
3138}
+
3139
+
3140std::vector<std::vector<uint> > CanopyGenerator::getLeafUUIDs(uint PlantID ){
3141 if( PlantID>=UUID_leaf.size() ){
3142 throw(std::runtime_error("ERROR (CanopyGenerator::getLeafUUIDs): Cannot get UUIDs for plant " + std::to_string(PlantID) + " because only " + std::to_string(UUID_leaf.size()) + " plants have been built."));
@@ -3223,13 +3436,17 @@
3146
3147 return UUID_leaf.at(PlantID);
3148}
+
3149
+
3151 std::vector<uint> UUID_flat = flatten( UUID_leaf );
3152 cleanDeletedUUIDs(UUID_flat);
3153 return UUID_flat;
3154}
+
3155
+
3156std::vector<std::vector<std::vector<uint> > > CanopyGenerator::getFruitUUIDs(uint PlantID ){
3157 if( PlantID>=UUID_fruit.size() ){
3158 throw(std::runtime_error("ERROR (CanopyGenerator::getFruitUUIDs): Cannot get UUIDs for plant " + std::to_string(PlantID) + " because only " + std::to_string(UUID_fruit.size()) + " plants have been built."));
@@ -3240,7 +3457,9 @@
3163 return UUID_fruit.at(PlantID);
3164
3165}
+
3166
+
3168
3169 std::vector<uint> UUIDs_flat, U;
@@ -3253,7 +3472,9 @@
3176 cleanDeletedUUIDs(UUIDs_flat);
3177 return UUIDs_flat;
3178}
+
3179
+
3181
3182 std::vector<uint> UUID;
@@ -3269,7 +3490,9 @@
3192 return UUID;
3193
3194}
+
3195
+
3196std::vector<uint> CanopyGenerator::getAllUUIDs(uint PlantID ){
3197 std::vector<uint> UUIDs;
3198 if( UUID_trunk.size()>PlantID ){
@@ -3295,36 +3518,50 @@
3218
3219 return UUIDs;
3220}
+
3221
+
3223 return UUID_leaf.size();
3224}
+
3225
+
3227 generator.seed(seed);
3228}
+
3229
+
3231 printmessages=false;
3232}
+
3233
+
3235 printmessages=true;
3236}
+
3237
+
3239 for (const auto& params : canopy_parameters_list) {
3240 params->buildPlant(*this, position);
3241 }
3242}
+
3243
+
3245 for (const auto& params : canopy_parameters_list) {
3246 vec3 position = params->canopy_origin;
3247 params->buildPlant(*this, position);
3248 }
3249}
+
3250
+
3251helios::vec3 interpolateTube(const std::vector<vec3> &P, float frac ){
3252
3253 assert( frac>=0 && frac<=1 );
@@ -3359,7 +3596,9 @@
3282 return P.front();
3283
3284}
+
3285
+
3286float interpolateTube(const std::vector<float> &P, float frac ){
3287
3288 assert( frac>=0 && frac<=1 );
@@ -3394,7 +3633,9 @@
3317 return P.front();
3318
3319}
+
3320
+
3321float evaluateCDFresid(float thetaL, std::vector<float> &ru_v, const void *a_distribution) {
3322
3323 assert(!ru_v.empty());
@@ -3418,6 +3659,7 @@
3341 return CDFresid;
3342
3343}
+
3344
3345float CanopyGenerator::sampleLeafPDF( const char* distribution ){
3346
@@ -3445,391 +3687,396 @@
3368
3369}
3370
+
3372 enable_element_labels = true;
3373}
+
3374
+
3376 enable_element_labels = false;
3377}
-
float evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution)
Evaluate the error between a predicted and actual leaf angle cumulative distribution at a given leaf ...
-
helios::vec3 interpolateTube(const std::vector< vec3 > &P, float frac)
Interpolate the position of a point along a tube.
-
float getVariation(float V, std::minstd_rand0 &generator, bool positive)
Draw a random number (float) from a uniform distribution between -V and V.
+
+
float evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution)
Evaluate the error between a predicted and actual leaf angle cumulative distribution at a given leaf ...
+
helios::vec3 interpolateTube(const std::vector< vec3 > &P, float frac)
Interpolate the position of a point along a tube.
+
float getVariation(float V, std::minstd_rand0 &generator, bool positive)
Draw a random number (float) from a uniform distribution between -V and V.
-
float evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution)
Evaluate the error between a predicted and actual leaf angle cumulative distribution at a given leaf ...
-
float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
Draw a random number (float) from a uniform distribution between -V and V.
- -
uint whitespruce(const WhiteSpruceCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual white spruce tree.
Definition: whitespruce.cpp:6
-
void buildCanopy(const HomogeneousCanopyParameters &params)
Build a canopy consisting of a homogeneous volume of leaves.
-
void storeCanopyParameters(Args &&... args)
Stores the given canopy parameters.
-
uint sorghum(const SorghumCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual sorghum plant.
Definition: sorghum.cpp:8
-
std::vector< std::vector< uint > > getLeafUUIDs(uint PlantID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the plant leaves.
-
void enableMessages()
Enable standard messages to be printed to screen (default is to enable messages)
-
std::vector< uint > getTrunkUUIDs()
Get the unique universal identifiers (UUIDs) for all trunk primitives in a single 1D vector.
-
uint tomato(const TomatoParameters &params, const helios::vec3 &origin)
Function to add an individual tomato plant.
Definition: tomato.cpp:139
-
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)
Build a ground consisting of texture sub-tiles and sub-patches, which can be different sizes.
-
uint strawberry(const StrawberryParameters &params, const helios::vec3 &origin)
Function to add an individual strawberry plant.
Definition: strawberry.cpp:215
-
std::vector< uint > getGroundUUIDs()
Get the unique universal identifiers (UUIDs) for the primitives that make up the ground.
-
std::vector< uint > getLeafUUIDs()
Get the unique universal identifiers (UUIDs) for all leaf primitives in a single 1D vector.
-
std::vector< uint > getBranchUUIDs()
Get the unique universal identifiers (UUIDs) for all branch primitives in a single 1D vector.
-
void buildCanopies()
Builds canopies for all the stored canopy parameters.
-
uint grapevineSplit(const SplitGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a split trellis.
Definition: grapevine.cpp:464
-
std::vector< uint > getAllUUIDs(uint PlantID)
Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
-
uint grapevineGoblet(const GobletGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a goblet (vent a taille) trellis.
Definition: grapevine.cpp:1065
-
void disableElementLabels()
Toggle off primitive data element type labels.
-
void loadXML(const char *filename, bool build=true)
Reads the XML file of the given name and stores all the configured canopy parameters.
-
uint grapevineUnilateral(const UnilateralGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a unilateral trellis.
Definition: grapevine.cpp:830
-
void disableMessages()
Disable standard messages from being printed to screen (default is to enable messages)
-
uint grapevineVSP(const VSPGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a vertical shoot positioned (VSP) trellis.
Definition: grapevine.cpp:150
-
uint getPlantCount()
Get the current number of plants added to the Canopy Generator.
-
std::vector< uint > getFruitUUIDs()
Get the unique universal identifiers (UUIDs) for all fruit primitives in a single 1D vector.
-
CanopyGenerator(helios::Context *context)
Canopy geometry generator constructor.
-
void seedRandomGenerator(uint seed)
Seed the random number generator. This can be useful for generating repeatable trees,...
-
uint bean(const BeanParameters &params, const helios::vec3 &origin)
Function to add an individual bean plant.
Definition: bean.cpp:291
-
void buildIndividualPlants()
Builds individual plants based on the stored canopy parameters (using canopy_origin as the position)
-
void createElementLabels()
Create primitive data that explicitly labels all primitives according to the plant element they corre...
-
int selfTest()
Unit testing routine.
-
uint walnut(const WalnutCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual walnut tree.
Definition: walnut.cpp:333
-
void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
Method to rotate a Compound Object about the x-, y-, or z-axis.
Definition: Context.cpp:2377
-
void translate(const helios::vec3 &shift)
Method to translate/shift a Compound Object.
Definition: Context.cpp:2353
-
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition: Context.cpp:2256
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition: Context.cpp:2642
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition: Context.cpp:2574
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition: Context.cpp:2609
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
Texture map data structure.
Definition: Context.h:67
-
float getSolidFraction() const
Get the solid fraction of the texture transparency channel (if it exists)
Definition: Context.cpp:145
-
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition: global.cpp:140
-
helios::RGBAcolor XMLloadrgba(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into an RGBA color vector.
Definition: global.cpp:2962
-
helios::vec2 XMLloadvec2(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a vec2.
Definition: global.cpp:2857
-
float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
Use Newton-Raphson method to find the zero of a function.
Definition: global.cpp:2977
-
int XMLloadint(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into an int.
Definition: global.cpp:2825
-
float XMLloadfloat(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a float.
Definition: global.cpp:2808
-
std::string XMLloadstring(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a string.
Definition: global.cpp:2842
-
helios::vec3 XMLloadvec3(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a vec3.
Definition: global.cpp:2872
-
helios::int2 XMLloadint2(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a vec2.
Definition: global.cpp:2902
-
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:5809
-
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:4550
-
std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
Function to flatten a 2D int vector into a 1D vector.
Definition: global.cpp:1943
-
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:241
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
Base struct class for Canopy parameters.
-
helios::vec3 canopy_origin
Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places th...
-
BaseCanopyParameters()
Default constructor.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float canopy_rotation
Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal t...
- -
float plant_spacing
Spacing between adjacent plants along the row direction.
-
float shoot_radius_spread
Spread value for the shoot radius. With any new canopy or plant generation, the shoot radius would be...
-
float missing_plant_probability
Probability for a plant to be missing.
-
float dead_probability
Probability for a plant to be dead, i.e. without any leaves or grapes.
-
float cluster_radius
Maximum horizontal radius of grape clusters.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float cluster_height_max
Maximum height of grape clusters along the shoot as a fraction of the total shoot length.
-
BaseGrapeVineParameters()
Default constructor.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
float leaf_spacing_fraction_spread
Spread value for the leaf spacing fraction. With any new canopy or plant generation,...
-
int wood_subdivisions
Number of radial subdivisions for trunk/cordon/shoot tubes.
-
float row_spacing
Spacing between plant rows.
-
uint grape_subdivisions
Number of azimuthal and zenithal subdivisions making up berries (will result in roughly 2*(grape_subd...
-
float plant_spacing_spread
Spread value for the plant spacing. The spacing between adjacent plants along a row would vary betwee...
-
float shoot_length_spread
Spread value for the shoot length. With any new canopy or plant generation, the shoot length would be...
-
float leaf_spacing_fraction
Spacing between adjacent leaves as a fraction of the local leaf width. E.g., leaf_spacing_fraction = ...
-
float trunk_height_spread
Spread value for the trunk height. With any new canopy or plant generation, the trunk height would be...
-
uint shoots_per_cordon_spread
Spread value for the number of shoots per cordon. With any new canopy or plant generation,...
-
float cordon_radius
Radius of cordon branches.
-
float trunk_radius_spread
Spread value for the trunk radius. With any new canopy or plant generation, the trunk radius would be...
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
float leaf_width
Maximum width of leaves. Leaf width increases logarithmically from the shoot tip, so leaf_width is th...
-
float cordon_height_spread
Spread value for the cordon height. With any new canopy or plant generation, the cordon height would ...
-
float canopy_rotation_spread
Spread value for the canopy rotation. With any new canopy or plant generation, the canopy/plant rotat...
-
int wood_subdivisions_spread
Spread value for the number of wood subdivisions. With any new canopy or plant generation,...
-
uint shoots_per_cordon
Number of shoots on each cordon.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float trunk_height
Distance between the ground and top of trunks.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
float shoot_length
Length of shoots.
-
float cluster_height_max_spread
Spread value for the cluster height. With any new canopy or plant generation, the cluster height woul...
-
uint grape_subdivisions_spread
Spread value for the number of grape subdivisions. With any new canopy or plant generation,...
-
float trunk_radius
Radius of the trunk at the widest point.
-
float shoot_radius
Radius of shoot branches.
-
float cordon_length
Length of the cordons. By default, half the plant spacing.
-
float cluster_radius_spread
Spread value for the cluster radius. With any new canopy or plant generation, the cluster radius woul...
-
helios::RGBcolor grape_color
Color of grapes.
-
float cordon_radius_spread
Spread value for the cordon radius. With any new canopy or plant generation, the cordon radius would ...
-
float leaf_width_spread
Spread value for the maximum leaf width. With any new canopy or plant generation, the maximum leaf wi...
-
float grape_radius_spread
Spread value for the grape radius. With any new canopy or plant generation, the grape radius would be...
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
float row_spacing_spread
Spread value for the row spacing. This allows to vary the alignment of plants along a row....
-
float cordon_height
Distance between the ground and cordon. Note - must be greater than or equal to the trunk height.
-
std::string wood_texture_file
Path to texture map file for trunks/branches.
-
float grape_radius
Radius of grape berries.
-
float cordon_length_spread
Spread value for the cordon length. With any new canopy or plant generation, the cordon length would ...
-
Parameters defining the bean plant canopy.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
float leaflet_length
Length of the leaflet from base to tip leaf.
-
float pod_length
Length of bean pods.
-
float leaf_length
Maximum width of leaves.
-
BeanParameters()
Default constructor.
-
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
-
helios::RGBcolor pod_color
Color of bean pods.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
float stem_length
Length of stems before splitting to leaflets.
-
uint pod_subdivisions
Number of lengthwise subdivisions making up pods.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
float stem_radius
Radius of main stem at base.
-
float germination_probability
Probability that a plant in the canopy germinated.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
helios::RGBcolor shoot_color
Color of shoots.
-
float row_spacing
Spacing between plant rows.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
Parameters defining the canopy with conical crowns.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
-
ConicalCrownsCanopyParameters()
Default constructor.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
-
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
-
float crown_height
Height of the conical crowns.
-
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
-
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
-
float crown_radius
Radius of the conical crowns at the base.
-
float leaf_area_density
One-sided leaf area density within spherical crowns.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
Parameters defining the grapevine canopy with goblet (vent a taille) trellis.
-
GobletGrapevineParameters()
Default constructor.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
Parameters defining the homogeneous canopy.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
std::string buffer
String specifying whether leaves should be placed so that leaf edges do not fall outside the specifie...
-
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
-
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
helios::vec2 canopy_extent
Horizontal extent of the canopy in the x- and y-directions.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
float canopy_height
Height of the canopy.
-
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
-
HomogeneousCanopyParameters()
Default constructor.
-
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
-
float leaf_area_index
One-sided leaf area index of the canopy.
-
Parameters defining Sorghum plant canopy.
-
int s5_stem_subdivisions
Number of stem radial subdivisions for stage 5.
-
float s2_stem_subdivisions
Number of stem radial subdivisions for stage 2.
-
float s1_leaf1_angle
Leaf1 vertical angle of rotation for stage 1.
-
float s5_stem_length
Length of the sorghum stem for stage 5.
-
std::string s4_seed_texture_file
Texture map of the panicle for stage 4.
-
int s5_number_of_leaves
Number of leaves for the sorghum plant, stage 5.
-
float s5_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 5 in degrees; Standard deviation for the angle is 1...
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
float s4_stem_length
Length of the sorghum stem for stage 4.
-
helios::int2 s3_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 3.
-
std::string s1_leaf_texture_file
Texture map for sorghum leaf1 for stage 1.
-
helios::vec2 s1_leaf_size2
Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
-
float s4_stem_radius
Radius of the sorghum stem for stage 4.
-
float s3_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 3 in degrees; Standard deviation for the leaves is ...
-
float s4_stem_subdivisions
Number of stem radial subdivisions for stage 4.
-
float s2_leaf1_angle
Leaf1 vertical angle of rotation for stage 2.
-
std::string s2_leaf_texture_file
Texture map for sorghum leaf for stage 2.
-
int s5_panicle_subdivisions
Number of panicle subdivisions for each grain sphere within a panicle, stage 5.
-
float s2_leaf4_angle
Leaf4 vertical angle of rotation for stage 2.
-
float s4_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 4 in degrees; Standard deviation for the angle is 5...
-
float s2_leaf5_angle
Leaf5 vertical angle of rotation for stage 2.
-
helios::int2 s2_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 2.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
helios::vec2 s4_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 4.
-
float s2_leaf3_angle
Leaf3 vertical angle of rotation for stage 2.
-
helios::int2 s4_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 4.
-
float s2_stem_radius
Radius of the sorghum stem for stage 2.
-
SorghumCanopyParameters()
Default constructor.
-
float s5_stem_bend
Bend of the stem from mid-section for stage 5. The distance from the mid-section of the stem to the i...
-
helios::vec2 s1_leaf_size1
Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float s5_stem_radius
Radius of the sorghum stem for stage 5.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
float s3_stem_radius
Radius of the sorghum stem for stage 3.
-
std::string s5_leaf_texture_file
Texture map for sorghum leaf, stage 5.
-
helios::int2 s5_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 5.
-
helios::vec2 s1_leaf_size3
Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
-
int s4_number_of_leaves
Number of leaves for the sorghum plant, stage 4.
-
int s4_panicle_subdivisions
Number of panicle subdivisions for each grain sphere within a panicle, stage 4.
-
float s3_stem_length
Length of the sorghum stem for stage 3.
-
std::string s3_leaf_texture_file
Texture map for sorghum leaf for stage 3.
-
helios::vec2 s2_leaf_size3
Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
float s1_stem_radius
Radius of the sorghum stem for stage 1.
-
helios::vec2 s5_panicle_size
Size of panicle in x- and y- directions for stage 5.
-
int s3_number_of_leaves
Number of leaves along the stem for stage 3.
-
helios::vec2 s2_leaf_size5
Length of leaf5 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
helios::vec2 s5_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 5.
-
float s1_stem_subdivisions
Number of stem radial subdivisions for stage 1.
-
helios::vec2 s2_leaf_size4
Length of leaf4 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
helios::int2 s1_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 1.
-
std::string s4_leaf_texture_file
Texture map for sorghum leaf, stage 4.
-
helios::vec2 s2_leaf_size2
Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
float row_spacing
Spacing between plant rows.
-
helios::vec2 s3_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 3.
-
float s2_stem_length
Length of the sorghum stem for stage 2.
-
float s1_leaf2_angle
Leaf2 vertical angle of rotation for stage 1.
-
float s3_stem_subdivisions
Number of stem radial subdivisions for stage 3.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float s1_stem_length
Length of the sorghum stem for stage 1.
-
int sorghum_stage
Sorghum categorized into 5 stages; 1 - Three leaf stage, 2 - Five leaf stage, 3 - Panicle initiation ...
-
float s1_leaf3_angle
Leaf3 vertical angle of rotation for stage 1.
-
helios::vec2 s2_leaf_size1
Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
std::string s5_seed_texture_file
Texture map of the panicle for stage 5.
-
helios::vec2 s4_panicle_size
Size of panicle in x- and y- directions for stage 4.
-
float s2_leaf2_angle
Leaf2 vertical angle of rotation for stage 2.
-
Parameters defining the canopy with spherical crowns.
-
helios::vec3 crown_radius
Radius of the spherical crowns.
-
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
-
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
-
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
-
SphericalCrownsCanopyParameters()
Default constructor.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
-
float leaf_area_density
One-sided leaf area density within spherical crowns.
-
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
Parameters defining the grapevine canopy with a split (quad) trellis.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float shoot_angle_base_spread
Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle ...
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float shoot_angle_base
Average angle of the shoot at the base (shoot_angle_base=0 points shoots upward; shoot_angle_base=M_P...
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
SplitGrapevineParameters()
Default constructor.
-
float cordon_spacing
Spacing between two opposite cordons.
-
float cordon_spacing_spread
Spread value for the cordon spacing. With any new canopy or plant generation, the cordon spacing woul...
-
float shoot_angle_tip_spread
Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle ...
-
float shoot_angle_tip
Average angle of the shoot at the tip (shoot_angle=0 is a completely vertical shoot; shoot_angle=M_PI...
-
Parameters defining the strawberry plant canopy.
-
int stem_subdivisions
Number of radial subdivisions for stem tubes.
-
int stems_per_plant
Number of stems per plant.
-
float fruit_radius
Radius of strawberry fruit.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
StrawberryParameters()
Default constructor.
-
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
float plant_height
Height of the plant.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
std::string fruit_texture_file
Texture map for strawberry fruit.
-
float clusters_per_stem
Number of strawberry clusters per plant stem. Clusters randomly have 1, 2, or 3 berries.
-
float stem_radius
Radius of stems.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
float row_spacing
Spacing between plant rows.
-
helios::RGBcolor stem_color
Color of stems.
-
float leaf_length
Maximum width of leaves.
-
Parameters defining the tomato plant canopy.
-
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
float leaf_length
Maximum width of leaves.
-
helios::RGBcolor fruit_color
Color of tomato fruit.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
-
helios::RGBcolor shoot_color
Color of shoots.
-
float row_spacing
Spacing between plant rows.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
TomatoParameters()
Default constructor.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float plant_height
Height of the plant.
-
float fruit_radius
Radius of tomato fruit.
-
Parameters defining the grapevine canopy with unilateral trellis.
-
UnilateralGrapevineParameters()
Default constructor.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
Parameters defining the grapevine canopy with vertical shoot positioned (VSP) trellis.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
VSPGrapevineParameters()
Default constructor.
-
Parameters defining the walnut tree canopy.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
int wood_subdivisions
Number of radial subdivisions for branch tubes.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
WalnutCanopyParameters()
Default constructor.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
std::string fruit_texture_file
Texture map for walnut fruit.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
-
float trunk_radius
Radius of trunk.
-
float fruit_radius
Radius of walnuts.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
float leaf_length
Maximum length of leaves along midrib.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
std::string wood_texture_file
Path to texture map file for wood/branches.
-
helios::vec3 branch_length
Average length of branches in each recursive branch level. For example, the first (....
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float trunk_height
Height of the trunk.
-
float row_spacing
Spacing between plant rows.
-
Parameters defining the white spruce.
-
float needle_width
Width of needles.
-
helios::int2 needle_subdivisions
Number of sub-division segments per needle.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
std::string wood_texture_file
Path to texture map file for trunks/branches.
-
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
-
float needle_length
Length of needles.
-
float trunk_height
Distance between the ground and top of trunks.
-
float level_spacing
Vertical spacing between branching levels.
-
float shoot_radius
Radius of shoot branches.
-
int wood_subdivisions
Number of radial subdivisions for trunk/cordon/shoot tubes.
-
float shoot_angle
Maximum shoot angle.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
float base_height
Height at which branches start.
-
float crown_radius
Radius of the crown at the base.
-
helios::RGBcolor needle_color
Color of needles.
-
float trunk_radius
Radius of the trunk at the base.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
WhiteSpruceCanopyParameters()
Default constructor.
-
int branches_per_level
Number of primary branches on the bottom level.
-
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
-
R-G-B-A color vector.
-
float r
Red color component.
-
float a
Alpha (transparency) component.
-
float b
Blue color component.
-
float g
Green color component.
-
Vector of spherical coordinates (elevation,azimuth)
-
const float & elevation
Elevation angle (radians)
-
float azimuth
Azimuthal angle (radians)
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
+
float evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution)
Evaluate the error between a predicted and actual leaf angle cumulative distribution at a given leaf ...
+
float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
Draw a random number (float) from a uniform distribution between -V and V.
+ +
uint whitespruce(const WhiteSpruceCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual white spruce tree.
+
void buildCanopy(const HomogeneousCanopyParameters &params)
Build a canopy consisting of a homogeneous volume of leaves.
+
void storeCanopyParameters(Args &&... args)
Stores the given canopy parameters.
+
uint sorghum(const SorghumCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual sorghum plant.
Definition sorghum.cpp:8
+
std::vector< std::vector< uint > > getLeafUUIDs(uint PlantID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the plant leaves.
+
void enableMessages()
Enable standard messages to be printed to screen (default is to enable messages)
+
std::vector< uint > getTrunkUUIDs()
Get the unique universal identifiers (UUIDs) for all trunk primitives in a single 1D vector.
+
uint tomato(const TomatoParameters &params, const helios::vec3 &origin)
Function to add an individual tomato plant.
Definition tomato.cpp:139
+
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)
Build a ground consisting of texture sub-tiles and sub-patches, which can be different sizes.
+
uint strawberry(const StrawberryParameters &params, const helios::vec3 &origin)
Function to add an individual strawberry plant.
+
std::vector< uint > getGroundUUIDs()
Get the unique universal identifiers (UUIDs) for the primitives that make up the ground.
+
std::vector< uint > getLeafUUIDs()
Get the unique universal identifiers (UUIDs) for all leaf primitives in a single 1D vector.
+
std::vector< uint > getBranchUUIDs()
Get the unique universal identifiers (UUIDs) for all branch primitives in a single 1D vector.
+
void buildCanopies()
Builds canopies for all the stored canopy parameters.
+
uint grapevineSplit(const SplitGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a split trellis.
+
std::vector< uint > getAllUUIDs(uint PlantID)
Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
+
uint grapevineGoblet(const GobletGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a goblet (vent a taille) trellis.
+
void disableElementLabels()
Toggle off primitive data element type labels.
+
void loadXML(const char *filename, bool build=true)
Reads the XML file of the given name and stores all the configured canopy parameters.
+
uint grapevineUnilateral(const UnilateralGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a unilateral trellis.
+
void disableMessages()
Disable standard messages from being printed to screen (default is to enable messages)
+
uint grapevineVSP(const VSPGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a vertical shoot positioned (VSP) trellis.
+
uint getPlantCount()
Get the current number of plants added to the Canopy Generator.
+
std::vector< uint > getFruitUUIDs()
Get the unique universal identifiers (UUIDs) for all fruit primitives in a single 1D vector.
+
CanopyGenerator(helios::Context *context)
Canopy geometry generator constructor.
+
void seedRandomGenerator(uint seed)
Seed the random number generator. This can be useful for generating repeatable trees,...
+
uint bean(const BeanParameters &params, const helios::vec3 &origin)
Function to add an individual bean plant.
Definition bean.cpp:291
+
void buildIndividualPlants()
Builds individual plants based on the stored canopy parameters (using canopy_origin as the position)
+
void createElementLabels()
Create primitive data that explicitly labels all primitives according to the plant element they corre...
+
int selfTest()
Unit testing routine.
+
uint walnut(const WalnutCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual walnut tree.
Definition walnut.cpp:333
+
void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
Method to rotate a Compound Object about the x-, y-, or z-axis.
Definition Context.cpp:2377
+
void translate(const helios::vec3 &shift)
Method to translate/shift a Compound Object.
Definition Context.cpp:2353
+
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition Context.cpp:2256
+
Stores the state associated with simulation.
Definition Context.h:1882
+
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition Context.cpp:2642
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition Context.cpp:2574
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition Context.cpp:2609
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
Texture map data structure.
Definition Context.h:67
+
float getSolidFraction() const
Get the solid fraction of the texture transparency channel (if it exists)
Definition Context.cpp:145
+
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition global.cpp:140
+
helios::RGBAcolor XMLloadrgba(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into an RGBA color vector.
Definition global.cpp:2962
+
helios::vec2 XMLloadvec2(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a vec2.
Definition global.cpp:2857
+
float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
Use Newton-Raphson method to find the zero of a function.
Definition global.cpp:2977
+
int XMLloadint(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into an int.
Definition global.cpp:2825
+
float XMLloadfloat(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a float.
Definition global.cpp:2808
+
std::string XMLloadstring(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a string.
Definition global.cpp:2842
+
helios::vec3 XMLloadvec3(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a vec3.
Definition global.cpp:2872
+
helios::int2 XMLloadint2(pugi::xml_node node, const char *field)
Function to load and convert a field in a pugi XML node into a vec2.
Definition global.cpp:2902
+
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:5809
+
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:4550
+
std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
Function to flatten a 2D int vector into a 1D vector.
Definition global.cpp:1943
+
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:241
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
Base struct class for Canopy parameters.
+
helios::vec3 canopy_origin
Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places th...
+
BaseCanopyParameters()
Default constructor.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float canopy_rotation
Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal t...
+ +
float plant_spacing
Spacing between adjacent plants along the row direction.
+
float shoot_radius_spread
Spread value for the shoot radius. With any new canopy or plant generation, the shoot radius would be...
+
float missing_plant_probability
Probability for a plant to be missing.
+
float dead_probability
Probability for a plant to be dead, i.e. without any leaves or grapes.
+
float cluster_radius
Maximum horizontal radius of grape clusters.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float cluster_height_max
Maximum height of grape clusters along the shoot as a fraction of the total shoot length.
+
BaseGrapeVineParameters()
Default constructor.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
float leaf_spacing_fraction_spread
Spread value for the leaf spacing fraction. With any new canopy or plant generation,...
+
int wood_subdivisions
Number of radial subdivisions for trunk/cordon/shoot tubes.
+
float row_spacing
Spacing between plant rows.
+
uint grape_subdivisions
Number of azimuthal and zenithal subdivisions making up berries (will result in roughly 2*(grape_subd...
+
float plant_spacing_spread
Spread value for the plant spacing. The spacing between adjacent plants along a row would vary betwee...
+
float shoot_length_spread
Spread value for the shoot length. With any new canopy or plant generation, the shoot length would be...
+
float leaf_spacing_fraction
Spacing between adjacent leaves as a fraction of the local leaf width. E.g., leaf_spacing_fraction = ...
+
float trunk_height_spread
Spread value for the trunk height. With any new canopy or plant generation, the trunk height would be...
+
uint shoots_per_cordon_spread
Spread value for the number of shoots per cordon. With any new canopy or plant generation,...
+
float cordon_radius
Radius of cordon branches.
+
float trunk_radius_spread
Spread value for the trunk radius. With any new canopy or plant generation, the trunk radius would be...
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
float leaf_width
Maximum width of leaves. Leaf width increases logarithmically from the shoot tip, so leaf_width is th...
+
float cordon_height_spread
Spread value for the cordon height. With any new canopy or plant generation, the cordon height would ...
+
float canopy_rotation_spread
Spread value for the canopy rotation. With any new canopy or plant generation, the canopy/plant rotat...
+
int wood_subdivisions_spread
Spread value for the number of wood subdivisions. With any new canopy or plant generation,...
+
uint shoots_per_cordon
Number of shoots on each cordon.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float trunk_height
Distance between the ground and top of trunks.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
float shoot_length
Length of shoots.
+
float cluster_height_max_spread
Spread value for the cluster height. With any new canopy or plant generation, the cluster height woul...
+
uint grape_subdivisions_spread
Spread value for the number of grape subdivisions. With any new canopy or plant generation,...
+
float trunk_radius
Radius of the trunk at the widest point.
+
float shoot_radius
Radius of shoot branches.
+
float cordon_length
Length of the cordons. By default, half the plant spacing.
+
float cluster_radius_spread
Spread value for the cluster radius. With any new canopy or plant generation, the cluster radius woul...
+
helios::RGBcolor grape_color
Color of grapes.
+
float cordon_radius_spread
Spread value for the cordon radius. With any new canopy or plant generation, the cordon radius would ...
+
float leaf_width_spread
Spread value for the maximum leaf width. With any new canopy or plant generation, the maximum leaf wi...
+
float grape_radius_spread
Spread value for the grape radius. With any new canopy or plant generation, the grape radius would be...
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
float row_spacing_spread
Spread value for the row spacing. This allows to vary the alignment of plants along a row....
+
float cordon_height
Distance between the ground and cordon. Note - must be greater than or equal to the trunk height.
+
std::string wood_texture_file
Path to texture map file for trunks/branches.
+
float grape_radius
Radius of grape berries.
+
float cordon_length_spread
Spread value for the cordon length. With any new canopy or plant generation, the cordon length would ...
+
Parameters defining the bean plant canopy.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
float leaflet_length
Length of the leaflet from base to tip leaf.
+
float pod_length
Length of bean pods.
+
float leaf_length
Maximum width of leaves.
+
BeanParameters()
Default constructor.
+
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
+
helios::RGBcolor pod_color
Color of bean pods.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
float stem_length
Length of stems before splitting to leaflets.
+
uint pod_subdivisions
Number of lengthwise subdivisions making up pods.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
float stem_radius
Radius of main stem at base.
+
float germination_probability
Probability that a plant in the canopy germinated.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
helios::RGBcolor shoot_color
Color of shoots.
+
float row_spacing
Spacing between plant rows.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
Parameters defining the canopy with conical crowns.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
+
ConicalCrownsCanopyParameters()
Default constructor.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
+
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
+
float crown_height
Height of the conical crowns.
+
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
+
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
+
float crown_radius
Radius of the conical crowns at the base.
+
float leaf_area_density
One-sided leaf area density within spherical crowns.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
Parameters defining the grapevine canopy with goblet (vent a taille) trellis.
+
GobletGrapevineParameters()
Default constructor.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
Parameters defining the homogeneous canopy.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
std::string buffer
String specifying whether leaves should be placed so that leaf edges do not fall outside the specifie...
+
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
+
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
helios::vec2 canopy_extent
Horizontal extent of the canopy in the x- and y-directions.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
float canopy_height
Height of the canopy.
+
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
+
HomogeneousCanopyParameters()
Default constructor.
+
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
+
float leaf_area_index
One-sided leaf area index of the canopy.
+
Parameters defining Sorghum plant canopy.
+
int s5_stem_subdivisions
Number of stem radial subdivisions for stage 5.
+
float s2_stem_subdivisions
Number of stem radial subdivisions for stage 2.
+
float s1_leaf1_angle
Leaf1 vertical angle of rotation for stage 1.
+
float s5_stem_length
Length of the sorghum stem for stage 5.
+
std::string s4_seed_texture_file
Texture map of the panicle for stage 4.
+
int s5_number_of_leaves
Number of leaves for the sorghum plant, stage 5.
+
float s5_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 5 in degrees; Standard deviation for the angle is 1...
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
float s4_stem_length
Length of the sorghum stem for stage 4.
+
helios::int2 s3_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 3.
+
std::string s1_leaf_texture_file
Texture map for sorghum leaf1 for stage 1.
+
helios::vec2 s1_leaf_size2
Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
+
float s4_stem_radius
Radius of the sorghum stem for stage 4.
+
float s3_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 3 in degrees; Standard deviation for the leaves is ...
+
float s4_stem_subdivisions
Number of stem radial subdivisions for stage 4.
+
float s2_leaf1_angle
Leaf1 vertical angle of rotation for stage 2.
+
std::string s2_leaf_texture_file
Texture map for sorghum leaf for stage 2.
+
int s5_panicle_subdivisions
Number of panicle subdivisions for each grain sphere within a panicle, stage 5.
+
float s2_leaf4_angle
Leaf4 vertical angle of rotation for stage 2.
+
float s4_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 4 in degrees; Standard deviation for the angle is 5...
+
float s2_leaf5_angle
Leaf5 vertical angle of rotation for stage 2.
+
helios::int2 s2_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 2.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
helios::vec2 s4_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 4.
+
float s2_leaf3_angle
Leaf3 vertical angle of rotation for stage 2.
+
helios::int2 s4_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 4.
+
float s2_stem_radius
Radius of the sorghum stem for stage 2.
+
SorghumCanopyParameters()
Default constructor.
+
float s5_stem_bend
Bend of the stem from mid-section for stage 5. The distance from the mid-section of the stem to the i...
+
helios::vec2 s1_leaf_size1
Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float s5_stem_radius
Radius of the sorghum stem for stage 5.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
float s3_stem_radius
Radius of the sorghum stem for stage 3.
+
std::string s5_leaf_texture_file
Texture map for sorghum leaf, stage 5.
+
helios::int2 s5_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 5.
+
helios::vec2 s1_leaf_size3
Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
+
int s4_number_of_leaves
Number of leaves for the sorghum plant, stage 4.
+
int s4_panicle_subdivisions
Number of panicle subdivisions for each grain sphere within a panicle, stage 4.
+
float s3_stem_length
Length of the sorghum stem for stage 3.
+
std::string s3_leaf_texture_file
Texture map for sorghum leaf for stage 3.
+
helios::vec2 s2_leaf_size3
Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
float s1_stem_radius
Radius of the sorghum stem for stage 1.
+
helios::vec2 s5_panicle_size
Size of panicle in x- and y- directions for stage 5.
+
int s3_number_of_leaves
Number of leaves along the stem for stage 3.
+
helios::vec2 s2_leaf_size5
Length of leaf5 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
helios::vec2 s5_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 5.
+
float s1_stem_subdivisions
Number of stem radial subdivisions for stage 1.
+
helios::vec2 s2_leaf_size4
Length of leaf4 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
helios::int2 s1_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 1.
+
std::string s4_leaf_texture_file
Texture map for sorghum leaf, stage 4.
+
helios::vec2 s2_leaf_size2
Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
float row_spacing
Spacing between plant rows.
+
helios::vec2 s3_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 3.
+
float s2_stem_length
Length of the sorghum stem for stage 2.
+
float s1_leaf2_angle
Leaf2 vertical angle of rotation for stage 1.
+
float s3_stem_subdivisions
Number of stem radial subdivisions for stage 3.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float s1_stem_length
Length of the sorghum stem for stage 1.
+
int sorghum_stage
Sorghum categorized into 5 stages; 1 - Three leaf stage, 2 - Five leaf stage, 3 - Panicle initiation ...
+
float s1_leaf3_angle
Leaf3 vertical angle of rotation for stage 1.
+
helios::vec2 s2_leaf_size1
Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
std::string s5_seed_texture_file
Texture map of the panicle for stage 5.
+
helios::vec2 s4_panicle_size
Size of panicle in x- and y- directions for stage 4.
+
float s2_leaf2_angle
Leaf2 vertical angle of rotation for stage 2.
+
Parameters defining the canopy with spherical crowns.
+
helios::vec3 crown_radius
Radius of the spherical crowns.
+
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
+
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
+
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
+
SphericalCrownsCanopyParameters()
Default constructor.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
+
float leaf_area_density
One-sided leaf area density within spherical crowns.
+
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
Parameters defining the grapevine canopy with a split (quad) trellis.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float shoot_angle_base_spread
Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle ...
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float shoot_angle_base
Average angle of the shoot at the base (shoot_angle_base=0 points shoots upward; shoot_angle_base=M_P...
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
SplitGrapevineParameters()
Default constructor.
+
float cordon_spacing
Spacing between two opposite cordons.
+
float cordon_spacing_spread
Spread value for the cordon spacing. With any new canopy or plant generation, the cordon spacing woul...
+
float shoot_angle_tip_spread
Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle ...
+
float shoot_angle_tip
Average angle of the shoot at the tip (shoot_angle=0 is a completely vertical shoot; shoot_angle=M_PI...
+
Parameters defining the strawberry plant canopy.
+
int stem_subdivisions
Number of radial subdivisions for stem tubes.
+
int stems_per_plant
Number of stems per plant.
+
float fruit_radius
Radius of strawberry fruit.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
StrawberryParameters()
Default constructor.
+
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
float plant_height
Height of the plant.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
std::string fruit_texture_file
Texture map for strawberry fruit.
+
float clusters_per_stem
Number of strawberry clusters per plant stem. Clusters randomly have 1, 2, or 3 berries.
+
float stem_radius
Radius of stems.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
float row_spacing
Spacing between plant rows.
+
helios::RGBcolor stem_color
Color of stems.
+
float leaf_length
Maximum width of leaves.
+
Parameters defining the tomato plant canopy.
+
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
float leaf_length
Maximum width of leaves.
+
helios::RGBcolor fruit_color
Color of tomato fruit.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
+
helios::RGBcolor shoot_color
Color of shoots.
+
float row_spacing
Spacing between plant rows.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
TomatoParameters()
Default constructor.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float plant_height
Height of the plant.
+
float fruit_radius
Radius of tomato fruit.
+
Parameters defining the grapevine canopy with unilateral trellis.
+
UnilateralGrapevineParameters()
Default constructor.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
Parameters defining the grapevine canopy with vertical shoot positioned (VSP) trellis.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
VSPGrapevineParameters()
Default constructor.
+
Parameters defining the walnut tree canopy.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
int wood_subdivisions
Number of radial subdivisions for branch tubes.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
WalnutCanopyParameters()
Default constructor.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
std::string fruit_texture_file
Texture map for walnut fruit.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
+
float trunk_radius
Radius of trunk.
+
float fruit_radius
Radius of walnuts.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
float leaf_length
Maximum length of leaves along midrib.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
std::string wood_texture_file
Path to texture map file for wood/branches.
+
helios::vec3 branch_length
Average length of branches in each recursive branch level. For example, the first (....
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float trunk_height
Height of the trunk.
+
float row_spacing
Spacing between plant rows.
+
Parameters defining the white spruce.
+
float needle_width
Width of needles.
+
helios::int2 needle_subdivisions
Number of sub-division segments per needle.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
std::string wood_texture_file
Path to texture map file for trunks/branches.
+
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
+
float needle_length
Length of needles.
+
float trunk_height
Distance between the ground and top of trunks.
+
float level_spacing
Vertical spacing between branching levels.
+
float shoot_radius
Radius of shoot branches.
+
int wood_subdivisions
Number of radial subdivisions for trunk/cordon/shoot tubes.
+
float shoot_angle
Maximum shoot angle.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
float base_height
Height at which branches start.
+
float crown_radius
Radius of the crown at the base.
+
helios::RGBcolor needle_color
Color of needles.
+
float trunk_radius
Radius of the trunk at the base.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
WhiteSpruceCanopyParameters()
Default constructor.
+
int branches_per_level
Number of primary branches on the bottom level.
+
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
+
R-G-B-A color vector.
+
float r
Red color component.
+
float a
Alpha (transparency) component.
+
float b
Blue color component.
+
float g
Green color component.
+
Vector of spherical coordinates (elevation,azimuth)
+
const float & elevation
Elevation angle (radians)
+
float azimuth
Azimuthal angle (radians)
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+ diff --git a/doc/html/_canopy_generator_8h.html b/doc/html/_canopy_generator_8h.html index e2e895e8a..1d1c75d5c 100644 --- a/doc/html/_canopy_generator_8h.html +++ b/doc/html/_canopy_generator_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Data Structures | @@ -151,22 +163,22 @@ - + - + - + - + - + - +

Functions

float getVariation (float V, std::minstd_rand0 &generator, bool positive=false)
float getVariation (float V, std::minstd_rand0 &generator, bool positive=false)
 Draw a random number (float) from a uniform distribution between -V and V.
 
int getVariation (int V, std::minstd_rand0 &generator, bool positive=false)
int getVariation (int V, std::minstd_rand0 &generator, bool positive=false)
 Draw a random number (int) from a uniform distribution between -V and V.
 
uint getVariation (uint V, std::minstd_rand0 &generator)
uint getVariation (uint V, std::minstd_rand0 &generator)
 Draw a random number (uint) from a uniform distribution between 0 and V.
 
helios::vec3 interpolateTube (const std::vector< helios::vec3 > &P, float frac)
helios::vec3 interpolateTube (const std::vector< helios::vec3 > &P, float frac)
 Interpolate the position of a point along a tube.
 
float interpolateTube (const std::vector< float > &P, float frac)
float interpolateTube (const std::vector< float > &P, float frac)
 Interpolate the radius of a point along a tube.
 
float evaluateCDFresid (float thetaL, std::vector< float > &ru_v, const void *a_distribution)
float evaluateCDFresid (float thetaL, std::vector< float > &ru_v, const void *a_distribution)
 Evaluate the error between a predicted and actual leaf angle cumulative distribution at a given leaf angle.
 
@@ -187,25 +199,17 @@

float evaluateCDFresid ( - float  - thetaL, + float thetaL, - std::vector< float > &  - ru_v, + std::vector< float > & ru_v, - const void *  - a_distribution  - - - - ) - + const void * a_distribution )

@@ -403,19 +377,12 @@

helios::vec3 interpolateTube ( - const std::vector< helios::vec3 > &  - P, + const std::vector< helios::vec3 > & P, - float  - frac  - - - - ) - + float frac )

@@ -436,7 +403,8 @@

+

diff --git a/doc/html/_canopy_generator_8h_source.html b/doc/html/_canopy_generator_8h_source.html index 62f6cb7e1..19d1d5ad5 100644 --- a/doc/html/_canopy_generator_8h_source.html +++ b/doc/html/_canopy_generator_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
CanopyGenerator.h
@@ -101,6 +113,7 @@
21
22class CanopyGenerator;
23
+
26
@@ -121,7 +134,9 @@
54
55};
+
56
+
59
@@ -156,7 +171,9 @@
108 std::string buffer;
109
110};
+
111
+
114
@@ -193,7 +210,9 @@
166 std::vector<float> leaf_angle_PDF;
167
168};
+
169
+
172
@@ -232,7 +251,9 @@
227 std::vector<float> leaf_angle_PDF;
228
229};
+
230
+
371
+
374
@@ -334,7 +357,9 @@
393 void buildCanopy(CanopyGenerator& canopy_generator) override;
394
395};
+
396
+
436
+
439
@@ -373,8 +400,10 @@
458 void buildCanopy(CanopyGenerator& canopy_generator) override;
459
460};
+
461
462
+
465
@@ -389,7 +418,9 @@
484 void buildCanopy(CanopyGenerator& canopy_generator) override;
485
486};
+
487
+
563
+
566
@@ -477,7 +510,9 @@
622
623};
+
624
+
627
@@ -522,7 +557,9 @@
692
693};
+
694
+
762
+
765
@@ -707,14 +746,16 @@
969
970 // CANOPY
- +
973
976
979
980};
+
981
+
984
@@ -759,12 +800,14 @@
1049
1050};
+
1051
+
1053 public:
1054
1056
-
1059 explicit CanopyGenerator( helios::Context* context );
+
1059 explicit CanopyGenerator( helios::Context* context );
1060
1062 int selfTest();
1063
@@ -940,6 +983,7 @@
1399 void cleanDeletedUUIDs( std::vector<std::vector<std::vector<uint> > > &UUIDs );
1400
1401};
+
1402
1404
1409float getVariation( float V, std::minstd_rand0& generator, bool positive = false );
@@ -960,339 +1004,341 @@
1446float evaluateCDFresid(float thetaL, std::vector<float> &ru_v, const void *a_distribution);
1447
1448#endif //CANOPY_GENERATOR
-
float evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution)
Evaluate the error between a predicted and actual leaf angle cumulative distribution at a given leaf ...
-
helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
Interpolate the position of a point along a tube.
-
float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
Draw a random number (float) from a uniform distribution between -V and V.
+
float evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution)
Evaluate the error between a predicted and actual leaf angle cumulative distribution at a given leaf ...
+
helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
Interpolate the position of a point along a tube.
+
float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
Draw a random number (float) from a uniform distribution between -V and V.
- -
uint whitespruce(const WhiteSpruceCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual white spruce tree.
Definition: whitespruce.cpp:6
-
void buildCanopy(const HomogeneousCanopyParameters &params)
Build a canopy consisting of a homogeneous volume of leaves.
-
void storeCanopyParameters(Args &&... args)
Stores the given canopy parameters.
-
uint sorghum(const SorghumCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual sorghum plant.
Definition: sorghum.cpp:8
-
void enableMessages()
Enable standard messages to be printed to screen (default is to enable messages)
-
std::vector< uint > getTrunkUUIDs()
Get the unique universal identifiers (UUIDs) for all trunk primitives in a single 1D vector.
-
uint tomato(const TomatoParameters &params, const helios::vec3 &origin)
Function to add an individual tomato plant.
Definition: tomato.cpp:139
-
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)
Build a ground consisting of texture sub-tiles and sub-patches, which can be different sizes.
-
uint strawberry(const StrawberryParameters &params, const helios::vec3 &origin)
Function to add an individual strawberry plant.
Definition: strawberry.cpp:215
-
std::vector< std::vector< uint > > addGrapeCluster(helios::vec3 position, float grape_rad, float cluster_rad, helios::RGBcolor grape_color, uint grape_subdiv)
Function to add an individual grape berry cluster.
Definition: grapevine.cpp:21
-
std::vector< uint > getGroundUUIDs()
Get the unique universal identifiers (UUIDs) for the primitives that make up the ground.
-
std::vector< uint > getLeafUUIDs()
Get the unique universal identifiers (UUIDs) for all leaf primitives in a single 1D vector.
-
std::vector< uint > getBranchUUIDs()
Get the unique universal identifiers (UUIDs) for all branch primitives in a single 1D vector.
-
void buildCanopies()
Builds canopies for all the stored canopy parameters.
-
uint grapevineSplit(const SplitGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a split trellis.
Definition: grapevine.cpp:464
-
std::vector< uint > getAllUUIDs(uint PlantID)
Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
-
uint grapevineGoblet(const GobletGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a goblet (vent a taille) trellis.
Definition: grapevine.cpp:1065
-
void disableElementLabels()
Toggle off primitive data element type labels.
-
void loadXML(const char *filename, bool build=true)
Reads the XML file of the given name and stores all the configured canopy parameters.
-
uint grapevineUnilateral(const UnilateralGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a unilateral trellis.
Definition: grapevine.cpp:830
-
void disableMessages()
Disable standard messages from being printed to screen (default is to enable messages)
-
uint grapevineVSP(const VSPGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a vertical shoot positioned (VSP) trellis.
Definition: grapevine.cpp:150
-
uint getPlantCount()
Get the current number of plants added to the Canopy Generator.
-
std::vector< uint > getFruitUUIDs()
Get the unique universal identifiers (UUIDs) for all fruit primitives in a single 1D vector.
-
void seedRandomGenerator(uint seed)
Seed the random number generator. This can be useful for generating repeatable trees,...
-
uint bean(const BeanParameters &params, const helios::vec3 &origin)
Function to add an individual bean plant.
Definition: bean.cpp:291
-
void buildIndividualPlants()
Builds individual plants based on the stored canopy parameters (using canopy_origin as the position)
-
void createElementLabels()
Create primitive data that explicitly labels all primitives according to the plant element they corre...
-
int selfTest()
Unit testing routine.
-
uint walnut(const WalnutCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual walnut tree.
Definition: walnut.cpp:333
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
Base struct class for Canopy parameters.
-
helios::vec3 canopy_origin
Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places th...
-
BaseCanopyParameters()
Default constructor.
+ +
uint whitespruce(const WhiteSpruceCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual white spruce tree.
+
void buildCanopy(const HomogeneousCanopyParameters &params)
Build a canopy consisting of a homogeneous volume of leaves.
+
void storeCanopyParameters(Args &&... args)
Stores the given canopy parameters.
+
uint sorghum(const SorghumCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual sorghum plant.
Definition sorghum.cpp:8
+
void enableMessages()
Enable standard messages to be printed to screen (default is to enable messages)
+
std::vector< uint > getTrunkUUIDs()
Get the unique universal identifiers (UUIDs) for all trunk primitives in a single 1D vector.
+
uint tomato(const TomatoParameters &params, const helios::vec3 &origin)
Function to add an individual tomato plant.
Definition tomato.cpp:139
+
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)
Build a ground consisting of texture sub-tiles and sub-patches, which can be different sizes.
+
uint strawberry(const StrawberryParameters &params, const helios::vec3 &origin)
Function to add an individual strawberry plant.
+
std::vector< std::vector< uint > > addGrapeCluster(helios::vec3 position, float grape_rad, float cluster_rad, helios::RGBcolor grape_color, uint grape_subdiv)
Function to add an individual grape berry cluster.
Definition grapevine.cpp:21
+
std::vector< uint > getGroundUUIDs()
Get the unique universal identifiers (UUIDs) for the primitives that make up the ground.
+
std::vector< uint > getLeafUUIDs()
Get the unique universal identifiers (UUIDs) for all leaf primitives in a single 1D vector.
+
std::vector< uint > getBranchUUIDs()
Get the unique universal identifiers (UUIDs) for all branch primitives in a single 1D vector.
+
void buildCanopies()
Builds canopies for all the stored canopy parameters.
+
uint grapevineSplit(const SplitGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a split trellis.
+
std::vector< uint > getAllUUIDs(uint PlantID)
Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
+
uint grapevineGoblet(const GobletGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a goblet (vent a taille) trellis.
+
void disableElementLabels()
Toggle off primitive data element type labels.
+
void loadXML(const char *filename, bool build=true)
Reads the XML file of the given name and stores all the configured canopy parameters.
+
uint grapevineUnilateral(const UnilateralGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a unilateral trellis.
+
void disableMessages()
Disable standard messages from being printed to screen (default is to enable messages)
+
uint grapevineVSP(const VSPGrapevineParameters &params, const helios::vec3 &origin)
Function to add an individual grapevine plant on a vertical shoot positioned (VSP) trellis.
+
uint getPlantCount()
Get the current number of plants added to the Canopy Generator.
+
std::vector< uint > getFruitUUIDs()
Get the unique universal identifiers (UUIDs) for all fruit primitives in a single 1D vector.
+
CanopyGenerator(helios::Context *context)
Canopy geometry generator constructor.
+
void seedRandomGenerator(uint seed)
Seed the random number generator. This can be useful for generating repeatable trees,...
+
uint bean(const BeanParameters &params, const helios::vec3 &origin)
Function to add an individual bean plant.
Definition bean.cpp:291
+
void buildIndividualPlants()
Builds individual plants based on the stored canopy parameters (using canopy_origin as the position)
+
void createElementLabels()
Create primitive data that explicitly labels all primitives according to the plant element they corre...
+
int selfTest()
Unit testing routine.
+
uint walnut(const WalnutCanopyParameters &params, const helios::vec3 &origin)
Function to add an individual walnut tree.
Definition walnut.cpp:333
+
Stores the state associated with simulation.
Definition Context.h:1882
+
Base struct class for Canopy parameters.
+
helios::vec3 canopy_origin
Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places th...
+
BaseCanopyParameters()
Default constructor.
virtual void buildCanopy(CanopyGenerator &canopy_generator)=0
Makes the given Canopy generator build a canopy of our type with our parameters.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float canopy_rotation
Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal t...
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float canopy_rotation
Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal t...
virtual void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin)=0
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
- -
float plant_spacing
Spacing between adjacent plants along the row direction.
-
float shoot_radius_spread
Spread value for the shoot radius. With any new canopy or plant generation, the shoot radius would be...
-
float missing_plant_probability
Probability for a plant to be missing.
-
float dead_probability
Probability for a plant to be dead, i.e. without any leaves or grapes.
-
float cluster_radius
Maximum horizontal radius of grape clusters.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float cluster_height_max
Maximum height of grape clusters along the shoot as a fraction of the total shoot length.
-
BaseGrapeVineParameters()
Default constructor.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
float leaf_spacing_fraction_spread
Spread value for the leaf spacing fraction. With any new canopy or plant generation,...
-
int wood_subdivisions
Number of radial subdivisions for trunk/cordon/shoot tubes.
-
float row_spacing
Spacing between plant rows.
-
uint grape_subdivisions
Number of azimuthal and zenithal subdivisions making up berries (will result in roughly 2*(grape_subd...
-
float plant_spacing_spread
Spread value for the plant spacing. The spacing between adjacent plants along a row would vary betwee...
-
float shoot_length_spread
Spread value for the shoot length. With any new canopy or plant generation, the shoot length would be...
-
float leaf_spacing_fraction
Spacing between adjacent leaves as a fraction of the local leaf width. E.g., leaf_spacing_fraction = ...
-
float trunk_height_spread
Spread value for the trunk height. With any new canopy or plant generation, the trunk height would be...
-
uint shoots_per_cordon_spread
Spread value for the number of shoots per cordon. With any new canopy or plant generation,...
-
float cordon_radius
Radius of cordon branches.
-
float trunk_radius_spread
Spread value for the trunk radius. With any new canopy or plant generation, the trunk radius would be...
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
float leaf_width
Maximum width of leaves. Leaf width increases logarithmically from the shoot tip, so leaf_width is th...
-
float cordon_height_spread
Spread value for the cordon height. With any new canopy or plant generation, the cordon height would ...
-
float canopy_rotation_spread
Spread value for the canopy rotation. With any new canopy or plant generation, the canopy/plant rotat...
-
int wood_subdivisions_spread
Spread value for the number of wood subdivisions. With any new canopy or plant generation,...
-
uint shoots_per_cordon
Number of shoots on each cordon.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float trunk_height
Distance between the ground and top of trunks.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
float shoot_length
Length of shoots.
-
float cluster_height_max_spread
Spread value for the cluster height. With any new canopy or plant generation, the cluster height woul...
-
uint grape_subdivisions_spread
Spread value for the number of grape subdivisions. With any new canopy or plant generation,...
-
float trunk_radius
Radius of the trunk at the widest point.
-
float shoot_radius
Radius of shoot branches.
-
float cordon_length
Length of the cordons. By default, half the plant spacing.
-
float cluster_radius_spread
Spread value for the cluster radius. With any new canopy or plant generation, the cluster radius woul...
-
helios::RGBcolor grape_color
Color of grapes.
-
float cordon_radius_spread
Spread value for the cordon radius. With any new canopy or plant generation, the cordon radius would ...
-
float leaf_width_spread
Spread value for the maximum leaf width. With any new canopy or plant generation, the maximum leaf wi...
-
float grape_radius_spread
Spread value for the grape radius. With any new canopy or plant generation, the grape radius would be...
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
float row_spacing_spread
Spread value for the row spacing. This allows to vary the alignment of plants along a row....
-
float cordon_height
Distance between the ground and cordon. Note - must be greater than or equal to the trunk height.
-
std::string wood_texture_file
Path to texture map file for trunks/branches.
-
float grape_radius
Radius of grape berries.
-
float cordon_length_spread
Spread value for the cordon length. With any new canopy or plant generation, the cordon length would ...
-
Parameters defining the bean plant canopy.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
float leaflet_length
Length of the leaflet from base to tip leaf.
-
float pod_length
Length of bean pods.
-
float leaf_length
Maximum width of leaves.
-
BeanParameters()
Default constructor.
-
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
-
helios::RGBcolor pod_color
Color of bean pods.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
float stem_length
Length of stems before splitting to leaflets.
-
uint pod_subdivisions
Number of lengthwise subdivisions making up pods.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
float stem_radius
Radius of main stem at base.
-
float germination_probability
Probability that a plant in the canopy germinated.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
helios::RGBcolor shoot_color
Color of shoots.
-
float row_spacing
Spacing between plant rows.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
Parameters defining the canopy with conical crowns.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
-
ConicalCrownsCanopyParameters()
Default constructor.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
-
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
-
float crown_height
Height of the conical crowns.
-
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
-
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
-
float crown_radius
Radius of the conical crowns at the base.
-
float leaf_area_density
One-sided leaf area density within spherical crowns.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
Parameters defining the grapevine canopy with goblet (vent a taille) trellis.
-
GobletGrapevineParameters()
Default constructor.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
Parameters defining the homogeneous canopy.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
std::string buffer
String specifying whether leaves should be placed so that leaf edges do not fall outside the specifie...
-
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
-
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
helios::vec2 canopy_extent
Horizontal extent of the canopy in the x- and y-directions.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
float canopy_height
Height of the canopy.
-
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
-
HomogeneousCanopyParameters()
Default constructor.
-
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
-
float leaf_area_index
One-sided leaf area index of the canopy.
-
Parameters defining Sorghum plant canopy.
-
int s5_stem_subdivisions
Number of stem radial subdivisions for stage 5.
-
float s2_stem_subdivisions
Number of stem radial subdivisions for stage 2.
-
float s1_leaf1_angle
Leaf1 vertical angle of rotation for stage 1.
-
float s5_stem_length
Length of the sorghum stem for stage 5.
-
std::string s4_seed_texture_file
Texture map of the panicle for stage 4.
-
int s5_number_of_leaves
Number of leaves for the sorghum plant, stage 5.
-
float s5_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 5 in degrees; Standard deviation for the angle is 1...
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
float s4_stem_length
Length of the sorghum stem for stage 4.
-
helios::int2 s3_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 3.
-
std::string s1_leaf_texture_file
Texture map for sorghum leaf1 for stage 1.
-
helios::vec2 s1_leaf_size2
Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
-
float s4_stem_radius
Radius of the sorghum stem for stage 4.
-
float s3_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 3 in degrees; Standard deviation for the leaves is ...
-
float s4_stem_subdivisions
Number of stem radial subdivisions for stage 4.
-
float s2_leaf1_angle
Leaf1 vertical angle of rotation for stage 2.
-
std::string s2_leaf_texture_file
Texture map for sorghum leaf for stage 2.
-
int s5_panicle_subdivisions
Number of panicle subdivisions for each grain sphere within a panicle, stage 5.
-
float s2_leaf4_angle
Leaf4 vertical angle of rotation for stage 2.
-
float s4_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 4 in degrees; Standard deviation for the angle is 5...
-
float s2_leaf5_angle
Leaf5 vertical angle of rotation for stage 2.
-
helios::int2 s2_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 2.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
helios::vec2 s4_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 4.
-
float s2_leaf3_angle
Leaf3 vertical angle of rotation for stage 2.
-
helios::int2 s4_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 4.
-
float s2_stem_radius
Radius of the sorghum stem for stage 2.
-
SorghumCanopyParameters()
Default constructor.
-
float s5_stem_bend
Bend of the stem from mid-section for stage 5. The distance from the mid-section of the stem to the i...
-
helios::vec2 s1_leaf_size1
Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float s5_stem_radius
Radius of the sorghum stem for stage 5.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
float s3_stem_radius
Radius of the sorghum stem for stage 3.
-
std::string s5_leaf_texture_file
Texture map for sorghum leaf, stage 5.
-
helios::int2 s5_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 5.
-
helios::vec2 s1_leaf_size3
Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
-
int s4_number_of_leaves
Number of leaves for the sorghum plant, stage 4.
-
int s4_panicle_subdivisions
Number of panicle subdivisions for each grain sphere within a panicle, stage 4.
-
float s3_stem_length
Length of the sorghum stem for stage 3.
-
std::string s3_leaf_texture_file
Texture map for sorghum leaf for stage 3.
-
helios::vec2 s2_leaf_size3
Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
float s1_stem_radius
Radius of the sorghum stem for stage 1.
-
helios::vec2 s5_panicle_size
Size of panicle in x- and y- directions for stage 5.
-
int s3_number_of_leaves
Number of leaves along the stem for stage 3.
-
helios::vec2 s2_leaf_size5
Length of leaf5 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
helios::vec2 s5_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 5.
-
float s1_stem_subdivisions
Number of stem radial subdivisions for stage 1.
-
helios::vec2 s2_leaf_size4
Length of leaf4 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
helios::int2 s1_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 1.
-
std::string s4_leaf_texture_file
Texture map for sorghum leaf, stage 4.
-
helios::vec2 s2_leaf_size2
Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
float row_spacing
Spacing between plant rows.
-
helios::vec2 s3_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 3.
-
float s2_stem_length
Length of the sorghum stem for stage 2.
-
float s1_leaf2_angle
Leaf2 vertical angle of rotation for stage 1.
-
float s3_stem_subdivisions
Number of stem radial subdivisions for stage 3.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float s1_stem_length
Length of the sorghum stem for stage 1.
-
int sorghum_stage
Sorghum categorized into 5 stages; 1 - Three leaf stage, 2 - Five leaf stage, 3 - Panicle initiation ...
-
float s1_leaf3_angle
Leaf3 vertical angle of rotation for stage 1.
-
helios::vec2 s2_leaf_size1
Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
-
std::string s5_seed_texture_file
Texture map of the panicle for stage 5.
-
helios::vec2 s4_panicle_size
Size of panicle in x- and y- directions for stage 4.
-
float s2_leaf2_angle
Leaf2 vertical angle of rotation for stage 2.
-
Parameters defining the canopy with spherical crowns.
-
helios::vec3 crown_radius
Radius of the spherical crowns.
-
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
-
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
-
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
-
SphericalCrownsCanopyParameters()
Default constructor.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
-
float leaf_area_density
One-sided leaf area density within spherical crowns.
-
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
Parameters defining the grapevine canopy with a split (quad) trellis.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float shoot_angle_base_spread
Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle ...
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float shoot_angle_base
Average angle of the shoot at the base (shoot_angle_base=0 points shoots upward; shoot_angle_base=M_P...
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
SplitGrapevineParameters()
Default constructor.
-
float cordon_spacing
Spacing between two opposite cordons.
-
float cordon_spacing_spread
Spread value for the cordon spacing. With any new canopy or plant generation, the cordon spacing woul...
-
float shoot_angle_tip_spread
Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle ...
-
float shoot_angle_tip
Average angle of the shoot at the tip (shoot_angle=0 is a completely vertical shoot; shoot_angle=M_PI...
-
Parameters defining the strawberry plant canopy.
-
int stem_subdivisions
Number of radial subdivisions for stem tubes.
-
int stems_per_plant
Number of stems per plant.
-
float fruit_radius
Radius of strawberry fruit.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
StrawberryParameters()
Default constructor.
-
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
float plant_height
Height of the plant.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
std::string fruit_texture_file
Texture map for strawberry fruit.
-
float clusters_per_stem
Number of strawberry clusters per plant stem. Clusters randomly have 1, 2, or 3 berries.
-
float stem_radius
Radius of stems.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
float row_spacing
Spacing between plant rows.
-
helios::RGBcolor stem_color
Color of stems.
-
float leaf_length
Maximum width of leaves.
-
Parameters defining the tomato plant canopy.
-
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
float leaf_length
Maximum width of leaves.
-
helios::RGBcolor fruit_color
Color of tomato fruit.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
-
helios::RGBcolor shoot_color
Color of shoots.
-
float row_spacing
Spacing between plant rows.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
TomatoParameters()
Default constructor.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float plant_height
Height of the plant.
-
float fruit_radius
Radius of tomato fruit.
-
Parameters defining the grapevine canopy with unilateral trellis.
-
UnilateralGrapevineParameters()
Default constructor.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
Parameters defining the grapevine canopy with vertical shoot positioned (VSP) trellis.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
VSPGrapevineParameters()
Default constructor.
-
Parameters defining the walnut tree canopy.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
int wood_subdivisions
Number of radial subdivisions for branch tubes.
-
float plant_spacing
Spacing between adjacent plants along the row direction.
-
WalnutCanopyParameters()
Default constructor.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
std::string fruit_texture_file
Texture map for walnut fruit.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
-
float trunk_radius
Radius of trunk.
-
float fruit_radius
Radius of walnuts.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
float leaf_length
Maximum length of leaves along midrib.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
std::string wood_texture_file
Path to texture map file for wood/branches.
-
helios::vec3 branch_length
Average length of branches in each recursive branch level. For example, the first (....
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
float trunk_height
Height of the trunk.
-
float row_spacing
Spacing between plant rows.
-
Parameters defining the white spruce.
-
float needle_width
Width of needles.
-
helios::int2 needle_subdivisions
Number of sub-division segments per needle.
-
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
-
std::string wood_texture_file
Path to texture map file for trunks/branches.
-
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
-
float needle_length
Length of needles.
-
float trunk_height
Distance between the ground and top of trunks.
-
float level_spacing
Vertical spacing between branching levels.
-
float shoot_radius
Radius of shoot branches.
-
int wood_subdivisions
Number of radial subdivisions for trunk/cordon/shoot tubes.
-
float shoot_angle
Maximum shoot angle.
-
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
-
float base_height
Height at which branches start.
-
float crown_radius
Radius of the crown at the base.
-
helios::RGBcolor needle_color
Color of needles.
-
float trunk_radius
Radius of the trunk at the base.
-
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
-
WhiteSpruceCanopyParameters()
Default constructor.
-
int branches_per_level
Number of primary branches on the bottom level.
-
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
-
R-G-B color vector.
-
Vector of two elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+ +
float plant_spacing
Spacing between adjacent plants along the row direction.
+
float shoot_radius_spread
Spread value for the shoot radius. With any new canopy or plant generation, the shoot radius would be...
+
float missing_plant_probability
Probability for a plant to be missing.
+
float dead_probability
Probability for a plant to be dead, i.e. without any leaves or grapes.
+
float cluster_radius
Maximum horizontal radius of grape clusters.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float cluster_height_max
Maximum height of grape clusters along the shoot as a fraction of the total shoot length.
+
BaseGrapeVineParameters()
Default constructor.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
float leaf_spacing_fraction_spread
Spread value for the leaf spacing fraction. With any new canopy or plant generation,...
+
int wood_subdivisions
Number of radial subdivisions for trunk/cordon/shoot tubes.
+
float row_spacing
Spacing between plant rows.
+
uint grape_subdivisions
Number of azimuthal and zenithal subdivisions making up berries (will result in roughly 2*(grape_subd...
+
float plant_spacing_spread
Spread value for the plant spacing. The spacing between adjacent plants along a row would vary betwee...
+
float shoot_length_spread
Spread value for the shoot length. With any new canopy or plant generation, the shoot length would be...
+
float leaf_spacing_fraction
Spacing between adjacent leaves as a fraction of the local leaf width. E.g., leaf_spacing_fraction = ...
+
float trunk_height_spread
Spread value for the trunk height. With any new canopy or plant generation, the trunk height would be...
+
uint shoots_per_cordon_spread
Spread value for the number of shoots per cordon. With any new canopy or plant generation,...
+
float cordon_radius
Radius of cordon branches.
+
float trunk_radius_spread
Spread value for the trunk radius. With any new canopy or plant generation, the trunk radius would be...
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
float leaf_width
Maximum width of leaves. Leaf width increases logarithmically from the shoot tip, so leaf_width is th...
+
float cordon_height_spread
Spread value for the cordon height. With any new canopy or plant generation, the cordon height would ...
+
float canopy_rotation_spread
Spread value for the canopy rotation. With any new canopy or plant generation, the canopy/plant rotat...
+
int wood_subdivisions_spread
Spread value for the number of wood subdivisions. With any new canopy or plant generation,...
+
uint shoots_per_cordon
Number of shoots on each cordon.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float trunk_height
Distance between the ground and top of trunks.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
float shoot_length
Length of shoots.
+
float cluster_height_max_spread
Spread value for the cluster height. With any new canopy or plant generation, the cluster height woul...
+
uint grape_subdivisions_spread
Spread value for the number of grape subdivisions. With any new canopy or plant generation,...
+
float trunk_radius
Radius of the trunk at the widest point.
+
float shoot_radius
Radius of shoot branches.
+
float cordon_length
Length of the cordons. By default, half the plant spacing.
+
float cluster_radius_spread
Spread value for the cluster radius. With any new canopy or plant generation, the cluster radius woul...
+
helios::RGBcolor grape_color
Color of grapes.
+
float cordon_radius_spread
Spread value for the cordon radius. With any new canopy or plant generation, the cordon radius would ...
+
float leaf_width_spread
Spread value for the maximum leaf width. With any new canopy or plant generation, the maximum leaf wi...
+
float grape_radius_spread
Spread value for the grape radius. With any new canopy or plant generation, the grape radius would be...
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
float row_spacing_spread
Spread value for the row spacing. This allows to vary the alignment of plants along a row....
+
float cordon_height
Distance between the ground and cordon. Note - must be greater than or equal to the trunk height.
+
std::string wood_texture_file
Path to texture map file for trunks/branches.
+
float grape_radius
Radius of grape berries.
+
float cordon_length_spread
Spread value for the cordon length. With any new canopy or plant generation, the cordon length would ...
+
Parameters defining the bean plant canopy.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
float leaflet_length
Length of the leaflet from base to tip leaf.
+
float pod_length
Length of bean pods.
+
float leaf_length
Maximum width of leaves.
+
BeanParameters()
Default constructor.
+
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
+
helios::RGBcolor pod_color
Color of bean pods.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
float stem_length
Length of stems before splitting to leaflets.
+
uint pod_subdivisions
Number of lengthwise subdivisions making up pods.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
float stem_radius
Radius of main stem at base.
+
float germination_probability
Probability that a plant in the canopy germinated.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
helios::RGBcolor shoot_color
Color of shoots.
+
float row_spacing
Spacing between plant rows.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
Parameters defining the canopy with conical crowns.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
+
ConicalCrownsCanopyParameters()
Default constructor.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
+
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
+
float crown_height
Height of the conical crowns.
+
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
+
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
+
float crown_radius
Radius of the conical crowns at the base.
+
float leaf_area_density
One-sided leaf area density within spherical crowns.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
Parameters defining the grapevine canopy with goblet (vent a taille) trellis.
+
GobletGrapevineParameters()
Default constructor.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
Parameters defining the homogeneous canopy.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
std::string buffer
String specifying whether leaves should be placed so that leaf edges do not fall outside the specifie...
+
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
+
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
helios::vec2 canopy_extent
Horizontal extent of the canopy in the x- and y-directions.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
float canopy_height
Height of the canopy.
+
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
+
HomogeneousCanopyParameters()
Default constructor.
+
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
+
float leaf_area_index
One-sided leaf area index of the canopy.
+
Parameters defining Sorghum plant canopy.
+
int s5_stem_subdivisions
Number of stem radial subdivisions for stage 5.
+
float s2_stem_subdivisions
Number of stem radial subdivisions for stage 2.
+
float s1_leaf1_angle
Leaf1 vertical angle of rotation for stage 1.
+
float s5_stem_length
Length of the sorghum stem for stage 5.
+
std::string s4_seed_texture_file
Texture map of the panicle for stage 4.
+
int s5_number_of_leaves
Number of leaves for the sorghum plant, stage 5.
+
float s5_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 5 in degrees; Standard deviation for the angle is 1...
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
float s4_stem_length
Length of the sorghum stem for stage 4.
+
helios::int2 s3_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 3.
+
std::string s1_leaf_texture_file
Texture map for sorghum leaf1 for stage 1.
+
helios::vec2 s1_leaf_size2
Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
+
float s4_stem_radius
Radius of the sorghum stem for stage 4.
+
float s3_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 3 in degrees; Standard deviation for the leaves is ...
+
float s4_stem_subdivisions
Number of stem radial subdivisions for stage 4.
+
float s2_leaf1_angle
Leaf1 vertical angle of rotation for stage 2.
+
std::string s2_leaf_texture_file
Texture map for sorghum leaf for stage 2.
+
int s5_panicle_subdivisions
Number of panicle subdivisions for each grain sphere within a panicle, stage 5.
+
float s2_leaf4_angle
Leaf4 vertical angle of rotation for stage 2.
+
float s4_mean_leaf_angle
Mean vertical angle of rotation of leaf for stage 4 in degrees; Standard deviation for the angle is 5...
+
float s2_leaf5_angle
Leaf5 vertical angle of rotation for stage 2.
+
helios::int2 s2_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 2.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
helios::vec2 s4_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 4.
+
float s2_leaf3_angle
Leaf3 vertical angle of rotation for stage 2.
+
helios::int2 s4_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 4.
+
float s2_stem_radius
Radius of the sorghum stem for stage 2.
+
SorghumCanopyParameters()
Default constructor.
+
float s5_stem_bend
Bend of the stem from mid-section for stage 5. The distance from the mid-section of the stem to the i...
+
helios::vec2 s1_leaf_size1
Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float s5_stem_radius
Radius of the sorghum stem for stage 5.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
float s3_stem_radius
Radius of the sorghum stem for stage 3.
+
std::string s5_leaf_texture_file
Texture map for sorghum leaf, stage 5.
+
helios::int2 s5_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 5.
+
helios::vec2 s1_leaf_size3
Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
+
int s4_number_of_leaves
Number of leaves for the sorghum plant, stage 4.
+
int s4_panicle_subdivisions
Number of panicle subdivisions for each grain sphere within a panicle, stage 4.
+
float s3_stem_length
Length of the sorghum stem for stage 3.
+
std::string s3_leaf_texture_file
Texture map for sorghum leaf for stage 3.
+
helios::vec2 s2_leaf_size3
Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
float s1_stem_radius
Radius of the sorghum stem for stage 1.
+
helios::vec2 s5_panicle_size
Size of panicle in x- and y- directions for stage 5.
+
int s3_number_of_leaves
Number of leaves along the stem for stage 3.
+
helios::vec2 s2_leaf_size5
Length of leaf5 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
helios::vec2 s5_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 5.
+
float s1_stem_subdivisions
Number of stem radial subdivisions for stage 1.
+
helios::vec2 s2_leaf_size4
Length of leaf4 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
helios::int2 s1_leaf_subdivisions
Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 1.
+
std::string s4_leaf_texture_file
Texture map for sorghum leaf, stage 4.
+
helios::vec2 s2_leaf_size2
Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
float row_spacing
Spacing between plant rows.
+
helios::vec2 s3_leaf_size
Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 3.
+
float s2_stem_length
Length of the sorghum stem for stage 2.
+
float s1_leaf2_angle
Leaf2 vertical angle of rotation for stage 1.
+
float s3_stem_subdivisions
Number of stem radial subdivisions for stage 3.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float s1_stem_length
Length of the sorghum stem for stage 1.
+
int sorghum_stage
Sorghum categorized into 5 stages; 1 - Three leaf stage, 2 - Five leaf stage, 3 - Panicle initiation ...
+
float s1_leaf3_angle
Leaf3 vertical angle of rotation for stage 1.
+
helios::vec2 s2_leaf_size1
Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
+
std::string s5_seed_texture_file
Texture map of the panicle for stage 5.
+
helios::vec2 s4_panicle_size
Size of panicle in x- and y- directions for stage 4.
+
float s2_leaf2_angle
Leaf2 vertical angle of rotation for stage 2.
+
Parameters defining the canopy with spherical crowns.
+
helios::vec3 crown_radius
Radius of the spherical crowns.
+
helios::vec2 leaf_size
Length of leaf in x- and y- directions (prior to rotation)
+
std::string leaf_texture_file
Path to texture map file for leaves. If left empty, no texture will be used.
+
helios::RGBcolor leaf_color
Leaf color if no texture map file is provided.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
+
SphericalCrownsCanopyParameters()
Default constructor.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
std::string leaf_angle_distribution
Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile",...
+
float leaf_area_density
One-sided leaf area density within spherical crowns.
+
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
Parameters defining the grapevine canopy with a split (quad) trellis.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float shoot_angle_base_spread
Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle ...
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float shoot_angle_base
Average angle of the shoot at the base (shoot_angle_base=0 points shoots upward; shoot_angle_base=M_P...
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
SplitGrapevineParameters()
Default constructor.
+
float cordon_spacing
Spacing between two opposite cordons.
+
float cordon_spacing_spread
Spread value for the cordon spacing. With any new canopy or plant generation, the cordon spacing woul...
+
float shoot_angle_tip_spread
Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle ...
+
float shoot_angle_tip
Average angle of the shoot at the tip (shoot_angle=0 is a completely vertical shoot; shoot_angle=M_PI...
+
Parameters defining the strawberry plant canopy.
+
int stem_subdivisions
Number of radial subdivisions for stem tubes.
+
int stems_per_plant
Number of stems per plant.
+
float fruit_radius
Radius of strawberry fruit.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
StrawberryParameters()
Default constructor.
+
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
float plant_height
Height of the plant.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
std::string fruit_texture_file
Texture map for strawberry fruit.
+
float clusters_per_stem
Number of strawberry clusters per plant stem. Clusters randomly have 1, 2, or 3 berries.
+
float stem_radius
Radius of stems.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
float row_spacing
Spacing between plant rows.
+
helios::RGBcolor stem_color
Color of stems.
+
float leaf_length
Maximum width of leaves.
+
Parameters defining the tomato plant canopy.
+
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
float leaf_length
Maximum width of leaves.
+
helios::RGBcolor fruit_color
Color of tomato fruit.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
+
helios::RGBcolor shoot_color
Color of shoots.
+
float row_spacing
Spacing between plant rows.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
TomatoParameters()
Default constructor.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float plant_height
Height of the plant.
+
float fruit_radius
Radius of tomato fruit.
+
Parameters defining the grapevine canopy with unilateral trellis.
+
UnilateralGrapevineParameters()
Default constructor.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
Parameters defining the grapevine canopy with vertical shoot positioned (VSP) trellis.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
VSPGrapevineParameters()
Default constructor.
+
Parameters defining the walnut tree canopy.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
int wood_subdivisions
Number of radial subdivisions for branch tubes.
+
float plant_spacing
Spacing between adjacent plants along the row direction.
+
WalnutCanopyParameters()
Default constructor.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
std::string fruit_texture_file
Texture map for walnut fruit.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
uint fruit_subdivisions
Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
+
float trunk_radius
Radius of trunk.
+
float fruit_radius
Radius of walnuts.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
float leaf_length
Maximum length of leaves along midrib.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
std::string wood_texture_file
Path to texture map file for wood/branches.
+
helios::vec3 branch_length
Average length of branches in each recursive branch level. For example, the first (....
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
float trunk_height
Height of the trunk.
+
float row_spacing
Spacing between plant rows.
+
Parameters defining the white spruce.
+
float needle_width
Width of needles.
+
helios::int2 needle_subdivisions
Number of sub-division segments per needle.
+
void readParametersFromXML(const pugi::xml_node canopy_node)
Sets canopy parameters from the given XML node.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
std::string wood_texture_file
Path to texture map file for trunks/branches.
+
helios::vec2 plant_spacing
Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random...
+
float needle_length
Length of needles.
+
float trunk_height
Distance between the ground and top of trunks.
+
float level_spacing
Vertical spacing between branching levels.
+
float shoot_radius
Radius of shoot branches.
+
int wood_subdivisions
Number of radial subdivisions for trunk/cordon/shoot tubes.
+
float shoot_angle
Maximum shoot angle.
+
helios::int2 plant_count
Number of crowns/plants in the x- and y-directions.
+
float base_height
Height at which branches start.
+
float crown_radius
Radius of the crown at the base.
+
helios::RGBcolor needle_color
Color of needles.
+
float trunk_radius
Radius of the trunk at the base.
+
void buildPlant(CanopyGenerator &canopy_generator, helios::vec3 origin) override
Makes the given Canopy generator build a single plant of our canopy type with our parameters at the g...
+
WhiteSpruceCanopyParameters()
Default constructor.
+
int branches_per_level
Number of primary branches on the bottom level.
+
std::string canopy_configuration
Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arr...
+
R-G-B color vector.
+
Vector of two elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_canopy_generator_doc.html b/doc/html/_canopy_generator_doc.html index 4cd12354f..d197a3a06 100644 --- a/doc/html/_canopy_generator_doc.html +++ b/doc/html/_canopy_generator_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
-
Canopy Generator Plugin Documentation
+
Canopy Generator Plugin Documentation
@@ -901,11 +953,11 @@

}
- -
Stores the state associated with simulation.
Definition: Context.h:1882
-
Vector of two elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+ +
Stores the state associated with simulation.
Definition Context.h:1882
+
Vector of two elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.

Building an Individual Plant

Maximum flexibility in creating a canopy of plants is achieved by manually adding each individual plant. An example is given below to add a single grapevine plant on VSP trellis at the point (0,0,0).

@@ -928,7 +980,7 @@

canopygenerator.grapevineVSP( parameters, origin );
}
-
Parameters defining the grapevine canopy with vertical shoot positioned (VSP) trellis.
+
Parameters defining the grapevine canopy with vertical shoot positioned (VSP) trellis.

The function grapevineVSP() could be called many times with different origin positions to create any canopy that is desired. Below, we will introduce functions that automatically generate a canopy according to the values set in the parameters structure.

Building a Canopy

@@ -949,7 +1001,7 @@

canopygenerator.buildCanopy( parameters );
}
-
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.
+
void buildCanopy(CanopyGenerator &canopy_generator) override
Makes the given Canopy generator build a canopy of our type with our parameters.

Retrieving UUIDs for Primitives

The UUIDs of primitives making up the canopy geometry are grouped into four different types of elements: trunks, branches/shoots, leaves, and fruit. Not all canopy types will have all four groups of elements, for example the homogeneous canopy has no trunks, branches, or fruit. The UUIDs can be retrieved for a given plant using the appropriate getter function, as detailed in the table below. Additionally, UUIDs can be retrieved for the ground surface.

@@ -984,7 +1036,7 @@

parameters.canopy_extent = make_vec2( 10.0, 10.0 );
canopygenerator.buildCanopy( parameters );
-
Parameters defining the homogeneous canopy.
+
Parameters defining the homogeneous canopy.

Seeding the Random Number Generator

Random variability is added to plant geometries using a pseudorandom number generator. By default, the random number sequence is seeded based on the system clock, which produces different results for each run.

@@ -1013,7 +1065,8 @@

+ diff --git a/doc/html/_carbohydrate_model_8cpp.html b/doc/html/_carbohydrate_model_8cpp.html index c72fd4d7b..9273d9a7f 100644 --- a/doc/html/_carbohydrate_model_8cpp.html +++ b/doc/html/_carbohydrate_model_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -100,37 +112,37 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Variables

float C_molecular_wt = 12.01
float C_molecular_wt = 12.01
 
float rho_w = 675000
float rho_w = 675000
 
float wood_carbon_percentage = .5
float wood_carbon_percentage = .5
 
float SLA = 1.75e-2
float SLA = 1.75e-2
 
float leaf_carbon_percentage = .4444
float leaf_carbon_percentage = .4444
 
float total_flower_cost = 8.33e-3
float total_flower_cost = 8.33e-3
 
float flower_production_cost = total_flower_cost*.69
float flower_production_cost = total_flower_cost*.69
 
float flower_growth_respiration = total_flower_cost*.31
float flower_growth_respiration = total_flower_cost*.31
 
float nut_density = 525000
float nut_density = 525000
 
float percent_kernel = .27
float percent_kernel = .27
 
float percent_shell = .19
float percent_shell = .19
 
float percent_hull = .54
float percent_hull = .54
 
float kernel_carbon_percentage = .454
float kernel_carbon_percentage = .454
 
float shell_carbon_percentage = .470
float shell_carbon_percentage = .470
 
float hull_carbon_percentage = .494
float hull_carbon_percentage = .494
 
float nut_carbon_percentage = percent_kernel*kernel_carbon_percentage + percent_shell*shell_carbon_percentage + percent_hull*hull_carbon_percentage
float nut_carbon_percentage = percent_kernel*kernel_carbon_percentage + percent_shell*shell_carbon_percentage + percent_hull*hull_carbon_percentage
 

Detailed Description

@@ -400,7 +412,8 @@

+

diff --git a/doc/html/_carbohydrate_model_8cpp_source.html b/doc/html/_carbohydrate_model_8cpp_source.html index 0f75b8bba..4f9d0d07d 100644 --- a/doc/html/_carbohydrate_model_8cpp_source.html +++ b/doc/html/_carbohydrate_model_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
CarbohydrateModel.cpp
@@ -459,27 +471,28 @@
379
380}
-
float getTubeObjectSegmentVolume(uint ObjID, uint segment_index) const
get the volume of a segment within a Tube object
Definition: Context.cpp:8176
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
float getTubeObjectVolume(uint ObjID) const
get the volume of a Tube object from the context
Definition: Context.cpp:8172
-
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition: Context.cpp:2907
-
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition: Context.cpp:2585
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition: Context.cpp:7920
-
float getPolymeshObjectVolume(uint ObjID) const
Get the volume of a Polygon Mesh object from the context.
Definition: Context.cpp:8282
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
Function to flatten a 2D int vector into a 1D vector.
Definition: global.cpp:1943
- -
helios::int3 shoot_index
.x = index of phytomer along shoot, .y = current number of phytomers on parent shoot,...
-
int x
First element in vector.
+
float getTubeObjectSegmentVolume(uint ObjID, uint segment_index) const
get the volume of a segment within a Tube object
Definition Context.cpp:8176
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
float getTubeObjectVolume(uint ObjID) const
get the volume of a Tube object from the context
Definition Context.cpp:8172
+
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition Context.cpp:2907
+
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition Context.cpp:2585
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition Context.cpp:7920
+
float getPolymeshObjectVolume(uint ObjID) const
Get the volume of a Polygon Mesh object from the context.
Definition Context.cpp:8282
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
Function to flatten a 2D int vector into a 1D vector.
Definition global.cpp:1943
+ +
helios::int3 shoot_index
.x = index of phytomer along shoot, .y = current number of phytomers on parent shoot,...
+
int x
First element in vector.
+ diff --git a/doc/html/_choosing_c_u_d_a.html b/doc/html/_choosing_c_u_d_a.html index f57585a74..a5c727c8f 100644 --- a/doc/html/_choosing_c_u_d_a.html +++ b/doc/html/_choosing_c_u_d_a.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Choosing the right CUDA and OptiX version
+
Choosing the right CUDA and OptiX version

Picking the right version of the NVIDIA CUDA driver can be the most difficult part of the CUDA install. If you choose the wrong version, the resulting error messages may not always be clear. This guide will help you to choose the right CUDA version for your system. It may also be necessary to change your OptiX version if using an old GPU along with the radiation model. Fortunately, this is easy and will also be described below.

@@ -122,7 +134,8 @@

+
diff --git a/doc/html/_context_8cpp.html b/doc/html/_context_8cpp.html index b884e2ad0..0b4ff15ef 100644 --- a/doc/html/_context_8cpp.html +++ b/doc/html/_context_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Context.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_context_8cpp_source.html b/doc/html/_context_8cpp_source.html index 69046a1d8..12fa1f646 100644 --- a/doc/html/_context_8cpp_source.html +++ b/doc/html/_context_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Context.cpp
@@ -97,6 +109,7 @@
17
18using namespace helios;
19
+
21
22 //---- ALL DEFAULT VALUES ARE SET HERE ----//
@@ -121,14 +134,19 @@
41 currentObjectID = 1; //object ID of 0 is reserved for default object
42
43}
+
44
+
46 generator.seed(seed);
47}
+
48
+
49std::minstd_rand0* Context::getRandomGenerator(){
50 return &generator;
51}
+
52
53void Context::addTexture( const char* texture_file ){
54 if( textures.find(texture_file)==textures.end() ){//texture has not already been added
@@ -161,6 +179,7 @@
81 }
82}
83
+
84Texture::Texture( const char* texture_file ){
85 filename = texture_file;
86
@@ -205,38 +224,55 @@
125
126
127}
+
128
+
129std::string Texture::getTextureFile() const{
130 return filename;
131}
+
132
+
134 return image_resolution;
135}
+
136
+
138 return hastransparencychannel;
139}
+
140
+
141const std::vector<std::vector<bool> >* Texture::getTransparencyData() const{
142 return &transparencydata;
143}
+
144
+
146 return solidfraction;
147}
+
148
+
150 isgeometrydirty = false;
151}
+
152
+
154 isgeometrydirty = true;
155}
+
156
+
158 return isgeometrydirty;
159}
+
160
161uint Primitive::getUUID() const{
162 return UUID;
@@ -372,11 +408,11 @@
292}
293
294RGBcolor Primitive::getColor() const{
-
295 return make_RGBcolor(color.r,color.g,color.b);
+
295 return make_RGBcolor(color.r,color.g,color.b);
296}
297
298RGBcolor Primitive::getColorRGB() const{
-
299 return make_RGBcolor(color.r,color.g,color.b);
+
299 return make_RGBcolor(color.r,color.g,color.b);
300}
301
302RGBAcolor Primitive::getColorRGBA() const{
@@ -1136,6 +1172,7 @@
1056
1057}
1058
+
1059void Context::setDate( int day, int month, int year ){
1060
1061 if( day<1 || day>31 ){
@@ -1149,7 +1186,9 @@
1069 sim_date = make_Date(day,month,year);
1070
1071}
+
1072
+
1073void Context::setDate(const Date &date ){
1074
1075 if( date.day<1 || date.day>31 ){
@@ -1163,7 +1202,9 @@
1083 sim_date = date;
1084
1085}
+
1086
+
1087void Context::setDate( int Julian_day, int year ){
1088
1089 if( Julian_day<1 || Julian_day>366 ){
@@ -1175,11 +1216,15 @@
1095 sim_date = CalendarDay( Julian_day, year );
1096
1097}
+
1098
+
1100 return sim_date;
1101}
+
1102
+
1103const char* Context::getMonthString() const{
1104 if( sim_date.month==1 ){
1105 return "JAN";
@@ -1208,15 +1253,21 @@
1128 }
1129
1130}
+
1131
+
1133 return JulianDay( sim_date.day, sim_date.month, sim_date.year );
1134}
+
1135
+
1136void Context::setTime( int minute, int hour ){
1137 setTime(0,minute,hour);
1138}
+
1139
+
1140void Context::setTime( int second, int minute, int hour ){
1141
1142 if( second<0 || second>59 ){
@@ -1230,7 +1281,9 @@
1150 sim_time = make_Time(hour,minute,second);
1151
1152}
+
1153
+
1154void Context::setTime(const Time &time ){
1155
1156 if( time.minute<0 || time.minute>59 ){
@@ -1242,23 +1295,33 @@
1162 sim_time = time;
1163
1164}
+
1165
+
1167 return sim_time;
1168}
+
1169
+
1171 sim_location = location;
1172}
+
1173
+
1175 return sim_location;
1176}
+
1177
+
1179 return unif_distribution(generator);
1180}
+
1181
+
1182float Context::randu( float minrange, float maxrange ){
1183 if( maxrange<minrange ){
1184 helios_runtime_error("ERROR (Context::randu): Maximum value of range must be greater than minimum value of range.");
@@ -1269,7 +1332,9 @@
1189 return minrange+unif_distribution(generator)*(maxrange-minrange);
1190 }
1191}
+
1192
+
1193int Context::randu( int minrange, int maxrange ){
1194 if( maxrange<minrange ){
1195 helios_runtime_error("ERROR (Context::randu): Maximum value of range must be greater than minimum value of range.");
@@ -1277,34 +1342,48 @@
1197 }else if( maxrange==minrange ){
1198 return minrange;
1199 }else{
-
1200 return minrange+(int)lroundf(unif_distribution(generator)*float(maxrange-minrange));
+
1200 return minrange+(int)lroundf(unif_distribution(generator)*float(maxrange-minrange));
1201 }
1202}
+
1203
+
1205 return norm_distribution(generator);
1206}
+
1207
+
1208float Context::randn( float mean, float stddev ){
1209 return mean+norm_distribution(generator)*fabsf(stddev);
1210}
+
1211
+
1213 return addPatch(make_vec3(0,0,0),make_vec2(1,1),make_SphericalCoord(0,0),make_RGBAcolor(0,0,0,1));
1214}
+
1215
+
1216uint Context::addPatch( const vec3& center, const vec2& size ){
1217 return addPatch(center,size,make_SphericalCoord(0,0),make_RGBAcolor(0,0,0,1));
1218}
+
1219
+
1220uint Context::addPatch( const vec3& center, const vec2& size, const SphericalCoord& rotation ){
1221 return addPatch(center,size,rotation,make_RGBAcolor(0,0,0,1));
1222}
+
1223
+
1224uint Context::addPatch( const vec3& center, const vec2& size, const SphericalCoord& rotation, const RGBcolor& color ){
1225 return addPatch(center,size,rotation,make_RGBAcolor(color,1));
1226}
+
1227
+
1228uint Context::addPatch( const vec3& center, const vec2& size, const SphericalCoord& rotation, const RGBAcolor& color ){
1229
1230 if( size.x==0 || size.y==0 ){
@@ -1333,7 +1412,9 @@
1253 currentUUID++;
1254 return currentUUID-1;
1255}
+
1256
+
1257uint Context::addPatch( const vec3& center, const vec2& size, const SphericalCoord& rotation, const char* texture_file ){
1258
1259 addTexture( texture_file );
@@ -1361,7 +1442,9 @@
1281 currentUUID++;
1282 return currentUUID-1;
1283}
+
1284
+
1285uint Context::addPatch( const vec3& center, const vec2& size, const SphericalCoord& rotation, const char* texture_file, const helios::vec2& uv_center, const helios::vec2& uv_size ){
1286
1287 if( size.x==0 || size.y==0 ){
@@ -1404,15 +1487,21 @@
1324 currentUUID++;
1325 return currentUUID-1;
1326}
+
1327
+
1328uint Context::addTriangle( const vec3& vertex0, const vec3& vertex1, const vec3& vertex2 ){
1329 return addTriangle( vertex0, vertex1, vertex2, make_RGBAcolor(0,0,0,1) );
1330}
+
1331
+
1332uint Context::addTriangle( const vec3& vertex0, const vec3& vertex1, const vec3& vertex2, const RGBcolor& color ){
1333 return addTriangle( vertex0, vertex1, vertex2, make_RGBAcolor(color,1) );
1334}
+
1335
+
1336uint Context::addTriangle( const vec3& vertex0, const vec3& vertex1, const vec3& vertex2, const RGBAcolor& color ){
1337
1338 auto* tri_new = (new Triangle( vertex0, vertex1, vertex2, color, 0, currentUUID ));
@@ -1426,7 +1515,9 @@
1346 currentUUID++;
1347 return currentUUID-1;
1348}
+
1349
+
1350uint Context::addTriangle( const helios::vec3& vertex0, const helios::vec3& vertex1, const helios::vec3& vertex2, const char* texture_file, const helios::vec2& uv0, const helios::vec2& uv1, const helios::vec2& uv2 ){
1351
1352 addTexture( texture_file );
@@ -1448,19 +1539,27 @@
1368 currentUUID++;
1369 return currentUUID-1;
1370}
+
1371
+
1372uint Context::addVoxel( const vec3& center, const vec3& size ){
1373 return addVoxel(center,size,0,make_RGBAcolor(0,0,0,1));
1374}
+
1375
+
1376uint Context::addVoxel( const vec3& center, const vec3& size, const float& rotation ){
1377 return addVoxel(center,size,rotation,make_RGBAcolor(0,0,0,1));
1378}
+
1379
+
1380uint Context::addVoxel( const vec3& center, const vec3& size, const float& rotation, const RGBcolor& color ){
1381 return addVoxel(center,size,rotation,make_RGBAcolor(color,1));
1382}
+
1383
+
1384uint Context::addVoxel( const vec3& center, const vec3& size, const float& rotation, const RGBAcolor& color ){
1385
1386 auto* voxel_new = (new Voxel( color, 0, currentUUID ));
@@ -1482,11 +1581,15 @@
1402 currentUUID++;
1403 return currentUUID-1;
1404}
+
1405
+
1406void Context::translatePrimitive(uint UUID, const vec3& shift ){
1407 getPrimitivePointer_private(UUID)->translate(shift);
1408}
+
1409
+
1410void Context::translatePrimitive( const std::vector<uint>& UUIDs, const vec3& shift ){
1411
1412 float T[16];
@@ -1496,11 +1599,15 @@
1416 getPrimitivePointer_private(UUID)->applyTransform(T);
1417 }
1418}
+
1419
+
1420void Context::rotatePrimitive(uint UUID, float rot, const char* axis ){
1421 getPrimitivePointer_private(UUID)->rotate(rot,axis);
1422}
+
1423
+
1424void Context::rotatePrimitive( const std::vector<uint>& UUIDs, float rot, const char* axis ){
1425
1426 if( rot==0 ){
@@ -1525,11 +1632,15 @@
1445 getPrimitivePointer_private(UUID)->applyTransform(T);
1446 }
1447}
+
1448
+
1449void Context::rotatePrimitive(uint UUID, float rot, const helios::vec3& axis ){
1450 getPrimitivePointer_private(UUID)->rotate(rot,axis);
1451}
+
1452
+
1453void Context::rotatePrimitive(const std::vector<uint>& UUIDs, float rot, const vec3 &axis ){
1454
1455 if( rot==0 ){
@@ -1546,11 +1657,15 @@
1466 getPrimitivePointer_private(UUID)->applyTransform(T);
1467 }
1468}
+
1469
+
1470void Context::rotatePrimitive( uint UUID, float rot, const helios::vec3& origin, const helios::vec3& axis ){
1471 getPrimitivePointer_private(UUID)->rotate(rot,origin,axis);
1472}
+
1473
+
1474void Context::rotatePrimitive(const std::vector<uint>& UUIDs, float rot, const helios::vec3& origin, const vec3 &axis ){
1475
1476 if( rot==0 ){
@@ -1567,7 +1682,9 @@
1487 getPrimitivePointer_private(UUID)->applyTransform(T);
1488 }
1489}
+
1490
+
1491void Context::scalePrimitive(uint UUID, const helios::vec3& S ){
1492
1493 if( !doesPrimitiveExist(UUID) ){
@@ -1582,13 +1699,17 @@
1502 getPrimitivePointer_private(UUID)->applyTransform(T);
1503
1504}
+
1505
+
1506void Context::scalePrimitive( const std::vector<uint>& UUIDs, const helios::vec3& S ){
1507 for( uint UUID : UUIDs ){
1508 scalePrimitive(UUID,S);
1509 }
1510}
+
1511
+
1512void Context::scalePrimitiveAboutPoint( uint UUID, const helios::vec3& S, const helios::vec3 point ){
1513
1514 if( !doesPrimitiveExist(UUID) ){
@@ -1600,19 +1721,25 @@
1520 getPrimitivePointer_private(UUID)->scale(S, point);
1521
1522}
+
1523
+
1524void Context::scalePrimitiveAboutPoint( const std::vector<uint>& UUIDs, const helios::vec3& S, const helios::vec3 point ){
1525 for( uint UUID : UUIDs ){
1526 scalePrimitiveAboutPoint(UUID,S,point);
1527 }
1528}
+
1529
+
1530void Context::deletePrimitive( const std::vector<uint>& UUIDs ){
1531 for( uint UUID : UUIDs){
1532 deletePrimitive( UUID );
1533 }
1534}
+
1535
+
1537
1538 if( primitives.find(UUID) == primitives.end() ){
@@ -1642,6 +1769,8 @@
1562
1563
1564}
+
+
1565std::vector<uint> Context::copyPrimitive(const std::vector<uint> &UUIDs ){
1566
1567 std::vector<uint> UUIDs_copy(UUIDs.size());
@@ -1654,7 +1783,9 @@
1574 return UUIDs_copy;
1575
1576}
+
1577
+
1578uint Context::copyPrimitive( uint UUID ){
1579
1580 if( primitives.find(UUID) == primitives.end() ){
@@ -1728,6 +1859,7 @@
1648 currentUUID++;
1649 return currentUUID-1;
1650}
+
1651
1652Primitive* Context::getPrimitivePointer_private( uint UUID ) const{
1653 if( primitives.find(UUID) == primitives.end() ){
@@ -1736,10 +1868,13 @@
1656 return primitives.at(UUID);
1657}
1658
+
1659bool Context::doesPrimitiveExist(uint UUID ) const{
1660 return primitives.find(UUID) != primitives.end();
1661}
+
1662
+
1663bool Context::doesPrimitiveExist( const std::vector<uint> &UUIDs ) const{
1664 if( UUIDs.empty() ){
1665 return false;
@@ -1751,6 +1886,7 @@
1671 }
1672 return true;
1673}
+
1674
1675Patch* Context::getPatchPointer_private(uint UUID ) const{
1676 if( primitives.find(UUID) == primitives.end() ){
@@ -1761,6 +1897,7 @@
1681 return dynamic_cast<Patch*>(primitives.at(UUID));
1682}
1683
+
1685 if( primitives.find(UUID) == primitives.end() ){
1686 helios_runtime_error("ERROR (Context::getPatchSize): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
@@ -1769,7 +1906,9 @@
1689 }
1690 return dynamic_cast<Patch*>(primitives.at(UUID))->getSize();
1691}
+
1692
+
1694 if( primitives.find(UUID) == primitives.end() ){
1695 helios_runtime_error("ERROR (Context::getPatchCenter): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
@@ -1778,6 +1917,7 @@
1698 }
1699 return dynamic_cast<Patch*>(primitives.at(UUID))->getCenter();
1700}
+
1701
1702Triangle* Context::getTrianglePointer_private(uint UUID ) const{
1703 if( primitives.find(UUID) == primitives.end() ){
@@ -1788,6 +1928,7 @@
1708 return dynamic_cast<Triangle*>(primitives.at(UUID));
1709}
1710
+
1711helios::vec3 Context::getTriangleVertex( uint UUID, uint number ) const{
1712 if( primitives.find(UUID) == primitives.end() ){
1713 helios_runtime_error("ERROR (Context::getTriangleVertex): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
@@ -1798,7 +1939,9 @@
1718 }
1719 return dynamic_cast<Triangle*>(primitives.at(UUID))->getVertex( number );
1720}
+
1721
+
1722void Context::setTriangleVertices( uint UUID, const helios::vec3& vertex0, const helios::vec3& vertex1, const helios::vec3& vertex2 ) {
1723
1724 if( primitives.find(UUID) == primitives.end() ) {
@@ -1808,6 +1951,7 @@
1728 dynamic_cast<Triangle*>(primitives.at(UUID))->setVertices(vertex0, vertex1, vertex2);
1729
1730}
+
1731
1732Voxel* Context::getVoxelPointer_private(uint UUID ) const{
1733 if( primitives.find(UUID) == primitives.end() ){
@@ -1818,6 +1962,7 @@
1738 return dynamic_cast<Voxel*>(primitives.at(UUID));
1739}
1740
+
1742 if( primitives.find(UUID) == primitives.end() ){
1743 helios_runtime_error("ERROR (Context::getVoxelSize): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
@@ -1826,7 +1971,9 @@
1746 }
1747 return dynamic_cast<Voxel*>(primitives.at(UUID))->getSize();
1748}
+
1749
+
1751 if( primitives.find(UUID) == primitives.end() ){
1752 helios_runtime_error("ERROR (Context::getVoxelCenter): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
@@ -1835,11 +1982,15 @@
1755 }
1756 return dynamic_cast<Voxel*>(primitives.at(UUID))->getCenter();
1757}
+
1758
+
1760 return primitives.size();
1761}
+
1762
+
1763std::vector<uint> Context::getAllUUIDs() const{
1764 std::vector<uint> UUIDs(primitives.size());
1765 size_t i=0;
@@ -1853,7 +2004,9 @@
1773 UUIDs.resize(i);
1774 return UUIDs;
1775}
+
1776
+
1777void Context::hidePrimitive( const std::vector<uint> &UUIDs ){
1778 for( uint UUID : UUIDs ){
1779 if( !doesPrimitiveExist(UUID) ){
@@ -1862,14 +2015,18 @@
1782 primitives.at(UUID)->ishidden = true;
1783 }
1784}
+
1785
+
1786bool Context::isPrimitiveHidden(uint UUID) const {
1787 if( !doesPrimitiveExist(UUID) ){
1788 helios_runtime_error("ERROR (Context::isPrimitiveHidden): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1789 }
1790 return primitives.at(UUID)->ishidden;
1791}
+
1792
+
1793void Context::cleanDeletedUUIDs( std::vector<uint> &UUIDs ) const {
1794 for (int i = UUIDs.size() - 1; i >= 0; i--) {
1795 if (!doesPrimitiveExist(UUIDs.at(i))) {
@@ -1877,7 +2034,9 @@
1797 }
1798 }
1799}
+
1800
+
1801void Context::cleanDeletedUUIDs( std::vector<std::vector<uint>> &UUIDs ) const{
1802 for( int j=UUIDs.size()-1; j>=0; j-- ){
1803 for( int i=UUIDs.at(j).size()-1; i>=0; i-- ){
@@ -1887,7 +2046,9 @@
1807 }
1808 }
1809}
+
1810
+
1811void Context::cleanDeletedUUIDs( std::vector<std::vector<std::vector<uint>>> &UUIDs ) const{
1812 for( int k=UUIDs.size()-1; k>=0; k-- ) {
1813 for (int j = UUIDs.at(k).size() - 1; j >= 0; j--) {
@@ -1899,7 +2060,9 @@
1819 }
1820 }
1821}
+
1822
+
1823void Context::addTimeseriesData(const char* label, float value, const Date &date, const Time &time ){
1824
1825 //floating point value corresponding to date and time
@@ -1962,7 +2125,9 @@
1882 helios_runtime_error("ERROR (Context::addTimeseriesData): Failed to insert timeseries data for unknown reason.");
1883
1884}
+
1885
+
1886void Context::setCurrentTimeseriesPoint(const char* label, uint index ){
1887 if( timeseries_data.find(label) == timeseries_data.end() ){ //does not exist
1888 helios_runtime_error("ERROR (setCurrentTimeseriesPoint): Timeseries variable `" + std::string(label) + "' does not exist.");
@@ -1970,7 +2135,9 @@
1890 setDate( queryTimeseriesDate( label, index ) );
1891 setTime( queryTimeseriesTime( label, index ) );
1892}
+
1893
+
1894float Context::queryTimeseriesData(const char* label, const Date &date, const Time &time ) const{
1895 if( timeseries_data.find(label) == timeseries_data.end() ){ //does not exist
1896 helios_runtime_error("ERROR (setCurrentTimeseriesData): Timeseries variable `" + std::string(label) + "' does not exist.");
@@ -2020,11 +2187,15 @@
1940 }
1941
1942}
+
1943
+
1944float Context::queryTimeseriesData( const char* label ) const{
1945 return queryTimeseriesData( label, sim_date, sim_time );
1946}
+
1947
+
1948float Context::queryTimeseriesData( const char* label, const uint index ) const{
1949
1950 if( timeseries_data.find(label) == timeseries_data.end() ){ //does not exist
@@ -2034,7 +2205,9 @@
1954 return timeseries_data.at(label).at(index);
1955
1956}
+
1957
+
1958Time Context::queryTimeseriesTime( const char* label, const uint index ) const{
1959
1960 if( timeseries_data.find(label) == timeseries_data.end() ){ //does not exist
@@ -2070,7 +2243,9 @@
1990 return make_Time(hour,minute,second);
1991
1992}
+
1993
+
1994Date Context::queryTimeseriesDate( const char* label, const uint index ) const{
1995
1996 if( timeseries_data.find(label) == timeseries_data.end() ){ //does not exist
@@ -2090,7 +2265,9 @@
2010 return Julian2Calendar(JD,year);
2011
2012}
+
2013
+
2014uint Context::getTimeseriesLength( const char* label ) const{
2015
2016 uint size = 0;
@@ -2102,7 +2279,9 @@
2022
2023 return size;
2024}
+
2025
+
2026bool Context::doesTimeseriesVariableExist( const char* label ) const{
2027
2028 if( timeseries_data.find(label) == timeseries_data.end() ) { //does not exist
@@ -2112,7 +2291,9 @@
2032 }
2033
2034}
+
2035
+
2036std::vector<std::string> Context::listTimeseriesVariables() const{
2037 std::vector<std::string> labels;
2038 labels.reserve( timeseries_data.size() );
@@ -2121,8 +2302,10 @@
2041 }
2042 return labels;
2043}
+
2044
2045
+
2046void Context::getDomainBoundingBox( vec2& xbounds, vec2& ybounds, vec2& zbounds ) const{
2047
2048 xbounds.x = 1e8;
@@ -2157,7 +2340,9 @@
2077 }
2078
2079}
+
2080
+
2081void Context::getDomainBoundingBox( const std::vector<uint>& UUIDs, vec2& xbounds, vec2& ybounds, vec2& zbounds ) const{
2082
2083 xbounds.x = 1e8;
@@ -2192,7 +2377,9 @@
2112 }
2113
2114}
+
2115
+
2116void Context::getDomainBoundingSphere( vec3& center, float& radius ) const{
2117
2118 vec2 xbounds, ybounds, zbounds;
@@ -2206,7 +2393,9 @@
2126
2127
2128}
+
2129
+
2130void Context::getDomainBoundingSphere( const std::vector<uint>& UUIDs, vec3& center, float& radius ) const{
2131
2132 vec2 xbounds, ybounds, zbounds;
@@ -2220,7 +2409,9 @@
2140
2141
2142}
+
2143
+
2144void Context::cropDomainX(const vec2 &xbounds ){
2145
2146 const std::vector<uint> &UUIDs_all = getAllUUIDs();
@@ -2243,7 +2434,9 @@
2163 }
2164
2165}
+
2166
+
2167void Context::cropDomainY(const vec2 &ybounds ){
2168
2169 const std::vector<uint> &UUIDs_all = getAllUUIDs();
@@ -2266,7 +2459,9 @@
2186 }
2187
2188}
+
2189
+
2190void Context::cropDomainZ(const vec2 &zbounds ){
2191
2192 const std::vector<uint> &UUIDs_all = getAllUUIDs();
@@ -2289,7 +2484,9 @@
2209 }
2210
2211}
+
2212
+
2213void Context::cropDomain( std::vector<uint> &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds ){
2214
2215 size_t delete_count = 0;
@@ -2314,37 +2511,51 @@
2234 cleanDeletedUUIDs( UUIDs );
2235
2236}
+
2237
+
2238void Context::cropDomain(const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds ){
2239 std::vector<uint> UUIDs = getAllUUIDs();
2240 cropDomain( UUIDs, xbounds, ybounds, zbounds );
2241}
+
2242
+
2244 return OID;
2245}
+
2246
+
2248 return type;
2249}
+
2250
+
2252 return UUIDs.size();
2253}
+
2254
2255
+
2256std::vector<uint> CompoundObject::getPrimitiveUUIDs() const{
2257
2258 return UUIDs;
2259
2260}
+
2261
+
2263
2264 return find(UUIDs.begin(),UUIDs.end(),UUID)!=UUIDs.end();
2265
2266}
+
2267
+
2269
2270 vec2 xbounds, ybounds, zbounds;
@@ -2361,7 +2572,9 @@
2281
2282 return origin;
2283}
+
2284
+
2286
2287 float area = 0.f;
@@ -2377,7 +2590,9 @@
2297 return area;
2298
2299}
+
2300
+
2302 for( uint UUID : UUIDs){
2303
@@ -2387,7 +2602,9 @@
2307
2308 }
2309}
+
2310
+
2312 for( uint UUID : UUIDs){
2313
@@ -2397,7 +2614,9 @@
2317
2318 }
2319}
+
2320
+
2322 for( uint UUID : UUIDs){
2323
@@ -2407,7 +2626,9 @@
2327
2328 }
2329}
+
2330
+
2332 for( uint UUID : UUIDs){
2333
@@ -2417,7 +2638,9 @@
2337
2338 }
2339}
+
2340
+
2342 if( getTextureFile().empty() ){
2343 return false;
@@ -2425,11 +2648,15 @@
2345 return true;
2346 }
2347}
+
2348
+
2350 return texturefile;
2351}
+
2352
+
2354
2355 if( shift==nullorigin ){
@@ -2453,7 +2680,9 @@
2373 }
2374
2375}
+
2376
+
2377void CompoundObject::rotate(float rotation_radians, const char* rotation_axis_xyz_string ){
2378
2379 if(rotation_radians == 0 ){
@@ -2499,7 +2728,9 @@
2419 }
2420
2421}
+
2422
+
2423void CompoundObject::rotate(float rotation_radians, const helios::vec3& rotation_axis_vector ){
2424
2425 if(rotation_radians == 0 ){
@@ -2523,7 +2754,9 @@
2443 }
2444
2445}
+
2446
+
2447void CompoundObject::rotate(float rotation_radians, const helios::vec3& origin, const helios::vec3& rotation_axis_vector ){
2448
2449 if(rotation_radians == 0 ){
@@ -2547,15 +2780,21 @@
2467 }
2468
2469}
+
2470
+
2474
+
2478
+
2480
2481 if( scale.x==1.f && scale.y==1.f && scale.z==1.f ){
@@ -2579,13 +2818,17 @@
2499 }
2500
2501}
+
2502
+
2503void CompoundObject::getTransformationMatrix( float (&T)[16] ) const{
2504 for( int i=0; i<16; i++ ){
2505 T[i]=transform[i];
2506 }
2507}
+
2508
+
2510
2511 for( int i=0; i<16; i++ ){
@@ -2593,11 +2836,15 @@
2513 }
2514
2515}
+
2516
+
2517void CompoundObject::setPrimitiveUUIDs( const std::vector<uint> &a_UUIDs ){
2518 UUIDs = a_UUIDs;
2519}
+
2520
+
2522 auto it = find( UUIDs.begin(), UUIDs.end(), UUID );
2523 if( it!=UUIDs.end() ){
@@ -2606,21 +2853,29 @@
2526 primitivesarecomplete=false;
2527 }
2528}
+
2529
+
2530void CompoundObject::deleteChildPrimitive( const std::vector<uint> &a_UUIDs ){
2531 for( uint UUID : a_UUIDs ){
2533 }
2534}
+
2535
+
2537 return primitivesarecomplete;
2538}
+
2539
+
2541 return getObjectPointer(objID)->arePrimitivesComplete();
2542}
+
2543
+
2544void Context::cleanDeletedObjectIDs( std::vector<uint> &objIDs ) const {
2545 for (int i = objIDs.size() - 1; i >= 0; i--) {
2546 if (!doesObjectExist(objIDs.at(i))) {
@@ -2628,7 +2883,9 @@
2548 }
2549 }
2550}
+
2551
+
2552void Context::cleanDeletedObjectIDs( std::vector<std::vector<uint>> &objIDs ) const{
2553 for( int j=objIDs.size()-1; j>=0; j-- ){
2554 for (int i = objIDs.at(j).size() - 1; i >= 0; i--) {
@@ -2638,7 +2895,9 @@
2558 }
2559 }
2560}
+
2561
+
2562void Context::cleanDeletedObjectIDs( std::vector<std::vector<std::vector<uint>>> &objIDs ) const{
2563 for( int k=objIDs.size()-1; k>=0; k-- ) {
2564 for (int j = objIDs.at(k).size() - 1; j >= 0; j--) {
@@ -2650,22 +2909,30 @@
2570 }
2571 }
2572}
+
2573
+
2575 if( objects.find(ObjID) == objects.end() ){
2576 helios_runtime_error("ERROR (Context::getObjectPointer): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
2577 }
2578 return objects.at(ObjID);
2579}
+
2580
+
2582 return objects.size();
2583}
+
2584
+
2585bool Context::doesObjectExist( const uint ObjID ) const{
2586 return objects.find(ObjID) != objects.end();
2587}
+
2588
+
2589std::vector<uint> Context::getAllObjectIDs() const{
2590 std::vector<uint> objIDs(objects.size());
2591 size_t i=0;
@@ -2679,13 +2946,17 @@
2599 objIDs.resize(i);
2600 return objIDs;
2601}
+
2602
+
2603void Context::deleteObject(const std::vector<uint> &ObjIDs ){
2604 for( uint ObjID : ObjIDs){
2605 deleteObject( ObjID );
2606 }
2607}
+
2608
+
2609void Context::deleteObject(uint ObjID ){
2610
2611 if( objects.find(ObjID) == objects.end() ){
@@ -2705,7 +2976,9 @@
2626
2627}
+
2628
+
2629std::vector<uint> Context::copyObject(const std::vector<uint> &ObjIDs ){
2630
2631 std::vector<uint> ObjIDs_copy(ObjIDs.size());
@@ -2718,7 +2991,9 @@
2638 return ObjIDs_copy;
2639
2640}
+
2641
+
2642uint Context::copyObject(uint ObjID ){
2643
2644 if( objects.find(ObjID) == objects.end() ){
@@ -2826,7 +3101,9 @@
2746 currentObjectID++;
2747 return currentObjectID-1;
2748}
+
2749
+
2750std::vector<uint> Context::filterObjectsByData( const std::vector<uint> &IDs, const char* object_data, float threshold, const char* comparator) const{
2751
2752 std::vector<uint> output_object_IDs;
@@ -2913,84 +3190,116 @@
2833 return output_object_IDs;
2834
2835}
+
2836
+
2837void Context::translateObject(uint ObjID, const vec3& shift ){
2838 getObjectPointer(ObjID)->translate(shift);
2839}
+
2840
+
2841void Context::translateObject( const std::vector<uint>& ObjIDs, const vec3& shift ){
2842 for( uint ID : ObjIDs){
2843 getObjectPointer(ID)->translate(shift);
2844 }
2845}
+
2846
+
2847void Context::rotateObject(uint ObjID, float rotation_radians, const char* rotation_axis_xyz ){
2848 getObjectPointer(ObjID)->rotate(rotation_radians, rotation_axis_xyz);
2849}
+
2850
+
2851void Context::rotateObject(const std::vector<uint>& ObjIDs, float rotation_radians, const char* rotation_axis_xyz ){
2852 for( uint ID : ObjIDs){
2853 getObjectPointer(ID)->rotate(rotation_radians, rotation_axis_xyz);
2854 }
2855}
+
2856
+
2857void Context::rotateObject(uint ObjID, float rotation_radians, const vec3& rotation_axis_vector ){
2858 getObjectPointer(ObjID)->rotate(rotation_radians, rotation_axis_vector);
2859}
+
2860
+
2861void Context::rotateObject(const std::vector<uint>& ObjIDs, float rotation_radians, const vec3& rotation_axis_vector ){
2862 for( uint ID : ObjIDs){
2863 getObjectPointer(ID)->rotate(rotation_radians, rotation_axis_vector);
2864 }
2865}
+
2866
+
2867void Context::rotateObject(uint ObjID, float rotation_radians, const vec3& rotation_origin, const vec3& rotation_axis_vector ){
2868 getObjectPointer(ObjID)->rotate(rotation_radians, rotation_origin, rotation_axis_vector);
2869}
+
2870
+
2871void Context::rotateObject(const std::vector<uint>& ObjIDs, float rotation_radians, const vec3& rotation_origin, const vec3& rotation_axis_vector ){
2872 for( uint ID : ObjIDs){
2873 getObjectPointer(ID)->rotate(rotation_radians, rotation_origin, rotation_axis_vector);
2874 }
2875}
+
2876
+
2877void Context::scaleObject( uint ObjID, const helios::vec3 &scalefact ){
2878 getObjectPointer(ObjID)->scale(scalefact);
2879}
+
2880
+
2881void Context::scaleObject( const std::vector<uint>& ObjIDs, const helios::vec3 &scalefact ){
2882 for( uint ID : ObjIDs){
2883 getObjectPointer(ID)->scale(scalefact);
2884 }
2885}
+
2886
+
2887void Context::scaleObjectAboutCenter( uint ObjID, const helios::vec3 &scalefact ){
2888 getObjectPointer(ObjID)->scaleAboutCenter(scalefact);
2889}
+
2890
+
2891void Context::scaleObjectAboutCenter( const std::vector<uint>& ObjIDs, const helios::vec3 &scalefact ){
2892 for( uint ID : ObjIDs){
2893 getObjectPointer(ID)->scaleAboutCenter(scalefact);
2894 }
2895}
+
2896
+
2897void Context::scaleObjectAboutPoint( uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point ){
2898 getObjectPointer(ObjID)->scaleAboutPoint(scalefact, point);
2899}
+
2900
+
2901void Context::scaleObjectAboutPoint( const std::vector<uint>& ObjIDs, const helios::vec3 &scalefact, const helios::vec3 &point ){
2902 for( uint ID : ObjIDs){
2903 getObjectPointer(ID)->scaleAboutPoint(scalefact, point);
2904 }
2905}
+
2906
+
2907std::vector<uint> Context::getObjectPrimitiveUUIDs( uint ObjID ) const{
2908
2909 const std::vector<uint> ObjIDs = {ObjID};
2910 return getObjectPrimitiveUUIDs(ObjIDs);
2911
2912}
+
2913
+
2914std::vector<uint> Context::getObjectPrimitiveUUIDs( const std::vector<uint> &ObjIDs ) const{
2915
2916 std::vector<uint> output_UUIDs;
@@ -3002,7 +3311,9 @@
2922 }
2923 return output_UUIDs;
2924}
+
2925
+
2926std::vector<uint> Context::getObjectPrimitiveUUIDs( const std::vector<std::vector<uint> > &ObjIDs ) const{
2927
2928 std::vector<uint> output_UUIDs;
@@ -3016,11 +3327,15 @@
2936 }
2937 return output_UUIDs;
2938}
+
2939
+
2941 return getObjectPointer(ObjID)->getObjectType();
2942}
+
2943
+
2944float Context::getTileObjectAreaRatio(uint ObjectID) const{
2945
2946 if( getObjectPointer(ObjectID)->getObjectType() != OBJECT_TYPE_TILE )
@@ -3048,7 +3363,9 @@
2968
2969 }
2970}
+
2971
+
2972std::vector<float> Context::getTileObjectAreaRatio(const std::vector<uint> &ObjectIDs) const {
2973
2974 std::vector<float> AreaRatios(ObjectIDs.size());
@@ -3058,7 +3375,9 @@
2978
2979 return AreaRatios;
2980}
+
2981
+
2982void Context::setTileObjectSubdivisionCount(const std::vector<uint> &ObjectIDs, const int2 &new_subdiv)
2983{
2984
@@ -3187,7 +3506,9 @@
3107 deleteObject(object_templates);
3108
3109}
+
3110
+
3111void Context::setTileObjectSubdivisionCount(const std::vector<uint> &ObjectIDs, float area_ratio)
3112{
3113
@@ -3375,7 +3696,9 @@
3295 deleteObject(object_templates);
3296
3297}
+
3298
+
3299Tile::Tile(uint a_OID, const std::vector<uint> &a_UUIDs, const int2 &a_subdiv, const char *a_texturefile, helios::Context *a_context) {
3300
3301 makeIdentityMatrix( transform );
@@ -3388,21 +3711,27 @@
3308 context = a_context;
3309
3310}
+
3311
+
3313 if( objects.find(ObjID) == objects.end() ){
3314 helios_runtime_error("ERROR (Context::getTileObjectPointer): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
3315 }
3316 return dynamic_cast<Tile*>(objects.at(ObjID));
3317}
+
3318
+
3320 const std::vector<vec3> &vertices = getVertices();
3321 float l = (vertices.at(1)-vertices.at(0)).magnitude();
3322 float w = (vertices.at(3)-vertices.at(0)).magnitude();
3323 return make_vec2(l,w);
3324}
+
3325
+
3327
3328 vec3 center;
@@ -3418,17 +3747,23 @@
3338 return center;
3339
3340}
+
3341
3342
+
3344 return subdiv;
3345}
+
3346
+
3348 subdiv = a_subdiv;
3349}
+
3350
3351
+
3352std::vector<helios::vec3> Tile::getVertices() const{
3353
3354 std::vector<helios::vec3> vertices;
@@ -3461,19 +3796,25 @@
3381 return vertices;
3382
3383}
+
3384
+
3386
3387 return context->getPrimitiveNormal( UUIDs.front() );
3388
3389}
+
3390
+
3391std::vector<helios::vec2> Tile::getTextureUV() const{
3392
3393 return { make_vec2(0,0), make_vec2(1,0), make_vec2(1,1), make_vec2(0,1) };
3394
3395}
+
3396
+
3397Sphere::Sphere(uint a_OID, const std::vector<uint> &a_UUIDs, uint a_subdiv, const char *a_texturefile, helios::Context *a_context) {
3398
3399 makeIdentityMatrix( transform );
@@ -3486,14 +3827,18 @@
3406 context = a_context;
3407
3408}
+
3409
+
3411 if( objects.find(ObjID) == objects.end() ){
3412 helios_runtime_error("ERROR (Context::getSphereObjectPointer): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
3413 }
3414 return dynamic_cast<Sphere*>(objects.at(ObjID));
3415}
+
3416
+
3418
3419 vec3 n0(0,0,0);
@@ -3515,7 +3860,9 @@
3435 return radii;
3436
3437}
+
3438
+
3440
3441 vec3 center;
@@ -3531,20 +3878,28 @@
3451 return center;
3452
3453}
+
3454
+
3456 return subdiv;
3457}
+
3458
+
3459void Sphere::setSubdivisionCount( uint a_subdiv ){
3460 subdiv = a_subdiv;
3461}
+
3462
+
3463float Sphere::getVolume() const{
3464 const vec3 &radii = getRadius();
3465 return 4.f/3.f * M_PI * radii.x * radii.y * radii.z;
3466}
+
3467
+
3468Tube::Tube(uint a_OID, const std::vector<uint> &a_UUIDs, const std::vector<vec3> &a_nodes, const std::vector<float> &a_radius, const std::vector<helios::RGBcolor> &a_colors, const std::vector<std::vector<helios::vec3>> &a_triangle_vertices,
3469 uint a_subdiv, const char *a_texturefile, helios::Context *a_context) {
3470
@@ -3562,14 +3917,18 @@
3482 context = a_context;
3483
3484}
+
3485
+
3487 if( objects.find(ObjID) == objects.end() ){
3488 helios_runtime_error("ERROR (Context::getTubeObjectPointer): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
3489 }
3490 return dynamic_cast<Tube*>(objects.at(ObjID));
3491}
+
3492
+
3493std::vector<helios::vec3> Tube::getNodes() const{
3494
3495 std::vector<vec3> nodes_T;
@@ -3584,7 +3943,9 @@
3504 return nodes_T;
3505
3506}
+
3507
+
3508std::vector<float> Tube::getNodeRadii() const{
3509 std::vector<float> radius_T;
3510 radius_T.resize(radius.size());
@@ -3601,19 +3962,27 @@
3521 }
3522 return radius_T;
3523}
+
3524
+
3525std::vector<helios::RGBcolor> Tube::getNodeColors() const{
3526 return colors;
3527}
+
3528
+
3529std::vector<std::vector<helios::vec3>> Tube::getTriangleVertices() const{
3530 return triangle_vertices;
3531}
+
3532
+
3534 return subdiv;
3535}
+
3536
+
3537float Tube::getLength() const{
3538
3539 float length = 0.f;
@@ -3623,7 +3992,9 @@
3543 return length;
3544
3545}
+
3546
+
3547float Tube::getVolume() const{
3548
3549 const std::vector<float> &radii = getNodeRadii();
@@ -3637,7 +4008,9 @@
3557
3558 return volume;
3559}
+
3560
+
3561float Tube::getSegmentVolume( uint segment_index ) const{
3562
3563 if( segment_index>=nodes.size()-1 ){
@@ -3651,7 +4024,9 @@
3571
3572 return volume;
3573}
+
3574
+
3575void Tube::appendTubeSegment( const helios::vec3 &node_position, float node_radius, const helios::RGBcolor &node_color ){
3576
3577 //\todo This is a computationally inefficient method for appending the tube, but it ensures that there is no twisting of the tube relative to the previous tube segments.
@@ -3768,7 +4143,9 @@
3688 updateTriangleVertices();
3689
3690}
+
3691
+
3692void Tube::appendTubeSegment(const helios::vec3 &node_position, float node_radius, const char* texturefile, const helios::vec2 &textureuv_ufrac) {
3693
3694 //\todo This is a computationally inefficient method for appending the tube, but it ensures that there is no twisting of the tube relative to the previous tube segments.
@@ -3902,7 +4279,9 @@
3822
3823 updateTriangleVertices();
3824}
+
3825
+
3826void Tube::scaleTubeGirth( float S ){
3827
3828 for( int segment=0; segment<triangle_vertices.size(); segment++ ){
@@ -3922,7 +4301,9 @@
3842 updateTriangleVertices();
3843
3844}
+
3845
+
3846void Tube::setTubeRadii( const std::vector<float> &node_radii ){
3847
3848 if( node_radii.size() != nodes.size() ){
@@ -3945,7 +4326,9 @@
3865
3866 updateTriangleVertices();
3867}
+
3868
+
3870
3871 for( int segment=0; segment<triangle_vertices.size()-1; segment++ ){
@@ -3971,7 +4354,9 @@
3891 updateTriangleVertices();
3892
3893}
+
3894
+
3895void Tube::setTubeNodes( const std::vector<helios::vec3> &node_xyz ){
3896
3897 if( node_xyz.size() != nodes.size() ){
@@ -3992,6 +4377,7 @@
3912 updateTriangleVertices();
3913
3914}
+
3915
3916void Tube::updateTriangleVertices(){
3917
@@ -4018,6 +4404,7 @@
3938
3939}
3940
+
3941Box::Box(uint a_OID, const std::vector<uint> &a_UUIDs, const int3 &a_subdiv, const char *a_texturefile, helios::Context *a_context) {
3942
3943 makeIdentityMatrix( transform );
@@ -4030,14 +4417,18 @@
3950 context = a_context;
3951
3952}
+
3953
+
3955 if( objects.find(ObjID) == objects.end() ){
3956 helios_runtime_error("ERROR (Context::getBoxObjectPointer): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
3957 }
3958 return dynamic_cast<Box*>(objects.at(ObjID));
3959}
+
3960
+
3962
3963 vec3 n0(0,0,0), nx(1,0,0), ny(0,1,0), nz(0,0,1);
@@ -4056,7 +4447,9 @@
3976 return make_vec3( x, y, z );
3977
3978}
+
3979
+
3981
3982 vec3 center;
@@ -4072,20 +4465,28 @@
3992 return center;
3993
3994}
+
3995
+
3997 return subdiv;
3998}
+
3999
+
4001 subdiv = a_subdiv;
4002}
+
4003
+
4004float Box::getVolume() const{
4005 const vec3 &size = getSize();
4006 return size.x * size.y * size.z;
4007}
+
4008
+
4009Disk::Disk(uint a_OID, const std::vector<uint> &a_UUIDs, int2 a_subdiv, const char *a_texturefile, helios::Context *a_context) {
4010
4011 makeIdentityMatrix( transform );
@@ -4098,14 +4499,18 @@
4018 context = a_context;
4019
4020}
+
4021
+
4023 if( objects.find(ObjID) == objects.end() ){
4024 helios_runtime_error("ERROR (Context::getDiskObjectPointer): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
4025 }
4026 return dynamic_cast<Disk*>(objects.at(ObjID));
4027}
+
4028
+
4030
4031 vec3 n0(0,0,0), nx(1,0,0), ny(0,1,0);
@@ -4121,7 +4526,9 @@
4041 return make_vec2(x,y);
4042
4043}
+
4044
+
4046
4047 vec3 center;
@@ -4137,15 +4544,21 @@
4057 return center;
4058
4059}
+
4060
+
4062 return subdiv;
4063}
+
4064
+
4066 subdiv = a_subdiv;
4067}
+
4068
+
4069Polymesh::Polymesh(uint a_OID, const std::vector<uint> &a_UUIDs, const char *a_texturefile, helios::Context *a_context) {
4070
4071 makeIdentityMatrix( transform );
@@ -4157,14 +4570,18 @@
4077 context = a_context;
4078
4079}
+
4080
+
4082 if( objects.find(ObjID) == objects.end() ){
4083 helios_runtime_error("ERROR (Context::getPolymeshObjectPointer): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
4084 }
4085 return dynamic_cast<Polymesh*>(objects.at(ObjID));
4086}
+
4087
+
4089 float volume = 0.f;
4090 for (uint UUID : UUIDs ) {
@@ -4183,7 +4600,9 @@
4103 }
4104 return std::abs(volume);
4105}
+
4106
+
4107Cone::Cone(uint a_OID, const std::vector<uint> &a_UUIDs, const vec3 &a_node0, const vec3 &a_node1, float a_radius0,
4108 float a_radius1, uint a_subdiv, const char *a_texturefile, helios::Context *a_context) {
4109
@@ -4199,14 +4618,18 @@
4119 radii = {a_radius0, a_radius1};
4120
4121}
+
4122
+
4123Cone* Context::getConeObjectPointer( const uint ObjID ) const{
4124 if( objects.find(ObjID) == objects.end() ){
4125 helios_runtime_error("ERROR (Context::getConeObjectPointer): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
4126 }
4127 return dynamic_cast<Cone*>(objects.at(ObjID));
4128}
+
4129
+
4130std::vector<helios::vec3> Cone::getNodeCoordinates() const{
4131
4132 std::vector<vec3> nodes_T;
@@ -4220,7 +4643,9 @@
4140
4141 return nodes_T;
4142}
+
4143
+
4145
4146 if(node_index < 0 || node_index > 1 ){
@@ -4235,11 +4660,15 @@
4155
4156 return node_T;
4157}
+
4158
+
4159std::vector<float> Cone::getNodeRadii() const{
4160 return radii;
4161}
+
4162
+
4163float Cone::getNodeRadius( int node_index ) const{
4164 if(node_index < 0 || node_index > 1 ){
4165 helios_runtime_error("ERROR (Cone::getNodeRadius): node number must be 0 or 1.");
@@ -4247,22 +4676,28 @@
4167
4168 return radii.at(node_index);
4169}
+
4170
+
4172 return subdiv;
4173}
+
4174
+
4175void Cone::setSubdivisionCount( uint a_subdiv ){
4176 subdiv = a_subdiv;
4177}
+
4178
+
4180
4181 std::vector<vec3> nodes_T;
4182 nodes_T.resize( 2 );
4183
4184 for( uint i=0; i<2; i++ ){
-
4185 nodes_T.at(i).x = transform[0] * nodes.at(i).x + transform[1] * nodes.at(i).y + transform[2] * nodes.at(i).z + transform[3];
+
4185 nodes_T.at(i).x = transform[0] * nodes.at(i).x + transform[1] * nodes.at(i).y + transform[2] * nodes.at(i).z + transform[3];
4186 nodes_T.at(i).y = transform[4] * nodes.at(i).x + transform[5] * nodes.at(i).y + transform[6] * nodes.at(i).z + transform[7];
4187 nodes_T.at(i).z = transform[8] * nodes.at(i).x + transform[9] * nodes.at(i).y + transform[10] * nodes.at(i).z + transform[11];
4188 }
@@ -4273,7 +4708,9 @@
4193
4194 return axis_unit_vector;
4195}
+
4196
+
4197float Cone::getLength() const{
4198
4199 std::vector<vec3> nodes_T;
@@ -4288,7 +4725,9 @@
4208 float length = powf(powf(nodes_T.at(1).x - nodes_T.at(0).x, 2) + powf(nodes_T.at(1).y - nodes_T.at(0).y, 2) + powf(nodes_T.at(1).z - nodes_T.at(0).z, 2), 0.5);
4209 return length;
4210}
+
4211
+
4212void Cone::scaleLength( float S ){
4213
4214 //get the nodes and radii of the nodes with transformation matrix applied
@@ -4337,7 +4776,9 @@
4257 context->getConeObjectPointer(OID)->translate(nodes_T.at(0));
4258
4259}
+
4260
+
4261void Cone::scaleGirth( float S ){
4262
4263 //get the nodes and radii of the nodes with transformation matrix applied
@@ -4378,7 +4819,9 @@
4298 radii.at(1) *= S;
4299
4300}
+
4301
+
4302float Cone::getVolume() const{
4303 float r0 = getNodeRadius(0);
4304 float r1 = getNodeRadius(1);
@@ -4386,25 +4829,35 @@
4306
4307 return M_PI * h / 3.f * (r0*r0 + r0*r1 + r1*r1);
4308}
+
4309
+
4310uint Context::addSphereObject(uint Ndivs, const vec3 &center, float radius ){
4311 return addSphereObject(Ndivs,center,{radius,radius,radius},{0.f,0.75f,0.f}); //Default color is green
4312}
+
4313
+
4314uint Context::addSphereObject(uint Ndivs, const vec3 &center, float radius, const RGBcolor &color ){
4315 return addSphereObject(Ndivs,center,{radius,radius,radius},color);
4316}
+
4317
+
4318uint Context::addSphereObject(uint Ndivs, const vec3 &center, float radius, const char* texturefile ){
4319 return addSphereObject(Ndivs,center,{radius,radius,radius},texturefile);
4320}
+
4321
+
4322uint Context::addSphereObject(uint Ndivs, const vec3 &center, const vec3 &radius ){
4323
4324 return addSphereObject(Ndivs,center,radius,{0.f,0.75f,0.f}); //Default color is green
4325
4326}
+
4327
+
4328uint Context::addSphereObject(uint Ndivs, const vec3 &center, const vec3 &radius, const RGBcolor &color ){
4329
4330 if( radius.x<=0.f || radius.y<=0.f || radius.z<=0.f ){
@@ -4489,7 +4942,9 @@
4409 return currentObjectID-1;
4410
4411}
+
4412
+
4413uint Context::addSphereObject(uint Ndivs, const vec3 &center, const vec3 &radius, const char* texturefile ){
4414
4415 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -4626,14 +5081,18 @@
4546 return currentObjectID-1;
4547
4548}
+
4549
+
4550uint Context::addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv) {
4551
4552 RGBcolor color = make_RGBcolor(0.f,0.75f,0.f); //Default color is green
4553
4554 return addTileObject(center,size,rotation,subdiv,color);
4555}
+
4556
+
4557uint Context::addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color ){
4558
4559 if( size.x==0 || size.y==0 ){
@@ -4698,7 +5157,9 @@
4618 return currentObjectID-1;
4619
4620}
+
4621
+
4622uint Context::addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char* texturefile ){
4623
4624 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -4804,7 +5265,9 @@
4724 return currentObjectID-1;
4725
4726}
+
4727
+
4728uint Context::addTubeObject(uint radial_subdivisions, const std::vector<vec3> &nodes, const std::vector<float> &radius ){
4729
4730 uint node_count = nodes.size();
@@ -4819,7 +5282,9 @@
4739 return addTubeObject(radial_subdivisions, nodes, radius, color);
4740
4741}
+
4742
+
4743uint Context::addTubeObject(uint radial_subdivisions, const std::vector<vec3> &nodes, const std::vector<float> &radius, const std::vector<RGBcolor> &color ){
4744
4745 const uint node_count = nodes.size();
@@ -4933,7 +5398,9 @@
4853 return currentObjectID-1;
4854
4855}
+
4856
+
4857uint Context::addTubeObject(uint radial_subdivisions, const std::vector<vec3> &nodes, const std::vector<float> &radius, const char* texturefile ){
4858 size_t node_count = nodes.size();
4859 std::vector<float> textureuv_ufrac(node_count);
@@ -4943,7 +5410,9 @@
4863
4864 return addTubeObject( radial_subdivisions, nodes, radius, texturefile, textureuv_ufrac );
4865}
+
4866
+
4867uint Context::addTubeObject(uint radial_subdivisions, const std::vector<vec3> &nodes, const std::vector<float> &radius, const char* texturefile, const std::vector<float> &textureuv_ufrac) {
4868 if (!validateTextureFileExtenstion(texturefile)) {
4869 helios_runtime_error("ERROR (Context::addTubeObject): Texture file " + std::string(texturefile) + " is not PNG or JPEG format.");
@@ -5076,22 +5545,30 @@
4996
4997 return currentObjectID - 1;
4998}
+
4999
+
5000uint Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv ){
5001
5002 RGBcolor color = make_RGBcolor(0.f,0.75f,0.f); //Default color is green
5003
5004 return addBoxObject(center,size,subdiv,color,false);
5005}
+
5006
+
5007uint Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color ){
5008 return addBoxObject(center,size,subdiv,color,false);
5009}
+
5010
+
5011uint Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv, const char* texturefile ){
5012 return addBoxObject(center,size,subdiv,texturefile,false);
5013}
+
5014
+
5015uint Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals ){
5016
5017 if( size.x<=0 || size.y<=0 || size.z<=0 ){
@@ -5212,7 +5689,9 @@
5132 return currentObjectID-1;
5133
5134}
+
5135
+
5136uint Context::addBoxObject(vec3 center, const vec3 &size, const int3 &subdiv, const char* texturefile, bool reverse_normals ){
5137
5138 if( !validateTextureFileExtenstion(texturefile) ){
@@ -5332,31 +5811,45 @@
5252
5253
5254}
+
5255
+
5256uint Context::addDiskObject(uint Ndivs, const vec3 &center, const vec2 &size ){
5257 return addDiskObject(make_int2(Ndivs,1),center,size,make_SphericalCoord(0,0),make_RGBAcolor(1,0,0,1));
5258}
+
5259
+
5260uint Context::addDiskObject(uint Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation ){
5261 return addDiskObject(make_int2(Ndivs,1),center,size,rotation,make_RGBAcolor(1,0,0,1));
5262}
+
5263
+
5264uint Context::addDiskObject(uint Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color ){
5265 return addDiskObject(make_int2(Ndivs,1),center,size,rotation,make_RGBAcolor(color,1));
5266}
+
5267
+
5268uint Context::addDiskObject(uint Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBAcolor &color ){
5269 return addDiskObject(make_int2(Ndivs,1),center,size,rotation,color);
5270}
+
5271
+
5272uint Context::addDiskObject(uint Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const char* texture_file ){
5273 return addDiskObject(make_int2(Ndivs,1),center,size,rotation,texture_file);
5274}
+
5275
+
5276uint Context::addDiskObject(const int2 &Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color ){
5277 return addDiskObject(Ndivs,center,size,rotation,make_RGBAcolor(color,1));
5278}
+
5279
+
5280uint Context::addDiskObject(const int2 &Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBAcolor &color ){
5281
5282 std::vector<uint> UUID;
@@ -5414,7 +5907,9 @@
5334 return currentObjectID-1;
5335
5336}
+
5337
+
5338uint Context::addDiskObject(const int2 &Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const char* texturefile ){
5339
5340 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -5475,7 +5970,9 @@
5395 return currentObjectID-1;
5396
5397}
+
5398
+
5399uint Context::addPolymeshObject(const std::vector<uint> &UUIDs ){
5400
5401 if( UUIDs.empty() ){
@@ -5502,14 +5999,18 @@
5422 return currentObjectID-1;
5423
5424}
+
5425
+
5426uint Context::addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1 ){
5427
5428 RGBcolor color;
5429 color = make_RGBcolor(0.f,0.75f,0.f); //Default color is green
5430 return addConeObject(Ndivs, node0, node1, radius0, radius1, color);
5431}
+
5432
+
5433uint Context::addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const RGBcolor &color ){
5434
5435 const std::vector<helios::vec3> nodes{node0, node1};
@@ -5604,7 +6105,9 @@
5524 return currentObjectID-1;
5525
5526}
+
5527
+
5528uint Context::addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char* texturefile ){
5529
5530 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -5722,7 +6225,9 @@
5642 return currentObjectID-1;
5643
5644}
+
5645
+
5646std::vector<uint> Context::addSphere(uint Ndivs, const vec3 &center, float radius ){
5647
5648 RGBcolor color = make_RGBcolor(0.f,0.75f,0.f); //Default color is green
@@ -5730,7 +6235,9 @@
5650 return addSphere(Ndivs,center,radius,color);
5651
5652}
+
5653
+
5654std::vector<uint> Context::addSphere(uint Ndivs, const vec3 &center, float radius, const RGBcolor &color ){
5655
5656 std::vector<uint> UUID;
@@ -5780,7 +6287,9 @@
5700
5701
5702}
+
5703
+
5704std::vector<uint> Context::addSphere(uint Ndivs, const vec3 &center, float radius, const char* texturefile ){
5705
5706 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -5885,14 +6394,18 @@
5805
5806
5807}
+
5808
+
5809std::vector<uint> Context::addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv ){
5810
5811 RGBcolor color = make_RGBcolor(0.f,0.75f,0.f); //Default color is green
5812
5813 return addTile(center,size,rotation,subdiv,color);
5814}
+
5815
+
5816std::vector<uint> Context::addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color ){
5817
5818 std::vector<uint> UUID;
@@ -5929,7 +6442,9 @@
5849 return UUID;
5850
5851}
+
5852
+
5853std::vector<uint> Context::addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char* texturefile ){
5854
5855 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -6006,7 +6521,9 @@
5926 return UUID;
5927
5928}
+
5929
+
5930std::vector<uint> Context::addTube(uint Ndivs, const std::vector<vec3> &nodes, const std::vector<float> &radius ){
5931
5932 uint node_count = nodes.size();
@@ -6021,7 +6538,9 @@
5941 return addTube(Ndivs,nodes,radius,color);
5942
5943}
+
5944
+
5945std::vector<uint> Context::addTube(uint radial_subdivisions, const std::vector<vec3> &nodes, const std::vector<float> &radius, const std::vector<RGBcolor> &color ){
5946
5947 const uint node_count = nodes.size();
@@ -6113,7 +6632,9 @@
6033 return UUIDs;
6034
6035}
+
6036
+
6037std::vector<uint> Context::addTube(uint radial_subdivisions, const std::vector<vec3> &nodes, const std::vector<float> &radius, const char* texturefile ){
6038
6039 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -6172,7 +6693,7 @@
6092 nvec.normalize();
6093
6094 for(int j=0; j < radial_subdivisions + 1; j++ ){
-
6095 normal[j][i].x=cfact[j]*radius[i]*nvec.x+sfact[j]*radius[i]*convec.x;
+
6095 normal[j][i].x=cfact[j]*radius[i]*nvec.x+sfact[j]*radius[i]*convec.x;
6096 normal[j][i].y=cfact[j]*radius[i]*nvec.y+sfact[j]*radius[i]*convec.y;
6097 normal[j][i].z=cfact[j]*radius[i]*nvec.z+sfact[j]*radius[i]*convec.z;
6098
@@ -6223,22 +6744,30 @@
6143 return UUIDs;
6144
6145}
+
6146
+
6147std::vector<uint> Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv ){
6148
6149 RGBcolor color = make_RGBcolor(0.f,0.75f,0.f); //Default color is green
6150
6151 return addBox(center,size,subdiv,color,false);
6152}
+
6153
+
6154std::vector<uint> Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color ){
6155 return addBox(center,size,subdiv,color,false);
6156}
+
6157
+
6158std::vector<uint> Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const char* texturefile ){
6159 return addBox(center,size,subdiv,texturefile,false);
6160}
+
6161
+
6162std::vector<uint> Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals ){
6163
6164 std::vector<uint> UUID;
@@ -6332,7 +6861,9 @@
6252 return UUID;
6253
6254}
+
6255
+
6256std::vector<uint> Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const char* texturefile, bool reverse_normals ){
6257
6258 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -6432,31 +6963,45 @@
6352 return UUID;
6353
6354}
+
6355
+
6356std::vector<uint> Context::addDisk(uint Ndivs, const vec3 &center, const vec2 &size ){
6357 return addDisk(make_int2(Ndivs,1),center,size,make_SphericalCoord(0,0),make_RGBAcolor(1,0,0,1));
6358}
+
6359
+
6360std::vector<uint> Context::addDisk(uint Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation ){
6361 return addDisk(make_int2(Ndivs,1),center,size,rotation,make_RGBAcolor(1,0,0,1));
6362}
+
6363
+
6364std::vector<uint> Context::addDisk(uint Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color ){
6365 return addDisk(make_int2(Ndivs,1),center,size,rotation,make_RGBAcolor(color,1));
6366}
+
6367
+
6368std::vector<uint> Context::addDisk(uint Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBAcolor &color ){
6369 return addDisk(make_int2(Ndivs,1),center,size,rotation,color);
6370}
+
6371
+
6372std::vector<uint> Context::addDisk(uint Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const char* texture_file ){
6373 return addDisk(make_int2(Ndivs,1),center,size,rotation,texture_file);
6374}
+
6375
+
6376std::vector<uint> Context::addDisk(const int2 &Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color ){
6377 return addDisk(Ndivs,center,size,rotation,make_RGBAcolor(color,1));
6378}
+
6379
+
6380std::vector<uint> Context::addDisk(const int2 &Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBAcolor &color ){
6381
6382 std::vector<uint> UUID;
@@ -6493,7 +7038,9 @@
6413 return UUID;
6414
6415}
+
6416
+
6417std::vector<uint> Context::addDisk(const int2 &Ndivs, const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const char* texturefile ){
6418
6419 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -6535,7 +7082,9 @@
6455 return UUID;
6456
6457}
+
6458
+
6459std::vector<uint> Context::addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1 ){
6460
6461 RGBcolor color;
@@ -6544,7 +7093,9 @@
6464 return addCone(Ndivs, node0, node1, radius0, radius1, color);
6465
6466}
+
6467
+
6468std::vector<uint> Context::addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, RGBcolor &color ){
6469
6470 std::vector<helios::vec3> nodes{node0, node1};
@@ -6632,7 +7183,9 @@
6552 return UUID;
6553
6554}
+
6555
+
6556std::vector<uint> Context::addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char* texturefile ){
6557
6558 if( !validateTextureFileExtenstion(texturefile) ) {
@@ -6742,13 +7295,17 @@
6662 return UUID;
6663
6664}
+
6665
+
6666void Context::colorPrimitiveByDataPseudocolor( const std::vector<uint> &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors ){
6667
6668 colorPrimitiveByDataPseudocolor(UUIDs,primitive_data,colormap, Ncolors,9999999,-9999999);
6669
6670}
+
6671
+
6672void Context::colorPrimitiveByDataPseudocolor( const std::vector<uint> &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors, float data_min, float data_max ){
6673
6674 std::map<uint,float> pcolor_data;
@@ -6846,6 +7403,7 @@
6766 }
6767
6768}
+
6769
6770std::vector<RGBcolor> Context::generateColormap( const std::vector<helios::RGBcolor> &ctable, const std::vector<float> &cfrac, uint Ncolors ){
6771
@@ -7047,6 +7605,7 @@
6967
6968}
6969
+
6971
6972 for(auto & primitive : primitives){
@@ -7060,11 +7619,15 @@
6980 }
6981
6982}
+
6983
+
6985 return getPrimitivePointer_private(UUID)->getType();
6986}
+
6987
+
6988void Context::setPrimitiveParentObjectID(uint UUID, uint objID){
6989
6990 uint current_objID = getPrimitivePointer_private(UUID)->getParentObjectID();
@@ -7087,23 +7650,31 @@
7007 }
7008
7009}
+
7010
+
7011void Context::setPrimitiveParentObjectID(const std::vector<uint> &UUIDs, uint objID) {
7012 for( uint UUID : UUIDs){
7013 setPrimitiveParentObjectID(UUID, objID);
7014 }
7015}
+
7016
+
7018 return getPrimitivePointer_private(UUID)->getParentObjectID();
7019}
+
7020
7021
+
7022std::vector<uint> Context::getUniquePrimitiveParentObjectIDs(const std::vector<uint> &UUIDs) const {
7023 return getUniquePrimitiveParentObjectIDs(UUIDs, false);
7024}
+
7025
7026
+
7027std::vector<uint> Context::getUniquePrimitiveParentObjectIDs(const std::vector<uint> &UUIDs, bool include_ObjID_zero) const {
7028
7029 //vector of parent object ID for each primitive
@@ -7129,16 +7700,22 @@
7049
7050 return primitiveObjIDs;
7051}
+
7052
+
7053float Context::getPrimitiveArea(uint UUID) const {
7054 return getPrimitivePointer_private(UUID)->getArea();
7055}
+
7056
+
7057void Context::getPrimitiveBoundingBox( uint UUID, vec3 &min_corner, vec3 &max_corner ) const{
7058 const std::vector<uint> UUIDs = {UUID};
7059 getPrimitiveBoundingBox( UUIDs, min_corner, max_corner );
7060}
+
7061
+
7062void Context::getPrimitiveBoundingBox( const std::vector<uint> &UUIDs, vec3 &min_corner, vec3 &max_corner ) const{
7063
7064
@@ -7180,70 +7757,100 @@
7100 p++;
7101 }
7102}
+
7103
+
7105 return getPrimitivePointer_private(UUID)->getNormal();
7106}
+
7107
+
7108void Context::getPrimitiveTransformationMatrix(uint UUID, float (&T)[16] ) const {
7109 getPrimitivePointer_private(UUID)->getTransformationMatrix( T );
7110}
+
7111
+
7112void Context::setPrimitiveTransformationMatrix(uint UUID, float (&T)[16] ) {
7113 getPrimitivePointer_private(UUID)->setTransformationMatrix(T);
7114}
+
7115
+
7116void Context::setPrimitiveTransformationMatrix(const std::vector<uint> &UUIDs, float (&T)[16] ) {
7117 for( uint UUID : UUIDs){
7118 getPrimitivePointer_private(UUID)->setTransformationMatrix(T);
7119 }
7120}
+
7121
+
7122std::vector<helios::vec3> Context::getPrimitiveVertices(uint UUID) const {
7123 return getPrimitivePointer_private(UUID)->getVertices();
7124}
+
7125
7126
+
7128 return getPrimitivePointer_private(UUID)->getColor();
7129}
+
7130
+
7132 return getPrimitivePointer_private(UUID)->getColorRGB();
7133}
+
7134
+
7136 return getPrimitivePointer_private(UUID)->getColorRGBA();
7137}
+
7138
+
7139void Context::setPrimitiveColor(uint UUID, const RGBcolor &color) {
7140 getPrimitivePointer_private(UUID)->setColor( color );
7141}
+
7142
+
7143void Context::setPrimitiveColor(const std::vector<uint> &UUIDs, const RGBcolor &color) {
7144 for( uint UUID : UUIDs){
7145 getPrimitivePointer_private(UUID)->setColor(color);
7146 }
7147}
+
7148
+
7149void Context::setPrimitiveColor(uint UUID, const RGBAcolor &color) {
7150 getPrimitivePointer_private(UUID)->setColor( color );
7151}
+
7152
+
7153void Context::setPrimitiveColor(const std::vector<uint> &UUIDs, const RGBAcolor &color) {
7154 for( uint UUID : UUIDs){
7155 getPrimitivePointer_private(UUID)->setColor(color);
7156 }
7157}
+
7158
+
7159std::string Context::getPrimitiveTextureFile( uint UUID ) const{
7160 return getPrimitivePointer_private(UUID)->getTextureFile();
7161}
+
7162
+
7163void Context::setPrimitiveTextureFile( uint UUID, const std::string &texturefile ){
7164 getPrimitivePointer_private(UUID)->setTextureFile(texturefile.c_str());
7165}
+
7166
+
7168 std::string texturefile = getPrimitivePointer_private(UUID)->getTextureFile();
7169 if( !texturefile.empty() && textures.find(texturefile)!=textures.end() ){
@@ -7251,11 +7858,15 @@
7171 }
7172 return make_int2(0,0);
7173}
+
7174
+
7175std::vector<helios::vec2> Context::getPrimitiveTextureUV( uint UUID ) const{
7176 return getPrimitivePointer_private(UUID)->getTextureUV();
7177}
+
7178
+
7180 std::string texturefile = getPrimitivePointer_private(UUID)->getTextureFile();
7181 if( !texturefile.empty() && textures.find(texturefile)!=textures.end() ){
@@ -7263,7 +7874,9 @@
7183 }
7184 return false;
7185}
+
7186
+
7187const std::vector<std::vector<bool>> * Context::getPrimitiveTextureTransparencyData(uint UUID ) const{
7189 const std::vector<std::vector<bool> > *data = textures.at(getPrimitivePointer_private(UUID)->getTextureFile()).getTransparencyData();
@@ -7273,35 +7886,49 @@
7193 return 0;
7194 }
7195}
+
7196
+
7198 getPrimitivePointer_private(UUID)->overrideTextureColor();
7199}
+
7200
+
7201void Context::overridePrimitiveTextureColor( const std::vector<uint> &UUIDs ){
7202 for( uint UUID : UUIDs ) {
7203 getPrimitivePointer_private(UUID)->overrideTextureColor();
7204 }
7205}
+
7206
+
7208 getPrimitivePointer_private(UUID)->useTextureColor();
7209}
+
7210
+
7211void Context::usePrimitiveTextureColor( const std::vector<uint> &UUIDs ){
7212 for( uint UUID : UUIDs ) {
7213 getPrimitivePointer_private(UUID)->useTextureColor();
7214 }
7215}
+
7216
+
7218 return getPrimitivePointer_private(UUID)->isTextureColorOverridden();
7219}
+
7220
+
7221float Context::getPrimitiveSolidFraction( uint UUID ) const{
7222 return getPrimitivePointer_private(UUID)->getSolidFraction();
7223}
+
7224
+
7225void Context::printPrimitiveInfo(uint UUID) const{
7226
7227 std::cout << "-------------------------------------------" << std::endl;
@@ -7575,7 +8202,9 @@
7495 }
7496 std::cout << "-------------------------------------------" << std::endl;
7497}
+
7498
+
7499void Context::printObjectInfo(uint ObjID) const{
7500
7501 std::cout << "-------------------------------------------" << std::endl;
@@ -7970,6 +8599,7 @@
7890 }
7891 std::cout << "-------------------------------------------" << std::endl;
7892}
+
7893
7894CompoundObject* Context::getObjectPointer_private( uint ObjID ) const{
7895 if( objects.find(ObjID) == objects.end() ){
@@ -7978,6 +8608,7 @@
7898 return objects.at(ObjID);
7899}
7900
+
7901void Context::hideObject( const std::vector<uint> &ObjIDs ){
7902 for( uint ObjID : ObjIDs ) {
7903 if( !doesObjectExist(ObjID) ){
@@ -7989,97 +8620,137 @@
7909 }
7910 }
7911}
+
7912
+
7913bool Context::isObjectHidden( uint ObjID ) const{
7914 if( !doesObjectExist(ObjID) ){
7915 helios_runtime_error("ERROR (Context::isObjectHidden): Object ID of " + std::to_string(ObjID) + " does not exist in the Context.");
7916 }
7917 return objects.at(ObjID)->ishidden;
7918}
+
7919
+
7920float Context::getObjectArea(uint ObjID) const {
7921 return getObjectPointer_private(ObjID)->getArea();
7922}
+
7923
+
7924uint Context::getObjectPrimitiveCount(uint ObjID) const {
7925 return getObjectPointer_private(ObjID)->getPrimitiveCount();
7926}
+
7927
+
7929 return getObjectPointer_private(ObjID)->getObjectCenter();
7930}
+
7931
+
7932std::string Context::getObjectTextureFile(uint ObjID) const{
7933 return getObjectPointer_private(ObjID)->getTextureFile();
7934}
+
7935
+
7936void Context::getObjectTransformationMatrix(uint ObjID, float (&T)[16] ) const {
7937 getObjectPointer_private(ObjID)->getTransformationMatrix( T );
7938}
+
7939
+
7940void Context::setObjectTransformationMatrix(uint ObjID, float (&T)[16] ) {
7941 getObjectPointer_private(ObjID)->setTransformationMatrix(T);
7942}
+
7943
+
7944void Context::setObjectTransformationMatrix(const std::vector<uint> &ObjIDs, float (&T)[16] ) {
7945 for( uint ObjID : ObjIDs){
7946 getObjectPointer_private(ObjID)->setTransformationMatrix(T);
7947 }
7948}
+
7949
+
7950bool Context::objectHasTexture( uint ObjID ) const{
7951 return getObjectPointer_private(ObjID)->hasTexture();
7952}
+
7953
+
7954void Context::setObjectColor(uint ObjID, const RGBcolor &color) {
7955 getObjectPointer_private(ObjID)->setColor( color );
7956}
+
7957
+
7958void Context::setObjectColor(const std::vector<uint> &ObjIDs, const RGBcolor &color) {
7959 for( uint ObjID : ObjIDs){
7960 getObjectPointer_private(ObjID)->setColor(color);
7961 }
7962}
+
7963
+
7964void Context::setObjectColor(uint ObjID, const RGBAcolor &color) {
7965 getObjectPointer_private(ObjID)->setColor( color );
7966}
+
7967
+
7968void Context::setObjectColor(const std::vector<uint> &ObjIDs, const RGBAcolor &color) {
7969 for( uint ObjID : ObjIDs){
7970 getObjectPointer_private(ObjID)->setColor(color);
7971 }
7972}
+
7973
+
7974bool Context::doesObjectContainPrimitive(uint ObjID, uint UUID ){
7975 return getObjectPointer_private(ObjID)->doesObjectContainPrimitive( UUID );
7976}
+
7977
+
7979 getObjectPointer_private(ObjID)->overrideTextureColor();
7980}
+
7981
+
7982void Context::overrideObjectTextureColor( const std::vector<uint> &ObjIDs) {
7983 for( uint ObjID : ObjIDs ) {
7984 getObjectPointer_private(ObjID)->overrideTextureColor();
7985 }
7986}
+
7987
+
7989 getObjectPointer_private(ObjID)->useTextureColor();
7990}
+
7991
+
7992void Context::useObjectTextureColor( const std::vector<uint> &ObjIDs) {
7993 for( uint ObjID : ObjIDs ) {
7994 getObjectPointer_private(ObjID)->useTextureColor();
7995 }
7996}
+
7997
+
7998void Context::getObjectBoundingBox( uint ObjID, vec3 &min_corner, vec3 &max_corner ) const {
7999 std::vector<uint> ObjIDs{ObjID};
8000 getObjectBoundingBox(ObjIDs,min_corner,max_corner);
8001}
+
8002
+
8003void Context::getObjectBoundingBox( const std::vector<uint> &ObjIDs, vec3 &min_corner, vec3 &max_corner ) const{
8004
8005 uint o=0;
@@ -8129,6 +8800,7 @@
8049 }
8050
8051}
+
8052
8053Tile* Context::getTileObjectPointer_private(uint ObjID ) const{
8054 if( objects.find(ObjID) == objects.end() ){
@@ -8193,544 +8865,624 @@
8113 return dynamic_cast<Cone*>(objects.at(ObjID));
8114}
8115
+
8117 return getTileObjectPointer_private(ObjID)->getCenter();
8118}
+
8119
+
8121 return getTileObjectPointer_private(ObjID)->getSize();
8122}
+
8123
+
8125 return getTileObjectPointer_private(ObjID)->getSubdivisionCount();
8126}
+
8127
+
8129 return getTileObjectPointer_private(ObjID)->getNormal();
8130}
+
8131
+
8132std::vector<helios::vec2> Context::getTileObjectTextureUV(uint ObjID) const {
8133 return getTileObjectPointer_private(ObjID)->getTextureUV();
8134}
+
8135
+
8136std::vector<helios::vec3> Context::getTileObjectVertices(uint ObjID) const {
8137 return getTileObjectPointer_private(ObjID)->getVertices();
8138}
+
8139
+
8141 return getSphereObjectPointer_private(ObjID)->getCenter();
8142}
+
8143
+
8145 return getSphereObjectPointer_private(ObjID)->getRadius();
8146}
+
8147
+
8149 return getSphereObjectPointer_private(ObjID)->getSubdivisionCount();
8150}
+
8151
+
8152float Context::getSphereObjectVolume(uint ObjID) const {
8153 return getSphereObjectPointer_private(ObjID)->getVolume();
8154}
+
8155
+
8157 return getTubeObjectPointer_private(ObjID)->getSubdivisionCount();
8158}
+
8159
+
8160std::vector<helios::vec3> Context::getTubeObjectNodes(uint ObjID) const {
8161 return getTubeObjectPointer_private(ObjID)->getNodes();
8162}
+
8163
+
8164std::vector<float> Context::getTubeObjectNodeRadii(uint ObjID) const {
8165 return getTubeObjectPointer_private(ObjID)->getNodeRadii();
8166}
+
8167
+
8168std::vector<RGBcolor> Context::getTubeObjectNodeColors(uint ObjID) const {
8169 return getTubeObjectPointer_private(ObjID)->getNodeColors();
8170}
+
8171
+
8172float Context::getTubeObjectVolume(uint ObjID) const {
8173 return getTubeObjectPointer_private(ObjID)->getVolume();
8174}
+
8175
+
8176float Context::getTubeObjectSegmentVolume( uint ObjID, uint segment_index ) const{
8177 return getTubeObjectPointer_private(ObjID)->getSegmentVolume(segment_index);
8178}
+
8179
+
8180void Context::appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float node_radius, const RGBcolor &node_color ){
8181 if( objects.find(ObjID) == objects.end() ) {
8182 helios_runtime_error("ERROR (Context::appendTubeSegment): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
8183 }
-
8184 dynamic_cast<Tube*>(objects.at(ObjID))->appendTubeSegment(node_position, node_radius, node_color);
+
8184 dynamic_cast<Tube*>(objects.at(ObjID))->appendTubeSegment(node_position, node_radius, node_color);
8185}
+
8186
+
8187void Context::appendTubeSegment( uint ObjID, const helios::vec3 &node_position, float node_radius, const char* texturefile, const helios::vec2 &textureuv_ufrac ){
8188 if( objects.find(ObjID) == objects.end() ) {
8189 helios_runtime_error("ERROR (Context::appendTubeSegment): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
8190 }
-
8191 dynamic_cast<Tube*>(objects.at(ObjID))->appendTubeSegment(node_position, node_radius, texturefile, textureuv_ufrac);
+
8191 dynamic_cast<Tube*>(objects.at(ObjID))->appendTubeSegment(node_position, node_radius, texturefile, textureuv_ufrac);
8192}
+
8193
+
8194void Context::scaleTubeGirth( uint ObjID, float scale_factor ){
8195 if( objects.find(ObjID) == objects.end() ) {
8196 helios_runtime_error("ERROR (Context::scaleTubeGirth): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
8197 }
-
8198 dynamic_cast<Tube*>(objects.at(ObjID))->scaleTubeGirth(scale_factor);
+
8198 dynamic_cast<Tube*>(objects.at(ObjID))->scaleTubeGirth(scale_factor);
8199}
+
8200
+
8201void Context::setTubeRadii( uint ObjID, const std::vector<float> &node_radii ){
8202 if( objects.find(ObjID) == objects.end() ) {
8203 helios_runtime_error("ERROR (Context::setTubeRadii): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
8204 }
-
8205 dynamic_cast<Tube*>(objects.at(ObjID))->setTubeRadii(node_radii);
+
8205 dynamic_cast<Tube*>(objects.at(ObjID))->setTubeRadii(node_radii);
8206}
+
8207
+
8208void Context::scaleTubeLength( uint ObjID, float scale_factor ){
8209 if( objects.find(ObjID) == objects.end() ) {
8210 helios_runtime_error("ERROR (Context::scaleTubeLength): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
8211 }
-
8212 dynamic_cast<Tube*>(objects.at(ObjID))->scaleTubeLength(scale_factor);
+
8212 dynamic_cast<Tube*>(objects.at(ObjID))->scaleTubeLength(scale_factor);
8213}
+
8214
+
8215void Context::setTubeNodes( uint ObjID, const std::vector<helios::vec3> &node_xyz ){
8216 if( objects.find(ObjID) == objects.end() ) {
8217 helios_runtime_error("ERROR (Context::setTubeNodes): ObjectID of " + std::to_string(ObjID) + " does not exist in the Context.");
8218 }
-
8219 dynamic_cast<Tube*>(objects.at(ObjID))->setTubeNodes(node_xyz);
+
8219 dynamic_cast<Tube*>(objects.at(ObjID))->setTubeNodes(node_xyz);
8220}
+
8221
+
8223 return getBoxObjectPointer_private(ObjID)->getCenter();
8224}
+
8225
+
8227 return getBoxObjectPointer_private(ObjID)->getSize();
8228}
+
8229
+
8231 return getBoxObjectPointer_private(ObjID)->getSubdivisionCount();
8232}
+
8233
+
8234float Context::getBoxObjectVolume(uint ObjID) const {
8235 return getBoxObjectPointer_private(ObjID)->getVolume();
8236}
+
8237
+
8239 return getDiskObjectPointer_private(ObjID)->getCenter();
8240}
+
8241
+
8243 return getDiskObjectPointer_private(ObjID)->getSize();
8244}
+
8245
+
8247 return getDiskObjectPointer_private(ObjID)->getSubdivisionCount().x;
8248}
+
8249
+
8251 return getConeObjectPointer_private(ObjID)->getSubdivisionCount();
8252}
+
8253
+
8254std::vector<helios::vec3> Context::getConeObjectNodes(uint ObjID) const {
8255 return getConeObjectPointer_private(ObjID)->getNodeCoordinates();
8256}
+
8257
+
8258std::vector<float> Context::getConeObjectNodeRadii(uint ObjID) const {
8259 return getConeObjectPointer_private(ObjID)->getNodeRadii();
8260}
+
8261
+
8262helios::vec3 Context::getConeObjectNode(uint ObjID, int number) const {
8263 return getConeObjectPointer_private(ObjID)->getNodeCoordinate(number);
8264}
+
8265
+
8266float Context::getConeObjectNodeRadius(uint ObjID, int number) const {
8267 return getConeObjectPointer_private(ObjID)->getNodeRadius(number);
8268}
+
8269
+
8271 return getConeObjectPointer_private(ObjID)->getAxisUnitVector();
8272}
+
8273
+
8274float Context::getConeObjectLength(uint ObjID) const {
8275 return getConeObjectPointer_private(ObjID)->getLength();
8276}
+
8277
+
8278float Context::getConeObjectVolume(uint ObjID) const {
8279 return getConeObjectPointer_private(ObjID)->getVolume();
8280}
+
8281
+
8282float Context::getPolymeshObjectVolume(uint ObjID) const {
8283 return getPolymeshObjectPointer_private(ObjID)->getVolume();
8284}
+
-
HeliosDataType
Data types.
Definition: Context.h:41
-
@ HELIOS_TYPE_INT3
helios::int3 data type
Definition: Context.h:59
-
@ HELIOS_TYPE_DOUBLE
double data type
Definition: Context.h:49
-
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition: Context.h:51
-
@ HELIOS_TYPE_INT
integer data type
Definition: Context.h:43
-
@ HELIOS_TYPE_STRING
std::string data type
Definition: Context.h:63
-
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition: Context.h:53
-
@ HELIOS_TYPE_INT4
helios::int4 data type
Definition: Context.h:61
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition: Context.h:57
-
@ HELIOS_TYPE_VEC4
helios::vec4 data type
Definition: Context.h:55
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
-
PrimitiveType
Type of primitive element.
Definition: Context.h:31
-
@ PRIMITIVE_TYPE_PATCH
< Rectangular primitive
Definition: Context.h:33
-
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition: Context.h:37
-
@ PRIMITIVE_TYPE_TRIANGLE
< Triangular primitive
Definition: Context.h:35
-
ObjectType
Type of compound object.
Definition: Context.h:128
-
@ OBJECT_TYPE_BOX
Box.
Definition: Context.h:136
-
@ OBJECT_TYPE_POLYMESH
< Triangular Mesh
Definition: Context.h:140
-
@ OBJECT_TYPE_TUBE
Tube.
Definition: Context.h:134
-
@ OBJECT_TYPE_CONE
< Cone/tapered cylinder
Definition: Context.h:142
-
@ OBJECT_TYPE_DISK
< Disk
Definition: Context.h:138
-
@ OBJECT_TYPE_TILE
< Tile
Definition: Context.h:130
-
@ OBJECT_TYPE_SPHERE
< Sphere
Definition: Context.h:132
-
Box compound object class.
Definition: Context.h:759
-
float getVolume() const
Get the volume of the box object.
Definition: Context.cpp:4004
-
void setSubdivisionCount(const helios::int3 &subdiv)
Set the number of box sub-patch divisions.
Definition: Context.cpp:4000
-
helios::int3 getSubdivisionCount() const
Get the number of sub-patch divisions of the box object in each Cartesian direction.
Definition: Context.cpp:3996
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the box object.
Definition: Context.cpp:3980
-
Box(uint a_OID, const std::vector< uint > &a_UUIDs, const int3 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition: Context.cpp:3941
-
vec3 getSize() const
Get the dimensions of the box object in each Cartesian direction.
Definition: Context.cpp:3961
- -
void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
Method to rotate a Compound Object about the x-, y-, or z-axis.
Definition: Context.cpp:2377
-
void setPrimitiveUUIDs(const std::vector< uint > &UUIDs)
Method to set the UUIDs of object child primitives.
Definition: Context.cpp:2517
-
uint getPrimitiveCount() const
Return the number of primitives contained in the object.
Definition: Context.cpp:2251
-
void overrideTextureColor()
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition: Context.cpp:2321
-
uint getObjectID() const
Get the unique identifier for the object.
Definition: Context.cpp:2243
-
std::string getTextureFile() const
Method to return the texture map file of an Object.
Definition: Context.cpp:2349
-
void scale(const helios::vec3 &scale)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2471
-
void deleteChildPrimitive(uint UUID)
Delete a single child member of the object.
Definition: Context.cpp:2521
-
bool hasTexture() const
Method to check whether this object has texture data.
Definition: Context.cpp:2341
-
void setTransformationMatrix(float(&T)[16])
Method to set the Affine transformation matrix of a Compound Object.
Definition: Context.cpp:2509
-
void scaleAboutCenter(const helios::vec3 &scale)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2475
-
void scaleAboutPoint(const helios::vec3 &scale, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2479
-
bool arePrimitivesComplete() const
Method to query whether all object primitives are in tact.
Definition: Context.cpp:2536
-
float getArea() const
Calculate the total one-sided surface area of the Compound Object.
Definition: Context.cpp:2285
-
void translate(const helios::vec3 &shift)
Method to translate/shift a Compound Object.
Definition: Context.cpp:2353
-
helios::ObjectType getObjectType() const
Get an enumeration specifying the type of the object.
Definition: Context.cpp:2247
-
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition: Context.cpp:2256
-
void getTransformationMatrix(float(&T)[16]) const
Method to return the Affine transformation matrix of a Compound Object.
Definition: Context.cpp:2503
-
void setColor(const helios::RGBcolor &color)
Method to set the diffuse color for all primitives in the Compound Object.
Definition: Context.cpp:2301
-
void useTextureColor()
For all primitives in the Compound Object, use the texture map to color the primitives rather than th...
Definition: Context.cpp:2331
-
bool doesObjectContainPrimitive(uint UUID)
Check whether a primitive is a member of the object based on its UUID.
Definition: Context.cpp:2262
-
helios::vec3 getObjectCenter() const
Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
Definition: Context.cpp:2268
-
Cone compound object class.
Definition: Context.h:847
-
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the cone object.
Definition: Context.cpp:4171
-
Cone(uint a_OID, const std::vector< uint > &a_UUIDs, const vec3 &a_node0, const vec3 &a_node1, float a_radius0, float a_radius1, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition: Context.cpp:4107
-
float getNodeRadius(int node_index) const
Get the radius of a cone object node.
Definition: Context.cpp:4163
-
void setSubdivisionCount(uint subdiv)
Set the number of radial sub-triangle divisions.
Definition: Context.cpp:4175
-
helios::vec3 getNodeCoordinate(int node_index) const
Get the Cartesian coordinates of a cone object node.
Definition: Context.cpp:4144
-
helios::vec3 getAxisUnitVector() const
Get a unit vector pointing in the direction of the cone central axis.
Definition: Context.cpp:4179
-
std::vector< helios::vec3 > getNodeCoordinates() const
Get the Cartesian coordinates of each of the cone object nodes.
Definition: Context.cpp:4130
-
void scaleLength(float S)
Method to scale the length of the cone.
Definition: Context.cpp:4212
-
void scaleGirth(float S)
Method to scale the girth of the cone.
Definition: Context.cpp:4261
-
float getLength() const
Get the length of the cone along the axial direction.
Definition: Context.cpp:4197
-
std::vector< float > getNodeRadii() const
Get the radius at each of the cone object nodes.
Definition: Context.cpp:4159
-
float getVolume() const
Get the volume of the cone object.
Definition: Context.cpp:4302
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void copyPrimitiveData(uint sourceUUID, uint destinationUUID)
copy all primitive data from one primitive to another
-
std::vector< helios::vec2 > getTileObjectTextureUV(uint ObjID) const
get the texture UV coordinates of a tile object from the context
Definition: Context.cpp:8132
-
void setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)
Change the subdivision count of a tile object.
Definition: Context.cpp:2982
-
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition: Context.cpp:7139
-
void getPrimitiveTransformationMatrix(uint UUID, float(&T)[16]) const
Method to return the Affine transformation matrix of a Primitive.
Definition: Context.cpp:7108
-
void scaleTubeLength(uint ObjID, float scale_factor)
Scale the length of a tube object by an arbitrary factor for all tube nodes.
Definition: Context.cpp:8208
-
bool isObjectHidden(uint ObjID) const
Query if an object is hidden.
Definition: Context.cpp:7913
-
std::vector< std::string > listTimeseriesVariables() const
List all existing timeseries variables.
Definition: Context.cpp:2036
-
void scaleObjectAboutPoint(uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2897
-
float getTubeObjectSegmentVolume(uint ObjID, uint segment_index) const
get the volume of a segment within a Tube object
Definition: Context.cpp:8176
-
helios::RGBcolor getPrimitiveColor(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition: Context.cpp:7127
-
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition: Context.cpp:2642
-
float randn()
Draw a random number from a normal distribution with mean = 0, stddev = 1.
Definition: Context.cpp:1204
-
Disk * getDiskObjectPointer(uint ObjID) const
Get a pointer to a Disk Compound Object.
Definition: Context.cpp:4022
-
void overrideObjectTextureColor(uint ObjID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition: Context.cpp:7978
-
std::vector< uint > getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs) const
Method to return unique parent object IDs for a vector of primitive UUIDs.
Definition: Context.cpp:7022
-
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition: Context.cpp:1406
-
void getObjectBoundingBox(uint ObjID, vec3 &min_corner, vec3 &max_corner) const
Get the axis-aligned bounding box for a single object.
Definition: Context.cpp:7998
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
Box * getBoxObjectPointer(uint ObjID) const
Get a pointer to a Box Compound Object.
Definition: Context.cpp:3954
-
void cleanDeletedUUIDs(std::vector< uint > &UUIDs) const
Delete UUIDs from vector if primitives no longer exist (1D vector)
Definition: Context.cpp:1793
-
uint getConeObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Cone object from the context
Definition: Context.cpp:8250
-
helios::vec3 getDiskObjectCenter(uint ObjID) const
get the center of a Disk object from the context
Definition: Context.cpp:8238
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
int getJulianDate() const
Get simulation date by Julian day.
Definition: Context.cpp:1132
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
helios::int3 getBoxObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Box object from the context
Definition: Context.cpp:8230
-
uint getTubeObjectSubdivisionCount(uint ObjectID) const
get the subdivision count of a Tube object from the context
Definition: Context.cpp:8156
-
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
-
~Context()
Context destructor.
Definition: Context.cpp:6970
-
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:7017
-
std::vector< uint > getAllObjectIDs() const
Get the IDs for all Compound Objects in the Context.
Definition: Context.cpp:2589
-
Cone * getConeObjectPointer(uint ObjID) const
Get a pointer to a Cone Compound Object.
Definition: Context.cpp:4123
-
void seedRandomGenerator(uint seed)
Set seed for random generator.
Definition: Context.cpp:45
-
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
-
void printPrimitiveInfo(uint UUID) const
Prints primitive properties to console (useful for debugging purposes)
Definition: Context.cpp:7225
-
void markGeometryClean()
Mark the Context geometry as "clean", meaning that the geometry has not been modified since last set ...
Definition: Context.cpp:149
-
void getDomainBoundingSphere(helios::vec3 &center, float &radius) const
Get the center and radius of a sphere that bounds all primitives in the domain.
Definition: Context.cpp:2116
-
void rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
Rotate a single compound object about the x, y, or z axis.
Definition: Context.cpp:2847
-
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition: Context.cpp:2574
-
helios::vec3 getPatchCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a patch element.
Definition: Context.cpp:1693
-
helios::vec2 getTileObjectSize(uint ObjID) const
get the size of a tile object from the context
Definition: Context.cpp:8120
-
uint getObjectPrimitiveCount(uint ObjID) const
Method to return the number of primitives contained in the object.
Definition: Context.cpp:7924
-
uint getPrimitiveDataSize(uint UUID, const char *label) const
Get the size/length of primitive data.
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition: Context.cpp:7135
-
helios::vec3 getBoxObjectSize(uint ObjID) const
get the size of a Box object from the context
Definition: Context.cpp:8226
-
helios::vec3 getSphereObjectCenter(uint ObjID) const
get the center of a Sphere object from the context
Definition: Context.cpp:8140
-
helios::vec3 getObjectCenter(uint ObjID) const
Method to return the Cartesian (x,y,z) point of the center of a bounding box for the object.
Definition: Context.cpp:7928
-
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition: Context.cpp:7159
-
uint getObjectCount() const
Get the total number of objects that have been created in the Context.
Definition: Context.cpp:2581
-
helios::vec3 getConeObjectNode(uint ObjID, int number) const
get a node of a Cone object from the context
Definition: Context.cpp:8262
-
float getTubeObjectVolume(uint ObjID) const
get the volume of a Tube object from the context
Definition: Context.cpp:8172
-
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition: Context.cpp:7175
-
void cropDomainZ(const vec2 &zbounds)
Crop the domain in the z-direction such that all primitives lie within some specified z interval.
Definition: Context.cpp:2190
-
Polymesh * getPolymeshObjectPointer(uint ObjID) const
Get a pointer to a Polygon Mesh Compound Object.
Definition: Context.cpp:4081
-
void cropDomainX(const vec2 &xbounds)
Crop the domain in the x-direction such that all primitives lie within some specified x interval.
Definition: Context.cpp:2144
-
helios::vec3 getSphereObjectRadius(uint ObjID) const
get the radius of a Sphere object from the context
Definition: Context.cpp:8144
-
void setDate(int day, int month, int year)
Set simulation date by day, month, year.
Definition: Context.cpp:1059
-
void setPrimitiveParentObjectID(uint UUID, uint objID)
Method to set the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:6988
-
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition: Context.cpp:7179
-
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition: Context.cpp:1420
-
void usePrimitiveTextureColor(uint UUID)
Use the texture map to color the primitive rather than the constant RGB color. This is function rever...
Definition: Context.cpp:7207
-
bool doesObjectContainPrimitive(uint ObjID, uint UUID)
Method to check if an Object contains a Primitive.
Definition: Context.cpp:7974
-
const char * getMonthString() const
Get a string corresponding to the month of the simulation date.
Definition: Context.cpp:1103
-
std::vector< uint > filterObjectsByData(const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const
Get a vector of object IDs that meet filtering criteria based on object data.
Definition: Context.cpp:2750
-
void setObjectColor(uint ObjID, const helios::RGBcolor &color)
Method to set the diffuse color of an Object.
Definition: Context.cpp:7954
-
void setTriangleVertices(uint UUID, const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
//! Manually set the Triangle vertices
Definition: Context.cpp:1722
-
void appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)
Append a tube segment to an existing tube object.
Definition: Context.cpp:8180
-
bool isGeometryDirty() const
Query whether the Context geometry is "dirty", meaning has the geometry been modified since last set ...
Definition: Context.cpp:157
-
helios::vec3 getTileObjectNormal(uint ObjID) const
get the normal of a tile object from the context
Definition: Context.cpp:8128
-
Context()
Context default constructor.
Definition: Context.cpp:20
-
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition: Context.cpp:6984
-
helios::vec3 getVoxelSize(uint UUID) const
Get the size of a voxel element.
Definition: Context.cpp:1741
-
std::vector< float > getTubeObjectNodeRadii(uint ObjID) const
get the node radii of a Tube object from the context
Definition: Context.cpp:8164
-
float getPrimitiveSolidFraction(uint UUID) const
Get fraction of primitive surface area that is non-transparent.
Definition: Context.cpp:7221
-
void translateObject(uint ObjID, const vec3 &shift)
Translate a single compound object.
Definition: Context.cpp:2837
-
void scaleObjectAboutCenter(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2887
-
void cropDomainY(const vec2 &ybounds)
Crop the domain in the y-direction such that all primitives lie within some specified y interval.
Definition: Context.cpp:2167
-
helios::ObjectType getObjectType(uint ObjID) const
Get an enumeration specifying the type of the object.
Definition: Context.cpp:2940
-
void colorPrimitiveByDataPseudocolor(const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors)
Overwrite primitive color based on a pseudocolor mapping of primitive data values.
Definition: Context.cpp:6666
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< RGBcolor > getTubeObjectNodeColors(uint ObjID) const
get the node colors of a Tube object from the context
Definition: Context.cpp:8168
-
std::vector< std::string > listPrimitiveData(uint UUID) const
Return labels for all primitive data for this particular primitive.
-
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition: Context.cpp:2907
-
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition: Context.cpp:1578
-
helios::int2 getPrimitiveTextureSize(uint UUID) const
Get the size (number of pixels) of primitive texture map image.
Definition: Context.cpp:7167
-
helios::vec3 getTriangleVertex(uint UUID, uint number) const
Get a single vertex of a Triangle based on an index.
Definition: Context.cpp:1711
-
helios::Time getTime() const
Get the simulation time.
Definition: Context.cpp:1166
-
helios::RGBcolor getPrimitiveColorRGB(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition: Context.cpp:7131
-
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition: Context.cpp:2046
-
uint getDiskObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Disk object from the context
Definition: Context.cpp:8246
-
void setPrimitiveTextureFile(uint UUID, const std::string &texturefile)
Set the texture map file for a primitive.
Definition: Context.cpp:7163
-
std::vector< helios::vec3 > getConeObjectNodes(uint ObjID) const
get the nodes of a Cone object from the context
Definition: Context.cpp:8254
-
void hidePrimitive(const std::vector< uint > &UUIDs)
Hide primitives in the Context such that their UUIDs are not returned in Context::getAllUUIDs()
Definition: Context.cpp:1777
-
Sphere * getSphereObjectPointer(uint ObjID) const
Get a pointer to a Sphere Compound Object.
Definition: Context.cpp:3410
-
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition: Context.cpp:7197
-
helios::int2 getTileObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a tile object from the context
Definition: Context.cpp:8124
-
bool isPrimitiveHidden(uint UUID) const
Query whether a primitive is hidden.
Definition: Context.cpp:1786
-
helios::Date getDate() const
Get simulation date.
Definition: Context.cpp:1099
-
void printObjectInfo(uint ObjID) const
Prints object properties to console (useful for debugging purposes)
Definition: Context.cpp:7499
-
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition: Context.cpp:49
-
void hideObject(const std::vector< uint > &ObjIDs)
Hide compound objects in the Context such that their object IDs are not returned in Context::getAllOb...
Definition: Context.cpp:7901
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition: Context.cpp:7187
-
float getTileObjectAreaRatio(uint ObjectID) const
Get the area ratio of a tile object (total object area / sub-patch area)
Definition: Context.cpp:2944
-
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition: Context.cpp:2585
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
std::vector< helios::vec3 > getTubeObjectNodes(uint ObjID) const
get the nodes of a Tube object from the context
Definition: Context.cpp:8160
-
helios::vec3 getTileObjectCenter(uint ObjID) const
Get the Cartesian (x,y,z) center position of a tile object.
Definition: Context.cpp:8116
-
void scaleTubeGirth(uint ObjID, float scale_factor)
Scale the girth for all nodes of a tube object.
Definition: Context.cpp:8194
-
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition: Context.cpp:7217
-
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition: Context.cpp:2609
-
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition: Context.cpp:7920
-
std::string getObjectTextureFile(uint ObjID) const
Method to return the texture map file of an Object.
Definition: Context.cpp:7932
-
float getPolymeshObjectVolume(uint ObjID) const
Get the volume of a Polygon Mesh object from the context.
Definition: Context.cpp:8282
-
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition: Context.cpp:1491
-
Tube * getTubeObjectPointer(uint ObjID) const
Get a pointer to a Tube Compound Object.
Definition: Context.cpp:3486
-
helios::vec2 getPatchSize(uint UUID) const
Get the size of a patch element.
Definition: Context.cpp:1684
-
std::vector< helios::vec3 > getTileObjectVertices(uint ObjID) const
get the vertices of a tile object from the context
Definition: Context.cpp:8136
-
void markGeometryDirty()
Mark the Context geometry as "dirty", meaning that the geometry has been modified since last set as c...
Definition: Context.cpp:153
-
void getPrimitiveBoundingBox(uint UUID, vec3 &min_corner, vec3 &max_corner) const
Get the axis-aligned bounding box for a single primitive.
Definition: Context.cpp:7057
-
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition: Context.cpp:7104
-
uint getObjectDataSize(uint objID, const char *label) const
Get the size/length of primitive data.
-
helios::vec3 getConeObjectAxisUnitVector(uint ObjID) const
get the axis unit vector of a Cone object from the context
Definition: Context.cpp:8270
-
helios::vec3 getVoxelCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a voxel element.
Definition: Context.cpp:1750
-
helios::vec2 getDiskObjectSize(uint ObjID) const
get the size of a Disk object from the context
Definition: Context.cpp:8242
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
bool areObjectPrimitivesComplete(uint objID) const
Method to query whether all object primitives are in tact.
Definition: Context.cpp:2540
-
float getConeObjectLength(uint ObjID) const
get the length of a Cone object from the context
Definition: Context.cpp:8274
-
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition: Context.cpp:3312
-
void scalePrimitiveAboutPoint(uint UUID, const helios::vec3 &S, const helios::vec3 point)
Scale a primitive using its UUID about an arbitrary point in space.
Definition: Context.cpp:1512
-
void useObjectTextureColor(uint ObjID)
For all primitives in the Compound Object, use the texture map to color the primitives rather than th...
Definition: Context.cpp:7988
-
uint getSphereObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Sphere object from the context
Definition: Context.cpp:8148
-
void setLocation(const helios::Location &location)
Set the location of the simulation (latitude, longitude, and UTC offset)
Definition: Context.cpp:1170
-
std::vector< std::string > listObjectData(uint ObjID) const
Return labels for all object data for this particular object.
-
std::vector< float > getConeObjectNodeRadii(uint ObjID) const
get the node radii of a Cone object from the context
Definition: Context.cpp:8258
-
float getBoxObjectVolume(uint ObjID) const
get the volume of a Box object from the context
Definition: Context.cpp:8234
-
void copyObjectData(uint source_objID, uint destination_objID)
copy all object data from one compound object to another
-
void setTime(int minute, int hour)
Set simulation time.
Definition: Context.cpp:1136
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
float getSphereObjectVolume(uint ObjID) const
get the volume of a Sphere object from the context
Definition: Context.cpp:8152
-
void setObjectTransformationMatrix(uint ObjID, float(&T)[16])
Method to set the Affine transformation matrix of an Object.
Definition: Context.cpp:7940
-
void cropDomain(std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
Crop specified UUIDs such that they lie within some specified axis-aligned box.
Definition: Context.cpp:2213
-
void setTubeNodes(uint ObjID, const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition: Context.cpp:8215
-
helios::Location getLocation() const
Get the location of the simulation (latitude, longitude, and UTC offset)
Definition: Context.cpp:1174
-
float getConeObjectNodeRadius(uint ObjID, int number) const
get a node radius of a Cone object from the context
Definition: Context.cpp:8266
-
void cleanDeletedObjectIDs(std::vector< uint > &objIDs) const
Delete Object IDs from vector if objects no longer exist (1D vector)
Definition: Context.cpp:2544
-
float getConeObjectVolume(uint ObjID) const
get the volume of a Cone object from the context
Definition: Context.cpp:8278
-
helios::vec3 getBoxObjectCenter(uint ObjID) const
get the center of a Box object from the context
Definition: Context.cpp:8222
-
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
-
void setPrimitiveTransformationMatrix(uint UUID, float(&T)[16])
Method to set the Affine transformation matrix of a Primitive.
Definition: Context.cpp:7112
-
void getObjectTransformationMatrix(uint ObjID, float(&T)[16]) const
Method to return the Affine transformation matrix of an Object.
Definition: Context.cpp:7936
-
void setTubeRadii(uint ObjID, const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition: Context.cpp:8201
-
bool objectHasTexture(uint ObjID) const
Method to check whether an Object has texture data.
Definition: Context.cpp:7950
-
void scaleObject(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2877
-
Disk compound object class.
Definition: Context.h:795
-
vec2 getSize() const
Get the lateral dimensions of the disk object.
Definition: Context.cpp:4029
-
int2 getSubdivisionCount() const
Get the number of sub-triangle divisions of the disk object.
Definition: Context.cpp:4061
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the disk object.
Definition: Context.cpp:4045
-
Disk(uint a_OID, const std::vector< uint > &a_UUIDs, int2 a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition: Context.cpp:4009
-
void setSubdivisionCount(int2 subdiv)
Set the number of disk sub-triangle divisions.
Definition: Context.cpp:4065
-
Polymesh compound object class.
Definition: Context.h:828
-
Polymesh(uint a_OID, const std::vector< uint > &a_UUIDs, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition: Context.cpp:4069
-
float getVolume() const
Get the volume of the polymesh object.
Definition: Context.cpp:4088
-
Sphere compound object class.
Definition: Context.h:624
-
uint getSubdivisionCount() const
Get the number of sub-patch divisions of the sphere object.
Definition: Context.cpp:3455
-
helios::vec3 getRadius() const
Get the radius of the sphere.
Definition: Context.cpp:3417
-
float getVolume() const
Get the volume of the sphere object.
Definition: Context.cpp:3463
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the sphere object.
Definition: Context.cpp:3439
-
Sphere(uint a_OID, const std::vector< uint > &a_UUIDs, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition: Context.cpp:3397
-
void setSubdivisionCount(uint subdiv)
Set the number of sphere tesselation divisions.
Definition: Context.cpp:3459
-
Texture map data structure.
Definition: Context.h:67
-
std::string getTextureFile() const
Get the name/path of the texture map file.
Definition: Context.cpp:129
-
bool hasTransparencyChannel() const
Check whether the texture has a transparency channel.
Definition: Context.cpp:137
-
helios::int2 getImageResolution() const
Get the size of the texture in pixels (horizontal x vertical)
Definition: Context.cpp:133
-
float getSolidFraction() const
Get the solid fraction of the texture transparency channel (if it exists)
Definition: Context.cpp:145
-
const std::vector< std::vector< bool > > * getTransparencyData() const
Get the data in the texture transparency channel (if it exists)
Definition: Context.cpp:141
-
Tile compound object class.
Definition: Context.h:581
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the tile object.
Definition: Context.cpp:3326
-
helios::int2 getSubdivisionCount() const
Get the number of sub-patch divisions of the tile.
Definition: Context.cpp:3343
-
void setSubdivisionCount(const helios::int2 &subdiv)
Set the number of tile sub-patch divisions.
Definition: Context.cpp:3347
-
std::vector< helios::vec2 > getTextureUV() const
Get the normalized (u,v) coordinates of the texture at each of the four corners of the tile object.
Definition: Context.cpp:3391
-
helios::vec2 getSize() const
Get the dimensions of the entire tile object.
Definition: Context.cpp:3319
-
std::vector< helios::vec3 > getVertices() const
Get the Cartesian coordinates of each of the four corners of the tile object.
Definition: Context.cpp:3352
-
vec3 getNormal() const
Get a unit vector normal to the tile object surface.
Definition: Context.cpp:3385
-
Tile(uint a_OID, const std::vector< uint > &a_UUIDs, const int2 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition: Context.cpp:3299
-
Tube compound object class.
Definition: Context.h:660
-
Tube(uint a_OID, const std::vector< uint > &a_UUIDs, const std::vector< vec3 > &a_nodes, const std::vector< float > &a_radius, const std::vector< helios::RGBcolor > &a_colors, const std::vector< std::vector< helios::vec3 > > &a_triangle_vertices, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition: Context.cpp:3468
-
float getSegmentVolume(uint segment_index) const
Get the volume of a segment within the tube object.
Definition: Context.cpp:3561
-
std::vector< float > getNodeRadii() const
Get the radius at each of the tube object nodes.
Definition: Context.cpp:3508
-
void scaleTubeGirth(float S)
Scale the girth of the tube object.
Definition: Context.cpp:3826
-
void setTubeRadii(const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition: Context.cpp:3846
-
std::vector< std::vector< helios::vec3 > > getTriangleVertices() const
Get positions of triangle vertices comprising the tube object.
Definition: Context.cpp:3529
-
float getVolume() const
Get the volume of the tube object.
Definition: Context.cpp:3547
-
void appendTubeSegment(const helios::vec3 &node_position, float node_radius, const helios::RGBcolor &node_color)
Append an additional segment to the existing tube object.
Definition: Context.cpp:3575
-
std::vector< helios::RGBcolor > getNodeColors() const
Get the colors at each of the tube object nodes.
Definition: Context.cpp:3525
-
std::vector< helios::vec3 > getNodes() const
Get the Cartesian coordinates of each of the tube object nodes.
Definition: Context.cpp:3493
-
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the tube object.
Definition: Context.cpp:3533
-
void scaleTubeLength(float S)
Scale the length of the tube object.
Definition: Context.cpp:3869
-
float getLength() const
Get the length of the tube object.
Definition: Context.cpp:3537
-
void setTubeNodes(const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition: Context.cpp:3895
-
bool PNGHasAlpha(const char *filename)
Check whether PNG image file has an alpha/transparency channel.
Definition: global.cpp:1434
-
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition: global.cpp:140
-
void matmult(const float ML[16], const float MR[16], float(&T)[16])
Multiply 4x4 matrices: T=ML*MR.
Definition: global.cpp:499
-
Date CalendarDay(int Julian_day, int year)
Convert Julian day to calendar day (day,month,year)
Definition: global.cpp:1307
-
std::string getFileExtension(const std::string &filepath)
Parse a file string to get the extension.
Definition: global.cpp:3075
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
int JulianDay(int day, int month, int year)
Convert calendar day (day,month,year) to Julian day.
Definition: global.cpp:1350
-
vec3 nullorigin
Default null vec3 that gives the origin (0,0,0)
Definition: global.cpp:58
-
helios::int2 getImageResolutionJPEG(const std::string &filename)
Function to read a JPEG image file into pixel data array.
Definition: global.cpp:1826
-
void readPNG(const std::string &filename, uint &width, uint &height, std::vector< helios::RGBAcolor > &pixel_data)
Function to read a PNG image file into pixel data array.
Definition: global.cpp:1587
-
std::string getFileStem(const std::string &filepath)
Parse a file string to get the filename without extension.
Definition: global.cpp:3080
-
void makeIdentityMatrix(float(&T)[16])
Construct an identity matrix.
Definition: global.cpp:555
-
SphericalCoord nullrotation
Default null SphericalCoord that applies no rotation.
Definition: global.cpp:57
-
std::vector< std::vector< bool > > readPNGAlpha(const std::string &filename)
Function to read the alpha channel from a PNG image.
Definition: global.cpp:1488
-
void vecmult(const float M[16], const float v[3], float(&result)[3])
Multiply 4x4 transformation matrix by 3-element vector: T=M*v.
Definition: global.cpp:539
-
void writePNG(const std::string &filename, uint width, uint height, const std::vector< helios::RGBAcolor > &pixel_data)
Function to write a PNG image based on pixel data.
Definition: global.cpp:1676
-
uint addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition: Context.cpp:5256
-
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:4728
-
uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone compound object to the Context.
Definition: Context.cpp:5426
-
std::vector< uint > addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition: Context.cpp:6356
-
std::vector< uint > addBox(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition: Context.cpp:6147
-
uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition: Context.cpp:5000
-
uint addPolymeshObject(const std::vector< uint > &UUIDs)
Add new Polymesh Compound Object.
Definition: Context.cpp:5399
-
std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition: Context.cpp:5646
-
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:5930
-
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:5809
-
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:4550
-
std::vector< uint > addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone to the Context.
Definition: Context.cpp:6459
-
uint addSphereObject(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition: Context.cpp:4310
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
void makeRotationMatrix(float rotation, const char *axis, float(&transform)[16])
Construct a rotation matrix to perform rotation about the x-, y-, or z-axis.
Definition: global.cpp:313
-
void makeTranslationMatrix(const helios::vec3 &translation, float(&transform)[16])
Construct translation matrix.
Definition: global.cpp:436
-
float calculateTriangleArea(const vec3 &v0, const vec3 &v1, const vec3 &v2)
Calculate the area of a triangle given its three vertices.
Definition: global.cpp:175
-
void resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)
Resize 2D C++ vector.
Definition: global.cpp:1239
-
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition: global.cpp:617
-
void makeScaleMatrix(const helios::vec3 &scale, float(&T)[16])
Construct matrix to scale about the origin.
Definition: global.cpp:457
-
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:241
-
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition: global.cpp:1084
-
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition: Context.cpp:1328
-
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition: Context.cpp:1759
-
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition: Context.cpp:1372
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
void setCurrentTimeseriesPoint(const char *label, uint index)
Set the Context date and time by providing the index of a timeseries data point.
Definition: Context.cpp:1886
-
Time queryTimeseriesTime(const char *label, uint index) const
Get the time associated with a timeseries data point.
Definition: Context.cpp:1958
-
uint getTimeseriesLength(const char *label) const
Get the length of timeseries data.
Definition: Context.cpp:2014
-
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition: Context.cpp:1894
-
bool doesTimeseriesVariableExist(const char *label) const
Query whether a timeseries variable exists.
Definition: Context.cpp:2026
-
void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
Add a data point to timeseries of data.
Definition: Context.cpp:1823
-
Date queryTimeseriesDate(const char *label, uint index) const
Get the date associated with a timeseries data point.
Definition: Context.cpp:1994
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
Time make_Time(int hour, int minute)
Make a Time vector.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
Location make_Location(float latitude_deg, float longitude_deg, float UTC_offset)
Make a Location vector.
-
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
-
Date make_Date(int day, int month, int year)
Make a Date vector.
-
Date Julian2Calendar(int JulianDay, int year)
Convert a Julian day to a calendar Date vector.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
- -
int month
Month of year.
-
int day
Day of month.
-
int JulianDay() const
Convert to Julian day.
Definition: global.cpp:186
-
int year
Year in YYYY format.
-
Location vector.
-
R-G-B-A color vector.
-
R-G-B color vector.
-
float b
Blue color component.
-
float r
Red color component.
-
float g
Green color component.
-
Vector of spherical coordinates (elevation,azimuth)
-
const float & elevation
Elevation angle (radians)
-
float azimuth
Azimuthal angle (radians)
- -
int second
Second of minute.
-
int hour
Hour of day.
-
int minute
Minute of hour.
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of three elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int y
Second element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
vec3 normalize()
Normalize vector components such that the magnitude is unity.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
-
float magnitude() const
Compute the vector magnitude.
+
HeliosDataType
Data types.
Definition Context.h:41
+
@ HELIOS_TYPE_INT3
helios::int3 data type
Definition Context.h:59
+
@ HELIOS_TYPE_DOUBLE
double data type
Definition Context.h:49
+
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition Context.h:51
+
@ HELIOS_TYPE_INT
integer data type
Definition Context.h:43
+
@ HELIOS_TYPE_STRING
std::string data type
Definition Context.h:63
+
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition Context.h:53
+
@ HELIOS_TYPE_INT4
helios::int4 data type
Definition Context.h:61
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition Context.h:57
+
@ HELIOS_TYPE_VEC4
helios::vec4 data type
Definition Context.h:55
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
+
PrimitiveType
Type of primitive element.
Definition Context.h:31
+
@ PRIMITIVE_TYPE_PATCH
< Rectangular primitive
Definition Context.h:33
+
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition Context.h:37
+
@ PRIMITIVE_TYPE_TRIANGLE
< Triangular primitive
Definition Context.h:35
+
ObjectType
Type of compound object.
Definition Context.h:128
+
@ OBJECT_TYPE_BOX
Box.
Definition Context.h:136
+
@ OBJECT_TYPE_POLYMESH
< Triangular Mesh
Definition Context.h:140
+
@ OBJECT_TYPE_TUBE
Tube.
Definition Context.h:134
+
@ OBJECT_TYPE_CONE
< Cone/tapered cylinder
Definition Context.h:142
+
@ OBJECT_TYPE_DISK
< Disk
Definition Context.h:138
+
@ OBJECT_TYPE_TILE
< Tile
Definition Context.h:130
+
@ OBJECT_TYPE_SPHERE
< Sphere
Definition Context.h:132
+
Box compound object class.
Definition Context.h:759
+
float getVolume() const
Get the volume of the box object.
Definition Context.cpp:4004
+
void setSubdivisionCount(const helios::int3 &subdiv)
Set the number of box sub-patch divisions.
Definition Context.cpp:4000
+
helios::int3 getSubdivisionCount() const
Get the number of sub-patch divisions of the box object in each Cartesian direction.
Definition Context.cpp:3996
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the box object.
Definition Context.cpp:3980
+
Box(uint a_OID, const std::vector< uint > &a_UUIDs, const int3 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:3941
+
vec3 getSize() const
Get the dimensions of the box object in each Cartesian direction.
Definition Context.cpp:3961
+ +
void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
Method to rotate a Compound Object about the x-, y-, or z-axis.
Definition Context.cpp:2377
+
void setPrimitiveUUIDs(const std::vector< uint > &UUIDs)
Method to set the UUIDs of object child primitives.
Definition Context.cpp:2517
+
uint getPrimitiveCount() const
Return the number of primitives contained in the object.
Definition Context.cpp:2251
+
void overrideTextureColor()
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition Context.cpp:2321
+
uint getObjectID() const
Get the unique identifier for the object.
Definition Context.cpp:2243
+
std::string getTextureFile() const
Method to return the texture map file of an Object.
Definition Context.cpp:2349
+
void scale(const helios::vec3 &scale)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2471
+
void deleteChildPrimitive(uint UUID)
Delete a single child member of the object.
Definition Context.cpp:2521
+
bool hasTexture() const
Method to check whether this object has texture data.
Definition Context.cpp:2341
+
void setTransformationMatrix(float(&T)[16])
Method to set the Affine transformation matrix of a Compound Object.
Definition Context.cpp:2509
+
void scaleAboutCenter(const helios::vec3 &scale)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2475
+
void scaleAboutPoint(const helios::vec3 &scale, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2479
+
bool arePrimitivesComplete() const
Method to query whether all object primitives are in tact.
Definition Context.cpp:2536
+
float getArea() const
Calculate the total one-sided surface area of the Compound Object.
Definition Context.cpp:2285
+
void translate(const helios::vec3 &shift)
Method to translate/shift a Compound Object.
Definition Context.cpp:2353
+
helios::ObjectType getObjectType() const
Get an enumeration specifying the type of the object.
Definition Context.cpp:2247
+
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition Context.cpp:2256
+
void getTransformationMatrix(float(&T)[16]) const
Method to return the Affine transformation matrix of a Compound Object.
Definition Context.cpp:2503
+
void setColor(const helios::RGBcolor &color)
Method to set the diffuse color for all primitives in the Compound Object.
Definition Context.cpp:2301
+
void useTextureColor()
For all primitives in the Compound Object, use the texture map to color the primitives rather than th...
Definition Context.cpp:2331
+
bool doesObjectContainPrimitive(uint UUID)
Check whether a primitive is a member of the object based on its UUID.
Definition Context.cpp:2262
+
helios::vec3 getObjectCenter() const
Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
Definition Context.cpp:2268
+
Cone compound object class.
Definition Context.h:847
+
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the cone object.
Definition Context.cpp:4171
+
Cone(uint a_OID, const std::vector< uint > &a_UUIDs, const vec3 &a_node0, const vec3 &a_node1, float a_radius0, float a_radius1, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:4107
+
float getNodeRadius(int node_index) const
Get the radius of a cone object node.
Definition Context.cpp:4163
+
void setSubdivisionCount(uint subdiv)
Set the number of radial sub-triangle divisions.
Definition Context.cpp:4175
+
helios::vec3 getNodeCoordinate(int node_index) const
Get the Cartesian coordinates of a cone object node.
Definition Context.cpp:4144
+
helios::vec3 getAxisUnitVector() const
Get a unit vector pointing in the direction of the cone central axis.
Definition Context.cpp:4179
+
std::vector< helios::vec3 > getNodeCoordinates() const
Get the Cartesian coordinates of each of the cone object nodes.
Definition Context.cpp:4130
+
void scaleLength(float S)
Method to scale the length of the cone.
Definition Context.cpp:4212
+
void scaleGirth(float S)
Method to scale the girth of the cone.
Definition Context.cpp:4261
+
float getLength() const
Get the length of the cone along the axial direction.
Definition Context.cpp:4197
+
std::vector< float > getNodeRadii() const
Get the radius at each of the cone object nodes.
Definition Context.cpp:4159
+
float getVolume() const
Get the volume of the cone object.
Definition Context.cpp:4302
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void copyPrimitiveData(uint sourceUUID, uint destinationUUID)
copy all primitive data from one primitive to another
+
std::vector< helios::vec2 > getTileObjectTextureUV(uint ObjID) const
get the texture UV coordinates of a tile object from the context
Definition Context.cpp:8132
+
void setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)
Change the subdivision count of a tile object.
Definition Context.cpp:2982
+
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition Context.cpp:7139
+
void getPrimitiveTransformationMatrix(uint UUID, float(&T)[16]) const
Method to return the Affine transformation matrix of a Primitive.
Definition Context.cpp:7108
+
void scaleTubeLength(uint ObjID, float scale_factor)
Scale the length of a tube object by an arbitrary factor for all tube nodes.
Definition Context.cpp:8208
+
bool isObjectHidden(uint ObjID) const
Query if an object is hidden.
Definition Context.cpp:7913
+
std::vector< std::string > listTimeseriesVariables() const
List all existing timeseries variables.
Definition Context.cpp:2036
+
void scaleObjectAboutPoint(uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2897
+
float getTubeObjectSegmentVolume(uint ObjID, uint segment_index) const
get the volume of a segment within a Tube object
Definition Context.cpp:8176
+
helios::RGBcolor getPrimitiveColor(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition Context.cpp:7127
+
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition Context.cpp:2642
+
float randn()
Draw a random number from a normal distribution with mean = 0, stddev = 1.
Definition Context.cpp:1204
+
Disk * getDiskObjectPointer(uint ObjID) const
Get a pointer to a Disk Compound Object.
Definition Context.cpp:4022
+
void overrideObjectTextureColor(uint ObjID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition Context.cpp:7978
+
std::vector< uint > getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs) const
Method to return unique parent object IDs for a vector of primitive UUIDs.
Definition Context.cpp:7022
+
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition Context.cpp:1406
+
void getObjectBoundingBox(uint ObjID, vec3 &min_corner, vec3 &max_corner) const
Get the axis-aligned bounding box for a single object.
Definition Context.cpp:7998
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
Box * getBoxObjectPointer(uint ObjID) const
Get a pointer to a Box Compound Object.
Definition Context.cpp:3954
+
void cleanDeletedUUIDs(std::vector< uint > &UUIDs) const
Delete UUIDs from vector if primitives no longer exist (1D vector)
Definition Context.cpp:1793
+
uint getConeObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Cone object from the context
Definition Context.cpp:8250
+
helios::vec3 getDiskObjectCenter(uint ObjID) const
get the center of a Disk object from the context
Definition Context.cpp:8238
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
int getJulianDate() const
Get simulation date by Julian day.
Definition Context.cpp:1132
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
helios::int3 getBoxObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Box object from the context
Definition Context.cpp:8230
+
uint getTubeObjectSubdivisionCount(uint ObjectID) const
get the subdivision count of a Tube object from the context
Definition Context.cpp:8156
+
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
+
~Context()
Context destructor.
Definition Context.cpp:6970
+
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:7017
+
std::vector< uint > getAllObjectIDs() const
Get the IDs for all Compound Objects in the Context.
Definition Context.cpp:2589
+
Cone * getConeObjectPointer(uint ObjID) const
Get a pointer to a Cone Compound Object.
Definition Context.cpp:4123
+
void seedRandomGenerator(uint seed)
Set seed for random generator.
Definition Context.cpp:45
+
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
+
void printPrimitiveInfo(uint UUID) const
Prints primitive properties to console (useful for debugging purposes)
Definition Context.cpp:7225
+
void markGeometryClean()
Mark the Context geometry as "clean", meaning that the geometry has not been modified since last set ...
Definition Context.cpp:149
+
void getDomainBoundingSphere(helios::vec3 &center, float &radius) const
Get the center and radius of a sphere that bounds all primitives in the domain.
Definition Context.cpp:2116
+
void rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
Rotate a single compound object about the x, y, or z axis.
Definition Context.cpp:2847
+
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition Context.cpp:2574
+
helios::vec3 getPatchCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a patch element.
Definition Context.cpp:1693
+
helios::vec2 getTileObjectSize(uint ObjID) const
get the size of a tile object from the context
Definition Context.cpp:8120
+
uint getObjectPrimitiveCount(uint ObjID) const
Method to return the number of primitives contained in the object.
Definition Context.cpp:7924
+
uint getPrimitiveDataSize(uint UUID, const char *label) const
Get the size/length of primitive data.
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition Context.cpp:7135
+
helios::vec3 getBoxObjectSize(uint ObjID) const
get the size of a Box object from the context
Definition Context.cpp:8226
+
helios::vec3 getSphereObjectCenter(uint ObjID) const
get the center of a Sphere object from the context
Definition Context.cpp:8140
+
helios::vec3 getObjectCenter(uint ObjID) const
Method to return the Cartesian (x,y,z) point of the center of a bounding box for the object.
Definition Context.cpp:7928
+
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition Context.cpp:7159
+
uint getObjectCount() const
Get the total number of objects that have been created in the Context.
Definition Context.cpp:2581
+
helios::vec3 getConeObjectNode(uint ObjID, int number) const
get a node of a Cone object from the context
Definition Context.cpp:8262
+
float getTubeObjectVolume(uint ObjID) const
get the volume of a Tube object from the context
Definition Context.cpp:8172
+
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition Context.cpp:7175
+
void cropDomainZ(const vec2 &zbounds)
Crop the domain in the z-direction such that all primitives lie within some specified z interval.
Definition Context.cpp:2190
+
Polymesh * getPolymeshObjectPointer(uint ObjID) const
Get a pointer to a Polygon Mesh Compound Object.
Definition Context.cpp:4081
+
void cropDomainX(const vec2 &xbounds)
Crop the domain in the x-direction such that all primitives lie within some specified x interval.
Definition Context.cpp:2144
+
helios::vec3 getSphereObjectRadius(uint ObjID) const
get the radius of a Sphere object from the context
Definition Context.cpp:8144
+
void setDate(int day, int month, int year)
Set simulation date by day, month, year.
Definition Context.cpp:1059
+
void setPrimitiveParentObjectID(uint UUID, uint objID)
Method to set the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:6988
+
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition Context.cpp:7179
+
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition Context.cpp:1420
+
void usePrimitiveTextureColor(uint UUID)
Use the texture map to color the primitive rather than the constant RGB color. This is function rever...
Definition Context.cpp:7207
+
bool doesObjectContainPrimitive(uint ObjID, uint UUID)
Method to check if an Object contains a Primitive.
Definition Context.cpp:7974
+
const char * getMonthString() const
Get a string corresponding to the month of the simulation date.
Definition Context.cpp:1103
+
std::vector< uint > filterObjectsByData(const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const
Get a vector of object IDs that meet filtering criteria based on object data.
Definition Context.cpp:2750
+
void setObjectColor(uint ObjID, const helios::RGBcolor &color)
Method to set the diffuse color of an Object.
Definition Context.cpp:7954
+
void setTriangleVertices(uint UUID, const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
//! Manually set the Triangle vertices
Definition Context.cpp:1722
+
void appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)
Append a tube segment to an existing tube object.
Definition Context.cpp:8180
+
bool isGeometryDirty() const
Query whether the Context geometry is "dirty", meaning has the geometry been modified since last set ...
Definition Context.cpp:157
+
helios::vec3 getTileObjectNormal(uint ObjID) const
get the normal of a tile object from the context
Definition Context.cpp:8128
+
Context()
Context default constructor.
Definition Context.cpp:20
+
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition Context.cpp:6984
+
helios::vec3 getVoxelSize(uint UUID) const
Get the size of a voxel element.
Definition Context.cpp:1741
+
std::vector< float > getTubeObjectNodeRadii(uint ObjID) const
get the node radii of a Tube object from the context
Definition Context.cpp:8164
+
float getPrimitiveSolidFraction(uint UUID) const
Get fraction of primitive surface area that is non-transparent.
Definition Context.cpp:7221
+
void translateObject(uint ObjID, const vec3 &shift)
Translate a single compound object.
Definition Context.cpp:2837
+
void scaleObjectAboutCenter(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2887
+
void cropDomainY(const vec2 &ybounds)
Crop the domain in the y-direction such that all primitives lie within some specified y interval.
Definition Context.cpp:2167
+
helios::ObjectType getObjectType(uint ObjID) const
Get an enumeration specifying the type of the object.
Definition Context.cpp:2940
+
void colorPrimitiveByDataPseudocolor(const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors)
Overwrite primitive color based on a pseudocolor mapping of primitive data values.
Definition Context.cpp:6666
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< RGBcolor > getTubeObjectNodeColors(uint ObjID) const
get the node colors of a Tube object from the context
Definition Context.cpp:8168
+
std::vector< std::string > listPrimitiveData(uint UUID) const
Return labels for all primitive data for this particular primitive.
+
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition Context.cpp:2907
+
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition Context.cpp:1578
+
helios::int2 getPrimitiveTextureSize(uint UUID) const
Get the size (number of pixels) of primitive texture map image.
Definition Context.cpp:7167
+
helios::vec3 getTriangleVertex(uint UUID, uint number) const
Get a single vertex of a Triangle based on an index.
Definition Context.cpp:1711
+
helios::Time getTime() const
Get the simulation time.
Definition Context.cpp:1166
+
helios::RGBcolor getPrimitiveColorRGB(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition Context.cpp:7131
+
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition Context.cpp:2046
+
uint getDiskObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Disk object from the context
Definition Context.cpp:8246
+
void setPrimitiveTextureFile(uint UUID, const std::string &texturefile)
Set the texture map file for a primitive.
Definition Context.cpp:7163
+
std::vector< helios::vec3 > getConeObjectNodes(uint ObjID) const
get the nodes of a Cone object from the context
Definition Context.cpp:8254
+
void hidePrimitive(const std::vector< uint > &UUIDs)
Hide primitives in the Context such that their UUIDs are not returned in Context::getAllUUIDs()
Definition Context.cpp:1777
+
Sphere * getSphereObjectPointer(uint ObjID) const
Get a pointer to a Sphere Compound Object.
Definition Context.cpp:3410
+
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition Context.cpp:7197
+
helios::int2 getTileObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a tile object from the context
Definition Context.cpp:8124
+
bool isPrimitiveHidden(uint UUID) const
Query whether a primitive is hidden.
Definition Context.cpp:1786
+
helios::Date getDate() const
Get simulation date.
Definition Context.cpp:1099
+
void printObjectInfo(uint ObjID) const
Prints object properties to console (useful for debugging purposes)
Definition Context.cpp:7499
+
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition Context.cpp:49
+
void hideObject(const std::vector< uint > &ObjIDs)
Hide compound objects in the Context such that their object IDs are not returned in Context::getAllOb...
Definition Context.cpp:7901
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition Context.cpp:7187
+
float getTileObjectAreaRatio(uint ObjectID) const
Get the area ratio of a tile object (total object area / sub-patch area)
Definition Context.cpp:2944
+
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition Context.cpp:2585
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
std::vector< helios::vec3 > getTubeObjectNodes(uint ObjID) const
get the nodes of a Tube object from the context
Definition Context.cpp:8160
+
helios::vec3 getTileObjectCenter(uint ObjID) const
Get the Cartesian (x,y,z) center position of a tile object.
Definition Context.cpp:8116
+
void scaleTubeGirth(uint ObjID, float scale_factor)
Scale the girth for all nodes of a tube object.
Definition Context.cpp:8194
+
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition Context.cpp:7217
+
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition Context.cpp:2609
+
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition Context.cpp:7920
+
std::string getObjectTextureFile(uint ObjID) const
Method to return the texture map file of an Object.
Definition Context.cpp:7932
+
float getPolymeshObjectVolume(uint ObjID) const
Get the volume of a Polygon Mesh object from the context.
Definition Context.cpp:8282
+
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition Context.cpp:1491
+
Tube * getTubeObjectPointer(uint ObjID) const
Get a pointer to a Tube Compound Object.
Definition Context.cpp:3486
+
helios::vec2 getPatchSize(uint UUID) const
Get the size of a patch element.
Definition Context.cpp:1684
+
std::vector< helios::vec3 > getTileObjectVertices(uint ObjID) const
get the vertices of a tile object from the context
Definition Context.cpp:8136
+
void markGeometryDirty()
Mark the Context geometry as "dirty", meaning that the geometry has been modified since last set as c...
Definition Context.cpp:153
+
void getPrimitiveBoundingBox(uint UUID, vec3 &min_corner, vec3 &max_corner) const
Get the axis-aligned bounding box for a single primitive.
Definition Context.cpp:7057
+
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition Context.cpp:7104
+
uint getObjectDataSize(uint objID, const char *label) const
Get the size/length of primitive data.
+
helios::vec3 getConeObjectAxisUnitVector(uint ObjID) const
get the axis unit vector of a Cone object from the context
Definition Context.cpp:8270
+
helios::vec3 getVoxelCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a voxel element.
Definition Context.cpp:1750
+
helios::vec2 getDiskObjectSize(uint ObjID) const
get the size of a Disk object from the context
Definition Context.cpp:8242
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
bool areObjectPrimitivesComplete(uint objID) const
Method to query whether all object primitives are in tact.
Definition Context.cpp:2540
+
float getConeObjectLength(uint ObjID) const
get the length of a Cone object from the context
Definition Context.cpp:8274
+
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition Context.cpp:3312
+
void scalePrimitiveAboutPoint(uint UUID, const helios::vec3 &S, const helios::vec3 point)
Scale a primitive using its UUID about an arbitrary point in space.
Definition Context.cpp:1512
+
void useObjectTextureColor(uint ObjID)
For all primitives in the Compound Object, use the texture map to color the primitives rather than th...
Definition Context.cpp:7988
+
uint getSphereObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Sphere object from the context
Definition Context.cpp:8148
+
void setLocation(const helios::Location &location)
Set the location of the simulation (latitude, longitude, and UTC offset)
Definition Context.cpp:1170
+
std::vector< std::string > listObjectData(uint ObjID) const
Return labels for all object data for this particular object.
+
std::vector< float > getConeObjectNodeRadii(uint ObjID) const
get the node radii of a Cone object from the context
Definition Context.cpp:8258
+
float getBoxObjectVolume(uint ObjID) const
get the volume of a Box object from the context
Definition Context.cpp:8234
+
void copyObjectData(uint source_objID, uint destination_objID)
copy all object data from one compound object to another
+
void setTime(int minute, int hour)
Set simulation time.
Definition Context.cpp:1136
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
float getSphereObjectVolume(uint ObjID) const
get the volume of a Sphere object from the context
Definition Context.cpp:8152
+
void setObjectTransformationMatrix(uint ObjID, float(&T)[16])
Method to set the Affine transformation matrix of an Object.
Definition Context.cpp:7940
+
void cropDomain(std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
Crop specified UUIDs such that they lie within some specified axis-aligned box.
Definition Context.cpp:2213
+
void setTubeNodes(uint ObjID, const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition Context.cpp:8215
+
helios::Location getLocation() const
Get the location of the simulation (latitude, longitude, and UTC offset)
Definition Context.cpp:1174
+
float getConeObjectNodeRadius(uint ObjID, int number) const
get a node radius of a Cone object from the context
Definition Context.cpp:8266
+
void cleanDeletedObjectIDs(std::vector< uint > &objIDs) const
Delete Object IDs from vector if objects no longer exist (1D vector)
Definition Context.cpp:2544
+
float getConeObjectVolume(uint ObjID) const
get the volume of a Cone object from the context
Definition Context.cpp:8278
+
helios::vec3 getBoxObjectCenter(uint ObjID) const
get the center of a Box object from the context
Definition Context.cpp:8222
+
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
+
void setPrimitiveTransformationMatrix(uint UUID, float(&T)[16])
Method to set the Affine transformation matrix of a Primitive.
Definition Context.cpp:7112
+
void getObjectTransformationMatrix(uint ObjID, float(&T)[16]) const
Method to return the Affine transformation matrix of an Object.
Definition Context.cpp:7936
+
void setTubeRadii(uint ObjID, const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition Context.cpp:8201
+
bool objectHasTexture(uint ObjID) const
Method to check whether an Object has texture data.
Definition Context.cpp:7950
+
void scaleObject(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2877
+
Disk compound object class.
Definition Context.h:795
+
vec2 getSize() const
Get the lateral dimensions of the disk object.
Definition Context.cpp:4029
+
int2 getSubdivisionCount() const
Get the number of sub-triangle divisions of the disk object.
Definition Context.cpp:4061
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the disk object.
Definition Context.cpp:4045
+
Disk(uint a_OID, const std::vector< uint > &a_UUIDs, int2 a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:4009
+
void setSubdivisionCount(int2 subdiv)
Set the number of disk sub-triangle divisions.
Definition Context.cpp:4065
+
Polymesh compound object class.
Definition Context.h:828
+
Polymesh(uint a_OID, const std::vector< uint > &a_UUIDs, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:4069
+
float getVolume() const
Get the volume of the polymesh object.
Definition Context.cpp:4088
+
Sphere compound object class.
Definition Context.h:624
+
uint getSubdivisionCount() const
Get the number of sub-patch divisions of the sphere object.
Definition Context.cpp:3455
+
helios::vec3 getRadius() const
Get the radius of the sphere.
Definition Context.cpp:3417
+
float getVolume() const
Get the volume of the sphere object.
Definition Context.cpp:3463
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the sphere object.
Definition Context.cpp:3439
+
Sphere(uint a_OID, const std::vector< uint > &a_UUIDs, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:3397
+
void setSubdivisionCount(uint subdiv)
Set the number of sphere tesselation divisions.
Definition Context.cpp:3459
+
Texture map data structure.
Definition Context.h:67
+
std::string getTextureFile() const
Get the name/path of the texture map file.
Definition Context.cpp:129
+
bool hasTransparencyChannel() const
Check whether the texture has a transparency channel.
Definition Context.cpp:137
+
helios::int2 getImageResolution() const
Get the size of the texture in pixels (horizontal x vertical)
Definition Context.cpp:133
+
float getSolidFraction() const
Get the solid fraction of the texture transparency channel (if it exists)
Definition Context.cpp:145
+
const std::vector< std::vector< bool > > * getTransparencyData() const
Get the data in the texture transparency channel (if it exists)
Definition Context.cpp:141
+
Tile compound object class.
Definition Context.h:581
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the tile object.
Definition Context.cpp:3326
+
helios::int2 getSubdivisionCount() const
Get the number of sub-patch divisions of the tile.
Definition Context.cpp:3343
+
void setSubdivisionCount(const helios::int2 &subdiv)
Set the number of tile sub-patch divisions.
Definition Context.cpp:3347
+
std::vector< helios::vec2 > getTextureUV() const
Get the normalized (u,v) coordinates of the texture at each of the four corners of the tile object.
Definition Context.cpp:3391
+
helios::vec2 getSize() const
Get the dimensions of the entire tile object.
Definition Context.cpp:3319
+
std::vector< helios::vec3 > getVertices() const
Get the Cartesian coordinates of each of the four corners of the tile object.
Definition Context.cpp:3352
+
vec3 getNormal() const
Get a unit vector normal to the tile object surface.
Definition Context.cpp:3385
+
Tile(uint a_OID, const std::vector< uint > &a_UUIDs, const int2 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:3299
+
Tube compound object class.
Definition Context.h:660
+
Tube(uint a_OID, const std::vector< uint > &a_UUIDs, const std::vector< vec3 > &a_nodes, const std::vector< float > &a_radius, const std::vector< helios::RGBcolor > &a_colors, const std::vector< std::vector< helios::vec3 > > &a_triangle_vertices, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:3468
+
float getSegmentVolume(uint segment_index) const
Get the volume of a segment within the tube object.
Definition Context.cpp:3561
+
std::vector< float > getNodeRadii() const
Get the radius at each of the tube object nodes.
Definition Context.cpp:3508
+
void scaleTubeGirth(float S)
Scale the girth of the tube object.
Definition Context.cpp:3826
+
void setTubeRadii(const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition Context.cpp:3846
+
std::vector< std::vector< helios::vec3 > > getTriangleVertices() const
Get positions of triangle vertices comprising the tube object.
Definition Context.cpp:3529
+
float getVolume() const
Get the volume of the tube object.
Definition Context.cpp:3547
+
void appendTubeSegment(const helios::vec3 &node_position, float node_radius, const helios::RGBcolor &node_color)
Append an additional segment to the existing tube object.
Definition Context.cpp:3575
+
std::vector< helios::RGBcolor > getNodeColors() const
Get the colors at each of the tube object nodes.
Definition Context.cpp:3525
+
std::vector< helios::vec3 > getNodes() const
Get the Cartesian coordinates of each of the tube object nodes.
Definition Context.cpp:3493
+
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the tube object.
Definition Context.cpp:3533
+
void scaleTubeLength(float S)
Scale the length of the tube object.
Definition Context.cpp:3869
+
float getLength() const
Get the length of the tube object.
Definition Context.cpp:3537
+
void setTubeNodes(const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition Context.cpp:3895
+
bool PNGHasAlpha(const char *filename)
Check whether PNG image file has an alpha/transparency channel.
Definition global.cpp:1434
+
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition global.cpp:140
+
void matmult(const float ML[16], const float MR[16], float(&T)[16])
Multiply 4x4 matrices: T=ML*MR.
Definition global.cpp:499
+
Date CalendarDay(int Julian_day, int year)
Convert Julian day to calendar day (day,month,year)
Definition global.cpp:1307
+
std::string getFileExtension(const std::string &filepath)
Parse a file string to get the extension.
Definition global.cpp:3075
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
int JulianDay(int day, int month, int year)
Convert calendar day (day,month,year) to Julian day.
Definition global.cpp:1350
+
vec3 nullorigin
Default null vec3 that gives the origin (0,0,0)
Definition global.cpp:58
+
helios::int2 getImageResolutionJPEG(const std::string &filename)
Function to read a JPEG image file into pixel data array.
Definition global.cpp:1826
+
void readPNG(const std::string &filename, uint &width, uint &height, std::vector< helios::RGBAcolor > &pixel_data)
Function to read a PNG image file into pixel data array.
Definition global.cpp:1587
+
std::string getFileStem(const std::string &filepath)
Parse a file string to get the filename without extension.
Definition global.cpp:3080
+
void makeIdentityMatrix(float(&T)[16])
Construct an identity matrix.
Definition global.cpp:555
+
SphericalCoord nullrotation
Default null SphericalCoord that applies no rotation.
Definition global.cpp:57
+
std::vector< std::vector< bool > > readPNGAlpha(const std::string &filename)
Function to read the alpha channel from a PNG image.
Definition global.cpp:1488
+
void vecmult(const float M[16], const float v[3], float(&result)[3])
Multiply 4x4 transformation matrix by 3-element vector: T=M*v.
Definition global.cpp:539
+
void writePNG(const std::string &filename, uint width, uint height, const std::vector< helios::RGBAcolor > &pixel_data)
Function to write a PNG image based on pixel data.
Definition global.cpp:1676
+
uint addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition Context.cpp:5256
+
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:4728
+
uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone compound object to the Context.
Definition Context.cpp:5426
+
std::vector< uint > addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition Context.cpp:6356
+
std::vector< uint > addBox(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition Context.cpp:6147
+
uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition Context.cpp:5000
+
uint addPolymeshObject(const std::vector< uint > &UUIDs)
Add new Polymesh Compound Object.
Definition Context.cpp:5399
+
std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition Context.cpp:5646
+
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:5930
+
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:5809
+
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:4550
+
std::vector< uint > addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone to the Context.
Definition Context.cpp:6459
+
uint addSphereObject(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition Context.cpp:4310
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
void makeRotationMatrix(float rotation, const char *axis, float(&transform)[16])
Construct a rotation matrix to perform rotation about the x-, y-, or z-axis.
Definition global.cpp:313
+
void makeTranslationMatrix(const helios::vec3 &translation, float(&transform)[16])
Construct translation matrix.
Definition global.cpp:436
+
float calculateTriangleArea(const vec3 &v0, const vec3 &v1, const vec3 &v2)
Calculate the area of a triangle given its three vertices.
Definition global.cpp:175
+
void resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)
Resize 2D C++ vector.
Definition global.cpp:1239
+
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition global.cpp:617
+
void makeScaleMatrix(const helios::vec3 &scale, float(&T)[16])
Construct matrix to scale about the origin.
Definition global.cpp:457
+
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:241
+
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition global.cpp:1084
+
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition Context.cpp:1328
+
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition Context.cpp:1759
+
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition Context.cpp:1372
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
void setCurrentTimeseriesPoint(const char *label, uint index)
Set the Context date and time by providing the index of a timeseries data point.
Definition Context.cpp:1886
+
Time queryTimeseriesTime(const char *label, uint index) const
Get the time associated with a timeseries data point.
Definition Context.cpp:1958
+
uint getTimeseriesLength(const char *label) const
Get the length of timeseries data.
Definition Context.cpp:2014
+
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition Context.cpp:1894
+
bool doesTimeseriesVariableExist(const char *label) const
Query whether a timeseries variable exists.
Definition Context.cpp:2026
+
void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
Add a data point to timeseries of data.
Definition Context.cpp:1823
+
Date queryTimeseriesDate(const char *label, uint index) const
Get the date associated with a timeseries data point.
Definition Context.cpp:1994
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
Time make_Time(int hour, int minute)
Make a Time vector.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
Location make_Location(float latitude_deg, float longitude_deg, float UTC_offset)
Make a Location vector.
+
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
+
Date make_Date(int day, int month, int year)
Make a Date vector.
+
Date Julian2Calendar(int JulianDay, int year)
Convert a Julian day to a calendar Date vector.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+ +
int month
Month of year.
+
int day
Day of month.
+
int JulianDay() const
Convert to Julian day.
Definition global.cpp:186
+
int year
Year in YYYY format.
+ +
R-G-B-A color vector.
+
float r
Red color component.
+
float b
Blue color component.
+
float g
Green color component.
+
R-G-B color vector.
+
float b
Blue color component.
+
float r
Red color component.
+
float g
Green color component.
+
Vector of spherical coordinates (elevation,azimuth)
+
const float & elevation
Elevation angle (radians)
+
float azimuth
Azimuthal angle (radians)
+ +
int second
Second of minute.
+
int hour
Hour of day.
+
int minute
Minute of hour.
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of three elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int y
Second element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+
float magnitude() const
Compute the vector magnitude.
+ diff --git a/doc/html/_context_8h.html b/doc/html/_context_8h.html index c9832be0b..a9051e71c 100644 --- a/doc/html/_context_8h.html +++ b/doc/html/_context_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Data Structures | @@ -140,42 +152,42 @@ - - + - - + - - +

Enumerations

enum  helios::PrimitiveType { helios::PRIMITIVE_TYPE_PATCH = 0 -, helios::PRIMITIVE_TYPE_TRIANGLE = 1 -, helios::PRIMITIVE_TYPE_VOXEL = 2 +
enum  helios::PrimitiveType { helios::PRIMITIVE_TYPE_PATCH = 0 +, helios::PRIMITIVE_TYPE_TRIANGLE = 1 +, helios::PRIMITIVE_TYPE_VOXEL = 2 }
 Type of primitive element. More...
 Type of primitive element. More...
 
enum  helios::HeliosDataType {
-  helios::HELIOS_TYPE_INT = 0 -, helios::HELIOS_TYPE_UINT = 1 -, helios::HELIOS_TYPE_FLOAT = 2 -, helios::HELIOS_TYPE_DOUBLE = 3 +
enum  helios::HeliosDataType {
+  helios::HELIOS_TYPE_INT = 0 +, helios::HELIOS_TYPE_UINT = 1 +, helios::HELIOS_TYPE_FLOAT = 2 +, helios::HELIOS_TYPE_DOUBLE = 3 ,
-  helios::HELIOS_TYPE_VEC2 = 4 -, helios::HELIOS_TYPE_VEC3 = 5 -, helios::HELIOS_TYPE_VEC4 = 6 -, helios::HELIOS_TYPE_INT2 = 7 +  helios::HELIOS_TYPE_VEC2 = 4 +, helios::HELIOS_TYPE_VEC3 = 5 +, helios::HELIOS_TYPE_VEC4 = 6 +, helios::HELIOS_TYPE_INT2 = 7 ,
-  helios::HELIOS_TYPE_INT3 = 8 -, helios::HELIOS_TYPE_INT4 = 9 -, helios::HELIOS_TYPE_STRING = 10 +  helios::HELIOS_TYPE_INT3 = 8 +, helios::HELIOS_TYPE_INT4 = 9 +, helios::HELIOS_TYPE_STRING = 10
}
 Data types. More...
 Data types. More...
 
enum  helios::ObjectType {
-  helios::OBJECT_TYPE_TILE = 0 -, helios::OBJECT_TYPE_SPHERE = 1 -, helios::OBJECT_TYPE_TUBE = 2 -, helios::OBJECT_TYPE_BOX = 3 +
enum  helios::ObjectType {
+  helios::OBJECT_TYPE_TILE = 0 +, helios::OBJECT_TYPE_SPHERE = 1 +, helios::OBJECT_TYPE_TUBE = 2 +, helios::OBJECT_TYPE_BOX = 3 ,
-  helios::OBJECT_TYPE_DISK = 4 -, helios::OBJECT_TYPE_POLYMESH = 5 -, helios::OBJECT_TYPE_CONE = 6 +  helios::OBJECT_TYPE_DISK = 4 +, helios::OBJECT_TYPE_POLYMESH = 5 +, helios::OBJECT_TYPE_CONE = 6
}
 Type of compound object. More...
 Type of compound object. More...
 

Detailed Description

@@ -193,7 +205,7 @@

- +
enum helios::HeliosDataTypeenum helios::HeliosDataType

@@ -291,7 +303,8 @@

+

diff --git a/doc/html/_context_8h_source.html b/doc/html/_context_8h_source.html index 2ad939a82..e35a69ef7 100644 --- a/doc/html/_context_8h_source.html +++ b/doc/html/_context_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Context.h
@@ -105,12 +117,15 @@
27
28class Context; //forward declaration of Context class
29
+
39
+
65
+
67class Texture{
68public:
69
@@ -150,7 +167,9 @@
97 helios::int2 image_resolution;
98 float solidfraction{};
99};
+
100
+
103
104 std::vector<int> global_data_int;
@@ -170,12 +189,14 @@
118 HeliosDataType type;
119
120};
+
121
122//--------------------- GEOMETRIC PRIMITIVES -----------------------------------//
123
124
125//---------- COMPOUND OBJECTS ----------------//
126
+
144
+
146public:
147
@@ -400,11 +423,13 @@
576 bool ishidden = false;
577
578};
+
579
+
581class Tile : public CompoundObject {
582public:
583
-
585 Tile(uint a_OID, const std::vector<uint> &a_UUIDs, const int2 &a_subdiv, const char *a_texturefile, helios::Context *a_context);
+
585 Tile(uint a_OID, const std::vector<uint> &a_UUIDs, const int2 &a_subdiv, const char *a_texturefile, helios::Context *a_context);
586
588 ~Tile() override = default;
589
@@ -430,11 +455,13 @@
619 friend class CompoundObject;
620
621};
+
622
+
624class Sphere : public CompoundObject {
625public:
626
-
628 Sphere(uint a_OID, const std::vector<uint> &a_UUIDs, uint a_subdiv, const char *a_texturefile, helios::Context *a_context);
+
628 Sphere(uint a_OID, const std::vector<uint> &a_UUIDs, uint a_subdiv, const char *a_texturefile, helios::Context *a_context);
629
631 ~Sphere() override = default;
632
@@ -456,11 +483,13 @@
655 friend class CompoundObject;
656
657};
+
658
+
660class Tube : public CompoundObject {
661public:
662
-
664 Tube(uint a_OID, const std::vector<uint> &a_UUIDs, const std::vector<vec3> &a_nodes, const std::vector<float> &a_radius, const std::vector<helios::RGBcolor> &a_colors, const std::vector<std::vector<helios::vec3>> &a_triangle_vertices,
+
664 Tube(uint a_OID, const std::vector<uint> &a_UUIDs, const std::vector<vec3> &a_nodes, const std::vector<float> &a_radius, const std::vector<helios::RGBcolor> &a_colors, const std::vector<std::vector<helios::vec3>> &a_triangle_vertices,
665 uint a_subdiv, const char *a_texturefile, helios::Context *a_context);
666
668 ~Tube() override = default;
@@ -519,11 +548,13 @@
754 friend class CompoundObject;
755
756};
+
757
+
759class Box : public CompoundObject {
760public:
761
-
763 Box(uint a_OID, const std::vector<uint> &a_UUIDs, const int3 &a_subdiv, const char *a_texturefile, helios::Context *a_context);
+
763 Box(uint a_OID, const std::vector<uint> &a_UUIDs, const int3 &a_subdiv, const char *a_texturefile, helios::Context *a_context);
764
766 ~Box() override = default;
767
@@ -545,11 +576,13 @@
790 friend class CompoundObject;
791
792};
+
793
+
795class Disk : public CompoundObject {
796public:
797
-
799 Disk(uint a_OID, const std::vector<uint> &a_UUIDs, int2 a_subdiv, const char *a_texturefile, helios::Context *a_context);
+
799 Disk(uint a_OID, const std::vector<uint> &a_UUIDs, int2 a_subdiv, const char *a_texturefile, helios::Context *a_context);
800
802 ~Disk() override = default;
803
@@ -569,11 +602,13 @@
823 friend class CompoundObject;
824
825};
+
826
+
828class Polymesh : public CompoundObject {
829public:
830
-
832 Polymesh(uint a_OID, const std::vector<uint> &a_UUIDs, const char *a_texturefile, helios::Context *a_context);
+
832 Polymesh(uint a_OID, const std::vector<uint> &a_UUIDs, const char *a_texturefile, helios::Context *a_context);
833
835 ~Polymesh() override = default;
836
@@ -584,11 +619,13 @@
842 friend class CompoundObject;
843
844};
+
845
+
847class Cone : public CompoundObject {
848public:
849
-
851 Cone(uint a_OID, const std::vector<uint> &a_UUIDs, const vec3 &a_node0, const vec3 &a_node1, float a_radius0, float a_radius1, uint a_subdiv, const char *a_texturefile, helios::Context *a_context);
+
851 Cone(uint a_OID, const std::vector<uint> &a_UUIDs, const vec3 &a_node0, const vec3 &a_node1, float a_radius0, float a_radius1, uint a_subdiv, const char *a_texturefile, helios::Context *a_context);
852
854 ~Cone() override = default;
855
@@ -631,6 +668,7 @@
919 friend class CompoundObject;
920
921};
+
922
923
925
@@ -1004,6 +1042,7 @@
1694
1695};
1696
+
1699public:
1700
@@ -1074,8 +1113,10 @@
1875 static int parse_radius( const pugi::xml_node &node_data, std::vector<float> &radius );
1876
1877};
+
1878
1880
+
1883private:
1884
@@ -2836,398 +2877,407 @@
6433 std::vector<uint> filterObjectsByData( const std::vector<uint> &objIDs, const std::string &object_data_label, const std::string &filter_value );
6434
6435};
+
6436
6437}
6438
6439
6440
6441#endif
-
HeliosDataType
Data types.
Definition: Context.h:41
-
@ HELIOS_TYPE_INT3
helios::int3 data type
Definition: Context.h:59
-
@ HELIOS_TYPE_DOUBLE
double data type
Definition: Context.h:49
-
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition: Context.h:51
-
@ HELIOS_TYPE_INT
integer data type
Definition: Context.h:43
-
@ HELIOS_TYPE_STRING
std::string data type
Definition: Context.h:63
-
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition: Context.h:53
-
@ HELIOS_TYPE_INT4
helios::int4 data type
Definition: Context.h:61
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition: Context.h:57
-
@ HELIOS_TYPE_VEC4
helios::vec4 data type
Definition: Context.h:55
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
-
PrimitiveType
Type of primitive element.
Definition: Context.h:31
-
@ PRIMITIVE_TYPE_PATCH
< Rectangular primitive
Definition: Context.h:33
-
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition: Context.h:37
-
@ PRIMITIVE_TYPE_TRIANGLE
< Triangular primitive
Definition: Context.h:35
-
ObjectType
Type of compound object.
Definition: Context.h:128
-
@ OBJECT_TYPE_BOX
Box.
Definition: Context.h:136
-
@ OBJECT_TYPE_POLYMESH
< Triangular Mesh
Definition: Context.h:140
-
@ OBJECT_TYPE_TUBE
Tube.
Definition: Context.h:134
-
@ OBJECT_TYPE_CONE
< Cone/tapered cylinder
Definition: Context.h:142
-
@ OBJECT_TYPE_DISK
< Disk
Definition: Context.h:138
-
@ OBJECT_TYPE_TILE
< Tile
Definition: Context.h:130
-
@ OBJECT_TYPE_SPHERE
< Sphere
Definition: Context.h:132
-
Box compound object class.
Definition: Context.h:759
-
float getVolume() const
Get the volume of the box object.
Definition: Context.cpp:4004
-
void setSubdivisionCount(const helios::int3 &subdiv)
Set the number of box sub-patch divisions.
Definition: Context.cpp:4000
-
helios::int3 getSubdivisionCount() const
Get the number of sub-patch divisions of the box object in each Cartesian direction.
Definition: Context.cpp:3996
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the box object.
Definition: Context.cpp:3980
+
HeliosDataType
Data types.
Definition Context.h:41
+
@ HELIOS_TYPE_INT3
helios::int3 data type
Definition Context.h:59
+
@ HELIOS_TYPE_DOUBLE
double data type
Definition Context.h:49
+
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition Context.h:51
+
@ HELIOS_TYPE_INT
integer data type
Definition Context.h:43
+
@ HELIOS_TYPE_STRING
std::string data type
Definition Context.h:63
+
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition Context.h:53
+
@ HELIOS_TYPE_INT4
helios::int4 data type
Definition Context.h:61
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition Context.h:57
+
@ HELIOS_TYPE_VEC4
helios::vec4 data type
Definition Context.h:55
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
+
PrimitiveType
Type of primitive element.
Definition Context.h:31
+
@ PRIMITIVE_TYPE_PATCH
< Rectangular primitive
Definition Context.h:33
+
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition Context.h:37
+
@ PRIMITIVE_TYPE_TRIANGLE
< Triangular primitive
Definition Context.h:35
+
ObjectType
Type of compound object.
Definition Context.h:128
+
@ OBJECT_TYPE_BOX
Box.
Definition Context.h:136
+
@ OBJECT_TYPE_POLYMESH
< Triangular Mesh
Definition Context.h:140
+
@ OBJECT_TYPE_TUBE
Tube.
Definition Context.h:134
+
@ OBJECT_TYPE_CONE
< Cone/tapered cylinder
Definition Context.h:142
+
@ OBJECT_TYPE_DISK
< Disk
Definition Context.h:138
+
@ OBJECT_TYPE_TILE
< Tile
Definition Context.h:130
+
@ OBJECT_TYPE_SPHERE
< Sphere
Definition Context.h:132
+
Box compound object class.
Definition Context.h:759
+
float getVolume() const
Get the volume of the box object.
Definition Context.cpp:4004
+
void setSubdivisionCount(const helios::int3 &subdiv)
Set the number of box sub-patch divisions.
Definition Context.cpp:4000
+
helios::int3 getSubdivisionCount() const
Get the number of sub-patch divisions of the box object in each Cartesian direction.
Definition Context.cpp:3996
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the box object.
Definition Context.cpp:3980
~Box() override=default
Box destructor.
-
vec3 getSize() const
Get the dimensions of the box object in each Cartesian direction.
Definition: Context.cpp:3961
- -
uint getObjectDataSize(const char *label) const
Get the size/length of object data.
-
void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
Method to rotate a Compound Object about the x-, y-, or z-axis.
Definition: Context.cpp:2377
-
void setPrimitiveUUIDs(const std::vector< uint > &UUIDs)
Method to set the UUIDs of object child primitives.
Definition: Context.cpp:2517
-
uint getPrimitiveCount() const
Return the number of primitives contained in the object.
Definition: Context.cpp:2251
-
void overrideTextureColor()
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition: Context.cpp:2321
-
uint getObjectID() const
Get the unique identifier for the object.
Definition: Context.cpp:2243
-
std::string getTextureFile() const
Method to return the texture map file of an Object.
Definition: Context.cpp:2349
-
std::vector< std::string > listObjectData() const
Return labels for all object data for this particular object.
-
void scale(const helios::vec3 &scale)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2471
-
void deleteChildPrimitive(uint UUID)
Delete a single child member of the object.
Definition: Context.cpp:2521
-
bool hasTexture() const
Method to check whether this object has texture data.
Definition: Context.cpp:2341
-
void setTransformationMatrix(float(&T)[16])
Method to set the Affine transformation matrix of a Compound Object.
Definition: Context.cpp:2509
-
void scaleAboutCenter(const helios::vec3 &scale)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2475
-
void scaleAboutPoint(const helios::vec3 &scale, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2479
-
bool arePrimitivesComplete() const
Method to query whether all object primitives are in tact.
Definition: Context.cpp:2536
-
float getArea() const
Calculate the total one-sided surface area of the Compound Object.
Definition: Context.cpp:2285
-
void translate(const helios::vec3 &shift)
Method to translate/shift a Compound Object.
Definition: Context.cpp:2353
-
bool doesObjectDataExist(const char *label) const
Check if object data 'label' exists.
-
helios::ObjectType getObjectType() const
Get an enumeration specifying the type of the object.
Definition: Context.cpp:2247
-
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition: Context.cpp:2256
-
HeliosDataType getObjectDataType(const char *label) const
Get the Helios data type of object data.
-
void clearObjectData(const char *label)
Clear the object data for this object.
-
void getTransformationMatrix(float(&T)[16]) const
Method to return the Affine transformation matrix of a Compound Object.
Definition: Context.cpp:2503
-
void getObjectData(const char *label, int &data) const
Get data associated with a object element (integer scalar)
-
void setColor(const helios::RGBcolor &color)
Method to set the diffuse color for all primitives in the Compound Object.
Definition: Context.cpp:2301
-
void setObjectData(const char *label, const int &data)
Add data value (int) associated with a object element.
-
void useTextureColor()
For all primitives in the Compound Object, use the texture map to color the primitives rather than th...
Definition: Context.cpp:2331
-
bool doesObjectContainPrimitive(uint UUID)
Check whether a primitive is a member of the object based on its UUID.
Definition: Context.cpp:2262
-
helios::vec3 getObjectCenter() const
Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
Definition: Context.cpp:2268
-
Cone compound object class.
Definition: Context.h:847
-
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the cone object.
Definition: Context.cpp:4171
-
float getNodeRadius(int node_index) const
Get the radius of a cone object node.
Definition: Context.cpp:4163
-
void setSubdivisionCount(uint subdiv)
Set the number of radial sub-triangle divisions.
Definition: Context.cpp:4175
-
helios::vec3 getNodeCoordinate(int node_index) const
Get the Cartesian coordinates of a cone object node.
Definition: Context.cpp:4144
-
helios::vec3 getAxisUnitVector() const
Get a unit vector pointing in the direction of the cone central axis.
Definition: Context.cpp:4179
-
std::vector< helios::vec3 > getNodeCoordinates() const
Get the Cartesian coordinates of each of the cone object nodes.
Definition: Context.cpp:4130
-
void scaleLength(float S)
Method to scale the length of the cone.
Definition: Context.cpp:4212
+
Box(uint a_OID, const std::vector< uint > &a_UUIDs, const int3 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:3941
+
vec3 getSize() const
Get the dimensions of the box object in each Cartesian direction.
Definition Context.cpp:3961
+ +
uint getObjectDataSize(const char *label) const
Get the size/length of object data.
+
void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
Method to rotate a Compound Object about the x-, y-, or z-axis.
Definition Context.cpp:2377
+
void setPrimitiveUUIDs(const std::vector< uint > &UUIDs)
Method to set the UUIDs of object child primitives.
Definition Context.cpp:2517
+
uint getPrimitiveCount() const
Return the number of primitives contained in the object.
Definition Context.cpp:2251
+
void overrideTextureColor()
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition Context.cpp:2321
+
uint getObjectID() const
Get the unique identifier for the object.
Definition Context.cpp:2243
+
std::string getTextureFile() const
Method to return the texture map file of an Object.
Definition Context.cpp:2349
+
std::vector< std::string > listObjectData() const
Return labels for all object data for this particular object.
+
void scale(const helios::vec3 &scale)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2471
+
void deleteChildPrimitive(uint UUID)
Delete a single child member of the object.
Definition Context.cpp:2521
+
bool hasTexture() const
Method to check whether this object has texture data.
Definition Context.cpp:2341
+
void setTransformationMatrix(float(&T)[16])
Method to set the Affine transformation matrix of a Compound Object.
Definition Context.cpp:2509
+
void scaleAboutCenter(const helios::vec3 &scale)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2475
+
void scaleAboutPoint(const helios::vec3 &scale, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2479
+
bool arePrimitivesComplete() const
Method to query whether all object primitives are in tact.
Definition Context.cpp:2536
+
float getArea() const
Calculate the total one-sided surface area of the Compound Object.
Definition Context.cpp:2285
+
void translate(const helios::vec3 &shift)
Method to translate/shift a Compound Object.
Definition Context.cpp:2353
+
bool doesObjectDataExist(const char *label) const
Check if object data 'label' exists.
+
helios::ObjectType getObjectType() const
Get an enumeration specifying the type of the object.
Definition Context.cpp:2247
+
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition Context.cpp:2256
+
HeliosDataType getObjectDataType(const char *label) const
Get the Helios data type of object data.
+
void clearObjectData(const char *label)
Clear the object data for this object.
+
void getTransformationMatrix(float(&T)[16]) const
Method to return the Affine transformation matrix of a Compound Object.
Definition Context.cpp:2503
+
void getObjectData(const char *label, int &data) const
Get data associated with a object element (integer scalar)
+
void setColor(const helios::RGBcolor &color)
Method to set the diffuse color for all primitives in the Compound Object.
Definition Context.cpp:2301
+
void setObjectData(const char *label, const int &data)
Add data value (int) associated with a object element.
+
void useTextureColor()
For all primitives in the Compound Object, use the texture map to color the primitives rather than th...
Definition Context.cpp:2331
+
bool doesObjectContainPrimitive(uint UUID)
Check whether a primitive is a member of the object based on its UUID.
Definition Context.cpp:2262
+
helios::vec3 getObjectCenter() const
Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
Definition Context.cpp:2268
+
Cone compound object class.
Definition Context.h:847
+
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the cone object.
Definition Context.cpp:4171
+
Cone(uint a_OID, const std::vector< uint > &a_UUIDs, const vec3 &a_node0, const vec3 &a_node1, float a_radius0, float a_radius1, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:4107
+
float getNodeRadius(int node_index) const
Get the radius of a cone object node.
Definition Context.cpp:4163
+
void setSubdivisionCount(uint subdiv)
Set the number of radial sub-triangle divisions.
Definition Context.cpp:4175
+
helios::vec3 getNodeCoordinate(int node_index) const
Get the Cartesian coordinates of a cone object node.
Definition Context.cpp:4144
+
helios::vec3 getAxisUnitVector() const
Get a unit vector pointing in the direction of the cone central axis.
Definition Context.cpp:4179
+
std::vector< helios::vec3 > getNodeCoordinates() const
Get the Cartesian coordinates of each of the cone object nodes.
Definition Context.cpp:4130
+
void scaleLength(float S)
Method to scale the length of the cone.
Definition Context.cpp:4212
~Cone() override=default
Cone destructor.
-
void scaleGirth(float S)
Method to scale the girth of the cone.
Definition: Context.cpp:4261
-
float getLength() const
Get the length of the cone along the axial direction.
Definition: Context.cpp:4197
-
std::vector< float > getNodeRadii() const
Get the radius at each of the cone object nodes.
Definition: Context.cpp:4159
-
float getVolume() const
Get the volume of the cone object.
Definition: Context.cpp:4302
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void copyPrimitiveData(uint sourceUUID, uint destinationUUID)
copy all primitive data from one primitive to another
-
std::vector< helios::vec2 > getTileObjectTextureUV(uint ObjID) const
get the texture UV coordinates of a tile object from the context
Definition: Context.cpp:8132
-
void setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)
Change the subdivision count of a tile object.
Definition: Context.cpp:2982
-
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition: Context.cpp:7139
-
void getPrimitiveTransformationMatrix(uint UUID, float(&T)[16]) const
Method to return the Affine transformation matrix of a Primitive.
Definition: Context.cpp:7108
-
void scaleTubeLength(uint ObjID, float scale_factor)
Scale the length of a tube object by an arbitrary factor for all tube nodes.
Definition: Context.cpp:8208
-
bool isObjectHidden(uint ObjID) const
Query if an object is hidden.
Definition: Context.cpp:7913
-
std::vector< std::string > listTimeseriesVariables() const
List all existing timeseries variables.
Definition: Context.cpp:2036
-
void scalePrimitiveData(const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)
Multiply primitive data values by a constant scaling factor for a subset of primitives.
-
void scaleObjectAboutPoint(uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2897
-
float getTubeObjectSegmentVolume(uint ObjID, uint segment_index) const
get the volume of a segment within a Tube object
Definition: Context.cpp:8176
-
std::vector< uint > loadPLY(const char *filename, bool silent=false)
Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
-
helios::RGBcolor getPrimitiveColor(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition: Context.cpp:7127
-
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
-
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition: Context.cpp:2642
-
float randn()
Draw a random number from a normal distribution with mean = 0, stddev = 1.
Definition: Context.cpp:1204
-
Disk * getDiskObjectPointer(uint ObjID) const
Get a pointer to a Disk Compound Object.
Definition: Context.cpp:4022
-
void overrideObjectTextureColor(uint ObjID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition: Context.cpp:7978
-
std::vector< uint > getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs) const
Method to return unique parent object IDs for a vector of primitive UUIDs.
Definition: Context.cpp:7022
-
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition: Context.cpp:1406
-
void getObjectBoundingBox(uint ObjID, vec3 &min_corner, vec3 &max_corner) const
Get the axis-aligned bounding box for a single object.
Definition: Context.cpp:7998
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
Load tabular weather data from text file into timeseries.
-
Box * getBoxObjectPointer(uint ObjID) const
Get a pointer to a Box Compound Object.
Definition: Context.cpp:3954
-
void cleanDeletedUUIDs(std::vector< uint > &UUIDs) const
Delete UUIDs from vector if primitives no longer exist (1D vector)
Definition: Context.cpp:1793
-
uint getConeObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Cone object from the context
Definition: Context.cpp:8250
-
helios::vec3 getDiskObjectCenter(uint ObjID) const
get the center of a Disk object from the context
Definition: Context.cpp:8238
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
int getJulianDate() const
Get simulation date by Julian day.
Definition: Context.cpp:1132
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
helios::int3 getBoxObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Box object from the context
Definition: Context.cpp:8230
-
uint getTubeObjectSubdivisionCount(uint ObjectID) const
get the subdivision count of a Tube object from the context
Definition: Context.cpp:8156
-
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
-
~Context()
Context destructor.
Definition: Context.cpp:6970
-
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:7017
-
std::vector< uint > getAllObjectIDs() const
Get the IDs for all Compound Objects in the Context.
Definition: Context.cpp:2589
-
Cone * getConeObjectPointer(uint ObjID) const
Get a pointer to a Cone Compound Object.
Definition: Context.cpp:4123
-
void seedRandomGenerator(uint seed)
Set seed for random generator.
Definition: Context.cpp:45
-
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
-
void printPrimitiveInfo(uint UUID) const
Prints primitive properties to console (useful for debugging purposes)
Definition: Context.cpp:7225
-
void markGeometryClean()
Mark the Context geometry as "clean", meaning that the geometry has not been modified since last set ...
Definition: Context.cpp:149
-
void getDomainBoundingSphere(helios::vec3 &center, float &radius) const
Get the center and radius of a sphere that bounds all primitives in the domain.
Definition: Context.cpp:2116
-
void rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
Rotate a single compound object about the x, y, or z axis.
Definition: Context.cpp:2847
-
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition: Context.cpp:2574
-
helios::vec3 getPatchCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a patch element.
Definition: Context.cpp:1693
-
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.
-
helios::vec2 getTileObjectSize(uint ObjID) const
get the size of a tile object from the context
Definition: Context.cpp:8120
-
uint getObjectPrimitiveCount(uint ObjID) const
Method to return the number of primitives contained in the object.
Definition: Context.cpp:7924
-
std::vector< std::string > getLoadedXMLFiles()
Get names of XML files that are currently loaded.
-
uint getPrimitiveDataSize(uint UUID, const char *label) const
Get the size/length of primitive data.
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
void calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, float &sum) const
Calculate sum of primitive data values (float) for a subset of primitives.
-
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition: Context.cpp:7135
-
helios::vec3 getBoxObjectSize(uint ObjID) const
get the size of a Box object from the context
Definition: Context.cpp:8226
-
helios::vec3 getSphereObjectCenter(uint ObjID) const
get the center of a Sphere object from the context
Definition: Context.cpp:8140
-
void incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, int increment)
Increase value of primitive data (int) by some value.
-
helios::vec3 getObjectCenter(uint ObjID) const
Method to return the Cartesian (x,y,z) point of the center of a bounding box for the object.
Definition: Context.cpp:7928
-
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition: Context.cpp:7159
-
uint getObjectCount() const
Get the total number of objects that have been created in the Context.
Definition: Context.cpp:2581
-
helios::vec3 getConeObjectNode(uint ObjID, int number) const
get a node of a Cone object from the context
Definition: Context.cpp:8262
-
float getTubeObjectVolume(uint ObjID) const
get the volume of a Tube object from the context
Definition: Context.cpp:8172
-
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition: Context.cpp:7175
-
void cropDomainZ(const vec2 &zbounds)
Crop the domain in the z-direction such that all primitives lie within some specified z interval.
Definition: Context.cpp:2190
-
Polymesh * getPolymeshObjectPointer(uint ObjID) const
Get a pointer to a Polygon Mesh Compound Object.
Definition: Context.cpp:4081
-
void cropDomainX(const vec2 &xbounds)
Crop the domain in the x-direction such that all primitives lie within some specified x interval.
Definition: Context.cpp:2144
-
helios::vec3 getSphereObjectRadius(uint ObjID) const
get the radius of a Sphere object from the context
Definition: Context.cpp:8144
-
void setDate(int day, int month, int year)
Set simulation date by day, month, year.
Definition: Context.cpp:1059
-
void renamePrimitiveData(uint UUID, const char *old_label, const char *new_label)
Rename primitive data for a primitive.
-
void setPrimitiveParentObjectID(uint UUID, uint objID)
Method to set the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:6988
-
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition: Context.cpp:7179
-
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition: Context.cpp:1420
-
void usePrimitiveTextureColor(uint UUID)
Use the texture map to color the primitive rather than the constant RGB color. This is function rever...
Definition: Context.cpp:7207
-
bool doesObjectContainPrimitive(uint ObjID, uint UUID)
Method to check if an Object contains a Primitive.
Definition: Context.cpp:7974
-
void duplicateObjectData(uint objID, const char *old_label, const char *new_label)
Duplicate/copy existing object data.
-
const char * getMonthString() const
Get a string corresponding to the month of the simulation date.
Definition: Context.cpp:1103
-
std::vector< uint > filterObjectsByData(const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const
Get a vector of object IDs that meet filtering criteria based on object data.
Definition: Context.cpp:2750
-
void setObjectColor(uint ObjID, const helios::RGBcolor &color)
Method to set the diffuse color of an Object.
Definition: Context.cpp:7954
-
void setTriangleVertices(uint UUID, const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
//! Manually set the Triangle vertices
Definition: Context.cpp:1722
-
void appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)
Append a tube segment to an existing tube object.
Definition: Context.cpp:8180
-
bool isGeometryDirty() const
Query whether the Context geometry is "dirty", meaning has the geometry been modified since last set ...
Definition: Context.cpp:157
-
helios::vec3 getTileObjectNormal(uint ObjID) const
get the normal of a tile object from the context
Definition: Context.cpp:8128
-
Context()
Context default constructor.
Definition: Context.cpp:20
-
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
-
void aggregatePrimitiveDataProduct(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Multiply primitive data values for each primitive together and store result in new primitive data.
-
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition: Context.cpp:6984
-
helios::vec3 getVoxelSize(uint UUID) const
Get the size of a voxel element.
Definition: Context.cpp:1741
-
std::vector< float > getTubeObjectNodeRadii(uint ObjID) const
get the node radii of a Tube object from the context
Definition: Context.cpp:8164
-
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
-
void clearObjectData(uint objID, const char *label)
Clear primitive data for a single primitive based on its objID.
-
float getPrimitiveSolidFraction(uint UUID) const
Get fraction of primitive surface area that is non-transparent.
Definition: Context.cpp:7221
-
void translateObject(uint ObjID, const vec3 &shift)
Translate a single compound object.
Definition: Context.cpp:2837
-
void scaleObjectAboutCenter(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2887
-
void cropDomainY(const vec2 &ybounds)
Crop the domain in the y-direction such that all primitives lie within some specified y interval.
Definition: Context.cpp:2167
-
helios::ObjectType getObjectType(uint ObjID) const
Get an enumeration specifying the type of the object.
Definition: Context.cpp:2940
-
void colorPrimitiveByDataPseudocolor(const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors)
Overwrite primitive color based on a pseudocolor mapping of primitive data values.
Definition: Context.cpp:6666
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< RGBcolor > getTubeObjectNodeColors(uint ObjID) const
get the node colors of a Tube object from the context
Definition: Context.cpp:8168
-
std::vector< std::string > listPrimitiveData(uint UUID) const
Return labels for all primitive data for this particular primitive.
-
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition: Context.cpp:2907
-
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition: Context.cpp:1578
-
helios::int2 getPrimitiveTextureSize(uint UUID) const
Get the size (number of pixels) of primitive texture map image.
Definition: Context.cpp:7167
-
void writeOBJ(const std::string &filename) const
Write geometry in the Context to a Wavefront file (.obj)
-
void renameGlobalData(const char *old_label, const char *new_label)
Rename global data.
-
helios::vec3 getTriangleVertex(uint UUID, uint number) const
Get a single vertex of a Triangle based on an index.
Definition: Context.cpp:1711
-
helios::Time getTime() const
Get the simulation time.
Definition: Context.cpp:1166
-
helios::RGBcolor getPrimitiveColorRGB(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition: Context.cpp:7131
+
void scaleGirth(float S)
Method to scale the girth of the cone.
Definition Context.cpp:4261
+
float getLength() const
Get the length of the cone along the axial direction.
Definition Context.cpp:4197
+
std::vector< float > getNodeRadii() const
Get the radius at each of the cone object nodes.
Definition Context.cpp:4159
+
float getVolume() const
Get the volume of the cone object.
Definition Context.cpp:4302
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void copyPrimitiveData(uint sourceUUID, uint destinationUUID)
copy all primitive data from one primitive to another
+
std::vector< helios::vec2 > getTileObjectTextureUV(uint ObjID) const
get the texture UV coordinates of a tile object from the context
Definition Context.cpp:8132
+
void setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)
Change the subdivision count of a tile object.
Definition Context.cpp:2982
+
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition Context.cpp:7139
+
void getPrimitiveTransformationMatrix(uint UUID, float(&T)[16]) const
Method to return the Affine transformation matrix of a Primitive.
Definition Context.cpp:7108
+
void scaleTubeLength(uint ObjID, float scale_factor)
Scale the length of a tube object by an arbitrary factor for all tube nodes.
Definition Context.cpp:8208
+
bool isObjectHidden(uint ObjID) const
Query if an object is hidden.
Definition Context.cpp:7913
+
std::vector< std::string > listTimeseriesVariables() const
List all existing timeseries variables.
Definition Context.cpp:2036
+
void scalePrimitiveData(const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)
Multiply primitive data values by a constant scaling factor for a subset of primitives.
+
void scaleObjectAboutPoint(uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2897
+
float getTubeObjectSegmentVolume(uint ObjID, uint segment_index) const
get the volume of a segment within a Tube object
Definition Context.cpp:8176
+
std::vector< uint > loadPLY(const char *filename, bool silent=false)
Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
+
helios::RGBcolor getPrimitiveColor(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition Context.cpp:7127
+
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
+
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition Context.cpp:2642
+
float randn()
Draw a random number from a normal distribution with mean = 0, stddev = 1.
Definition Context.cpp:1204
+
Disk * getDiskObjectPointer(uint ObjID) const
Get a pointer to a Disk Compound Object.
Definition Context.cpp:4022
+
void overrideObjectTextureColor(uint ObjID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition Context.cpp:7978
+
std::vector< uint > getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs) const
Method to return unique parent object IDs for a vector of primitive UUIDs.
Definition Context.cpp:7022
+
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition Context.cpp:1406
+
void getObjectBoundingBox(uint ObjID, vec3 &min_corner, vec3 &max_corner) const
Get the axis-aligned bounding box for a single object.
Definition Context.cpp:7998
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
Load tabular weather data from text file into timeseries.
+
Box * getBoxObjectPointer(uint ObjID) const
Get a pointer to a Box Compound Object.
Definition Context.cpp:3954
+
void cleanDeletedUUIDs(std::vector< uint > &UUIDs) const
Delete UUIDs from vector if primitives no longer exist (1D vector)
Definition Context.cpp:1793
+
uint getConeObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Cone object from the context
Definition Context.cpp:8250
+
helios::vec3 getDiskObjectCenter(uint ObjID) const
get the center of a Disk object from the context
Definition Context.cpp:8238
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
int getJulianDate() const
Get simulation date by Julian day.
Definition Context.cpp:1132
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
helios::int3 getBoxObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Box object from the context
Definition Context.cpp:8230
+
uint getTubeObjectSubdivisionCount(uint ObjectID) const
get the subdivision count of a Tube object from the context
Definition Context.cpp:8156
+
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
+
~Context()
Context destructor.
Definition Context.cpp:6970
+
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:7017
+
std::vector< uint > getAllObjectIDs() const
Get the IDs for all Compound Objects in the Context.
Definition Context.cpp:2589
+
Cone * getConeObjectPointer(uint ObjID) const
Get a pointer to a Cone Compound Object.
Definition Context.cpp:4123
+
void seedRandomGenerator(uint seed)
Set seed for random generator.
Definition Context.cpp:45
+
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
+
void printPrimitiveInfo(uint UUID) const
Prints primitive properties to console (useful for debugging purposes)
Definition Context.cpp:7225
+
void markGeometryClean()
Mark the Context geometry as "clean", meaning that the geometry has not been modified since last set ...
Definition Context.cpp:149
+
void getDomainBoundingSphere(helios::vec3 &center, float &radius) const
Get the center and radius of a sphere that bounds all primitives in the domain.
Definition Context.cpp:2116
+
void rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
Rotate a single compound object about the x, y, or z axis.
Definition Context.cpp:2847
+
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition Context.cpp:2574
+
helios::vec3 getPatchCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a patch element.
Definition Context.cpp:1693
+
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.
+
helios::vec2 getTileObjectSize(uint ObjID) const
get the size of a tile object from the context
Definition Context.cpp:8120
+
uint getObjectPrimitiveCount(uint ObjID) const
Method to return the number of primitives contained in the object.
Definition Context.cpp:7924
+
std::vector< std::string > getLoadedXMLFiles()
Get names of XML files that are currently loaded.
+
uint getPrimitiveDataSize(uint UUID, const char *label) const
Get the size/length of primitive data.
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
void calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, float &sum) const
Calculate sum of primitive data values (float) for a subset of primitives.
+
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition Context.cpp:7135
+
helios::vec3 getBoxObjectSize(uint ObjID) const
get the size of a Box object from the context
Definition Context.cpp:8226
+
helios::vec3 getSphereObjectCenter(uint ObjID) const
get the center of a Sphere object from the context
Definition Context.cpp:8140
+
void incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, int increment)
Increase value of primitive data (int) by some value.
+
helios::vec3 getObjectCenter(uint ObjID) const
Method to return the Cartesian (x,y,z) point of the center of a bounding box for the object.
Definition Context.cpp:7928
+
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition Context.cpp:7159
+
uint getObjectCount() const
Get the total number of objects that have been created in the Context.
Definition Context.cpp:2581
+
helios::vec3 getConeObjectNode(uint ObjID, int number) const
get a node of a Cone object from the context
Definition Context.cpp:8262
+
float getTubeObjectVolume(uint ObjID) const
get the volume of a Tube object from the context
Definition Context.cpp:8172
+
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition Context.cpp:7175
+
void cropDomainZ(const vec2 &zbounds)
Crop the domain in the z-direction such that all primitives lie within some specified z interval.
Definition Context.cpp:2190
+
Polymesh * getPolymeshObjectPointer(uint ObjID) const
Get a pointer to a Polygon Mesh Compound Object.
Definition Context.cpp:4081
+
void cropDomainX(const vec2 &xbounds)
Crop the domain in the x-direction such that all primitives lie within some specified x interval.
Definition Context.cpp:2144
+
helios::vec3 getSphereObjectRadius(uint ObjID) const
get the radius of a Sphere object from the context
Definition Context.cpp:8144
+
void setDate(int day, int month, int year)
Set simulation date by day, month, year.
Definition Context.cpp:1059
+
void renamePrimitiveData(uint UUID, const char *old_label, const char *new_label)
Rename primitive data for a primitive.
+
void setPrimitiveParentObjectID(uint UUID, uint objID)
Method to set the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:6988
+
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition Context.cpp:7179
+
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition Context.cpp:1420
+
void usePrimitiveTextureColor(uint UUID)
Use the texture map to color the primitive rather than the constant RGB color. This is function rever...
Definition Context.cpp:7207
+
bool doesObjectContainPrimitive(uint ObjID, uint UUID)
Method to check if an Object contains a Primitive.
Definition Context.cpp:7974
+
void duplicateObjectData(uint objID, const char *old_label, const char *new_label)
Duplicate/copy existing object data.
+
const char * getMonthString() const
Get a string corresponding to the month of the simulation date.
Definition Context.cpp:1103
+
std::vector< uint > filterObjectsByData(const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const
Get a vector of object IDs that meet filtering criteria based on object data.
Definition Context.cpp:2750
+
void setObjectColor(uint ObjID, const helios::RGBcolor &color)
Method to set the diffuse color of an Object.
Definition Context.cpp:7954
+
void setTriangleVertices(uint UUID, const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
//! Manually set the Triangle vertices
Definition Context.cpp:1722
+
void appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)
Append a tube segment to an existing tube object.
Definition Context.cpp:8180
+
bool isGeometryDirty() const
Query whether the Context geometry is "dirty", meaning has the geometry been modified since last set ...
Definition Context.cpp:157
+
helios::vec3 getTileObjectNormal(uint ObjID) const
get the normal of a tile object from the context
Definition Context.cpp:8128
+
Context()
Context default constructor.
Definition Context.cpp:20
+
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
+
void aggregatePrimitiveDataProduct(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Multiply primitive data values for each primitive together and store result in new primitive data.
+
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition Context.cpp:6984
+
helios::vec3 getVoxelSize(uint UUID) const
Get the size of a voxel element.
Definition Context.cpp:1741
+
std::vector< float > getTubeObjectNodeRadii(uint ObjID) const
get the node radii of a Tube object from the context
Definition Context.cpp:8164
+
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
+
void clearObjectData(uint objID, const char *label)
Clear primitive data for a single primitive based on its objID.
+
float getPrimitiveSolidFraction(uint UUID) const
Get fraction of primitive surface area that is non-transparent.
Definition Context.cpp:7221
+
void translateObject(uint ObjID, const vec3 &shift)
Translate a single compound object.
Definition Context.cpp:2837
+
void scaleObjectAboutCenter(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2887
+
void cropDomainY(const vec2 &ybounds)
Crop the domain in the y-direction such that all primitives lie within some specified y interval.
Definition Context.cpp:2167
+
helios::ObjectType getObjectType(uint ObjID) const
Get an enumeration specifying the type of the object.
Definition Context.cpp:2940
+
void colorPrimitiveByDataPseudocolor(const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors)
Overwrite primitive color based on a pseudocolor mapping of primitive data values.
Definition Context.cpp:6666
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< RGBcolor > getTubeObjectNodeColors(uint ObjID) const
get the node colors of a Tube object from the context
Definition Context.cpp:8168
+
std::vector< std::string > listPrimitiveData(uint UUID) const
Return labels for all primitive data for this particular primitive.
+
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition Context.cpp:2907
+
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition Context.cpp:1578
+
helios::int2 getPrimitiveTextureSize(uint UUID) const
Get the size (number of pixels) of primitive texture map image.
Definition Context.cpp:7167
+
void writeOBJ(const std::string &filename) const
Write geometry in the Context to a Wavefront file (.obj)
+
void renameGlobalData(const char *old_label, const char *new_label)
Rename global data.
+
helios::vec3 getTriangleVertex(uint UUID, uint number) const
Get a single vertex of a Triangle based on an index.
Definition Context.cpp:1711
+
helios::Time getTime() const
Get the simulation time.
Definition Context.cpp:1166
+
helios::RGBcolor getPrimitiveColorRGB(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition Context.cpp:7131
Context(const Context &)=delete
Deleted copy constructor to prevent copying of Context.
-
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
-
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition: Context.cpp:2046
-
void duplicatePrimitiveData(uint UUID, const char *old_label, const char *new_label)
Duplicate/copy primitive data.
-
uint getDiskObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Disk object from the context
Definition: Context.cpp:8246
-
void setPrimitiveTextureFile(uint UUID, const std::string &texturefile)
Set the texture map file for a primitive.
Definition: Context.cpp:7163
-
std::vector< helios::vec3 > getConeObjectNodes(uint ObjID) const
get the nodes of a Cone object from the context
Definition: Context.cpp:8254
-
void hidePrimitive(const std::vector< uint > &UUIDs)
Hide primitives in the Context such that their UUIDs are not returned in Context::getAllUUIDs()
Definition: Context.cpp:1777
-
Sphere * getSphereObjectPointer(uint ObjID) const
Get a pointer to a Sphere Compound Object.
Definition: Context.cpp:3410
-
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition: Context.cpp:7197
-
void calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, float &mean) const
Calculate mean of primitive data values (float) for a subset of primitives.
-
helios::int2 getTileObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a tile object from the context
Definition: Context.cpp:8124
-
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
-
bool isPrimitiveHidden(uint UUID) const
Query whether a primitive is hidden.
Definition: Context.cpp:1786
-
helios::Date getDate() const
Get simulation date.
Definition: Context.cpp:1099
-
void printObjectInfo(uint ObjID) const
Prints object properties to console (useful for debugging purposes)
Definition: Context.cpp:7499
-
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition: Context.cpp:49
-
size_t getGlobalDataSize(const char *label) const
Get the size/length of global data.
-
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
-
void hideObject(const std::vector< uint > &ObjIDs)
Hide compound objects in the Context such that their object IDs are not returned in Context::getAllOb...
Definition: Context.cpp:7901
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition: Context.cpp:7187
-
float getTileObjectAreaRatio(uint ObjectID) const
Get the area ratio of a tile object (total object area / sub-patch area)
Definition: Context.cpp:2944
-
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition: Context.cpp:2585
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
void clearGlobalData(const char *label)
Delete/clear global data.
-
void renameObjectData(uint objID, const char *old_label, const char *new_label)
Rename existing object data.
-
std::vector< helios::vec3 > getTubeObjectNodes(uint ObjID) const
get the nodes of a Tube object from the context
Definition: Context.cpp:8160
-
void writePLY(const char *filename) const
Write geometry in the Context to a Stanford polygon file (.ply)
-
helios::vec3 getTileObjectCenter(uint ObjID) const
Get the Cartesian (x,y,z) center position of a tile object.
Definition: Context.cpp:8116
-
void scaleTubeGirth(uint ObjID, float scale_factor)
Scale the girth for all nodes of a tube object.
Definition: Context.cpp:8194
-
void setGlobalData(const char *label, const int &data)
Add global data value (int)
-
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition: Context.cpp:7217
-
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition: Context.cpp:2609
-
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition: Context.cpp:7920
-
std::string getObjectTextureFile(uint ObjID) const
Method to return the texture map file of an Object.
Definition: Context.cpp:7932
-
void aggregatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Sum multiple primitive data values for each primitive together and store result in new primitive data...
-
float getPolymeshObjectVolume(uint ObjID) const
Get the volume of a Polygon Mesh object from the context.
Definition: Context.cpp:8282
-
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition: Context.cpp:1491
-
Tube * getTubeObjectPointer(uint ObjID) const
Get a pointer to a Tube Compound Object.
Definition: Context.cpp:3486
-
helios::vec2 getPatchSize(uint UUID) const
Get the size of a patch element.
Definition: Context.cpp:1684
-
void writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const
Write primitive data to an ASCII text file for all primitives in the Context.
-
std::vector< helios::vec3 > getTileObjectVertices(uint ObjID) const
get the vertices of a tile object from the context
Definition: Context.cpp:8136
-
void markGeometryDirty()
Mark the Context geometry as "dirty", meaning that the geometry has been modified since last set as c...
Definition: Context.cpp:153
-
void getPrimitiveBoundingBox(uint UUID, vec3 &min_corner, vec3 &max_corner) const
Get the axis-aligned bounding box for a single primitive.
Definition: Context.cpp:7057
-
void writeXML(const char *filename, bool quiet=false) const
Write Context geometry and data to XML file for all UUIDs in the context.
-
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition: Context.cpp:7104
-
uint getObjectDataSize(uint objID, const char *label) const
Get the size/length of primitive data.
-
void calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const
Calculate sum of primitive data values (float) for a subset of primitives, where each value in the su...
-
void incrementGlobalData(const char *label, int increment)
Increase value of global data (int) by some value.
-
void clearPrimitiveData(uint UUID, const char *label)
Clear primitive data for a single primitive based on its UUID.
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
helios::vec3 getConeObjectAxisUnitVector(uint ObjID) const
get the axis unit vector of a Cone object from the context
Definition: Context.cpp:8270
-
helios::vec3 getVoxelCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a voxel element.
Definition: Context.cpp:1750
-
void calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const
Calculate mean of primitive data values (float) for a subset of primitives, where each value in the m...
-
helios::vec2 getDiskObjectSize(uint ObjID) const
get the size of a Disk object from the context
Definition: Context.cpp:8242
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
bool areObjectPrimitivesComplete(uint objID) const
Method to query whether all object primitives are in tact.
Definition: Context.cpp:2540
-
float getConeObjectLength(uint ObjID) const
get the length of a Cone object from the context
Definition: Context.cpp:8274
-
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition: Context.cpp:3312
-
void scalePrimitiveAboutPoint(uint UUID, const helios::vec3 &S, const helios::vec3 point)
Scale a primitive using its UUID about an arbitrary point in space.
Definition: Context.cpp:1512
-
void useObjectTextureColor(uint ObjID)
For all primitives in the Compound Object, use the texture map to color the primitives rather than th...
Definition: Context.cpp:7988
-
uint getSphereObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Sphere object from the context
Definition: Context.cpp:8148
-
static bool scanXMLForTag(const std::string &filename, const std::string &tag, const std::string &label="")
Scan a Helios XML file to check if a tag exists.
-
void setLocation(const helios::Location &location)
Set the location of the simulation (latitude, longitude, and UTC offset)
Definition: Context.cpp:1170
-
std::vector< std::string > listObjectData(uint ObjID) const
Return labels for all object data for this particular object.
-
std::vector< float > getConeObjectNodeRadii(uint ObjID) const
get the node radii of a Cone object from the context
Definition: Context.cpp:8258
-
std::vector< std::string > listGlobalData() const
List the labels for all global data in the Context.
-
void writeXML_byobject(const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const
Write Context geometry and data to XML file for a subset of compound object IDs in the context.
-
float getBoxObjectVolume(uint ObjID) const
get the volume of a Box object from the context
Definition: Context.cpp:8234
-
void copyObjectData(uint source_objID, uint destination_objID)
copy all object data from one compound object to another
-
void setTime(int minute, int hour)
Set simulation time.
Definition: Context.cpp:1136
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
void duplicateGlobalData(const char *old_label, const char *new_label)
Make a copy of global data.
-
float getSphereObjectVolume(uint ObjID) const
get the volume of a Sphere object from the context
Definition: Context.cpp:8152
-
void setObjectTransformationMatrix(uint ObjID, float(&T)[16])
Method to set the Affine transformation matrix of an Object.
Definition: Context.cpp:7940
-
void cropDomain(std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
Crop specified UUIDs such that they lie within some specified axis-aligned box.
Definition: Context.cpp:2213
+
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
+
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition Context.cpp:2046
+
void duplicatePrimitiveData(uint UUID, const char *old_label, const char *new_label)
Duplicate/copy primitive data.
+
uint getDiskObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Disk object from the context
Definition Context.cpp:8246
+
void setPrimitiveTextureFile(uint UUID, const std::string &texturefile)
Set the texture map file for a primitive.
Definition Context.cpp:7163
+
std::vector< helios::vec3 > getConeObjectNodes(uint ObjID) const
get the nodes of a Cone object from the context
Definition Context.cpp:8254
+
void hidePrimitive(const std::vector< uint > &UUIDs)
Hide primitives in the Context such that their UUIDs are not returned in Context::getAllUUIDs()
Definition Context.cpp:1777
+
Sphere * getSphereObjectPointer(uint ObjID) const
Get a pointer to a Sphere Compound Object.
Definition Context.cpp:3410
+
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition Context.cpp:7197
+
void calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, float &mean) const
Calculate mean of primitive data values (float) for a subset of primitives.
+
helios::int2 getTileObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a tile object from the context
Definition Context.cpp:8124
+
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
+
bool isPrimitiveHidden(uint UUID) const
Query whether a primitive is hidden.
Definition Context.cpp:1786
+
helios::Date getDate() const
Get simulation date.
Definition Context.cpp:1099
+
void printObjectInfo(uint ObjID) const
Prints object properties to console (useful for debugging purposes)
Definition Context.cpp:7499
+
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition Context.cpp:49
+
size_t getGlobalDataSize(const char *label) const
Get the size/length of global data.
+
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
+
void hideObject(const std::vector< uint > &ObjIDs)
Hide compound objects in the Context such that their object IDs are not returned in Context::getAllOb...
Definition Context.cpp:7901
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition Context.cpp:7187
+
float getTileObjectAreaRatio(uint ObjectID) const
Get the area ratio of a tile object (total object area / sub-patch area)
Definition Context.cpp:2944
+
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition Context.cpp:2585
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
void clearGlobalData(const char *label)
Delete/clear global data.
+
void renameObjectData(uint objID, const char *old_label, const char *new_label)
Rename existing object data.
+
std::vector< helios::vec3 > getTubeObjectNodes(uint ObjID) const
get the nodes of a Tube object from the context
Definition Context.cpp:8160
+
void writePLY(const char *filename) const
Write geometry in the Context to a Stanford polygon file (.ply)
+
helios::vec3 getTileObjectCenter(uint ObjID) const
Get the Cartesian (x,y,z) center position of a tile object.
Definition Context.cpp:8116
+
void scaleTubeGirth(uint ObjID, float scale_factor)
Scale the girth for all nodes of a tube object.
Definition Context.cpp:8194
+
void setGlobalData(const char *label, const int &data)
Add global data value (int)
+
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition Context.cpp:7217
+
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition Context.cpp:2609
+
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition Context.cpp:7920
+
std::string getObjectTextureFile(uint ObjID) const
Method to return the texture map file of an Object.
Definition Context.cpp:7932
+
void aggregatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Sum multiple primitive data values for each primitive together and store result in new primitive data...
+
float getPolymeshObjectVolume(uint ObjID) const
Get the volume of a Polygon Mesh object from the context.
Definition Context.cpp:8282
+
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition Context.cpp:1491
+
Tube * getTubeObjectPointer(uint ObjID) const
Get a pointer to a Tube Compound Object.
Definition Context.cpp:3486
+
helios::vec2 getPatchSize(uint UUID) const
Get the size of a patch element.
Definition Context.cpp:1684
+
void writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const
Write primitive data to an ASCII text file for all primitives in the Context.
+
std::vector< helios::vec3 > getTileObjectVertices(uint ObjID) const
get the vertices of a tile object from the context
Definition Context.cpp:8136
+
void markGeometryDirty()
Mark the Context geometry as "dirty", meaning that the geometry has been modified since last set as c...
Definition Context.cpp:153
+
void getPrimitiveBoundingBox(uint UUID, vec3 &min_corner, vec3 &max_corner) const
Get the axis-aligned bounding box for a single primitive.
Definition Context.cpp:7057
+
void writeXML(const char *filename, bool quiet=false) const
Write Context geometry and data to XML file for all UUIDs in the context.
+
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition Context.cpp:7104
+
uint getObjectDataSize(uint objID, const char *label) const
Get the size/length of primitive data.
+
void calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const
Calculate sum of primitive data values (float) for a subset of primitives, where each value in the su...
+
void incrementGlobalData(const char *label, int increment)
Increase value of global data (int) by some value.
+
void clearPrimitiveData(uint UUID, const char *label)
Clear primitive data for a single primitive based on its UUID.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
helios::vec3 getConeObjectAxisUnitVector(uint ObjID) const
get the axis unit vector of a Cone object from the context
Definition Context.cpp:8270
+
helios::vec3 getVoxelCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a voxel element.
Definition Context.cpp:1750
+
void calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const
Calculate mean of primitive data values (float) for a subset of primitives, where each value in the m...
+
helios::vec2 getDiskObjectSize(uint ObjID) const
get the size of a Disk object from the context
Definition Context.cpp:8242
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
bool areObjectPrimitivesComplete(uint objID) const
Method to query whether all object primitives are in tact.
Definition Context.cpp:2540
+
float getConeObjectLength(uint ObjID) const
get the length of a Cone object from the context
Definition Context.cpp:8274
+
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition Context.cpp:3312
+
void scalePrimitiveAboutPoint(uint UUID, const helios::vec3 &S, const helios::vec3 point)
Scale a primitive using its UUID about an arbitrary point in space.
Definition Context.cpp:1512
+
void useObjectTextureColor(uint ObjID)
For all primitives in the Compound Object, use the texture map to color the primitives rather than th...
Definition Context.cpp:7988
+
uint getSphereObjectSubdivisionCount(uint ObjID) const
get the subdivision count of a Sphere object from the context
Definition Context.cpp:8148
+
static bool scanXMLForTag(const std::string &filename, const std::string &tag, const std::string &label="")
Scan a Helios XML file to check if a tag exists.
+
void setLocation(const helios::Location &location)
Set the location of the simulation (latitude, longitude, and UTC offset)
Definition Context.cpp:1170
+
std::vector< std::string > listObjectData(uint ObjID) const
Return labels for all object data for this particular object.
+
std::vector< float > getConeObjectNodeRadii(uint ObjID) const
get the node radii of a Cone object from the context
Definition Context.cpp:8258
+
std::vector< std::string > listGlobalData() const
List the labels for all global data in the Context.
+
void writeXML_byobject(const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const
Write Context geometry and data to XML file for a subset of compound object IDs in the context.
+
float getBoxObjectVolume(uint ObjID) const
get the volume of a Box object from the context
Definition Context.cpp:8234
+
void copyObjectData(uint source_objID, uint destination_objID)
copy all object data from one compound object to another
+
void setTime(int minute, int hour)
Set simulation time.
Definition Context.cpp:1136
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
void duplicateGlobalData(const char *old_label, const char *new_label)
Make a copy of global data.
+
float getSphereObjectVolume(uint ObjID) const
get the volume of a Sphere object from the context
Definition Context.cpp:8152
+
void setObjectTransformationMatrix(uint ObjID, float(&T)[16])
Method to set the Affine transformation matrix of an Object.
Definition Context.cpp:7940
+
void cropDomain(std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
Crop specified UUIDs such that they lie within some specified axis-aligned box.
Definition Context.cpp:2213
void operator=(const Context &)=delete
Deleted assignment operator to prevent copying of Context.
-
void setTubeNodes(uint ObjID, const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition: Context.cpp:8215
-
helios::Location getLocation() const
Get the location of the simulation (latitude, longitude, and UTC offset)
Definition: Context.cpp:1174
-
static int selfTest()
Run a self-test of the Context. The Context self-test runs through validation checks of Context-relat...
Definition: selfTest.cpp:20
-
float getConeObjectNodeRadius(uint ObjID, int number) const
get a node radius of a Cone object from the context
Definition: Context.cpp:8266
-
void cleanDeletedObjectIDs(std::vector< uint > &objIDs) const
Delete Object IDs from vector if objects no longer exist (1D vector)
Definition: Context.cpp:2544
-
float getConeObjectVolume(uint ObjID) const
get the volume of a Cone object from the context
Definition: Context.cpp:8278
-
helios::vec3 getBoxObjectCenter(uint ObjID) const
get the center of a Box object from the context
Definition: Context.cpp:8222
-
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
-
void setPrimitiveTransformationMatrix(uint UUID, float(&T)[16])
Method to set the Affine transformation matrix of a Primitive.
Definition: Context.cpp:7112
-
float sumPrimitiveSurfaceArea(const std::vector< uint > &UUIDs) const
Sum the one-sided surface area of a group of primitives.
-
void getObjectTransformationMatrix(uint ObjID, float(&T)[16]) const
Method to return the Affine transformation matrix of an Object.
Definition: Context.cpp:7936
-
void setTubeRadii(uint ObjID, const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition: Context.cpp:8201
-
bool objectHasTexture(uint ObjID) const
Method to check whether an Object has texture data.
Definition: Context.cpp:7950
-
void scaleObject(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2877
-
Disk compound object class.
Definition: Context.h:795
-
vec2 getSize() const
Get the lateral dimensions of the disk object.
Definition: Context.cpp:4029
-
int2 getSubdivisionCount() const
Get the number of sub-triangle divisions of the disk object.
Definition: Context.cpp:4061
+
void setTubeNodes(uint ObjID, const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition Context.cpp:8215
+
helios::Location getLocation() const
Get the location of the simulation (latitude, longitude, and UTC offset)
Definition Context.cpp:1174
+
static int selfTest()
Run a self-test of the Context. The Context self-test runs through validation checks of Context-relat...
Definition selfTest.cpp:20
+
float getConeObjectNodeRadius(uint ObjID, int number) const
get a node radius of a Cone object from the context
Definition Context.cpp:8266
+
void cleanDeletedObjectIDs(std::vector< uint > &objIDs) const
Delete Object IDs from vector if objects no longer exist (1D vector)
Definition Context.cpp:2544
+
float getConeObjectVolume(uint ObjID) const
get the volume of a Cone object from the context
Definition Context.cpp:8278
+
helios::vec3 getBoxObjectCenter(uint ObjID) const
get the center of a Box object from the context
Definition Context.cpp:8222
+
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
+
void setPrimitiveTransformationMatrix(uint UUID, float(&T)[16])
Method to set the Affine transformation matrix of a Primitive.
Definition Context.cpp:7112
+
float sumPrimitiveSurfaceArea(const std::vector< uint > &UUIDs) const
Sum the one-sided surface area of a group of primitives.
+
void getObjectTransformationMatrix(uint ObjID, float(&T)[16]) const
Method to return the Affine transformation matrix of an Object.
Definition Context.cpp:7936
+
void setTubeRadii(uint ObjID, const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition Context.cpp:8201
+
bool objectHasTexture(uint ObjID) const
Method to check whether an Object has texture data.
Definition Context.cpp:7950
+
void scaleObject(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2877
+
Disk compound object class.
Definition Context.h:795
+
vec2 getSize() const
Get the lateral dimensions of the disk object.
Definition Context.cpp:4029
+
int2 getSubdivisionCount() const
Get the number of sub-triangle divisions of the disk object.
Definition Context.cpp:4061
~Disk() override=default
Disk destructor.
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the disk object.
Definition: Context.cpp:4045
-
void setSubdivisionCount(int2 subdiv)
Set the number of disk sub-triangle divisions.
Definition: Context.cpp:4065
-
Polymesh compound object class.
Definition: Context.h:828
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the disk object.
Definition Context.cpp:4045
+
Disk(uint a_OID, const std::vector< uint > &a_UUIDs, int2 a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:4009
+
void setSubdivisionCount(int2 subdiv)
Set the number of disk sub-triangle divisions.
Definition Context.cpp:4065
+
Polymesh compound object class.
Definition Context.h:828
~Polymesh() override=default
Polymesh destructor.
-
float getVolume() const
Get the volume of the polymesh object.
Definition: Context.cpp:4088
-
Sphere compound object class.
Definition: Context.h:624
-
uint getSubdivisionCount() const
Get the number of sub-patch divisions of the sphere object.
Definition: Context.cpp:3455
-
helios::vec3 getRadius() const
Get the radius of the sphere.
Definition: Context.cpp:3417
-
float getVolume() const
Get the volume of the sphere object.
Definition: Context.cpp:3463
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the sphere object.
Definition: Context.cpp:3439
-
void setSubdivisionCount(uint subdiv)
Set the number of sphere tesselation divisions.
Definition: Context.cpp:3459
+
Polymesh(uint a_OID, const std::vector< uint > &a_UUIDs, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:4069
+
float getVolume() const
Get the volume of the polymesh object.
Definition Context.cpp:4088
+
Sphere compound object class.
Definition Context.h:624
+
uint getSubdivisionCount() const
Get the number of sub-patch divisions of the sphere object.
Definition Context.cpp:3455
+
helios::vec3 getRadius() const
Get the radius of the sphere.
Definition Context.cpp:3417
+
float getVolume() const
Get the volume of the sphere object.
Definition Context.cpp:3463
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the sphere object.
Definition Context.cpp:3439
+
Sphere(uint a_OID, const std::vector< uint > &a_UUIDs, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:3397
+
void setSubdivisionCount(uint subdiv)
Set the number of sphere tesselation divisions.
Definition Context.cpp:3459
~Sphere() override=default
Sphere destructor.
-
Texture map data structure.
Definition: Context.h:67
-
std::string getTextureFile() const
Get the name/path of the texture map file.
Definition: Context.cpp:129
-
bool hasTransparencyChannel() const
Check whether the texture has a transparency channel.
Definition: Context.cpp:137
-
helios::int2 getImageResolution() const
Get the size of the texture in pixels (horizontal x vertical)
Definition: Context.cpp:133
-
float getSolidFraction() const
Get the solid fraction of the texture transparency channel (if it exists)
Definition: Context.cpp:145
-
const std::vector< std::vector< bool > > * getTransparencyData() const
Get the data in the texture transparency channel (if it exists)
Definition: Context.cpp:141
-
Tile compound object class.
Definition: Context.h:581
+
Texture map data structure.
Definition Context.h:67
+
std::string getTextureFile() const
Get the name/path of the texture map file.
Definition Context.cpp:129
+
bool hasTransparencyChannel() const
Check whether the texture has a transparency channel.
Definition Context.cpp:137
+
helios::int2 getImageResolution() const
Get the size of the texture in pixels (horizontal x vertical)
Definition Context.cpp:133
+
float getSolidFraction() const
Get the solid fraction of the texture transparency channel (if it exists)
Definition Context.cpp:145
+
const std::vector< std::vector< bool > > * getTransparencyData() const
Get the data in the texture transparency channel (if it exists)
Definition Context.cpp:141
+
Tile compound object class.
Definition Context.h:581
~Tile() override=default
Tile destructor.
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the tile object.
Definition: Context.cpp:3326
-
helios::int2 getSubdivisionCount() const
Get the number of sub-patch divisions of the tile.
Definition: Context.cpp:3343
-
void setSubdivisionCount(const helios::int2 &subdiv)
Set the number of tile sub-patch divisions.
Definition: Context.cpp:3347
-
std::vector< helios::vec2 > getTextureUV() const
Get the normalized (u,v) coordinates of the texture at each of the four corners of the tile object.
Definition: Context.cpp:3391
-
helios::vec2 getSize() const
Get the dimensions of the entire tile object.
Definition: Context.cpp:3319
-
std::vector< helios::vec3 > getVertices() const
Get the Cartesian coordinates of each of the four corners of the tile object.
Definition: Context.cpp:3352
-
vec3 getNormal() const
Get a unit vector normal to the tile object surface.
Definition: Context.cpp:3385
-
Tube compound object class.
Definition: Context.h:660
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the tile object.
Definition Context.cpp:3326
+
helios::int2 getSubdivisionCount() const
Get the number of sub-patch divisions of the tile.
Definition Context.cpp:3343
+
void setSubdivisionCount(const helios::int2 &subdiv)
Set the number of tile sub-patch divisions.
Definition Context.cpp:3347
+
std::vector< helios::vec2 > getTextureUV() const
Get the normalized (u,v) coordinates of the texture at each of the four corners of the tile object.
Definition Context.cpp:3391
+
helios::vec2 getSize() const
Get the dimensions of the entire tile object.
Definition Context.cpp:3319
+
std::vector< helios::vec3 > getVertices() const
Get the Cartesian coordinates of each of the four corners of the tile object.
Definition Context.cpp:3352
+
vec3 getNormal() const
Get a unit vector normal to the tile object surface.
Definition Context.cpp:3385
+
Tile(uint a_OID, const std::vector< uint > &a_UUIDs, const int2 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:3299
+
Tube compound object class.
Definition Context.h:660
+
Tube(uint a_OID, const std::vector< uint > &a_UUIDs, const std::vector< vec3 > &a_nodes, const std::vector< float > &a_radius, const std::vector< helios::RGBcolor > &a_colors, const std::vector< std::vector< helios::vec3 > > &a_triangle_vertices, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
Default constructor.
Definition Context.cpp:3468
~Tube() override=default
Tube destructor.
-
float getSegmentVolume(uint segment_index) const
Get the volume of a segment within the tube object.
Definition: Context.cpp:3561
-
std::vector< float > getNodeRadii() const
Get the radius at each of the tube object nodes.
Definition: Context.cpp:3508
-
void scaleTubeGirth(float S)
Scale the girth of the tube object.
Definition: Context.cpp:3826
-
void setTubeRadii(const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition: Context.cpp:3846
-
std::vector< std::vector< helios::vec3 > > getTriangleVertices() const
Get positions of triangle vertices comprising the tube object.
Definition: Context.cpp:3529
-
float getVolume() const
Get the volume of the tube object.
Definition: Context.cpp:3547
-
void appendTubeSegment(const helios::vec3 &node_position, float node_radius, const helios::RGBcolor &node_color)
Append an additional segment to the existing tube object.
Definition: Context.cpp:3575
-
std::vector< helios::RGBcolor > getNodeColors() const
Get the colors at each of the tube object nodes.
Definition: Context.cpp:3525
-
std::vector< helios::vec3 > getNodes() const
Get the Cartesian coordinates of each of the tube object nodes.
Definition: Context.cpp:3493
-
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the tube object.
Definition: Context.cpp:3533
-
void scaleTubeLength(float S)
Scale the length of the tube object.
Definition: Context.cpp:3869
-
float getLength() const
Get the length of the tube object.
Definition: Context.cpp:3537
-
void setTubeNodes(const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition: Context.cpp:3895
-
Class for parsing XML input files.
Definition: Context.h:1698
-
static int parse_data_vec3(const pugi::xml_node &node_data, std::vector< vec3 > &data)
Parse vector data of type 'vec3' within an XML tag.
-
static int parse_data_int2(const pugi::xml_node &node_data, std::vector< int2 > &data)
Parse vector data of type 'int2' within an XML tag.
-
static int parse_radius(const pugi::xml_node &node_data, std::vector< float > &radius)
Parse the value within a <radius> (radius at nodes of a tube or cone) tag.
-
static int parse_data_float(const pugi::xml_node &node_data, std::vector< float > &data)
Parse vector data of type 'float' within an XML tag.
-
static int parse_transform(const pugi::xml_node &node_data, float(&transform)[16])
Parse the value within a <transform> (transformation matrix) tag.
-
static int parse_data_uint(const pugi::xml_node &node_data, std::vector< uint > &data)
Parse vector data of type 'uint' within an XML tag.
-
static int parse_subdivisions(const pugi::xml_node &node_data, uint &subdivisions)
Parse the value within a <subdivisions> (object sub-primitive resolution) tag.
-
static int parse_data_vec4(const pugi::xml_node &node_data, std::vector< vec4 > &data)
Parse vector data of type 'vac4' within an XML tag.
-
static int parse_data_int3(const pugi::xml_node &node_data, std::vector< int3 > &data)
Parse vector data of type 'int3' within an XML tag.
-
static int parse_data_string(const pugi::xml_node &node_data, std::vector< std::string > &data)
Parse vector data of type 'string' within an XML tag.
-
static int parse_data_int(const pugi::xml_node &node_data, std::vector< int > &data)
Parse vector data of type 'int' within an XML tag.
-
static int parse_texture(const pugi::xml_node &node_data, std::string &texture)
Parse the value within an <texture> (path to image texture) tag.
-
static int parse_data_vec2(const pugi::xml_node &node_data, std::vector< vec2 > &data)
Parse vector data of type 'vec2' within an XML tag.
-
static int parse_data_double(const pugi::xml_node &node_data, std::vector< double > &data)
Parse vector data of type 'double' within an XML tag.
-
static int parse_solid_fraction(const pugi::xml_node &node_data, float &solid_fraction)
Parse the value within a <solid_fraction> (primitive solid fraction) tag.
-
static int parse_objID(const pugi::xml_node &node_data, uint &objID)
Parse the value within an <objID> (object ID) tag.
-
static int parse_textureUV(const pugi::xml_node &node_data, std::vector< vec2 > &uvs)
Parse the value within a <textureUV> (texture coordinates) tag.
-
static int parse_nodes(const pugi::xml_node &node_data, std::vector< vec3 > &nodes)
Parse the value within a <nodes> (coordinates defining nodes of a tube or cone) tag.
-
static int parse_data_int4(const pugi::xml_node &node_data, std::vector< int4 > &data)
Parse vector data of type 'int4' within an XML tag.
-
static int parse_vertices(const pugi::xml_node &node_data, std::vector< float > &vertices)
Parse the value within a <vertices> (primitive vertex coordinates) tag.
+
float getSegmentVolume(uint segment_index) const
Get the volume of a segment within the tube object.
Definition Context.cpp:3561
+
std::vector< float > getNodeRadii() const
Get the radius at each of the tube object nodes.
Definition Context.cpp:3508
+
void scaleTubeGirth(float S)
Scale the girth of the tube object.
Definition Context.cpp:3826
+
void setTubeRadii(const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition Context.cpp:3846
+
std::vector< std::vector< helios::vec3 > > getTriangleVertices() const
Get positions of triangle vertices comprising the tube object.
Definition Context.cpp:3529
+
float getVolume() const
Get the volume of the tube object.
Definition Context.cpp:3547
+
void appendTubeSegment(const helios::vec3 &node_position, float node_radius, const helios::RGBcolor &node_color)
Append an additional segment to the existing tube object.
Definition Context.cpp:3575
+
std::vector< helios::RGBcolor > getNodeColors() const
Get the colors at each of the tube object nodes.
Definition Context.cpp:3525
+
std::vector< helios::vec3 > getNodes() const
Get the Cartesian coordinates of each of the tube object nodes.
Definition Context.cpp:3493
+
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the tube object.
Definition Context.cpp:3533
+
void scaleTubeLength(float S)
Scale the length of the tube object.
Definition Context.cpp:3869
+
float getLength() const
Get the length of the tube object.
Definition Context.cpp:3537
+
void setTubeNodes(const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition Context.cpp:3895
+
Class for parsing XML input files.
Definition Context.h:1698
+
static int parse_data_vec3(const pugi::xml_node &node_data, std::vector< vec3 > &data)
Parse vector data of type 'vec3' within an XML tag.
+
static int parse_data_int2(const pugi::xml_node &node_data, std::vector< int2 > &data)
Parse vector data of type 'int2' within an XML tag.
+
static int parse_radius(const pugi::xml_node &node_data, std::vector< float > &radius)
Parse the value within a <radius> (radius at nodes of a tube or cone) tag.
+
static int parse_data_float(const pugi::xml_node &node_data, std::vector< float > &data)
Parse vector data of type 'float' within an XML tag.
+
static int parse_transform(const pugi::xml_node &node_data, float(&transform)[16])
Parse the value within a <transform> (transformation matrix) tag.
+
static int parse_data_uint(const pugi::xml_node &node_data, std::vector< uint > &data)
Parse vector data of type 'uint' within an XML tag.
+
static int parse_subdivisions(const pugi::xml_node &node_data, uint &subdivisions)
Parse the value within a <subdivisions> (object sub-primitive resolution) tag.
+
static int parse_data_vec4(const pugi::xml_node &node_data, std::vector< vec4 > &data)
Parse vector data of type 'vac4' within an XML tag.
+
static int parse_data_int3(const pugi::xml_node &node_data, std::vector< int3 > &data)
Parse vector data of type 'int3' within an XML tag.
+
static int parse_data_string(const pugi::xml_node &node_data, std::vector< std::string > &data)
Parse vector data of type 'string' within an XML tag.
+
static int parse_data_int(const pugi::xml_node &node_data, std::vector< int > &data)
Parse vector data of type 'int' within an XML tag.
+
static int parse_texture(const pugi::xml_node &node_data, std::string &texture)
Parse the value within an <texture> (path to image texture) tag.
+
static int parse_data_vec2(const pugi::xml_node &node_data, std::vector< vec2 > &data)
Parse vector data of type 'vec2' within an XML tag.
+
static int parse_data_double(const pugi::xml_node &node_data, std::vector< double > &data)
Parse vector data of type 'double' within an XML tag.
+
static int parse_solid_fraction(const pugi::xml_node &node_data, float &solid_fraction)
Parse the value within a <solid_fraction> (primitive solid fraction) tag.
+
static int parse_objID(const pugi::xml_node &node_data, uint &objID)
Parse the value within an <objID> (object ID) tag.
+
static int parse_textureUV(const pugi::xml_node &node_data, std::vector< vec2 > &uvs)
Parse the value within a <textureUV> (texture coordinates) tag.
+
static int parse_nodes(const pugi::xml_node &node_data, std::vector< vec3 > &nodes)
Parse the value within a <nodes> (coordinates defining nodes of a tube or cone) tag.
+
static int parse_data_int4(const pugi::xml_node &node_data, std::vector< int4 > &data)
Parse vector data of type 'int4' within an XML tag.
+
static int parse_vertices(const pugi::xml_node &node_data, std::vector< float > &vertices)
Parse the value within a <vertices> (primitive vertex coordinates) tag.
-
uint addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition: Context.cpp:5256
-
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:4728
-
uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone compound object to the Context.
Definition: Context.cpp:5426
-
std::vector< uint > addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition: Context.cpp:6356
-
std::vector< uint > addBox(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition: Context.cpp:6147
-
uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition: Context.cpp:5000
-
uint addPolymeshObject(const std::vector< uint > &UUIDs)
Add new Polymesh Compound Object.
Definition: Context.cpp:5399
-
std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition: Context.cpp:5646
-
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:5930
-
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:5809
-
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:4550
-
std::vector< uint > addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone to the Context.
Definition: Context.cpp:6459
-
uint addSphereObject(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition: Context.cpp:4310
-
float min(const std::vector< float > &vect)
Minimum value of a vector of floats.
Definition: global.cpp:1100
-
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition: global.cpp:1146
-
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition: global.cpp:1069
-
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition: global.cpp:1084
-
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition: Context.cpp:1328
-
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition: Context.cpp:1759
-
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition: Context.cpp:1372
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
void setCurrentTimeseriesPoint(const char *label, uint index)
Set the Context date and time by providing the index of a timeseries data point.
Definition: Context.cpp:1886
-
Time queryTimeseriesTime(const char *label, uint index) const
Get the time associated with a timeseries data point.
Definition: Context.cpp:1958
-
uint getTimeseriesLength(const char *label) const
Get the length of timeseries data.
Definition: Context.cpp:2014
-
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition: Context.cpp:1894
-
bool doesTimeseriesVariableExist(const char *label) const
Query whether a timeseries variable exists.
Definition: Context.cpp:2026
-
void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
Add a data point to timeseries of data.
Definition: Context.cpp:1823
-
Date queryTimeseriesDate(const char *label, uint index) const
Get the date associated with a timeseries data point.
Definition: Context.cpp:1994
- -
Structure for Global Data Entities.
Definition: Context.h:102
-
Location vector.
-
R-G-B-A color vector.
-
R-G-B color vector.
-
Vector of spherical coordinates (elevation,azimuth)
- -
Vector of two elements of type 'int'.
-
Vector of three elements of type 'int'.
-
Vector of four elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
-
Vector of four elements of type 'float'.
+
uint addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition Context.cpp:5256
+
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:4728
+
uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone compound object to the Context.
Definition Context.cpp:5426
+
std::vector< uint > addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition Context.cpp:6356
+
std::vector< uint > addBox(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition Context.cpp:6147
+
uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition Context.cpp:5000
+
uint addPolymeshObject(const std::vector< uint > &UUIDs)
Add new Polymesh Compound Object.
Definition Context.cpp:5399
+
std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition Context.cpp:5646
+
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:5930
+
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:5809
+
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:4550
+
std::vector< uint > addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone to the Context.
Definition Context.cpp:6459
+
uint addSphereObject(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition Context.cpp:4310
+
float min(const std::vector< float > &vect)
Minimum value of a vector of floats.
Definition global.cpp:1100
+
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition global.cpp:1146
+
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition global.cpp:1069
+
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition global.cpp:1084
+
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition Context.cpp:1328
+
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition Context.cpp:1759
+
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition Context.cpp:1372
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
void setCurrentTimeseriesPoint(const char *label, uint index)
Set the Context date and time by providing the index of a timeseries data point.
Definition Context.cpp:1886
+
Time queryTimeseriesTime(const char *label, uint index) const
Get the time associated with a timeseries data point.
Definition Context.cpp:1958
+
uint getTimeseriesLength(const char *label) const
Get the length of timeseries data.
Definition Context.cpp:2014
+
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition Context.cpp:1894
+
bool doesTimeseriesVariableExist(const char *label) const
Query whether a timeseries variable exists.
Definition Context.cpp:2026
+
void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
Add a data point to timeseries of data.
Definition Context.cpp:1823
+
Date queryTimeseriesDate(const char *label, uint index) const
Get the date associated with a timeseries data point.
Definition Context.cpp:1994
+ +
Structure for Global Data Entities.
Definition Context.h:102
+ +
R-G-B-A color vector.
+
R-G-B color vector.
+
Vector of spherical coordinates (elevation,azimuth)
+ +
Vector of two elements of type 'int'.
+
Vector of three elements of type 'int'.
+
Vector of four elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+
Vector of four elements of type 'float'.
+ diff --git a/doc/html/_context__data_8cpp.html b/doc/html/_context__data_8cpp.html index d15696c4e..0bbcd8204 100644 --- a/doc/html/_context__data_8cpp.html +++ b/doc/html/_context__data_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Context_data.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_context__data_8cpp_source.html b/doc/html/_context__data_8cpp_source.html index 03843afe3..8f498bf47 100644 --- a/doc/html/_context__data_8cpp_source.html +++ b/doc/html/_context__data_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Context_data.cpp
@@ -732,156 +744,203 @@
652
653}
654
+
655void Context::setPrimitiveData( const uint& UUID, const char* label, const int& data ){
656 if( primitives.find(UUID) == primitives.end() ){
657 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
658 }
659 primitives.at(UUID)->setPrimitiveData(label,data);
660}
+
661
+
662void Context::setPrimitiveData( const uint& UUID, const char* label, const uint& data ){
663 if( primitives.find(UUID) == primitives.end() ){
664 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
665 }
666 primitives.at(UUID)->setPrimitiveData(label,data);
667}
+
668
+
669void Context::setPrimitiveData( const uint& UUID, const char* label, const float& data ){
670 if( primitives.find(UUID) == primitives.end() ){
671 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
672 }
673 primitives.at(UUID)->setPrimitiveData(label,data);
674}
+
675
+
676void Context::setPrimitiveData( const uint& UUID, const char* label, const double& data ){
677 if( primitives.find(UUID) == primitives.end() ){
678 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
679 }
680 primitives.at(UUID)->setPrimitiveData(label,data);
681}
+
682
+
683void Context::setPrimitiveData( const uint& UUID, const char* label, const helios::vec2& data ){
684 if( primitives.find(UUID) == primitives.end() ){
685 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
686 }
687 primitives.at(UUID)->setPrimitiveData(label,data);
688}
+
689
+
690void Context::setPrimitiveData( const uint& UUID, const char* label, const helios::vec3& data ){
691 if( primitives.find(UUID) == primitives.end() ){
692 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
693 }
694 primitives.at(UUID)->setPrimitiveData(label,data);
695}
+
696
+
697void Context::setPrimitiveData( const uint& UUID, const char* label, const helios::vec4& data ){
698 if( primitives.find(UUID) == primitives.end() ){
699 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
700 }
701 primitives.at(UUID)->setPrimitiveData(label,data);
702}
+
703
+
704void Context::setPrimitiveData( const uint& UUID, const char* label, const helios::int2& data ){
705 if( primitives.find(UUID) == primitives.end() ){
706 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
707 }
708 primitives.at(UUID)->setPrimitiveData(label,data);
709}
+
710
+
711void Context::setPrimitiveData( const uint& UUID, const char* label, const helios::int3& data ){
712 if( primitives.find(UUID) == primitives.end() ){
713 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
714 }
715 primitives.at(UUID)->setPrimitiveData(label,data);
716}
+
717
+
718void Context::setPrimitiveData( const uint& UUID, const char* label, const helios::int4& data ){
719 if( primitives.find(UUID) == primitives.end() ){
720 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
721 }
722 primitives.at(UUID)->setPrimitiveData(label,data);
723}
+
724
+
725void Context::setPrimitiveData( const uint& UUID, const char* label, const std::string& data ){
726 if( primitives.find(UUID) == primitives.end() ){
727 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
728 }
729 primitives.at(UUID)->setPrimitiveData(label,data);
730}
+
731
+
732void Context::setPrimitiveData( const uint& UUID, const char* label, HeliosDataType type, uint size, void* data ){
733 if( primitives.find(UUID) == primitives.end() ){
734 helios_runtime_error( "ERROR (Context::setPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
735 }
736 primitives.at(UUID)->setPrimitiveData(label,type,size,data);
737}
+
738
+
739void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const int& data ){
740 for( uint UUID : UUIDs){
741 setPrimitiveData( UUID, label, data );
742 }
743}
+
744
+
745void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const uint& data ){
746 for( uint UUID : UUIDs){
747 setPrimitiveData( UUID, label, data );
748 }
749}
+
750
+
751void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const float& data ){
752 for( uint UUID : UUIDs){
753 setPrimitiveData( UUID, label, data );
754 }
755}
+
756
+
757void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const double& data ){
758 for( uint UUID : UUIDs){
759 setPrimitiveData( UUID, label, data );
760 }
761}
+
762
+
763void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const helios::vec2& data ){
764 for( uint UUID : UUIDs){
765 setPrimitiveData( UUID, label, data );
766 }
767}
+
768
+
769void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const helios::vec3& data ){
770 for( uint UUID : UUIDs){
771 setPrimitiveData( UUID, label, data );
772 }
773}
+
774
+
775void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const helios::vec4& data ){
776 for( uint UUID : UUIDs){
777 setPrimitiveData( UUID, label, data );
778 }
779}
+
780
+
781void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const helios::int2& data ){
782 for( uint UUID : UUIDs){
783 setPrimitiveData( UUID, label, data );
784 }
785}
+
786
+
787void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const helios::int3& data ){
788 for( uint UUID : UUIDs){
789 setPrimitiveData( UUID, label, data );
790 }
791}
+
792
+
793void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const helios::int4& data ){
794 for( uint UUID : UUIDs){
795 setPrimitiveData( UUID, label, data );
796 }
797}
+
798
+
799void Context::setPrimitiveData( const std::vector<uint>& UUIDs, const char* label, const std::string& data ){
800 for( uint UUID : UUIDs){
801 setPrimitiveData( UUID, label, data );
802 }
803}
+
804
+
805void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const int& data ){
806 for(const auto & j : UUIDs){
807 for( const auto& UUID : j ){
@@ -889,7 +948,9 @@
809 }
810 }
811}
+
812
+
813void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const uint& data ){
814 for(const auto & j : UUIDs){
815 for( const auto& UUID : j ){
@@ -897,7 +958,9 @@
817 }
818 }
819}
+
820
+
821void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const float& data ){
822 for(const auto & j : UUIDs){
823 for( const auto& UUID : j ){
@@ -905,7 +968,9 @@
825 }
826 }
827}
+
828
+
829void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const double& data ){
830 for(const auto & j : UUIDs){
831 for( const auto& UUID : j ){
@@ -913,7 +978,9 @@
833 }
834 }
835}
+
836
+
837void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const helios::vec2& data ){
838 for(const auto & j : UUIDs){
839 for( const auto& UUID : j ){
@@ -921,7 +988,9 @@
841 }
842 }
843}
+
844
+
845void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const helios::vec3& data ){
846 for(const auto & j : UUIDs){
847 for( const auto& UUID : j ){
@@ -929,7 +998,9 @@
849 }
850 }
851}
+
852
+
853void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const helios::vec4& data ){
854 for(const auto & j : UUIDs){
855 for( const auto& UUID : j ){
@@ -937,7 +1008,9 @@
857 }
858 }
859}
+
860
+
861void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const helios::int2& data ){
862 for(const auto & j : UUIDs){
863 for( const auto& UUID : j ){
@@ -945,7 +1018,9 @@
865 }
866 }
867}
+
868
+
869void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const helios::int3& data ){
870 for(const auto & j : UUIDs){
871 for( const auto& UUID : j ){
@@ -953,7 +1028,9 @@
873 }
874 }
875}
+
876
+
877void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const helios::int4& data ){
878 for(const auto & j : UUIDs){
879 for( const auto& UUID : j ){
@@ -961,7 +1038,9 @@
881 }
882 }
883}
+
884
+
885void Context::setPrimitiveData( const std::vector<std::vector<uint> >& UUIDs, const char* label, const std::string& data ){
886 for(const auto & j : UUIDs){
887 for( const auto& UUID : j ){
@@ -969,7 +1048,9 @@
889 }
890 }
891}
+
892
+
893void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const int& data ){
894 for(const auto & j : UUIDs){
895 for( const auto& UUID : j ){
@@ -977,7 +1058,9 @@
897 }
898 }
899}
+
900
+
901void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const uint& data ){
902 for(const auto & j : UUIDs){
903 for( const auto& i : j ) {
@@ -987,7 +1070,9 @@
907 }
908 }
909}
+
910
+
911void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const float& data ){
912 for(const auto & j : UUIDs){
913 for( const auto& i : j ) {
@@ -997,7 +1082,9 @@
917 }
918 }
919}
+
920
+
921void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const double& data ){
922 for(const auto & j : UUIDs){
923 for( const auto& i : j ) {
@@ -1007,7 +1094,9 @@
927 }
928 }
929}
+
930
+
931void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const helios::vec2& data ){
932 for(const auto & j : UUIDs){
933 for( const auto& i : j ) {
@@ -1017,7 +1106,9 @@
937 }
938 }
939}
+
940
+
941void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const helios::vec3& data ){
942 for(const auto & j : UUIDs){
943 for( const auto& i : j ) {
@@ -1027,7 +1118,9 @@
947 }
948 }
949}
+
950
+
951void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const helios::vec4& data ){
952 for(const auto & j : UUIDs){
953 for( const auto& i : j ) {
@@ -1037,7 +1130,9 @@
957 }
958 }
959}
+
960
+
961void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const helios::int2& data ){
962 for(const auto & j : UUIDs){
963 for( const auto& i : j ) {
@@ -1047,7 +1142,9 @@
967 }
968 }
969}
+
970
+
971void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const helios::int3& data ){
972 for(const auto & j : UUIDs){
973 for( const auto& i : j ) {
@@ -1057,7 +1154,9 @@
977 }
978 }
979}
+
980
+
981void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const helios::int4& data ){
982 for(const auto & j : UUIDs){
983 for( const auto& i : j ) {
@@ -1067,7 +1166,9 @@
987 }
988 }
989}
+
990
+
991void Context::setPrimitiveData( const std::vector<std::vector<std::vector<uint> > >& UUIDs, const char* label, const std::string& data ){
992 for(const auto & j : UUIDs){
993 for( const auto& i : j ) {
@@ -1077,189 +1178,243 @@
997 }
998 }
999}
+
1000
+
1001void Context::getPrimitiveData(uint UUID, const char* label, int& data ) const{
1002 if( primitives.find(UUID) == primitives.end() ){
1003 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1004 }
1005 primitives.at(UUID)->getPrimitiveData(label,data);
1006}
+
1007
+
1008void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<int>& data ) const{
1009 if( primitives.find(UUID) == primitives.end() ){
1010 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1011 }
1012 primitives.at(UUID)->getPrimitiveData(label,data);
1013}
+
1014
+
1015void Context::getPrimitiveData( const uint UUID, const char* label, uint& data ) const{
1016 if( primitives.find(UUID) == primitives.end() ){
1017 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1018 }
1019 primitives.at(UUID)->getPrimitiveData(label,data);
1020}
+
1021
+
1022void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<uint>& data ) const{
1023 if( primitives.find(UUID) == primitives.end() ){
1024 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1025 }
1026 primitives.at(UUID)->getPrimitiveData(label,data);
1027}
+
1028
+
1029void Context::getPrimitiveData( const uint UUID, const char* label, float& data ) const{
1030 if( primitives.find(UUID) == primitives.end() ){
1031 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1032 }
1033 primitives.at(UUID)->getPrimitiveData(label,data);
1034}
+
1035
+
1036void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<float>& data ) const{
1037 if( primitives.find(UUID) == primitives.end() ){
1038 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1039 }
1040 primitives.at(UUID)->getPrimitiveData(label,data);
1041}
+
1042
+
1043void Context::getPrimitiveData( const uint UUID, const char* label, double& data ) const{
1044 if( primitives.find(UUID) == primitives.end() ){
1045 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1046 }
1047 primitives.at(UUID)->getPrimitiveData(label,data);
1048}
+
1049
+
1050void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<double>& data ) const{
1051 if( primitives.find(UUID) == primitives.end() ){
1052 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1053 }
1054 primitives.at(UUID)->getPrimitiveData(label,data);
1055}
+
1056
+
1057void Context::getPrimitiveData( const uint UUID, const char* label, vec2& data ) const{
1058 if( primitives.find(UUID) == primitives.end() ){
1059 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1060 }
1061 primitives.at(UUID)->getPrimitiveData(label,data);
1062}
+
1063
+
1064void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<vec2>& data ) const{
1065 if( primitives.find(UUID) == primitives.end() ){
1066 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1067 }
1068 primitives.at(UUID)->getPrimitiveData(label,data);
1069}
+
1070
+
1071void Context::getPrimitiveData( const uint UUID, const char* label, vec3& data ) const{
1072 if( primitives.find(UUID) == primitives.end() ){
1073 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1074 }
1075 primitives.at(UUID)->getPrimitiveData(label,data);
1076}
+
1077
+
1078void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<vec3>& data ) const{
1079 if( primitives.find(UUID) == primitives.end() ){
1080 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1081 }
1082 primitives.at(UUID)->getPrimitiveData(label,data);
1083}
+
1084
+
1085void Context::getPrimitiveData( const uint UUID, const char* label, vec4& data ) const{
1086 if( primitives.find(UUID) == primitives.end() ){
1087 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1088 }
1089 primitives.at(UUID)->getPrimitiveData(label,data);
1090}
+
1091
+
1092void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<vec4>& data ) const{
1093 if( primitives.find(UUID) == primitives.end() ){
1094 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1095 }
1096 primitives.at(UUID)->getPrimitiveData(label,data);
1097}
+
1098
+
1099void Context::getPrimitiveData( const uint UUID, const char* label, int2& data ) const{
1100 if( primitives.find(UUID) == primitives.end() ){
1101 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1102 }
1103 primitives.at(UUID)->getPrimitiveData(label,data);
1104}
+
1105
+
1106void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<int2>& data ) const{
1107 if( primitives.find(UUID) == primitives.end() ){
1108 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1109 }
1110 primitives.at(UUID)->getPrimitiveData(label,data);
1111}
+
1112
+
1113void Context::getPrimitiveData( const uint UUID, const char* label, int3& data ) const{
1114 if( primitives.find(UUID) == primitives.end() ){
1115 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1116 }
1117 primitives.at(UUID)->getPrimitiveData(label,data);
1118}
+
1119
+
1120void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<int3>& data ) const{
1121 if( primitives.find(UUID) == primitives.end() ){
1122 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1123 }
1124 primitives.at(UUID)->getPrimitiveData(label,data);
1125}
+
1126
+
1127void Context::getPrimitiveData( const uint UUID, const char* label, int4& data ) const{
1128 if( primitives.find(UUID) == primitives.end() ){
1129 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1130 }
1131 primitives.at(UUID)->getPrimitiveData(label,data);
1132}
+
1133
+
1134void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<int4>& data ) const{
1135 if( primitives.find(UUID) == primitives.end() ){
1136 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1137 }
1138 primitives.at(UUID)->getPrimitiveData(label,data);
1139}
+
1140
+
1141void Context::getPrimitiveData( const uint UUID, const char* label, std::string& data ) const{
1142 if( primitives.find(UUID) == primitives.end() ){
1143 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1144 }
1145 primitives.at(UUID)->getPrimitiveData(label,data);
1146}
+
1147
+
1148void Context::getPrimitiveData( const uint UUID, const char* label, std::vector<std::string>& data ) const{
1149 if( primitives.find(UUID) == primitives.end() ){
1150 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1151 }
1152 primitives.at(UUID)->getPrimitiveData(label,data);
1153}
+
1154
+
1155HeliosDataType Context::getPrimitiveDataType( const uint UUID, const char* label )const{
1156 if( primitives.find(UUID) == primitives.end() ){
1157 helios_runtime_error("ERROR (Context::getPrimitiveDataType): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1158 }
1159 return primitives.at(UUID)->getPrimitiveDataType(label);
1160}
+
1161
+
1162uint Context::getPrimitiveDataSize( const uint UUID, const char* label )const{
1163 if( primitives.find(UUID) == primitives.end() ){
1164 helios_runtime_error("ERROR (Context::getPrimitiveDataSize): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1165 }
1166 return primitives.at(UUID)->getPrimitiveDataSize(label);
1167}
+
1168
+
1169bool Context::doesPrimitiveDataExist( const uint UUID, const char* label ) const{
1170 if( primitives.find(UUID) == primitives.end() ){
1171 helios_runtime_error("ERROR (Context::doesPrimitiveDataExist): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1172 }
1173 return primitives.at(UUID)->doesPrimitiveDataExist(label);
1174}
+
1175
+
1176void Context::clearPrimitiveData( const uint UUID, const char* label ){
1177 if( primitives.find(UUID) == primitives.end() ){
1178 helios_runtime_error("ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) + " does not exist in the Context.");
1179 }
1180 primitives.at(UUID)->clearPrimitiveData(label);
1181}
+
1182
+
1183void Context::clearPrimitiveData( const std::vector<uint>& UUIDs, const char* label ){
1184 for( unsigned int UUID : UUIDs){
1185 if( primitives.find(UUID) == primitives.end() ){
@@ -1268,7 +1423,9 @@
1188 primitives.at(UUID)->clearPrimitiveData(label);
1189 }
1190}
+
1191
+
1192void Context::copyPrimitiveData(uint sourceUUID, uint destinationUUID){
1193
1194 if(primitives.find(sourceUUID) == primitives.end() ) {
@@ -1292,7 +1449,9 @@
1212 primitives.at(destinationUUID)->primitive_data_string = primitives.at(sourceUUID)->primitive_data_string;
1213
1214}
+
1215
+
1216void Context::renamePrimitiveData( uint UUID, const char* old_label, const char* new_label ){
1217
1218 if( primitives.find(UUID) == primitives.end() ){
@@ -1305,7 +1464,9 @@
1225 clearPrimitiveData( UUID, old_label );
1226
1227}
+
1228
+
1229void Context::duplicatePrimitiveData( uint UUID, const char* old_label, const char* new_label ){
1230
1231 if( primitives.find(UUID) == primitives.end() ){
@@ -1344,11 +1505,15 @@
1264 }
1265
1266}
+
1267
+
1268std::vector<std::string> Context::listPrimitiveData(uint UUID) const{
1269 return getPrimitivePointer_private(UUID)->listPrimitiveData();
1270}
+
1271
+
1272void Context::duplicatePrimitiveData( const char* existing_data_label, const char* copy_data_label ){
1273
1274 for( auto &primitive : primitives){
@@ -1380,7 +1545,9 @@
1300 }
1301
1302}
+
1303
+
1304void Context::calculatePrimitiveDataMean( const std::vector<uint> &UUIDs, const std::string &label, float &mean ) const{
1305 float value;
1306 float sum = 0.f;
@@ -1403,7 +1570,9 @@
1323 }
1324
1325}
+
1326
+
1327void Context::calculatePrimitiveDataMean( const std::vector<uint> &UUIDs, const std::string &label, double &mean ) const{
1328 double value;
1329 double sum = 0.f;
@@ -1426,7 +1595,9 @@
1346 }
1347
1348}
+
1349
+
1350void Context::calculatePrimitiveDataMean( const std::vector<uint> &UUIDs, const std::string &label, helios::vec2 &mean ) const{
1351 vec2 value;
1352 vec2 sum(0.f,0.f);
@@ -1447,7 +1618,9 @@
1367 mean = sum / float(count);
1368 }
1369}
+
1370
+
1371void Context::calculatePrimitiveDataMean( const std::vector<uint> &UUIDs, const std::string &label, helios::vec3 &mean ) const{
1372 vec3 value;
1373 vec3 sum(0.f,0.f,0.f);
@@ -1468,7 +1641,9 @@
1388 mean = sum / float(count);
1389 }
1390}
+
1391
+
1392void Context::calculatePrimitiveDataMean( const std::vector<uint> &UUIDs, const std::string &label, helios::vec4 &mean ) const{
1393 vec4 value;
1394 vec4 sum(0.f,0.f,0.f,0.f);
@@ -1489,7 +1664,9 @@
1409 mean = sum / float(count);
1410 }
1411}
+
1412
+
1413void Context::calculatePrimitiveDataAreaWeightedMean( const std::vector<uint> &UUIDs, const std::string &label, float &awt_mean ) const{
1414 float value, A;
1415 float sum = 0.f;
@@ -1518,7 +1695,9 @@
1438 awt_mean = sum/area;
1439 }
1440}
+
1441
+
1442void Context::calculatePrimitiveDataAreaWeightedMean( const std::vector<uint> &UUIDs, const std::string &label, double &awt_mean ) const{
1443 double value;
1444 float A;
@@ -1548,7 +1727,9 @@
1468 awt_mean = sum/area;
1469 }
1470}
+
1471
+
1472void Context::calculatePrimitiveDataAreaWeightedMean( const std::vector<uint> &UUIDs, const std::string &label, helios::vec2 &awt_mean ) const{
1473 vec2 value;
1474 float A;
@@ -1578,7 +1759,9 @@
1498 awt_mean = sum/area;
1499 }
1500}
+
1501
+
1502void Context::calculatePrimitiveDataAreaWeightedMean( const std::vector<uint> &UUIDs, const std::string &label, helios::vec3 &awt_mean ) const{
1503 vec3 value;
1504 float A;
@@ -1608,7 +1791,9 @@
1528 awt_mean = sum/area;
1529 }
1530}
+
1531
+
1532void Context::calculatePrimitiveDataAreaWeightedMean( const std::vector<uint> &UUIDs, const std::string &label, helios::vec4 &awt_mean ) const{
1533 vec4 value;
1534 float A;
@@ -1638,7 +1823,9 @@
1558 awt_mean = sum/area;
1559 }
1560}
+
1561
+
1562void Context::calculatePrimitiveDataSum( const std::vector<uint> &UUIDs, const std::string &label, float &sum ) const{
1563
1564 float value;
@@ -1659,7 +1846,9 @@
1579 }
1580
1581}
+
1582
+
1583void Context::calculatePrimitiveDataSum( const std::vector<uint> &UUIDs, const std::string &label, double &sum ) const{
1584
1585 double value;
@@ -1680,7 +1869,9 @@
1600 }
1601
1602}
+
1603
+
1604void Context::calculatePrimitiveDataSum( const std::vector<uint> &UUIDs, const std::string &label, helios::vec2 &sum ) const{
1605
1606 vec2 value;
@@ -1701,7 +1892,9 @@
1621 }
1622
1623}
+
1624
+
1625void Context::calculatePrimitiveDataSum( const std::vector<uint> &UUIDs, const std::string &label, helios::vec3 &sum ) const{
1626
1627 vec3 value;
@@ -1722,7 +1915,9 @@
1642 }
1643
1644}
+
1645
+
1646void Context::calculatePrimitiveDataSum( const std::vector<uint> &UUIDs, const std::string &label, helios::vec4 &sum ) const{
1647
1648 vec4 value;
@@ -1743,7 +1938,9 @@
1663 }
1664
1665}
+
1666
+
1667void Context::calculatePrimitiveDataAreaWeightedSum( const std::vector<uint> &UUIDs, const std::string &label, float &awt_sum ) const{
1668
1669 float value;
@@ -1772,7 +1969,9 @@
1692 }
1693
1694}
+
1695
+
1696void Context::calculatePrimitiveDataAreaWeightedSum( const std::vector<uint> &UUIDs, const std::string &label, double &awt_sum ) const{
1697
1698 double value;
@@ -1801,7 +2000,9 @@
1721 }
1722
1723}
+
1724
+
1725void Context::calculatePrimitiveDataAreaWeightedSum( const std::vector<uint> &UUIDs, const std::string &label, helios::vec2 &awt_sum ) const{
1726
1727 vec2 value;
@@ -1830,7 +2031,9 @@
1750 }
1751
1752}
+
1753
+
1754void Context::calculatePrimitiveDataAreaWeightedSum( const std::vector<uint> &UUIDs, const std::string &label, helios::vec3 &awt_sum ) const{
1755
1756 vec3 value;
@@ -1859,7 +2062,9 @@
1779 }
1780
1781}
+
1782
+
1783void Context::calculatePrimitiveDataAreaWeightedSum( const std::vector<uint> &UUIDs, const std::string &label, helios::vec4 &awt_sum ) const{
1784
1785 vec4 value;
@@ -1888,7 +2093,9 @@
1808 }
1809
1810}
+
1811
+
1812void Context::scalePrimitiveData( const std::vector<uint> &UUIDs, const std::string &label, float scaling_factor ){
1813
1814 uint primitives_not_exist = 0;
@@ -1942,11 +2149,15 @@
1862 }
1863
1864}
+
1865
+
1866void Context::scalePrimitiveData( const std::string &label, float scaling_factor ) {
1867 scalePrimitiveData( getAllUUIDs(), label, scaling_factor );
1868}
+
1869
+
1870void Context::incrementPrimitiveData( const std::vector<uint> &UUIDs, const char* label, int increment ){
1871
1872 for( uint UUID : UUIDs ) {
@@ -1968,7 +2179,9 @@
1888 }
1889
1890}
+
1891
+
1892void Context::incrementPrimitiveData( const std::vector<uint> &UUIDs, const char* label, uint increment ){
1893
1894 for( uint UUID : UUIDs ) {
@@ -1990,7 +2203,9 @@
1910 }
1911
1912}
+
1913
+
1914void Context::incrementPrimitiveData( const std::vector<uint> &UUIDs, const char* label, float increment ){
1915
1916 for( uint UUID : UUIDs ) {
@@ -2012,7 +2227,9 @@
1932 }
1933
1934}
+
1935
+
1936void Context::incrementPrimitiveData( const std::vector<uint> &UUIDs, const char* label, double increment ){
1937
1938 for( uint UUID : UUIDs ) {
@@ -2034,7 +2251,9 @@
1954 }
1955
1956}
+
1957
+
1958void Context::aggregatePrimitiveDataSum( const std::vector<uint> &UUIDs, const std::vector<std::string> &primitive_data_labels, const std::string &result_primitive_data_label ){
1959
1960 uint primitives_not_exist = 0;
@@ -2166,7 +2385,9 @@
2086 }
2087
2088}
+
2089
+
2090void Context::aggregatePrimitiveDataProduct( const std::vector<uint> &UUIDs, const std::vector<std::string> &primitive_data_labels, const std::string &result_primitive_data_label ){
2091
2092 uint primitives_not_exist = 0;
@@ -2342,8 +2563,10 @@
2262 }
2263
2264}
+
2265
2266
+
2267float Context::sumPrimitiveSurfaceArea( const std::vector<uint> &UUIDs ) const{
2268
2269 bool primitive_warning = false;
@@ -2375,7 +2598,9 @@
2295 return area;
2296
2297}
+
2298
+
2299std::vector<uint> Context::filterPrimitivesByData( const std::vector<uint> &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator ){
2300
2301 if( comparator!="==" && comparator!=">" && comparator!="<" && comparator!=">=" && comparator!="<=" ){
@@ -2411,7 +2636,9 @@
2331 return UUIDs_out;
2332
2333}
+
2334
+
2335std::vector<uint> Context::filterPrimitivesByData( const std::vector<uint> &UUIDs, const std::string &primitive_data_label, double filter_value, const std::string &comparator ){
2336
2337 if( comparator!="==" && comparator!=">" && comparator!="<" && comparator!=">=" && comparator!="<=" ){
@@ -2447,7 +2674,9 @@
2367 return UUIDs_out;
2368
2369}
+
2370
+
2371std::vector<uint> Context::filterPrimitivesByData( const std::vector<uint> &UUIDs, const std::string &primitive_data_label, int filter_value, const std::string &comparator ){
2372
2373 if( comparator!="==" && comparator!=">" && comparator!="<" && comparator!=">=" && comparator!="<=" ){
@@ -2483,7 +2712,9 @@
2403 return UUIDs_out;
2404
2405}
+
2406
+
2407std::vector<uint> Context::filterPrimitivesByData( const std::vector<uint> &UUIDs, const std::string &primitive_data_label, uint filter_value, const std::string &comparator ){
2408
2409 if( comparator!="==" && comparator!=">" && comparator!="<" && comparator!=">=" && comparator!="<=" ){
@@ -2519,7 +2750,9 @@
2439 return UUIDs_out;
2440
2441}
+
2442
+
2443std::vector<uint> Context::filterPrimitivesByData( const std::vector<uint> &UUIDs, const std::string &primitive_data_label, const std::string &filter_value ){
2444
2445 std::vector<uint> UUIDs_out = UUIDs;
@@ -2541,159 +2774,207 @@
2461 return UUIDs_out;
2462
2463}
+
2464
2465//------ Object Data ------- //
2466
+
2467void Context::setObjectData( const uint objID, const char* label, const int& data ){
2468 if( objects.find(objID) == objects.end() ){
2469 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2470 }
2471 objects.at(objID)->setObjectData(label,data);
2472}
+
2473
+
2474void Context::setObjectData( const uint objID, const char* label, const uint& data ){
2475 if( objects.find(objID) == objects.end() ){
2476 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2477 }
2478 objects.at(objID)->setObjectData(label,data);
2479}
+
2480
+
2481void Context::setObjectData( const uint objID, const char* label, const float& data ){
2482 if( objects.find(objID) == objects.end() ){
2483 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2484 }
2485 objects.at(objID)->setObjectData(label,data);
2486}
+
2487
+
2488void Context::setObjectData( const uint objID, const char* label, const double& data ){
2489 if( objects.find(objID) == objects.end() ){
2490 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2491 }
2492 objects.at(objID)->setObjectData(label,data);
2493}
+
2494
+
2495void Context::setObjectData( const uint objID, const char* label, const helios::vec2& data ){
2496 if( objects.find(objID) == objects.end() ){
2497 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2498 }
2499 objects.at(objID)->setObjectData(label,data);
2500}
+
2501
+
2502void Context::setObjectData( const uint objID, const char* label, const helios::vec3& data ){
2503 if( objects.find(objID) == objects.end() ){
2504 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2505 }
2506 objects.at(objID)->setObjectData(label,data);
2507}
+
2508
+
2509void Context::setObjectData( const uint objID, const char* label, const helios::vec4& data ){
2510 if( objects.find(objID) == objects.end() ){
2511 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2512 }
2513 objects.at(objID)->setObjectData(label,data);
2514}
+
2515
+
2516void Context::setObjectData( const uint objID, const char* label, const helios::int2& data ){
2517 if( objects.find(objID) == objects.end() ){
2518 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2519 }
2520 objects.at(objID)->setObjectData(label,data);
2521}
+
2522
+
2523void Context::setObjectData( const uint objID, const char* label, const helios::int3& data ){
2524 if( objects.find(objID) == objects.end() ){
2525 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2526 }
2527 objects.at(objID)->setObjectData(label,data);
2528}
+
2529
+
2530void Context::setObjectData( const uint objID, const char* label, const helios::int4& data ){
2531 if( objects.find(objID) == objects.end() ){
2532 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2533 }
2534 objects.at(objID)->setObjectData(label,data);
2535}
+
2536
+
2537void Context::setObjectData( const uint objID, const char* label, const std::string& data ){
2538 if( objects.find(objID) == objects.end() ){
2539 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2540 }
2541 objects.at(objID)->setObjectData(label,data);
2542}
+
2543
+
2544void Context::setObjectData( const uint objID, const char* label, HeliosDataType type, uint size, void* data ){
2545 if( objects.find(objID) == objects.end() ){
2546 helios_runtime_error("ERROR (Context::setObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2547 }
2548 objects.at(objID)->setObjectData(label,type,size,data);
2549}
+
2550
+
2551void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const int& data ){
2552 for( uint objID : objIDs){
2553 setObjectData( objID, label, data );
2554 }
2555}
+
2556
+
2557void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const uint& data ){
2558 for( uint objID : objIDs){
2559 setObjectData( objID, label, data );
2560 }
2561}
+
2562
+
2563void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const float& data ){
2564 for( uint objID : objIDs){
2565 setObjectData( objID, label, data );
2566 }
2567}
+
2568
+
2569void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const double& data ){
2570 for( uint objID : objIDs){
2571 setObjectData( objID, label, data );
2572 }
2573}
+
2574
+
2575void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const helios::vec2& data ){
2576 for( uint objID : objIDs){
2577 setObjectData( objID, label, data );
2578 }
2579}
+
2580
+
2581void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const helios::vec3& data ){
2582 for(unsigned int objID : objIDs){
2583 setObjectData( objID, label, data );
2584 }
2585}
+
2586
+
2587void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const helios::vec4& data ){
2588 for( uint objID : objIDs){
2589 setObjectData( objID, label, data );
2590 }
2591}
+
2592
+
2593void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const helios::int2& data ){
2594 for( uint objID : objIDs){
2595 setObjectData( objID, label, data );
2596 }
2597}
+
2598
+
2599void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const helios::int3& data ){
2600 for( uint objID : objIDs){
2601 setObjectData( objID, label, data );
2602 }
2603}
+
2604
+
2605void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const helios::int4& data ){
2606 for( uint objID : objIDs){
2607 setObjectData( objID, label, data );
2608 }
2609}
+
2610
+
2611void Context::setObjectData( const std::vector<uint>& objIDs, const char* label, const std::string& data ){
2612 for( uint objID : objIDs){
2613 setObjectData( objID, label, data );
2614 }
2615}
+
2616
+
2617void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const int& data ){
2618 for( const auto & j : objIDs){
2619 for( const auto & objID : j ){
@@ -2701,7 +2982,9 @@
2621 }
2622 }
2623}
+
2624
+
2625void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const uint& data ){
2626 for( const auto & j : objIDs){
2627 for( const auto & objID : j ){
@@ -2709,7 +2992,9 @@
2629 }
2630 }
2631}
+
2632
+
2633void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const float& data ){
2634 for( const auto & j : objIDs){
2635 for( const auto & objID : j ){
@@ -2717,7 +3002,9 @@
2637 }
2638 }
2639}
+
2640
+
2641void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const double& data ){
2642 for( const auto & j : objIDs){
2643 for( const auto & objID : j ){
@@ -2725,7 +3012,9 @@
2645 }
2646 }
2647}
+
2648
+
2649void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const helios::vec2& data ){
2650 for( const auto & j : objIDs){
2651 for( const auto & objID : j ){
@@ -2733,7 +3022,9 @@
2653 }
2654 }
2655}
+
2656
+
2657void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const helios::vec3& data ){
2658 for( const auto & j : objIDs){
2659 for( const auto & objID : j ){
@@ -2741,7 +3032,9 @@
2661 }
2662 }
2663}
+
2664
+
2665void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const helios::vec4& data ){
2666 for( const auto & j : objIDs){
2667 for( const auto & objID : j ){
@@ -2749,7 +3042,9 @@
2669 }
2670 }
2671}
+
2672
+
2673void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const helios::int2& data ){
2674 for( const auto & j : objIDs){
2675 for( const auto & objID : j ){
@@ -2757,7 +3052,9 @@
2677 }
2678 }
2679}
+
2680
+
2681void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const helios::int3& data ){
2682 for( const auto & j : objIDs){
2683 for( const auto & objID : j ){
@@ -2765,7 +3062,9 @@
2685 }
2686 }
2687}
+
2688
+
2689void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const helios::int4& data ){
2690 for( const auto & j : objIDs){
2691 for( const auto & objID : j ){
@@ -2773,7 +3072,9 @@
2693 }
2694 }
2695}
+
2696
+
2697void Context::setObjectData( const std::vector<std::vector<uint> >& objIDs, const char* label, const std::string& data ){
2698 for( const auto & j : objIDs){
2699 for( const auto & objID : j ){
@@ -2781,7 +3082,9 @@
2701 }
2702 }
2703}
+
2704
+
2705void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const int& data ){
2706 for( const auto & j : objIDs){
2707 for( const auto & i : j ){
@@ -2791,7 +3094,9 @@
2711 }
2712 }
2713}
+
2714
+
2715void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const uint& data ){
2716 for( const auto & j : objIDs){
2717 for( const auto & i : j ){
@@ -2801,7 +3106,9 @@
2721 }
2722 }
2723}
+
2724
+
2725void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const float& data ){
2726 for( const auto & j : objIDs){
2727 for( const auto & i : j ){
@@ -2811,7 +3118,9 @@
2731 }
2732 }
2733}
+
2734
+
2735void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const double& data ){
2736 for( const auto & j : objIDs){
2737 for( const auto & i : j ){
@@ -2821,7 +3130,9 @@
2741 }
2742 }
2743}
+
2744
+
2745void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const helios::vec2& data ){
2746 for( const auto & j : objIDs){
2747 for( const auto & i : j ){
@@ -2831,7 +3142,9 @@
2751 }
2752 }
2753}
+
2754
+
2755void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const helios::vec3& data ){
2756 for( const auto & j : objIDs){
2757 for( const auto & i : j ){
@@ -2841,7 +3154,9 @@
2761 }
2762 }
2763}
+
2764
+
2765void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const helios::vec4& data ){
2766 for( const auto & j : objIDs){
2767 for( const auto & i : j ){
@@ -2851,7 +3166,9 @@
2771 }
2772 }
2773}
+
2774
+
2775void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const helios::int2& data ){
2776 for( const auto & j : objIDs){
2777 for( const auto & i : j ){
@@ -2861,7 +3178,9 @@
2781 }
2782 }
2783}
+
2784
+
2785void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const helios::int3& data ){
2786 for( const auto & j : objIDs){
2787 for( const auto & i : j ){
@@ -2871,7 +3190,9 @@
2791 }
2792 }
2793}
+
2794
+
2795void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const helios::int4& data ){
2796 for( const auto & j : objIDs){
2797 for( const auto & i : j ){
@@ -2881,7 +3202,9 @@
2801 }
2802 }
2803}
+
2804
+
2805void Context::setObjectData( const std::vector<std::vector<std::vector<uint> > >& objIDs, const char* label, const std::string& data ){
2806 for( const auto & j : objIDs){
2807 for( const auto & i : j ){
@@ -2891,182 +3214,234 @@
2811 }
2812 }
2813}
+
2814
+
2815void Context::getObjectData( const uint objID, const char* label, int& data ) const{
2816 if( objects.find(objID) == objects.end() ){
2817 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2818 }
2819 objects.at(objID)->getObjectData(label,data);
2820}
+
2821
+
2822void Context::getObjectData( const uint objID, const char* label, std::vector<int>& data ) const{
2823 if( objects.find(objID) == objects.end() ){
2824 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2825 }
2826 objects.at(objID)->getObjectData(label,data);
2827}
+
2828
+
2829void Context::getObjectData( const uint objID, const char* label, uint& data ) const{
2830 if( objects.find(objID) == objects.end() ){
2831 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2832 }
2833 objects.at(objID)->getObjectData(label,data);
2834}
+
2835
+
2836void Context::getObjectData( const uint objID, const char* label, std::vector<uint>& data ) const{
2837 if( objects.find(objID) == objects.end() ){
2838 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2839 }
2840 objects.at(objID)->getObjectData(label,data);
2841}
+
2842
+
2843void Context::getObjectData( const uint objID, const char* label, float& data ) const{
2844 if( objects.find(objID) == objects.end() ){
2845 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2846 }
2847 objects.at(objID)->getObjectData(label,data);
2848}
+
2849
+
2850void Context::getObjectData( const uint objID, const char* label, std::vector<float>& data ) const{
2851 if( objects.find(objID) == objects.end() ){
2852 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2853 }
2854 objects.at(objID)->getObjectData(label,data);
2855}
+
2856
+
2857void Context::getObjectData( const uint objID, const char* label, double& data ) const{
2858 if( objects.find(objID) == objects.end() ){
2859 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2860 }
2861 objects.at(objID)->getObjectData(label,data);
2862}
+
2863
+
2864void Context::getObjectData( const uint objID, const char* label, std::vector<double>& data ) const{
2865 if( objects.find(objID) == objects.end() ){
2866 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2867 }
2868 objects.at(objID)->getObjectData(label,data);
2869}
+
2870
+
2871void Context::getObjectData( const uint objID, const char* label, vec2& data ) const{
2872 if( objects.find(objID) == objects.end() ){
2873 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2874 }
2875 objects.at(objID)->getObjectData(label,data);
2876}
+
2877
+
2878void Context::getObjectData( const uint objID, const char* label, std::vector<vec2>& data ) const{
2879 if( objects.find(objID) == objects.end() ){
2880 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2881 }
2882 objects.at(objID)->getObjectData(label,data);
2883}
+
2884
+
2885void Context::getObjectData( const uint objID, const char* label, vec3& data ) const{
2886 if( objects.find(objID) == objects.end() ){
2887 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2888 }
2889 objects.at(objID)->getObjectData(label,data);
2890}
+
2891
+
2892void Context::getObjectData( const uint objID, const char* label, std::vector<vec3>& data ) const{
2893 if( objects.find(objID) == objects.end() ){
2894 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2895 }
2896 objects.at(objID)->getObjectData(label,data);
2897}
+
2898
+
2899void Context::getObjectData( const uint objID, const char* label, vec4& data ) const{
2900 if( objects.find(objID) == objects.end() ){
2901 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2902 }
2903 objects.at(objID)->getObjectData(label,data);
2904}
+
2905
+
2906void Context::getObjectData( const uint objID, const char* label, std::vector<vec4>& data ) const{
2907 if( objects.find(objID) == objects.end() ){
2908 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2909 }
2910 objects.at(objID)->getObjectData(label,data);
2911}
+
2912
+
2913void Context::getObjectData( const uint objID, const char* label, int2& data ) const{
2914 if( objects.find(objID) == objects.end() ){
2915 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2916 }
2917 objects.at(objID)->getObjectData(label,data);
2918}
+
2919
+
2920void Context::getObjectData( const uint objID, const char* label, std::vector<int2>& data ) const{
2921 if( objects.find(objID) == objects.end() ){
2922 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2923 }
2924 objects.at(objID)->getObjectData(label,data);
2925}
+
2926
+
2927void Context::getObjectData( const uint objID, const char* label, int3& data ) const{
2928 if( objects.find(objID) == objects.end() ){
2929 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2930 }
2931 objects.at(objID)->getObjectData(label,data);
2932}
+
2933
+
2934void Context::getObjectData( const uint objID, const char* label, std::vector<int3>& data ) const{
2935 if( objects.find(objID) == objects.end() ){
2936 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2937 }
2938 objects.at(objID)->getObjectData(label,data);
2939}
+
2940
+
2941void Context::getObjectData( const uint objID, const char* label, int4& data ) const{
2942 if( objects.find(objID) == objects.end() ){
2943 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2944 }
2945 objects.at(objID)->getObjectData(label,data);
2946}
+
2947
+
2948void Context::getObjectData( const uint objID, const char* label, std::vector<int4>& data ) const{
2949 if( objects.find(objID) == objects.end() ){
2950 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2951 }
2952 objects.at(objID)->getObjectData(label,data);
2953}
+
2954
+
2955void Context::getObjectData( const uint objID, const char* label, std::string& data ) const{
2956 if( objects.find(objID) == objects.end() ){
2957 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2958 }
2959 objects.at(objID)->getObjectData(label,data);
2960}
+
2961
+
2962void Context::getObjectData( const uint objID, const char* label, std::vector<std::string>& data ) const{
2963 if( objects.find(objID) == objects.end() ){
2964 helios_runtime_error("ERROR (Context::getObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
2965 }
2966 objects.at(objID)->getObjectData(label,data);
2967}
+
2968
+
2969HeliosDataType Context::getObjectDataType( const uint objID, const char* label )const{
2970 if( objects.find(objID) == objects.end() ){
2971 helios_runtime_error("ERROR (Context::getObjectDataType): objID of " + std::to_string(objID) + " does not exist in the Context.");
2972 }
2973 return objects.at(objID)->getObjectDataType(label);
2974}
+
2975
+
2976uint Context::getObjectDataSize( const uint objID, const char* label )const{
2977 if( objects.find(objID) == objects.end() ){
2978 helios_runtime_error("ERROR (Context::getObjectDataSize): objID of " + std::to_string(objID) + " does not exist in the Context.");
2979 }
2980 return objects.at(objID)->getObjectDataSize(label);
2981}
+
2982
+
2983bool Context::doesObjectDataExist( const uint objID, const char* label ) const{
2984 if( objects.find(objID) == objects.end() ){
2985 helios_runtime_error("ERROR (Context::doesObjectDataExist): objID of " + std::to_string(objID) + " does not exist in the Context.");
2986 }
2987 return objects.at(objID)->doesObjectDataExist(label);
2988}
+
2989
+
2990void Context::copyObjectData(uint source_objID, uint destination_objID){
2991
2992 if( objects.find(source_objID) == objects.end() ) {
@@ -3090,7 +3465,9 @@
3010 objects.at(destination_objID)->object_data_string = objects.at(source_objID)->object_data_string;
3011
3012}
+
3013
+
3014void Context::duplicateObjectData( uint objID, const char* old_label, const char* new_label ){
3015
3016 if( objects.find(objID) == objects.end() ){
@@ -3129,8 +3506,10 @@
3049 }
3050
3051}
+
3052
3053
+
3054void Context::renameObjectData( uint objID, const char* old_label, const char* new_label ){
3055
3056 if( objects.find(objID) == objects.end() ){
@@ -3143,14 +3522,18 @@
3063 clearObjectData( objID, old_label );
3064
3065}
+
3066
+
3067void Context::clearObjectData( const uint objID, const char* label ){
3068 if( objects.find(objID) == objects.end() ){
3069 helios_runtime_error("ERROR (Context::clearObjectData): objID of " + std::to_string(objID) + " does not exist in the Context.");
3070 }
3071 objects.at(objID)->clearObjectData(label);
3072}
+
3073
+
3074void Context::clearObjectData( const std::vector<uint>& objIDs, const char* label ){
3075 for( uint objID : objIDs ){
3076 if( objects.find(objID) == objects.end() ){
@@ -3159,66 +3542,92 @@
3079 objects.at(objID)->clearObjectData(label);
3080 }
3081}
+
3082
+
3083std::vector<std::string> Context::listObjectData(uint ObjID) const{
3084 return getObjectPointer_private(ObjID)->listObjectData();
3085}
+
3086
+
3087void CompoundObject::setObjectData( const char* label, const int& data ){
3088 object_data_int[label] = {data};
3089 object_data_types[label] = HELIOS_TYPE_INT;
3090}
+
3091
+
3092void CompoundObject::setObjectData( const char* label, const uint& data ){
3093 object_data_uint[label] = {data};
3094 object_data_types[label] = HELIOS_TYPE_UINT;
3095}
+
3096
+
3097void CompoundObject::setObjectData( const char* label, const float& data ){
3098 object_data_float[label] = {data};
3099 object_data_types[label] = HELIOS_TYPE_FLOAT;
3100}
+
3101
+
3102void CompoundObject::setObjectData( const char* label, const double& data ){
3103 object_data_double[label] = {data};
3104 object_data_types[label] = HELIOS_TYPE_DOUBLE;
3105}
+
3106
+
3107void CompoundObject::setObjectData( const char* label, const helios::vec2& data ){
3108 object_data_vec2[label] = {data};
3109 object_data_types[label] = HELIOS_TYPE_VEC2;
3110}
+
3111
+
3112void CompoundObject::setObjectData( const char* label, const helios::vec3& data ){
3113 object_data_vec3[label] = {data};
3114 object_data_types[label] = HELIOS_TYPE_VEC3;
3115}
+
3116
+
3117void CompoundObject::setObjectData( const char* label, const helios::vec4& data ){
3118 object_data_vec4[label] = {data};
3119 object_data_types[label] = HELIOS_TYPE_VEC4;
3120}
+
3121
+
3122void CompoundObject::setObjectData( const char* label, const helios::int2& data ){
3123 object_data_int2[label] = {data};
3124 object_data_types[label] = HELIOS_TYPE_INT2;
3125}
+
3126
+
3127void CompoundObject::setObjectData( const char* label, const helios::int3& data ){
3128 object_data_int3[label] = {data};
3129 object_data_types[label] = HELIOS_TYPE_INT3;
3130}
+
3131
+
3132void CompoundObject::setObjectData( const char* label, const helios::int4& data ){
3133 object_data_int4[label] = {data};
3134 object_data_types[label] = HELIOS_TYPE_INT4;
3135}
+
3136
+
3137void CompoundObject::setObjectData( const char* label, const std::string& data ){
3138 object_data_string[label] = {data};
3139 object_data_types[label] = HELIOS_TYPE_STRING;
3140}
+
3141
+
3142void CompoundObject::setObjectData( const char* label, HeliosDataType a_type, uint size, void* data ){
3143
3144 object_data_types[label] = a_type;
@@ -3325,7 +3734,9 @@
3245 }
3246
3247}
+
3248
+
3249void CompoundObject::getObjectData( const char* label, int& data ) const{
3250
3251 if( !doesObjectDataExist( label ) ){
@@ -3339,7 +3750,9 @@
3259 }
3260
3261}
+
3262
+
3263void CompoundObject::getObjectData( const char* label, std::vector<int>& data ) const{
3264
3265 if( !doesObjectDataExist( label ) ){
@@ -3353,7 +3766,9 @@
3273 }
3274
3275}
+
3276
+
3277void CompoundObject::getObjectData( const char* label, uint& data ) const{
3278
3279 if( !doesObjectDataExist( label ) ){
@@ -3367,7 +3782,9 @@
3287 }
3288
3289}
+
3290
+
3291void CompoundObject::getObjectData( const char* label, std::vector<uint>& data ) const{
3292
3293 if( !doesObjectDataExist( label ) ){
@@ -3381,7 +3798,9 @@
3301 }
3302
3303}
+
3304
+
3305void CompoundObject::getObjectData( const char* label, float& data ) const{
3306
3307 if( !doesObjectDataExist( label ) ){
@@ -3395,7 +3814,9 @@
3315 }
3316
3317}
+
3318
+
3319void CompoundObject::getObjectData( const char* label, std::vector<float>& data ) const{
3320
3321 if( !doesObjectDataExist( label ) ){
@@ -3409,7 +3830,9 @@
3329 }
3330
3331}
+
3332
+
3333void CompoundObject::getObjectData( const char* label, double& data ) const{
3334
3335 if( !doesObjectDataExist( label ) ){
@@ -3423,7 +3846,9 @@
3343 }
3344
3345}
+
3346
+
3347void CompoundObject::getObjectData( const char* label, std::vector<double>& data ) const{
3348
3349 if( !doesObjectDataExist( label ) ){
@@ -3437,7 +3862,9 @@
3357 }
3358
3359}
+
3360
+
3361void CompoundObject::getObjectData( const char* label, vec2& data ) const{
3362
3363 if( !doesObjectDataExist( label ) ){
@@ -3451,7 +3878,9 @@
3371 }
3372
3373}
+
3374
+
3375void CompoundObject::getObjectData( const char* label, std::vector<vec2>& data ) const{
3376
3377 if( !doesObjectDataExist( label ) ){
@@ -3465,7 +3894,9 @@
3385 }
3386
3387}
+
3388
+
3389void CompoundObject::getObjectData( const char* label, vec3& data ) const{
3390
3391 if( !doesObjectDataExist( label ) ){
@@ -3479,7 +3910,9 @@
3399 }
3400
3401}
+
3402
+
3403void CompoundObject::getObjectData( const char* label, std::vector<vec3>& data ) const{
3404
3405 if( !doesObjectDataExist( label ) ){
@@ -3493,7 +3926,9 @@
3413 }
3414
3415}
+
3416
+
3417void CompoundObject::getObjectData( const char* label, vec4& data ) const{
3418
3419 if( !doesObjectDataExist( label ) ){
@@ -3507,7 +3942,9 @@
3427 }
3428
3429}
+
3430
+
3431void CompoundObject::getObjectData( const char* label, std::vector<vec4>& data ) const{
3432
3433 if( !doesObjectDataExist( label ) ){
@@ -3521,7 +3958,9 @@
3441 }
3442
3443}
+
3444
+
3445void CompoundObject::getObjectData( const char* label, int2& data ) const{
3446
3447 if( !doesObjectDataExist( label ) ){
@@ -3535,7 +3974,9 @@
3455 }
3456
3457}
+
3458
+
3459void CompoundObject::getObjectData( const char* label, std::vector<int2>& data ) const{
3460
3461 if( !doesObjectDataExist( label ) ){
@@ -3549,7 +3990,9 @@
3469 }
3470
3471}
+
3472
+
3473void CompoundObject::getObjectData( const char* label, int3& data ) const{
3474
3475 if( !doesObjectDataExist( label ) ){
@@ -3563,7 +4006,9 @@
3483 }
3484
3485}
+
3486
+
3487void CompoundObject::getObjectData( const char* label, std::vector<int3>& data ) const{
3488
3489 if( !doesObjectDataExist( label ) ){
@@ -3577,7 +4022,9 @@
3497 }
3498
3499}
+
3500
+
3501void CompoundObject::getObjectData( const char* label, int4& data ) const{
3502
3503 if( !doesObjectDataExist( label ) ){
@@ -3591,7 +4038,9 @@
3511 }
3512
3513}
+
3514
+
3515void CompoundObject::getObjectData( const char* label, std::vector<int4>& data ) const{
3516
3517 if( !doesObjectDataExist( label ) ){
@@ -3605,7 +4054,9 @@
3525 }
3526
3527}
+
3528
+
3529void CompoundObject::getObjectData( const char* label, std::string& data ) const{
3530
3531 if( !doesObjectDataExist( label ) ){
@@ -3619,7 +4070,9 @@
3539 }
3540
3541}
+
3542
+
3543void CompoundObject::getObjectData( const char* label, std::vector<std::string>& data ) const{
3544
3545 if( !doesObjectDataExist( label ) ){
@@ -3633,7 +4086,9 @@
3553 }
3554
3555}
+
3556
+
3558
3559 if( !doesObjectDataExist( label ) ){
@@ -3643,7 +4098,9 @@
3563 return object_data_types.at(label);
3564
3565}
+
3566
+
3567uint CompoundObject::getObjectDataSize( const char* label ) const{
3568
3569 if( !doesObjectDataExist( label ) ){
@@ -3681,7 +4138,9 @@
3601 return 0;
3602
3603}
+
3604
+
3605void CompoundObject::clearObjectData( const char* label ){
3606
3607 if( !doesObjectDataExist( label ) ){
@@ -3728,7 +4187,9 @@
3648 }
3649
3650}
+
3651
+
3652bool CompoundObject::doesObjectDataExist( const char* label ) const{
3653
3654 if( object_data_types.find(label) == object_data_types.end() ){
@@ -3738,7 +4199,9 @@
3658 }
3659
3660}
+
3661
+
3662std::vector<std::string> CompoundObject::listObjectData() const{
3663
3664 std::vector<std::string> labels(object_data_types.size());
@@ -3752,7 +4215,9 @@
3672 return labels;
3673
3674}
+
3675
+
3676std::vector<uint> Context::filterObjectsByData( const std::vector<uint> &objIDs, const std::string &object_data_label, float filter_value, const std::string &comparator ){
3677
3678 if( comparator!="==" && comparator!=">" && comparator!="<" && comparator!=">=" && comparator!="<=" ){
@@ -3788,7 +4253,9 @@
3708 return objIDs_out;
3709
3710}
+
3711
+
3712std::vector<uint> Context::filterObjectsByData( const std::vector<uint> &objIDs, const std::string &object_data_label, double filter_value, const std::string &comparator ){
3713
3714 if( comparator!="==" && comparator!=">" && comparator!="<" && comparator!=">=" && comparator!="<=" ){
@@ -3824,7 +4291,9 @@
3744 return objIDs_out;
3745
3746}
+
3747
+
3748std::vector<uint> Context::filterObjectsByData( const std::vector<uint> &objIDs, const std::string &object_data_label, int filter_value, const std::string &comparator ){
3749
3750 if( comparator!="==" && comparator!=">" && comparator!="<" && comparator!=">=" && comparator!="<=" ){
@@ -3860,7 +4329,9 @@
3780 return objIDs_out;
3781
3782}
+
3783
+
3784std::vector<uint> Context::filterObjectsByData( const std::vector<uint> &objIDs, const std::string &object_data_label, uint filter_value, const std::string &comparator ){
3785
3786 if( comparator!="==" && comparator!=">" && comparator!="<" && comparator!=">=" && comparator!="<=" ){
@@ -3896,7 +4367,9 @@
3816 return objIDs_out;
3817
3818}
+
3819
+
3820std::vector<uint> Context::filterObjectsByData( const std::vector<uint> &objIDs, const std::string &object_data_label, const std::string &filter_value ){
3821
3822 std::vector<uint> objIDs_out = objIDs;
@@ -3918,86 +4391,110 @@
3838 return objIDs_out;
3839
3840}
+
3841
3842// -------- Global Data ---------- //
3843
+
3844void Context::setGlobalData( const char* label, const int& data ){
3845 std::vector<int> vec{data};
3846 globaldata[label].type = HELIOS_TYPE_INT;
3847 globaldata[label].size = 1;
3848 globaldata[label].global_data_int = vec;
3849}
+
3850
+
3851void Context::setGlobalData( const char* label, const uint& data ){
3852 std::vector<uint> vec{data};
3853 globaldata[label].type = HELIOS_TYPE_UINT;
3854 globaldata[label].size = 1;
3855 globaldata[label].global_data_uint = vec;
3856}
+
3857
+
3858void Context::setGlobalData( const char* label, const float& data ){
3859 std::vector<float> vec{data};
3860 globaldata[label].type = HELIOS_TYPE_FLOAT;
3861 globaldata[label].size = 1;
3862 globaldata[label].global_data_float = vec;
3863}
+
3864
+
3865void Context::setGlobalData( const char* label, const double& data ){
3866 std::vector<double> vec{data};
3867 globaldata[label].type = HELIOS_TYPE_DOUBLE;
3868 globaldata[label].size = 1;
3869 globaldata[label].global_data_double = vec;
3870}
+
3871
+
3872void Context::setGlobalData( const char* label, const helios::vec2& data ){
3873 std::vector<vec2> vec{data};
3874 globaldata[label].type = HELIOS_TYPE_VEC2;
3875 globaldata[label].size = 1;
3876 globaldata[label].global_data_vec2 = vec;
3877}
+
3878
+
3879void Context::setGlobalData( const char* label, const helios::vec3& data ){
3880 std::vector<vec3> vec{data};
3881 globaldata[label].type = HELIOS_TYPE_VEC3;
3882 globaldata[label].size = 1;
3883 globaldata[label].global_data_vec3 = vec;
3884}
+
3885
+
3886void Context::setGlobalData( const char* label, const helios::vec4& data ){
3887 std::vector<vec4> vec{data};
3888 globaldata[label].type = HELIOS_TYPE_VEC4;
3889 globaldata[label].size = 1;
3890 globaldata[label].global_data_vec4 = vec;
3891}
+
3892
+
3893void Context::setGlobalData( const char* label, const helios::int2& data ){
3894 std::vector<int2> vec{data};
3895 globaldata[label].type = HELIOS_TYPE_INT2;
3896 globaldata[label].size = 1;
3897 globaldata[label].global_data_int2 = vec;
3898}
+
3899
+
3900void Context::setGlobalData( const char* label, const helios::int3& data ){
3901 std::vector<int3> vec{data};
3902 globaldata[label].type = HELIOS_TYPE_INT3;
3903 globaldata[label].size = 1;
3904 globaldata[label].global_data_int3 = vec;
3905}
+
3906
+
3907void Context::setGlobalData( const char* label, const helios::int4& data ){
3908 std::vector<int4> vec{data};
3909 globaldata[label].type = HELIOS_TYPE_INT4;
3910 globaldata[label].size = 1;
3911 globaldata[label].global_data_int4 = vec;
3912}
+
3913
+
3914void Context::setGlobalData( const char* label, const std::string& data ){
3915 std::vector<std::string> vec{data};
3916 globaldata[label].type = HELIOS_TYPE_STRING;
3917 globaldata[label].size = 1;
3918 globaldata[label].global_data_string = vec;
3919}
+
3920
+
3921void Context::setGlobalData( const char* label, HeliosDataType type, size_t size, void* data ){
3922
3923 globaldata[label].type = type;
@@ -4127,7 +4624,9 @@
4047 }
4048
4049}
+
4050
+
4051void Context::renameGlobalData( const char* old_label, const char* new_label ){
4052
4053 if( !doesGlobalDataExist( old_label ) ){
@@ -4138,7 +4637,9 @@
4058 clearGlobalData( old_label );
4059
4060}
+
4061
+
4062void Context::duplicateGlobalData(const char* old_label, const char* new_label ){
4063
4064 if( !doesGlobalDataExist( old_label ) ){
@@ -4196,7 +4697,9 @@
4116 }
4117
4118}
+
4119
+
4120void Context::clearGlobalData( const char* label ){
4121
4122 if(doesGlobalDataExist(label)){
@@ -4204,7 +4707,9 @@
4124 }
4125
4126}
+
4127
+
4128void Context::getGlobalData( const char* label, int& data ) const{
4129
4130 if( !doesGlobalDataExist( label ) ){
@@ -4221,7 +4726,9 @@
4141 }
4142
4143}
+
4144
+
4145void Context::getGlobalData( const char* label, std::vector<int>& data ) const{
4146
4147 if( !doesGlobalDataExist( label ) ){
@@ -4238,7 +4745,9 @@
4158 }
4159
4160}
+
4161
+
4162void Context::getGlobalData( const char* label, uint& data ) const{
4163
4164 if( !doesGlobalDataExist( label ) ){
@@ -4255,7 +4764,9 @@
4175 }
4176
4177}
+
4178
+
4179void Context::getGlobalData( const char* label, std::vector<uint>& data ) const{
4180
4181 if( !doesGlobalDataExist( label ) ){
@@ -4272,7 +4783,9 @@
4192 }
4193
4194}
+
4195
+
4196void Context::getGlobalData( const char* label, float& data ) const{
4197
4198 if( !doesGlobalDataExist( label ) ){
@@ -4289,7 +4802,9 @@
4209 }
4210
4211}
+
4212
+
4213void Context::getGlobalData( const char* label, std::vector<float>& data ) const{
4214
4215 if( !doesGlobalDataExist( label ) ){
@@ -4306,7 +4821,9 @@
4226 }
4227
4228}
+
4229
+
4230void Context::getGlobalData( const char* label, double& data ) const{
4231
4232 if( !doesGlobalDataExist( label ) ){
@@ -4323,7 +4840,9 @@
4243 }
4244
4245}
+
4246
+
4247void Context::getGlobalData( const char* label, std::vector<double>& data ) const{
4248
4249 if( !doesGlobalDataExist( label ) ){
@@ -4340,7 +4859,9 @@
4260 }
4261
4262}
+
4263
+
4264void Context::getGlobalData( const char* label, helios::vec2& data ) const{
4265
4266 if( !doesGlobalDataExist( label ) ){
@@ -4357,7 +4878,9 @@
4277 }
4278
4279}
+
4280
+
4281void Context::getGlobalData( const char* label, std::vector<helios::vec2>& data ) const{
4282
4283 if( !doesGlobalDataExist( label ) ){
@@ -4374,7 +4897,9 @@
4294 }
4295
4296}
+
4297
+
4298void Context::getGlobalData( const char* label, helios::vec3& data ) const{
4299
4300 if( !doesGlobalDataExist( label ) ){
@@ -4391,7 +4916,9 @@
4311 }
4312
4313}
+
4314
+
4315void Context::getGlobalData( const char* label, std::vector<helios::vec3>& data ) const{
4316
4317 if( !doesGlobalDataExist( label ) ){
@@ -4408,7 +4935,9 @@
4328 }
4329
4330}
+
4331
+
4332void Context::getGlobalData( const char* label, helios::vec4& data ) const{
4333
4334 if( !doesGlobalDataExist( label ) ){
@@ -4425,7 +4954,9 @@
4345 }
4346
4347}
+
4348
+
4349void Context::getGlobalData( const char* label, std::vector<helios::vec4>& data ) const{
4350
4351 if( !doesGlobalDataExist( label ) ){
@@ -4442,7 +4973,9 @@
4362 }
4363
4364}
+
4365
+
4366void Context::getGlobalData( const char* label, helios::int2& data ) const{
4367
4368 if( !doesGlobalDataExist( label ) ){
@@ -4459,7 +4992,9 @@
4379 }
4380
4381}
+
4382
+
4383void Context::getGlobalData( const char* label, std::vector<helios::int2>& data ) const{
4384
4385 if( !doesGlobalDataExist( label ) ){
@@ -4476,7 +5011,9 @@
4396 }
4397
4398}
+
4399
+
4400void Context::getGlobalData( const char* label, helios::int3& data ) const{
4401
4402 if( !doesGlobalDataExist( label ) ){
@@ -4493,7 +5030,9 @@
4413 }
4414
4415}
+
4416
+
4417void Context::getGlobalData( const char* label, std::vector<helios::int3>& data ) const{
4418
4419 if( !doesGlobalDataExist( label ) ){
@@ -4510,7 +5049,9 @@
4430 }
4431
4432}
+
4433
+
4434void Context::getGlobalData( const char* label, helios::int4& data ) const{
4435
4436 if( !doesGlobalDataExist( label ) ){
@@ -4527,7 +5068,9 @@
4447 }
4448
4449}
+
4450
+
4451void Context::getGlobalData( const char* label, std::vector<helios::int4>& data ) const{
4452
4453 if( !doesGlobalDataExist( label ) ){
@@ -4544,7 +5087,9 @@
4464 }
4465
4466}
+
4467
+
4468void Context::getGlobalData( const char* label, std::string& data ) const{
4469
4470 if( !doesGlobalDataExist( label ) ){
@@ -4561,7 +5106,9 @@
4481 }
4482
4483}
+
4484
+
4485void Context::getGlobalData( const char* label, std::vector<std::string>& data ) const{
4486
4487 if( !doesGlobalDataExist( label ) ){
@@ -4578,7 +5125,9 @@
4498 }
4499
4500}
+
4501
+
4503
4504 if( !doesGlobalDataExist( label ) ){
@@ -4588,7 +5137,9 @@
4508 return globaldata.at(label).type;
4509
4510}
+
4511
+
4512size_t Context::getGlobalDataSize(const char *label) const {
4513
4514 if( !doesGlobalDataExist( label ) ){
@@ -4598,7 +5149,9 @@
4518 return globaldata.at(label).size;
4519
4520}
+
4521
+
4522std::vector<std::string> Context::listGlobalData() const{
4523
4524 std::vector<std::string> labels;
@@ -4609,7 +5162,9 @@
4529
4530 return labels;
4531}
+
4532
+
4533bool Context::doesGlobalDataExist( const char* label ) const{
4534
4535 if( globaldata.find(label) == globaldata.end() ){
@@ -4619,7 +5174,9 @@
4539 }
4540
4541}
+
4542
+
4543void Context::incrementGlobalData( const char* label, int increment ){
4544
4545 if( !doesGlobalDataExist( label ) ){
@@ -4637,7 +5194,9 @@
4557 }
4558
4559}
+
4560
+
4561void Context::incrementGlobalData( const char* label, uint increment ){
4562
4563 if( !doesGlobalDataExist( label ) ){
@@ -4655,7 +5214,9 @@
4575 }
4576
4577}
+
4578
+
4579void Context::incrementGlobalData( const char* label, float increment ){
4580
4581 if( !doesGlobalDataExist( label ) ){
@@ -4673,7 +5234,9 @@
4593 }
4594
4595}
+
4596
+
4597void Context::incrementGlobalData( const char* label, double increment ){
4598
4599 if( !doesGlobalDataExist( label ) ){
@@ -4691,108 +5254,110 @@
4611 }
4612
4613}
+
-
HeliosDataType
Data types.
Definition: Context.h:41
-
@ HELIOS_TYPE_INT3
helios::int3 data type
Definition: Context.h:59
-
@ HELIOS_TYPE_DOUBLE
double data type
Definition: Context.h:49
-
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition: Context.h:51
-
@ HELIOS_TYPE_INT
integer data type
Definition: Context.h:43
-
@ HELIOS_TYPE_STRING
std::string data type
Definition: Context.h:63
-
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition: Context.h:53
-
@ HELIOS_TYPE_INT4
helios::int4 data type
Definition: Context.h:61
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition: Context.h:57
-
@ HELIOS_TYPE_VEC4
helios::vec4 data type
Definition: Context.h:55
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
-
uint getObjectDataSize(const char *label) const
Get the size/length of object data.
-
std::vector< std::string > listObjectData() const
Return labels for all object data for this particular object.
-
bool doesObjectDataExist(const char *label) const
Check if object data 'label' exists.
-
HeliosDataType getObjectDataType(const char *label) const
Get the Helios data type of object data.
-
void clearObjectData(const char *label)
Clear the object data for this object.
-
void getObjectData(const char *label, int &data) const
Get data associated with a object element (integer scalar)
-
void setObjectData(const char *label, const int &data)
Add data value (int) associated with a object element.
-
void copyPrimitiveData(uint sourceUUID, uint destinationUUID)
copy all primitive data from one primitive to another
-
void scalePrimitiveData(const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)
Multiply primitive data values by a constant scaling factor for a subset of primitives.
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
-
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
-
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.
-
uint getPrimitiveDataSize(uint UUID, const char *label) const
Get the size/length of primitive data.
-
void calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, float &sum) const
Calculate sum of primitive data values (float) for a subset of primitives.
-
void incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, int increment)
Increase value of primitive data (int) by some value.
-
void renamePrimitiveData(uint UUID, const char *old_label, const char *new_label)
Rename primitive data for a primitive.
-
void duplicateObjectData(uint objID, const char *old_label, const char *new_label)
Duplicate/copy existing object data.
-
std::vector< uint > filterObjectsByData(const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const
Get a vector of object IDs that meet filtering criteria based on object data.
Definition: Context.cpp:2750
-
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
-
void aggregatePrimitiveDataProduct(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Multiply primitive data values for each primitive together and store result in new primitive data.
-
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
-
void clearObjectData(uint objID, const char *label)
Clear primitive data for a single primitive based on its objID.
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< std::string > listPrimitiveData(uint UUID) const
Return labels for all primitive data for this particular primitive.
-
void renameGlobalData(const char *old_label, const char *new_label)
Rename global data.
-
void duplicatePrimitiveData(uint UUID, const char *old_label, const char *new_label)
Duplicate/copy primitive data.
-
void calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, float &mean) const
Calculate mean of primitive data values (float) for a subset of primitives.
-
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
-
size_t getGlobalDataSize(const char *label) const
Get the size/length of global data.
-
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
void clearGlobalData(const char *label)
Delete/clear global data.
-
void renameObjectData(uint objID, const char *old_label, const char *new_label)
Rename existing object data.
-
void setGlobalData(const char *label, const int &data)
Add global data value (int)
-
void aggregatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Sum multiple primitive data values for each primitive together and store result in new primitive data...
-
uint getObjectDataSize(uint objID, const char *label) const
Get the size/length of primitive data.
-
void calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const
Calculate sum of primitive data values (float) for a subset of primitives, where each value in the su...
-
void incrementGlobalData(const char *label, int increment)
Increase value of global data (int) by some value.
-
void clearPrimitiveData(uint UUID, const char *label)
Clear primitive data for a single primitive based on its UUID.
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
void calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const
Calculate mean of primitive data values (float) for a subset of primitives, where each value in the m...
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
std::vector< std::string > listObjectData(uint ObjID) const
Return labels for all object data for this particular object.
-
std::vector< std::string > listGlobalData() const
List the labels for all global data in the Context.
-
void copyObjectData(uint source_objID, uint destination_objID)
copy all object data from one compound object to another
-
void duplicateGlobalData(const char *old_label, const char *new_label)
Make a copy of global data.
-
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
-
float sumPrimitiveSurfaceArea(const std::vector< uint > &UUIDs) const
Sum the one-sided surface area of a group of primitives.
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition: global.cpp:1069
-
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition: global.cpp:1084
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
vec4 make_vec4(float x, float y, float z, float w)
Make a vec4 from three floats.
-
int4 make_int4(int x, int y, int z, int w)
Make an int4 vector from three ints.
-
Structure for Global Data Entities.
Definition: Context.h:102
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of three elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int y
Second element in vector.
-
Vector of four elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int w
Fourth element in vector.
-
int y
Second element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
-
Vector of four elements of type 'float'.
-
float y
Second element in vector.
-
float w
Fourth element in vector.
-
float z
Third element in vector.
-
float x
First element in vector.
+
HeliosDataType
Data types.
Definition Context.h:41
+
@ HELIOS_TYPE_INT3
helios::int3 data type
Definition Context.h:59
+
@ HELIOS_TYPE_DOUBLE
double data type
Definition Context.h:49
+
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition Context.h:51
+
@ HELIOS_TYPE_INT
integer data type
Definition Context.h:43
+
@ HELIOS_TYPE_STRING
std::string data type
Definition Context.h:63
+
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition Context.h:53
+
@ HELIOS_TYPE_INT4
helios::int4 data type
Definition Context.h:61
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition Context.h:57
+
@ HELIOS_TYPE_VEC4
helios::vec4 data type
Definition Context.h:55
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
+
uint getObjectDataSize(const char *label) const
Get the size/length of object data.
+
std::vector< std::string > listObjectData() const
Return labels for all object data for this particular object.
+
bool doesObjectDataExist(const char *label) const
Check if object data 'label' exists.
+
HeliosDataType getObjectDataType(const char *label) const
Get the Helios data type of object data.
+
void clearObjectData(const char *label)
Clear the object data for this object.
+
void getObjectData(const char *label, int &data) const
Get data associated with a object element (integer scalar)
+
void setObjectData(const char *label, const int &data)
Add data value (int) associated with a object element.
+
void copyPrimitiveData(uint sourceUUID, uint destinationUUID)
copy all primitive data from one primitive to another
+
void scalePrimitiveData(const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)
Multiply primitive data values by a constant scaling factor for a subset of primitives.
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
+
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
+
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.
+
uint getPrimitiveDataSize(uint UUID, const char *label) const
Get the size/length of primitive data.
+
void calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, float &sum) const
Calculate sum of primitive data values (float) for a subset of primitives.
+
void incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, int increment)
Increase value of primitive data (int) by some value.
+
void renamePrimitiveData(uint UUID, const char *old_label, const char *new_label)
Rename primitive data for a primitive.
+
void duplicateObjectData(uint objID, const char *old_label, const char *new_label)
Duplicate/copy existing object data.
+
std::vector< uint > filterObjectsByData(const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const
Get a vector of object IDs that meet filtering criteria based on object data.
Definition Context.cpp:2750
+
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
+
void aggregatePrimitiveDataProduct(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Multiply primitive data values for each primitive together and store result in new primitive data.
+
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
+
void clearObjectData(uint objID, const char *label)
Clear primitive data for a single primitive based on its objID.
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< std::string > listPrimitiveData(uint UUID) const
Return labels for all primitive data for this particular primitive.
+
void renameGlobalData(const char *old_label, const char *new_label)
Rename global data.
+
void duplicatePrimitiveData(uint UUID, const char *old_label, const char *new_label)
Duplicate/copy primitive data.
+
void calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, float &mean) const
Calculate mean of primitive data values (float) for a subset of primitives.
+
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
+
size_t getGlobalDataSize(const char *label) const
Get the size/length of global data.
+
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
void clearGlobalData(const char *label)
Delete/clear global data.
+
void renameObjectData(uint objID, const char *old_label, const char *new_label)
Rename existing object data.
+
void setGlobalData(const char *label, const int &data)
Add global data value (int)
+
void aggregatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Sum multiple primitive data values for each primitive together and store result in new primitive data...
+
uint getObjectDataSize(uint objID, const char *label) const
Get the size/length of primitive data.
+
void calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const
Calculate sum of primitive data values (float) for a subset of primitives, where each value in the su...
+
void incrementGlobalData(const char *label, int increment)
Increase value of global data (int) by some value.
+
void clearPrimitiveData(uint UUID, const char *label)
Clear primitive data for a single primitive based on its UUID.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
void calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const
Calculate mean of primitive data values (float) for a subset of primitives, where each value in the m...
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
std::vector< std::string > listObjectData(uint ObjID) const
Return labels for all object data for this particular object.
+
std::vector< std::string > listGlobalData() const
List the labels for all global data in the Context.
+
void copyObjectData(uint source_objID, uint destination_objID)
copy all object data from one compound object to another
+
void duplicateGlobalData(const char *old_label, const char *new_label)
Make a copy of global data.
+
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
+
float sumPrimitiveSurfaceArea(const std::vector< uint > &UUIDs) const
Sum the one-sided surface area of a group of primitives.
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition global.cpp:1069
+
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition global.cpp:1084
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
vec4 make_vec4(float x, float y, float z, float w)
Make a vec4 from three floats.
+
int4 make_int4(int x, int y, int z, int w)
Make an int4 vector from three ints.
+
Structure for Global Data Entities.
Definition Context.h:102
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of three elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int y
Second element in vector.
+
Vector of four elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int w
Fourth element in vector.
+
int y
Second element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+
Vector of four elements of type 'float'.
+
float y
Second element in vector.
+
float w
Fourth element in vector.
+
float z
Third element in vector.
+
float x
First element in vector.
+ diff --git a/doc/html/_context__file_i_o_8cpp.html b/doc/html/_context__file_i_o_8cpp.html index 9da21e8d3..0092b9bc6 100644 --- a/doc/html/_context__file_i_o_8cpp.html +++ b/doc/html/_context__file_i_o_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Context_fileIO.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_context__file_i_o_8cpp_source.html b/doc/html/_context__file_i_o_8cpp_source.html index 66c466362..779c8bf15 100644 --- a/doc/html/_context__file_i_o_8cpp_source.html +++ b/doc/html/_context__file_i_o_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Context_fileIO.cpp
@@ -97,6 +109,7 @@
17
18using namespace helios;
19
+
20int XMLparser::parse_data_float( const pugi::xml_node &node_data, std::vector<float> &data ){
21
22 std::string data_str = node_data.child_value();
@@ -119,7 +132,9 @@
39 return 0;
40
41}
+
42
+
43int XMLparser::parse_data_double( const pugi::xml_node &node_data, std::vector<double> &data ){
44
45 std::string data_str = node_data.child_value();
@@ -142,7 +157,9 @@
62 return 0;
63
64}
+
65
+
66int XMLparser::parse_data_int( const pugi::xml_node &node_data, std::vector<int> &data ){
67
68 std::string data_str = node_data.child_value();
@@ -165,7 +182,9 @@
85 return 0;
86
87}
+
88
+
89int XMLparser::parse_data_uint( const pugi::xml_node &node_data, std::vector<uint> &data ){
90
91 std::string data_str = node_data.child_value();
@@ -188,7 +207,9 @@
108 return 0;
109
110}
+
111
+
112int XMLparser::parse_data_string( const pugi::xml_node &node_data, std::vector<std::string> &data ){
113
114 std::string data_str = node_data.child_value();
@@ -206,7 +227,9 @@
126 return 0;
127
128}
+
129
+
130int XMLparser::parse_data_vec2( const pugi::xml_node &node_data, std::vector<vec2> &data ){
131
132 std::string data_str = node_data.child_value();
@@ -230,7 +253,9 @@
150 return 0;
151
152}
+
153
+
154int XMLparser::parse_data_vec3( const pugi::xml_node &node_data, std::vector<vec3> &data ){
155
156 std::string data_str = node_data.child_value();
@@ -256,7 +281,9 @@
176 return 0;
177
178}
+
179
+
180int XMLparser::parse_data_vec4( const pugi::xml_node &node_data, std::vector<vec4> &data ){
181
182 std::string data_str = node_data.child_value();
@@ -282,7 +309,9 @@
202 return 0;
203
204}
+
205
+
206int XMLparser::parse_data_int2( const pugi::xml_node &node_data, std::vector<int2> &data ){
207
208 std::string data_str = node_data.child_value();
@@ -306,7 +335,9 @@
226 return 0;
227
228}
+
229
+
230int XMLparser::parse_data_int3( const pugi::xml_node &node_data, std::vector<int3> &data ){
231
232 std::string data_str = node_data.child_value();
@@ -331,7 +362,9 @@
251 return 0;
252
253}
+
254
+
255int XMLparser::parse_data_int4( const pugi::xml_node &node_data, std::vector<int4> &data ){
256
257 std::string data_str = node_data.child_value();
@@ -357,7 +390,9 @@
277 return 0;
278
279}
+
280
+
281int XMLparser::parse_objID( const pugi::xml_node &node, uint &objID ){
282
283 pugi::xml_node objID_node = node.child("objID");
@@ -374,7 +409,9 @@
294 return 0;
295
296}
+
297
+
298int XMLparser::parse_transform( const pugi::xml_node &node, float (&transform)[16] ){
299
300 pugi::xml_node transform_node = node.child("transform");
@@ -403,7 +440,9 @@
323 return 0;
324
325}
+
326
+
327int XMLparser::parse_texture( const pugi::xml_node &node, std::string &texture ){
328
329 pugi::xml_node texture_node = node.child("texture");
@@ -417,7 +456,9 @@
337 }
338
339}
+
340
+
341int XMLparser::parse_textureUV( const pugi::xml_node &node, std::vector<vec2> &uvs ){
342
343 pugi::xml_node uv_node = node.child("textureUV");
@@ -441,7 +482,9 @@
361 return 0;
362
363}
+
364
+
365int XMLparser::parse_solid_fraction( const pugi::xml_node &node, float &solid_fraction ){
366
367 pugi::xml_node sfrac_node = node.child("solid_fraction");
@@ -456,7 +499,9 @@
376 return 0;
377
378}
+
379
+
380int XMLparser::parse_vertices( const pugi::xml_node &node, std::vector<float> &vertices ){
381
382 vertices.resize(12);
@@ -487,7 +532,9 @@
407 return 0;
408
409}
+
410
+
411int XMLparser::parse_subdivisions( const pugi::xml_node &node, uint &subdivisions ){
412
413 pugi::xml_node subdiv_node = node.child("subdivisions");
@@ -502,7 +549,9 @@
422 return 0;
423
424}
+
425
+
426int XMLparser::parse_subdivisions( const pugi::xml_node &node, int2 &subdivisions ){
427
428 pugi::xml_node subdiv_node = node.child("subdivisions");
@@ -521,7 +570,9 @@
441 return 0;
442
443}
+
444
+
445int XMLparser::parse_subdivisions( const pugi::xml_node &node, int3 &subdivisions ){
446
447 pugi::xml_node subdiv_node = node.child("subdivisions");
@@ -541,7 +592,9 @@
461 return 0;
462
463}
+
464
+
465int XMLparser::parse_nodes( const pugi::xml_node &node, std::vector<vec3> &nodes ){
466
467 pugi::xml_node node_data = node.child("nodes");
@@ -567,7 +620,9 @@
487 return 0;
488
489}
+
490
+
491int XMLparser::parse_radius( const pugi::xml_node &node, std::vector<float> &radius ){
492
493 pugi::xml_node node_data = node.child("radius");
@@ -591,6 +646,7 @@
511 return 0;
512
513}
+
514
515void Context::loadPData( pugi::xml_node p, uint UUID ){
516
@@ -1294,6 +1350,7 @@
1214
1215}
1216
+
1217std::vector<uint> Context::loadXML( const char* filename, bool quiet ){
1218
1219 if( !quiet ) {
@@ -2475,11 +2532,15 @@
2395 return UUID;
2396
2397}
+
2398
+
2399std::vector<std::string> Context::getLoadedXMLFiles() {
2400 return XMLfiles;
2401}
+
2402
+
2403bool Context::scanXMLForTag( const std::string &filename, const std::string &tag, const std::string &label ){
2404
2405 std::string fn = filename;
@@ -2519,6 +2580,7 @@
2439 return false;
2440
2441}
+
2442
2443void Context::writeDataToXMLstream( const char* data_group, const std::vector<std::string> &data_labels, void* ptr, std::ofstream &outfile ) const{
2444
@@ -2735,10 +2797,13 @@
2655
2656}
2657
+
2658void Context::writeXML( const char* filename, bool quiet ) const {
2659 writeXML(filename, getAllUUIDs(), quiet);
2660}
+
2661
+
2662void Context::writeXML_byobject( const char* filename, const std::vector<uint> &objIDs, bool quiet ) const {
2663 for( uint objID : objIDs ){
2664 if( !doesObjectExist(objID) ){
@@ -2747,7 +2812,9 @@
2667 }
2668 writeXML(filename, getObjectPrimitiveUUIDs(objIDs), quiet);
2669}
+
2670
+
2671void Context::writeXML( const char* filename, const std::vector<uint> &UUIDs, bool quiet ) const{
2672
2673 if( !quiet ) {
@@ -3454,23 +3521,33 @@
3374 std::cout << "done." << std::endl;
3375 }
3376}
+
3377
+
3378std::vector<uint> Context::loadPLY(const char* filename, bool silent ){
3379 return loadPLY( filename, nullorigin, 0, nullrotation, RGB::blue, "YUP", silent );
3380}
+
3381
+
3382std::vector<uint> Context::loadPLY(const char* filename, const vec3 &origin, float height, const std::string &upaxis, bool silent ){
3383 return loadPLY( filename, origin, height, make_SphericalCoord(0,0), RGB::blue, upaxis, silent );
3384}
+
3385
+
3386std::vector<uint> Context::loadPLY(const char* filename, const vec3 &origin, float height, const SphericalCoord &rotation, const std::string &upaxis, bool silent ){
3387 return loadPLY( filename, origin, height, rotation, RGB::blue, upaxis, silent );
3388}
+
3389
+
3390std::vector<uint> Context::loadPLY(const char* filename, const vec3 &origin, float height, const RGBcolor &default_color, const std::string &upaxis, bool silent ){
3391 return loadPLY( filename, origin, height, make_SphericalCoord(0,0), default_color, upaxis, silent );
3392}
+
3393
+
3394std::vector<uint> Context::loadPLY(const char* filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const std::string &upaxis, bool silent ){
3395
3396 if( !silent ) {
@@ -3754,7 +3831,9 @@
3674 return UUID;
3675
3676}
+
3677
+
3678void Context::writePLY( const char* filename ) const{
3679
3680 std::ofstream PLYfile;
@@ -3818,19 +3897,27 @@
3738
3739
3740}
+
3741
+
3742std::vector<uint> Context::loadOBJ(const char* filename, bool silent ){
3743 return loadOBJ(filename,nullorigin,0,nullrotation,RGB::blue,"ZUP",silent);
3744}
+
3745
+
3746std::vector<uint> Context::loadOBJ(const char* filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, bool silent ){
3747 return loadOBJ(filename,origin,make_vec3(0,0,height),rotation,default_color,"ZUP",silent);
3748}
+
3749
+
3750std::vector<uint> Context::loadOBJ(const char* filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const char* upaxis, bool silent ) {
3751 return loadOBJ(filename,origin,make_vec3(0,0,height),rotation,default_color,upaxis,silent);
3752}
+
3753
+
3754std::vector<uint> Context::loadOBJ(const char* filename, const vec3 &origin, const helios::vec3 &scale, const SphericalCoord &rotation, const RGBcolor &default_color, const char* upaxis, bool silent ){
3755
3756 if( !silent ) {
@@ -4088,6 +4175,7 @@
4008 return UUID;
4009
4010}
+
4011
4012std::map<std::string, Context::OBJmaterial> Context::loadMTL(const std::string &filebase, const std::string &material_file ){
4013
@@ -4208,14 +4296,19 @@
4128
4129}
4130
+
4131void Context::writeOBJ( const std::string &filename ) const {
4132 writeOBJ(filename, getAllUUIDs(),{});
4133}
+
4134
+
4135void Context::writeOBJ( const std::string &filename, const std::vector<uint> &UUIDs ) const {
4136 writeOBJ(filename,UUIDs,{});
4137}
+
4138
+
4139void Context::writeOBJ( const std::string &filename, const std::vector<uint> &UUIDs, const std::vector<std::string> &primitive_dat_fields ) const{
4140
4141 //To-Do list for OBJ writer
@@ -4549,11 +4642,15 @@
4469
4470 std::cout << "done." << std::endl;
4471}
+
4472
+
4473void Context::writePrimitiveData( std::string filename, const std::vector<std::string> &column_format, bool print_header ) const{
4474 writePrimitiveData(filename,column_format,getAllUUIDs(),print_header);
4475}
+
4476
+
4477void Context::writePrimitiveData( std::string filename, const std::vector<std::string> &column_format, const std::vector<uint> &UUIDs, bool print_header ) const{
4478
4479 std::ofstream file(filename);
@@ -4628,7 +4725,9 @@
4548 file.close();
4549
4550}
+
4551
+
4552void Context::loadTabularTimeseriesData( const std::string &data_file, const std::vector<std::string> &col_labels, const std::string &a_delimeter, const std::string &a_date_string_format, uint headerlines ){
4553
4554 std::ifstream datafile(data_file); //open the file
@@ -4912,221 +5011,223 @@
4832 datafile.close();
4833
4834}
+
-
HeliosDataType
Data types.
Definition: Context.h:41
-
@ HELIOS_TYPE_INT3
helios::int3 data type
Definition: Context.h:59
-
@ HELIOS_TYPE_DOUBLE
double data type
Definition: Context.h:49
-
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition: Context.h:51
-
@ HELIOS_TYPE_INT
integer data type
Definition: Context.h:43
-
@ HELIOS_TYPE_STRING
std::string data type
Definition: Context.h:63
-
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition: Context.h:53
-
@ HELIOS_TYPE_INT4
helios::int4 data type
Definition: Context.h:61
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition: Context.h:57
-
@ HELIOS_TYPE_VEC4
helios::vec4 data type
Definition: Context.h:55
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
-
PrimitiveType
Type of primitive element.
Definition: Context.h:31
-
@ PRIMITIVE_TYPE_PATCH
< Rectangular primitive
Definition: Context.h:33
-
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition: Context.h:37
-
@ PRIMITIVE_TYPE_TRIANGLE
< Triangular primitive
Definition: Context.h:35
-
@ OBJECT_TYPE_BOX
Box.
Definition: Context.h:136
-
@ OBJECT_TYPE_POLYMESH
< Triangular Mesh
Definition: Context.h:140
-
@ OBJECT_TYPE_TUBE
Tube.
Definition: Context.h:134
-
@ OBJECT_TYPE_CONE
< Cone/tapered cylinder
Definition: Context.h:142
-
@ OBJECT_TYPE_DISK
< Disk
Definition: Context.h:138
-
@ OBJECT_TYPE_TILE
< Tile
Definition: Context.h:130
-
@ OBJECT_TYPE_SPHERE
< Sphere
Definition: Context.h:132
-
Box compound object class.
Definition: Context.h:759
-
helios::int3 getSubdivisionCount() const
Get the number of sub-patch divisions of the box object in each Cartesian direction.
Definition: Context.cpp:3996
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the box object.
Definition: Context.cpp:3980
-
vec3 getSize() const
Get the dimensions of the box object in each Cartesian direction.
Definition: Context.cpp:3961
- -
void setPrimitiveUUIDs(const std::vector< uint > &UUIDs)
Method to set the UUIDs of object child primitives.
Definition: Context.cpp:2517
-
std::string getTextureFile() const
Method to return the texture map file of an Object.
Definition: Context.cpp:2349
-
std::vector< std::string > listObjectData() const
Return labels for all object data for this particular object.
-
bool hasTexture() const
Method to check whether this object has texture data.
Definition: Context.cpp:2341
-
void setTransformationMatrix(float(&T)[16])
Method to set the Affine transformation matrix of a Compound Object.
Definition: Context.cpp:2509
-
helios::ObjectType getObjectType() const
Get an enumeration specifying the type of the object.
Definition: Context.cpp:2247
-
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition: Context.cpp:2256
-
void getTransformationMatrix(float(&T)[16]) const
Method to return the Affine transformation matrix of a Compound Object.
Definition: Context.cpp:2503
-
Cone compound object class.
Definition: Context.h:847
-
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the cone object.
Definition: Context.cpp:4171
-
std::vector< helios::vec3 > getNodeCoordinates() const
Get the Cartesian coordinates of each of the cone object nodes.
Definition: Context.cpp:4130
-
std::vector< float > getNodeRadii() const
Get the radius at each of the cone object nodes.
Definition: Context.cpp:4159
-
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition: Context.cpp:7139
-
std::vector< uint > loadPLY(const char *filename, bool silent=false)
Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
-
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
-
Disk * getDiskObjectPointer(uint ObjID) const
Get a pointer to a Disk Compound Object.
Definition: Context.cpp:4022
-
std::vector< uint > getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs) const
Method to return unique parent object IDs for a vector of primitive UUIDs.
Definition: Context.cpp:7022
-
void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
Load tabular weather data from text file into timeseries.
-
Box * getBoxObjectPointer(uint ObjID) const
Get a pointer to a Box Compound Object.
Definition: Context.cpp:3954
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
Cone * getConeObjectPointer(uint ObjID) const
Get a pointer to a Cone Compound Object.
Definition: Context.cpp:4123
-
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition: Context.cpp:2574
-
std::vector< std::string > getLoadedXMLFiles()
Get names of XML files that are currently loaded.
-
void setDate(int day, int month, int year)
Set simulation date by day, month, year.
Definition: Context.cpp:1059
-
void setPrimitiveParentObjectID(uint UUID, uint objID)
Method to set the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:6988
-
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition: Context.cpp:7179
-
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition: Context.cpp:6984
-
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
-
float getPrimitiveSolidFraction(uint UUID) const
Get fraction of primitive surface area that is non-transparent.
Definition: Context.cpp:7221
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition: Context.cpp:2907
-
void writeOBJ(const std::string &filename) const
Write geometry in the Context to a Wavefront file (.obj)
-
helios::Time getTime() const
Get the simulation time.
Definition: Context.cpp:1166
-
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
-
Sphere * getSphereObjectPointer(uint ObjID) const
Get a pointer to a Sphere Compound Object.
Definition: Context.cpp:3410
-
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition: Context.cpp:7197
-
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
-
helios::Date getDate() const
Get simulation date.
Definition: Context.cpp:1099
-
size_t getGlobalDataSize(const char *label) const
Get the size/length of global data.
-
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition: Context.cpp:2585
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
void writePLY(const char *filename) const
Write geometry in the Context to a Stanford polygon file (.ply)
-
void setGlobalData(const char *label, const int &data)
Add global data value (int)
-
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition: Context.cpp:7217
-
Tube * getTubeObjectPointer(uint ObjID) const
Get a pointer to a Tube Compound Object.
Definition: Context.cpp:3486
-
void writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const
Write primitive data to an ASCII text file for all primitives in the Context.
-
void writeXML(const char *filename, bool quiet=false) const
Write Context geometry and data to XML file for all UUIDs in the context.
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition: Context.cpp:3312
-
static bool scanXMLForTag(const std::string &filename, const std::string &tag, const std::string &label="")
Scan a Helios XML file to check if a tag exists.
-
void writeXML_byobject(const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const
Write Context geometry and data to XML file for a subset of compound object IDs in the context.
-
void setTime(int minute, int hour)
Set simulation time.
Definition: Context.cpp:1136
-
void setPrimitiveTransformationMatrix(uint UUID, float(&T)[16])
Method to set the Affine transformation matrix of a Primitive.
Definition: Context.cpp:7112
-
Disk compound object class.
Definition: Context.h:795
-
vec2 getSize() const
Get the lateral dimensions of the disk object.
Definition: Context.cpp:4029
-
int2 getSubdivisionCount() const
Get the number of sub-triangle divisions of the disk object.
Definition: Context.cpp:4061
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the disk object.
Definition: Context.cpp:4045
-
Sphere compound object class.
Definition: Context.h:624
-
uint getSubdivisionCount() const
Get the number of sub-patch divisions of the sphere object.
Definition: Context.cpp:3455
-
helios::vec3 getRadius() const
Get the radius of the sphere.
Definition: Context.cpp:3417
-
vec3 getCenter() const
Get the Cartesian coordinates of the center of the sphere object.
Definition: Context.cpp:3439
-
Tile compound object class.
Definition: Context.h:581
-
helios::int2 getSubdivisionCount() const
Get the number of sub-patch divisions of the tile.
Definition: Context.cpp:3343
-
Tube compound object class.
Definition: Context.h:660
-
std::vector< float > getNodeRadii() const
Get the radius at each of the tube object nodes.
Definition: Context.cpp:3508
-
std::vector< helios::RGBcolor > getNodeColors() const
Get the colors at each of the tube object nodes.
Definition: Context.cpp:3525
-
std::vector< helios::vec3 > getNodes() const
Get the Cartesian coordinates of each of the tube object nodes.
Definition: Context.cpp:3493
-
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the tube object.
Definition: Context.cpp:3533
-
static int parse_data_vec3(const pugi::xml_node &node_data, std::vector< vec3 > &data)
Parse vector data of type 'vec3' within an XML tag.
-
static int parse_data_int2(const pugi::xml_node &node_data, std::vector< int2 > &data)
Parse vector data of type 'int2' within an XML tag.
-
static int parse_radius(const pugi::xml_node &node_data, std::vector< float > &radius)
Parse the value within a <radius> (radius at nodes of a tube or cone) tag.
-
static int parse_data_float(const pugi::xml_node &node_data, std::vector< float > &data)
Parse vector data of type 'float' within an XML tag.
-
static int parse_transform(const pugi::xml_node &node_data, float(&transform)[16])
Parse the value within a <transform> (transformation matrix) tag.
-
static int parse_data_uint(const pugi::xml_node &node_data, std::vector< uint > &data)
Parse vector data of type 'uint' within an XML tag.
-
static int parse_subdivisions(const pugi::xml_node &node_data, uint &subdivisions)
Parse the value within a <subdivisions> (object sub-primitive resolution) tag.
-
static int parse_data_vec4(const pugi::xml_node &node_data, std::vector< vec4 > &data)
Parse vector data of type 'vac4' within an XML tag.
-
static int parse_data_int3(const pugi::xml_node &node_data, std::vector< int3 > &data)
Parse vector data of type 'int3' within an XML tag.
-
static int parse_data_string(const pugi::xml_node &node_data, std::vector< std::string > &data)
Parse vector data of type 'string' within an XML tag.
-
static int parse_data_int(const pugi::xml_node &node_data, std::vector< int > &data)
Parse vector data of type 'int' within an XML tag.
-
static int parse_texture(const pugi::xml_node &node_data, std::string &texture)
Parse the value within an <texture> (path to image texture) tag.
-
static int parse_data_vec2(const pugi::xml_node &node_data, std::vector< vec2 > &data)
Parse vector data of type 'vec2' within an XML tag.
-
static int parse_data_double(const pugi::xml_node &node_data, std::vector< double > &data)
Parse vector data of type 'double' within an XML tag.
-
static int parse_solid_fraction(const pugi::xml_node &node_data, float &solid_fraction)
Parse the value within a <solid_fraction> (primitive solid fraction) tag.
-
static int parse_objID(const pugi::xml_node &node_data, uint &objID)
Parse the value within an <objID> (object ID) tag.
-
static int parse_textureUV(const pugi::xml_node &node_data, std::vector< vec2 > &uvs)
Parse the value within a <textureUV> (texture coordinates) tag.
-
static int parse_nodes(const pugi::xml_node &node_data, std::vector< vec3 > &nodes)
Parse the value within a <nodes> (coordinates defining nodes of a tube or cone) tag.
-
static int parse_data_int4(const pugi::xml_node &node_data, std::vector< int4 > &data)
Parse vector data of type 'int4' within an XML tag.
-
static int parse_vertices(const pugi::xml_node &node_data, std::vector< float > &vertices)
Parse the value within a <vertices> (primitive vertex coordinates) tag.
-
bool parse_double(const std::string &input_string, double &converted_double)
Convert a string into a double with error checking.
Definition: global.cpp:779
-
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition: global.cpp:140
-
bool parse_float(const std::string &input_string, float &converted_float)
Convert a string into a float with error checking.
Definition: global.cpp:763
-
bool parse_uint(const std::string &input_string, uint &converted_uint)
Convert a string into an unsigned integer with error checking.
Definition: global.cpp:842
-
std::string getFileExtension(const std::string &filepath)
Parse a file string to get the extension.
Definition: global.cpp:3075
-
bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
Definition: global.cpp:3102
-
std::string getFileName(const std::string &filepath)
Parse a file string to get the filename including extension.
Definition: global.cpp:3085
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
bool parse_int(const std::string &input_string, int &converted_int)
Convert a string into an integer with error checking.
Definition: global.cpp:794
-
vec3 nullorigin
Default null vec3 that gives the origin (0,0,0)
Definition: global.cpp:58
-
std::string getFileStem(const std::string &filepath)
Parse a file string to get the filename without extension.
Definition: global.cpp:3080
-
void makeIdentityMatrix(float(&T)[16])
Construct an identity matrix.
Definition: global.cpp:555
-
std::string getFilePath(const std::string &filepath, bool trailingslash=true)
Parse a file string to get the path (i.e., portion of the string before the file name).
Definition: global.cpp:3090
-
SphericalCoord nullrotation
Default null SphericalCoord that applies no rotation.
Definition: global.cpp:57
-
uint addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition: Context.cpp:5256
-
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:4728
-
uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone compound object to the Context.
Definition: Context.cpp:5426
-
uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition: Context.cpp:5000
-
uint addPolymeshObject(const std::vector< uint > &UUIDs)
Add new Polymesh Compound Object.
Definition: Context.cpp:5399
-
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:4550
-
uint addSphereObject(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition: Context.cpp:4310
-
vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
Function to rotate a 3D vector given spherical angles elevation and azimuth.
Definition: global.cpp:79
-
vec2 string2vec2(const char *str)
Convert a space-delimited string into a vec2 vector.
Definition: global.cpp:623
-
int2 string2int2(const char *str)
Convert a space-delimited string into an int2 vector.
Definition: global.cpp:683
-
std::string trim_whitespace(const std::string &input)
Remove leading and trailing whitespace from a string.
Definition: global.cpp:1016
-
vec3 string2vec3(const char *str)
Convert a space-delimited string into a vec3 vector.
Definition: global.cpp:643
-
RGBAcolor string2RGBcolor(const char *str)
Convert a space-delimited string into an RGBcolor vector.
Definition: global.cpp:743
-
int3 string2int3(const char *str)
Convert a space-delimited string into an int3 vector.
Definition: global.cpp:703
-
std::vector< std::string > separate_string_by_delimiter(const std::string &inputstring, const std::string &delimiter)
Separate string by delimiter and store into a vector.
Definition: global.cpp:1032
-
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition: Context.cpp:1328
-
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition: Context.cpp:1372
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
Time queryTimeseriesTime(const char *label, uint index) const
Get the time associated with a timeseries data point.
Definition: Context.cpp:1958
-
void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
Add a data point to timeseries of data.
Definition: Context.cpp:1823
-
Date queryTimeseriesDate(const char *label, uint index) const
Get the date associated with a timeseries data point.
Definition: Context.cpp:1994
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
Time make_Time(int hour, int minute)
Make a Time vector.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
-
Date make_Date(int day, int month, int year)
Make a Date vector.
-
Date Julian2Calendar(int JulianDay, int year)
Convert a Julian day to a calendar Date vector.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
- -
int month
Month of year.
-
void incrementDay()
Increment Date vector by one day.
Definition: global.cpp:202
-
int day
Day of month.
-
int year
Year in YYYY format.
-
Structure for Global Data Entities.
Definition: Context.h:102
-
R-G-B-A color vector.
-
float r
Red color component.
-
float a
Alpha (transparency) component.
-
float b
Blue color component.
-
float g
Green color component.
-
R-G-B color vector.
-
float b
Blue color component.
-
float r
Red color component.
-
void scale(float scale_factor)
Scale RGBcolor by some factor.
-
float g
Green color component.
-
Vector of spherical coordinates (elevation,azimuth)
- -
int second
Second of minute.
-
int hour
Hour of day.
-
int minute
Minute of hour.
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of three elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int y
Second element in vector.
-
Vector of four elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int w
Fourth element in vector.
-
int y
Second element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
-
Vector of four elements of type 'float'.
-
float y
Second element in vector.
-
float w
Fourth element in vector.
-
float z
Third element in vector.
-
float x
First element in vector.
+
HeliosDataType
Data types.
Definition Context.h:41
+
@ HELIOS_TYPE_INT3
helios::int3 data type
Definition Context.h:59
+
@ HELIOS_TYPE_DOUBLE
double data type
Definition Context.h:49
+
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition Context.h:51
+
@ HELIOS_TYPE_INT
integer data type
Definition Context.h:43
+
@ HELIOS_TYPE_STRING
std::string data type
Definition Context.h:63
+
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition Context.h:53
+
@ HELIOS_TYPE_INT4
helios::int4 data type
Definition Context.h:61
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition Context.h:57
+
@ HELIOS_TYPE_VEC4
helios::vec4 data type
Definition Context.h:55
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
+
PrimitiveType
Type of primitive element.
Definition Context.h:31
+
@ PRIMITIVE_TYPE_PATCH
< Rectangular primitive
Definition Context.h:33
+
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition Context.h:37
+
@ PRIMITIVE_TYPE_TRIANGLE
< Triangular primitive
Definition Context.h:35
+
@ OBJECT_TYPE_BOX
Box.
Definition Context.h:136
+
@ OBJECT_TYPE_POLYMESH
< Triangular Mesh
Definition Context.h:140
+
@ OBJECT_TYPE_TUBE
Tube.
Definition Context.h:134
+
@ OBJECT_TYPE_CONE
< Cone/tapered cylinder
Definition Context.h:142
+
@ OBJECT_TYPE_DISK
< Disk
Definition Context.h:138
+
@ OBJECT_TYPE_TILE
< Tile
Definition Context.h:130
+
@ OBJECT_TYPE_SPHERE
< Sphere
Definition Context.h:132
+
Box compound object class.
Definition Context.h:759
+
helios::int3 getSubdivisionCount() const
Get the number of sub-patch divisions of the box object in each Cartesian direction.
Definition Context.cpp:3996
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the box object.
Definition Context.cpp:3980
+
vec3 getSize() const
Get the dimensions of the box object in each Cartesian direction.
Definition Context.cpp:3961
+ +
void setPrimitiveUUIDs(const std::vector< uint > &UUIDs)
Method to set the UUIDs of object child primitives.
Definition Context.cpp:2517
+
std::string getTextureFile() const
Method to return the texture map file of an Object.
Definition Context.cpp:2349
+
std::vector< std::string > listObjectData() const
Return labels for all object data for this particular object.
+
bool hasTexture() const
Method to check whether this object has texture data.
Definition Context.cpp:2341
+
void setTransformationMatrix(float(&T)[16])
Method to set the Affine transformation matrix of a Compound Object.
Definition Context.cpp:2509
+
helios::ObjectType getObjectType() const
Get an enumeration specifying the type of the object.
Definition Context.cpp:2247
+
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition Context.cpp:2256
+
void getTransformationMatrix(float(&T)[16]) const
Method to return the Affine transformation matrix of a Compound Object.
Definition Context.cpp:2503
+
Cone compound object class.
Definition Context.h:847
+
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the cone object.
Definition Context.cpp:4171
+
std::vector< helios::vec3 > getNodeCoordinates() const
Get the Cartesian coordinates of each of the cone object nodes.
Definition Context.cpp:4130
+
std::vector< float > getNodeRadii() const
Get the radius at each of the cone object nodes.
Definition Context.cpp:4159
+
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition Context.cpp:7139
+
std::vector< uint > loadPLY(const char *filename, bool silent=false)
Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
+
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
+
Disk * getDiskObjectPointer(uint ObjID) const
Get a pointer to a Disk Compound Object.
Definition Context.cpp:4022
+
std::vector< uint > getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs) const
Method to return unique parent object IDs for a vector of primitive UUIDs.
Definition Context.cpp:7022
+
void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
Load tabular weather data from text file into timeseries.
+
Box * getBoxObjectPointer(uint ObjID) const
Get a pointer to a Box Compound Object.
Definition Context.cpp:3954
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
Cone * getConeObjectPointer(uint ObjID) const
Get a pointer to a Cone Compound Object.
Definition Context.cpp:4123
+
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition Context.cpp:2574
+
std::vector< std::string > getLoadedXMLFiles()
Get names of XML files that are currently loaded.
+
void setDate(int day, int month, int year)
Set simulation date by day, month, year.
Definition Context.cpp:1059
+
void setPrimitiveParentObjectID(uint UUID, uint objID)
Method to set the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:6988
+
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition Context.cpp:7179
+
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition Context.cpp:6984
+
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
+
float getPrimitiveSolidFraction(uint UUID) const
Get fraction of primitive surface area that is non-transparent.
Definition Context.cpp:7221
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition Context.cpp:2907
+
void writeOBJ(const std::string &filename) const
Write geometry in the Context to a Wavefront file (.obj)
+
helios::Time getTime() const
Get the simulation time.
Definition Context.cpp:1166
+
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
+
Sphere * getSphereObjectPointer(uint ObjID) const
Get a pointer to a Sphere Compound Object.
Definition Context.cpp:3410
+
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition Context.cpp:7197
+
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
+
helios::Date getDate() const
Get simulation date.
Definition Context.cpp:1099
+
size_t getGlobalDataSize(const char *label) const
Get the size/length of global data.
+
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition Context.cpp:2585
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
void writePLY(const char *filename) const
Write geometry in the Context to a Stanford polygon file (.ply)
+
void setGlobalData(const char *label, const int &data)
Add global data value (int)
+
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition Context.cpp:7217
+
Tube * getTubeObjectPointer(uint ObjID) const
Get a pointer to a Tube Compound Object.
Definition Context.cpp:3486
+
void writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const
Write primitive data to an ASCII text file for all primitives in the Context.
+
void writeXML(const char *filename, bool quiet=false) const
Write Context geometry and data to XML file for all UUIDs in the context.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition Context.cpp:3312
+
static bool scanXMLForTag(const std::string &filename, const std::string &tag, const std::string &label="")
Scan a Helios XML file to check if a tag exists.
+
void writeXML_byobject(const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const
Write Context geometry and data to XML file for a subset of compound object IDs in the context.
+
void setTime(int minute, int hour)
Set simulation time.
Definition Context.cpp:1136
+
void setPrimitiveTransformationMatrix(uint UUID, float(&T)[16])
Method to set the Affine transformation matrix of a Primitive.
Definition Context.cpp:7112
+
Disk compound object class.
Definition Context.h:795
+
vec2 getSize() const
Get the lateral dimensions of the disk object.
Definition Context.cpp:4029
+
int2 getSubdivisionCount() const
Get the number of sub-triangle divisions of the disk object.
Definition Context.cpp:4061
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the disk object.
Definition Context.cpp:4045
+
Sphere compound object class.
Definition Context.h:624
+
uint getSubdivisionCount() const
Get the number of sub-patch divisions of the sphere object.
Definition Context.cpp:3455
+
helios::vec3 getRadius() const
Get the radius of the sphere.
Definition Context.cpp:3417
+
vec3 getCenter() const
Get the Cartesian coordinates of the center of the sphere object.
Definition Context.cpp:3439
+
Tile compound object class.
Definition Context.h:581
+
helios::int2 getSubdivisionCount() const
Get the number of sub-patch divisions of the tile.
Definition Context.cpp:3343
+
Tube compound object class.
Definition Context.h:660
+
std::vector< float > getNodeRadii() const
Get the radius at each of the tube object nodes.
Definition Context.cpp:3508
+
std::vector< helios::RGBcolor > getNodeColors() const
Get the colors at each of the tube object nodes.
Definition Context.cpp:3525
+
std::vector< helios::vec3 > getNodes() const
Get the Cartesian coordinates of each of the tube object nodes.
Definition Context.cpp:3493
+
uint getSubdivisionCount() const
Get the number of sub-triangle divisions of the tube object.
Definition Context.cpp:3533
+
static int parse_data_vec3(const pugi::xml_node &node_data, std::vector< vec3 > &data)
Parse vector data of type 'vec3' within an XML tag.
+
static int parse_data_int2(const pugi::xml_node &node_data, std::vector< int2 > &data)
Parse vector data of type 'int2' within an XML tag.
+
static int parse_radius(const pugi::xml_node &node_data, std::vector< float > &radius)
Parse the value within a <radius> (radius at nodes of a tube or cone) tag.
+
static int parse_data_float(const pugi::xml_node &node_data, std::vector< float > &data)
Parse vector data of type 'float' within an XML tag.
+
static int parse_transform(const pugi::xml_node &node_data, float(&transform)[16])
Parse the value within a <transform> (transformation matrix) tag.
+
static int parse_data_uint(const pugi::xml_node &node_data, std::vector< uint > &data)
Parse vector data of type 'uint' within an XML tag.
+
static int parse_subdivisions(const pugi::xml_node &node_data, uint &subdivisions)
Parse the value within a <subdivisions> (object sub-primitive resolution) tag.
+
static int parse_data_vec4(const pugi::xml_node &node_data, std::vector< vec4 > &data)
Parse vector data of type 'vac4' within an XML tag.
+
static int parse_data_int3(const pugi::xml_node &node_data, std::vector< int3 > &data)
Parse vector data of type 'int3' within an XML tag.
+
static int parse_data_string(const pugi::xml_node &node_data, std::vector< std::string > &data)
Parse vector data of type 'string' within an XML tag.
+
static int parse_data_int(const pugi::xml_node &node_data, std::vector< int > &data)
Parse vector data of type 'int' within an XML tag.
+
static int parse_texture(const pugi::xml_node &node_data, std::string &texture)
Parse the value within an <texture> (path to image texture) tag.
+
static int parse_data_vec2(const pugi::xml_node &node_data, std::vector< vec2 > &data)
Parse vector data of type 'vec2' within an XML tag.
+
static int parse_data_double(const pugi::xml_node &node_data, std::vector< double > &data)
Parse vector data of type 'double' within an XML tag.
+
static int parse_solid_fraction(const pugi::xml_node &node_data, float &solid_fraction)
Parse the value within a <solid_fraction> (primitive solid fraction) tag.
+
static int parse_objID(const pugi::xml_node &node_data, uint &objID)
Parse the value within an <objID> (object ID) tag.
+
static int parse_textureUV(const pugi::xml_node &node_data, std::vector< vec2 > &uvs)
Parse the value within a <textureUV> (texture coordinates) tag.
+
static int parse_nodes(const pugi::xml_node &node_data, std::vector< vec3 > &nodes)
Parse the value within a <nodes> (coordinates defining nodes of a tube or cone) tag.
+
static int parse_data_int4(const pugi::xml_node &node_data, std::vector< int4 > &data)
Parse vector data of type 'int4' within an XML tag.
+
static int parse_vertices(const pugi::xml_node &node_data, std::vector< float > &vertices)
Parse the value within a <vertices> (primitive vertex coordinates) tag.
+
bool parse_double(const std::string &input_string, double &converted_double)
Convert a string into a double with error checking.
Definition global.cpp:779
+
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition global.cpp:140
+
bool parse_float(const std::string &input_string, float &converted_float)
Convert a string into a float with error checking.
Definition global.cpp:763
+
bool parse_uint(const std::string &input_string, uint &converted_uint)
Convert a string into an unsigned integer with error checking.
Definition global.cpp:842
+
std::string getFileExtension(const std::string &filepath)
Parse a file string to get the extension.
Definition global.cpp:3075
+
bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
Definition global.cpp:3102
+
std::string getFileName(const std::string &filepath)
Parse a file string to get the filename including extension.
Definition global.cpp:3085
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
bool parse_int(const std::string &input_string, int &converted_int)
Convert a string into an integer with error checking.
Definition global.cpp:794
+
vec3 nullorigin
Default null vec3 that gives the origin (0,0,0)
Definition global.cpp:58
+
std::string getFileStem(const std::string &filepath)
Parse a file string to get the filename without extension.
Definition global.cpp:3080
+
void makeIdentityMatrix(float(&T)[16])
Construct an identity matrix.
Definition global.cpp:555
+
std::string getFilePath(const std::string &filepath, bool trailingslash=true)
Parse a file string to get the path (i.e., portion of the string before the file name).
Definition global.cpp:3090
+
SphericalCoord nullrotation
Default null SphericalCoord that applies no rotation.
Definition global.cpp:57
+
uint addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
Add new Disk geometric primitive to the Context given its center, and size.
Definition Context.cpp:5256
+
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:4728
+
uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone compound object to the Context.
Definition Context.cpp:5426
+
uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
Add a rectangular prism tessellated with Patch primitives.
Definition Context.cpp:5000
+
uint addPolymeshObject(const std::vector< uint > &UUIDs)
Add new Polymesh Compound Object.
Definition Context.cpp:5399
+
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:4550
+
uint addSphereObject(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition Context.cpp:4310
+
vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
Function to rotate a 3D vector given spherical angles elevation and azimuth.
Definition global.cpp:79
+
vec2 string2vec2(const char *str)
Convert a space-delimited string into a vec2 vector.
Definition global.cpp:623
+
int2 string2int2(const char *str)
Convert a space-delimited string into an int2 vector.
Definition global.cpp:683
+
std::string trim_whitespace(const std::string &input)
Remove leading and trailing whitespace from a string.
Definition global.cpp:1016
+
vec3 string2vec3(const char *str)
Convert a space-delimited string into a vec3 vector.
Definition global.cpp:643
+
RGBAcolor string2RGBcolor(const char *str)
Convert a space-delimited string into an RGBcolor vector.
Definition global.cpp:743
+
int3 string2int3(const char *str)
Convert a space-delimited string into an int3 vector.
Definition global.cpp:703
+
std::vector< std::string > separate_string_by_delimiter(const std::string &inputstring, const std::string &delimiter)
Separate string by delimiter and store into a vector.
Definition global.cpp:1032
+
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition Context.cpp:1328
+
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition Context.cpp:1372
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
Time queryTimeseriesTime(const char *label, uint index) const
Get the time associated with a timeseries data point.
Definition Context.cpp:1958
+
void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
Add a data point to timeseries of data.
Definition Context.cpp:1823
+
Date queryTimeseriesDate(const char *label, uint index) const
Get the date associated with a timeseries data point.
Definition Context.cpp:1994
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
Time make_Time(int hour, int minute)
Make a Time vector.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
+
Date make_Date(int day, int month, int year)
Make a Date vector.
+
Date Julian2Calendar(int JulianDay, int year)
Convert a Julian day to a calendar Date vector.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+ +
int month
Month of year.
+
void incrementDay()
Increment Date vector by one day.
Definition global.cpp:202
+
int day
Day of month.
+
int year
Year in YYYY format.
+
Structure for Global Data Entities.
Definition Context.h:102
+
R-G-B-A color vector.
+
float r
Red color component.
+
float a
Alpha (transparency) component.
+
float b
Blue color component.
+
float g
Green color component.
+
R-G-B color vector.
+
float b
Blue color component.
+
float r
Red color component.
+
void scale(float scale_factor)
Scale RGBcolor by some factor.
+
float g
Green color component.
+
Vector of spherical coordinates (elevation,azimuth)
+ +
int second
Second of minute.
+
int hour
Hour of day.
+
int minute
Minute of hour.
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of three elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int y
Second element in vector.
+
Vector of four elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int w
Fourth element in vector.
+
int y
Second element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+
Vector of four elements of type 'float'.
+
float y
Second element in vector.
+
float w
Fourth element in vector.
+
float z
Third element in vector.
+
float x
First element in vector.
+ diff --git a/doc/html/_convert_p_l_y.html b/doc/html/_convert_p_l_y.html index 085f6e62e..5d2ea57f5 100644 --- a/doc/html/_convert_p_l_y.html +++ b/doc/html/_convert_p_l_y.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Converting polygon file formats to .ply using Blender
+
Converting polygon file formats to .ply using Blender

The following steps detail how to use Blender to convert various polygon file formats to .ply format. TurboSquid is a great place to find free 3D polygon models in many different formats. Note that in order to search only for free models, it is necessary to set the appropriate price range in the Price filter.

@@ -104,7 +116,8 @@
+
diff --git a/doc/html/_dependent_software.html b/doc/html/_dependent_software.html index 669665583..fc567823c 100644 --- a/doc/html/_dependent_software.html +++ b/doc/html/_dependent_software.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Install and Set-up
+
Install and Set-up
diff --git a/doc/html/_dummy.html b/doc/html/_dummy.html index 1d94ae55b..b9fb61255 100644 --- a/doc/html/_dummy.html +++ b/doc/html/_dummy.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Dummy Model Plugin Documentation
+
Dummy Model Plugin Documentation

Table of Contents

-

@@ -103,7 +120,8 @@

+
diff --git a/doc/html/_dummy_model_8cpp.html b/doc/html/_dummy_model_8cpp.html index e3e13a4a7..2aa861e24 100644 --- a/doc/html/_dummy_model_8cpp.html +++ b/doc/html/_dummy_model_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
DummyModel.cpp File Reference
@@ -102,7 +114,8 @@
+
diff --git a/doc/html/_dummy_model_8cpp_source.html b/doc/html/_dummy_model_8cpp_source.html index bcdd63361..7e3955fde 100644 --- a/doc/html/_dummy_model_8cpp_source.html +++ b/doc/html/_dummy_model_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
DummyModel.cpp
@@ -95,6 +107,7 @@ Go to the documentation of this file.
1
5#include "DummyModel.h"
6
+
8 std::cout << "Initializing dummy model..." << std::flush;
9
@@ -102,7 +115,9 @@
11
12 std::cout << "done." << std::endl;
13}
+
14
+
15void DummyModel::run( void ){
16
17 std::cout << "Running dummy model..." << std::flush;
@@ -117,16 +132,18 @@
26
27 std::cout << "done." << std::endl;
28}
+
29
-
DummyModel(helios::Context *context)
Constructor.
Definition: DummyModel.cpp:7
-
void run(void)
Function to run the dummy model.
Definition: DummyModel.cpp:15
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition: Context.cpp:1759
+
DummyModel(helios::Context *context)
Constructor.
Definition DummyModel.cpp:7
+
void run(void)
Function to run the dummy model.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition Context.cpp:1759
+
diff --git a/doc/html/_dummy_model_8h.html b/doc/html/_dummy_model_8h.html index dd9f92295..17c70d58b 100644 --- a/doc/html/_dummy_model_8h.html +++ b/doc/html/_dummy_model_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -111,7 +123,8 @@
+ diff --git a/doc/html/_dummy_model_8h_source.html b/doc/html/_dummy_model_8h_source.html index 2e961b819..03110dfa7 100644 --- a/doc/html/_dummy_model_8h_source.html +++ b/doc/html/_dummy_model_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
DummyModel.h
@@ -96,10 +108,11 @@
5#include "Context.h"
6
8
+
10public:
11
-
13 DummyModel( helios::Context* context );
+
13 DummyModel( helios::Context* context );
14
16 void run( void );
17
@@ -108,14 +121,17 @@
21 helios::Context* context;
22
23};
+
-
Dummy model class.
Definition: DummyModel.h:9
-
void run(void)
Function to run the dummy model.
Definition: DummyModel.cpp:15
-
Stores the state associated with simulation.
Definition: Context.h:1882
+
Dummy model class.
Definition DummyModel.h:9
+
DummyModel(helios::Context *context)
Constructor.
Definition DummyModel.cpp:7
+
void run(void)
Function to run the dummy model.
+
Stores the state associated with simulation.
Definition Context.h:1882
+ diff --git a/doc/html/_energy_balance_doc.html b/doc/html/_energy_balance_doc.html index 7b28fcf95..9e8debd39 100644 --- a/doc/html/_energy_balance_doc.html +++ b/doc/html/_energy_balance_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
-
Energy Balance Model Plugin Documentation
+
Energy Balance Model Plugin Documentation
@@ -136,13 +182,13 @@

Package
-td
+
-td
+
-td + NVIDIA CUDA 9.0+ Mac OSX:
$ brew install Caskroom/cask/cuda
Use CUDA installer Use CUDA installer @@ -281,7 +327,7 @@

energybalance.addRadiationBand("PAR");
energybalance.addRadiationBand("NIR");
energybalance.addRadiationBand("LW");
-
Energy balance model class.
+
Energy balance model class.

Boundary-layer Conductance Model

The primitive boundary-layer conductance can either be set using the BLConductanceModel plug-in, or using the default model which is the Polhausen equation. Note also that custom conductance values can also be provided by setting the value of primitive data labeled 'boundarylayer_conductance', which overrides the computed model value.

@@ -340,10 +386,10 @@

return 0;
}
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.

Unsteady model with heat storage

Additional functions are available to run the unsteady energy balance model with heat storage. If the timestep argument "dt" is passed with value greater than 0, and the heat capacity $C_p$ is greater than 0, the unsteady energy balance equation will be applied with the heat storage term included. The equation is discretized in time using a forward Euler scheme in order to solve for the surface temperature at time $t+\Delta t$

@@ -397,12 +443,13 @@

return 0;
}
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.

+
diff --git a/doc/html/_energy_balance_model_8cpp.html b/doc/html/_energy_balance_model_8cpp.html index 51167ef0a..648083d98 100644 --- a/doc/html/_energy_balance_model_8cpp.html +++ b/doc/html/_energy_balance_model_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
EnergyBalanceModel.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_energy_balance_model_8cpp_source.html b/doc/html/_energy_balance_model_8cpp_source.html index 7a6972cfe..b3a2bcfaa 100644 --- a/doc/html/_energy_balance_model_8cpp_source.html +++ b/doc/html/_energy_balance_model_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
EnergyBalanceModel.cpp
@@ -97,6 +109,7 @@
17
18using namespace helios;
19
+
21
22 //All default values set here
@@ -125,7 +138,9 @@
45 context = __context;
46
47}
+
48
+
50
51 std::cout << "Running energy balance model self-test..." << std::flush;
@@ -409,27 +424,37 @@
329 return 0;
330
331}
+
332
+
334 message_flag = true;
335}
+
336
+
338 message_flag = false;
339}
+
340
+
342 if( std::find(radiation_bands.begin(),radiation_bands.end(),band)==radiation_bands.end()) { //only add band if it doesn't exist
343 radiation_bands.emplace_back(band);
344 }
345}
+
346
+
347void EnergyBalanceModel::addRadiationBand( const std::vector<std::string> &bands ){
348 for( auto &band : bands ){
349 addRadiationBand(band.c_str());
350 }
351}
+
352
+
354
355 if( strcmp(label,"boundarylayer_conductance_out")==0 || strcmp(label,"vapor_pressure_deficit")==0 ){
@@ -439,11 +464,15 @@
359 }
360
361}
+
362
+
366
+
367void EnergyBalanceModel::printDefaultValueReport(const std::vector<uint> &UUIDs) const {
368
369 size_t assumed_default_TL = 0;
@@ -572,32 +601,34 @@
492 std::cout << "------------------------------------------------------" << std::endl;
493
494}
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
+
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
-
Energy balance model class.
-
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
-
void enableMessages()
Enable standard output from this plug-in (default)
-
void addRadiationBand(const char *band)
Add the label of a radiation band in the RadiationModel plug-in that should be used in calculation of...
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
void disableMessages()
Disable standard output from this plug-in.
-
void run()
Function to run the energy balance model for all primitives in the Context.
-
int selfTest()
Self-test.
-
EnergyBalanceModel(helios::Context *context)
Constructor.
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition: Context.cpp:1328
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
Energy balance model class.
+
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
+
void enableMessages()
Enable standard output from this plug-in (default)
+
void addRadiationBand(const char *band)
Add the label of a radiation band in the RadiationModel plug-in that should be used in calculation of...
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
void disableMessages()
Disable standard output from this plug-in.
+
void run()
Function to run the energy balance model for all primitives in the Context.
+ +
EnergyBalanceModel(helios::Context *context)
Constructor.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition Context.cpp:1328
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+ diff --git a/doc/html/_energy_balance_model_8cu.html b/doc/html/_energy_balance_model_8cu.html index 30ae2dc93..e0e6e048e 100644 --- a/doc/html/_energy_balance_model_8cu.html +++ b/doc/html/_energy_balance_model_8cu.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Macros | @@ -102,16 +114,16 @@ - +

Macros

#define CUDA_CHECK_ERROR(ans)   { gpuAssert((ans), __FILE__, __LINE__); }
#define CUDA_CHECK_ERROR(ans)
 
- + - + - +

Functions

void gpuAssert (cudaError_t code, const char *file, int line, bool abort=true)
void gpuAssert (cudaError_t code, const char *file, int line, bool abort=true)
 
__device__ float evaluateEnergyBalance (float T, float R, float Qother, float eps, float Ta, float ea, float pressure, float gH, float gS, uint Nsides, float stomatal_sidedness, float heatcapacity, float surfacehumidity, float dt, float Tprev)
__device__ float evaluateEnergyBalance (float T, float R, float Qother, float eps, float Ta, float ea, float pressure, float gH, float gS, uint Nsides, float stomatal_sidedness, float heatcapacity, float surfacehumidity, float dt, float Tprev)
 
__global__ void solveEnergyBalance (uint Nprimitives, float *To, float *R, float *Qother, float *eps, float *Ta, float *ea, float *pressure, float *gH, float *gS, uint *Nsides, float *stomatal_sidedness, float *TL, float *heatcapacity, float *surfacehumidity, float dt)
__global__ void solveEnergyBalance (uint Nprimitives, float *To, float *R, float *Qother, float *eps, float *Ta, float *ea, float *pressure, float *gH, float *gS, uint *Nsides, float *stomatal_sidedness, float *TL, float *heatcapacity, float *surfacehumidity, float dt)
 

Detailed Description

@@ -131,13 +143,13 @@

#define CUDA_CHECK_ERROR ( -   - ans) -    { gpuAssert((ans), __FILE__, __LINE__); } + ans) +

@@ -152,97 +164,77 @@

__device__ float evaluateEnergyBalance ( - float  - T, + float T, - float  - R, + float R, - float  - Qother, + float Qother, - float  - eps, + float eps, - float  - Ta, + float Ta, - float  - ea, + float ea, - float  - pressure, + float pressure, - float  - gH, + float gH, - float  - gS, + float gS, - uint  - Nsides, + uint Nsides, - float  - stomatal_sidedness, + float stomatal_sidedness, - float  - heatcapacity, + float heatcapacity, - float  - surfacehumidity, + float surfacehumidity, - float  - dt, + float dt, - float  - Tprev  - - - - ) - + float Tprev )

@@ -418,7 +380,8 @@

+

diff --git a/doc/html/_energy_balance_model_8cu_source.html b/doc/html/_energy_balance_model_8cu_source.html index 3d8437712..ec4af80df 100644 --- a/doc/html/_energy_balance_model_8cu_source.html +++ b/doc/html/_energy_balance_model_8cu_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
EnergyBalanceModel.cu
@@ -195,19 +207,26 @@
115
116}
117
+
119 run( context->getAllUUIDs() );
120}
+
121
+
122void EnergyBalanceModel::run( float dt ){
123 run( context->getAllUUIDs(), dt );
124}
+
125
+
126void EnergyBalanceModel::run( const std::vector<uint> &UUIDs ){
127 run( UUIDs, 0.f);
128}
+
129
130
+
131void EnergyBalanceModel::run( const std::vector<uint> &UUIDs, float dt ){
132
133 if( message_flag ){
@@ -593,25 +612,27 @@
513 }
514
515}
+
516
517
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
-
void run()
Function to run the energy balance model for all primitives in the Context.
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:7017
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition: Context.cpp:7920
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
+
void run()
Function to run the energy balance model for all primitives in the Context.
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:7017
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition Context.cpp:7920
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+ diff --git a/doc/html/_energy_balance_model_8h.html b/doc/html/_energy_balance_model_8h.html index 303e63c12..86965c5e7 100644 --- a/doc/html/_energy_balance_model_8h.html +++ b/doc/html/_energy_balance_model_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -114,7 +126,8 @@
+ diff --git a/doc/html/_energy_balance_model_8h_source.html b/doc/html/_energy_balance_model_8h_source.html index b57c11c64..c2dbdd94f 100644 --- a/doc/html/_energy_balance_model_8h_source.html +++ b/doc/html/_energy_balance_model_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
EnergyBalanceModel.h
@@ -99,11 +111,12 @@
19#include "Context.h"
20
22
+
24public:
25
27
- +
31
33
36 int selfTest();
@@ -166,22 +179,25 @@
131 std::vector<std::string> output_prim_data;
132
133};
+
134
135#endif
-
Energy balance model class.
-
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
-
void enableMessages()
Enable standard output from this plug-in (default)
-
void addRadiationBand(const char *band)
Add the label of a radiation band in the RadiationModel plug-in that should be used in calculation of...
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
void disableMessages()
Disable standard output from this plug-in.
-
void run()
Function to run the energy balance model for all primitives in the Context.
-
int selfTest()
Self-test.
-
Stores the state associated with simulation.
Definition: Context.h:1882
+
Energy balance model class.
+
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
+
void enableMessages()
Enable standard output from this plug-in (default)
+
void addRadiationBand(const char *band)
Add the label of a radiation band in the RadiationModel plug-in that should be used in calculation of...
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
void disableMessages()
Disable standard output from this plug-in.
+
void run()
Function to run the energy balance model for all primitives in the Context.
+ +
EnergyBalanceModel(helios::Context *context)
Constructor.
+
Stores the state associated with simulation.
Definition Context.h:1882
+ diff --git a/doc/html/_i_o.html b/doc/html/_i_o.html index 1d1a9d005..b531ef0ff 100644 --- a/doc/html/_i_o.html +++ b/doc/html/_i_o.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
File Input/Output
+
File Input/Output
A very important note with regard to File Input/Output is that all file paths need to be given with respect to the current build directory or as absolute paths.

@@ -106,33 +118,33 @@ Primitive TypeCode Sample Patch
 <patch>
-     <center>0 0 0</center>
-     <size>1 1</size>
-     <rotation>0 0</rotation> <!-- OPTIONAL -->
-     <color>1 0 0</color> <!-- OPTIONAL -->
-     <texture>"grass.jpg"</texture> <!-- OPTIONAL -->
-  </patch>
+ <center>0 0 0</center> + <size>1 1</size> + <rotation>0 0</rotation> <!-- OPTIONAL --> + <color>1 0 0</color> <!-- OPTIONAL --> + <texture>"grass.jpg"</texture> <!-- OPTIONAL --> + </patch>

Triangle
 <triangle>
-     <vertex>0 0 0</vertex>
-     <vertex>1 0 0</vertex>
-     <vertex>1 1 0</vertex>
-     <color>1 0 0</color>
-  </triangle>
+ <vertex>0 0 0</vertex> + <vertex>1 0 0</vertex> + <vertex>1 1 0</vertex> + <color>1 0 0</color> + </triangle>
Disk
 <disk>
-     <center>0 0 0</center>
-     <size>1 1</size>
-     <rotation>0 0</rotation>
-     <color>1 0 0</color>
-     <texture>"grass.jpg"</texture>
-  </disk>
+ <center>0 0 0</center> + <size>1 1</size> + <rotation>0 0</rotation> + <color>1 0 0</color> + <texture>"grass.jpg"</texture> + </disk>
Voxel
 <voxel>
-     <center>0 0 0</center>
-     <size>1 1 1</size>
-     <color>1 0 0</color>
-  </voxel>
+ <center>0 0 0</center> + <size>1 1 1</size> + <color>1 0 0</color> + </voxel>

Adding Timeseries Data

@@ -211,11 +223,11 @@

}
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
Load tabular weather data from text file into timeseries.
-
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition: Context.cpp:1894
- - +
Stores the state associated with simulation.
Definition Context.h:1882
+
void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
Load tabular weather data from text file into timeseries.
+
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition Context.cpp:1894
+ +

The above example would read the comma-delimited file "../input/weatherfile.csv". Timeseries data would be added to the Context for values of "temperature", which could be queried based on this label.

Reading XML Files

@@ -229,7 +241,7 @@

context.loadXML( "file.xml" );
}
-
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
+
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.

Reading Standard Polygon File Formats

@@ -257,10 +269,10 @@

context.loadPLY( "file.ply", origin, scale, rotation, color );
}
-
std::vector< uint > loadPLY(const char *filename, bool silent=false)
Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
-
R-G-B color vector.
-
Vector of spherical coordinates (elevation,azimuth)
-
Vector of three elements of type 'float'.
+
std::vector< uint > loadPLY(const char *filename, bool silent=false)
Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
+
R-G-B color vector.
+
Vector of spherical coordinates (elevation,azimuth)
+
Vector of three elements of type 'float'.

There are other forms of the loadPLY function that allow for translation, rotation, and scaling of the entire PLY model.

Different applications may utilize different coordinate axes in .ply files. In computer graphics applications, it is common to define the y-axis as the up direction. Helios uses a z-up coordinate system. By default helios::Context::loadPLY() assumes that the coordinate system used when creating the .ply file is y-up. There is an optional argument helios::Context::loadPLY() that can allow you to easily define the up-axis.

The Blender software package (www.blender.org) can easily modify and convert most polygon file formats to .ply format. This page gives a tutorial on how to perform such conversions using Blender.

@@ -298,7 +310,7 @@

context.loadOBJ("relative/path/to/someobjfile.obj", make_vec3(0,0,0), 0, nullrotation, RGB::red );
}
-
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
+
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...

Writing PLY (Stanford Polygon) Files

The Context has analogous files for writing PLY files based on the geometry currently loaded in the Context. This is accomplished via the writePLY() command, as illustrated below.

@@ -314,8 +326,8 @@

context.writePLY( "file.ply" );
}
-
void writePLY(const char *filename) const
Write geometry in the Context to a Stanford polygon file (.ply)
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
+
void writePLY(const char *filename) const
Write geometry in the Context to a Stanford polygon file (.ply)
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212

Writing OBJ (Wavefront) Files

Writing Wavefront OBJ files is similar to writing a PLY file, except that it will produce both a .obj file containing the geometry, and a .mtl file defining materials (colors, texture masks). For this reason, only the base file name with no extension is provided to the function.

@@ -332,7 +344,7 @@

context.writeOBJ( "file" );
}
-
void writeOBJ(const std::string &filename) const
Write geometry in the Context to a Wavefront file (.obj)
+
void writeOBJ(const std::string &filename) const
Write geometry in the Context to a Wavefront file (.obj)

Exporting Project to XML File Format

All geometry and global/primitive data loaded into the Context can be written to an XML file using the writeXML() function, which can be later read back in using the loadXML(). This functionality can be used to save progress during a simulation run, or to ensure that consistent geometry is always used across simulation runs, among other things.

@@ -351,8 +363,8 @@

context.writeXML( "file.xml" );
}
-
void writeXML(const char *filename, bool quiet=false) const
Write Context geometry and data to XML file for all UUIDs in the context.
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
void writeXML(const char *filename, bool quiet=false) const
Write Context geometry and data to XML file for all UUIDs in the context.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.

and later read back into a new simulation:

#include "Context.h"
using namespace helios;
@@ -385,13 +397,14 @@

context.writePrimitiveData( "file.txt", columns );
}
-
void writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const
Write primitive data to an ASCII text file for all primitives in the Context.
+
void writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const
Write primitive data to an ASCII text file for all primitives in the Context.

By default, column header labels will not be written, but if the optional third argument is set as "true" the label of the primitive data for each column will be written to the first line of the file.

+ diff --git a/doc/html/_input_output_8cpp.html b/doc/html/_input_output_8cpp.html index 6fe30f008..c1dd8ab80 100644 --- a/doc/html/_input_output_8cpp.html +++ b/doc/html/_input_output_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -100,7 +112,7 @@ - +

Functions

size_t findShootClosingBracket (const std::string &lstring)
size_t findShootClosingBracket (const std::string &lstring)
 

Detailed Description

@@ -120,8 +132,7 @@

size_t findShootClosingBracket ( - const std::string &  - lstring) + const std::string & lstring) @@ -134,7 +145,8 @@

+

diff --git a/doc/html/_input_output_8cpp_source.html b/doc/html/_input_output_8cpp_source.html index d58dc2741..0f7783e5c 100644 --- a/doc/html/_input_output_8cpp_source.html +++ b/doc/html/_input_output_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
InputOutput.cpp
@@ -823,36 +835,37 @@
743
744}
-
uint addPlantInstance(const helios::vec3 &base_position, float current_age)
Create an instance of a plant.
-
uint addChildShoot(uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
Manually add a child shoot at the axillary bud of a phytomer.
-
int appendPhytomerToShoot(uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
Add a new phytomer at the terminal bud of a shoot.
-
std::map< std::string, ShootParameters > getCurrentShootParameters()
Get the shoot parameters structure for all shoot types in the current plant model.
-
uint addBaseStemShoot(uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has ...
-
void defineShootType(const std::string &shoot_type_label, const ShootParameters &shoot_params)
Define a new shoot type based on a set of ShootParameters.
-
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition: Context.cpp:49
-
float parse_xml_tag_float(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
Parse an XML tag containing a float value.
Definition: global.cpp:954
-
vec3 parse_xml_tag_vec3(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
Parse an XML tag containing a vec3 value (i.e., three space delimited floats)
Definition: global.cpp:978
-
std::string getFileExtension(const std::string &filepath)
Parse a file string to get the extension.
Definition: global.cpp:3075
-
bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
Definition: global.cpp:3102
-
std::string getFileName(const std::string &filepath)
Parse a file string to get the filename including extension.
Definition: global.cpp:3085
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
std::string parse_xml_tag_string(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
Parse an XML tag containing a string.
Definition: global.cpp:990
-
int parse_xml_tag_int(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
Parse an XML tag containing an integer value.
Definition: global.cpp:942
-
float rad2deg(float rad)
Convert radians to degrees.
Definition: global.cpp:580
-
float deg2rad(float deg)
Convert degrees to radians.
Definition: global.cpp:576
-
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition: global.cpp:1146
- - -
void(* phytomer_creation_function)(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
- -
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
+
uint addPlantInstance(const helios::vec3 &base_position, float current_age)
Create an instance of a plant.
+
uint addChildShoot(uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
Manually add a child shoot at the axillary bud of a phytomer.
+
int appendPhytomerToShoot(uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
Add a new phytomer at the terminal bud of a shoot.
+
std::map< std::string, ShootParameters > getCurrentShootParameters()
Get the shoot parameters structure for all shoot types in the current plant model.
+
uint addBaseStemShoot(uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has ...
+
void defineShootType(const std::string &shoot_type_label, const ShootParameters &shoot_params)
Define a new shoot type based on a set of ShootParameters.
+
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition Context.cpp:49
+
float parse_xml_tag_float(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
Parse an XML tag containing a float value.
Definition global.cpp:954
+
vec3 parse_xml_tag_vec3(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
Parse an XML tag containing a vec3 value (i.e., three space delimited floats)
Definition global.cpp:978
+
std::string getFileExtension(const std::string &filepath)
Parse a file string to get the extension.
Definition global.cpp:3075
+
bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
Definition global.cpp:3102
+
std::string getFileName(const std::string &filepath)
Parse a file string to get the filename including extension.
Definition global.cpp:3085
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
std::string parse_xml_tag_string(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
Parse an XML tag containing a string.
Definition global.cpp:990
+
int parse_xml_tag_int(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
Parse an XML tag containing an integer value.
Definition global.cpp:942
+
float rad2deg(float rad)
Convert radians to degrees.
Definition global.cpp:580
+
float deg2rad(float deg)
Convert degrees to radians.
Definition global.cpp:576
+
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition global.cpp:1146
+ + +
void(* phytomer_creation_function)(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
+ +
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+ diff --git a/doc/html/_leaf_optics_8cpp.html b/doc/html/_leaf_optics_8cpp.html index e3372fbb0..3c731bcb9 100644 --- a/doc/html/_leaf_optics_8cpp.html +++ b/doc/html/_leaf_optics_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
LeafOptics.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_leaf_optics_8cpp_source.html b/doc/html/_leaf_optics_8cpp_source.html index e14154a33..c5893fd1f 100644 --- a/doc/html/_leaf_optics_8cpp_source.html +++ b/doc/html/_leaf_optics_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
LeafOptics.cpp
@@ -97,6 +109,7 @@
17using namespace std;
18using namespace helios;
19
+
21 if( message_flag ){
22 std::cout << "Initializing LeafOptics model..." << std::flush;
@@ -237,7 +250,9 @@
157 std::cout << "done." << std::endl;
158 }
159}
+
160
+
162
163 Context context_test;
@@ -252,7 +267,9 @@
172 return 0;
173
174}
+
175
+
176void LeafOptics::run(const std::vector<uint> &UUIDs , const LeafOpticsProperties &leafproperties, const std::string &label) {
177 std::vector<vec2> reflectivities_fit;
178 std::vector<vec2> transmissivities_fit;
@@ -267,7 +284,9 @@
187 context->setPrimitiveData( UUIDs, "transmissivity_spectrum", leaf_transmissivity_label);
188 setProperties(UUIDs, leafproperties);
189}
+
190
+
191void LeafOptics::run(const LeafOpticsProperties &leafproperties, const std::string &label) {
192 std::vector<vec2> reflectivities_fit;
193 std::vector<vec2> transmissivities_fit;
@@ -279,8 +298,10 @@
199 context->setGlobalData(leaf_transmissivity_label.c_str(),HELIOS_TYPE_VEC2,transmissivities_fit.size(),&transmissivities_fit[0]);
200
201}
+
202
203
+
204void LeafOptics::PROSPECT(float numberlayers, float Chlorophyllcontent, float carotenoidcontent, float anthocyancontent, float brownpigments,
205 float watermass, float drymass, float protein, float carbonconstituents, std::vector<float> &reflectivities_fit, std::vector<float> &transmissivities_fit)
206// Implementation of Prospect-PRO, port of public available matlab code
@@ -348,7 +369,9 @@
268 reflectivities_fit.push_back(Ra + Ta * Rsub * t / denom); //(euqation7 in RPOSPECT)
269 }
270}
+
271
+
272void LeafOptics::getLeafSpectra(const LeafOpticsProperties &leafproperties, std::vector<helios::vec2> &reflectivities_fit, std::vector<helios::vec2> &transmissivities_fit) {
273
274 std::vector<float> reflectivities_fit_y, transmissivities_fit_y;
@@ -381,6 +404,7 @@
301 }
302
303}
+
304
305void LeafOptics::surface(float degree, std::vector<float> &reflectivities)
308{
@@ -455,6 +479,7 @@
380 return 0.0;
381}
382
+
383void LeafOptics::setProperties(const std::vector<uint> &UUIDs, const LeafOpticsProperties &leafproperties) {
384
385 context->setPrimitiveData(UUIDs, "chlorophyll", leafproperties.chlorophyllcontent);
@@ -472,39 +497,45 @@
397 context->setPrimitiveData(UUIDs, "cellulose", leafproperties.carbonconstituents);
398 }
399}
+
400
+
402 message_flag = false;
403}
+
404
+
406 message_flag = true;
407}
+
408
-
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition: Context.h:51
+
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition Context.h:51
- -
static int selfTest()
Self-test.
Definition: LeafOptics.cpp:161
-
void getLeafSpectra(const LeafOpticsProperties &leafproperties, std::vector< helios::vec2 > &reflectivities_fit, std::vector< helios::vec2 > &transmissivities_fit)
Get the leaf spectra.
Definition: LeafOptics.cpp:272
-
void run(const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties, const std::string &label)
Run the LeafOptics model to generate reflectivity and transmissivity spectra, create associated globa...
Definition: LeafOptics.cpp:176
-
void PROSPECT(float numberlayers, float Chlorophyllcontent, float carotenoidcontent, float anthocyancontent, float brownpigments, float watermass, float drymass, float protein, float carbonconstituents, std::vector< float > &reflectivities_fit, std::vector< float > &transmissivities_fit)
LeafOptics model kernel.
Definition: LeafOptics.cpp:204
-
LeafOptics(helios::Context *a_context)
Constructor.
Definition: LeafOptics.cpp:20
-
void enableMessages()
Enable command-line output messages from this plug-in.
Definition: LeafOptics.cpp:405
-
void setProperties(const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties)
Set leaf optical properties for a set of primitives.
Definition: LeafOptics.cpp:383
-
void disableMessages()
Disable command-line output messages from this plug-in.
Definition: LeafOptics.cpp:401
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
-
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
-
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
-
void setGlobalData(const char *label, const int &data)
Add global data value (int)
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
LeafOptics model class.
Definition: LeafOptics.h:21
+ +
static int selfTest()
Self-test.
+
void getLeafSpectra(const LeafOpticsProperties &leafproperties, std::vector< helios::vec2 > &reflectivities_fit, std::vector< helios::vec2 > &transmissivities_fit)
Get the leaf spectra.
+
void run(const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties, const std::string &label)
Run the LeafOptics model to generate reflectivity and transmissivity spectra, create associated globa...
+
void PROSPECT(float numberlayers, float Chlorophyllcontent, float carotenoidcontent, float anthocyancontent, float brownpigments, float watermass, float drymass, float protein, float carbonconstituents, std::vector< float > &reflectivities_fit, std::vector< float > &transmissivities_fit)
LeafOptics model kernel.
+
LeafOptics(helios::Context *a_context)
Constructor.
+
void enableMessages()
Enable command-line output messages from this plug-in.
+
void setProperties(const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties)
Set leaf optical properties for a set of primitives.
+
void disableMessages()
Disable command-line output messages from this plug-in.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
+
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
+
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
+
void setGlobalData(const char *label, const int &data)
Add global data value (int)
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
LeafOptics model class.
Definition LeafOptics.h:21
+ diff --git a/doc/html/_leaf_optics_8h.html b/doc/html/_leaf_optics_8h.html index 2f7070b02..76fc40417 100644 --- a/doc/html/_leaf_optics_8h.html +++ b/doc/html/_leaf_optics_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -116,7 +128,8 @@
+ diff --git a/doc/html/_leaf_optics_8h_source.html b/doc/html/_leaf_optics_8h_source.html index 026cc89ba..5336f663d 100644 --- a/doc/html/_leaf_optics_8h_source.html +++ b/doc/html/_leaf_optics_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
LeafOptics.h
@@ -96,6 +108,7 @@
16#include "Context.h"
17
19
+
22
23 float numberlayers = 1.5;
@@ -120,11 +133,13 @@
42 float carbonconstituents): chlorophyllcontent(chlorophyllcontent), carotenoidcontent(carotenoidcontent),
43 anthocyancontent(anthocyancontent), watermass(watermass), drymass(drymass), protein(protein), carbonconstituents(carbonconstituents){}
44};
+
45
+
47public:
48
-
50 LeafOptics( helios::Context* a_context );
+
50 LeafOptics( helios::Context* a_context );
51
53
56 static int selfTest();
@@ -181,21 +196,24 @@
142 bool message_flag = true;
143
144};
+
- -
static int selfTest()
Self-test.
Definition: LeafOptics.cpp:161
-
void getLeafSpectra(const LeafOpticsProperties &leafproperties, std::vector< helios::vec2 > &reflectivities_fit, std::vector< helios::vec2 > &transmissivities_fit)
Get the leaf spectra.
Definition: LeafOptics.cpp:272
-
void run(const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties, const std::string &label)
Run the LeafOptics model to generate reflectivity and transmissivity spectra, create associated globa...
Definition: LeafOptics.cpp:176
-
void PROSPECT(float numberlayers, float Chlorophyllcontent, float carotenoidcontent, float anthocyancontent, float brownpigments, float watermass, float drymass, float protein, float carbonconstituents, std::vector< float > &reflectivities_fit, std::vector< float > &transmissivities_fit)
LeafOptics model kernel.
Definition: LeafOptics.cpp:204
-
void enableMessages()
Enable command-line output messages from this plug-in.
Definition: LeafOptics.cpp:405
-
void setProperties(const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties)
Set leaf optical properties for a set of primitives.
Definition: LeafOptics.cpp:383
-
void disableMessages()
Disable command-line output messages from this plug-in.
Definition: LeafOptics.cpp:401
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
LeafOptics model class.
Definition: LeafOptics.h:21
+ +
static int selfTest()
Self-test.
+
void getLeafSpectra(const LeafOpticsProperties &leafproperties, std::vector< helios::vec2 > &reflectivities_fit, std::vector< helios::vec2 > &transmissivities_fit)
Get the leaf spectra.
+
void run(const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties, const std::string &label)
Run the LeafOptics model to generate reflectivity and transmissivity spectra, create associated globa...
+
void PROSPECT(float numberlayers, float Chlorophyllcontent, float carotenoidcontent, float anthocyancontent, float brownpigments, float watermass, float drymass, float protein, float carbonconstituents, std::vector< float > &reflectivities_fit, std::vector< float > &transmissivities_fit)
LeafOptics model kernel.
+
LeafOptics(helios::Context *a_context)
Constructor.
+
void enableMessages()
Enable command-line output messages from this plug-in.
+
void setProperties(const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties)
Set leaf optical properties for a set of primitives.
+
void disableMessages()
Disable command-line output messages from this plug-in.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
LeafOptics model class.
Definition LeafOptics.h:21
+ diff --git a/doc/html/_li_d_a_r_8cpp.html b/doc/html/_li_d_a_r_8cpp.html index ddb882b20..0ff4effdb 100644 --- a/doc/html/_li_d_a_r_8cpp.html +++ b/doc/html/_li_d_a_r_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -100,9 +112,9 @@ - + - +

Functions

bool sortcol0 (const std::vector< double > &v0, const std::vector< double > &v1)
bool sortcol0 (const std::vector< double > &v0, const std::vector< double > &v1)
 
bool sortcol1 (const std::vector< double > &v0, const std::vector< double > &v1)
bool sortcol1 (const std::vector< double > &v0, const std::vector< double > &v1)
 

Detailed Description

@@ -122,19 +134,12 @@

bool sortcol0 ( - const std::vector< double > &  - v0, + const std::vector< double > & v0, - const std::vector< double > &  - v1  - - - - ) - + const std::vector< double > & v1 )

@@ -176,7 +174,8 @@

+

diff --git a/doc/html/_li_d_a_r_8cpp_source.html b/doc/html/_li_d_a_r_8cpp_source.html index aaaae558d..cd12887e7 100644 --- a/doc/html/_li_d_a_r_8cpp_source.html +++ b/doc/html/_li_d_a_r_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
LiDAR.cpp
@@ -98,6 +110,7 @@
18using namespace std;
19using namespace helios;
20
+
22
23 origin = make_vec3(0,0,0);
@@ -114,6 +127,7 @@
34 data_file = "";
35
36}
+
37
38ScanMetadata::ScanMetadata(const vec3 &a_origin, uint a_Ntheta, float a_thetaMin, float a_thetaMax, uint a_Nphi, float a_phiMin, float a_phiMax, float a_exitDiameter, float a_beamDivergence,
39 const vector<string> &a_columnFormat){
@@ -134,6 +148,7 @@
54
55}
56
+
58
59 float zenith = thetaMin + (thetaMax-thetaMin)/float(Ntheta)*float(row);
@@ -142,7 +157,9 @@
62 return make_SphericalCoord(1,elevation,phi);
63
64};
+
65
+
67
68 float theta = direction.zenith;
@@ -165,7 +182,9 @@
85 return helios::make_int2(row,column);
86
87};
+
88
+
90
91 Nhits=0;
@@ -174,16 +193,21 @@
94 printmessages = true;
95
96}
+
97
98LiDARcloud::~LiDARcloud( void )= default;
99
+
101 printmessages = false;
102}
+
103
+
105 printmessages = true;
106}
+
107
108void LiDARcloud::validateRayDirections() {
109
@@ -212,10 +236,13 @@
132
133}
134
+
136 return scans.size();
137}
+
138
+
140
141 float epsilon = 1e-5;
@@ -247,7 +274,9 @@
167 return scans.size()-1;
168
169}
+
170
+
171void LiDARcloud::addHitPoint(uint scanID, const vec3 &xyz, const SphericalCoord &direction ){
172
173 //default color
@@ -259,6 +288,7 @@
179 addHitPoint( scanID, xyz, direction, color, data );
180
181}
+
182
183void LiDARcloud::addHitPoint(uint scanID, const vec3 &xyz,
184 const SphericalCoord &direction,
@@ -271,6 +301,7 @@
191
192}
193
+
194void LiDARcloud::addHitPoint(uint scanID, const vec3 &xyz,
195 const SphericalCoord &direction,
196 const RGBcolor &color ){
@@ -281,6 +312,7 @@
201 addHitPoint( scanID, xyz, direction, color, data );
202
203}
+
204
205void LiDARcloud::addHitPoint(uint scanID, const vec3 &xyz,
206 const SphericalCoord &direction,
@@ -314,6 +346,7 @@
234
235}
236
+
238
239 if( index>=hits.size() ){
@@ -330,67 +363,87 @@
250 hits.pop_back();
251
252}
+
253
+
255 return hits.size();
256}
+
257
+
259 if( scanID>=scans.size() ){
260 helios_runtime_error("ERROR (LiDARcloud::getScanOrigin): Cannot get origin of scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
261 }
262 return scans.at(scanID).origin;
263}
+
264
+
265uint LiDARcloud::getScanSizeTheta(uint scanID ) const{
266 if( scanID>=scans.size() ){
267 helios_runtime_error("ERROR (LiDARcloud::getScanSizeTheta): Cannot get theta size for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
268 }
269 return scans.at(scanID).Ntheta;
270}
+
271
+
272uint LiDARcloud::getScanSizePhi(uint scanID ) const{
273 if( scanID>=scans.size() ){
274 helios_runtime_error("ERROR (LiDARcloud::getScanSizePhi): Cannot get phi size for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
275 }
276 return scans.at(scanID).Nphi;
277}
+
278
+
280 if( scanID>=scans.size() ){
281 helios_runtime_error("ERROR (LiDARcloud::getScanRangeTheta): Cannot get theta range for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
282 }
283 return helios::make_vec2(scans.at(scanID).thetaMin,scans.at(scanID).thetaMax);
284}
+
285
+
287 if( scanID>=scans.size() ){
288 helios_runtime_error("ERROR (LiDARcloud::getScanRangePhi): Cannot get phi range for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
289 }
290 return helios::make_vec2(scans.at(scanID).phiMin,scans.at(scanID).phiMax);
291}
+
292
+
293float LiDARcloud::getScanBeamExitDiameter(uint scanID ) const{
294 if( scanID>=scans.size() ){
295 helios_runtime_error("ERROR (LiDARcloud::getScanBeamExitDiameter): Cannot get exit diameter for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
296 }
297 return scans.at(scanID).exitDiameter;
298}
+
299
+
300float LiDARcloud::getScanBeamDivergence(uint scanID ) const{
301 if( scanID>=scans.size() ){
302 helios_runtime_error("ERROR (LiDARcloud::getScanBeamDivergence): Cannot get beam divergence for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
303 }
304 return scans.at(scanID).beamDivergence;
305}
+
306
+
307std::vector<std::string> LiDARcloud::getScanColumnFormat(uint scanID ) const{
308 if( scanID>=scans.size() ){
309 helios_runtime_error("ERROR (LiDARcloud::getScanColumnFormat): Cannot get column format for scan #" + std::to_string(scanID) + " because there have only been " + std::to_string(scans.size()) + " scans added.");
310 }
311 return scans.at(scanID).columnFormat;
312}
+
313
+
315
316 if( index>=hits.size() ){
@@ -400,7 +453,9 @@
320 return hits.at(index).position;
321
322}
+
323
+
325
326 if( index>=hits.size() ){
@@ -411,7 +466,9 @@
331 return cart2sphere( direction_cart );
332
333}
+
334
+
335void LiDARcloud::setHitData(uint index, const char* label, double value ){
336
337 if( index>=hits.size() ){
@@ -421,7 +478,9 @@
341 hits.at(index).data[label] = value;
342
343}
+
344
+
345double LiDARcloud::getHitData(uint index, const char* label ) const{
346
347 if( index>=hits.size() ){
@@ -436,7 +495,9 @@
356 return hit_data.at(label);
357
358}
+
359
+
360bool LiDARcloud::doesHitDataExist(uint index, const char* label ) const{
361
362 if( index>=hits.size() ){
@@ -451,7 +512,9 @@
371 }
372
373}
+
374
+
376
377 if( index>=hits.size() ){
@@ -461,7 +524,9 @@
381 return hits.at(index).color;
382
383}
+
384
+
385int LiDARcloud::getHitScanID(uint index ) const{
386
387 if( index>=hits.size() ){
@@ -471,7 +536,9 @@
391 return hits.at(index).scanID;
392
393}
+
394
+
395int LiDARcloud::getHitIndex(uint scanID, uint row, uint column ) const{
396
397 if( scanID>=scans.size() ){
@@ -489,7 +556,9 @@
409
410 return hit;
411}
+
412
+
413int LiDARcloud::getHitGridCell(uint index ) const{
414
415 if( index>=hits.size() ){
@@ -502,7 +571,9 @@
422 return hits.at(index).gridcell;
423
424}
+
425
+
426void LiDARcloud::setHitGridCell(uint index, int cell ){
427
428 if( index>=hits.size() ){
@@ -512,7 +583,9 @@
432 hits.at(index).gridcell = cell;
433
434}
+
435
+
437
438 for( auto & scan : scans){
@@ -524,7 +597,9 @@
444 }
445
446}
+
447
+
448void LiDARcloud::coordinateShift( uint scanID, const vec3 &shift ){
449
450 if( scanID >= scans.size() ) {
@@ -540,7 +615,9 @@
460 }
461
462}
+
463
+
465
466 for( auto & scan : scans){
@@ -553,7 +630,9 @@
473 }
474
475}
+
476
+
477void LiDARcloud::coordinateRotation( uint scanID, const SphericalCoord &rotation ){
478
479 if( scanID >= scans.size() ) {
@@ -570,7 +649,9 @@
490 }
491
492}
+
493
+
494void LiDARcloud::coordinateRotation( float rotation, const vec3 &line_base,
495 const vec3 &line_direction ){
496
@@ -584,11 +665,15 @@
504 }
505
506}
+
507
+
509 return triangles.size();
510}
+
511
+
513 if( index>=triangles.size() ){
514 helios_runtime_error("ERROR (LiDARcloud::getTriangle): Triangle index out of bounds. Tried to get triangle #" + std::to_string(index) + " but point cloud only has " + std::to_string(triangles.size()) + " triangles.");
@@ -597,11 +682,15 @@
517 return triangles.at(index);
518
519}
+
520
+
521void LiDARcloud::addHitsToVisualizer( Visualizer* visualizer, uint pointsize ) const{
522 addHitsToVisualizer( visualizer, pointsize, "" );
523}
+
524
+
525void LiDARcloud::addHitsToVisualizer( Visualizer* visualizer, uint pointsize, const char* color_value ) const{
526
527 if( printmessages && scans.size()==0 ){
@@ -661,7 +750,9 @@
581 }
582
583}
+
584
+
586
587 if( printmessages && scans.size()==0 ){
@@ -714,7 +805,9 @@
634 float R = 2.f*sqrt( pow(boxmax.x-boxmin.x,2) + pow(boxmax.y-boxmin.y,2) + pow(boxmax.z-boxmin.z,2) );
635
636}
+
637
+
639
640 if( printmessages && scans.size()==0 ){
@@ -731,7 +824,9 @@
651 }
652
653}
+
654
+
655void LiDARcloud::addTrianglesToVisualizer( Visualizer* visualizer, uint gridcell ) const{
656
657 if( printmessages && scans.size()==0 ){
@@ -750,7 +845,9 @@
670 }
671
672}
+
673
+
674void LiDARcloud::addGrid(const vec3 &center, const vec3 &size, const int3 &ndiv, float rotation)
675{
676 if(size.x<=0 || size.y<=0 || size.z<=0 ){
@@ -792,7 +889,9 @@
712 }
713
714}
+
715
+
717
718
@@ -827,7 +926,9 @@
747
748
749}
+
750
+
752
753 size_t Ngroups = reconstructed_triangles.size();
@@ -879,7 +980,9 @@
799 }
800
801}
+
802
+
804
805 size_t Ngroups = reconstructed_trunk_triangles.size();
@@ -901,7 +1004,9 @@
821 }
822
823}
+
824
+
825void LiDARcloud::addTrunkReconstructionToVisualizer( Visualizer* visualizer, const RGBcolor &trunk_color ) const{
826
827 size_t Ngroups = reconstructed_trunk_triangles.size();
@@ -921,11 +1026,15 @@
841 }
842
843}
+
844
+
845std::vector<uint> LiDARcloud::addLeafReconstructionToContext( Context* context ) const{
847}
+
848
+
850 const int2 &subpatches ) const{
851
@@ -968,7 +1077,9 @@
888 return UUIDs;
889
890}
+
891
+
893
894 std::vector<uint> UUIDs;
@@ -1001,7 +1112,9 @@
921 return UUIDs;
922
923}
+
924
+
925std::vector<uint> LiDARcloud::addTrunkReconstructionToContext( Context* context ) const{
926
927 std::vector<uint> UUIDs;
@@ -1027,7 +1140,9 @@
947 return UUIDs;
948
949}
+
950
+
952
953 if( printmessages && hits.size()==0 ){
@@ -1064,7 +1179,9 @@
984 }
985
986}
+
987
+
989
990 if( printmessages && getGridCellCount()==0 ){
@@ -1111,7 +1228,9 @@
1031
1032
1033}
+
1034
+
1035void LiDARcloud::distanceFilter( float maxdistance ){
1036
1037 std::size_t delete_count = 0;
@@ -1131,7 +1250,9 @@
1051 std::cout << "Removed " << delete_count << " hit points based on distance filter." << std::endl;
1052 }
1053}
+
1054
+
1055void LiDARcloud::reflectanceFilter( float minreflectance ){
1056
1057 std::size_t delete_count = 0;
@@ -1150,7 +1271,9 @@
1070 }
1071
1072}
+
1073
+
1074void LiDARcloud::scalarFilter( const char* scalar_field, float threshold, const char* comparator ){
1075
1076 std::size_t delete_count = 0;
@@ -1181,13 +1304,17 @@
1101 }
1102
1103}
+
1104
+
1105void LiDARcloud::xyzFilter( float xmin, float xmax, float ymin, float ymax, float zmin, float zmax ){
1106
1107 xyzFilter(xmin, xmax, ymin, ymax, zmin, zmax, true);
1108
1109}
+
1110
+
1111void LiDARcloud::xyzFilter( float xmin, float xmax, float ymin, float ymax, float zmin, float zmax, bool deleteOutside){
1112
1113 if(xmin > xmax || ymin > ymax || zmin > zmax)
@@ -1224,6 +1351,7 @@
1144 }
1145
1146}
+
1147
1148// bool sortcol0( const std::vector<float>& v0, const std::vector<float>& v1 ){
1149// return v0.at(0)<v1.at(0);
@@ -1241,6 +1369,7 @@
1161 return v0.at(1)<v1.at(1);
1162}
1163
+
1164void LiDARcloud::maxPulseFilter( const char* scalar ){
1165
1166 if( printmessages ){
@@ -1306,7 +1435,9 @@
1226
1227
1228}
+
1229
+
1230void LiDARcloud::minPulseFilter( const char* scalar ){
1231
1232 if( printmessages ){
@@ -1372,7 +1503,9 @@
1292
1293
1294}
+
1295
+
1297
1298 if( printmessages ){
@@ -1412,7 +1545,9 @@
1332
1333
1334}
+
1335
+
1337
1338 if( printmessages ){
@@ -1458,7 +1593,9 @@
1378 }
1379
1380}
+
1381
+
1382void LiDARcloud::triangulateHitPoints( float Lmax, float max_aspect_ratio ){
1383
1384 if( printmessages && getScanCount() ==0 ){
@@ -1613,9 +1750,9 @@
1533 }
1534
1535 RGBcolor color = make_RGBcolor(0,0,0);
-
1536 color.r = (hits.at(ID0).color.r + hits.at(ID1).color.r + hits.at(ID2).color.r )/3.f;
-
1537 color.g = (hits.at(ID0).color.g + hits.at(ID1).color.g + hits.at(ID2).color.g )/3.f;
-
1538 color.b = (hits.at(ID0).color.b + hits.at(ID1).color.b + hits.at(ID2).color.b )/3.f;
+
1536 color.r = (hits.at(ID0).color.r + hits.at(ID1).color.r + hits.at(ID2).color.r )/3.f;
+
1537 color.g = (hits.at(ID0).color.g + hits.at(ID1).color.g + hits.at(ID2).color.g )/3.f;
+
1538 color.b = (hits.at(ID0).color.b + hits.at(ID1).color.b + hits.at(ID2).color.b )/3.f;
1539
1540 Triangulation tri( s, vertex0, vertex1, vertex2, ID0, ID1, ID2, color, gridcell );
1541
@@ -1639,7 +1776,9 @@
1559 }
1560
1561}
+
1562
+
1563void LiDARcloud::triangulateHitPoints( float Lmax, float max_aspect_ratio, const char* scalar_field, float threshold, const char* comparator ){
1564
1565 if( printmessages && getScanCount() ==0 ){
@@ -1821,9 +1960,9 @@
1741 }
1742
1743 RGBcolor color = make_RGBcolor(0,0,0);
-
1744 color.r = (hits.at(ID0).color.r + hits.at(ID1).color.r + hits.at(ID2).color.r )/3.f;
-
1745 color.g = (hits.at(ID0).color.g + hits.at(ID1).color.g + hits.at(ID2).color.g )/3.f;
-
1746 color.b = (hits.at(ID0).color.b + hits.at(ID1).color.b + hits.at(ID2).color.b )/3.f;
+
1744 color.r = (hits.at(ID0).color.r + hits.at(ID1).color.r + hits.at(ID2).color.r )/3.f;
+
1745 color.g = (hits.at(ID0).color.g + hits.at(ID1).color.g + hits.at(ID2).color.g )/3.f;
+
1746 color.b = (hits.at(ID0).color.b + hits.at(ID1).color.b + hits.at(ID2).color.b )/3.f;
1747
1748 Triangulation tri( s, vertex0, vertex1, vertex2, ID0, ID1, ID2, color, gridcell );
1749
@@ -1847,8 +1986,10 @@
1767 }
1768
1769}
+
1770
1771
+
1773
1774 if( scans.size()==0 ){
@@ -1867,15 +2008,21 @@
1787 }
1788
1789}
+
1790
+
1792 return grid_cells.size();
1793}
+
1794
+
1795void LiDARcloud::addGridCell(const vec3 &center, const vec3 &size, float rotation ){
1796 addGridCell(center,center,size,size,rotation,make_int3(1,1,1), make_int3(1,1,1));
1797}
+
1798
+
1799void LiDARcloud::addGridCell(const vec3 &center, const vec3 &global_anchor,
1800 const vec3 &size, const vec3 &global_size, float rotation, const int3 &global_ijk,
1801 const int3 &global_count ){
@@ -1885,7 +2032,9 @@
1805 grid_cells.push_back(newcell);
1806
1807}
+
1808
+
1810
1811 if( index>=getGridCellCount() ){
@@ -1895,7 +2044,9 @@
1815 return grid_cells.at(index).center;
1816
1817}
+
1818
+
1820
1821 if( index>=getGridCellCount() ){
@@ -1905,7 +2056,9 @@
1825 return grid_cells.at(index).global_anchor;
1826
1827}
+
1828
+
1830
1831 if( index>=getGridCellCount() ){
@@ -1915,7 +2068,9 @@
1835 return grid_cells.at(index).size;
1836
1837}
+
1838
+
1839float LiDARcloud::getCellRotation(uint index ) const{
1840
1841 if( index>=getGridCellCount() ){
@@ -1925,7 +2080,9 @@
1845 return grid_cells.at(index).azimuthal_rotation;
1846
1847}
+
1848
+
1850
1851 size_t Nprims = context->getPrimitiveCount();
@@ -1994,7 +2151,9 @@
1914 return output_Gtheta;
1915
1916}
+
1917
+
1918void LiDARcloud::setCellLeafArea( float area, uint index ){
1919
1920 if( index>getGridCellCount() ){
@@ -2004,7 +2163,9 @@
1924 grid_cells.at(index).leaf_area = area;
1925
1926}
+
1927
+
1928float LiDARcloud::getCellLeafArea(uint index ) const{
1929
1930 if( index>=getGridCellCount() ){
@@ -2014,7 +2175,9 @@
1934 return grid_cells.at(index).leaf_area;
1935
1936}
+
1937
+
1938float LiDARcloud::getCellLeafAreaDensity(uint index ) const{
1939
1940 if( index>=getGridCellCount() ){
@@ -2025,7 +2188,9 @@
1945 return grid_cells.at(index).leaf_area/(gridsize.x*gridsize.y*gridsize.z);
1946
1947}
+
1948
+
1949void LiDARcloud::setCellGtheta( float Gtheta, uint index ){
1950
1951 if( index>getGridCellCount() ){
@@ -2035,7 +2200,9 @@
1955 grid_cells.at(index).Gtheta = Gtheta;
1956
1957}
+
1958
+
1959float LiDARcloud::getCellGtheta(uint index ) const{
1960
1961 if( index>=getGridCellCount() ){
@@ -2045,6 +2212,7 @@
1965 return grid_cells.at(index).Gtheta;
1966
1967}
+
1968
1969void LiDARcloud::leafReconstructionFloodfill() {
1970
@@ -2151,10 +2319,13 @@
2071
2072}
2073
+
2074void LiDARcloud::leafReconstructionAlphaMask( float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char* mask_file ){
2075 leafReconstructionAlphaMask( minimum_leaf_group_area, maximum_leaf_group_area, leaf_aspect_ratio, -1.f, mask_file );
2076}
+
2077
+
2078void LiDARcloud::leafReconstructionAlphaMask( float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, float leaf_length_constant, const char* mask_file ){
2079
2080 if( printmessages ){
@@ -2307,6 +2478,7 @@
2227 //reconstructed_triangles.resize(0);
2228
2229}
+
2230
2231
2232void LiDARcloud::backfillLeavesAlphaMask(
@@ -2571,6 +2743,7 @@
2491
2492}
2493
+
2495
2496 // loop through the vertices of the voxel grid.
@@ -2644,167 +2817,169 @@
2564
2565 std::cout << "# hitpoints remaining after crop = " << getHitCount() << std::endl;
2566}
+
2567
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
-
Definition: LiDAR.h:24
-
void getGridBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all grid cells in the point cloud.
Definition: LiDAR.cpp:988
-
void addTrianglesToVisualizer(Visualizer *visualizer) const
Add all triangles to the visualizer plug-in, and color them by their r-g-b color.
Definition: LiDAR.cpp:638
-
void setHitGridCell(uint index, int cell)
Set the grid cell in which the hit point resides.
Definition: LiDAR.cpp:426
-
LiDARcloud()
LiDAR point cloud constructor.
Definition: LiDAR.cpp:89
-
void addHitsToVisualizer(Visualizer *visualizer, uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
Definition: LiDAR.cpp:521
-
int getHitGridCell(uint index) const
Get the grid cell in which the hit point resides.
Definition: LiDAR.cpp:413
-
void coordinateRotation(const helios::SphericalCoord &rotation)
Rotate all points in the point cloud about the origin.
Definition: LiDAR.cpp:464
-
double getHitData(uint index, const char *label) const
Set floating point data value associated with a hit point.
Definition: LiDAR.cpp:345
-
uint getGridCellCount() const
Get the number of cells in the grid.
Definition: LiDAR.cpp:1791
-
void addGridToVisualizer(Visualizer *visualizer) const
Add all grid cells to the visualizer plug-in.
Definition: LiDAR.cpp:585
-
void enableMessages()
Enable all print messages to the screen.
Definition: LiDAR.cpp:104
-
void setCellLeafArea(float area, uint index)
Set the leaf area of a grid cell in m^2.
Definition: LiDAR.cpp:1918
-
int getHitIndex(uint scanID, uint row, uint column) const
Get the index of a scan point based on its row and column in the hit table.
Definition: LiDAR.cpp:395
-
float getCellLeafAreaDensity(uint index) const
Get the leaf area density of a grid cell in 1/m.
Definition: LiDAR.cpp:1938
-
uint getScanSizeTheta(uint scanID) const
Get the number of scan points in the theta (zenithal) direction.
Definition: LiDAR.cpp:265
-
void getHitBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all hit points in the point cloud.
Definition: LiDAR.cpp:951
-
void setHitData(uint index, const char *label, double value)
Get floating point data value associated with a hit point.
Definition: LiDAR.cpp:335
-
std::vector< uint > addTrunkReconstructionToContext(helios::Context *context) const
Add reconstructed trunk triangles to the Context.
Definition: LiDAR.cpp:925
-
void setCellGtheta(float Gtheta, uint index)
Set the average G(theta) value of a grid cell.
Definition: LiDAR.cpp:1949
-
std::vector< uint > addReconstructedTriangleGroupsToContext(helios::Context *context) const
Add triangle groups used in the direct reconstruction to the Context.
Definition: LiDAR.cpp:892
-
void minPulseFilter(const char *scalar)
Filter full-waveform data according to the minimum scalar value along each pulse. Any scalar value ca...
Definition: LiDAR.cpp:1230
-
float getCellGtheta(uint index) const
Get the G(theta) of a grid cell.
Definition: LiDAR.cpp:1959
-
int getHitScanID(uint index) const
Get the scan with which a hit is associated.
Definition: LiDAR.cpp:385
-
void addTrianglesToContext(helios::Context *context) const
Add triangle geometry to Helios context.
Definition: LiDAR.cpp:1772
-
helios::vec3 getCellSize(uint index) const
Get the size of a grid cell by its index.
Definition: LiDAR.cpp:1829
-
uint getHitCount() const
Get the number of hit points in the point cloud.
Definition: LiDAR.cpp:254
-
helios::vec3 getCellCenter(uint index) const
Get the (x,y,z) coordinate of a grid cell by its index.
Definition: LiDAR.cpp:1809
-
void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
Definition: LiDAR.cpp:171
-
void coordinateShift(const helios::vec3 &shift)
Apply a translation to all points in the point cloud.
Definition: LiDAR.cpp:436
-
void addGrid(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &ndiv, float rotation)
Add a grid to point cloud instead of reading in from an xml file.
Definition: LiDAR.cpp:674
-
helios::vec2 getScanRangeTheta(uint scanID) const
Get the range of scan directions in the theta (zenithal) direction.
Definition: LiDAR.cpp:279
+ +
void getGridBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all grid cells in the point cloud.
Definition LiDAR.cpp:988
+
void addTrianglesToVisualizer(Visualizer *visualizer) const
Add all triangles to the visualizer plug-in, and color them by their r-g-b color.
Definition LiDAR.cpp:638
+
void setHitGridCell(uint index, int cell)
Set the grid cell in which the hit point resides.
Definition LiDAR.cpp:426
+
LiDARcloud()
LiDAR point cloud constructor.
Definition LiDAR.cpp:89
+
void addHitsToVisualizer(Visualizer *visualizer, uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
Definition LiDAR.cpp:521
+
int getHitGridCell(uint index) const
Get the grid cell in which the hit point resides.
Definition LiDAR.cpp:413
+
void coordinateRotation(const helios::SphericalCoord &rotation)
Rotate all points in the point cloud about the origin.
Definition LiDAR.cpp:464
+
double getHitData(uint index, const char *label) const
Set floating point data value associated with a hit point.
Definition LiDAR.cpp:345
+
uint getGridCellCount() const
Get the number of cells in the grid.
Definition LiDAR.cpp:1791
+
void addGridToVisualizer(Visualizer *visualizer) const
Add all grid cells to the visualizer plug-in.
Definition LiDAR.cpp:585
+
void enableMessages()
Enable all print messages to the screen.
Definition LiDAR.cpp:104
+
void setCellLeafArea(float area, uint index)
Set the leaf area of a grid cell in m^2.
Definition LiDAR.cpp:1918
+
int getHitIndex(uint scanID, uint row, uint column) const
Get the index of a scan point based on its row and column in the hit table.
Definition LiDAR.cpp:395
+
float getCellLeafAreaDensity(uint index) const
Get the leaf area density of a grid cell in 1/m.
Definition LiDAR.cpp:1938
+
uint getScanSizeTheta(uint scanID) const
Get the number of scan points in the theta (zenithal) direction.
Definition LiDAR.cpp:265
+
void getHitBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all hit points in the point cloud.
Definition LiDAR.cpp:951
+
void setHitData(uint index, const char *label, double value)
Get floating point data value associated with a hit point.
Definition LiDAR.cpp:335
+
std::vector< uint > addTrunkReconstructionToContext(helios::Context *context) const
Add reconstructed trunk triangles to the Context.
Definition LiDAR.cpp:925
+
void setCellGtheta(float Gtheta, uint index)
Set the average G(theta) value of a grid cell.
Definition LiDAR.cpp:1949
+
std::vector< uint > addReconstructedTriangleGroupsToContext(helios::Context *context) const
Add triangle groups used in the direct reconstruction to the Context.
Definition LiDAR.cpp:892
+
void minPulseFilter(const char *scalar)
Filter full-waveform data according to the minimum scalar value along each pulse. Any scalar value ca...
Definition LiDAR.cpp:1230
+
float getCellGtheta(uint index) const
Get the G(theta) of a grid cell.
Definition LiDAR.cpp:1959
+
int getHitScanID(uint index) const
Get the scan with which a hit is associated.
Definition LiDAR.cpp:385
+
void addTrianglesToContext(helios::Context *context) const
Add triangle geometry to Helios context.
Definition LiDAR.cpp:1772
+
helios::vec3 getCellSize(uint index) const
Get the size of a grid cell by its index.
Definition LiDAR.cpp:1829
+
uint getHitCount() const
Get the number of hit points in the point cloud.
Definition LiDAR.cpp:254
+
helios::vec3 getCellCenter(uint index) const
Get the (x,y,z) coordinate of a grid cell by its index.
Definition LiDAR.cpp:1809
+
void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
Definition LiDAR.cpp:171
+
void coordinateShift(const helios::vec3 &shift)
Apply a translation to all points in the point cloud.
Definition LiDAR.cpp:436
+
void addGrid(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &ndiv, float rotation)
Add a grid to point cloud instead of reading in from an xml file.
Definition LiDAR.cpp:674
+
helios::vec2 getScanRangeTheta(uint scanID) const
Get the range of scan directions in the theta (zenithal) direction.
Definition LiDAR.cpp:279
~LiDARcloud()
LiDAR point cloud destructor.
-
void cropBeamsToGridAngleRange(uint source)
Delete hitpoints that do not pass through / intersect the voxel grid.
Definition: LiDAR.cpp:2494
-
void firstHitFilter()
Filter full-waveform data to include only the first hit per laser pulse. The resulting point cloud wi...
Definition: LiDAR.cpp:1296
-
std::vector< float > calculateSyntheticGtheta(helios::Context *context)
Calculate the G(theta) of all primitives in the context.
Definition: LiDAR.cpp:1849
-
void addLeafReconstructionToVisualizer(Visualizer *visualizer) const
Add reconstructed leaves (triangles or alpha masks) to the visualizer plug-in.
Definition: LiDAR.cpp:751
-
float getScanBeamDivergence(uint scanID) const
Divergence angle of the laser beam in radians.
Definition: LiDAR.cpp:300
-
Triangulation getTriangle(uint index) const
Get hit point corresponding to first vertex of triangle.
Definition: LiDAR.cpp:512
-
void addTrunkReconstructionToVisualizer(Visualizer *visualizer) const
Add trunk reconstruction to the visualizer plug-in. Colors reconstructed triangles by hit point color...
Definition: LiDAR.cpp:803
-
float getCellRotation(uint index) const
Get the size of a grid cell by its index.
Definition: LiDAR.cpp:1839
-
void scalarFilter(const char *scalar_field, float threshold, const char *comparator)
Filter hit points based on a scalar field given by a column in the ASCII data.
Definition: LiDAR.cpp:1074
-
void maxPulseFilter(const char *scalar)
Filter full-waveform data according to the maximum scalar value along each pulse. Any scalar value ca...
Definition: LiDAR.cpp:1164
-
helios::vec3 getScanOrigin(uint scanID) const
Get the (x,y,z) scan origin.
Definition: LiDAR.cpp:258
-
helios::SphericalCoord getHitRaydir(uint index) const
Get ray direction of hit point in the scan based on its index.
Definition: LiDAR.cpp:324
-
uint getScanCount()
Get number of scans in point cloud.
Definition: LiDAR.cpp:135
-
bool doesHitDataExist(uint index, const char *label) const
Check if scalar data exists for a hit point.
Definition: LiDAR.cpp:360
-
uint getScanSizePhi(uint scanID) const
Get the number of scan points in the phi (azimuthal) direction.
Definition: LiDAR.cpp:272
-
helios::RGBcolor getHitColor(uint index) const
Get color of hit point.
Definition: LiDAR.cpp:375
-
void calculateHitGridCellGPU()
Determine the grid cell in which each hit point resides for the whole point cloud - GPU accelerated v...
Definition: LiDAR.cu:268
-
helios::vec2 getScanRangePhi(uint scanID) const
Get the range of scan directions in the phi (azimuthal) direction.
Definition: LiDAR.cpp:286
-
void lastHitFilter()
Filter full-waveform data to include only the last hit per laser pulse. The resulting point cloud wil...
Definition: LiDAR.cpp:1336
-
void leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)
Perform a leaf reconstruction based on texture-masked Patches within each gridcell....
Definition: LiDAR.cpp:2074
-
float getScanBeamExitDiameter(uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
Definition: LiDAR.cpp:293
-
uint addScan(ScanMetadata &newscan)
Add a LiDAR scan to the point cloud.
Definition: LiDAR.cpp:139
-
std::vector< std::string > getScanColumnFormat(uint scanID) const
Get the labels for columns in ASCII input/output file.
Definition: LiDAR.cpp:307
-
uint getTriangleCount() const
Get the number of triangles formed by the triangulation.
Definition: LiDAR.cpp:508
-
void xyzFilter(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
overloaded version of xyzFilter that defaults to deleting points outside the provided bounding box
Definition: LiDAR.cpp:1105
-
void triangulateHitPoints(float Lmax, float max_aspect_ratio)
Perform triangulation on all hit points in point cloud.
Definition: LiDAR.cpp:1382
-
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
Definition: LiDAR.cpp:314
-
void addGridCell(const helios::vec3 &center, const helios::vec3 &size, float rotation)
Add a cell to the grid.
Definition: LiDAR.cpp:1795
-
float getCellLeafArea(uint index) const
Get the leaf area of a grid cell in m^2.
Definition: LiDAR.cpp:1928
-
void deleteHitPoint(uint index)
Delete a hit point in the scan.
Definition: LiDAR.cpp:237
-
helios::vec3 getCellGlobalAnchor(uint index) const
Get the (x,y,z) coordinate of a grid global anchor by its index.
Definition: LiDAR.cpp:1819
-
void reflectanceFilter(float minreflectance)
Filter scan by imposing a minimum reflectance value.
Definition: LiDAR.cpp:1055
-
std::vector< uint > addLeafReconstructionToContext(helios::Context *context) const
Add reconstructed leaves (texture-masked patches) to the Context.
Definition: LiDAR.cpp:845
-
void distanceFilter(float maxdistance)
Filter scan by imposing a maximum distance from the scanner.
Definition: LiDAR.cpp:1035
-
void disableMessages()
Disable all print messages to the screen except for fatal error messages.
Definition: LiDAR.cpp:100
-
void addGridWireFrametoVisualizer(Visualizer *visualizer) const
Add wire frame of the grid to the visualizer plug-in.
Definition: LiDAR.cpp:716
-
Class for visualization of simulation results.
Definition: Visualizer.h:265
-
@ COORDINATES_CARTESIAN
Coordinates are specified in a 3D Cartesian system (right-handed), where +z is vertical.
Definition: Visualizer.h:316
-
void addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
Add a point by giving its coordinates and size.
-
void addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a triangle by giving the coordinates of its three vertices.
-
void addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)
Add Lines by giving the coordinates of points along the Lines.
-
void addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a voxel by giving the coordinates of its center.
-
void addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its center.
Definition: Visualizer.cpp:999
-
Colormap getCurrentColormap() const
Get the current colormap used in Colorbar/visualization.
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition: Context.cpp:1406
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition: Context.cpp:1420
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition: Context.cpp:1578
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition: Context.cpp:1491
-
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition: Context.cpp:7104
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition: global.cpp:140
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
std::vector< std::vector< bool > > readPNGAlpha(const std::string &filename)
Function to read the alpha channel from a PNG image.
Definition: global.cpp:1488
-
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:5809
-
float randu()
Random number from a uniform distribution between 0 and 1.
Definition: global.cpp:223
-
vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
Function to rotate a 3D vector given spherical angles elevation and azimuth.
Definition: global.cpp:79
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
float min(const std::vector< float > &vect)
Minimum value of a vector of floats.
Definition: global.cpp:1100
-
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition: global.cpp:1146
-
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition: Context.cpp:1328
-
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition: Context.cpp:1759
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
RGB color map.
Definition: Visualizer.h:165
- -
Definition: LiDAR.h:84
-
Structure containing metadata for a terrestrial scan.
Definition: LiDAR.h:188
-
float phiMin
Minimum azimuthal angle of scan in radians.
Definition: LiDAR.h:227
-
float thetaMin
Minimum zenithal angle of scan in radians
Definition: LiDAR.h:214
-
helios::vec3 origin
(x,y,z) coordinate of scanner location
Definition: LiDAR.h:235
-
float thetaMax
Maximum zenithal angle of scan in radians.
Definition: LiDAR.h:219
-
float phiMax
Maximum azimuthal angle of scan in radians.
Definition: LiDAR.h:232
-
ScanMetadata()
Default LiDAR scan data structure.
Definition: LiDAR.cpp:21
-
uint Ntheta
Number of zenithal angles in scan (rows)
Definition: LiDAR.h:209
-
float exitDiameter
Diameter of laser pulse at exit from the scanner.
Definition: LiDAR.h:241
-
uint Nphi
Number of azimuthal angles in scan (columns)
Definition: LiDAR.h:222
-
std::string data_file
File containing hit point data.
Definition: LiDAR.h:206
-
helios::int2 direction2rc(const helios::SphericalCoord &direction) const
Convert the scan ray direction into (row,column) table index.
Definition: LiDAR.cpp:66
-
std::vector< std::string > columnFormat
Vector of strings specifying the columns of the scan ASCII file for input/output.
Definition: LiDAR.h:250
-
float beamDivergence
Divergence angle of the laser beam in radians.
Definition: LiDAR.h:247
-
helios::SphericalCoord rc2direction(uint row, uint column) const
Convert the (row,column) of hit point in a scan to a direction vector.
Definition: LiDAR.cpp:57
-
Definition: s_hull_pro.h:72
- -
R-G-B-A color vector.
-
R-G-B color vector.
-
float b
Blue color component.
-
float r
Red color component.
-
float g
Green color component.
-
Vector of spherical coordinates (elevation,azimuth)
-
const float & zenith
Zenithal angle (radians)
-
float azimuth
Azimuthal angle (radians)
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of three elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int y
Second element in vector.
-
Vector of two elements of type 'float'.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
vec3 normalize()
Normalize vector components such that the magnitude is unity.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
-
float magnitude() const
Compute the vector magnitude.
+
void cropBeamsToGridAngleRange(uint source)
Delete hitpoints that do not pass through / intersect the voxel grid.
Definition LiDAR.cpp:2494
+
void firstHitFilter()
Filter full-waveform data to include only the first hit per laser pulse. The resulting point cloud wi...
Definition LiDAR.cpp:1296
+
std::vector< float > calculateSyntheticGtheta(helios::Context *context)
Calculate the G(theta) of all primitives in the context.
Definition LiDAR.cpp:1849
+
void addLeafReconstructionToVisualizer(Visualizer *visualizer) const
Add reconstructed leaves (triangles or alpha masks) to the visualizer plug-in.
Definition LiDAR.cpp:751
+
float getScanBeamDivergence(uint scanID) const
Divergence angle of the laser beam in radians.
Definition LiDAR.cpp:300
+
Triangulation getTriangle(uint index) const
Get hit point corresponding to first vertex of triangle.
Definition LiDAR.cpp:512
+
void addTrunkReconstructionToVisualizer(Visualizer *visualizer) const
Add trunk reconstruction to the visualizer plug-in. Colors reconstructed triangles by hit point color...
Definition LiDAR.cpp:803
+
float getCellRotation(uint index) const
Get the size of a grid cell by its index.
Definition LiDAR.cpp:1839
+
void scalarFilter(const char *scalar_field, float threshold, const char *comparator)
Filter hit points based on a scalar field given by a column in the ASCII data.
Definition LiDAR.cpp:1074
+
void maxPulseFilter(const char *scalar)
Filter full-waveform data according to the maximum scalar value along each pulse. Any scalar value ca...
Definition LiDAR.cpp:1164
+
helios::vec3 getScanOrigin(uint scanID) const
Get the (x,y,z) scan origin.
Definition LiDAR.cpp:258
+
helios::SphericalCoord getHitRaydir(uint index) const
Get ray direction of hit point in the scan based on its index.
Definition LiDAR.cpp:324
+
uint getScanCount()
Get number of scans in point cloud.
Definition LiDAR.cpp:135
+
bool doesHitDataExist(uint index, const char *label) const
Check if scalar data exists for a hit point.
Definition LiDAR.cpp:360
+
uint getScanSizePhi(uint scanID) const
Get the number of scan points in the phi (azimuthal) direction.
Definition LiDAR.cpp:272
+
helios::RGBcolor getHitColor(uint index) const
Get color of hit point.
Definition LiDAR.cpp:375
+
void calculateHitGridCellGPU()
Determine the grid cell in which each hit point resides for the whole point cloud - GPU accelerated v...
Definition LiDAR.cu:268
+
helios::vec2 getScanRangePhi(uint scanID) const
Get the range of scan directions in the phi (azimuthal) direction.
Definition LiDAR.cpp:286
+
void lastHitFilter()
Filter full-waveform data to include only the last hit per laser pulse. The resulting point cloud wil...
Definition LiDAR.cpp:1336
+
void leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)
Perform a leaf reconstruction based on texture-masked Patches within each gridcell....
Definition LiDAR.cpp:2074
+
float getScanBeamExitDiameter(uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
Definition LiDAR.cpp:293
+
uint addScan(ScanMetadata &newscan)
Add a LiDAR scan to the point cloud.
Definition LiDAR.cpp:139
+
std::vector< std::string > getScanColumnFormat(uint scanID) const
Get the labels for columns in ASCII input/output file.
Definition LiDAR.cpp:307
+
uint getTriangleCount() const
Get the number of triangles formed by the triangulation.
Definition LiDAR.cpp:508
+
void xyzFilter(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
overloaded version of xyzFilter that defaults to deleting points outside the provided bounding box
Definition LiDAR.cpp:1105
+
void triangulateHitPoints(float Lmax, float max_aspect_ratio)
Perform triangulation on all hit points in point cloud.
Definition LiDAR.cpp:1382
+
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
Definition LiDAR.cpp:314
+
void addGridCell(const helios::vec3 &center, const helios::vec3 &size, float rotation)
Add a cell to the grid.
Definition LiDAR.cpp:1795
+
float getCellLeafArea(uint index) const
Get the leaf area of a grid cell in m^2.
Definition LiDAR.cpp:1928
+
void deleteHitPoint(uint index)
Delete a hit point in the scan.
Definition LiDAR.cpp:237
+
helios::vec3 getCellGlobalAnchor(uint index) const
Get the (x,y,z) coordinate of a grid global anchor by its index.
Definition LiDAR.cpp:1819
+
void reflectanceFilter(float minreflectance)
Filter scan by imposing a minimum reflectance value.
Definition LiDAR.cpp:1055
+
std::vector< uint > addLeafReconstructionToContext(helios::Context *context) const
Add reconstructed leaves (texture-masked patches) to the Context.
Definition LiDAR.cpp:845
+
void distanceFilter(float maxdistance)
Filter scan by imposing a maximum distance from the scanner.
Definition LiDAR.cpp:1035
+
void disableMessages()
Disable all print messages to the screen except for fatal error messages.
Definition LiDAR.cpp:100
+
void addGridWireFrametoVisualizer(Visualizer *visualizer) const
Add wire frame of the grid to the visualizer plug-in.
Definition LiDAR.cpp:716
+
Class for visualization of simulation results.
Definition Visualizer.h:275
+
@ COORDINATES_CARTESIAN
Coordinates are specified in a 3D Cartesian system (right-handed), where +z is vertical.
Definition Visualizer.h:326
+
void addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
Add a point by giving its coordinates and size.
+
void addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a triangle by giving the coordinates of its three vertices.
+
void addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)
Add Lines by giving the coordinates of points along the Lines.
+
void addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a voxel by giving the coordinates of its center.
+
void addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its center.
+
Colormap getCurrentColormap() const
Get the current colormap used in Colorbar/visualization.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition Context.cpp:1406
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition Context.cpp:1420
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition Context.cpp:1578
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition Context.cpp:1491
+
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition Context.cpp:7104
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition global.cpp:140
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
std::vector< std::vector< bool > > readPNGAlpha(const std::string &filename)
Function to read the alpha channel from a PNG image.
Definition global.cpp:1488
+
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:5809
+
float randu()
Random number from a uniform distribution between 0 and 1.
Definition global.cpp:223
+
vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
Function to rotate a 3D vector given spherical angles elevation and azimuth.
Definition global.cpp:79
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
float min(const std::vector< float > &vect)
Minimum value of a vector of floats.
Definition global.cpp:1100
+
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition global.cpp:1146
+
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition Context.cpp:1328
+
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition Context.cpp:1759
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
RGB color map.
Definition Visualizer.h:175
+ + +
Structure containing metadata for a terrestrial scan.
Definition LiDAR.h:188
+
float phiMin
Minimum azimuthal angle of scan in radians.
Definition LiDAR.h:227
+
float thetaMin
Minimum zenithal angle of scan in radians
Definition LiDAR.h:214
+
helios::vec3 origin
(x,y,z) coordinate of scanner location
Definition LiDAR.h:235
+
float thetaMax
Maximum zenithal angle of scan in radians.
Definition LiDAR.h:219
+
float phiMax
Maximum azimuthal angle of scan in radians.
Definition LiDAR.h:232
+
ScanMetadata()
Default LiDAR scan data structure.
Definition LiDAR.cpp:21
+
uint Ntheta
Number of zenithal angles in scan (rows)
Definition LiDAR.h:209
+
float exitDiameter
Diameter of laser pulse at exit from the scanner.
Definition LiDAR.h:241
+
uint Nphi
Number of azimuthal angles in scan (columns)
Definition LiDAR.h:222
+
std::string data_file
File containing hit point data.
Definition LiDAR.h:206
+
helios::int2 direction2rc(const helios::SphericalCoord &direction) const
Convert the scan ray direction into (row,column) table index.
Definition LiDAR.cpp:66
+
std::vector< std::string > columnFormat
Vector of strings specifying the columns of the scan ASCII file for input/output.
Definition LiDAR.h:250
+
float beamDivergence
Divergence angle of the laser beam in radians.
Definition LiDAR.h:247
+
helios::SphericalCoord rc2direction(uint row, uint column) const
Convert the (row,column) of hit point in a scan to a direction vector.
Definition LiDAR.cpp:57
+ + +
R-G-B-A color vector.
+
R-G-B color vector.
+
float b
Blue color component.
+
float r
Red color component.
+
float g
Green color component.
+
Vector of spherical coordinates (elevation,azimuth)
+
const float & zenith
Zenithal angle (radians)
+
float azimuth
Azimuthal angle (radians)
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of three elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int y
Second element in vector.
+
Vector of two elements of type 'float'.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+
float magnitude() const
Compute the vector magnitude.
+ diff --git a/doc/html/_li_d_a_r_8cu.html b/doc/html/_li_d_a_r_8cu.html index ead7fb35f..3a9bd559a 100644 --- a/doc/html/_li_d_a_r_8cu.html +++ b/doc/html/_li_d_a_r_8cu.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
LiDAR.cu File Reference
@@ -106,7 +118,8 @@
+ diff --git a/doc/html/_li_d_a_r_8cu_source.html b/doc/html/_li_d_a_r_8cu_source.html index c786fcfd1..3ced58e2d 100644 --- a/doc/html/_li_d_a_r_8cu_source.html +++ b/doc/html/_li_d_a_r_8cu_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
LiDAR.cu
@@ -345,6 +357,7 @@
265 return v0.at(1)<v1.at(1);
266}
267
+
269
270 if( printmessages ){
@@ -454,6 +467,7 @@
378 }
379
380}
+
381
382void LiDARcloud::sourcesInsideGridCellGPU() {
383
@@ -561,6 +575,7 @@
489
490}
491
+
492std::vector<helios::vec3> LiDARcloud::gapfillMisses(){
493 std::vector<helios::vec3> xyz_filled;
494 for( uint scanID=0; scanID<getScanCount(); scanID++ ){
@@ -569,11 +584,15 @@
497 }
498 return xyz_filled;
499}
+
500
+
501std::vector<helios::vec3> LiDARcloud::gapfillMisses(uint scanID){
502 return gapfillMisses(scanID, false, false);
503}
+
504
+
505std::vector<helios::vec3> LiDARcloud::gapfillMisses(uint scanID, const bool gapfill_grid_only, const bool add_flags){
506
507 if( printmessages ) {
@@ -776,8 +795,8 @@
704 float timestep = hit_table2D.at(j).at(i).at(1) + dt_avg*float(k);
705
706 //interpolate theta and phi
-
707 float theta = hit_table2D.at(j).at(i).at(2) + (hit_table2D.at(j).at(i+1).at(2)-hit_table2D.at(j).at(i).at(2))*float(k)/float(Ngap+1);
-
708 float phi = hit_table2D.at(j).at(i).at(3) + (hit_table2D.at(j).at(i+1).at(3)-hit_table2D.at(j).at(i).at(3))*float(k)/float(Ngap+1);
+
707 float theta = hit_table2D.at(j).at(i).at(2) + (hit_table2D.at(j).at(i+1).at(2)-hit_table2D.at(j).at(i).at(2))*float(k)/float(Ngap+1);
+
708 float phi = hit_table2D.at(j).at(i).at(3) + (hit_table2D.at(j).at(i+1).at(3)-hit_table2D.at(j).at(i).at(3))*float(k)/float(Ngap+1);
709 if( phi>2.f*M_PI ){
710 phi = phi-2.f*M_PI;
711 }
@@ -964,12 +983,16 @@
892 return xyz_filled;
893
894}
+
895
896
+
900
+
901void LiDARcloud::calculateLeafAreaGPU( int min_voxel_hits){
902
903 if( printmessages ){
@@ -1427,7 +1450,9 @@
1355 }
1356
1357}
+
1358
+
1360
1361 if( printmessages ){
@@ -1758,7 +1783,9 @@
1686 }
1687
1688}
+
1689
+
1690void LiDARcloud::calculateLeafAreaGPU_synthetic( helios::Context* context, bool beamoutput, bool fillAnalytic ){
1691
1692 // calculates LAD using several different methods investigated in Kent & Bailey (2023)
@@ -2415,6 +2442,7 @@
2349 }
2350
2351}
+
2352
2353std::vector<float> LiDARcloud::LAD_inversion(std::vector<float> &P, std::vector<float> &Gtheta,
2354 std::vector<std::vector<float>> &dr_array, bool fillAnalytic){
@@ -2901,6 +2929,7 @@
2835
2836}
2837
+
2839 const helios::vec3 &box_size, float Lmax, float max_aspect_ratio ){
2840
@@ -3056,9 +3085,9 @@
2990 }
2991
-
2993 color.r = (hits.at(ID0).color.r + hits.at(ID1).color.r + hits.at(ID2).color.r )/3.f;
-
2994 color.g = (hits.at(ID0).color.g + hits.at(ID1).color.g + hits.at(ID2).color.g )/3.f;
-
2995 color.b = (hits.at(ID0).color.b + hits.at(ID1).color.b + hits.at(ID2).color.b )/3.f;
+
2993 color.r = (hits.at(ID0).color.r + hits.at(ID1).color.r + hits.at(ID2).color.r )/3.f;
+
2994 color.g = (hits.at(ID0).color.g + hits.at(ID1).color.g + hits.at(ID2).color.g )/3.f;
+
2995 color.b = (hits.at(ID0).color.b + hits.at(ID1).color.b + hits.at(ID2).color.b )/3.f;
2996
2997 Triangulation tri( s, vertex0, vertex1, vertex2, ID0, ID1, ID2, color, 0 );
2998
@@ -3155,19 +3184,27 @@
3089 }
3090
3091}
+
3092
+
3094 syntheticScan( context, 1, 0, false, false );
3095}
+
3096
+
3097void LiDARcloud::syntheticScan( helios::Context* context, bool scan_grid_only, bool record_misses ){
3098 syntheticScan( context, 1, 0, scan_grid_only, record_misses );
3099}
+
3100
+
3101void LiDARcloud::syntheticScan( helios::Context* context, int rays_per_pulse, float pulse_distance_threshold ){
3102 syntheticScan( context, rays_per_pulse, pulse_distance_threshold, false, false );
3103}
+
3104
+
3105void LiDARcloud::syntheticScan( helios::Context* context, int rays_per_pulse, float pulse_distance_threshold, bool scan_grid_only, bool record_misses ){
3106
3107 int Npulse;
@@ -3774,7 +3811,9 @@
3708 }
3709
3710}
+
3711
+
3713
3714 float3* d_prim_xyz;
@@ -3885,6 +3924,7 @@
3823 return output_LeafArea;
3824
3825}
+
3826
3827__global__ void LIDAR_CUDA::intersectPatches( const size_t Npulse, const int rays_per_pulse, const float3 origin, float3* d_raydir, const float exit_diameter, const float beam_divergence,const int Npatches, float3* d_patch_vertex, int* d_patch_textureID, const int Ntextures, int2* d_masksize, int2 masksize_max, bool* d_maskdata, float2* d_patch_uv, float* d_hit_t, float* d_hit_fnorm, int* d_hit_ID ){
3828
@@ -4088,6 +4128,7 @@
4026
4027
4028
+
4029void LiDARcloud::calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic ){
4030
4031 // calculates LAD using the equal weighting method
@@ -4533,8 +4574,10 @@
4478 }
4479
4480}
+
4481
4482
+
4483void LiDARcloud::calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic, std::vector<float> constant_G){
4484
4485 // calculates LAD using the equal weighting method
@@ -5028,7 +5071,9 @@
4980 }
4981
4982}
+
4983
+
4984std::vector<uint> LiDARcloud::peakFinder(std::vector<float> signal){
4985
4986 for(uint i=0;i<signal.size();i++)
@@ -5093,103 +5138,105 @@
5045
5046 return peakIndices;
5047}
+
5048
5049
5050
5051
-
__device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
-
void getGridBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all grid cells in the point cloud.
Definition: LiDAR.cpp:988
-
void setHitGridCell(uint index, int cell)
Set the grid cell in which the hit point resides.
Definition: LiDAR.cpp:426
-
std::vector< float > calculateSyntheticLeafArea(helios::Context *context)
Calculate the surface area of all primitives in the context.
Definition: LiDAR.cu:3712
-
int getHitGridCell(uint index) const
Get the grid cell in which the hit point resides.
Definition: LiDAR.cpp:413
-
double getHitData(uint index, const char *label) const
Set floating point data value associated with a hit point.
Definition: LiDAR.cpp:345
-
uint getGridCellCount() const
Get the number of cells in the grid.
Definition: LiDAR.cpp:1791
-
void setCellLeafArea(float area, uint index)
Set the leaf area of a grid cell in m^2.
Definition: LiDAR.cpp:1918
-
uint getScanSizeTheta(uint scanID) const
Get the number of scan points in the theta (zenithal) direction.
Definition: LiDAR.cpp:265
-
void setHitData(uint index, const char *label, double value)
Get floating point data value associated with a hit point.
Definition: LiDAR.cpp:335
-
void setCellGtheta(float Gtheta, uint index)
Set the average G(theta) value of a grid cell.
Definition: LiDAR.cpp:1949
-
std::vector< helios::vec3 > gapfillMisses()
For scans that are missing points (e.g., sky points), this function will attempt to fill in missing p...
Definition: LiDAR.cu:492
-
int getHitScanID(uint index) const
Get the scan with which a hit is associated.
Definition: LiDAR.cpp:385
-
helios::vec3 getCellSize(uint index) const
Get the size of a grid cell by its index.
Definition: LiDAR.cpp:1829
-
uint getHitCount() const
Get the number of hit points in the point cloud.
Definition: LiDAR.cpp:254
-
helios::vec3 getCellCenter(uint index) const
Get the (x,y,z) coordinate of a grid cell by its index.
Definition: LiDAR.cpp:1809
-
void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
Definition: LiDAR.cpp:171
-
void calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic)
Calculate the leaf area for each grid volume using equal weighting method.
Definition: LiDAR.cu:4029
-
helios::vec2 getScanRangeTheta(uint scanID) const
Get the range of scan directions in the theta (zenithal) direction.
Definition: LiDAR.cpp:279
-
std::vector< float > calculateSyntheticGtheta(helios::Context *context)
Calculate the G(theta) of all primitives in the context.
Definition: LiDAR.cpp:1849
-
float getScanBeamDivergence(uint scanID) const
Divergence angle of the laser beam in radians.
Definition: LiDAR.cpp:300
-
Triangulation getTriangle(uint index) const
Get hit point corresponding to first vertex of triangle.
Definition: LiDAR.cpp:512
-
float getCellRotation(uint index) const
Get the size of a grid cell by its index.
Definition: LiDAR.cpp:1839
-
helios::vec3 getScanOrigin(uint scanID) const
Get the (x,y,z) scan origin.
Definition: LiDAR.cpp:258
-
void calculateLeafAreaGPU_testing(int min_voxel_hits)
Calculate the leaf area for each grid volume.
Definition: LiDAR.cu:1359
-
void trunkReconstruction(const helios::vec3 &box_center, const helios::vec3 &box_size, float Lmax, float max_aspect_ratio)
Reconstruct the trunk of the tree. In order to do this, you must specify the center and size of a rec...
Definition: LiDAR.cu:2838
-
helios::SphericalCoord getHitRaydir(uint index) const
Get ray direction of hit point in the scan based on its index.
Definition: LiDAR.cpp:324
-
uint getScanCount()
Get number of scans in point cloud.
Definition: LiDAR.cpp:135
-
bool doesHitDataExist(uint index, const char *label) const
Check if scalar data exists for a hit point.
Definition: LiDAR.cpp:360
-
void syntheticScan(helios::Context *context)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns onl...
Definition: LiDAR.cu:3093
-
uint getScanSizePhi(uint scanID) const
Get the number of scan points in the phi (azimuthal) direction.
Definition: LiDAR.cpp:272
-
void calculateHitGridCellGPU()
Determine the grid cell in which each hit point resides for the whole point cloud - GPU accelerated v...
Definition: LiDAR.cu:268
-
helios::vec2 getScanRangePhi(uint scanID) const
Get the range of scan directions in the phi (azimuthal) direction.
Definition: LiDAR.cpp:286
-
float getScanBeamExitDiameter(uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
Definition: LiDAR.cpp:293
-
std::vector< std::string > getScanColumnFormat(uint scanID) const
Get the labels for columns in ASCII input/output file.
Definition: LiDAR.cpp:307
-
uint getTriangleCount() const
Get the number of triangles formed by the triangulation.
Definition: LiDAR.cpp:508
-
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
Definition: LiDAR.cpp:314
-
void calculateLeafAreaGPU_synthetic(helios::Context *context, bool beamoutput, bool fillAnalytic)
Calculate the leaf area for each grid volume in a synthetic scan using several different method for e...
Definition: LiDAR.cu:1690
-
std::vector< uint > peakFinder(std::vector< float > signal)
find the indices of the peaks of a vector of floats
Definition: LiDAR.cu:4984
-
helios::vec3 getCellGlobalAnchor(uint index) const
Get the (x,y,z) coordinate of a grid global anchor by its index.
Definition: LiDAR.cpp:1819
-
void calculateLeafAreaGPU()
Calculate the leaf area for each grid volume.
Definition: LiDAR.cu:897
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
helios::RGBcolor getPrimitiveColor(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition: Context.cpp:7127
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition: Context.cpp:7159
-
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition: Context.cpp:7175
-
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition: Context.cpp:7179
-
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition: Context.cpp:6984
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
helios::int2 getPrimitiveTextureSize(uint UUID) const
Get the size (number of pixels) of primitive texture map image.
Definition: Context.cpp:7167
-
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition: Context.cpp:2046
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition: Context.cpp:7187
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
float atan2_2pi(float y, float x)
Four quadrant arc tangent between 0 and 2*pi.
Definition: global.cpp:584
-
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition: global.cpp:617
-
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:241
-
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition: global.cpp:1084
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
-
Definition: s_hull_pro.h:72
- -
R-G-B color vector.
-
float b
Blue color component.
-
float r
Red color component.
-
float g
Green color component.
-
Vector of spherical coordinates (elevation,azimuth)
-
const float & zenith
Zenithal angle (radians)
-
float azimuth
Azimuthal angle (radians)
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
vec3 normalize()
Normalize vector components such that the magnitude is unity.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
-
float magnitude() const
Compute the vector magnitude.
+
__device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
+
void getGridBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all grid cells in the point cloud.
Definition LiDAR.cpp:988
+
void setHitGridCell(uint index, int cell)
Set the grid cell in which the hit point resides.
Definition LiDAR.cpp:426
+
std::vector< float > calculateSyntheticLeafArea(helios::Context *context)
Calculate the surface area of all primitives in the context.
Definition LiDAR.cu:3712
+
int getHitGridCell(uint index) const
Get the grid cell in which the hit point resides.
Definition LiDAR.cpp:413
+
double getHitData(uint index, const char *label) const
Set floating point data value associated with a hit point.
Definition LiDAR.cpp:345
+
uint getGridCellCount() const
Get the number of cells in the grid.
Definition LiDAR.cpp:1791
+
void setCellLeafArea(float area, uint index)
Set the leaf area of a grid cell in m^2.
Definition LiDAR.cpp:1918
+
uint getScanSizeTheta(uint scanID) const
Get the number of scan points in the theta (zenithal) direction.
Definition LiDAR.cpp:265
+
void setHitData(uint index, const char *label, double value)
Get floating point data value associated with a hit point.
Definition LiDAR.cpp:335
+
void setCellGtheta(float Gtheta, uint index)
Set the average G(theta) value of a grid cell.
Definition LiDAR.cpp:1949
+
std::vector< helios::vec3 > gapfillMisses()
For scans that are missing points (e.g., sky points), this function will attempt to fill in missing p...
Definition LiDAR.cu:492
+
int getHitScanID(uint index) const
Get the scan with which a hit is associated.
Definition LiDAR.cpp:385
+
helios::vec3 getCellSize(uint index) const
Get the size of a grid cell by its index.
Definition LiDAR.cpp:1829
+
uint getHitCount() const
Get the number of hit points in the point cloud.
Definition LiDAR.cpp:254
+
helios::vec3 getCellCenter(uint index) const
Get the (x,y,z) coordinate of a grid cell by its index.
Definition LiDAR.cpp:1809
+
void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
Definition LiDAR.cpp:171
+
void calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic)
Calculate the leaf area for each grid volume using equal weighting method.
Definition LiDAR.cu:4029
+
helios::vec2 getScanRangeTheta(uint scanID) const
Get the range of scan directions in the theta (zenithal) direction.
Definition LiDAR.cpp:279
+
std::vector< float > calculateSyntheticGtheta(helios::Context *context)
Calculate the G(theta) of all primitives in the context.
Definition LiDAR.cpp:1849
+
float getScanBeamDivergence(uint scanID) const
Divergence angle of the laser beam in radians.
Definition LiDAR.cpp:300
+
Triangulation getTriangle(uint index) const
Get hit point corresponding to first vertex of triangle.
Definition LiDAR.cpp:512
+
float getCellRotation(uint index) const
Get the size of a grid cell by its index.
Definition LiDAR.cpp:1839
+
helios::vec3 getScanOrigin(uint scanID) const
Get the (x,y,z) scan origin.
Definition LiDAR.cpp:258
+
void calculateLeafAreaGPU_testing(int min_voxel_hits)
Calculate the leaf area for each grid volume.
Definition LiDAR.cu:1359
+
void trunkReconstruction(const helios::vec3 &box_center, const helios::vec3 &box_size, float Lmax, float max_aspect_ratio)
Reconstruct the trunk of the tree. In order to do this, you must specify the center and size of a rec...
Definition LiDAR.cu:2838
+
helios::SphericalCoord getHitRaydir(uint index) const
Get ray direction of hit point in the scan based on its index.
Definition LiDAR.cpp:324
+
uint getScanCount()
Get number of scans in point cloud.
Definition LiDAR.cpp:135
+
bool doesHitDataExist(uint index, const char *label) const
Check if scalar data exists for a hit point.
Definition LiDAR.cpp:360
+
void syntheticScan(helios::Context *context)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns onl...
Definition LiDAR.cu:3093
+
uint getScanSizePhi(uint scanID) const
Get the number of scan points in the phi (azimuthal) direction.
Definition LiDAR.cpp:272
+
void calculateHitGridCellGPU()
Determine the grid cell in which each hit point resides for the whole point cloud - GPU accelerated v...
Definition LiDAR.cu:268
+
helios::vec2 getScanRangePhi(uint scanID) const
Get the range of scan directions in the phi (azimuthal) direction.
Definition LiDAR.cpp:286
+
float getScanBeamExitDiameter(uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
Definition LiDAR.cpp:293
+
std::vector< std::string > getScanColumnFormat(uint scanID) const
Get the labels for columns in ASCII input/output file.
Definition LiDAR.cpp:307
+
uint getTriangleCount() const
Get the number of triangles formed by the triangulation.
Definition LiDAR.cpp:508
+
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
Definition LiDAR.cpp:314
+
void calculateLeafAreaGPU_synthetic(helios::Context *context, bool beamoutput, bool fillAnalytic)
Calculate the leaf area for each grid volume in a synthetic scan using several different method for e...
Definition LiDAR.cu:1690
+
std::vector< uint > peakFinder(std::vector< float > signal)
find the indices of the peaks of a vector of floats
Definition LiDAR.cu:4984
+
helios::vec3 getCellGlobalAnchor(uint index) const
Get the (x,y,z) coordinate of a grid global anchor by its index.
Definition LiDAR.cpp:1819
+
void calculateLeafAreaGPU()
Calculate the leaf area for each grid volume.
Definition LiDAR.cu:897
+
Stores the state associated with simulation.
Definition Context.h:1882
+
helios::RGBcolor getPrimitiveColor(uint UUID) const
Method to return the diffuse color of a Primitive.
Definition Context.cpp:7127
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition Context.cpp:7159
+
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition Context.cpp:7175
+
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition Context.cpp:7179
+
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition Context.cpp:6984
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
helios::int2 getPrimitiveTextureSize(uint UUID) const
Get the size (number of pixels) of primitive texture map image.
Definition Context.cpp:7167
+
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition Context.cpp:2046
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition Context.cpp:7187
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
float atan2_2pi(float y, float x)
Four quadrant arc tangent between 0 and 2*pi.
Definition global.cpp:584
+
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition global.cpp:617
+
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:241
+
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition global.cpp:1084
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
+ + +
R-G-B color vector.
+
float b
Blue color component.
+
float r
Red color component.
+
float g
Green color component.
+
Vector of spherical coordinates (elevation,azimuth)
+
const float & zenith
Zenithal angle (radians)
+
float azimuth
Azimuthal angle (radians)
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+
float magnitude() const
Compute the vector magnitude.
+ diff --git a/doc/html/_li_d_a_r_8h.html b/doc/html/_li_d_a_r_8h.html index d8cb2851d..b6a9a92a4 100644 --- a/doc/html/_li_d_a_r_8h.html +++ b/doc/html/_li_d_a_r_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Data Structures | @@ -120,9 +132,9 @@ - + - +

Functions

bool sortcol0 (const std::vector< double > &v0, const std::vector< double > &v1)
bool sortcol0 (const std::vector< double > &v0, const std::vector< double > &v1)
 
bool sortcol1 (const std::vector< double > &v0, const std::vector< double > &v1)
bool sortcol1 (const std::vector< double > &v0, const std::vector< double > &v1)
 

Detailed Description

@@ -142,19 +154,12 @@

bool sortcol0 ( - const std::vector< double > &  - v0, + const std::vector< double > & v0, - const std::vector< double > &  - v1  - - - - ) - + const std::vector< double > & v1 )

@@ -196,7 +194,8 @@

+

diff --git a/doc/html/_li_d_a_r_8h_source.html b/doc/html/_li_d_a_r_8h_source.html index de0f1f9c5..5c754aacb 100644 --- a/doc/html/_li_d_a_r_8h_source.html +++ b/doc/html/_li_d_a_r_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
LiDAR.h
@@ -101,6 +113,7 @@
21
22#include "s_hull_pro.h"
23
+
24template <class datatype> class HitTable {
25public:
26
@@ -160,7 +173,9 @@
80 std::vector<std::vector<datatype> > data;
81
82};
+
83
+
84struct HitPoint{
85 helios::vec3 position;
86 helios::SphericalCoord direction;
@@ -186,7 +201,9 @@
106 data = __data;
107 }
108};
+
109
+
111 helios::vec3 vertex0, vertex1, vertex2;
112 int ID0, ID1, ID2;
@@ -231,7 +248,9 @@
151
152 }
153};
+
154
+
155struct GridCell{
156 helios::vec3 center;
157 helios::vec3 global_anchor;
@@ -260,8 +279,10 @@
180 maximum_height = 0;
181 }
182};
+
183
185
+
189
191 ScanMetadata();
@@ -300,7 +321,9 @@
265 helios::int2 direction2rc(const helios::SphericalCoord &direction ) const;
266
267};
+
268
+
271 private:
272
@@ -596,7 +619,7 @@
874 void triangulateHitPoints( float Lmax, float max_aspect_ratio );
875
876 //ERK
-
878
+
878
886 void triangulateHitPoints( float Lmax, float max_aspect_ratio, const char* scalar_field, float threshold, const char* comparator );
887
888
@@ -711,6 +734,7 @@
1141 std::vector<uint> peakFinder(std::vector<float> signal);
1142
1143};
+
1144
1145bool sortcol0( const std::vector<double>& v0, const std::vector<double>& v1 );
1146
@@ -719,131 +743,132 @@
1149#endif
-
Definition: LiDAR.h:24
-
Primary class for terrestrial LiDAR scan.
Definition: LiDAR.h:270
-
void getGridBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all grid cells in the point cloud.
Definition: LiDAR.cpp:988
-
void addTrianglesToVisualizer(Visualizer *visualizer) const
Add all triangles to the visualizer plug-in, and color them by their r-g-b color.
Definition: LiDAR.cpp:638
-
void setHitGridCell(uint index, int cell)
Set the grid cell in which the hit point resides.
Definition: LiDAR.cpp:426
-
LiDARcloud()
LiDAR point cloud constructor.
Definition: LiDAR.cpp:89
-
void addHitsToVisualizer(Visualizer *visualizer, uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
Definition: LiDAR.cpp:521
-
std::vector< float > calculateSyntheticLeafArea(helios::Context *context)
Calculate the surface area of all primitives in the context.
Definition: LiDAR.cu:3712
+ +
Primary class for terrestrial LiDAR scan.
Definition LiDAR.h:270
+
void getGridBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all grid cells in the point cloud.
Definition LiDAR.cpp:988
+
void addTrianglesToVisualizer(Visualizer *visualizer) const
Add all triangles to the visualizer plug-in, and color them by their r-g-b color.
Definition LiDAR.cpp:638
+
void setHitGridCell(uint index, int cell)
Set the grid cell in which the hit point resides.
Definition LiDAR.cpp:426
+
LiDARcloud()
LiDAR point cloud constructor.
Definition LiDAR.cpp:89
+
void addHitsToVisualizer(Visualizer *visualizer, uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
Definition LiDAR.cpp:521
+
std::vector< float > calculateSyntheticLeafArea(helios::Context *context)
Calculate the surface area of all primitives in the context.
Definition LiDAR.cu:3712
void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::int2 &row_column, const helios::RGBcolor &color, const std::map< std::string, double > &data)
Specify a scan point as a hit by providing the (x,y,z) coordinates and row,column in scan table.
-
int getHitGridCell(uint index) const
Get the grid cell in which the hit point resides.
Definition: LiDAR.cpp:413
-
void coordinateRotation(const helios::SphericalCoord &rotation)
Rotate all points in the point cloud about the origin.
Definition: LiDAR.cpp:464
-
double getHitData(uint index, const char *label) const
Set floating point data value associated with a hit point.
Definition: LiDAR.cpp:345
-
uint getGridCellCount() const
Get the number of cells in the grid.
Definition: LiDAR.cpp:1791
-
void addGridToVisualizer(Visualizer *visualizer) const
Add all grid cells to the visualizer plug-in.
Definition: LiDAR.cpp:585
-
void exportPointCloud(const char *filename)
Export to file all points in the point cloud to an ASCII text file following the column format specif...
Definition: fileIO.cpp:728
-
void enableMessages()
Enable all print messages to the screen.
Definition: LiDAR.cpp:104
-
void setCellLeafArea(float area, uint index)
Set the leaf area of a grid cell in m^2.
Definition: LiDAR.cpp:1918
-
int getHitIndex(uint scanID, uint row, uint column) const
Get the index of a scan point based on its row and column in the hit table.
Definition: LiDAR.cpp:395
-
float getCellLeafAreaDensity(uint index) const
Get the leaf area density of a grid cell in 1/m.
Definition: LiDAR.cpp:1938
-
uint getScanSizeTheta(uint scanID) const
Get the number of scan points in the theta (zenithal) direction.
Definition: LiDAR.cpp:265
-
void exportTriangleAreas(const char *filename)
Export to file the area of all triangles formed.
Definition: fileIO.cpp:562
-
void getHitBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all hit points in the point cloud.
Definition: LiDAR.cpp:951
-
void setHitData(uint index, const char *label, double value)
Get floating point data value associated with a hit point.
Definition: LiDAR.cpp:335
-
std::vector< uint > addTrunkReconstructionToContext(helios::Context *context) const
Add reconstructed trunk triangles to the Context.
Definition: LiDAR.cpp:925
-
void setCellGtheta(float Gtheta, uint index)
Set the average G(theta) value of a grid cell.
Definition: LiDAR.cpp:1949
-
std::vector< uint > addReconstructedTriangleGroupsToContext(helios::Context *context) const
Add triangle groups used in the direct reconstruction to the Context.
Definition: LiDAR.cpp:892
-
void minPulseFilter(const char *scalar)
Filter full-waveform data according to the minimum scalar value along each pulse. Any scalar value ca...
Definition: LiDAR.cpp:1230
-
std::vector< helios::vec3 > gapfillMisses()
For scans that are missing points (e.g., sky points), this function will attempt to fill in missing p...
Definition: LiDAR.cu:492
-
float getCellGtheta(uint index) const
Get the G(theta) of a grid cell.
Definition: LiDAR.cpp:1959
-
int getHitScanID(uint index) const
Get the scan with which a hit is associated.
Definition: LiDAR.cpp:385
-
void addTrianglesToContext(helios::Context *context) const
Add triangle geometry to Helios context.
Definition: LiDAR.cpp:1772
-
helios::vec3 getCellSize(uint index) const
Get the size of a grid cell by its index.
Definition: LiDAR.cpp:1829
-
uint getHitCount() const
Get the number of hit points in the point cloud.
Definition: LiDAR.cpp:254
-
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition: fileIO.cpp:22
-
helios::vec3 getCellCenter(uint index) const
Get the (x,y,z) coordinate of a grid cell by its index.
Definition: LiDAR.cpp:1809
-
void exportLeafAreaDensities(const char *filename)
Export to file the leaf area density within each grid cell. Lines of the file correspond to each grid...
Definition: fileIO.cpp:688
-
void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
Definition: LiDAR.cpp:171
-
void coordinateShift(const helios::vec3 &shift)
Apply a translation to all points in the point cloud.
Definition: LiDAR.cpp:436
-
void addGrid(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &ndiv, float rotation)
Add a grid to point cloud instead of reading in from an xml file.
Definition: LiDAR.cpp:674
+
int getHitGridCell(uint index) const
Get the grid cell in which the hit point resides.
Definition LiDAR.cpp:413
+
void coordinateRotation(const helios::SphericalCoord &rotation)
Rotate all points in the point cloud about the origin.
Definition LiDAR.cpp:464
+
double getHitData(uint index, const char *label) const
Set floating point data value associated with a hit point.
Definition LiDAR.cpp:345
+
uint getGridCellCount() const
Get the number of cells in the grid.
Definition LiDAR.cpp:1791
+
void addGridToVisualizer(Visualizer *visualizer) const
Add all grid cells to the visualizer plug-in.
Definition LiDAR.cpp:585
+
void exportPointCloud(const char *filename)
Export to file all points in the point cloud to an ASCII text file following the column format specif...
Definition fileIO.cpp:728
+
void enableMessages()
Enable all print messages to the screen.
Definition LiDAR.cpp:104
+
void setCellLeafArea(float area, uint index)
Set the leaf area of a grid cell in m^2.
Definition LiDAR.cpp:1918
+
int getHitIndex(uint scanID, uint row, uint column) const
Get the index of a scan point based on its row and column in the hit table.
Definition LiDAR.cpp:395
+
float getCellLeafAreaDensity(uint index) const
Get the leaf area density of a grid cell in 1/m.
Definition LiDAR.cpp:1938
+
uint getScanSizeTheta(uint scanID) const
Get the number of scan points in the theta (zenithal) direction.
Definition LiDAR.cpp:265
+
void exportTriangleAreas(const char *filename)
Export to file the area of all triangles formed.
Definition fileIO.cpp:562
+
void getHitBoundingBox(helios::vec3 &boxmin, helios::vec3 &boxmax) const
Form an axis-aligned bounding box for all hit points in the point cloud.
Definition LiDAR.cpp:951
+
void setHitData(uint index, const char *label, double value)
Get floating point data value associated with a hit point.
Definition LiDAR.cpp:335
+
std::vector< uint > addTrunkReconstructionToContext(helios::Context *context) const
Add reconstructed trunk triangles to the Context.
Definition LiDAR.cpp:925
+
void setCellGtheta(float Gtheta, uint index)
Set the average G(theta) value of a grid cell.
Definition LiDAR.cpp:1949
+
std::vector< uint > addReconstructedTriangleGroupsToContext(helios::Context *context) const
Add triangle groups used in the direct reconstruction to the Context.
Definition LiDAR.cpp:892
+
void minPulseFilter(const char *scalar)
Filter full-waveform data according to the minimum scalar value along each pulse. Any scalar value ca...
Definition LiDAR.cpp:1230
+
std::vector< helios::vec3 > gapfillMisses()
For scans that are missing points (e.g., sky points), this function will attempt to fill in missing p...
Definition LiDAR.cu:492
+
float getCellGtheta(uint index) const
Get the G(theta) of a grid cell.
Definition LiDAR.cpp:1959
+
int getHitScanID(uint index) const
Get the scan with which a hit is associated.
Definition LiDAR.cpp:385
+
void addTrianglesToContext(helios::Context *context) const
Add triangle geometry to Helios context.
Definition LiDAR.cpp:1772
+
helios::vec3 getCellSize(uint index) const
Get the size of a grid cell by its index.
Definition LiDAR.cpp:1829
+
uint getHitCount() const
Get the number of hit points in the point cloud.
Definition LiDAR.cpp:254
+
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition fileIO.cpp:22
+
helios::vec3 getCellCenter(uint index) const
Get the (x,y,z) coordinate of a grid cell by its index.
Definition LiDAR.cpp:1809
+
void exportLeafAreaDensities(const char *filename)
Export to file the leaf area density within each grid cell. Lines of the file correspond to each grid...
Definition fileIO.cpp:688
+
void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
Definition LiDAR.cpp:171
+
void coordinateShift(const helios::vec3 &shift)
Apply a translation to all points in the point cloud.
Definition LiDAR.cpp:436
+
void addGrid(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &ndiv, float rotation)
Add a grid to point cloud instead of reading in from an xml file.
Definition LiDAR.cpp:674
void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const helios::RGBcolor &color, const std::map< std::string, double > &data)
Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
-
void calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic)
Calculate the leaf area for each grid volume using equal weighting method.
Definition: LiDAR.cu:4029
-
helios::vec2 getScanRangeTheta(uint scanID) const
Get the range of scan directions in the theta (zenithal) direction.
Definition: LiDAR.cpp:279
+
void calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic)
Calculate the leaf area for each grid volume using equal weighting method.
Definition LiDAR.cu:4029
+
helios::vec2 getScanRangeTheta(uint scanID) const
Get the range of scan directions in the theta (zenithal) direction.
Definition LiDAR.cpp:279
~LiDARcloud()
LiDAR point cloud destructor.
-
void cropBeamsToGridAngleRange(uint source)
Delete hitpoints that do not pass through / intersect the voxel grid.
Definition: LiDAR.cpp:2494
-
void firstHitFilter()
Filter full-waveform data to include only the first hit per laser pulse. The resulting point cloud wi...
Definition: LiDAR.cpp:1296
-
void exportLeafAreas(const char *filename)
Export to file the leaf area within each grid cell. Lines of the file correspond to each grid cell.
Definition: fileIO.cpp:668
-
std::vector< float > calculateSyntheticGtheta(helios::Context *context)
Calculate the G(theta) of all primitives in the context.
Definition: LiDAR.cpp:1849
-
void addLeafReconstructionToVisualizer(Visualizer *visualizer) const
Add reconstructed leaves (triangles or alpha masks) to the visualizer plug-in.
Definition: LiDAR.cpp:751
-
float getScanBeamDivergence(uint scanID) const
Divergence angle of the laser beam in radians.
Definition: LiDAR.cpp:300
-
Triangulation getTriangle(uint index) const
Get hit point corresponding to first vertex of triangle.
Definition: LiDAR.cpp:512
-
void addTrunkReconstructionToVisualizer(Visualizer *visualizer) const
Add trunk reconstruction to the visualizer plug-in. Colors reconstructed triangles by hit point color...
Definition: LiDAR.cpp:803
-
float getCellRotation(uint index) const
Get the size of a grid cell by its index.
Definition: LiDAR.cpp:1839
-
void scalarFilter(const char *scalar_field, float threshold, const char *comparator)
Filter hit points based on a scalar field given by a column in the ASCII data.
Definition: LiDAR.cpp:1074
-
void maxPulseFilter(const char *scalar)
Filter full-waveform data according to the maximum scalar value along each pulse. Any scalar value ca...
Definition: LiDAR.cpp:1164
-
helios::vec3 getScanOrigin(uint scanID) const
Get the (x,y,z) scan origin.
Definition: LiDAR.cpp:258
-
void calculateLeafAreaGPU_testing(int min_voxel_hits)
Calculate the leaf area for each grid volume.
Definition: LiDAR.cu:1359
-
void trunkReconstruction(const helios::vec3 &box_center, const helios::vec3 &box_size, float Lmax, float max_aspect_ratio)
Reconstruct the trunk of the tree. In order to do this, you must specify the center and size of a rec...
Definition: LiDAR.cu:2838
-
helios::SphericalCoord getHitRaydir(uint index) const
Get ray direction of hit point in the scan based on its index.
Definition: LiDAR.cpp:324
-
int selfTest()
Self-test (unit test) function.
Definition: selfTest.cpp:21
-
uint getScanCount()
Get number of scans in point cloud.
Definition: LiDAR.cpp:135
-
bool doesHitDataExist(uint index, const char *label) const
Check if scalar data exists for a hit point.
Definition: LiDAR.cpp:360
-
void syntheticScan(helios::Context *context)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns onl...
Definition: LiDAR.cu:3093
-
void exportTriangleInclinationDistribution(const char *filename, uint Nbins)
Export to file discrete area-weighted inclination angle probability distribution based on the triangu...
Definition: fileIO.cpp:610
-
uint getScanSizePhi(uint scanID) const
Get the number of scan points in the phi (azimuthal) direction.
Definition: LiDAR.cpp:272
-
helios::RGBcolor getHitColor(uint index) const
Get color of hit point.
Definition: LiDAR.cpp:375
-
void calculateHitGridCellGPU()
Determine the grid cell in which each hit point resides for the whole point cloud - GPU accelerated v...
Definition: LiDAR.cu:268
-
helios::vec2 getScanRangePhi(uint scanID) const
Get the range of scan directions in the phi (azimuthal) direction.
Definition: LiDAR.cpp:286
-
void lastHitFilter()
Filter full-waveform data to include only the last hit per laser pulse. The resulting point cloud wil...
Definition: LiDAR.cpp:1336
-
void leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)
Perform a leaf reconstruction based on texture-masked Patches within each gridcell....
Definition: LiDAR.cpp:2074
-
float getScanBeamExitDiameter(uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
Definition: LiDAR.cpp:293
-
uint addScan(ScanMetadata &newscan)
Add a LiDAR scan to the point cloud.
Definition: LiDAR.cpp:139
-
std::vector< std::string > getScanColumnFormat(uint scanID) const
Get the labels for columns in ASCII input/output file.
Definition: LiDAR.cpp:307
-
uint getTriangleCount() const
Get the number of triangles formed by the triangulation.
Definition: LiDAR.cpp:508
-
void xyzFilter(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
overloaded version of xyzFilter that defaults to deleting points outside the provided bounding box
Definition: LiDAR.cpp:1105
-
void exportPointCloudPTX(const char *filename, uint scanID)
Export to file all points from a given scan to PTX file.
Definition: fileIO.cpp:843
-
void triangulateHitPoints(float Lmax, float max_aspect_ratio)
Perform triangulation on all hit points in point cloud.
Definition: LiDAR.cpp:1382
-
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
Definition: LiDAR.cpp:314
-
void calculateLeafAreaGPU_synthetic(helios::Context *context, bool beamoutput, bool fillAnalytic)
Calculate the leaf area for each grid volume in a synthetic scan using several different method for e...
Definition: LiDAR.cu:1690
-
void addGridCell(const helios::vec3 &center, const helios::vec3 &size, float rotation)
Add a cell to the grid.
Definition: LiDAR.cpp:1795
-
float getCellLeafArea(uint index) const
Get the leaf area of a grid cell in m^2.
Definition: LiDAR.cpp:1928
-
void deleteHitPoint(uint index)
Delete a hit point in the scan.
Definition: LiDAR.cpp:237
-
std::vector< uint > peakFinder(std::vector< float > signal)
find the indices of the peaks of a vector of floats
Definition: LiDAR.cu:4984
-
void exportTriangleNormals(const char *filename)
Export to file the normal vectors (nx,ny,nz) for all triangles formed.
Definition: fileIO.cpp:499
-
helios::vec3 getCellGlobalAnchor(uint index) const
Get the (x,y,z) coordinate of a grid global anchor by its index.
Definition: LiDAR.cpp:1819
-
void reflectanceFilter(float minreflectance)
Filter scan by imposing a minimum reflectance value.
Definition: LiDAR.cpp:1055
-
std::vector< uint > addLeafReconstructionToContext(helios::Context *context) const
Add reconstructed leaves (texture-masked patches) to the Context.
Definition: LiDAR.cpp:845
+
void cropBeamsToGridAngleRange(uint source)
Delete hitpoints that do not pass through / intersect the voxel grid.
Definition LiDAR.cpp:2494
+
void firstHitFilter()
Filter full-waveform data to include only the first hit per laser pulse. The resulting point cloud wi...
Definition LiDAR.cpp:1296
+
void exportLeafAreas(const char *filename)
Export to file the leaf area within each grid cell. Lines of the file correspond to each grid cell.
Definition fileIO.cpp:668
+
std::vector< float > calculateSyntheticGtheta(helios::Context *context)
Calculate the G(theta) of all primitives in the context.
Definition LiDAR.cpp:1849
+
void addLeafReconstructionToVisualizer(Visualizer *visualizer) const
Add reconstructed leaves (triangles or alpha masks) to the visualizer plug-in.
Definition LiDAR.cpp:751
+
float getScanBeamDivergence(uint scanID) const
Divergence angle of the laser beam in radians.
Definition LiDAR.cpp:300
+
Triangulation getTriangle(uint index) const
Get hit point corresponding to first vertex of triangle.
Definition LiDAR.cpp:512
+
void addTrunkReconstructionToVisualizer(Visualizer *visualizer) const
Add trunk reconstruction to the visualizer plug-in. Colors reconstructed triangles by hit point color...
Definition LiDAR.cpp:803
+
float getCellRotation(uint index) const
Get the size of a grid cell by its index.
Definition LiDAR.cpp:1839
+
void scalarFilter(const char *scalar_field, float threshold, const char *comparator)
Filter hit points based on a scalar field given by a column in the ASCII data.
Definition LiDAR.cpp:1074
+
void maxPulseFilter(const char *scalar)
Filter full-waveform data according to the maximum scalar value along each pulse. Any scalar value ca...
Definition LiDAR.cpp:1164
+
helios::vec3 getScanOrigin(uint scanID) const
Get the (x,y,z) scan origin.
Definition LiDAR.cpp:258
+
void calculateLeafAreaGPU_testing(int min_voxel_hits)
Calculate the leaf area for each grid volume.
Definition LiDAR.cu:1359
+
void trunkReconstruction(const helios::vec3 &box_center, const helios::vec3 &box_size, float Lmax, float max_aspect_ratio)
Reconstruct the trunk of the tree. In order to do this, you must specify the center and size of a rec...
Definition LiDAR.cu:2838
+
helios::SphericalCoord getHitRaydir(uint index) const
Get ray direction of hit point in the scan based on its index.
Definition LiDAR.cpp:324
+
int selfTest()
Self-test (unit test) function.
Definition selfTest.cpp:21
+
uint getScanCount()
Get number of scans in point cloud.
Definition LiDAR.cpp:135
+
bool doesHitDataExist(uint index, const char *label) const
Check if scalar data exists for a hit point.
Definition LiDAR.cpp:360
+
void syntheticScan(helios::Context *context)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns onl...
Definition LiDAR.cu:3093
+
void exportTriangleInclinationDistribution(const char *filename, uint Nbins)
Export to file discrete area-weighted inclination angle probability distribution based on the triangu...
Definition fileIO.cpp:610
+
uint getScanSizePhi(uint scanID) const
Get the number of scan points in the phi (azimuthal) direction.
Definition LiDAR.cpp:272
+
helios::RGBcolor getHitColor(uint index) const
Get color of hit point.
Definition LiDAR.cpp:375
+
void calculateHitGridCellGPU()
Determine the grid cell in which each hit point resides for the whole point cloud - GPU accelerated v...
Definition LiDAR.cu:268
+
helios::vec2 getScanRangePhi(uint scanID) const
Get the range of scan directions in the phi (azimuthal) direction.
Definition LiDAR.cpp:286
+
void lastHitFilter()
Filter full-waveform data to include only the last hit per laser pulse. The resulting point cloud wil...
Definition LiDAR.cpp:1336
+
void leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)
Perform a leaf reconstruction based on texture-masked Patches within each gridcell....
Definition LiDAR.cpp:2074
+
float getScanBeamExitDiameter(uint scanID) const
Get the diameter of the laser beam at exit from the instrument.
Definition LiDAR.cpp:293
+
uint addScan(ScanMetadata &newscan)
Add a LiDAR scan to the point cloud.
Definition LiDAR.cpp:139
+
std::vector< std::string > getScanColumnFormat(uint scanID) const
Get the labels for columns in ASCII input/output file.
Definition LiDAR.cpp:307
+
uint getTriangleCount() const
Get the number of triangles formed by the triangulation.
Definition LiDAR.cpp:508
+
void xyzFilter(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
overloaded version of xyzFilter that defaults to deleting points outside the provided bounding box
Definition LiDAR.cpp:1105
+
void exportPointCloudPTX(const char *filename, uint scanID)
Export to file all points from a given scan to PTX file.
Definition fileIO.cpp:843
+
void triangulateHitPoints(float Lmax, float max_aspect_ratio)
Perform triangulation on all hit points in point cloud.
Definition LiDAR.cpp:1382
+
helios::vec3 getHitXYZ(uint index) const
Get (x,y,z) coordinate of hit point by index.
Definition LiDAR.cpp:314
+
void calculateLeafAreaGPU_synthetic(helios::Context *context, bool beamoutput, bool fillAnalytic)
Calculate the leaf area for each grid volume in a synthetic scan using several different method for e...
Definition LiDAR.cu:1690
+
void addGridCell(const helios::vec3 &center, const helios::vec3 &size, float rotation)
Add a cell to the grid.
Definition LiDAR.cpp:1795
+
float getCellLeafArea(uint index) const
Get the leaf area of a grid cell in m^2.
Definition LiDAR.cpp:1928
+
void deleteHitPoint(uint index)
Delete a hit point in the scan.
Definition LiDAR.cpp:237
+
std::vector< uint > peakFinder(std::vector< float > signal)
find the indices of the peaks of a vector of floats
Definition LiDAR.cu:4984
+
void exportTriangleNormals(const char *filename)
Export to file the normal vectors (nx,ny,nz) for all triangles formed.
Definition fileIO.cpp:499
+
helios::vec3 getCellGlobalAnchor(uint index) const
Get the (x,y,z) coordinate of a grid global anchor by its index.
Definition LiDAR.cpp:1819
+
void reflectanceFilter(float minreflectance)
Filter scan by imposing a minimum reflectance value.
Definition LiDAR.cpp:1055
+
std::vector< uint > addLeafReconstructionToContext(helios::Context *context) const
Add reconstructed leaves (texture-masked patches) to the Context.
Definition LiDAR.cpp:845
void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const std::map< std::string, double > &data)
Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
-
void distanceFilter(float maxdistance)
Filter scan by imposing a maximum distance from the scanner.
Definition: LiDAR.cpp:1035
-
void disableMessages()
Disable all print messages to the screen except for fatal error messages.
Definition: LiDAR.cpp:100
-
void exportGtheta(const char *filename)
Export to file the G(theta) value within each grid cell. Lines of the file correspond to each grid ce...
Definition: fileIO.cpp:708
-
void addGridWireFrametoVisualizer(Visualizer *visualizer) const
Add wire frame of the grid to the visualizer plug-in.
Definition: LiDAR.cpp:716
-
void calculateLeafAreaGPU()
Calculate the leaf area for each grid volume.
Definition: LiDAR.cu:897
-
Class for visualization of simulation results.
Definition: Visualizer.h:265
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
- -
Definition: LiDAR.h:84
-
Structure containing metadata for a terrestrial scan.
Definition: LiDAR.h:188
-
float phiMin
Minimum azimuthal angle of scan in radians.
Definition: LiDAR.h:227
-
float thetaMin
Minimum zenithal angle of scan in radians
Definition: LiDAR.h:214
-
helios::vec3 origin
(x,y,z) coordinate of scanner location
Definition: LiDAR.h:235
-
float thetaMax
Maximum zenithal angle of scan in radians.
Definition: LiDAR.h:219
-
float phiMax
Maximum azimuthal angle of scan in radians.
Definition: LiDAR.h:232
-
ScanMetadata()
Default LiDAR scan data structure.
Definition: LiDAR.cpp:21
+
void distanceFilter(float maxdistance)
Filter scan by imposing a maximum distance from the scanner.
Definition LiDAR.cpp:1035
+
void disableMessages()
Disable all print messages to the screen except for fatal error messages.
Definition LiDAR.cpp:100
+
void exportGtheta(const char *filename)
Export to file the G(theta) value within each grid cell. Lines of the file correspond to each grid ce...
Definition fileIO.cpp:708
+
void addGridWireFrametoVisualizer(Visualizer *visualizer) const
Add wire frame of the grid to the visualizer plug-in.
Definition LiDAR.cpp:716
+
void calculateLeafAreaGPU()
Calculate the leaf area for each grid volume.
Definition LiDAR.cu:897
+
Class for visualization of simulation results.
Definition Visualizer.h:275
+
Stores the state associated with simulation.
Definition Context.h:1882
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+ + +
Structure containing metadata for a terrestrial scan.
Definition LiDAR.h:188
+
float phiMin
Minimum azimuthal angle of scan in radians.
Definition LiDAR.h:227
+
float thetaMin
Minimum zenithal angle of scan in radians
Definition LiDAR.h:214
+
helios::vec3 origin
(x,y,z) coordinate of scanner location
Definition LiDAR.h:235
+
float thetaMax
Maximum zenithal angle of scan in radians.
Definition LiDAR.h:219
+
float phiMax
Maximum azimuthal angle of scan in radians.
Definition LiDAR.h:232
+
ScanMetadata()
Default LiDAR scan data structure.
Definition LiDAR.cpp:21
ScanMetadata(const helios::vec3 &a_origin, uint a_Ntheta, float a_thetaMin, float a_thetaMax, uint a_Nphi, float a_phiMin, float a_phiMax, float a_exitDiameter, float a_beamDivergence, const std::vector< std::string > &a_columnFormat)
Create a LiDAR scan data structure.
-
uint Ntheta
Number of zenithal angles in scan (rows)
Definition: LiDAR.h:209
-
float exitDiameter
Diameter of laser pulse at exit from the scanner.
Definition: LiDAR.h:241
-
uint Nphi
Number of azimuthal angles in scan (columns)
Definition: LiDAR.h:222
-
std::string data_file
File containing hit point data.
Definition: LiDAR.h:206
-
helios::int2 direction2rc(const helios::SphericalCoord &direction) const
Convert the scan ray direction into (row,column) table index.
Definition: LiDAR.cpp:66
-
std::vector< std::string > columnFormat
Vector of strings specifying the columns of the scan ASCII file for input/output.
Definition: LiDAR.h:250
-
float beamDivergence
Divergence angle of the laser beam in radians.
Definition: LiDAR.h:247
-
helios::SphericalCoord rc2direction(uint row, uint column) const
Convert the (row,column) of hit point in a scan to a direction vector.
Definition: LiDAR.cpp:57
- -
R-G-B color vector.
-
Vector of spherical coordinates (elevation,azimuth)
-
Vector of two elements of type 'int'.
-
Vector of three elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
-
float magnitude() const
Compute the vector magnitude.
+
uint Ntheta
Number of zenithal angles in scan (rows)
Definition LiDAR.h:209
+
float exitDiameter
Diameter of laser pulse at exit from the scanner.
Definition LiDAR.h:241
+
uint Nphi
Number of azimuthal angles in scan (columns)
Definition LiDAR.h:222
+
std::string data_file
File containing hit point data.
Definition LiDAR.h:206
+
helios::int2 direction2rc(const helios::SphericalCoord &direction) const
Convert the scan ray direction into (row,column) table index.
Definition LiDAR.cpp:66
+
std::vector< std::string > columnFormat
Vector of strings specifying the columns of the scan ASCII file for input/output.
Definition LiDAR.h:250
+
float beamDivergence
Divergence angle of the laser beam in radians.
Definition LiDAR.h:247
+
helios::SphericalCoord rc2direction(uint row, uint column) const
Convert the (row,column) of hit point in a scan to a direction vector.
Definition LiDAR.cpp:57
+ +
R-G-B color vector.
+
Vector of spherical coordinates (elevation,azimuth)
+
Vector of two elements of type 'int'.
+
Vector of three elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+
float magnitude() const
Compute the vector magnitude.
+ diff --git a/doc/html/_li_d_a_r_doc.html b/doc/html/_li_d_a_r_doc.html index a8ac209f1..928fae3f8 100644 --- a/doc/html/_li_d_a_r_doc.html +++ b/doc/html/_li_d_a_r_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
-
LiDAR Point Cloud Plugin Documentation
+
LiDAR Point Cloud Plugin Documentation
@@ -154,13 +214,13 @@

Package
-td
+
-td
+
-td + NVIDIA CUDA 9.0+ Mac OSX:
$ brew install Caskroom/cask/cuda
Use CUDA installer Use CUDA installer @@ -316,8 +376,8 @@

}
-
Primary class for terrestrial LiDAR scan.
Definition: LiDAR.h:270
-
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition: fileIO.cpp:22
+
Primary class for terrestrial LiDAR scan.
Definition LiDAR.h:270
+
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition fileIO.cpp:22

Establishing grid cells

Rectangular grid cells are used as the basis for processing point cloud data. For example, total leaf area (or leaf area density) may be calculated for each grid cell. Grid cells or "voxels" are parallelpiped volumes. The top and bottom faces are always horizontal, but the cells can be rotated in the azimuthal direction.

@@ -373,7 +433,7 @@

pointcloud.triangulateHitPoints( 0.05, 5 ); //Perform triangulation with Lmax=0.05 and maximum aspect ratio of 5
}
-
void triangulateHitPoints(float Lmax, float max_aspect_ratio)
Perform triangulation on all hit points in point cloud.
Definition: LiDAR.cpp:1382
+
void triangulateHitPoints(float Lmax, float max_aspect_ratio)
Perform triangulation on all hit points in point cloud.
Definition LiDAR.cpp:1382

Calculating leaf area for each grid cell

Using the triangulation and defined grid cells, the plug-in can calculate the leaf area (and leaf area density) for each grid cell. The algorithm for calculating leaf area is described in detail in Bailey and Mahaffee (2017b) (except that in the current implementation, weighting by the sine of the scan zenith direction has been removed).

@@ -395,8 +455,8 @@

pointcloud.calculateLeafAreaGPU(); //Calculate leaf area for each grid cell
}
-
std::vector< helios::vec3 > gapfillMisses()
For scans that are missing points (e.g., sky points), this function will attempt to fill in missing p...
Definition: LiDAR.cu:492
-
void calculateLeafAreaGPU()
Calculate the leaf area for each grid volume.
Definition: LiDAR.cu:897
+
std::vector< helios::vec3 > gapfillMisses()
For scans that are missing points (e.g., sky points), this function will attempt to fill in missing p...
Definition LiDAR.cu:492
+
void calculateLeafAreaGPU()
Calculate the leaf area for each grid volume.
Definition LiDAR.cu:897

Plant reconstruction

A leaf-by-leaf reconstruction can be performed for the plant of interest using the method described in Bailey and Ochoa (2018). The reconstruction utilizes the triangulation and leaf area computations to ensure the correct leaf angle and area distributions on average, and thus requires that these routines have been run before performing the reconstruction.

@@ -424,9 +484,9 @@

pointcloud.addLeafReconstructionToContext( &context );
}
-
void leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)
Perform a leaf reconstruction based on texture-masked Patches within each gridcell....
Definition: LiDAR.cpp:2074
-
std::vector< uint > addLeafReconstructionToContext(helios::Context *context) const
Add reconstructed leaves (texture-masked patches) to the Context.
Definition: LiDAR.cpp:845
-
Stores the state associated with simulation.
Definition: Context.h:1882
+
void leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)
Perform a leaf reconstruction based on texture-masked Patches within each gridcell....
Definition LiDAR.cpp:2074
+
std::vector< uint > addLeafReconstructionToContext(helios::Context *context) const
Add reconstructed leaves (texture-masked patches) to the Context.
Definition LiDAR.cpp:845
+
Stores the state associated with simulation.
Definition Context.h:1882

Generating Synthetic (Simulated) LiDAR Data

The LiDAR plug-in can simulate the measurements of discrete-return and full-waveform instruments based on the geometry in the Context. Ray-tracing is used to simulate the emission of radiation from the instrument, and based on ray-object intersection tests with primitive geometry in the model domain, the simulated hit points can be determined. Currently, only a rectangular scan pattern is supported.

@@ -434,7 +494,7 @@

For full-waveform data simulation, multiple rays are cast for a single laser beam pulse. The density of rays is Gaussian, with the peak at the center of the beam. The model will also record the target count, target index, and timestamp associated with each hit point.

XML parameter file

-

To generate synthetic discrete-return LiDAR data, first add all desired model geometry to the Context. Then declare an instance of the LiDARcloud class as above, and load an XML file containing the scan parameters. As in the case of importing a real point cloud dataset, the XML file must specify the scan origin and the scan resolution at a minimum (see above). However, in the case of synthetic data generation, you will not specify a filename to read containing point cloud data, as this data will be generated by the simulation. You can optionally specify the ASCII_format tag, which will determine which additional data fields should be recorded for each hit point. Valid hit point data fields are listed above in Loading scan data from file.

+

To generate synthetic discrete-return LiDAR data, first add all desired model geometry to the Context. Then declare an instance of the LiDARcloud class as above, and load an XML file containing the scan parameters. As in the case of importing a real point cloud dataset, the XML file must specify the scan origin and the scan resolution at a minimum (see above). However, in the case of synthetic data generation, you will not specify a filename to read containing point cloud data, as this data will be generated by the simulation. You can optionally specify the ASCII_format tag, which will determine which additional data fields should be recorded for each hit point. Valid hit point data fields are listed above in Loading scan data from file.

If no ASCII_format tag is provided in the XML file, the default is to record the (x,y,z) position of the hit point. If the function LiDARcloud::exportPointCloud() is called, it will export the simulated point cloud according to the provided ASCII_format tag (or the default if not provided).

Note that you can add multiple <scan></scan> blocks in a single XML file to perform multiple scans.

@@ -473,9 +533,9 @@

pointcloud.exportPointCloud( "/path/to/file.xyz" ); //write to ASCII file
}
-
void exportPointCloud(const char *filename)
Export to file all points in the point cloud to an ASCII text file following the column format specif...
Definition: fileIO.cpp:728
-
void syntheticScan(helios::Context *context)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns onl...
Definition: LiDAR.cu:3093
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
+
void exportPointCloud(const char *filename)
Export to file all points in the point cloud to an ASCII text file following the column format specif...
Definition fileIO.cpp:728
+
void syntheticScan(helios::Context *context)
Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns onl...
Definition LiDAR.cu:3093
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212

Synthetic waveform data

Generation of synthetic full-waveform data is similar to discrete-return, except that additional information is needed to define the scan and simulation. In the XML file, the user must specify the diameter of the laser beam at the scan origin using the <exitDiameter> </exitDiameter> tags, as well as the angle of beam divergence in radians using the <beamDivergence> </beamDivergence> tags. If the exit diameter value is not specified, the default value of 0 is used, which means that the model will revert to discrete-return data generation. If the beam divergence value is not specified, a default beam divergence of 0 will be assumed, which effectively just means that the beam will remain perfectly cylindrical with diameter of exitDiameter.

@@ -555,8 +615,8 @@

}
-
void addHitsToVisualizer(Visualizer *visualizer, uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
Definition: LiDAR.cpp:521
-
Class for visualization of simulation results.
Definition: Visualizer.h:265
+
void addHitsToVisualizer(Visualizer *visualizer, uint pointsize) const
Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
Definition LiDAR.cpp:521
+
Class for visualization of simulation results.
Definition Visualizer.h:275

Writing results to file

Results of data processing can be easily written to file for external analysis. The following table lists these functions. Data is written to an ASCII text file, where each line in the file corresponds to a different data point (e.g., hit point, triangle, etc.).

@@ -609,16 +669,17 @@

pointcloud.exportPointCloud( "../output/pointcloud.xyz" );
}
-
uint getGridCellCount() const
Get the number of cells in the grid.
Definition: LiDAR.cpp:1791
-
void exportTriangleAreas(const char *filename)
Export to file the area of all triangles formed.
Definition: fileIO.cpp:562
-
void exportLeafAreaDensities(const char *filename)
Export to file the leaf area density within each grid cell. Lines of the file correspond to each grid...
Definition: fileIO.cpp:688
-
void exportLeafAreas(const char *filename)
Export to file the leaf area within each grid cell. Lines of the file correspond to each grid cell.
Definition: fileIO.cpp:668
-
void exportTriangleNormals(const char *filename)
Export to file the normal vectors (nx,ny,nz) for all triangles formed.
Definition: fileIO.cpp:499
+
uint getGridCellCount() const
Get the number of cells in the grid.
Definition LiDAR.cpp:1791
+
void exportTriangleAreas(const char *filename)
Export to file the area of all triangles formed.
Definition fileIO.cpp:562
+
void exportLeafAreaDensities(const char *filename)
Export to file the leaf area density within each grid cell. Lines of the file correspond to each grid...
Definition fileIO.cpp:688
+
void exportLeafAreas(const char *filename)
Export to file the leaf area within each grid cell. Lines of the file correspond to each grid cell.
Definition fileIO.cpp:668
+
void exportTriangleNormals(const char *filename)
Export to file the normal vectors (nx,ny,nz) for all triangles formed.
Definition fileIO.cpp:499

+ diff --git a/doc/html/_making_masks.html b/doc/html/_making_masks.html index 68ed970b7..c24fe9906 100644 --- a/doc/html/_making_masks.html +++ b/doc/html/_making_masks.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Making texture mask files with transparency using GIMP
+
Making texture mask files with transparency using GIMP

GIMP (GNU Image Processing Program) is a free image processing program that makes creating mask files easy. The example below shows how to make a mask file for a leaf.

@@ -121,7 +133,8 @@

+
diff --git a/doc/html/_overview.html b/doc/html/_overview.html index 45d681857..3b5028ee6 100644 --- a/doc/html/_overview.html +++ b/doc/html/_overview.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Overview
+
Overview
diff --git a/doc/html/_p_c_g_p_u_timeout.html b/doc/html/_p_c_g_p_u_timeout.html index 36ea111de..dcd2df5e2 100644 --- a/doc/html/_p_c_g_p_u_timeout.html +++ b/doc/html/_p_c_g_p_u_timeout.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Increasing graphics driver timeout
+
Increasing graphics driver timeout

By default, Windows constantly monitors the GPU and driver to make sure it is responding as expected (called Timeout Detection and Recovery, or TDR). If it does not respond after 2 seconds, it will reset the driver. This is problematic for general purpose GPU computing because intensive calculations may take longer than 2 seconds.

@@ -104,7 +116,8 @@
+
diff --git a/doc/html/_photosynthesis_doc.html b/doc/html/_photosynthesis_doc.html index 4415bf2a5..4503c4ccf 100644 --- a/doc/html/_photosynthesis_doc.html +++ b/doc/html/_photosynthesis_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Photosynthesis Model Plugin Documentation
+
Photosynthesis Model Plugin Documentation

Table of Contents

-
@@ -202,7 +266,7 @@

photosynthesismodel.setModelType_Empirical();
}
- +

Farquhar, von Caemmerer, Berry Model Description

The model of Farquhar, von Caemmerer, and Berry (1980) is a biochemical model of photosynthesis. The form used here predicts photosynthetic production as a function of photoshynthetically active radiation flux, ambient CO2 concentration, and stomatal conductance, which may itself provide responses to a number of additional environmental variables.

@@ -366,7 +430,7 @@

afmc.setVcmax(1.5*fmc.getVcmaxTempResponse().value_at_25C, fmc.getVcmaxTempResponse().dHa);
photosynthesis.setModelCoefficients(afmc,almondleaves);
}
- +

Empirical Model Description

The net photosynthetic rate is described by the equation:

@@ -464,7 +528,8 @@

+ diff --git a/doc/html/_photosynthesis_model_8cpp.html b/doc/html/_photosynthesis_model_8cpp.html index c526b8594..1de01f528 100644 --- a/doc/html/_photosynthesis_model_8cpp.html +++ b/doc/html/_photosynthesis_model_8cpp.html @@ -38,30 +38,41 @@

-
 v1.3.25 +
 v1.3.26
- + + + +
+
PhotosynthesisModel.cpp File Reference
@@ -106,7 +118,8 @@
+
diff --git a/doc/html/_photosynthesis_model_8cpp_source.html b/doc/html/_photosynthesis_model_8cpp_source.html index 12f5ec21f..296462e45 100644 --- a/doc/html/_photosynthesis_model_8cpp_source.html +++ b/doc/html/_photosynthesis_model_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
PhotosynthesisModel.cpp
@@ -99,6 +111,7 @@
19using namespace std;
20using namespace helios;
21
+
23 context = a_context;
24
@@ -113,6 +126,7 @@
33
34
35}
+
36
37int PhotosynthesisModel::selfTest() {
38
@@ -234,21 +248,28 @@
154 return 0;
155}
156
+
158 model = "empirical";
159}
+
160
+
162 model = "farquhar";
163}
+
164
165
+
167 empiricalmodelcoeffs = modelcoefficients;
168 empiricalmodel_coefficients.clear();
169 model = "empirical";
170}
+
171
+
173 const std::vector<uint> &UUIDs) {
174 for (uint UUID: UUIDs) {
@@ -256,13 +277,17 @@
176 }
177 model = "empirical";
178}
+
179
+
181 farquharmodelcoeffs = modelcoefficients;
182 farquharmodel_coefficients.clear();
183 model = "farquhar";
184}
+
185
+
187 const std::vector<uint> &UUIDs) {
188 for (uint UUID: UUIDs) {
@@ -270,7 +295,9 @@
190 }
191 model = "farquhar";
192}
+
193
+
194void PhotosynthesisModel::setModelCoefficients(const std::vector<FarquharModelCoefficients> &modelcoefficients, const std::vector<uint> &UUIDs) {
195 if (modelcoefficients.size() != UUIDs.size()) {
196 printf("WARNING (PhotosynthesisModel::setModelCoefficients): number of model coefficients (%zu) does not match number of UUIDs (%zu).",
@@ -282,7 +309,9 @@
202 }
203 model = "farquhar";
204}
+
205
+
@@ -290,7 +319,9 @@
210 farquharmodel_coefficients.clear();
211 model = "farquhar";
212}
+
213
+
214void PhotosynthesisModel::setFarquharCoefficientsFromLibrary(const std::string &species, const std::vector<uint> &UUIDs) {
@@ -299,7 +330,9 @@
219 }
220 model = "farquhar";
221}
+
222
+
224 std::string s = std::move(species);
@@ -423,11 +456,15 @@
343 }
344 return fmc;
345}
+
346
+
348 run(context->getAllUUIDs());
349}
+
350
+
351void PhotosynthesisModel::run(const std::vector<uint> &lUUIDs) {
352
353 for (uint UUID: lUUIDs) {
@@ -579,6 +616,7 @@
499
500
501}
+
502
503float PhotosynthesisModel::evaluateCi_Empirical(const EmpiricalModelCoefficients &params, float Ci, float CO2, float fL,
504 float Rd, float gM) const {
@@ -802,6 +840,7 @@
722
723}
724
+
726
@@ -815,7 +854,9 @@
735 return coeffs;
736
737}
+
738
+
740
@@ -829,15 +870,21 @@
749 return coeffs;
750
751}
+
752
+
754 message_flag = false;
755}
+
756
+
758 message_flag = true;
759}
+
760
+
762
763 if (strcmp(label, "Ci") == 0 || strcmp(label, "limitation_state") == 0 || strcmp(label, "Gamma_CO2") == 0) {
@@ -849,11 +896,15 @@
769 }
770
771}
+
772
+
776
+
777void PhotosynthesisModel::printDefaultValueReport(const std::vector<uint> &UUIDs) const {
778
779 size_t assumed_default_i = 0;
@@ -916,41 +967,43 @@
836 std::cout << "--------------------------------------------------" << std::endl;
837
838}
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
+
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
- -
PhotosynthesisModel(helios::Context *a_context)
Default constructor.
-
void setFarquharCoefficientsFromLibrary(const std::string &species)
Set the Farquhar-von Caemmerer-Berry model coefficients for all primitives based on a species from th...
-
void disableMessages()
Disable output messages to the standard output.
-
void setModelType_Farquhar()
Sets photosynthesis to be calculated according to the Farquhar-von Caemmerer-Berry model.
-
void setModelCoefficients(const EmpiricalModelCoefficients &modelcoefficients)
Set the empirical model coefficients for all primitives.
-
EmpiricalModelCoefficients getEmpiricalModelCoefficients(uint UUID)
Get the current model coefficients for the empirical model.
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
-
void run()
Run the model for all UUIDs in the Context.
-
void enableMessages()
Enable output messages to the standard output.
-
FarquharModelCoefficients getFarquharCoefficientsFromLibrary(const std::string &species)
Get Farquhar-von Caemmerer-Berry model coefficients for a species from the library.
-
void setModelType_Empirical()
Sets photosynthesis to be calculated according to the empirical model.
-
FarquharModelCoefficients getFarquharModelCoefficients(uint UUID)
Get the current model coefficients for the Farquhar-von Caemmerer-Berry model.
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
Use Newton-Raphson method to find the zero of a function.
Definition: global.cpp:2977
-
anytype clamp(anytype value, anytype min, anytype max)
Clamp value to be within some specified bounds.
Definition: global.cpp:1055
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
- - - + +
PhotosynthesisModel(helios::Context *a_context)
Default constructor.
+
void setFarquharCoefficientsFromLibrary(const std::string &species)
Set the Farquhar-von Caemmerer-Berry model coefficients for all primitives based on a species from th...
+
void disableMessages()
Disable output messages to the standard output.
+
void setModelType_Farquhar()
Sets photosynthesis to be calculated according to the Farquhar-von Caemmerer-Berry model.
+
void setModelCoefficients(const EmpiricalModelCoefficients &modelcoefficients)
Set the empirical model coefficients for all primitives.
+
EmpiricalModelCoefficients getEmpiricalModelCoefficients(uint UUID)
Get the current model coefficients for the empirical model.
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
+
void run()
Run the model for all UUIDs in the Context.
+
void enableMessages()
Enable output messages to the standard output.
+
FarquharModelCoefficients getFarquharCoefficientsFromLibrary(const std::string &species)
Get Farquhar-von Caemmerer-Berry model coefficients for a species from the library.
+
void setModelType_Empirical()
Sets photosynthesis to be calculated according to the empirical model.
+
FarquharModelCoefficients getFarquharModelCoefficients(uint UUID)
Get the current model coefficients for the Farquhar-von Caemmerer-Berry model.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
Use Newton-Raphson method to find the zero of a function.
Definition global.cpp:2977
+
anytype clamp(anytype value, anytype min, anytype max)
Clamp value to be within some specified bounds.
Definition global.cpp:1055
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+ + +
+
diff --git a/doc/html/_photosynthesis_model_8h.html b/doc/html/_photosynthesis_model_8h.html index 931133cc8..b1e3bb70f 100644 --- a/doc/html/_photosynthesis_model_8h.html +++ b/doc/html/_photosynthesis_model_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -119,7 +131,8 @@
+
diff --git a/doc/html/_photosynthesis_model_8h_source.html b/doc/html/_photosynthesis_model_8h_source.html index cb4007ced..94f1cc648 100644 --- a/doc/html/_photosynthesis_model_8h_source.html +++ b/doc/html/_photosynthesis_model_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
PhotosynthesisModel.h
@@ -98,6 +110,7 @@
18
19#include "Context.h"
20
+
23 value_at_25C = 100.0f;
@@ -150,8 +163,10 @@
70 float Topt;
71
72};
+
73
74
+
76
@@ -188,7 +203,9 @@
108 float kC;
109
110};
+
111
+
113public:
@@ -322,13 +339,15 @@
242
243 friend class PhotosynthesisModel;
244};
+
245
246
+
248public:
249
251
-
254 explicit PhotosynthesisModel(helios::Context *a_context);
+
254 explicit PhotosynthesisModel(helios::Context *a_context);
255
256 int selfTest();
257
@@ -419,30 +438,33 @@
401 std::vector<std::string> output_prim_data;
402
403};
+
404
405#endif
- -
void setFarquharCoefficientsFromLibrary(const std::string &species)
Set the Farquhar-von Caemmerer-Berry model coefficients for all primitives based on a species from th...
-
void disableMessages()
Disable output messages to the standard output.
-
void setModelType_Farquhar()
Sets photosynthesis to be calculated according to the Farquhar-von Caemmerer-Berry model.
-
void setModelCoefficients(const EmpiricalModelCoefficients &modelcoefficients)
Set the empirical model coefficients for all primitives.
-
EmpiricalModelCoefficients getEmpiricalModelCoefficients(uint UUID)
Get the current model coefficients for the empirical model.
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
-
void run()
Run the model for all UUIDs in the Context.
-
void enableMessages()
Enable output messages to the standard output.
-
FarquharModelCoefficients getFarquharCoefficientsFromLibrary(const std::string &species)
Get Farquhar-von Caemmerer-Berry model coefficients for a species from the library.
-
void setModelType_Empirical()
Sets photosynthesis to be calculated according to the empirical model.
-
FarquharModelCoefficients getFarquharModelCoefficients(uint UUID)
Get the current model coefficients for the Farquhar-von Caemmerer-Berry model.
-
Stores the state associated with simulation.
Definition: Context.h:1882
- - - + +
PhotosynthesisModel(helios::Context *a_context)
Default constructor.
+
void setFarquharCoefficientsFromLibrary(const std::string &species)
Set the Farquhar-von Caemmerer-Berry model coefficients for all primitives based on a species from th...
+
void disableMessages()
Disable output messages to the standard output.
+
void setModelType_Farquhar()
Sets photosynthesis to be calculated according to the Farquhar-von Caemmerer-Berry model.
+
void setModelCoefficients(const EmpiricalModelCoefficients &modelcoefficients)
Set the empirical model coefficients for all primitives.
+
EmpiricalModelCoefficients getEmpiricalModelCoefficients(uint UUID)
Get the current model coefficients for the empirical model.
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
+
void run()
Run the model for all UUIDs in the Context.
+
void enableMessages()
Enable output messages to the standard output.
+
FarquharModelCoefficients getFarquharCoefficientsFromLibrary(const std::string &species)
Get Farquhar-von Caemmerer-Berry model coefficients for a species from the library.
+
void setModelType_Empirical()
Sets photosynthesis to be calculated according to the empirical model.
+
FarquharModelCoefficients getFarquharModelCoefficients(uint UUID)
Get the current model coefficients for the Farquhar-von Caemmerer-Berry model.
+
Stores the state associated with simulation.
Definition Context.h:1882
+ + +
+ diff --git a/doc/html/_plant_architecture_8cpp.html b/doc/html/_plant_architecture_8cpp.html index 85982ee85..7d5cdf51b 100644 --- a/doc/html/_plant_architecture_8cpp.html +++ b/doc/html/_plant_architecture_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -101,13 +113,13 @@ - + - + - +

Functions

float interpolateTube (const std::vector< float > &P, float frac)
float interpolateTube (const std::vector< float > &P, float frac)
 Interpolate the radius of a point along a tube.
 
helios::vec3 interpolateTube (const std::vector< vec3 > &P, float frac)
helios::vec3 interpolateTube (const std::vector< vec3 > &P, float frac)
 Interpolate the position of a point along a tube.
 
std::vector< uint > makeTubeFromCones (uint radial_subdivisions, const std::vector< helios::vec3 > &vertices, const std::vector< float > &radii, const std::vector< helios::RGBcolor > &colors, helios::Context *context_ptr)
std::vector< uint > makeTubeFromCones (uint radial_subdivisions, const std::vector< helios::vec3 > &vertices, const std::vector< float > &radii, const std::vector< helios::RGBcolor > &colors, helios::Context *context_ptr)
 

Detailed Description

@@ -127,19 +139,12 @@

float interpolateTube ( - const std::vector< float > &  - P, + const std::vector< float > & P, - float  - frac  - - - - ) - + float frac )

@@ -166,19 +171,12 @@

helios::vec3 interpolateTube ( - const std::vector< helios::vec3 > &  - P, + const std::vector< helios::vec3 > & P, - float  - frac  - - - - ) - + float frac )

@@ -205,37 +203,27 @@

std::vector< uint > makeTubeFromCones ( - uint  - radial_subdivisions, + uint radial_subdivisions, - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const std::vector< float > &  - radii, + const std::vector< float > & radii, - const std::vector< helios::RGBcolor > &  - colors, + const std::vector< helios::RGBcolor > & colors, - helios::Context *  - context_ptr  - - - - ) - + helios::Context * context_ptr )

@@ -247,7 +235,8 @@

+

diff --git a/doc/html/_plant_architecture_8cpp_source.html b/doc/html/_plant_architecture_8cpp_source.html index c34d68e16..e00aec560 100644 --- a/doc/html/_plant_architecture_8cpp_source.html +++ b/doc/html/_plant_architecture_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
PlantArchitecture.cpp
@@ -99,6 +111,7 @@
19
20using namespace helios;
21
+
22float interpolateTube(const std::vector<float> &P, float frac) {
23 assert(frac>=0 && frac<=1);
24 assert(!P.empty());
@@ -124,7 +137,9 @@
44
45 return P.front();
46}
+
47
+
48helios::vec3 interpolateTube(const std::vector<vec3> &P, float frac) {
49 assert(frac>=0 && frac<=1);
50 assert(!P.empty());
@@ -155,7 +170,9 @@
75
76 return P.front();
77}
+
78
+
79PlantArchitecture::PlantArchitecture(helios::Context *context_ptr) : context_ptr(context_ptr) {
80 generator = context_ptr->getRandomGenerator();
81
@@ -169,7 +186,9 @@
89 output_object_data["fruitID"] = false;
90 output_object_data["carbohydrate_concentration"] = false;
91}
+
92
+
93LeafPrototype::LeafPrototype(std::minstd_rand0 *generator) : generator(generator) {
94
95 leaf_aspect_ratio.initialize( 1.f, generator);
@@ -191,10 +210,14 @@
111 }
112
113}
+
114
+
117
+
118PhytomerParameters::PhytomerParameters(std::minstd_rand0 *generator) {
119 //--- internode ---//
120 internode.pitch.initialize(20, generator);
@@ -245,10 +268,14 @@
165 inflorescence.fruit_gravity_factor_fraction.initialize(0, generator);
166 inflorescence.unique_prototypes = 1;
167}
+
168
+
171
+
172ShootParameters::ShootParameters(std::minstd_rand0 *generator) {
173 // ---- Geometric Parameters ---- //
174
@@ -288,6 +315,7 @@
208
209 determinate_shoot_growth = true;
210}
+
211
212void ShootParameters::defineChildShootTypes( const std::vector<std::string> &a_child_shoot_type_labels, const std::vector<float> &a_child_shoot_type_probabilities ){
213
@@ -303,6 +331,7 @@
223 this->child_shoot_type_probabilities = a_child_shoot_type_probabilities;
224}
225
+
226std::vector<uint> PlantArchitecture::buildPlantCanopyFromLibrary(const helios::vec3 &canopy_center_position, const helios::vec2 &plant_spacing_xy, const helios::int2 &plant_count_xy, float age, float germination_rate) {
227
228 if( plant_count_xy.x<=0 || plant_count_xy.y<=0 ){
@@ -323,7 +352,9 @@
243
244 return plantIDs;
245}
+
246
+
247void PlantArchitecture::defineShootType(const std::string &shoot_type_label, const ShootParameters &shoot_params) {
248 if (this->shoot_types.find(shoot_type_label) != this->shoot_types.end()) { //shoot type already exists
249 this->shoot_types.at(shoot_type_label) = shoot_params;
@@ -331,6 +362,7 @@
251 this->shoot_types.emplace(shoot_type_label, shoot_params);
252 }
253}
+
254
255std::vector<helios::vec3> Phytomer::getInternodeNodePositions() const {
256 std::vector<vec3> nodes = parent_shoot_ptr->shoot_internode_vertices.at(shoot_index.x);
@@ -504,6 +536,7 @@
424 }
425}
426
+
427int Shoot::appendPhytomer(float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, const PhytomerParameters &phytomer_parameters) {
428
429 auto shoot_tree_ptr = &plantarchitecture_ptr->plant_instances.at(plantID).shoot_tree;
@@ -628,6 +661,7 @@
548
549 return (int) phytomers.size() - 1;
550}
+
551
552void Shoot::breakDormancy() {
553
@@ -752,6 +786,7 @@
672 return shoot_length;
673}
674
+
675void Shoot::updateShootNodes(bool update_context_geometry) {
676 // make shoot origin consistent with parent shoot node position
677 if( parent_shoot_ID>=0 ) { //only if not the base shoot
@@ -796,6 +831,7 @@
716 }
717 }
718}
+
719
720helios::vec3 Shoot::getShootAxisVector(float shoot_fraction) const {
721 uint phytomer_count = this->phytomers.size();
@@ -1132,7 +1168,7 @@
1052
1053 petiole_vertices.at(petiole).at(j) = petiole_vertices.at(petiole).at(j - 1) + dr_petiole.at(petiole) * petiole_axis_actual;
1054
-
1055 petiole_radii.at(petiole).at(j) = leaf_scale_factor_fraction * phytomer_parameters.petiole.radius.val() * (1.f - phytomer_parameters.petiole.taper.val() / float(Ndiv_petiole_length) * float(j) );
+
1055 petiole_radii.at(petiole).at(j) = leaf_scale_factor_fraction * phytomer_parameters.petiole.radius.val() * (1.f - phytomer_parameters.petiole.taper.val() / float(Ndiv_petiole_length) * float(j) );
1056 petiole_colors.at(j) = phytomer_parameters.petiole.color;
1057 }
1058
@@ -1663,6 +1699,7 @@
1583 parent_shoot_ptr->updateShootNodes(update_context_geometry);
1584}
1585
+
1586void Phytomer::scaleInternodeMaxLength(float scale_factor) {
1587 this->internode_length_max *= scale_factor;
1588
@@ -1673,16 +1710,22 @@
1593 current_internode_scale_factor = 1.f;
1594 }
1595}
+
1596
+
1597void Phytomer::setInternodeMaxLength(float internode_length_max_new) {
1598 float scale_factor = internode_length_max_new / this->internode_length_max;
1599 scaleInternodeMaxLength(scale_factor);
1600}
+
1601
+
1602void Phytomer::setInternodeMaxRadius(float internode_radius_max_new) {
1603 this->internode_radius_max = internode_radius_max_new;
1604}
+
1605
+
1606void Phytomer::setLeafScaleFraction(float leaf_scale_factor_fraction) {
1607 assert(leaf_scale_factor_fraction >= 0 && leaf_scale_factor_fraction <= 1);
1608
@@ -1746,7 +1789,9 @@
1666 }
1667 }
1668}
+
1669
+
1670void Phytomer::setLeafPrototypeScale(float leaf_prototype_scale) {
1671 float tip_ind = ceil(float(leaf_size_max.front().size() - 1) / 2.f);
1672 float scale_factor = leaf_prototype_scale / leaf_size_max.front().at(tip_ind);
@@ -1766,6 +1811,7 @@
1686 current_leaf_scale_factor = 1.f;
1687 }
1688}
+
1689
1690void Phytomer::scaleLeafPrototypeScale(float scale_factor) {
1691 if (scale_factor < 0.f) {
@@ -1874,6 +1920,7 @@
1794 }
1795}
1796
+
1797std::string Shoot::sampleChildShootType() const {
1798 auto shoot_ptr = this;
1799
@@ -1908,7 +1955,9 @@
1828 return child_shoot_type_label;
1829
1830}
+
1831
+
1832bool Shoot::sampleVegetativeBudBreak( uint node_index ) const {
1833
1834 if ( node_index>=phytomers.size() ) {
@@ -1922,9 +1971,9 @@
1842 if ( !shoot_parameters.growth_requires_dormancy && probability_decay<0 ) {
1843 bud_break_probability = probability_min;
1844 } else if ( probability_decay>0 ) { //probability maximum at apex
-
1845 bud_break_probability = std::max( probability_min, 1.f - probability_decay * float(this->current_node_number - node_index - 1) );
+
1845 bud_break_probability = std::fmax( probability_min, 1.f - probability_decay * float(this->current_node_number - node_index - 1) );
1846 } else if ( probability_decay<0 ) { //probability maximum at base
-
1847 bud_break_probability = std::max( probability_min, 1.f - fabs(probability_decay) * float(node_index) );
+
1847 bud_break_probability = std::fmax( probability_min, 1.f - fabs(probability_decay) * float(node_index) );
1848 } else {
1849 bud_break_probability = 1.f;
1850 }
@@ -1937,7 +1986,9 @@
1857 return bud_break;
1858
1859}
+
1860
+
1861uint Shoot::sampleEpicormicShoot( float dt, std::vector<float> &epicormic_positions_fraction ){
1862
1863 std::string epicormic_shoot_label = plantarchitecture_ptr->plant_instances.at(this->plantID).epicormic_shoot_probability_perlength_per_day.first;
@@ -1981,7 +2032,9 @@
1901
1902 return Nshoots;
1903}
+
1904
+
1905uint PlantArchitecture::addBaseStemShoot(uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction,
1906 float radius_taper, const std::string &shoot_type_label) {
1907
@@ -2012,7 +2065,9 @@
1932
1933 return shootID;
1934}
+
1935
+
1936uint PlantArchitecture::appendShoot(uint plantID, int parent_shoot_ID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction,
1937 float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label) {
1938
@@ -2056,7 +2111,9 @@
1976
1977 return appended_shootID;
1978}
+
1979
+
1980uint PlantArchitecture::addChildShoot(uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max,
1981 float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index) {
1982
@@ -2099,7 +2156,9 @@
2019
2020 return childID;
2021}
+
2022
+
2023uint PlantArchitecture::addEpicormicShoot(uint plantID, int parent_shoot_ID, float parent_position_fraction, uint current_node_number, float zenith_perturbation_degrees, float internode_radius, float internode_length_max,
2024 float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label) {
2025
@@ -2124,6 +2183,7 @@
2044 return addChildShoot(plantID, parent_shoot_ID, parent_node_index, current_node_number, base_rotation, internode_radius, internode_length_max, internode_length_scale_factor_fraction, leaf_scale_factor_fraction, radius_taper, shoot_type_label, 0);
2045
2046}
+
2047
2048void PlantArchitecture::validateShootTypes(ShootParameters &shoot_parameters) const {
2049 assert(shoot_parameters.child_shoot_type_probabilities.size() == shoot_parameters.child_shoot_type_labels.size());
@@ -2136,6 +2196,7 @@
2056 }
2057}
2058
+
2059int PlantArchitecture::appendPhytomerToShoot(uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction) {
2060
2061 if( plant_instances.find(plantID) == plant_instances.end() ){
@@ -2200,7 +2261,9 @@
2120
2121 return pID;
2122}
+
2123
+
2124void PlantArchitecture::enableEpicormicChildShoots(uint plantID, const std::string &epicormic_shoot_type_label, float epicormic_probability_perlength_perday) {
2125
2126 if(shoot_types.find(epicormic_shoot_type_label) == shoot_types.end() ){
@@ -2214,22 +2277,31 @@
2134 plant_instances.at(plantID).epicormic_shoot_probability_perlength_per_day = std::make_pair(epicormic_shoot_type_label, epicormic_probability_perlength_perday);
2135
2136}
+
2137
+
2139 build_context_geometry_internode = false;
2140}
+
2141
+
2143 build_context_geometry_petiole = false;
2144}
+
2145
+
2147 build_context_geometry_peduncle = false;
2148}
+
2149
+
2151 ground_clipping_height = ground_height;
2152}
+
2153
2154void PlantArchitecture::incrementPhytomerInternodeGirth(uint plantID, uint shootID, uint node_number, bool update_context_geometry) {
2155
@@ -2315,6 +2387,7 @@
2235 return plant_instances.at(plantID).base_position;
2236}
2237
+
2238float PlantArchitecture::sumPlantLeafArea(uint plantID) const{
2239
2240 if( plantID>=plant_instances.size() ){
@@ -2330,6 +2403,7 @@
2250
2251 return area;
2252}
+
2253
2254void PlantArchitecture::setPlantAge(uint plantID, float a_current_age) {
2255 //\todo
@@ -2445,6 +2519,7 @@
2365 return taper;
2366}
2367
+
2368std::vector<uint> PlantArchitecture::getAllPlantObjectIDs(uint plantID) const{
2369
2370 if( plant_instances.find(plantID) == plant_instances.end() ){
@@ -2475,11 +2550,15 @@
2395
2396 return objIDs;
2397}
+
2398
+
2399std::vector<uint> PlantArchitecture::getAllPlantUUIDs(uint plantID) const {
2400 return context_ptr->getObjectPrimitiveUUIDs(getAllPlantObjectIDs(plantID));
2401}
+
2402
+
2403std::vector<uint> PlantArchitecture::getPlantInternodeObjectIDs(uint plantID) const{
2404
2405 if( plant_instances.find(plantID) == plant_instances.end() ){
@@ -2498,7 +2577,9 @@
2418
2419 return objIDs;
2420}
+
2421
+
2422std::vector<uint> PlantArchitecture::getPlantPetioleObjectIDs(uint plantID) const{
2423 if( plant_instances.find(plantID) == plant_instances.end() ){
2424 helios_runtime_error("ERROR (PlantArchitecture::getPlantPetioleObjectIDs): Plant with ID of " + std::to_string(plantID) + " does not exist.");
@@ -2518,7 +2599,9 @@
2438
2439 return objIDs;
2440}
+
2441
+
2442std::vector<uint> PlantArchitecture::getPlantLeafObjectIDs(uint plantID) const{
2443 if( plant_instances.find(plantID) == plant_instances.end() ){
2444 helios_runtime_error("ERROR (PlantArchitecture::getPlantLeafObjectIDs): Plant with ID of " + std::to_string(plantID) + " does not exist.");
@@ -2538,7 +2621,9 @@
2458
2459 return objIDs;
2460}
+
2461
+
2462std::vector<uint> PlantArchitecture::getPlantPeduncleObjectIDs(uint plantID) const{
2463
2464 if( plant_instances.find(plantID) == plant_instances.end() ){
@@ -2561,7 +2646,9 @@
2481
2482 return objIDs;
2483}
+
2484
+
2485std::vector<uint> PlantArchitecture::getPlantFlowerObjectIDs(uint plantID) const{
2486
2487 if( plant_instances.find(plantID) == plant_instances.end() ){
@@ -2586,7 +2673,9 @@
2506
2507 return objIDs;
2508}
+
2509
+
2510std::vector<uint> PlantArchitecture::getPlantFruitObjectIDs(uint plantID) const{
2511
2512 if( plant_instances.find(plantID) == plant_instances.end() ){
@@ -2611,7 +2700,9 @@
2531
2532 return objIDs;
2533}
+
2534
+
2535std::vector<uint> PlantArchitecture::getAllUUIDs() const {
2536 std::vector<uint> UUIDs_all;
2537 for (const auto &instance: plant_instances) {
@@ -2620,7 +2711,9 @@
2540 }
2541 return UUIDs_all;
2542}
+
2543
+
2544std::vector<uint> PlantArchitecture::getAllLeafUUIDs() const {
2545 std::vector<uint> UUIDs_all;
2546 for (const auto &instance: plant_instances) {
@@ -2630,7 +2723,9 @@
2550 }
2551 return UUIDs_all;
2552}
+
2553
+
2555 std::vector<uint> UUIDs_all;
2556 for (const auto &instance: plant_instances) {
@@ -2640,7 +2735,9 @@
2560 }
2561 return UUIDs_all;
2562}
+
2563
+
2564std::vector<uint> PlantArchitecture::getAllPetioleUUIDs() const {
2565 std::vector<uint> UUIDs_all;
2566 for (const auto &instance: plant_instances) {
@@ -2650,7 +2747,9 @@
2570 }
2571 return UUIDs_all;
2572}
+
2573
+
2575 std::vector<uint> UUIDs_all;
2576 for (const auto &instance: plant_instances) {
@@ -2660,7 +2759,9 @@
2580 }
2581 return UUIDs_all;
2582}
+
2583
+
2584std::vector<uint> PlantArchitecture::getAllFlowerUUIDs() const {
2585 std::vector<uint> UUIDs_all;
2586 for (const auto &instance: plant_instances) {
@@ -2670,7 +2771,9 @@
2590 }
2591 return UUIDs_all;
2592}
+
2593
+
2594std::vector<uint> PlantArchitecture::getAllFruitUUIDs() const {
2595 std::vector<uint> UUIDs_all;
2596 for (const auto &instance: plant_instances) {
@@ -2680,7 +2783,9 @@
2600 }
2601 return UUIDs_all;
2602}
+
2603
+
2604std::vector<uint> PlantArchitecture::getAllObjectIDs() const {
2605 std::vector<uint> objIDs_all;
2606 for (const auto &instance: plant_instances) {
@@ -2689,7 +2794,9 @@
2609 }
2610 return objIDs_all;
2611}
+
2612
+
2613uint PlantArchitecture::addPlantInstance(const helios::vec3 &base_position, float current_age) {
2614
2615 if( current_age<0 ){
@@ -2704,7 +2811,9 @@
2624
2625 return plant_count - 1;
2626}
+
2627
+
2628uint PlantArchitecture::duplicatePlantInstance(uint plantID, const helios::vec3 &base_position, const AxisRotation &base_rotation, float current_age) {
2629
2630 if( plant_instances.find(plantID) == plant_instances.end() ){
@@ -2752,7 +2861,9 @@
2672
2673 return plantID_new;
2674}
+
2675
+
2677 if (plant_instances.find(plantID) == plant_instances.end()) {
2678 return;
@@ -2762,13 +2873,17 @@
2682
2683 plant_instances.erase(plantID);
2684}
+
2685
+
2686void PlantArchitecture::deletePlantInstance(const std::vector<uint> &plantIDs) {
2687 for (uint ID: plantIDs) {
2689 }
2690}
+
2691
+
2692void PlantArchitecture::setPlantPhenologicalThresholds(uint plantID, float time_to_dormancy_break, float time_to_flower_initiation, float time_to_flower_opening, float time_to_fruit_set, float time_to_fruit_maturity, float time_to_dormancy,float max_leaf_lifespan, bool is_evergreen) {
2693
2694 if( plant_instances.find(plantID) == plant_instances.end() ){
@@ -2788,6 +2903,7 @@
2708 }
2709 plant_instances.at(plantID).is_evergreen = is_evergreen;
2710}
+
2711
2712void PlantArchitecture::disablePlantPhenology(uint plantID) {
2713 plant_instances.at(plantID).dd_to_dormancy_break = 0;
@@ -2798,6 +2914,7 @@
2718 plant_instances.at(plantID).dd_to_dormancy = 1e6;
2719}
2720
+
2721void PlantArchitecture::advanceTime(float time_step_days) {
2722 for (auto &plant: plant_instances) {
2723 uint plantID = plant.first;
@@ -2805,7 +2922,9 @@
2725 advanceTime(plantID, time_step_days);
2726 }
2727}
+
2728
+
2729void PlantArchitecture::advanceTime( int time_step_years, float time_step_days ) {
2730 for (auto &plant: plant_instances) {
2731 uint plantID = plant.first;
@@ -2813,7 +2932,9 @@
2733 advanceTime(plantID, float(time_step_years)*365.f+time_step_days);
2734 }
2735}
+
2736
+
2737void PlantArchitecture::advanceTime( uint plantID, float time_step_days ) {
2738
2739 if( plant_instances.find(plantID) == plant_instances.end() ){
@@ -3174,6 +3295,7 @@
3094 shoot_tree->front()->updateShootNodes(true);
3095
3096}
+
3097
3098std::vector<uint> makeTubeFromCones(uint radial_subdivisions, const std::vector<helios::vec3> &vertices, const std::vector<float> &radii, const std::vector<helios::RGBcolor> &colors, helios::Context *context_ptr) {
3099
@@ -3216,6 +3338,7 @@
3136 return false;
3137}
3138
+
3139void PlantArchitecture::optionalOutputObjectData( const std::string &object_data_label ){
3140 if( output_object_data.find(object_data_label)==output_object_data.end() ){
3141 std::cerr << "WARNING (PlantArchitecture::optionalOutputObjectData): Output object data of '" << object_data_label << "' is not a valid option." << std::endl;
@@ -3223,7 +3346,9 @@
3143 }
3144 output_object_data.at(object_data_label) = true;
3145}
+
3146
+
3147void PlantArchitecture::optionalOutputObjectData( const std::vector<std::string> &object_data_labels ){
3148 for( auto &label : object_data_labels){
3149 if( output_object_data.find(label)==output_object_data.end() ){
@@ -3233,144 +3358,146 @@
3153 output_object_data.at(label) = true;
3154 }
3155}
-
helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
Interpolate the position of a point along a tube.
-
float interpolateTube(const std::vector< float > &P, float frac)
Interpolate the radius of a point along a tube.
+
+
helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
Interpolate the position of a point along a tube.
+
float interpolateTube(const std::vector< float > &P, float frac)
Interpolate the radius of a point along a tube.
std::vector< uint > makeTubeFromCones(uint radial_subdivisions, const std::vector< helios::vec3 > &vertices, const std::vector< float > &radii, const std::vector< helios::RGBcolor > &colors, helios::Context *context_ptr)
Add geometry to the Context consisting of a series of Cone objects to form a tube-like shape.
- -
void setPlantPhenologicalThresholds(uint plantID, float time_to_dormancy_break, float time_to_flower_initiation, float time_to_flower_opening, float time_to_fruit_set, float time_to_fruit_maturity, float time_to_dormancy, float max_leaf_lifespan=1e6, bool is_evergreen=false)
Specify the threshold values for plant phenological stages.
-
uint addPlantInstance(const helios::vec3 &base_position, float current_age)
Create an instance of a plant.
-
std::vector< uint > getAllFlowerUUIDs() const
Get UUIDs for all existing flower primitives.
-
uint addChildShoot(uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
Manually add a child shoot at the axillary bud of a phytomer.
-
int appendPhytomerToShoot(uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
Add a new phytomer at the terminal bud of a shoot.
-
std::vector< uint > getPlantFlowerObjectIDs(uint plantID) const
Get object IDs for all inflorescence objects for a given plant.
-
void advanceTime(float time_step_days)
Advance plant growth by a specified time interval for all plants.
-
uint appendShoot(uint plantID, int parent_shoot_ID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually append a new shoot at the end of an existing shoot. This is used when the characteristics of...
-
void enableGroundClipping(float ground_height=0.f)
Enable automatic removal of organs that are below the ground plane.
-
uint addBaseStemShoot(uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has ...
-
std::vector< uint > getAllPlantUUIDs(uint plantID) const
Get primitive UUIDs for all primitives in a given plant.
-
std::vector< uint > getPlantInternodeObjectIDs(uint plantID) const
Get object IDs for all internode (Tube) objects for a given plant.
-
std::vector< uint > getAllLeafUUIDs() const
Get UUIDs for all existing leaf primitives.
-
std::vector< uint > getAllInternodeUUIDs() const
Get UUIDs for all existing internode primitives.
-
void disablePeduncleContextBuild()
Do not build peduncle primitive geometry in the Context.
-
void deletePlantInstance(uint plantID)
Delete an existing plant instance.
-
void enableEpicormicChildShoots(uint plantID, const std::string &epicormic_shoot_type_label, float epicormic_probability_perlength_perday)
Enable shoot type to produce epicormic child shoots (water sprouts)
-
std::vector< uint > getAllObjectIDs() const
Get object IDs for all existing plant compound objects.
-
void defineShootType(const std::string &shoot_type_label, const ShootParameters &shoot_params)
Define a new shoot type based on a set of ShootParameters.
-
std::vector< uint > buildPlantCanopyFromLibrary(const helios::vec3 &canopy_center_position, const helios::vec2 &plant_spacing_xy, const helios::int2 &plant_count_xy, float age, float germination_rate=1.f)
Build a canopy of regularly spaced plants based on the model currently loaded from the library.
-
std::vector< uint > getAllFruitUUIDs() const
Get UUIDs for all existing fruit primitives.
-
std::vector< uint > getPlantFruitObjectIDs(uint plantID) const
Get object IDs for all fruit objects for a given plant.
-
void disablePetioleContextBuild()
Do not build petiole primitive geometry in the Context.
-
PlantArchitecture(helios::Context *context_ptr)
Main architectural model class constructor.
-
uint buildPlantInstanceFromLibrary(const helios::vec3 &base_position, float age)
Build a plant instance based on the model currently loaded from the library.
-
void optionalOutputObjectData(const std::string &object_data_label)
Add optional output object data values to the Context.
-
uint duplicatePlantInstance(uint plantID, const helios::vec3 &base_position, const AxisRotation &base_rotation, float current_age)
Duplicate an existing plant instance and specify its base position and age.
-
std::vector< uint > getAllPlantObjectIDs(uint plantID) const
Get object IDs for all organs objects for a given plant.
-
std::vector< uint > getAllPeduncleUUIDs() const
Get UUIDs for all existing peduncle primitives.
-
uint addEpicormicShoot(uint plantID, int parent_shoot_ID, float parent_position_fraction, uint current_node_number, float zenith_perturbation_degrees, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually add a child epicormic shoot (water sprout) at an arbitrary position along the shoot.
-
float sumPlantLeafArea(uint plantID) const
Sum the one-sided leaf area of all leaves in the plant.
-
std::vector< uint > getPlantPetioleObjectIDs(uint plantID) const
Get object IDs for all petiole (Tube) objects for a given plant.
-
void disableInternodeContextBuild()
Do not build internode primitive geometry in the Context.
-
std::vector< uint > getPlantPeduncleObjectIDs(uint plantID) const
Get object IDs for all peduncle (Tube) objects for a given plant.
-
std::vector< uint > getPlantLeafObjectIDs(uint plantID) const
Get object IDs for all leaf objects for a given plant.
-
std::vector< uint > getAllPetioleUUIDs() const
Get UUIDs for all existing petiole primitives.
-
std::vector< uint > getAllUUIDs() const
Get UUIDs for all existing plant primitives.
-
void scaleLength(float S)
Method to scale the length of the cone.
Definition: Context.cpp:4212
-
void scaleGirth(float S)
Method to scale the girth of the cone.
Definition: Context.cpp:4261
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition: Context.cpp:7139
-
void scaleObjectAboutPoint(uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2897
-
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition: Context.cpp:2642
-
float randn()
Draw a random number from a normal distribution with mean = 0, stddev = 1.
Definition: Context.cpp:1204
-
Cone * getConeObjectPointer(uint ObjID) const
Get a pointer to a Cone Compound Object.
Definition: Context.cpp:4123
-
void rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
Rotate a single compound object about the x, y, or z axis.
Definition: Context.cpp:2847
-
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
helios::vec3 getConeObjectNode(uint ObjID, int number) const
get a node of a Cone object from the context
Definition: Context.cpp:8262
-
float getTubeObjectVolume(uint ObjID) const
get the volume of a Tube object from the context
Definition: Context.cpp:8172
-
void appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)
Append a tube segment to an existing tube object.
Definition: Context.cpp:8180
-
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
-
void clearObjectData(uint objID, const char *label)
Clear primitive data for a single primitive based on its objID.
-
void translateObject(uint ObjID, const vec3 &shift)
Translate a single compound object.
Definition: Context.cpp:2837
-
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition: Context.cpp:2907
-
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition: Context.cpp:49
-
void hideObject(const std::vector< uint > &ObjIDs)
Hide compound objects in the Context such that their object IDs are not returned in Context::getAllOb...
Definition: Context.cpp:7901
-
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition: Context.cpp:2585
-
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition: Context.cpp:2609
-
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition: Context.cpp:7920
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
void setTubeNodes(uint ObjID, const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition: Context.cpp:8215
-
void setTubeRadii(uint ObjID, const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition: Context.cpp:8201
-
void scaleObject(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition: Context.cpp:2877
-
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition: global.cpp:140
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
vec3 nullorigin
Default null vec3 that gives the origin (0,0,0)
Definition: global.cpp:58
-
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:4728
-
uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone compound object to the Context.
Definition: Context.cpp:5426
-
std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
Function to flatten a 2D int vector into a 1D vector.
Definition: global.cpp:1943
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
float deg2rad(float deg)
Convert degrees to radians.
Definition: global.cpp:576
-
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:241
-
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition: global.cpp:1069
-
float asin_safe(float x)
arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:247
-
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
- - - -
LeafPrototype()
Constructor - does not set random number generator.
-
uint subdivisions
Leaf subdivision count in each direction.
-
RandomParameter_float lateral_curvature
Leaf curvature factor along the lateral/width (y-direction). (+curves upward, -curved downward)
-
RandomParameter_float petiole_roll
Creates a rolling at the leaf where the petiole attaches to the leaf blade.
-
uint unique_prototypes
Number of unique prototypes to generate.
-
bool build_petiolule
Add a petiolule to the base of the leaflet.
-
RandomParameter_float wave_period
Period factor of leaf waves (sets how many waves there are along the leaf length)
-
helios::vec3 leaf_offset
Amount to shift the leaf.
-
RandomParameter_float leaf_buckle_angle
Angle of the leaf buckle (degrees)
-
RandomParameter_float leaf_buckle_length
Fraction of the leaf length where the leaf buckles under its weight.
-
RandomParameter_float midrib_fold_fraction
Fraction of folding along the leaf midrib. =0 means leaf is flat, =1 means leaf is completely folded ...
-
uint(* prototype_function)(helios::Context *, LeafPrototype *prototype_parameters, int compound_leaf_index)
Custom prototype function for creating leaf prototypes.
-
RandomParameter_float wave_amplitude
Amplitude of leaf waves (sets the height of leaf waves)
-
RandomParameter_float longitudinal_curvature
Leaf curvature factor along the longitudinal/length (x-direction). (+curves upward,...
-
void setInternodeMaxLength(float internode_length_max_new)
Set the fully-elongated (maximum) internode length.
-
std::vector< std::vector< helios::vec3 > > petiole_vertices
Coordinates of internode tube segments. Index is tube segment within internode.
-
void setInternodeMaxRadius(float internode_radius_max_new)
Set the maximum radius of the internode.
-
helios::int3 shoot_index
.x = index of phytomer along shoot, .y = current number of phytomers on parent shoot,...
-
void setLeafScaleFraction(float leaf_scale_factor_fraction)
Set the leaf scale as a fraction of its total fully-elongated scale factor. Value is uniformly applie...
-
void setLeafPrototypeScale(float leaf_prototype_scale)
Set the fully-elongated (maximum) leaf prototype scale. Value is uniformly applied for all leaves/lea...
-
void scaleInternodeMaxLength(float scale_factor)
Scale the fully-elongated (maximum) internode length as a fraction of its current fully-elongated len...
- -
PhytomerParameters()
Default constructor - does not set random number generator.
-
void(* phytomer_creation_function)(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
- - -
void updateShootNodes(bool update_context_geometry=true)
Recalculate and apply the shoot's origin position and shift all downstream shoots.
-
int appendPhytomer(float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, const PhytomerParameters &phytomer_parameters)
Append a phytomer at the shoot apex.
-
bool sampleVegetativeBudBreak(uint node_index) const
Randomly sample whether a vegetative bud should break into a new shoot.
-
std::string sampleChildShootType() const
Randomly sample the type of a child shoot based on the probabilities defined in the shoot parameters.
-
uint sampleEpicormicShoot(float dt, std::vector< float > &epicormic_positions_fraction)
Randomly sample whether the shoot should produce an epicormic shoot (water sprout) over timestep.
- -
ShootParameters()
Default constructor - does not set random number generator.
-
RandomParameter_float vegetative_bud_break_probability_decay_rate
- -
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
int x
First element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
vec3 normalize()
Normalize vector components such that the magnitude is unity.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
-
float magnitude() const
Compute the vector magnitude.
+ +
void setPlantPhenologicalThresholds(uint plantID, float time_to_dormancy_break, float time_to_flower_initiation, float time_to_flower_opening, float time_to_fruit_set, float time_to_fruit_maturity, float time_to_dormancy, float max_leaf_lifespan=1e6, bool is_evergreen=false)
Specify the threshold values for plant phenological stages.
+
uint addPlantInstance(const helios::vec3 &base_position, float current_age)
Create an instance of a plant.
+
std::vector< uint > getAllFlowerUUIDs() const
Get UUIDs for all existing flower primitives.
+
uint addChildShoot(uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
Manually add a child shoot at the axillary bud of a phytomer.
+
int appendPhytomerToShoot(uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
Add a new phytomer at the terminal bud of a shoot.
+
std::vector< uint > getPlantFlowerObjectIDs(uint plantID) const
Get object IDs for all inflorescence objects for a given plant.
+
void advanceTime(float time_step_days)
Advance plant growth by a specified time interval for all plants.
+
uint appendShoot(uint plantID, int parent_shoot_ID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually append a new shoot at the end of an existing shoot. This is used when the characteristics of...
+
void enableGroundClipping(float ground_height=0.f)
Enable automatic removal of organs that are below the ground plane.
+
uint addBaseStemShoot(uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has ...
+
std::vector< uint > getAllPlantUUIDs(uint plantID) const
Get primitive UUIDs for all primitives in a given plant.
+
std::vector< uint > getPlantInternodeObjectIDs(uint plantID) const
Get object IDs for all internode (Tube) objects for a given plant.
+
std::vector< uint > getAllLeafUUIDs() const
Get UUIDs for all existing leaf primitives.
+
std::vector< uint > getAllInternodeUUIDs() const
Get UUIDs for all existing internode primitives.
+
void disablePeduncleContextBuild()
Do not build peduncle primitive geometry in the Context.
+
void deletePlantInstance(uint plantID)
Delete an existing plant instance.
+
void enableEpicormicChildShoots(uint plantID, const std::string &epicormic_shoot_type_label, float epicormic_probability_perlength_perday)
Enable shoot type to produce epicormic child shoots (water sprouts)
+
std::vector< uint > getAllObjectIDs() const
Get object IDs for all existing plant compound objects.
+
void defineShootType(const std::string &shoot_type_label, const ShootParameters &shoot_params)
Define a new shoot type based on a set of ShootParameters.
+
std::vector< uint > buildPlantCanopyFromLibrary(const helios::vec3 &canopy_center_position, const helios::vec2 &plant_spacing_xy, const helios::int2 &plant_count_xy, float age, float germination_rate=1.f)
Build a canopy of regularly spaced plants based on the model currently loaded from the library.
+
std::vector< uint > getAllFruitUUIDs() const
Get UUIDs for all existing fruit primitives.
+
std::vector< uint > getPlantFruitObjectIDs(uint plantID) const
Get object IDs for all fruit objects for a given plant.
+
void disablePetioleContextBuild()
Do not build petiole primitive geometry in the Context.
+
PlantArchitecture(helios::Context *context_ptr)
Main architectural model class constructor.
+
uint buildPlantInstanceFromLibrary(const helios::vec3 &base_position, float age)
Build a plant instance based on the model currently loaded from the library.
+
void optionalOutputObjectData(const std::string &object_data_label)
Add optional output object data values to the Context.
+
uint duplicatePlantInstance(uint plantID, const helios::vec3 &base_position, const AxisRotation &base_rotation, float current_age)
Duplicate an existing plant instance and specify its base position and age.
+
std::vector< uint > getAllPlantObjectIDs(uint plantID) const
Get object IDs for all organs objects for a given plant.
+
std::vector< uint > getAllPeduncleUUIDs() const
Get UUIDs for all existing peduncle primitives.
+
uint addEpicormicShoot(uint plantID, int parent_shoot_ID, float parent_position_fraction, uint current_node_number, float zenith_perturbation_degrees, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually add a child epicormic shoot (water sprout) at an arbitrary position along the shoot.
+
float sumPlantLeafArea(uint plantID) const
Sum the one-sided leaf area of all leaves in the plant.
+
std::vector< uint > getPlantPetioleObjectIDs(uint plantID) const
Get object IDs for all petiole (Tube) objects for a given plant.
+
void disableInternodeContextBuild()
Do not build internode primitive geometry in the Context.
+
std::vector< uint > getPlantPeduncleObjectIDs(uint plantID) const
Get object IDs for all peduncle (Tube) objects for a given plant.
+
std::vector< uint > getPlantLeafObjectIDs(uint plantID) const
Get object IDs for all leaf objects for a given plant.
+
std::vector< uint > getAllPetioleUUIDs() const
Get UUIDs for all existing petiole primitives.
+
std::vector< uint > getAllUUIDs() const
Get UUIDs for all existing plant primitives.
+
void scaleLength(float S)
Method to scale the length of the cone.
Definition Context.cpp:4212
+
void scaleGirth(float S)
Method to scale the girth of the cone.
Definition Context.cpp:4261
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition Context.cpp:7139
+
void scaleObjectAboutPoint(uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2897
+
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition Context.cpp:2642
+
float randn()
Draw a random number from a normal distribution with mean = 0, stddev = 1.
Definition Context.cpp:1204
+
Cone * getConeObjectPointer(uint ObjID) const
Get a pointer to a Cone Compound Object.
Definition Context.cpp:4123
+
void rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
Rotate a single compound object about the x, y, or z axis.
Definition Context.cpp:2847
+
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
helios::vec3 getConeObjectNode(uint ObjID, int number) const
get a node of a Cone object from the context
Definition Context.cpp:8262
+
float getTubeObjectVolume(uint ObjID) const
get the volume of a Tube object from the context
Definition Context.cpp:8172
+
void appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)
Append a tube segment to an existing tube object.
Definition Context.cpp:8180
+
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
+
void clearObjectData(uint objID, const char *label)
Clear primitive data for a single primitive based on its objID.
+
void translateObject(uint ObjID, const vec3 &shift)
Translate a single compound object.
Definition Context.cpp:2837
+
std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
Get primitive UUIDs associated with compound object (single object ID input)
Definition Context.cpp:2907
+
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition Context.cpp:49
+
void hideObject(const std::vector< uint > &ObjIDs)
Hide compound objects in the Context such that their object IDs are not returned in Context::getAllOb...
Definition Context.cpp:7901
+
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition Context.cpp:2585
+
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition Context.cpp:2609
+
float getObjectArea(uint ObjID) const
Method to return the one-sided surface area of an object.
Definition Context.cpp:7920
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
void setTubeNodes(uint ObjID, const std::vector< helios::vec3 > &node_xyz)
Set tube vertex coordinates at each segment node.
Definition Context.cpp:8215
+
void setTubeRadii(uint ObjID, const std::vector< float > &node_radii)
Set tube radii at each segment node.
Definition Context.cpp:8201
+
void scaleObject(uint ObjID, const helios::vec3 &scalefact)
Method to scale a compound object in the x-, y- and z-directions.
Definition Context.cpp:2877
+
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition global.cpp:140
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
vec3 nullorigin
Default null vec3 that gives the origin (0,0,0)
Definition global.cpp:58
+
uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:4728
+
uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
Add a 3D cone compound object to the Context.
Definition Context.cpp:5426
+
std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
Function to flatten a 2D int vector into a 1D vector.
Definition global.cpp:1943
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
float deg2rad(float deg)
Convert degrees to radians.
Definition global.cpp:576
+
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:241
+
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition global.cpp:1069
+
float asin_safe(float x)
arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:247
+
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
+ + + +
LeafPrototype()
Constructor - does not set random number generator.
+
uint subdivisions
Leaf subdivision count in each direction.
+
RandomParameter_float lateral_curvature
Leaf curvature factor along the lateral/width (y-direction). (+curves upward, -curved downward)
+
RandomParameter_float petiole_roll
Creates a rolling at the leaf where the petiole attaches to the leaf blade.
+
uint unique_prototypes
Number of unique prototypes to generate.
+
bool build_petiolule
Add a petiolule to the base of the leaflet.
+
RandomParameter_float wave_period
Period factor of leaf waves (sets how many waves there are along the leaf length)
+
helios::vec3 leaf_offset
Amount to shift the leaf.
+
RandomParameter_float leaf_buckle_angle
Angle of the leaf buckle (degrees)
+
RandomParameter_float leaf_buckle_length
Fraction of the leaf length where the leaf buckles under its weight.
+
RandomParameter_float midrib_fold_fraction
Fraction of folding along the leaf midrib. =0 means leaf is flat, =1 means leaf is completely folded ...
+
uint(* prototype_function)(helios::Context *, LeafPrototype *prototype_parameters, int compound_leaf_index)
Custom prototype function for creating leaf prototypes.
+
RandomParameter_float wave_amplitude
Amplitude of leaf waves (sets the height of leaf waves)
+
RandomParameter_float longitudinal_curvature
Leaf curvature factor along the longitudinal/length (x-direction). (+curves upward,...
+
void setInternodeMaxLength(float internode_length_max_new)
Set the fully-elongated (maximum) internode length.
+
std::vector< std::vector< helios::vec3 > > petiole_vertices
Coordinates of internode tube segments. Index is tube segment within internode.
+
void setInternodeMaxRadius(float internode_radius_max_new)
Set the maximum radius of the internode.
+
helios::int3 shoot_index
.x = index of phytomer along shoot, .y = current number of phytomers on parent shoot,...
+
void setLeafScaleFraction(float leaf_scale_factor_fraction)
Set the leaf scale as a fraction of its total fully-elongated scale factor. Value is uniformly applie...
+
void setLeafPrototypeScale(float leaf_prototype_scale)
Set the fully-elongated (maximum) leaf prototype scale. Value is uniformly applied for all leaves/lea...
+
void scaleInternodeMaxLength(float scale_factor)
Scale the fully-elongated (maximum) internode length as a fraction of its current fully-elongated len...
+ +
PhytomerParameters()
Default constructor - does not set random number generator.
+
void(* phytomer_creation_function)(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
+ + +
void updateShootNodes(bool update_context_geometry=true)
Recalculate and apply the shoot's origin position and shift all downstream shoots.
+
int appendPhytomer(float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, const PhytomerParameters &phytomer_parameters)
Append a phytomer at the shoot apex.
+
bool sampleVegetativeBudBreak(uint node_index) const
Randomly sample whether a vegetative bud should break into a new shoot.
+
std::string sampleChildShootType() const
Randomly sample the type of a child shoot based on the probabilities defined in the shoot parameters.
+
uint sampleEpicormicShoot(float dt, std::vector< float > &epicormic_positions_fraction)
Randomly sample whether the shoot should produce an epicormic shoot (water sprout) over timestep.
+ +
ShootParameters()
Default constructor - does not set random number generator.
+
RandomParameter_float vegetative_bud_break_probability_decay_rate
+ +
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
int x
First element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+
float magnitude() const
Compute the vector magnitude.
+ diff --git a/doc/html/_plant_architecture_8h.html b/doc/html/_plant_architecture_8h.html index 2c1c7c49f..3eead998d 100644 --- a/doc/html/_plant_architecture_8h.html +++ b/doc/html/_plant_architecture_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Data Structures | @@ -131,7 +143,7 @@ -

Enumerations

enum  BudState {
+
enum  BudState {
  BUD_DORMANT = 0 , BUD_ACTIVE = 1 , BUD_FLOWER_CLOSED = 2 @@ -145,9 +157,9 @@
- + - +

Functions

AxisRotation make_AxisRotation (float a_pitch, float a_yaw, float a_roll)
AxisRotation make_AxisRotation (float a_pitch, float a_yaw, float a_roll)
 
std::vector< uint > makeTubeFromCones (uint radial_subdivisions, const std::vector< helios::vec3 > &vertices, const std::vector< float > &radii, const std::vector< helios::RGBcolor > &colors, helios::Context *context_ptr)
std::vector< uint > makeTubeFromCones (uint radial_subdivisions, const std::vector< helios::vec3 > &vertices, const std::vector< float > &radii, const std::vector< helios::RGBcolor > &colors, helios::Context *context_ptr)
 Add geometry to the Context consisting of a series of Cone objects to form a tube-like shape.
 
@@ -188,25 +200,17 @@

AxisRotation make_AxisRotation ( - float  - a_pitch, + float a_pitch, - float  - a_yaw, + float a_yaw, - float  - a_roll  - - - - ) - + float a_roll ) @@ -229,37 +233,27 @@

std::vector< uint > makeTubeFromCones ( - uint  - radial_subdivisions, + uint radial_subdivisions, - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const std::vector< float > &  - radii, + const std::vector< float > & radii, - const std::vector< helios::RGBcolor > &  - colors, + const std::vector< helios::RGBcolor > & colors, - helios::Context *  - context_ptr  - - - - ) - + helios::Context * context_ptr )

@@ -282,7 +276,8 @@

+

diff --git a/doc/html/_plant_architecture_8h_source.html b/doc/html/_plant_architecture_8h_source.html index 8a00cd952..c07e4da8c 100644 --- a/doc/html/_plant_architecture_8h_source.html +++ b/doc/html/_plant_architecture_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
PlantArchitecture.h
@@ -104,32 +116,39 @@
24struct Shoot;
25struct Phytomer;
26
+
28public:
29
31
+
35 constval = 0.f;
36 distribution = "constant";
37 generator = nullptr;
38 sampled = false;
39 }
+
40
42
+
45 explicit RandomParameter_float( float val ){
46 constval = val;
47 distribution = "constant";
48 generator = nullptr;
49 sampled = false;
50 }
+
51
53
+
56 explicit RandomParameter_float( std::minstd_rand0 *rand_generator ){
57 constval = 0.f;
58 distribution = "constant";
59 generator = rand_generator;
60 sampled = false;
61 }
+
62
63 void initialize( float a_val, std::minstd_rand0 *rand_generator){
64 constval = a_val;
@@ -210,7 +229,9 @@
139
140 std::minstd_rand0 *generator;
141};
+
142
+
144public:
145
@@ -288,7 +309,9 @@
217 std::vector<int> distribution_parameters;
218 std::minstd_rand0 *generator;
219};
+
220
+
222public:
223
@@ -316,6 +339,7 @@
245 }
246
247};
+
248
249inline AxisRotation make_AxisRotation( float a_pitch, float a_yaw, float a_roll ) {
250 return {a_pitch,a_yaw,a_roll};
@@ -341,6 +365,7 @@
271
279std::vector<uint> makeTubeFromCones(uint radial_subdivisions, const std::vector<helios::vec3> &vertices, const std::vector<float> &radii, const std::vector<helios::RGBcolor> &colors, helios::Context *context_ptr);
280
+
282
283 //state of the bud
@@ -351,7 +376,9 @@
288 uint shoot_ID = -1;
289
290};
+
291
+
293
294 //state of the bud
@@ -379,7 +406,9 @@
316 std::vector<uint> peduncle_objIDs;
317 std::vector<uint> inflorescence_objIDs;
318};
+
319
+
321public:
322
@@ -401,17 +430,17 @@
349
350 // Parameters for leaf curvature
- +
355
358
359 // Parameters for leaf wave/wrinkles
- +
364
365 // Parameters for leaf buckling
- +
370
@@ -445,6 +474,7 @@
403 this->generator = a.generator;
404 }
405
+
408 if (this != &a) {
409 this->leaf_texture_file = a.leaf_texture_file;
@@ -480,6 +510,7 @@
439 }
440 return *this;
441 }
+
442
443 void sampleIdentifier() {
444 assert(generator!=nullptr);
@@ -492,7 +523,9 @@
451 std::minstd_rand0 *generator;
452
453};
+
454
+
456private:
457
@@ -671,10 +704,10 @@
630 InflorescenceParameters inflorescence;
631
632 //Custom user-defined function that is called when a phytomer is created
-
640 void (*phytomer_creation_function)(std::shared_ptr<Phytomer> phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age) = nullptr;
+
640 void (*phytomer_creation_function)(std::shared_ptr<Phytomer> phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age) = nullptr;
641
642 //Custom user-defined function that is called for each phytomer on every time step
-
646 void (*phytomer_callback_function)(std::shared_ptr<Phytomer> phytomer_ptr) = nullptr;
+
646 void (*phytomer_callback_function)(std::shared_ptr<Phytomer> phytomer_ptr) = nullptr;
647
648
@@ -686,7 +719,9 @@
657 friend struct Shoot;
658
659};
+
660
+
662
@@ -730,7 +765,7 @@
703 RandomParameter_float vegetative_bud_break_probability_min;
704
705 // Decay rate of the probability that a bud will break and form a new shoot
- +
710
711 // Maximum number of floral buds at the shoot apex
712 RandomParameter_int max_terminal_floral_buds;
@@ -819,7 +854,9 @@
795 std::vector<float> child_shoot_type_probabilities;
796
797};
+
798
+
799struct Phytomer {
800public:
801
@@ -962,7 +999,9 @@
956 friend class PlantArchitecture;
957
958};
+
959
+
960struct Shoot {
961
962 Shoot(uint plant_ID, int shoot_ID, int parent_shoot_ID, uint parent_node, uint parent_petiole_index, uint rank, const helios::vec3 &shoot_base_position, const AxisRotation &shoot_base_rotation, uint current_node_number,
@@ -1057,7 +1096,9 @@
1071 helios::Context *context_ptr;
1072
1073};
+
1074
+
1076
1077 PlantInstance(const helios::vec3 &a_base_position, float a_current_age, helios::Context *a_context_ptr) : base_position(a_base_position), current_age(a_current_age), context_ptr(a_context_ptr) {}
@@ -1081,12 +1122,14 @@
1095 float max_age = 999;
1096
1097};
+
1098
+
1100public:
1101
1103
-
1106 explicit PlantArchitecture( helios::Context* context_ptr );
+
1106 explicit PlantArchitecture( helios::Context* context_ptr );
1107
1109 static int selfTest();
1110
@@ -1446,114 +1489,117 @@
1687
1688
1689};
+
1690
1691#include "Assets.h"
1692
1693#endif //PLANT_ARCHITECTURE
std::vector< uint > makeTubeFromCones(uint radial_subdivisions, const std::vector< helios::vec3 > &vertices, const std::vector< float > &radii, const std::vector< helios::RGBcolor > &colors, helios::Context *context_ptr)
Add geometry to the Context consisting of a series of Cone objects to form a tube-like shape.
- -
void setPlantPhenologicalThresholds(uint plantID, float time_to_dormancy_break, float time_to_flower_initiation, float time_to_flower_opening, float time_to_fruit_set, float time_to_fruit_maturity, float time_to_dormancy, float max_leaf_lifespan=1e6, bool is_evergreen=false)
Specify the threshold values for plant phenological stages.
-
uint addPlantInstance(const helios::vec3 &base_position, float current_age)
Create an instance of a plant.
-
std::vector< uint > getAllFlowerUUIDs() const
Get UUIDs for all existing flower primitives.
-
uint addChildShoot(uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
Manually add a child shoot at the axillary bud of a phytomer.
-
int appendPhytomerToShoot(uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
Add a new phytomer at the terminal bud of a shoot.
-
std::map< std::string, ShootParameters > getCurrentShootParameters()
Get the shoot parameters structure for all shoot types in the current plant model.
-
std::vector< uint > getPlantFlowerObjectIDs(uint plantID) const
Get object IDs for all inflorescence objects for a given plant.
-
void advanceTime(float time_step_days)
Advance plant growth by a specified time interval for all plants.
-
void updateCurrentShootParameters(const std::string &shoot_type_label, const ShootParameters &params)
Update the parameters of a single shoot type in the current plant model.
-
uint appendShoot(uint plantID, int parent_shoot_ID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually append a new shoot at the end of an existing shoot. This is used when the characteristics of...
-
void enableGroundClipping(float ground_height=0.f)
Enable automatic removal of organs that are below the ground plane.
-
uint addBaseStemShoot(uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has ...
-
std::vector< uint > getAllPlantUUIDs(uint plantID) const
Get primitive UUIDs for all primitives in a given plant.
-
std::vector< uint > getPlantInternodeObjectIDs(uint plantID) const
Get object IDs for all internode (Tube) objects for a given plant.
-
std::vector< uint > getAllLeafUUIDs() const
Get UUIDs for all existing leaf primitives.
-
static int selfTest()
Unit test routines.
Definition: selfTest.cpp:21
-
std::vector< uint > getAllInternodeUUIDs() const
Get UUIDs for all existing internode primitives.
-
void disablePeduncleContextBuild()
Do not build peduncle primitive geometry in the Context.
-
void deletePlantInstance(uint plantID)
Delete an existing plant instance.
-
void enableEpicormicChildShoots(uint plantID, const std::string &epicormic_shoot_type_label, float epicormic_probability_perlength_perday)
Enable shoot type to produce epicormic child shoots (water sprouts)
-
std::vector< uint > getAllObjectIDs() const
Get object IDs for all existing plant compound objects.
-
void defineShootType(const std::string &shoot_type_label, const ShootParameters &shoot_params)
Define a new shoot type based on a set of ShootParameters.
-
std::vector< uint > buildPlantCanopyFromLibrary(const helios::vec3 &canopy_center_position, const helios::vec2 &plant_spacing_xy, const helios::int2 &plant_count_xy, float age, float germination_rate=1.f)
Build a canopy of regularly spaced plants based on the model currently loaded from the library.
-
std::vector< uint > getAllFruitUUIDs() const
Get UUIDs for all existing fruit primitives.
-
std::map< std::string, PhytomerParameters > getCurrentPhytomerParameters()
Get the phytomer parameters structure for all shoot types in the current plant model.
-
std::vector< uint > getPlantFruitObjectIDs(uint plantID) const
Get object IDs for all fruit objects for a given plant.
-
void disablePetioleContextBuild()
Do not build petiole primitive geometry in the Context.
-
uint buildPlantInstanceFromLibrary(const helios::vec3 &base_position, float age)
Build a plant instance based on the model currently loaded from the library.
-
void optionalOutputObjectData(const std::string &object_data_label)
Add optional output object data values to the Context.
-
uint duplicatePlantInstance(uint plantID, const helios::vec3 &base_position, const AxisRotation &base_rotation, float current_age)
Duplicate an existing plant instance and specify its base position and age.
-
std::vector< uint > getAllPlantObjectIDs(uint plantID) const
Get object IDs for all organs objects for a given plant.
-
std::vector< uint > getAllPeduncleUUIDs() const
Get UUIDs for all existing peduncle primitives.
-
void loadPlantModelFromLibrary(const std::string &plant_label)
Load an existing plant model from the library.
-
uint addEpicormicShoot(uint plantID, int parent_shoot_ID, float parent_position_fraction, uint current_node_number, float zenith_perturbation_degrees, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually add a child epicormic shoot (water sprout) at an arbitrary position along the shoot.
-
float sumPlantLeafArea(uint plantID) const
Sum the one-sided leaf area of all leaves in the plant.
-
std::vector< uint > getPlantPetioleObjectIDs(uint plantID) const
Get object IDs for all petiole (Tube) objects for a given plant.
-
void disableInternodeContextBuild()
Do not build internode primitive geometry in the Context.
-
std::vector< uint > getPlantPeduncleObjectIDs(uint plantID) const
Get object IDs for all peduncle (Tube) objects for a given plant.
-
std::vector< uint > getPlantLeafObjectIDs(uint plantID) const
Get object IDs for all leaf objects for a given plant.
-
std::vector< uint > getAllPetioleUUIDs() const
Get UUIDs for all existing petiole primitives.
-
std::vector< uint > getAllUUIDs() const
Get UUIDs for all existing plant primitives.
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition: global.cpp:1084
- - - -
LeafPrototype()
Constructor - does not set random number generator.
-
uint subdivisions
Leaf subdivision count in each direction.
-
LeafPrototype & operator=(const LeafPrototype &a)
Assignment operator.
-
std::map< int, std::string > leaf_texture_file
Image texture file for the leaf.
-
RandomParameter_float lateral_curvature
Leaf curvature factor along the lateral/width (y-direction). (+curves upward, -curved downward)
-
RandomParameter_float petiole_roll
Creates a rolling at the leaf where the petiole attaches to the leaf blade.
-
uint unique_prototypes
Number of unique prototypes to generate.
-
bool build_petiolule
Add a petiolule to the base of the leaflet.
-
RandomParameter_float wave_period
Period factor of leaf waves (sets how many waves there are along the leaf length)
-
helios::vec3 leaf_offset
Amount to shift the leaf.
-
RandomParameter_float leaf_buckle_angle
Angle of the leaf buckle (degrees)
-
RandomParameter_float leaf_buckle_length
Fraction of the leaf length where the leaf buckles under its weight.
-
RandomParameter_float midrib_fold_fraction
Fraction of folding along the leaf midrib. =0 means leaf is flat, =1 means leaf is completely folded ...
-
uint(* prototype_function)(helios::Context *, LeafPrototype *prototype_parameters, int compound_leaf_index)
Custom prototype function for creating leaf prototypes.
-
RandomParameter_float wave_amplitude
Amplitude of leaf waves (sets the height of leaf waves)
-
std::string OBJ_model_file
OBJ model file to load for the leaf.
-
RandomParameter_float longitudinal_curvature
Leaf curvature factor along the longitudinal/length (x-direction). (+curves upward,...
- -
void setInternodeMaxLength(float internode_length_max_new)
Set the fully-elongated (maximum) internode length.
-
std::vector< std::vector< helios::vec3 > > petiole_vertices
Coordinates of internode tube segments. Index is tube segment within internode.
-
void setInternodeMaxRadius(float internode_radius_max_new)
Set the maximum radius of the internode.
-
helios::int3 shoot_index
.x = index of phytomer along shoot, .y = current number of phytomers on parent shoot,...
-
void setLeafScaleFraction(float leaf_scale_factor_fraction)
Set the leaf scale as a fraction of its total fully-elongated scale factor. Value is uniformly applie...
-
float age
Time since the phytomer was created.
-
void setLeafPrototypeScale(float leaf_prototype_scale)
Set the fully-elongated (maximum) leaf prototype scale. Value is uniformly applied for all leaves/lea...
-
void scaleInternodeMaxLength(float scale_factor)
Scale the fully-elongated (maximum) internode length as a fraction of its current fully-elongated len...
- -
PhytomerParameters()
Default constructor - does not set random number generator.
-
void(* phytomer_callback_function)(std::shared_ptr< Phytomer > phytomer_ptr)
-
void(* phytomer_creation_function)(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
- - -
RandomParameter_float()
Constructor initializing to a constant default value of 0.
-
RandomParameter_float(std::minstd_rand0 *rand_generator)
Constructor initializing the random number generator.
-
RandomParameter_float(float val)
Constructor initializing to a constant value.
- - -
void updateShootNodes(bool update_context_geometry=true)
Recalculate and apply the shoot's origin position and shift all downstream shoots.
-
int appendPhytomer(float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, const PhytomerParameters &phytomer_parameters)
Append a phytomer at the shoot apex.
-
bool sampleVegetativeBudBreak(uint node_index) const
Randomly sample whether a vegetative bud should break into a new shoot.
-
std::string sampleChildShootType() const
Randomly sample the type of a child shoot based on the probabilities defined in the shoot parameters.
-
uint sampleEpicormicShoot(float dt, std::vector< float > &epicormic_positions_fraction)
Randomly sample whether the shoot should produce an epicormic shoot (water sprout) over timestep.
- -
ShootParameters()
Default constructor - does not set random number generator.
-
RandomParameter_float vegetative_bud_break_probability_decay_rate
- -
R-G-B color vector.
-
Vector of two elements of type 'int'.
-
Vector of three elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+ +
void setPlantPhenologicalThresholds(uint plantID, float time_to_dormancy_break, float time_to_flower_initiation, float time_to_flower_opening, float time_to_fruit_set, float time_to_fruit_maturity, float time_to_dormancy, float max_leaf_lifespan=1e6, bool is_evergreen=false)
Specify the threshold values for plant phenological stages.
+
uint addPlantInstance(const helios::vec3 &base_position, float current_age)
Create an instance of a plant.
+
std::vector< uint > getAllFlowerUUIDs() const
Get UUIDs for all existing flower primitives.
+
uint addChildShoot(uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
Manually add a child shoot at the axillary bud of a phytomer.
+
int appendPhytomerToShoot(uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
Add a new phytomer at the terminal bud of a shoot.
+
std::map< std::string, ShootParameters > getCurrentShootParameters()
Get the shoot parameters structure for all shoot types in the current plant model.
+
std::vector< uint > getPlantFlowerObjectIDs(uint plantID) const
Get object IDs for all inflorescence objects for a given plant.
+
void advanceTime(float time_step_days)
Advance plant growth by a specified time interval for all plants.
+
void updateCurrentShootParameters(const std::string &shoot_type_label, const ShootParameters &params)
Update the parameters of a single shoot type in the current plant model.
+
uint appendShoot(uint plantID, int parent_shoot_ID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually append a new shoot at the end of an existing shoot. This is used when the characteristics of...
+
void enableGroundClipping(float ground_height=0.f)
Enable automatic removal of organs that are below the ground plane.
+
uint addBaseStemShoot(uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has ...
+
std::vector< uint > getAllPlantUUIDs(uint plantID) const
Get primitive UUIDs for all primitives in a given plant.
+
std::vector< uint > getPlantInternodeObjectIDs(uint plantID) const
Get object IDs for all internode (Tube) objects for a given plant.
+
std::vector< uint > getAllLeafUUIDs() const
Get UUIDs for all existing leaf primitives.
+
static int selfTest()
Unit test routines.
Definition selfTest.cpp:21
+
std::vector< uint > getAllInternodeUUIDs() const
Get UUIDs for all existing internode primitives.
+
void disablePeduncleContextBuild()
Do not build peduncle primitive geometry in the Context.
+
void deletePlantInstance(uint plantID)
Delete an existing plant instance.
+
void enableEpicormicChildShoots(uint plantID, const std::string &epicormic_shoot_type_label, float epicormic_probability_perlength_perday)
Enable shoot type to produce epicormic child shoots (water sprouts)
+
std::vector< uint > getAllObjectIDs() const
Get object IDs for all existing plant compound objects.
+
void defineShootType(const std::string &shoot_type_label, const ShootParameters &shoot_params)
Define a new shoot type based on a set of ShootParameters.
+
std::vector< uint > buildPlantCanopyFromLibrary(const helios::vec3 &canopy_center_position, const helios::vec2 &plant_spacing_xy, const helios::int2 &plant_count_xy, float age, float germination_rate=1.f)
Build a canopy of regularly spaced plants based on the model currently loaded from the library.
+
std::vector< uint > getAllFruitUUIDs() const
Get UUIDs for all existing fruit primitives.
+
std::map< std::string, PhytomerParameters > getCurrentPhytomerParameters()
Get the phytomer parameters structure for all shoot types in the current plant model.
+
std::vector< uint > getPlantFruitObjectIDs(uint plantID) const
Get object IDs for all fruit objects for a given plant.
+
void disablePetioleContextBuild()
Do not build petiole primitive geometry in the Context.
+
PlantArchitecture(helios::Context *context_ptr)
Main architectural model class constructor.
+
uint buildPlantInstanceFromLibrary(const helios::vec3 &base_position, float age)
Build a plant instance based on the model currently loaded from the library.
+
void optionalOutputObjectData(const std::string &object_data_label)
Add optional output object data values to the Context.
+
uint duplicatePlantInstance(uint plantID, const helios::vec3 &base_position, const AxisRotation &base_rotation, float current_age)
Duplicate an existing plant instance and specify its base position and age.
+
std::vector< uint > getAllPlantObjectIDs(uint plantID) const
Get object IDs for all organs objects for a given plant.
+
std::vector< uint > getAllPeduncleUUIDs() const
Get UUIDs for all existing peduncle primitives.
+
void loadPlantModelFromLibrary(const std::string &plant_label)
Load an existing plant model from the library.
+
uint addEpicormicShoot(uint plantID, int parent_shoot_ID, float parent_position_fraction, uint current_node_number, float zenith_perturbation_degrees, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually add a child epicormic shoot (water sprout) at an arbitrary position along the shoot.
+
float sumPlantLeafArea(uint plantID) const
Sum the one-sided leaf area of all leaves in the plant.
+
std::vector< uint > getPlantPetioleObjectIDs(uint plantID) const
Get object IDs for all petiole (Tube) objects for a given plant.
+
void disableInternodeContextBuild()
Do not build internode primitive geometry in the Context.
+
std::vector< uint > getPlantPeduncleObjectIDs(uint plantID) const
Get object IDs for all peduncle (Tube) objects for a given plant.
+
std::vector< uint > getPlantLeafObjectIDs(uint plantID) const
Get object IDs for all leaf objects for a given plant.
+
std::vector< uint > getAllPetioleUUIDs() const
Get UUIDs for all existing petiole primitives.
+
std::vector< uint > getAllUUIDs() const
Get UUIDs for all existing plant primitives.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
float mean(const std::vector< float > &vect)
Mean value of a vector of floats.
Definition global.cpp:1084
+ + + +
LeafPrototype()
Constructor - does not set random number generator.
+
uint subdivisions
Leaf subdivision count in each direction.
+
LeafPrototype & operator=(const LeafPrototype &a)
Assignment operator.
+
std::map< int, std::string > leaf_texture_file
Image texture file for the leaf.
+
RandomParameter_float lateral_curvature
Leaf curvature factor along the lateral/width (y-direction). (+curves upward, -curved downward)
+
RandomParameter_float petiole_roll
Creates a rolling at the leaf where the petiole attaches to the leaf blade.
+
uint unique_prototypes
Number of unique prototypes to generate.
+
bool build_petiolule
Add a petiolule to the base of the leaflet.
+
RandomParameter_float wave_period
Period factor of leaf waves (sets how many waves there are along the leaf length)
+
helios::vec3 leaf_offset
Amount to shift the leaf.
+
RandomParameter_float leaf_buckle_angle
Angle of the leaf buckle (degrees)
+
RandomParameter_float leaf_buckle_length
Fraction of the leaf length where the leaf buckles under its weight.
+
RandomParameter_float midrib_fold_fraction
Fraction of folding along the leaf midrib. =0 means leaf is flat, =1 means leaf is completely folded ...
+
uint(* prototype_function)(helios::Context *, LeafPrototype *prototype_parameters, int compound_leaf_index)
Custom prototype function for creating leaf prototypes.
+
RandomParameter_float wave_amplitude
Amplitude of leaf waves (sets the height of leaf waves)
+
std::string OBJ_model_file
OBJ model file to load for the leaf.
+
RandomParameter_float longitudinal_curvature
Leaf curvature factor along the longitudinal/length (x-direction). (+curves upward,...
+ +
void setInternodeMaxLength(float internode_length_max_new)
Set the fully-elongated (maximum) internode length.
+
std::vector< std::vector< helios::vec3 > > petiole_vertices
Coordinates of internode tube segments. Index is tube segment within internode.
+
void setInternodeMaxRadius(float internode_radius_max_new)
Set the maximum radius of the internode.
+
helios::int3 shoot_index
.x = index of phytomer along shoot, .y = current number of phytomers on parent shoot,...
+
void setLeafScaleFraction(float leaf_scale_factor_fraction)
Set the leaf scale as a fraction of its total fully-elongated scale factor. Value is uniformly applie...
+
float age
Time since the phytomer was created.
+
void setLeafPrototypeScale(float leaf_prototype_scale)
Set the fully-elongated (maximum) leaf prototype scale. Value is uniformly applied for all leaves/lea...
+
void scaleInternodeMaxLength(float scale_factor)
Scale the fully-elongated (maximum) internode length as a fraction of its current fully-elongated len...
+ +
PhytomerParameters()
Default constructor - does not set random number generator.
+
void(* phytomer_callback_function)(std::shared_ptr< Phytomer > phytomer_ptr)
+
void(* phytomer_creation_function)(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
+ + +
RandomParameter_float()
Constructor initializing to a constant default value of 0.
+
RandomParameter_float(std::minstd_rand0 *rand_generator)
Constructor initializing the random number generator.
+
RandomParameter_float(float val)
Constructor initializing to a constant value.
+ + +
void updateShootNodes(bool update_context_geometry=true)
Recalculate and apply the shoot's origin position and shift all downstream shoots.
+
int appendPhytomer(float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, const PhytomerParameters &phytomer_parameters)
Append a phytomer at the shoot apex.
+
bool sampleVegetativeBudBreak(uint node_index) const
Randomly sample whether a vegetative bud should break into a new shoot.
+
std::string sampleChildShootType() const
Randomly sample the type of a child shoot based on the probabilities defined in the shoot parameters.
+
uint sampleEpicormicShoot(float dt, std::vector< float > &epicormic_positions_fraction)
Randomly sample whether the shoot should produce an epicormic shoot (water sprout) over timestep.
+ +
ShootParameters()
Default constructor - does not set random number generator.
+
RandomParameter_float vegetative_bud_break_probability_decay_rate
+ +
R-G-B color vector.
+
Vector of two elements of type 'int'.
+
Vector of three elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_plant_architecture_doc.html b/doc/html/_plant_architecture_doc.html index 55c10427c..63cd5d3cd 100644 --- a/doc/html/_plant_architecture_doc.html +++ b/doc/html/_plant_architecture_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
-
Plant Architecture Model Plugin Documentation
+
Plant Architecture Model Plugin Documentation

Table of Contents

-
@@ -200,7 +300,7 @@

PlantArchitecture plantarchitecture(&context);
plantarchitecture.optionalOutputData("plantID"); //insert appropriate label from the table above
- +

Plug-in Overview

This plug-in provides a generalized framework for creating dynamic procedural plant models for a very wide range of species. The plug-in comes with a library of a number of different plant models, which have a common set of parameters that can be adjusted by the user. Parameters defining the plant can be set to constant values, or randomized based on a number of different distributions. The plant model can be grown over time, and will transition through different phenological stages such as dormancy, flowering, fruit set, and senescence. Users can also create their own plant models by changing model parameters, or build custom plants branch-by-branch.

@@ -274,7 +374,7 @@

return 0;
}
-
Stores the state associated with simulation.
Definition: Context.h:1882
+
Stores the state associated with simulation.
Definition Context.h:1882

This will create a default bean plant that is 45 days old (i.e., 45 days since emergence).

Multiple plants can be created manually by calling the PlantArchitecture::buildPlantInstanceFromLibrary() method multiple times with different base positions. There is also a method available to build a canopy of regularly-spaced plants: PlantArchitecture::buildPlantCanopyFromLibrary().

@@ -296,9 +396,9 @@

return 0;
}
-
Vector of two elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+
Vector of two elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.

Growing the Model over Time

The model can be grown over time by calling the PlantArchitecture::advanceTime() method after the plant instance has been created, where the argument to this method is the timestep to advance in days. The timestep value can be larger than the phyllochron, such that multiple phytomers and shoots can be produced in a single call to PlantArchitecture::advanceTime().

@@ -424,14 +524,14 @@

param = 5;
// Alternative approach
RandomParameter_float other_param(5);
- +

In order to randomize the variable, member methods can be called to set the distribution type and specify the distribution parameters. It is also required to initialize the variable with a random number generator. It is recommended that this be based on the Context's generator to keep everything consistent. Below is an example.

Context context;
param.uniformDistribution(0,7.5);
std::cout << "Random value: " << param.val() << std::endl;
-
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition: Context.cpp:49
+
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition Context.cpp:49

Available distributions for RandomParameter_float are listed below

@@ -455,7 +555,7 @@

Defining the Phytomer and its Parameters

Phytomers are defined by a set of parameters that specify its geometry. These parameters are stored in a data structure called PhytomerParameters. The phytomer parameters are parameters that are generally constant across space and time (aside from randomization), and are usually species-specific.

-

The table below lists the parameters that define the geometry of the phytomer, and their descriptions. There are some parameters that are notably absent, such as the internode length and radius. Since these parameters vary substantially with age and position along the shoot, these are considered to be parameters of the shoot and not the phytomer. Shoot parameters are described below in Defining Shoots and their Parameters.

+

The table below lists the parameters that define the geometry of the phytomer, and their descriptions. There are some parameters that are notably absent, such as the internode length and radius. Since these parameters vary substantially with age and position along the shoot, these are considered to be parameters of the shoot and not the phytomer. Shoot parameters are described below in Defining Shoots and their Parameters.

@@ -464,9 +564,96 @@

- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Type Units Description
pitch RandomParameter_float degrees Angle of the phytomer internode with respect to the previous phytomer along the shoot. Setting this >0 creates a zig-zag shoot.
phyllotactic_angle RandomParameter_float degrees Angle between the petioles/buds of two successive phytomers along the shoot. See this page for more information on phyllotaxis.
phyllotactic_angle RandomParameter_float degrees Angle between the petioles/buds of two successive phytomers along the shoot. See this page for more information on phyllotaxis.
radius_initial RandomParameter_float meters Initial radius of the internode when it is created.
max_vegetative_buds_per_petiole RandomParameter_int - Maximum number of possible vegetative nodes per petiole. Some of these buds may not break depending on the vegetative bud break probability.
max_floral_buds_per_petiole RandomParameter_int - Maximum number of possible floral nodes per petiole. Some of these buds may not break depending on the flower bud break probability.
color helios::RGBcolor - Diffuse color of the internode tube.
length_segments uint - Number of longitudinal segment subdivisions of the internode tube.
radial_subdivisions uint - Number of radial subdivisions segments of the internode tube (e.g., =4 gives a square cross-section; =5 gives a pentagonal cross-section, etc.)
petiole
petioles_per_internode uint - Number of petioles emanating from a single internode (e.g., for an 'opposite' growth pattern, = 2)
pitch RandomParameter_float degrees Angle of the petiole base axis with respect to its parent phytomer axis.
radius RandomParameter_float meters Radius of petiole cross-section. (radius = 0 does not create any petiole)
length RandomParameter_float meters Length of the petiole tube. (length = 0 does not create any petiole)
curvature RandomParameter_float degrees/meter Curvature angle of the petiole per unit length of petiole. If curvature is positive, petiole curves upward toward vertical. If negative, curvature is downward.
taper RandomParameter_float - Ratio between the petiole radius at the tip to the radius at the base (e.g., =1 has no taper, =0 comes to a point at the tip).
color helios::RGBcolor - Diffuse color of the petiole tube.
length_segments uint - Number of longitudinal segment subdivisions of the petiole tube.
radial_subdivisions uint - Number of radial subdivisions segments of the petiole tube (e.g., =4 gives a square cross-section; =5 gives a pentagonal cross-section, etc.)
leaf
leaves_per_petiole uint - Number of leaves on each petiole. >1 creates a compound leaf.
pitch RandomParameter_float degrees Angle of the leaf axis with respect to its parent petiole axis.
yaw RandomParameter_float degrees Rotation angle of the leaf about its base along the plane of its lamina.
roll RandomParameter_float degrees Rotation angle of the leaf about it's own axis (midrib).
leaflet_offset RandomParameter_float - If a compound leaf (leaves_per_petiole>1), this sets the spacing between adjacent leaflets along the petiole as a fraction of the petiole length. Note that the first two leaves from the tip will be offset from the tip by half this value.
leaflet_scale RandomParameter_float - If a compound leaf (leaves_per_petiole>1), this sets the scaling factor of the leaflet moving down the petiole with respect to the previous leaf (<1 scales down, >1 scales up).
prototype_scale RandomParameter_float - Scaling factor applied to the leaf prototype. Usually the prototype has unit length, so this sets the physical length of the leaf.
prototype LeafPrototype struct - Structure containing information to build leaf prototypes.
peduncle
length RandomParameter_float meters Length of the peduncle (inflorescence supporting structure).
radius RandomParameter_float meters Radius of the peduncle.
pitch RandomParameter_float degrees Angle of the peduncle axis with respect to its parent internode axis.
roll RandomParameter_float degrees Rotation angle of the peduncle about it's own axis.
curvature RandomParameter_float degrees/meter Curvature angle of the peduncle per unit length of peduncle. If curvature is positive, peduncle curves upward toward vertical. If negative, curvature is downward.
color helios::RGBcolor - Diffuse color of the peduncle tube.
length_segments uint - Number of longitudinal segment subdivisions of the inflorescence supporting structure.
radial_subdivisions uint - Number of radial subdivisions segments of the inflorescence supporting structure (e.g., =4 gives a square cross-section; =5 gives a pentagonal cross-section, etc.)
inflorescence
flowers_per_peduncle RandomParameter_int - Number of flowers per peduncle (rachis).
flower_offset RandomParameter_float - If peduncle has multiple flowers/fruit (flowers_per_peduncle>1), this sets the spacing between adjacent flowers/fruit along the peduncle as a fraction of the peduncle length.
pitch RandomParameter_float degrees Angle of the fruit axis with respect to its parent peduncle axis.
roll RandomParameter_float degrees Rotation angle of the fruit about it's own axis (x-axis of fruit prototype).
flower_prototype_scale RandomParameter_float - Scaling factor applied to the flower prototype. Usually the prototype has unit length, so this sets the physical length of the flower.
flower_prototype_function function pointer - Pointer to a function that generates the flower prototype model. Function takes arguments ( helios::Context*, uint subdivisions, bool flower_is_open ) and returns an object ID (uint).
fruit_prototype_scale RandomParameter_float - Scaling factor applied to the fruit prototype. Usually the prototype has unit length, so this sets the physical length of the fruit.
fruit_prototype_function function pointer - Pointer to a function that generates the fruit prototype model. Function takes arguments ( helios::Context*, uint subdivisions, float time_since_fruit_set ) and returns an object ID (uint).
unique_prototypes uint - Number of unique flower/fruit prototypes to generate per shoot type. If = 0, every leaf will be unique. Increasing this value gives more variability across the plant, but it will take longer to initially generate the plant model.
-

| radius_initial | RandomParameter_float | 0.001 | meters | Initial radius of the internode when it is created. | | max_vegetative_buds_per_petiole | RandomParameter_int | - | Maximum number of possible vegetative nodes per petiole. Some of these buds may not break depending on the vegetative bud break probability. | | max_floral_buds_per_petiole | RandomParameter_int | - | Maximum number of possible floral nodes per petiole. Some of these buds may not break depending on the flower bud break probability. | | color | helios::RGBcolor | - | Diffuse color of the internode tube. | | length_segments | uint | - | Number of longitudinal segment subdivisions of the internode tube. | | radial_subdivisions | uint | - | Number of radial subdivisions segments of the internode tube (e.g., =4 gives a square cross-section; =5 gives a pentagonal cross-section, etc.) | | — petiole — |||| | petioles_per_internode | uint | - | Number of petioles emanating from a single internode (e.g., for an 'opposite' growth pattern, = 2) | | pitch | RandomParameter_float | degrees | Angle of the petiole base axis with respect to its parent phytomer axis. | | radius | RandomParameter_float | meters | Radius of petiole cross-section. (radius = 0 does not create any petiole) | | length | RandomParameter_float | meters | Length of the petiole tube. (length = 0 does not create any petiole) | | curvature | RandomParameter_float | degrees/meter | Curvature angle of the petiole per unit length of petiole. If curvature is positive, petiole curves upward toward vertical. If negative, curvature is downward. | | taper | RandomParameter_float | - | Ratio between the petiole radius at the tip to the radius at the base (e.g., =1 has no taper, =0 comes to a point at the tip). | | color | helios::RGBcolor | - | Diffuse color of the petiole tube. | | length_segments | uint | - | Number of longitudinal segment subdivisions of the petiole tube. | | radial_subdivisions | uint | - | Number of radial subdivisions segments of the petiole tube (e.g., =4 gives a square cross-section; =5 gives a pentagonal cross-section, etc.) | | — leaf — |||| | leaves_per_petiole | uint | - | Number of leaves on each petiole. >1 creates a compound leaf. | | pitch | RandomParameter_float | degrees | Angle of the leaf axis with respect to its parent petiole axis. | | yaw | RandomParameter_float | degrees | Rotation angle of the leaf about its base along the plane of its lamina. | | roll | RandomParameter_float | degrees | Rotation angle of the leaf about it's own axis (midrib). | | leaflet_offset | RandomParameter_float | - | If a compound leaf (leaves_per_petiole>1), this sets the spacing between adjacent leaflets along the petiole as a fraction of the petiole length. Note that the first two leaves from the tip will be offset from the tip by half this value. | | leaflet_scale | RandomParameter_float | - | If a compound leaf (leaves_per_petiole>1), this sets the scaling factor of the leaflet moving down the petiole with respect to the previous leaf (<1 scales down, >1 scales up). | | prototype_scale | RandomParameter_float | - | Scaling factor applied to the leaf prototype. Usually the prototype has unit length, so this sets the physical length of the leaf. | | prototype | LeafPrototype struct | - | Structure containing information to build leaf prototypes. | | — peduncle — |||| | length | RandomParameter_float | meters | Length of the peduncle (inflorescence supporting structure). | | radius | RandomParameter_float | meters | Radius of the peduncle. | | pitch | RandomParameter_float | degrees | Angle of the peduncle axis with respect to its parent internode axis. | | roll | RandomParameter_float | degrees | Rotation angle of the peduncle about it's own axis. | | curvature | RandomParameter_float | degrees/meter | Curvature angle of the peduncle per unit length of peduncle. If curvature is positive, peduncle curves upward toward vertical. If negative, curvature is downward. | | color | helios::RGBcolor | - | Diffuse color of the peduncle tube. | | length_segments | uint | - | Number of longitudinal segment subdivisions of the inflorescence supporting structure. | | radial_subdivisions | uint | - | Number of radial subdivisions segments of the inflorescence supporting structure (e.g., =4 gives a square cross-section; =5 gives a pentagonal cross-section, etc.) | | — inflorescence — |||| | flowers_per_peduncle | RandomParameter_int | - | Number of flowers per peduncle (rachis). | | flower_offset | RandomParameter_float | - | If peduncle has multiple flowers/fruit (flowers_per_peduncle>1), this sets the spacing between adjacent flowers/fruit along the peduncle as a fraction of the peduncle length. | | pitch | RandomParameter_float | degrees | Angle of the fruit axis with respect to its parent peduncle axis. | | roll | RandomParameter_float | degrees | Rotation angle of the fruit about it's own axis (x-axis of fruit prototype). | | flower_prototype_scale | RandomParameter_float | - | Scaling factor applied to the flower prototype. Usually the prototype has unit length, so this sets the physical length of the flower. | | flower_prototype_function | function pointer | - | Pointer to a function that generates the flower prototype model. Function takes arguments ( helios::Context*, uint subdivisions, bool flower_is_open ) and returns an object ID (uint). | | fruit_prototype_scale | RandomParameter_float | - | Scaling factor applied to the fruit prototype. Usually the prototype has unit length, so this sets the physical length of the fruit. | | fruit_prototype_function | function pointer | - | Pointer to a function that generates the fruit prototype model. Function takes arguments ( helios::Context*, uint subdivisions, float time_since_fruit_set ) and returns an object ID (uint). | | unique_prototypes | uint | - | Number of unique flower/fruit prototypes to generate per shoot type. If = 0, every leaf will be unique. Increasing this value gives more variability across the plant, but it will take longer to initially generate the plant model. |

The phytomer parameters are stored in a data structure (struct) called PhytomerParameters. This structure has sub-member structs for each of internode, leaf, petiole, and inflorescence, each containing the parameters for that element type as designated in the table above. Below is an example of how to set a few of the parameters:

phytomer.internode.pitch = 20;
@@ -475,7 +662,7 @@

phytomer.leaf.pitch = 10;
phytomer.leaf.prototype_scale = 0.1;
phytomer.peduncle.length = 0.1;
- +

The figure below provides some examples of how various shoot growth patterns (e.g., alternate, opposite) can be created by varying the model parameters.

@@ -696,7 +883,7 @@

plantarchitecture.updateCurrentShootParameters( "trunk", shoot_parameters );
plantarchitecture.buildPlantInstanceFromLibrary( nullorigin, 0 );
- +

Below is an example of modifying the parameters for all shoot types:

plantarchitecture.loadPlantModelFromLibrary( "almond" );
@@ -779,13 +966,14 @@

The UUIDs for a given sub-organ group can be retrieved by calling the Context method helios::Context::filterPrimitivesByData(). Below is an example for getting the leaf vein UUIDs.

std::vector<uint> plant_UUIDs = plantarchitecture.getAllPlantUUIDs( plantID );
std::vector<uint> leaf_vein_UUIDs = context.filterPrimitivesByData( plant_UUIDs, "object_label", "veins" );
-
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.
+
std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
Filter a set of primitives based on their primitive data and a condition and float value.

For custom user-defined organ prototypes, users should follow the convention of grouping the above sub-components into separate object groups with the labels given in the table above.

+
diff --git a/doc/html/_plant_library_8cpp.html b/doc/html/_plant_library_8cpp.html index 326415d9a..c631ef452 100644 --- a/doc/html/_plant_library_8cpp.html +++ b/doc/html/_plant_library_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
PlantLibrary.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_plant_library_8cpp_source.html b/doc/html/_plant_library_8cpp_source.html index 0177e9fb4..3c0c440e2 100644 --- a/doc/html/_plant_library_8cpp_source.html +++ b/doc/html/_plant_library_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
PlantLibrary.cpp
@@ -97,13 +109,16 @@
17
18using namespace helios;
19
+
20void PlantArchitecture::loadPlantModelFromLibrary( const std::string &plant_label ){
21
22 current_plant_model = plant_label;
23 initializeDefaultShoots(plant_label);
24
25}
+
26
+
27uint PlantArchitecture::buildPlantInstanceFromLibrary( const helios::vec3 &base_position, float age ){
28
29 if( current_plant_model.empty() ){
@@ -166,7 +181,9 @@
86 return plantID;
87
88}
+
89
+
91
92 if( shoot_types.find(shoot_type_label) == shoot_types.end() ){
@@ -175,14 +192,18 @@
95
96 return shoot_types.at(shoot_type_label);
97}
+
98
+
99std::map<std::string, ShootParameters> PlantArchitecture::getCurrentShootParameters(){
100 if( shoot_types.empty() ){
101 std::cerr << "WARNING (PlantArchitecture::getCurrentShootParameters): No plant models have been loaded. You need to first load a plant model from the library (see loadPlantModelFromLibrary()) or manually add shoot parameters (see updateCurrentShootParameters())." << std::endl;
102 }
103 return shoot_types;
104}
+
105
+
106std::map<std::string, PhytomerParameters> PlantArchitecture::getCurrentPhytomerParameters( ){
107 if( shoot_types.empty() ){
108 std::cerr << "WARNING (PlantArchitecture::getCurrentPhytomerParameters): No plant models have been loaded. You need to first load a plant model from the library (see loadPlantModelFromLibrary()) or manually add shoot parameters (see updateCurrentShootParameters())." << std::endl;
@@ -193,14 +214,19 @@
113 }
114 return phytomer_parameters;
115}
+
116
+
117void PlantArchitecture::updateCurrentShootParameters( const std::string &shoot_type_label, const ShootParameters &params ){
118 shoot_types[shoot_type_label] = params;
119}
+
120
+
121void PlantArchitecture::updateCurrentShootParameters( const std::map<std::string, ShootParameters> &params ){
122 shoot_types = params;
123}
+
124
125void PlantArchitecture::initializeDefaultShoots( const std::string &plant_label ){
126
@@ -1804,1240 +1830,1240 @@
1724 ShootParameters shoot_parameters_base = shoot_parameters_primary;
1725 shoot_parameters_base.phytomer_parameters = phytomer_parameters_puncturevine;
1726 shoot_parameters_base.phytomer_parameters.internode.phyllotactic_angle.uniformDistribution(137.5-10,137.5+10);
-
1727 shoot_parameters_base.phytomer_parameters.petiole.petioles_per_internode = 0;
-
1728 shoot_parameters_base.phytomer_parameters.internode.pitch = 0;
-
1729 shoot_parameters_base.phytomer_parameters.petiole.pitch = 0;
-
1730 shoot_parameters_base.vegetative_bud_break_probability_min = 1;
-
1731 shoot_parameters_base.vegetative_bud_break_time = 2;
-
1732 shoot_parameters_base.phyllochron_min = 2;
-
1733 shoot_parameters_base.elongation_rate = 0.15;
-
1734 shoot_parameters_base.gravitropic_curvature = 0;
-
1735 shoot_parameters_base.internode_length_max = 0.01;
-
1736 shoot_parameters_base.internode_length_decay_rate = 0;
-
1737 shoot_parameters_base.insertion_angle_tip = 90;
-
1738 shoot_parameters_base.insertion_angle_decay_rate = 0;
-
1739 shoot_parameters_base.flowers_require_dormancy = false;
-
1740 shoot_parameters_base.growth_requires_dormancy = false;
-
1741 shoot_parameters_base.flower_bud_break_probability = 0.0;
-
1742 shoot_parameters_base.max_nodes.uniformDistribution(3,5);
-
1743 shoot_parameters_base.defineChildShootTypes({"primary_puncturevine"},{1.f});
-
1744
-
1745 ShootParameters shoot_parameters_children = shoot_parameters_primary;
-
1746 shoot_parameters_children.base_roll = 0;
-
1747
-
1748 defineShootType("base_puncturevine", shoot_parameters_base);
-
1749 defineShootType("primary_puncturevine", shoot_parameters_primary);
-
1750 defineShootType("secondary_puncturevine", shoot_parameters_children);
-
1751
-
1752}
-
1753
-
1754uint PlantArchitecture::buildPuncturevinePlant(const helios::vec3 &base_position) {
-
1755
-
1756 if (shoot_types.empty()) {
-
1757 //automatically initialize puncturevine plant shoots
-
1758 initializePuncturevineShoots();
-
1759 }
-
1760
-
1761 uint plantID = addPlantInstance(base_position, 0);
-
1762
-
1763 uint uID_stem = addBaseStemShoot(plantID, 3, make_AxisRotation(0, 0.f, 0.f), 0.001, 0.001, 1, 1, 0, "base_puncturevine");
-
1764
-
1765 breakPlantDormancy(plantID);
-
1766
-
1767 plant_instances.at(plantID).max_age = 45;
-
1768
-
1769 setPlantPhenologicalThresholds(plantID, 0, -1, 14, -1, -1, 1000, false);
-
1770
-
1771 return plantID;
-
1772
-
1773}
-
1774
-
1775void PlantArchitecture::initializeEasternRedbudShoots() {
-
1776
-
1777 // ---- Leaf Prototype ---- //
-
1778
-
1779 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
1780 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/RedbudLeaf.png";
-
1781 leaf_prototype.leaf_aspect_ratio = 1.f;
-
1782 leaf_prototype.midrib_fold_fraction = 0.2f;
-
1783 leaf_prototype.longitudinal_curvature = -0.15f;
-
1784 leaf_prototype.lateral_curvature = -0.1f;
-
1785 leaf_prototype.wave_period = 0.3f;
-
1786 leaf_prototype.wave_amplitude = 0.025f;
-
1787 leaf_prototype.subdivisions = 5;
-
1788 leaf_prototype.unique_prototypes = 5;
-
1789 leaf_prototype.leaf_offset = make_vec3(-0.3, 0, 0);
-
1790
-
1791 // ---- Phytomer Parameters ---- //
-
1792
-
1793 PhytomerParameters phytomer_parameters_redbud(context_ptr->getRandomGenerator());
-
1794
-
1795 phytomer_parameters_redbud.internode.pitch = 15;
-
1796 phytomer_parameters_redbud.internode.phyllotactic_angle.uniformDistribution(170,190);
-
1797 phytomer_parameters_redbud.internode.radius_initial = 0.0015;
-
1798 phytomer_parameters_redbud.internode.image_texture = "plugins/plantarchitecture/assets/textures/WesternRedbudBark.jpg";
-
1799 phytomer_parameters_redbud.internode.color.scale(0.3);
-
1800 phytomer_parameters_redbud.internode.length_segments = 1;
-
1801 phytomer_parameters_redbud.internode.max_floral_buds_per_petiole = 5;
-
1802
-
1803 phytomer_parameters_redbud.petiole.petioles_per_internode = 1;
-
1804 phytomer_parameters_redbud.petiole.color = make_RGBcolor(0.65, 0.52, 0.39);
-
1805 phytomer_parameters_redbud.petiole.pitch.uniformDistribution(20, 40);
-
1806 phytomer_parameters_redbud.petiole.radius = 0.002;
-
1807 phytomer_parameters_redbud.petiole.length = 0.075;
-
1808 phytomer_parameters_redbud.petiole.taper = 0;
-
1809 phytomer_parameters_redbud.petiole.curvature = 0;
-
1810 phytomer_parameters_redbud.petiole.length_segments = 1;
-
1811
-
1812 phytomer_parameters_redbud.leaf.leaves_per_petiole = 1;
-
1813 phytomer_parameters_redbud.leaf.pitch.uniformDistribution(-110, -80);
-
1814 phytomer_parameters_redbud.leaf.yaw = 0;
-
1815 phytomer_parameters_redbud.leaf.roll.uniformDistribution(-5, 5);
-
1816 phytomer_parameters_redbud.leaf.prototype_scale = 0.1;
-
1817 phytomer_parameters_redbud.leaf.prototype = leaf_prototype;
-
1818
-
1819 phytomer_parameters_redbud.peduncle.length = 0.02;
-
1820 phytomer_parameters_redbud.peduncle.pitch.uniformDistribution(50,90);
-
1821 phytomer_parameters_redbud.peduncle.color = make_RGBcolor(0.32, 0.05, 0.13);
-
1822
-
1823 phytomer_parameters_redbud.inflorescence.flowers_per_peduncle = 1;
-
1824 phytomer_parameters_redbud.inflorescence.pitch = 0;
-
1825 phytomer_parameters_redbud.inflorescence.flower_prototype_function = RedbudFlowerPrototype;
-
1826 phytomer_parameters_redbud.inflorescence.flower_prototype_scale = 0.04;
-
1827 phytomer_parameters_redbud.inflorescence.fruit_prototype_function = RedbudFruitPrototype;
-
1828 phytomer_parameters_redbud.inflorescence.fruit_prototype_scale = 0.1;
-
1829 phytomer_parameters_redbud.inflorescence.fruit_gravity_factor_fraction = 0.7;
-
1830
-
1831 phytomer_parameters_redbud.phytomer_creation_function = RedbudPhytomerCreationFunction;
-
1832 phytomer_parameters_redbud.phytomer_callback_function = RedbudPhytomerCallbackFunction;
-
1833
-
1834 // ---- Shoot Parameters ---- //
-
1835
-
1836 ShootParameters shoot_parameters_main(context_ptr->getRandomGenerator());
-
1837 shoot_parameters_main.phytomer_parameters = phytomer_parameters_redbud;
-
1838 shoot_parameters_main.vegetative_bud_break_probability_min = 1.0;
-
1839 shoot_parameters_main.vegetative_bud_break_time = 2;
-
1840 shoot_parameters_main.phyllochron_min = 2;
-
1841 shoot_parameters_main.elongation_rate = 0.1;
-
1842 shoot_parameters_main.girth_area_factor = 4.f;
-
1843 shoot_parameters_main.gravitropic_curvature = 300;
-
1844 shoot_parameters_main.tortuosity = 5;
-
1845 shoot_parameters_main.internode_length_max = 0.04;
-
1846 shoot_parameters_main.internode_length_decay_rate = 0.005;
-
1847 shoot_parameters_main.internode_length_min = 0.01;
-
1848 shoot_parameters_main.insertion_angle_tip = 75;
-
1849 shoot_parameters_main.insertion_angle_decay_rate = 10;
-
1850 shoot_parameters_main.flowers_require_dormancy = true;
-
1851 shoot_parameters_main.growth_requires_dormancy = true;
-
1852 shoot_parameters_main.determinate_shoot_growth = false;
-
1853 shoot_parameters_main.max_terminal_floral_buds = 0;
-
1854 shoot_parameters_main.flower_bud_break_probability = 0.8;
-
1855 shoot_parameters_main.fruit_set_probability = 0.3;
-
1856 shoot_parameters_main.max_nodes = 25;
-
1857 shoot_parameters_main.max_nodes_per_season = 10;
-
1858 shoot_parameters_main.base_roll = 90;
-
1859
-
1860 ShootParameters shoot_parameters_trunk = shoot_parameters_main;
-
1861 shoot_parameters_trunk.phytomer_parameters.internode.pitch = 0;
-
1862 shoot_parameters_trunk.phytomer_parameters.internode.radial_subdivisions = 15;
-
1863 shoot_parameters_trunk.phytomer_parameters.internode.max_floral_buds_per_petiole = 0;
-
1864 shoot_parameters_trunk.insertion_angle_tip = 60;
-
1865 shoot_parameters_trunk.max_nodes = 75;
-
1866 shoot_parameters_trunk.max_nodes_per_season = 10;
-
1867 shoot_parameters_trunk.tortuosity = 1.5;
-
1868 shoot_parameters_trunk.defineChildShootTypes({"eastern_redbud_shoot"},{1.f});
-
1869
-
1870 defineShootType("eastern_redbud_trunk", shoot_parameters_trunk);
-
1871 defineShootType("eastern_redbud_shoot", shoot_parameters_main);
-
1872
-
1873}
-
1874
-
1875uint PlantArchitecture::buildEasternRedbudPlant(const helios::vec3 &base_position) {
-
1876
-
1877 if (shoot_types.empty()) {
-
1878 //automatically initialize redbud plant shoots
-
1879 initializeEasternRedbudShoots();
-
1880 }
-
1881
-
1882 uint plantID = addPlantInstance(base_position, 0);
-
1883
-
1884 uint uID_stem = addBaseStemShoot(plantID, 16, make_AxisRotation(context_ptr->randu(0,0.1*M_PI), context_ptr->randu(0,2*M_PI), context_ptr->randu(0,2*M_PI)), 0.0075, 0.05, 1, 1, 0.4, "eastern_redbud_trunk");
-
1885
-
1886 makePlantDormant(plantID);
-
1887 breakPlantDormancy(plantID);
-
1888
-
1889 //leave four vegetative buds on the trunk and remove the rest
-
1890 for (auto &phytomer: this->plant_instances.at(plantID).shoot_tree.at(uID_stem)->phytomers ) {
-
1891 if ( phytomer->shoot_index.x < 12 ) {
-
1892 for (auto &petiole: phytomer->axillary_vegetative_buds) {
-
1893 for (auto &vbud: petiole) {
-
1894 phytomer->setVegetativeBudState(BUD_DEAD, vbud);
-
1895 }
-
1896 }
-
1897 }
-
1898 }
-
1899
-
1900 setPlantPhenologicalThresholds(plantID, 165, -1, 3, 7, 30, 200, false);
-
1901
-
1902 plant_instances.at(plantID).max_age = 1460;
-
1903
-
1904 return plantID;
-
1905
-
1906}
-
1907
-
1908void PlantArchitecture::initializeRiceShoots() {
-
1909
-
1910 // ---- Leaf Prototype ---- //
-
1911
-
1912 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
1913 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SorghumLeaf.png";
-
1914 leaf_prototype.leaf_aspect_ratio = 0.06f;
-
1915 leaf_prototype.midrib_fold_fraction = 0.3f;
-
1916 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.2, 0);
-
1917 leaf_prototype.lateral_curvature = -0.3;
-
1918 leaf_prototype.wave_period = 0.1f;
-
1919 leaf_prototype.wave_amplitude = 0.1f;
-
1920 leaf_prototype.subdivisions = 20;
-
1921 leaf_prototype.unique_prototypes = 10;
-
1922
-
1923 // ---- Phytomer Parameters ---- //
-
1924
-
1925 PhytomerParameters phytomer_parameters_rice(context_ptr->getRandomGenerator());
-
1926
-
1927 phytomer_parameters_rice.internode.pitch = 0;
-
1928 phytomer_parameters_rice.internode.phyllotactic_angle.uniformDistribution(67, 77);
-
1929 phytomer_parameters_rice.internode.radius_initial = 0.001;
-
1930 phytomer_parameters_rice.internode.color = make_RGBcolor(0.27, 0.31, 0.16);
-
1931 phytomer_parameters_rice.internode.length_segments = 1;
-
1932 phytomer_parameters_rice.internode.radial_subdivisions = 6;
-
1933 phytomer_parameters_rice.internode.max_floral_buds_per_petiole = 0;
-
1934 phytomer_parameters_rice.internode.max_vegetative_buds_per_petiole = 0;
-
1935
-
1936 phytomer_parameters_rice.petiole.petioles_per_internode = 1;
-
1937 phytomer_parameters_rice.petiole.pitch.uniformDistribution(-40, 0);
-
1938 phytomer_parameters_rice.petiole.radius = 0.0;
-
1939 phytomer_parameters_rice.petiole.length = 0.01;
-
1940 phytomer_parameters_rice.petiole.taper = 0;
-
1941 phytomer_parameters_rice.petiole.curvature = 0;
-
1942 phytomer_parameters_rice.petiole.length_segments = 1;
-
1943
-
1944 phytomer_parameters_rice.leaf.leaves_per_petiole = 1;
-
1945 phytomer_parameters_rice.leaf.pitch = 0;
-
1946 phytomer_parameters_rice.leaf.yaw = 0;
-
1947 phytomer_parameters_rice.leaf.roll = 0;
-
1948 phytomer_parameters_rice.leaf.prototype_scale = 0.15;
-
1949 phytomer_parameters_rice.leaf.prototype = leaf_prototype;
-
1950
-
1951 phytomer_parameters_rice.peduncle.pitch = 0;
-
1952 phytomer_parameters_rice.peduncle.length.uniformDistribution(0.14,0.18);
-
1953 phytomer_parameters_rice.peduncle.radius = 0.0005;
-
1954 phytomer_parameters_rice.peduncle.color = phytomer_parameters_rice.internode.color;
-
1955 phytomer_parameters_rice.peduncle.curvature.uniformDistribution(-800,-50);
-
1956 phytomer_parameters_rice.peduncle.radial_subdivisions = 6;
-
1957 phytomer_parameters_rice.peduncle.length_segments = 8;
-
1958
-
1959 phytomer_parameters_rice.inflorescence.flowers_per_peduncle = 60;
-
1960 phytomer_parameters_rice.inflorescence.pitch.uniformDistribution(20,25);
-
1961 phytomer_parameters_rice.inflorescence.roll = 0;
-
1962 phytomer_parameters_rice.inflorescence.fruit_prototype_scale = 0.008;
-
1963 phytomer_parameters_rice.inflorescence.flower_offset = 0.012;
-
1964 phytomer_parameters_rice.inflorescence.fruit_prototype_function = RiceSpikePrototype;
-
1965
-
1966// phytomer_parameters_rice.phytomer_creation_function = RicePhytomerCreationFunction;
-
1967
-
1968 // ---- Shoot Parameters ---- //
-
1969
-
1970 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
-
1971 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters_rice;
-
1972 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
-
1973 shoot_parameters_mainstem.flower_bud_break_probability = 1;
-
1974 shoot_parameters_mainstem.phyllochron_min = 2;
-
1975 shoot_parameters_mainstem.elongation_rate = 0.1;
-
1976 shoot_parameters_mainstem.girth_area_factor = 5.f;
-
1977 shoot_parameters_mainstem.gravitropic_curvature.uniformDistribution(-1000,-400);
-
1978 shoot_parameters_mainstem.internode_length_max = 0.0075;
-
1979 shoot_parameters_mainstem.internode_length_decay_rate = 0;
-
1980 shoot_parameters_mainstem.flowers_require_dormancy = false;
-
1981 shoot_parameters_mainstem.growth_requires_dormancy = false;
-
1982 shoot_parameters_mainstem.determinate_shoot_growth = false;
-
1983 shoot_parameters_mainstem.fruit_set_probability = 1.0;
-
1984 shoot_parameters_mainstem.defineChildShootTypes({"mainstem"},{1.0});
-
1985 shoot_parameters_mainstem.max_nodes = 30;
-
1986 shoot_parameters_mainstem.max_terminal_floral_buds = 5;
-
1987
-
1988 defineShootType("mainstem",shoot_parameters_mainstem);
-
1989
-
1990}
-
1991
-
1992uint PlantArchitecture::buildRicePlant(const helios::vec3 &base_position) {
-
1993
-
1994 if (shoot_types.empty()) {
-
1995 //automatically initialize rice plant shoots
-
1996 initializeRiceShoots();
-
1997 }
-
1998
-
1999 uint plantID = addPlantInstance(base_position, 0);
-
2000
-
2001 uint uID_stem = addBaseStemShoot(plantID, 1, make_AxisRotation(context_ptr->randu(0.f, 0.1f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI)), 0.001, 0.0075, 0.01, 0.01, 0, "mainstem");
-
2002
-
2003 breakPlantDormancy(plantID);
-
2004
-
2005 setPlantPhenologicalThresholds(plantID, 0, -1, -1, 4, 10, 1000, false);
-
2006
-
2007 plant_instances.at(plantID).max_age = 365;
-
2008
-
2009 return plantID;
-
2010
-
2011}
-
2012
-
2013void PlantArchitecture::initializeButterLettuceShoots() {
-
2014
-
2015 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
2016 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/RomaineLettuceLeaf.png";
-
2017 leaf_prototype.leaf_aspect_ratio = 0.85f;
-
2018 leaf_prototype.midrib_fold_fraction = 0.2f;
-
2019 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.2, 0.05);
-
2020 leaf_prototype.lateral_curvature = -0.4f;
-
2021 leaf_prototype.wave_period.uniformDistribution(0.15, 0.25);
-
2022 leaf_prototype.wave_amplitude.uniformDistribution(0.05,0.1);
-
2023 leaf_prototype.subdivisions = 30;
-
2024 leaf_prototype.unique_prototypes = 10;
-
2025
-
2026 // ---- Phytomer Parameters ---- //
-
2027
-
2028 PhytomerParameters phytomer_parameters(context_ptr->getRandomGenerator());
-
2029
-
2030 phytomer_parameters.internode.pitch = 0;
-
2031 phytomer_parameters.internode.phyllotactic_angle = 137.5;
-
2032 phytomer_parameters.internode.radius_initial = 0.02;
-
2033 phytomer_parameters.internode.color = make_RGBcolor(0.402,0.423,0.413);
-
2034 phytomer_parameters.internode.length_segments = 1;
-
2035 phytomer_parameters.internode.radial_subdivisions = 10;
-
2036
-
2037 phytomer_parameters.petiole.petioles_per_internode = 1;
-
2038 phytomer_parameters.petiole.pitch.uniformDistribution(0,30);
-
2039 phytomer_parameters.petiole.radius = 0.001;
-
2040 phytomer_parameters.petiole.length = 0.001;
-
2041 phytomer_parameters.petiole.length_segments = 1;
-
2042 phytomer_parameters.petiole.radial_subdivisions = 3;
-
2043 phytomer_parameters.petiole.color = RGB::red;
-
2044
-
2045 phytomer_parameters.leaf.leaves_per_petiole = 1;
-
2046 phytomer_parameters.leaf.pitch = 10;
-
2047 phytomer_parameters.leaf.yaw = 0;
-
2048 phytomer_parameters.leaf.roll = 0;
-
2049 phytomer_parameters.leaf.prototype_scale.uniformDistribution(0.15,0.25);
-
2050 phytomer_parameters.leaf.prototype = leaf_prototype;
-
2051
-
2052 phytomer_parameters.phytomer_creation_function = ButterLettucePhytomerCreationFunction;
-
2053
-
2054 // ---- Shoot Parameters ---- //
-
2055
-
2056 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
-
2057 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters;
-
2058 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
-
2059 shoot_parameters_mainstem.phyllochron_min = 2;
-
2060 shoot_parameters_mainstem.elongation_rate = 0.15;
-
2061 shoot_parameters_mainstem.girth_area_factor = 0.f;
-
2062 shoot_parameters_mainstem.gravitropic_curvature = 10;
-
2063 shoot_parameters_mainstem.internode_length_max = 0.001;
-
2064 shoot_parameters_mainstem.internode_length_decay_rate = 0;
-
2065 shoot_parameters_mainstem.flowers_require_dormancy = false;
-
2066 shoot_parameters_mainstem.growth_requires_dormancy = false;
-
2067 shoot_parameters_mainstem.flower_bud_break_probability = 0.0;
-
2068 shoot_parameters_mainstem.max_nodes = 25;
-
2069
-
2070 defineShootType("mainstem",shoot_parameters_mainstem);
+
1727 shoot_parameters_base.phytomer_parameters.internode.pitch = 0;
+
1728 shoot_parameters_base.phytomer_parameters.petiole.pitch = 0;
+
1729 shoot_parameters_base.vegetative_bud_break_probability_min = 1;
+
1730 shoot_parameters_base.vegetative_bud_break_time = 2;
+
1731 shoot_parameters_base.phyllochron_min = 2;
+
1732 shoot_parameters_base.elongation_rate = 0.15;
+
1733 shoot_parameters_base.gravitropic_curvature = 0;
+
1734 shoot_parameters_base.internode_length_max = 0.01;
+
1735 shoot_parameters_base.internode_length_decay_rate = 0;
+
1736 shoot_parameters_base.insertion_angle_tip = 90;
+
1737 shoot_parameters_base.insertion_angle_decay_rate = 0;
+
1738 shoot_parameters_base.flowers_require_dormancy = false;
+
1739 shoot_parameters_base.growth_requires_dormancy = false;
+
1740 shoot_parameters_base.flower_bud_break_probability = 0.0;
+
1741 shoot_parameters_base.max_nodes.uniformDistribution(3,5);
+
1742 shoot_parameters_base.defineChildShootTypes({"primary_puncturevine"},{1.f});
+
1743
+
1744 ShootParameters shoot_parameters_children = shoot_parameters_primary;
+
1745 shoot_parameters_children.base_roll = 0;
+
1746
+
1747 defineShootType("base_puncturevine", shoot_parameters_base);
+
1748 defineShootType("primary_puncturevine", shoot_parameters_primary);
+
1749 defineShootType("secondary_puncturevine", shoot_parameters_children);
+
1750
+
1751}
+
1752
+
1753uint PlantArchitecture::buildPuncturevinePlant(const helios::vec3 &base_position) {
+
1754
+
1755 if (shoot_types.empty()) {
+
1756 //automatically initialize puncturevine plant shoots
+
1757 initializePuncturevineShoots();
+
1758 }
+
1759
+
1760 uint plantID = addPlantInstance(base_position, 0);
+
1761
+
1762 uint uID_stem = addBaseStemShoot(plantID, 3, make_AxisRotation(0, 0.f, 0.f), 0.001, 0.001, 1, 1, 0, "base_puncturevine");
+
1763
+
1764 breakPlantDormancy(plantID);
+
1765
+
1766 plant_instances.at(plantID).max_age = 45;
+
1767
+
1768 setPlantPhenologicalThresholds(plantID, 0, -1, 14, -1, -1, 1000, false);
+
1769
+
1770 return plantID;
+
1771
+
1772}
+
1773
+
1774void PlantArchitecture::initializeEasternRedbudShoots() {
+
1775
+
1776 // ---- Leaf Prototype ---- //
+
1777
+
1778 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
1779 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/RedbudLeaf.png";
+
1780 leaf_prototype.leaf_aspect_ratio = 1.f;
+
1781 leaf_prototype.midrib_fold_fraction = 0.2f;
+
1782 leaf_prototype.longitudinal_curvature = -0.15f;
+
1783 leaf_prototype.lateral_curvature = -0.1f;
+
1784 leaf_prototype.wave_period = 0.3f;
+
1785 leaf_prototype.wave_amplitude = 0.025f;
+
1786 leaf_prototype.subdivisions = 5;
+
1787 leaf_prototype.unique_prototypes = 5;
+
1788 leaf_prototype.leaf_offset = make_vec3(-0.3, 0, 0);
+
1789
+
1790 // ---- Phytomer Parameters ---- //
+
1791
+
1792 PhytomerParameters phytomer_parameters_redbud(context_ptr->getRandomGenerator());
+
1793
+
1794 phytomer_parameters_redbud.internode.pitch = 15;
+
1795 phytomer_parameters_redbud.internode.phyllotactic_angle.uniformDistribution(170,190);
+
1796 phytomer_parameters_redbud.internode.radius_initial = 0.0015;
+
1797 phytomer_parameters_redbud.internode.image_texture = "plugins/plantarchitecture/assets/textures/WesternRedbudBark.jpg";
+
1798 phytomer_parameters_redbud.internode.color.scale(0.3);
+
1799 phytomer_parameters_redbud.internode.length_segments = 1;
+
1800 phytomer_parameters_redbud.internode.max_floral_buds_per_petiole = 5;
+
1801
+
1802 phytomer_parameters_redbud.petiole.petioles_per_internode = 1;
+
1803 phytomer_parameters_redbud.petiole.color = make_RGBcolor(0.65, 0.52, 0.39);
+
1804 phytomer_parameters_redbud.petiole.pitch.uniformDistribution(20, 40);
+
1805 phytomer_parameters_redbud.petiole.radius = 0.002;
+
1806 phytomer_parameters_redbud.petiole.length = 0.075;
+
1807 phytomer_parameters_redbud.petiole.taper = 0;
+
1808 phytomer_parameters_redbud.petiole.curvature = 0;
+
1809 phytomer_parameters_redbud.petiole.length_segments = 1;
+
1810
+
1811 phytomer_parameters_redbud.leaf.leaves_per_petiole = 1;
+
1812 phytomer_parameters_redbud.leaf.pitch.uniformDistribution(-110, -80);
+
1813 phytomer_parameters_redbud.leaf.yaw = 0;
+
1814 phytomer_parameters_redbud.leaf.roll.uniformDistribution(-5, 5);
+
1815 phytomer_parameters_redbud.leaf.prototype_scale = 0.1;
+
1816 phytomer_parameters_redbud.leaf.prototype = leaf_prototype;
+
1817
+
1818 phytomer_parameters_redbud.peduncle.length = 0.02;
+
1819 phytomer_parameters_redbud.peduncle.pitch.uniformDistribution(50,90);
+
1820 phytomer_parameters_redbud.peduncle.color = make_RGBcolor(0.32, 0.05, 0.13);
+
1821
+
1822 phytomer_parameters_redbud.inflorescence.flowers_per_peduncle = 1;
+
1823 phytomer_parameters_redbud.inflorescence.pitch = 0;
+
1824 phytomer_parameters_redbud.inflorescence.flower_prototype_function = RedbudFlowerPrototype;
+
1825 phytomer_parameters_redbud.inflorescence.flower_prototype_scale = 0.04;
+
1826 phytomer_parameters_redbud.inflorescence.fruit_prototype_function = RedbudFruitPrototype;
+
1827 phytomer_parameters_redbud.inflorescence.fruit_prototype_scale = 0.1;
+
1828 phytomer_parameters_redbud.inflorescence.fruit_gravity_factor_fraction = 0.7;
+
1829
+
1830 phytomer_parameters_redbud.phytomer_creation_function = RedbudPhytomerCreationFunction;
+
1831 phytomer_parameters_redbud.phytomer_callback_function = RedbudPhytomerCallbackFunction;
+
1832
+
1833 // ---- Shoot Parameters ---- //
+
1834
+
1835 ShootParameters shoot_parameters_main(context_ptr->getRandomGenerator());
+
1836 shoot_parameters_main.phytomer_parameters = phytomer_parameters_redbud;
+
1837 shoot_parameters_main.vegetative_bud_break_probability_min = 1.0;
+
1838 shoot_parameters_main.vegetative_bud_break_time = 2;
+
1839 shoot_parameters_main.phyllochron_min = 2;
+
1840 shoot_parameters_main.elongation_rate = 0.1;
+
1841 shoot_parameters_main.girth_area_factor = 4.f;
+
1842 shoot_parameters_main.gravitropic_curvature = 300;
+
1843 shoot_parameters_main.tortuosity = 5;
+
1844 shoot_parameters_main.internode_length_max = 0.04;
+
1845 shoot_parameters_main.internode_length_decay_rate = 0.005;
+
1846 shoot_parameters_main.internode_length_min = 0.01;
+
1847 shoot_parameters_main.insertion_angle_tip = 75;
+
1848 shoot_parameters_main.insertion_angle_decay_rate = 10;
+
1849 shoot_parameters_main.flowers_require_dormancy = true;
+
1850 shoot_parameters_main.growth_requires_dormancy = true;
+
1851 shoot_parameters_main.determinate_shoot_growth = false;
+
1852 shoot_parameters_main.max_terminal_floral_buds = 0;
+
1853 shoot_parameters_main.flower_bud_break_probability = 0.8;
+
1854 shoot_parameters_main.fruit_set_probability = 0.3;
+
1855 shoot_parameters_main.max_nodes = 25;
+
1856 shoot_parameters_main.max_nodes_per_season = 10;
+
1857 shoot_parameters_main.base_roll = 90;
+
1858
+
1859 ShootParameters shoot_parameters_trunk = shoot_parameters_main;
+
1860 shoot_parameters_trunk.phytomer_parameters.internode.pitch = 0;
+
1861 shoot_parameters_trunk.phytomer_parameters.internode.radial_subdivisions = 15;
+
1862 shoot_parameters_trunk.phytomer_parameters.internode.max_floral_buds_per_petiole = 0;
+
1863 shoot_parameters_trunk.insertion_angle_tip = 60;
+
1864 shoot_parameters_trunk.max_nodes = 75;
+
1865 shoot_parameters_trunk.max_nodes_per_season = 10;
+
1866 shoot_parameters_trunk.tortuosity = 1.5;
+
1867 shoot_parameters_trunk.defineChildShootTypes({"eastern_redbud_shoot"},{1.f});
+
1868
+
1869 defineShootType("eastern_redbud_trunk", shoot_parameters_trunk);
+
1870 defineShootType("eastern_redbud_shoot", shoot_parameters_main);
+
1871
+
1872}
+
1873
+
1874uint PlantArchitecture::buildEasternRedbudPlant(const helios::vec3 &base_position) {
+
1875
+
1876 if (shoot_types.empty()) {
+
1877 //automatically initialize redbud plant shoots
+
1878 initializeEasternRedbudShoots();
+
1879 }
+
1880
+
1881 uint plantID = addPlantInstance(base_position, 0);
+
1882
+
1883 uint uID_stem = addBaseStemShoot(plantID, 16, make_AxisRotation(context_ptr->randu(0,0.1*M_PI), context_ptr->randu(0,2*M_PI), context_ptr->randu(0,2*M_PI)), 0.0075, 0.05, 1, 1, 0.4, "eastern_redbud_trunk");
+
1884
+
1885 makePlantDormant(plantID);
+
1886 breakPlantDormancy(plantID);
+
1887
+
1888 //leave four vegetative buds on the trunk and remove the rest
+
1889 for (auto &phytomer: this->plant_instances.at(plantID).shoot_tree.at(uID_stem)->phytomers ) {
+
1890 if ( phytomer->shoot_index.x < 12 ) {
+
1891 for (auto &petiole: phytomer->axillary_vegetative_buds) {
+
1892 for (auto &vbud: petiole) {
+
1893 phytomer->setVegetativeBudState(BUD_DEAD, vbud);
+
1894 }
+
1895 }
+
1896 }
+
1897 }
+
1898
+
1899 setPlantPhenologicalThresholds(plantID, 165, -1, 3, 7, 30, 200, false);
+
1900
+
1901 plant_instances.at(plantID).max_age = 1460;
+
1902
+
1903 return plantID;
+
1904
+
1905}
+
1906
+
1907void PlantArchitecture::initializeRiceShoots() {
+
1908
+
1909 // ---- Leaf Prototype ---- //
+
1910
+
1911 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
1912 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SorghumLeaf.png";
+
1913 leaf_prototype.leaf_aspect_ratio = 0.06f;
+
1914 leaf_prototype.midrib_fold_fraction = 0.3f;
+
1915 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.2, 0);
+
1916 leaf_prototype.lateral_curvature = -0.3;
+
1917 leaf_prototype.wave_period = 0.1f;
+
1918 leaf_prototype.wave_amplitude = 0.1f;
+
1919 leaf_prototype.subdivisions = 20;
+
1920 leaf_prototype.unique_prototypes = 10;
+
1921
+
1922 // ---- Phytomer Parameters ---- //
+
1923
+
1924 PhytomerParameters phytomer_parameters_rice(context_ptr->getRandomGenerator());
+
1925
+
1926 phytomer_parameters_rice.internode.pitch = 0;
+
1927 phytomer_parameters_rice.internode.phyllotactic_angle.uniformDistribution(67, 77);
+
1928 phytomer_parameters_rice.internode.radius_initial = 0.001;
+
1929 phytomer_parameters_rice.internode.color = make_RGBcolor(0.27, 0.31, 0.16);
+
1930 phytomer_parameters_rice.internode.length_segments = 1;
+
1931 phytomer_parameters_rice.internode.radial_subdivisions = 6;
+
1932 phytomer_parameters_rice.internode.max_floral_buds_per_petiole = 0;
+
1933 phytomer_parameters_rice.internode.max_vegetative_buds_per_petiole = 0;
+
1934
+
1935 phytomer_parameters_rice.petiole.petioles_per_internode = 1;
+
1936 phytomer_parameters_rice.petiole.pitch.uniformDistribution(-40, 0);
+
1937 phytomer_parameters_rice.petiole.radius = 0.0;
+
1938 phytomer_parameters_rice.petiole.length = 0.01;
+
1939 phytomer_parameters_rice.petiole.taper = 0;
+
1940 phytomer_parameters_rice.petiole.curvature = 0;
+
1941 phytomer_parameters_rice.petiole.length_segments = 1;
+
1942
+
1943 phytomer_parameters_rice.leaf.leaves_per_petiole = 1;
+
1944 phytomer_parameters_rice.leaf.pitch = 0;
+
1945 phytomer_parameters_rice.leaf.yaw = 0;
+
1946 phytomer_parameters_rice.leaf.roll = 0;
+
1947 phytomer_parameters_rice.leaf.prototype_scale = 0.15;
+
1948 phytomer_parameters_rice.leaf.prototype = leaf_prototype;
+
1949
+
1950 phytomer_parameters_rice.peduncle.pitch = 0;
+
1951 phytomer_parameters_rice.peduncle.length.uniformDistribution(0.14,0.18);
+
1952 phytomer_parameters_rice.peduncle.radius = 0.0005;
+
1953 phytomer_parameters_rice.peduncle.color = phytomer_parameters_rice.internode.color;
+
1954 phytomer_parameters_rice.peduncle.curvature.uniformDistribution(-800,-50);
+
1955 phytomer_parameters_rice.peduncle.radial_subdivisions = 6;
+
1956 phytomer_parameters_rice.peduncle.length_segments = 8;
+
1957
+
1958 phytomer_parameters_rice.inflorescence.flowers_per_peduncle = 60;
+
1959 phytomer_parameters_rice.inflorescence.pitch.uniformDistribution(20,25);
+
1960 phytomer_parameters_rice.inflorescence.roll = 0;
+
1961 phytomer_parameters_rice.inflorescence.fruit_prototype_scale = 0.008;
+
1962 phytomer_parameters_rice.inflorescence.flower_offset = 0.012;
+
1963 phytomer_parameters_rice.inflorescence.fruit_prototype_function = RiceSpikePrototype;
+
1964
+
1965// phytomer_parameters_rice.phytomer_creation_function = RicePhytomerCreationFunction;
+
1966
+
1967 // ---- Shoot Parameters ---- //
+
1968
+
1969 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
+
1970 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters_rice;
+
1971 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
+
1972 shoot_parameters_mainstem.flower_bud_break_probability = 1;
+
1973 shoot_parameters_mainstem.phyllochron_min = 2;
+
1974 shoot_parameters_mainstem.elongation_rate = 0.1;
+
1975 shoot_parameters_mainstem.girth_area_factor = 5.f;
+
1976 shoot_parameters_mainstem.gravitropic_curvature.uniformDistribution(-1000,-400);
+
1977 shoot_parameters_mainstem.internode_length_max = 0.0075;
+
1978 shoot_parameters_mainstem.internode_length_decay_rate = 0;
+
1979 shoot_parameters_mainstem.flowers_require_dormancy = false;
+
1980 shoot_parameters_mainstem.growth_requires_dormancy = false;
+
1981 shoot_parameters_mainstem.determinate_shoot_growth = false;
+
1982 shoot_parameters_mainstem.fruit_set_probability = 1.0;
+
1983 shoot_parameters_mainstem.defineChildShootTypes({"mainstem"},{1.0});
+
1984 shoot_parameters_mainstem.max_nodes = 30;
+
1985 shoot_parameters_mainstem.max_terminal_floral_buds = 5;
+
1986
+
1987 defineShootType("mainstem",shoot_parameters_mainstem);
+
1988
+
1989}
+
1990
+
1991uint PlantArchitecture::buildRicePlant(const helios::vec3 &base_position) {
+
1992
+
1993 if (shoot_types.empty()) {
+
1994 //automatically initialize rice plant shoots
+
1995 initializeRiceShoots();
+
1996 }
+
1997
+
1998 uint plantID = addPlantInstance(base_position, 0);
+
1999
+
2000 uint uID_stem = addBaseStemShoot(plantID, 1, make_AxisRotation(context_ptr->randu(0.f, 0.1f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI)), 0.001, 0.0075, 0.01, 0.01, 0, "mainstem");
+
2001
+
2002 breakPlantDormancy(plantID);
+
2003
+
2004 setPlantPhenologicalThresholds(plantID, 0, -1, -1, 4, 10, 1000, false);
+
2005
+
2006 plant_instances.at(plantID).max_age = 365;
+
2007
+
2008 return plantID;
+
2009
+
2010}
+
2011
+
2012void PlantArchitecture::initializeButterLettuceShoots() {
+
2013
+
2014 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
2015 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/RomaineLettuceLeaf.png";
+
2016 leaf_prototype.leaf_aspect_ratio = 0.85f;
+
2017 leaf_prototype.midrib_fold_fraction = 0.2f;
+
2018 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.2, 0.05);
+
2019 leaf_prototype.lateral_curvature = -0.4f;
+
2020 leaf_prototype.wave_period.uniformDistribution(0.15, 0.25);
+
2021 leaf_prototype.wave_amplitude.uniformDistribution(0.05,0.1);
+
2022 leaf_prototype.subdivisions = 30;
+
2023 leaf_prototype.unique_prototypes = 10;
+
2024
+
2025 // ---- Phytomer Parameters ---- //
+
2026
+
2027 PhytomerParameters phytomer_parameters(context_ptr->getRandomGenerator());
+
2028
+
2029 phytomer_parameters.internode.pitch = 0;
+
2030 phytomer_parameters.internode.phyllotactic_angle = 137.5;
+
2031 phytomer_parameters.internode.radius_initial = 0.02;
+
2032 phytomer_parameters.internode.color = make_RGBcolor(0.402,0.423,0.413);
+
2033 phytomer_parameters.internode.length_segments = 1;
+
2034 phytomer_parameters.internode.radial_subdivisions = 10;
+
2035
+
2036 phytomer_parameters.petiole.petioles_per_internode = 1;
+
2037 phytomer_parameters.petiole.pitch.uniformDistribution(0,30);
+
2038 phytomer_parameters.petiole.radius = 0.001;
+
2039 phytomer_parameters.petiole.length = 0.001;
+
2040 phytomer_parameters.petiole.length_segments = 1;
+
2041 phytomer_parameters.petiole.radial_subdivisions = 3;
+
2042 phytomer_parameters.petiole.color = RGB::red;
+
2043
+
2044 phytomer_parameters.leaf.leaves_per_petiole = 1;
+
2045 phytomer_parameters.leaf.pitch = 10;
+
2046 phytomer_parameters.leaf.yaw = 0;
+
2047 phytomer_parameters.leaf.roll = 0;
+
2048 phytomer_parameters.leaf.prototype_scale.uniformDistribution(0.15,0.25);
+
2049 phytomer_parameters.leaf.prototype = leaf_prototype;
+
2050
+
2051 phytomer_parameters.phytomer_creation_function = ButterLettucePhytomerCreationFunction;
+
2052
+
2053 // ---- Shoot Parameters ---- //
+
2054
+
2055 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
+
2056 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters;
+
2057 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
+
2058 shoot_parameters_mainstem.phyllochron_min = 2;
+
2059 shoot_parameters_mainstem.elongation_rate = 0.15;
+
2060 shoot_parameters_mainstem.girth_area_factor = 0.f;
+
2061 shoot_parameters_mainstem.gravitropic_curvature = 10;
+
2062 shoot_parameters_mainstem.internode_length_max = 0.001;
+
2063 shoot_parameters_mainstem.internode_length_decay_rate = 0;
+
2064 shoot_parameters_mainstem.flowers_require_dormancy = false;
+
2065 shoot_parameters_mainstem.growth_requires_dormancy = false;
+
2066 shoot_parameters_mainstem.flower_bud_break_probability = 0.0;
+
2067 shoot_parameters_mainstem.max_nodes = 25;
+
2068
+
2069 defineShootType("mainstem",shoot_parameters_mainstem);
+
2070
2071
-
2072
-
2073}
-
2074
-
2075uint PlantArchitecture::buildButterLettucePlant(const helios::vec3 &base_position) {
-
2076
-
2077 if (shoot_types.empty()) {
-
2078 //automatically initialize lettuce plant shoots
-
2079 initializeButterLettuceShoots();
-
2080 }
-
2081
-
2082 uint plantID = addPlantInstance(base_position, 0);
-
2083
-
2084 uint uID_stem = addBaseStemShoot(plantID, 3, make_AxisRotation(context_ptr->randu(0.f, 0.03f * M_PI), 0.f, context_ptr->randu(0.f, 2.f * M_PI)), 0.005, 0.001, 1, 1, 0, "mainstem");
-
2085
-
2086 breakPlantDormancy(plantID);
-
2087
-
2088 setPlantPhenologicalThresholds(plantID, 0, -1, -1, -1, -1, 1000, false);
-
2089
-
2090 plant_instances.at(plantID).max_age = 365;
-
2091
-
2092 return plantID;
-
2093
-
2094}
-
2095
-
2096void PlantArchitecture::initializeSorghumShoots() {
-
2097
-
2098 // ---- Leaf Prototype ---- //
-
2099
-
2100 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
2101 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SorghumLeaf.png";
-
2102 leaf_prototype.leaf_aspect_ratio = 0.2f;
-
2103 leaf_prototype.midrib_fold_fraction = 0.3f;
-
2104 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.4, -0.2);
-
2105 leaf_prototype.lateral_curvature = -0.3f;
-
2106 leaf_prototype.petiole_roll = 0.04f;
-
2107 leaf_prototype.wave_period = 0.1f;
-
2108 leaf_prototype.wave_amplitude = 0.1f;
-
2109 leaf_prototype.leaf_buckle_length.uniformDistribution(0.4,0.6);
-
2110 leaf_prototype.leaf_buckle_angle.uniformDistribution(45,55);
-
2111 leaf_prototype.subdivisions = 50;
-
2112 leaf_prototype.unique_prototypes = 10;
-
2113
-
2114 // ---- Phytomer Parameters ---- //
-
2115
-
2116 PhytomerParameters phytomer_parameters_sorghum(context_ptr->getRandomGenerator());
-
2117
-
2118 phytomer_parameters_sorghum.internode.pitch = 0;
-
2119 phytomer_parameters_sorghum.internode.phyllotactic_angle.uniformDistribution(170,190);
-
2120 phytomer_parameters_sorghum.internode.radius_initial = 0.003;
-
2121 phytomer_parameters_sorghum.internode.color = make_RGBcolor(0.09,0.13,0.06);
-
2122 phytomer_parameters_sorghum.internode.length_segments = 2;
-
2123 phytomer_parameters_sorghum.internode.radial_subdivisions = 10;
-
2124 phytomer_parameters_sorghum.internode.max_floral_buds_per_petiole = 0;
-
2125 phytomer_parameters_sorghum.internode.max_vegetative_buds_per_petiole = 0;
-
2126
-
2127 phytomer_parameters_sorghum.petiole.petioles_per_internode = 1;
-
2128 phytomer_parameters_sorghum.petiole.pitch.uniformDistribution(-40,-20);
-
2129 phytomer_parameters_sorghum.petiole.radius = 0.0;
-
2130 phytomer_parameters_sorghum.petiole.length = 0.05;
-
2131 phytomer_parameters_sorghum.petiole.taper = 0;
-
2132 phytomer_parameters_sorghum.petiole.curvature = 0;
-
2133 phytomer_parameters_sorghum.petiole.length_segments = 1;
-
2134
-
2135 phytomer_parameters_sorghum.leaf.leaves_per_petiole = 1;
-
2136 phytomer_parameters_sorghum.leaf.pitch = 0;
-
2137 phytomer_parameters_sorghum.leaf.yaw = 0;
-
2138 phytomer_parameters_sorghum.leaf.roll = 0;
-
2139 phytomer_parameters_sorghum.leaf.prototype_scale = 0.6;
-
2140 phytomer_parameters_sorghum.leaf.prototype = leaf_prototype;
-
2141
-
2142 phytomer_parameters_sorghum.peduncle.length = 0.3;
-
2143 phytomer_parameters_sorghum.peduncle.radius = 0.008;
-
2144 phytomer_parameters_sorghum.peduncle.color = phytomer_parameters_sorghum.internode.color;
-
2145 phytomer_parameters_sorghum.peduncle.radial_subdivisions = 10;
-
2146
-
2147 phytomer_parameters_sorghum.inflorescence.flowers_per_peduncle = 1;
-
2148 phytomer_parameters_sorghum.inflorescence.pitch = 0;
-
2149 phytomer_parameters_sorghum.inflorescence.roll = 0;
-
2150 phytomer_parameters_sorghum.inflorescence.fruit_prototype_scale = 0.18;
-
2151 phytomer_parameters_sorghum.inflorescence.fruit_prototype_function = SorghumPaniclePrototype;
-
2152
-
2153 phytomer_parameters_sorghum.phytomer_creation_function = SorghumPhytomerCreationFunction;
-
2154
-
2155 // ---- Shoot Parameters ---- //
-
2156
-
2157 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
-
2158 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters_sorghum;
-
2159 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
-
2160 shoot_parameters_mainstem.flower_bud_break_probability = 1;
-
2161 shoot_parameters_mainstem.phyllochron_min = 2;
-
2162 shoot_parameters_mainstem.elongation_rate = 0.1;
-
2163 shoot_parameters_mainstem.girth_area_factor = 5.f;
-
2164 shoot_parameters_mainstem.gravitropic_curvature.uniformDistribution(-1000,-400);
-
2165 shoot_parameters_mainstem.internode_length_max = 0.26;
-
2166 shoot_parameters_mainstem.internode_length_decay_rate = 0;
-
2167 shoot_parameters_mainstem.flowers_require_dormancy = false;
-
2168 shoot_parameters_mainstem.growth_requires_dormancy = false;
-
2169 shoot_parameters_mainstem.determinate_shoot_growth = false;
-
2170 shoot_parameters_mainstem.flower_bud_break_probability = 1.0;
-
2171 shoot_parameters_mainstem.fruit_set_probability = 1.0;
-
2172 shoot_parameters_mainstem.defineChildShootTypes({"mainstem"},{1.0});
-
2173 shoot_parameters_mainstem.max_nodes = 16;
-
2174 shoot_parameters_mainstem.max_terminal_floral_buds = 1;
-
2175
-
2176 defineShootType("mainstem",shoot_parameters_mainstem);
-
2177
-
2178}
-
2179
-
2180uint PlantArchitecture::buildSorghumPlant(const helios::vec3 &base_position) {
-
2181
-
2182 if (shoot_types.empty()) {
-
2183 //automatically initialize sorghum plant shoots
-
2184 initializeSorghumShoots();
-
2185 }
-
2186
-
2187 uint plantID = addPlantInstance(base_position - make_vec3(0,0,0.025), 0);
-
2188
-
2189 uint uID_stem = addBaseStemShoot(plantID, 1, make_AxisRotation(context_ptr->randu(0.f, 0.075f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI)), 0.003, 0.06, 0.01, 0.01, 0, "mainstem");
-
2190
-
2191 breakPlantDormancy(plantID);
-
2192
-
2193 setPlantPhenologicalThresholds(plantID, 0, -1, -1, 4, 15, 1000, false);
-
2194
-
2195 plant_instances.at(plantID).max_age = 365;
-
2196
-
2197 return plantID;
-
2198
-
2199}
-
2200
-
2201void PlantArchitecture::initializeSoybeanShoots() {
-
2202
-
2203 // ---- Leaf Prototype ---- //
-
2204
-
2205 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
2206 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SoybeanLeaf.png";
-
2207 leaf_prototype.leaf_aspect_ratio = 1.f;
-
2208 leaf_prototype.midrib_fold_fraction = 0.1f;
-
2209 leaf_prototype.longitudinal_curvature.uniformDistribution(0.1,0.2);
-
2210 leaf_prototype.lateral_curvature = 0.45;
-
2211 leaf_prototype.subdivisions = 8;
-
2212 leaf_prototype.unique_prototypes = 5;
-
2213 leaf_prototype.build_petiolule = true;
-
2214
-
2215 PhytomerParameters phytomer_parameters_trifoliate(context_ptr->getRandomGenerator());
-
2216
-
2217 phytomer_parameters_trifoliate.internode.pitch = 20;
-
2218 phytomer_parameters_trifoliate.internode.phyllotactic_angle.uniformDistribution(145, 215);
-
2219 phytomer_parameters_trifoliate.internode.radius_initial = 0.002;
-
2220 phytomer_parameters_trifoliate.internode.max_floral_buds_per_petiole = 1;
-
2221 phytomer_parameters_trifoliate.internode.max_vegetative_buds_per_petiole = 1;
-
2222 phytomer_parameters_trifoliate.internode.color = make_RGBcolor(0.2,0.25,0.05);
-
2223 phytomer_parameters_trifoliate.internode.length_segments = 5;
-
2224
-
2225 phytomer_parameters_trifoliate.petiole.petioles_per_internode = 1;
-
2226 phytomer_parameters_trifoliate.petiole.pitch.uniformDistribution(15,40);
-
2227 phytomer_parameters_trifoliate.petiole.radius = 0.002;
-
2228 phytomer_parameters_trifoliate.petiole.length.uniformDistribution(0.12,0.16);
-
2229 phytomer_parameters_trifoliate.petiole.taper = 0.25;
-
2230 phytomer_parameters_trifoliate.petiole.curvature.uniformDistribution(-250,50);
-
2231 phytomer_parameters_trifoliate.petiole.color = phytomer_parameters_trifoliate.internode.color;
-
2232 phytomer_parameters_trifoliate.petiole.length_segments = 5;
-
2233 phytomer_parameters_trifoliate.petiole.radial_subdivisions = 6;
-
2234
-
2235 phytomer_parameters_trifoliate.leaf.leaves_per_petiole = 3;
-
2236 phytomer_parameters_trifoliate.leaf.pitch.uniformDistribution(-30, 10);
-
2237 phytomer_parameters_trifoliate.leaf.yaw = 10;
-
2238 phytomer_parameters_trifoliate.leaf.roll.uniformDistribution(-25,5);
-
2239 phytomer_parameters_trifoliate.leaf.leaflet_offset = 0.5;
-
2240 phytomer_parameters_trifoliate.leaf.leaflet_scale = 0.9;
-
2241 phytomer_parameters_trifoliate.leaf.prototype_scale.uniformDistribution(0.1,0.14);
-
2242 phytomer_parameters_trifoliate.leaf.prototype = leaf_prototype;
-
2243
-
2244 phytomer_parameters_trifoliate.peduncle.length = 0.01;
-
2245 phytomer_parameters_trifoliate.peduncle.radius = 0.0005;
-
2246 phytomer_parameters_trifoliate.peduncle.pitch.uniformDistribution(0, 40);
-
2247 phytomer_parameters_trifoliate.peduncle.roll = 90;
-
2248 phytomer_parameters_trifoliate.peduncle.curvature.uniformDistribution(-500, 500);
-
2249 phytomer_parameters_trifoliate.peduncle.color = phytomer_parameters_trifoliate.internode.color;
-
2250 phytomer_parameters_trifoliate.peduncle.length_segments = 1;
-
2251 phytomer_parameters_trifoliate.peduncle.radial_subdivisions = 6;
-
2252
-
2253 phytomer_parameters_trifoliate.inflorescence.flowers_per_peduncle.uniformDistribution(1, 4);
-
2254 phytomer_parameters_trifoliate.inflorescence.flower_offset = 0.2;
-
2255 phytomer_parameters_trifoliate.inflorescence.pitch.uniformDistribution(50,70);
-
2256 phytomer_parameters_trifoliate.inflorescence.roll.uniformDistribution(-20,20);
-
2257 phytomer_parameters_trifoliate.inflorescence.flower_prototype_scale = 0.015;
-
2258 phytomer_parameters_trifoliate.inflorescence.flower_prototype_function = SoybeanFlowerPrototype;
-
2259 phytomer_parameters_trifoliate.inflorescence.fruit_prototype_scale.uniformDistribution(0.1,0.12);
-
2260 phytomer_parameters_trifoliate.inflorescence.fruit_prototype_function = SoybeanFruitPrototype;
-
2261 phytomer_parameters_trifoliate.inflorescence.fruit_gravity_factor_fraction.uniformDistribution(0.8,1.0);
-
2262
-
2263 PhytomerParameters phytomer_parameters_unifoliate = phytomer_parameters_trifoliate;
-
2264 phytomer_parameters_unifoliate.internode.pitch = 0;
-
2265 phytomer_parameters_unifoliate.internode.max_vegetative_buds_per_petiole = 0;
-
2266 phytomer_parameters_unifoliate.internode.max_floral_buds_per_petiole = 0;
-
2267 phytomer_parameters_unifoliate.petiole.petioles_per_internode = 2;
-
2268 phytomer_parameters_unifoliate.petiole.length = 0.01;
-
2269 phytomer_parameters_unifoliate.petiole.radius = 0.001;
-
2270 phytomer_parameters_unifoliate.petiole.pitch.uniformDistribution(60,80);
-
2271 phytomer_parameters_unifoliate.leaf.leaves_per_petiole = 1;
-
2272 phytomer_parameters_unifoliate.leaf.prototype_scale = 0.02;
-
2273 phytomer_parameters_unifoliate.leaf.pitch.uniformDistribution(-10, 10);
-
2274 phytomer_parameters_unifoliate.leaf.prototype = leaf_prototype;
-
2275
-
2276 // ---- Shoot Parameters ---- //
-
2277
-
2278 ShootParameters shoot_parameters_trifoliate(context_ptr->getRandomGenerator());
-
2279 shoot_parameters_trifoliate.phytomer_parameters = phytomer_parameters_trifoliate;
-
2280 shoot_parameters_trifoliate.phytomer_parameters.phytomer_creation_function = BeanPhytomerCreationFunction;
-
2281
-
2282 shoot_parameters_trifoliate.max_nodes = 25;
-
2283 shoot_parameters_trifoliate.insertion_angle_tip.uniformDistribution(20,30);
-
2284// shoot_parameters_trifoliate.child_insertion_angle_decay_rate = 0; (default)
-
2285 shoot_parameters_trifoliate.internode_length_max = 0.035;
-
2286// shoot_parameters_trifoliate.child_internode_length_min = 0.0; (default)
-
2287// shoot_parameters_trifoliate.child_internode_length_decay_rate = 0; (default)
-
2288 shoot_parameters_trifoliate.base_roll = 90;
-
2289 shoot_parameters_trifoliate.base_yaw.uniformDistribution(-20,20);
-
2290 shoot_parameters_trifoliate.gravitropic_curvature = 400;
-
2291
-
2292 shoot_parameters_trifoliate.phyllochron_min = 2;
-
2293 shoot_parameters_trifoliate.elongation_rate = 0.1;
-
2294 shoot_parameters_trifoliate.girth_area_factor = 2.f;
-
2295 shoot_parameters_trifoliate.vegetative_bud_break_time = 15;
-
2296 shoot_parameters_trifoliate.vegetative_bud_break_probability_min = 0.05;
-
2297 shoot_parameters_trifoliate.vegetative_bud_break_probability_decay_rate = 0.6;
-
2298// shoot_parameters_trifoliate.max_terminal_floral_buds = 0; (default)
-
2299 shoot_parameters_trifoliate.flower_bud_break_probability.uniformDistribution(0.8,1.0);
-
2300 shoot_parameters_trifoliate.fruit_set_probability = 0.4;
-
2301// shoot_parameters_trifoliate.flowers_require_dormancy = false; (default)
-
2302// shoot_parameters_trifoliate.growth_requires_dormancy = false; (default)
-
2303// shoot_parameters_trifoliate.determinate_shoot_growth = true; (default)
-
2304
-
2305 shoot_parameters_trifoliate.defineChildShootTypes({"trifoliate"},{1.0});
+
2072}
+
2073
+
2074uint PlantArchitecture::buildButterLettucePlant(const helios::vec3 &base_position) {
+
2075
+
2076 if (shoot_types.empty()) {
+
2077 //automatically initialize lettuce plant shoots
+
2078 initializeButterLettuceShoots();
+
2079 }
+
2080
+
2081 uint plantID = addPlantInstance(base_position, 0);
+
2082
+
2083 uint uID_stem = addBaseStemShoot(plantID, 3, make_AxisRotation(context_ptr->randu(0.f, 0.03f * M_PI), 0.f, context_ptr->randu(0.f, 2.f * M_PI)), 0.005, 0.001, 1, 1, 0, "mainstem");
+
2084
+
2085 breakPlantDormancy(plantID);
+
2086
+
2087 setPlantPhenologicalThresholds(plantID, 0, -1, -1, -1, -1, 1000, false);
+
2088
+
2089 plant_instances.at(plantID).max_age = 365;
+
2090
+
2091 return plantID;
+
2092
+
2093}
+
2094
+
2095void PlantArchitecture::initializeSorghumShoots() {
+
2096
+
2097 // ---- Leaf Prototype ---- //
+
2098
+
2099 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
2100 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SorghumLeaf.png";
+
2101 leaf_prototype.leaf_aspect_ratio = 0.2f;
+
2102 leaf_prototype.midrib_fold_fraction = 0.3f;
+
2103 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.4, -0.2);
+
2104 leaf_prototype.lateral_curvature = -0.3f;
+
2105 leaf_prototype.petiole_roll = 0.04f;
+
2106 leaf_prototype.wave_period = 0.1f;
+
2107 leaf_prototype.wave_amplitude = 0.1f;
+
2108 leaf_prototype.leaf_buckle_length.uniformDistribution(0.4,0.6);
+
2109 leaf_prototype.leaf_buckle_angle.uniformDistribution(45,55);
+
2110 leaf_prototype.subdivisions = 50;
+
2111 leaf_prototype.unique_prototypes = 10;
+
2112
+
2113 // ---- Phytomer Parameters ---- //
+
2114
+
2115 PhytomerParameters phytomer_parameters_sorghum(context_ptr->getRandomGenerator());
+
2116
+
2117 phytomer_parameters_sorghum.internode.pitch = 0;
+
2118 phytomer_parameters_sorghum.internode.phyllotactic_angle.uniformDistribution(170,190);
+
2119 phytomer_parameters_sorghum.internode.radius_initial = 0.003;
+
2120 phytomer_parameters_sorghum.internode.color = make_RGBcolor(0.09,0.13,0.06);
+
2121 phytomer_parameters_sorghum.internode.length_segments = 2;
+
2122 phytomer_parameters_sorghum.internode.radial_subdivisions = 10;
+
2123 phytomer_parameters_sorghum.internode.max_floral_buds_per_petiole = 0;
+
2124 phytomer_parameters_sorghum.internode.max_vegetative_buds_per_petiole = 0;
+
2125
+
2126 phytomer_parameters_sorghum.petiole.petioles_per_internode = 1;
+
2127 phytomer_parameters_sorghum.petiole.pitch.uniformDistribution(-40,-20);
+
2128 phytomer_parameters_sorghum.petiole.radius = 0.0;
+
2129 phytomer_parameters_sorghum.petiole.length = 0.05;
+
2130 phytomer_parameters_sorghum.petiole.taper = 0;
+
2131 phytomer_parameters_sorghum.petiole.curvature = 0;
+
2132 phytomer_parameters_sorghum.petiole.length_segments = 1;
+
2133
+
2134 phytomer_parameters_sorghum.leaf.leaves_per_petiole = 1;
+
2135 phytomer_parameters_sorghum.leaf.pitch = 0;
+
2136 phytomer_parameters_sorghum.leaf.yaw = 0;
+
2137 phytomer_parameters_sorghum.leaf.roll = 0;
+
2138 phytomer_parameters_sorghum.leaf.prototype_scale = 0.6;
+
2139 phytomer_parameters_sorghum.leaf.prototype = leaf_prototype;
+
2140
+
2141 phytomer_parameters_sorghum.peduncle.length = 0.3;
+
2142 phytomer_parameters_sorghum.peduncle.radius = 0.008;
+
2143 phytomer_parameters_sorghum.peduncle.color = phytomer_parameters_sorghum.internode.color;
+
2144 phytomer_parameters_sorghum.peduncle.radial_subdivisions = 10;
+
2145
+
2146 phytomer_parameters_sorghum.inflorescence.flowers_per_peduncle = 1;
+
2147 phytomer_parameters_sorghum.inflorescence.pitch = 0;
+
2148 phytomer_parameters_sorghum.inflorescence.roll = 0;
+
2149 phytomer_parameters_sorghum.inflorescence.fruit_prototype_scale = 0.18;
+
2150 phytomer_parameters_sorghum.inflorescence.fruit_prototype_function = SorghumPaniclePrototype;
+
2151
+
2152 phytomer_parameters_sorghum.phytomer_creation_function = SorghumPhytomerCreationFunction;
+
2153
+
2154 // ---- Shoot Parameters ---- //
+
2155
+
2156 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
+
2157 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters_sorghum;
+
2158 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
+
2159 shoot_parameters_mainstem.flower_bud_break_probability = 1;
+
2160 shoot_parameters_mainstem.phyllochron_min = 2;
+
2161 shoot_parameters_mainstem.elongation_rate = 0.1;
+
2162 shoot_parameters_mainstem.girth_area_factor = 5.f;
+
2163 shoot_parameters_mainstem.gravitropic_curvature.uniformDistribution(-1000,-400);
+
2164 shoot_parameters_mainstem.internode_length_max = 0.26;
+
2165 shoot_parameters_mainstem.internode_length_decay_rate = 0;
+
2166 shoot_parameters_mainstem.flowers_require_dormancy = false;
+
2167 shoot_parameters_mainstem.growth_requires_dormancy = false;
+
2168 shoot_parameters_mainstem.determinate_shoot_growth = false;
+
2169 shoot_parameters_mainstem.flower_bud_break_probability = 1.0;
+
2170 shoot_parameters_mainstem.fruit_set_probability = 1.0;
+
2171 shoot_parameters_mainstem.defineChildShootTypes({"mainstem"},{1.0});
+
2172 shoot_parameters_mainstem.max_nodes = 16;
+
2173 shoot_parameters_mainstem.max_terminal_floral_buds = 1;
+
2174
+
2175 defineShootType("mainstem",shoot_parameters_mainstem);
+
2176
+
2177}
+
2178
+
2179uint PlantArchitecture::buildSorghumPlant(const helios::vec3 &base_position) {
+
2180
+
2181 if (shoot_types.empty()) {
+
2182 //automatically initialize sorghum plant shoots
+
2183 initializeSorghumShoots();
+
2184 }
+
2185
+
2186 uint plantID = addPlantInstance(base_position - make_vec3(0,0,0.025), 0);
+
2187
+
2188 uint uID_stem = addBaseStemShoot(plantID, 1, make_AxisRotation(context_ptr->randu(0.f, 0.075f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI)), 0.003, 0.06, 0.01, 0.01, 0, "mainstem");
+
2189
+
2190 breakPlantDormancy(plantID);
+
2191
+
2192 setPlantPhenologicalThresholds(plantID, 0, -1, -1, 4, 15, 1000, false);
+
2193
+
2194 plant_instances.at(plantID).max_age = 365;
+
2195
+
2196 return plantID;
+
2197
+
2198}
+
2199
+
2200void PlantArchitecture::initializeSoybeanShoots() {
+
2201
+
2202 // ---- Leaf Prototype ---- //
+
2203
+
2204 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
2205 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SoybeanLeaf.png";
+
2206 leaf_prototype.leaf_aspect_ratio = 1.f;
+
2207 leaf_prototype.midrib_fold_fraction = 0.1f;
+
2208 leaf_prototype.longitudinal_curvature.uniformDistribution(0.1,0.2);
+
2209 leaf_prototype.lateral_curvature = 0.45;
+
2210 leaf_prototype.subdivisions = 8;
+
2211 leaf_prototype.unique_prototypes = 5;
+
2212 leaf_prototype.build_petiolule = true;
+
2213
+
2214 PhytomerParameters phytomer_parameters_trifoliate(context_ptr->getRandomGenerator());
+
2215
+
2216 phytomer_parameters_trifoliate.internode.pitch = 20;
+
2217 phytomer_parameters_trifoliate.internode.phyllotactic_angle.uniformDistribution(145, 215);
+
2218 phytomer_parameters_trifoliate.internode.radius_initial = 0.002;
+
2219 phytomer_parameters_trifoliate.internode.max_floral_buds_per_petiole = 1;
+
2220 phytomer_parameters_trifoliate.internode.max_vegetative_buds_per_petiole = 1;
+
2221 phytomer_parameters_trifoliate.internode.color = make_RGBcolor(0.2,0.25,0.05);
+
2222 phytomer_parameters_trifoliate.internode.length_segments = 5;
+
2223
+
2224 phytomer_parameters_trifoliate.petiole.petioles_per_internode = 1;
+
2225 phytomer_parameters_trifoliate.petiole.pitch.uniformDistribution(15,40);
+
2226 phytomer_parameters_trifoliate.petiole.radius = 0.002;
+
2227 phytomer_parameters_trifoliate.petiole.length.uniformDistribution(0.12,0.16);
+
2228 phytomer_parameters_trifoliate.petiole.taper = 0.25;
+
2229 phytomer_parameters_trifoliate.petiole.curvature.uniformDistribution(-250,50);
+
2230 phytomer_parameters_trifoliate.petiole.color = phytomer_parameters_trifoliate.internode.color;
+
2231 phytomer_parameters_trifoliate.petiole.length_segments = 5;
+
2232 phytomer_parameters_trifoliate.petiole.radial_subdivisions = 6;
+
2233
+
2234 phytomer_parameters_trifoliate.leaf.leaves_per_petiole = 3;
+
2235 phytomer_parameters_trifoliate.leaf.pitch.uniformDistribution(-30, 10);
+
2236 phytomer_parameters_trifoliate.leaf.yaw = 10;
+
2237 phytomer_parameters_trifoliate.leaf.roll.uniformDistribution(-25,5);
+
2238 phytomer_parameters_trifoliate.leaf.leaflet_offset = 0.5;
+
2239 phytomer_parameters_trifoliate.leaf.leaflet_scale = 0.9;
+
2240 phytomer_parameters_trifoliate.leaf.prototype_scale.uniformDistribution(0.1,0.14);
+
2241 phytomer_parameters_trifoliate.leaf.prototype = leaf_prototype;
+
2242
+
2243 phytomer_parameters_trifoliate.peduncle.length = 0.01;
+
2244 phytomer_parameters_trifoliate.peduncle.radius = 0.0005;
+
2245 phytomer_parameters_trifoliate.peduncle.pitch.uniformDistribution(0, 40);
+
2246 phytomer_parameters_trifoliate.peduncle.roll = 90;
+
2247 phytomer_parameters_trifoliate.peduncle.curvature.uniformDistribution(-500, 500);
+
2248 phytomer_parameters_trifoliate.peduncle.color = phytomer_parameters_trifoliate.internode.color;
+
2249 phytomer_parameters_trifoliate.peduncle.length_segments = 1;
+
2250 phytomer_parameters_trifoliate.peduncle.radial_subdivisions = 6;
+
2251
+
2252 phytomer_parameters_trifoliate.inflorescence.flowers_per_peduncle.uniformDistribution(1, 4);
+
2253 phytomer_parameters_trifoliate.inflorescence.flower_offset = 0.2;
+
2254 phytomer_parameters_trifoliate.inflorescence.pitch.uniformDistribution(50,70);
+
2255 phytomer_parameters_trifoliate.inflorescence.roll.uniformDistribution(-20,20);
+
2256 phytomer_parameters_trifoliate.inflorescence.flower_prototype_scale = 0.015;
+
2257 phytomer_parameters_trifoliate.inflorescence.flower_prototype_function = SoybeanFlowerPrototype;
+
2258 phytomer_parameters_trifoliate.inflorescence.fruit_prototype_scale.uniformDistribution(0.1,0.12);
+
2259 phytomer_parameters_trifoliate.inflorescence.fruit_prototype_function = SoybeanFruitPrototype;
+
2260 phytomer_parameters_trifoliate.inflorescence.fruit_gravity_factor_fraction.uniformDistribution(0.8,1.0);
+
2261
+
2262 PhytomerParameters phytomer_parameters_unifoliate = phytomer_parameters_trifoliate;
+
2263 phytomer_parameters_unifoliate.internode.pitch = 0;
+
2264 phytomer_parameters_unifoliate.internode.max_vegetative_buds_per_petiole = 0;
+
2265 phytomer_parameters_unifoliate.internode.max_floral_buds_per_petiole = 0;
+
2266 phytomer_parameters_unifoliate.petiole.petioles_per_internode = 2;
+
2267 phytomer_parameters_unifoliate.petiole.length = 0.01;
+
2268 phytomer_parameters_unifoliate.petiole.radius = 0.001;
+
2269 phytomer_parameters_unifoliate.petiole.pitch.uniformDistribution(60,80);
+
2270 phytomer_parameters_unifoliate.leaf.leaves_per_petiole = 1;
+
2271 phytomer_parameters_unifoliate.leaf.prototype_scale = 0.02;
+
2272 phytomer_parameters_unifoliate.leaf.pitch.uniformDistribution(-10, 10);
+
2273 phytomer_parameters_unifoliate.leaf.prototype = leaf_prototype;
+
2274
+
2275 // ---- Shoot Parameters ---- //
+
2276
+
2277 ShootParameters shoot_parameters_trifoliate(context_ptr->getRandomGenerator());
+
2278 shoot_parameters_trifoliate.phytomer_parameters = phytomer_parameters_trifoliate;
+
2279 shoot_parameters_trifoliate.phytomer_parameters.phytomer_creation_function = BeanPhytomerCreationFunction;
+
2280
+
2281 shoot_parameters_trifoliate.max_nodes = 25;
+
2282 shoot_parameters_trifoliate.insertion_angle_tip.uniformDistribution(20,30);
+
2283// shoot_parameters_trifoliate.child_insertion_angle_decay_rate = 0; (default)
+
2284 shoot_parameters_trifoliate.internode_length_max = 0.035;
+
2285// shoot_parameters_trifoliate.child_internode_length_min = 0.0; (default)
+
2286// shoot_parameters_trifoliate.child_internode_length_decay_rate = 0; (default)
+
2287 shoot_parameters_trifoliate.base_roll = 90;
+
2288 shoot_parameters_trifoliate.base_yaw.uniformDistribution(-20,20);
+
2289 shoot_parameters_trifoliate.gravitropic_curvature = 400;
+
2290
+
2291 shoot_parameters_trifoliate.phyllochron_min = 2;
+
2292 shoot_parameters_trifoliate.elongation_rate = 0.1;
+
2293 shoot_parameters_trifoliate.girth_area_factor = 2.f;
+
2294 shoot_parameters_trifoliate.vegetative_bud_break_time = 15;
+
2295 shoot_parameters_trifoliate.vegetative_bud_break_probability_min = 0.05;
+
2296 shoot_parameters_trifoliate.vegetative_bud_break_probability_decay_rate = 0.6;
+
2297// shoot_parameters_trifoliate.max_terminal_floral_buds = 0; (default)
+
2298 shoot_parameters_trifoliate.flower_bud_break_probability.uniformDistribution(0.8,1.0);
+
2299 shoot_parameters_trifoliate.fruit_set_probability = 0.4;
+
2300// shoot_parameters_trifoliate.flowers_require_dormancy = false; (default)
+
2301// shoot_parameters_trifoliate.growth_requires_dormancy = false; (default)
+
2302// shoot_parameters_trifoliate.determinate_shoot_growth = true; (default)
+
2303
+
2304 shoot_parameters_trifoliate.defineChildShootTypes({"trifoliate"},{1.0});
+
2305
2306
-
2307
-
2308 ShootParameters shoot_parameters_unifoliate = shoot_parameters_trifoliate;
-
2309 shoot_parameters_unifoliate.phytomer_parameters = phytomer_parameters_unifoliate;
-
2310 shoot_parameters_unifoliate.max_nodes = 1;
-
2311 shoot_parameters_unifoliate.flower_bud_break_probability = 0;
-
2312 shoot_parameters_unifoliate.insertion_angle_tip = 0;
-
2313 shoot_parameters_unifoliate.insertion_angle_decay_rate = 0;
-
2314 shoot_parameters_unifoliate.vegetative_bud_break_time = 8;
-
2315 shoot_parameters_unifoliate.defineChildShootTypes({"trifoliate"},{1.0});
-
2316
-
2317 defineShootType("unifoliate",shoot_parameters_unifoliate);
-
2318 defineShootType("trifoliate",shoot_parameters_trifoliate);
-
2319
-
2320}
-
2321
-
2322uint PlantArchitecture::buildSoybeanPlant(const helios::vec3 &base_position) {
-
2323
-
2324 if (shoot_types.empty()) {
-
2325 //automatically initialize bean plant shoots
-
2326 initializeSoybeanShoots();
-
2327 }
-
2328
-
2329 uint plantID = addPlantInstance(base_position, 0);
-
2330
-
2331 AxisRotation base_rotation = make_AxisRotation(context_ptr->randu(0.f, 0.05f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI));
-
2332 uint uID_unifoliate = addBaseStemShoot(plantID, 1, base_rotation, 0.0005, 0.04, 0.01, 0.01, 0, "unifoliate");
-
2333
-
2334 appendShoot(plantID, uID_unifoliate, 1, make_AxisRotation(0, 0, 0.5f * M_PI), shoot_types.at("trifoliate").phytomer_parameters.internode.radius_initial.val(), shoot_types.at("trifoliate").internode_length_max.val(), 0.1, 0.1, 0, "trifoliate");
-
2335
-
2336 breakPlantDormancy(plantID);
-
2337
-
2338 setPlantPhenologicalThresholds(plantID, 0, 40, 5, 5, 30, 1000, false);
-
2339
-
2340 plant_instances.at(plantID).max_age = 365;
-
2341
-
2342 return plantID;
-
2343
-
2344}
-
2345
-
2346void PlantArchitecture::initializeStrawberryShoots() {
-
2347
-
2348 // ---- Leaf Prototype ---- //
-
2349
-
2350 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
2351 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/StrawberryLeaf.png";
-
2352 leaf_prototype.leaf_aspect_ratio = 1.f;
-
2353 leaf_prototype.midrib_fold_fraction = 0.2f;
-
2354 leaf_prototype.longitudinal_curvature = 0.15f;
-
2355 leaf_prototype.lateral_curvature = 0.4f;
-
2356 leaf_prototype.wave_period = 0.3f;
-
2357 leaf_prototype.wave_amplitude = 0.01f;
-
2358 leaf_prototype.subdivisions = 6;
-
2359 leaf_prototype.unique_prototypes = 10;
-
2360
-
2361 // ---- Phytomer Parameters ---- //
-
2362
-
2363 PhytomerParameters phytomer_parameters(context_ptr->getRandomGenerator());
-
2364
-
2365 phytomer_parameters.internode.pitch = 10;
-
2366 phytomer_parameters.internode.phyllotactic_angle.uniformDistribution(80,100);
-
2367 phytomer_parameters.internode.radius_initial = 0.001;
-
2368 phytomer_parameters.internode.color = make_RGBcolor(0.38, 0.48, 0.1);
-
2369 phytomer_parameters.internode.length_segments = 1;
-
2370
-
2371 phytomer_parameters.petiole.petioles_per_internode = 1;
-
2372 phytomer_parameters.petiole.pitch.uniformDistribution(0,45);
-
2373 phytomer_parameters.petiole.radius = 0.0025;
-
2374 phytomer_parameters.petiole.length.uniformDistribution(0.15,0.25);
-
2375 phytomer_parameters.petiole.taper = 0.5;
-
2376 phytomer_parameters.petiole.curvature.uniformDistribution(-300,100);
-
2377 phytomer_parameters.petiole.color = make_RGBcolor(0.24, 0.28, 0.08);
-
2378 phytomer_parameters.petiole.length_segments = 5;
-
2379
-
2380 phytomer_parameters.leaf.leaves_per_petiole = 3;
-
2381 phytomer_parameters.leaf.pitch.uniformDistribution(-30,10);
-
2382 phytomer_parameters.leaf.yaw = 20;
-
2383 phytomer_parameters.leaf.roll = -30;
-
2384 phytomer_parameters.leaf.leaflet_offset = 0.01;
-
2385 phytomer_parameters.leaf.leaflet_scale = 1.0;
-
2386 phytomer_parameters.leaf.prototype_scale = 0.1;
-
2387 phytomer_parameters.leaf.prototype = leaf_prototype;
-
2388
-
2389 phytomer_parameters.peduncle.length = 0.17;
-
2390 phytomer_parameters.peduncle.radius = 0.00075;
-
2391 phytomer_parameters.peduncle.pitch = 35;
-
2392 phytomer_parameters.peduncle.roll = 0;
-
2393 phytomer_parameters.peduncle.curvature = -200;
-
2394 phytomer_parameters.peduncle.length_segments = 5;
-
2395 phytomer_parameters.peduncle.radial_subdivisions = 6;
-
2396 phytomer_parameters.peduncle.color = phytomer_parameters.petiole.color;
-
2397
-
2398 phytomer_parameters.inflorescence.flowers_per_peduncle.uniformDistribution(1, 3);
-
2399 phytomer_parameters.inflorescence.flower_offset = 0.2;
-
2400 phytomer_parameters.inflorescence.pitch = 70;
-
2401 phytomer_parameters.inflorescence.roll = 90;
-
2402 phytomer_parameters.inflorescence.flower_prototype_scale = 0.04;
-
2403 phytomer_parameters.inflorescence.flower_prototype_function = StrawberryFlowerPrototype;
-
2404 phytomer_parameters.inflorescence.fruit_prototype_scale = 0.06;
-
2405 phytomer_parameters.inflorescence.fruit_prototype_function = StrawberryFruitPrototype;
-
2406 phytomer_parameters.inflorescence.fruit_gravity_factor_fraction = 0.65;
-
2407
-
2408 // ---- Shoot Parameters ---- //
-
2409
-
2410 ShootParameters shoot_parameters(context_ptr->getRandomGenerator());
-
2411 shoot_parameters.phytomer_parameters = phytomer_parameters;
-
2412
-
2413 shoot_parameters.max_nodes = 15;
-
2414 shoot_parameters.insertion_angle_tip = 40;
-
2415 shoot_parameters.insertion_angle_decay_rate = 0;
-
2416 shoot_parameters.internode_length_max = 0.015;
-
2417 shoot_parameters.internode_length_decay_rate = 0;
-
2418 shoot_parameters.internode_length_min = 0.0;
-
2419 shoot_parameters.base_roll = 90;
-
2420 shoot_parameters.base_yaw.uniformDistribution(-20,20);
-
2421 shoot_parameters.gravitropic_curvature.uniformDistribution(-10,0);
-
2422 shoot_parameters.tortuosity = 0;
-
2423
-
2424 shoot_parameters.phyllochron_min = 2;
-
2425 shoot_parameters.elongation_rate = 0.1;
-
2426 shoot_parameters.girth_area_factor = 2.f;
-
2427 shoot_parameters.vegetative_bud_break_time = 15;
-
2428 shoot_parameters.vegetative_bud_break_probability_min = 0.1;
-
2429 shoot_parameters.vegetative_bud_break_probability_decay_rate = -0.4;
-
2430 shoot_parameters.flower_bud_break_probability = 1;
-
2431 shoot_parameters.fruit_set_probability = 0.5;
-
2432 shoot_parameters.flowers_require_dormancy = false;
-
2433 shoot_parameters.growth_requires_dormancy = false;
-
2434 shoot_parameters.determinate_shoot_growth = true;
-
2435
-
2436 shoot_parameters.defineChildShootTypes({"mainstem"},{1.0});
-
2437
-
2438 defineShootType("mainstem",shoot_parameters);
-
2439
-
2440}
-
2441
-
2442uint PlantArchitecture::buildStrawberryPlant(const helios::vec3 &base_position) {
-
2443
-
2444 if (shoot_types.empty()) {
-
2445 //automatically initialize strawberry plant shoots
-
2446 initializeStrawberryShoots();
-
2447 }
-
2448
-
2449 uint plantID = addPlantInstance(base_position, 0);
-
2450
-
2451 AxisRotation base_rotation = make_AxisRotation(0, context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI));
-
2452 uint uID_stem = addBaseStemShoot(plantID, 1, base_rotation, 0.001, 0.004, 0.01, 0.01, 0, "mainstem");
-
2453
-
2454 breakPlantDormancy(plantID);
-
2455
-
2456 setPlantPhenologicalThresholds(plantID, 0, 40, 5, 5, 30, 100, false);
-
2457
-
2458 plant_instances.at(plantID).max_age = 365;
-
2459
-
2460 return plantID;
-
2461
-
2462}
-
2463
-
2464void PlantArchitecture::initializeSugarbeetShoots() {
-
2465
-
2466 // ---- Leaf Prototype ---- //
-
2467
-
2468 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
2469 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SugarbeetLeaf.png";
-
2470 leaf_prototype.leaf_aspect_ratio = 0.4f;
-
2471 leaf_prototype.midrib_fold_fraction = 0.1f;
-
2472 leaf_prototype.longitudinal_curvature = -0.2f;
-
2473 leaf_prototype.lateral_curvature = -0.4f;
-
2474 leaf_prototype.petiole_roll = 0.75f;
-
2475 leaf_prototype.wave_period.uniformDistribution( 0.08f, 0.15f);
-
2476 leaf_prototype.wave_amplitude.uniformDistribution(0.02, 0.04);
-
2477 leaf_prototype.subdivisions = 20;;
-
2478 leaf_prototype.unique_prototypes = 10;
-
2479
-
2480 // ---- Phytomer Parameters ---- //
-
2481
-
2482 PhytomerParameters phytomer_parameters_sugarbeet(context_ptr->getRandomGenerator());
-
2483
-
2484 phytomer_parameters_sugarbeet.internode.pitch = 0;
-
2485 phytomer_parameters_sugarbeet.internode.phyllotactic_angle = 137.5;
-
2486 phytomer_parameters_sugarbeet.internode.radius_initial = 0.005;
-
2487 phytomer_parameters_sugarbeet.internode.color = make_RGBcolor(0.44,0.58,0.19);
-
2488 phytomer_parameters_sugarbeet.internode.length_segments = 1;
-
2489 phytomer_parameters_sugarbeet.internode.max_vegetative_buds_per_petiole = 0;
-
2490 phytomer_parameters_sugarbeet.internode.max_floral_buds_per_petiole = 0;
-
2491
-
2492 phytomer_parameters_sugarbeet.petiole.petioles_per_internode = 1;
-
2493 phytomer_parameters_sugarbeet.petiole.pitch.uniformDistribution(0,40);
-
2494 phytomer_parameters_sugarbeet.petiole.radius = 0.005;
-
2495 phytomer_parameters_sugarbeet.petiole.length.uniformDistribution(0.15,0.2);
-
2496 phytomer_parameters_sugarbeet.petiole.taper = 0.6;
-
2497 phytomer_parameters_sugarbeet.petiole.curvature.uniformDistribution(-300,100);
-
2498 phytomer_parameters_sugarbeet.petiole.color = phytomer_parameters_sugarbeet.internode.color;
-
2499 phytomer_parameters_sugarbeet.petiole.length_segments = 8;
-
2500
-
2501 phytomer_parameters_sugarbeet.leaf.leaves_per_petiole = 1;
-
2502 phytomer_parameters_sugarbeet.leaf.pitch.uniformDistribution(-10,0);
-
2503 phytomer_parameters_sugarbeet.leaf.yaw.uniformDistribution(-5,5);
-
2504 phytomer_parameters_sugarbeet.leaf.roll.uniformDistribution(-15,15);
-
2505 phytomer_parameters_sugarbeet.leaf.prototype_scale.uniformDistribution(0.15,0.25);
-
2506 phytomer_parameters_sugarbeet.leaf.prototype = leaf_prototype;
-
2507
-
2508 // ---- Shoot Parameters ---- //
-
2509
-
2510 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
-
2511 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters_sugarbeet;
-
2512 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
-
2513 shoot_parameters_mainstem.phyllochron_min = 2;
-
2514 shoot_parameters_mainstem.elongation_rate = 0.1;
-
2515 shoot_parameters_mainstem.girth_area_factor = 20.f;
-
2516 shoot_parameters_mainstem.gravitropic_curvature = 10;
-
2517 shoot_parameters_mainstem.internode_length_max = 0.001;
-
2518 shoot_parameters_mainstem.internode_length_decay_rate = 0;
-
2519 shoot_parameters_mainstem.flowers_require_dormancy = false;
-
2520 shoot_parameters_mainstem.growth_requires_dormancy = false;
-
2521 shoot_parameters_mainstem.flower_bud_break_probability = 0.0;
-
2522 shoot_parameters_mainstem.max_nodes = 30;
-
2523
-
2524 defineShootType("mainstem",shoot_parameters_mainstem);
+
2307 ShootParameters shoot_parameters_unifoliate = shoot_parameters_trifoliate;
+
2308 shoot_parameters_unifoliate.phytomer_parameters = phytomer_parameters_unifoliate;
+
2309 shoot_parameters_unifoliate.max_nodes = 1;
+
2310 shoot_parameters_unifoliate.flower_bud_break_probability = 0;
+
2311 shoot_parameters_unifoliate.insertion_angle_tip = 0;
+
2312 shoot_parameters_unifoliate.insertion_angle_decay_rate = 0;
+
2313 shoot_parameters_unifoliate.vegetative_bud_break_time = 8;
+
2314 shoot_parameters_unifoliate.defineChildShootTypes({"trifoliate"},{1.0});
+
2315
+
2316 defineShootType("unifoliate",shoot_parameters_unifoliate);
+
2317 defineShootType("trifoliate",shoot_parameters_trifoliate);
+
2318
+
2319}
+
2320
+
2321uint PlantArchitecture::buildSoybeanPlant(const helios::vec3 &base_position) {
+
2322
+
2323 if (shoot_types.empty()) {
+
2324 //automatically initialize bean plant shoots
+
2325 initializeSoybeanShoots();
+
2326 }
+
2327
+
2328 uint plantID = addPlantInstance(base_position, 0);
+
2329
+
2330 AxisRotation base_rotation = make_AxisRotation(context_ptr->randu(0.f, 0.05f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI));
+
2331 uint uID_unifoliate = addBaseStemShoot(plantID, 1, base_rotation, 0.0005, 0.04, 0.01, 0.01, 0, "unifoliate");
+
2332
+
2333 appendShoot(plantID, uID_unifoliate, 1, make_AxisRotation(0, 0, 0.5f * M_PI), shoot_types.at("trifoliate").phytomer_parameters.internode.radius_initial.val(), shoot_types.at("trifoliate").internode_length_max.val(), 0.1, 0.1, 0, "trifoliate");
+
2334
+
2335 breakPlantDormancy(plantID);
+
2336
+
2337 setPlantPhenologicalThresholds(plantID, 0, 40, 5, 5, 30, 1000, false);
+
2338
+
2339 plant_instances.at(plantID).max_age = 365;
+
2340
+
2341 return plantID;
+
2342
+
2343}
+
2344
+
2345void PlantArchitecture::initializeStrawberryShoots() {
+
2346
+
2347 // ---- Leaf Prototype ---- //
+
2348
+
2349 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
2350 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/StrawberryLeaf.png";
+
2351 leaf_prototype.leaf_aspect_ratio = 1.f;
+
2352 leaf_prototype.midrib_fold_fraction = 0.2f;
+
2353 leaf_prototype.longitudinal_curvature = 0.15f;
+
2354 leaf_prototype.lateral_curvature = 0.4f;
+
2355 leaf_prototype.wave_period = 0.3f;
+
2356 leaf_prototype.wave_amplitude = 0.01f;
+
2357 leaf_prototype.subdivisions = 6;
+
2358 leaf_prototype.unique_prototypes = 10;
+
2359
+
2360 // ---- Phytomer Parameters ---- //
+
2361
+
2362 PhytomerParameters phytomer_parameters(context_ptr->getRandomGenerator());
+
2363
+
2364 phytomer_parameters.internode.pitch = 10;
+
2365 phytomer_parameters.internode.phyllotactic_angle.uniformDistribution(80,100);
+
2366 phytomer_parameters.internode.radius_initial = 0.001;
+
2367 phytomer_parameters.internode.color = make_RGBcolor(0.38, 0.48, 0.1);
+
2368 phytomer_parameters.internode.length_segments = 1;
+
2369
+
2370 phytomer_parameters.petiole.petioles_per_internode = 1;
+
2371 phytomer_parameters.petiole.pitch.uniformDistribution(0,45);
+
2372 phytomer_parameters.petiole.radius = 0.0025;
+
2373 phytomer_parameters.petiole.length.uniformDistribution(0.15,0.25);
+
2374 phytomer_parameters.petiole.taper = 0.5;
+
2375 phytomer_parameters.petiole.curvature.uniformDistribution(-300,100);
+
2376 phytomer_parameters.petiole.color = make_RGBcolor(0.24, 0.28, 0.08);
+
2377 phytomer_parameters.petiole.length_segments = 5;
+
2378
+
2379 phytomer_parameters.leaf.leaves_per_petiole = 3;
+
2380 phytomer_parameters.leaf.pitch.uniformDistribution(-30,10);
+
2381 phytomer_parameters.leaf.yaw = 20;
+
2382 phytomer_parameters.leaf.roll = -30;
+
2383 phytomer_parameters.leaf.leaflet_offset = 0.01;
+
2384 phytomer_parameters.leaf.leaflet_scale = 1.0;
+
2385 phytomer_parameters.leaf.prototype_scale = 0.1;
+
2386 phytomer_parameters.leaf.prototype = leaf_prototype;
+
2387
+
2388 phytomer_parameters.peduncle.length = 0.17;
+
2389 phytomer_parameters.peduncle.radius = 0.00075;
+
2390 phytomer_parameters.peduncle.pitch = 35;
+
2391 phytomer_parameters.peduncle.roll = 0;
+
2392 phytomer_parameters.peduncle.curvature = -200;
+
2393 phytomer_parameters.peduncle.length_segments = 5;
+
2394 phytomer_parameters.peduncle.radial_subdivisions = 6;
+
2395 phytomer_parameters.peduncle.color = phytomer_parameters.petiole.color;
+
2396
+
2397 phytomer_parameters.inflorescence.flowers_per_peduncle.uniformDistribution(1, 3);
+
2398 phytomer_parameters.inflorescence.flower_offset = 0.2;
+
2399 phytomer_parameters.inflorescence.pitch = 70;
+
2400 phytomer_parameters.inflorescence.roll = 90;
+
2401 phytomer_parameters.inflorescence.flower_prototype_scale = 0.04;
+
2402 phytomer_parameters.inflorescence.flower_prototype_function = StrawberryFlowerPrototype;
+
2403 phytomer_parameters.inflorescence.fruit_prototype_scale = 0.06;
+
2404 phytomer_parameters.inflorescence.fruit_prototype_function = StrawberryFruitPrototype;
+
2405 phytomer_parameters.inflorescence.fruit_gravity_factor_fraction = 0.65;
+
2406
+
2407 // ---- Shoot Parameters ---- //
+
2408
+
2409 ShootParameters shoot_parameters(context_ptr->getRandomGenerator());
+
2410 shoot_parameters.phytomer_parameters = phytomer_parameters;
+
2411
+
2412 shoot_parameters.max_nodes = 15;
+
2413 shoot_parameters.insertion_angle_tip = 40;
+
2414 shoot_parameters.insertion_angle_decay_rate = 0;
+
2415 shoot_parameters.internode_length_max = 0.015;
+
2416 shoot_parameters.internode_length_decay_rate = 0;
+
2417 shoot_parameters.internode_length_min = 0.0;
+
2418 shoot_parameters.base_roll = 90;
+
2419 shoot_parameters.base_yaw.uniformDistribution(-20,20);
+
2420 shoot_parameters.gravitropic_curvature.uniformDistribution(-10,0);
+
2421 shoot_parameters.tortuosity = 0;
+
2422
+
2423 shoot_parameters.phyllochron_min = 2;
+
2424 shoot_parameters.elongation_rate = 0.1;
+
2425 shoot_parameters.girth_area_factor = 2.f;
+
2426 shoot_parameters.vegetative_bud_break_time = 15;
+
2427 shoot_parameters.vegetative_bud_break_probability_min = 0.1;
+
2428 shoot_parameters.vegetative_bud_break_probability_decay_rate = -0.4;
+
2429 shoot_parameters.flower_bud_break_probability = 1;
+
2430 shoot_parameters.fruit_set_probability = 0.5;
+
2431 shoot_parameters.flowers_require_dormancy = false;
+
2432 shoot_parameters.growth_requires_dormancy = false;
+
2433 shoot_parameters.determinate_shoot_growth = true;
+
2434
+
2435 shoot_parameters.defineChildShootTypes({"mainstem"},{1.0});
+
2436
+
2437 defineShootType("mainstem",shoot_parameters);
+
2438
+
2439}
+
2440
+
2441uint PlantArchitecture::buildStrawberryPlant(const helios::vec3 &base_position) {
+
2442
+
2443 if (shoot_types.empty()) {
+
2444 //automatically initialize strawberry plant shoots
+
2445 initializeStrawberryShoots();
+
2446 }
+
2447
+
2448 uint plantID = addPlantInstance(base_position, 0);
+
2449
+
2450 AxisRotation base_rotation = make_AxisRotation(0, context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI));
+
2451 uint uID_stem = addBaseStemShoot(plantID, 1, base_rotation, 0.001, 0.004, 0.01, 0.01, 0, "mainstem");
+
2452
+
2453 breakPlantDormancy(plantID);
+
2454
+
2455 setPlantPhenologicalThresholds(plantID, 0, 40, 5, 5, 30, 100, false);
+
2456
+
2457 plant_instances.at(plantID).max_age = 365;
+
2458
+
2459 return plantID;
+
2460
+
2461}
+
2462
+
2463void PlantArchitecture::initializeSugarbeetShoots() {
+
2464
+
2465 // ---- Leaf Prototype ---- //
+
2466
+
2467 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
2468 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SugarbeetLeaf.png";
+
2469 leaf_prototype.leaf_aspect_ratio = 0.4f;
+
2470 leaf_prototype.midrib_fold_fraction = 0.1f;
+
2471 leaf_prototype.longitudinal_curvature = -0.2f;
+
2472 leaf_prototype.lateral_curvature = -0.4f;
+
2473 leaf_prototype.petiole_roll = 0.75f;
+
2474 leaf_prototype.wave_period.uniformDistribution( 0.08f, 0.15f);
+
2475 leaf_prototype.wave_amplitude.uniformDistribution(0.02, 0.04);
+
2476 leaf_prototype.subdivisions = 20;;
+
2477 leaf_prototype.unique_prototypes = 10;
+
2478
+
2479 // ---- Phytomer Parameters ---- //
+
2480
+
2481 PhytomerParameters phytomer_parameters_sugarbeet(context_ptr->getRandomGenerator());
+
2482
+
2483 phytomer_parameters_sugarbeet.internode.pitch = 0;
+
2484 phytomer_parameters_sugarbeet.internode.phyllotactic_angle = 137.5;
+
2485 phytomer_parameters_sugarbeet.internode.radius_initial = 0.005;
+
2486 phytomer_parameters_sugarbeet.internode.color = make_RGBcolor(0.44,0.58,0.19);
+
2487 phytomer_parameters_sugarbeet.internode.length_segments = 1;
+
2488 phytomer_parameters_sugarbeet.internode.max_vegetative_buds_per_petiole = 0;
+
2489 phytomer_parameters_sugarbeet.internode.max_floral_buds_per_petiole = 0;
+
2490
+
2491 phytomer_parameters_sugarbeet.petiole.petioles_per_internode = 1;
+
2492 phytomer_parameters_sugarbeet.petiole.pitch.uniformDistribution(0,40);
+
2493 phytomer_parameters_sugarbeet.petiole.radius = 0.005;
+
2494 phytomer_parameters_sugarbeet.petiole.length.uniformDistribution(0.15,0.2);
+
2495 phytomer_parameters_sugarbeet.petiole.taper = 0.6;
+
2496 phytomer_parameters_sugarbeet.petiole.curvature.uniformDistribution(-300,100);
+
2497 phytomer_parameters_sugarbeet.petiole.color = phytomer_parameters_sugarbeet.internode.color;
+
2498 phytomer_parameters_sugarbeet.petiole.length_segments = 8;
+
2499
+
2500 phytomer_parameters_sugarbeet.leaf.leaves_per_petiole = 1;
+
2501 phytomer_parameters_sugarbeet.leaf.pitch.uniformDistribution(-10,0);
+
2502 phytomer_parameters_sugarbeet.leaf.yaw.uniformDistribution(-5,5);
+
2503 phytomer_parameters_sugarbeet.leaf.roll.uniformDistribution(-15,15);
+
2504 phytomer_parameters_sugarbeet.leaf.prototype_scale.uniformDistribution(0.15,0.25);
+
2505 phytomer_parameters_sugarbeet.leaf.prototype = leaf_prototype;
+
2506
+
2507 // ---- Shoot Parameters ---- //
+
2508
+
2509 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
+
2510 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters_sugarbeet;
+
2511 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
+
2512 shoot_parameters_mainstem.phyllochron_min = 2;
+
2513 shoot_parameters_mainstem.elongation_rate = 0.1;
+
2514 shoot_parameters_mainstem.girth_area_factor = 20.f;
+
2515 shoot_parameters_mainstem.gravitropic_curvature = 10;
+
2516 shoot_parameters_mainstem.internode_length_max = 0.001;
+
2517 shoot_parameters_mainstem.internode_length_decay_rate = 0;
+
2518 shoot_parameters_mainstem.flowers_require_dormancy = false;
+
2519 shoot_parameters_mainstem.growth_requires_dormancy = false;
+
2520 shoot_parameters_mainstem.flower_bud_break_probability = 0.0;
+
2521 shoot_parameters_mainstem.max_nodes = 30;
+
2522
+
2523 defineShootType("mainstem",shoot_parameters_mainstem);
+
2524
2525
-
2526
-
2527}
-
2528
-
2529uint PlantArchitecture::buildSugarbeetPlant(const helios::vec3 &base_position) {
-
2530
-
2531 if (shoot_types.empty()) {
-
2532 //automatically initialize sugarbeet plant shoots
-
2533 initializeSugarbeetShoots();
-
2534 }
-
2535
-
2536 uint plantID = addPlantInstance(base_position, 0);
-
2537
-
2538 uint uID_stem = addBaseStemShoot(plantID, 3, make_AxisRotation(context_ptr->randu(0.f, 0.01f * M_PI), 0.f * context_ptr->randu(0.f, 2.f * M_PI), 0.25f * M_PI), 0.005, 0.001, 1, 1, 0, "mainstem");
-
2539
-
2540 breakPlantDormancy(plantID);
-
2541
-
2542 setPlantPhenologicalThresholds(plantID, 0, -1, -1, -1, -1, 1000, false);
-
2543
-
2544 plant_instances.at(plantID).max_age = 365;
-
2545
-
2546 return plantID;
-
2547
-
2548}
-
2549
-
2550void PlantArchitecture::initializeTomatoShoots() {
-
2551
-
2552 // ---- Leaf Prototype ---- //
-
2553
-
2554 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
2555 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/TomatoLeaf_centered.png";
-
2556 leaf_prototype.leaf_aspect_ratio = 0.5f;
-
2557 leaf_prototype.midrib_fold_fraction = 0.1f;
-
2558 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.45, -0.2f);
-
2559 leaf_prototype.lateral_curvature = -0.3f;
-
2560 leaf_prototype.wave_period = 0.35f;
-
2561 leaf_prototype.wave_amplitude = 0.08f;
-
2562 leaf_prototype.subdivisions = 6;
-
2563 leaf_prototype.unique_prototypes = 5;
-
2564
-
2565 // ---- Phytomer Parameters ---- //
-
2566
-
2567 PhytomerParameters phytomer_parameters(context_ptr->getRandomGenerator());
-
2568
-
2569 phytomer_parameters.internode.pitch = 10;
-
2570 phytomer_parameters.internode.phyllotactic_angle.uniformDistribution(145, 215);
-
2571 phytomer_parameters.internode.radius_initial = 0.001;
-
2572 phytomer_parameters.internode.color = make_RGBcolor(0.213, 0.270, 0.056);
-
2573 phytomer_parameters.internode.length_segments = 1;
-
2574
-
2575 phytomer_parameters.petiole.petioles_per_internode = 1;
-
2576 phytomer_parameters.petiole.pitch.uniformDistribution(45,60);
-
2577 phytomer_parameters.petiole.radius = 0.002;
-
2578 phytomer_parameters.petiole.length = 0.2;
-
2579 phytomer_parameters.petiole.taper = 0.15;
-
2580 phytomer_parameters.petiole.curvature.uniformDistribution(-150,-50);
-
2581 phytomer_parameters.petiole.color = phytomer_parameters.internode.color;
-
2582 phytomer_parameters.petiole.length_segments = 5;
-
2583
-
2584 phytomer_parameters.leaf.leaves_per_petiole = 7;
-
2585 phytomer_parameters.leaf.pitch.uniformDistribution(-30, 5);
-
2586 phytomer_parameters.leaf.yaw = 10;
-
2587 phytomer_parameters.leaf.roll = 0;
-
2588 phytomer_parameters.leaf.leaflet_offset = 0.15;
-
2589 phytomer_parameters.leaf.leaflet_scale = 0.7;
-
2590 phytomer_parameters.leaf.prototype_scale.uniformDistribution(0.12,0.18);
-
2591 phytomer_parameters.leaf.prototype = leaf_prototype;
-
2592
-
2593 phytomer_parameters.peduncle.length = 0.16;
-
2594 phytomer_parameters.peduncle.radius = 0.0015;
-
2595 phytomer_parameters.peduncle.pitch = 20;
-
2596 phytomer_parameters.peduncle.roll = 0;
-
2597 phytomer_parameters.peduncle.curvature = -700;
-
2598 phytomer_parameters.peduncle.color = phytomer_parameters.internode.color;
-
2599 phytomer_parameters.peduncle.length_segments = 5;
-
2600 phytomer_parameters.peduncle.radial_subdivisions = 8;
-
2601
-
2602 phytomer_parameters.inflorescence.flowers_per_peduncle = 8;
-
2603 phytomer_parameters.inflorescence.flower_offset = 0.15;
-
2604 phytomer_parameters.inflorescence.pitch = 90;
-
2605 phytomer_parameters.inflorescence.roll.uniformDistribution(-30,30);
-
2606 phytomer_parameters.inflorescence.flower_prototype_scale = 0.03;
-
2607 phytomer_parameters.inflorescence.flower_prototype_function = TomatoFlowerPrototype;
-
2608 phytomer_parameters.inflorescence.fruit_prototype_scale = 0.08;
-
2609 phytomer_parameters.inflorescence.fruit_prototype_function = TomatoFruitPrototype;
-
2610 phytomer_parameters.inflorescence.fruit_gravity_factor_fraction = 0.5;
-
2611
-
2612 // ---- Shoot Parameters ---- //
-
2613
-
2614 ShootParameters shoot_parameters(context_ptr->getRandomGenerator());
-
2615 shoot_parameters.phytomer_parameters = phytomer_parameters;
-
2616 shoot_parameters.phytomer_parameters.phytomer_creation_function = TomatoPhytomerCreationFunction;
-
2617
-
2618 shoot_parameters.max_nodes = 16;
-
2619 shoot_parameters.insertion_angle_tip = 30;
-
2620 shoot_parameters.insertion_angle_decay_rate = 0;
-
2621 shoot_parameters.internode_length_max = 0.04;
-
2622 shoot_parameters.internode_length_min = 0.0;
-
2623 shoot_parameters.internode_length_decay_rate = 0;
-
2624 shoot_parameters.base_roll = 90;
-
2625 shoot_parameters.base_yaw.uniformDistribution(-20,20);
-
2626 shoot_parameters.gravitropic_curvature = -200;
-
2627 shoot_parameters.tortuosity = 3;
-
2628
-
2629 shoot_parameters.phyllochron_min = 2;
-
2630 shoot_parameters.elongation_rate = 0.1;
-
2631 shoot_parameters.girth_area_factor = 3.f;
-
2632 shoot_parameters.vegetative_bud_break_time = 10;
-
2633 shoot_parameters.vegetative_bud_break_probability_min = 0.15;
-
2634 shoot_parameters.vegetative_bud_break_probability_decay_rate = -0.5;
-
2635 shoot_parameters.flower_bud_break_probability = 0.5;
-
2636 shoot_parameters.fruit_set_probability = 0.5;
-
2637 shoot_parameters.flowers_require_dormancy = false;
-
2638 shoot_parameters.growth_requires_dormancy = false;
-
2639 shoot_parameters.determinate_shoot_growth = true;
-
2640
-
2641 shoot_parameters.defineChildShootTypes({"mainstem"},{1.0});
-
2642
-
2643 defineShootType("mainstem",shoot_parameters);
-
2644
-
2645}
-
2646
-
2647uint PlantArchitecture::buildTomatoPlant(const helios::vec3 &base_position) {
-
2648
-
2649 if (shoot_types.empty()) {
-
2650 //automatically initialize tomato plant shoots
-
2651 initializeTomatoShoots();
-
2652 }
-
2653
-
2654 uint plantID = addPlantInstance(base_position, 0);
-
2655
-
2656 AxisRotation base_rotation = make_AxisRotation(0, context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI));
-
2657 uint uID_stem = addBaseStemShoot(plantID, 1, base_rotation, 0.002, 0.06, 0.01, 0.01, 0, "mainstem");
-
2658
-
2659 breakPlantDormancy(plantID);
-
2660
-
2661 setPlantPhenologicalThresholds(plantID, 0, 40, 5, 5, 30, 1000, false);
-
2662
-
2663 plant_instances.at(plantID).max_age = 365;
-
2664
-
2665 return plantID;
-
2666
-
2667}
-
2668
-
2669void PlantArchitecture::initializeWalnutTreeShoots(){
-
2670
-
2671 // ---- Leaf Prototype ---- //
-
2672
-
2673 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
2674 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/WalnutLeaf.png";
-
2675 leaf_prototype.leaf_aspect_ratio = 0.5f;
-
2676 leaf_prototype.midrib_fold_fraction = 0.15f;
-
2677 leaf_prototype.longitudinal_curvature = -0.2f;
-
2678 leaf_prototype.lateral_curvature = 0.1f;
-
2679 leaf_prototype.wave_period.uniformDistribution(0.08, 0.15);
-
2680 leaf_prototype.wave_amplitude.uniformDistribution(0.02, 0.04);
-
2681 leaf_prototype.subdivisions = 3;
-
2682 leaf_prototype.unique_prototypes = 5;
-
2683
-
2684 // ---- Phytomer Parameters ---- //
-
2685
-
2686 PhytomerParameters phytomer_parameters_walnut(context_ptr->getRandomGenerator());
-
2687
-
2688 phytomer_parameters_walnut.internode.pitch = 0;
-
2689 phytomer_parameters_walnut.internode.phyllotactic_angle.uniformDistribution( 160, 200 );
-
2690 phytomer_parameters_walnut.internode.radius_initial = 0.004;
-
2691 phytomer_parameters_walnut.internode.length_segments = 1;
-
2692 phytomer_parameters_walnut.internode.image_texture = "plugins/plantarchitecture/assets/textures/AppleBark.jpg";
-
2693 phytomer_parameters_walnut.internode.max_floral_buds_per_petiole = 3;
-
2694
-
2695 phytomer_parameters_walnut.petiole.petioles_per_internode = 2;
-
2696 phytomer_parameters_walnut.petiole.pitch.uniformDistribution(-80,-70);
-
2697 phytomer_parameters_walnut.petiole.taper = 0.2;
-
2698 phytomer_parameters_walnut.petiole.curvature.uniformDistribution(-1000,0);
-
2699 phytomer_parameters_walnut.petiole.length = 0.15;
-
2700 phytomer_parameters_walnut.petiole.radius = 0.0015;
-
2701 phytomer_parameters_walnut.petiole.length_segments = 5;
-
2702 phytomer_parameters_walnut.petiole.radial_subdivisions = 3;
-
2703 phytomer_parameters_walnut.petiole.color = make_RGBcolor(0.61,0.5,0.24);
-
2704
-
2705 phytomer_parameters_walnut.leaf.leaves_per_petiole = 5;
-
2706 phytomer_parameters_walnut.leaf.pitch.uniformDistribution(-40,0);
-
2707 phytomer_parameters_walnut.leaf.prototype_scale = 0.14;
-
2708 phytomer_parameters_walnut.leaf.leaflet_scale = 0.7;
-
2709 phytomer_parameters_walnut.leaf.leaflet_offset = 0.35;
-
2710 phytomer_parameters_walnut.leaf.prototype = leaf_prototype;
-
2711
-
2712 phytomer_parameters_walnut.peduncle.length = 0.02;
-
2713 phytomer_parameters_walnut.peduncle.radius = 0.0005;
-
2714 phytomer_parameters_walnut.peduncle.pitch = 90;
-
2715 phytomer_parameters_walnut.peduncle.roll = 90;
-
2716 phytomer_parameters_walnut.peduncle.length_segments = 1;
-
2717
-
2718 phytomer_parameters_walnut.inflorescence.flowers_per_peduncle = 1;
-
2719 phytomer_parameters_walnut.inflorescence.pitch = 0;
-
2720 phytomer_parameters_walnut.inflorescence.roll = 0;
-
2721 phytomer_parameters_walnut.inflorescence.flower_prototype_scale = 0.03;
-
2722 phytomer_parameters_walnut.inflorescence.flower_prototype_function = WalnutFlowerPrototype;
-
2723 phytomer_parameters_walnut.inflorescence.fruit_prototype_scale = 0.075;
-
2724 phytomer_parameters_walnut.inflorescence.fruit_prototype_function = WalnutFruitPrototype;
-
2725
-
2726 // ---- Shoot Parameters ---- //
-
2727
-
2728 // Trunk
-
2729 ShootParameters shoot_parameters_trunk(context_ptr->getRandomGenerator());
-
2730 shoot_parameters_trunk.phytomer_parameters = phytomer_parameters_walnut;
-
2731 shoot_parameters_trunk.phytomer_parameters.internode.phyllotactic_angle = 0;
-
2732 shoot_parameters_trunk.phytomer_parameters.internode.radius_initial = 0.01;
-
2733 shoot_parameters_trunk.phytomer_parameters.internode.radial_subdivisions = 24;
-
2734 shoot_parameters_trunk.max_nodes = 20;
-
2735 shoot_parameters_trunk.girth_area_factor = 3.f;
-
2736 shoot_parameters_trunk.vegetative_bud_break_probability_min = 0;
-
2737 shoot_parameters_trunk.vegetative_bud_break_time = 0;
-
2738 shoot_parameters_trunk.tortuosity = 1;
-
2739 shoot_parameters_trunk.internode_length_max = 0.05;
-
2740 shoot_parameters_trunk.internode_length_decay_rate = 0;
-
2741 shoot_parameters_trunk.defineChildShootTypes({"scaffold"},{1});
-
2742
-
2743 // Proleptic shoots
-
2744 ShootParameters shoot_parameters_proleptic(context_ptr->getRandomGenerator());
-
2745 shoot_parameters_proleptic.phytomer_parameters = phytomer_parameters_walnut;
-
2746 shoot_parameters_proleptic.phytomer_parameters.internode.color = make_RGBcolor(0.3,0.2,0.2);
-
2747 shoot_parameters_proleptic.phytomer_parameters.phytomer_creation_function = WalnutPhytomerCreationFunction;
-
2748 // shoot_parameters_proleptic.phytomer_parameters.phytomer_callback_function = WalnutPhytomerCallbackFunction;
-
2749 shoot_parameters_proleptic.max_nodes = 30;
-
2750 shoot_parameters_proleptic.max_nodes_per_season = 15;
-
2751 shoot_parameters_proleptic.phyllochron_min = 2.;
-
2752 shoot_parameters_proleptic.elongation_rate = 0.15;
-
2753 shoot_parameters_proleptic.girth_area_factor = 10.f;
-
2754 shoot_parameters_proleptic.vegetative_bud_break_probability_min = 0.05;
-
2755 shoot_parameters_proleptic.vegetative_bud_break_probability_decay_rate = 0.6;
-
2756 shoot_parameters_proleptic.vegetative_bud_break_time = 3;
-
2757 shoot_parameters_proleptic.gravitropic_curvature = 200;
-
2758 shoot_parameters_proleptic.tortuosity = 5;
-
2759 shoot_parameters_proleptic.insertion_angle_tip.uniformDistribution( 20, 25);
-
2760 shoot_parameters_proleptic.insertion_angle_decay_rate = 15;
-
2761 shoot_parameters_proleptic.internode_length_max = 0.08;
-
2762 shoot_parameters_proleptic.internode_length_min = 0.01;
-
2763 shoot_parameters_proleptic.internode_length_decay_rate = 0.006;
-
2764 shoot_parameters_proleptic.fruit_set_probability = 0.5;
-
2765 shoot_parameters_proleptic.flower_bud_break_probability = 0.3;
-
2766 shoot_parameters_proleptic.max_terminal_floral_buds = 4;
-
2767 shoot_parameters_proleptic.flowers_require_dormancy = true;
-
2768 shoot_parameters_proleptic.growth_requires_dormancy = true;
-
2769 shoot_parameters_proleptic.determinate_shoot_growth = false;
-
2770 shoot_parameters_proleptic.defineChildShootTypes({"proleptic"},{1.0});
-
2771
-
2772 // Main scaffolds
-
2773 ShootParameters shoot_parameters_scaffold = shoot_parameters_proleptic;
-
2774 shoot_parameters_scaffold.phytomer_parameters.internode.radial_subdivisions = 10;
-
2775 shoot_parameters_scaffold.max_nodes = 30;
-
2776 shoot_parameters_scaffold.gravitropic_curvature = 300;
-
2777 shoot_parameters_scaffold.internode_length_max = 0.06;
-
2778 shoot_parameters_scaffold.tortuosity = 4;
-
2779 shoot_parameters_scaffold.defineChildShootTypes({"proleptic"},{1.0});
-
2780
-
2781 defineShootType("trunk", shoot_parameters_trunk);
-
2782 defineShootType("scaffold", shoot_parameters_scaffold);
-
2783 defineShootType("proleptic", shoot_parameters_proleptic);
-
2784
-
2785}
-
2786
-
2787uint PlantArchitecture::buildWalnutTree(const helios::vec3 &base_position) {
-
2788
-
2789 if( shoot_types.empty() ){
-
2790 //automatically initialize walnut tree shoots
-
2791 initializeWalnutTreeShoots();
-
2792 }
-
2793
-
2794 uint plantID = addPlantInstance(base_position, 0);
-
2795
-
2796 uint uID_trunk = addBaseStemShoot(plantID, 19, make_AxisRotation(context_ptr->randu(0.f, 0.05f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), 0.f * M_PI), shoot_types.at("trunk").phytomer_parameters.internode.radius_initial.val(), 0.04, 1.f, 1.f, 0, "trunk");
-
2797 appendPhytomerToShoot( plantID, uID_trunk, shoot_types.at("trunk").phytomer_parameters, 0, 0.01, 1, 1);
-
2798
-
2799 plant_instances.at(plantID).shoot_tree.at(uID_trunk)->meristem_is_alive = false;
-
2800
-
2801 auto phytomers = plant_instances.at(plantID).shoot_tree.at(uID_trunk)->phytomers;
-
2802 for( const auto & phytomer : phytomers ){
-
2803 phytomer->removeLeaf();
-
2804 phytomer->setVegetativeBudState(BUD_DEAD);
-
2805 phytomer->setFloralBudState(BUD_DEAD);
-
2806 }
-
2807
-
2808 uint Nscaffolds = 4;//context_ptr->randu(4,5);
-
2809
-
2810 for( int i=0; i<Nscaffolds; i++ ) {
-
2811// float pitch = context_ptr->randu(deg2rad(25), deg2rad(35))+i*deg2rad(7.f);
-
2812 float pitch = context_ptr->randu(deg2rad(45), deg2rad(55));
-
2813 uint uID_shoot = addChildShoot( plantID, uID_trunk, getShootNodeCount(plantID,uID_trunk)-i-1, context_ptr->randu(7, 9), make_AxisRotation(pitch, (float(i) + context_ptr->randu(-0.2f, 0.2f)) / float(Nscaffolds) * 2 * M_PI, 0), 0.007, 0.06, 1.f, 1.f, 0.5, "scaffold", 0);
-
2814
-
2815 }
-
2816
-
2817 makePlantDormant(plantID);
-
2818
-
2819 setPlantPhenologicalThresholds(plantID, 165, -1, 3, 7, 20, 200, false);
-
2820
-
2821 plant_instances.at(plantID).max_age = 1095;
-
2822
-
2823 return plantID;
-
2824
-
2825}
-
2826
-
2827void PlantArchitecture::initializeWheatShoots() {
-
2828
-
2829 // ---- Leaf Prototype ---- //
-
2830
-
2831 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
-
2832 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SorghumLeaf.png";
-
2833 leaf_prototype.leaf_aspect_ratio = 0.1f;
-
2834 leaf_prototype.midrib_fold_fraction = 0.3f;
-
2835 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.5, -0.1);
-
2836 leaf_prototype.lateral_curvature = -0.3;
-
2837 leaf_prototype.petiole_roll = 0.04f;
-
2838 leaf_prototype.wave_period = 0.1f;
-
2839 leaf_prototype.wave_amplitude = 0.1f;
-
2840 leaf_prototype.leaf_buckle_length.uniformDistribution(0.5,0.6);
-
2841 leaf_prototype.leaf_buckle_angle.uniformDistribution(25,35);
-
2842 leaf_prototype.subdivisions = 20;
-
2843 leaf_prototype.unique_prototypes = 10;
-
2844
-
2845 // ---- Phytomer Parameters ---- //
-
2846
-
2847 PhytomerParameters phytomer_parameters_wheat(context_ptr->getRandomGenerator());
-
2848
-
2849 phytomer_parameters_wheat.internode.pitch = 0;
-
2850 phytomer_parameters_wheat.internode.phyllotactic_angle.uniformDistribution(67,77);
-
2851 phytomer_parameters_wheat.internode.radius_initial = 0.001;
-
2852 phytomer_parameters_wheat.internode.color = make_RGBcolor(0.27,0.31,0.16);
-
2853 phytomer_parameters_wheat.internode.length_segments = 1;
-
2854 phytomer_parameters_wheat.internode.radial_subdivisions = 6;
-
2855 phytomer_parameters_wheat.internode.max_floral_buds_per_petiole = 0;
-
2856 phytomer_parameters_wheat.internode.max_vegetative_buds_per_petiole = 0;
-
2857
-
2858 phytomer_parameters_wheat.petiole.petioles_per_internode = 1;
-
2859 phytomer_parameters_wheat.petiole.pitch.uniformDistribution(-40,-20);
-
2860 phytomer_parameters_wheat.petiole.radius = 0.0;
-
2861 phytomer_parameters_wheat.petiole.length = 0.005;
-
2862 phytomer_parameters_wheat.petiole.taper = 0;
-
2863 phytomer_parameters_wheat.petiole.curvature = 0;
-
2864 phytomer_parameters_wheat.petiole.length_segments = 1;
-
2865
-
2866 phytomer_parameters_wheat.leaf.leaves_per_petiole = 1;
-
2867 phytomer_parameters_wheat.leaf.pitch = 0;
-
2868 phytomer_parameters_wheat.leaf.yaw = 0;
-
2869 phytomer_parameters_wheat.leaf.roll = 0;
-
2870 phytomer_parameters_wheat.leaf.prototype_scale = 0.22;
-
2871 phytomer_parameters_wheat.leaf.prototype = leaf_prototype;
-
2872
-
2873 phytomer_parameters_wheat.peduncle.length = 0.1;
-
2874 phytomer_parameters_wheat.peduncle.radius = 0.002;
-
2875 phytomer_parameters_wheat.peduncle.color = phytomer_parameters_wheat.internode.color;
-
2876 phytomer_parameters_wheat.peduncle.curvature = -100;
-
2877 phytomer_parameters_wheat.peduncle.radial_subdivisions = 6;
-
2878
-
2879 phytomer_parameters_wheat.inflorescence.flowers_per_peduncle = 1;
-
2880 phytomer_parameters_wheat.inflorescence.pitch = 0;
-
2881 phytomer_parameters_wheat.inflorescence.roll = 0;
-
2882 phytomer_parameters_wheat.inflorescence.fruit_prototype_scale = 0.1;
-
2883 phytomer_parameters_wheat.inflorescence.fruit_prototype_function = WheatSpikePrototype;
-
2884
-
2885 phytomer_parameters_wheat.phytomer_creation_function = WheatPhytomerCreationFunction;
-
2886
-
2887 // ---- Shoot Parameters ---- //
-
2888
-
2889 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
-
2890 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters_wheat;
-
2891 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
-
2892 shoot_parameters_mainstem.flower_bud_break_probability = 1;
-
2893 shoot_parameters_mainstem.phyllochron_min = 2;
-
2894 shoot_parameters_mainstem.elongation_rate = 0.1;
-
2895 shoot_parameters_mainstem.girth_area_factor = 6.f;
-
2896 shoot_parameters_mainstem.gravitropic_curvature.uniformDistribution(-500,-200);
-
2897 shoot_parameters_mainstem.flowers_require_dormancy = false;
-
2898 shoot_parameters_mainstem.growth_requires_dormancy = false;
-
2899 shoot_parameters_mainstem.determinate_shoot_growth = false;
-
2900 shoot_parameters_mainstem.fruit_set_probability = 1.0;
-
2901 shoot_parameters_mainstem.defineChildShootTypes({"mainstem"},{1.0});
-
2902 shoot_parameters_mainstem.max_nodes = 20;
-
2903 shoot_parameters_mainstem.max_terminal_floral_buds = 1;
-
2904
-
2905 defineShootType("mainstem",shoot_parameters_mainstem);
-
2906
-
2907}
-
2908
-
2909uint PlantArchitecture::buildWheatPlant(const helios::vec3 &base_position) {
-
2910
-
2911 if (shoot_types.empty()) {
-
2912 //automatically initialize wheat plant shoots
-
2913 initializeWheatShoots();
-
2914 }
-
2915
-
2916 uint plantID = addPlantInstance(base_position - make_vec3(0,0,0.025), 0);
-
2917
-
2918 uint uID_stem = addBaseStemShoot(plantID, 1, make_AxisRotation(context_ptr->randu(0.f, 0.05f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI)), 0.001, 0.025, 0.01, 0.01, 0, "mainstem");
-
2919
-
2920 breakPlantDormancy(plantID);
-
2921
-
2922 setPlantPhenologicalThresholds(plantID, 0, -1, -1, 4, 10, 1000, false);
-
2923
-
2924 plant_instances.at(plantID).max_age = 365;
-
2925
-
2926 return plantID;
-
2927
-
2928}
+
2526}
+
2527
+
2528uint PlantArchitecture::buildSugarbeetPlant(const helios::vec3 &base_position) {
+
2529
+
2530 if (shoot_types.empty()) {
+
2531 //automatically initialize sugarbeet plant shoots
+
2532 initializeSugarbeetShoots();
+
2533 }
+
2534
+
2535 uint plantID = addPlantInstance(base_position, 0);
+
2536
+
2537 uint uID_stem = addBaseStemShoot(plantID, 3, make_AxisRotation(context_ptr->randu(0.f, 0.01f * M_PI), 0.f * context_ptr->randu(0.f, 2.f * M_PI), 0.25f * M_PI), 0.005, 0.001, 1, 1, 0, "mainstem");
+
2538
+
2539 breakPlantDormancy(plantID);
+
2540
+
2541 setPlantPhenologicalThresholds(plantID, 0, -1, -1, -1, -1, 1000, false);
+
2542
+
2543 plant_instances.at(plantID).max_age = 365;
+
2544
+
2545 return plantID;
+
2546
+
2547}
+
2548
+
2549void PlantArchitecture::initializeTomatoShoots() {
+
2550
+
2551 // ---- Leaf Prototype ---- //
+
2552
+
2553 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
2554 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/TomatoLeaf_centered.png";
+
2555 leaf_prototype.leaf_aspect_ratio = 0.5f;
+
2556 leaf_prototype.midrib_fold_fraction = 0.1f;
+
2557 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.45, -0.2f);
+
2558 leaf_prototype.lateral_curvature = -0.3f;
+
2559 leaf_prototype.wave_period = 0.35f;
+
2560 leaf_prototype.wave_amplitude = 0.08f;
+
2561 leaf_prototype.subdivisions = 6;
+
2562 leaf_prototype.unique_prototypes = 5;
+
2563
+
2564 // ---- Phytomer Parameters ---- //
+
2565
+
2566 PhytomerParameters phytomer_parameters(context_ptr->getRandomGenerator());
+
2567
+
2568 phytomer_parameters.internode.pitch = 10;
+
2569 phytomer_parameters.internode.phyllotactic_angle.uniformDistribution(145, 215);
+
2570 phytomer_parameters.internode.radius_initial = 0.001;
+
2571 phytomer_parameters.internode.color = make_RGBcolor(0.213, 0.270, 0.056);
+
2572 phytomer_parameters.internode.length_segments = 1;
+
2573
+
2574 phytomer_parameters.petiole.petioles_per_internode = 1;
+
2575 phytomer_parameters.petiole.pitch.uniformDistribution(45,60);
+
2576 phytomer_parameters.petiole.radius = 0.002;
+
2577 phytomer_parameters.petiole.length = 0.2;
+
2578 phytomer_parameters.petiole.taper = 0.15;
+
2579 phytomer_parameters.petiole.curvature.uniformDistribution(-150,-50);
+
2580 phytomer_parameters.petiole.color = phytomer_parameters.internode.color;
+
2581 phytomer_parameters.petiole.length_segments = 5;
+
2582
+
2583 phytomer_parameters.leaf.leaves_per_petiole = 7;
+
2584 phytomer_parameters.leaf.pitch.uniformDistribution(-30, 5);
+
2585 phytomer_parameters.leaf.yaw = 10;
+
2586 phytomer_parameters.leaf.roll = 0;
+
2587 phytomer_parameters.leaf.leaflet_offset = 0.15;
+
2588 phytomer_parameters.leaf.leaflet_scale = 0.7;
+
2589 phytomer_parameters.leaf.prototype_scale.uniformDistribution(0.12,0.18);
+
2590 phytomer_parameters.leaf.prototype = leaf_prototype;
+
2591
+
2592 phytomer_parameters.peduncle.length = 0.16;
+
2593 phytomer_parameters.peduncle.radius = 0.0015;
+
2594 phytomer_parameters.peduncle.pitch = 20;
+
2595 phytomer_parameters.peduncle.roll = 0;
+
2596 phytomer_parameters.peduncle.curvature = -700;
+
2597 phytomer_parameters.peduncle.color = phytomer_parameters.internode.color;
+
2598 phytomer_parameters.peduncle.length_segments = 5;
+
2599 phytomer_parameters.peduncle.radial_subdivisions = 8;
+
2600
+
2601 phytomer_parameters.inflorescence.flowers_per_peduncle = 8;
+
2602 phytomer_parameters.inflorescence.flower_offset = 0.15;
+
2603 phytomer_parameters.inflorescence.pitch = 90;
+
2604 phytomer_parameters.inflorescence.roll.uniformDistribution(-30,30);
+
2605 phytomer_parameters.inflorescence.flower_prototype_scale = 0.03;
+
2606 phytomer_parameters.inflorescence.flower_prototype_function = TomatoFlowerPrototype;
+
2607 phytomer_parameters.inflorescence.fruit_prototype_scale = 0.08;
+
2608 phytomer_parameters.inflorescence.fruit_prototype_function = TomatoFruitPrototype;
+
2609 phytomer_parameters.inflorescence.fruit_gravity_factor_fraction = 0.5;
+
2610
+
2611 // ---- Shoot Parameters ---- //
+
2612
+
2613 ShootParameters shoot_parameters(context_ptr->getRandomGenerator());
+
2614 shoot_parameters.phytomer_parameters = phytomer_parameters;
+
2615 shoot_parameters.phytomer_parameters.phytomer_creation_function = TomatoPhytomerCreationFunction;
+
2616
+
2617 shoot_parameters.max_nodes = 16;
+
2618 shoot_parameters.insertion_angle_tip = 30;
+
2619 shoot_parameters.insertion_angle_decay_rate = 0;
+
2620 shoot_parameters.internode_length_max = 0.04;
+
2621 shoot_parameters.internode_length_min = 0.0;
+
2622 shoot_parameters.internode_length_decay_rate = 0;
+
2623 shoot_parameters.base_roll = 90;
+
2624 shoot_parameters.base_yaw.uniformDistribution(-20,20);
+
2625 shoot_parameters.gravitropic_curvature = -200;
+
2626 shoot_parameters.tortuosity = 3;
+
2627
+
2628 shoot_parameters.phyllochron_min = 2;
+
2629 shoot_parameters.elongation_rate = 0.1;
+
2630 shoot_parameters.girth_area_factor = 3.f;
+
2631 shoot_parameters.vegetative_bud_break_time = 10;
+
2632 shoot_parameters.vegetative_bud_break_probability_min = 0.15;
+
2633 shoot_parameters.vegetative_bud_break_probability_decay_rate = -0.5;
+
2634 shoot_parameters.flower_bud_break_probability = 0.5;
+
2635 shoot_parameters.fruit_set_probability = 0.5;
+
2636 shoot_parameters.flowers_require_dormancy = false;
+
2637 shoot_parameters.growth_requires_dormancy = false;
+
2638 shoot_parameters.determinate_shoot_growth = true;
+
2639
+
2640 shoot_parameters.defineChildShootTypes({"mainstem"},{1.0});
+
2641
+
2642 defineShootType("mainstem",shoot_parameters);
+
2643
+
2644}
+
2645
+
2646uint PlantArchitecture::buildTomatoPlant(const helios::vec3 &base_position) {
+
2647
+
2648 if (shoot_types.empty()) {
+
2649 //automatically initialize tomato plant shoots
+
2650 initializeTomatoShoots();
+
2651 }
+
2652
+
2653 uint plantID = addPlantInstance(base_position, 0);
+
2654
+
2655 AxisRotation base_rotation = make_AxisRotation(0, context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI));
+
2656 uint uID_stem = addBaseStemShoot(plantID, 1, base_rotation, 0.002, 0.06, 0.01, 0.01, 0, "mainstem");
+
2657
+
2658 breakPlantDormancy(plantID);
+
2659
+
2660 setPlantPhenologicalThresholds(plantID, 0, 40, 5, 5, 30, 1000, false);
+
2661
+
2662 plant_instances.at(plantID).max_age = 365;
+
2663
+
2664 return plantID;
+
2665
+
2666}
+
2667
+
2668void PlantArchitecture::initializeWalnutTreeShoots(){
+
2669
+
2670 // ---- Leaf Prototype ---- //
+
2671
+
2672 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
2673 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/WalnutLeaf.png";
+
2674 leaf_prototype.leaf_aspect_ratio = 0.5f;
+
2675 leaf_prototype.midrib_fold_fraction = 0.15f;
+
2676 leaf_prototype.longitudinal_curvature = -0.2f;
+
2677 leaf_prototype.lateral_curvature = 0.1f;
+
2678 leaf_prototype.wave_period.uniformDistribution(0.08, 0.15);
+
2679 leaf_prototype.wave_amplitude.uniformDistribution(0.02, 0.04);
+
2680 leaf_prototype.subdivisions = 3;
+
2681 leaf_prototype.unique_prototypes = 5;
+
2682
+
2683 // ---- Phytomer Parameters ---- //
+
2684
+
2685 PhytomerParameters phytomer_parameters_walnut(context_ptr->getRandomGenerator());
+
2686
+
2687 phytomer_parameters_walnut.internode.pitch = 0;
+
2688 phytomer_parameters_walnut.internode.phyllotactic_angle.uniformDistribution( 160, 200 );
+
2689 phytomer_parameters_walnut.internode.radius_initial = 0.004;
+
2690 phytomer_parameters_walnut.internode.length_segments = 1;
+
2691 phytomer_parameters_walnut.internode.image_texture = "plugins/plantarchitecture/assets/textures/AppleBark.jpg";
+
2692 phytomer_parameters_walnut.internode.max_floral_buds_per_petiole = 3;
+
2693
+
2694 phytomer_parameters_walnut.petiole.petioles_per_internode = 2;
+
2695 phytomer_parameters_walnut.petiole.pitch.uniformDistribution(-80,-70);
+
2696 phytomer_parameters_walnut.petiole.taper = 0.2;
+
2697 phytomer_parameters_walnut.petiole.curvature.uniformDistribution(-1000,0);
+
2698 phytomer_parameters_walnut.petiole.length = 0.15;
+
2699 phytomer_parameters_walnut.petiole.radius = 0.0015;
+
2700 phytomer_parameters_walnut.petiole.length_segments = 5;
+
2701 phytomer_parameters_walnut.petiole.radial_subdivisions = 3;
+
2702 phytomer_parameters_walnut.petiole.color = make_RGBcolor(0.61,0.5,0.24);
+
2703
+
2704 phytomer_parameters_walnut.leaf.leaves_per_petiole = 5;
+
2705 phytomer_parameters_walnut.leaf.pitch.uniformDistribution(-40,0);
+
2706 phytomer_parameters_walnut.leaf.prototype_scale = 0.14;
+
2707 phytomer_parameters_walnut.leaf.leaflet_scale = 0.7;
+
2708 phytomer_parameters_walnut.leaf.leaflet_offset = 0.35;
+
2709 phytomer_parameters_walnut.leaf.prototype = leaf_prototype;
+
2710
+
2711 phytomer_parameters_walnut.peduncle.length = 0.02;
+
2712 phytomer_parameters_walnut.peduncle.radius = 0.0005;
+
2713 phytomer_parameters_walnut.peduncle.pitch = 90;
+
2714 phytomer_parameters_walnut.peduncle.roll = 90;
+
2715 phytomer_parameters_walnut.peduncle.length_segments = 1;
+
2716
+
2717 phytomer_parameters_walnut.inflorescence.flowers_per_peduncle = 1;
+
2718 phytomer_parameters_walnut.inflorescence.pitch = 0;
+
2719 phytomer_parameters_walnut.inflorescence.roll = 0;
+
2720 phytomer_parameters_walnut.inflorescence.flower_prototype_scale = 0.03;
+
2721 phytomer_parameters_walnut.inflorescence.flower_prototype_function = WalnutFlowerPrototype;
+
2722 phytomer_parameters_walnut.inflorescence.fruit_prototype_scale = 0.075;
+
2723 phytomer_parameters_walnut.inflorescence.fruit_prototype_function = WalnutFruitPrototype;
+
2724
+
2725 // ---- Shoot Parameters ---- //
+
2726
+
2727 // Trunk
+
2728 ShootParameters shoot_parameters_trunk(context_ptr->getRandomGenerator());
+
2729 shoot_parameters_trunk.phytomer_parameters = phytomer_parameters_walnut;
+
2730 shoot_parameters_trunk.phytomer_parameters.internode.phyllotactic_angle = 0;
+
2731 shoot_parameters_trunk.phytomer_parameters.internode.radius_initial = 0.01;
+
2732 shoot_parameters_trunk.phytomer_parameters.internode.radial_subdivisions = 24;
+
2733 shoot_parameters_trunk.max_nodes = 20;
+
2734 shoot_parameters_trunk.girth_area_factor = 3.f;
+
2735 shoot_parameters_trunk.vegetative_bud_break_probability_min = 0;
+
2736 shoot_parameters_trunk.vegetative_bud_break_time = 0;
+
2737 shoot_parameters_trunk.tortuosity = 1;
+
2738 shoot_parameters_trunk.internode_length_max = 0.05;
+
2739 shoot_parameters_trunk.internode_length_decay_rate = 0;
+
2740 shoot_parameters_trunk.defineChildShootTypes({"scaffold"},{1});
+
2741
+
2742 // Proleptic shoots
+
2743 ShootParameters shoot_parameters_proleptic(context_ptr->getRandomGenerator());
+
2744 shoot_parameters_proleptic.phytomer_parameters = phytomer_parameters_walnut;
+
2745 shoot_parameters_proleptic.phytomer_parameters.internode.color = make_RGBcolor(0.3,0.2,0.2);
+
2746 shoot_parameters_proleptic.phytomer_parameters.phytomer_creation_function = WalnutPhytomerCreationFunction;
+
2747 // shoot_parameters_proleptic.phytomer_parameters.phytomer_callback_function = WalnutPhytomerCallbackFunction;
+
2748 shoot_parameters_proleptic.max_nodes = 30;
+
2749 shoot_parameters_proleptic.max_nodes_per_season = 15;
+
2750 shoot_parameters_proleptic.phyllochron_min = 2.;
+
2751 shoot_parameters_proleptic.elongation_rate = 0.15;
+
2752 shoot_parameters_proleptic.girth_area_factor = 10.f;
+
2753 shoot_parameters_proleptic.vegetative_bud_break_probability_min = 0.05;
+
2754 shoot_parameters_proleptic.vegetative_bud_break_probability_decay_rate = 0.6;
+
2755 shoot_parameters_proleptic.vegetative_bud_break_time = 3;
+
2756 shoot_parameters_proleptic.gravitropic_curvature = 200;
+
2757 shoot_parameters_proleptic.tortuosity = 5;
+
2758 shoot_parameters_proleptic.insertion_angle_tip.uniformDistribution( 20, 25);
+
2759 shoot_parameters_proleptic.insertion_angle_decay_rate = 15;
+
2760 shoot_parameters_proleptic.internode_length_max = 0.08;
+
2761 shoot_parameters_proleptic.internode_length_min = 0.01;
+
2762 shoot_parameters_proleptic.internode_length_decay_rate = 0.006;
+
2763 shoot_parameters_proleptic.fruit_set_probability = 0.5;
+
2764 shoot_parameters_proleptic.flower_bud_break_probability = 0.3;
+
2765 shoot_parameters_proleptic.max_terminal_floral_buds = 4;
+
2766 shoot_parameters_proleptic.flowers_require_dormancy = true;
+
2767 shoot_parameters_proleptic.growth_requires_dormancy = true;
+
2768 shoot_parameters_proleptic.determinate_shoot_growth = false;
+
2769 shoot_parameters_proleptic.defineChildShootTypes({"proleptic"},{1.0});
+
2770
+
2771 // Main scaffolds
+
2772 ShootParameters shoot_parameters_scaffold = shoot_parameters_proleptic;
+
2773 shoot_parameters_scaffold.phytomer_parameters.internode.radial_subdivisions = 10;
+
2774 shoot_parameters_scaffold.max_nodes = 30;
+
2775 shoot_parameters_scaffold.gravitropic_curvature = 300;
+
2776 shoot_parameters_scaffold.internode_length_max = 0.06;
+
2777 shoot_parameters_scaffold.tortuosity = 4;
+
2778 shoot_parameters_scaffold.defineChildShootTypes({"proleptic"},{1.0});
+
2779
+
2780 defineShootType("trunk", shoot_parameters_trunk);
+
2781 defineShootType("scaffold", shoot_parameters_scaffold);
+
2782 defineShootType("proleptic", shoot_parameters_proleptic);
+
2783
+
2784}
+
2785
+
2786uint PlantArchitecture::buildWalnutTree(const helios::vec3 &base_position) {
+
2787
+
2788 if( shoot_types.empty() ){
+
2789 //automatically initialize walnut tree shoots
+
2790 initializeWalnutTreeShoots();
+
2791 }
+
2792
+
2793 uint plantID = addPlantInstance(base_position, 0);
+
2794
+
2795 uint uID_trunk = addBaseStemShoot(plantID, 19, make_AxisRotation(context_ptr->randu(0.f, 0.05f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), 0.f * M_PI), shoot_types.at("trunk").phytomer_parameters.internode.radius_initial.val(), 0.04, 1.f, 1.f, 0, "trunk");
+
2796 appendPhytomerToShoot( plantID, uID_trunk, shoot_types.at("trunk").phytomer_parameters, 0, 0.01, 1, 1);
+
2797
+
2798 plant_instances.at(plantID).shoot_tree.at(uID_trunk)->meristem_is_alive = false;
+
2799
+
2800 auto phytomers = plant_instances.at(plantID).shoot_tree.at(uID_trunk)->phytomers;
+
2801 for( const auto & phytomer : phytomers ){
+
2802 phytomer->removeLeaf();
+
2803 phytomer->setVegetativeBudState(BUD_DEAD);
+
2804 phytomer->setFloralBudState(BUD_DEAD);
+
2805 }
+
2806
+
2807 uint Nscaffolds = 4;//context_ptr->randu(4,5);
+
2808
+
2809 for( int i=0; i<Nscaffolds; i++ ) {
+
2810// float pitch = context_ptr->randu(deg2rad(25), deg2rad(35))+i*deg2rad(7.f);
+
2811 float pitch = context_ptr->randu(deg2rad(45), deg2rad(55));
+
2812 uint uID_shoot = addChildShoot( plantID, uID_trunk, getShootNodeCount(plantID,uID_trunk)-i-1, context_ptr->randu(7, 9), make_AxisRotation(pitch, (float(i) + context_ptr->randu(-0.2f, 0.2f)) / float(Nscaffolds) * 2 * M_PI, 0), 0.007, 0.06, 1.f, 1.f, 0.5, "scaffold", 0);
+
2813
+
2814 }
+
2815
+
2816 makePlantDormant(plantID);
+
2817
+
2818 setPlantPhenologicalThresholds(plantID, 165, -1, 3, 7, 20, 200, false);
+
2819
+
2820 plant_instances.at(plantID).max_age = 1095;
+
2821
+
2822 return plantID;
+
2823
+
2824}
+
2825
+
2826void PlantArchitecture::initializeWheatShoots() {
+
2827
+
2828 // ---- Leaf Prototype ---- //
+
2829
+
2830 LeafPrototype leaf_prototype(context_ptr->getRandomGenerator());
+
2831 leaf_prototype.leaf_texture_file[0] = "plugins/plantarchitecture/assets/textures/SorghumLeaf.png";
+
2832 leaf_prototype.leaf_aspect_ratio = 0.1f;
+
2833 leaf_prototype.midrib_fold_fraction = 0.3f;
+
2834 leaf_prototype.longitudinal_curvature.uniformDistribution(-0.5, -0.1);
+
2835 leaf_prototype.lateral_curvature = -0.3;
+
2836 leaf_prototype.petiole_roll = 0.04f;
+
2837 leaf_prototype.wave_period = 0.1f;
+
2838 leaf_prototype.wave_amplitude = 0.1f;
+
2839 leaf_prototype.leaf_buckle_length.uniformDistribution(0.5,0.6);
+
2840 leaf_prototype.leaf_buckle_angle.uniformDistribution(25,35);
+
2841 leaf_prototype.subdivisions = 20;
+
2842 leaf_prototype.unique_prototypes = 10;
+
2843
+
2844 // ---- Phytomer Parameters ---- //
+
2845
+
2846 PhytomerParameters phytomer_parameters_wheat(context_ptr->getRandomGenerator());
+
2847
+
2848 phytomer_parameters_wheat.internode.pitch = 0;
+
2849 phytomer_parameters_wheat.internode.phyllotactic_angle.uniformDistribution(67,77);
+
2850 phytomer_parameters_wheat.internode.radius_initial = 0.001;
+
2851 phytomer_parameters_wheat.internode.color = make_RGBcolor(0.27,0.31,0.16);
+
2852 phytomer_parameters_wheat.internode.length_segments = 1;
+
2853 phytomer_parameters_wheat.internode.radial_subdivisions = 6;
+
2854 phytomer_parameters_wheat.internode.max_floral_buds_per_petiole = 0;
+
2855 phytomer_parameters_wheat.internode.max_vegetative_buds_per_petiole = 0;
+
2856
+
2857 phytomer_parameters_wheat.petiole.petioles_per_internode = 1;
+
2858 phytomer_parameters_wheat.petiole.pitch.uniformDistribution(-40,-20);
+
2859 phytomer_parameters_wheat.petiole.radius = 0.0;
+
2860 phytomer_parameters_wheat.petiole.length = 0.005;
+
2861 phytomer_parameters_wheat.petiole.taper = 0;
+
2862 phytomer_parameters_wheat.petiole.curvature = 0;
+
2863 phytomer_parameters_wheat.petiole.length_segments = 1;
+
2864
+
2865 phytomer_parameters_wheat.leaf.leaves_per_petiole = 1;
+
2866 phytomer_parameters_wheat.leaf.pitch = 0;
+
2867 phytomer_parameters_wheat.leaf.yaw = 0;
+
2868 phytomer_parameters_wheat.leaf.roll = 0;
+
2869 phytomer_parameters_wheat.leaf.prototype_scale = 0.22;
+
2870 phytomer_parameters_wheat.leaf.prototype = leaf_prototype;
+
2871
+
2872 phytomer_parameters_wheat.peduncle.length = 0.1;
+
2873 phytomer_parameters_wheat.peduncle.radius = 0.002;
+
2874 phytomer_parameters_wheat.peduncle.color = phytomer_parameters_wheat.internode.color;
+
2875 phytomer_parameters_wheat.peduncle.curvature = -100;
+
2876 phytomer_parameters_wheat.peduncle.radial_subdivisions = 6;
+
2877
+
2878 phytomer_parameters_wheat.inflorescence.flowers_per_peduncle = 1;
+
2879 phytomer_parameters_wheat.inflorescence.pitch = 0;
+
2880 phytomer_parameters_wheat.inflorescence.roll = 0;
+
2881 phytomer_parameters_wheat.inflorescence.fruit_prototype_scale = 0.1;
+
2882 phytomer_parameters_wheat.inflorescence.fruit_prototype_function = WheatSpikePrototype;
+
2883
+
2884 phytomer_parameters_wheat.phytomer_creation_function = WheatPhytomerCreationFunction;
+
2885
+
2886 // ---- Shoot Parameters ---- //
+
2887
+
2888 ShootParameters shoot_parameters_mainstem(context_ptr->getRandomGenerator());
+
2889 shoot_parameters_mainstem.phytomer_parameters = phytomer_parameters_wheat;
+
2890 shoot_parameters_mainstem.vegetative_bud_break_probability_min = 0;
+
2891 shoot_parameters_mainstem.flower_bud_break_probability = 1;
+
2892 shoot_parameters_mainstem.phyllochron_min = 2;
+
2893 shoot_parameters_mainstem.elongation_rate = 0.1;
+
2894 shoot_parameters_mainstem.girth_area_factor = 6.f;
+
2895 shoot_parameters_mainstem.gravitropic_curvature.uniformDistribution(-500,-200);
+
2896 shoot_parameters_mainstem.flowers_require_dormancy = false;
+
2897 shoot_parameters_mainstem.growth_requires_dormancy = false;
+
2898 shoot_parameters_mainstem.determinate_shoot_growth = false;
+
2899 shoot_parameters_mainstem.fruit_set_probability = 1.0;
+
2900 shoot_parameters_mainstem.defineChildShootTypes({"mainstem"},{1.0});
+
2901 shoot_parameters_mainstem.max_nodes = 20;
+
2902 shoot_parameters_mainstem.max_terminal_floral_buds = 1;
+
2903
+
2904 defineShootType("mainstem",shoot_parameters_mainstem);
+
2905
+
2906}
+
2907
+
2908uint PlantArchitecture::buildWheatPlant(const helios::vec3 &base_position) {
+
2909
+
2910 if (shoot_types.empty()) {
+
2911 //automatically initialize wheat plant shoots
+
2912 initializeWheatShoots();
+
2913 }
+
2914
+
2915 uint plantID = addPlantInstance(base_position - make_vec3(0,0,0.025), 0);
+
2916
+
2917 uint uID_stem = addBaseStemShoot(plantID, 1, make_AxisRotation(context_ptr->randu(0.f, 0.05f * M_PI), context_ptr->randu(0.f, 2.f * M_PI), context_ptr->randu(0.f, 2.f * M_PI)), 0.001, 0.025, 0.01, 0.01, 0, "mainstem");
+
2918
+
2919 breakPlantDormancy(plantID);
+
2920
+
2921 setPlantPhenologicalThresholds(plantID, 0, -1, -1, 4, 10, 1000, false);
+
2922
+
2923 plant_instances.at(plantID).max_age = 365;
+
2924
+
2925 return plantID;
+
2926
+
2927}
-
void setPlantPhenologicalThresholds(uint plantID, float time_to_dormancy_break, float time_to_flower_initiation, float time_to_flower_opening, float time_to_fruit_set, float time_to_fruit_maturity, float time_to_dormancy, float max_leaf_lifespan=1e6, bool is_evergreen=false)
Specify the threshold values for plant phenological stages.
-
uint addPlantInstance(const helios::vec3 &base_position, float current_age)
Create an instance of a plant.
-
uint addChildShoot(uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
Manually add a child shoot at the axillary bud of a phytomer.
-
int appendPhytomerToShoot(uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
Add a new phytomer at the terminal bud of a shoot.
-
std::map< std::string, ShootParameters > getCurrentShootParameters()
Get the shoot parameters structure for all shoot types in the current plant model.
-
void advanceTime(float time_step_days)
Advance plant growth by a specified time interval for all plants.
-
void updateCurrentShootParameters(const std::string &shoot_type_label, const ShootParameters &params)
Update the parameters of a single shoot type in the current plant model.
-
uint appendShoot(uint plantID, int parent_shoot_ID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually append a new shoot at the end of an existing shoot. This is used when the characteristics of...
-
uint addBaseStemShoot(uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has ...
-
void defineShootType(const std::string &shoot_type_label, const ShootParameters &shoot_params)
Define a new shoot type based on a set of ShootParameters.
-
std::map< std::string, PhytomerParameters > getCurrentPhytomerParameters()
Get the phytomer parameters structure for all shoot types in the current plant model.
-
uint buildPlantInstanceFromLibrary(const helios::vec3 &base_position, float age)
Build a plant instance based on the model currently loaded from the library.
-
void loadPlantModelFromLibrary(const std::string &plant_label)
Load an existing plant model from the library.
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition: Context.cpp:49
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
float deg2rad(float deg)
Convert degrees to radians.
Definition: global.cpp:576
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
- - -
std::map< int, std::string > leaf_texture_file
Image texture file for the leaf.
-
uint unique_prototypes
Number of unique prototypes to generate.
- -
void(* phytomer_creation_function)(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
- -
Vector of three elements of type 'float'.
+
void setPlantPhenologicalThresholds(uint plantID, float time_to_dormancy_break, float time_to_flower_initiation, float time_to_flower_opening, float time_to_fruit_set, float time_to_fruit_maturity, float time_to_dormancy, float max_leaf_lifespan=1e6, bool is_evergreen=false)
Specify the threshold values for plant phenological stages.
+
uint addPlantInstance(const helios::vec3 &base_position, float current_age)
Create an instance of a plant.
+
uint addChildShoot(uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
Manually add a child shoot at the axillary bud of a phytomer.
+
int appendPhytomerToShoot(uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
Add a new phytomer at the terminal bud of a shoot.
+
std::map< std::string, ShootParameters > getCurrentShootParameters()
Get the shoot parameters structure for all shoot types in the current plant model.
+
void advanceTime(float time_step_days)
Advance plant growth by a specified time interval for all plants.
+
void updateCurrentShootParameters(const std::string &shoot_type_label, const ShootParameters &params)
Update the parameters of a single shoot type in the current plant model.
+
uint appendShoot(uint plantID, int parent_shoot_ID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Manually append a new shoot at the end of an existing shoot. This is used when the characteristics of...
+
uint addBaseStemShoot(uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has ...
+
void defineShootType(const std::string &shoot_type_label, const ShootParameters &shoot_params)
Define a new shoot type based on a set of ShootParameters.
+
std::map< std::string, PhytomerParameters > getCurrentPhytomerParameters()
Get the phytomer parameters structure for all shoot types in the current plant model.
+
uint buildPlantInstanceFromLibrary(const helios::vec3 &base_position, float age)
Build a plant instance based on the model currently loaded from the library.
+
void loadPlantModelFromLibrary(const std::string &plant_label)
Load an existing plant model from the library.
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
std::minstd_rand0 * getRandomGenerator()
Get the random number generator engine.
Definition Context.cpp:49
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
float deg2rad(float deg)
Convert degrees to radians.
Definition global.cpp:576
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+ + +
std::map< int, std::string > leaf_texture_file
Image texture file for the leaf.
+
uint unique_prototypes
Number of unique prototypes to generate.
+ +
void(* phytomer_creation_function)(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age)
+ +
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_plug_ins.html b/doc/html/_plug_ins.html index 6fe16f547..967da26b0 100644 --- a/doc/html/_plug_ins.html +++ b/doc/html/_plug_ins.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Plug-ins
+
Plug-ins

Links to the documentation for plug-ins are given below. The documentation for plug-ins have several common elements that tell you what is needed to run them.

@@ -116,7 +128,8 @@
+
diff --git a/doc/html/_plugins.html b/doc/html/_plugins.html index 914796a18..0e0446624 100644 --- a/doc/html/_plugins.html +++ b/doc/html/_plugins.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Writing Plugins
+
Writing Plugins

@@ -121,7 +143,8 @@

+
diff --git a/doc/html/_radiation_doc.html b/doc/html/_radiation_doc.html index a3c859451..3a4a06091 100644 --- a/doc/html/_radiation_doc.html +++ b/doc/html/_radiation_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Radiation Model Plugin Documentation
+
Radiation Model Plugin Documentation

Table of Contents

-
@@ -155,13 +237,13 @@

Package
-td
+
-td
+
-td + NVIDIA CUDA 9.0+ Mac OSX:
$ brew install Caskroom/cask/cuda
Use CUDA installer Use CUDA installer @@ -197,7 +279,7 @@

emissivity_* unitless float Primitive emissivity for band * (i.e., emissivity for band 'PAR' would be 'emissivity_PAR'). NOTE: Only needed if performing emission calculations. N/A 1.0 -twosided_flag N/A uint Flag to determine whether a primitive should be treated as two-sided (=1) or single-sided (=0). See Sect. Area Basis for Calculating Fluxes below for more information. N/A 1 +twosided_flag N/A uint Flag to determine whether a primitive should be treated as two-sided (=1) or single-sided (=0). See Sect. Area Basis for Calculating Fluxes below for more information. N/A 1


@@ -215,7 +297,7 @@

Model Class Constructor

The radiation model class contains functions and data associated with the model. To begin, declare an instance of the RadiationModel class. The class constructor takes one argument - a pointer to the Helios context. It uses this pointer to access model geometry and data in the context.

RadiationModel radiationmodel(&context); //declare the model class
-
Radiation transport model plugin.
+
Radiation transport model plugin.

Area Basis for Calculating Fluxes

The ultimate outputs of the radiation model are absorbed radiative fluxes, which is the rate of radiative energy transfer per unit surface area. All flux calculations are on a per unit one-sided surface area basis. For planar primitive elements (patches and triangles), this means that the flux will be the rate of radiative energy absorption on both sides of the primitive, divided by the one-sided surface area of the primitive (i.e., that returned by the helios::Primitive::getArea() function).

@@ -273,7 +355,7 @@

float tau = 0.1; //transmissivity value
context.setPrimitiveData( UUID, "transmissivity_PAR", tau);

Note that absorptivity is not directly set, rather it is calculated as $1-\rho-\tau$. If $1-\rho-\tau$ is calculated to be negative or greater than 1, an error is thrown.

-

If reflectivity or transmissivity primitive data does not exist for a primitive, a default value of 0 is assumed. If radiative properties are changed from default values, the number of scattering iterations needs to be increased from the default value of 0 (see Scattering Iterations). If radiative properties are changed, but the number of scattering iterations is set to the default value of 0, the modified radiative property values are overridden and set back to their default values (black surface).

+

If reflectivity or transmissivity primitive data does not exist for a primitive, a default value of 0 is assumed. If radiative properties are changed from default values, the number of scattering iterations needs to be increased from the default value of 0 (see Scattering Iterations). If radiative properties are changed, but the number of scattering iterations is set to the default value of 0, the modified radiative property values are overridden and set back to their default values (black surface).

2. Specifying reflectivity and transmissivity based on spectral data

Spectral reflectivity or transmissivity data can be associated with a primitive, such that the radiative properties for a given band can be calculated automatically. At a minimum, two things must be set in order for this to happen: a) the radiation band must have been created with a defined wavelength range (see above and method RadiationModel::addRadiationBand( const std::string&, float, float) ); b) primitive data with label "reflectivity_spectrum" and/or "transmissivity_spectrum" must be set for the primitive, and the value (a string) must reference a valid spectral dataset that has been loaded into the Context.

Below is a code example for specifying the reflectivity and transmissivity for a primitive based on spectral data. In this case, the model will assume the source spectral distribution is constant over all wave bands, and thus total reflectivity/transmissivity is just the integral of the spectral reflectivity/transmissivity. If there was a radiative source with a specified spectral distribution, the total reflectivity/transmissivity would be calculated by integrating the product of the reflectivity/transmissivity and source spectral intensity (example given for reflectivity only):

@@ -294,7 +376,7 @@

context.setPrimitiveData( UUID, "transmissivity_spectrum", "grape_leaf_transmissivity_0000" );
// Declare the radiation model
-
%RadiationModel radiationmodel(&context);
+
RadiationModel radiationmodel(&context);
// Add a band with explicit wavelength bounds (400-700nm)
radiationmodel.addRadiationBand( "PAR", 400, 700 );
@@ -358,7 +440,7 @@

radiationmodel.setSourceFlux(RectSource,"PAR",800); //set the flux of the source

Setting the Radiation Source Spectral Distribution and Normalization

-

In the above examples, the source flux was specified directly for each band, and integrated surface radiative properties assumed the source flux spectral distribution was constant over the wave band. Optionally, users can specify a source spectral distribution by referencing a spectral distribution that has been loaded into the Context based on the procedure described above (Radiative Properties).

+

In the above examples, the source flux was specified directly for each band, and integrated surface radiative properties assumed the source flux spectral distribution was constant over the wave band. Optionally, users can specify a source spectral distribution by referencing a spectral distribution that has been loaded into the Context based on the procedure described above (Radiative Properties).

The RadiationModel::setSourceSpectrum() method sets the source spectral flux distribution, and takes two arguments: 1) The identifier of a radiative source (i.e., the output argument of the add[*]Source() call), 2) The label (string) of a spectral distribution that has been loaded into the Context.

The main difference between the spectral distribution data for radiative properties and for sources is that for sources each ".y" value in the spectral dataset is the spectral-hemispherical emitted flux at that wavelength (".x") in units of W/m2/nm.

An example of setting the source distribution based on the ASTMG173 standard solar spectral distribution is given below. Note that the ASTMG173 solar spectrum is automatically loaded by the radiation model. However, in general, the user needs to load an XML file containing the spectral data into the Context. For example,

@@ -464,8 +546,8 @@

uint antialiasing_samples = 100;
radiationmodel.addRadiationCamera("visible", {"red","green","blue"}, camera_position, camera_lookat, properties, antialiasing_samples );
-
Properties defining a radiation camera.
-
float HFOV
Camera horizontal field of view in degrees.
+
Properties defining a radiation camera.
+
float HFOV
Camera horizontal field of view in degrees.

This will add a 3-band RGB camera, and assumes that radiation bands with labels "red", "green", and "blue" have been added based on a call to RadiationModel::addBand().

Radiation Camera Color Calibration

@@ -604,16 +686,16 @@

- -
Class for visualization of simulation results.
Definition: Visualizer.h:265
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void setDate(int day, int month, int year)
Set simulation date by day, month, year.
Definition: Context.cpp:1059
-
void setTime(int minute, int hour)
Set simulation time.
Definition: Context.cpp:1136
-
std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition: Context.cpp:5646
-
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:5809
-
void wait(float seconds)
Wait/sleep for a specified amount of time.
Definition: global.cpp:306
- -
Vector of three elements of type 'float'.
+ +
Class for visualization of simulation results.
Definition Visualizer.h:275
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void setDate(int day, int month, int year)
Set simulation date by day, month, year.
Definition Context.cpp:1059
+
void setTime(int minute, int hour)
Set simulation time.
Definition Context.cpp:1136
+
std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
Add a spherical compound object to the Context.
Definition Context.cpp:5646
+
std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:5809
+
void wait(float seconds)
Wait/sleep for a specified amount of time.
Definition global.cpp:306
+ +
Vector of three elements of type 'float'.

Model Outputs

@@ -639,7 +721,7 @@

vis.enableColorbar();
vis.plotInteractive();
-
void aggregatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Sum multiple primitive data values for each primitive together and store result in new primitive data...
+
void aggregatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
Sum multiple primitive data values for each primitive together and store result in new primitive data...

Integrating Fluxes

While visualizations provide an overview of the spatial distribution of radiative fluxes, the ultimate goal of radiation simulations is usually to integrate over some region in order to calculate aggregate fluxes and related quantities. There are many examples of such integration, such as calculating the fraction of incoming radiation intercepted by the canopy, or calculating the overall fraction of sunlit leaf area.

@@ -657,7 +739,7 @@

float fPAR = PAR_tree/(PAR_tree+PAR_ground);
std::cout << "Fraction of intercepted PAR is " << fPAR << std::endl;
-
void calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const
Calculate sum of primitive data values (float) for a subset of primitives, where each value in the su...
+
void calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const
Calculate sum of primitive data values (float) for a subset of primitives, where each value in the su...

The above example assumes that we have already added some geometry to the Context, separated leaf and ground UUIDs, and declared and set up the radiation model. For a full example, see Tutorial 10.

Writing Camera Images to File

@@ -732,10 +814,10 @@

return 0;
}
-
std::vector< uint > loadPLY(const char *filename, bool silent=false)
Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
-
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
float focal_plane_distance
Distance from the viewing plane to the focal plane.
+
std::vector< uint > loadPLY(const char *filename, bool silent=false)
Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
+
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
float focal_plane_distance
Distance from the viewing plane to the focal plane.

The above code would produce an image in the build directory called "camera_visible_myimage.jpeg", which is shown below, along with a file labels.txt that contains the primitive data labels for each pixel.

@@ -747,7 +829,8 @@

+
diff --git a/doc/html/_radiation_model_8cpp.html b/doc/html/_radiation_model_8cpp.html index bcf78f11f..05ad9feb8 100644 --- a/doc/html/_radiation_model_8cpp.html +++ b/doc/html/_radiation_model_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -100,9 +112,9 @@ - + - +

Functions

void sutilHandleError (RTcontext context, RTresult code, const char *file, int line)
void sutilHandleError (RTcontext context, RTresult code, const char *file, int line)
 
void sutilReportError (const char *message)
void sutilReportError (const char *message)
 

Detailed Description

@@ -122,31 +134,22 @@

void sutilHandleError ( - RTcontext  - context, + RTcontext context, - RTresult  - code, + RTresult code, - const char *  - file, + const char * file, - int  - line  - - - - ) - + int line )

diff --git a/doc/html/_radiation_model_8cpp_source.html b/doc/html/_radiation_model_8cpp_source.html index f2535a8bd..bf367ecf1 100644 --- a/doc/html/_radiation_model_8cpp_source.html +++ b/doc/html/_radiation_model_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
RadiationModel.cpp
@@ -97,6 +109,7 @@
17
18using namespace helios;
19
+
21
22 context = context_a;
@@ -137,19 +150,27 @@
57 initializeOptiX();
58
59}
+
60
+
62 RT_CHECK_ERROR( rtContextDestroy( OptiX_Context ) );
63}
+
64
+
66 message_flag=false;
67}
+
68
+
70 message_flag=true;
71}
+
72
+
74
75 if( strcmp(label,"reflectivity")==0 || strcmp(label,"transmissivity")==0 ){
@@ -159,32 +180,42 @@
79 }
80
81}
+
82
+
83void RadiationModel::setDirectRayCount( const std::string &label, size_t N ){
84 if( !doesBandExist(label) ){
85 helios_runtime_error("ERROR (RadiationModel::setDirectRayCount): Cannot set ray count for band '" + label + "' because it is not a valid band.");
86 }
87 radiation_bands.at(label).directRayCount = N;
88}
+
89
+
90void RadiationModel::setDiffuseRayCount( const std::string &label, size_t N ){
91 if( !doesBandExist(label) ){
92 helios_runtime_error("ERROR (RadiationModel::setDiffuseRayCount): Cannot set ray count for band '" + label + "' because it is not a valid band." );
93 }
94 radiation_bands.at(label).diffuseRayCount = N;
95}
+
96
+
97void RadiationModel::setDiffuseRadiationFlux( const std::string &label, float flux ){
98 if( !doesBandExist(label) ){
99 helios_runtime_error("ERROR (RadiationModel::setDiffuseRadiationFlux): Cannot set flux value for band '" + label + "' because it is not a valid band." );
100 }
101 radiation_bands.at(label).diffuseFlux = flux;
102}
+
103
+
104void RadiationModel::setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const SphericalCoord &peak_dir ){
106}
+
107
+
108void RadiationModel::setDiffuseRadiationExtinctionCoeff( const std::string &label, float K, const vec3 &peak_dir ){
109 if( !doesBandExist(label) ){
110 helios_runtime_error("ERROR (RadiationModel::setDiffuseRadiationExtinctionCoeff): Cannot set diffuse extinction value for band '" + label + "' because it is not a valid band.");
@@ -219,7 +250,9 @@
139 radiation_bands.at(label).diffuseDistNorm = 1.f/norm;
140
141}
+
142
+
143void RadiationModel::setDiffuseSpectrumIntegral( float spectrum_integral){
144
145 for( auto &band : radiation_bands ) {
@@ -227,7 +260,9 @@
147 }
148
149}
+
150
+
151void RadiationModel::setDiffuseSpectrumIntegral( float spectrum_integral, float wavelength1, float wavelength2){
152
153 for( auto &band : radiation_bands ) {
@@ -235,7 +270,9 @@
155 }
156
157}
+
158
+
159void RadiationModel::setDiffuseSpectrumIntegral( const std::string &band_label, float spectrum_integral){
160
161 if( spectrum_integral<0 ){
@@ -254,7 +291,9 @@
174 }
175
176}
+
177
+
178void RadiationModel::setDiffuseSpectrumIntegral( const std::string &band_label, float spectrum_integral, float wavelength1, float wavelength2){
179
180 if( spectrum_integral<0 ){
@@ -270,7 +309,9 @@
190 }
191
192}
+
193
+
194void RadiationModel::addRadiationBand(const std::string &label ){
195
196 if( radiation_bands.find(label)!=radiation_bands.end() ){
@@ -288,7 +329,9 @@
208 }
209
210}
+
211
+
212void RadiationModel::addRadiationBand( const std::string &label, float wavelength1, float wavelength2 ){
213
214 if( radiation_bands.find(label)!=radiation_bands.end() ){
@@ -317,7 +360,9 @@
237
238
239}
+
240
+
241void RadiationModel::copyRadiationBand( const std::string &old_label, const std::string &new_label ) {
242
243 if( !doesBandExist(old_label) ){
@@ -328,7 +373,9 @@
248
249 copyRadiationBand( old_label, new_label, waveBounds.x, waveBounds.y );
250}
+
251
+
252void RadiationModel::copyRadiationBand(const std::string &old_label, const std::string &new_label, float wavelength_min, float wavelength_max ){
253
254 if( !doesBandExist(old_label) ){
@@ -347,7 +394,9 @@
267 }
268
269}
+
270
+
271bool RadiationModel::doesBandExist( const std::string &label ) const{
272 if( radiation_bands.find(label)==radiation_bands.end() ){
273 return false;
@@ -355,7 +404,9 @@
275 return true;
276 }
277}
+
278
+
279void RadiationModel::disableEmission( const std::string &label ){
280
281 if( !doesBandExist(label) ){
@@ -365,7 +416,9 @@
285 radiation_bands.at(label).emissionFlag = false;
286
287}
+
288
+
289void RadiationModel::enableEmission( const std::string &label ){
290
291 if( !doesBandExist(label) ){
@@ -375,17 +428,23 @@
295 radiation_bands.at(label).emissionFlag = true;
296
297}
+
298
+
304
+
308
+
310
311 if( direction.magnitude()==0 ){
@@ -419,7 +478,9 @@
339 return Nsources-1;
340
341}
+
342
+
343uint RadiationModel::addSphereRadiationSource( const vec3 &position, float radius ){
344
345 if( radius<=0 ){
@@ -449,15 +510,21 @@
369 return sourceID;
370
371}
+
372
+
376
+
378 return addSunSphereRadiationSource( sphere2cart(sun_direction) );
379}
+
380
+
382
383 uint Nsources = radiation_sources.size()+1;
@@ -487,7 +554,9 @@
407 return Nsources-1;
408
409}
+
410
+
411uint RadiationModel::addRectangleRadiationSource( const vec3 &position, const vec2 &size, const vec3& rotation ){
412
413 if( size.x<=0 || size.y<=0 ){
@@ -517,7 +586,9 @@
437 return sourceID;
438
439}
+
440
+
441uint RadiationModel::addDiskRadiationSource( const vec3 &position, float radius, const vec3& rotation ){
442
443 if( radius<=0 ){
@@ -548,7 +619,9 @@
468
469
470}
+
471
+
473
474 if( sourceID >= radiation_sources.size() ){
@@ -558,7 +631,9 @@
478 radiation_sources.erase(radiation_sources.begin()+sourceID);
479
480}
+
481
+
482void RadiationModel::setSourceSpectrumIntegral(uint source_ID, float source_integral){
483
484 if( source_ID >= radiation_sources.size() ){
@@ -574,7 +649,9 @@
494 }
495
496}
+
497
+
498void RadiationModel::setSourceSpectrumIntegral(uint source_ID, float source_integral, float wavelength1, float wavelength2){
499
500 if( source_ID >= radiation_sources.size() ){
@@ -595,7 +672,9 @@
515 }
516
517}
+
518
+
519void RadiationModel::setSourceFlux( uint source_ID, const std::string &label, float flux ){
520
521 if( !doesBandExist(label) ){
@@ -611,13 +690,17 @@
531 radiation_sources.at(source_ID).source_fluxes[label] = flux * radiation_sources.at(source_ID).source_flux_scaling_factor;
532
533}
+
534
+
535void RadiationModel::setSourceFlux(const std::vector<uint> &source_ID, const std::string &band_label, float flux ){
536 for( auto ID : source_ID ){
537 setSourceFlux( ID, band_label, flux );
538 }
539}
+
540
+
541float RadiationModel::getSourceFlux( uint source_ID, const std::string &label )const{
542
543 if( !doesBandExist(label) ){
@@ -643,7 +726,9 @@
563 return source.source_fluxes.at(label);
564
565}
+
566
+
567void RadiationModel::setSourceSpectrum( uint source_ID, const std::vector<helios::vec2> &spectrum ){
568
569 if( source_ID >= radiation_sources.size() ){
@@ -669,13 +754,17 @@
589 radiation_sources.at(source_ID).source_spectrum = spectrum;
590
591}
+
592
+
593void RadiationModel::setSourceSpectrum(const std::vector<uint> &source_ID, const std::vector<helios::vec2> &spectrum ) {
594 for (auto ID: source_ID) {
595 setSourceSpectrum(ID, spectrum);
596 }
597}
+
598
+
599void RadiationModel::setSourceSpectrum(uint source_ID, const std::string &spectrum_label ){
600
601 if( source_ID >= radiation_sources.size() ){
@@ -688,13 +777,17 @@
608 radiation_sources.at(source_ID).source_spectrum_label = spectrum_label;
609
610}
+
611
+
612void RadiationModel::setSourceSpectrum(const std::vector<uint> &source_ID, const std::string &spectrum_label ){
613 for (auto ID: source_ID) {
614 setSourceSpectrum(ID, spectrum_label);
615 }
616}
+
617
+
618void RadiationModel::setDiffuseSpectrum( const std::string &spectrum_label ){
619
620 std::vector<vec2> spectrum;
@@ -711,7 +804,9 @@
631 }
632
633}
+
634
+
635void RadiationModel::setDiffuseSpectrum( const std::string &band_label, const std::string &spectrum_label ){
636
637 if( !doesBandExist(band_label) ){
@@ -730,7 +825,9 @@
650 radiation_bands.at(band_label).diffuse_spectrum = spectrum;
651
652}
+
653
+
654float RadiationModel::getDiffuseFlux( const std::string &band_label ) const{
655
656 if( !doesBandExist(band_label) ){
@@ -752,7 +849,9 @@
672 return radiation_bands.at(band_label).diffuseFlux;
673
674}
+
675
+
677 islightvisualizationenabled = true;
678
@@ -762,14 +861,18 @@
682 }
683
684}
+
685
+
687 islightvisualizationenabled = false;
688 for (auto &UUIDs: source_model_UUIDs){
689 context->deletePrimitive(UUIDs.second);
690 }
691}
+
692
+
694 iscameravisualizationenabled = true;
695
@@ -779,13 +882,16 @@
699 }
700
701}
+
702
+
704 iscameravisualizationenabled = false;
705 for (auto &UUIDs: camera_model_UUIDs){
706 context->deletePrimitive(UUIDs.second);
707 }
708}
+
709
710void RadiationModel::buildLightModelGeometry( uint sourceID ){
711
@@ -877,6 +983,7 @@
797
798}
799
+
800float RadiationModel::integrateSpectrum( uint source_ID, const std::vector<helios::vec2> &object_spectrum, float wavelength1, float wavelength2 ) const{
801
802 if( source_ID >= radiation_sources.size() ){
@@ -922,7 +1029,9 @@
842 return E/Etot;
843
844}
+
845
+
846float RadiationModel::integrateSpectrum( const std::vector<helios::vec2> &object_spectrum, float wavelength1, float wavelength2 ) const{
847
848 if( object_spectrum.size()<2 ){
@@ -957,14 +1066,18 @@
877 return E;
878
879}
+
880
+
881float RadiationModel::integrateSpectrum( const std::vector<helios::vec2> &object_spectrum) const{
882 float wavelength1 = object_spectrum.at(0).x;
883 float wavelength2 = object_spectrum.at(object_spectrum.size()-1).x;
884 float E = RadiationModel::integrateSpectrum(object_spectrum, wavelength1, wavelength2 );
885 return E;
886}
+
887
+
888float RadiationModel::integrateSpectrum(uint source_ID, const std::vector<helios::vec2> &object_spectrum, const std::vector<helios::vec2> &camera_spectrum ) const{
889
890 if( source_ID >= radiation_sources.size() ){
@@ -1004,7 +1117,9 @@
924 return E/Etot;
925
926}
+
927
+
928float RadiationModel::integrateSpectrum( const std::vector<helios::vec2> &object_spectrum, const std::vector<helios::vec2> &camera_spectrum ) const{
929
930 if( object_spectrum.size()<2 ) {
@@ -1039,7 +1154,9 @@
959 return E/Etot;
960
961}
+
962
+
963float RadiationModel::integrateSourceSpectrum( uint source_ID, float wavelength1, float wavelength2 ) const{
964
965 if( source_ID >= radiation_sources.size() ){
@@ -1051,7 +1168,9 @@
971 return integrateSpectrum( radiation_sources.at(source_ID).source_spectrum, wavelength1, wavelength2 );
972
973}
+
974
+
975void RadiationModel::scaleSpectrum( const std::string &existing_global_data_label, const std::string &new_global_data_label, float scale_factor ) const{
976
977 std::vector<vec2> spectrum = loadSpectralData( existing_global_data_label );
@@ -1063,7 +1182,9 @@
983 context->setGlobalData( new_global_data_label.c_str(), HELIOS_TYPE_VEC2, spectrum.size(), &spectrum.at(0) );
984
985}
+
986
+
987void RadiationModel::scaleSpectrum( const std::string &global_data_label, float scale_factor ) const{
988
989 std::vector<vec2> spectrum = loadSpectralData( global_data_label );
@@ -1075,14 +1196,18 @@
995 context->setGlobalData( global_data_label.c_str(), HELIOS_TYPE_VEC2, spectrum.size(), &spectrum.at(0) );
996
997}
+
998
+
999void RadiationModel::scaleSpectrumRandomly( const std::string &existing_global_data_label, const std::string &new_global_data_label, float minimum_scale_factor, float maximum_scale_factor ) const{
1000
1001 scaleSpectrum( existing_global_data_label, new_global_data_label, context->randu(minimum_scale_factor,maximum_scale_factor) );
1002
1003}
+
1004
1005
+
1006void RadiationModel::blendSpectra( const std::string &new_spectrum_label, const std::vector<std::string> &spectrum_labels, const std::vector<float> &weights ) const{
1007
1008 if( spectrum_labels.size() != weights.size() ){
@@ -1161,7 +1286,9 @@
1081 context->setGlobalData( new_spectrum_label.c_str(), HELIOS_TYPE_VEC2, new_spectrum.size(), &new_spectrum.front() );
1082
1083}
+
1084
+
1085void RadiationModel::blendSpectraRandomly( const std::string &new_spectrum_label, const std::vector<std::string> &spectrum_labels ) const{
1086
1087 std::vector<float> weights;
@@ -1177,7 +1304,9 @@
1097 blendSpectra( new_spectrum_label, spectrum_labels, weights );
1098
1099}
+
1100
+
1101void RadiationModel::setSourcePosition( uint source_ID, const vec3 &position ){
1102
1103 if( source_ID >= radiation_sources.size() ){
@@ -1197,18 +1326,24 @@
1117 }
1118
1119}
+
1120
+
1121void RadiationModel::setSourcePosition( uint source_ID, const SphericalCoord &position ) {
1122 setSourcePosition( source_ID, sphere2cart(position) );
1123}
+
1124
+
1126 if( source_ID >= radiation_sources.size() ){
1127 helios_runtime_error("ERROR (RadiationModel::getSourcePosition): Source ID does not exist.");
1128 }
1129 return radiation_sources.at(source_ID).source_position;
1130}
+
1131
+
1132void RadiationModel::setScatteringDepth( const std::string &label, uint depth ){
1133
1134 if( !doesBandExist(label) ){
@@ -1217,7 +1352,9 @@
1137 radiation_bands.at(label).scatteringDepth = depth;
1138
1139}
+
1140
+
1141void RadiationModel::setMinScatterEnergy(const std::string &label, uint energy ){
1142
1143 if( !doesBandExist(label) ){
@@ -1226,7 +1363,9 @@
1146 radiation_bands.at(label).minScatterEnergy = energy;
1147
1148}
+
1149
+
1150void RadiationModel::enforcePeriodicBoundary(const std::string &boundary ){
1151
1152 if( boundary=="x" ){
@@ -1249,7 +1388,9 @@
1169 }
1170
1171}
+
1172
+
1173void RadiationModel::addRadiationCamera(const std::string &camera_label, const std::vector<std::string> &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples) {
1174
1175 if( camera_properties.FOV_aspect_ratio<=0 ){
@@ -1279,14 +1420,18 @@
1199 }
1200
1201}
+
1202
+
1203void RadiationModel::addRadiationCamera(const std::string &camera_label, const std::vector<std::string> &band_label, const helios::vec3 &position, const helios::SphericalCoord &viewing_direction, const CameraProperties &camera_properties, uint antialiasing_samples) {
1204
1205 vec3 lookat = position + sphere2cart(viewing_direction);
1206 addRadiationCamera( camera_label, band_label, position, lookat, camera_properties, antialiasing_samples );
1207
1208}
+
1209
+
1210void RadiationModel::setCameraSpectralResponse( const std::string &camera_label, const std::string &band_label, const std::string &global_data ){
1211 if(cameras.find(camera_label) == cameras.end() ){
1212 helios_runtime_error("ERROR (setCameraSpectralResponse): Camera '" + camera_label + "' does not exist.");
@@ -1297,7 +1442,9 @@
1217 cameras.at(camera_label).band_spectral_response[band_label] = global_data;
1218
1219}
+
1220
+
1221void RadiationModel::setCameraPosition( const std::string &camera_label, const helios::vec3& position ){
1222 if(cameras.find(camera_label) == cameras.end() ){
1223 helios_runtime_error("ERROR (RadiationModel::setCameraPosition): Camera '" + camera_label + "' does not exist.");
@@ -1312,7 +1459,9 @@
1232 }
1233
1234}
+
1235
+
1236helios::vec3 RadiationModel::getCameraPosition(const std::string &camera_label) const{
1237
1238 if(cameras.find(camera_label) == cameras.end() ){
@@ -1322,7 +1471,9 @@
1242 return cameras.at(camera_label).position;
1243
1244}
+
1245
+
1246void RadiationModel::setCameraLookat( const std::string &camera_label, const helios::vec3& lookat ){
1247 if(cameras.find(camera_label) == cameras.end() ){
1248 helios_runtime_error("ERROR (RadiationModel::setCameraLookat): Camera '" + camera_label + "' does not exist.");
@@ -1335,7 +1486,9 @@
1255 }
1256
1257}
+
1258
+
1259helios::vec3 RadiationModel::getCameraLookat(const std::string &camera_label) const{
1260
1261 if(cameras.find(camera_label) == cameras.end() ){
@@ -1345,7 +1498,9 @@
1265 return cameras.at(camera_label).lookat;
1266
1267}
+
1268
+
1269void RadiationModel::setCameraOrientation( const std::string &camera_label, const helios::vec3& direction ){
1270 if(cameras.find(camera_label) == cameras.end() ){
1271 helios_runtime_error("ERROR (RadiationModel::setCameraOrientation): Camera '" + camera_label + "' does not exist.");
@@ -1358,7 +1513,9 @@
1278 }
1279
1280}
+
1281
+
1283
1284 if(cameras.find(camera_label) == cameras.end() ){
@@ -1368,7 +1525,9 @@
1288 return cart2sphere(cameras.at(camera_label).lookat - cameras.at(camera_label).position);
1289
1290}
+
1291
+
1292void RadiationModel::setCameraOrientation( const std::string &camera_label, const helios::SphericalCoord& direction ){
1293 if(cameras.find(camera_label) == cameras.end() ){
1294 helios_runtime_error("ERROR (RadiationModel::setCameraOrientation): Camera '" + camera_label + "' does not exist.");
@@ -1381,7 +1540,9 @@
1301 }
1302
1303}
+
1304
+
1305std::vector<std::string> RadiationModel::getAllCameraLabels(){
1306 std::vector<std::string> labels(cameras.size());
1307 uint cam=0;
@@ -1391,7 +1552,9 @@
1311 }
1312 return labels;
1313}
+
1314
+
1315void RadiationModel::writeCameraImage(const std::string &camera, const std::vector<std::string> &bands, const std::string &imagefile_base, const std::string &image_path, int frame, float flux_to_pixel_conversion) {
1316
1317 //check if camera exists
@@ -1477,7 +1640,9 @@
1397 writeJPEG( outfile.str(), camera_resolution.x, camera_resolution.y, pixel_data );
1398
1399}
+
1400
+
1401void RadiationModel::writeNormCameraImage(const std::string &camera, const std::vector<std::string> &bands, const std::string &imagefile_base, const std::string &image_path, int frame){
1402 float maxval = 0;
1403 // Find maximum mean value over all bands
@@ -1511,7 +1676,9 @@
1431
1432 RadiationModel::writeCameraImage(camera, bands, imagefile_base, image_path, frame);
1433}
+
1434
+
1435void RadiationModel::writeCameraImageData(const std::string &camera, const std::string &band, const std::string &imagefile_base, const std::string &image_path, int frame){
1436
1437 //check if camera exists
@@ -1577,6 +1744,7 @@
1497 outfilestream.close();
1498
1499}
+
1500
1501void RadiationModel::initializeOptiX() {
1502
@@ -2062,10 +2230,13 @@
1982
1983}
1984
+
1988
+
1989void RadiationModel::updateGeometry( const std::vector<uint>& UUIDs ){
1990
1991 if( message_flag ){
@@ -2566,6 +2737,7 @@
2486 }
2487
2488}
+
2489
2490void RadiationModel::updateRadiativeProperties( const std::vector<std::string> &labels ) {
2491
@@ -3194,11 +3366,14 @@
3114
3115}
3116
+
3117void RadiationModel::runBand( const std::string &label ) {
3118 std::vector<std::string> labels{label};
3119 runBand(labels);
3120}
+
3121
+
3122void RadiationModel::runBand( const std::vector<std::string> &label ) {
3123
3124 //----- VERIFICATIONS -----//
@@ -3804,7 +3979,9 @@
3724 }
3725
3726}
+
3727
+
3729
3730 std::vector<float> Rsky_SW;
@@ -3816,7 +3993,9 @@
3736 return Rsky;
3737
3738}
+
3739
+
3741
3742 std::vector<float> total_flux;
@@ -3843,6 +4022,7 @@
3763 return total_flux;
3764
3765}
+
3766
3767std::vector<float> RadiationModel::getOptiXbufferData( RTbuffer buffer ){
3768
@@ -4916,6 +5096,7 @@
4836
4837}
4838
+
4840
4841 vec3 dir = view_direction;
@@ -4939,12 +5120,14 @@
4859 return Gtheta/total_area;
4860
4861}
+
4862
4863void RadiationModel::setCameraCalibration(CameraCalibration *CameraCalibration){
4864 cameracalibration = CameraCalibration;
4865 calibration_flag = true;
4866}
4867
+
4868void RadiationModel::updateCameraResponse(const std::string &orginalcameralabel, const std::vector<std::string> &sourcelabels_raw,
4869 const std::vector<std::string>& cameraresponselabels, vec2 &wavelengthrange,
4870 const std::vector<std::vector<float>> &truevalues, const std::string &calibratedmark) {
@@ -5061,7 +5244,9 @@
4981 context->setPrimitiveData(UUID, "reflectivity_spectrum", colorboardspectra+"_raw");
4982 }
4983}
+
4984
+
4985void RadiationModel::runRadiationImaging(const std::string& cameralabel, const std::vector<std::string>& sourcelabels, const std::vector<std::string>& bandlabels,
4986 const std::vector<std::string>& cameraresponselabels, helios::vec2 wavelengthrange,
4987 float fluxscale, float diffusefactor, uint scatteringdepth){
@@ -5102,7 +5287,9 @@
5023 RadiationModel::runBand(bandlabels);
5024}
+
5025
+
5026void RadiationModel::runRadiationImaging(const std::vector<std::string>& cameralabels, const std::vector<std::string>& sourcelabels, const std::vector<std::string>& bandlabels,
5027 const std::vector<std::string>& cameraresponselabels, helios::vec2 wavelengthrange,
5028 float fluxscale, float diffusefactor, uint scatteringdepth){
@@ -5146,7 +5333,9 @@
5067 RadiationModel::runBand(bandlabels);
5068}
+
5069
+
5070float RadiationModel::getCameraResponseScale(const std::string &orginalcameralabel, const std::vector<std::string>& cameraresponselabels,
5071 const std::vector<std::string>& bandlabels, const std::vector<std::string> &sourcelabels,
5072 vec2 &wavelengthrange, const std::vector<std::vector<float>> &truevalues){
@@ -5168,8 +5357,10 @@
5088 float camerascale = cameracalibration->getCameraResponseScale(cameralabel, cameraproperties.camera_resolution, bandlabels, truevalues);
5089 return camerascale;
5090}
+
5091
5092
+
5093void RadiationModel::writePrimitiveDataLabelMap(const std::string &cameralabel, const std::string &primitive_data_label, const std::string &imagefile_base, const std::string &image_path, int frame, float padvalue){
5094
5095 if( cameras.find(cameralabel)==cameras.end() ){
@@ -5260,7 +5451,9 @@
5180 }
5181
5182}
+
5183
+
5184void RadiationModel::writeObjectDataLabelMap(const std::string &cameralabel, const std::string &object_data_label, const std::string &imagefile_base, const std::string &image_path, int frame, float padvalue){
5185
5186 if( cameras.find(cameralabel)==cameras.end() ){
@@ -5352,7 +5545,9 @@
5272 }
5273
5274}
+
5275
+
5276void RadiationModel::writeDepthImageData(const std::string &cameralabel, const std::string &imagefile_base, const std::string &image_path, int frame) {
5277
5278 if( cameras.find(cameralabel)==cameras.end() ){
@@ -5408,7 +5603,9 @@
5328 pixel_data.close();
5329
5330}
+
5331
+
5332void RadiationModel::writeNormDepthImage(const std::string &cameralabel, const std::string &imagefile_base, float max_depth, const std::string &image_path, int frame){
5333
5334 if( cameras.find(cameralabel)==cameras.end() ){
@@ -5478,8 +5675,10 @@
5398 writeJPEG( outfile.str(), camera_resolution.x, camera_resolution.y, pixel_data );
5399
5400}
+
5401
5402
+
5403void RadiationModel::writeImageBoundingBoxes(const std::string &cameralabel, const std::string &primitive_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path, bool append_label_file, int frame){
5404
5405 if( cameras.find(cameralabel)==cameras.end() ){
@@ -5579,8 +5778,8 @@
5499 if( bbox.x==bbox.y || bbox.z==bbox.w ){ //filter boxes of zeros size
5500 continue;
5501 }
-
5502 label_file << object_class_ID << " " << (bbox.x + 0.5 * (bbox.y - bbox.x)) / float(camera_resolution.x) << " "
-
5503 << (bbox.z + 0.5 * (bbox.w - bbox.z)) / float(camera_resolution.y) << " " << std::setprecision(6)
+
5502 label_file << object_class_ID << " " << (bbox.x + 0.5 * (bbox.y - bbox.x)) / float(camera_resolution.x) << " "
+
5503 << (bbox.z + 0.5 * (bbox.w - bbox.z)) / float(camera_resolution.y) << " " << std::setprecision(6)
5504 << std::fixed << (bbox.y - bbox.x) / float(camera_resolution.x) << " "
5505 << (bbox.w - bbox.z) / float(camera_resolution.y) << std::endl;
5506 }
@@ -5588,7 +5787,9 @@
5508 label_file.close();
5509
5510}
+
5511
+
5512void RadiationModel::writeImageBoundingBoxes_ObjectData(const std::string &cameralabel, const std::string &object_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path, bool append_label_file, int frame){
5513
5514 if( cameras.find(cameralabel)==cameras.end() ){
@@ -5696,8 +5897,8 @@
5616 if( bbox.x==bbox.y || bbox.z==bbox.w ){ //filter boxes of zeros size
5617 continue;
5618 }
-
5619 label_file << object_class_ID << " " << (bbox.x + 0.5 * (bbox.y - bbox.x)) / float(camera_resolution.x) << " "
-
5620 << (bbox.z + 0.5 * (bbox.w - bbox.z)) / float(camera_resolution.y) << " " << std::setprecision(6)
+
5619 label_file << object_class_ID << " " << (bbox.x + 0.5 * (bbox.y - bbox.x)) / float(camera_resolution.x) << " "
+
5620 << (bbox.z + 0.5 * (bbox.w - bbox.z)) / float(camera_resolution.y) << " " << std::setprecision(6)
5621 << std::fixed << (bbox.y - bbox.x) / float(camera_resolution.x) << " "
5622 << (bbox.w - bbox.z) / float(camera_resolution.y) << std::endl;
5623 }
@@ -5705,8 +5906,10 @@
5625 label_file.close();
5626
5627}
+
5628
5629
+
5630void RadiationModel::setPadValue(const std::string &cameralabel, const std::vector<std::string> &bandlabels, const std::vector<float> &padvalues) {
5631 for (uint b = 0; b < bandlabels.size(); b++) {
5632 std::string bandlabel = bandlabels.at(b);
@@ -5728,7 +5931,9 @@
5648 context->setGlobalData(image_value_label.c_str(), HELIOS_TYPE_FLOAT, cameradata.size(), &cameradata[0]);
5649 }
5650}
+
5651
+
5652void RadiationModel::calibrateCamera(const std::string &originalcameralabel, const std::vector<std::string> &sourcelabels,
5653 const std::vector<std::string>& cameraresplabels_raw, const std::vector<std::string> &bandlabels, const float scalefactor,
5654 const std::vector<std::vector<float>> &truevalues, const std::string &calibratedmark) {
@@ -5767,7 +5972,9 @@
5687 cameracalibration->writeCalibratedCameraResponses(cameraresplabels_raw, calibratedmark, camerascale*scalefactor);
5688
5689}
+
5690
+
5691void RadiationModel::calibrateCamera(const std::string &originalcameralabel, const float scalefactor, const std::vector<std::vector<float>> &truevalues,
5692 const std::string &calibratedmark) {
5693
@@ -5824,6 +6031,7 @@
5744 cameracalibration->writeCalibratedCameraResponses(cameraresplabels_raw, calibratedmark, camerascale*scalefactor);
5745
5746}
+
5747
5748std::vector<helios::vec2> RadiationModel::generateGaussianCameraResponse(float FWHM, float mu, float centrawavelength, const helios::int2 &wavebanrange){
5749
@@ -5868,199 +6076,200 @@
5788 }
5789#endif
5790}
-
HeliosDataType
Data types.
Definition: Context.h:41
-
@ HELIOS_TYPE_DOUBLE
double data type
Definition: Context.h:49
-
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition: Context.h:51
-
@ HELIOS_TYPE_INT
integer data type
Definition: Context.h:43
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
-
PrimitiveType
Type of primitive element.
Definition: Context.h:31
-
@ PRIMITIVE_TYPE_PATCH
< Rectangular primitive
Definition: Context.h:33
-
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition: Context.h:37
-
@ PRIMITIVE_TYPE_TRIANGLE
< Triangular primitive
Definition: Context.h:35
-
@ OBJECT_TYPE_TILE
< Tile
Definition: Context.h:130
+
HeliosDataType
Data types.
Definition Context.h:41
+
@ HELIOS_TYPE_DOUBLE
double data type
Definition Context.h:49
+
@ HELIOS_TYPE_VEC2
helios::vec2 data type
Definition Context.h:51
+
@ HELIOS_TYPE_INT
integer data type
Definition Context.h:43
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
+
PrimitiveType
Type of primitive element.
Definition Context.h:31
+
@ PRIMITIVE_TYPE_PATCH
< Rectangular primitive
Definition Context.h:33
+
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition Context.h:37
+
@ PRIMITIVE_TYPE_TRIANGLE
< Triangular primitive
Definition Context.h:35
+
@ OBJECT_TYPE_TILE
< Tile
Definition Context.h:130
-
helios::SphericalCoord getCameraOrientation(const std::string &camera_label) const
Get the orientation of the radiation camera based on a spherical coordinate.
-
void setSourceSpectrumIntegral(uint source_ID, float source_integral)
Set the integral of the source spectral flux distribution across all possible wavelengths (=∫Sdλ)
-
void deleteRadiationSource(uint sourceID)
Delete an existing radiation source (any type)
-
float calculateGtheta(helios::Context *context, helios::vec3 view_direction)
Calculate G(theta) (i.e., projected area fraction) for a group of primitives given a certain viewing ...
-
void disableMessages()
Disable/silence status messages.
-
void setCameraSpectralResponse(const std::string &camera_label, const std::string &band_label, const std::string &global_data)
Set the spectral response of a camera band based on reference to global data. This function version u...
-
void setSourceFlux(uint source_ID, const std::string &band_label, float flux)
Set the flux of radiation source for this band.
-
void setCameraOrientation(const std::string &camera_label, const helios::vec3 &direction)
Set the orientation of the radiation camera based on a Cartesian vector.
-
void scaleSpectrum(const std::string &existing_global_data_label, const std::string &new_global_data_label, float scale_factor) const
Scale an entire spectrum by a constant factor. Creates new global data for scaled spectrum.
-
void blendSpectraRandomly(const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels) const
Blend one or more spectra together into a new spectrum, with random weights assigned to each input sp...
-
void blendSpectra(const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels, const std::vector< float > &weights) const
Blend one or more spectra together into a new spectrum.
-
uint addSphereRadiationSource(const helios::vec3 &position, float radius)
Add an external source of radiation that emits from the surface of a sphere.
-
void enforcePeriodicBoundary(const std::string &boundary)
Use a periodic boundary condition in one or more lateral directions.
-
std::vector< std::string > getAllCameraLabels()
Get the labels for all radiation cameras that have been added to the radiation model.
-
float integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const
Integrate a spectral distribution between two wavelength bounds.
-
void setDirectRayCount(const std::string &label, size_t N)
Sets variable directRayCount, the number of rays to be used in direct radiation model.
-
void copyRadiationBand(const std::string &old_label, const std::string &new_label)
Copy a spectral radiation band based on a previously created band.
-
void writeCameraImageData(const std::string &camera, const std::string &band, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write camera data for one band to an ASCII text file.
-
void writeImageBoundingBoxes(const std::string &cameralabel, const std::string &primitive_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
Write bounding boxes based on primitive data labels (Ultralytic's YOLO format). Primitive data must h...
-
void enableLightModelVisualization()
Add a 3D model of the light source (rectangular, disk, and sphere) to the Context for visualization p...
-
std::vector< float > getTotalAbsorbedFlux()
Get the total absorbed radiation flux summed over all bands for each primitive.
-
void writeNormCameraImage(const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write normalized camera data (maximum value is 1) for one or more bands to a JPEG image.
-
void writeNormDepthImage(const std::string &cameralabel, const std::string &imagefile_base, float max_depth, const std::string &image_path="./", int frame=-1)
Write depth image file, with grayscale normalized to the minimum and maximum depth values.
-
helios::vec3 getCameraPosition(const std::string &camera_label) const
Get the position of the radiation camera.
-
void setMinScatterEnergy(const std::string &label, uint energy)
Set the energy threshold used to terminate scattering iterations. Scattering iterations are terminate...
-
helios::vec3 getCameraLookat(const std::string &camera_label) const
Get the position the radiation camera is pointed toward (used to calculate camera orientation)
-
void disableCameraModelVisualization()
Remove the 3D model of the camera from the Context.
-
void setDiffuseSpectrumIntegral(float spectrum_integral)
Set the integral of the diffuse spectral flux distribution across all possible wavelengths FOR ALL EX...
-
void setScatteringDepth(const std::string &label, uint depth)
Set the number of scattering iterations for a certain band.
-
void runRadiationImaging(const std::string &cameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)
Run radiation imaging simulation.
-
void setPadValue(const std::string &cameralabel, const std::vector< std::string > &bandlabels, const std::vector< float > &padvalues)
Set padding value for pixels do not have valid values.
-
void disableEmission(const std::string &label)
Disable emission calculations for all primitives in this band.
-
void writePrimitiveDataLabelMap(const std::string &cameralabel, const std::string &primitive_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
Write image pixel labels to text file based on primitive data. Primitive data must have type 'float',...
-
void setSourceSpectrum(uint source_ID, const std::vector< helios::vec2 > &spectrum)
Set the spectral distribution of a radiation source according to a vector of wavelength-intensity pai...
-
void enableEmission(const std::string &label)
Enable emission calculations for all primitives in this band.
-
void runBand(const std::string &label)
Run the simulation for a single radiative band.
-
void setCameraLookat(const std::string &camera_label, const helios::vec3 &lookat)
Set the position the radiation camera is pointed toward (used to calculate camera orientation)
-
uint addSunSphereRadiationSource()
Add a sphere radiation source that models the sun assuming the default direction of (0,...
-
uint addDiskRadiationSource(const helios::vec3 &position, float radius, const helios::vec3 &rotation)
Add planar circular radiation source.
-
bool doesBandExist(const std::string &label) const
Check if a radiation band exists based on its label.
-
float getSkyEnergy()
Get the radiative energy lost to the sky (surroundings)
-
float getSourceFlux(uint source_ID, const std::string &band_label) const
Get the flux of radiation source for this band.
-
void setCameraPosition(const std::string &camera_label, const helios::vec3 &position)
Set the position of the radiation camera.
-
void setSourcePosition(uint source_ID, const helios::vec3 &position)
Set the position/direction of radiation source based on a Cartesian vector.
-
void writeCameraImage(const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float flux_to_pixel_conversion=1.f)
Write camera data for one or more bands to a JPEG image.
-
void setDiffuseRadiationFlux(const std::string &label, float flux)
Diffuse (ambient) radiation flux.
-
void calibrateCamera(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
Calibrate camera.
-
void setDiffuseRayCount(const std::string &label, size_t N)
Sets variable diffuseRayCount, the number of rays to be used in diffuse (ambient) radiation model.
-
helios::vec3 getSourcePosition(uint source_ID) const
Get the position/direction of radiation source.
-
uint addRectangleRadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
Add planar rectangular radiation source.
-
void enableMessages()
Enable status messages.
-
void disableLightModelVisualization()
Remove the 3D model of the light source from the Context.
-
void scaleSpectrumRandomly(const std::string &existing_global_data_label, const std::string &new_global_data_label, float minimum_scale_factor, float maximum_scale_factor) const
Scale an entire spectrum by a random factor following a uniform distribution.
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
void writeImageBoundingBoxes_ObjectData(const std::string &cameralabel, const std::string &object_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
Write bounding boxes based on object data labels (Ultralytic's YOLO format). Object data must have ty...
-
void setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::vec3 &peak_dir)
Extinction coefficient of diffuse ambient radiation.
-
void updateGeometry()
Adds all geometric primitives from the Context to OptiX.
-
RadiationModel(helios::Context *context)
Default constructor.
-
void addRadiationBand(const std::string &label)
Add a spectral radiation band to the model.
-
void enableCameraModelVisualization()
Add a 3D model of the camera to the Context for visualization purposes.
-
void writeDepthImageData(const std::string &cameralabel, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write depth image data to text file.
-
float getCameraResponseScale(const std::string &orginalcameralabel, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &sourcelabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues)
Get the scale factor of the camera response for a given camera.
-
uint addCollimatedRadiationSource()
Add an external source of collimated radiation (i.e., source at infinite distance with parallel rays)...
-
~RadiationModel()
Destructor.
-
void addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)
Add a radiation camera sensor.
-
void setDiffuseSpectrum(const std::string &spectrum_label)
Set the spectral distribution of diffuse ambient radiation FOR ALL BANDS based on global data of wave...
-
float getDiffuseFlux(const std::string &band_label) const
Get the diffuse flux for a given band.
-
void updateCameraResponse(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels_raw, const std::vector< std::string > &cameraresponselabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
Update the camera response for a given camera based on color board.
-
float integrateSourceSpectrum(uint source_ID, float wavelength1, float wavelength2) const
Integrate a source spectral distribution between two wavelength bounds.
-
void writeObjectDataLabelMap(const std::string &cameralabel, const std::string &object_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
Write image pixel labels to text file based on object data. Object data must have type 'float',...
-
helios::ObjectType getObjectType() const
Get an enumeration specifying the type of the object.
Definition: Context.cpp:2247
-
void getTransformationMatrix(float(&T)[16]) const
Method to return the Affine transformation matrix of a Compound Object.
Definition: Context.cpp:2503
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void getPrimitiveTransformationMatrix(uint UUID, float(&T)[16]) const
Method to return the Affine transformation matrix of a Primitive.
Definition: Context.cpp:7108
-
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
-
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition: Context.cpp:1406
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
-
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:7017
-
std::vector< uint > getAllObjectIDs() const
Get the IDs for all Compound Objects in the Context.
Definition: Context.cpp:2589
-
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
-
void getDomainBoundingSphere(helios::vec3 &center, float &radius) const
Get the center and radius of a sphere that bounds all primitives in the domain.
Definition: Context.cpp:2116
-
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition: Context.cpp:2574
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition: Context.cpp:7159
-
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition: Context.cpp:7175
-
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition: Context.cpp:7179
-
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition: Context.cpp:1420
-
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
-
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition: Context.cpp:6984
-
helios::vec3 getVoxelSize(uint UUID) const
Get the size of a voxel element.
Definition: Context.cpp:1741
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
-
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition: Context.cpp:2046
-
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
-
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition: Context.cpp:7187
-
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition: Context.cpp:2585
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
void setGlobalData(const char *label, const int &data)
Add global data value (int)
-
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition: Context.cpp:1491
-
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition: Context.cpp:7104
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
helios::vec3 getVoxelCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a voxel element.
Definition: Context.cpp:1750
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition: Context.cpp:3312
-
static bool scanXMLForTag(const std::string &filename, const std::string &tag, const std::string &label="")
Scan a Helios XML file to check if a tag exists.
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
-
helios::int2 getSubdivisionCount() const
Get the number of sub-patch divisions of the tile.
Definition: Context.cpp:3343
-
std::vector< helios::vec3 > getVertices() const
Get the Cartesian coordinates of each of the four corners of the tile object.
Definition: Context.cpp:3352
-
float interp1(const std::vector< helios::vec2 > &points, float x)
Function to perform linear interpolation based on a vector of discrete (x,y) values.
Definition: global.cpp:3022
-
bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
Definition: global.cpp:3102
-
std::string getFileName(const std::string &filepath)
Parse a file string to get the filename including extension.
Definition: global.cpp:3085
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
void writeJPEG(const std::string &filename, uint width, uint height, const std::vector< helios::RGBcolor > &pixel_data)
Function to write a JPEG image based on pixel data.
Definition: global.cpp:1868
-
std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
Function to flatten a 2D int vector into a 1D vector.
Definition: global.cpp:1943
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition: global.cpp:617
-
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:241
-
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition: global.cpp:1069
-
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition: Context.cpp:1759
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
vec4 make_vec4(float x, float y, float z, float w)
Make a vec4 from three floats.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
Camera calibration structure used for camera calibration tasks.
-
void writeCalibratedCameraResponses(const std::vector< std::string > &camerareponselabels, const std::string &calibratemark, float scale)
Write calibrated camera response spectra.
-
float getCameraResponseScale(const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector< std::string > &bandlabels, const std::vector< std::vector< float > > &truevalues)
Get camera spectral response scale.
-
std::vector< uint > addDefaultColorboard(const helios::vec3 &centrelocation, float patchsize=0.5, const helios::vec3 &rotationrad=helios::make_vec3(0, 0, 0))
Set reflectivity for a specific UUID.
-
void preprocessSpectra(const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameralabels, std::vector< std::string > &objectlabels, helios::vec2 &wavelengthrange, const std::string &targetlabel="")
Preprocess all spectra for modelling.
-
std::vector< float > updateCameraResponseSpectra(const std::vector< std::string > &camerareponselabels, const std::string &label, const std::map< uint, std::vector< helios::vec2 > > &simulatedinputspectra, const std::vector< std::vector< float > > &truevalues)
Update camera response spectra.
-
Properties defining a radiation camera.
-
helios::int2 camera_resolution
Camera sensor resolution (number of pixels) in the horizontal (.x) and vertical (....
-
float focal_plane_distance
Distance from the viewing plane to the focal plane.
-
float HFOV
Camera horizontal field of view in degrees.
-
float lens_diameter
Diameter of the camera lens (lens_diameter = 0 gives a 'pinhole' camera with everything in focus)
-
float FOV_aspect_ratio
Physical dimensions of the pixel array sensor in the horizontal (.x) and vertical (....
-
Properties defining a radiation band.
-
helios::vec2 wavebandBounds
Waveband range of band.
-
std::string label
Label for band.
-
Data object for a radiation camera.
-
Radiation source data object.
-
std::vector< helios::vec2 > source_spectrum
Spectral distribution of radiation source. Each element of the vector is a wavelength band,...
-
helios::vec2 source_width
Widths for each radiation source (N/A for collimated sources)
-
helios::vec3 source_position
Positions of radiation source.
-
float source_flux_scaling_factor
Source flux factors used to scale flux in case of a sun sphere source.
-
helios::vec3 source_rotation
Rotation (rx,ry,rz) for radiation source (area sources only)
-
RadiationSourceType source_type
Types of all radiation sources.
-
std::map< std::string, float > source_fluxes
Fluxes of radiation source for all bands.
-
R-G-B color vector.
-
void scale(float scale_factor)
Scale RGBcolor by some factor.
-
Vector of spherical coordinates (elevation,azimuth)
-
const float & zenith
Zenithal angle (radians)
-
const float & elevation
Elevation angle (radians)
-
float azimuth
Azimuthal angle (radians)
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
vec3 normalize()
Normalize vector components such that the magnitude is unity.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
-
float magnitude() const
Compute the vector magnitude.
-
Vector of four elements of type 'float'.
-
float y
Second element in vector.
-
float w
Fourth element in vector.
-
float z
Third element in vector.
-
float x
First element in vector.
+
helios::SphericalCoord getCameraOrientation(const std::string &camera_label) const
Get the orientation of the radiation camera based on a spherical coordinate.
+
void setSourceSpectrumIntegral(uint source_ID, float source_integral)
Set the integral of the source spectral flux distribution across all possible wavelengths (=∫Sdλ)
+
void deleteRadiationSource(uint sourceID)
Delete an existing radiation source (any type)
+
float calculateGtheta(helios::Context *context, helios::vec3 view_direction)
Calculate G(theta) (i.e., projected area fraction) for a group of primitives given a certain viewing ...
+
void disableMessages()
Disable/silence status messages.
+
void setCameraSpectralResponse(const std::string &camera_label, const std::string &band_label, const std::string &global_data)
Set the spectral response of a camera band based on reference to global data. This function version u...
+
void setSourceFlux(uint source_ID, const std::string &band_label, float flux)
Set the flux of radiation source for this band.
+
void setCameraOrientation(const std::string &camera_label, const helios::vec3 &direction)
Set the orientation of the radiation camera based on a Cartesian vector.
+
void scaleSpectrum(const std::string &existing_global_data_label, const std::string &new_global_data_label, float scale_factor) const
Scale an entire spectrum by a constant factor. Creates new global data for scaled spectrum.
+
void blendSpectraRandomly(const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels) const
Blend one or more spectra together into a new spectrum, with random weights assigned to each input sp...
+
void blendSpectra(const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels, const std::vector< float > &weights) const
Blend one or more spectra together into a new spectrum.
+
uint addSphereRadiationSource(const helios::vec3 &position, float radius)
Add an external source of radiation that emits from the surface of a sphere.
+
void enforcePeriodicBoundary(const std::string &boundary)
Use a periodic boundary condition in one or more lateral directions.
+
std::vector< std::string > getAllCameraLabels()
Get the labels for all radiation cameras that have been added to the radiation model.
+
float integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const
Integrate a spectral distribution between two wavelength bounds.
+
void setDirectRayCount(const std::string &label, size_t N)
Sets variable directRayCount, the number of rays to be used in direct radiation model.
+
void copyRadiationBand(const std::string &old_label, const std::string &new_label)
Copy a spectral radiation band based on a previously created band.
+
void writeCameraImageData(const std::string &camera, const std::string &band, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write camera data for one band to an ASCII text file.
+
void writeImageBoundingBoxes(const std::string &cameralabel, const std::string &primitive_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
Write bounding boxes based on primitive data labels (Ultralytic's YOLO format). Primitive data must h...
+
void enableLightModelVisualization()
Add a 3D model of the light source (rectangular, disk, and sphere) to the Context for visualization p...
+
std::vector< float > getTotalAbsorbedFlux()
Get the total absorbed radiation flux summed over all bands for each primitive.
+
void writeNormCameraImage(const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write normalized camera data (maximum value is 1) for one or more bands to a JPEG image.
+
void writeNormDepthImage(const std::string &cameralabel, const std::string &imagefile_base, float max_depth, const std::string &image_path="./", int frame=-1)
Write depth image file, with grayscale normalized to the minimum and maximum depth values.
+
helios::vec3 getCameraPosition(const std::string &camera_label) const
Get the position of the radiation camera.
+
void setMinScatterEnergy(const std::string &label, uint energy)
Set the energy threshold used to terminate scattering iterations. Scattering iterations are terminate...
+
helios::vec3 getCameraLookat(const std::string &camera_label) const
Get the position the radiation camera is pointed toward (used to calculate camera orientation)
+
void disableCameraModelVisualization()
Remove the 3D model of the camera from the Context.
+
void setDiffuseSpectrumIntegral(float spectrum_integral)
Set the integral of the diffuse spectral flux distribution across all possible wavelengths FOR ALL EX...
+
void setScatteringDepth(const std::string &label, uint depth)
Set the number of scattering iterations for a certain band.
+
void runRadiationImaging(const std::string &cameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)
Run radiation imaging simulation.
+
void setPadValue(const std::string &cameralabel, const std::vector< std::string > &bandlabels, const std::vector< float > &padvalues)
Set padding value for pixels do not have valid values.
+
void disableEmission(const std::string &label)
Disable emission calculations for all primitives in this band.
+
void writePrimitiveDataLabelMap(const std::string &cameralabel, const std::string &primitive_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
Write image pixel labels to text file based on primitive data. Primitive data must have type 'float',...
+
void setSourceSpectrum(uint source_ID, const std::vector< helios::vec2 > &spectrum)
Set the spectral distribution of a radiation source according to a vector of wavelength-intensity pai...
+
void enableEmission(const std::string &label)
Enable emission calculations for all primitives in this band.
+
void runBand(const std::string &label)
Run the simulation for a single radiative band.
+
void setCameraLookat(const std::string &camera_label, const helios::vec3 &lookat)
Set the position the radiation camera is pointed toward (used to calculate camera orientation)
+
uint addSunSphereRadiationSource()
Add a sphere radiation source that models the sun assuming the default direction of (0,...
+
uint addDiskRadiationSource(const helios::vec3 &position, float radius, const helios::vec3 &rotation)
Add planar circular radiation source.
+
bool doesBandExist(const std::string &label) const
Check if a radiation band exists based on its label.
+
float getSkyEnergy()
Get the radiative energy lost to the sky (surroundings)
+
float getSourceFlux(uint source_ID, const std::string &band_label) const
Get the flux of radiation source for this band.
+
void setCameraPosition(const std::string &camera_label, const helios::vec3 &position)
Set the position of the radiation camera.
+
void setSourcePosition(uint source_ID, const helios::vec3 &position)
Set the position/direction of radiation source based on a Cartesian vector.
+
void writeCameraImage(const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float flux_to_pixel_conversion=1.f)
Write camera data for one or more bands to a JPEG image.
+
void setDiffuseRadiationFlux(const std::string &label, float flux)
Diffuse (ambient) radiation flux.
+
void calibrateCamera(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
Calibrate camera.
+
void setDiffuseRayCount(const std::string &label, size_t N)
Sets variable diffuseRayCount, the number of rays to be used in diffuse (ambient) radiation model.
+
helios::vec3 getSourcePosition(uint source_ID) const
Get the position/direction of radiation source.
+
uint addRectangleRadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
Add planar rectangular radiation source.
+
void enableMessages()
Enable status messages.
+
void disableLightModelVisualization()
Remove the 3D model of the light source from the Context.
+
void scaleSpectrumRandomly(const std::string &existing_global_data_label, const std::string &new_global_data_label, float minimum_scale_factor, float maximum_scale_factor) const
Scale an entire spectrum by a random factor following a uniform distribution.
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
void writeImageBoundingBoxes_ObjectData(const std::string &cameralabel, const std::string &object_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
Write bounding boxes based on object data labels (Ultralytic's YOLO format). Object data must have ty...
+
void setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::vec3 &peak_dir)
Extinction coefficient of diffuse ambient radiation.
+
void updateGeometry()
Adds all geometric primitives from the Context to OptiX.
+
RadiationModel(helios::Context *context)
Default constructor.
+
void addRadiationBand(const std::string &label)
Add a spectral radiation band to the model.
+
void enableCameraModelVisualization()
Add a 3D model of the camera to the Context for visualization purposes.
+
void writeDepthImageData(const std::string &cameralabel, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write depth image data to text file.
+
float getCameraResponseScale(const std::string &orginalcameralabel, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &sourcelabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues)
Get the scale factor of the camera response for a given camera.
+
uint addCollimatedRadiationSource()
Add an external source of collimated radiation (i.e., source at infinite distance with parallel rays)...
+
~RadiationModel()
Destructor.
+
void addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)
Add a radiation camera sensor.
+
void setDiffuseSpectrum(const std::string &spectrum_label)
Set the spectral distribution of diffuse ambient radiation FOR ALL BANDS based on global data of wave...
+
float getDiffuseFlux(const std::string &band_label) const
Get the diffuse flux for a given band.
+
void updateCameraResponse(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels_raw, const std::vector< std::string > &cameraresponselabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
Update the camera response for a given camera based on color board.
+
float integrateSourceSpectrum(uint source_ID, float wavelength1, float wavelength2) const
Integrate a source spectral distribution between two wavelength bounds.
+
void writeObjectDataLabelMap(const std::string &cameralabel, const std::string &object_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
Write image pixel labels to text file based on object data. Object data must have type 'float',...
+
helios::ObjectType getObjectType() const
Get an enumeration specifying the type of the object.
Definition Context.cpp:2247
+
void getTransformationMatrix(float(&T)[16]) const
Method to return the Affine transformation matrix of a Compound Object.
Definition Context.cpp:2503
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void getPrimitiveTransformationMatrix(uint UUID, float(&T)[16]) const
Method to return the Affine transformation matrix of a Primitive.
Definition Context.cpp:7108
+
std::vector< uint > loadXML(const char *filename, bool quiet=false)
Load inputs specified in an XML file.
+
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition Context.cpp:1406
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
+
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:7017
+
std::vector< uint > getAllObjectIDs() const
Get the IDs for all Compound Objects in the Context.
Definition Context.cpp:2589
+
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
+
void getDomainBoundingSphere(helios::vec3 &center, float &radius) const
Get the center and radius of a sphere that bounds all primitives in the domain.
Definition Context.cpp:2116
+
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition Context.cpp:2574
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition Context.cpp:7159
+
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition Context.cpp:7175
+
bool primitiveTextureHasTransparencyChannel(uint UUID) const
Check if primitive texture map has a transparency channel.
Definition Context.cpp:7179
+
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition Context.cpp:1420
+
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
+
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition Context.cpp:6984
+
helios::vec3 getVoxelSize(uint UUID) const
Get the size of a voxel element.
Definition Context.cpp:1741
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< uint > loadOBJ(const char *filename, bool silent=false)
Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
+
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition Context.cpp:2046
+
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
+
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData(uint UUID) const
Get the transparency channel pixel data from primitive texture map. If transparency channel does not ...
Definition Context.cpp:7187
+
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition Context.cpp:2585
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
void setGlobalData(const char *label, const int &data)
Add global data value (int)
+
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition Context.cpp:1491
+
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition Context.cpp:7104
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
helios::vec3 getVoxelCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a voxel element.
Definition Context.cpp:1750
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition Context.cpp:3312
+
static bool scanXMLForTag(const std::string &filename, const std::string &tag, const std::string &label="")
Scan a Helios XML file to check if a tag exists.
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
+
helios::int2 getSubdivisionCount() const
Get the number of sub-patch divisions of the tile.
Definition Context.cpp:3343
+
std::vector< helios::vec3 > getVertices() const
Get the Cartesian coordinates of each of the four corners of the tile object.
Definition Context.cpp:3352
+
float interp1(const std::vector< helios::vec2 > &points, float x)
Function to perform linear interpolation based on a vector of discrete (x,y) values.
Definition global.cpp:3022
+
bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
Definition global.cpp:3102
+
std::string getFileName(const std::string &filepath)
Parse a file string to get the filename including extension.
Definition global.cpp:3085
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
void writeJPEG(const std::string &filename, uint width, uint height, const std::vector< helios::RGBcolor > &pixel_data)
Function to write a JPEG image based on pixel data.
Definition global.cpp:1868
+
std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
Function to flatten a 2D int vector into a 1D vector.
Definition global.cpp:1943
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition global.cpp:617
+
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:241
+
float sum(const std::vector< float > &vect)
Sum of a vector of floats.
Definition global.cpp:1069
+
uint getPrimitiveCount() const
Get the total number of Primitives in the Context.
Definition Context.cpp:1759
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
vec4 make_vec4(float x, float y, float z, float w)
Make a vec4 from three floats.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
Camera calibration structure used for camera calibration tasks.
+
void writeCalibratedCameraResponses(const std::vector< std::string > &camerareponselabels, const std::string &calibratemark, float scale)
Write calibrated camera response spectra.
+
float getCameraResponseScale(const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector< std::string > &bandlabels, const std::vector< std::vector< float > > &truevalues)
Get camera spectral response scale.
+
std::vector< uint > addDefaultColorboard(const helios::vec3 &centrelocation, float patchsize=0.5, const helios::vec3 &rotationrad=helios::make_vec3(0, 0, 0))
Set reflectivity for a specific UUID.
+
void preprocessSpectra(const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameralabels, std::vector< std::string > &objectlabels, helios::vec2 &wavelengthrange, const std::string &targetlabel="")
Preprocess all spectra for modelling.
+
std::vector< float > updateCameraResponseSpectra(const std::vector< std::string > &camerareponselabels, const std::string &label, const std::map< uint, std::vector< helios::vec2 > > &simulatedinputspectra, const std::vector< std::vector< float > > &truevalues)
Update camera response spectra.
+
Properties defining a radiation camera.
+
helios::int2 camera_resolution
Camera sensor resolution (number of pixels) in the horizontal (.x) and vertical (....
+
float focal_plane_distance
Distance from the viewing plane to the focal plane.
+
float HFOV
Camera horizontal field of view in degrees.
+
float lens_diameter
Diameter of the camera lens (lens_diameter = 0 gives a 'pinhole' camera with everything in focus)
+
float FOV_aspect_ratio
Physical dimensions of the pixel array sensor in the horizontal (.x) and vertical (....
+
Properties defining a radiation band.
+
helios::vec2 wavebandBounds
Waveband range of band.
+
std::string label
Label for band.
+
Data object for a radiation camera.
+
Radiation source data object.
+
std::vector< helios::vec2 > source_spectrum
Spectral distribution of radiation source. Each element of the vector is a wavelength band,...
+
helios::vec2 source_width
Widths for each radiation source (N/A for collimated sources)
+
helios::vec3 source_position
Positions of radiation source.
+
float source_flux_scaling_factor
Source flux factors used to scale flux in case of a sun sphere source.
+
helios::vec3 source_rotation
Rotation (rx,ry,rz) for radiation source (area sources only)
+
RadiationSourceType source_type
Types of all radiation sources.
+
std::map< std::string, float > source_fluxes
Fluxes of radiation source for all bands.
+
R-G-B color vector.
+
void scale(float scale_factor)
Scale RGBcolor by some factor.
+
Vector of spherical coordinates (elevation,azimuth)
+
const float & zenith
Zenithal angle (radians)
+
const float & elevation
Elevation angle (radians)
+
float azimuth
Azimuthal angle (radians)
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+
float magnitude() const
Compute the vector magnitude.
+
Vector of four elements of type 'float'.
+
float y
Second element in vector.
+
float w
Fourth element in vector.
+
float z
Third element in vector.
+
float x
First element in vector.
+ diff --git a/doc/html/_radiation_model_8h.html b/doc/html/_radiation_model_8h.html index 87d11754d..f2b38e873 100644 --- a/doc/html/_radiation_model_8h.html +++ b/doc/html/_radiation_model_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Data Structures | @@ -127,12 +139,12 @@ - +

Macros

#define RT_CHECK_ERROR(func)
#define RT_CHECK_ERROR(func)
 
- - +

Enumerations

enum  RadiationSourceType {
+
enum  RadiationSourceType {
  RADIATION_SOURCE_TYPE_COLLIMATED = 0 , RADIATION_SOURCE_TYPE_SPHERE = 1 , RADIATION_SOURCE_TYPE_SUN_SPHERE = 2 @@ -141,14 +153,14 @@   RADIATION_SOURCE_TYPE_DISK = 4
}
 Possible types of radiation sources. More...
 Possible types of radiation sources. More...
 
- + - +

Functions

void sutilHandleError (RTcontext context, RTresult code, const char *file, int line)
void sutilHandleError (RTcontext context, RTresult code, const char *file, int line)
 
void sutilReportError (const char *message)
void sutilReportError (const char *message)
 

Detailed Description

@@ -168,8 +180,7 @@

#define RT_CHECK_ERROR ( -   - func) + func) @@ -192,7 +203,7 @@

- +
enum RadiationSourceTypeenum RadiationSourceType

diff --git a/doc/html/_radiation_model_8h_source.html b/doc/html/_radiation_model_8h_source.html index 640d51ab5..d62207581 100644 --- a/doc/html/_radiation_model_8h_source.html +++ b/doc/html/_radiation_model_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
RadiationModel.h
@@ -107,6 +119,7 @@
27
28#include <utility>
29
+
32
33 bool operator!=(const CameraProperties &rhs) const {
@@ -139,7 +152,9 @@
65 }
66
67};
+
68
+
71
72 //Constructor
@@ -181,10 +196,13 @@
108 std::vector<float> pixel_depth;
109
110};
+
111
+
114public:
115
+
117 explicit RadiationBand( std::string a_label, size_t directRayCount_default, size_t diffuseRayCount_default, float diffuseFlux_default, uint scatteringDepth_default, float minScatterEnergy_default ) : label(std::move(a_label)) {
118 directRayCount = directRayCount_default;
119 diffuseRayCount = diffuseRayCount_default;
@@ -197,6 +215,7 @@
128 }
+
129
131 std::string label;
132
@@ -228,7 +247,9 @@
170
171
172};
+
173
+
176 RADIATION_SOURCE_TYPE_COLLIMATED = 0,
177 RADIATION_SOURCE_TYPE_SPHERE = 1,
@@ -236,10 +257,13 @@
179 RADIATION_SOURCE_TYPE_RECTANGLE = 3,
180 RADIATION_SOURCE_TYPE_DISK = 4
181};
+
182
+
185public:
186
+
188 explicit RadiationSource( const helios::vec3 &position) : source_position(position){
189 source_type = RADIATION_SOURCE_TYPE_COLLIMATED;
190
@@ -247,7 +271,9 @@
194 };
+
195
+
197 RadiationSource( const helios::vec3 &position, float width ) : source_position(position){
198 source_type = RADIATION_SOURCE_TYPE_SPHERE;
199
@@ -257,13 +283,17 @@
205 };
+
206
+
208 RadiationSource( const helios::vec3 &position, float position_scaling_factor, float width, float flux_scaling_factor ) : source_position(position), source_position_scaling_factor(position_scaling_factor), source_flux_scaling_factor(flux_scaling_factor){
209 source_type = RADIATION_SOURCE_TYPE_SUN_SPHERE;
210 source_width = helios::make_vec2(width,width);
211 };
+
212
213
+
215 RadiationSource( const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation ) : source_position(position), source_width(size), source_rotation(rotation){
216 source_type = RADIATION_SOURCE_TYPE_RECTANGLE;
217
@@ -271,7 +301,9 @@
221 };
+
222
+
224 RadiationSource( const helios::vec3 &position, float width, const helios::vec3 &rotation ) : source_position(position), source_rotation(rotation){
225 source_type = RADIATION_SOURCE_TYPE_DISK;
226
@@ -281,6 +313,7 @@
232 };
+
233
236
@@ -301,11 +334,13 @@
258 std::map<std::string,float> source_fluxes;
259
260};
+
261
+
264public:
265
-
267 explicit RadiationModel( helios::Context* context );
+
267 explicit RadiationModel( helios::Context* context );
268
271
@@ -999,6 +1034,7 @@
1654 std::vector<std::string> spectral_library_files;
1655
1656};
+
1657
1658void sutilHandleError(RTcontext context, RTresult code, const char* file, int line);
1659
@@ -1015,126 +1051,128 @@
1670#endif
-
RadiationSourceType
Possible types of radiation sources.
-
Radiation transport model plugin.
-
helios::SphericalCoord getCameraOrientation(const std::string &camera_label) const
Get the orientation of the radiation camera based on a spherical coordinate.
-
void setSourceSpectrumIntegral(uint source_ID, float source_integral)
Set the integral of the source spectral flux distribution across all possible wavelengths (=∫Sdλ)
-
void deleteRadiationSource(uint sourceID)
Delete an existing radiation source (any type)
-
float calculateGtheta(helios::Context *context, helios::vec3 view_direction)
Calculate G(theta) (i.e., projected area fraction) for a group of primitives given a certain viewing ...
-
void disableMessages()
Disable/silence status messages.
-
void setCameraSpectralResponse(const std::string &camera_label, const std::string &band_label, const std::string &global_data)
Set the spectral response of a camera band based on reference to global data. This function version u...
-
void setSourceFlux(uint source_ID, const std::string &band_label, float flux)
Set the flux of radiation source for this band.
-
void setCameraOrientation(const std::string &camera_label, const helios::vec3 &direction)
Set the orientation of the radiation camera based on a Cartesian vector.
-
void scaleSpectrum(const std::string &existing_global_data_label, const std::string &new_global_data_label, float scale_factor) const
Scale an entire spectrum by a constant factor. Creates new global data for scaled spectrum.
-
void blendSpectraRandomly(const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels) const
Blend one or more spectra together into a new spectrum, with random weights assigned to each input sp...
-
void blendSpectra(const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels, const std::vector< float > &weights) const
Blend one or more spectra together into a new spectrum.
-
uint addSphereRadiationSource(const helios::vec3 &position, float radius)
Add an external source of radiation that emits from the surface of a sphere.
-
void enforcePeriodicBoundary(const std::string &boundary)
Use a periodic boundary condition in one or more lateral directions.
-
std::vector< std::string > getAllCameraLabels()
Get the labels for all radiation cameras that have been added to the radiation model.
-
float integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const
Integrate a spectral distribution between two wavelength bounds.
-
void setDirectRayCount(const std::string &label, size_t N)
Sets variable directRayCount, the number of rays to be used in direct radiation model.
-
int selfTest()
Self-test.
Definition: selfTest.cpp:20
-
void copyRadiationBand(const std::string &old_label, const std::string &new_label)
Copy a spectral radiation band based on a previously created band.
-
void writeCameraImageData(const std::string &camera, const std::string &band, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write camera data for one band to an ASCII text file.
-
void writeImageBoundingBoxes(const std::string &cameralabel, const std::string &primitive_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
Write bounding boxes based on primitive data labels (Ultralytic's YOLO format). Primitive data must h...
-
void enableLightModelVisualization()
Add a 3D model of the light source (rectangular, disk, and sphere) to the Context for visualization p...
-
std::vector< float > getTotalAbsorbedFlux()
Get the total absorbed radiation flux summed over all bands for each primitive.
-
void writeNormCameraImage(const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write normalized camera data (maximum value is 1) for one or more bands to a JPEG image.
-
void writeNormDepthImage(const std::string &cameralabel, const std::string &imagefile_base, float max_depth, const std::string &image_path="./", int frame=-1)
Write depth image file, with grayscale normalized to the minimum and maximum depth values.
-
helios::vec3 getCameraPosition(const std::string &camera_label) const
Get the position of the radiation camera.
-
void setMinScatterEnergy(const std::string &label, uint energy)
Set the energy threshold used to terminate scattering iterations. Scattering iterations are terminate...
-
helios::vec3 getCameraLookat(const std::string &camera_label) const
Get the position the radiation camera is pointed toward (used to calculate camera orientation)
-
void disableCameraModelVisualization()
Remove the 3D model of the camera from the Context.
-
void setDiffuseSpectrumIntegral(float spectrum_integral)
Set the integral of the diffuse spectral flux distribution across all possible wavelengths FOR ALL EX...
-
void setScatteringDepth(const std::string &label, uint depth)
Set the number of scattering iterations for a certain band.
-
void runRadiationImaging(const std::string &cameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)
Run radiation imaging simulation.
-
void setPadValue(const std::string &cameralabel, const std::vector< std::string > &bandlabels, const std::vector< float > &padvalues)
Set padding value for pixels do not have valid values.
-
void disableEmission(const std::string &label)
Disable emission calculations for all primitives in this band.
-
void writePrimitiveDataLabelMap(const std::string &cameralabel, const std::string &primitive_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
Write image pixel labels to text file based on primitive data. Primitive data must have type 'float',...
-
void setSourceSpectrum(uint source_ID, const std::vector< helios::vec2 > &spectrum)
Set the spectral distribution of a radiation source according to a vector of wavelength-intensity pai...
-
void enableEmission(const std::string &label)
Enable emission calculations for all primitives in this band.
-
void runBand(const std::string &label)
Run the simulation for a single radiative band.
-
void setCameraLookat(const std::string &camera_label, const helios::vec3 &lookat)
Set the position the radiation camera is pointed toward (used to calculate camera orientation)
-
uint addSunSphereRadiationSource()
Add a sphere radiation source that models the sun assuming the default direction of (0,...
-
uint addDiskRadiationSource(const helios::vec3 &position, float radius, const helios::vec3 &rotation)
Add planar circular radiation source.
-
bool doesBandExist(const std::string &label) const
Check if a radiation band exists based on its label.
-
float getSkyEnergy()
Get the radiative energy lost to the sky (surroundings)
-
float getSourceFlux(uint source_ID, const std::string &band_label) const
Get the flux of radiation source for this band.
-
void setCameraPosition(const std::string &camera_label, const helios::vec3 &position)
Set the position of the radiation camera.
-
void setSourcePosition(uint source_ID, const helios::vec3 &position)
Set the position/direction of radiation source based on a Cartesian vector.
-
void writeCameraImage(const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float flux_to_pixel_conversion=1.f)
Write camera data for one or more bands to a JPEG image.
-
void setDiffuseRadiationFlux(const std::string &label, float flux)
Diffuse (ambient) radiation flux.
-
void calibrateCamera(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
Calibrate camera.
-
void setDiffuseRayCount(const std::string &label, size_t N)
Sets variable diffuseRayCount, the number of rays to be used in diffuse (ambient) radiation model.
-
helios::vec3 getSourcePosition(uint source_ID) const
Get the position/direction of radiation source.
-
uint addRectangleRadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
Add planar rectangular radiation source.
-
void enableMessages()
Enable status messages.
-
void disableLightModelVisualization()
Remove the 3D model of the light source from the Context.
-
void scaleSpectrumRandomly(const std::string &existing_global_data_label, const std::string &new_global_data_label, float minimum_scale_factor, float maximum_scale_factor) const
Scale an entire spectrum by a random factor following a uniform distribution.
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
void writeImageBoundingBoxes_ObjectData(const std::string &cameralabel, const std::string &object_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
Write bounding boxes based on object data labels (Ultralytic's YOLO format). Object data must have ty...
-
void setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::vec3 &peak_dir)
Extinction coefficient of diffuse ambient radiation.
-
void updateGeometry()
Adds all geometric primitives from the Context to OptiX.
-
void addRadiationBand(const std::string &label)
Add a spectral radiation band to the model.
-
void enableCameraModelVisualization()
Add a 3D model of the camera to the Context for visualization purposes.
-
void writeDepthImageData(const std::string &cameralabel, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write depth image data to text file.
-
float getCameraResponseScale(const std::string &orginalcameralabel, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &sourcelabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues)
Get the scale factor of the camera response for a given camera.
-
uint addCollimatedRadiationSource()
Add an external source of collimated radiation (i.e., source at infinite distance with parallel rays)...
-
~RadiationModel()
Destructor.
-
void addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)
Add a radiation camera sensor.
-
void setDiffuseSpectrum(const std::string &spectrum_label)
Set the spectral distribution of diffuse ambient radiation FOR ALL BANDS based on global data of wave...
-
float getDiffuseFlux(const std::string &band_label) const
Get the diffuse flux for a given band.
-
void updateCameraResponse(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels_raw, const std::vector< std::string > &cameraresponselabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
Update the camera response for a given camera based on color board.
-
float integrateSourceSpectrum(uint source_ID, float wavelength1, float wavelength2) const
Integrate a source spectral distribution between two wavelength bounds.
-
void writeObjectDataLabelMap(const std::string &cameralabel, const std::string &object_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
Write image pixel labels to text file based on object data. Object data must have type 'float',...
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
Camera calibration structure used for camera calibration tasks.
-
Properties defining a radiation camera.
-
helios::int2 camera_resolution
Camera sensor resolution (number of pixels) in the horizontal (.x) and vertical (....
-
float focal_plane_distance
Distance from the viewing plane to the focal plane.
-
float HFOV
Camera horizontal field of view in degrees.
-
float lens_diameter
Diameter of the camera lens (lens_diameter = 0 gives a 'pinhole' camera with everything in focus)
-
float FOV_aspect_ratio
Physical dimensions of the pixel array sensor in the horizontal (.x) and vertical (....
-
Properties defining a radiation band.
-
helios::vec2 wavebandBounds
Waveband range of band.
-
uint scatteringDepth
Scattering depth for wave band.
-
std::vector< helios::vec2 > diffuse_spectrum
Spectral distribution of diffuse radiation flux for wave band.
-
RadiationBand(std::string a_label, size_t directRayCount_default, size_t diffuseRayCount_default, float diffuseFlux_default, uint scatteringDepth_default, float minScatterEnergy_default)
Constructor.
-
std::string label
Label for band.
-
float minScatterEnergy
Minimum energy for scattering for wave band.
-
helios::vec3 diffusePeakDir
Direction of peak in ambient diffuse radiation.
-
float diffuseDistNorm
Diffuse distribution normalization factor.
-
float diffuseExtinction
Distribution coefficient of ambient diffuse radiation for wave band.
-
float diffuseFlux
Diffuse component of radiation flux integrated over wave band.
-
bool radiativepropertiesinitialized
Flag to indicate whether radiative bands have been initialized for this band.
-
bool emissionFlag
Flag that determines if emission calculations are performed for wave band.
-
size_t diffuseRayCount
Number of diffuse rays launched per element.
-
size_t directRayCount
Number of direct rays launched per element.
-
Data object for a radiation camera.
-
Radiation source data object.
-
RadiationSource(const helios::vec3 &position, float position_scaling_factor, float width, float flux_scaling_factor)
Constructor for sun sphere radiation source.
-
float source_position_scaling_factor
Source position factors used to scale position in case of a sun sphere source.
-
RadiationSource(const helios::vec3 &position)
Constructor for collimated radiation source.
-
std::vector< helios::vec2 > source_spectrum
Spectral distribution of radiation source. Each element of the vector is a wavelength band,...
-
helios::vec2 source_width
Widths for each radiation source (N/A for collimated sources)
-
RadiationSource(const helios::vec3 &position, float width)
Constructor for spherical radiation source.
-
helios::vec3 source_position
Positions of radiation source.
-
RadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
Constructor for rectangular radiation source.
-
float source_flux_scaling_factor
Source flux factors used to scale flux in case of a sun sphere source.
-
helios::vec3 source_rotation
Rotation (rx,ry,rz) for radiation source (area sources only)
-
RadiationSourceType source_type
Types of all radiation sources.
-
RadiationSource(const helios::vec3 &position, float width, const helios::vec3 &rotation)
Constructor for disk radiation source.
-
std::map< std::string, float > source_fluxes
Fluxes of radiation source for all bands.
-
Vector of spherical coordinates (elevation,azimuth)
-
Vector of two elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+
RadiationSourceType
Possible types of radiation sources.
+
Radiation transport model plugin.
+
helios::SphericalCoord getCameraOrientation(const std::string &camera_label) const
Get the orientation of the radiation camera based on a spherical coordinate.
+
void setSourceSpectrumIntegral(uint source_ID, float source_integral)
Set the integral of the source spectral flux distribution across all possible wavelengths (=∫Sdλ)
+
void deleteRadiationSource(uint sourceID)
Delete an existing radiation source (any type)
+
float calculateGtheta(helios::Context *context, helios::vec3 view_direction)
Calculate G(theta) (i.e., projected area fraction) for a group of primitives given a certain viewing ...
+
void disableMessages()
Disable/silence status messages.
+
void setCameraSpectralResponse(const std::string &camera_label, const std::string &band_label, const std::string &global_data)
Set the spectral response of a camera band based on reference to global data. This function version u...
+
void setSourceFlux(uint source_ID, const std::string &band_label, float flux)
Set the flux of radiation source for this band.
+
void setCameraOrientation(const std::string &camera_label, const helios::vec3 &direction)
Set the orientation of the radiation camera based on a Cartesian vector.
+
void scaleSpectrum(const std::string &existing_global_data_label, const std::string &new_global_data_label, float scale_factor) const
Scale an entire spectrum by a constant factor. Creates new global data for scaled spectrum.
+
void blendSpectraRandomly(const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels) const
Blend one or more spectra together into a new spectrum, with random weights assigned to each input sp...
+
void blendSpectra(const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels, const std::vector< float > &weights) const
Blend one or more spectra together into a new spectrum.
+
uint addSphereRadiationSource(const helios::vec3 &position, float radius)
Add an external source of radiation that emits from the surface of a sphere.
+
void enforcePeriodicBoundary(const std::string &boundary)
Use a periodic boundary condition in one or more lateral directions.
+
std::vector< std::string > getAllCameraLabels()
Get the labels for all radiation cameras that have been added to the radiation model.
+
float integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const
Integrate a spectral distribution between two wavelength bounds.
+
void setDirectRayCount(const std::string &label, size_t N)
Sets variable directRayCount, the number of rays to be used in direct radiation model.
+
int selfTest()
Self-test.
Definition selfTest.cpp:20
+
void copyRadiationBand(const std::string &old_label, const std::string &new_label)
Copy a spectral radiation band based on a previously created band.
+
void writeCameraImageData(const std::string &camera, const std::string &band, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write camera data for one band to an ASCII text file.
+
void writeImageBoundingBoxes(const std::string &cameralabel, const std::string &primitive_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
Write bounding boxes based on primitive data labels (Ultralytic's YOLO format). Primitive data must h...
+
void enableLightModelVisualization()
Add a 3D model of the light source (rectangular, disk, and sphere) to the Context for visualization p...
+
std::vector< float > getTotalAbsorbedFlux()
Get the total absorbed radiation flux summed over all bands for each primitive.
+
void writeNormCameraImage(const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write normalized camera data (maximum value is 1) for one or more bands to a JPEG image.
+
void writeNormDepthImage(const std::string &cameralabel, const std::string &imagefile_base, float max_depth, const std::string &image_path="./", int frame=-1)
Write depth image file, with grayscale normalized to the minimum and maximum depth values.
+
helios::vec3 getCameraPosition(const std::string &camera_label) const
Get the position of the radiation camera.
+
void setMinScatterEnergy(const std::string &label, uint energy)
Set the energy threshold used to terminate scattering iterations. Scattering iterations are terminate...
+
helios::vec3 getCameraLookat(const std::string &camera_label) const
Get the position the radiation camera is pointed toward (used to calculate camera orientation)
+
void disableCameraModelVisualization()
Remove the 3D model of the camera from the Context.
+
void setDiffuseSpectrumIntegral(float spectrum_integral)
Set the integral of the diffuse spectral flux distribution across all possible wavelengths FOR ALL EX...
+
void setScatteringDepth(const std::string &label, uint depth)
Set the number of scattering iterations for a certain band.
+
void runRadiationImaging(const std::string &cameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)
Run radiation imaging simulation.
+
void setPadValue(const std::string &cameralabel, const std::vector< std::string > &bandlabels, const std::vector< float > &padvalues)
Set padding value for pixels do not have valid values.
+
void disableEmission(const std::string &label)
Disable emission calculations for all primitives in this band.
+
void writePrimitiveDataLabelMap(const std::string &cameralabel, const std::string &primitive_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
Write image pixel labels to text file based on primitive data. Primitive data must have type 'float',...
+
void setSourceSpectrum(uint source_ID, const std::vector< helios::vec2 > &spectrum)
Set the spectral distribution of a radiation source according to a vector of wavelength-intensity pai...
+
void enableEmission(const std::string &label)
Enable emission calculations for all primitives in this band.
+
void runBand(const std::string &label)
Run the simulation for a single radiative band.
+
void setCameraLookat(const std::string &camera_label, const helios::vec3 &lookat)
Set the position the radiation camera is pointed toward (used to calculate camera orientation)
+
uint addSunSphereRadiationSource()
Add a sphere radiation source that models the sun assuming the default direction of (0,...
+
uint addDiskRadiationSource(const helios::vec3 &position, float radius, const helios::vec3 &rotation)
Add planar circular radiation source.
+
bool doesBandExist(const std::string &label) const
Check if a radiation band exists based on its label.
+
float getSkyEnergy()
Get the radiative energy lost to the sky (surroundings)
+
float getSourceFlux(uint source_ID, const std::string &band_label) const
Get the flux of radiation source for this band.
+
void setCameraPosition(const std::string &camera_label, const helios::vec3 &position)
Set the position of the radiation camera.
+
void setSourcePosition(uint source_ID, const helios::vec3 &position)
Set the position/direction of radiation source based on a Cartesian vector.
+
void writeCameraImage(const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float flux_to_pixel_conversion=1.f)
Write camera data for one or more bands to a JPEG image.
+
void setDiffuseRadiationFlux(const std::string &label, float flux)
Diffuse (ambient) radiation flux.
+
void calibrateCamera(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
Calibrate camera.
+
void setDiffuseRayCount(const std::string &label, size_t N)
Sets variable diffuseRayCount, the number of rays to be used in diffuse (ambient) radiation model.
+
helios::vec3 getSourcePosition(uint source_ID) const
Get the position/direction of radiation source.
+
uint addRectangleRadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
Add planar rectangular radiation source.
+
void enableMessages()
Enable status messages.
+
void disableLightModelVisualization()
Remove the 3D model of the light source from the Context.
+
void scaleSpectrumRandomly(const std::string &existing_global_data_label, const std::string &new_global_data_label, float minimum_scale_factor, float maximum_scale_factor) const
Scale an entire spectrum by a random factor following a uniform distribution.
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
void writeImageBoundingBoxes_ObjectData(const std::string &cameralabel, const std::string &object_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
Write bounding boxes based on object data labels (Ultralytic's YOLO format). Object data must have ty...
+
void setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::vec3 &peak_dir)
Extinction coefficient of diffuse ambient radiation.
+
void updateGeometry()
Adds all geometric primitives from the Context to OptiX.
+
RadiationModel(helios::Context *context)
Default constructor.
+
void addRadiationBand(const std::string &label)
Add a spectral radiation band to the model.
+
void enableCameraModelVisualization()
Add a 3D model of the camera to the Context for visualization purposes.
+
void writeDepthImageData(const std::string &cameralabel, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
Write depth image data to text file.
+
float getCameraResponseScale(const std::string &orginalcameralabel, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &sourcelabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues)
Get the scale factor of the camera response for a given camera.
+
uint addCollimatedRadiationSource()
Add an external source of collimated radiation (i.e., source at infinite distance with parallel rays)...
+
~RadiationModel()
Destructor.
+
void addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)
Add a radiation camera sensor.
+
void setDiffuseSpectrum(const std::string &spectrum_label)
Set the spectral distribution of diffuse ambient radiation FOR ALL BANDS based on global data of wave...
+
float getDiffuseFlux(const std::string &band_label) const
Get the diffuse flux for a given band.
+
void updateCameraResponse(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels_raw, const std::vector< std::string > &cameraresponselabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
Update the camera response for a given camera based on color board.
+
float integrateSourceSpectrum(uint source_ID, float wavelength1, float wavelength2) const
Integrate a source spectral distribution between two wavelength bounds.
+
void writeObjectDataLabelMap(const std::string &cameralabel, const std::string &object_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
Write image pixel labels to text file based on object data. Object data must have type 'float',...
+
Stores the state associated with simulation.
Definition Context.h:1882
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
Camera calibration structure used for camera calibration tasks.
+
Properties defining a radiation camera.
+
helios::int2 camera_resolution
Camera sensor resolution (number of pixels) in the horizontal (.x) and vertical (....
+
float focal_plane_distance
Distance from the viewing plane to the focal plane.
+
float HFOV
Camera horizontal field of view in degrees.
+
float lens_diameter
Diameter of the camera lens (lens_diameter = 0 gives a 'pinhole' camera with everything in focus)
+
float FOV_aspect_ratio
Physical dimensions of the pixel array sensor in the horizontal (.x) and vertical (....
+
Properties defining a radiation band.
+
helios::vec2 wavebandBounds
Waveband range of band.
+
uint scatteringDepth
Scattering depth for wave band.
+
std::vector< helios::vec2 > diffuse_spectrum
Spectral distribution of diffuse radiation flux for wave band.
+
RadiationBand(std::string a_label, size_t directRayCount_default, size_t diffuseRayCount_default, float diffuseFlux_default, uint scatteringDepth_default, float minScatterEnergy_default)
Constructor.
+
std::string label
Label for band.
+
float minScatterEnergy
Minimum energy for scattering for wave band.
+
helios::vec3 diffusePeakDir
Direction of peak in ambient diffuse radiation.
+
float diffuseDistNorm
Diffuse distribution normalization factor.
+
float diffuseExtinction
Distribution coefficient of ambient diffuse radiation for wave band.
+
float diffuseFlux
Diffuse component of radiation flux integrated over wave band.
+
bool radiativepropertiesinitialized
Flag to indicate whether radiative bands have been initialized for this band.
+
bool emissionFlag
Flag that determines if emission calculations are performed for wave band.
+
size_t diffuseRayCount
Number of diffuse rays launched per element.
+
size_t directRayCount
Number of direct rays launched per element.
+
Data object for a radiation camera.
+
Radiation source data object.
+
RadiationSource(const helios::vec3 &position, float position_scaling_factor, float width, float flux_scaling_factor)
Constructor for sun sphere radiation source.
+
float source_position_scaling_factor
Source position factors used to scale position in case of a sun sphere source.
+
RadiationSource(const helios::vec3 &position)
Constructor for collimated radiation source.
+
std::vector< helios::vec2 > source_spectrum
Spectral distribution of radiation source. Each element of the vector is a wavelength band,...
+
helios::vec2 source_width
Widths for each radiation source (N/A for collimated sources)
+
RadiationSource(const helios::vec3 &position, float width)
Constructor for spherical radiation source.
+
helios::vec3 source_position
Positions of radiation source.
+
RadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
Constructor for rectangular radiation source.
+
float source_flux_scaling_factor
Source flux factors used to scale flux in case of a sun sphere source.
+
helios::vec3 source_rotation
Rotation (rx,ry,rz) for radiation source (area sources only)
+
RadiationSourceType source_type
Types of all radiation sources.
+
RadiationSource(const helios::vec3 &position, float width, const helios::vec3 &rotation)
Constructor for disk radiation source.
+
std::map< std::string, float > source_fluxes
Fluxes of radiation source for all bands.
+
Vector of spherical coordinates (elevation,azimuth)
+
Vector of two elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_ray_tracing_8cu_8h.html b/doc/html/_ray_tracing_8cu_8h.html index 77239ba10..ef4346373 100644 --- a/doc/html/_ray_tracing_8cu_8h.html +++ b/doc/html/_ray_tracing_8cu_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
RayTracing.cu.h File Reference
@@ -107,45 +118,40 @@ - +

Macros

#define M_PI   3.14159265358979323846
#define M_PI   3.14159265358979323846
 
- - - -

-Typedefs

typedef unsigned int uint
 
- - + - + - + - + - + - + - + - + - + - + - + - +

Functions

+
void queryGPUMemory (void)
 
__device__ __inline__ void atomicFloatAdd (float *address, float val)
__device__ __inline__ void atomicFloatAdd (float *address, float val)
 
__device__ __inline__ double atomicAdd (double *address, double val)
__device__ __inline__ double atomicAdd (double *address, double val)
 
__device__ float3 d_rotatePoint (const float3 &position, const float &theta, const float &phi)
__device__ float3 d_rotatePoint (const float3 &position, const float &theta, const float &phi)
 
__device__ void d_makeTransformMatrix (optix::float3 rotation, float(&T)[16])
__device__ void d_makeTransformMatrix (optix::float3 rotation, float(&T)[16])
 
__device__ void d_invertMatrix (const float *m, float *minv)
__device__ void d_invertMatrix (const float *m, float *minv)
 
__device__ void d_transformPoint (const float(&transform_matrix)[16], float3 &v)
__device__ void d_transformPoint (const float(&transform_matrix)[16], float3 &v)
 Function to transform a 3D point based on current affine transformation matrix on the GPU.
 
__device__ float d_magnitude (const float3 v)
__device__ float d_magnitude (const float3 v)
 Function to calculate the magnitude of float3 vector on the GPU.
 
__device__ float d_calculatePrimitiveArea (const uint primitive_type, const float(&transform_matrix)[16])
__device__ float d_calculatePrimitiveArea (const uint primitive_type, const float(&transform_matrix)[16])
 Function to calculate the surface area of a primitive.
 
__device__ void d_matMult33 (float *ml, float *mr, float *m)
__device__ void d_matMult33 (float *ml, float *mr, float *m)
 
__device__ void d_matMult44 (float *ml, float *mr, float *m)
__device__ void d_matMult44 (float *ml, float *mr, float *m)
 
__device__ void d_sampleDisk (uint &seed, optix::float3 &sample)
__device__ void d_sampleDisk (uint &seed, optix::float3 &sample)
 
__device__ void d_sampleSquare (uint &seed, optix::float3 &sample)
__device__ void d_sampleSquare (uint &seed, optix::float3 &sample)
 

Detailed Description

@@ -170,23 +176,6 @@

Definition at line 17 of file RayTracing.cu.h.

-

- -

Typedef Documentation

- -

◆ uint

- -
-
- - - - -
typedef unsigned int uint
-
- -

Definition at line 20 of file RayTracing.cu.h.

-

Function Documentation

@@ -199,19 +188,12 @@

__device__ __inline__ double atomicAdd ( - double *  - address, + double * address, - double  - val  - - - - ) - + double val )
@@ -576,7 +484,8 @@

+

diff --git a/doc/html/_ray_tracing_8cu_8h_source.html b/doc/html/_ray_tracing_8cu_8h_source.html index 0bfb02170..c15727dbe 100644 --- a/doc/html/_ray_tracing_8cu_8h_source.html +++ b/doc/html/_ray_tracing_8cu_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
RayTracing.cu.h
@@ -101,6 +113,7 @@
21
22void queryGPUMemory( void );
23
+
26{
27
@@ -114,6 +127,7 @@
44 unsigned char source_ID;
45
46};
+
47
48static __device__ void init_state( PerRayData* prd );
49
@@ -172,6 +186,7 @@
102 return ((float) lcg(prev) / (float) 0x01000000);
103}
104
+
106__device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi) {
107
112 float Ry[3][3], Rz[3][3];
@@ -224,6 +239,7 @@
159 return tmp;
160
161}
+
162
163__device__ void d_makeTransformMatrix( optix::float3 rotation, float (&T)[16] ){
164
@@ -377,6 +393,7 @@
312}
313
314
+
316__device__ void d_transformPoint( const float (&transform_matrix)[16], float3 &v ){
317
318 float3 V;
@@ -388,11 +405,15 @@
324 v=V;
325
326}
+
327
+
329__device__ float d_magnitude( const float3 v ){
330 return sqrtf( v.x*v.x+v.y*v.y+v.z*v.z );
331}
+
332
+
334__device__ float d_calculatePrimitiveArea( const uint primitive_type, const float (&transform_matrix)[16] ){
335
336 if( primitive_type == 0 || primitive_type == 3 ){ //Patch or AlphaMask
@@ -433,6 +454,7 @@
371 return 0;
372
373}
+
374
375__device__ void d_matMult33( float* ml, float* mr, float* m ){
376
@@ -541,24 +563,25 @@
479 else if (x > 1.0) x = 1.0 ;
480 return asin(x) ;
481}
-
__device__ float d_calculatePrimitiveArea(const uint primitive_type, const float(&transform_matrix)[16])
Function to calculate the surface area of a primitive.
-
__device__ void d_transformPoint(const float(&transform_matrix)[16], float3 &v)
Function to transform a 3D point based on current affine transformation matrix on the GPU.
-
__device__ float d_magnitude(const float3 v)
Function to calculate the magnitude of float3 vector on the GPU.
-
__device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
-
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:241
-
float asin_safe(float x)
arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:247
- -
unsigned char source_ID
Numerical identifier for radiation source corresponding to each ray.
Definition: RayTracing.cu.h:44
-
double strength
"strength" or amount of energy associated with the ray.
Definition: RayTracing.cu.h:29
-
float area
Area of primitive (note for voxels, this is area density)
Definition: RayTracing.cu.h:35
-
uint origin_UUID
UUID of primitive from which ray originated.
Definition: RayTracing.cu.h:31
-
uint seed
Seed for curand random number generator.
Definition: RayTracing.cu.h:37
-
unsigned char periodic_depth
Number of periodic boundary intersections for ray.
Definition: RayTracing.cu.h:39
-
bool face
Face of primitive from which ray was launched (true=top, false=bottom)
Definition: RayTracing.cu.h:33
+
__device__ float d_calculatePrimitiveArea(const uint primitive_type, const float(&transform_matrix)[16])
Function to calculate the surface area of a primitive.
+
__device__ void d_transformPoint(const float(&transform_matrix)[16], float3 &v)
Function to transform a 3D point based on current affine transformation matrix on the GPU.
+
__device__ float d_magnitude(const float3 v)
Function to calculate the magnitude of float3 vector on the GPU.
+
__device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
+
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:241
+
float asin_safe(float x)
arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:247
+ +
unsigned char source_ID
Numerical identifier for radiation source corresponding to each ray.
+
double strength
"strength" or amount of energy associated with the ray.
+
float area
Area of primitive (note for voxels, this is area density)
+
uint origin_UUID
UUID of primitive from which ray originated.
+
uint seed
Seed for curand random number generator.
+
unsigned char periodic_depth
Number of periodic boundary intersections for ray.
+
bool face
Face of primitive from which ray was launched (true=top, false=bottom)
+ diff --git a/doc/html/_solar_position_8cpp.html b/doc/html/_solar_position_8cpp.html index ed2789688..89586830c 100644 --- a/doc/html/_solar_position_8cpp.html +++ b/doc/html/_solar_position_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
SolarPosition.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_solar_position_8cpp_source.html b/doc/html/_solar_position_8cpp_source.html index b5f805b1d..342580aee 100644 --- a/doc/html/_solar_position_8cpp_source.html +++ b/doc/html/_solar_position_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
SolarPosition.cpp
@@ -98,14 +110,17 @@
18using namespace std;
19using namespace helios;
20
+
22 context = context_ptr;
23 UTC = context->getLocation().UTC_offset;
24 latitude = context->getLocation().latitude_deg;
25 longitude = context->getLocation().longitude_deg;
26}
+
27
28
+
29SolarPosition::SolarPosition( float UTC_hrs, float latitude_deg, float longitude_deg, helios::Context* context_ptr ){
30 context = context_ptr;
31 UTC = UTC_hrs;
@@ -127,6 +142,7 @@
47 }
48
49}
+
50
51SphericalCoord SolarPosition::calculateSunDirection( const helios::Time &time, const helios::Date &date ) const{
52
@@ -176,6 +192,7 @@
96
97}
98
+
100
101 //This is a lazy way to find the sunrise/sunset time. If anyone wants to do the math and solve for it algebraically, go for it.
@@ -192,7 +209,9 @@
112 return make_Time(0,0); //should never get here
113
114}
+
115
+
117
118 // SphericalCoord sun_dir;
@@ -208,7 +227,9 @@
128 return make_Time(0,0); //should never get here
129
130}
+
131
+
133 float elevation;
134 if( issolarpositionoverridden ){
@@ -218,7 +239,9 @@
138 }
139 return elevation;
140}
+
141
+
143 float zenith;
144 if( issolarpositionoverridden ){
@@ -228,7 +251,9 @@
148 }
149 return zenith;
150}
+
151
+
153 float azimuth;
154 if( issolarpositionoverridden ){
@@ -238,7 +263,9 @@
158 }
159 return azimuth;
160}
+
161
+
163 SphericalCoord sundirection;
164 if( issolarpositionoverridden ) {
@@ -248,7 +275,9 @@
168 }
169 return sphere2cart(sundirection);
170}
+
171
+
173 SphericalCoord sundirection;
174 if( issolarpositionoverridden ) {
@@ -258,12 +287,16 @@
178 }
179 return sundirection;
180}
+
181
+
183 issolarpositionoverridden = true;
184 sun_direction = sundirection;
185}
+
186
+
187float SolarPosition::getSolarFlux(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity ) const{
188 float Eb_PAR, Eb_NIR, fdiff;
189 GueymardSolarModel(pressure_Pa, temperature_K, humidity_rel, turbidity, Eb_PAR, Eb_NIR, fdiff);
@@ -273,7 +306,9 @@
193 }
194 return Eb;
195}
+
196
+
197float SolarPosition::getSolarFluxPAR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity ) const{
198 float Eb_PAR, Eb_NIR, fdiff;
199 GueymardSolarModel(pressure_Pa, temperature_K, humidity_rel, turbidity, Eb_PAR, Eb_NIR, fdiff);
@@ -282,7 +317,9 @@
202 }
203 return Eb_PAR;
204}
+
205
+
206float SolarPosition::getSolarFluxNIR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity ) const{
207 float Eb_PAR, Eb_NIR, fdiff;
208 GueymardSolarModel(pressure_Pa, temperature_K, humidity_rel, turbidity, Eb_PAR, Eb_NIR, fdiff);
@@ -291,7 +328,9 @@
211 }
212 return Eb_NIR;
213}
+
214
+
215float SolarPosition::getDiffuseFraction(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity ) const{
216 float Eb_PAR, Eb_NIR, fdiff;
217 GueymardSolarModel(pressure_Pa, temperature_K, humidity_rel, turbidity, Eb_PAR, Eb_NIR, fdiff);
@@ -300,6 +339,7 @@
220 }
221 return fdiff;
222}
+
223
224void SolarPosition::GueymardSolarModel( float pressure, float temperature, float humidity, float turbidity, float& Eb_PAR, float& Eb_NIR, float &fdiff ) const{
225
@@ -443,6 +483,7 @@
363
364}
365
+
366float SolarPosition::getAmbientLongwaveFlux(float temperature_K, float humidity_rel ) const{
367
368 //Model from Prata (1996) Q. J. R. Meteorol. Soc.
@@ -457,6 +498,7 @@
377 return eps*5.67e-8*pow(temperature_K, 4);
378
379}
+
380
381float SolarPosition::turbidityResidualFunction(float turbidity, std::vector<float> &parameters, const void * a_solarpositionmodel) {
382
@@ -471,6 +513,7 @@
391 return flux_model-flux_target;
392}
393
+
394float SolarPosition::calibrateTurbidityFromTimeseries( const std::string &timeseries_shortwave_flux_label_Wm2 ) const{
395
396 if( !context->doesTimeseriesVariableExist(timeseries_shortwave_flux_label_Wm2.c_str()) ){
@@ -512,7 +555,9 @@
432 return turbidity;
433
434}
+
435
+
436void SolarPosition::enableCloudCalibration( const std::string &timeseries_shortwave_flux_label_Wm2 ){
437
438 if( !context->doesTimeseriesVariableExist( timeseries_shortwave_flux_label_Wm2.c_str()) ){
@@ -522,10 +567,13 @@
442 cloudcalibrationlabel = timeseries_shortwave_flux_label_Wm2;
443
444}
+
445
+
447 cloudcalibrationlabel = "";
448}
+
449
450void SolarPosition::applyCloudCalibration(float &R_calc_Wm2, float &fdiff_calc) const{
451
@@ -545,59 +593,60 @@
465}
466
- -
SolarPosition(helios::Context *context_ptr)
Solar position model default constructor. Initializes location based on the location set in the Conte...
-
void disableCloudCalibration()
Disable calibration of solar flux and diffuse fraction for clouds.
-
float getSunAzimuth() const
Get the current sun azimuthal angle in radians for the current location. The sun angle is computed ba...
-
helios::Time getSunriseTime() const
Get the approximate time of sunrise at the current location.
-
float getSunElevation() const
Get the current sun elevation angle in radians for the current location. The sun angle is computed ba...
-
float getAmbientLongwaveFlux(float temperature_K, float humidity_rel) const
Calculate the ambient (sky) longwave radiation flux.
-
float getSunZenith() const
Get the current sun zenithal angle in radians for the current location. The sun angle is computed bas...
-
helios::Time getSunsetTime() const
Get the approximate time of sunset at the current location.
-
float getSolarFluxPAR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the photosynthetically active (PAR) component of solar radiation flux perpendicular to the sun di...
-
float getSolarFluxNIR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the near-infrared (NIR) component of solar radiation flux perpendicular to the sun direction.
-
float getSolarFlux(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the solar radiation flux perpendicular to the sun direction.
-
void enableCloudCalibration(const std::string &timeseries_shortwave_flux_label_Wm2)
Enable calibration of solar flux and diffuse fraction when possibility of clouds are present against ...
-
helios::SphericalCoord getSunDirectionSpherical() const
Get a spherical coordinate vector pointing toward the sun for the current location....
-
float calibrateTurbidityFromTimeseries(const std::string &timeseries_shortwave_flux_label_Wm2) const
Calculate the turbidity value based on a timeseries of net radiation measurements.
-
void setSunDirection(const helios::SphericalCoord &sundirection)
Override solar position calculation based on time in the Context by using a prescribed solar position...
-
helios::vec3 getSunDirectionVector() const
Get a unit vector pointing toward the sun for the current location. The sun angle is computed based o...
-
float getDiffuseFraction(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the fraction of solar radiation flux that is diffuse.
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
int getJulianDate() const
Get simulation date by Julian day.
Definition: Context.cpp:1132
-
helios::Time getTime() const
Get the simulation time.
Definition: Context.cpp:1166
-
helios::Date getDate() const
Get simulation date.
Definition: Context.cpp:1099
-
helios::Location getLocation() const
Get the location of the simulation (latitude, longitude, and UTC offset)
Definition: Context.cpp:1174
-
float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
Use Newton-Raphson method to find the zero of a function.
Definition: global.cpp:2977
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition: global.cpp:617
-
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:241
-
float asin_safe(float x)
arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition: global.cpp:247
-
Time queryTimeseriesTime(const char *label, uint index) const
Get the time associated with a timeseries data point.
Definition: Context.cpp:1958
-
uint getTimeseriesLength(const char *label) const
Get the length of timeseries data.
Definition: Context.cpp:2014
-
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition: Context.cpp:1894
-
bool doesTimeseriesVariableExist(const char *label) const
Query whether a timeseries variable exists.
Definition: Context.cpp:2026
-
Date queryTimeseriesDate(const char *label, uint index) const
Get the date associated with a timeseries data point.
Definition: Context.cpp:1994
-
Time make_Time(int hour, int minute)
Make a Time vector.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
- -
int JulianDay() const
Convert to Julian day.
Definition: global.cpp:186
-
float longitude_deg
Longitude in degrees (+western hemisphere, -eastern hemisphere)
-
float latitude_deg
Latitude in degrees (+northern hemisphere, -southern hemisphere)
-
float UTC_offset
Offset from UTC in hours (+moving West)
-
Vector of spherical coordinates (elevation,azimuth)
-
const float & zenith
Zenithal angle (radians)
-
const float & elevation
Elevation angle (radians)
-
float azimuth
Azimuthal angle (radians)
- -
int hour
Hour of day.
-
int minute
Minute of hour.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+ +
SolarPosition(helios::Context *context_ptr)
Solar position model default constructor. Initializes location based on the location set in the Conte...
+
void disableCloudCalibration()
Disable calibration of solar flux and diffuse fraction for clouds.
+
float getSunAzimuth() const
Get the current sun azimuthal angle in radians for the current location. The sun angle is computed ba...
+
helios::Time getSunriseTime() const
Get the approximate time of sunrise at the current location.
+
float getSunElevation() const
Get the current sun elevation angle in radians for the current location. The sun angle is computed ba...
+
float getAmbientLongwaveFlux(float temperature_K, float humidity_rel) const
Calculate the ambient (sky) longwave radiation flux.
+
float getSunZenith() const
Get the current sun zenithal angle in radians for the current location. The sun angle is computed bas...
+
helios::Time getSunsetTime() const
Get the approximate time of sunset at the current location.
+
float getSolarFluxPAR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the photosynthetically active (PAR) component of solar radiation flux perpendicular to the sun di...
+
float getSolarFluxNIR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the near-infrared (NIR) component of solar radiation flux perpendicular to the sun direction.
+
float getSolarFlux(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the solar radiation flux perpendicular to the sun direction.
+
void enableCloudCalibration(const std::string &timeseries_shortwave_flux_label_Wm2)
Enable calibration of solar flux and diffuse fraction when possibility of clouds are present against ...
+
helios::SphericalCoord getSunDirectionSpherical() const
Get a spherical coordinate vector pointing toward the sun for the current location....
+
float calibrateTurbidityFromTimeseries(const std::string &timeseries_shortwave_flux_label_Wm2) const
Calculate the turbidity value based on a timeseries of net radiation measurements.
+
void setSunDirection(const helios::SphericalCoord &sundirection)
Override solar position calculation based on time in the Context by using a prescribed solar position...
+
helios::vec3 getSunDirectionVector() const
Get a unit vector pointing toward the sun for the current location. The sun angle is computed based o...
+
float getDiffuseFraction(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the fraction of solar radiation flux that is diffuse.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
int getJulianDate() const
Get simulation date by Julian day.
Definition Context.cpp:1132
+
helios::Time getTime() const
Get the simulation time.
Definition Context.cpp:1166
+
helios::Date getDate() const
Get simulation date.
Definition Context.cpp:1099
+
helios::Location getLocation() const
Get the location of the simulation (latitude, longitude, and UTC offset)
Definition Context.cpp:1174
+
float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
Use Newton-Raphson method to find the zero of a function.
Definition global.cpp:2977
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition global.cpp:617
+
float acos_safe(float x)
arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:241
+
float asin_safe(float x)
arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
Definition global.cpp:247
+
Time queryTimeseriesTime(const char *label, uint index) const
Get the time associated with a timeseries data point.
Definition Context.cpp:1958
+
uint getTimeseriesLength(const char *label) const
Get the length of timeseries data.
Definition Context.cpp:2014
+
float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
Get a timeseries data point by specifying a date and time vector.
Definition Context.cpp:1894
+
bool doesTimeseriesVariableExist(const char *label) const
Query whether a timeseries variable exists.
Definition Context.cpp:2026
+
Date queryTimeseriesDate(const char *label, uint index) const
Get the date associated with a timeseries data point.
Definition Context.cpp:1994
+
Time make_Time(int hour, int minute)
Make a Time vector.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+ +
int JulianDay() const
Convert to Julian day.
Definition global.cpp:186
+
float longitude_deg
Longitude in degrees (+western hemisphere, -eastern hemisphere)
+
float latitude_deg
Latitude in degrees (+northern hemisphere, -southern hemisphere)
+
float UTC_offset
Offset from UTC in hours (+moving West)
+
Vector of spherical coordinates (elevation,azimuth)
+
const float & zenith
Zenithal angle (radians)
+
const float & elevation
Elevation angle (radians)
+
float azimuth
Azimuthal angle (radians)
+ +
int hour
Hour of day.
+
int minute
Minute of hour.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_solar_position_8h.html b/doc/html/_solar_position_8h.html index f4bfa70a1..60ce265b9 100644 --- a/doc/html/_solar_position_8h.html +++ b/doc/html/_solar_position_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -113,7 +125,8 @@
+ diff --git a/doc/html/_solar_position_8h_source.html b/doc/html/_solar_position_8h_source.html index 5596b4d4c..d2c136d8b 100644 --- a/doc/html/_solar_position_8h_source.html +++ b/doc/html/_solar_position_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
SolarPosition.h
@@ -98,14 +110,15 @@
18
19#include "Context.h"
20
+
22 public:
23
25
-
28 explicit SolarPosition( helios::Context* context_ptr );
+
28 explicit SolarPosition( helios::Context* context_ptr );
29
31
-
37 SolarPosition(float UTC_hrs, float latitude_deg, float longitude_deg, helios::Context* context_ptr );
+
37 SolarPosition(float UTC_hrs, float latitude_deg, float longitude_deg, helios::Context* context_ptr );
38
40 int selfTest() const;
41
@@ -172,36 +185,39 @@
161
162
163};
+
164
165#endif
- -
void disableCloudCalibration()
Disable calibration of solar flux and diffuse fraction for clouds.
-
float getSunAzimuth() const
Get the current sun azimuthal angle in radians for the current location. The sun angle is computed ba...
-
helios::Time getSunriseTime() const
Get the approximate time of sunrise at the current location.
-
float getSunElevation() const
Get the current sun elevation angle in radians for the current location. The sun angle is computed ba...
-
float getAmbientLongwaveFlux(float temperature_K, float humidity_rel) const
Calculate the ambient (sky) longwave radiation flux.
-
float getSunZenith() const
Get the current sun zenithal angle in radians for the current location. The sun angle is computed bas...
-
helios::Time getSunsetTime() const
Get the approximate time of sunset at the current location.
-
float getSolarFluxPAR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the photosynthetically active (PAR) component of solar radiation flux perpendicular to the sun di...
-
float getSolarFluxNIR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the near-infrared (NIR) component of solar radiation flux perpendicular to the sun direction.
-
float getSolarFlux(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the solar radiation flux perpendicular to the sun direction.
-
void enableCloudCalibration(const std::string &timeseries_shortwave_flux_label_Wm2)
Enable calibration of solar flux and diffuse fraction when possibility of clouds are present against ...
-
int selfTest() const
Function to perform a self-test of model functions.
Definition: selfTest.cpp:5
-
helios::SphericalCoord getSunDirectionSpherical() const
Get a spherical coordinate vector pointing toward the sun for the current location....
-
float calibrateTurbidityFromTimeseries(const std::string &timeseries_shortwave_flux_label_Wm2) const
Calculate the turbidity value based on a timeseries of net radiation measurements.
-
void setSunDirection(const helios::SphericalCoord &sundirection)
Override solar position calculation based on time in the Context by using a prescribed solar position...
-
helios::vec3 getSunDirectionVector() const
Get a unit vector pointing toward the sun for the current location. The sun angle is computed based o...
-
float getDiffuseFraction(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the fraction of solar radiation flux that is diffuse.
-
Stores the state associated with simulation.
Definition: Context.h:1882
- -
Vector of spherical coordinates (elevation,azimuth)
- -
Vector of three elements of type 'float'.
+ +
SolarPosition(helios::Context *context_ptr)
Solar position model default constructor. Initializes location based on the location set in the Conte...
+
void disableCloudCalibration()
Disable calibration of solar flux and diffuse fraction for clouds.
+
float getSunAzimuth() const
Get the current sun azimuthal angle in radians for the current location. The sun angle is computed ba...
+
helios::Time getSunriseTime() const
Get the approximate time of sunrise at the current location.
+
float getSunElevation() const
Get the current sun elevation angle in radians for the current location. The sun angle is computed ba...
+
float getAmbientLongwaveFlux(float temperature_K, float humidity_rel) const
Calculate the ambient (sky) longwave radiation flux.
+
float getSunZenith() const
Get the current sun zenithal angle in radians for the current location. The sun angle is computed bas...
+
helios::Time getSunsetTime() const
Get the approximate time of sunset at the current location.
+
float getSolarFluxPAR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the photosynthetically active (PAR) component of solar radiation flux perpendicular to the sun di...
+
float getSolarFluxNIR(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the near-infrared (NIR) component of solar radiation flux perpendicular to the sun direction.
+
float getSolarFlux(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the solar radiation flux perpendicular to the sun direction.
+
void enableCloudCalibration(const std::string &timeseries_shortwave_flux_label_Wm2)
Enable calibration of solar flux and diffuse fraction when possibility of clouds are present against ...
+
int selfTest() const
Function to perform a self-test of model functions.
Definition selfTest.cpp:5
+
helios::SphericalCoord getSunDirectionSpherical() const
Get a spherical coordinate vector pointing toward the sun for the current location....
+
float calibrateTurbidityFromTimeseries(const std::string &timeseries_shortwave_flux_label_Wm2) const
Calculate the turbidity value based on a timeseries of net radiation measurements.
+
void setSunDirection(const helios::SphericalCoord &sundirection)
Override solar position calculation based on time in the Context by using a prescribed solar position...
+
helios::vec3 getSunDirectionVector() const
Get a unit vector pointing toward the sun for the current location. The sun angle is computed based o...
+
float getDiffuseFraction(float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
Get the fraction of solar radiation flux that is diffuse.
+
Stores the state associated with simulation.
Definition Context.h:1882
+ +
Vector of spherical coordinates (elevation,azimuth)
+ +
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_solar_position_doc.html b/doc/html/_solar_position_doc.html index a09ab5a12..c17380a39 100644 --- a/doc/html/_solar_position_doc.html +++ b/doc/html/_solar_position_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
-
Solar Position Plugin Documentation
+
Solar Position Plugin Documentation


@@ -215,7 +255,7 @@

float azimuth = sun.getSunAzimuth(); //azimuthal angle (radians)
}
- +

Getting the Solar Flux

The solar flux can be calculated using the REST-2 model of Gueymard (2008) using the SolarPosition::getSolarFlux() function. IT IS CRITICAL TO NOTE THAT THE CALCULATED FLUX IS FOR A SURFACE PERPENDICULAR TO THE SUN DIRECTION. To get the flux on a horizontal surface, multiply by the cosine of the solar zenith angle.

@@ -269,20 +309,20 @@

Consider $R_{meas,h}$ to be the measured all-wave incoming solar radiation flux on a horizontal plane (clear or cloudy conditions), and $R_{clear}$ to be the predicted all-wave incoming solar radiation flux predicted by the REST2 model for clear-sky conditions perpendicular to the direction of the sun. This flux can be projected onto the horizontal plane according to

\[
-   R_{clear,h} = R_{clear}\mathrm{cos}\,\theta_s.
-\] + R_{clear,h} = R_{clear}\mathrm{cos}\,\theta_s. + \]" src="form_209.png" width="149" height="17"/>

The diffuse fraction can be approximated as

\[
-   f_{diff} = 1-\frac{R_{meas,h} - R_{clear,h}}{R_{clear,h}},
-\] + f_{diff} = 1-\frac{R_{meas,h} - R_{clear,h}}{R_{clear,h}}, + \]" src="form_210.png" width="206" height="36"/>

where it is enforced that $0\leq f_{diff} \leq 1$. The resulting flux that is output from the model is (flux perpendicular to the sun)

\[
-  R_{model} = R_{clear}\frac{R_{meas,h}}{R_{clear,h}}.
-\] + R_{model} = R_{clear}\frac{R_{meas,h}}{R_{clear,h}}. + \]" src="form_212.png" width="162" height="36"/>

In order to enable flux calibration for cloudy conditions, you must 1) Load timeseries data into the Context containing the measured all-wave solar radiation flux. This data must cover the entire period of the simulation. 2) Call SolarPosition::enableCloudCalibration(), which requires a string corresponding to the timeseries data value reference in (1). Below is a code example:

#include "SolarPosition"
@@ -332,7 +372,8 @@

+

diff --git a/doc/html/_stomatal_conductance_model_8cpp.html b/doc/html/_stomatal_conductance_model_8cpp.html index fd67f6e23..4f32b41bf 100644 --- a/doc/html/_stomatal_conductance_model_8cpp.html +++ b/doc/html/_stomatal_conductance_model_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
StomatalConductanceModel.cpp File Reference
@@ -105,7 +117,8 @@
+ diff --git a/doc/html/_stomatal_conductance_model_8cpp_source.html b/doc/html/_stomatal_conductance_model_8cpp_source.html index fd03e62ba..be321fd22 100644 --- a/doc/html/_stomatal_conductance_model_8cpp_source.html +++ b/doc/html/_stomatal_conductance_model_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
StomatalConductanceModel.cpp
@@ -98,6 +110,7 @@
18using namespace std;
19using namespace helios;
20
+
22 context = m_context;
23
@@ -128,7 +141,9 @@
48 model = "BMF"; //default model - Buckley, Mott, Farquhar
49
50}
+
51
+
53
54 Context context_selftest;
@@ -217,66 +232,86 @@
137 return 0;
138
139}
+
140
+
142 BWBcoeffs = coeffs;
143 BWBmodel_coefficients.clear();
144 model = "BWB";
145}
+
146
+
147void StomatalConductanceModel::setModelCoefficients(const BWBcoefficients &coeffs, const std::vector<uint> &UUIDs ){
148 for( uint UUID : UUIDs){
149 BWBmodel_coefficients[UUID] = coeffs;
150 }
151 model = "BWB";
152}
+
153
+
155 BBLcoeffs = coeffs;
156 BBLmodel_coefficients.clear();
157 model = "BBL";
158}
+
159
+
160void StomatalConductanceModel::setModelCoefficients(const BBLcoefficients &coeffs, const std::vector<uint> &UUIDs ){
161 for( uint UUID : UUIDs){
162 BBLmodel_coefficients[UUID] = coeffs;
163 }
164 model = "BBL";
165}
+
166
+
168 MOPTcoeffs = coeffs;
169 MOPTmodel_coefficients.clear();
170 model = "MOPT";
171}
+
172
+
173void StomatalConductanceModel::setModelCoefficients(const MOPTcoefficients &coeffs, const std::vector<uint> &UUIDs ){
174 for( uint UUID : UUIDs){
175 MOPTmodel_coefficients[UUID] = coeffs;
176 }
177 model = "MOPT";
178}
+
179
+
181 BMFcoeffs = coeffs;
182 BMFmodel_coefficients.clear();
183 model = "BMF";
184}
+
185
+
186void StomatalConductanceModel::setModelCoefficients(const BMFcoefficients &coeffs, const std::vector<uint> &UUIDs ){
187 for( uint UUID : UUIDs){
188 BMFmodel_coefficients[UUID] = coeffs;
189 }
190 model = "BMF";
191}
+
192
+
193void StomatalConductanceModel::setBMFCoefficientsFromLibrary(const std::string &species_name) {
194 BMFcoefficients coeffs = getBMFCoefficientsFromLibrary(species_name);
195 BMFcoeffs = coeffs;
196 BMFmodel_coefficients.clear();
197 model = "BMF";
198}
+
199
+
200void StomatalConductanceModel::setBMFCoefficientsFromLibrary(const std::string &species, const std::vector<uint> &UUIDs) {
201 BMFcoefficients coeffs;
202 coeffs = getBMFCoefficientsFromLibrary(species);
@@ -285,7 +320,9 @@
205 }
206 model = "BMF";
207}
+
208
+
210 BMFcoefficients coeffs;
211 bool defaultSpecies = false;
@@ -390,43 +427,59 @@
310 }
311 return coeffs;
312}
+
313
+
315 BBcoeffs = coeffs;
316 BBmodel_coefficients.clear();
317 model = "BB";
318}
+
319
+
320void StomatalConductanceModel::setModelCoefficients(const BBcoefficients &coeffs, const std::vector<uint> &UUIDs ){
321 for( uint UUID : UUIDs){
322 BBmodel_coefficients[UUID] = coeffs;
323 }
324 model = "BB";
325}
+
326
+
327void StomatalConductanceModel::setDynamicTimeConstants( float tau_open, float tau_close ){
328 dynamic_time_constants.clear();
329 dynamic_time_constants[0] = make_vec2(tau_open,tau_close);
330}
+
331
+
332void StomatalConductanceModel::setDynamicTimeConstants( float tau_open, float tau_close, const std::vector<uint> &UUIDs ){
333 for( uint UUID : UUIDs){
334 dynamic_time_constants[UUID] = make_vec2(tau_open,tau_close);
335 }
336}
+
337
+
339 run( context->getAllUUIDs() );
340}
+
341
+
342void StomatalConductanceModel::run( const std::vector<uint>& UUIDs ){
343 run( UUIDs, 0.f );
344}
+
345
+
347 run( context->getAllUUIDs(), dt );
348}
+
349
+
350void StomatalConductanceModel::run( const std::vector<uint>& UUIDs, float dt ){
351
352 size_t assumed_default_An = 0;
@@ -756,6 +809,7 @@
676 }
677
678}
+
679
680float StomatalConductanceModel::evaluate_BWBmodel( float esurf, std::vector<float> &variables, const void* parameters ){
681
@@ -881,14 +935,19 @@
801
802}
803
+
805 message_flag = false;
806}
+
807
+
809 message_flag = true;
810}
+
811
+
813
814 if( strcmp(label,"vapor_pressure_deficit")==0 ){
@@ -900,11 +959,15 @@
820 }
821
822}
+
823
+
827
+
828void StomatalConductanceModel::printDefaultValueReport(const std::vector<uint> &UUIDs) const {
829
830 size_t assumed_default_i = 0;
@@ -1016,40 +1079,42 @@
936 std::cout << "------------------------------------------------------" << std::endl;
937
938}
-
@ HELIOS_TYPE_FLOAT
floating point data type
Definition: Context.h:47
+
+
@ HELIOS_TYPE_FLOAT
floating point data type
Definition Context.h:47
- -
void setDynamicTimeConstants(float tau_open, float tau_close)
Set time constants for dynamic stomatal opening and closing for all primitives.
-
void disableMessages()
Disable output messages to the standard output.
-
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
-
void setBMFCoefficientsFromLibrary(const std::string &species)
Set the model coefficient values using one of the available species in the library.
-
void enableMessages()
Ensable output messages to the standard output.
-
StomatalConductanceModel(helios::Context *m_context)
Default constructor.
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
int selfTest()
Self-test (unit test) routine.
-
void run()
Update the stomatal conductance for all primitives in the context.
-
BMFcoefficients getBMFCoefficientsFromLibrary(const std::string &species)
Get the model coefficient values using one of the available species in the library.
-
void setModelCoefficients(const BWBcoefficients &coeffs)
Set the model coefficient values for all primitives - Ball, Woodrow, Berry model.
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
Use Newton-Raphson method to find the zero of a function.
Definition: global.cpp:2977
-
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition: global.cpp:1146
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
Coefficients for Ball, Berry, Leuning (Leuning 1990, 1995) stomatal conductance model.
-
Coefficients for simplified Bailey stomatal conductance model.
-
Coefficients for simplified Buckley, Mott, & Farquhar stomatal conductance model.
-
Coefficients for original Ball, Woodrow, Berry (1987) stomatal conductance model.
-
Coefficients for optimality-based Medlyn et al. (2011) stomatal conductance model.
+ +
void setDynamicTimeConstants(float tau_open, float tau_close)
Set time constants for dynamic stomatal opening and closing for all primitives.
+
void disableMessages()
Disable output messages to the standard output.
+
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
+
void setBMFCoefficientsFromLibrary(const std::string &species)
Set the model coefficient values using one of the available species in the library.
+
void enableMessages()
Ensable output messages to the standard output.
+
StomatalConductanceModel(helios::Context *m_context)
Default constructor.
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
int selfTest()
Self-test (unit test) routine.
+
void run()
Update the stomatal conductance for all primitives in the context.
+
BMFcoefficients getBMFCoefficientsFromLibrary(const std::string &species)
Get the model coefficient values using one of the available species in the library.
+
void setModelCoefficients(const BWBcoefficients &coeffs)
Set the model coefficient values for all primitives - Ball, Woodrow, Berry model.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
Use Newton-Raphson method to find the zero of a function.
Definition global.cpp:2977
+
float max(const std::vector< float > &vect)
Maximum value of a vector of floats.
Definition global.cpp:1146
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
Coefficients for Ball, Berry, Leuning (Leuning 1990, 1995) stomatal conductance model.
+
Coefficients for simplified Bailey stomatal conductance model.
+
Coefficients for simplified Buckley, Mott, & Farquhar stomatal conductance model.
+
Coefficients for original Ball, Woodrow, Berry (1987) stomatal conductance model.
+
Coefficients for optimality-based Medlyn et al. (2011) stomatal conductance model.
+ diff --git a/doc/html/_stomatal_conductance_model_8h.html b/doc/html/_stomatal_conductance_model_8h.html index df9bcbd1f..c509a1b23 100644 --- a/doc/html/_stomatal_conductance_model_8h.html +++ b/doc/html/_stomatal_conductance_model_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -128,7 +140,8 @@
+ diff --git a/doc/html/_stomatal_conductance_model_8h_source.html b/doc/html/_stomatal_conductance_model_8h_source.html index f5a42f51b..bff51f67b 100644 --- a/doc/html/_stomatal_conductance_model_8h_source.html +++ b/doc/html/_stomatal_conductance_model_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
StomatalConductanceModel.h
@@ -98,6 +110,7 @@
18
19#include "Context.h"
20
+
23
@@ -109,7 +122,9 @@
30 float a1; //unitless
31
32};
+
33
+
36
@@ -123,7 +138,9 @@
45 float D0; //mmol/mol
46
47};
+
48
+
51
@@ -135,7 +152,9 @@
58 float g1; //(kPa)^0.5
59
60};
+
61
+
64
@@ -155,8 +174,10 @@
79 float b; //mmol/mol
80
81};
+
82
83
+
86
@@ -174,12 +195,14 @@
99 float chi ; //mol/m^2-s-MPa
100
101};
+
102
+
104public:
105
107
-
110 explicit StomatalConductanceModel( helios::Context* m_context );
+
110 explicit StomatalConductanceModel( helios::Context* m_context );
111
113 int selfTest();
114
@@ -296,31 +319,34 @@
305 std::vector<std::string> output_prim_data;
306
307};
+
308
309#endif
- -
void setDynamicTimeConstants(float tau_open, float tau_close)
Set time constants for dynamic stomatal opening and closing for all primitives.
-
void disableMessages()
Disable output messages to the standard output.
+ +
void setDynamicTimeConstants(float tau_open, float tau_close)
Set time constants for dynamic stomatal opening and closing for all primitives.
+
void disableMessages()
Disable output messages to the standard output.
void setModelCoefficients(const std::vector< BMFcoefficients > &coeffs, const std::vector< uint > &UUIDs)
Set the model coefficient values for a subset of primitives based on their UUIDs.
-
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
-
void setBMFCoefficientsFromLibrary(const std::string &species)
Set the model coefficient values using one of the available species in the library.
-
void enableMessages()
Ensable output messages to the standard output.
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
int selfTest()
Self-test (unit test) routine.
-
void run()
Update the stomatal conductance for all primitives in the context.
-
BMFcoefficients getBMFCoefficientsFromLibrary(const std::string &species)
Get the model coefficient values using one of the available species in the library.
-
void setModelCoefficients(const BWBcoefficients &coeffs)
Set the model coefficient values for all primitives - Ball, Woodrow, Berry model.
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
Coefficients for Ball, Berry, Leuning (Leuning 1990, 1995) stomatal conductance model.
-
Coefficients for simplified Bailey stomatal conductance model.
-
Coefficients for simplified Buckley, Mott, & Farquhar stomatal conductance model.
-
Coefficients for original Ball, Woodrow, Berry (1987) stomatal conductance model.
-
Coefficients for optimality-based Medlyn et al. (2011) stomatal conductance model.
+
void printDefaultValueReport() const
Print a report detailing usage of default input values for all primitives in the Context.
+
void setBMFCoefficientsFromLibrary(const std::string &species)
Set the model coefficient values using one of the available species in the library.
+
void enableMessages()
Ensable output messages to the standard output.
+
StomatalConductanceModel(helios::Context *m_context)
Default constructor.
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
int selfTest()
Self-test (unit test) routine.
+
void run()
Update the stomatal conductance for all primitives in the context.
+
BMFcoefficients getBMFCoefficientsFromLibrary(const std::string &species)
Get the model coefficient values using one of the available species in the library.
+
void setModelCoefficients(const BWBcoefficients &coeffs)
Set the model coefficient values for all primitives - Ball, Woodrow, Berry model.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
Coefficients for Ball, Berry, Leuning (Leuning 1990, 1995) stomatal conductance model.
+
Coefficients for simplified Bailey stomatal conductance model.
+
Coefficients for simplified Buckley, Mott, & Farquhar stomatal conductance model.
+
Coefficients for original Ball, Woodrow, Berry (1987) stomatal conductance model.
+
Coefficients for optimality-based Medlyn et al. (2011) stomatal conductance model.
+ diff --git a/doc/html/_stomatal_doc.html b/doc/html/_stomatal_doc.html index cceca6dd7..c85b6dbae 100644 --- a/doc/html/_stomatal_doc.html +++ b/doc/html/_stomatal_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
-
Stomatal Conductance Model Plugin Documentation
+
Stomatal Conductance Model Plugin Documentation


@@ -175,7 +216,7 @@

Introduction

This plugin implements several different stomatal conductance models. A brief description of the theory behind each model is given below, along with coefficients obtained from several example species.

-

The default model is the Buckley, Mott, Farquhar model (see Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)).

+

The default model is the Buckley, Mott, Farquhar model (see Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)).

Ball, Woodrow, Berry (1987) Model Theory

The Ball, Woodrow, and Berry (1987) model is based on the empirical observation that stomatal conductance various roughly linearly with the net photosynthetic flux $A$ and relative humidity at the leaf surface $h_s$. They proposed the relationship:

@@ -422,7 +463,8 @@

+
diff --git a/doc/html/_synthetic_annotation_8cpp.html b/doc/html/_synthetic_annotation_8cpp.html index ca3b98363..da34c226d 100644 --- a/doc/html/_synthetic_annotation_8cpp.html +++ b/doc/html/_synthetic_annotation_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
SyntheticAnnotation.cpp File Reference
@@ -107,7 +119,8 @@
+ diff --git a/doc/html/_synthetic_annotation_8cpp_source.html b/doc/html/_synthetic_annotation_8cpp_source.html index 819c15ea6..d51dbb88d 100644 --- a/doc/html/_synthetic_annotation_8cpp_source.html +++ b/doc/html/_synthetic_annotation_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
SyntheticAnnotation.cpp
@@ -100,6 +112,7 @@
20using namespace std;
21using namespace helios;
22
+
24 context = __context;
25 objectdetection_enabled = true;
@@ -113,7 +126,9 @@
33 camera_position.push_back( make_vec3(1,0,1) );
34 camera_lookat.push_back( make_vec3(0, 0, 1) );
35}
+
36
+
38
39 if( printmessages ) {
@@ -145,6 +160,7 @@
65 }
66
67}
+
68
69void SyntheticAnnotation::labelPrimitives( const char* label ){
70 labelPrimitives( context->getAllUUIDs(), label );
@@ -223,29 +239,41 @@
143 setCameraPosition( position, lookat );
144}
145
+
147 objectdetection_enabled = true;
148}
+
149
+
151 objectdetection_enabled = false;
152}
+
153
+
155 semanticsegmentation_enabled = true;
156}
+
157
+
159 semanticsegmentation_enabled = false;
160}
+
161
+
163 instancesegmentation_enabled = true;
164}
+
165
+
167 instancesegmentation_enabled = false;
168}
+
169
170void SyntheticAnnotation::setCameraPosition(const std::vector<helios::vec3> &a_camera_position, const std::vector<helios::vec3> &a_camera_lookat) {
171
@@ -257,6 +285,7 @@
177
178}
179
+
180void SyntheticAnnotation::render( const char* outputdir ) {
181
182 //todo: need to implement method for setting this
@@ -547,8 +576,8 @@
467 if( pixelcount>=labelminpixels ){
468
469 //todo: This doesn't actually take into account different label groups. Need to write in different format.
-
470 labelfile_rectoccluded << 0 << " " << (bbox.x + 0.5 * (bbox.y - bbox.x)) / float(framebufferW) << " "
-
471 << (bbox.z + 0.5 * (bbox.w - bbox.z)) / float(framebufferH) << " " << std::setprecision(6)
+
470 labelfile_rectoccluded << 0 << " " << (bbox.x + 0.5 * (bbox.y - bbox.x)) / float(framebufferW) << " "
+
471 << (bbox.z + 0.5 * (bbox.w - bbox.z)) / float(framebufferH) << " " << std::setprecision(6)
472 << std::fixed << (bbox.y - bbox.x) / float(framebufferW) << " "
473 << (bbox.w - bbox.z) / float(framebufferH) << std::endl;
474
@@ -718,6 +747,7 @@
638
639
640}
+
641
642uint SyntheticAnnotation::getGroupRectangularBBox( const uint ID, const std::vector<uint> &pixels, const uint framebuffer_width, const uint framebuffer_height, helios::int4& bbox ) const {
643
@@ -868,73 +898,74 @@
788 }
789 file.close();
790}
-
@ HELIOS_TYPE_STRING
std::string data type
Definition: Context.h:63
-
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition: Context.h:53
-
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition: Context.h:57
+
@ HELIOS_TYPE_STRING
std::string data type
Definition Context.h:63
+
@ HELIOS_TYPE_VEC3
helios::vec3 data type
Definition Context.h:53
+
@ HELIOS_TYPE_INT2
helios::int2 data type
Definition Context.h:57
-
void disableInstanceSegmentation()
Disable calculation and writing of un-occluded object masks for each object (instance segmentation)
-
void disableObjectDetection()
Disable calculation and writing of rectangular bounding boxes for object detection when render() func...
-
SyntheticAnnotation(helios::Context *context)
Synthetic image annotation plug-in default constructor.
-
int selfTest() const
Function to perform a self-test of plug-in functions.
-
void enableObjectDetection()
Enable calculation and writing of rectangular bounding boxes for object detection when render() funct...
-
void disableSemanticSegmentation()
Disable calculation and writing of object mask (full image) for semantic segmentation.
-
void render(const char *outputdir)
Render RGB image and generate annotations.
-
void enableSemanticSegmentation()
Enable calculation and writing of object mask (full image) for semantic segmentation.
-
void enableInstanceSegmentation()
Enable calculation and writing of un-occluded object masks for each object (instance segmentation)
-
Class for visualization of simulation results.
Definition: Visualizer.h:265
-
void getWindowPixelsRGB(uint *buffer)
Get R-G-B pixel data in the current display window.
Definition: Visualizer.cpp:899
-
void printWindow()
Print the current graphics window to a JPEG image file. File will be given a default filename and sav...
Definition: Visualizer.cpp:875
-
void buildContextGeometry(helios::Context *context_ptr)
Add all geometry from the Context to the visualizer.
-
void setLightDirection(const helios::vec3 &direction)
Set the direction of the light source.
Definition: Visualizer.cpp:788
-
@ LIGHTING_PHONG_SHADOWED
Phong lighting model plus shadowing is applied to add shading effects to the diffuse color.
Definition: Visualizer.h:380
-
void closeWindow()
Close the graphics window.
Definition: Visualizer.cpp:973
-
void setBackgroundColor(const helios::RGBcolor &color)
Set the background color for the visualizer window.
Definition: Visualizer.cpp:871
-
void clearGeometry()
Clear all geometry previously added to the visualizer.
Definition: Visualizer.cpp:955
-
void hideWatermark()
Make Helios logo watermark invisible.
Definition: Visualizer.cpp:978
-
void plotUpdate()
Update the graphics window based on current geometry, then continue the program.
-
void disableMessages()
Disable standard output from this plug-in.
Definition: Visualizer.cpp:770
-
void getFramebufferSize(uint &width, uint &height) const
Get the size of the framebuffer in pixels.
Definition: Visualizer.cpp:950
-
void addSkyDomeByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file)
Add a Sky Dome, which is a hemispherical dome colored by a sky texture map.
-
void setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)
Set camera position.
Definition: Visualizer.cpp:774
-
void setLightingModel(LightingModel lightingmodel)
Set the lighting model for shading of all primitives.
Definition: Visualizer.cpp:861
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition: Context.cpp:7139
-
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition: Context.cpp:7135
-
void usePrimitiveTextureColor(uint UUID)
Use the texture map to color the primitive rather than the constant RGB color. This is function rever...
Definition: Context.cpp:7207
-
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition: Context.cpp:7197
-
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
-
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition: Context.cpp:7217
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition: global.cpp:617
-
void wait(float seconds)
Wait/sleep for a specified amount of time.
Definition: global.cpp:306
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
int4 make_int4(int x, int y, int z, int w)
Make an int4 vector from three ints.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
R-G-B color vector.
-
float b
Blue color component.
-
float r
Red color component.
-
float g
Green color component.
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of four elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int w
Fourth element in vector.
-
int y
Second element in vector.
-
Vector of three elements of type 'float'.
+
void disableInstanceSegmentation()
Disable calculation and writing of un-occluded object masks for each object (instance segmentation)
+
void disableObjectDetection()
Disable calculation and writing of rectangular bounding boxes for object detection when render() func...
+
SyntheticAnnotation(helios::Context *context)
Synthetic image annotation plug-in default constructor.
+
int selfTest() const
Function to perform a self-test of plug-in functions.
+
void enableObjectDetection()
Enable calculation and writing of rectangular bounding boxes for object detection when render() funct...
+
void disableSemanticSegmentation()
Disable calculation and writing of object mask (full image) for semantic segmentation.
+
void render(const char *outputdir)
Render RGB image and generate annotations.
+
void enableSemanticSegmentation()
Enable calculation and writing of object mask (full image) for semantic segmentation.
+
void enableInstanceSegmentation()
Enable calculation and writing of un-occluded object masks for each object (instance segmentation)
+
Class for visualization of simulation results.
Definition Visualizer.h:275
+
void getWindowPixelsRGB(uint *buffer)
Get R-G-B pixel data in the current display window.
+
void printWindow()
Print the current graphics window to a JPEG image file. File will be given a default filename and sav...
+
void buildContextGeometry(helios::Context *context_ptr)
Add all geometry from the Context to the visualizer.
+
void setLightDirection(const helios::vec3 &direction)
Set the direction of the light source.
+
@ LIGHTING_PHONG_SHADOWED
Phong lighting model plus shadowing is applied to add shading effects to the diffuse color.
Definition Visualizer.h:390
+
void closeWindow()
Close the graphics window.
+
void setBackgroundColor(const helios::RGBcolor &color)
Set the background color for the visualizer window.
+
void clearGeometry()
Clear all geometry previously added to the visualizer.
+
void hideWatermark()
Make Helios logo watermark invisible.
+
void plotUpdate()
Update the graphics window based on current geometry, then continue the program.
+
void disableMessages()
Disable standard output from this plug-in.
+
void getFramebufferSize(uint &width, uint &height) const
Get the size of the framebuffer in pixels.
+
void addSkyDomeByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file)
Add a Sky Dome, which is a hemispherical dome colored by a sky texture map.
+
void setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)
Set camera position.
+
void setLightingModel(LightingModel lightingmodel)
Set the lighting model for shading of all primitives.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void setPrimitiveColor(uint UUID, const helios::RGBcolor &color)
Method to set the diffuse color of a Primitive.
Definition Context.cpp:7139
+
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition Context.cpp:7135
+
void usePrimitiveTextureColor(uint UUID)
Use the texture map to color the primitive rather than the constant RGB color. This is function rever...
Definition Context.cpp:7207
+
bool doesGlobalDataExist(const char *label) const
Check if global data 'label' exists.
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition Context.cpp:7197
+
HeliosDataType getGlobalDataType(const char *label) const
Get the Helios data type of global data.
+
void getGlobalData(const char *label, int &data) const
Get global data value (scalar integer)
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition Context.cpp:7217
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition global.cpp:617
+
void wait(float seconds)
Wait/sleep for a specified amount of time.
Definition global.cpp:306
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
int4 make_int4(int x, int y, int z, int w)
Make an int4 vector from three ints.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
R-G-B color vector.
+
float b
Blue color component.
+
float r
Red color component.
+
float g
Green color component.
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of four elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int w
Fourth element in vector.
+
int y
Second element in vector.
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_synthetic_annotation_8h.html b/doc/html/_synthetic_annotation_8h.html index f53610393..5aca9babf 100644 --- a/doc/html/_synthetic_annotation_8h.html +++ b/doc/html/_synthetic_annotation_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -114,7 +126,8 @@
+ diff --git a/doc/html/_synthetic_annotation_8h_source.html b/doc/html/_synthetic_annotation_8h_source.html index f28762363..902e6bf7f 100644 --- a/doc/html/_synthetic_annotation_8h_source.html +++ b/doc/html/_synthetic_annotation_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
SyntheticAnnotation.h
@@ -99,11 +111,12 @@
20#include "Context.h"
21#include "Visualizer.h"
22
+
24public:
25
27
-
29 explicit SyntheticAnnotation( helios::Context* context );
+
29 explicit SyntheticAnnotation( helios::Context* context );
30
32 int selfTest( ) const;
33
@@ -180,28 +193,31 @@
111 void writePixelID( const char* filename, int labelminpixels, Visualizer* vis ) const;
112
113};
+
114
115#endif
- -
void disableInstanceSegmentation()
Disable calculation and writing of un-occluded object masks for each object (instance segmentation)
-
void disableObjectDetection()
Disable calculation and writing of rectangular bounding boxes for object detection when render() func...
-
int selfTest() const
Function to perform a self-test of plug-in functions.
-
void enableObjectDetection()
Enable calculation and writing of rectangular bounding boxes for object detection when render() funct...
-
void disableSemanticSegmentation()
Disable calculation and writing of object mask (full image) for semantic segmentation.
-
void render(const char *outputdir)
Render RGB image and generate annotations.
-
void enableSemanticSegmentation()
Enable calculation and writing of object mask (full image) for semantic segmentation.
-
void enableInstanceSegmentation()
Enable calculation and writing of un-occluded object masks for each object (instance segmentation)
-
Class for visualization of simulation results.
Definition: Visualizer.h:265
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
R-G-B color vector.
-
Vector of four elements of type 'int'.
-
Vector of three elements of type 'float'.
+ +
void disableInstanceSegmentation()
Disable calculation and writing of un-occluded object masks for each object (instance segmentation)
+
void disableObjectDetection()
Disable calculation and writing of rectangular bounding boxes for object detection when render() func...
+
SyntheticAnnotation(helios::Context *context)
Synthetic image annotation plug-in default constructor.
+
int selfTest() const
Function to perform a self-test of plug-in functions.
+
void enableObjectDetection()
Enable calculation and writing of rectangular bounding boxes for object detection when render() funct...
+
void disableSemanticSegmentation()
Disable calculation and writing of object mask (full image) for semantic segmentation.
+
void render(const char *outputdir)
Render RGB image and generate annotations.
+
void enableSemanticSegmentation()
Enable calculation and writing of object mask (full image) for semantic segmentation.
+
void enableInstanceSegmentation()
Enable calculation and writing of un-occluded object masks for each object (instance segmentation)
+
Class for visualization of simulation results.
Definition Visualizer.h:275
+
Stores the state associated with simulation.
Definition Context.h:1882
+
R-G-B color vector.
+
Vector of four elements of type 'int'.
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_tutorials.html b/doc/html/_tutorials.html index 6f3dd9142..8840443a2 100644 --- a/doc/html/_tutorials.html +++ b/doc/html/_tutorials.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Tutorials
+
Tutorials

The following provides a several tutorials to help in getting started with the core Helios system and associated plug-ins. Programs associated with the tutorials can be found in the "samples" directory. Assuming that you have the necessary dependent software installed (see Dependencies), the samples/tutorials can be built by changing into the "build" subdirectory for the tutorial, then running the command "cmake .." followed by "make". This should generate an executable file with the same name as the tutorial directory.

@@ -123,7 +135,8 @@

+
diff --git a/doc/html/_visualizer_8cpp.html b/doc/html/_visualizer_8cpp.html index 93218ca68..09aa58f25 100644 --- a/doc/html/_visualizer_8cpp.html +++ b/doc/html/_visualizer_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Visualizer.cpp File Reference
@@ -116,35 +129,79 @@ - + - +

Macros

#define PNG_DEBUG   3
#define PNG_DEBUG   3
 
#define PNG_SKIP_SETJMP_CHECK   1
#define PNG_SKIP_SETJMP_CHECK   1
 
- +

Typedefs

typedef struct my_error_mgrmy_error_ptr
typedef struct my_error_mgrmy_error_ptr
 
- + - + - + - + - + - + + + + + + + + + + - + +

Functions

 METHODDEF (void) my_error_exit(j_common_ptr cinfo)
 METHODDEF (void) my_error_exit(j_common_ptr cinfo)
 
int read_JPEG_file (const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
int read_JPEG_file (const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
 Function to create a texture map from a JPEG image.
 
int write_JPEG_file (const char *filename, uint width, uint height, void *_window, bool print_messages)
int write_JPEG_file (const char *filename, uint width, uint height, void *_window, bool print_messages)
 Write current graphics window to a JPEG image file.
 
int write_JPEG_file (const char *filename, const uint width, const uint height, const std::vector< helios::RGBcolor > &data, bool print_messages)
int write_JPEG_file (const char *filename, const uint width, const uint height, const std::vector< helios::RGBcolor > &data, bool print_messages)
 
void read_png_file (const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
void read_png_file (const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
 Function to create a texture map from a PNG image.
 
std::string errorString (GLenum err)
void mouseCallback (GLFWwindow *window, int button, int action, int mods)
 Callback function for mouse button presses.
 
void cursorCallback (GLFWwindow *window, double xpos, double ypos)
 Callback function for mouse cursor movements.
 
void scrollCallback (GLFWwindow *window, double xoffset, double yoffset)
 Callback function for mouse scroll.
 
std::string errorString (GLenum err)
 
int checkerrors ()
int checkerrors ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Variables

float dphi = 0.0
 
float dtheta = 0.0
 
float dx = 0.0
 
float dy = 0.0
 
float dz = 0.0
 
float dx_m = 0.0
 
float dy_m = 0.0
 
float dscroll = 0.0
 
bool lbutton_down = false
 
bool rbutton_down = false
 
bool mbutton_down = false
 
double startX
 
double startY
 
double scrollX
 
double scrollY
 
bool scroll = false
 

Detailed Description

Visualizer plugin declarations.

@@ -213,13 +270,43 @@

int checkerrors ( - ) + ) + + + +

+
+ +

◆ cursorCallback()

+ +
+
+ + + + + + + + + + + + + +
void cursorCallback (GLFWwindow * window,
double xpos,
double ypos )
-

Definition at line 4421 of file Visualizer.cpp.

+

Callback function for mouse cursor movements.

+ +

Definition at line 4353 of file Visualizer.cpp.

@@ -232,14 +319,13 @@

std::string errorString ( - GLenum  - err) + GLenum err)

-

Definition at line 4396 of file Visualizer.cpp.

+

Definition at line 4484 of file Visualizer.cpp.

@@ -252,8 +338,7 @@

METHODDEF ( - void  - ) + void ) @@ -263,40 +348,66 @@

-

◆ read_JPEG_file()

+ +

◆ mouseCallback()

- + - - + - - + - - + - - + +
int read_JPEG_file void mouseCallback (const char * filename, GLFWwindow * window,
std::vector< unsigned char > & texture, int button,
uint & height, int action,
uint & width int mods )
+
+ +

Callback function for mouse button presses.

+ +

Definition at line 4339 of file Visualizer.cpp.

+ +
+
+ +

◆ read_JPEG_file()

+ +
+
+ + + + + + + - - + + + + + + + + + + +
int read_JPEG_file (const char * filename,
)std::vector< unsigned char > & texture,
uint & height,
uint & width )
@@ -369,46 +471,66 @@

-

◆ write_JPEG_file() [1/2]

+ +

◆ scrollCallback()

- + - - + + + + + + - - + + +
int write_JPEG_file void scrollCallback (const char * filename, GLFWwindow * window,
double xoffset,
const uint width, double yoffset )
+
+ +

Callback function for mouse scroll.

+ +

Definition at line 4371 of file Visualizer.cpp.

+ +
+
+ +

◆ write_JPEG_file() [1/2]

+ +
+
+ + + + + - - + - - + - - + + - - +
int write_JPEG_file (const char * filename,
const uint height, const uint width,
const std::vector< helios::RGBcolor > & data, const uint height,
bool print_messages const std::vector< helios::RGBcolor > & data,
)bool print_messages )
+
+

Variable Documentation

+ +

◆ dphi

+ +
+
+ + + + +
float dphi = 0.0
+
+ +

Definition at line 3296 of file Visualizer.cpp.

+ +
+
+ +

◆ dscroll

+ +
+
+ + + + +
float dscroll = 0.0
+
+ +

Definition at line 3303 of file Visualizer.cpp.

+ +
+
+ +

◆ dtheta

+ +
+
+ + + + +
float dtheta = 0.0
+
+ +

Definition at line 3297 of file Visualizer.cpp.

+ +
+
+ +

◆ dx

+ +
+
+ + + + +
float dx = 0.0
+
+ +

Definition at line 3298 of file Visualizer.cpp.

+ +
+
+ +

◆ dx_m

+ +
+
+ + + + +
float dx_m = 0.0
+
+ +

Definition at line 3301 of file Visualizer.cpp.

+ +
+
+ +

◆ dy

+ +
+
+ + + + +
float dy = 0.0
+
+ +

Definition at line 3299 of file Visualizer.cpp.

+ +
+
+ +

◆ dy_m

+ +
+
+ + + + +
float dy_m = 0.0
+
+ +

Definition at line 3302 of file Visualizer.cpp.

+ +
+
+ +

◆ dz

+ +
+
+ + + + +
float dz = 0.0
+
+ +

Definition at line 3300 of file Visualizer.cpp.

+ +
+
+ +

◆ lbutton_down

+ +
+
+ + + + +
bool lbutton_down = false
+
+ +

Definition at line 4331 of file Visualizer.cpp.

+ +
+
+ +

◆ mbutton_down

+ +
+
+ + + + +
bool mbutton_down = false
+
+ +

Definition at line 4333 of file Visualizer.cpp.

+ +
+
+ +

◆ rbutton_down

+ +
+
+ + + + +
bool rbutton_down = false
+
+ +

Definition at line 4332 of file Visualizer.cpp.

+ +
+
+ +

◆ scroll

+ +
+
+ + + + +
bool scroll = false
+
+ +

Definition at line 4336 of file Visualizer.cpp.

+ +
+
+ +

◆ scrollX

+ +
+
+ + + + +
double scrollX
+
+ +

Definition at line 4335 of file Visualizer.cpp.

+ +
+
+ +

◆ scrollY

+ +
+
+ + + + +
double scrollY
+
+ +

Definition at line 4335 of file Visualizer.cpp.

+ +
+
+ +

◆ startX

+ +
+
+ + + + +
double startX
+
+ +

Definition at line 4334 of file Visualizer.cpp.

+ +
+
+ +

◆ startY

+ +
+
+ + + + +
double startY
+
+ +

Definition at line 4334 of file Visualizer.cpp.

+
+
diff --git a/doc/html/_visualizer_8cpp_source.html b/doc/html/_visualizer_8cpp_source.html index 02154a1d4..ec9d992b5 100644 --- a/doc/html/_visualizer_8cpp_source.html +++ b/doc/html/_visualizer_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Visualizer.cpp
@@ -120,12 +132,14 @@
40
41using namespace helios;
42
+
44
45 struct jpeg_error_mgr pub; /* "public" fields */
46
47 jmp_buf setjmp_buffer; /* for return to caller */
48};
+
49typedef struct my_error_mgr * my_error_ptr;
50METHODDEF(void) my_error_exit (j_common_ptr cinfo){
51 /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
@@ -139,6 +153,7 @@
59 longjmp(myerr->setjmp_buffer, 1);
60}
61
+
62int read_JPEG_file (const char * filename, std::vector<unsigned char> &texture, uint & height, uint & width){
63
64 std::string fn = filename;
@@ -206,7 +221,9 @@
126
127 return 0;
128}
+
129
+
130int write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages) {
131
132 if( print_messages ) {
@@ -279,6 +296,7 @@
199 return 1;
200
201}
+
202
203int write_JPEG_file(const char *filename, const uint width, const uint height, const std::vector<helios::RGBcolor> &data, bool print_messages) {
204
@@ -345,6 +363,7 @@
265
266}
267
+
268void read_png_file( const char* filename, std::vector<unsigned char> &texture, uint & height, uint & width){
269
270 std::string fn = filename;
@@ -434,22 +453,29 @@
354 png_destroy_read_struct(&png_ptr, &info_ptr, nullptr);
355
356}
+
357
+
358Visualizer::Visualizer( uint Wdisplay ) : colormap_current(), colormap_lava(), colormap_rainbow(), colormap_gray(), colormap_cool(), colormap_parula(), colormap_hot() {
359 initialize(Wdisplay, uint(std::round(Wdisplay * 0.8)), 16, true);
360}
+
361
+
362Visualizer::Visualizer(uint Wdisplay, uint Hdisplay ) : colormap_lava(), colormap_current(), colormap_cool(), colormap_rainbow(), colormap_parula(), colormap_gray(), colormap_hot() {
363 initialize(Wdisplay, Hdisplay, 16, true);
364}
+
365
366Visualizer::Visualizer(uint Wdisplay, uint Hdisplay, int aliasing_samples ) : colormap_lava(), colormap_cool(), colormap_rainbow(), colormap_current(), colormap_hot(), colormap_parula(), colormap_gray() {
367 initialize(Wdisplay, Hdisplay, aliasing_samples, true);
368}
369
+
370Visualizer::Visualizer(uint Wdisplay, uint Hdisplay, int aliasing_samples, bool window_decorations ) : colormap_current(), colormap_cool(), colormap_gray(), colormap_hot(), colormap_parula(), colormap_rainbow(), colormap_lava() {
371 initialize(Wdisplay, Hdisplay, aliasing_samples, window_decorations);
372}
+
373
374void Visualizer::openWindow(){
375
@@ -741,3950 +767,4239 @@
661
662 colormap_current = colormap_hot;
663
-
664 assert(checkerrors());
-
665
-
666}
+
664 glfwSetMouseButtonCallback( (GLFWwindow*) window, mouseCallback );
+
665 glfwSetCursorPosCallback( (GLFWwindow*) window, cursorCallback );
+
666 glfwSetScrollCallback( (GLFWwindow*) window, scrollCallback );
667
-
668Visualizer::~Visualizer(){
-
669 glDeleteFramebuffers(1, &framebufferID);
-
670 glDeleteTextures( 1, &depthTexture);
-
671 glDeleteBuffers( 1, &positionBuffer);
-
672 glDeleteBuffers(1, &colorBuffer);
-
673 glDeleteBuffers(1, &normalBuffer);
-
674 glDeleteBuffers(1, &uvBuffer);
-
675 glDeleteBuffers(1, &textureFlagBuffer);
-
676 glDeleteBuffers(1, &coordinateFlagBuffer);
-
677
-
678 for( auto iter=textureIDData.begin(); iter!=textureIDData.end(); ++iter ){
-
679 std::vector<int> ID = textureIDData.at(iter->first);
-
680 for(int i : ID){
-
681 uint IDu = uint(i);
-
682 glDeleteTextures(1, &IDu );
-
683 }
-
684 }
-
685
-
686 glfwDestroyWindow((GLFWwindow*)window);
-
687 glfwTerminate();
-
688}
+
668 assert(checkerrors());
+
669
+
670}
+
671
+
672Visualizer::~Visualizer(){
+
673 glDeleteFramebuffers(1, &framebufferID);
+
674 glDeleteTextures( 1, &depthTexture);
+
675 glDeleteBuffers( 1, &positionBuffer);
+
676 glDeleteBuffers(1, &colorBuffer);
+
677 glDeleteBuffers(1, &normalBuffer);
+
678 glDeleteBuffers(1, &uvBuffer);
+
679 glDeleteBuffers(1, &textureFlagBuffer);
+
680 glDeleteBuffers(1, &coordinateFlagBuffer);
+
681
+
682 for( auto iter=textureIDData.begin(); iter!=textureIDData.end(); ++iter ){
+
683 std::vector<int> ID = textureIDData.at(iter->first);
+
684 for(int i : ID){
+
685 uint IDu = uint(i);
+
686 glDeleteTextures(1, &IDu );
+
687 }
+
688 }
689
- -
691
-
692 if( message_flag ){
-
693 std::cout << "Running visualizer self-test..." << std::flush;
-
694 }
+
690 glfwDestroyWindow((GLFWwindow*)window);
+
691 glfwTerminate();
+
692}
+
693
+
+
695
-
696 Visualizer visualizer( 1000 );
-
697
-
698 visualizer.setCameraPosition( make_SphericalCoord(10,0.49*M_PI,0), make_vec3(0,0,0) );
+
696 if( message_flag ){
+
697 std::cout << "Running visualizer self-test..." << std::flush;
+
698 }
699
- +
700 Visualizer visualizer( 1000 );
701
-
702 //---- rectangles ----//
+
702 visualizer.setCameraPosition( make_SphericalCoord(10,0.49*M_PI,0), make_vec3(0,0,0) );
703
-
704 visualizer.addRectangleByCenter( make_vec3(-1.5,0,0), make_vec2(1,2), make_SphericalCoord(0.f,0.f), make_RGBAcolor(RGB::yellow,0.5), Visualizer::COORDINATES_CARTESIAN );
-
705 visualizer.addRectangleByCenter( make_vec3(-0.5,-0.5,0), make_vec2(1,1), make_SphericalCoord(0.f,0.f), RGB::blue, Visualizer::COORDINATES_CARTESIAN );
-
706 visualizer.addRectangleByCenter( make_vec3(-0.5,0.5,0), make_vec2(1,1), make_SphericalCoord(0.f,0.f), RGB::red, Visualizer::COORDINATES_CARTESIAN );
-
707 visualizer.addRectangleByCenter( make_vec3(1.5,0.5,0), make_vec2(3.41,1), make_SphericalCoord(0,0), "plugins/visualizer/textures/Helios_logo.png", Visualizer::COORDINATES_CARTESIAN );
-
708 visualizer.addRectangleByCenter( make_vec3(1.5,-0.5,0), make_vec2(3.41,1), make_SphericalCoord(0,0), "plugins/visualizer/textures/Helios_logo.jpeg", Visualizer::COORDINATES_CARTESIAN );
-
709
-
710 std::vector<vec3> vertices;
-
711 vertices.resize(4);
-
712
-
713 vertices.at(0) = make_vec3(-2,-1,0);
-
714 vertices.at(1) = make_vec3(-2,1,0);
-
715 vertices.at(2) = make_vec3(-3,0.5,0);
-
716 vertices.at(3) = make_vec3(-3,-0.5,0);
-
717 visualizer.addRectangleByVertices( vertices, RGB::green, Visualizer::COORDINATES_CARTESIAN );
-
718
-
719 vertices.at(0) = make_vec3(-3,-0.5,0);
-
720 vertices.at(1) = make_vec3(-3,0.5,0);
-
721 vertices.at(2) = make_vec3(-4,1,0);
-
722 vertices.at(3) = make_vec3(-4,-1,0);
-
723 visualizer.addRectangleByVertices( vertices, make_RGBAcolor(RGB::violet,0.5), Visualizer::COORDINATES_CARTESIAN );
-
724
-
725 vertices.at(0) = make_vec3(-4,-1,0);
-
726 vertices.at(1) = make_vec3(-4,1,0);
-
727 vertices.at(2) = make_vec3(-5,0.5,0);
-
728 vertices.at(3) = make_vec3(-5,-0.5,0);
-
729 visualizer.addRectangleByVertices( vertices, "plugins/visualizer/textures/Helios_logo.png", Visualizer::COORDINATES_CARTESIAN );
-
730
-
731 //---- triangles ----//
-
732
-
733 vec3 v0, v1, v2;
+ +
705
+
706 //---- rectangles ----//
+
707
+
708 visualizer.addRectangleByCenter( make_vec3(-1.5,0,0), make_vec2(1,2), make_SphericalCoord(0.f,0.f), make_RGBAcolor(RGB::yellow,0.5), Visualizer::COORDINATES_CARTESIAN );
+
709 visualizer.addRectangleByCenter( make_vec3(-0.5,-0.5,0), make_vec2(1,1), make_SphericalCoord(0.f,0.f), RGB::blue, Visualizer::COORDINATES_CARTESIAN );
+
710 visualizer.addRectangleByCenter( make_vec3(-0.5,0.5,0), make_vec2(1,1), make_SphericalCoord(0.f,0.f), RGB::red, Visualizer::COORDINATES_CARTESIAN );
+
711 visualizer.addRectangleByCenter( make_vec3(1.5,0.5,0), make_vec2(3.41,1), make_SphericalCoord(0,0), "plugins/visualizer/textures/Helios_logo.png", Visualizer::COORDINATES_CARTESIAN );
+
712 visualizer.addRectangleByCenter( make_vec3(1.5,-0.5,0), make_vec2(3.41,1), make_SphericalCoord(0,0), "plugins/visualizer/textures/Helios_logo.jpeg", Visualizer::COORDINATES_CARTESIAN );
+
713
+
714 std::vector<vec3> vertices;
+
715 vertices.resize(4);
+
716
+
717 vertices.at(0) = make_vec3(-2,-1,0);
+
718 vertices.at(1) = make_vec3(-2,1,0);
+
719 vertices.at(2) = make_vec3(-3,0.5,0);
+
720 vertices.at(3) = make_vec3(-3,-0.5,0);
+
721 visualizer.addRectangleByVertices( vertices, RGB::green, Visualizer::COORDINATES_CARTESIAN );
+
722
+
723 vertices.at(0) = make_vec3(-3,-0.5,0);
+
724 vertices.at(1) = make_vec3(-3,0.5,0);
+
725 vertices.at(2) = make_vec3(-4,1,0);
+
726 vertices.at(3) = make_vec3(-4,-1,0);
+
727 visualizer.addRectangleByVertices( vertices, make_RGBAcolor(RGB::violet,0.5), Visualizer::COORDINATES_CARTESIAN );
+
728
+
729 vertices.at(0) = make_vec3(-4,-1,0);
+
730 vertices.at(1) = make_vec3(-4,1,0);
+
731 vertices.at(2) = make_vec3(-5,0.5,0);
+
732 vertices.at(3) = make_vec3(-5,-0.5,0);
+
733 visualizer.addRectangleByVertices( vertices, "plugins/visualizer/textures/Helios_logo.png", Visualizer::COORDINATES_CARTESIAN );
734
-
735 v0 = make_vec3(-1,-3,0);
-
736 v1 = make_vec3(1,-3,0);
-
737 v2 = make_vec3(1,-4,0);
-
738 visualizer.addTriangle(v0,v1,v2,make_RGBAcolor(RGB::red,0.5), Visualizer::COORDINATES_CARTESIAN );
-
739
-
740 v0 = make_vec3(-1,-3,0);
-
741 v1 = make_vec3(-1,-4,0);
-
742 v2 = make_vec3(1,-4,0);
-
743 visualizer.addTriangle(v0,v1,v2,RGB::blue, Visualizer::COORDINATES_CARTESIAN );
-
744
-
745 //---- disks ----//
-
746
-
747 visualizer.addDiskByCenter( make_vec3(0,3,0), make_vec2(sqrtf(2)/2.f,sqrtf(2)/2.f), make_SphericalCoord(0,0), 50, RGB::blue, Visualizer::COORDINATES_CARTESIAN );
+
735 //---- triangles ----//
+
736
+
737 vec3 v0, v1, v2;
+
738
+
739 v0 = make_vec3(-1,-3,0);
+
740 v1 = make_vec3(1,-3,0);
+
741 v2 = make_vec3(1,-4,0);
+
742 visualizer.addTriangle(v0,v1,v2,make_RGBAcolor(RGB::red,0.5), Visualizer::COORDINATES_CARTESIAN );
+
743
+
744 v0 = make_vec3(-1,-3,0);
+
745 v1 = make_vec3(-1,-4,0);
+
746 v2 = make_vec3(1,-4,0);
+
747 visualizer.addTriangle(v0,v1,v2,RGB::blue, Visualizer::COORDINATES_CARTESIAN );
748
-
749 visualizer.addDiskByCenter( make_vec3(-3,3,0), make_vec2(sqrtf(2)/2.f,sqrtf(2)/2.f), make_SphericalCoord(0,0), 50, "plugins/visualizer/textures/compass.jpg", Visualizer::COORDINATES_CARTESIAN );
+
749 //---- disks ----//
750
-
751 //---- lines ----//
+
751 visualizer.addDiskByCenter( make_vec3(0,3,0), make_vec2(sqrtf(2)/2.f,sqrtf(2)/2.f), make_SphericalCoord(0,0), 50, RGB::blue, Visualizer::COORDINATES_CARTESIAN );
752
-
753 visualizer.addLine( make_vec3(-1,3,0), make_vec3(0,4,0), RGB::red, 1, Visualizer::COORDINATES_CARTESIAN );
-
754 visualizer.addLine( make_vec3(0,4,0), make_vec3(1,3,0), RGB::red, 1, Visualizer::COORDINATES_CARTESIAN );
-
755 visualizer.addLine( make_vec3(1,3,0), make_vec3(0,2,0), RGB::red, 1, Visualizer::COORDINATES_CARTESIAN );
-
756 visualizer.addLine( make_vec3(0,2,0), make_vec3(-1,3,0), RGB::red, 1, Visualizer::COORDINATES_CARTESIAN );
-
757
-
758 if( message_flag ){
-
759 std::cout << "done." << std::endl;
-
760 }
+
753 visualizer.addDiskByCenter( make_vec3(-3,3,0), make_vec2(sqrtf(2)/2.f,sqrtf(2)/2.f), make_SphericalCoord(0,0), 50, "plugins/visualizer/textures/compass.jpg", Visualizer::COORDINATES_CARTESIAN );
+
754
+
755 //---- lines ----//
+
756
+
757 visualizer.addLine( make_vec3(-1,3,0), make_vec3(0,4,0), RGB::red, 1, Visualizer::COORDINATES_CARTESIAN );
+
758 visualizer.addLine( make_vec3(0,4,0), make_vec3(1,3,0), RGB::red, 1, Visualizer::COORDINATES_CARTESIAN );
+
759 visualizer.addLine( make_vec3(1,3,0), make_vec3(0,2,0), RGB::red, 1, Visualizer::COORDINATES_CARTESIAN );
+
760 visualizer.addLine( make_vec3(0,2,0), make_vec3(-1,3,0), RGB::red, 1, Visualizer::COORDINATES_CARTESIAN );
761
-
762 return 0;
-
763
-
764}
+
762 if( message_flag ){
+
763 std::cout << "done." << std::endl;
+
764 }
765
- -
767 message_flag = true;
+
766 return 0;
+
767
768}
+
769
- -
771 message_flag = false;
+
+ +
771 message_flag = true;
772}
+
773
-
774void Visualizer::setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt ){
-
775 camera_eye_location = cameraPosition;
-
776 camera_lookat_center = lookAt;
-
777}
-
778
- +
+ +
775 message_flag = false;
+
776}
+
+
777
+
+
778void Visualizer::setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt ){
+
779 camera_eye_location = cameraPosition;
780 camera_lookat_center = lookAt;
-
781 camera_eye_location = camera_lookat_center + sphere2cart(cameraAngle);vec3 camvec = camera_eye_location-camera_lookat_center;
-
782}
-
783
-
784void Visualizer::setCameraFieldOfView( float angle_FOV ){
-
785 camera_FOV = angle_FOV;
+
781}
+
+
782
+
+ +
784 camera_lookat_center = lookAt;
+
785 camera_eye_location = camera_lookat_center + sphere2cart(cameraAngle);vec3 camvec = camera_eye_location-camera_lookat_center;
786}
+
787
- -
789
-
790 light_direction = direction/direction.magnitude();
-
791 primaryShader.setLightDirection(direction);
-
792
-
793}
-
794
-
795void Visualizer::getDomainBoundingBox( vec2& xbounds, vec2& ybounds, vec2& zbounds ) const{
+
+
788void Visualizer::setCameraFieldOfView( float angle_FOV ){
+
789 camera_FOV = angle_FOV;
+
790}
+
+
791
+
+ +
793
+
794 light_direction = direction/direction.magnitude();
+
795 primaryShader.setLightDirection(direction);
796
-
797 xbounds.x = 1e8;
-
798 xbounds.y = -1e8;
-
799 ybounds.x = 1e8;
-
800 ybounds.y = -1e8;
-
801 zbounds.x = 1e8;
-
802 zbounds.y = -1e8;
-
803
-
804 for( std::map<std::string,std::vector<float> >::const_iterator iter = positionData.begin(); iter != positionData.end(); ++iter ){
-
805
-
806 std::string ptype = iter->first;
+
797}
+
+
798
+
+
799void Visualizer::getDomainBoundingBox( vec2& xbounds, vec2& ybounds, vec2& zbounds ) const{
+
800
+
801 xbounds.x = 1e8;
+
802 xbounds.y = -1e8;
+
803 ybounds.x = 1e8;
+
804 ybounds.y = -1e8;
+
805 zbounds.x = 1e8;
+
806 zbounds.y = -1e8;
807
-
808 std::vector<float> positions = iter->second;
+
808 for( std::map<std::string,std::vector<float> >::const_iterator iter = positionData.begin(); iter != positionData.end(); ++iter ){
809
-
810 for( size_t p=0; p<positions.size()/3; p++ ){
+
810 std::string ptype = iter->first;
811
-
812 if( coordinateFlagData.at(ptype).at(p)==COORDINATES_WINDOW_NORMALIZED ){
-
813 continue;
-
814 }
+
812 std::vector<float> positions = iter->second;
+
813
+
814 for( size_t p=0; p<positions.size()/3; p++ ){
815
-
816 vec3 verts;
-
817 verts.x = positions.at(p*3);
-
818 verts.y = positions.at(p*3+1);
-
819 verts.z = positions.at(p*3+2);
-
820
-
821 if( verts.x<xbounds.x ){
-
822 xbounds.x = verts.x;
-
823 }
-
824 if( verts.x>xbounds.y ){
-
825 xbounds.y = verts.x;
-
826 }
-
827 if( verts.y<ybounds.x ){
-
828 ybounds.x = verts.y;
-
829 }
-
830 if( verts.y>ybounds.y ){
-
831 ybounds.y = verts.y;
-
832 }
-
833 if( verts.z<zbounds.x ){
-
834 zbounds.x = verts.z;
-
835 }
-
836 if( verts.z>zbounds.y ){
-
837 zbounds.y = verts.z;
-
838 }
-
839 }
-
840
-
841 }
-
842
-
843 return;
+
816 if( coordinateFlagData.at(ptype).at(p)==COORDINATES_WINDOW_NORMALIZED ){
+
817 continue;
+
818 }
+
819
+
820 vec3 verts;
+
821 verts.x = positions.at(p*3);
+
822 verts.y = positions.at(p*3+1);
+
823 verts.z = positions.at(p*3+2);
+
824
+
825 if( verts.x<xbounds.x ){
+
826 xbounds.x = verts.x;
+
827 }
+
828 if( verts.x>xbounds.y ){
+
829 xbounds.y = verts.x;
+
830 }
+
831 if( verts.y<ybounds.x ){
+
832 ybounds.x = verts.y;
+
833 }
+
834 if( verts.y>ybounds.y ){
+
835 ybounds.y = verts.y;
+
836 }
+
837 if( verts.z<zbounds.x ){
+
838 zbounds.x = verts.z;
+
839 }
+
840 if( verts.z>zbounds.y ){
+
841 zbounds.y = verts.z;
+
842 }
+
843 }
844
-
845}
+
845 }
846
- +
847 return;
848
-
849 vec2 xbounds, ybounds, zbounds;
-
850 getDomainBoundingBox( xbounds, ybounds, zbounds );
-
851
-
852 vec3 R;
-
853 R.x = fmax( xbounds.x, xbounds.y );
-
854 R.y = fmax( ybounds.x, ybounds.y );
-
855 R.z = fmax( zbounds.x, zbounds.y );
-
856
-
857 return R.magnitude();
-
858
-
859}
+
849}
+
+
850
+
+ +
852
+
853 vec2 xbounds, ybounds, zbounds;
+
854 getDomainBoundingBox( xbounds, ybounds, zbounds );
+
855
+
856 vec3 R;
+
857 R.x = fmax( xbounds.x, xbounds.y );
+
858 R.y = fmax( ybounds.x, ybounds.y );
+
859 R.z = fmax( zbounds.x, zbounds.y );
860
- -
862 for( uint i=0; i<primaryLightingModel.size(); i++ ){
-
863 primaryLightingModel.at(i) = lightingmodel;
-
864 }
-
865}
-
866
-
867void Visualizer::setLightIntensityFactor( float lightintensityfactor ){
-
868 lightintensity = lightintensityfactor;
+
861 return R.magnitude();
+
862
+
863}
+
+
864
+
+ +
866 for( uint i=0; i<primaryLightingModel.size(); i++ ){
+
867 primaryLightingModel.at(i) = lightingmodel;
+
868 }
869}
+
870
- -
872 backgroundColor = color;
+
+
871void Visualizer::setLightIntensityFactor( float lightintensityfactor ){
+
872 lightintensity = lightintensityfactor;
873}
+
874
- -
876
-
877 char outfile[100];
-
878 if( context!=nullptr ){//context has been given to visualizer via buildContextGeometry()
-
879 Date date = context->getDate();
-
880 Time time = context->getTime();
-
881 std::snprintf(outfile,100,"%02d-%02d-%4d_%02d-%02d-%02d_frame%d.jpg",date.day,date.month,date.year,time.hour,time.minute,time.second,frame_counter);
-
882 }else{
-
883 std::snprintf(outfile,100,"frame%d.jpg",frame_counter);
-
884 }
-
885 frame_counter++;
-
886
-
887 printWindow( outfile );
-
888}
-
889
-
890void Visualizer::printWindow( const char* outfile ){
-
891
-
892 std::string outfile_str = outfile;
-
893 validateOutputPath( outfile_str, {".jpeg", ".jpg", ".JPEG", ".JPG"} );
-
894
-
895 write_JPEG_file(outfile_str.c_str(), Wframebuffer, Hframebuffer, window, message_flag);
-
896
-
897}
+
+ +
876 backgroundColor = color;
+
877}
+
+
878
+
+ +
880
+
881 char outfile[100];
+
882 if( context!=nullptr ){//context has been given to visualizer via buildContextGeometry()
+
883 Date date = context->getDate();
+
884 Time time = context->getTime();
+
885 std::snprintf(outfile,100,"%02d-%02d-%4d_%02d-%02d-%02d_frame%d.jpg",date.day,date.month,date.year,time.hour,time.minute,time.second,frame_counter);
+
886 }else{
+
887 std::snprintf(outfile,100,"frame%d.jpg",frame_counter);
+
888 }
+
889 frame_counter++;
+
890
+
891 printWindow( outfile );
+
892}
+
+
893
+
+
894void Visualizer::printWindow( const char* outfile ){
+
895
+
896 std::string outfile_str = outfile;
+
897 validateOutputPath( outfile_str, {".jpeg", ".jpg", ".JPEG", ".JPG"} );
898
-
899void Visualizer::getWindowPixelsRGB( uint * buffer ){
+
899 write_JPEG_file(outfile_str.c_str(), Wframebuffer, Hframebuffer, window, message_flag);
900
-
901 std::vector<GLubyte> buff;
-
902 buff.resize( 3*Wframebuffer*Hframebuffer );
-
903
-
904 glfwSwapBuffers((GLFWwindow*)window);
-
905 glReadPixels(0, 0, GLsizei(Wframebuffer), GLsizei(Hframebuffer), GL_RGB, GL_UNSIGNED_BYTE, &buff[0]);
-
906
-
907 //depending on the active frame buffer, we may get all zero data and need to swap it again.
-
908 bool zeros = true;
-
909 for( int i=0; i<3*Wframebuffer*Hframebuffer; i++ ){
-
910 if( buff[i]!=0 ){
-
911 zeros = false;
-
912 }
-
913 }
-
914 if( zeros ){
-
915
-
916 glfwSwapBuffers((GLFWwindow*)window);
-
917
-
918 glReadPixels(0, 0, GLsizei(Wframebuffer), GLsizei(Hframebuffer), GL_RGB, GL_UNSIGNED_BYTE, &buff[0]);
+
901}
+
+
902
+
+
903void Visualizer::getWindowPixelsRGB( uint * buffer ){
+
904
+
905 std::vector<GLubyte> buff;
+
906 buff.resize( 3*Wframebuffer*Hframebuffer );
+
907
+
908 glfwSwapBuffers((GLFWwindow*)window);
+
909 glReadPixels(0, 0, GLsizei(Wframebuffer), GLsizei(Hframebuffer), GL_RGB, GL_UNSIGNED_BYTE, &buff[0]);
+
910
+
911 //depending on the active frame buffer, we may get all zero data and need to swap it again.
+
912 bool zeros = true;
+
913 for( int i=0; i<3*Wframebuffer*Hframebuffer; i++ ){
+
914 if( buff[i]!=0 ){
+
915 zeros = false;
+
916 }
+
917 }
+
918 if( zeros ){
919
-
920 }
+
920 glfwSwapBuffers((GLFWwindow*)window);
921
-
922 //assert( checkerrors() );
+
922 glReadPixels(0, 0, GLsizei(Wframebuffer), GLsizei(Hframebuffer), GL_RGB, GL_UNSIGNED_BYTE, &buff[0]);
923
-
924 for( int i=0; i<3*Wframebuffer*Hframebuffer; i++ ){
-
925 buffer[i] = (unsigned int)buff[i];
-
926 }
+
924 }
+
925
+
926 //assert( checkerrors() );
927
-
928}
-
929
-
930void Visualizer::getDepthMap( float * buffer ){
+
928 for( int i=0; i<3*Wframebuffer*Hframebuffer; i++ ){
+
929 buffer[i] = (unsigned int)buff[i];
+
930 }
931
-
932 if( depth_buffer_data.empty() ){
-
933 helios_runtime_error("ERROR (Visualizer::getDepthMap): No depth map data available. You must run 'plotDepthMap' before depth map can be retrieved.");
-
934 }
+
932}
+
+
933
+
+
934void Visualizer::getDepthMap( float * buffer ){
935
-
936 updatePerspectiveTransformation( camera_lookat_center, camera_eye_location );
-
937
-
938 for( int i=0; i<depth_buffer_data.size(); i++ ){
-
939 buffer[i] = -perspectiveTransformationMatrix[3].z/(depth_buffer_data.at(i) * -2.0f + 1.0f - perspectiveTransformationMatrix[2].z);
-
940 //buffer[i] = -(depth_buffer_data.at(i) * 2.0 - 1.0 - perspectiveTransformationMatrix[3].z)/perspectiveTransformationMatrix[2].z;
-
941 }
-
942
-
943}
-
944
-
945void Visualizer::getWindowSize( uint &width, uint &height ) const{
-
946 width = Wdisplay;
-
947 height = Hdisplay;
-
948}
-
949
-
950void Visualizer::getFramebufferSize( uint &width, uint &height ) const{
-
951 width = Wframebuffer;
-
952 height = Hframebuffer;
-
953}
-
954
- -
956 positionData.clear();
-
957 colorData.clear();
-
958 normalData.clear();
-
959 uvData.clear();
-
960 coordinateFlagData.clear();
-
961 textureFlagData.clear();
-
962 textureIDData.clear();
-
963 contextPrimitiveIDs.clear();
-
964 colorPrimitives_UUIDs.clear();
-
965 colorPrimitives_objIDs.clear();
-
966 contextPrimitiveIDs.clear();
-
967 depth_buffer_data.clear();
-
968 group_start.clear();
-
969 colorbar_min = 0;
-
970 colorbar_max = 0;
-
971}
-
972
- -
974 glfwHideWindow( (GLFWwindow*) window);
-
975 glfwPollEvents();
-
976}
-
977
- -
979 isWatermarkVisible = false;
+
936 if( depth_buffer_data.empty() ){
+
937 helios_runtime_error("ERROR (Visualizer::getDepthMap): No depth map data available. You must run 'plotDepthMap' before depth map can be retrieved.");
+
938 }
+
939
+
940 updatePerspectiveTransformation( camera_lookat_center, camera_eye_location );
+
941
+
942 for( int i=0; i<depth_buffer_data.size(); i++ ){
+
943 buffer[i] = -perspectiveTransformationMatrix[3].z/(depth_buffer_data.at(i) * -2.0f + 1.0f - perspectiveTransformationMatrix[2].z);
+
944 //buffer[i] = -(depth_buffer_data.at(i) * 2.0 - 1.0 - perspectiveTransformationMatrix[3].z)/perspectiveTransformationMatrix[2].z;
+
945 }
+
946
+
947}
+
+
948
+
+
949void Visualizer::getWindowSize( uint &width, uint &height ) const{
+
950 width = Wdisplay;
+
951 height = Hdisplay;
+
952}
+
+
953
+
+
954void Visualizer::getFramebufferSize( uint &width, uint &height ) const{
+
955 width = Wframebuffer;
+
956 height = Hframebuffer;
+
957}
+
+
958
+
+ +
960 positionData.clear();
+
961 colorData.clear();
+
962 normalData.clear();
+
963 uvData.clear();
+
964 coordinateFlagData.clear();
+
965 textureFlagData.clear();
+
966 textureIDData.clear();
+
967 contextPrimitiveIDs.clear();
+
968 colorPrimitives_UUIDs.clear();
+
969 colorPrimitives_objIDs.clear();
+
970 contextPrimitiveIDs.clear();
+
971 depth_buffer_data.clear();
+
972 group_start.clear();
+
973 colorbar_min = 0;
+
974 colorbar_max = 0;
+
975}
+
+
976
+
+ +
978 glfwHideWindow( (GLFWwindow*) window);
+
979 glfwPollEvents();
980}
+
981
- -
983 isWatermarkVisible = true;
+
+ +
983 isWatermarkVisible = false;
984}
+
985
-
986void Visualizer::updatePerspectiveTransformation(const helios::vec3 &center, const helios::vec3 &eye ){
-
987
-
988 float m = fmax( fabs(center.x-eye.x), fmax( fabs(center.y-eye.y), fabs(center.z-eye.z) ) );
-
989 glm::mat4 Projection = glm::perspective( glm::radians(camera_FOV), float(Wdisplay)/float(Hdisplay), 0.01f*m, 100.f*m );
-
990 glm::mat4 View = glm::lookAt( glm::vec3(eye.x,eye.y,eye.z),glm::vec3(center.x,center.y,center.z),glm::vec3(0,0,1) );
+
+ +
987 isWatermarkVisible = true;
+
988}
+
+
989
+
990void Visualizer::updatePerspectiveTransformation(const helios::vec3 &center, const helios::vec3 &eye ){
991
-
992 perspectiveTransformationMatrix = Projection * View ;
-
993}
-
994
-
995void Visualizer::updateCustomTransformation(const glm::mat4 &matrix ){
-
996 customTransformationMatrix = matrix;
+
992 float m = fmax( fabs(center.x-eye.x), fmax( fabs(center.y-eye.y), fabs(center.z-eye.z) ) );
+
993 glm::mat4 Projection = glm::perspective( glm::radians(camera_FOV), float(Wdisplay)/float(Hdisplay), 0.01f*m, 100.f*m );
+
994 glm::mat4 View = glm::lookAt( glm::vec3(eye.x,eye.y,eye.z),glm::vec3(center.x,center.y,center.z),glm::vec3(0,0,1) );
+
995
+
996 perspectiveTransformationMatrix = Projection * View ;
997}
998
-
999void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color, CoordinateSystem coordFlag ){
-
1000 addRectangleByCenter( center, size, rotation, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
999void Visualizer::updateCustomTransformation(const glm::mat4 &matrix ){
+
1000 customTransformationMatrix = matrix;
1001}
1002
-
1003void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBAcolor &color, CoordinateSystem coordFlag ){
-
1004
-
1005 std::vector<vec3> vertices;
-
1006 vertices.resize(4);
-
1007
-
1008 vec3 v0 = make_vec3( -0.5f*size.x, - 0.5f*size.y, 0.f );
-
1009 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1010 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1011 vertices.at(0) = center + v0;
-
1012
-
1013 vec3 v1 = make_vec3( +0.5f*size.x, - 0.5f*size.y, 0.f );
-
1014 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1015 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1016 vertices.at(1) = center + v1;
-
1017
-
1018 vec3 v2 = make_vec3( +0.5f*size.x, +0.5f*size.y, 0.f );
-
1019 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1020 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1021 vertices.at(2) = center + v2;
-
1022
-
1023 vec3 v3 = make_vec3( -0.5f*size.x, +0.5f*size.y, 0.f );
-
1024 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1025 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1026 vertices.at(3) = center + v3;
-
1027
-
1028 addRectangleByVertices( vertices, color, coordFlag );
-
1029
-
1030}
+
+
1003void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color, CoordinateSystem coordFlag ){
+
1004 addRectangleByCenter( center, size, rotation, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
1005}
+
+
1006
+
+
1007void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBAcolor &color, CoordinateSystem coordFlag ){
+
1008
+
1009 std::vector<vec3> vertices;
+
1010 vertices.resize(4);
+
1011
+
1012 vec3 v0 = make_vec3( -0.5f*size.x, - 0.5f*size.y, 0.f );
+
1013 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1014 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1015 vertices.at(0) = center + v0;
+
1016
+
1017 vec3 v1 = make_vec3( +0.5f*size.x, - 0.5f*size.y, 0.f );
+
1018 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1019 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1020 vertices.at(1) = center + v1;
+
1021
+
1022 vec3 v2 = make_vec3( +0.5f*size.x, +0.5f*size.y, 0.f );
+
1023 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1024 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1025 vertices.at(2) = center + v2;
+
1026
+
1027 vec3 v3 = make_vec3( -0.5f*size.x, +0.5f*size.y, 0.f );
+
1028 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1029 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1030 vertices.at(3) = center + v3;
1031
-
1032void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const char* texture_file, CoordinateSystem coordFlag ){
+
1032 addRectangleByVertices( vertices, color, coordFlag );
1033
-
1034 std::vector<vec3> vertices;
-
1035 vertices.resize(4);
-
1036
-
1037 vec3 v0 = make_vec3( -0.5f*size.x, - 0.5f*size.y, 0.f );
-
1038 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1039 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1040 vertices.at(0) = center + v0;
-
1041
-
1042 vec3 v1 = make_vec3( +0.5f*size.x, - 0.5f*size.y, 0.f );
-
1043 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1044 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1045 vertices.at(1) = center + v1;
-
1046
-
1047 vec3 v2 = make_vec3( +0.5f*size.x, +0.5f*size.y, 0.f );
-
1048 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1049 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1050 vertices.at(2) = center + v2;
-
1051
-
1052 vec3 v3 = make_vec3( -0.5f*size.x, +0.5f*size.y, 0.f );
-
1053 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1054 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1055 vertices.at(3) = center + v3;
-
1056
-
1057 addRectangleByVertices( vertices, texture_file, coordFlag );
-
1058
-
1059}
+
1034}
+
+
1035
+
+
1036void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const char* texture_file, CoordinateSystem coordFlag ){
+
1037
+
1038 std::vector<vec3> vertices;
+
1039 vertices.resize(4);
+
1040
+
1041 vec3 v0 = make_vec3( -0.5f*size.x, - 0.5f*size.y, 0.f );
+
1042 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1043 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1044 vertices.at(0) = center + v0;
+
1045
+
1046 vec3 v1 = make_vec3( +0.5f*size.x, - 0.5f*size.y, 0.f );
+
1047 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1048 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1049 vertices.at(1) = center + v1;
+
1050
+
1051 vec3 v2 = make_vec3( +0.5f*size.x, +0.5f*size.y, 0.f );
+
1052 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1053 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1054 vertices.at(2) = center + v2;
+
1055
+
1056 vec3 v3 = make_vec3( -0.5f*size.x, +0.5f*size.y, 0.f );
+
1057 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1058 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1059 vertices.at(3) = center + v3;
1060
-
1061void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color, const char* texture_file, CoordinateSystem coordFlag ){
+
1061 addRectangleByVertices( vertices, texture_file, coordFlag );
1062
-
1063 std::vector<vec3> vertices;
-
1064 vertices.resize(4);
-
1065
-
1066 vec3 v0 = make_vec3( -0.5f*size.x, - 0.5f*size.y, 0.f );
-
1067 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1068 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1069 vertices.at(0) = center + v0;
-
1070
-
1071 vec3 v1 = make_vec3( +0.5f*size.x, - 0.5f*size.y, 0.f );
-
1072 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1073 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1074 vertices.at(1) = center + v1;
-
1075
-
1076 vec3 v2 = make_vec3( +0.5f*size.x, +0.5f*size.y, 0.f );
-
1077 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1078 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1079 vertices.at(2) = center + v2;
-
1080
-
1081 vec3 v3 = make_vec3( -0.5f*size.x, +0.5f*size.y, 0.f );
-
1082 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1083 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1084 vertices.at(3) = center + v3;
-
1085
-
1086 addRectangleByVertices( vertices, color, texture_file, coordFlag );
-
1087
-
1088}
+
1063}
+
+
1064
+
+
1065void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color, const char* texture_file, CoordinateSystem coordFlag ){
+
1066
+
1067 std::vector<vec3> vertices;
+
1068 vertices.resize(4);
+
1069
+
1070 vec3 v0 = make_vec3( -0.5f*size.x, - 0.5f*size.y, 0.f );
+
1071 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1072 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1073 vertices.at(0) = center + v0;
+
1074
+
1075 vec3 v1 = make_vec3( +0.5f*size.x, - 0.5f*size.y, 0.f );
+
1076 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1077 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1078 vertices.at(1) = center + v1;
+
1079
+
1080 vec3 v2 = make_vec3( +0.5f*size.x, +0.5f*size.y, 0.f );
+
1081 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1082 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1083 vertices.at(2) = center + v2;
+
1084
+
1085 vec3 v3 = make_vec3( -0.5f*size.x, +0.5f*size.y, 0.f );
+
1086 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1087 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1088 vertices.at(3) = center + v3;
1089
-
1090void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color, const Glyph* glyph, CoordinateSystem coordFlag ){
+
1090 addRectangleByVertices( vertices, color, texture_file, coordFlag );
1091
-
1092 std::vector<vec3> vertices;
-
1093 vertices.resize(4);
-
1094
-
1095 vec3 v0 = make_vec3( -0.5f*size.x, - 0.5f*size.y, 0.f );
-
1096 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1097 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1098 vertices.at(0) = center + v0;
-
1099
-
1100 vec3 v1 = make_vec3( +0.5f*size.x, - 0.5f*size.y, 0.f );
-
1101 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1102 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1103 vertices.at(1) = center + v1;
-
1104
-
1105 vec3 v2 = make_vec3( +0.5f*size.x, +0.5f*size.y, 0.f );
-
1106 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1107 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1108 vertices.at(2) = center + v2;
-
1109
-
1110 vec3 v3 = make_vec3( -0.5f*size.x, +0.5f*size.y, 0.f );
-
1111 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
-
1112 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
-
1113 vertices.at(3) = center + v3;
-
1114
-
1115 addRectangleByVertices( vertices, color, glyph, coordFlag );
-
1116
-
1117}
+
1092}
+
+
1093
+
+
1094void Visualizer::addRectangleByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const RGBcolor &color, const Glyph* glyph, CoordinateSystem coordFlag ){
+
1095
+
1096 std::vector<vec3> vertices;
+
1097 vertices.resize(4);
+
1098
+
1099 vec3 v0 = make_vec3( -0.5f*size.x, - 0.5f*size.y, 0.f );
+
1100 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1101 v0 = rotatePointAboutLine( v0, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1102 vertices.at(0) = center + v0;
+
1103
+
1104 vec3 v1 = make_vec3( +0.5f*size.x, - 0.5f*size.y, 0.f );
+
1105 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1106 v1 = rotatePointAboutLine( v1, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1107 vertices.at(1) = center + v1;
+
1108
+
1109 vec3 v2 = make_vec3( +0.5f*size.x, +0.5f*size.y, 0.f );
+
1110 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1111 v2 = rotatePointAboutLine( v2, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1112 vertices.at(2) = center + v2;
+
1113
+
1114 vec3 v3 = make_vec3( -0.5f*size.x, +0.5f*size.y, 0.f );
+
1115 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(1,0,0), -rotation.elevation );
+
1116 v3 = rotatePointAboutLine( v3, make_vec3(0,0,0), make_vec3(0,0,1), -rotation.azimuth );
+
1117 vertices.at(3) = center + v3;
1118
-
1119void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBcolor &color, CoordinateSystem coordFlag ){
-
1120 addRectangleByVertices( vertices, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
1119 addRectangleByVertices( vertices, color, glyph, coordFlag );
+
1120
1121}
+
1122
-
1123void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBAcolor &color, CoordinateSystem coordFlag ){
-
1124
-
1125 std::vector<vec3> v = vertices; //make a copy so we can modify
+
+
1123void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBcolor &color, CoordinateSystem coordFlag ){
+
1124 addRectangleByVertices( vertices, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
1125}
+
1126
-
1127 if( coordFlag == COORDINATES_WINDOW_NORMALIZED ){ //No vertex transformation (i.e., identity matrix)
+
+
1127void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBAcolor &color, CoordinateSystem coordFlag ){
1128
-
1129 //Check that coordinates are inside drawable area
-
1130 for(auto vertex : vertices){
-
1131 if(vertex.x < 0.f || vertex.x > 1.f ){
-
1132 if( message_flag ){
-
1133 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
-
1134 }
-
1135 }else if(vertex.y < 0.f || vertex.y > 1.f ){
+
1129 std::vector<vec3> v = vertices; //make a copy so we can modify
+
1130
+
1131 if( coordFlag == COORDINATES_WINDOW_NORMALIZED ){ //No vertex transformation (i.e., identity matrix)
+
1132
+
1133 //Check that coordinates are inside drawable area
+
1134 for(auto vertex : vertices){
+
1135 if(vertex.x < 0.f || vertex.x > 1.f ){
1136 if( message_flag ){
-
1137 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
+
1137 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
1138 }
-
1139 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1139 }else if(vertex.y < 0.f || vertex.y > 1.f ){
1140 if( message_flag ){
-
1141 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1141 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
1142 }
-
1143 }
-
1144 }
-
1145
-
1146 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
1147 for( uint i=0; i<vertices.size(); i++ ){
-
1148 v.at(i).x = 2.f*v.at(i).x - 1.f;
-
1149 v.at(i).y = 2.f*v.at(i).y - 1.f;
-
1150 }
-
1151
-
1152 }
-
1153
-
1154 std::vector<float> position_data, color_data, normal_data, uv_data;
-
1155 position_data.resize(18,0);
-
1156 color_data.resize(24,0);
-
1157 normal_data.resize(18,0);
-
1158 uv_data.resize(12,0);
-
1159
-
1160 vec3 normal = cross( v.at(1)-v.at(0), v.at(2)-v.at(1) );
-
1161 normal.normalize();
-
1162
-
1163 for( int i=0; i<6; i++ ){
-
1164 color_data.at(i*4) = color.r;
-
1165 color_data.at(i*4+1) = color.g;
-
1166 color_data.at(i*4+2) = color.b;
-
1167 color_data.at(i*4+3) = color.a;
-
1168
-
1169 normal_data.at(i*3) = normal.x;
-
1170 normal_data.at(i*3+1) = normal.y;
-
1171 normal_data.at(i*3+2) = normal.z;
-
1172 }
-
1173
-
1174 //Lower left vertex
-
1175 position_data.at(0) = v.at(0).x;
-
1176 position_data.at(1) = v.at(0).y;
-
1177 position_data.at(2) = v.at(0).z;
-
1178
-
1179 //Lower right vertex
-
1180 position_data.at(3) = v.at(1).x;
-
1181 position_data.at(4) = v.at(1).y;
-
1182 position_data.at(5) = v.at(1).z;
-
1183
-
1184 //Upper right vertex
-
1185 position_data.at(6) = v.at(2).x;
-
1186 position_data.at(7) = v.at(2).y;
-
1187 position_data.at(8) = v.at(2).z;
-
1188
-
1189 //Lower left vertex
-
1190 position_data.at(9) = v.at(0).x;
-
1191 position_data.at(10) = v.at(0).y;
-
1192 position_data.at(11) = v.at(0).z;
-
1193
-
1194 //Upper right vertex
-
1195 position_data.at(12) = v.at(2).x;
-
1196 position_data.at(13) = v.at(2).y;
-
1197 position_data.at(14) = v.at(2).z;
-
1198
-
1199 //Upper left vertex
-
1200 position_data.at(15) = v.at(3).x;
-
1201 position_data.at(16) = v.at(3).y;
-
1202 position_data.at(17) = v.at(3).z;
-
1203
-
1204 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
-
1205 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
-
1206 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
-
1207 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
-
1208
-
1209 std::vector<int> texture_data;
-
1210 std::vector<int> coord_data;
-
1211 texture_data.resize(6,0);
-
1212 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1213 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1214 coord_data.resize(6,coordFlag);
-
1215 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
-
1216
-
1217}
-
1218
-
1219void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const char* texture_file, CoordinateSystem coordFlag ){
-
1220 std::vector<vec2> uvs;
-
1221 uvs.resize(4);
-
1222 uvs.at(0) = make_vec2(0,0);
-
1223 uvs.at(1) = make_vec2(1,0);
-
1224 uvs.at(2) = make_vec2(1,1);
-
1225 uvs.at(3) = make_vec2(0,1);
-
1226 addRectangleByVertices(vertices,texture_file,uvs,coordFlag);
-
1227}
-
1228
-
1229void Visualizer::addRectangleByVertices(const std::vector<vec3> &vertices, const char* texture_file, const std::vector<vec2> &uvs, CoordinateSystem coordFlag ){
-
1230
-
1231 std::vector<vec3> v = vertices; //make a copy so we can modify
+
1143 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1144 if( message_flag ){
+
1145 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1146 }
+
1147 }
+
1148 }
+
1149
+
1150 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
1151 for( uint i=0; i<vertices.size(); i++ ){
+
1152 v.at(i).x = 2.f*v.at(i).x - 1.f;
+
1153 v.at(i).y = 2.f*v.at(i).y - 1.f;
+
1154 }
+
1155
+
1156 }
+
1157
+
1158 std::vector<float> position_data, color_data, normal_data, uv_data;
+
1159 position_data.resize(18,0);
+
1160 color_data.resize(24,0);
+
1161 normal_data.resize(18,0);
+
1162 uv_data.resize(12,0);
+
1163
+
1164 vec3 normal = cross( v.at(1)-v.at(0), v.at(2)-v.at(1) );
+
1165 normal.normalize();
+
1166
+
1167 for( int i=0; i<6; i++ ){
+
1168 color_data.at(i*4) = color.r;
+
1169 color_data.at(i*4+1) = color.g;
+
1170 color_data.at(i*4+2) = color.b;
+
1171 color_data.at(i*4+3) = color.a;
+
1172
+
1173 normal_data.at(i*3) = normal.x;
+
1174 normal_data.at(i*3+1) = normal.y;
+
1175 normal_data.at(i*3+2) = normal.z;
+
1176 }
+
1177
+
1178 //Lower left vertex
+
1179 position_data.at(0) = v.at(0).x;
+
1180 position_data.at(1) = v.at(0).y;
+
1181 position_data.at(2) = v.at(0).z;
+
1182
+
1183 //Lower right vertex
+
1184 position_data.at(3) = v.at(1).x;
+
1185 position_data.at(4) = v.at(1).y;
+
1186 position_data.at(5) = v.at(1).z;
+
1187
+
1188 //Upper right vertex
+
1189 position_data.at(6) = v.at(2).x;
+
1190 position_data.at(7) = v.at(2).y;
+
1191 position_data.at(8) = v.at(2).z;
+
1192
+
1193 //Lower left vertex
+
1194 position_data.at(9) = v.at(0).x;
+
1195 position_data.at(10) = v.at(0).y;
+
1196 position_data.at(11) = v.at(0).z;
+
1197
+
1198 //Upper right vertex
+
1199 position_data.at(12) = v.at(2).x;
+
1200 position_data.at(13) = v.at(2).y;
+
1201 position_data.at(14) = v.at(2).z;
+
1202
+
1203 //Upper left vertex
+
1204 position_data.at(15) = v.at(3).x;
+
1205 position_data.at(16) = v.at(3).y;
+
1206 position_data.at(17) = v.at(3).z;
+
1207
+
1208 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
+
1209 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
+
1210 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
+
1211 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
+
1212
+
1213 std::vector<int> texture_data;
+
1214 std::vector<int> coord_data;
+
1215 texture_data.resize(6,0);
+
1216 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1217 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1218 coord_data.resize(6,coordFlag);
+
1219 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
+
1220
+
1221}
+
+
1222
+
+
1223void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const char* texture_file, CoordinateSystem coordFlag ){
+
1224 std::vector<vec2> uvs;
+
1225 uvs.resize(4);
+
1226 uvs.at(0) = make_vec2(0,0);
+
1227 uvs.at(1) = make_vec2(1,0);
+
1228 uvs.at(2) = make_vec2(1,1);
+
1229 uvs.at(3) = make_vec2(0,1);
+
1230 addRectangleByVertices(vertices,texture_file,uvs,coordFlag);
+
1231}
+
1232
-
1233 if( coordFlag == COORDINATES_WINDOW_NORMALIZED ){ //No vertex transformation (i.e., identity matrix)
+
+
1233void Visualizer::addRectangleByVertices(const std::vector<vec3> &vertices, const char* texture_file, const std::vector<vec2> &uvs, CoordinateSystem coordFlag ){
1234
-
1235 //Check that coordinates are inside drawable area
-
1236 for(auto vertex : vertices){
-
1237 if(vertex.x < 0.f || vertex.x > 1.f ){
-
1238 if( message_flag ){
-
1239 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
-
1240 }
-
1241 }else if(vertex.y < 0.f || vertex.y > 1.f ){
+
1235 std::vector<vec3> v = vertices; //make a copy so we can modify
+
1236
+
1237 if( coordFlag == COORDINATES_WINDOW_NORMALIZED ){ //No vertex transformation (i.e., identity matrix)
+
1238
+
1239 //Check that coordinates are inside drawable area
+
1240 for(auto vertex : vertices){
+
1241 if(vertex.x < 0.f || vertex.x > 1.f ){
1242 if( message_flag ){
-
1243 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
+
1243 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
1244 }
-
1245 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1245 }else if(vertex.y < 0.f || vertex.y > 1.f ){
1246 if( message_flag ){
-
1247 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1247 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
1248 }
-
1249 }
-
1250 }
-
1251
-
1252 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
1253 for( uint i=0; i<vertices.size(); i++ ){
-
1254 v.at(i).x = 2.f*v.at(i).x - 1.f;
-
1255 v.at(i).y = 2.f*v.at(i).y - 1.f;
-
1256 }
-
1257
-
1258 }
-
1259
-
1260 uint textureID;
-
1261 int2 texture_size;
-
1262 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
1249 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1250 if( message_flag ){
+
1251 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1252 }
+
1253 }
+
1254 }
+
1255
+
1256 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
1257 for( uint i=0; i<vertices.size(); i++ ){
+
1258 v.at(i).x = 2.f*v.at(i).x - 1.f;
+
1259 v.at(i).y = 2.f*v.at(i).y - 1.f;
+
1260 }
+
1261
+
1262 }
1263
-
1264 std::vector<float> position_data, color_data, normal_data, uv_data;
-
1265 position_data.resize(18,0);
-
1266 color_data.resize(24,0);
-
1267 normal_data.resize(18,0);
-
1268 uv_data.resize(12,0);
-
1269
-
1270 vec3 normal = cross( v.at(1)-v.at(0), v.at(2)-v.at(1) );
-
1271 normal.normalize();
-
1272
-
1273 for( int i=0; i<6; i++ ){
-
1274 normal_data.at(i*3) = normal.x;
-
1275 normal_data.at(i*3+1) = normal.y;
-
1276 normal_data.at(i*3+2) = normal.z;
-
1277 }
-
1278
-
1279 //Lower left vertex
-
1280 position_data.at(0) = v.at(0).x;
-
1281 position_data.at(1) = v.at(0).y;
-
1282 position_data.at(2) = v.at(0).z;
-
1283 uv_data.at(0) = uvs.at(0).x*float(texture_size.x-1);
-
1284 uv_data.at(1) = (1.f-uvs.at(0).y)*float(texture_size.y-1);
-
1285
-
1286 //Lower right vertex
-
1287 position_data.at(3) = v.at(1).x;
-
1288 position_data.at(4) = v.at(1).y;
-
1289 position_data.at(5) = v.at(1).z;
-
1290 uv_data.at(2) = uvs.at(1).x*float(texture_size.x-1);
-
1291 uv_data.at(3) = (1.f-uvs.at(1).y)*float(texture_size.y-1);
-
1292
-
1293 //Upper right vertex
-
1294 position_data.at(6) = v.at(2).x;
-
1295 position_data.at(7) = v.at(2).y;
-
1296 position_data.at(8) = v.at(2).z;
-
1297 uv_data.at(4) = uvs.at(2).x*float(texture_size.x-1);
-
1298 uv_data.at(5) = (1.f-uvs.at(2).y)*float(texture_size.y-1);
-
1299
-
1300 //Lower left vertex
-
1301 position_data.at(9) = v.at(0).x;
-
1302 position_data.at(10) = v.at(0).y;
-
1303 position_data.at(11) = v.at(0).z;
-
1304 uv_data.at(6) = uvs.at(0).x*float(texture_size.x-1);
-
1305 uv_data.at(7) = (1.f-uvs.at(0).y)*float(texture_size.y-1);
-
1306
-
1307 //Upper right vertex
-
1308 position_data.at(12) = v.at(2).x;
-
1309 position_data.at(13) = v.at(2).y;
-
1310 position_data.at(14) = v.at(2).z;
-
1311 uv_data.at(8) = uvs.at(2).x*float(texture_size.x-1);
-
1312 uv_data.at(9) = (1.f-uvs.at(2).y)*float(texture_size.y-1);
-
1313
-
1314 //Upper left vertex
-
1315 position_data.at(15) = v.at(3).x;
-
1316 position_data.at(16) = v.at(3).y;
-
1317 position_data.at(17) = v.at(3).z;
-
1318 uv_data.at(10) = uvs.at(3).x*float(texture_size.x-1);
-
1319 uv_data.at(11) = (1.f-uvs.at(3).y)*float(texture_size.y-1);
-
1320
-
1321 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
-
1322 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
-
1323 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
-
1324 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
-
1325
-
1326 std::vector<int> texture_data, coord_data;
-
1327 texture_data.resize(6,1);
-
1328 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1329 texture_data.assign(6, textureID);
-
1330 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1331 coord_data.resize(6,coordFlag);
-
1332 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
-
1333
-
1334}
-
1335
-
1336void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBcolor &color, const char* texture_file, CoordinateSystem coordFlag ){
-
1337 std::vector<vec2> uvs;
-
1338 uvs.resize(4);
-
1339 uvs.at(0) = make_vec2(0,0);
-
1340 uvs.at(1) = make_vec2(1,0);
-
1341 uvs.at(2) = make_vec2(1,1);
-
1342 uvs.at(3) = make_vec2(0,1);
-
1343 addRectangleByVertices( vertices, color, texture_file, uvs, coordFlag );
-
1344
-
1345}
-
1346
-
1347void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const helios::RGBcolor &color, const char* texture_file, const std::vector<vec2> &uvs, CoordinateSystem coordFlag ){
+
1264 uint textureID;
+
1265 int2 texture_size;
+
1266 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
1267
+
1268 std::vector<float> position_data, color_data, normal_data, uv_data;
+
1269 position_data.resize(18,0);
+
1270 color_data.resize(24,0);
+
1271 normal_data.resize(18,0);
+
1272 uv_data.resize(12,0);
+
1273
+
1274 vec3 normal = cross( v.at(1)-v.at(0), v.at(2)-v.at(1) );
+
1275 normal.normalize();
+
1276
+
1277 for( int i=0; i<6; i++ ){
+
1278 normal_data.at(i*3) = normal.x;
+
1279 normal_data.at(i*3+1) = normal.y;
+
1280 normal_data.at(i*3+2) = normal.z;
+
1281 }
+
1282
+
1283 //Lower left vertex
+
1284 position_data.at(0) = v.at(0).x;
+
1285 position_data.at(1) = v.at(0).y;
+
1286 position_data.at(2) = v.at(0).z;
+
1287 uv_data.at(0) = uvs.at(0).x*float(texture_size.x-1);
+
1288 uv_data.at(1) = (1.f-uvs.at(0).y)*float(texture_size.y-1);
+
1289
+
1290 //Lower right vertex
+
1291 position_data.at(3) = v.at(1).x;
+
1292 position_data.at(4) = v.at(1).y;
+
1293 position_data.at(5) = v.at(1).z;
+
1294 uv_data.at(2) = uvs.at(1).x*float(texture_size.x-1);
+
1295 uv_data.at(3) = (1.f-uvs.at(1).y)*float(texture_size.y-1);
+
1296
+
1297 //Upper right vertex
+
1298 position_data.at(6) = v.at(2).x;
+
1299 position_data.at(7) = v.at(2).y;
+
1300 position_data.at(8) = v.at(2).z;
+
1301 uv_data.at(4) = uvs.at(2).x*float(texture_size.x-1);
+
1302 uv_data.at(5) = (1.f-uvs.at(2).y)*float(texture_size.y-1);
+
1303
+
1304 //Lower left vertex
+
1305 position_data.at(9) = v.at(0).x;
+
1306 position_data.at(10) = v.at(0).y;
+
1307 position_data.at(11) = v.at(0).z;
+
1308 uv_data.at(6) = uvs.at(0).x*float(texture_size.x-1);
+
1309 uv_data.at(7) = (1.f-uvs.at(0).y)*float(texture_size.y-1);
+
1310
+
1311 //Upper right vertex
+
1312 position_data.at(12) = v.at(2).x;
+
1313 position_data.at(13) = v.at(2).y;
+
1314 position_data.at(14) = v.at(2).z;
+
1315 uv_data.at(8) = uvs.at(2).x*float(texture_size.x-1);
+
1316 uv_data.at(9) = (1.f-uvs.at(2).y)*float(texture_size.y-1);
+
1317
+
1318 //Upper left vertex
+
1319 position_data.at(15) = v.at(3).x;
+
1320 position_data.at(16) = v.at(3).y;
+
1321 position_data.at(17) = v.at(3).z;
+
1322 uv_data.at(10) = uvs.at(3).x*float(texture_size.x-1);
+
1323 uv_data.at(11) = (1.f-uvs.at(3).y)*float(texture_size.y-1);
+
1324
+
1325 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
+
1326 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
+
1327 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
+
1328 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
+
1329
+
1330 std::vector<int> texture_data, coord_data;
+
1331 texture_data.resize(6,1);
+
1332 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1333 texture_data.assign(6, textureID);
+
1334 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1335 coord_data.resize(6,coordFlag);
+
1336 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
+
1337
+
1338}
+
+
1339
+
+
1340void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBcolor &color, const char* texture_file, CoordinateSystem coordFlag ){
+
1341 std::vector<vec2> uvs;
+
1342 uvs.resize(4);
+
1343 uvs.at(0) = make_vec2(0,0);
+
1344 uvs.at(1) = make_vec2(1,0);
+
1345 uvs.at(2) = make_vec2(1,1);
+
1346 uvs.at(3) = make_vec2(0,1);
+
1347 addRectangleByVertices( vertices, color, texture_file, uvs, coordFlag );
1348
-
1349 std::vector<vec3> v = vertices; //make a copy so we can modify
+
1349}
+
1350
-
1351 if( coordFlag == COORDINATES_WINDOW_NORMALIZED ){ //No vertex transformation (i.e., identity matrix)
+
+
1351void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const helios::RGBcolor &color, const char* texture_file, const std::vector<vec2> &uvs, CoordinateSystem coordFlag ){
1352
-
1353 //Check that coordinates are inside drawable area
-
1354 for(auto vertex : vertices){
-
1355 if(vertex.x < 0.f || vertex.x > 1.f ){
-
1356 if( message_flag ){
-
1357 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
-
1358 }
-
1359 }else if(vertex.y < 0.f || vertex.y > 1.f ){
+
1353 std::vector<vec3> v = vertices; //make a copy so we can modify
+
1354
+
1355 if( coordFlag == COORDINATES_WINDOW_NORMALIZED ){ //No vertex transformation (i.e., identity matrix)
+
1356
+
1357 //Check that coordinates are inside drawable area
+
1358 for(auto vertex : vertices){
+
1359 if(vertex.x < 0.f || vertex.x > 1.f ){
1360 if( message_flag ){
-
1361 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
+
1361 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
1362 }
-
1363 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1363 }else if(vertex.y < 0.f || vertex.y > 1.f ){
1364 if( message_flag ){
-
1365 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1365 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
1366 }
-
1367 }
-
1368 }
-
1369
-
1370 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
1371 for( uint i=0; i<vertices.size(); i++ ){
-
1372 v.at(i).x = 2.f*v.at(i).x - 1.f;
-
1373 v.at(i).y = 2.f*v.at(i).y - 1.f;
-
1374 }
-
1375
-
1376 }
-
1377
-
1378 uint textureID;
-
1379 int2 texture_size;
-
1380 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
1367 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1368 if( message_flag ){
+
1369 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1370 }
+
1371 }
+
1372 }
+
1373
+
1374 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
1375 for( uint i=0; i<vertices.size(); i++ ){
+
1376 v.at(i).x = 2.f*v.at(i).x - 1.f;
+
1377 v.at(i).y = 2.f*v.at(i).y - 1.f;
+
1378 }
+
1379
+
1380 }
1381
-
1382 std::vector<float> position_data, color_data, normal_data, uv_data;
-
1383 position_data.resize(18,0);
-
1384 color_data.resize(24,0);
-
1385 normal_data.resize(18,0);
-
1386 uv_data.resize(12,0);
-
1387
-
1388 vec3 normal = cross( v.at(1)-v.at(0), v.at(2)-v.at(1) );
-
1389 normal.normalize();
-
1390
-
1391 for( int i=0; i<6; i++ ){
-
1392 color_data.at(i*4) = color.r;
-
1393 color_data.at(i*4+1) = color.g;
-
1394 color_data.at(i*4+2) = color.b;
-
1395 color_data.at(i*4+3) = 1;
-
1396
-
1397 normal_data.at(i*3) = normal.x;
-
1398 normal_data.at(i*3+1) = normal.y;
-
1399 normal_data.at(i*3+2) = normal.z;
-
1400 }
-
1401
-
1402 //Lower left vertex
-
1403 position_data.at(0) = v.at(0).x;
-
1404 position_data.at(1) = v.at(0).y;
-
1405 position_data.at(2) = v.at(0).z;
-
1406 uv_data.at(0) = uvs.at(0).x*float(texture_size.x-1);
-
1407 uv_data.at(1) = (1.f-uvs.at(0).y)*float(texture_size.y-1);
-
1408
-
1409 //Lower right vertex
-
1410 position_data.at(3) = v.at(1).x;
-
1411 position_data.at(4) = v.at(1).y;
-
1412 position_data.at(5) = v.at(1).z;
-
1413 uv_data.at(2) = uvs.at(1).x*float(texture_size.x-1);
-
1414 uv_data.at(3) = (1.f-uvs.at(1).y)*float(texture_size.y-1);
-
1415
-
1416 //Upper right vertex
-
1417 position_data.at(6) = v.at(2).x;
-
1418 position_data.at(7) = v.at(2).y;
-
1419 position_data.at(8) = v.at(2).z;
-
1420 uv_data.at(4) = uvs.at(2).x*float(texture_size.x-1);
-
1421 uv_data.at(5) = (1.f-uvs.at(2).y)*float(texture_size.y-1);
-
1422
-
1423 //Lower left vertex
-
1424 position_data.at(9) = v.at(0).x;
-
1425 position_data.at(10) = v.at(0).y;
-
1426 position_data.at(11) = v.at(0).z;
-
1427 uv_data.at(6) = uvs.at(0).x*float(texture_size.x-1);
-
1428 uv_data.at(7) = (1.f-uvs.at(0).y)*float(texture_size.y-1);
-
1429
-
1430 //Upper right vertex
-
1431 position_data.at(12) = v.at(2).x;
-
1432 position_data.at(13) = v.at(2).y;
-
1433 position_data.at(14) = v.at(2).z;
-
1434 uv_data.at(8) = uvs.at(2).x*float(texture_size.x-1);
-
1435 uv_data.at(9) = (1.f-uvs.at(2).y)*float(texture_size.y-1);
-
1436
-
1437 //Upper left vertex
-
1438 position_data.at(15) = v.at(3).x;
-
1439 position_data.at(16) = v.at(3).y;
-
1440 position_data.at(17) = v.at(3).z;
-
1441 uv_data.at(10) = uvs.at(3).x*float(texture_size.x-1);
-
1442 uv_data.at(11) = (1.f-uvs.at(3).y)*float(texture_size.y-1);
-
1443
-
1444 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
-
1445 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
-
1446 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
-
1447 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
-
1448
-
1449 std::vector<int> texture_data, coord_data;
-
1450 texture_data.resize(6,2);
-
1451 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1452 texture_data.assign(6,textureID);
-
1453 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1454 coord_data.resize(6,coordFlag);
-
1455 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
-
1456
-
1457}
-
1458
-
1459void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBcolor &color, const Glyph* glyph, CoordinateSystem coordFlag ){
-
1460 addRectangleByVertices( vertices, make_RGBAcolor(color,1), glyph, coordFlag );
+
1382 uint textureID;
+
1383 int2 texture_size;
+
1384 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
1385
+
1386 std::vector<float> position_data, color_data, normal_data, uv_data;
+
1387 position_data.resize(18,0);
+
1388 color_data.resize(24,0);
+
1389 normal_data.resize(18,0);
+
1390 uv_data.resize(12,0);
+
1391
+
1392 vec3 normal = cross( v.at(1)-v.at(0), v.at(2)-v.at(1) );
+
1393 normal.normalize();
+
1394
+
1395 for( int i=0; i<6; i++ ){
+
1396 color_data.at(i*4) = color.r;
+
1397 color_data.at(i*4+1) = color.g;
+
1398 color_data.at(i*4+2) = color.b;
+
1399 color_data.at(i*4+3) = 1;
+
1400
+
1401 normal_data.at(i*3) = normal.x;
+
1402 normal_data.at(i*3+1) = normal.y;
+
1403 normal_data.at(i*3+2) = normal.z;
+
1404 }
+
1405
+
1406 //Lower left vertex
+
1407 position_data.at(0) = v.at(0).x;
+
1408 position_data.at(1) = v.at(0).y;
+
1409 position_data.at(2) = v.at(0).z;
+
1410 uv_data.at(0) = uvs.at(0).x*float(texture_size.x-1);
+
1411 uv_data.at(1) = (1.f-uvs.at(0).y)*float(texture_size.y-1);
+
1412
+
1413 //Lower right vertex
+
1414 position_data.at(3) = v.at(1).x;
+
1415 position_data.at(4) = v.at(1).y;
+
1416 position_data.at(5) = v.at(1).z;
+
1417 uv_data.at(2) = uvs.at(1).x*float(texture_size.x-1);
+
1418 uv_data.at(3) = (1.f-uvs.at(1).y)*float(texture_size.y-1);
+
1419
+
1420 //Upper right vertex
+
1421 position_data.at(6) = v.at(2).x;
+
1422 position_data.at(7) = v.at(2).y;
+
1423 position_data.at(8) = v.at(2).z;
+
1424 uv_data.at(4) = uvs.at(2).x*float(texture_size.x-1);
+
1425 uv_data.at(5) = (1.f-uvs.at(2).y)*float(texture_size.y-1);
+
1426
+
1427 //Lower left vertex
+
1428 position_data.at(9) = v.at(0).x;
+
1429 position_data.at(10) = v.at(0).y;
+
1430 position_data.at(11) = v.at(0).z;
+
1431 uv_data.at(6) = uvs.at(0).x*float(texture_size.x-1);
+
1432 uv_data.at(7) = (1.f-uvs.at(0).y)*float(texture_size.y-1);
+
1433
+
1434 //Upper right vertex
+
1435 position_data.at(12) = v.at(2).x;
+
1436 position_data.at(13) = v.at(2).y;
+
1437 position_data.at(14) = v.at(2).z;
+
1438 uv_data.at(8) = uvs.at(2).x*float(texture_size.x-1);
+
1439 uv_data.at(9) = (1.f-uvs.at(2).y)*float(texture_size.y-1);
+
1440
+
1441 //Upper left vertex
+
1442 position_data.at(15) = v.at(3).x;
+
1443 position_data.at(16) = v.at(3).y;
+
1444 position_data.at(17) = v.at(3).z;
+
1445 uv_data.at(10) = uvs.at(3).x*float(texture_size.x-1);
+
1446 uv_data.at(11) = (1.f-uvs.at(3).y)*float(texture_size.y-1);
+
1447
+
1448 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
+
1449 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
+
1450 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
+
1451 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
+
1452
+
1453 std::vector<int> texture_data, coord_data;
+
1454 texture_data.resize(6,2);
+
1455 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1456 texture_data.assign(6,textureID);
+
1457 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1458 coord_data.resize(6,coordFlag);
+
1459 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
+
1460
1461}
+
1462
-
1463void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBAcolor &color, const Glyph* glyph, CoordinateSystem coordFlag ){
-
1464
-
1465 std::vector<vec3> v = vertices; //make a copy so we can modify
+
+
1463void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBcolor &color, const Glyph* glyph, CoordinateSystem coordFlag ){
+
1464 addRectangleByVertices( vertices, make_RGBAcolor(color,1), glyph, coordFlag );
+
1465}
+
1466
-
1467 if( coordFlag == COORDINATES_WINDOW_NORMALIZED ){ //No vertex transformation (i.e., identity matrix)
+
+
1467void Visualizer::addRectangleByVertices( const std::vector<vec3>& vertices, const RGBAcolor &color, const Glyph* glyph, CoordinateSystem coordFlag ){
1468
-
1469 //Check that coordinates are inside drawable area
-
1470 for(auto vertex : vertices){
-
1471 if(vertex.x < 0.f || vertex.x > 1.f ){
-
1472 if( message_flag ){
-
1473 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
-
1474 }
-
1475 }else if(vertex.y < 0.f || vertex.y > 1.f ){
+
1469 std::vector<vec3> v = vertices; //make a copy so we can modify
+
1470
+
1471 if( coordFlag == COORDINATES_WINDOW_NORMALIZED ){ //No vertex transformation (i.e., identity matrix)
+
1472
+
1473 //Check that coordinates are inside drawable area
+
1474 for(auto vertex : vertices){
+
1475 if(vertex.x < 0.f || vertex.x > 1.f ){
1476 if( message_flag ){
-
1477 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
+
1477 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
1478 }
-
1479 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1479 }else if(vertex.y < 0.f || vertex.y > 1.f ){
1480 if( message_flag ){
-
1481 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1481 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
1482 }
-
1483 }
-
1484 }
-
1485
-
1486 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
1487 for( uint i=0; i<vertices.size(); i++ ){
-
1488 v.at(i).x = 2.f*v.at(i).x - 1.f;
-
1489 v.at(i).y = 2.f*v.at(i).y - 1.f;
-
1490 }
-
1491
-
1492 }
-
1493
-
1494 uint textureID;
-
1495 int2 texture_size = glyph->size;
-
1496 primaryShader.setTextureMask(glyph,textureID);
+
1483 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1484 if( message_flag ){
+
1485 std::cout << "WARNING (Visualizer::addRectangleByVertices): Rectangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1486 }
+
1487 }
+
1488 }
+
1489
+
1490 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
1491 for( uint i=0; i<vertices.size(); i++ ){
+
1492 v.at(i).x = 2.f*v.at(i).x - 1.f;
+
1493 v.at(i).y = 2.f*v.at(i).y - 1.f;
+
1494 }
+
1495
+
1496 }
1497
-
1498 std::vector<float> position_data, color_data, normal_data, uv_data;
-
1499 position_data.resize(18,0);
-
1500 color_data.resize(24,0);
-
1501 normal_data.resize(18,0);
-
1502 uv_data.resize(12,0);
-
1503
-
1504 vec3 normal = cross( v.at(1)-v.at(0), v.at(2)-v.at(1) );
-
1505 normal.normalize();
-
1506
-
1507 for( int i=0; i<6; i++ ){
-
1508 color_data.at(i*4) = color.r;
-
1509 color_data.at(i*4+1) = color.g;
-
1510 color_data.at(i*4+2) = color.b;
-
1511 color_data.at(i*4+3) = color.a;
-
1512
-
1513 normal_data.at(i*3) = normal.x;
-
1514 normal_data.at(i*3+1) = normal.y;
-
1515 normal_data.at(i*3+2) = normal.z;
-
1516 }
-
1517
-
1518 //Lower left vertex
-
1519 position_data.at(0) = v.at(0).x;
-
1520 position_data.at(1) = v.at(0).y;
-
1521 position_data.at(2) = v.at(0).z;
-
1522 uv_data.at(0) = 0;
-
1523 uv_data.at(1) = texture_size.y;
-
1524
-
1525 //Lower right vertex
-
1526 position_data.at(3) = v.at(1).x;
-
1527 position_data.at(4) = v.at(1).y;
-
1528 position_data.at(5) = v.at(1).z;
-
1529 uv_data.at(2) = texture_size.x;
-
1530 uv_data.at(3) = texture_size.y;
-
1531
-
1532 //Upper right vertex
-
1533 position_data.at(6) = v.at(2).x;
-
1534 position_data.at(7) = v.at(2).y;
-
1535 position_data.at(8) = v.at(2).z;
-
1536 uv_data.at(4) = texture_size.x;
-
1537 uv_data.at(5) = 0;
-
1538
-
1539 //Lower left vertex
-
1540 position_data.at(9) = v.at(0).x;
-
1541 position_data.at(10) = v.at(0).y;
-
1542 position_data.at(11) = v.at(0).z;
-
1543 uv_data.at(6) = 0;
-
1544 uv_data.at(7) = texture_size.y;
-
1545
-
1546 //Upper right vertex
-
1547 position_data.at(12) = v.at(2).x;
-
1548 position_data.at(13) = v.at(2).y;
-
1549 position_data.at(14) = v.at(2).z;
-
1550 uv_data.at(8) = texture_size.x;
-
1551 uv_data.at(9) = 0;
-
1552
-
1553 //Upper left vertex
-
1554 position_data.at(15) = v.at(3).x;
-
1555 position_data.at(16) = v.at(3).y;
-
1556 position_data.at(17) = v.at(3).z;
-
1557 uv_data.at(10) = 0;
-
1558 uv_data.at(11) = 0;
-
1559
-
1560 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
-
1561 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
-
1562 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
-
1563 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
-
1564
-
1565 std::vector<int> texture_data, coord_data;
-
1566 texture_data.resize(6,3);
-
1567 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1568 texture_data.assign(6,textureID);
-
1569 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1570 coord_data.resize(6,coordFlag);
-
1571 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
-
1572
-
1573}
-
1574
-
1575void Visualizer::addTriangle( const vec3 &vertex0, const vec3 &vertex1, const vec3 &vertex2, const RGBcolor &color, CoordinateSystem coordFlag ){
-
1576 addTriangle( vertex0, vertex1,vertex2, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag);
+
1498 uint textureID;
+
1499 int2 texture_size = glyph->size;
+
1500 primaryShader.setTextureMask(glyph,textureID);
+
1501
+
1502 std::vector<float> position_data, color_data, normal_data, uv_data;
+
1503 position_data.resize(18,0);
+
1504 color_data.resize(24,0);
+
1505 normal_data.resize(18,0);
+
1506 uv_data.resize(12,0);
+
1507
+
1508 vec3 normal = cross( v.at(1)-v.at(0), v.at(2)-v.at(1) );
+
1509 normal.normalize();
+
1510
+
1511 for( int i=0; i<6; i++ ){
+
1512 color_data.at(i*4) = color.r;
+
1513 color_data.at(i*4+1) = color.g;
+
1514 color_data.at(i*4+2) = color.b;
+
1515 color_data.at(i*4+3) = color.a;
+
1516
+
1517 normal_data.at(i*3) = normal.x;
+
1518 normal_data.at(i*3+1) = normal.y;
+
1519 normal_data.at(i*3+2) = normal.z;
+
1520 }
+
1521
+
1522 //Lower left vertex
+
1523 position_data.at(0) = v.at(0).x;
+
1524 position_data.at(1) = v.at(0).y;
+
1525 position_data.at(2) = v.at(0).z;
+
1526 uv_data.at(0) = 0;
+
1527 uv_data.at(1) = texture_size.y;
+
1528
+
1529 //Lower right vertex
+
1530 position_data.at(3) = v.at(1).x;
+
1531 position_data.at(4) = v.at(1).y;
+
1532 position_data.at(5) = v.at(1).z;
+
1533 uv_data.at(2) = texture_size.x;
+
1534 uv_data.at(3) = texture_size.y;
+
1535
+
1536 //Upper right vertex
+
1537 position_data.at(6) = v.at(2).x;
+
1538 position_data.at(7) = v.at(2).y;
+
1539 position_data.at(8) = v.at(2).z;
+
1540 uv_data.at(4) = texture_size.x;
+
1541 uv_data.at(5) = 0;
+
1542
+
1543 //Lower left vertex
+
1544 position_data.at(9) = v.at(0).x;
+
1545 position_data.at(10) = v.at(0).y;
+
1546 position_data.at(11) = v.at(0).z;
+
1547 uv_data.at(6) = 0;
+
1548 uv_data.at(7) = texture_size.y;
+
1549
+
1550 //Upper right vertex
+
1551 position_data.at(12) = v.at(2).x;
+
1552 position_data.at(13) = v.at(2).y;
+
1553 position_data.at(14) = v.at(2).z;
+
1554 uv_data.at(8) = texture_size.x;
+
1555 uv_data.at(9) = 0;
+
1556
+
1557 //Upper left vertex
+
1558 position_data.at(15) = v.at(3).x;
+
1559 position_data.at(16) = v.at(3).y;
+
1560 position_data.at(17) = v.at(3).z;
+
1561 uv_data.at(10) = 0;
+
1562 uv_data.at(11) = 0;
+
1563
+
1564 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
+
1565 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
+
1566 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
+
1567 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
+
1568
+
1569 std::vector<int> texture_data, coord_data;
+
1570 texture_data.resize(6,3);
+
1571 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1572 texture_data.assign(6,textureID);
+
1573 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1574 coord_data.resize(6,coordFlag);
+
1575 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
+
1576
1577}
+
1578
-
1579void Visualizer::addTriangle( const vec3 &vertex0, const vec3 &vertex1, const vec3 &vertex2, const RGBAcolor &color, CoordinateSystem coordFlag ){
-
1580
-
1581 std::vector<vec3> v{vertex0, vertex1, vertex2};
+
+
1579void Visualizer::addTriangle( const vec3 &vertex0, const vec3 &vertex1, const vec3 &vertex2, const RGBcolor &color, CoordinateSystem coordFlag ){
+
1580 addTriangle( vertex0, vertex1,vertex2, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag);
+
1581}
+
1582
-
1583 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
+
1583void Visualizer::addTriangle( const vec3 &vertex0, const vec3 &vertex1, const vec3 &vertex2, const RGBAcolor &color, CoordinateSystem coordFlag ){
1584
-
1585 //Check that coordinates are inside drawable area
-
1586 for(auto & vertex : v){
-
1587 if(vertex.x < 0.f || vertex.x > 1.f ){
-
1588 if( message_flag ){
-
1589 std::cout << "WARNING (Visualizer::addTriangle): Triangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
-
1590 }
-
1591 }else if(vertex.y < 0.f || vertex.y > 1.f ){
+
1585 std::vector<vec3> v{vertex0, vertex1, vertex2};
+
1586
+
1587 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
1588
+
1589 //Check that coordinates are inside drawable area
+
1590 for(auto & vertex : v){
+
1591 if(vertex.x < 0.f || vertex.x > 1.f ){
1592 if( message_flag ){
-
1593 std::cout << "WARNING (Visualizer::addTriangle): Triangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
+
1593 std::cout << "WARNING (Visualizer::addTriangle): Triangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
1594 }
-
1595 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1595 }else if(vertex.y < 0.f || vertex.y > 1.f ){
1596 if( message_flag ){
-
1597 std::cout << "WARNING (Visualizer::addTriangle): Triangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1597 std::cout << "WARNING (Visualizer::addTriangle): Triangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
1598 }
-
1599 }
-
1600 }
-
1601
-
1602 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
1603 for(auto & vertex : v){
-
1604 vertex.x = 2.f * vertex.x - 1.f;
-
1605 vertex.y = 2.f * vertex.y - 1.f;
-
1606 }
-
1607
-
1608 }
-
1609
-
1610 std::vector<GLfloat> position_data(9), color_data(12), normal_data(9), uv_data(6);
+
1599 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1600 if( message_flag ){
+
1601 std::cout << "WARNING (Visualizer::addTriangle): Triangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1602 }
+
1603 }
+
1604 }
+
1605
+
1606 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
1607 for(auto & vertex : v){
+
1608 vertex.x = 2.f * vertex.x - 1.f;
+
1609 vertex.y = 2.f * vertex.y - 1.f;
+
1610 }
1611
-
1612 vec3 normal = cross( vertex1-vertex0, vertex2-vertex0 );
-
1613 normal.normalize();
-
1614
-
1615 //Vertex 0
-
1616 position_data[0] = v.at(0).x;
-
1617 position_data[1] = v.at(0).y;
-
1618 position_data[2] = v.at(0).z;
-
1619 color_data[0] = color.r;
-
1620 color_data[1] = color.g;
-
1621 color_data[2] = color.b;
-
1622 color_data[3] = color.a;
-
1623 normal_data[0] = normal.x;
-
1624 normal_data[1] = normal.y;
-
1625 normal_data[2] = normal.z;
-
1626
-
1627 //Vertex 1
-
1628 position_data[3] = v.at(1).x;
-
1629 position_data[4] = v.at(1).y;
-
1630 position_data[5] = v.at(1).z;
-
1631 color_data[4] = color.r;
-
1632 color_data[5] = color.g;
-
1633 color_data[6] = color.b;
-
1634 color_data[7] = color.a;
-
1635 normal_data[3] = normal.x;
-
1636 normal_data[4] = normal.y;
-
1637 normal_data[5] = normal.z;
-
1638
-
1639 //Vertex 2
-
1640 position_data[6] = v.at(2).x;
-
1641 position_data[7] = v.at(2).y;
-
1642 position_data[8] = v.at(2).z;
-
1643 color_data[8] = color.r;
-
1644 color_data[9] = color.g;
-
1645 color_data[10] = color.b;
-
1646 color_data[11] = color.a;
-
1647 normal_data[6] = normal.x;
-
1648 normal_data[7] = normal.y;
-
1649 normal_data[8] = normal.z;
-
1650
-
1651 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
-
1652 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
-
1653 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
-
1654 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
-
1655
-
1656 std::vector<int> texture_data, coord_data;
-
1657 texture_data.resize(3,0);
-
1658 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1659 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1660
-
1661 coord_data.resize(3,coordFlag);
-
1662 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
-
1663
-
1664}
-
1665
-
1666void Visualizer::addTriangle( const vec3 &vertex0, const vec3 &vertex1, const vec3 &vertex2, const char* texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, CoordinateSystem coordFlag){
+
1612 }
+
1613
+
1614 std::vector<GLfloat> position_data(9), color_data(12), normal_data(9), uv_data(6);
+
1615
+
1616 vec3 normal = cross( vertex1-vertex0, vertex2-vertex0 );
+
1617 normal.normalize();
+
1618
+
1619 //Vertex 0
+
1620 position_data[0] = v.at(0).x;
+
1621 position_data[1] = v.at(0).y;
+
1622 position_data[2] = v.at(0).z;
+
1623 color_data[0] = color.r;
+
1624 color_data[1] = color.g;
+
1625 color_data[2] = color.b;
+
1626 color_data[3] = color.a;
+
1627 normal_data[0] = normal.x;
+
1628 normal_data[1] = normal.y;
+
1629 normal_data[2] = normal.z;
+
1630
+
1631 //Vertex 1
+
1632 position_data[3] = v.at(1).x;
+
1633 position_data[4] = v.at(1).y;
+
1634 position_data[5] = v.at(1).z;
+
1635 color_data[4] = color.r;
+
1636 color_data[5] = color.g;
+
1637 color_data[6] = color.b;
+
1638 color_data[7] = color.a;
+
1639 normal_data[3] = normal.x;
+
1640 normal_data[4] = normal.y;
+
1641 normal_data[5] = normal.z;
+
1642
+
1643 //Vertex 2
+
1644 position_data[6] = v.at(2).x;
+
1645 position_data[7] = v.at(2).y;
+
1646 position_data[8] = v.at(2).z;
+
1647 color_data[8] = color.r;
+
1648 color_data[9] = color.g;
+
1649 color_data[10] = color.b;
+
1650 color_data[11] = color.a;
+
1651 normal_data[6] = normal.x;
+
1652 normal_data[7] = normal.y;
+
1653 normal_data[8] = normal.z;
+
1654
+
1655 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
+
1656 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
+
1657 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
+
1658 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
+
1659
+
1660 std::vector<int> texture_data, coord_data;
+
1661 texture_data.resize(3,0);
+
1662 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1663 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1664
+
1665 coord_data.resize(3,coordFlag);
+
1666 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
1667
-
1668 std::vector<vec3> v{vertex0, vertex1, vertex2};
+
1668}
+
1669
-
1670 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
+
1670void Visualizer::addTriangle( const vec3 &vertex0, const vec3 &vertex1, const vec3 &vertex2, const char* texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, CoordinateSystem coordFlag){
1671
-
1672 //Check that coordinates are inside drawable area
-
1673 for(auto & vertex : v){
-
1674 if(vertex.x < 0.f || vertex.x > 1.f ){
-
1675 if( message_flag ){
-
1676 std::cout << "WARNING (Visualizer::addTriangle): Triangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
-
1677 }
-
1678 }else if(vertex.y < 0.f || vertex.y > 1.f ){
+
1672 std::vector<vec3> v{vertex0, vertex1, vertex2};
+
1673
+
1674 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
1675
+
1676 //Check that coordinates are inside drawable area
+
1677 for(auto & vertex : v){
+
1678 if(vertex.x < 0.f || vertex.x > 1.f ){
1679 if( message_flag ){
-
1680 std::cout << "WARNING (Visualizer::addTriangle): Triangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
+
1680 std::cout << "WARNING (Visualizer::addTriangle): Triangle `x' position ( " << vertex.x << " ) is outside of drawable area." << std::endl;
1681 }
-
1682 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1682 }else if(vertex.y < 0.f || vertex.y > 1.f ){
1683 if( message_flag ){
-
1684 std::cout << "WARNING (Visualizer::addTriangle): Triangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1684 std::cout << "WARNING (Visualizer::addTriangle): Triangle `y' position ( " << vertex.y << " ) is outside of drawable area." << std::endl;
1685 }
-
1686 }
-
1687 }
-
1688
-
1689 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
1690 for(auto & vertex : v){
-
1691 vertex.x = 2.f * vertex.x - 1.f;
-
1692 vertex.y = 2.f * vertex.y - 1.f;
-
1693 }
-
1694
-
1695 }
-
1696
-
1697 uint textureID;
-
1698 int2 texture_size;
-
1699 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
1686 }else if(vertex.z < -1.f || vertex.z > 1.f ){
+
1687 if( message_flag ){
+
1688 std::cout << "WARNING (Visualizer::addTriangle): Triangle `z' position ( " << vertex.z << " ) is outside of drawable area." << std::endl;
+
1689 }
+
1690 }
+
1691 }
+
1692
+
1693 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
1694 for(auto & vertex : v){
+
1695 vertex.x = 2.f * vertex.x - 1.f;
+
1696 vertex.y = 2.f * vertex.y - 1.f;
+
1697 }
+
1698
+
1699 }
1700
-
1701 std::vector<GLfloat> position_data(9), color_data(12), normal_data(9), uv_data(6);
-
1702
-
1703 vec3 normal = cross( vertex1-vertex0, vertex2-vertex0 );
-
1704 normal.normalize();
-
1705
-
1706 //Vertex 0
-
1707 position_data[0] = v.at(0).x;
-
1708 position_data[1] = v.at(0).y;
-
1709 position_data[2] = v.at(0).z;
-
1710 uv_data[0] = uv0.x*texture_size.x;
-
1711 uv_data[1] = (1.f-uv0.y)*texture_size.y;
-
1712 normal_data[0] = normal.x;
-
1713 normal_data[1] = normal.y;
-
1714 normal_data[2] = normal.z;
-
1715
-
1716 //Vertex 1
-
1717 position_data[3] = v.at(1).x;
-
1718 position_data[4] = v.at(1).y;
-
1719 position_data[5] = v.at(1).z;
-
1720 uv_data[2] = uv1.x*texture_size.x;
-
1721 uv_data[3] = (1.f-uv1.y)*texture_size.y;
-
1722 normal_data[3] = normal.x;
-
1723 normal_data[4] = normal.y;
-
1724 normal_data[5] = normal.z;
-
1725
-
1726 //Vertex 2
-
1727 position_data[6] = v.at(2).x;
-
1728 position_data[7] = v.at(2).y;
-
1729 position_data[8] = v.at(2).z;
-
1730 uv_data[4] = uv2.x*texture_size.x;
-
1731 uv_data[5] = (1.f-uv2.y)*texture_size.y;
-
1732 normal_data[6] = normal.x;
-
1733 normal_data[7] = normal.y;
-
1734 normal_data[8] = normal.z;
-
1735
-
1736 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
-
1737 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
-
1738 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
-
1739 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
-
1740
-
1741 std::vector<int> texture_data, coord_data;
-
1742 texture_data.assign(3,1);
-
1743 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1744 texture_data.assign(3,textureID);
-
1745 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1746
-
1747 coord_data.assign(3,coordFlag);
-
1748 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
-
1749
-
1750}
-
1751
-
1752void Visualizer::addTriangle( const vec3 &vertex0, const vec3 &vertex1, const vec3 &vertex2, const char* texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, const RGBAcolor &color, CoordinateSystem coordFlag){
+
1701 uint textureID;
+
1702 int2 texture_size;
+
1703 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
1704
+
1705 std::vector<GLfloat> position_data(9), color_data(12), normal_data(9), uv_data(6);
+
1706
+
1707 vec3 normal = cross( vertex1-vertex0, vertex2-vertex0 );
+
1708 normal.normalize();
+
1709
+
1710 //Vertex 0
+
1711 position_data[0] = v.at(0).x;
+
1712 position_data[1] = v.at(0).y;
+
1713 position_data[2] = v.at(0).z;
+
1714 uv_data[0] = uv0.x*texture_size.x;
+
1715 uv_data[1] = (1.f-uv0.y)*texture_size.y;
+
1716 normal_data[0] = normal.x;
+
1717 normal_data[1] = normal.y;
+
1718 normal_data[2] = normal.z;
+
1719
+
1720 //Vertex 1
+
1721 position_data[3] = v.at(1).x;
+
1722 position_data[4] = v.at(1).y;
+
1723 position_data[5] = v.at(1).z;
+
1724 uv_data[2] = uv1.x*texture_size.x;
+
1725 uv_data[3] = (1.f-uv1.y)*texture_size.y;
+
1726 normal_data[3] = normal.x;
+
1727 normal_data[4] = normal.y;
+
1728 normal_data[5] = normal.z;
+
1729
+
1730 //Vertex 2
+
1731 position_data[6] = v.at(2).x;
+
1732 position_data[7] = v.at(2).y;
+
1733 position_data[8] = v.at(2).z;
+
1734 uv_data[4] = uv2.x*texture_size.x;
+
1735 uv_data[5] = (1.f-uv2.y)*texture_size.y;
+
1736 normal_data[6] = normal.x;
+
1737 normal_data[7] = normal.y;
+
1738 normal_data[8] = normal.z;
+
1739
+
1740 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
+
1741 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
+
1742 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
+
1743 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
+
1744
+
1745 std::vector<int> texture_data, coord_data;
+
1746 texture_data.assign(3,1);
+
1747 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1748 texture_data.assign(3,textureID);
+
1749 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1750
+
1751 coord_data.assign(3,coordFlag);
+
1752 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
1753
-
1754 std::vector<vec3> v{vertex0, vertex1, vertex2};
+
1754}
+
1755
-
1756 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
+
1756void Visualizer::addTriangle( const vec3 &vertex0, const vec3 &vertex1, const vec3 &vertex2, const char* texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, const RGBAcolor &color, CoordinateSystem coordFlag){
1757
-
1758 //Check that coordinates are inside drawable area
-
1759 for( uint i=0; i<v.size(); i++ ){
-
1760 if( v.at(i).x<0.f || v.at(i).x>1.f ){
-
1761 if( message_flag ){
-
1762 std::cout << "WARNING (Visualizer::addTriangle): Triangle `x' position ( " << v.at(i).x << " ) is outside of drawable area." << std::endl;
-
1763 }
-
1764 }else if( v.at(i).y<0.f || v.at(i).y>1.f ){
+
1758 std::vector<vec3> v{vertex0, vertex1, vertex2};
+
1759
+
1760 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
1761
+
1762 //Check that coordinates are inside drawable area
+
1763 for( uint i=0; i<v.size(); i++ ){
+
1764 if( v.at(i).x<0.f || v.at(i).x>1.f ){
1765 if( message_flag ){
-
1766 std::cout << "WARNING (Visualizer::addTriangle): Triangle `y' position ( " << v.at(i).y << " ) is outside of drawable area." << std::endl;
+
1766 std::cout << "WARNING (Visualizer::addTriangle): Triangle `x' position ( " << v.at(i).x << " ) is outside of drawable area." << std::endl;
1767 }
-
1768 }else if( v.at(i).z<-1.f || v.at(i).z>1.f ){
+
1768 }else if( v.at(i).y<0.f || v.at(i).y>1.f ){
1769 if( message_flag ){
-
1770 std::cout << "WARNING (Visualizer::addTriangle): Triangle `z' position ( " << v.at(i).z << " ) is outside of drawable area." << std::endl;
+
1770 std::cout << "WARNING (Visualizer::addTriangle): Triangle `y' position ( " << v.at(i).y << " ) is outside of drawable area." << std::endl;
1771 }
-
1772 }
-
1773 }
-
1774
-
1775 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
1776 for( uint i=0; i<v.size(); i++ ){
-
1777 v.at(i).x = 2.f*v.at(i).x - 1.f;
-
1778 v.at(i).y = 2.f*v.at(i).y - 1.f;
-
1779 }
-
1780
-
1781 }
-
1782
-
1783 uint textureID;
-
1784 int2 texture_size;
-
1785 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
1772 }else if( v.at(i).z<-1.f || v.at(i).z>1.f ){
+
1773 if( message_flag ){
+
1774 std::cout << "WARNING (Visualizer::addTriangle): Triangle `z' position ( " << v.at(i).z << " ) is outside of drawable area." << std::endl;
+
1775 }
+
1776 }
+
1777 }
+
1778
+
1779 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
1780 for( uint i=0; i<v.size(); i++ ){
+
1781 v.at(i).x = 2.f*v.at(i).x - 1.f;
+
1782 v.at(i).y = 2.f*v.at(i).y - 1.f;
+
1783 }
+
1784
+
1785 }
1786
-
1787 std::vector<GLfloat> position_data(9), color_data(12), normal_data(9), uv_data(6);
-
1788
-
1789 vec3 normal = cross( vertex1-vertex0, vertex2-vertex0 );
-
1790 normal.normalize();
-
1791
-
1792 //Vertex 0
-
1793 position_data[0] = v.at(0).x;
-
1794 position_data[1] = v.at(0).y;
-
1795 position_data[2] = v.at(0).z;
-
1796 color_data[0] = color.r;
-
1797 color_data[1] = color.g;
-
1798 color_data[2] = color.b;
-
1799 color_data[3] = color.a;
-
1800 uv_data[0] = uv0.x*texture_size.x;
-
1801 uv_data[1] = (1.f-uv0.y)*texture_size.y;
-
1802 normal_data[0] = normal.x;
-
1803 normal_data[1] = normal.y;
-
1804 normal_data[2] = normal.z;
-
1805
-
1806 //Vertex 1
-
1807 position_data[3] = v.at(1).x;
-
1808 position_data[4] = v.at(1).y;
-
1809 position_data[5] = v.at(1).z;
-
1810 color_data[4] = color.r;
-
1811 color_data[5] = color.g;
-
1812 color_data[6] = color.b;
-
1813 color_data[7] = color.a;
-
1814 uv_data[2] = uv1.x*texture_size.x;
-
1815 uv_data[3] = (1.f-uv1.y)*texture_size.y;
-
1816 normal_data[3] = normal.x;
-
1817 normal_data[4] = normal.y;
-
1818 normal_data[5] = normal.z;
-
1819
-
1820 //Vertex 2
-
1821 position_data[6] = v.at(2).x;
-
1822 position_data[7] = v.at(2).y;
-
1823 position_data[8] = v.at(2).z;
-
1824 color_data[8] = color.r;
-
1825 color_data[9] = color.g;
-
1826 color_data[10] = color.b;
-
1827 color_data[11] = color.a;
-
1828 uv_data[4] = uv2.x*texture_size.x;
-
1829 uv_data[5] = (1.f-uv2.y)*texture_size.y;
-
1830 normal_data[6] = normal.x;
-
1831 normal_data[7] = normal.y;
-
1832 normal_data[8] = normal.z;
-
1833
-
1834 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
-
1835 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
-
1836 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
-
1837 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
-
1838
-
1839 std::vector<int> texture_data, coord_data;
-
1840 texture_data.resize(3,2);
-
1841 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1842 texture_data.resize(0);
-
1843 texture_data.resize(3,textureID);
-
1844 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1845
-
1846 coord_data.resize(3,coordFlag);
-
1847 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
-
1848
-
1849}
-
1850
-
1851void Visualizer::addVoxelByCenter( const vec3 &center, const vec3 &size, const SphericalCoord &rotation, const RGBcolor &color, CoordinateSystem coordFlag ){
-
1852 addVoxelByCenter( center, size, rotation, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
1787 uint textureID;
+
1788 int2 texture_size;
+
1789 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
1790
+
1791 std::vector<GLfloat> position_data(9), color_data(12), normal_data(9), uv_data(6);
+
1792
+
1793 vec3 normal = cross( vertex1-vertex0, vertex2-vertex0 );
+
1794 normal.normalize();
+
1795
+
1796 //Vertex 0
+
1797 position_data[0] = v.at(0).x;
+
1798 position_data[1] = v.at(0).y;
+
1799 position_data[2] = v.at(0).z;
+
1800 color_data[0] = color.r;
+
1801 color_data[1] = color.g;
+
1802 color_data[2] = color.b;
+
1803 color_data[3] = color.a;
+
1804 uv_data[0] = uv0.x*texture_size.x;
+
1805 uv_data[1] = (1.f-uv0.y)*texture_size.y;
+
1806 normal_data[0] = normal.x;
+
1807 normal_data[1] = normal.y;
+
1808 normal_data[2] = normal.z;
+
1809
+
1810 //Vertex 1
+
1811 position_data[3] = v.at(1).x;
+
1812 position_data[4] = v.at(1).y;
+
1813 position_data[5] = v.at(1).z;
+
1814 color_data[4] = color.r;
+
1815 color_data[5] = color.g;
+
1816 color_data[6] = color.b;
+
1817 color_data[7] = color.a;
+
1818 uv_data[2] = uv1.x*texture_size.x;
+
1819 uv_data[3] = (1.f-uv1.y)*texture_size.y;
+
1820 normal_data[3] = normal.x;
+
1821 normal_data[4] = normal.y;
+
1822 normal_data[5] = normal.z;
+
1823
+
1824 //Vertex 2
+
1825 position_data[6] = v.at(2).x;
+
1826 position_data[7] = v.at(2).y;
+
1827 position_data[8] = v.at(2).z;
+
1828 color_data[8] = color.r;
+
1829 color_data[9] = color.g;
+
1830 color_data[10] = color.b;
+
1831 color_data[11] = color.a;
+
1832 uv_data[4] = uv2.x*texture_size.x;
+
1833 uv_data[5] = (1.f-uv2.y)*texture_size.y;
+
1834 normal_data[6] = normal.x;
+
1835 normal_data[7] = normal.y;
+
1836 normal_data[8] = normal.z;
+
1837
+
1838 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
+
1839 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
+
1840 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
+
1841 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
+
1842
+
1843 std::vector<int> texture_data, coord_data;
+
1844 texture_data.resize(3,2);
+
1845 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1846 texture_data.resize(0);
+
1847 texture_data.resize(3,textureID);
+
1848 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1849
+
1850 coord_data.resize(3,coordFlag);
+
1851 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
+
1852
1853}
+
1854
-
1855void Visualizer::addVoxelByCenter( const vec3 &center, const vec3 &size, const SphericalCoord &rotation, const RGBAcolor &color, CoordinateSystem coordFlag ){
-
1856
-
1857 float eps = 1e-4; //Avoid z-fighting
+
+
1855void Visualizer::addVoxelByCenter( const vec3 &center, const vec3 &size, const SphericalCoord &rotation, const RGBcolor &color, CoordinateSystem coordFlag ){
+
1856 addVoxelByCenter( center, size, rotation, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
1857}
+
1858
-
1859 float az = rotation.azimuth;
+
+
1859void Visualizer::addVoxelByCenter( const vec3 &center, const vec3 &size, const SphericalCoord &rotation, const RGBAcolor &color, CoordinateSystem coordFlag ){
1860
-
1861 vec3 c0 = center + rotatePoint(make_vec3(0,-0.5f*size.y, 0.f),0,az) + eps;
-
1862 addRectangleByCenter( c0, make_vec2(size.x,size.z), make_SphericalCoord(-0.5*M_PI,az), color, coordFlag );
-
1863
-
1864 vec3 c1 = center + rotatePoint(make_vec3(0, 0.5f*size.y, 0.f),0,az) + eps;
-
1865 addRectangleByCenter( c1, make_vec2(size.x,size.z), make_SphericalCoord(0.5*M_PI,az), color, coordFlag );
-
1866
-
1867 vec3 c2 = center + rotatePoint(make_vec3(0.5f*size.x, 0.f, 0.f),0,az) + eps;
-
1868 addRectangleByCenter( c2, make_vec2(size.y,size.z), make_SphericalCoord(0.5*M_PI,0.5*M_PI+az), color, coordFlag );
-
1869
-
1870 vec3 c3 = center + rotatePoint(make_vec3(-0.5f*size.x, 0.f, 0.f),0,az) + eps;
-
1871 addRectangleByCenter( c3, make_vec2(size.y,size.z), make_SphericalCoord(0.5*M_PI,0.5*M_PI+az), color, coordFlag );
-
1872
-
1873 vec3 c4 = center + make_vec3(0.f, 0.f, -0.5f*size.z) + eps;
-
1874 addRectangleByCenter( c4, make_vec2(size.x,size.y), make_SphericalCoord(M_PI,az), color, coordFlag );
-
1875
-
1876 vec3 c5 = center + make_vec3(0.f, 0.f, 0.5f*size.z) + eps;
-
1877 addRectangleByCenter( c5, make_vec2(size.x,size.y), make_SphericalCoord(0,az), color, coordFlag );
-
1878
-
1879}
-
1880
-
1881void Visualizer::addDiskByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, uint Ndivisions, const RGBcolor &color, CoordinateSystem coordFlag ){
-
1882 addDiskByCenter( center, size, rotation, Ndivisions, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
1861 float eps = 1e-4; //Avoid z-fighting
+
1862
+
1863 float az = rotation.azimuth;
+
1864
+
1865 vec3 c0 = center + rotatePoint(make_vec3(0,-0.5f*size.y, 0.f),0,az) + eps;
+
1866 addRectangleByCenter( c0, make_vec2(size.x,size.z), make_SphericalCoord(-0.5*M_PI,az), color, coordFlag );
+
1867
+
1868 vec3 c1 = center + rotatePoint(make_vec3(0, 0.5f*size.y, 0.f),0,az) + eps;
+
1869 addRectangleByCenter( c1, make_vec2(size.x,size.z), make_SphericalCoord(0.5*M_PI,az), color, coordFlag );
+
1870
+
1871 vec3 c2 = center + rotatePoint(make_vec3(0.5f*size.x, 0.f, 0.f),0,az) + eps;
+
1872 addRectangleByCenter( c2, make_vec2(size.y,size.z), make_SphericalCoord(0.5*M_PI,0.5*M_PI+az), color, coordFlag );
+
1873
+
1874 vec3 c3 = center + rotatePoint(make_vec3(-0.5f*size.x, 0.f, 0.f),0,az) + eps;
+
1875 addRectangleByCenter( c3, make_vec2(size.y,size.z), make_SphericalCoord(0.5*M_PI,0.5*M_PI+az), color, coordFlag );
+
1876
+
1877 vec3 c4 = center + make_vec3(0.f, 0.f, -0.5f*size.z) + eps;
+
1878 addRectangleByCenter( c4, make_vec2(size.x,size.y), make_SphericalCoord(M_PI,az), color, coordFlag );
+
1879
+
1880 vec3 c5 = center + make_vec3(0.f, 0.f, 0.5f*size.z) + eps;
+
1881 addRectangleByCenter( c5, make_vec2(size.x,size.y), make_SphericalCoord(0,az), color, coordFlag );
+
1882
1883}
+
1884
-
1885void Visualizer::addDiskByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, uint Ndivisions, const RGBAcolor &color, CoordinateSystem coordFlag ){
-
1886
-
1887 vec3 disk_center = center;
-
1888 vec2 disk_size = size;
-
1889
-
1890 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
-
1891
-
1892 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our disk coordinates are from 0 to 1 ---- need to convert
-
1893 disk_center.x = 2.f*disk_center.x - 1.f;
-
1894 disk_center.y = 2.f*disk_center.y - 1.f;
-
1895 disk_size.x = 2.f*disk_size.x;
-
1896 disk_size.y = 2.f*disk_size.y;
-
1897
-
1898 }
-
1899
-
1900 std::vector<float> position_data, color_data, normal_data, uv_data;
+
+
1885void Visualizer::addDiskByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, uint Ndivisions, const RGBcolor &color, CoordinateSystem coordFlag ){
+
1886 addDiskByCenter( center, size, rotation, Ndivisions, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
1887}
+
+
1888
+
+
1889void Visualizer::addDiskByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, uint Ndivisions, const RGBAcolor &color, CoordinateSystem coordFlag ){
+
1890
+
1891 vec3 disk_center = center;
+
1892 vec2 disk_size = size;
+
1893
+
1894 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
1895
+
1896 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our disk coordinates are from 0 to 1 ---- need to convert
+
1897 disk_center.x = 2.f*disk_center.x - 1.f;
+
1898 disk_center.y = 2.f*disk_center.y - 1.f;
+
1899 disk_size.x = 2.f*disk_size.x;
+
1900 disk_size.y = 2.f*disk_size.y;
1901
-
1902 vec3 normal = rotatePoint(make_vec3(0,0,1),rotation);
+
1902 }
1903
-
1904 for( int i=0; i<Ndivisions-1; i++ ){
+
1904 std::vector<float> position_data, color_data, normal_data, uv_data;
1905
-
1906 //Center
-
1907 position_data.push_back( disk_center.x );
-
1908 position_data.push_back( disk_center.y );
-
1909 position_data.push_back( disk_center.z );
-
1910 color_data.push_back( color.r );
-
1911 color_data.push_back( color.g );
-
1912 color_data.push_back( color.b );
-
1913 color_data.push_back( color.a );
-
1914 normal_data.push_back( normal.x );
-
1915 normal_data.push_back( normal.y);
-
1916 normal_data.push_back( normal.z);
-
1917
-
1918 float theta1 = 2.f*M_PI*float(i)/float(Ndivisions-1);
-
1919 vec3 v1 = make_vec3( disk_size.x*cos(theta1), disk_size.y*sin(theta1), 0 );
-
1920 v1 = rotatePoint(v1,rotation);
+
1906 vec3 normal = rotatePoint(make_vec3(0,0,1),rotation);
+
1907
+
1908 for( int i=0; i<Ndivisions-1; i++ ){
+
1909
+
1910 //Center
+
1911 position_data.push_back( disk_center.x );
+
1912 position_data.push_back( disk_center.y );
+
1913 position_data.push_back( disk_center.z );
+
1914 color_data.push_back( color.r );
+
1915 color_data.push_back( color.g );
+
1916 color_data.push_back( color.b );
+
1917 color_data.push_back( color.a );
+
1918 normal_data.push_back( normal.x );
+
1919 normal_data.push_back( normal.y);
+
1920 normal_data.push_back( normal.z);
1921
-
1922 position_data.push_back( disk_center.x + v1.x );
-
1923 position_data.push_back( disk_center.y + v1.y );
-
1924 position_data.push_back( disk_center.z + v1.z );
-
1925 color_data.push_back( color.r );
-
1926 color_data.push_back( color.g );
-
1927 color_data.push_back( color.b );
-
1928 color_data.push_back( color.a );
-
1929 normal_data.push_back( normal.x );
-
1930 normal_data.push_back( normal.y );
-
1931 normal_data.push_back( normal.z );
-
1932
-
1933 float theta2 = 2.f*M_PI*float(i)/float(Ndivisions-1);
-
1934
-
1935 vec3 v2 = make_vec3( disk_size.x*cos(theta2), disk_size.y*sin(theta2), 0 );
-
1936 v2 = rotatePoint(v2,rotation);
-
1937 position_data.push_back( disk_center.x + v2.x );
-
1938 position_data.push_back( disk_center.y + v2.y );
-
1939 position_data.push_back( disk_center.z + v2.z );
-
1940 color_data.push_back( color.r );
-
1941 color_data.push_back( color.g );
-
1942 color_data.push_back( color.b );
-
1943 color_data.push_back( color.a );
-
1944 normal_data.push_back( normal.x );
-
1945 normal_data.push_back( normal.y );
-
1946 normal_data.push_back( normal.z );
-
1947
-
1948 }
-
1949
-
1950 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
-
1951 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
-
1952 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
-
1953 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
-
1954
-
1955 std::vector<int> texture_data, coord_data;
-
1956 texture_data.resize(position_data.size()/3,0);
-
1957 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1958 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
1959
-
1960 coord_data.assign(position_data.size()/3,coordFlag);
-
1961 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
-
1962
-
1963}
-
1964
-
1965void Visualizer::addDiskByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, uint Ndivisions, const char* texture_file, CoordinateSystem coordFlag ){
+
1922 float theta1 = 2.f*M_PI*float(i)/float(Ndivisions-1);
+
1923 vec3 v1 = make_vec3( disk_size.x*cos(theta1), disk_size.y*sin(theta1), 0 );
+
1924 v1 = rotatePoint(v1,rotation);
+
1925
+
1926 position_data.push_back( disk_center.x + v1.x );
+
1927 position_data.push_back( disk_center.y + v1.y );
+
1928 position_data.push_back( disk_center.z + v1.z );
+
1929 color_data.push_back( color.r );
+
1930 color_data.push_back( color.g );
+
1931 color_data.push_back( color.b );
+
1932 color_data.push_back( color.a );
+
1933 normal_data.push_back( normal.x );
+
1934 normal_data.push_back( normal.y );
+
1935 normal_data.push_back( normal.z );
+
1936
+
1937 float theta2 = 2.f*M_PI*float(i)/float(Ndivisions-1);
+
1938
+
1939 vec3 v2 = make_vec3( disk_size.x*cos(theta2), disk_size.y*sin(theta2), 0 );
+
1940 v2 = rotatePoint(v2,rotation);
+
1941 position_data.push_back( disk_center.x + v2.x );
+
1942 position_data.push_back( disk_center.y + v2.y );
+
1943 position_data.push_back( disk_center.z + v2.z );
+
1944 color_data.push_back( color.r );
+
1945 color_data.push_back( color.g );
+
1946 color_data.push_back( color.b );
+
1947 color_data.push_back( color.a );
+
1948 normal_data.push_back( normal.x );
+
1949 normal_data.push_back( normal.y );
+
1950 normal_data.push_back( normal.z );
+
1951
+
1952 }
+
1953
+
1954 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
+
1955 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
+
1956 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
+
1957 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
+
1958
+
1959 std::vector<int> texture_data, coord_data;
+
1960 texture_data.resize(position_data.size()/3,0);
+
1961 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1962 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
1963
+
1964 coord_data.assign(position_data.size()/3,coordFlag);
+
1965 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
1966
-
1967 vec3 disk_center = center;
-
1968 vec2 disk_size = size;
-
1969
-
1970 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
-
1971
-
1972 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
1973 disk_center.x = 2.f*disk_center.x - 1.f;
-
1974 disk_center.y = 2.f*disk_center.y - 1.f;
-
1975 disk_size.x = 2.f*disk_size.x;
-
1976 disk_size.y = 2.f*disk_size.y;
-
1977
-
1978 }
-
1979
-
1980 uint textureID;
-
1981 int2 texture_size;
-
1982 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
1967}
+
+
1968
+
+
1969void Visualizer::addDiskByCenter( const vec3 &center, const vec2 &size, const SphericalCoord &rotation, uint Ndivisions, const char* texture_file, CoordinateSystem coordFlag ){
+
1970
+
1971 vec3 disk_center = center;
+
1972 vec2 disk_size = size;
+
1973
+
1974 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
1975
+
1976 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
1977 disk_center.x = 2.f*disk_center.x - 1.f;
+
1978 disk_center.y = 2.f*disk_center.y - 1.f;
+
1979 disk_size.x = 2.f*disk_size.x;
+
1980 disk_size.y = 2.f*disk_size.y;
+
1981
+
1982 }
1983
-
1984 std::vector<float> position_data, color_data, normal_data, uv_data;
-
1985
-
1986 vec3 normal = rotatePoint(make_vec3(0,0,1),rotation);
+
1984 uint textureID;
+
1985 int2 texture_size;
+
1986 primaryShader.setTextureMap(texture_file,textureID,texture_size);
1987
-
1988 for( int i=0; i<Ndivisions-1; i++ ){
+
1988 std::vector<float> position_data, color_data, normal_data, uv_data;
1989
-
1990 //Center
-
1991 position_data.push_back( disk_center.x );
-
1992 position_data.push_back( disk_center.y );
-
1993 position_data.push_back( disk_center.z );
-
1994 normal_data.push_back( normal.x );
-
1995 normal_data.push_back( normal.y);
-
1996 normal_data.push_back( normal.z);
-
1997 uv_data.push_back( 0.5*(texture_size.x-1) );
-
1998 uv_data.push_back( 0.5*(texture_size.y-1) );
-
1999
-
2000 float theta1 = 2.f*M_PI*float(i)/float(Ndivisions-1);
-
2001 vec3 v1 = make_vec3( disk_size.x*cos(theta1), disk_size.y*sin(theta1), 0 );
-
2002 v1 = rotatePoint(v1,rotation);
+
1990 vec3 normal = rotatePoint(make_vec3(0,0,1),rotation);
+
1991
+
1992 for( int i=0; i<Ndivisions-1; i++ ){
+
1993
+
1994 //Center
+
1995 position_data.push_back( disk_center.x );
+
1996 position_data.push_back( disk_center.y );
+
1997 position_data.push_back( disk_center.z );
+
1998 normal_data.push_back( normal.x );
+
1999 normal_data.push_back( normal.y);
+
2000 normal_data.push_back( normal.z);
+
2001 uv_data.push_back( 0.5*(texture_size.x-1) );
+
2002 uv_data.push_back( 0.5*(texture_size.y-1) );
2003
-
2004 position_data.push_back( disk_center.x + v1.x );
-
2005 position_data.push_back( disk_center.y + v1.y );
-
2006 position_data.push_back( disk_center.z + v1.z );
-
2007 normal_data.push_back( normal.x );
-
2008 normal_data.push_back( normal.y );
-
2009 normal_data.push_back( normal.z );
-
2010 uv_data.push_back( (texture_size.x-1)*(0.5f+0.5f*cos(theta1)) );
-
2011 uv_data.push_back( (texture_size.y-1)*(0.5f+0.5f*sin(theta1+M_PI)) );
-
2012
-
2013 float theta2 = 2.f*M_PI*float(i)/float(Ndivisions-1);
-
2014
-
2015 vec3 v2 = make_vec3( disk_size.x*cos(theta2), disk_size.y*sin(theta2), 0 );
-
2016 v2 = rotatePoint(v2,rotation);
-
2017 position_data.push_back( disk_center.x + v2.x );
-
2018 position_data.push_back( disk_center.y + v2.y );
-
2019 position_data.push_back( disk_center.z + v2.z );
-
2020 normal_data.push_back( normal.x );
-
2021 normal_data.push_back( normal.y );
-
2022 normal_data.push_back( normal.z );
-
2023 uv_data.push_back( (texture_size.x-1)*(0.5f+0.5f*cos(theta2)) );
-
2024 uv_data.push_back( (texture_size.y-1)*(0.5f+0.5f*sin(theta2+M_PI)) );
-
2025
-
2026 }
-
2027
-
2028 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
-
2029 color_data.resize( position_data.size()/3*4 );
-
2030 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
-
2031 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
-
2032 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
-
2033
-
2034 std::vector<int> texture_data, coord_data;
-
2035 texture_data.assign(position_data.size()/3,1);
-
2036 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
2037 texture_data.assign(position_data.size()/3,textureID);
-
2038 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
-
2039
-
2040 coord_data.assign(position_data.size()/3,coordFlag);
-
2041 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
-
2042
-
2043}
-
2044
-
2045void Visualizer::addLine( const vec3 &start, const vec3 &end, const RGBcolor &color, uint linewidth, CoordinateSystem coordFlag ){
-
2046 addLine( start, end, make_RGBAcolor(color,1), linewidth, coordFlag );
+
2004 float theta1 = 2.f*M_PI*float(i)/float(Ndivisions-1);
+
2005 vec3 v1 = make_vec3( disk_size.x*cos(theta1), disk_size.y*sin(theta1), 0 );
+
2006 v1 = rotatePoint(v1,rotation);
+
2007
+
2008 position_data.push_back( disk_center.x + v1.x );
+
2009 position_data.push_back( disk_center.y + v1.y );
+
2010 position_data.push_back( disk_center.z + v1.z );
+
2011 normal_data.push_back( normal.x );
+
2012 normal_data.push_back( normal.y );
+
2013 normal_data.push_back( normal.z );
+
2014 uv_data.push_back( (texture_size.x-1)*(0.5f+0.5f*cos(theta1)) );
+
2015 uv_data.push_back( (texture_size.y-1)*(0.5f+0.5f*sin(theta1+M_PI)) );
+
2016
+
2017 float theta2 = 2.f*M_PI*float(i)/float(Ndivisions-1);
+
2018
+
2019 vec3 v2 = make_vec3( disk_size.x*cos(theta2), disk_size.y*sin(theta2), 0 );
+
2020 v2 = rotatePoint(v2,rotation);
+
2021 position_data.push_back( disk_center.x + v2.x );
+
2022 position_data.push_back( disk_center.y + v2.y );
+
2023 position_data.push_back( disk_center.z + v2.z );
+
2024 normal_data.push_back( normal.x );
+
2025 normal_data.push_back( normal.y );
+
2026 normal_data.push_back( normal.z );
+
2027 uv_data.push_back( (texture_size.x-1)*(0.5f+0.5f*cos(theta2)) );
+
2028 uv_data.push_back( (texture_size.y-1)*(0.5f+0.5f*sin(theta2+M_PI)) );
+
2029
+
2030 }
+
2031
+
2032 positionData["triangle"].insert( positionData["triangle"].end(), position_data.begin(), position_data.end() );
+
2033 color_data.resize( position_data.size()/3*4 );
+
2034 colorData["triangle"].insert( colorData["triangle"].end(), color_data.begin(), color_data.end() );
+
2035 normalData["triangle"].insert( normalData["triangle"].end(), normal_data.begin(), normal_data.end() );
+
2036 uvData["triangle"].insert( uvData["triangle"].end(), uv_data.begin(), uv_data.end() );
+
2037
+
2038 std::vector<int> texture_data, coord_data;
+
2039 texture_data.assign(position_data.size()/3,1);
+
2040 textureFlagData["triangle"].insert( textureFlagData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
2041 texture_data.assign(position_data.size()/3,textureID);
+
2042 textureIDData["triangle"].insert( textureIDData["triangle"].end(), texture_data.begin(), texture_data.end() );
+
2043
+
2044 coord_data.assign(position_data.size()/3,coordFlag);
+
2045 coordinateFlagData["triangle"].insert( coordinateFlagData["triangle"].end(), coord_data.begin(), coord_data.end() );
+
2046
2047}
+
2048
-
2049void Visualizer::addLine( const vec3 &start, const vec3 &end, const RGBAcolor &color, uint linewidth, CoordinateSystem coordFlag ){
-
2050
-
2051 line_width = linewidth;
+
+
2049void Visualizer::addLine( const vec3 &start, const vec3 &end, const RGBcolor &color, uint linewidth, CoordinateSystem coordFlag ){
+
2050 addLine( start, end, make_RGBAcolor(color,1), linewidth, coordFlag );
+
2051}
+
2052
-
2053 vec3 s = start; //copy so that can be modified
-
2054 vec3 e = end;
-
2055
-
2056 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
-
2057
-
2058 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
2059 s = 2.f*s - 1.f;
-
2060 e = 2.f*e - 1.f;
+
+
2053void Visualizer::addLine( const vec3 &start, const vec3 &end, const RGBAcolor &color, uint linewidth, CoordinateSystem coordFlag ){
+
2054
+
2055 line_width = linewidth;
+
2056
+
2057 vec3 s = start; //copy so that can be modified
+
2058 vec3 e = end;
+
2059
+
2060 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
2061
-
2062 }
-
2063
-
2064 std::vector<float> position_data, color_data, normal_data, uv_data;
+
2062 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
2063 s = 2.f*s - 1.f;
+
2064 e = 2.f*e - 1.f;
2065
-
2066 position_data.assign( 6, 0 );
-
2067 color_data.assign( 8, 0 );
-
2068 normal_data.assign( 6, 0 );
-
2069 uv_data.assign( 4, 0 );
-
2070
-
2071 //start
-
2072 position_data.at(0) = s.x;
-
2073 position_data.at(1) = s.y;
-
2074 position_data.at(2) = s.z;
-
2075 color_data.at(0) = color.r;
-
2076 color_data.at(1) = color.g;
-
2077 color_data.at(2) = color.b;
-
2078 color_data.at(3) = color.a;
-
2079
-
2080 //end
-
2081 position_data.at(3) = e.x;
-
2082 position_data.at(4) = e.y;
-
2083 position_data.at(5) = e.z;
-
2084 color_data.at(4) = color.r;
-
2085 color_data.at(5) = color.g;
-
2086 color_data.at(6) = color.b;
-
2087 color_data.at(7) = color.a;
-
2088
-
2089 positionData["line"].insert( positionData["line"].end(), position_data.begin(), position_data.end() );
-
2090 colorData["line"].insert( colorData["line"].end(), color_data.begin(), color_data.end() );
-
2091 normalData["line"].insert( normalData["line"].end(), normal_data.begin(), normal_data.end() );
-
2092 uvData["line"].insert( uvData["line"].end(), uv_data.begin(), uv_data.end() );
-
2093
-
2094 std::vector<int> texture_data, coord_data;
-
2095 texture_data.assign(position_data.size()/3,0);
-
2096 textureFlagData["line"].insert( textureFlagData["line"].end(), texture_data.begin(), texture_data.end() );
-
2097 textureIDData["line"].insert( textureIDData["line"].end(), texture_data.begin(), texture_data.end() );
-
2098
-
2099 coord_data.assign(position_data.size()/3,coordFlag);
-
2100 coordinateFlagData["line"].insert( coordinateFlagData["line"].end(), coord_data.begin(), coord_data.end() );
-
2101
-
2102}
-
2103
-
2104void Visualizer::addPoint( const vec3 &position, const RGBcolor &color, uint pointsize, CoordinateSystem coordFlag ){
-
2105 addPoint( position, make_RGBAcolor(color,1), pointsize, coordFlag );
+
2066 }
+
2067
+
2068 std::vector<float> position_data, color_data, normal_data, uv_data;
+
2069
+
2070 position_data.assign( 6, 0 );
+
2071 color_data.assign( 8, 0 );
+
2072 normal_data.assign( 6, 0 );
+
2073 uv_data.assign( 4, 0 );
+
2074
+
2075 //start
+
2076 position_data.at(0) = s.x;
+
2077 position_data.at(1) = s.y;
+
2078 position_data.at(2) = s.z;
+
2079 color_data.at(0) = color.r;
+
2080 color_data.at(1) = color.g;
+
2081 color_data.at(2) = color.b;
+
2082 color_data.at(3) = color.a;
+
2083
+
2084 //end
+
2085 position_data.at(3) = e.x;
+
2086 position_data.at(4) = e.y;
+
2087 position_data.at(5) = e.z;
+
2088 color_data.at(4) = color.r;
+
2089 color_data.at(5) = color.g;
+
2090 color_data.at(6) = color.b;
+
2091 color_data.at(7) = color.a;
+
2092
+
2093 positionData["line"].insert( positionData["line"].end(), position_data.begin(), position_data.end() );
+
2094 colorData["line"].insert( colorData["line"].end(), color_data.begin(), color_data.end() );
+
2095 normalData["line"].insert( normalData["line"].end(), normal_data.begin(), normal_data.end() );
+
2096 uvData["line"].insert( uvData["line"].end(), uv_data.begin(), uv_data.end() );
+
2097
+
2098 std::vector<int> texture_data, coord_data;
+
2099 texture_data.assign(position_data.size()/3,0);
+
2100 textureFlagData["line"].insert( textureFlagData["line"].end(), texture_data.begin(), texture_data.end() );
+
2101 textureIDData["line"].insert( textureIDData["line"].end(), texture_data.begin(), texture_data.end() );
+
2102
+
2103 coord_data.assign(position_data.size()/3,coordFlag);
+
2104 coordinateFlagData["line"].insert( coordinateFlagData["line"].end(), coord_data.begin(), coord_data.end() );
+
2105
2106}
+
2107
-
2108void Visualizer::addPoint( const vec3 &position, const RGBAcolor &color, uint pointsize, CoordinateSystem coordFlag ){
-
2109
-
2110 point_width = pointsize;
+
+
2108void Visualizer::addPoint( const vec3 &position, const RGBcolor &color, uint pointsize, CoordinateSystem coordFlag ){
+
2109 addPoint( position, make_RGBAcolor(color,1), pointsize, coordFlag );
+
2110}
+
2111
-
2112 vec3 p = position; //copy so that can be modified
+
+
2112void Visualizer::addPoint( const vec3 &position, const RGBAcolor &color, uint pointsize, CoordinateSystem coordFlag ){
2113
-
2114 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
2114 point_width = pointsize;
2115
-
2116 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
-
2117 p = 2.f*p - 1.f;
-
2118
-
2119 }
-
2120
-
2121 std::vector<float> position_data, color_data,normal_data, uv_data;
+
2116 vec3 p = position; //copy so that can be modified
+
2117
+
2118 if( coordFlag == 0 ){ //No vertex transformation (i.e., identity matrix)
+
2119
+
2120 //NOTE for vertex positions: OpenGL window coordinates range from -1 to 1, but our rectangle coordinates are from 0 to 1 ---- need to convert
+
2121 p = 2.f*p - 1.f;
2122
-
2123 position_data.assign( 3, 0 );
-
2124 color_data.assign( 4, 0 );
-
2125 normal_data.assign( 3, 0 );
-
2126 uv_data.assign( 2, 0 );
-
2127
-
2128 position_data.at(0) = p.x;
-
2129 position_data.at(1) = p.y;
-
2130 position_data.at(2) = p.z;
-
2131 color_data.at(0) = color.r;
-
2132 color_data.at(1) = color.g;
-
2133 color_data.at(2) = color.b;
-
2134 color_data.at(3) = color.a;
-
2135
-
2136 positionData["point"].insert( positionData["point"].end(), position_data.begin(), position_data.end() );
-
2137 colorData["point"].insert( colorData["point"].end(), color_data.begin(), color_data.end() );
-
2138 normalData["point"].insert( normalData["point"].end(), normal_data.begin(), normal_data.end() );
-
2139 uvData["point"].insert( uvData["point"].end(), uv_data.begin(), uv_data.end() );
-
2140
-
2141 std::vector<int> texture_data, coord_data;
-
2142 texture_data.assign(position_data.size()/3,0);
-
2143 textureFlagData["point"].insert( textureFlagData["point"].end(), texture_data.begin(), texture_data.end() );
-
2144 textureIDData["point"].insert( textureIDData["point"].end(), texture_data.begin(), texture_data.end() );
-
2145
-
2146 coord_data.assign(position_data.size()/3,coordFlag);
-
2147 coordinateFlagData["point"].insert( coordinateFlagData["point"].end(), coord_data.begin(), coord_data.end() );
-
2148
-
2149}
-
2150
-
2151void Visualizer::addSphereByCenter( float radius, const vec3 &center, uint Ndivisions, const RGBcolor &color, CoordinateSystem coordFlag ){
-
2152 addSphereByCenter( radius, center, Ndivisions, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
2123 }
+
2124
+
2125 std::vector<float> position_data, color_data,normal_data, uv_data;
+
2126
+
2127 position_data.assign( 3, 0 );
+
2128 color_data.assign( 4, 0 );
+
2129 normal_data.assign( 3, 0 );
+
2130 uv_data.assign( 2, 0 );
+
2131
+
2132 position_data.at(0) = p.x;
+
2133 position_data.at(1) = p.y;
+
2134 position_data.at(2) = p.z;
+
2135 color_data.at(0) = color.r;
+
2136 color_data.at(1) = color.g;
+
2137 color_data.at(2) = color.b;
+
2138 color_data.at(3) = color.a;
+
2139
+
2140 positionData["point"].insert( positionData["point"].end(), position_data.begin(), position_data.end() );
+
2141 colorData["point"].insert( colorData["point"].end(), color_data.begin(), color_data.end() );
+
2142 normalData["point"].insert( normalData["point"].end(), normal_data.begin(), normal_data.end() );
+
2143 uvData["point"].insert( uvData["point"].end(), uv_data.begin(), uv_data.end() );
+
2144
+
2145 std::vector<int> texture_data, coord_data;
+
2146 texture_data.assign(position_data.size()/3,0);
+
2147 textureFlagData["point"].insert( textureFlagData["point"].end(), texture_data.begin(), texture_data.end() );
+
2148 textureIDData["point"].insert( textureIDData["point"].end(), texture_data.begin(), texture_data.end() );
+
2149
+
2150 coord_data.assign(position_data.size()/3,coordFlag);
+
2151 coordinateFlagData["point"].insert( coordinateFlagData["point"].end(), coord_data.begin(), coord_data.end() );
+
2152
2153}
+
2154
-
2155void Visualizer::addSphereByCenter( float radius, const vec3 &center, uint Ndivisions, const RGBAcolor &color, CoordinateSystem coordFlag ){
-
2156
-
2157 float theta;
-
2158 float dtheta=M_PI/float(Ndivisions);
-
2159 float dphi=2.0*M_PI/float(Ndivisions);
+
+
2155void Visualizer::addSphereByCenter( float radius, const vec3 &center, uint Ndivisions, const RGBcolor &color, CoordinateSystem coordFlag ){
+
2156 addSphereByCenter( radius, center, Ndivisions, make_RGBAcolor(color.r,color.g,color.b,1), coordFlag );
+
2157}
+
+
2158
+
+
2159void Visualizer::addSphereByCenter( float radius, const vec3 &center, uint Ndivisions, const RGBAcolor &color, CoordinateSystem coordFlag ){
2160
-
2161 //bottom cap
-
2162 for( int j=0; j<Ndivisions; j++ ){
-
2163
-
2164 vec3 v0 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI, 0 ) );
-
2165 vec3 v1 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+dtheta, float(j)*dphi ) );
-
2166 vec3 v2 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+dtheta, float(j+1)*dphi ) );
+
2161 float theta;
+
2162 float dtheta=M_PI/float(Ndivisions);
+
2163 float dphi=2.0*M_PI/float(Ndivisions);
+
2164
+
2165 //bottom cap
+
2166 for( int j=0; j<Ndivisions; j++ ){
2167
-
2168 addTriangle(v0,v1,v2,color,coordFlag);
-
2169
-
2170 }
+
2168 vec3 v0 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI, 0 ) );
+
2169 vec3 v1 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+dtheta, float(j)*dphi ) );
+
2170 vec3 v2 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+dtheta, float(j+1)*dphi ) );
2171
-
2172 //top cap
-
2173 for( int j=0; j<Ndivisions; j++ ){
-
2174
-
2175 vec3 v0 = center + sphere2cart( make_SphericalCoord(radius, 0.5*M_PI, 0 ) );
-
2176 vec3 v1 = center + sphere2cart( make_SphericalCoord(radius, 0.5*M_PI-dtheta, float(j)*dphi ) );
-
2177 vec3 v2 = center + sphere2cart( make_SphericalCoord(radius, 0.5*M_PI-dtheta, float(j+1)*dphi ) );
+
2172 addTriangle(v0,v1,v2,color,coordFlag);
+
2173
+
2174 }
+
2175
+
2176 //top cap
+
2177 for( int j=0; j<Ndivisions; j++ ){
2178
-
2179 addTriangle(v2,v1,v0,color,coordFlag);
-
2180
-
2181 }
+
2179 vec3 v0 = center + sphere2cart( make_SphericalCoord(radius, 0.5*M_PI, 0 ) );
+
2180 vec3 v1 = center + sphere2cart( make_SphericalCoord(radius, 0.5*M_PI-dtheta, float(j)*dphi ) );
+
2181 vec3 v2 = center + sphere2cart( make_SphericalCoord(radius, 0.5*M_PI-dtheta, float(j+1)*dphi ) );
2182
-
2183 //middle
-
2184 for( int j=0; j<Ndivisions; j++ ){
-
2185 for( int i=1; i<Ndivisions-1; i++ ){
+
2183 addTriangle(v2,v1,v0,color,coordFlag);
+
2184
+
2185 }
2186
-
2187 vec3 v0 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+float(i)*dtheta, float(j)*dphi ) );
-
2188 vec3 v1 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+float(i+1)*dtheta, float(j)*dphi ) );
-
2189 vec3 v2 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+float(i+1)*dtheta, float(j+1)*dphi ) );
-
2190 vec3 v3 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+float(i)*dtheta, float(j+1)*dphi ) );
-
2191
-
2192 addTriangle(v0,v1,v2,color,coordFlag);
-
2193 addTriangle(v0,v2,v3,color,coordFlag);
-
2194
-
2195 }
-
2196 }
-
2197
-
2198}
-
2199
-
2200void Visualizer::addSkyDomeByCenter( float radius, const vec3 &center, uint Ndivisions, const char* texture_file, int layer ){
-
2201 addSkyDomeByCenter( radius, center, Ndivisions, texture_file );
+
2187 //middle
+
2188 for( int j=0; j<Ndivisions; j++ ){
+
2189 for( int i=1; i<Ndivisions-1; i++ ){
+
2190
+
2191 vec3 v0 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+float(i)*dtheta, float(j)*dphi ) );
+
2192 vec3 v1 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+float(i+1)*dtheta, float(j)*dphi ) );
+
2193 vec3 v2 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+float(i+1)*dtheta, float(j+1)*dphi ) );
+
2194 vec3 v3 = center + sphere2cart( make_SphericalCoord(radius, -0.5*M_PI+float(i)*dtheta, float(j+1)*dphi ) );
+
2195
+
2196 addTriangle(v0,v1,v2,color,coordFlag);
+
2197 addTriangle(v0,v2,v3,color,coordFlag);
+
2198
+
2199 }
+
2200 }
+
2201
2202}
+
2203
-
2204void Visualizer::addSkyDomeByCenter( float radius, const vec3 &center, uint Ndivisions, const char* texture_file ){
-
2205
-
2206
-
2207 int Ntheta=Ndivisions;
-
2208 int Nphi=2*Ndivisions;
+
+
2204void Visualizer::addSkyDomeByCenter( float radius, const vec3 &center, uint Ndivisions, const char* texture_file, int layer ){
+
2205 addSkyDomeByCenter( radius, center, Ndivisions, texture_file );
+
2206}
+
+
2207
+
2208void Visualizer::addSkyDomeByCenter( float radius, const vec3 &center, uint Ndivisions, const char* texture_file ){
2209
-
2210 float thetaStart = -0.1*M_PI;
-
2211
-
2212 float dtheta=(0.5*M_PI-thetaStart)/float(Ntheta-1);
-
2213 float dphi=2.f*M_PI/float(Nphi-1);
-
2214
-
2215 uint textureID;
-
2216 int2 texture_size;
-
2217 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
2210
+
2211 int Ntheta=Ndivisions;
+
2212 int Nphi=2*Ndivisions;
+
2213
+
2214 float thetaStart = -0.1*M_PI;
+
2215
+
2216 float dtheta=(0.5*M_PI-thetaStart)/float(Ntheta-1);
+
2217 float dphi=2.f*M_PI/float(Nphi-1);
2218
-
2219 std::vector<float> color_data, normal_data;
-
2220 std::vector<int> texture_data, coord_data;
-
2221
-
2222 color_data.assign(24,0);
-
2223 normal_data.assign(18,0);
-
2224
-
2225 for( uint j=1; j<Nphi; j++ ){
-
2226 for( uint i=1; i<Ntheta; i++ ){
-
2227
-
2228 float theta = thetaStart+i*dtheta;
-
2229 float phi=j*dphi;
-
2230
-
2231 vec3 v0( center.x+radius*cos(theta)*cos(phi),center.y+radius*cos(theta)*sin(phi), center.z+radius*(sin(theta)) );
-
2232 vec2 uv0( float(Nphi-j)/float(Nphi-1)*(texture_size.x-1), float(Ntheta-i)/float(Ntheta-1)*(texture_size.y-1) );
-
2233
-
2234 vec3 v1( center.x+radius*cos(theta)*cos(phi+dphi),center.y+radius*cos(theta)*sin(phi+dphi), center.z+radius*(sin(theta)) );
-
2235 vec2 uv1( float(Nphi-j-1)/float(Nphi-1)*(texture_size.x-1), float(Ntheta-i)/float(Ntheta-1)*(texture_size.y-1) );
-
2236
-
2237 vec3 v2( center.x+radius*cos(theta+dtheta)*cos(phi+dphi),center.y+radius*cos(theta+dtheta)*sin(phi+dphi), center.z+radius*(sin(theta+dtheta)) );
-
2238 vec2 uv2( float(Nphi-j-1)/float(Nphi-1)*(texture_size.x-1), float(Ntheta-i-1)/float(Ntheta-1)*(texture_size.y-1) );
-
2239
-
2240 vec3 v3( center.x+radius*cos(theta+dtheta)*cos(phi),center.y+radius*cos(theta+dtheta)*sin(phi), center.z+radius*(sin(theta+dtheta)) );
-
2241 vec2 uv3( float(Nphi-j)/float(Nphi-1)*(texture_size.x-1), float(Ntheta-i-1)/float(Ntheta-1)*(texture_size.y-1) );
-
2242
-
2243 positionData["sky"].push_back(v0.x);
-
2244 positionData["sky"].push_back(v0.y);
-
2245 positionData["sky"].push_back(v0.z);
-
2246 positionData["sky"].push_back(v1.x);
-
2247 positionData["sky"].push_back(v1.y);
-
2248 positionData["sky"].push_back(v1.z);
-
2249 positionData["sky"].push_back(v2.x);
-
2250 positionData["sky"].push_back(v2.y);
-
2251 positionData["sky"].push_back(v2.z);
-
2252 uvData["sky"].push_back(uv0.x);
-
2253 uvData["sky"].push_back(uv0.y);
-
2254 uvData["sky"].push_back(uv1.x);
-
2255 uvData["sky"].push_back(uv1.y);
-
2256 uvData["sky"].push_back(uv2.x);
-
2257 uvData["sky"].push_back(uv2.y);
-
2258
-
2259 positionData["sky"].push_back(v0.x);
-
2260 positionData["sky"].push_back(v0.y);
-
2261 positionData["sky"].push_back(v0.z);
-
2262 positionData["sky"].push_back(v2.x);
-
2263 positionData["sky"].push_back(v2.y);
-
2264 positionData["sky"].push_back(v2.z);
-
2265 positionData["sky"].push_back(v3.x);
-
2266 positionData["sky"].push_back(v3.y);
-
2267 positionData["sky"].push_back(v3.z);
-
2268 uvData["sky"].push_back(uv0.x);
-
2269 uvData["sky"].push_back(uv0.y);
-
2270 uvData["sky"].push_back(uv2.x);
-
2271 uvData["sky"].push_back(uv2.y);
-
2272 uvData["sky"].push_back(uv3.x);
-
2273 uvData["sky"].push_back(uv3.y);
-
2274
-
2275 texture_data.assign(6,1);
-
2276 textureFlagData["sky"].insert( textureFlagData["sky"].end(), texture_data.begin(), texture_data.end() );
-
2277 texture_data.assign(6,textureID);
-
2278 textureIDData["sky"].insert( textureIDData["sky"].end(), texture_data.begin(), texture_data.end() );
-
2279
-
2280 coord_data.assign(6,COORDINATES_CARTESIAN);
-
2281 coordinateFlagData["sky"].insert( coordinateFlagData["sky"].end(), coord_data.begin(), coord_data.end() );
-
2282
-
2283 colorData["sky"].insert( colorData["sky"].end(), color_data.begin(), color_data.end() );
-
2284 normalData["sky"].insert( normalData["sky"].end(), normal_data.begin(), normal_data.end() );
-
2285
-
2286 }
-
2287 }
-
2288
+
2219 uint textureID;
+
2220 int2 texture_size;
+
2221 primaryShader.setTextureMap(texture_file,textureID,texture_size);
+
2222
+
2223 std::vector<float> color_data, normal_data;
+
2224 std::vector<int> texture_data, coord_data;
+
2225
+
2226 color_data.assign(24,0);
+
2227 normal_data.assign(18,0);
+
2228
+
2229 for( uint j=1; j<Nphi; j++ ){
+
2230 for( uint i=1; i<Ntheta; i++ ){
+
2231
+
2232 float theta = thetaStart+i*dtheta;
+
2233 float phi=j*dphi;
+
2234
+
2235 vec3 v0( center.x+radius*cos(theta)*cos(phi),center.y+radius*cos(theta)*sin(phi), center.z+radius*(sin(theta)) );
+
2236 vec2 uv0( float(Nphi-j)/float(Nphi-1)*(texture_size.x-1), float(Ntheta-i)/float(Ntheta-1)*(texture_size.y-1) );
+
2237
+
2238 vec3 v1( center.x+radius*cos(theta)*cos(phi+dphi),center.y+radius*cos(theta)*sin(phi+dphi), center.z+radius*(sin(theta)) );
+
2239 vec2 uv1( float(Nphi-j-1)/float(Nphi-1)*(texture_size.x-1), float(Ntheta-i)/float(Ntheta-1)*(texture_size.y-1) );
+
2240
+
2241 vec3 v2( center.x+radius*cos(theta+dtheta)*cos(phi+dphi),center.y+radius*cos(theta+dtheta)*sin(phi+dphi), center.z+radius*(sin(theta+dtheta)) );
+
2242 vec2 uv2( float(Nphi-j-1)/float(Nphi-1)*(texture_size.x-1), float(Ntheta-i-1)/float(Ntheta-1)*(texture_size.y-1) );
+
2243
+
2244 vec3 v3( center.x+radius*cos(theta+dtheta)*cos(phi),center.y+radius*cos(theta+dtheta)*sin(phi), center.z+radius*(sin(theta+dtheta)) );
+
2245 vec2 uv3( float(Nphi-j)/float(Nphi-1)*(texture_size.x-1), float(Ntheta-i-1)/float(Ntheta-1)*(texture_size.y-1) );
+
2246
+
2247 positionData["sky"].push_back(v0.x);
+
2248 positionData["sky"].push_back(v0.y);
+
2249 positionData["sky"].push_back(v0.z);
+
2250 positionData["sky"].push_back(v1.x);
+
2251 positionData["sky"].push_back(v1.y);
+
2252 positionData["sky"].push_back(v1.z);
+
2253 positionData["sky"].push_back(v2.x);
+
2254 positionData["sky"].push_back(v2.y);
+
2255 positionData["sky"].push_back(v2.z);
+
2256 uvData["sky"].push_back(uv0.x);
+
2257 uvData["sky"].push_back(uv0.y);
+
2258 uvData["sky"].push_back(uv1.x);
+
2259 uvData["sky"].push_back(uv1.y);
+
2260 uvData["sky"].push_back(uv2.x);
+
2261 uvData["sky"].push_back(uv2.y);
+
2262
+
2263 positionData["sky"].push_back(v0.x);
+
2264 positionData["sky"].push_back(v0.y);
+
2265 positionData["sky"].push_back(v0.z);
+
2266 positionData["sky"].push_back(v2.x);
+
2267 positionData["sky"].push_back(v2.y);
+
2268 positionData["sky"].push_back(v2.z);
+
2269 positionData["sky"].push_back(v3.x);
+
2270 positionData["sky"].push_back(v3.y);
+
2271 positionData["sky"].push_back(v3.z);
+
2272 uvData["sky"].push_back(uv0.x);
+
2273 uvData["sky"].push_back(uv0.y);
+
2274 uvData["sky"].push_back(uv2.x);
+
2275 uvData["sky"].push_back(uv2.y);
+
2276 uvData["sky"].push_back(uv3.x);
+
2277 uvData["sky"].push_back(uv3.y);
+
2278
+
2279 texture_data.assign(6,1);
+
2280 textureFlagData["sky"].insert( textureFlagData["sky"].end(), texture_data.begin(), texture_data.end() );
+
2281 texture_data.assign(6,textureID);
+
2282 textureIDData["sky"].insert( textureIDData["sky"].end(), texture_data.begin(), texture_data.end() );
+
2283
+
2284 coord_data.assign(6,COORDINATES_CARTESIAN);
+
2285 coordinateFlagData["sky"].insert( coordinateFlagData["sky"].end(), coord_data.begin(), coord_data.end() );
+
2286
+
2287 colorData["sky"].insert( colorData["sky"].end(), color_data.begin(), color_data.end() );
+
2288 normalData["sky"].insert( normalData["sky"].end(), normal_data.begin(), normal_data.end() );
2289
-
2290
-
2291}
+
2290 }
+
2291 }
2292
-
2293void Visualizer::addTextboxByCenter( const char* textstring, const vec3 &center, const SphericalCoord &rotation, const RGBcolor &fontcolor, uint fontsize, const char* fontname, CoordinateSystem coordFlag ){
+
2293
2294
-
2295 FT_Library ft; //FreeType objects
-
2296 FT_Face face;
-
2297
-
2298 //initialize the freetype library
-
2299 if(FT_Init_FreeType(&ft)!=0) {
-
2300 helios_runtime_error("ERROR (Visualizer::addTextboxByCenter): Could not init freetype library");
-
2301 }
-
2302
-
2303 std::vector<std::vector<uint> > maskData; //This will hold the letter mask data
-
2304
-
2305 //Load the font
-
2306 char font[100];
-
2307 std::snprintf(font,100,"plugins/visualizer/fonts/%s.ttf",fontname);
-
2308 if(FT_New_Face(ft, font, 0, &face)!=0) {
-
2309 helios_runtime_error("ERROR (Visualizer::addTextboxByCenter): Could not open font '" + std::string(fontname) + "'");
-
2310 }
-
2311
-
2312 //Load the font size
-
2313 FT_Set_Pixel_Sizes(face, 0, fontsize);
-
2314
-
2315 //x- and y- size of a pixel in [0,1] normalized coordinates
-
2316 float sx=1.f/float(Wdisplay);
-
2317 float sy=1.f/float(Hdisplay);
+
2295}
+
2296
+
+
2297void Visualizer::addTextboxByCenter( const char* textstring, const vec3 &center, const SphericalCoord &rotation, const RGBcolor &fontcolor, uint fontsize, const char* fontname, CoordinateSystem coordFlag ){
+
2298
+
2299 FT_Library ft; //FreeType objects
+
2300 FT_Face face;
+
2301
+
2302 //initialize the freetype library
+
2303 if(FT_Init_FreeType(&ft)!=0) {
+
2304 helios_runtime_error("ERROR (Visualizer::addTextboxByCenter): Could not init freetype library");
+
2305 }
+
2306
+
2307 std::vector<std::vector<uint> > maskData; //This will hold the letter mask data
+
2308
+
2309 //Load the font
+
2310 char font[100];
+
2311 std::snprintf(font,100,"plugins/visualizer/fonts/%s.ttf",fontname);
+
2312 if(FT_New_Face(ft, font, 0, &face)!=0) {
+
2313 helios_runtime_error("ERROR (Visualizer::addTextboxByCenter): Could not open font '" + std::string(fontname) + "'");
+
2314 }
+
2315
+
2316 //Load the font size
+
2317 FT_Set_Pixel_Sizes(face, 0, fontsize);
2318
-
2319 FT_GlyphSlot gg = face->glyph; //FreeType glyph for font `fontname' and size `fontsize'
-
2320
-
2321 //first, find out how wide the text is going to be
-
2322 //This is because we need to know the width beforehand if we want to center the text
-
2323 float wtext=0;
-
2324 float htext=0;
-
2325 const char* textt = textstring;
-
2326 for( const char* p = textt; *p; p++) { //looping over each letter in `textstring'
-
2327 if(FT_Load_Char(face, *p, FT_LOAD_RENDER)) //load the letter
-
2328 continue;
-
2329 float offset=0, scale=1;
-
2330 if(strncmp(p,"_",1)==0){ //subscript
-
2331 offset=-0.3f*sy;
-
2332 scale=0.5;
-
2333 continue;
-
2334 }else if(strncmp(p,"^",1)==0){ //superscript
-
2335 offset=0.3f*sy;
+
2319 //x- and y- size of a pixel in [0,1] normalized coordinates
+
2320 float sx=1.f/float(Wdisplay);
+
2321 float sy=1.f/float(Hdisplay);
+
2322
+
2323 FT_GlyphSlot gg = face->glyph; //FreeType glyph for font `fontname' and size `fontsize'
+
2324
+
2325 //first, find out how wide the text is going to be
+
2326 //This is because we need to know the width beforehand if we want to center the text
+
2327 float wtext=0;
+
2328 float htext=0;
+
2329 const char* textt = textstring;
+
2330 for( const char* p = textt; *p; p++) { //looping over each letter in `textstring'
+
2331 if(FT_Load_Char(face, *p, FT_LOAD_RENDER)) //load the letter
+
2332 continue;
+
2333 float offset=0, scale=1;
+
2334 if(strncmp(p,"_",1)==0){ //subscript
+
2335 offset=-0.3f*sy;
2336 scale=0.5;
2337 continue;
-
2338 }
-
2339 wtext += gg->bitmap.width*sx*scale;
-
2340 htext = std::max( gg->bitmap.rows*sy, htext );
-
2341 }
-
2342
-
2343 //location of the center of our textbox
-
2344 float xt=center.x-0.5f*wtext;
-
2345 float yt=center.y-0.5f*htext;
+
2338 }else if(strncmp(p,"^",1)==0){ //superscript
+
2339 offset=0.3f*sy;
+
2340 scale=0.5;
+
2341 continue;
+
2342 }
+
2343 wtext += gg->bitmap.width*sx*scale;
+
2344 htext = std::max( gg->bitmap.rows*sy, htext );
+
2345 }
2346
-
2347 if( message_flag ){
-
2348 if( coordFlag==COORDINATES_WINDOW_NORMALIZED ){
-
2349 if(xt<0 || xt>1){
-
2350 if( message_flag ) {
-
2351 std::cout << "WARNING (Visualizer::addTextboxByCenter): text x-coordinate is outside of window area" << std::endl;
-
2352 }
-
2353 }
-
2354 if(yt<0 || yt>1){
-
2355 if( message_flag ) {
-
2356 std::cout << "WARNING (Visualizer::addTextboxByCenter): text y-coordinate is outside of window area" << std::endl;
-
2357 }
-
2358 }
-
2359 }
-
2360 }
-
2361
-
2362 FT_GlyphSlot g = face->glyph; //Another FreeType glyph for font `fontname' and size `fontsize'
-
2363
-
2364 const char* text = textstring;
+
2347 //location of the center of our textbox
+
2348 float xt=center.x-0.5f*wtext;
+
2349 float yt=center.y-0.5f*htext;
+
2350
+
2351 if( message_flag ){
+
2352 if( coordFlag==COORDINATES_WINDOW_NORMALIZED ){
+
2353 if(xt<0 || xt>1){
+
2354 if( message_flag ) {
+
2355 std::cout << "WARNING (Visualizer::addTextboxByCenter): text x-coordinate is outside of window area" << std::endl;
+
2356 }
+
2357 }
+
2358 if(yt<0 || yt>1){
+
2359 if( message_flag ) {
+
2360 std::cout << "WARNING (Visualizer::addTextboxByCenter): text y-coordinate is outside of window area" << std::endl;
+
2361 }
+
2362 }
+
2363 }
+
2364 }
2365
-
2366 float offset=0; //baseline offset for subscript/superscript
-
2367 float scale=1; //scaling factor for subscript/superscript
-
2368 for( const char* p = text; *p; p++) { //looping over each letter in `textstring'
+
2366 FT_GlyphSlot g = face->glyph; //Another FreeType glyph for font `fontname' and size `fontsize'
+
2367
+
2368 const char* text = textstring;
2369
-
2370 if(FT_Load_Char(face, *p, FT_LOAD_RENDER)) //load the letter
-
2371 continue;
-
2372
-
2373 if(strncmp(p,"_",1)==0){ //subscript
-
2374 offset=-0.3*sy;
-
2375 scale=0.5;
-
2376 continue;
-
2377 }else if(strncmp(p,"^",1)==0){ //superscript
-
2378 offset=0.3*sy;
+
2370 float offset=0; //baseline offset for subscript/superscript
+
2371 float scale=1; //scaling factor for subscript/superscript
+
2372 for( const char* p = text; *p; p++) { //looping over each letter in `textstring'
+
2373
+
2374 if(FT_Load_Char(face, *p, FT_LOAD_RENDER)) //load the letter
+
2375 continue;
+
2376
+
2377 if(strncmp(p,"_",1)==0){ //subscript
+
2378 offset=-0.3*sy;
2379 scale=0.5;
2380 continue;
-
2381 }
-
2382
-
2383 //Copy the letter's mask into 2D `maskData' structure
-
2384 int2 tsize = make_int2( g->bitmap.width, g->bitmap.rows );
-
2385 maskData.resize(tsize.y);
-
2386 for(int j=0;j<tsize.y;j++){
-
2387 maskData.at(j).resize(tsize.x);
-
2388 for(int i=0;i<tsize.x;i++){
-
2389 maskData.at(j).at(i) = (uint)g->bitmap.buffer[i+j*tsize.x];
-
2390 }
-
2391 }
-
2392
-
2393 //size of this letter (i.e., the size of the rectangle we're going to make
-
2394 vec2 lettersize = make_vec2( g->bitmap.width*scale*sx, g->bitmap.rows*scale*sy );
-
2395
-
2396 //position of this letter (i.e., the center of the rectangle we're going to make
-
2397 vec3 letterposition = make_vec3(xt + g->bitmap_left*sx + 0.5*lettersize.x , yt + g->bitmap_top*( sy+offset ) - 0.5*lettersize.y, center.z );
-
2398
-
2399 //advance the x- and y- letter position
-
2400 xt += (g->advance.x >> 6) * sx * scale;
-
2401 yt += (g->advance.y >> 6) * sy * scale;
+
2381 }else if(strncmp(p,"^",1)==0){ //superscript
+
2382 offset=0.3*sy;
+
2383 scale=0.5;
+
2384 continue;
+
2385 }
+
2386
+
2387 //Copy the letter's mask into 2D `maskData' structure
+
2388 int2 tsize = make_int2( g->bitmap.width, g->bitmap.rows );
+
2389 maskData.resize(tsize.y);
+
2390 for(int j=0;j<tsize.y;j++){
+
2391 maskData.at(j).resize(tsize.x);
+
2392 for(int i=0;i<tsize.x;i++){
+
2393 maskData.at(j).at(i) = (uint)g->bitmap.buffer[i+j*tsize.x];
+
2394 }
+
2395 }
+
2396
+
2397 //size of this letter (i.e., the size of the rectangle we're going to make
+
2398 vec2 lettersize = make_vec2( g->bitmap.width*scale*sx, g->bitmap.rows*scale*sy );
+
2399
+
2400 //position of this letter (i.e., the center of the rectangle we're going to make
+
2401 vec3 letterposition = make_vec3(xt + g->bitmap_left*sx + 0.5*lettersize.x , yt + g->bitmap_top*( sy+offset ) - 0.5*lettersize.y, center.z );
2402
-
2403 //reset the offset and scale
-
2404 offset=0;
-
2405 scale=1;
+
2403 //advance the x- and y- letter position
+
2404 xt += (g->advance.x >> 6) * sx * scale;
+
2405 yt += (g->advance.y >> 6) * sy * scale;
2406
-
2407 if( lettersize.x==0 || lettersize.y==0 ){ //if the size of the letter is 0, don't add a rectangle
-
2408 continue;
-
2409 }
+
2407 //reset the offset and scale
+
2408 offset=0;
+
2409 scale=1;
2410
-
2411 Glyph glyph;
-
2412 glyph.data = maskData;
-
2413 glyph.size = tsize;
-
2414 glyph.filename = (char*)""; //Note: we are setting an empty filename to make sure the shader loads a new texture
-
2415
-
2416 addRectangleByCenter(letterposition,lettersize,rotation,make_RGBcolor(fontcolor.r,fontcolor.g,fontcolor.b),&glyph,coordFlag);
-
2417
-
2418 }
+
2411 if( lettersize.x==0 || lettersize.y==0 ){ //if the size of the letter is 0, don't add a rectangle
+
2412 continue;
+
2413 }
+
2414
+
2415 Glyph glyph;
+
2416 glyph.data = maskData;
+
2417 glyph.size = tsize;
+
2418 glyph.filename = (char*)""; //Note: we are setting an empty filename to make sure the shader loads a new texture
2419
-
2420 FT_Done_FreeType(ft);
+
2420 addRectangleByCenter(letterposition,lettersize,rotation,make_RGBcolor(fontcolor.r,fontcolor.g,fontcolor.b),&glyph,coordFlag);
2421
-
2422}
+
2422 }
2423
-
2424void Visualizer::addColorbarByCenter(const char* title, const helios::vec2 &size, const helios::vec3 &center, const helios::RGBcolor &font_color, const Colormap &colormap ){
+
2424 FT_Done_FreeType(ft);
2425
-
2426 uint Ndivs = 50;
+
2426}
+
2427
-
2428 uint Nticks = 4;
+
2428void Visualizer::addColorbarByCenter(const char* title, const helios::vec2 &size, const helios::vec3 &center, const helios::RGBcolor &font_color, const Colormap &colormap ){
2429
-
2430 if( !colorbar_ticks.empty() ){
-
2431 Nticks = colorbar_ticks.size();
-
2432 }
+
2430 uint Ndivs = 50;
+
2431
+
2432 uint Nticks = 4;
2433
-
2434 float dx = size.x/float(Ndivs);
-
2435
-
2436 float cmin = clamp(colormap.getLowerLimit(), -1e7f, 1e7f);
-
2437 float cmax = clamp(colormap.getUpperLimit(), -1e7f, 1e7f);
-
2438
-
2439 for( uint i=0; i<Ndivs; i++ ){
-
2440
-
2441 float x = center.x -0.5f*size.x + (float(i)+0.5)*dx;
+
2434 if( !colorbar_ticks.empty() ){
+
2435 Nticks = colorbar_ticks.size();
+
2436 }
+
2437
+
2438 float dx = size.x/float(Ndivs);
+
2439
+
2440 float cmin = clamp(colormap.getLowerLimit(), -1e7f, 1e7f);
+
2441 float cmax = clamp(colormap.getUpperLimit(), -1e7f, 1e7f);
2442
-
2443 RGBcolor color = colormap.query( cmin+float(i)/float(Ndivs)*(cmax-cmin) );
+
2443 for( uint i=0; i<Ndivs; i++ ){
2444
-
2445 addRectangleByCenter( make_vec3(x,center.y,center.z), make_vec2(dx,0.5f*size.y), make_SphericalCoord(0,0), color, COORDINATES_WINDOW_NORMALIZED );
+
2445 float x = center.x -0.5f*size.x + (float(i)+0.5)*dx;
2446
-
2447 }
+
2447 RGBcolor color = colormap.query( cmin+float(i)/float(Ndivs)*(cmax-cmin) );
2448
-
2449 std::vector<vec3> border;
-
2450 border.push_back( make_vec3( center.x-0.5*size.x, center.y+0.25*size.y, center.z-0.001 ) );
-
2451 border.push_back( make_vec3( center.x+0.5*size.x, center.y+0.25*size.y, center.z-0.001 ) );
-
2452 border.push_back( make_vec3( center.x+0.5*size.x, center.y-0.25*size.y, center.z-0.001 ) );
-
2453 border.push_back( make_vec3( center.x-0.5*size.x, center.y-0.25*size.y, center.z-0.001 ) );
+
2449 addRectangleByCenter( make_vec3(x,center.y,center.z), make_vec2(dx,0.5f*size.y), make_SphericalCoord(0,0), color, COORDINATES_WINDOW_NORMALIZED );
+
2450
+
2451 }
+
2452
+
2453 std::vector<vec3> border;
2454 border.push_back( make_vec3( center.x-0.5*size.x, center.y+0.25*size.y, center.z-0.001 ) );
-
2455
-
2456 for( uint i=0; i<border.size()-1; i++ ){
-
2457 addLine( border.at(i), border.at(i+1), font_color, 1, COORDINATES_WINDOW_NORMALIZED );
-
2458 }
+
2455 border.push_back( make_vec3( center.x+0.5*size.x, center.y+0.25*size.y, center.z-0.001 ) );
+
2456 border.push_back( make_vec3( center.x+0.5*size.x, center.y-0.25*size.y, center.z-0.001 ) );
+
2457 border.push_back( make_vec3( center.x-0.5*size.x, center.y-0.25*size.y, center.z-0.001 ) );
+
2458 border.push_back( make_vec3( center.x-0.5*size.x, center.y+0.25*size.y, center.z-0.001 ) );
2459
-
2460 dx = size.x/float(Nticks-1);
-
2461
-
2462 std::vector<vec3> ticks;
-
2463 ticks.resize(2);
-
2464 for( uint i=0; i<Nticks; i++ ){
+
2460 for( uint i=0; i<border.size()-1; i++ ){
+
2461 addLine( border.at(i), border.at(i+1), font_color, 1, COORDINATES_WINDOW_NORMALIZED );
+
2462 }
+
2463
+
2464 dx = size.x/float(Nticks-1);
2465
-
2467 char textstr[10],precision[10];
-
2468
-
2469 float x;
-
2470 float value;
-
2471 if( colorbar_ticks.size()==0 ){
-
2472 x = center.x -0.5f*size.x + float(i)*dx;
-
2473 value = cmin+float(i)/float(Nticks-1)*(cmax-cmin);
-
2474 }else{
-
2475 value = colorbar_ticks.at(i);
-
2476 x = center.x -0.5f*size.x + (value-cmin)/(cmax-cmin)*size.x;
-
2477 }
-
2478
-
2479 int d1, d2;
-
2480 if( std::fabs(floor(value)-value)<1e-4 ){ //value is an integer
-
2481 std::snprintf(precision,10,"%%d");
-
2482 std::snprintf(textstr,10,precision,int(floor(value)));
-
2483 }else if( value!=0.f ){ //value needs decimal formatting
-
2484 d1 = floor(log10(std::fabs(value)));
-
2485 d2= -d1+1;
-
2486 if(d2<1){
-
2487 d2=1;
-
2488 }
-
2489 std::snprintf(precision,10,"%%%u.%uf",(char)abs(d1)+1,(char)d2);
-
2490 std::snprintf(textstr,10,precision,value);
-
2491 }
-
2492
-
2493 // tick labels
-
2494 addTextboxByCenter( textstr, make_vec3(x,center.y-0.4f*size.y,center.z), make_SphericalCoord(0,0), font_color, colorbar_fontsize, "OpenSans-Regular", COORDINATES_WINDOW_NORMALIZED );
-
2495
-
2496 if(i>0 && i<Nticks-1){
-
2497 ticks[0] = make_vec3( x, center.y-0.25f*size.y, center.z-0.001f );
-
2498 ticks[1] = make_vec3( x, center.y-0.25f*size.y+0.05f*size.y, center.z-0.001f );
-
2499 addLine(ticks[0],ticks[1],make_RGBcolor(0.25,0.25,0.25),1,COORDINATES_WINDOW_NORMALIZED);
-
2500 ticks[0] = make_vec3( x, center.y+0.25f*size.y, center.z-0.001f );
-
2501 ticks[1] = make_vec3( x, center.y+0.25f*size.y-0.05f*size.y, center.z-0.001f );
-
2502 addLine(ticks[0],ticks[1], make_RGBcolor(0.25,0.25,0.25),1,COORDINATES_WINDOW_NORMALIZED);
-
2503 }
-
2504
-
2505 }
-
2506
-
2507 //title
-
2508 addTextboxByCenter( title, make_vec3( center.x, center.y+0.4*size.y, center.z), make_SphericalCoord(0,0), font_color, colorbar_fontsize, "CantoraOne-Regular", COORDINATES_WINDOW_NORMALIZED );
-
2509
-
2510}
-
2511
- -
2513 addCoordinateAxes(helios::make_vec3(0,0,0), helios::make_vec3(1,1,1), "positive");
+
2466 std::vector<vec3> ticks;
+
2467 ticks.resize(2);
+
2468 for( uint i=0; i<Nticks; i++ ){
+
2469
+
2471 char textstr[10],precision[10];
+
2472
+
2473 float x;
+
2474 float value;
+
2475 if( colorbar_ticks.size()==0 ){
+
2476 x = center.x -0.5f*size.x + float(i)*dx;
+
2477 value = cmin+float(i)/float(Nticks-1)*(cmax-cmin);
+
2478 }else{
+
2479 value = colorbar_ticks.at(i);
+
2480 x = center.x -0.5f*size.x + (value-cmin)/(cmax-cmin)*size.x;
+
2481 }
+
2482
+
2483 int d1, d2;
+
2484 if( std::fabs(floor(value)-value)<1e-4 ){ //value is an integer
+
2485 std::snprintf(precision,10,"%%d");
+
2486 std::snprintf(textstr,10,precision,int(floor(value)));
+
2487 }else if( value!=0.f ){ //value needs decimal formatting
+
2488 d1 = floor(log10(std::fabs(value)));
+
2489 d2= -d1+1;
+
2490 if(d2<1){
+
2491 d2=1;
+
2492 }
+
2493 std::snprintf(precision,10,"%%%u.%uf",(char)abs(d1)+1,(char)d2);
+
2494 std::snprintf(textstr,10,precision,value);
+
2495 }
+
2496
+
2497 // tick labels
+
2498 addTextboxByCenter( textstr, make_vec3(x,center.y-0.4f*size.y,center.z), make_SphericalCoord(0,0), font_color, colorbar_fontsize, "OpenSans-Regular", COORDINATES_WINDOW_NORMALIZED );
+
2499
+
2500 if(i>0 && i<Nticks-1){
+
2501 ticks[0] = make_vec3( x, center.y-0.25f*size.y, center.z-0.001f );
+
2502 ticks[1] = make_vec3( x, center.y-0.25f*size.y+0.05f*size.y, center.z-0.001f );
+
2503 addLine(ticks[0],ticks[1],make_RGBcolor(0.25,0.25,0.25),1,COORDINATES_WINDOW_NORMALIZED);
+
2504 ticks[0] = make_vec3( x, center.y+0.25f*size.y, center.z-0.001f );
+
2505 ticks[1] = make_vec3( x, center.y+0.25f*size.y-0.05f*size.y, center.z-0.001f );
+
2506 addLine(ticks[0],ticks[1], make_RGBcolor(0.25,0.25,0.25),1,COORDINATES_WINDOW_NORMALIZED);
+
2507 }
+
2508
+
2509 }
+
2510
+
2511 //title
+
2512 addTextboxByCenter( title, make_vec3( center.x, center.y+0.4*size.y, center.z), make_SphericalCoord(0,0), font_color, colorbar_fontsize, "CantoraOne-Regular", COORDINATES_WINDOW_NORMALIZED );
+
2513
2514}
2515
-
2516void Visualizer::addCoordinateAxes(const helios::vec3 &origin, const helios::vec3 &length, const std::string &sign){
-
2517
-
2518
-
2519 float mult;
-
2520 if(sign == "both"){
-
2521 mult = 1.0;
-
2522 }else{
-
2523 mult = 0.0;
-
2524 }
-
2525
-
2526 float Lmag = length.magnitude();
-
2527
-
2528 // x axis
-
2529 addLine(make_vec3(mult*-1.0*length.x + origin.x, origin.y, origin.z), make_vec3(length.x + origin.x, origin.y, origin.z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
-
2530
-
2531 if(length.x > 0){
-
2532 addTextboxByCenter("+ X", helios::make_vec3(1.2*length.x + origin.x, origin.y, origin.z), helios::make_SphericalCoord(0,0), helios::make_RGBcolor( 0.f, 0.f, 0.f ), uint(200*Lmag), "OpenSans-Regular", Visualizer::COORDINATES_CARTESIAN);
-
2533 }
+
+ +
2517 addCoordinateAxes(helios::make_vec3(0,0,0), helios::make_vec3(1,1,1), "positive");
+
2518}
+
+
2519
+
+
2520void Visualizer::addCoordinateAxes(const helios::vec3 &origin, const helios::vec3 &length, const std::string &sign){
+
2521
+
2522
+
2523 float mult;
+
2524 if(sign == "both"){
+
2525 mult = 1.0;
+
2526 }else{
+
2527 mult = 0.0;
+
2528 }
+
2529
+
2530 float Lmag = length.magnitude();
+
2531
+
2532 // x axis
+
2533 addLine(make_vec3(mult*-1.0*length.x + origin.x, origin.y, origin.z), make_vec3(length.x + origin.x, origin.y, origin.z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
2534
-
2535 // y axis
-
2536 addLine(make_vec3(origin.x, mult*-1.0*length.y+origin.y, origin.z), make_vec3(origin.x, length.y+origin.y, origin.z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
-
2537
-
2538 if(length.y > 0){
-
2539 addTextboxByCenter("+ Y", helios::make_vec3( origin.x, 1.1*length.y+origin.y, origin.z), helios::make_SphericalCoord(0,0), helios::make_RGBcolor( 0.f, 0.f, 0.f ), uint(200*Lmag), "OpenSans-Regular", Visualizer::COORDINATES_CARTESIAN);
-
2540 }
+
2535 if(length.x > 0){
+
2536 addTextboxByCenter("+ X", helios::make_vec3(1.2*length.x + origin.x, origin.y, origin.z), helios::make_SphericalCoord(0,0), helios::make_RGBcolor( 0.f, 0.f, 0.f ), uint(200*Lmag), "OpenSans-Regular", Visualizer::COORDINATES_CARTESIAN);
+
2537 }
+
2538
+
2539 // y axis
+
2540 addLine(make_vec3(origin.x, mult*-1.0*length.y+origin.y, origin.z), make_vec3(origin.x, length.y+origin.y, origin.z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
2541
-
2542 // z axis
-
2543 addLine(make_vec3(origin.x, origin.y, mult*-1*length.z+origin.z), make_vec3(origin.x, origin.y, length.z+origin.z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
-
2544
-
2545 if(length.z > 0){
-
2546 addTextboxByCenter("+ Z", helios::make_vec3( origin.x, origin.y, length.z+origin.z), helios::make_SphericalCoord(0,0), helios::make_RGBcolor( 0.f, 0.f, 0.f ), uint(200*Lmag), "OpenSans-Regular", Visualizer::COORDINATES_CARTESIAN);
-
2547
-
2548 }
-
2549
-
2550
-
2551}
-
2552
+
2542 if(length.y > 0){
+
2543 addTextboxByCenter("+ Y", helios::make_vec3( origin.x, 1.1*length.y+origin.y, origin.z), helios::make_SphericalCoord(0,0), helios::make_RGBcolor( 0.f, 0.f, 0.f ), uint(200*Lmag), "OpenSans-Regular", Visualizer::COORDINATES_CARTESIAN);
+
2544 }
+
2545
+
2546 // z axis
+
2547 addLine(make_vec3(origin.x, origin.y, mult*-1*length.z+origin.z), make_vec3(origin.x, origin.y, length.z+origin.z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
+
2548
+
2549 if(length.z > 0){
+
2550 addTextboxByCenter("+ Z", helios::make_vec3( origin.x, origin.y, length.z+origin.z), helios::make_SphericalCoord(0,0), helios::make_RGBcolor( 0.f, 0.f, 0.f ), uint(200*Lmag), "OpenSans-Regular", Visualizer::COORDINATES_CARTESIAN);
+
2551
+
2552 }
2553
-
2554void Visualizer::addGridWireFrame(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv){
-
2555
-
2556 helios::vec3 boxmin, boxmax;
-
2557 boxmin = make_vec3(center.x - 0.5*size.x, center.y - 0.5*size.y, center.z - 0.5*size.z);
-
2558 boxmax = make_vec3(center.x + 0.5*size.x, center.y + 0.5*size.y, center.z + 0.5*size.z);
+
2554
+
2555}
+
+
2556
+
2557
+
+
2558void Visualizer::addGridWireFrame(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv){
2559
-
2560 float spacing_x = size.x/subdiv.x;
-
2561 float spacing_y = size.y/subdiv.y;
-
2562 float spacing_z = size.z/subdiv.z;
+
2560 helios::vec3 boxmin, boxmax;
+
2561 boxmin = make_vec3(center.x - 0.5*size.x, center.y - 0.5*size.y, center.z - 0.5*size.z);
+
2562 boxmax = make_vec3(center.x + 0.5*size.x, center.y + 0.5*size.y, center.z + 0.5*size.z);
2563
-
2564 for(int i=0; i <= subdiv.x; i++)
-
2565 {
-
2566 for(int j=0; j <= subdiv.y; j++)
-
2567 {
-
2568 addLine(make_vec3(boxmin.x + i*spacing_x, boxmin.y + j*spacing_y, boxmin.z), make_vec3(boxmin.x + i*spacing_x, boxmin.y + j*spacing_y, boxmax.z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
-
2569 }
-
2570 }
-
2571
-
2572 for(int i=0; i <= subdiv.z ; i++)
-
2573 {
-
2574 for(int j=0; j <= subdiv.y; j++)
-
2575 {
-
2576 addLine(make_vec3(boxmin.x , boxmin.y + j*spacing_y, boxmin.z + i*spacing_z), make_vec3(boxmax.x, boxmin.y + j*spacing_y, boxmin.z + i*spacing_z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
-
2577 }
-
2578 }
-
2579
-
2580 for(int i=0; i <= subdiv.x ; i++)
-
2581 {
-
2582 for(int j=0; j <= subdiv.z ; j++)
-
2583 {
-
2584 addLine(make_vec3(boxmin.x + i*spacing_x , boxmin.y, boxmin.z + j*spacing_z), make_vec3(boxmin.x + i*spacing_x, boxmax.y, boxmin.z + j*spacing_z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
-
2585 }
-
2586 }
-
2587
-
2588}
-
2589
- -
2591 colorbar_flag = 2;
+
2564 float spacing_x = size.x/subdiv.x;
+
2565 float spacing_y = size.y/subdiv.y;
+
2566 float spacing_z = size.z/subdiv.z;
+
2567
+
2568 for(int i=0; i <= subdiv.x; i++)
+
2569 {
+
2570 for(int j=0; j <= subdiv.y; j++)
+
2571 {
+
2572 addLine(make_vec3(boxmin.x + i*spacing_x, boxmin.y + j*spacing_y, boxmin.z), make_vec3(boxmin.x + i*spacing_x, boxmin.y + j*spacing_y, boxmax.z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
+
2573 }
+
2574 }
+
2575
+
2576 for(int i=0; i <= subdiv.z ; i++)
+
2577 {
+
2578 for(int j=0; j <= subdiv.y; j++)
+
2579 {
+
2580 addLine(make_vec3(boxmin.x , boxmin.y + j*spacing_y, boxmin.z + i*spacing_z), make_vec3(boxmax.x, boxmin.y + j*spacing_y, boxmin.z + i*spacing_z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
+
2581 }
+
2582 }
+
2583
+
2584 for(int i=0; i <= subdiv.x ; i++)
+
2585 {
+
2586 for(int j=0; j <= subdiv.z ; j++)
+
2587 {
+
2588 addLine(make_vec3(boxmin.x + i*spacing_x , boxmin.y, boxmin.z + j*spacing_z), make_vec3(boxmin.x + i*spacing_x, boxmax.y, boxmin.z + j*spacing_z), RGB::black, 1, Visualizer::COORDINATES_CARTESIAN);
+
2589 }
+
2590 }
+
2591
2592}
+
2593
- -
2595 colorbar_flag = 1;
+
+ +
2595 colorbar_flag = 2;
2596}
+
2597
- -
2599 if( position.x < 0 || position.x>1 || position.y<0 || position.y>1 || position.z<-1 || position.z>1 ){
-
2600 helios_runtime_error("ERROR (Visualizer::setColorbarPosition): position is out of range. Coordinates must be: 0<x<1, 0<y<1, -1<z<1.");
-
2601 }
-
2602 colorbar_position = position;
-
2603}
-
2604
- -
2606 if( size.x < 0 || size.x>1 || size.y<0 || size.y>1 ){
-
2607 helios_runtime_error("ERROR (Visualizer::setColorbarSize): Size must be greater than 0 and less than the window size (i.e., 1).");
-
2608 }
-
2609 colorbar_size = size;
-
2610}
-
2611
-
2612void Visualizer::setColorbarRange( float cmin, float cmax ){
-
2613 if( message_flag && cmin>cmax ) {
-
2614 std::cout << "WARNING (Visualizer::setColorbarRange): Maximum colorbar value must be greater than minimum value...Ignoring command." << std::endl;
-
2615 }
-
2616 return;
-
2617 colorbar_min = cmin;
-
2618 colorbar_max = cmax;
-
2619}
-
2620
-
2621void Visualizer::setColorbarTicks(const std::vector<float> &ticks ){
-
2622
-
2623 //check that vector is not empty
-
2624 if( ticks.empty() ){
-
2625 helios_runtime_error("ERROR (Visualizer::setColorbarTicks): Colorbar ticks vector is empty.");
-
2626 }
-
2627
-
2628 //Check that ticks are monotonically increasing
-
2629 for( int i=1; i<ticks.size(); i++ ){
-
2630 if( ticks.at(i)<=ticks.at(i-1) ){
-
2631 helios_runtime_error("ERROR (Visualizer::setColorbarTicks): Colorbar ticks must be monotonically increasing.");
-
2632 }
-
2633 }
-
2634
-
2635 //Check that ticks are within the range of colorbar values
-
2636 for( int i=ticks.size()-1; i>=0; i-- ){
-
2637 if( ticks.at(i)<colorbar_min ){
-
2638 colorbar_min = ticks.at(i);
-
2639 }
-
2640 }
-
2641 for( float tick : ticks){
-
2642 if( tick>colorbar_max ){
-
2643 colorbar_max = tick;
-
2644 }
-
2645 }
-
2646
-
2647 colorbar_ticks = ticks;
-
2648}
-
2649
-
2650void Visualizer::setColorbarTitle( const char* title ){
-
2651 colorbar_title = title;
+
+ +
2599 colorbar_flag = 1;
+
2600}
+
+
2601
+
+ +
2603 if( position.x < 0 || position.x>1 || position.y<0 || position.y>1 || position.z<-1 || position.z>1 ){
+
2604 helios_runtime_error("ERROR (Visualizer::setColorbarPosition): position is out of range. Coordinates must be: 0<x<1, 0<y<1, -1<z<1.");
+
2605 }
+
2606 colorbar_position = position;
+
2607}
+
+
2608
+
+ +
2610 if( size.x < 0 || size.x>1 || size.y<0 || size.y>1 ){
+
2611 helios_runtime_error("ERROR (Visualizer::setColorbarSize): Size must be greater than 0 and less than the window size (i.e., 1).");
+
2612 }
+
2613 colorbar_size = size;
+
2614}
+
+
2615
+
+
2616void Visualizer::setColorbarRange( float cmin, float cmax ){
+
2617 if( message_flag && cmin>cmax ) {
+
2618 std::cout << "WARNING (Visualizer::setColorbarRange): Maximum colorbar value must be greater than minimum value...Ignoring command." << std::endl;
+
2619 }
+
2620 return;
+
2621 colorbar_min = cmin;
+
2622 colorbar_max = cmax;
+
2623}
+
+
2624
+
+
2625void Visualizer::setColorbarTicks(const std::vector<float> &ticks ){
+
2626
+
2627 //check that vector is not empty
+
2628 if( ticks.empty() ){
+
2629 helios_runtime_error("ERROR (Visualizer::setColorbarTicks): Colorbar ticks vector is empty.");
+
2630 }
+
2631
+
2632 //Check that ticks are monotonically increasing
+
2633 for( int i=1; i<ticks.size(); i++ ){
+
2634 if( ticks.at(i)<=ticks.at(i-1) ){
+
2635 helios_runtime_error("ERROR (Visualizer::setColorbarTicks): Colorbar ticks must be monotonically increasing.");
+
2636 }
+
2637 }
+
2638
+
2639 //Check that ticks are within the range of colorbar values
+
2640 for( int i=ticks.size()-1; i>=0; i-- ){
+
2641 if( ticks.at(i)<colorbar_min ){
+
2642 colorbar_min = ticks.at(i);
+
2643 }
+
2644 }
+
2645 for( float tick : ticks){
+
2646 if( tick>colorbar_max ){
+
2647 colorbar_max = tick;
+
2648 }
+
2649 }
+
2650
+
2651 colorbar_ticks = ticks;
2652}
+
2653
-
2654void Visualizer::setColorbarFontSize( uint font_size ){
-
2655 if( font_size<=0 ){
-
2656 helios_runtime_error("ERROR (Visualizer::setColorbarFontSize): Font size must be greater than zero.");
-
2657 }
-
2658 colorbar_fontsize = font_size;
-
2659}
-
2660
- -
2662 colorbar_fontcolor = fontcolor;
+
+
2654void Visualizer::setColorbarTitle( const char* title ){
+
2655 colorbar_title = title;
+
2656}
+
+
2657
+
+
2658void Visualizer::setColorbarFontSize( uint font_size ){
+
2659 if( font_size<=0 ){
+
2660 helios_runtime_error("ERROR (Visualizer::setColorbarFontSize): Font size must be greater than zero.");
+
2661 }
+
2662 colorbar_fontsize = font_size;
2663}
+
2664
-
2665void Visualizer::setColormap( Ctable colormap_name ){
-
2666 if( colormap_name==COLORMAP_HOT ){
-
2667 colormap_current = colormap_hot;
-
2668 }else if( colormap_name==COLORMAP_COOL ){
-
2669 colormap_current = colormap_cool;
-
2670 }else if( colormap_name==COLORMAP_LAVA ){
-
2671 colormap_current = colormap_lava;
-
2672 }else if( colormap_name==COLORMAP_RAINBOW ){
-
2673 colormap_current = colormap_rainbow;
-
2674 }else if( colormap_name==COLORMAP_PARULA ){
-
2675 colormap_current = colormap_parula;
-
2676 }else if( colormap_name==COLORMAP_GRAY ){
-
2677 colormap_current = colormap_gray;
-
2678 }else if( colormap_name==COLORMAP_CUSTOM ){
-
2679 helios_runtime_error("ERROR (Visualizer::setColormap): Setting a custom colormap requires calling setColormap with additional arguments defining the colormap.");
-
2680 }else{
-
2681 helios_runtime_error("ERROR (Visualizer::setColormap): Invalid colormap.");
-
2682 }
-
2683}
-
2684
-
2685void Visualizer::setColormap(const std::vector<RGBcolor> &colors, const std::vector<float> &divisions ){
-
2686
-
2687 if( colors.size() != divisions.size() ){
-
2688 helios_runtime_error("ERROR (Visualizer::setColormap): The number of colors must be equal to the number of divisions.");
-
2689 }
+
+ +
2666 colorbar_fontcolor = fontcolor;
+
2667}
+
+
2668
+
+
2669void Visualizer::setColormap( Ctable colormap_name ){
+
2670 if( colormap_name==COLORMAP_HOT ){
+
2671 colormap_current = colormap_hot;
+
2672 }else if( colormap_name==COLORMAP_COOL ){
+
2673 colormap_current = colormap_cool;
+
2674 }else if( colormap_name==COLORMAP_LAVA ){
+
2675 colormap_current = colormap_lava;
+
2676 }else if( colormap_name==COLORMAP_RAINBOW ){
+
2677 colormap_current = colormap_rainbow;
+
2678 }else if( colormap_name==COLORMAP_PARULA ){
+
2679 colormap_current = colormap_parula;
+
2680 }else if( colormap_name==COLORMAP_GRAY ){
+
2681 colormap_current = colormap_gray;
+
2682 }else if( colormap_name==COLORMAP_CUSTOM ){
+
2683 helios_runtime_error("ERROR (Visualizer::setColormap): Setting a custom colormap requires calling setColormap with additional arguments defining the colormap.");
+
2684 }else{
+
2685 helios_runtime_error("ERROR (Visualizer::setColormap): Invalid colormap.");
+
2686 }
+
2687}
+
+
2688
+
+
2689void Visualizer::setColormap(const std::vector<RGBcolor> &colors, const std::vector<float> &divisions ){
2690
-
2691 Colormap colormap_custom( colors, divisions, 100, 0, 1 );
-
2692
-
2693 colormap_current = colormap_custom;
+
2691 if( colors.size() != divisions.size() ){
+
2692 helios_runtime_error("ERROR (Visualizer::setColormap): The number of colors must be equal to the number of divisions.");
+
2693 }
2694
-
2695}
+
2695 Colormap colormap_custom( colors, divisions, 100, 0, 1 );
2696
- -
2698 return colormap_current;
+
2697 colormap_current = colormap_custom;
+
2698
2699}
+
2700
- -
2702 std::vector<uint> UUIDs = context_ptr->getAllUUIDs();
-
2703 buildContextGeometry(context_ptr, UUIDs);
-
2704}
-
2705
-
2706void Visualizer::buildContextGeometry(helios::Context* context_ptr, const std::vector<uint>& UUIDs ){
-
2707
-
2708 if( UUIDs.empty() ){
-
2709 std::cerr << "WARNING (Visualizer::buildContextGeometry): There is no Context geometry to build...exiting." << std::endl;
-
2710 return;
-
2711 }else if( !colorPrimitives_UUIDs.empty() || !colorPrimitives_objIDs.empty() ){
-
2712 std::cerr << "WARNING (Visualizer::buildContextGeometry): Existing Context geometry already exists in the Visualizer and will not be removed. You may have intended to call Visualizer::clearGeometry() first to clear old Context geometry." << std::endl;
-
2713 }
-
2714
-
2715
-
2716 context = context_ptr;
-
2717 contextGeomNeedsUpdate = true;
+
+ +
2702 return colormap_current;
+
2703}
+
+
2704
+
+ +
2706 std::vector<uint> UUIDs = context_ptr->getAllUUIDs();
+
2707 buildContextGeometry(context_ptr, UUIDs);
+
2708}
+
+
2709
+
+
2710void Visualizer::buildContextGeometry(helios::Context* context_ptr, const std::vector<uint>& UUIDs ){
+
2711
+
2712 if( UUIDs.empty() ){
+
2713 std::cerr << "WARNING (Visualizer::buildContextGeometry): There is no Context geometry to build...exiting." << std::endl;
+
2714 return;
+
2715 }else if( !colorPrimitives_UUIDs.empty() || !colorPrimitives_objIDs.empty() ){
+
2716 std::cerr << "WARNING (Visualizer::buildContextGeometry): Existing Context geometry already exists in the Visualizer and will not be removed. You may have intended to call Visualizer::clearGeometry() first to clear old Context geometry." << std::endl;
+
2717 }
2718
-
2719 contextPrimitiveIDs.insert(contextPrimitiveIDs.begin(), UUIDs.begin(), UUIDs.end() );
-
2720
-
2721 //Set the view to fit window
-
2722 if( camera_lookat_center.x==0 && camera_lookat_center.y==0 && camera_lookat_center.z==0 ){ //default center
-
2723 if( camera_eye_location.x<1e-4 && camera_eye_location.y<1e-4 && camera_eye_location.z==2.f ){ //default eye position
+
2719
+
2720 context = context_ptr;
+
2721 contextGeomNeedsUpdate = true;
+
2722
+
2723 contextPrimitiveIDs.insert(contextPrimitiveIDs.begin(), UUIDs.begin(), UUIDs.end() );
2724
-
2725 vec3 center_sph;
-
2726 vec2 xbounds, ybounds, zbounds;
-
2727 float radius;
-
2728 context->getDomainBoundingSphere( UUIDs, center_sph, radius );
-
2729 context->getDomainBoundingBox( UUIDs, xbounds, ybounds, zbounds );
-
2730 camera_lookat_center = make_vec3( 0.5*(xbounds.x+xbounds.y), 0.5*(ybounds.x+ybounds.y), 0.5*(zbounds.x+zbounds.y) );
-
2731 camera_eye_location = camera_lookat_center + sphere2cart( make_SphericalCoord(2.f*radius,20.f*M_PI/180.f,0) );
-
2732
-
2733 }
-
2734 }
-
2735
-
2736}
-
2737
-
2738void Visualizer::buildContextGeometry_private() {
+
2725 //Set the view to fit window
+
2726 if( camera_lookat_center.x==0 && camera_lookat_center.y==0 && camera_lookat_center.z==0 ){ //default center
+
2727 if( camera_eye_location.x<1e-4 && camera_eye_location.y<1e-4 && camera_eye_location.z==2.f ){ //default eye position
+
2728
+
2729 vec3 center_sph;
+
2730 vec2 xbounds, ybounds, zbounds;
+
2731 float radius;
+
2732 context->getDomainBoundingSphere( UUIDs, center_sph, radius );
+
2733 context->getDomainBoundingBox( UUIDs, xbounds, ybounds, zbounds );
+
2734 camera_lookat_center = make_vec3( 0.5*(xbounds.x+xbounds.y), 0.5*(ybounds.x+ybounds.y), 0.5*(zbounds.x+zbounds.y) );
+
2735 camera_eye_location = camera_lookat_center + sphere2cart( make_SphericalCoord(2.f*radius,20.f*M_PI/180.f,0) );
+
2736
+
2737 }
+
2738 }
2739
-
2740 contextGeomNeedsUpdate = false;
+
2740}
+
2741
-
2742 if( !colorPrimitivesByData.empty() ){
+
2742void Visualizer::buildContextGeometry_private() {
2743
-
2744 if( colorPrimitives_UUIDs.empty() ) { //load all primitives
-
2745 for (uint UUID: contextPrimitiveIDs) {
-
2746 if (context->doesPrimitiveExist(UUID)) {
-
2747 colorPrimitives_UUIDs[UUID] = UUID;
-
2748 }
-
2749 }
-
2750 }else { //double check that primitives exist
-
2751 for (uint UUID: contextPrimitiveIDs) {
-
2752 if ( !context->doesPrimitiveExist(UUID)) {
-
2753 auto it = colorPrimitives_UUIDs.find(UUID);
-
2754 colorPrimitives_UUIDs.erase( it );
-
2755 }
-
2756 }
-
2757 }
-
2758
-
2759 }else if( !colorPrimitivesByObjectData.empty() ) {
-
2760
-
2761 if( colorPrimitives_objIDs.empty() ) { //load all primitives
-
2762 std::vector<uint> ObjIDs = context->getAllObjectIDs();
-
2763 for( uint objID: ObjIDs ) {
-
2764 if( context->doesObjectExist(objID) ) {
-
2765 std::vector<uint> UUIDs = context->getObjectPointer(objID)->getPrimitiveUUIDs();
-
2766 for( uint UUID : UUIDs ) {
-
2767 if (context->doesPrimitiveExist(UUID)) {
-
2768 colorPrimitives_UUIDs[UUID] = UUID;
-
2769 }
-
2770 }
-
2771 }
-
2772 }
-
2773 }else { //load primitives specified by user
-
2774 for ( const auto &objID: colorPrimitives_objIDs ) {
-
2775 if( context->doesObjectExist( objID.first )) {
-
2776 std::vector<uint> UUIDs = context->getObjectPointer(objID.first)->getPrimitiveUUIDs();
-
2777 for (uint UUID: UUIDs) {
-
2778 if (context->doesPrimitiveExist(UUID)) {
-
2779 colorPrimitives_UUIDs[UUID] = UUID;
-
2780 }
-
2781 }
-
2782 }
-
2783 }
-
2784 }
-
2785
-
2786 }
-
2787
-
2788 if( !colorPrimitives_UUIDs.empty() && colorbar_flag == 0) {
- +
2744 contextGeomNeedsUpdate = false;
+
2745
+
2746 if( !colorPrimitivesByData.empty() ){
+
2747
+
2748 if( colorPrimitives_UUIDs.empty() ) { //load all primitives
+
2749 for (uint UUID: contextPrimitiveIDs) {
+
2750 if (context->doesPrimitiveExist(UUID)) {
+
2751 colorPrimitives_UUIDs[UUID] = UUID;
+
2752 }
+
2753 }
+
2754 }else { //double check that primitives exist
+
2755 for (uint UUID: contextPrimitiveIDs) {
+
2756 if ( !context->doesPrimitiveExist(UUID)) {
+
2757 auto it = colorPrimitives_UUIDs.find(UUID);
+
2758 colorPrimitives_UUIDs.erase( it );
+
2759 }
+
2760 }
+
2761 }
+
2762
+
2763 }else if( !colorPrimitivesByObjectData.empty() ) {
+
2764
+
2765 if( colorPrimitives_objIDs.empty() ) { //load all primitives
+
2766 std::vector<uint> ObjIDs = context->getAllObjectIDs();
+
2767 for( uint objID: ObjIDs ) {
+
2768 if( context->doesObjectExist(objID) ) {
+
2769 std::vector<uint> UUIDs = context->getObjectPointer(objID)->getPrimitiveUUIDs();
+
2770 for( uint UUID : UUIDs ) {
+
2771 if (context->doesPrimitiveExist(UUID)) {
+
2772 colorPrimitives_UUIDs[UUID] = UUID;
+
2773 }
+
2774 }
+
2775 }
+
2776 }
+
2777 }else { //load primitives specified by user
+
2778 for ( const auto &objID: colorPrimitives_objIDs ) {
+
2779 if( context->doesObjectExist( objID.first )) {
+
2780 std::vector<uint> UUIDs = context->getObjectPointer(objID.first)->getPrimitiveUUIDs();
+
2781 for (uint UUID: UUIDs) {
+
2782 if (context->doesPrimitiveExist(UUID)) {
+
2783 colorPrimitives_UUIDs[UUID] = UUID;
+
2784 }
+
2785 }
+
2786 }
+
2787 }
+
2788 }
+
2789
2790 }
2791
-
2792 //------ Colormap ------//
-
2793
-
2794 uint psize = contextPrimitiveIDs.size();
-
2795 if( message_flag ){
-
2796 if( psize>0 ){
-
2797 if( psize>=1e3 && psize<1e6 ){
-
2798 std::cout << "Adding " << psize/1e3 << "K Context primitives to visualizer...." << std::flush;
-
2799 }else if( psize>=1e6 ){
-
2800 std::cout << "Adding " << psize/1e6 << "M Context primitives to visualizer...." << std::flush;
-
2801 }else{
-
2802 std::cout << "Adding " << psize << " Context primitives to visualizer...." << std::flush;
-
2803 }
-
2804 }else{
-
2805 std::cout << "WARNING (Visualizer::buildContextGeometry): No primitives were found in the Context..." << std::endl;
-
2806 }
-
2807 }
-
2808
-
2809 //do a pre-sort of primitive UUIDs by texture
-
2810 std::map<std::string,std::vector<uint> > UUID_texture;
-
2811 for( uint p=0; p<psize; p++ ){
+
2792 if( !colorPrimitives_UUIDs.empty() && colorbar_flag == 0) {
+ +
2794 }
+
2795
+
2796 //------ Colormap ------//
+
2797
+
2798 uint psize = contextPrimitiveIDs.size();
+
2799 if( message_flag ){
+
2800 if( psize>0 ){
+
2801 if( psize>=1e3 && psize<1e6 ){
+
2802 std::cout << "Adding " << psize/1e3 << "K Context primitives to visualizer...." << std::flush;
+
2803 }else if( psize>=1e6 ){
+
2804 std::cout << "Adding " << psize/1e6 << "M Context primitives to visualizer...." << std::flush;
+
2805 }else{
+
2806 std::cout << "Adding " << psize << " Context primitives to visualizer...." << std::flush;
+
2807 }
+
2808 }else{
+
2809 std::cout << "WARNING (Visualizer::buildContextGeometry): No primitives were found in the Context..." << std::endl;
+
2810 }
+
2811 }
2812
-
2813 uint UUID = contextPrimitiveIDs.at(p);
-
2814
-
2815 if( context->doesPrimitiveExist(UUID) ) {
+
2813 //do a pre-sort of primitive UUIDs by texture
+
2814 std::map<std::string,std::vector<uint> > UUID_texture;
+
2815 for( uint p=0; p<psize; p++ ){
2816
-
2817 std::string texture_file = context->getPrimitiveTextureFile(UUID);
+
2817 uint UUID = contextPrimitiveIDs.at(p);
2818
-
2819 UUID_texture[texture_file].push_back(UUID);
+
2819 if( context->doesPrimitiveExist(UUID) ) {
2820
-
2821 }
+
2821 std::string texture_file = context->getPrimitiveTextureFile(UUID);
2822
-
2823 }
+
2823 UUID_texture[texture_file].push_back(UUID);
2824
-
2825 //figure out colorbar range
+
2825 }
2826
-
2827 colormap_current.setRange( colorbar_min, colorbar_max );
-
2828 if( colorbar_min==0 && colorbar_max==0 ){//range was not set by user, use full range of values
-
2829
-
2830 colorbar_min = INFINITY;
-
2831 colorbar_max = -INFINITY;
-
2832
-
2833 for(auto iter = UUID_texture.begin(); iter != UUID_texture.end(); ++iter){
-
2834
-
2835 std::vector<uint> UUIDs = iter->second;
+
2827 }
+
2828
+
2829 //figure out colorbar range
+
2830
+
2831 colormap_current.setRange( colorbar_min, colorbar_max );
+
2832 if( colorbar_min==0 && colorbar_max==0 ){//range was not set by user, use full range of values
+
2833
+
2834 colorbar_min = INFINITY;
+
2835 colorbar_max = -INFINITY;
2836
-
2837 for( size_t u=0; u<UUIDs.size(); u++ ){
+
2837 for(auto iter = UUID_texture.begin(); iter != UUID_texture.end(); ++iter){
2838
-
2839 uint UUID = UUIDs.at(u);
+
2839 std::vector<uint> UUIDs = iter->second;
2840
-
2841 float colorValue=-9999;
-
2842 if( !colorPrimitivesByData.empty() ){
-
2843 if( colorPrimitives_UUIDs.find(UUID) != colorPrimitives_UUIDs.end() ){
-
2844 if( context->doesPrimitiveDataExist( UUID, colorPrimitivesByData.c_str() ) ){
-
2845 HeliosDataType type = context->getPrimitiveDataType( UUID, colorPrimitivesByData.c_str() );
-
2846 if( type==HELIOS_TYPE_FLOAT ){
-
2847 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), colorValue );
-
2848 }else if( type==HELIOS_TYPE_INT ){
-
2849 int cv;
-
2850 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), cv );
-
2851 colorValue = float(cv);
-
2852 }else if( type==HELIOS_TYPE_UINT ){
-
2853 uint cv;
+
2841 for( size_t u=0; u<UUIDs.size(); u++ ){
+
2842
+
2843 uint UUID = UUIDs.at(u);
+
2844
+
2845 float colorValue=-9999;
+
2846 if( !colorPrimitivesByData.empty() ){
+
2847 if( colorPrimitives_UUIDs.find(UUID) != colorPrimitives_UUIDs.end() ){
+
2848 if( context->doesPrimitiveDataExist( UUID, colorPrimitivesByData.c_str() ) ){
+
2849 HeliosDataType type = context->getPrimitiveDataType( UUID, colorPrimitivesByData.c_str() );
+
2850 if( type==HELIOS_TYPE_FLOAT ){
+
2851 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), colorValue );
+
2852 }else if( type==HELIOS_TYPE_INT ){
+
2853 int cv;
2854 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), cv );
2855 colorValue = float(cv);
-
2856 }else if( type==HELIOS_TYPE_DOUBLE ){
-
2857 double cv;
+
2856 }else if( type==HELIOS_TYPE_UINT ){
+
2857 uint cv;
2858 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), cv );
2859 colorValue = float(cv);
-
2860 }else{
-
2861 colorValue = 0;
-
2862 }
-
2863 }else{
-
2864 colorValue = 0;
-
2865 }
-
2866 }
-
2867 }else if( !colorPrimitivesByObjectData.empty() ){
-
2868 if( colorPrimitives_UUIDs.find(UUID) != colorPrimitives_UUIDs.end() ){
-
2869 uint ObjID = context->getPrimitiveParentObjectID(UUID);
-
2870 if( ObjID==0 ){
-
2871 colorValue = 0;
-
2872 }else if( context->doesObjectDataExist( ObjID, colorPrimitivesByObjectData.c_str() ) ){
-
2873 HeliosDataType type = context->getObjectDataType( ObjID, colorPrimitivesByObjectData.c_str() );
-
2874 if( type==HELIOS_TYPE_FLOAT ){
-
2875 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), colorValue );
-
2876 }else if( type==HELIOS_TYPE_INT ){
-
2877 int cv;
-
2878 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), cv );
-
2879 colorValue = float(cv);
-
2880 }else if( type==HELIOS_TYPE_UINT ){
-
2881 uint cv;
+
2860 }else if( type==HELIOS_TYPE_DOUBLE ){
+
2861 double cv;
+
2862 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), cv );
+
2863 colorValue = float(cv);
+
2864 }else{
+
2865 colorValue = 0;
+
2866 }
+
2867 }else{
+
2868 colorValue = 0;
+
2869 }
+
2870 }
+
2871 }else if( !colorPrimitivesByObjectData.empty() ){
+
2872 if( colorPrimitives_UUIDs.find(UUID) != colorPrimitives_UUIDs.end() ){
+
2873 uint ObjID = context->getPrimitiveParentObjectID(UUID);
+
2874 if( ObjID==0 ){
+
2875 colorValue = 0;
+
2876 }else if( context->doesObjectDataExist( ObjID, colorPrimitivesByObjectData.c_str() ) ){
+
2877 HeliosDataType type = context->getObjectDataType( ObjID, colorPrimitivesByObjectData.c_str() );
+
2878 if( type==HELIOS_TYPE_FLOAT ){
+
2879 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), colorValue );
+
2880 }else if( type==HELIOS_TYPE_INT ){
+
2881 int cv;
2882 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), cv );
2883 colorValue = float(cv);
-
2884 }else if( type==HELIOS_TYPE_DOUBLE ){
-
2885 double cv;
+
2884 }else if( type==HELIOS_TYPE_UINT ){
+
2885 uint cv;
2886 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), cv );
2887 colorValue = float(cv);
-
2888 }else{
-
2889 colorValue = 0;
-
2890 }
-
2891 }else{
-
2892 colorValue = 0;
-
2893 }
-
2894 }
-
2895 }
-
2896
-
2897 if( colorValue!=colorValue || colorValue==INFINITY ) {//check for NaN or infinity
-
2898 colorValue = 0;
+
2888 }else if( type==HELIOS_TYPE_DOUBLE ){
+
2889 double cv;
+
2890 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), cv );
+
2891 colorValue = float(cv);
+
2892 }else{
+
2893 colorValue = 0;
+
2894 }
+
2895 }else{
+
2896 colorValue = 0;
+
2897 }
+
2898 }
2899 }
2900
-
2901 if( colorValue!=-9999 ){
-
2902 if( colorValue<colorbar_min ){
-
2903 colorbar_min = colorValue;;
-
2904 }
-
2905 if( colorValue>colorbar_max ){
-
2906 colorbar_max = colorValue;;
-
2907 }
-
2908 }
-
2909
-
2910 }
-
2911 }
-
2912
-
2913 if( colorbar_min!=INFINITY && colorbar_max!=-INFINITY ){
-
2914 colormap_current.setRange( colorbar_min, colorbar_max );
+
2901 if( colorValue!=colorValue || colorValue==INFINITY ) {//check for NaN or infinity
+
2902 colorValue = 0;
+
2903 }
+
2904
+
2905 if( colorValue!=-9999 ){
+
2906 if( colorValue<colorbar_min ){
+
2907 colorbar_min = colorValue;;
+
2908 }
+
2909 if( colorValue>colorbar_max ){
+
2910 colorbar_max = colorValue;;
+
2911 }
+
2912 }
+
2913
+
2914 }
2915 }
-
2916 }
-
2917
-
2918 if( !colorPrimitivesByData.empty() ) {
-
2919 assert(colorbar_min <= colorbar_max);
+
2916
+
2917 if( colorbar_min!=INFINITY && colorbar_max!=-INFINITY ){
+
2918 colormap_current.setRange( colorbar_min, colorbar_max );
+
2919 }
2920 }
2921
-
2922 //------- Simulation Geometry -------//
-
2923
-
2924 //add primitives
+
2922 if( !colorPrimitivesByData.empty() ) {
+
2923 assert(colorbar_min <= colorbar_max);
+
2924 }
2925
-
2926 for(auto iter = UUID_texture.begin(); iter != UUID_texture.end(); ++iter){
+
2926 //------- Simulation Geometry -------//
2927
-
2928 std::vector<uint> UUIDs = iter->second;
+
2928 //add primitives
2929
-
2930 for( size_t u=0; u<UUIDs.size(); u++ ){
+
2930 for(auto iter = UUID_texture.begin(); iter != UUID_texture.end(); ++iter){
2931
-
2932 uint UUID = UUIDs.at(u);
+
2932 std::vector<uint> UUIDs = iter->second;
2933
-
2934 if( !context->doesPrimitiveExist(UUID) ){
-
2935 std::cerr << "WARNING (Visualizer::buildContextGeometry): UUID vector contains ID(s) that do not exist in the Context...they will be ignored." << std::endl;
-
2936 continue;
-
2937 }
-
2938
-
2939 helios::PrimitiveType ptype = context->getPrimitiveType(UUID);
-
2940
-
2941 std::vector<vec3> verts = context->getPrimitiveVertices(UUID);
-
2942 std::string texture_file = context->getPrimitiveTextureFile(UUID);
-
2943
-
2944 RGBAcolor color;
-
2945 float colorValue;
-
2946 if( !colorPrimitivesByData.empty() ){
-
2947 if( colorPrimitives_UUIDs.find(UUID) != colorPrimitives_UUIDs.end() ){
-
2948 if( context->doesPrimitiveDataExist( UUID, colorPrimitivesByData.c_str() ) ){
-
2949 HeliosDataType type = context->getPrimitiveDataType( UUID, colorPrimitivesByData.c_str() );
-
2950 if( type==HELIOS_TYPE_FLOAT ){
-
2951 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), colorValue );
-
2952 }else if( type==HELIOS_TYPE_INT ){
-
2953 int cv;
-
2954 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), cv );
-
2955 colorValue = float(cv);
-
2956 }else if( type==HELIOS_TYPE_UINT ){
-
2957 uint cv;
+
2934 for( size_t u=0; u<UUIDs.size(); u++ ){
+
2935
+
2936 uint UUID = UUIDs.at(u);
+
2937
+
2938 if( !context->doesPrimitiveExist(UUID) ){
+
2939 std::cerr << "WARNING (Visualizer::buildContextGeometry): UUID vector contains ID(s) that do not exist in the Context...they will be ignored." << std::endl;
+
2940 continue;
+
2941 }
+
2942
+
2943 helios::PrimitiveType ptype = context->getPrimitiveType(UUID);
+
2944
+
2945 std::vector<vec3> verts = context->getPrimitiveVertices(UUID);
+
2946 std::string texture_file = context->getPrimitiveTextureFile(UUID);
+
2947
+
2948 RGBAcolor color;
+
2949 float colorValue;
+
2950 if( !colorPrimitivesByData.empty() ){
+
2951 if( colorPrimitives_UUIDs.find(UUID) != colorPrimitives_UUIDs.end() ){
+
2952 if( context->doesPrimitiveDataExist( UUID, colorPrimitivesByData.c_str() ) ){
+
2953 HeliosDataType type = context->getPrimitiveDataType( UUID, colorPrimitivesByData.c_str() );
+
2954 if( type==HELIOS_TYPE_FLOAT ){
+
2955 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), colorValue );
+
2956 }else if( type==HELIOS_TYPE_INT ){
+
2957 int cv;
2958 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), cv );
2959 colorValue = float(cv);
-
2960 }else if( type==HELIOS_TYPE_DOUBLE ){
-
2961 double cv;
+
2960 }else if( type==HELIOS_TYPE_UINT ){
+
2961 uint cv;
2962 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), cv );
2963 colorValue = float(cv);
-
2964 }else{
-
2965 colorValue = 0;
-
2966 }
-
2967
-
2968 }else{
-
2969 colorValue = 0;
-
2970 }
+
2964 }else if( type==HELIOS_TYPE_DOUBLE ){
+
2965 double cv;
+
2966 context->getPrimitiveData( UUID, colorPrimitivesByData.c_str(), cv );
+
2967 colorValue = float(cv);
+
2968 }else{
+
2969 colorValue = 0;
+
2970 }
2971
-
2972 if( colorValue!=colorValue || colorValue==INFINITY ) {//check for NaN or infinity
+
2972 }else{
2973 colorValue = 0;
2974 }
2975
-
2976 color = make_RGBAcolor(colormap_current.query( colorValue ),1);
-
2977 }else{
-
2978 color = context->getPrimitiveColorRGBA(UUID);
-
2979 }
-
2980 }else if( !colorPrimitivesByObjectData.empty() ){
-
2981 if( colorPrimitives_UUIDs.find(UUID) != colorPrimitives_UUIDs.end() ){
-
2982 uint ObjID = context->getPrimitiveParentObjectID(UUID);
-
2983 if( ObjID==0 ){
-
2984 colorValue = 0;
-
2985 }else if( context->doesObjectDataExist( ObjID, colorPrimitivesByObjectData.c_str() ) ){
-
2986 HeliosDataType type = context->getObjectDataType( ObjID, colorPrimitivesByObjectData.c_str() );
-
2987 if( type==HELIOS_TYPE_FLOAT ){
-
2988 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), colorValue );
-
2989 }else if( type==HELIOS_TYPE_INT ){
-
2990 int cv;
-
2991 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), cv );
-
2992 colorValue = float(cv);
-
2993 }else if( type==HELIOS_TYPE_UINT ){
-
2994 uint cv;
+
2976 if( colorValue!=colorValue || colorValue==INFINITY ) {//check for NaN or infinity
+
2977 colorValue = 0;
+
2978 }
+
2979
+
2980 color = make_RGBAcolor(colormap_current.query( colorValue ),1);
+
2981 }else{
+
2982 color = context->getPrimitiveColorRGBA(UUID);
+
2983 }
+
2984 }else if( !colorPrimitivesByObjectData.empty() ){
+
2985 if( colorPrimitives_UUIDs.find(UUID) != colorPrimitives_UUIDs.end() ){
+
2986 uint ObjID = context->getPrimitiveParentObjectID(UUID);
+
2987 if( ObjID==0 ){
+
2988 colorValue = 0;
+
2989 }else if( context->doesObjectDataExist( ObjID, colorPrimitivesByObjectData.c_str() ) ){
+
2990 HeliosDataType type = context->getObjectDataType( ObjID, colorPrimitivesByObjectData.c_str() );
+
2991 if( type==HELIOS_TYPE_FLOAT ){
+
2992 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), colorValue );
+
2993 }else if( type==HELIOS_TYPE_INT ){
+
2994 int cv;
2995 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), cv );
2996 colorValue = float(cv);
-
2997 }else if( type==HELIOS_TYPE_DOUBLE ){
-
2998 double cv;
+
2997 }else if( type==HELIOS_TYPE_UINT ){
+
2998 uint cv;
2999 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), cv );
3000 colorValue = float(cv);
-
3001 }else{
-
3002 colorValue = 0;
-
3003 }
-
3004 }else{
-
3005 colorValue = 0;
-
3006 }
-
3007
-
3008 if( colorValue!=colorValue || colorValue==INFINITY ) {//check for NaN or infinity
+
3001 }else if( type==HELIOS_TYPE_DOUBLE ){
+
3002 double cv;
+
3003 context->getObjectData( ObjID, colorPrimitivesByObjectData.c_str(), cv );
+
3004 colorValue = float(cv);
+
3005 }else{
+
3006 colorValue = 0;
+
3007 }
+
3008 }else{
3009 colorValue = 0;
3010 }
3011
-
3012 color = make_RGBAcolor(colormap_current.query( colorValue ),1);
-
3013 }else{
-
3014 color = context->getPrimitiveColorRGBA(UUID);
-
3015 }
-
3016 }else{
-
3017 color = context->getPrimitiveColorRGBA(UUID);
-
3018 }
-
3019
-
3020 if( ptype == helios::PRIMITIVE_TYPE_PATCH ){
-
3021
-
3022 if( texture_file.empty() ){//Patch does not have an associated texture or we are ignoring texture
- -
3024 }else{ //Patch has a texture
+
3012 if( colorValue!=colorValue || colorValue==INFINITY ) {//check for NaN or infinity
+
3013 colorValue = 0;
+
3014 }
+
3015
+
3016 color = make_RGBAcolor(colormap_current.query( colorValue ),1);
+
3017 }else{
+
3018 color = context->getPrimitiveColorRGBA(UUID);
+
3019 }
+
3020 }else{
+
3021 color = context->getPrimitiveColorRGBA(UUID);
+
3022 }
+
3023
+
3024 if( ptype == helios::PRIMITIVE_TYPE_PATCH ){
3025
-
3026 std::vector<vec2> uvs = context->getPrimitiveTextureUV(UUID);
-
3027
-
3028 if( colorPrimitives_UUIDs.find(UUID) == colorPrimitives_UUIDs.end() || colorPrimitives_UUIDs.empty() ){//coloring primitive based on texture
-
3029 if( uvs.size()==4 ){//custom (u,v) coordinates
-
3030 if( context->isPrimitiveTextureColorOverridden(UUID) ){
-
3031 addRectangleByVertices( verts, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), uvs, COORDINATES_CARTESIAN );
-
3032 }else{
-
3033 addRectangleByVertices( verts, texture_file.c_str(), uvs, COORDINATES_CARTESIAN );
-
3034 }
-
3035 }else{//default (u,v) coordinates
-
3036 if( context->isPrimitiveTextureColorOverridden(UUID) ){
-
3037 addRectangleByVertices( verts, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3038 }else{
-
3039 addRectangleByVertices( verts, texture_file.c_str(), COORDINATES_CARTESIAN );
-
3040 }
-
3041 }
-
3042 }else{//coloring primitive based on primitive data
-
3043 if( uvs.size()==4 ){//custom (u,v) coordinates
-
3044 addRectangleByVertices( verts, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), uvs, COORDINATES_CARTESIAN );
-
3045 }else{//default (u,v) coordinates
-
3046 addRectangleByVertices( verts, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3047 }
-
3048 }
-
3049 }
-
3050
-
3051 }else if( ptype == helios::PRIMITIVE_TYPE_TRIANGLE ){
-
3052
-
3053 if( texture_file.empty() ){//Triangle does not have an associated texture or we are ignoring texture
-
3054 addTriangle( verts.at(0), verts.at(1), verts.at(2), color, COORDINATES_CARTESIAN );
-
3055 }else{ //Triangle has a texture
+
3026 if( texture_file.empty() ){//Patch does not have an associated texture or we are ignoring texture
+ +
3028 }else{ //Patch has a texture
+
3029
+
3030 std::vector<vec2> uvs = context->getPrimitiveTextureUV(UUID);
+
3031
+
3032 if( colorPrimitives_UUIDs.find(UUID) == colorPrimitives_UUIDs.end() || colorPrimitives_UUIDs.empty() ){//coloring primitive based on texture
+
3033 if( uvs.size()==4 ){//custom (u,v) coordinates
+
3034 if( context->isPrimitiveTextureColorOverridden(UUID) ){
+
3035 addRectangleByVertices( verts, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), uvs, COORDINATES_CARTESIAN );
+
3036 }else{
+
3037 addRectangleByVertices( verts, texture_file.c_str(), uvs, COORDINATES_CARTESIAN );
+
3038 }
+
3039 }else{//default (u,v) coordinates
+
3040 if( context->isPrimitiveTextureColorOverridden(UUID) ){
+
3041 addRectangleByVertices( verts, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3042 }else{
+
3043 addRectangleByVertices( verts, texture_file.c_str(), COORDINATES_CARTESIAN );
+
3044 }
+
3045 }
+
3046 }else{//coloring primitive based on primitive data
+
3047 if( uvs.size()==4 ){//custom (u,v) coordinates
+
3048 addRectangleByVertices( verts, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), uvs, COORDINATES_CARTESIAN );
+
3049 }else{//default (u,v) coordinates
+
3050 addRectangleByVertices( verts, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3051 }
+
3052 }
+
3053 }
+
3054
+
3055 }else if( ptype == helios::PRIMITIVE_TYPE_TRIANGLE ){
3056
-
3057 std::vector<vec2> uvs = context->getPrimitiveTextureUV(UUID);
-
3058
-
3059 if( colorPrimitives_UUIDs.find(UUID) == colorPrimitives_UUIDs.end() || colorPrimitives_UUIDs.size()==0 ){//coloring primitive based on texture
-
3060 if( context->isPrimitiveTextureColorOverridden(UUID) ){
-
3061 addTriangle( verts.at(0), verts.at(1), verts.at(2), texture_file.c_str(), uvs.at(0), uvs.at(1), uvs.at(2), make_RGBAcolor(color.r,color.g,color.b,1), COORDINATES_CARTESIAN );
-
3062 }else{
-
3063 addTriangle( verts.at(0), verts.at(1), verts.at(2), texture_file.c_str(), uvs.at(0), uvs.at(1), uvs.at(2), COORDINATES_CARTESIAN );
-
3064 }
-
3065 }else{//coloring primitive based on primitive data
-
3066 addTriangle( verts.at(0), verts.at(1), verts.at(2), texture_file.c_str(), uvs.at(0), uvs.at(1), uvs.at(2), make_RGBAcolor(color.r,color.g,color.b,1), COORDINATES_CARTESIAN );
-
3067 }
-
3068
-
3069 }
-
3070
-
3071 }else if( ptype == helios::PRIMITIVE_TYPE_VOXEL ){
+
3057 if( texture_file.empty() ){//Triangle does not have an associated texture or we are ignoring texture
+
3058 addTriangle( verts.at(0), verts.at(1), verts.at(2), color, COORDINATES_CARTESIAN );
+
3059 }else{ //Triangle has a texture
+
3060
+
3061 std::vector<vec2> uvs = context->getPrimitiveTextureUV(UUID);
+
3062
+
3063 if( colorPrimitives_UUIDs.find(UUID) == colorPrimitives_UUIDs.end() || colorPrimitives_UUIDs.size()==0 ){//coloring primitive based on texture
+
3064 if( context->isPrimitiveTextureColorOverridden(UUID) ){
+
3065 addTriangle( verts.at(0), verts.at(1), verts.at(2), texture_file.c_str(), uvs.at(0), uvs.at(1), uvs.at(2), make_RGBAcolor(color.r,color.g,color.b,1), COORDINATES_CARTESIAN );
+
3066 }else{
+
3067 addTriangle( verts.at(0), verts.at(1), verts.at(2), texture_file.c_str(), uvs.at(0), uvs.at(1), uvs.at(2), COORDINATES_CARTESIAN );
+
3068 }
+
3069 }else{//coloring primitive based on primitive data
+
3070 addTriangle( verts.at(0), verts.at(1), verts.at(2), texture_file.c_str(), uvs.at(0), uvs.at(1), uvs.at(2), make_RGBAcolor(color.r,color.g,color.b,1), COORDINATES_CARTESIAN );
+
3071 }
3072
-
3073 std::vector<vec3> v_vertices = context->getPrimitiveVertices(UUID);
+
3073 }
3074
-
3075 std::vector<vec3> bottom_vertices, top_vertices, mx_vertices, px_vertices, my_vertices, py_vertices;
-
3076 bottom_vertices.resize(4);
-
3077 top_vertices.resize(4);
-
3078 mx_vertices.resize(4);
-
3079 px_vertices.resize(4);
-
3080 my_vertices.resize(4);
-
3081 py_vertices.resize(4);
-
3082
-
3083 //bottom
-
3084 bottom_vertices.at(0) = v_vertices.at(0);
-
3085 bottom_vertices.at(1) = v_vertices.at(1);
-
3086 bottom_vertices.at(2) = v_vertices.at(2);
-
3087 bottom_vertices.at(3) = v_vertices.at(3);
-
3088
-
3089 //top
-
3090 top_vertices.at(0) = v_vertices.at(4);
-
3091 top_vertices.at(1) = v_vertices.at(5);
-
3092 top_vertices.at(2) = v_vertices.at(6);
-
3093 top_vertices.at(3) = v_vertices.at(7);
-
3094
-
3095 //-x
-
3096 mx_vertices.at(0) = v_vertices.at(0);
-
3097 mx_vertices.at(1) = v_vertices.at(3);
-
3098 mx_vertices.at(2) = v_vertices.at(7);
-
3099 mx_vertices.at(3) = v_vertices.at(4);
-
3100
-
3101 //+x
-
3102 px_vertices.at(0) = v_vertices.at(1);
-
3103 px_vertices.at(1) = v_vertices.at(2);
-
3104 px_vertices.at(2) = v_vertices.at(6);
-
3105 px_vertices.at(3) = v_vertices.at(5);
-
3106
-
3107 //-y
-
3108 my_vertices.at(0) = v_vertices.at(0);
-
3109 my_vertices.at(1) = v_vertices.at(1);
-
3110 my_vertices.at(2) = v_vertices.at(5);
-
3111 my_vertices.at(3) = v_vertices.at(4);
-
3112
-
3113 //+y
-
3114 py_vertices.at(0) = v_vertices.at(2);
-
3115 py_vertices.at(1) = v_vertices.at(3);
-
3116 py_vertices.at(2) = v_vertices.at(7);
-
3117 py_vertices.at(3) = v_vertices.at(6);
-
3118
-
3119 if( texture_file.size()==0 ){//Voxel does not have an associated texture or we are ignoring texture
-
3120
-
3121 addRectangleByVertices( bottom_vertices, color, COORDINATES_CARTESIAN );
-
3122 addRectangleByVertices( top_vertices, color, COORDINATES_CARTESIAN );
-
3123 addRectangleByVertices( mx_vertices, color, COORDINATES_CARTESIAN );
-
3124 addRectangleByVertices( px_vertices, color, COORDINATES_CARTESIAN );
-
3125 addRectangleByVertices( my_vertices, color, COORDINATES_CARTESIAN );
-
3126 addRectangleByVertices( py_vertices, color, COORDINATES_CARTESIAN );
-
3127
-
3128 }else{ //Voxel has a texture
-
3129
-
3130 if( colorPrimitives_UUIDs.find(UUID) == colorPrimitives_UUIDs.end() || colorPrimitives_UUIDs.size()==0 ){//coloring primitive based on texture
-
3131 if( context->isPrimitiveTextureColorOverridden(UUID) ){
-
3132 addRectangleByVertices( bottom_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3133 addRectangleByVertices( top_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3134 addRectangleByVertices( mx_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3135 addRectangleByVertices( px_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3136 addRectangleByVertices( my_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3137 addRectangleByVertices( py_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3138 }else{
-
3139 addRectangleByVertices( bottom_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
-
3140 addRectangleByVertices( top_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
-
3141 addRectangleByVertices( mx_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
-
3142 addRectangleByVertices( px_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
-
3143 addRectangleByVertices( my_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
-
3144 addRectangleByVertices( py_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
-
3145 }
-
3146 }else{//coloring primitive based on primitive data
-
3147 addRectangleByVertices( bottom_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3148 addRectangleByVertices( top_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3149 addRectangleByVertices( mx_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3150 addRectangleByVertices( px_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3151 addRectangleByVertices( my_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3152 addRectangleByVertices( py_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
-
3153 }
-
3154
-
3155 }
-
3156
-
3157
-
3158 }
-
3159
-
3160 }
-
3161 }
-
3162
-
3163 if( message_flag ){
-
3164 std::cout << "done." << std::endl;
+
3075 }else if( ptype == helios::PRIMITIVE_TYPE_VOXEL ){
+
3076
+
3077 std::vector<vec3> v_vertices = context->getPrimitiveVertices(UUID);
+
3078
+
3079 std::vector<vec3> bottom_vertices, top_vertices, mx_vertices, px_vertices, my_vertices, py_vertices;
+
3080 bottom_vertices.resize(4);
+
3081 top_vertices.resize(4);
+
3082 mx_vertices.resize(4);
+
3083 px_vertices.resize(4);
+
3084 my_vertices.resize(4);
+
3085 py_vertices.resize(4);
+
3086
+
3087 //bottom
+
3088 bottom_vertices.at(0) = v_vertices.at(0);
+
3089 bottom_vertices.at(1) = v_vertices.at(1);
+
3090 bottom_vertices.at(2) = v_vertices.at(2);
+
3091 bottom_vertices.at(3) = v_vertices.at(3);
+
3092
+
3093 //top
+
3094 top_vertices.at(0) = v_vertices.at(4);
+
3095 top_vertices.at(1) = v_vertices.at(5);
+
3096 top_vertices.at(2) = v_vertices.at(6);
+
3097 top_vertices.at(3) = v_vertices.at(7);
+
3098
+
3099 //-x
+
3100 mx_vertices.at(0) = v_vertices.at(0);
+
3101 mx_vertices.at(1) = v_vertices.at(3);
+
3102 mx_vertices.at(2) = v_vertices.at(7);
+
3103 mx_vertices.at(3) = v_vertices.at(4);
+
3104
+
3105 //+x
+
3106 px_vertices.at(0) = v_vertices.at(1);
+
3107 px_vertices.at(1) = v_vertices.at(2);
+
3108 px_vertices.at(2) = v_vertices.at(6);
+
3109 px_vertices.at(3) = v_vertices.at(5);
+
3110
+
3111 //-y
+
3112 my_vertices.at(0) = v_vertices.at(0);
+
3113 my_vertices.at(1) = v_vertices.at(1);
+
3114 my_vertices.at(2) = v_vertices.at(5);
+
3115 my_vertices.at(3) = v_vertices.at(4);
+
3116
+
3117 //+y
+
3118 py_vertices.at(0) = v_vertices.at(2);
+
3119 py_vertices.at(1) = v_vertices.at(3);
+
3120 py_vertices.at(2) = v_vertices.at(7);
+
3121 py_vertices.at(3) = v_vertices.at(6);
+
3122
+
3123 if( texture_file.size()==0 ){//Voxel does not have an associated texture or we are ignoring texture
+
3124
+
3125 addRectangleByVertices( bottom_vertices, color, COORDINATES_CARTESIAN );
+
3126 addRectangleByVertices( top_vertices, color, COORDINATES_CARTESIAN );
+
3127 addRectangleByVertices( mx_vertices, color, COORDINATES_CARTESIAN );
+
3128 addRectangleByVertices( px_vertices, color, COORDINATES_CARTESIAN );
+
3129 addRectangleByVertices( my_vertices, color, COORDINATES_CARTESIAN );
+
3130 addRectangleByVertices( py_vertices, color, COORDINATES_CARTESIAN );
+
3131
+
3132 }else{ //Voxel has a texture
+
3133
+
3134 if( colorPrimitives_UUIDs.find(UUID) == colorPrimitives_UUIDs.end() || colorPrimitives_UUIDs.size()==0 ){//coloring primitive based on texture
+
3135 if( context->isPrimitiveTextureColorOverridden(UUID) ){
+
3136 addRectangleByVertices( bottom_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3137 addRectangleByVertices( top_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3138 addRectangleByVertices( mx_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3139 addRectangleByVertices( px_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3140 addRectangleByVertices( my_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3141 addRectangleByVertices( py_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3142 }else{
+
3143 addRectangleByVertices( bottom_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
+
3144 addRectangleByVertices( top_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
+
3145 addRectangleByVertices( mx_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
+
3146 addRectangleByVertices( px_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
+
3147 addRectangleByVertices( my_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
+
3148 addRectangleByVertices( py_vertices, texture_file.c_str(), COORDINATES_CARTESIAN );
+
3149 }
+
3150 }else{//coloring primitive based on primitive data
+
3151 addRectangleByVertices( bottom_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3152 addRectangleByVertices( top_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3153 addRectangleByVertices( mx_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3154 addRectangleByVertices( px_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3155 addRectangleByVertices( my_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3156 addRectangleByVertices( py_vertices, make_RGBcolor(color.r,color.g,color.b), texture_file.c_str(), COORDINATES_CARTESIAN );
+
3157 }
+
3158
+
3159 }
+
3160
+
3161
+
3162 }
+
3163
+
3164 }
3165 }
3166
-
3167}
-
3168
-
3169void Visualizer::colorContextPrimitivesByData( const char* data_name ){
-
3170 colorPrimitivesByData = data_name;
-
3171 colorPrimitivesByObjectData = "";
-
3172 if( !colorPrimitives_UUIDs.empty() ){
-
3173 colorPrimitives_UUIDs.clear();
-
3174 }
-
3175 if( !colorPrimitives_objIDs.empty() ){
-
3176 colorPrimitives_objIDs.clear();
-
3177 }
-
3178}
-
3179
-
3180void Visualizer::colorContextPrimitivesByData( const char* data_name, const std::vector<uint>& UUIDs ){
-
3181 colorPrimitivesByData = data_name;
-
3182 colorPrimitivesByObjectData = "";
-
3183 for( uint UUID : UUIDs ){
-
3184 colorPrimitives_UUIDs[UUID] = UUID;
-
3185 }
-
3186 if( !colorPrimitives_objIDs.empty() ){
-
3187 colorPrimitives_objIDs.clear();
-
3188 }
-
3189}
-
3190
- -
3192 colorPrimitivesByObjectData = data_name;
-
3193 colorPrimitivesByData = "";
-
3194 if( !colorPrimitives_UUIDs.empty() ){
-
3195 colorPrimitives_UUIDs.clear();
-
3196 }
-
3197 if( !colorPrimitives_objIDs.empty() ){
-
3198 colorPrimitives_objIDs.clear();
-
3199 }
-
3200}
-
3201
-
3202void Visualizer::colorContextPrimitivesByObjectData( const char* data_name, const std::vector<uint>& ObjIDs ){
-
3203 colorPrimitivesByObjectData = data_name;
-
3204 colorPrimitivesByData = "";
-
3205 for( uint objID : ObjIDs ){
-
3206 colorPrimitives_objIDs[objID] = objID;
-
3207 }
-
3208 if( !colorPrimitives_UUIDs.empty() ){
-
3209 colorPrimitives_UUIDs.clear();
-
3210 }
-
3211}
-
3212
-
3213void Visualizer::colorContextPrimitivesRandomly(const std::vector<uint>& UUIDs ){
-
3214
- -
3216 if( !colorPrimitives_UUIDs.empty() ){
-
3217 colorPrimitives_UUIDs.clear();
-
3218 }
-
3219 for( uint UUID : UUIDs ){
-
3220 float rc = randu();
-
3221 context->setPrimitiveData(UUID, "random_color", rc);
+
3167 if( message_flag ){
+
3168 std::cout << "done." << std::endl;
+
3169 }
+
3170
+
3171}
+
3172
+
+
3173void Visualizer::colorContextPrimitivesByData( const char* data_name ){
+
3174 colorPrimitivesByData = data_name;
+
3175 colorPrimitivesByObjectData = "";
+
3176 if( !colorPrimitives_UUIDs.empty() ){
+
3177 colorPrimitives_UUIDs.clear();
+
3178 }
+
3179 if( !colorPrimitives_objIDs.empty() ){
+
3180 colorPrimitives_objIDs.clear();
+
3181 }
+
3182}
+
+
3183
+
+
3184void Visualizer::colorContextPrimitivesByData( const char* data_name, const std::vector<uint>& UUIDs ){
+
3185 colorPrimitivesByData = data_name;
+
3186 colorPrimitivesByObjectData = "";
+
3187 for( uint UUID : UUIDs ){
+
3188 colorPrimitives_UUIDs[UUID] = UUID;
+
3189 }
+
3190 if( !colorPrimitives_objIDs.empty() ){
+
3191 colorPrimitives_objIDs.clear();
+
3192 }
+
3193}
+
+
3194
+
+ +
3196 colorPrimitivesByObjectData = data_name;
+
3197 colorPrimitivesByData = "";
+
3198 if( !colorPrimitives_UUIDs.empty() ){
+
3199 colorPrimitives_UUIDs.clear();
+
3200 }
+
3201 if( !colorPrimitives_objIDs.empty() ){
+
3202 colorPrimitives_objIDs.clear();
+
3203 }
+
3204}
+
+
3205
+
+
3206void Visualizer::colorContextPrimitivesByObjectData( const char* data_name, const std::vector<uint>& ObjIDs ){
+
3207 colorPrimitivesByObjectData = data_name;
+
3208 colorPrimitivesByData = "";
+
3209 for( uint objID : ObjIDs ){
+
3210 colorPrimitives_objIDs[objID] = objID;
+
3211 }
+
3212 if( !colorPrimitives_UUIDs.empty() ){
+
3213 colorPrimitives_UUIDs.clear();
+
3214 }
+
3215}
+
+
3216
+
+
3217void Visualizer::colorContextPrimitivesRandomly(const std::vector<uint>& UUIDs ){
+
3218
+ +
3220 if( !colorPrimitives_UUIDs.empty() ){
+
3221 colorPrimitives_UUIDs.clear();
3222 }
-
3223
-
3224 colorPrimitivesByData = "random_color";
-
3225 colorPrimitivesByObjectData = "";
-
3226 for( uint UUID : UUIDs ){
-
3227 colorPrimitives_UUIDs[UUID] = UUID;
-
3228 }
-
3229 if( !colorPrimitives_objIDs.empty() ){
-
3230 colorPrimitives_objIDs.clear();
-
3231 }
-
3232}
-
3233
- -
3235
- -
3237
-
3238 std::vector<uint> all_UUIDs = context->getAllUUIDs();
-
3239 for( uint UUID : all_UUIDs ){
-
3240 float rc = randu();
-
3241 context->setPrimitiveData(UUID, "random_color", rc);
-
3242 }
-
3243
-
3244 colorPrimitivesByData = "random_color";
-
3245 colorPrimitivesByObjectData = "";
-
3246 if( !colorPrimitives_UUIDs.empty() ){
-
3247 colorPrimitives_UUIDs.clear();
-
3248 }
-
3249 if( !colorPrimitives_objIDs.empty() ){
-
3250 colorPrimitives_objIDs.clear();
-
3251 }
-
3252
-
3253}
-
3254
-
3255
-
3256void Visualizer::colorContextObjectsRandomly(const std::vector<uint>& ObjIDs ){
-
3257
- -
3259 if( !colorPrimitives_UUIDs.empty() ){
-
3260 colorPrimitives_UUIDs.clear();
-
3261 }
-
3262 for( uint ObjID : ObjIDs ){
-
3263 float rc = randu();
-
3264 context->setObjectData(ObjID, "random_color", rc);
+
3223 for( uint UUID : UUIDs ){
+
3224 float rc = randu();
+
3225 context->setPrimitiveData(UUID, "random_color", rc);
+
3226 }
+
3227
+
3228 colorPrimitivesByData = "random_color";
+
3229 colorPrimitivesByObjectData = "";
+
3230 for( uint UUID : UUIDs ){
+
3231 colorPrimitives_UUIDs[UUID] = UUID;
+
3232 }
+
3233 if( !colorPrimitives_objIDs.empty() ){
+
3234 colorPrimitives_objIDs.clear();
+
3235 }
+
3236}
+
+
3237
+
+ +
3239
+ +
3241
+
3242 std::vector<uint> all_UUIDs = context->getAllUUIDs();
+
3243 for( uint UUID : all_UUIDs ){
+
3244 float rc = randu();
+
3245 context->setPrimitiveData(UUID, "random_color", rc);
+
3246 }
+
3247
+
3248 colorPrimitivesByData = "random_color";
+
3249 colorPrimitivesByObjectData = "";
+
3250 if( !colorPrimitives_UUIDs.empty() ){
+
3251 colorPrimitives_UUIDs.clear();
+
3252 }
+
3253 if( !colorPrimitives_objIDs.empty() ){
+
3254 colorPrimitives_objIDs.clear();
+
3255 }
+
3256
+
3257}
+
+
3258
+
3259
+
+
3260void Visualizer::colorContextObjectsRandomly(const std::vector<uint>& ObjIDs ){
+
3261
+ +
3263 if( !colorPrimitives_UUIDs.empty() ){
+
3264 colorPrimitives_UUIDs.clear();
3265 }
-
3266
-
3267 colorPrimitivesByData = "";
-
3268 colorPrimitivesByObjectData = "random_color";
-
3269
-
3270}
-
3271
- -
3273 std::vector<uint> all_ObjIDs = context->getAllObjectIDs();
- -
3275 if( !colorPrimitives_UUIDs.empty() ){
-
3276 colorPrimitives_UUIDs.clear();
-
3277 }
-
3278 for( uint ObjID : all_ObjIDs ){
-
3279 float rc = randu();
-
3280 context->setObjectData(ObjID, "random_color", rc);
+
3266 for( uint ObjID : ObjIDs ){
+
3267 float rc = randu();
+
3268 context->setObjectData(ObjID, "random_color", rc);
+
3269 }
+
3270
+
3271 colorPrimitivesByData = "";
+
3272 colorPrimitivesByObjectData = "random_color";
+
3273
+
3274}
+
+
3275
+
+ +
3277 std::vector<uint> all_ObjIDs = context->getAllObjectIDs();
+ +
3279 if( !colorPrimitives_UUIDs.empty() ){
+
3280 colorPrimitives_UUIDs.clear();
3281 }
-
3282
-
3283 colorPrimitivesByData = "";
-
3284 colorPrimitivesByObjectData = "random_color";
-
3285
-
3286}
-
3287
-
3288
+
3282 for( uint ObjID : all_ObjIDs ){
+
3283 float rc = randu();
+
3284 context->setObjectData(ObjID, "random_color", rc);
+
3285 }
+
3286
+
3287 colorPrimitivesByData = "";
+
3288 colorPrimitivesByObjectData = "random_color";
3289
-
3290
+
3290}
+
3291
3292
3293
3294
-
3295std::vector<helios::vec3> Visualizer::plotInteractive() {
-
3296
-
3297 if( message_flag ){
-
3298 std::cout << "Generating interactive plot..." << std::endl;
-
3299 }
-
3300
-
3301// glfwShowWindow( (GLFWwindow*) window);
-
3302
-
3303// openWindow();
+
3295
+
3296float dphi = 0.0;
+
3297float dtheta = 0.0;
+
3298float dx = 0.0;
+
3299float dy = 0.0;
+
3300float dz = 0.0;
+
3301float dx_m = 0.0;
+
3302float dy_m = 0.0;
+
3303float dscroll = 0.0;
3304
-
3305 //Update the Context geometry (if needed)
-
3306 if( contextGeomNeedsUpdate ){
-
3307 buildContextGeometry_private();
-
3308 }else{
-
3309 colormap_current.setRange( colorbar_min, colorbar_max );
+
3305
+
+
3306std::vector<helios::vec3> Visualizer::plotInteractive() {
+
3307
+
3308 if( message_flag ){
+
3309 std::cout << "Generating interactive plot..." << std::endl;
3310 }
3311
-
3312 //Update
-
3313 if( colorbar_flag==2 ){
-
3314 addColorbarByCenter( colorbar_title.c_str(), colorbar_size, colorbar_position, colorbar_fontcolor, colormap_current );
-
3315 }
-
3316
-
3317 //Watermark
-
3318 if( isWatermarkVisible ){
-
3319 float hratio = float(Wdisplay)/float(Hdisplay);
-
3320 float width = 0.2389f/0.8f/hratio;
-
3321 addRectangleByCenter( make_vec3(0.75f*width,0.95f,0), make_vec2(width,0.07), make_SphericalCoord(0,0), "plugins/visualizer/textures/Helios_watermark.png", COORDINATES_WINDOW_NORMALIZED );
-
3322 }
-
3323
-
3324 setupPlot();
-
3325
-
3326 //domain bounding box
-
3327 vec2 xbounds, ybounds, zbounds;
-
3328 getDomainBoundingBox( xbounds, ybounds, zbounds );
-
3329
-
3330 glm::vec3 view_center = glm::vec3( xbounds.x+0.5*(xbounds.y-xbounds.x), ybounds.x+0.5*(ybounds.y-ybounds.x), zbounds.x+0.5*(zbounds.y-zbounds.x) );
-
3331 //float bound_R = 2.f*fmax(xbounds.y-xbounds.x,fmax(ybounds.y-ybounds.x,zbounds.y-zbounds.x));
-
3332 float bound_R = 0.75*sqrtf( pow(xbounds.y-xbounds.x,2) + pow(ybounds.y-ybounds.x,2) + pow(zbounds.y-zbounds.x,2) );
-
3333
-
3334 glm::vec3 lightInvDir = view_center + glm::vec3(light_direction.x,light_direction.y,light_direction.z);
-
3335
-
3336 bool shadow_flag = false;
-
3337 for( uint m=0; m<primaryLightingModel.size(); m++ ){
-
3338 if( primaryLightingModel.at(m) == Visualizer::LIGHTING_PHONG_SHADOWED ){
-
3339 shadow_flag = true;
-
3340 break;
-
3341 }
-
3342 }
-
3343
-
3344 glm::mat4 depthMVP;
-
3345
-
3346 if( shadow_flag ){
-
3347
-
3348 // Depth buffer for shadows
-
3349 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
-
3350 glViewport(0,0,8192,8192); // Render on the whole framebuffer, complete from the lower left corner to the upper right
-
3351 //glViewport(0,0,16384,16384); // Render on the whole framebuffer, complete from the lower left corner to the upper right
-
3352
-
3353 // Clear the screen
-
3354 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-
3355
-
3356 depthShader.useShader();
-
3357
-
3358 // Compute the MVP matrix from the light's point of view
-
3359 glm::mat4 depthProjectionMatrix = glm::ortho<float>(-bound_R,bound_R,-bound_R,bound_R,-bound_R,bound_R);
-
3360 glm::mat4 depthViewMatrix = glm::lookAt(lightInvDir, view_center, glm::vec3(0,0,1));
-
3361 depthMVP = depthProjectionMatrix * depthViewMatrix;
-
3362
-
3363 depthShader.setTransformationMatrix( depthMVP );
-
3364
-
3365 //bind depth texture
-
3366 glActiveTexture(GL_TEXTURE1);
-
3367 glBindTexture(GL_TEXTURE_2D, depthTexture);
+
3312// glfwShowWindow( (GLFWwindow*) window);
+
3313
+
3314// openWindow();
+
3315
+
3316 //Update the Context geometry (if needed)
+
3317 if( contextGeomNeedsUpdate ){
+
3318 buildContextGeometry_private();
+
3319 }else{
+
3320 colormap_current.setRange( colorbar_min, colorbar_max );
+
3321 }
+
3322
+
3323 //Update
+
3324 if( colorbar_flag==2 ){
+
3325 addColorbarByCenter( colorbar_title.c_str(), colorbar_size, colorbar_position, colorbar_fontcolor, colormap_current );
+
3326 }
+
3327
+
3328 //Watermark
+
3329 if( isWatermarkVisible ){
+
3330 float hratio = float(Wdisplay)/float(Hdisplay);
+
3331 float width = 0.2389f/0.8f/hratio;
+
3332 addRectangleByCenter( make_vec3(0.75f*width,0.95f,0), make_vec2(width,0.07), make_SphericalCoord(0,0), "plugins/visualizer/textures/Helios_watermark.png", COORDINATES_WINDOW_NORMALIZED );
+
3333 }
+
3334
+
3335 setupPlot();
+
3336
+
3337 //domain bounding box
+
3338 vec2 xbounds, ybounds, zbounds;
+
3339 getDomainBoundingBox( xbounds, ybounds, zbounds );
+
3340
+
3341 glm::vec3 view_center = glm::vec3( xbounds.x+0.5*(xbounds.y-xbounds.x), ybounds.x+0.5*(ybounds.y-ybounds.x), zbounds.x+0.5*(zbounds.y-zbounds.x) );
+
3342 //float bound_R = 2.f*fmax(xbounds.y-xbounds.x,fmax(ybounds.y-ybounds.x,zbounds.y-zbounds.x));
+
3343 float bound_R = 0.75*sqrtf( pow(xbounds.y-xbounds.x,2) + pow(ybounds.y-ybounds.x,2) + pow(zbounds.y-zbounds.x,2) );
+
3344
+
3345 glm::vec3 lightInvDir = view_center + glm::vec3(light_direction.x,light_direction.y,light_direction.z);
+
3346
+
3347 bool shadow_flag = false;
+
3348 for( uint m=0; m<primaryLightingModel.size(); m++ ){
+
3349 if( primaryLightingModel.at(m) == Visualizer::LIGHTING_PHONG_SHADOWED ){
+
3350 shadow_flag = true;
+
3351 break;
+
3352 }
+
3353 }
+
3354
+
3355 glm::mat4 depthMVP;
+
3356
+
3357 if( shadow_flag ){
+
3358
+
3359 // Depth buffer for shadows
+
3360 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
+
3361 glViewport(0,0,8192,8192); // Render on the whole framebuffer, complete from the lower left corner to the upper right
+
3362 //glViewport(0,0,16384,16384); // Render on the whole framebuffer, complete from the lower left corner to the upper right
+
3363
+
3364 // Clear the screen
+
3365 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
3366
+
3367 depthShader.useShader();
3368
-
3369 depthShader.enableTextureMaps();
-
3370 depthShader.enableTextureMasks();
-
3371
-
3372 render( 1 );
+
3369 // Compute the MVP matrix from the light's point of view
+
3370 glm::mat4 depthProjectionMatrix = glm::ortho<float>(-bound_R,bound_R,-bound_R,bound_R,-bound_R,bound_R);
+
3371 glm::mat4 depthViewMatrix = glm::lookAt(lightInvDir, view_center, glm::vec3(0,0,1));
+
3372 depthMVP = depthProjectionMatrix * depthViewMatrix;
3373
-
3374 }else{
+
3374 depthShader.setTransformationMatrix( depthMVP );
3375
-
3376 depthMVP = glm::mat4(1.0);
-
3377
-
3378 }
+
3376 //bind depth texture
+
3377 glActiveTexture(GL_TEXTURE1);
+
3378 glBindTexture(GL_TEXTURE_2D, depthTexture);
3379
-
3380 assert(checkerrors());
-
3381
-
3382 std::vector<vec3> camera_output;
-
3383
-
3384 glfwShowWindow( (GLFWwindow*) window);
-
3385
-
3386 do{
-
3387
-
3388 // Render to the screen
-
3389 glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
3390 //glViewport(0,0,Wdisplay,Hdisplay); // Render on the whole framebuffer, complete from the lower left corner to the upper right
-
3391 glViewport(0,0,Wframebuffer,Hframebuffer);
+
3380 depthShader.enableTextureMaps();
+
3381 depthShader.enableTextureMasks();
+
3382
+
3383 render( 1 );
+
3384
+
3385 }else{
+
3386
+
3387 depthMVP = glm::mat4(1.0);
+
3388
+
3389 }
+
3390
+
3391 assert(checkerrors());
3392
-
3393 glClearColor(backgroundColor.r, backgroundColor.g, backgroundColor.b, 0.0f);
+
3393 std::vector<vec3> camera_output;
3394
-
3395 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
3395 glfwShowWindow( (GLFWwindow*) window);
3396
-
3397 primaryShader.useShader();
+
3397 do{
3398
-
3399 updatePerspectiveTransformation( camera_lookat_center, camera_eye_location );
-
3400
-
3401 glm::mat4 biasMatrix(
-
3402 0.5, 0.0, 0.0, 0.0,
-
3403 0.0, 0.5, 0.0, 0.0,
-
3404 0.0, 0.0, 0.5, 0.0,
-
3405 0.5, 0.5, 0.5, 1.0
-
3406 );
+
3399 // Render to the screen
+
3400 glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
3401 //glViewport(0,0,Wdisplay,Hdisplay); // Render on the whole framebuffer, complete from the lower left corner to the upper right
+
3402 glViewport(0,0,Wframebuffer,Hframebuffer);
+
3403
+
3404 glClearColor(backgroundColor.r, backgroundColor.g, backgroundColor.b, 0.0f);
+
3405
+
3406 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
3407
-
3408 glm::mat4 DepthBiasMVP = biasMatrix*depthMVP;
+
3408 primaryShader.useShader();
3409
-
3410 primaryShader.setDepthBiasMatrix( DepthBiasMVP );
+
3410 updatePerspectiveTransformation( camera_lookat_center, camera_eye_location );
3411
-
3412 primaryShader.setTransformationMatrix( perspectiveTransformationMatrix );
-
3413
-
3414 primaryShader.enableTextureMaps();
-
3415 primaryShader.enableTextureMasks();
-
3416
-
3417 primaryShader.setLightingModel( primaryLightingModel.at(0) );
-
3418 primaryShader.setLightIntensity( lightintensity );
-
3419
-
3420 glBindTexture(GL_TEXTURE_2D, depthTexture);
-
3421 glUniform1i(primaryShader.shadowmapUniform,1);
+
3412 glm::mat4 biasMatrix(
+
3413 0.5, 0.0, 0.0, 0.0,
+
3414 0.0, 0.5, 0.0, 0.0,
+
3415 0.0, 0.0, 0.5, 0.0,
+
3416 0.5, 0.5, 0.5, 1.0
+
3417 );
+
3418
+
3419 glm::mat4 DepthBiasMVP = biasMatrix*depthMVP;
+
3420
+
3421 primaryShader.setDepthBiasMatrix( DepthBiasMVP );
3422
-
3423 render( 0 );
+
3423 primaryShader.setTransformationMatrix( perspectiveTransformationMatrix );
3424
-
3425 glfwPollEvents();
-
3426 getViewKeystrokes( camera_eye_location, camera_lookat_center );
+
3425 primaryShader.enableTextureMaps();
+
3426 primaryShader.enableTextureMasks();
3427
-
3428 glfwSwapBuffers((GLFWwindow*)window);
-
3429
-
3430 glfwWaitEvents();
-
3431
-
3432 int width, height;
-
3433 //glfwGetWindowSize((GLFWwindow*)window, &width, &height );
-
3434 //Wdisplay = width;
-
3435 //Hdisplay = height;
-
3436 glfwGetFramebufferSize((GLFWwindow*)window, &width, &height );
-
3437 Wframebuffer = width;
-
3438 Hframebuffer = height;
-
3439
-
3440 }while( glfwGetKey((GLFWwindow*)window, GLFW_KEY_ESCAPE ) != GLFW_PRESS && glfwWindowShouldClose((GLFWwindow*)window) == 0 );
-
3441
-
3442 glfwPollEvents();
-
3443
-
3444 assert(checkerrors());
-
3445
-
3446 camera_output.push_back(camera_eye_location);
-
3447 camera_output.push_back(camera_lookat_center);
-
3448
-
3449 return camera_output;
+
3428 primaryShader.setLightingModel( primaryLightingModel.at(0) );
+
3429 primaryShader.setLightIntensity( lightintensity );
+
3430
+
3431 glBindTexture(GL_TEXTURE_2D, depthTexture);
+
3432 glUniform1i(primaryShader.shadowmapUniform,1);
+
3433
+
3434 render( 0 );
+
3435
+
3436 glfwPollEvents();
+
3437 getViewKeystrokes( camera_eye_location, camera_lookat_center );
+
3438
+
3439 glfwSwapBuffers((GLFWwindow*)window);
+
3440
+
3441 glfwWaitEvents();
+
3442
+
3443 int width, height;
+
3444 //glfwGetWindowSize((GLFWwindow*)window, &width, &height );
+
3445 //Wdisplay = width;
+
3446 //Hdisplay = height;
+
3447 glfwGetFramebufferSize((GLFWwindow*)window, &width, &height );
+
3448 Wframebuffer = width;
+
3449 Hframebuffer = height;
3450
-
3451}
+
3451 }while( glfwGetKey((GLFWwindow*)window, GLFW_KEY_ESCAPE ) != GLFW_PRESS && glfwWindowShouldClose((GLFWwindow*)window) == 0 );
3452
-
3453void Visualizer::setupPlot(){
+
3453 glfwPollEvents();
3454
-
3455 glEnableVertexAttribArray(0); //position
-
3456 glEnableVertexAttribArray(1); //color
-
3457 glEnableVertexAttribArray(2); //normal
-
3458 glEnableVertexAttribArray(3); //uv
-
3459 glEnableVertexAttribArray(4); //texture flag
-
3460 glEnableVertexAttribArray(5); //coordinate flag
+
3455 assert(checkerrors());
+
3456
+
3457 camera_output.push_back(camera_eye_location);
+
3458 camera_output.push_back(camera_lookat_center);
+
3459
+
3460 return camera_output;
3461
-
3462 std::vector<float> position_data, color_data, normal_data, uv_data;
-
3463 std::vector<int> coordinate_data, texture_data, textureID_data;
-
3464
-
3465 std::vector<std::string> keys{"triangle", "line", "point", "sky" };
-
3466
-
3467 for( int i=0; i<keys.size(); i++ ){
-
3468 position_data.insert( position_data.end(), positionData[keys.at(i)].begin(), positionData[keys.at(i)].end() );
-
3469 color_data.insert( color_data.end(), colorData[keys.at(i)].begin(), colorData[keys.at(i)].end() );
-
3470 normal_data.insert( normal_data.end(), normalData[keys.at(i)].begin(), normalData[keys.at(i)].end() );
-
3471 uv_data.insert( uv_data.end(), uvData[keys.at(i)].begin(), uvData[keys.at(i)].end() );
-
3472 coordinate_data.insert( coordinate_data.end(), coordinateFlagData[keys.at(i)].begin(), coordinateFlagData[keys.at(i)].end() );
-
3473 texture_data.insert( texture_data.end(), textureFlagData[keys.at(i)].begin(), textureFlagData[keys.at(i)].end() );
-
3474 }
+
3462}
+
+
3463
+
3464void Visualizer::setupPlot(){
+
3465
+
3466 glEnableVertexAttribArray(0); //position
+
3467 glEnableVertexAttribArray(1); //color
+
3468 glEnableVertexAttribArray(2); //normal
+
3469 glEnableVertexAttribArray(3); //uv
+
3470 glEnableVertexAttribArray(4); //texture flag
+
3471 glEnableVertexAttribArray(5); //coordinate flag
+
3472
+
3473 std::vector<float> position_data, color_data, normal_data, uv_data;
+
3474 std::vector<int> coordinate_data, texture_data, textureID_data;
3475
-
3476 // 1st attribute buffer : vertex positions
-
3477 glBindBuffer(GL_ARRAY_BUFFER, positionBuffer );
-
3478 glBufferData(GL_ARRAY_BUFFER, position_data.size()*sizeof(GLfloat), &position_data[0], GL_STATIC_DRAW);
-
3479 glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
-
3480
-
3481 // 2nd attribute buffer : vertex colors
-
3482 glBindBuffer(GL_ARRAY_BUFFER, colorBuffer );
-
3483 glBufferData(GL_ARRAY_BUFFER, color_data.size()*sizeof(GLfloat), &color_data[0], GL_STATIC_DRAW);
-
3484 glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, 0, (void*)0 );
-
3485
-
3486 // 3rd attribute buffer : vertex normals
-
3487 glBindBuffer(GL_ARRAY_BUFFER, normalBuffer );
-
3488 glBufferData(GL_ARRAY_BUFFER, normal_data.size()*sizeof(GLfloat), &normal_data[0], GL_STATIC_DRAW);
-
3489 glVertexAttribPointer( 2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
-
3490
-
3491 // 4th attribute buffer : vertex uv
-
3492 glBindBuffer(GL_ARRAY_BUFFER, uvBuffer );
-
3493 glBufferData(GL_ARRAY_BUFFER, uv_data.size()*sizeof(GLfloat), &uv_data[0], GL_STATIC_DRAW);
-
3494 glVertexAttribPointer( 3, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );
-
3495
-
3496 // 5th attribute buffer : vertex texture flag
-
3497 glBindBuffer(GL_ARRAY_BUFFER, textureFlagBuffer );
-
3498 glBufferData(GL_ARRAY_BUFFER, texture_data.size()*sizeof(GLint), &texture_data[0], GL_STATIC_DRAW);
-
3499 glVertexAttribIPointer( 4, 1, GL_INT, 0, (void*)0 );
-
3500
-
3501 // 6th attribute buffer : vertex coordinate flag
-
3502 glBindBuffer(GL_ARRAY_BUFFER, coordinateFlagBuffer );
-
3503 glBufferData(GL_ARRAY_BUFFER, coordinate_data.size()*sizeof(GLint), &coordinate_data[0], GL_STATIC_DRAW);
-
3504 glVertexAttribIPointer( 5, 1, GL_INT, 0, (void*)0 );
-
3505
-
3506 //figure out texture switches
-
3507
-
3508 uint textureID_current;
-
3509 if( textureIDData["triangle"].size()==0 ){
-
3510 textureID_current = 0;
-
3511 }else{
-
3512 textureID_current = textureIDData["triangle"].at(0);
-
3513 }
-
3514
-
3515 size_t start_current = 0;
-
3516 for( size_t p=1; p<textureIDData["triangle"].size(); p++ ){
-
3517
-
3518 if( textureID_current!=textureIDData["triangle"].at(p) || p == textureIDData["triangle"].size()-1 ){
-
3519 group_start[ start_current ] = make_int2(textureID_current,p-start_current+1);
-
3520 textureID_current = textureIDData["triangle"].at(p);
-
3521 start_current = p;
-
3522 }else{
-
3523 continue;
-
3524 }
+
3476 std::vector<std::string> keys{"triangle", "line", "point", "sky" };
+
3477
+
3478 for( int i=0; i<keys.size(); i++ ){
+
3479 position_data.insert( position_data.end(), positionData[keys.at(i)].begin(), positionData[keys.at(i)].end() );
+
3480 color_data.insert( color_data.end(), colorData[keys.at(i)].begin(), colorData[keys.at(i)].end() );
+
3481 normal_data.insert( normal_data.end(), normalData[keys.at(i)].begin(), normalData[keys.at(i)].end() );
+
3482 uv_data.insert( uv_data.end(), uvData[keys.at(i)].begin(), uvData[keys.at(i)].end() );
+
3483 coordinate_data.insert( coordinate_data.end(), coordinateFlagData[keys.at(i)].begin(), coordinateFlagData[keys.at(i)].end() );
+
3484 texture_data.insert( texture_data.end(), textureFlagData[keys.at(i)].begin(), textureFlagData[keys.at(i)].end() );
+
3485 }
+
3486
+
3487 // 1st attribute buffer : vertex positions
+
3488 glBindBuffer(GL_ARRAY_BUFFER, positionBuffer );
+
3489 glBufferData(GL_ARRAY_BUFFER, position_data.size()*sizeof(GLfloat), &position_data[0], GL_STATIC_DRAW);
+
3490 glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
+
3491
+
3492 // 2nd attribute buffer : vertex colors
+
3493 glBindBuffer(GL_ARRAY_BUFFER, colorBuffer );
+
3494 glBufferData(GL_ARRAY_BUFFER, color_data.size()*sizeof(GLfloat), &color_data[0], GL_STATIC_DRAW);
+
3495 glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, 0, (void*)0 );
+
3496
+
3497 // 3rd attribute buffer : vertex normals
+
3498 glBindBuffer(GL_ARRAY_BUFFER, normalBuffer );
+
3499 glBufferData(GL_ARRAY_BUFFER, normal_data.size()*sizeof(GLfloat), &normal_data[0], GL_STATIC_DRAW);
+
3500 glVertexAttribPointer( 2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
+
3501
+
3502 // 4th attribute buffer : vertex uv
+
3503 glBindBuffer(GL_ARRAY_BUFFER, uvBuffer );
+
3504 glBufferData(GL_ARRAY_BUFFER, uv_data.size()*sizeof(GLfloat), &uv_data[0], GL_STATIC_DRAW);
+
3505 glVertexAttribPointer( 3, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );
+
3506
+
3507 // 5th attribute buffer : vertex texture flag
+
3508 glBindBuffer(GL_ARRAY_BUFFER, textureFlagBuffer );
+
3509 glBufferData(GL_ARRAY_BUFFER, texture_data.size()*sizeof(GLint), &texture_data[0], GL_STATIC_DRAW);
+
3510 glVertexAttribIPointer( 4, 1, GL_INT, 0, (void*)0 );
+
3511
+
3512 // 6th attribute buffer : vertex coordinate flag
+
3513 glBindBuffer(GL_ARRAY_BUFFER, coordinateFlagBuffer );
+
3514 glBufferData(GL_ARRAY_BUFFER, coordinate_data.size()*sizeof(GLint), &coordinate_data[0], GL_STATIC_DRAW);
+
3515 glVertexAttribIPointer( 5, 1, GL_INT, 0, (void*)0 );
+
3516
+
3517 //figure out texture switches
+
3518
+
3519 uint textureID_current;
+
3520 if( textureIDData["triangle"].size()==0 ){
+
3521 textureID_current = 0;
+
3522 }else{
+
3523 textureID_current = textureIDData["triangle"].at(0);
+
3524 }
3525
-
3526 }
-
3527
-
3528}
-
3529
-
3530void Visualizer::render( bool shadow ){
-
3531
-
3532 //--- Triangles------
-
3533
-
3534 uint textureID_current;
-
3535 if( textureIDData["triangle"].size()==0 ){
-
3536 textureID_current = 0;
-
3537 }else{
-
3538 textureID_current = textureIDData["triangle"].at(0);
-
3539 }
+
3526 size_t start_current = 0;
+
3527 for( size_t p=1; p<textureIDData["triangle"].size(); p++ ){
+
3528
+
3529 if( textureID_current!=textureIDData["triangle"].at(p) || p == textureIDData["triangle"].size()-1 ){
+
3530 group_start[ start_current ] = make_int2(textureID_current,p-start_current+1);
+
3531 textureID_current = textureIDData["triangle"].at(p);
+
3532 start_current = p;
+
3533 }else{
+
3534 continue;
+
3535 }
+
3536
+
3537 }
+
3538
+
3539}
3540
-
3541 glBindTexture(GL_TEXTURE_RECTANGLE,0);
+
3541void Visualizer::render( bool shadow ){
3542
-
3543 for( std::map<uint,int2>::iterator iter=group_start.begin(); iter!=group_start.end(); ++iter ){
+
3543 //--- Triangles------
3544
-
3545 if( iter->second.x!=0 ){
-
3546 glBindTexture(GL_TEXTURE_RECTANGLE,iter->second.x);
-
3547 }
-
3548
-
3549 glDrawArrays(GL_TRIANGLES, iter->first, iter->second.y );
-
3550
-
3551 }
-
3552
-
3553 if( !shadow ){
-
3554
-
3555 size_t triangle_size = positionData["triangle"].size()/3;
-
3556 size_t line_size = positionData["line"].size()/3;
-
3557 size_t point_size = positionData["point"].size()/3;
-
3558
-
3559 if( line_size>0 ){
-
3560 glDrawArrays(GL_LINES, triangle_size, line_size );
-
3561 }
-
3562
-
3563 if( point_size>0 ){
-
3564 glPointSize( point_width );
-
3565 glDrawArrays(GL_POINTS, triangle_size+line_size, point_size );
-
3566 }
-
3567
-
3568 if( positionData["sky"].size()>0 ){
-
3569 primaryShader.setLightingModel( LIGHTING_NONE );
-
3570 glBindTexture(GL_TEXTURE_RECTANGLE,textureIDData["sky"].at(0));
-
3571 glDrawArrays(GL_TRIANGLES, triangle_size+line_size+point_size, positionData["sky"].size()/3 );
+
3545 uint textureID_current;
+
3546 if( textureIDData["triangle"].size()==0 ){
+
3547 textureID_current = 0;
+
3548 }else{
+
3549 textureID_current = textureIDData["triangle"].at(0);
+
3550 }
+
3551
+
3552 glBindTexture(GL_TEXTURE_RECTANGLE,0);
+
3553
+
3554 for( std::map<uint,int2>::iterator iter=group_start.begin(); iter!=group_start.end(); ++iter ){
+
3555
+
3556 if( iter->second.x!=0 ){
+
3557 glBindTexture(GL_TEXTURE_RECTANGLE,iter->second.x);
+
3558 }
+
3559
+
3560 glDrawArrays(GL_TRIANGLES, iter->first, iter->second.y );
+
3561
+
3562 }
+
3563
+
3564 if( !shadow ){
+
3565
+
3566 size_t triangle_size = positionData["triangle"].size()/3;
+
3567 size_t line_size = positionData["line"].size()/3;
+
3568 size_t point_size = positionData["point"].size()/3;
+
3569
+
3570 if( line_size>0 ){
+
3571 glDrawArrays(GL_LINES, triangle_size, line_size );
3572 }
3573
-
3574 }
-
3575
-
3576}
-
3577
- -
3579 plotUpdate( false );
-
3580}
-
3581
-
3582void Visualizer::plotUpdate( bool hide_window ){
-
3583
-
3584 if( message_flag ){
-
3585 std::cout << "Updating the plot..." << std::flush;
-
3586 }
-
3587
-
3588 if( !hide_window ) {
-
3589 glfwShowWindow((GLFWwindow *) window);
-
3590 }
-
3591
-
3592 //Update the Context geometry (if needed)
-
3593 if( contextGeomNeedsUpdate ){
-
3594 buildContextGeometry_private();
-
3595 }else{
-
3596 colormap_current.setRange( colorbar_min, colorbar_max );
+
3574 if( point_size>0 ){
+
3575 glPointSize( point_width );
+
3576 glDrawArrays(GL_POINTS, triangle_size+line_size, point_size );
+
3577 }
+
3578
+
3579 if( positionData["sky"].size()>0 ){
+
3580 primaryShader.setLightingModel( LIGHTING_NONE );
+
3581 glBindTexture(GL_TEXTURE_RECTANGLE,textureIDData["sky"].at(0));
+
3582 glDrawArrays(GL_TRIANGLES, triangle_size+line_size+point_size, positionData["sky"].size()/3 );
+
3583 }
+
3584
+
3585 }
+
3586
+
3587}
+
3588
+
+ +
3590 plotUpdate( false );
+
3591}
+
+
3592
+
+
3593void Visualizer::plotUpdate( bool hide_window ){
+
3594
+
3595 if( message_flag ){
+
3596 std::cout << "Updating the plot..." << std::flush;
3597 }
3598
-
3599 //Update
-
3600 if( colorbar_flag==2 ){
-
3601 addColorbarByCenter( colorbar_title.c_str(), colorbar_size, colorbar_position, colorbar_fontcolor, colormap_current );
-
3602 }
-
3603
-
3604 //Watermark
-
3605 if( isWatermarkVisible ){
-
3606 float hratio = float(Wdisplay)/float(Hdisplay);
-
3607 float width = 0.2389f/0.8f/hratio;
-
3608 addRectangleByCenter( make_vec3(0.75f*width,0.95f,0), make_vec2(width,0.07), make_SphericalCoord(0,0), "plugins/visualizer/textures/Helios_watermark.png", COORDINATES_WINDOW_NORMALIZED );
-
3609 }
-
3610
-
3611 setupPlot();
-
3612
-
3613 //domain bounding box
-
3614 vec2 xbounds, ybounds, zbounds;
-
3615 getDomainBoundingBox( xbounds, ybounds, zbounds );
-
3616
-
3617 glm::vec3 view_center = glm::vec3( xbounds.x+0.5*(xbounds.y-xbounds.x), ybounds.x+0.5*(ybounds.y-ybounds.x), zbounds.x+0.5*(zbounds.y-zbounds.x) );
-
3618 //float bound_R = 2.f*fmax(xbounds.y-xbounds.x,fmax(ybounds.y-ybounds.x,zbounds.y-zbounds.x));
-
3619 float bound_R = 0.75*sqrtf( pow(xbounds.y-xbounds.x,2) + pow(ybounds.y-ybounds.x,2) + pow(zbounds.y-zbounds.x,2) );
-
3620
-
3621 glm::vec3 lightInvDir = view_center + glm::vec3(light_direction.x,light_direction.y,light_direction.z);
-
3622
-
3623 bool shadow_flag = false;
-
3624 for( uint m=0; m<primaryLightingModel.size(); m++ ){
-
3625 if( primaryLightingModel.at(m) == Visualizer::LIGHTING_PHONG_SHADOWED ){
-
3626 shadow_flag = true;
-
3627 break;
-
3628 }
-
3629 }
-
3630
-
3631 glm::mat4 depthMVP;
-
3632
-
3633 if( shadow_flag ){
-
3634
-
3635 // Depth buffer for shadows
-
3636 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
-
3637 glViewport(0,0,8192,8192); // Render on the whole framebuffer, complete from the lower left corner to the upper right
-
3638 //glViewport(0,0,16384,16384); // Render on the whole framebuffer, complete from the lower left corner to the upper right
-
3639
-
3640 // Clear the screen
-
3641 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-
3642
-
3643 depthShader.useShader();
-
3644
-
3645 // Compute the MVP matrix from the light's point of view
-
3646 glm::mat4 depthProjectionMatrix = glm::ortho<float>(-bound_R,bound_R,-bound_R,bound_R,-bound_R,bound_R);
-
3647 glm::mat4 depthViewMatrix = glm::lookAt(lightInvDir, view_center, glm::vec3(0,0,1));
-
3648 depthMVP = depthProjectionMatrix * depthViewMatrix;
-
3649
-
3650 depthShader.setTransformationMatrix( depthMVP );
-
3651
-
3652 //bind depth texture
-
3653 glActiveTexture(GL_TEXTURE1);
-
3654 glBindTexture(GL_TEXTURE_2D, depthTexture);
+
3599 if( !hide_window ) {
+
3600 glfwShowWindow((GLFWwindow *) window);
+
3601 }
+
3602
+
3603 //Update the Context geometry (if needed)
+
3604 if( contextGeomNeedsUpdate ){
+
3605 buildContextGeometry_private();
+
3606 }else{
+
3607 colormap_current.setRange( colorbar_min, colorbar_max );
+
3608 }
+
3609
+
3610 //Update
+
3611 if( colorbar_flag==2 ){
+
3612 addColorbarByCenter( colorbar_title.c_str(), colorbar_size, colorbar_position, colorbar_fontcolor, colormap_current );
+
3613 }
+
3614
+
3615 //Watermark
+
3616 if( isWatermarkVisible ){
+
3617 float hratio = float(Wdisplay)/float(Hdisplay);
+
3618 float width = 0.2389f/0.8f/hratio;
+
3619 addRectangleByCenter( make_vec3(0.75f*width,0.95f,0), make_vec2(width,0.07), make_SphericalCoord(0,0), "plugins/visualizer/textures/Helios_watermark.png", COORDINATES_WINDOW_NORMALIZED );
+
3620 }
+
3621
+
3622 setupPlot();
+
3623
+
3624 //domain bounding box
+
3625 vec2 xbounds, ybounds, zbounds;
+
3626 getDomainBoundingBox( xbounds, ybounds, zbounds );
+
3627
+
3628 glm::vec3 view_center = glm::vec3( xbounds.x+0.5*(xbounds.y-xbounds.x), ybounds.x+0.5*(ybounds.y-ybounds.x), zbounds.x+0.5*(zbounds.y-zbounds.x) );
+
3629 //float bound_R = 2.f*fmax(xbounds.y-xbounds.x,fmax(ybounds.y-ybounds.x,zbounds.y-zbounds.x));
+
3630 float bound_R = 0.75*sqrtf( pow(xbounds.y-xbounds.x,2) + pow(ybounds.y-ybounds.x,2) + pow(zbounds.y-zbounds.x,2) );
+
3631
+
3632 glm::vec3 lightInvDir = view_center + glm::vec3(light_direction.x,light_direction.y,light_direction.z);
+
3633
+
3634 bool shadow_flag = false;
+
3635 for( uint m=0; m<primaryLightingModel.size(); m++ ){
+
3636 if( primaryLightingModel.at(m) == Visualizer::LIGHTING_PHONG_SHADOWED ){
+
3637 shadow_flag = true;
+
3638 break;
+
3639 }
+
3640 }
+
3641
+
3642 glm::mat4 depthMVP;
+
3643
+
3644 if( shadow_flag ){
+
3645
+
3646 // Depth buffer for shadows
+
3647 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
+
3648 glViewport(0,0,8192,8192); // Render on the whole framebuffer, complete from the lower left corner to the upper right
+
3649 //glViewport(0,0,16384,16384); // Render on the whole framebuffer, complete from the lower left corner to the upper right
+
3650
+
3651 // Clear the screen
+
3652 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
3653
+
3654 depthShader.useShader();
3655
-
3656 depthShader.enableTextureMaps();
-
3657 depthShader.enableTextureMasks();
-
3658
-
3659 render( 1 );
+
3656 // Compute the MVP matrix from the light's point of view
+
3657 glm::mat4 depthProjectionMatrix = glm::ortho<float>(-bound_R,bound_R,-bound_R,bound_R,-bound_R,bound_R);
+
3658 glm::mat4 depthViewMatrix = glm::lookAt(lightInvDir, view_center, glm::vec3(0,0,1));
+
3659 depthMVP = depthProjectionMatrix * depthViewMatrix;
3660
-
3661 }else{
+
3661 depthShader.setTransformationMatrix( depthMVP );
3662
-
3663 depthMVP = glm::mat4(1.0);
-
3664
-
3665 }
+
3663 //bind depth texture
+
3664 glActiveTexture(GL_TEXTURE1);
+
3665 glBindTexture(GL_TEXTURE_2D, depthTexture);
3666
-
3667 assert(checkerrors());
-
3668
-
3669 // Render to the screen
-
3670 glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
3671 //glViewport(0,0,Wdisplay,Hdisplay); // Render on the whole framebuffer, complete from the lower left corner to the upper right
-
3672 glViewport(0,0,Wframebuffer,Hframebuffer);
+
3667 depthShader.enableTextureMaps();
+
3668 depthShader.enableTextureMasks();
+
3669
+
3670 render( 1 );
+
3671
+
3672 }else{
3673
-
3674 glClearColor(backgroundColor.r, backgroundColor.g, backgroundColor.b, 0.0f);
+
3674 depthMVP = glm::mat4(1.0);
3675
-
3676 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
3676 }
3677
-
3678 primaryShader.useShader();
+
3678 assert(checkerrors());
3679
-
3680 updatePerspectiveTransformation( camera_lookat_center, camera_eye_location );
-
3681
-
3682 glm::mat4 biasMatrix(
-
3683 0.5, 0.0, 0.0, 0.0,
-
3684 0.0, 0.5, 0.0, 0.0,
-
3685 0.0, 0.0, 0.5, 0.0,
-
3686 0.5, 0.5, 0.5, 1.0
-
3687 );
+
3680 // Render to the screen
+
3681 glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
3682 //glViewport(0,0,Wdisplay,Hdisplay); // Render on the whole framebuffer, complete from the lower left corner to the upper right
+
3683 glViewport(0,0,Wframebuffer,Hframebuffer);
+
3684
+
3685 glClearColor(backgroundColor.r, backgroundColor.g, backgroundColor.b, 0.0f);
+
3686
+
3687 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
3688
-
3689 glm::mat4 DepthBiasMVP = biasMatrix*depthMVP;
+
3689 primaryShader.useShader();
3690
-
3691 primaryShader.setDepthBiasMatrix( DepthBiasMVP );
+
3691 updatePerspectiveTransformation( camera_lookat_center, camera_eye_location );
3692
-
3693 primaryShader.setTransformationMatrix( perspectiveTransformationMatrix );
-
3694
-
3695 primaryShader.enableTextureMaps();
-
3696 primaryShader.enableTextureMasks();
-
3697
-
3698 primaryShader.setLightingModel( primaryLightingModel.at(0) );
-
3699 primaryShader.setLightIntensity( lightintensity );
-
3700
-
3701 glBindTexture(GL_TEXTURE_2D, depthTexture);
-
3702 glUniform1i(primaryShader.shadowmapUniform,1);
+
3693 glm::mat4 biasMatrix(
+
3694 0.5, 0.0, 0.0, 0.0,
+
3695 0.0, 0.5, 0.0, 0.0,
+
3696 0.0, 0.0, 0.5, 0.0,
+
3697 0.5, 0.5, 0.5, 1.0
+
3698 );
+
3699
+
3700 glm::mat4 DepthBiasMVP = biasMatrix*depthMVP;
+
3701
+
3702 primaryShader.setDepthBiasMatrix( DepthBiasMVP );
3703
-
3704 render( 0 );
+
3704 primaryShader.setTransformationMatrix( perspectiveTransformationMatrix );
3705
-
3706 glfwPollEvents();
-
3707 getViewKeystrokes( camera_eye_location, camera_lookat_center );
+
3706 primaryShader.enableTextureMaps();
+
3707 primaryShader.enableTextureMasks();
3708
-
3709 int width, height;
-
3710 glfwGetFramebufferSize((GLFWwindow *) window, &width, &height);
-
3711 Wframebuffer = width;
-
3712 Hframebuffer = height;
-
3713
-
3714 glfwSwapBuffers((GLFWwindow*)window);
-
3715
-
3716 if( message_flag ){
-
3717 std::cout << "done." << std::endl;
-
3718 }
+
3709 primaryShader.setLightingModel( primaryLightingModel.at(0) );
+
3710 primaryShader.setLightIntensity( lightintensity );
+
3711
+
3712 glBindTexture(GL_TEXTURE_2D, depthTexture);
+
3713 glUniform1i(primaryShader.shadowmapUniform,1);
+
3714
+
3715 render( 0 );
+
3716
+
3717 glfwPollEvents();
+
3718 getViewKeystrokes( camera_eye_location, camera_lookat_center );
3719
-
3720}
-
3721
- -
3723
-
3724 if( message_flag ){
-
3725 std::cout << "Rendering depth map..." << std::flush;
-
3726 }
-
3727
-
3728 //Update the Context geometry (if needed)
-
3729 if( contextGeomNeedsUpdate ){
-
3730 buildContextGeometry_private();
-
3731 }
+
3720 int width, height;
+
3721 glfwGetFramebufferSize((GLFWwindow *) window, &width, &height);
+
3722 Wframebuffer = width;
+
3723 Hframebuffer = height;
+
3724
+
3725 glfwSwapBuffers((GLFWwindow*)window);
+
3726
+
3727 if( message_flag ){
+
3728 std::cout << "done." << std::endl;
+
3729 }
+
3730
+
3731}
+
3732
-
3733 setupPlot();
+
+
3734
-
3735 //domain bounding box
-
3736 vec2 xbounds, ybounds, zbounds;
-
3737 getDomainBoundingBox( xbounds, ybounds, zbounds );
+
3735 if( message_flag ){
+
3736 std::cout << "Rendering depth map..." << std::flush;
+
3737 }
3738
-
3739 glm::vec3 view_center = glm::vec3( xbounds.x+0.5*(xbounds.y-xbounds.x), ybounds.x+0.5*(ybounds.y-ybounds.x), zbounds.x+0.5*(zbounds.y-zbounds.x) );
-
3740 float bound_R = 1.4f*0.5f*fmax(xbounds.y-xbounds.x,fmax(ybounds.y-ybounds.x,zbounds.y-zbounds.x));
-
3741
-
3742 glm::mat4 depthMVP;
+
3739 //Update the Context geometry (if needed)
+
3740 if( contextGeomNeedsUpdate ){
+
3741 buildContextGeometry_private();
+
3742 }
3743
-
3744 // Depth buffer for shadows
-
3745 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
-
3746 //glViewport(0,0, 8192, 8192); // Render on the whole framebuffer, complete from the lower left corner to the upper right
-
3747 //glViewport(0,0, Wdisplay, Hdisplay); // Render on the whole framebuffer, complete from the lower left corner to the upper right
-
3748 glViewport(0,0,Wframebuffer,Hframebuffer);
+
3744 setupPlot();
+
3745
+
3746 //domain bounding box
+
3747 vec2 xbounds, ybounds, zbounds;
+
3748 getDomainBoundingBox( xbounds, ybounds, zbounds );
3749
-
3750 //bind depth texture
-
3751 glActiveTexture(GL_TEXTURE1);
-
3752 glBindTexture(GL_TEXTURE_2D, depthTexture);
-
3753 //glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, Wdisplay, Hdisplay, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
-
3754 glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, Wframebuffer, Hframebuffer, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
-
3755
-
3756 // Clear the screen
-
3757 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-
3758
-
3759 depthShader.useShader();
+
3750 glm::vec3 view_center = glm::vec3( xbounds.x+0.5*(xbounds.y-xbounds.x), ybounds.x+0.5*(ybounds.y-ybounds.x), zbounds.x+0.5*(zbounds.y-zbounds.x) );
+
3751 float bound_R = 1.4f*0.5f*fmax(xbounds.y-xbounds.x,fmax(ybounds.y-ybounds.x,zbounds.y-zbounds.x));
+
3752
+
3753 glm::mat4 depthMVP;
+
3754
+
3755 // Depth buffer for shadows
+
3756 glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
+
3757 //glViewport(0,0, 8192, 8192); // Render on the whole framebuffer, complete from the lower left corner to the upper right
+
3758 //glViewport(0,0, Wdisplay, Hdisplay); // Render on the whole framebuffer, complete from the lower left corner to the upper right
+
3759 glViewport(0,0,Wframebuffer,Hframebuffer);
3760
-
3761 updatePerspectiveTransformation( camera_lookat_center, camera_eye_location );
-
3762 depthShader.setTransformationMatrix( perspectiveTransformationMatrix );
-
3763
-
3764 depthShader.enableTextureMaps();
-
3765 depthShader.enableTextureMasks();
+
3761 //bind depth texture
+
3762 glActiveTexture(GL_TEXTURE1);
+
3763 glBindTexture(GL_TEXTURE_2D, depthTexture);
+
3764 //glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, Wdisplay, Hdisplay, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
+
3765 glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, Wframebuffer, Hframebuffer, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
3766
-
3767 render( 1 );
-
3768
-
3769 assert(checkerrors());
-
3770
-
3771 depth_buffer_data.resize( Wframebuffer*Hframebuffer );
-
3772
-
3773 glfwSwapBuffers((GLFWwindow*)window);
-
3774 glReadPixels(0, 0, Wframebuffer, Hframebuffer, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_buffer_data[0] );
-
3775
-
3776 //depending on the active frame buffer, we may get all zero data and need to swap it again.
-
3777 bool zeros = true;
-
3778 for( int i=0; i<3*Wframebuffer*Hframebuffer; i++){
-
3779 if( depth_buffer_data[i]!=0 ){
-
3780 zeros = false;
-
3781 }
-
3782 }
-
3783 if( zeros ){
-
3784
-
3785 glfwSwapBuffers((GLFWwindow*)window);
+
3767 // Clear the screen
+
3768 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
3769
+
3770 depthShader.useShader();
+
3771
+
3772 updatePerspectiveTransformation( camera_lookat_center, camera_eye_location );
+
3773 depthShader.setTransformationMatrix( perspectiveTransformationMatrix );
+
3774
+
3775 depthShader.enableTextureMaps();
+
3776 depthShader.enableTextureMasks();
+
3777
+
3778 render( 1 );
+
3779
+
3780 assert(checkerrors());
+
3781
+
3782 depth_buffer_data.resize( Wframebuffer*Hframebuffer );
+
3783
+
3784 glfwSwapBuffers((GLFWwindow*)window);
+
3785 glReadPixels(0, 0, Wframebuffer, Hframebuffer, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_buffer_data[0] );
3786
-
3787 glReadPixels(0, 0, Wframebuffer, Hframebuffer, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_buffer_data[0] );
-
3788
-
3789 }
-
3790
-
3791 assert(checkerrors());
-
3792
-
3793 glEnableVertexAttribArray(0); //position
-
3794 glEnableVertexAttribArray(1); //color
-
3795 glDisableVertexAttribArray(2); //normal
-
3796 glEnableVertexAttribArray(3); //uv
-
3797 glEnableVertexAttribArray(4); //texture flag
-
3798 glEnableVertexAttribArray(5); //coordinate flag
+
3787 //depending on the active frame buffer, we may get all zero data and need to swap it again.
+
3788 bool zeros = true;
+
3789 for( int i=0; i<3*Wframebuffer*Hframebuffer; i++){
+
3790 if( depth_buffer_data[i]!=0 ){
+
3791 zeros = false;
+
3792 }
+
3793 }
+
3794 if( zeros ){
+
3795
+
3796 glfwSwapBuffers((GLFWwindow*)window);
+
3797
+
3798 glReadPixels(0, 0, Wframebuffer, Hframebuffer, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_buffer_data[0] );
3799
-
3800 std::vector<float> position_data, color_data, normal_data, uv_data;
-
3801 std::vector<int> coordinate_data, texture_data;
-
3802
-
3803 position_data.assign(12,0);
-
3804 color_data.assign(16,0);
-
3805 normal_data.assign(12,0);
-
3806 uv_data.assign(8,0);
-
3807 coordinate_data.assign(4,0);
-
3808 texture_data.assign(4,0);
-
3809
-
3810 position_data[0] = -1;
-
3811 position_data[1] = 1;
-
3812 position_data[2] = 0;
-
3813 uv_data[0] = 0;
-
3814 uv_data[1] = 1;
-
3815 color_data[0] = 1;
-
3816 color_data[1] = 0;
-
3817 color_data[2] = 0;
-
3818 color_data[3] = 1;
-
3819 texture_data[0] = 4;
-
3820 coordinate_data[0] = 0;
-
3821
-
3822 position_data[3] = 1;
-
3823 position_data[4] = 1;
-
3824 position_data[5] = 0;
-
3825 uv_data[2] = 1;
-
3826 uv_data[3] = 1;
-
3827 color_data[4] = 1;
-
3828 color_data[5] = 0;
-
3829 color_data[6] = 0;
-
3830 color_data[7] = 1;
-
3831 texture_data[1] = 4;
-
3832 coordinate_data[1] = 0;
-
3833
-
3834 position_data[6] = 1;
-
3835 position_data[7] = -1;
-
3836 position_data[8] = 0;
-
3837 uv_data[4] = 1;
-
3838 uv_data[5] = 0;
-
3839 color_data[8] = 1;
-
3840 color_data[9] = 0;
-
3841 color_data[10] = 0;
-
3842 color_data[11] = 1;
-
3843 texture_data[2] = 4;
-
3844 coordinate_data[2] = 0;
-
3845
-
3846 position_data[9] = -1;
-
3847 position_data[10] = -1;
-
3848 position_data[11] = 0;
-
3849 uv_data[6] = 0;
-
3850 uv_data[7] = 0;
-
3851 color_data[12] = 1;
-
3852 color_data[13] = 0;
-
3853 color_data[14] = 0;
-
3854 color_data[15] = 1;
-
3855 texture_data[3] = 4;
-
3856 coordinate_data[3] = 0;
-
3857
-
3858 // 1st attribute buffer : vertex positions
-
3859 glBindBuffer(GL_ARRAY_BUFFER, positionBuffer );
-
3860 glBufferData(GL_ARRAY_BUFFER, position_data.size()*sizeof(GLfloat), &position_data[0], GL_STATIC_DRAW);
-
3861 glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
-
3862
-
3863 // 2nd attribute buffer : vertex colors
-
3864 glBindBuffer(GL_ARRAY_BUFFER, colorBuffer );
-
3865 glBufferData(GL_ARRAY_BUFFER, color_data.size()*sizeof(GLfloat), &color_data[0], GL_STATIC_DRAW);
-
3866 glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, 0, (void*)0 );
-
3867
-
3868 // 4th attribute buffer : vertex uv
-
3869 glBindBuffer(GL_ARRAY_BUFFER, uvBuffer );
-
3870 glBufferData(GL_ARRAY_BUFFER, uv_data.size()*sizeof(GLfloat), &uv_data[0], GL_STATIC_DRAW);
-
3871 glVertexAttribPointer( 3, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );
-
3872
-
3873 // 5th attribute buffer : vertex texture flag
-
3874 glBindBuffer(GL_ARRAY_BUFFER, textureFlagBuffer );
-
3875 glBufferData(GL_ARRAY_BUFFER, texture_data.size()*sizeof(GLint), &texture_data[0], GL_STATIC_DRAW);
-
3876 glVertexAttribIPointer( 4, 1, GL_INT, 0, (void*)0 );
-
3877
-
3878 // 6th attribute buffer : vertex coordinate flag
-
3879 glBindBuffer(GL_ARRAY_BUFFER, coordinateFlagBuffer );
-
3880 glBufferData(GL_ARRAY_BUFFER, coordinate_data.size()*sizeof(GLint), &coordinate_data[0], GL_STATIC_DRAW);
-
3881 glVertexAttribIPointer( 5, 1, GL_INT, 0, (void*)0 );
-
3882
+
3800 }
+
3801
+
3802 assert(checkerrors());
+
3803
+
3804 glEnableVertexAttribArray(0); //position
+
3805 glEnableVertexAttribArray(1); //color
+
3806 glDisableVertexAttribArray(2); //normal
+
3807 glEnableVertexAttribArray(3); //uv
+
3808 glEnableVertexAttribArray(4); //texture flag
+
3809 glEnableVertexAttribArray(5); //coordinate flag
+
3810
+
3811 std::vector<float> position_data, color_data, normal_data, uv_data;
+
3812 std::vector<int> coordinate_data, texture_data;
+
3813
+
3814 position_data.assign(12,0);
+
3815 color_data.assign(16,0);
+
3816 normal_data.assign(12,0);
+
3817 uv_data.assign(8,0);
+
3818 coordinate_data.assign(4,0);
+
3819 texture_data.assign(4,0);
+
3820
+
3821 position_data[0] = -1;
+
3822 position_data[1] = 1;
+
3823 position_data[2] = 0;
+
3824 uv_data[0] = 0;
+
3825 uv_data[1] = 1;
+
3826 color_data[0] = 1;
+
3827 color_data[1] = 0;
+
3828 color_data[2] = 0;
+
3829 color_data[3] = 1;
+
3830 texture_data[0] = 4;
+
3831 coordinate_data[0] = 0;
+
3832
+
3833 position_data[3] = 1;
+
3834 position_data[4] = 1;
+
3835 position_data[5] = 0;
+
3836 uv_data[2] = 1;
+
3837 uv_data[3] = 1;
+
3838 color_data[4] = 1;
+
3839 color_data[5] = 0;
+
3840 color_data[6] = 0;
+
3841 color_data[7] = 1;
+
3842 texture_data[1] = 4;
+
3843 coordinate_data[1] = 0;
+
3844
+
3845 position_data[6] = 1;
+
3846 position_data[7] = -1;
+
3847 position_data[8] = 0;
+
3848 uv_data[4] = 1;
+
3849 uv_data[5] = 0;
+
3850 color_data[8] = 1;
+
3851 color_data[9] = 0;
+
3852 color_data[10] = 0;
+
3853 color_data[11] = 1;
+
3854 texture_data[2] = 4;
+
3855 coordinate_data[2] = 0;
+
3856
+
3857 position_data[9] = -1;
+
3858 position_data[10] = -1;
+
3859 position_data[11] = 0;
+
3860 uv_data[6] = 0;
+
3861 uv_data[7] = 0;
+
3862 color_data[12] = 1;
+
3863 color_data[13] = 0;
+
3864 color_data[14] = 0;
+
3865 color_data[15] = 1;
+
3866 texture_data[3] = 4;
+
3867 coordinate_data[3] = 0;
+
3868
+
3869 // 1st attribute buffer : vertex positions
+
3870 glBindBuffer(GL_ARRAY_BUFFER, positionBuffer );
+
3871 glBufferData(GL_ARRAY_BUFFER, position_data.size()*sizeof(GLfloat), &position_data[0], GL_STATIC_DRAW);
+
3872 glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
+
3873
+
3874 // 2nd attribute buffer : vertex colors
+
3875 glBindBuffer(GL_ARRAY_BUFFER, colorBuffer );
+
3876 glBufferData(GL_ARRAY_BUFFER, color_data.size()*sizeof(GLfloat), &color_data[0], GL_STATIC_DRAW);
+
3877 glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, 0, (void*)0 );
+
3878
+
3879 // 4th attribute buffer : vertex uv
+
3880 glBindBuffer(GL_ARRAY_BUFFER, uvBuffer );
+
3881 glBufferData(GL_ARRAY_BUFFER, uv_data.size()*sizeof(GLfloat), &uv_data[0], GL_STATIC_DRAW);
+
3882 glVertexAttribPointer( 3, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );
3883
-
3884 //do{
-
3885
-
3886 // Render to the screen
-
3887 glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
3888 //glViewport(0,0,Wdisplay,Hdisplay); // Render on the whole framebuffer, complete from the lower left corner to the upper right
-
3889 glViewport(0,0,Wframebuffer,Hframebuffer);
-
3890
-
3891 glClearColor(0,0,0, 0.0f);
-
3892
-
3893 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
3884 // 5th attribute buffer : vertex texture flag
+
3885 glBindBuffer(GL_ARRAY_BUFFER, textureFlagBuffer );
+
3886 glBufferData(GL_ARRAY_BUFFER, texture_data.size()*sizeof(GLint), &texture_data[0], GL_STATIC_DRAW);
+
3887 glVertexAttribIPointer( 4, 1, GL_INT, 0, (void*)0 );
+
3888
+
3889 // 6th attribute buffer : vertex coordinate flag
+
3890 glBindBuffer(GL_ARRAY_BUFFER, coordinateFlagBuffer );
+
3891 glBufferData(GL_ARRAY_BUFFER, coordinate_data.size()*sizeof(GLint), &coordinate_data[0], GL_STATIC_DRAW);
+
3892 glVertexAttribIPointer( 5, 1, GL_INT, 0, (void*)0 );
+
3893
3894
-
3895 primaryShader.useShader();
+
3895 //do{
3896
-
3897 primaryShader.enableTextureMaps();
-
3898 primaryShader.enableTextureMasks();
-
3899
-
3900 primaryShader.setLightingModel( LIGHTING_NONE );
+
3897 // Render to the screen
+
3898 glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
3899 //glViewport(0,0,Wdisplay,Hdisplay); // Render on the whole framebuffer, complete from the lower left corner to the upper right
+
3900 glViewport(0,0,Wframebuffer,Hframebuffer);
3901
-
3902 glActiveTexture(GL_TEXTURE1);
-
3903 glBindTexture(GL_TEXTURE_2D, depthTexture);
-
3904
-
3905 glUniform1i(primaryShader.RboundUniform,bound_R);
-
3906
-
3907 glDrawArrays(GL_TRIANGLE_FAN, 0, 4 );
-
3908
-
3909 glfwSwapBuffers((GLFWwindow*)window);
+
3902 glClearColor(0,0,0, 0.0f);
+
3903
+
3904 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
3905
+
3906 primaryShader.useShader();
+
3907
+
3908 primaryShader.enableTextureMaps();
+
3909 primaryShader.enableTextureMasks();
3910
-
3911 //glfwWaitEvents();
-
3912 //}while( glfwGetKey((GLFWwindow*)window, GLFW_KEY_ESCAPE ) != GLFW_PRESS && glfwWindowShouldClose((GLFWwindow*)window) == 0 );
-
3913
-
3914 if( message_flag ){
-
3915 std::cout << "done." << std::endl;
-
3916 }
+
3911 primaryShader.setLightingModel( LIGHTING_NONE );
+
3912
+
3913 glActiveTexture(GL_TEXTURE1);
+
3914 glBindTexture(GL_TEXTURE_2D, depthTexture);
+
3915
+
3916 glUniform1i(primaryShader.RboundUniform,bound_R);
3917
-
3918}
+
3918 glDrawArrays(GL_TRIANGLE_FAN, 0, 4 );
3919
-
3920void Shader::initialize( const char* vertex_shader_file, const char* fragment_shader_file ){
+
3920 glfwSwapBuffers((GLFWwindow*)window);
3921
-
3922 // ~~~~~~~~~~~~~~~ COMPILE SHADERS ~~~~~~~~~~~~~~~~~~~~~~~~~//
-
3923
-
3924 assert(checkerrors());
-
3925
-
3926 // Create the shaders
-
3927 unsigned int VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
-
3928 unsigned int FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
-
3929
-
3930 // Read the Vertex Shader code from the file
-
3931 std::string VertexShaderCode;
-
3932 std::ifstream VertexShaderStream(vertex_shader_file, std::ios::in);
-
3933 assert(VertexShaderStream.is_open());
-
3934 std::string Line = "";
-
3935 while(getline(VertexShaderStream, Line))
-
3936 VertexShaderCode += "\n" + Line;
-
3937 VertexShaderStream.close();
-
3938
-
3939 // Read the Fragment Shader code from the file
-
3940 std::string FragmentShaderCode;
-
3941 std::ifstream FragmentShaderStream(fragment_shader_file, std::ios::in);
-
3942 assert(FragmentShaderStream.is_open());
-
3943 Line = "";
-
3944 while(getline(FragmentShaderStream, Line))
-
3945 FragmentShaderCode += "\n" + Line;
-
3946 FragmentShaderStream.close();
-
3947
-
3948 int Result = GL_FALSE;
-
3949 int InfoLogLength;
-
3950
-
3951 // Compile Vertex Shader
-
3952 char const * VertexSourcePointer = VertexShaderCode.c_str();
-
3953 glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
-
3954 glCompileShader(VertexShaderID);
-
3955
-
3956 assert(checkerrors());
-
3957
-
3958 // Check Vertex Shader
-
3959 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
-
3960 glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
-
3961 std::vector<char> VertexShaderErrorMessage(InfoLogLength);
-
3962 if( !VertexShaderErrorMessage.empty() ) {
-
3963 glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
-
3964 }
-
3965 int success = 0;
-
3966 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &success);
-
3967 if( success==GL_FALSE ){
-
3968 fprintf(stderr, "%s\n", &VertexShaderErrorMessage[0]);
-
3969 throw(1);
-
3970 }
-
3971
-
3972 // Compile Fragment Shader
-
3973 char const * FragmentSourcePointer = FragmentShaderCode.c_str();
-
3974 glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);
-
3975 glCompileShader(FragmentShaderID);
-
3976
-
3977 assert(checkerrors());
-
3978
-
3979 // Check Fragment Shader
-
3980 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
-
3981 glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
-
3982 std::vector<char> FragmentShaderErrorMessage(InfoLogLength);
-
3983 if( !VertexShaderErrorMessage.empty() ) {
-
3984 glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
-
3985 }
-
3986 success = 0;
-
3987 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &success);
-
3988 if( success==GL_FALSE ){
-
3989 fprintf(stderr, "%s\n", &FragmentShaderErrorMessage[0]);
-
3990 throw(1);
-
3991 }
-
3992
-
3993 // Link the program
-
3994 shaderID = glCreateProgram();
-
3995 glAttachShader(shaderID, VertexShaderID);
-
3996 glAttachShader(shaderID, FragmentShaderID);
-
3997 glLinkProgram(shaderID);
-
3998
-
3999 assert(checkerrors());
-
4000
-
4001 // Check the program
-
4002 glGetProgramiv(shaderID, GL_LINK_STATUS, &Result);
-
4003 glGetProgramiv(shaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
-
4004 std::vector<char> ProgramErrorMessage( std::max(InfoLogLength, int(1)) );
-
4005 glGetProgramInfoLog(shaderID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
-
4006 if( isspace( ProgramErrorMessage[0] ) ){
-
4007 fprintf(stderr, "%s\n", &ProgramErrorMessage[0]);
-
4008 throw(1);
-
4009 }
-
4010
-
4011 assert(checkerrors());
-
4012
-
4013 glDeleteShader(VertexShaderID);
-
4014 glDeleteShader(FragmentShaderID);
-
4015
-
4016 assert(checkerrors());
-
4017
-
4018 glUseProgram(shaderID);
-
4019
-
4020 assert(checkerrors());
+
3922 //glfwWaitEvents();
+
3923 //}while( glfwGetKey((GLFWwindow*)window, GLFW_KEY_ESCAPE ) != GLFW_PRESS && glfwWindowShouldClose((GLFWwindow*)window) == 0 );
+
3924
+
3925 if( message_flag ){
+
3926 std::cout << "done." << std::endl;
+
3927 }
+
3928
+
3929}
+
+
3930
+
+
3931void Shader::initialize( const char* vertex_shader_file, const char* fragment_shader_file ){
+
3932
+
3933 // ~~~~~~~~~~~~~~~ COMPILE SHADERS ~~~~~~~~~~~~~~~~~~~~~~~~~//
+
3934
+
3935 assert(checkerrors());
+
3936
+
3937 // Create the shaders
+
3938 unsigned int VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
+
3939 unsigned int FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
+
3940
+
3941 // Read the Vertex Shader code from the file
+
3942 std::string VertexShaderCode;
+
3943 std::ifstream VertexShaderStream(vertex_shader_file, std::ios::in);
+
3944 assert(VertexShaderStream.is_open());
+
3945 std::string Line = "";
+
3946 while(getline(VertexShaderStream, Line))
+
3947 VertexShaderCode += "\n" + Line;
+
3948 VertexShaderStream.close();
+
3949
+
3950 // Read the Fragment Shader code from the file
+
3951 std::string FragmentShaderCode;
+
3952 std::ifstream FragmentShaderStream(fragment_shader_file, std::ios::in);
+
3953 assert(FragmentShaderStream.is_open());
+
3954 Line = "";
+
3955 while(getline(FragmentShaderStream, Line))
+
3956 FragmentShaderCode += "\n" + Line;
+
3957 FragmentShaderStream.close();
+
3958
+
3959 int Result = GL_FALSE;
+
3960 int InfoLogLength;
+
3961
+
3962 // Compile Vertex Shader
+
3963 char const * VertexSourcePointer = VertexShaderCode.c_str();
+
3964 glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
+
3965 glCompileShader(VertexShaderID);
+
3966
+
3967 assert(checkerrors());
+
3968
+
3969 // Check Vertex Shader
+
3970 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
+
3971 glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
+
3972 std::vector<char> VertexShaderErrorMessage(InfoLogLength);
+
3973 if( !VertexShaderErrorMessage.empty() ) {
+
3974 glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
+
3975 }
+
3976 int success = 0;
+
3977 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &success);
+
3978 if( success==GL_FALSE ){
+
3979 fprintf(stderr, "%s\n", &VertexShaderErrorMessage[0]);
+
3980 throw(1);
+
3981 }
+
3982
+
3983 // Compile Fragment Shader
+
3984 char const * FragmentSourcePointer = FragmentShaderCode.c_str();
+
3985 glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);
+
3986 glCompileShader(FragmentShaderID);
+
3987
+
3988 assert(checkerrors());
+
3989
+
3990 // Check Fragment Shader
+
3991 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
+
3992 glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
+
3993 std::vector<char> FragmentShaderErrorMessage(InfoLogLength);
+
3994 if( !VertexShaderErrorMessage.empty() ) {
+
3995 glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
+
3996 }
+
3997 success = 0;
+
3998 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &success);
+
3999 if( success==GL_FALSE ){
+
4000 fprintf(stderr, "%s\n", &FragmentShaderErrorMessage[0]);
+
4001 throw(1);
+
4002 }
+
4003
+
4004 // Link the program
+
4005 shaderID = glCreateProgram();
+
4006 glAttachShader(shaderID, VertexShaderID);
+
4007 glAttachShader(shaderID, FragmentShaderID);
+
4008 glLinkProgram(shaderID);
+
4009
+
4010 assert(checkerrors());
+
4011
+
4012 // Check the program
+
4013 glGetProgramiv(shaderID, GL_LINK_STATUS, &Result);
+
4014 glGetProgramiv(shaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
+
4015 std::vector<char> ProgramErrorMessage( std::max(InfoLogLength, int(1)) );
+
4016 glGetProgramInfoLog(shaderID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
+
4017 if( isspace( ProgramErrorMessage[0] ) ){
+
4018 fprintf(stderr, "%s\n", &ProgramErrorMessage[0]);
+
4019 throw(1);
+
4020 }
4021
-
4022 // ~~~~~~~~~~~ Create a Vertex Array Object (VAO) ~~~~~~~~~~//
-
4023 glGenVertexArrays(1, &VertexArrayID);
-
4024 glBindVertexArray(VertexArrayID);
-
4025
-
4026 assert(checkerrors());
-
4027
-
4028 // ~~~~~~~~~~~ Primary Shader Uniforms ~~~~~~~~~~//
-
4029
-
4030 //Transformation Matrix
-
4031 transformMatrixUniform = glGetUniformLocation(shaderID, "MVP");
+
4022 assert(checkerrors());
+
4023
+
4024 glDeleteShader(VertexShaderID);
+
4025 glDeleteShader(FragmentShaderID);
+
4026
+
4027 assert(checkerrors());
+
4028
+
4029 glUseProgram(shaderID);
+
4030
+
4031 assert(checkerrors());
4032
-
4033 //Depth Bias Matrix (for shadows)
-
4034 depthBiasUniform = glGetUniformLocation(shaderID, "DepthBiasMVP");
-
4035
-
4036 //Texture Sampler
-
4037 textureUniform = glGetUniformLocation(shaderID, "textureSampler");
-
4038 glUniform1i(textureUniform,0); //tell shader we are using GL_TEXTURE0
-
4039
-
4040 //Shadow Map Sampler
-
4041 shadowmapUniform = glGetUniformLocation(shaderID, "shadowMap");
-
4042 glUniform1i(shadowmapUniform, 1);
+
4033 // ~~~~~~~~~~~ Create a Vertex Array Object (VAO) ~~~~~~~~~~//
+
4034 glGenVertexArrays(1, &VertexArrayID);
+
4035 glBindVertexArray(VertexArrayID);
+
4036
+
4037 assert(checkerrors());
+
4038
+
4039 // ~~~~~~~~~~~ Primary Shader Uniforms ~~~~~~~~~~//
+
4040
+
4041 //Transformation Matrix
+
4042 transformMatrixUniform = glGetUniformLocation(shaderID, "MVP");
4043
-
4044 //Flag to tell how to shade fragments. See also: setTextureMap, setMaskTexture, disableTextures
-
4045 //textureFlagUniform = glGetUniformLocation(shaderID, "textureFlag");
-
4046 //glUniform1i(textureFlagUniform,0); //Default is zero, which is to disable textures
-
4047
-
4048 //Unit vector in the direction of the light (sun)
-
4049 lightDirectionUniform = glGetUniformLocation(shaderID, "lightDirection" );
-
4050 glUniform3f( lightDirectionUniform, 0, 0, 1 ); //Default is directly above
-
4051
-
4052 //Lighting model used for shading primitives
-
4053 lightingModelUniform = glGetUniformLocation(shaderID, "lightingModel" );
-
4054 glUniform1i( lightingModelUniform, 0 ); //Default is none
-
4055
-
4056 RboundUniform = glGetUniformLocation(shaderID, "Rbound");
-
4057 glUniform1i(RboundUniform,0);
+
4044 //Depth Bias Matrix (for shadows)
+
4045 depthBiasUniform = glGetUniformLocation(shaderID, "DepthBiasMVP");
+
4046
+
4047 //Texture Sampler
+
4048 textureUniform = glGetUniformLocation(shaderID, "textureSampler");
+
4049 glUniform1i(textureUniform,0); //tell shader we are using GL_TEXTURE0
+
4050
+
4051 //Shadow Map Sampler
+
4052 shadowmapUniform = glGetUniformLocation(shaderID, "shadowMap");
+
4053 glUniform1i(shadowmapUniform, 1);
+
4054
+
4055 //Flag to tell how to shade fragments. See also: setTextureMap, setMaskTexture, disableTextures
+
4056 //textureFlagUniform = glGetUniformLocation(shaderID, "textureFlag");
+
4057 //glUniform1i(textureFlagUniform,0); //Default is zero, which is to disable textures
4058
-
4059 //Lighting intensity factor
-
4060 lightIntensityUniform = glGetUniformLocation(shaderID, "lightIntensity" );
-
4061 glUniform1f( lightIntensityUniform, 1.f );
+
4059 //Unit vector in the direction of the light (sun)
+
4060 lightDirectionUniform = glGetUniformLocation(shaderID, "lightDirection" );
+
4061 glUniform3f( lightDirectionUniform, 0, 0, 1 ); //Default is directly above
4062
-
4063 //initialize default texture in case none are added to the scene
-
4064 glBindTexture(GL_TEXTURE_RECTANGLE,0);
-
4065 glTexImage2D(GL_TEXTURE_RECTANGLE, 0,GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+
4063 //Lighting model used for shading primitives
+
4064 lightingModelUniform = glGetUniformLocation(shaderID, "lightingModel" );
+
4065 glUniform1i( lightingModelUniform, 0 ); //Default is none
4066
-
4067 assert(checkerrors());
-
4068
-
4069}
-
4070
-
4071Shader::~Shader( void ){
-
4072 glDeleteVertexArrays( 1, &VertexArrayID);
-
4073 glDeleteProgram(shaderID);
-
4074}
-
4075
- -
4077 glEnable(GL_BLEND);
-
4078 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
4079}
-
4080
-
4081void Shader::setTextureMap( const char* texture_file, uint& textureID, int2& texture_size ){
-
4082
-
4083 //Check if the file exists
-
4084 std::ifstream f(texture_file);
-
4085 assert( f.good() );
-
4086 f.close();
-
4087
-
4088 //Check if this texture has already been added to the shader
-
4089 //Note: if the texture_file is empy, it will automatically load a new texture
-
4090 for( uint i=0; i<textureMapFiles.size(); i++ ){
-
4091 if( textureMapFiles.at(i)==texture_file && strlen(texture_file)>0 ){
-
4092 textureID = textureMaps.at(i); //copy the handle
-
4093 texture_size = textureSizes.at(i); //copy the size
-
4094 return;
-
4095 }
-
4096 }
-
4097
-
4098 //--- Load the Texture ----//
-
4099
-
4100 int Nchannels=3;
-
4101 std::vector<unsigned char> texture;
-
4102 uint texture_height, texture_width;
-
4103 std::string file = texture_file;
-
4104 if(file.substr(file.find_last_of('.') + 1) == "jpg" || file.substr(file.find_last_of('.') + 1) == "jpeg" ){
-
4105 read_JPEG_file (texture_file,texture,texture_height,texture_width);
-
4106 } else if(file.substr(file.find_last_of('.') + 1) == "png") {
-
4107 read_png_file (texture_file,texture,texture_height,texture_width);
-
4108 }else {
-
4109 assert(false);
-
4110 }
-
4111
-
4112 texture_size = make_int2( texture_width, texture_height );
-
4113
-
4114 //Find next power of two up from size
-
4115 int POT = 0;
-
4116 while( pow(2,POT)<texture_size.x ){
-
4117 POT++;
-
4118 }
-
4119 int2 texture_size_POT = make_int2( int(pow(2,POT)), texture_size.y );
-
4120
-
4121 //OpenGL is a pain, so we need to pad the first dimension of the texture so that it size is a power of two
-
4122 std::vector<unsigned char> texture_;
-
4123 texture_.resize(texture_size_POT.y*texture_size_POT.x*4);
-
4124 for( int i=0; i<texture_size_POT.y*texture_size_POT.x*4; i++ ){
-
4125 texture_.at(i) = 0;
-
4126 }
-
4127 for(int j=0;j<texture_size.y;j++){
-
4128 for(int i=0;i<texture_size.x;i++){
-
4129 for( int c=0; c<4; c++ ){
-
4130 texture_[c+i*4+j*texture_size_POT.x*4] = texture[ c + i*4 + j*texture_size.x*4 ];
-
4131 }
-
4132 }
-
4133 }
-
4134 for(int j=texture_size.y-1; j<texture_size_POT.y; j++){
-
4135 for(int i=texture_size.x-1; i<texture_size_POT.x; i++){
-
4136 for( int c=0; c<4; c++ ){
-
4137 texture_[c+i*4+j*texture_size_POT.x*4] = 255.f;
-
4138 }
-
4139 }
-
4140 }
-
4141
-
4142 unsigned char* texture_ptr = &texture_[0];
-
4143
-
4144 glGenTextures(1, &textureID);
-
4145
-
4146 glActiveTexture(GL_TEXTURE0);
-
4147 glBindTexture(GL_TEXTURE_RECTANGLE,textureID);
-
4148 glTexImage2D(GL_TEXTURE_RECTANGLE, 0,GL_RGBA, texture_size_POT.x, texture_size_POT.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_ptr);
-
4149 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
4150 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
4151 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-
4152 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
4153
-
4154 textureMaps.push_back(textureID);
-
4155 textureSizes.push_back(texture_size);
-
4156 textureMapFiles.push_back(texture_file);
-
4157
-
4158}
-
4159
- -
4161 glActiveTexture(GL_TEXTURE0);
-
4162 glUniform1i(textureUniform,0);
-
4163 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
4164 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
4165 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
4166 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
4167 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
4168 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
4169 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-
4170 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
4171 glEnable(GL_BLEND);
-
4172 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
4173}
-
4174
-
4175
-
4176void Shader::setTextureMask( const Glyph* glyph, uint& textureID ){
-
4177
-
4178 int2 texture_size = glyph->size;
-
4179
-
4180 //Check if this texture has already been added to the shader
-
4181 for( uint i=0; i<textureMaskFiles.size(); i++ ){
-
4182 if( textureMaskFiles.at(i).compare(glyph->filename)==0 ){
-
4183 textureID = textureMasks.at(i); //copy the handle
-
4184 return;
-
4185 }
-
4186 }
-
4187
-
4188 //OpenGL is a pain, so we need to pad the first dimension of the texture so that it size is a power of two
-
4189 int POT = 0;
-
4190 while( pow(2,POT)<texture_size.x ){
-
4191 POT++;
-
4192 }
-
4193 int2 texture_size_POT = make_int2( pow(2,POT), texture_size.y );
-
4194
-
4195 std::vector<unsigned char> texture(texture_size_POT.x*texture_size_POT.y);
-
4196 for(int j=0;j<texture_size.y;j++){
-
4197 for(int i=0;i<texture_size.x;i++){
-
4198 texture[i+j*texture_size_POT.x]=glyph->data.at(j).at(i);
-
4199 }
-
4200 }
-
4201 unsigned char* texture_ptr = &texture[0];
-
4202
-
4203 glGenTextures(1, &textureID);
-
4204
-
4205 glActiveTexture(GL_TEXTURE0);
-
4206 glBindTexture(GL_TEXTURE_RECTANGLE,textureID);
-
4207 glTexImage2D(GL_TEXTURE_RECTANGLE, 0,GL_RED, texture_size_POT.x, texture_size_POT.y, 0, GL_RED, GL_UNSIGNED_BYTE, texture_ptr);
-
4208 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
4209 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
4210 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-
4211 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
4212
-
4213 if( strlen(glyph->filename)>0 ){
-
4214 textureMasks.push_back(textureID);
-
4215 textureMaskFiles.push_back(glyph->filename);
-
4216 }
-
4217
-
4218}
-
4219
-
4220void Shader::setTextureMask( const char* texture_file, uint& textureID, int2& texture_size ){
-
4221
-
4222 //Check if this texture has already been added to the shader
-
4223 //Note: if the texture_file is empy, it will automatically load a new texture
-
4224 for( uint i=0; i<textureMapFiles.size(); i++ ){
-
4225 if( textureMapFiles.at(i).compare(texture_file)==0 && strlen(texture_file)>0 ){
-
4226 textureID = textureMaps.at(i); //copy the handle
-
4227 texture_size = textureSizes.at(i); //copy the size
-
4228 return;
-
4229 }
-
4230 }
-
4231
-
4232 //--- Load the Texture ----//
-
4233
-
4234 int Nchannels=3;
-
4235 std::vector<unsigned char> texture;
-
4236 uint texture_height, texture_width;
-
4237 std::string file = texture_file;
-
4238 if(file.substr(file.find_last_of(".") + 1) == "png") {
-
4239 read_png_file (texture_file,texture,texture_height,texture_width);
-
4240 }else {
-
4241 std::cerr << "ERROR: texture mask file " << texture_file << " must be a PNG image." << std::endl;
-
4242 }
-
4243
-
4244 texture_size = make_int2( texture_width, texture_height );
-
4245
-
4246 //Find next power of two up from size
-
4247 int POT = 0;
-
4248 while( pow(2,POT)<texture_size.x ){
-
4249 POT++;
-
4250 }
-
4251 int2 texture_size_POT = make_int2( int(pow(2,POT)), texture_size.y );
-
4252
-
4253 //OpenGL is a pain, so we need to pad the first dimension of the texture so that it size is a power of two
-
4254 std::vector<unsigned char> texture_;
-
4255 texture_.assign(texture_size_POT.y*texture_size_POT.x,0);
-
4256 for(int j=0;j<texture_size.y;j++){
-
4257 for(int i=0;i<texture_size.x;i++){
-
4258 texture_[j*texture_size_POT.x+i] = texture[ 3 + i*4 + j*texture_size.x*4 ];
-
4259 }
-
4260 }
-
4261
-
4262 unsigned char* texture_ptr = &texture_[0];
+
4067 RboundUniform = glGetUniformLocation(shaderID, "Rbound");
+
4068 glUniform1i(RboundUniform,0);
+
4069
+
4070 //Lighting intensity factor
+
4071 lightIntensityUniform = glGetUniformLocation(shaderID, "lightIntensity" );
+
4072 glUniform1f( lightIntensityUniform, 1.f );
+
4073
+
4074 //initialize default texture in case none are added to the scene
+
4075 glBindTexture(GL_TEXTURE_RECTANGLE,0);
+
4076 glTexImage2D(GL_TEXTURE_RECTANGLE, 0,GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+
4077
+
4078 assert(checkerrors());
+
4079
+
4080}
+
+
4081
+
4082Shader::~Shader( void ){
+
4083 glDeleteVertexArrays( 1, &VertexArrayID);
+
4084 glDeleteProgram(shaderID);
+
4085}
+
4086
+
+ +
4088 glEnable(GL_BLEND);
+
4089 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
4090}
+
+
4091
+
+
4092void Shader::setTextureMap( const char* texture_file, uint& textureID, int2& texture_size ){
+
4093
+
4094 //Check if the file exists
+
4095 std::ifstream f(texture_file);
+
4096 assert( f.good() );
+
4097 f.close();
+
4098
+
4099 //Check if this texture has already been added to the shader
+
4100 //Note: if the texture_file is empy, it will automatically load a new texture
+
4101 for( uint i=0; i<textureMapFiles.size(); i++ ){
+
4102 if( textureMapFiles.at(i)==texture_file && strlen(texture_file)>0 ){
+
4103 textureID = textureMaps.at(i); //copy the handle
+
4104 texture_size = textureSizes.at(i); //copy the size
+
4105 return;
+
4106 }
+
4107 }
+
4108
+
4109 //--- Load the Texture ----//
+
4110
+
4111 int Nchannels=3;
+
4112 std::vector<unsigned char> texture;
+
4113 uint texture_height, texture_width;
+
4114 std::string file = texture_file;
+
4115 if(file.substr(file.find_last_of('.') + 1) == "jpg" || file.substr(file.find_last_of('.') + 1) == "jpeg" ){
+
4116 read_JPEG_file (texture_file,texture,texture_height,texture_width);
+
4117 } else if(file.substr(file.find_last_of('.') + 1) == "png") {
+
4118 read_png_file (texture_file,texture,texture_height,texture_width);
+
4119 }else {
+
4120 assert(false);
+
4121 }
+
4122
+
4123 texture_size = make_int2( texture_width, texture_height );
+
4124
+
4125 //Find next power of two up from size
+
4126 int POT = 0;
+
4127 while( pow(2,POT)<texture_size.x ){
+
4128 POT++;
+
4129 }
+
4130 int2 texture_size_POT = make_int2( int(pow(2,POT)), texture_size.y );
+
4131
+
4132 //OpenGL is a pain, so we need to pad the first dimension of the texture so that it size is a power of two
+
4133 std::vector<unsigned char> texture_;
+
4134 texture_.resize(texture_size_POT.y*texture_size_POT.x*4);
+
4135 for( int i=0; i<texture_size_POT.y*texture_size_POT.x*4; i++ ){
+
4136 texture_.at(i) = 0;
+
4137 }
+
4138 for(int j=0;j<texture_size.y;j++){
+
4139 for(int i=0;i<texture_size.x;i++){
+
4140 for( int c=0; c<4; c++ ){
+
4141 texture_[c+i*4+j*texture_size_POT.x*4] = texture[ c + i*4 + j*texture_size.x*4 ];
+
4142 }
+
4143 }
+
4144 }
+
4145 for(int j=texture_size.y-1; j<texture_size_POT.y; j++){
+
4146 for(int i=texture_size.x-1; i<texture_size_POT.x; i++){
+
4147 for( int c=0; c<4; c++ ){
+
4148 texture_[c+i*4+j*texture_size_POT.x*4] = 255.f;
+
4149 }
+
4150 }
+
4151 }
+
4152
+
4153 unsigned char* texture_ptr = &texture_[0];
+
4154
+
4155 glGenTextures(1, &textureID);
+
4156
+
4157 glActiveTexture(GL_TEXTURE0);
+
4158 glBindTexture(GL_TEXTURE_RECTANGLE,textureID);
+
4159 glTexImage2D(GL_TEXTURE_RECTANGLE, 0,GL_RGBA, texture_size_POT.x, texture_size_POT.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_ptr);
+
4160 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
4161 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
4162 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+
4163 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
4164
+
4165 textureMaps.push_back(textureID);
+
4166 textureSizes.push_back(texture_size);
+
4167 textureMapFiles.push_back(texture_file);
+
4168
+
4169}
+
+
4170
+
+ +
4172 glActiveTexture(GL_TEXTURE0);
+
4173 glUniform1i(textureUniform,0);
+
4174 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
4175 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
4176 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
4177 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
4178 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
4179 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
4180 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+
4181 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
4182 glEnable(GL_BLEND);
+
4183 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
4184}
+
+
4185
+
4186
+
+
4187void Shader::setTextureMask( const Glyph* glyph, uint& textureID ){
+
4188
+
4189 int2 texture_size = glyph->size;
+
4190
+
4191 //Check if this texture has already been added to the shader
+
4192 for( uint i=0; i<textureMaskFiles.size(); i++ ){
+
4193 if( textureMaskFiles.at(i).compare(glyph->filename)==0 ){
+
4194 textureID = textureMasks.at(i); //copy the handle
+
4195 return;
+
4196 }
+
4197 }
+
4198
+
4199 //OpenGL is a pain, so we need to pad the first dimension of the texture so that it size is a power of two
+
4200 int POT = 0;
+
4201 while( pow(2,POT)<texture_size.x ){
+
4202 POT++;
+
4203 }
+
4204 int2 texture_size_POT = make_int2( pow(2,POT), texture_size.y );
+
4205
+
4206 std::vector<unsigned char> texture(texture_size_POT.x*texture_size_POT.y);
+
4207 for(int j=0;j<texture_size.y;j++){
+
4208 for(int i=0;i<texture_size.x;i++){
+
4209 texture[i+j*texture_size_POT.x]=glyph->data.at(j).at(i);
+
4210 }
+
4211 }
+
4212 unsigned char* texture_ptr = &texture[0];
+
4213
+
4214 glGenTextures(1, &textureID);
+
4215
+
4216 glActiveTexture(GL_TEXTURE0);
+
4217 glBindTexture(GL_TEXTURE_RECTANGLE,textureID);
+
4218 glTexImage2D(GL_TEXTURE_RECTANGLE, 0,GL_RED, texture_size_POT.x, texture_size_POT.y, 0, GL_RED, GL_UNSIGNED_BYTE, texture_ptr);
+
4219 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
4220 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
4221 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+
4222 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
4223
+
4224 if( strlen(glyph->filename)>0 ){
+
4225 textureMasks.push_back(textureID);
+
4226 textureMaskFiles.push_back(glyph->filename);
+
4227 }
+
4228
+
4229}
+
+
4230
+
+
4231void Shader::setTextureMask( const char* texture_file, uint& textureID, int2& texture_size ){
+
4232
+
4233 //Check if this texture has already been added to the shader
+
4234 //Note: if the texture_file is empy, it will automatically load a new texture
+
4235 for( uint i=0; i<textureMapFiles.size(); i++ ){
+
4236 if( textureMapFiles.at(i).compare(texture_file)==0 && strlen(texture_file)>0 ){
+
4237 textureID = textureMaps.at(i); //copy the handle
+
4238 texture_size = textureSizes.at(i); //copy the size
+
4239 return;
+
4240 }
+
4241 }
+
4242
+
4243 //--- Load the Texture ----//
+
4244
+
4245 int Nchannels=3;
+
4246 std::vector<unsigned char> texture;
+
4247 uint texture_height, texture_width;
+
4248 std::string file = texture_file;
+
4249 if(file.substr(file.find_last_of(".") + 1) == "png") {
+
4250 read_png_file (texture_file,texture,texture_height,texture_width);
+
4251 }else {
+
4252 std::cerr << "ERROR: texture mask file " << texture_file << " must be a PNG image." << std::endl;
+
4253 }
+
4254
+
4255 texture_size = make_int2( texture_width, texture_height );
+
4256
+
4257 //Find next power of two up from size
+
4258 int POT = 0;
+
4259 while( pow(2,POT)<texture_size.x ){
+
4260 POT++;
+
4261 }
+
4262 int2 texture_size_POT = make_int2( int(pow(2,POT)), texture_size.y );
4263
-
4264 glGenTextures(1, &textureID);
-
4265
-
4266 glActiveTexture(GL_TEXTURE0);
-
4267 glBindTexture(GL_TEXTURE_RECTANGLE,textureID);
-
4268 glTexImage2D(GL_TEXTURE_RECTANGLE, 0,GL_RED, texture_size_POT.x, texture_size_POT.y, 0, GL_RED, GL_UNSIGNED_BYTE, texture_ptr);
-
4269 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
4270 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
4271 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-
4272 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
4273
-
4274 textureMaps.push_back(textureID);
-
4275 textureSizes.push_back(texture_size);
-
4276 textureMapFiles.push_back(texture_file);
-
4277
-
4278}
-
4279
- -
4281 glActiveTexture(GL_TEXTURE0);
-
4282 glUniform1i(textureUniform,0);
-
4283 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
4284 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
4285 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
4286 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
4287 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
4288 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
4289 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-
4290 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
4291 glEnable(GL_BLEND);
-
4292 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
4293}
-
4294
-
4295void Shader::setTransformationMatrix(const glm::mat4 &matrix ) const{
-
4296 glUniformMatrix4fv(transformMatrixUniform, 1, GL_FALSE, &matrix[0][0]);
-
4297}
-
4298
-
4299void Shader::setDepthBiasMatrix(const glm::mat4 &matrix ) const{
-
4300 glUniformMatrix4fv(depthBiasUniform, 1, GL_FALSE, &matrix[0][0]);
-
4301}
-
4302
-
4303void Shader::setLightDirection(const helios::vec3 &direction ) const{
-
4304 glUniform3f( lightDirectionUniform, direction.x, direction.y, direction.z );
-
4305}
-
4306
-
4307void Shader::setLightingModel( uint lightingmodel ) const{
-
4308 glUniform1i( lightingModelUniform, lightingmodel );
-
4309}
-
4310
-
4311void Shader::setLightIntensity( float lightintensity ) const{
-
4312 glUniform1f( lightIntensityUniform, lightintensity );
-
4313}
-
4314
-
4315void Shader::useShader() const {
-
4316 glUseProgram(shaderID);
-
4317}
-
4318
-
4319void Visualizer::getViewKeystrokes( vec3& eye, vec3& center ){
-
4320
+
4264 //OpenGL is a pain, so we need to pad the first dimension of the texture so that it size is a power of two
+
4265 std::vector<unsigned char> texture_;
+
4266 texture_.assign(texture_size_POT.y*texture_size_POT.x,0);
+
4267 for(int j=0;j<texture_size.y;j++){
+
4268 for(int i=0;i<texture_size.x;i++){
+
4269 texture_[j*texture_size_POT.x+i] = texture[ 3 + i*4 + j*texture_size.x*4 ];
+
4270 }
+
4271 }
+
4272
+
4273 unsigned char* texture_ptr = &texture_[0];
+
4274
+
4275 glGenTextures(1, &textureID);
+
4276
+
4277 glActiveTexture(GL_TEXTURE0);
+
4278 glBindTexture(GL_TEXTURE_RECTANGLE,textureID);
+
4279 glTexImage2D(GL_TEXTURE_RECTANGLE, 0,GL_RED, texture_size_POT.x, texture_size_POT.y, 0, GL_RED, GL_UNSIGNED_BYTE, texture_ptr);
+
4280 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
4281 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
4282 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+
4283 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
4284
+
4285 textureMaps.push_back(textureID);
+
4286 textureSizes.push_back(texture_size);
+
4287 textureMapFiles.push_back(texture_file);
+
4288
+
4289}
+
+
4290
+
+ +
4292 glActiveTexture(GL_TEXTURE0);
+
4293 glUniform1i(textureUniform,0);
+
4294 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
4295 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
4296 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
4297 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
4298 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
4299 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
4300 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+
4301 glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
4302 glEnable(GL_BLEND);
+
4303 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
4304}
+
+
4305
+
+
4306void Shader::setTransformationMatrix(const glm::mat4 &matrix ) const{
+
4307 glUniformMatrix4fv(transformMatrixUniform, 1, GL_FALSE, &matrix[0][0]);
+
4308}
+
+
4309
+
+
4310void Shader::setDepthBiasMatrix(const glm::mat4 &matrix ) const{
+
4311 glUniformMatrix4fv(depthBiasUniform, 1, GL_FALSE, &matrix[0][0]);
+
4312}
+
+
4313
+
+
4314void Shader::setLightDirection(const helios::vec3 &direction ) const{
+
4315 glUniform3f( lightDirectionUniform, direction.x, direction.y, direction.z );
+
4316}
+
+
4317
+
+
4318void Shader::setLightingModel( uint lightingmodel ) const{
+
4319 glUniform1i( lightingModelUniform, lightingmodel );
+
4320}
+
4321
-
4322 SphericalCoord Spherical = cart2sphere( eye-center );
-
4323 float radius = Spherical.radius;
-
4324 float theta = Spherical.elevation;
-
4325 float phi = Spherical.azimuth;
-
4326
-
4327 GLFWwindow* _window = (GLFWwindow*) window;
-
4328
-
4329 //----- Holding SPACEBAR -----//
-
4330 if (glfwGetKey( _window, GLFW_KEY_SPACE ) == GLFW_PRESS){
-
4331
-
4332 // Move center to the left - SPACE + LEFT KEY
-
4333 if (glfwGetKey( _window, GLFW_KEY_LEFT ) == GLFW_PRESS){
-
4334 center.x +=0.1*sin(phi);
-
4335 center.y +=0.1*cos(phi);
-
4336 }
-
4337 // Move center to the right - SPACE + RIGHT KEY
-
4338 else if (glfwGetKey( _window, GLFW_KEY_RIGHT ) == GLFW_PRESS){
-
4339 center.x -=0.1*sin(phi);
-
4340 center.y -=0.1*cos(phi);
-
4341 }
-
4342 // Move center upward - SPACE + UP KEY
-
4343 else if (glfwGetKey( _window, GLFW_KEY_UP ) == GLFW_PRESS){
-
4344 center.z +=0.2;
-
4345 }
-
4346 // Move center downward - SPACE + DOWN KEY
-
4347 else if (glfwGetKey( _window, GLFW_KEY_DOWN ) == GLFW_PRESS){
-
4348 center.z -=0.2;
-
4349 }
-
4350
-
4351 //----- Not Holding SPACEBAR -----//
-
4352 }else{
-
4353
-
4354 // Orbit left - LEFT ARROW KEY
-
4355 if (glfwGetKey( _window, GLFW_KEY_LEFT ) == GLFW_PRESS){
-
4356 phi+=M_PI/40.f;
-
4357 }
-
4358 // Orbit right - RIGHT ARROW KEY
-
4359 else if (glfwGetKey( _window, GLFW_KEY_RIGHT ) == GLFW_PRESS){
-
4360 phi-=M_PI/40.f;
-
4361 }
-
4362
-
4363 // Increase Elevation - UP ARROW KEY
-
4364 else if (glfwGetKey( _window, GLFW_KEY_UP ) == GLFW_PRESS){
-
4365 if( theta + M_PI/80.f < 0.49f*M_PI ){
-
4366 theta+=M_PI/80.f;
-
4367 }
-
4368 }
-
4369 // Decrease Elevation - DOWN ARROW KEY
-
4370 else if (glfwGetKey( _window, GLFW_KEY_DOWN ) == GLFW_PRESS){
-
4371 if( theta>-0.25*M_PI ){
-
4372 theta-=M_PI/80.f;
-
4373 }
-
4374 }
-
4375
-
4376 // Zoom in - "+" KEY
-
4377 if (glfwGetKey( _window, GLFW_KEY_EQUAL ) == GLFW_PRESS){
-
4378 radius *= 0.9;
-
4379 }
-
4380 // Zoom out - "-" KEY
-
4381 else if (glfwGetKey( _window, GLFW_KEY_MINUS ) == GLFW_PRESS){
-
4382 radius *= 1.1;
-
4383 }
-
4384 }
-
4385
-
4386 if (glfwGetKey( _window, GLFW_KEY_P ) == GLFW_PRESS){
-
4387 std::cout << "View is angle: (R,theta,phi)=(" << radius << "," << theta << "," << phi << ") at from position (" << camera_eye_location.x << "," << camera_eye_location.y << "," << camera_eye_location.z << ") looking at (" << center.x << "," << center.y << "," << center.z << ")" << std::endl;
-
4388 }
-
4389
+
+
4322void Shader::setLightIntensity( float lightintensity ) const{
+
4323 glUniform1f( lightIntensityUniform, lightintensity );
+
4324}
+
+
4325
+
+
4326void Shader::useShader() const {
+
4327 glUseProgram(shaderID);
+
4328}
+
+
4329
+
4330
+
4331bool lbutton_down = false;
+
4332bool rbutton_down = false;
+
4333bool mbutton_down = false;
+
4334double startX, startY;
+
4335double scrollX, scrollY;
+
4336bool scroll = false;
+
4337
+
4338
+
+
4339void mouseCallback( GLFWwindow *window, int button, int action, int mods ){
+
4340 if (button == GLFW_MOUSE_BUTTON_LEFT){
+
4341 if (GLFW_PRESS == action) {lbutton_down = true;}
+
4342 else if (GLFW_RELEASE == action) {lbutton_down = false;}
+
4343 } else if (button == GLFW_MOUSE_BUTTON_MIDDLE){
+
4344 if (GLFW_PRESS == action) {mbutton_down = true;}
+
4345 else if (GLFW_RELEASE == action) {mbutton_down = false;}
+
4346 } else if (button == GLFW_MOUSE_BUTTON_RIGHT){
+
4347 if (GLFW_PRESS == action) {rbutton_down = true;}
+
4348 else if (GLFW_RELEASE == action) {rbutton_down = false;}
+
4349 }
+
4350}
+
+
4351
+
4352
+
+
4353void cursorCallback( GLFWwindow* window, double xpos, double ypos ){
+
4354 if (lbutton_down){
+
4355 dphi = (float) xpos - startX;
+
4356 dtheta = (float) ypos - startY;
+
4357 } else {dphi = 0; dtheta = 0;}
+
4358 if (rbutton_down){
+
4359 dx = (float) xpos - startX;
+
4360 dy = (float) ypos - startY;
+
4361 } else {dx = 0; dy = 0;}
+
4362 if (mbutton_down){
+
4363 dx_m = (float) xpos - startX;
+
4364 dy_m = (float) ypos - startY;
+
4365 } else {dx_m = 0; dy_m = 0;}
+
4366 startX = xpos;
+
4367 startY = ypos;
+
4368}
+
+
4369
+
4370
+
+
4371void scrollCallback( GLFWwindow* window, double xoffset, double yoffset ){
+
4372 dscroll = (float) yoffset;
+
4373 scrollY = yoffset;
+
4374 if (yoffset > 0.0 or yoffset < 0.0){
+
4375 scroll = true;
+
4376 } else {scroll = false;}
+
4377}
+
+
4378
+
4379
+
4380void Visualizer::getViewKeystrokes( vec3& eye, vec3& center ){
+
4381
+
4382 vec3 forward = center - eye;
+
4383 forward = forward.normalize();
+
4384
+
4385 vec3 right = cross(forward, vec3(0, 0, 1));
+
4386 right = right.normalize();
+
4387
+
4388 vec3 up = cross(right, forward);
+
4389 up = up.normalize();
4390
-
4391 camera_eye_location = sphere2cart( make_SphericalCoord(radius,theta,phi) ) + center;
-
4392
-
4393
-
4394}
+
4391 SphericalCoord Spherical = cart2sphere( eye-center );
+
4392 float radius = Spherical.radius;
+
4393 float theta = Spherical.elevation;
+
4394 float phi = Spherical.azimuth;
4395
-
4396std::string errorString( GLenum err ){
-
4397
-
4398 std::string message;
-
4399 message.assign("");
-
4400
-
4401 if( err==GL_INVALID_ENUM ){
-
4402 message.assign("GL_INVALID_ENUM - An unacceptable value is specified for an enumerated argument.");
-
4403 }else if( err==GL_INVALID_VALUE ){
-
4404 message.assign("GL_INVALID_VALUE - A numeric argument is out of range.");
-
4405 }else if( err==GL_INVALID_OPERATION ){
-
4406 message.assign("GL_INVALID_OPERATION - The specified operation is not allowed in the current state.");
-
4407 }else if( err==GL_STACK_OVERFLOW ){
-
4408 message.assign("GL_STACK_OVERFLOW - This command would cause a stack overflow.");
-
4409 }else if( err==GL_STACK_UNDERFLOW ){
-
4410 message.assign("GL_STACK_UNDERFLOW - This command would cause a stack underflow.");
-
4411 }else if( err==GL_OUT_OF_MEMORY ){
-
4412 message.assign("GL_OUT_OF_MEMORY - There is not enough memory left to execute the command.");
-
4413 }else if( err==GL_TABLE_TOO_LARGE ){
-
4414 message.assign("GL_TABLE_TOO_LARGE - The specified table exceeds the implementation's maximum supported table size.");
-
4415 }
+
4396 phi+=M_PI * (dphi/160.f);
+
4397 if( dtheta > 0 && theta + M_PI/80.f < 0.49f*M_PI ){
+
4398 theta+=M_PI * (dtheta/120.f);
+
4399 } else if( dtheta < 0 && theta>-0.25*M_PI ){
+
4400 theta+=M_PI * (dtheta/120.f);
+
4401 }
+
4402 if (rbutton_down){
+
4403 center += 0.05 * dy * up;
+
4404 center -= 0.05 * dx * right;
+
4405 }
+
4406 if (mbutton_down){
+
4407 eye += 0.05 * dy_m * up;
+
4408 eye -= 0.05 * dx_m * right;
+
4409 }
+
4410 if (scroll){
+
4411 center -= 0.2 * dscroll * forward;
+
4412 }
+
4413 scroll = false;
+
4414
+
4415 GLFWwindow* _window = (GLFWwindow*) window;
4416
-
4417 return message;
-
4418
-
4419}
-
4420
-
4421int checkerrors() {
-
4422
-
4423 GLenum err;
-
4424 int err_count=0;
-
4425 while ((err = glGetError()) != GL_NO_ERROR) {
-
4426 std::cerr << "glError #" << err_count << ": " << errorString(err) << std::endl;
-
4427 err_count++;
-
4428 }
-
4429 if(err_count>0){
-
4430 return 0;
-
4431 }else{
-
4432 return 1;
-
4433 }
-
4434
-
4435}
-
HeliosDataType
Data types.
Definition: Context.h:41
-
PrimitiveType
Type of primitive element.
Definition: Context.h:31
-
void read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a PNG image.
Definition: Visualizer.cpp:268
-
int read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a JPEG image.
Definition: Visualizer.cpp:62
-
int write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages)
Write current graphics window to a JPEG image file.
Definition: Visualizer.cpp:130
+
4417 //----- Holding SPACEBAR -----//
+
4418 if (glfwGetKey( _window, GLFW_KEY_SPACE ) == GLFW_PRESS){
+
4419
+
4420 // Move center to the left - SPACE + LEFT KEY
+
4421 if (glfwGetKey( _window, GLFW_KEY_LEFT ) == GLFW_PRESS){
+
4422 center.x +=0.1*sin(phi);
+
4423 center.y +=0.1*cos(phi);
+
4424 }
+
4425 // Move center to the right - SPACE + RIGHT KEY
+
4426 else if (glfwGetKey( _window, GLFW_KEY_RIGHT ) == GLFW_PRESS){
+
4427 center.x -=0.1*sin(phi);
+
4428 center.y -=0.1*cos(phi);
+
4429 }
+
4430 // Move center upward - SPACE + UP KEY
+
4431 else if (glfwGetKey( _window, GLFW_KEY_UP ) == GLFW_PRESS){
+
4432 center.z +=0.2;
+
4433 }
+
4434 // Move center downward - SPACE + DOWN KEY
+
4435 else if (glfwGetKey( _window, GLFW_KEY_DOWN ) == GLFW_PRESS){
+
4436 center.z -=0.2;
+
4437 }
+
4438
+
4439 //----- Not Holding SPACEBAR -----//
+
4440 }else{
+
4441
+
4442 // Orbit left - LEFT ARROW KEY
+
4443 if (glfwGetKey( _window, GLFW_KEY_LEFT ) == GLFW_PRESS){
+
4444 phi+=M_PI/40.f;
+
4445 }
+
4446 // Orbit right - RIGHT ARROW KEY
+
4447 else if (glfwGetKey( _window, GLFW_KEY_RIGHT ) == GLFW_PRESS){
+
4448 phi-=M_PI/40.f;
+
4449 }
+
4450
+
4451 // Increase Elevation - UP ARROW KEY
+
4452 else if (glfwGetKey( _window, GLFW_KEY_UP ) == GLFW_PRESS){
+
4453 if( theta + M_PI/80.f < 0.49f*M_PI ){
+
4454 theta+=M_PI/80.f;
+
4455 }
+
4456 }
+
4457 // Decrease Elevation - DOWN ARROW KEY
+
4458 else if (glfwGetKey( _window, GLFW_KEY_DOWN ) == GLFW_PRESS){
+
4459 if( theta>-0.25*M_PI ){
+
4460 theta-=M_PI/80.f;
+
4461 }
+
4462 }
+
4463
+
4464 // Zoom in - "+" KEY
+
4465 if (glfwGetKey( _window, GLFW_KEY_EQUAL ) == GLFW_PRESS){
+
4466 radius *= 0.9;
+
4467 }
+
4468 // Zoom out - "-" KEY
+
4469 else if (glfwGetKey( _window, GLFW_KEY_MINUS ) == GLFW_PRESS){
+
4470 radius *= 1.1;
+
4471 }
+
4472 }
+
4473
+
4474 if (glfwGetKey( _window, GLFW_KEY_P ) == GLFW_PRESS){
+
4475 std::cout << "View is angle: (R,theta,phi)=(" << radius << "," << theta << "," << phi << ") at from position (" << camera_eye_location.x << "," << camera_eye_location.y << "," << camera_eye_location.z << ") looking at (" << center.x << "," << center.y << "," << center.z << ")" << std::endl;
+
4476 }
+
4477
+
4478
+
4479 camera_eye_location = sphere2cart( make_SphericalCoord(radius,theta,phi) ) + center;
+
4480
+
4481
+
4482}
+
4483
+
4484std::string errorString( GLenum err ){
+
4485
+
4486 std::string message;
+
4487 message.assign("");
+
4488
+
4489 if( err==GL_INVALID_ENUM ){
+
4490 message.assign("GL_INVALID_ENUM - An unacceptable value is specified for an enumerated argument.");
+
4491 }else if( err==GL_INVALID_VALUE ){
+
4492 message.assign("GL_INVALID_VALUE - A numeric argument is out of range.");
+
4493 }else if( err==GL_INVALID_OPERATION ){
+
4494 message.assign("GL_INVALID_OPERATION - The specified operation is not allowed in the current state.");
+
4495 }else if( err==GL_STACK_OVERFLOW ){
+
4496 message.assign("GL_STACK_OVERFLOW - This command would cause a stack overflow.");
+
4497 }else if( err==GL_STACK_UNDERFLOW ){
+
4498 message.assign("GL_STACK_UNDERFLOW - This command would cause a stack underflow.");
+
4499 }else if( err==GL_OUT_OF_MEMORY ){
+
4500 message.assign("GL_OUT_OF_MEMORY - There is not enough memory left to execute the command.");
+
4501 }else if( err==GL_TABLE_TOO_LARGE ){
+
4502 message.assign("GL_TABLE_TOO_LARGE - The specified table exceeds the implementation's maximum supported table size.");
+
4503 }
+
4504
+
4505 return message;
+
4506
+
4507}
+
4508
+
4509int checkerrors() {
+
4510
+
4511 GLenum err;
+
4512 int err_count=0;
+
4513 while ((err = glGetError()) != GL_NO_ERROR) {
+
4514 std::cerr << "glError #" << err_count << ": " << errorString(err) << std::endl;
+
4515 err_count++;
+
4516 }
+
4517 if(err_count>0){
+
4518 return 0;
+
4519 }else{
+
4520 return 1;
+
4521 }
+
4522
+
4523}
+
HeliosDataType
Data types.
Definition Context.h:41
+
PrimitiveType
Type of primitive element.
Definition Context.h:31
+
void read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a PNG image.
+
void cursorCallback(GLFWwindow *window, double xpos, double ypos)
Callback function for mouse cursor movements.
+
int read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a JPEG image.
+
int write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages)
Write current graphics window to a JPEG image file.
+
void mouseCallback(GLFWwindow *window, int button, int action, int mods)
Callback function for mouse button presses.
+
void scrollCallback(GLFWwindow *window, double xoffset, double yoffset)
Callback function for mouse scroll.
-
void read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a PNG image.
Definition: Visualizer.cpp:268
-
int read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a JPEG image.
Definition: Visualizer.cpp:62
-
int write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages=true)
Write current graphics window to a JPEG image file.
Definition: Visualizer.cpp:130
-
Glyph object - 2D matrix shape.
Definition: Visualizer.h:67
-
Class for visualization of simulation results.
Definition: Visualizer.h:265
-
void enableColorbar()
Enable the colorbar.
-
CoordinateSystem
Coordinate system to be used when specifying spatial coordinates.
Definition: Visualizer.h:310
-
@ COORDINATES_CARTESIAN
Coordinates are specified in a 3D Cartesian system (right-handed), where +z is vertical.
Definition: Visualizer.h:316
-
@ COORDINATES_WINDOW_NORMALIZED
Coordinates are normalized to unity and are window-aligned. The point (x,y)=(0,0) is in the bottom le...
Definition: Visualizer.h:313
-
Ctable
Pseudocolor map tables.
Definition: Visualizer.h:321
-
@ COLORMAP_HOT
"Hot" colormap
Definition: Visualizer.h:323
-
@ COLORMAP_COOL
"Cool" colormap
Definition: Visualizer.h:325
-
@ COLORMAP_CUSTOM
Custom colormap.
Definition: Visualizer.h:335
-
@ COLORMAP_GRAY
"Gray" colormap
Definition: Visualizer.h:333
-
@ COLORMAP_PARULA
"Parula" colormap
Definition: Visualizer.h:331
-
@ COLORMAP_RAINBOW
"Rainbow" colormap
Definition: Visualizer.h:327
-
@ COLORMAP_LAVA
"Lava" colormap
Definition: Visualizer.h:329
-
void colorContextPrimitivesByData(const char *data_name)
Color primitives from Context by color mapping their ‘Primitive Data’.
-
void plotDepthMap()
Plot the depth map (distance from camera to nearest object)
-
void getWindowPixelsRGB(uint *buffer)
Get R-G-B pixel data in the current display window.
Definition: Visualizer.cpp:899
-
void colorContextObjectsRandomly()
Color objects from Context with a random color.
-
int selfTest()
Visualizer self-test routine.
Definition: Visualizer.cpp:690
-
void addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
Add a point by giving its coordinates and size.
-
void printWindow()
Print the current graphics window to a JPEG image file. File will be given a default filename and sav...
Definition: Visualizer.cpp:875
-
void addTextboxByCenter(const char *textstring, const helios::vec3 &center, const helios::SphericalCoord &rotation, const helios::RGBcolor &fontcolor, uint fontsize, const char *fontname, CoordinateSystem coordFlag)
Add a text box by giving the coordinates of its center.
-
void showWatermark()
Make Helios logo watermark visible.
Definition: Visualizer.cpp:982
-
void addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a triangle by giving the coordinates of its three vertices.
-
void disableColorbar()
Disable the colorbar.
-
void setColorbarFontSize(uint font_size)
Set the font size of the colorbar text.
-
void setColorbarFontColor(helios::RGBcolor color)
Set the RGB color of the colorbar text.
-
void buildContextGeometry(helios::Context *context_ptr)
Add all geometry from the Context to the visualizer.
-
void addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)
Add Lines by giving the coordinates of points along the Lines.
-
void setLightDirection(const helios::vec3 &direction)
Set the direction of the light source.
Definition: Visualizer.cpp:788
-
void addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a voxel by giving the coordinates of its center.
-
void setCameraFieldOfView(float angle_FOV)
Set the camera field of view (angle width) in degrees. Default value is 45 degrees.
Definition: Visualizer.cpp:784
-
LightingModel
Lighting model to use for shading primitives.
Definition: Visualizer.h:372
-
@ LIGHTING_NONE
No shading, primitive is colored by its diffuse color.
Definition: Visualizer.h:374
-
@ LIGHTING_PHONG_SHADOWED
Phong lighting model plus shadowing is applied to add shading effects to the diffuse color.
Definition: Visualizer.h:380
-
void closeWindow()
Close the graphics window.
Definition: Visualizer.cpp:973
-
void addGridWireFrame(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv)
Add a coordinate axis.
-
void addSphereByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a sphere by giving the radius and center.
-
void setBackgroundColor(const helios::RGBcolor &color)
Set the background color for the visualizer window.
Definition: Visualizer.cpp:871
-
void clearGeometry()
Clear all geometry previously added to the visualizer.
Definition: Visualizer.cpp:955
-
float getDomainBoundingRadius() const
Get the radius of a sphere that bounds all primitives in the domain.
Definition: Visualizer.cpp:847
-
void getDepthMap(float *buffer)
Get depth buffer data for the current display window.
Definition: Visualizer.cpp:930
-
void setColorbarSize(helios::vec2 size)
Set the size of the colorbar in normalized window units (0-1)
-
void addCoordinateAxes()
Add a coordinate axis with at the origin with unit length.
-
void hideWatermark()
Make Helios logo watermark invisible.
Definition: Visualizer.cpp:978
-
Visualizer(uint Wdisplay)
Visualizer constructor.
Definition: Visualizer.cpp:358
-
void setColormap(Ctable colormap_name)
Set the colormap used in Colorbar/visualization based on pre-defined colormaps.
-
void plotUpdate()
Update the graphics window based on current geometry, then continue the program.
-
void setColorbarTicks(const std::vector< float > &ticks)
Set the values in the colorbar where ticks and labels should be placed.
-
void enableMessages()
Enable standard output from this plug-in (default)
Definition: Visualizer.cpp:766
-
void disableMessages()
Disable standard output from this plug-in.
Definition: Visualizer.cpp:770
-
void getFramebufferSize(uint &width, uint &height) const
Get the size of the framebuffer in pixels.
Definition: Visualizer.cpp:950
-
std::vector< helios::vec3 > plotInteractive()
Plot current geometry into an interactive graphics window.
-
void addSkyDomeByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file)
Add a Sky Dome, which is a hemispherical dome colored by a sky texture map.
-
void setColorbarRange(float cmin, float cmax)
Set the range of the Colorbar.
-
void setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)
Set camera position.
Definition: Visualizer.cpp:774
-
void addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its four vertices.
-
void colorContextPrimitivesRandomly()
Color primitives from Context with a random color.
-
void addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its center.
Definition: Visualizer.cpp:999
-
void addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a disk by giving the coordinates of its center.
-
void setColorbarPosition(helios::vec3 position)
Set the position of the colorbar in normalized window coordinates (0-1)
-
void colorContextPrimitivesByObjectData(const char *data_name)
Color primitives from Context by color mapping their ‘Object Data’.
-
void setLightIntensityFactor(float lightintensityfactor)
Set the light intensity scaling factor.
Definition: Visualizer.cpp:867
-
Colormap getCurrentColormap() const
Get the current colormap used in Colorbar/visualization.
-
void setColorbarTitle(const char *title)
Set the title of the Colorbar.
-
void getWindowSize(uint &width, uint &height) const
Get the size of the display window in pixels.
Definition: Visualizer.cpp:945
-
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition: Visualizer.cpp:795
-
void setLightingModel(LightingModel lightingmodel)
Set the lighting model for shading of all primitives.
Definition: Visualizer.cpp:861
-
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition: Context.cpp:2256
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
-
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:7017
-
std::vector< uint > getAllObjectIDs() const
Get the IDs for all Compound Objects in the Context.
Definition: Context.cpp:2589
-
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
-
void getDomainBoundingSphere(helios::vec3 &center, float &radius) const
Get the center and radius of a sphere that bounds all primitives in the domain.
Definition: Context.cpp:2116
-
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition: Context.cpp:2574
-
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition: Context.cpp:7135
-
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition: Context.cpp:7159
-
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition: Context.cpp:7175
-
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition: Context.cpp:6984
-
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
-
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
-
helios::Time getTime() const
Get the simulation time.
Definition: Context.cpp:1166
-
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition: Context.cpp:2046
-
helios::Date getDate() const
Get simulation date.
Definition: Context.cpp:1099
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition: Context.cpp:2585
-
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
-
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition: Context.cpp:7217
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
-
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition: global.cpp:140
-
bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
Definition: global.cpp:3102
-
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition: global.cpp:29
-
float randu()
Random number from a uniform distribution between 0 and 1.
Definition: global.cpp:223
-
vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
Function to rotate a 3D vector given spherical angles elevation and azimuth.
Definition: global.cpp:79
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition: global.cpp:617
-
anytype clamp(anytype value, anytype min, anytype max)
Clamp value to be within some specified bounds.
Definition: global.cpp:1055
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
RGB color map.
Definition: Visualizer.h:165
-
void useShader() const
Set shader as current.
-
void setLightingModel(uint lightingmodel) const
Set the lighting model.
-
void setDepthBiasMatrix(const glm::mat4 &matrix) const
Set the depth bias matrix for shadows.
-
void initialize(const char *vertex_shader_file, const char *fragment_shader_file)
Initialize the shader.
-
void setLightDirection(const helios::vec3 &direction) const
Set the direction of the light (sun)
-
void enableTextureMasks() const
Enable texture masks and color fragments by interpolating vertex colors.
-
void disableTextures() const
Disable texture maps and color fragments by interpolating vertex colors.
-
void setTextureMask(const Glyph *glyph, uint &textureID)
Set fragment opacity using a Glyph (red channel)
-
void enableTextureMaps() const
Enable texture maps and color fragments using an RGB texture map.
-
void setTextureMap(const char *texture_file, uint &textureID, helios::int2 &texture_size)
Color fragments using an RGB texture map.
-
void setLightIntensity(float lightintensity) const
Set the intensity of the light source.
-
void setTransformationMatrix(const glm::mat4 &matrix) const
Set the shader transformation matrix, i.e., the Affine transformation applied to all vertices.
- -
int month
Month of year.
-
int day
Day of month.
-
int year
Year in YYYY format.
-
R-G-B-A color vector.
-
float r
Red color component.
-
float a
Alpha (transparency) component.
-
float b
Blue color component.
-
float g
Green color component.
-
R-G-B color vector.
-
float b
Blue color component.
-
float r
Red color component.
-
float g
Green color component.
-
Vector of spherical coordinates (elevation,azimuth)
- -
const float & elevation
Elevation angle (radians)
-
float azimuth
Azimuthal angle (radians)
- -
int second
Second of minute.
-
int hour
Hour of day.
-
int minute
Minute of hour.
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of three elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int y
Second element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
vec3 normalize()
Normalize vector components such that the magnitude is unity.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
-
float magnitude() const
Compute the vector magnitude.
- +
void read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a PNG image.
+
int read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a JPEG image.
+
void cursorCallback(GLFWwindow *window, double x, double y)
Callback function for mouse cursor movements.
+
void mouseCallback(GLFWwindow *window, int button, int action, int mods)
Callback function for mouse button presses.
+
int write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages=true)
Write current graphics window to a JPEG image file.
+
void scrollCallback(GLFWwindow *window, double xoffset, double yoffset)
Callback function for mouse scroll.
+
Glyph object - 2D matrix shape.
Definition Visualizer.h:77
+
Class for visualization of simulation results.
Definition Visualizer.h:275
+
void enableColorbar()
Enable the colorbar.
+
CoordinateSystem
Coordinate system to be used when specifying spatial coordinates.
Definition Visualizer.h:320
+
@ COORDINATES_CARTESIAN
Coordinates are specified in a 3D Cartesian system (right-handed), where +z is vertical.
Definition Visualizer.h:326
+
@ COORDINATES_WINDOW_NORMALIZED
Coordinates are normalized to unity and are window-aligned. The point (x,y)=(0,0) is in the bottom le...
Definition Visualizer.h:323
+
Ctable
Pseudocolor map tables.
Definition Visualizer.h:331
+
@ COLORMAP_HOT
"Hot" colormap
Definition Visualizer.h:333
+
@ COLORMAP_COOL
"Cool" colormap
Definition Visualizer.h:335
+
@ COLORMAP_CUSTOM
Custom colormap.
Definition Visualizer.h:345
+
@ COLORMAP_GRAY
"Gray" colormap
Definition Visualizer.h:343
+
@ COLORMAP_PARULA
"Parula" colormap
Definition Visualizer.h:341
+
@ COLORMAP_RAINBOW
"Rainbow" colormap
Definition Visualizer.h:337
+
@ COLORMAP_LAVA
"Lava" colormap
Definition Visualizer.h:339
+
void colorContextPrimitivesByData(const char *data_name)
Color primitives from Context by color mapping their ‘Primitive Data’.
+
void plotDepthMap()
Plot the depth map (distance from camera to nearest object)
+
void getWindowPixelsRGB(uint *buffer)
Get R-G-B pixel data in the current display window.
+
void colorContextObjectsRandomly()
Color objects from Context with a random color.
+
int selfTest()
Visualizer self-test routine.
+
void addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
Add a point by giving its coordinates and size.
+
void printWindow()
Print the current graphics window to a JPEG image file. File will be given a default filename and sav...
+
void addTextboxByCenter(const char *textstring, const helios::vec3 &center, const helios::SphericalCoord &rotation, const helios::RGBcolor &fontcolor, uint fontsize, const char *fontname, CoordinateSystem coordFlag)
Add a text box by giving the coordinates of its center.
+
void showWatermark()
Make Helios logo watermark visible.
+
void addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a triangle by giving the coordinates of its three vertices.
+
void disableColorbar()
Disable the colorbar.
+
void setColorbarFontSize(uint font_size)
Set the font size of the colorbar text.
+
void setColorbarFontColor(helios::RGBcolor color)
Set the RGB color of the colorbar text.
+
void buildContextGeometry(helios::Context *context_ptr)
Add all geometry from the Context to the visualizer.
+
void addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)
Add Lines by giving the coordinates of points along the Lines.
+
void setLightDirection(const helios::vec3 &direction)
Set the direction of the light source.
+
void addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a voxel by giving the coordinates of its center.
+
void setCameraFieldOfView(float angle_FOV)
Set the camera field of view (angle width) in degrees. Default value is 45 degrees.
+
LightingModel
Lighting model to use for shading primitives.
Definition Visualizer.h:382
+
@ LIGHTING_NONE
No shading, primitive is colored by its diffuse color.
Definition Visualizer.h:384
+
@ LIGHTING_PHONG_SHADOWED
Phong lighting model plus shadowing is applied to add shading effects to the diffuse color.
Definition Visualizer.h:390
+
void closeWindow()
Close the graphics window.
+
void addGridWireFrame(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv)
Add a coordinate axis.
+
void addSphereByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a sphere by giving the radius and center.
+
void setBackgroundColor(const helios::RGBcolor &color)
Set the background color for the visualizer window.
+
void clearGeometry()
Clear all geometry previously added to the visualizer.
+
float getDomainBoundingRadius() const
Get the radius of a sphere that bounds all primitives in the domain.
+
void getDepthMap(float *buffer)
Get depth buffer data for the current display window.
+
void setColorbarSize(helios::vec2 size)
Set the size of the colorbar in normalized window units (0-1)
+
void addCoordinateAxes()
Add a coordinate axis with at the origin with unit length.
+
void hideWatermark()
Make Helios logo watermark invisible.
+
Visualizer(uint Wdisplay)
Visualizer constructor.
+
void setColormap(Ctable colormap_name)
Set the colormap used in Colorbar/visualization based on pre-defined colormaps.
+
void plotUpdate()
Update the graphics window based on current geometry, then continue the program.
+
void setColorbarTicks(const std::vector< float > &ticks)
Set the values in the colorbar where ticks and labels should be placed.
+
void enableMessages()
Enable standard output from this plug-in (default)
+
void disableMessages()
Disable standard output from this plug-in.
+
void getFramebufferSize(uint &width, uint &height) const
Get the size of the framebuffer in pixels.
+
std::vector< helios::vec3 > plotInteractive()
Plot current geometry into an interactive graphics window.
+
void addSkyDomeByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file)
Add a Sky Dome, which is a hemispherical dome colored by a sky texture map.
+
void setColorbarRange(float cmin, float cmax)
Set the range of the Colorbar.
+
void setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)
Set camera position.
+
void addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its four vertices.
+
void colorContextPrimitivesRandomly()
Color primitives from Context with a random color.
+
void addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its center.
+
void addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a disk by giving the coordinates of its center.
+
void setColorbarPosition(helios::vec3 position)
Set the position of the colorbar in normalized window coordinates (0-1)
+
void colorContextPrimitivesByObjectData(const char *data_name)
Color primitives from Context by color mapping their ‘Object Data’.
+
void setLightIntensityFactor(float lightintensityfactor)
Set the light intensity scaling factor.
+
Colormap getCurrentColormap() const
Get the current colormap used in Colorbar/visualization.
+
void setColorbarTitle(const char *title)
Set the title of the Colorbar.
+
void getWindowSize(uint &width, uint &height) const
Get the size of the display window in pixels.
+
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
+
void setLightingModel(LightingModel lightingmodel)
Set the lighting model for shading of all primitives.
+
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition Context.cpp:2256
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
bool doesObjectDataExist(uint objID, const char *label) const
Check if primitive data 'label' exists.
+
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:7017
+
std::vector< uint > getAllObjectIDs() const
Get the IDs for all Compound Objects in the Context.
Definition Context.cpp:2589
+
void getObjectData(uint objID, const char *label, int &data) const
Get data associated with a compound object.
+
void getDomainBoundingSphere(helios::vec3 &center, float &radius) const
Get the center and radius of a sphere that bounds all primitives in the domain.
Definition Context.cpp:2116
+
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition Context.cpp:2574
+
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition Context.cpp:7135
+
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition Context.cpp:7159
+
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition Context.cpp:7175
+
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition Context.cpp:6984
+
void setObjectData(uint objID, const char *label, const int &data)
Add data value (int) associated with a compound object.
+
bool doesPrimitiveDataExist(uint UUID, const char *label) const
Check if primitive data 'label' exists.
+
helios::Time getTime() const
Get the simulation time.
Definition Context.cpp:1166
+
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition Context.cpp:2046
+
helios::Date getDate() const
Get simulation date.
Definition Context.cpp:1099
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
bool doesObjectExist(uint ObjID) const
Check whether Compound Object exists in the Context.
Definition Context.cpp:2585
+
HeliosDataType getPrimitiveDataType(uint UUID, const char *label) const
Get the Helios data type of primitive data.
+
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition Context.cpp:7217
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
HeliosDataType getObjectDataType(uint objID, const char *label) const
Get the Helios data type of primitive data.
+
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition global.cpp:140
+
bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
Definition global.cpp:3102
+
void helios_runtime_error(const std::string &error_message)
Function to throw a runtime error.
Definition global.cpp:29
+
float randu()
Random number from a uniform distribution between 0 and 1.
Definition global.cpp:223
+
vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
Function to rotate a 3D vector given spherical angles elevation and azimuth.
Definition global.cpp:79
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition global.cpp:617
+
anytype clamp(anytype value, anytype min, anytype max)
Clamp value to be within some specified bounds.
Definition global.cpp:1055
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
Make an RGBAcolor vector.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
RGB color map.
Definition Visualizer.h:175
+
void useShader() const
Set shader as current.
+
void setLightingModel(uint lightingmodel) const
Set the lighting model.
+
void setDepthBiasMatrix(const glm::mat4 &matrix) const
Set the depth bias matrix for shadows.
+
void initialize(const char *vertex_shader_file, const char *fragment_shader_file)
Initialize the shader.
+
void setLightDirection(const helios::vec3 &direction) const
Set the direction of the light (sun)
+
void enableTextureMasks() const
Enable texture masks and color fragments by interpolating vertex colors.
+
void disableTextures() const
Disable texture maps and color fragments by interpolating vertex colors.
+
void setTextureMask(const Glyph *glyph, uint &textureID)
Set fragment opacity using a Glyph (red channel)
+
void enableTextureMaps() const
Enable texture maps and color fragments using an RGB texture map.
+
void setTextureMap(const char *texture_file, uint &textureID, helios::int2 &texture_size)
Color fragments using an RGB texture map.
+
void setLightIntensity(float lightintensity) const
Set the intensity of the light source.
+
void setTransformationMatrix(const glm::mat4 &matrix) const
Set the shader transformation matrix, i.e., the Affine transformation applied to all vertices.
+ +
int month
Month of year.
+
int day
Day of month.
+
int year
Year in YYYY format.
+
R-G-B-A color vector.
+
float r
Red color component.
+
float a
Alpha (transparency) component.
+
float b
Blue color component.
+
float g
Green color component.
+
R-G-B color vector.
+
float b
Blue color component.
+
float r
Red color component.
+
float g
Green color component.
+
Vector of spherical coordinates (elevation,azimuth)
+ +
const float & elevation
Elevation angle (radians)
+
float azimuth
Azimuthal angle (radians)
+ +
int second
Second of minute.
+
int hour
Hour of day.
+
int minute
Minute of hour.
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of three elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int y
Second element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+
float magnitude() const
Compute the vector magnitude.
+
+ diff --git a/doc/html/_visualizer_8h.html b/doc/html/_visualizer_8h.html index eb192c51d..d67824470 100644 --- a/doc/html/_visualizer_8h.html +++ b/doc/html/_visualizer_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Data Structures | @@ -99,6 +111,7 @@
#include "Context.h"
#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
+#include <GLFW/glfw3.h>
#include "glm/gtx/transform.hpp"

Go to the source code of this file.

@@ -120,19 +133,28 @@ - + - + - + - + - + + + + + + + + + +

Functions

int read_JPEG_file (const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
int read_JPEG_file (const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
 Function to create a texture map from a JPEG image.
 
int write_JPEG_file (const char *filename, uint width, uint height, void *_window, bool print_messages=true)
int write_JPEG_file (const char *filename, uint width, uint height, void *_window, bool print_messages=true)
 Write current graphics window to a JPEG image file.
 
int write_JPEG_file (const char *filename, const uint width, const uint height, const std::vector< helios::RGBcolor > &data, bool print_messages=true)
int write_JPEG_file (const char *filename, const uint width, const uint height, const std::vector< helios::RGBcolor > &data, bool print_messages=true)
 Write a JPEG image file based on array of pixel data.
 
void read_png_file (const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
void read_png_file (const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
 Function to create a texture map from a PNG image.
 
int checkerrors ()
void mouseCallback (GLFWwindow *window, int button, int action, int mods)
 Callback function for mouse button presses.
 
void cursorCallback (GLFWwindow *window, double x, double y)
 Callback function for mouse cursor movements.
 
void scrollCallback (GLFWwindow *window, double xoffset, double yoffset)
 Callback function for mouse scroll.
 
int checkerrors ()
 

Detailed Description

@@ -169,50 +191,106 @@

int checkerrors ( - ) + )

-

Definition at line 4421 of file Visualizer.cpp.

+

Definition at line 4509 of file Visualizer.cpp.

- -

◆ read_JPEG_file()

+ +

◆ cursorCallback()

- + - - + - - + + + + + + + +
int read_JPEG_file void cursorCallback (const char * filename, GLFWwindow * window,
std::vector< unsigned char > & texture, double x,
double y )
+
+ +

Callback function for mouse cursor movements.

+ +

Definition at line 4353 of file Visualizer.cpp.

+ +
+
+ +

◆ mouseCallback()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
void mouseCallback (GLFWwindow * window,
int button,
int action,
int mods )
+
+ +

Callback function for mouse button presses.

+ +

Definition at line 4339 of file Visualizer.cpp.

+ +
+
+ +

◆ read_JPEG_file()

+ +
+
+ + + + + - - + - - + + - - +
int read_JPEG_file (const char * filename,
uint & height, std::vector< unsigned char > & texture,
uint & width uint & height,
)uint & width )
@@ -285,46 +354,66 @@

-

◆ write_JPEG_file() [1/2]

+ +

◆ scrollCallback()

- + - - + - - + - - + + +
int write_JPEG_file void scrollCallback (const char * filename, GLFWwindow * window,
const uint width, double xoffset,
const uint height, double yoffset )
+
+ +

Callback function for mouse scroll.

+ +

Definition at line 4371 of file Visualizer.cpp.

+ +
+
+ +

◆ write_JPEG_file() [1/2]

+ +
+
+ + + + + - - + - - + + - - + + + + + +
int write_JPEG_file (const char * filename,
const std::vector< helios::RGBcolor > & data, const uint width,
bool print_messages = true const uint height,
)const std::vector< helios::RGBcolor > & data,
bool print_messages = true )
@@ -406,7 +485,8 @@

+

diff --git a/doc/html/_visualizer_8h_source.html b/doc/html/_visualizer_8h_source.html index c74e9c91e..6cde6e65f 100644 --- a/doc/html/_visualizer_8h_source.html +++ b/doc/html/_visualizer_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Visualizer.h
@@ -102,700 +114,727 @@
22#define GLM_FORCE_RADIANS
23#include "glm/glm.hpp"
24#include "glm/gtc/matrix_transform.hpp"
-
25#include "glm/gtx/transform.hpp"
-
26
-
28
-
34int read_JPEG_file (const char * filename, std::vector<unsigned char> &texture, uint & height, uint & width);
-
35
-
37
-
44int write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages = true);
-
45
+
25#include <GLFW/glfw3.h>
+
26#include "glm/gtx/transform.hpp"
+
27
+
29
+
35int read_JPEG_file (const char * filename, std::vector<unsigned char> &texture, uint & height, uint & width);
+
36
+
38
+
45int write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages = true);
46
-
48
-
55int write_JPEG_file(const char *filename, const uint width, const uint height, const std::vector<helios::RGBcolor> &data, bool print_messages = true);
-
56
-
58
-
64void read_png_file( const char* filename, std::vector<unsigned char> &texture, uint & height, uint & width);
-
65
-
67class Glyph{
-
68 public:
-
69
-
70 helios::int2 size;
-
71 std::vector<std::vector<uint> > data;
-
72 float solidFraction;
-
73 char* filename;
-
74
-
75 void readFile( const char* glyphfile );
-
76
-
77};
-
78
-
80struct Shader{
-
81public:
-
82
-
84 void disableTextures() const;
-
85
-
87
-
92 void setTextureMap( const char* texture_file, uint& textureID, helios::int2& texture_size );
-
93
-
95 void enableTextureMaps() const;
-
96
-
98
-
102 void setTextureMask( const Glyph* glyph, uint& textureID );
+
47
+
49
+
56int write_JPEG_file(const char *filename, const uint width, const uint height, const std::vector<helios::RGBcolor> &data, bool print_messages = true);
+
57
+
59
+
65void read_png_file( const char* filename, std::vector<unsigned char> &texture, uint & height, uint & width);
+
66
+
68void mouseCallback( GLFWwindow* window, int button, int action, int mods );
+
69
+
71void cursorCallback( GLFWwindow* window, double x, double y);
+
72
+
74void scrollCallback( GLFWwindow* window, double xoffset, double yoffset );
+
75
+
+
77class Glyph{
+
78 public:
+
79
+
80 helios::int2 size;
+
81 std::vector<std::vector<uint> > data;
+
82 float solidFraction;
+
83 char* filename;
+
84
+
85 void readFile( const char* glyphfile );
+
86
+
87};
+
+
88
+
+
90struct Shader{
+
91public:
+
92
+
94 void disableTextures() const;
+
95
+
97
+
102 void setTextureMap( const char* texture_file, uint& textureID, helios::int2& texture_size );
103
-
105
-
110 void setTextureMask( const char* texture_file, uint& textureID, helios::int2& texture_size );
-
111
-
113 void enableTextureMasks() const;
-
114
-
116 void setTransformationMatrix(const glm::mat4 &matrix ) const;
-
117
-
119 void setDepthBiasMatrix(const glm::mat4 &matrix ) const;
-
120
-
122 void setLightDirection(const helios::vec3 &direction ) const;
-
123
-
125 void setLightingModel( uint lightingmodel ) const;
-
126
-
128 void setLightIntensity( float lightintensity ) const;
-
129
-
131 void useShader() const;
-
132
-
134
-
138 void initialize( const char* vertex_shader_file, const char* fragment_shader_file );
+
105 void enableTextureMaps() const;
+
106
+
108
+
112 void setTextureMask( const Glyph* glyph, uint& textureID );
+
113
+
115
+
120 void setTextureMask( const char* texture_file, uint& textureID, helios::int2& texture_size );
+
121
+
123 void enableTextureMasks() const;
+
124
+
126 void setTransformationMatrix(const glm::mat4 &matrix ) const;
+
127
+
129 void setDepthBiasMatrix(const glm::mat4 &matrix ) const;
+
130
+
132 void setLightDirection(const helios::vec3 &direction ) const;
+
133
+
135 void setLightingModel( uint lightingmodel ) const;
+
136
+
138 void setLightIntensity( float lightintensity ) const;
139
-
140 ~Shader();
-
141
-
142 //Primary Shader
-
143 uint shaderID;
-
144 uint textureUniform;
-
145 uint shadowmapUniform;
-
146 uint transformMatrixUniform;
-
147 uint depthBiasUniform;
-
148 uint lightDirectionUniform;
-
149 uint lightingModelUniform;
-
150 uint RboundUniform;
-
151 float lightIntensityUniform;
-
152 uint VertexArrayID;
-
153
-
154private:
-
155
-
156 std::vector<uint> textureMaps;
-
157 std::vector<helios::int2> textureSizes;
-
158 std::vector<std::string> textureMapFiles;
-
159 std::vector<uint> textureMasks;
-
160 std::vector<std::string> textureMaskFiles;
-
161
-
162};
-
163
-
165struct Colormap{
-
166public:
-
167
-
168 Colormap() : cmapsize(0), minval(0.0f), maxval(1.0f) {};
-
169
-
170 Colormap(const std::vector<helios::RGBcolor> &ctable, const std::vector<float> &clocs, int size, float minval_, float maxval_ ) : cmapsize(size), minval(minval_), maxval(maxval_){
-
171
-
172 set( ctable, clocs, size, minval_, maxval_ );
+
141 void useShader() const;
+
142
+
144
+
148 void initialize( const char* vertex_shader_file, const char* fragment_shader_file );
+
149
+
150 ~Shader();
+
151
+
152 //Primary Shader
+
153 uint shaderID;
+
154 uint textureUniform;
+
155 uint shadowmapUniform;
+
156 uint transformMatrixUniform;
+
157 uint depthBiasUniform;
+
158 uint lightDirectionUniform;
+
159 uint lightingModelUniform;
+
160 uint RboundUniform;
+
161 float lightIntensityUniform;
+
162 uint VertexArrayID;
+
163
+
164private:
+
165
+
166 std::vector<uint> textureMaps;
+
167 std::vector<helios::int2> textureSizes;
+
168 std::vector<std::string> textureMapFiles;
+
169 std::vector<uint> textureMasks;
+
170 std::vector<std::string> textureMaskFiles;
+
171
+
172};
+
173
-
174 }
-
175
-
176 void set(const std::vector<helios::RGBcolor> &ctable, const std::vector<float> &clocs, int size, float minval_, float maxval_ ){
+
+
175struct Colormap{
+
176public:
177
-
178 cmapsize = size;
-
179 minval = minval_;
-
180 maxval = maxval_;
+
178 Colormap() : cmapsize(0), minval(0.0f), maxval(1.0f) {};
+
179
+
180 Colormap(const std::vector<helios::RGBcolor> &ctable, const std::vector<float> &clocs, int size, float minval_, float maxval_ ) : cmapsize(size), minval(minval_), maxval(maxval_){
181
-
182 size_t Ncolors=ctable.size();
+
182 set( ctable, clocs, size, minval_, maxval_ );
183
-
184 assert( clocs.size() == Ncolors && minval_<maxval_ );
+
184 }
185
-
186 cmap.resize(Ncolors);
+
186 void set(const std::vector<helios::RGBcolor> &ctable, const std::vector<float> &clocs, int size, float minval_, float maxval_ ){
187
-
188 float cmin,cmax;
-
189 std::vector<float> cinds;
-
190 cinds.resize(Ncolors);
+
188 cmapsize = size;
+
189 minval = minval_;
+
190 maxval = maxval_;
191
-
192 for( uint i=0; i<Ncolors; i++ ){
-
193 cinds.at(i)=clocs.at(i)*float(cmapsize-1);
-
194 }
+
192 size_t Ncolors=ctable.size();
+
193
+
194 assert( clocs.size() == Ncolors && minval_<maxval_ );
195
-
196 cmap.resize(cmapsize);
-
197 for( uint c=0; c<Ncolors-1; c++ ){
-
198
-
199 cmin=cinds.at(c);
-
200 cmax=cinds.at(c+1);
+
196 cmap.resize(Ncolors);
+
197
+
198 float cmin,cmax;
+
199 std::vector<float> cinds;
+
200 cinds.resize(Ncolors);
201
-
202 for( uint i=0; i<cmapsize; i++){
-
203
-
204 if( float(i)>=cmin && float(i)<=cmax ){
+
202 for( uint i=0; i<Ncolors; i++ ){
+
203 cinds.at(i)=clocs.at(i)*float(cmapsize-1);
+
204 }
205
-
206 cmap.at(i).r=ctable.at(c).r+(float(i)-cmin)/(cmax-cmin)*(ctable.at(c+1).r-ctable.at(c).r);
-
207 cmap.at(i).g=ctable.at(c).g+(float(i)-cmin)/(cmax-cmin)*(ctable.at(c+1).g-ctable.at(c).g);
-
208 cmap.at(i).b=ctable.at(c).b+(float(i)-cmin)/(cmax-cmin)*(ctable.at(c+1).b-ctable.at(c).b);
-
209
-
210 }
-
211 }
-
212 }
+
206 cmap.resize(cmapsize);
+
207 for( uint c=0; c<Ncolors-1; c++ ){
+
208
+
209 cmin=cinds.at(c);
+
210 cmax=cinds.at(c+1);
+
211
+
212 for( uint i=0; i<cmapsize; i++){
213
-
214 }
+
214 if( float(i)>=cmin && float(i)<=cmax ){
215
-
216 helios::RGBcolor query( float x ) const{
-
217
-
218 assert( cmapsize>0 && !cmap.empty() );
+
216 cmap.at(i).r=ctable.at(c).r+(float(i)-cmin)/(cmax-cmin)*(ctable.at(c+1).r-ctable.at(c).r);
+
217 cmap.at(i).g=ctable.at(c).g+(float(i)-cmin)/(cmax-cmin)*(ctable.at(c+1).g-ctable.at(c).g);
+
218 cmap.at(i).b=ctable.at(c).b+(float(i)-cmin)/(cmax-cmin)*(ctable.at(c+1).b-ctable.at(c).b);
219
-
220 helios::RGBcolor color;
-
221
-
222 uint color_ind;
-
223 if( minval==maxval ){
-
224 color_ind=0;
-
225 }else{
-
226 color_ind=std::round( (x-minval)/(maxval-minval) * float(cmapsize-1) );
-
227 }
-
228
-
229 if(color_ind<0){color_ind=0;}
-
230 if(color_ind>cmapsize-1){color_ind=int(cmapsize-1);}
-
231 color.r=cmap.at(color_ind).r;
-
232 color.g=cmap.at(color_ind).g;
-
233 color.b=cmap.at(color_ind).b;
-
234
-
235 return color;
-
236
-
237 }
+
220 }
+
221 }
+
222 }
+
223
+
224 }
+
225
+
226 helios::RGBcolor query( float x ) const{
+
227
+
228 assert( cmapsize>0 && !cmap.empty() );
+
229
+
230 helios::RGBcolor color;
+
231
+
232 uint color_ind;
+
233 if( minval==maxval ){
+
234 color_ind=0;
+
235 }else{
+
236 color_ind=std::round( (x-minval)/(maxval-minval) * float(cmapsize-1) );
+
237 }
238
-
239 void setRange( float min, float max ){
-
240 minval = min;
-
241 maxval = max;
-
242 }
-
243
-
244 helios::vec2 getRange() const{
-
245 return helios::make_vec2( minval, maxval );
-
246 }
-
247
-
248 float getLowerLimit() const{
-
249 return minval;
-
250 }
-
251
-
252 float getUpperLimit() const{
-
253 return maxval;
-
254 }
-
255
-
256private:
+
239 if(color_ind<0){color_ind=0;}
+
240 if(color_ind>cmapsize-1){color_ind=int(cmapsize-1);}
+
241 color.r=cmap.at(color_ind).r;
+
242 color.g=cmap.at(color_ind).g;
+
243 color.b=cmap.at(color_ind).b;
+
244
+
245 return color;
+
246
+
247 }
+
248
+
249 void setRange( float min, float max ){
+
250 minval = min;
+
251 maxval = max;
+
252 }
+
253
+
254 helios::vec2 getRange() const{
+
255 return helios::make_vec2( minval, maxval );
+
256 }
257
-
258 std::vector<helios::RGBcolor> cmap;
-
259 unsigned int cmapsize;
-
260 float minval, maxval;
+
258 float getLowerLimit() const{
+
259 return minval;
+
260 }
261
-
262};
-
263
- -
266public:
+
262 float getUpperLimit() const{
+
263 return maxval;
+
264 }
+
265
+
266private:
267
-
269
-
272 explicit Visualizer( uint Wdisplay );
+
268 std::vector<helios::RGBcolor> cmap;
+
269 unsigned int cmapsize;
+
270 float minval, maxval;
+
271
+
272};
+
273
-
275
-
279 Visualizer( uint Wdisplay, uint Hdisplay );
-
280
-
281 Visualizer( uint Wdisplay, uint Hdisplay, int aliasing_samples );
-
282
-
284 Visualizer( uint Wdisplay, uint Hdisplay, int aliasing_samples, bool window_decorations );
+
+ +
276public:
+
277
+
279
+
282 explicit Visualizer( uint Wdisplay );
+
283
285
-
286 // !Visualizer destructor
-
287 ~Visualizer();
-
288
-
290 int selfTest();
-
291
-
293 void enableMessages();
-
294
-
296 void disableMessages();
-
297
-
298 /* //! Type of transformation applied to a geometric object */
-
299 /* enum TransformationMethod { */
-
300 /* //! Do not apply any coordinate transformation to positions. In this case, all positions must be between -1 and 1. */
-
301 /* NO_TRANSFORM=0, */
-
302
-
303 /* //! Apply a perspective transformation to positions according to the current view. To set the view, use \ref setCameraPosition(). */
-
304 /* PERSPECTIVE_TRANSFORM=1, */
-
305
-
306 /* //! Apply a custom transformation to all positions. */
-
307 /* CUSTOM_TRANSFORM=2 */
-
308 /* }; */
- -
311
- -
314
- -
317
-
318 };
-
319
-
321 enum Ctable{
- - - - - - - -
336 };
-
337
-
339
-
343 void setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt );
-
344
-
346
-
351 void setCameraPosition(const helios::SphericalCoord &cameraAngle, const helios::vec3 &lookAt );
-
352
+
289 Visualizer( uint Wdisplay, uint Hdisplay );
+
290
+
291 Visualizer( uint Wdisplay, uint Hdisplay, int aliasing_samples );
+
292
+
294 Visualizer( uint Wdisplay, uint Hdisplay, int aliasing_samples, bool window_decorations );
+
295
+
296 // !Visualizer destructor
+
297 ~Visualizer();
+
298
+
300 int selfTest();
+
301
+
303 void enableMessages();
+
304
+
306 void disableMessages();
+
307
+
308 /* //! Type of transformation applied to a geometric object */
+
309 /* enum TransformationMethod { */
+
310 /* //! Do not apply any coordinate transformation to positions. In this case, all positions must be between -1 and 1. */
+
311 /* NO_TRANSFORM=0, */
+
312
+
313 /* //! Apply a perspective transformation to positions according to the current view. To set the view, use \ref setCameraPosition(). */
+
314 /* PERSPECTIVE_TRANSFORM=1, */
+
315
+
316 /* //! Apply a custom transformation to all positions. */
+
317 /* CUSTOM_TRANSFORM=2 */
+
318 /* }; */
+
+ +
321
+ +
324
+ +
327
+
328 };
+
+
329
+ +
347
+
349
+
353 void setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt );
354
-
357 void setCameraFieldOfView( float angle_FOV );
-
358
-
360
-
363 void setLightDirection(const helios::vec3 &direction );
+
356
+
361 void setCameraPosition(const helios::SphericalCoord &cameraAngle, const helios::vec3 &lookAt );
+
362
364
-
366 void getDomainBoundingBox( helios::vec2& xbounds, helios::vec2& ybounds, helios::vec2& zbounds ) const;
-
367
-
369 float getDomainBoundingRadius() const;
+
367 void setCameraFieldOfView( float angle_FOV );
+
368
370
- - -
375
- -
378
- -
381 };
-
382
-
384
-
388 void setLightingModel(LightingModel lightingmodel );
-
389
-
391
-
394 void setLightIntensityFactor( float lightintensityfactor );
-
395
-
397
-
400 void setBackgroundColor(const helios::RGBcolor &color );
+
373 void setLightDirection(const helios::vec3 &direction );
+
374
+
376 void getDomainBoundingBox( helios::vec2& xbounds, helios::vec2& ybounds, helios::vec2& zbounds ) const;
+
377
+
379 float getDomainBoundingRadius() const;
+
380
+ +
392
+
394
+
398 void setLightingModel(LightingModel lightingmodel );
+
399
401
-
403
-
410 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag );
+
404 void setLightIntensityFactor( float lightintensityfactor );
+
405
+
407
+
410 void setBackgroundColor(const helios::RGBcolor &color );
411
413
-
420 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
+
420 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag );
421
423
-
430 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char* texture_file, CoordinateSystem coordFlag );
+
430 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
431
433
-
441 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const char* texture_file, CoordinateSystem coordFlag );
-
442
-
444
-
452 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const Glyph* glyph, CoordinateSystem coordFlag );
-
453
-
455
-
460 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag );
-
461
+
440 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char* texture_file, CoordinateSystem coordFlag );
+
441
+
443
+
451 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const char* texture_file, CoordinateSystem coordFlag );
+
452
+
454
+
462 void addRectangleByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const Glyph* glyph, CoordinateSystem coordFlag );
463
-
468 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
-
469
+
465
+
470 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag );
471
-
476 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const char* texture_file, CoordinateSystem coordFlag );
-
477
+
473
+
478 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
479
-
485 void addRectangleByVertices(const std::vector<helios::vec3>& vertices, const char* texture_file, const std::vector<helios::vec2> &uvs, CoordinateSystem coordFlag );
-
486
-
488
-
495 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBcolor &color, const char* texture_file, const std::vector<helios::vec2> &uvs, CoordinateSystem coordFlag );
+
481
+
486 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const char* texture_file, CoordinateSystem coordFlag );
+
487
+
489
+
495 void addRectangleByVertices(const std::vector<helios::vec3>& vertices, const char* texture_file, const std::vector<helios::vec2> &uvs, CoordinateSystem coordFlag );
496
498
-
504 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBcolor &color, const char* texture_file, CoordinateSystem coordFlag);
-
505
-
507
-
513 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBcolor &color, const Glyph* glyph, CoordinateSystem coordFlag );
-
514
-
516
-
522 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBAcolor &color, const Glyph* glyph, CoordinateSystem coordFlag );
-
523
-
525
-
532 void addTriangle( const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag );
-
533
+
505 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBcolor &color, const char* texture_file, const std::vector<helios::vec2> &uvs, CoordinateSystem coordFlag );
+
506
+
508
+
514 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBcolor &color, const char* texture_file, CoordinateSystem coordFlag);
+
515
+
517
+
523 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBcolor &color, const Glyph* glyph, CoordinateSystem coordFlag );
+
524
+
526
+
532 void addRectangleByVertices( const std::vector<helios::vec3>& vertices, const helios::RGBAcolor &color, const Glyph* glyph, CoordinateSystem coordFlag );
+
533
535
-
542 void addTriangle( const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
+
542 void addTriangle( const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag );
543
545
-
555 void addTriangle( const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char* texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, CoordinateSystem coordFlag );
-
556
-
558
-
569 void addTriangle( const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char* texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
-
570
-
572
-
578 void addVoxelByCenter( const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag );
-
579
-
581
-
587 void addVoxelByCenter( const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
-
588
-
590
-
597 void addDiskByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag );
+
552 void addTriangle( const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
+
553
+
555
+
565 void addTriangle( const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char* texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, CoordinateSystem coordFlag );
+
566
+
568
+
579 void addTriangle( const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char* texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
+
580
+
582
+
588 void addVoxelByCenter( const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag );
+
589
+
591
+
597 void addVoxelByCenter( const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
598
600
-
607 void addDiskByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
+
607 void addDiskByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag );
608
610
-
617 void addDiskByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const char* texture_file, CoordinateSystem coordFlag );
+
617 void addDiskByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
618
620
-
627 void addLine( const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag );
+
627 void addDiskByCenter( const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const char* texture_file, CoordinateSystem coordFlag );
628
630
-
637 void addLine( const helios::vec3 &start, const helios::vec3 &end, const helios::RGBAcolor &color, uint linewidth, CoordinateSystem coordFlag );
+
637 void addLine( const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag );
638
640
-
646 void addPoint( const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag);
-
647
-
649
-
655 void addPoint( const helios::vec3 &position, const helios::RGBAcolor &color, uint pointsize, CoordinateSystem coordFlag );
-
656
-
658
-
665 void addSphereByCenter( float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag );
-
666
+
647 void addLine( const helios::vec3 &start, const helios::vec3 &end, const helios::RGBAcolor &color, uint linewidth, CoordinateSystem coordFlag );
+
648
+
650
+
656 void addPoint( const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag);
+
657
+
659
+
665 void addPoint( const helios::vec3 &position, const helios::RGBAcolor &color, uint pointsize, CoordinateSystem coordFlag );
+
666
668
-
675 void addSphereByCenter( float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
+
675 void addSphereByCenter( float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag );
676
678
-
684 void addSkyDomeByCenter( float radius, const helios::vec3 &center, uint Ndivisions, const char* texture_file );
-
685
-
687
-
688 DEPRECATED( void addSkyDomeByCenter( float radius, const helios::vec3 &center, uint Ndivisions, const char* texture_file, int layer ) );
-
689
-
691
-
699 void addTextboxByCenter( const char* textstring, const helios::vec3 &center, const helios::SphericalCoord &rotation, const helios::RGBcolor &fontcolor, uint fontsize, const char* fontname, CoordinateSystem coordFlag );
-
700
-
702 void addCoordinateAxes();
-
703
-
705
-
710 void addCoordinateAxes(const helios::vec3 &origin, const helios::vec3 &length, const std::string &sign);
-
711
+
685 void addSphereByCenter( float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag );
+
686
+
688
+
694 void addSkyDomeByCenter( float radius, const helios::vec3 &center, uint Ndivisions, const char* texture_file );
+
695
+
697
+
698 DEPRECATED( void addSkyDomeByCenter( float radius, const helios::vec3 &center, uint Ndivisions, const char* texture_file, int layer ) );
+
699
+
701
+
709 void addTextboxByCenter( const char* textstring, const helios::vec3 &center, const helios::SphericalCoord &rotation, const helios::RGBcolor &fontcolor, uint fontsize, const char* fontname, CoordinateSystem coordFlag );
+
710
+
712 void addCoordinateAxes();
713
-
718 void addGridWireFrame(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv);
-
719
-
721 void enableColorbar();
-
722
-
724 void disableColorbar();
-
725
-
727
-
730 void setColorbarPosition( helios::vec3 position );
-
731
-
733
-
736 void setColorbarSize( helios::vec2 size );
+
715
+
720 void addCoordinateAxes(const helios::vec3 &origin, const helios::vec3 &length, const std::string &sign);
+
721
+
723
+
728 void addGridWireFrame(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv);
+
729
+
731 void enableColorbar();
+
732
+
734 void disableColorbar();
+
735
737
-
739
-
743 void setColorbarRange( float cmin, float cmax );
-
744
-
746
-
750 void setColorbarTicks(const std::vector<float> &ticks );
-
751
-
753
-
756 void setColorbarTitle( const char* title );
-
757
-
759
- +
740 void setColorbarPosition( helios::vec3 position );
+
741
+
743
+
746 void setColorbarSize( helios::vec2 size );
+
747
+
749
+
753 void setColorbarRange( float cmin, float cmax );
+
754
+
756
+
760 void setColorbarTicks(const std::vector<float> &ticks );
+
761
763
-
765
-
768 void setColorbarFontSize( uint font_size );
+
766 void setColorbarTitle( const char* title );
+
767
769
-
771
-
775 void setColormap( Ctable colormap_name );
-
776
-
778
-
782 void setColormap(const std::vector<helios::RGBcolor> &colors, const std::vector<float> &divisions );
-
783
- -
786
+ +
773
+
775
+
778 void setColorbarFontSize( uint font_size );
+
779
+
781
+
785 void setColormap( Ctable colormap_name );
+
786
788
-
791 void buildContextGeometry( helios::Context* context_ptr );
-
792
-
794
-
798 void buildContextGeometry(helios::Context* context_ptr, const std::vector<uint>& UUIDs );
-
799
-
801
-
805 void colorContextPrimitivesByData( const char* data_name );
-
806
-
808
-
813 void colorContextPrimitivesByData( const char* data_name, const std::vector<uint>& UUIDs );
-
814
+
792 void setColormap(const std::vector<helios::RGBcolor> &colors, const std::vector<float> &divisions );
+
793
+ +
796
+
798
+
801 void buildContextGeometry( helios::Context* context_ptr );
+
802
+
804
+
808 void buildContextGeometry(helios::Context* context_ptr, const std::vector<uint>& UUIDs );
+
809
+
811
+
815 void colorContextPrimitivesByData( const char* data_name );
816
-
820 void colorContextPrimitivesByObjectData( const char* data_name );
-
821
-
823
-
828 void colorContextPrimitivesByObjectData( const char* data_name, const std::vector<uint>& ObjIDs );
-
829
+
818
+
823 void colorContextPrimitivesByData( const char* data_name, const std::vector<uint>& UUIDs );
+
824
+
826
+
830 void colorContextPrimitivesByObjectData( const char* data_name );
831
-
835 void colorContextPrimitivesRandomly(const std::vector<uint>& UUIDs );
-
836
-
838
- -
842
-
844
-
847 void colorContextObjectsRandomly(const std::vector<uint>& ObjIDs );
-
848
-
850
- -
854
-
855
-
857 void hideWatermark();
-
858
-
860 void showWatermark();
-
861
-
863 std::vector<helios::vec3> plotInteractive();
-
864
-
866 void plotDepthMap();
-
867
-
869 void plotUpdate();
-
870
-
872
-
875 void plotUpdate( bool hide_window );
-
876
-
878 void printWindow();
-
879
-
881
-
885 void printWindow( const char* outfile );
+
833
+
838 void colorContextPrimitivesByObjectData( const char* data_name, const std::vector<uint>& ObjIDs );
+
839
+
841
+
845 void colorContextPrimitivesRandomly(const std::vector<uint>& UUIDs );
+
846
+
848
+ +
852
+
854
+
857 void colorContextObjectsRandomly(const std::vector<uint>& ObjIDs );
+
858
+
860
+ +
864
+
865
+
867 void hideWatermark();
+
868
+
870 void showWatermark();
+
871
+
873 std::vector<helios::vec3> plotInteractive();
+
874
+
876 void plotDepthMap();
+
877
+
879 void plotUpdate();
+
880
+
882
+
885 void plotUpdate( bool hide_window );
886
-
888
-
891 void getWindowPixelsRGB( uint * buffer );
-
892
-
894
-
898 void getDepthMap( float * buffer );
-
899
-
901
-
905 void getWindowSize( uint &width, uint &height ) const;
-
906
-
908
-
912 void getFramebufferSize( uint &width, uint &height ) const;
-
913
-
915 void clearGeometry();
+
888 void printWindow();
+
889
+
891
+
895 void printWindow( const char* outfile );
+
896
+
898
+
901 void getWindowPixelsRGB( uint * buffer );
+
902
+
904
+
908 void getDepthMap( float * buffer );
+
909
+
911
+
915 void getWindowSize( uint &width, uint &height ) const;
916
-
918 void closeWindow();
-
919
-
920private:
-
921
-
922 void openWindow();
+
918
+
922 void getFramebufferSize( uint &width, uint &height ) const;
923
-
924 void initialize(uint window_width_pixels, uint window_height_pixels, int aliasing_samples, bool window_decorations );
-
925
-
926 void render( bool shadow );
-
927
-
928 void setupPlot();
-
929
-
930 //~~~~~~~~~~~~~~~~ Primitives ~~~~~~~~~~~~~~~~~~~~//
+
925 void clearGeometry();
+
926
+
928 void closeWindow();
+
929
+
930private:
931
-
932 std::string colorPrimitivesByObjectData,colorPrimitivesByData;
-
933 std::map<uint,uint> colorPrimitives_UUIDs, colorPrimitives_objIDs;
-
934
-
935 std::vector<int> contextPrimitiveIDs;
-
936
-
937 std::vector<float> depth_buffer_data;
-
938
-
939 std::map<uint,helios::int2> group_start;
-
940
-
941 void getViewKeystrokes( helios::vec3& eye, helios::vec3& center );
-
942
-
944 void addColorbarByCenter(const char* title, const helios::vec2 &size, const helios::vec3 &center, const helios::RGBcolor &font_color, const Colormap &colormap );
-
945
-
947 uint Wdisplay;
-
949 uint Hdisplay;
+
932 void openWindow();
+
933
+
934 void initialize(uint window_width_pixels, uint window_height_pixels, int aliasing_samples, bool window_decorations );
+
935
+
936 void render( bool shadow );
+
937
+
938 void setupPlot();
+
939
+
940 //~~~~~~~~~~~~~~~~ Primitives ~~~~~~~~~~~~~~~~~~~~//
+
941
+
942 std::string colorPrimitivesByObjectData,colorPrimitivesByData;
+
943 std::map<uint,uint> colorPrimitives_UUIDs, colorPrimitives_objIDs;
+
944
+
945 std::vector<int> contextPrimitiveIDs;
+
946
+
947 std::vector<float> depth_buffer_data;
+
948
+
949 std::map<uint,helios::int2> group_start;
950
-
952 uint Wframebuffer;
-
954 uint Hframebuffer;
+
951 void getViewKeystrokes( helios::vec3& eye, helios::vec3& center );
+
952
+
954 void addColorbarByCenter(const char* title, const helios::vec2 &size, const helios::vec3 &center, const helios::RGBcolor &font_color, const Colormap &colormap );
955
-
956 uint frame_counter;
-
957
-
959
-
960 void* window;
-
961
-
963 helios::vec3 camera_lookat_center;
-
964
-
966 helios::vec3 camera_eye_location;
+
957 uint Wdisplay;
+
959 uint Hdisplay;
+
960
+
962 uint Wframebuffer;
+
964 uint Hframebuffer;
+
965
+
966 uint frame_counter;
967
-
969 Shader primaryShader;
-
970
-
972 Shader depthShader;
-
973
-
974 Shader* currentShader;
-
975
-
976 uint framebufferID;
-
977 uint depthTexture;
-
978
-
980 std::vector<LightingModel> primaryLightingModel;
-
981
-
982 float lightintensity = 1.f;
+
969
+
970 void* window;
+
971
+
973 helios::vec3 camera_lookat_center;
+
974
+
976 helios::vec3 camera_eye_location;
+
977
+
979 Shader primaryShader;
+
980
+
982 Shader depthShader;
983
-
984 bool isWatermarkVisible;
+
984 Shader* currentShader;
985
-
987 helios::RGBcolor backgroundColor;
+
986 uint framebufferID;
+
987 uint depthTexture;
988
-
990 helios::vec3 light_direction;
+
990 std::vector<LightingModel> primaryLightingModel;
991
+
992 float lightintensity = 1.f;
993
-
994 uint colorbar_flag;
+
994 bool isWatermarkVisible;
995
-
997 std::string colorbar_title;
+
997 helios::RGBcolor backgroundColor;
998
-
1000 uint colorbar_fontsize;
+
1000 helios::vec3 light_direction;
1001
-
1003 uint point_width;
-
1004
-
1006 uint line_width;
-
1007
-
1009 helios::RGBcolor colorbar_fontcolor;
-
1010
-
1012 helios::vec3 colorbar_position;
-
1013
-
1015 helios::vec2 colorbar_size;
-
1016
-
1017 uint positionBuffer, colorBuffer, normalBuffer, uvBuffer, textureFlagBuffer, coordinateFlagBuffer;
-
1018 std::map<std::string,std::vector<float> > positionData, colorData, normalData, uvData;
-
1019 std::map<std::string,std::vector<int> > coordinateFlagData, textureFlagData, textureIDData;
+
1003
+
1004 uint colorbar_flag;
+
1005
+
1007 std::string colorbar_title;
+
1008
+
1010 uint colorbar_fontsize;
+
1011
+
1013 uint point_width;
+
1014
+
1016 uint line_width;
+
1017
+
1019 helios::RGBcolor colorbar_fontcolor;
1020
-
1021 void updatePerspectiveTransformation(const helios::vec3 &center, const helios::vec3 &eye );
-
1022
-
1023 glm::mat4 perspectiveTransformationMatrix;
-
1024
-
1025 void updateCustomTransformation(const glm::mat4 &matrix );
+
1022 helios::vec3 colorbar_position;
+
1023
+
1025 helios::vec2 colorbar_size;
1026
-
1027 glm::mat4 customTransformationMatrix;
-
1028
-
1030 float camera_FOV;
-
1031
-
1032 bool contextGeomNeedsUpdate;
-
1033
-
1034 bool primitiveColorsNeedUpdate;
-
1035
-
1036 helios::Context* context;
-
1037
-
1039 void buildContextGeometry_private();
-
1040
-
1041 float colorbar_min;
-
1042 float colorbar_max;
-
1043 std::vector<float> colorbar_ticks;
-
1044
-
1046 Colormap colormap_current;
+
1027 uint positionBuffer, colorBuffer, normalBuffer, uvBuffer, textureFlagBuffer, coordinateFlagBuffer;
+
1028 std::map<std::string,std::vector<float> > positionData, colorData, normalData, uvData;
+
1029 std::map<std::string,std::vector<int> > coordinateFlagData, textureFlagData, textureIDData;
+
1030
+
1031 void updatePerspectiveTransformation(const helios::vec3 &center, const helios::vec3 &eye );
+
1032
+
1033 glm::mat4 perspectiveTransformationMatrix;
+
1034
+
1035 void updateCustomTransformation(const glm::mat4 &matrix );
+
1036
+
1037 glm::mat4 customTransformationMatrix;
+
1038
+
1040 float camera_FOV;
+
1041
+
1042 bool contextGeomNeedsUpdate;
+
1043
+
1044 bool primitiveColorsNeedUpdate;
+
1045
+
1046 helios::Context* context;
1047
-
1049 Colormap colormap_hot;
+
1049 void buildContextGeometry_private();
1050
-
1052 Colormap colormap_cool;
-
1053
-
1055 Colormap colormap_lava;
-
1056
-
1058 Colormap colormap_rainbow;
-
1059
-
1061 Colormap colormap_parula;
-
1062
-
1064 Colormap colormap_gray;
-
1065
-
1066 bool message_flag;
-
1067
-
1068
-
1069};
-
1070
-
1071int checkerrors();
+
1051 float colorbar_min;
+
1052 float colorbar_max;
+
1053 std::vector<float> colorbar_ticks;
+
1054
+
1056 Colormap colormap_current;
+
1057
+
1059 Colormap colormap_hot;
+
1060
+
1062 Colormap colormap_cool;
+
1063
+
1065 Colormap colormap_lava;
+
1066
+
1068 Colormap colormap_rainbow;
+
1069
+
1071 Colormap colormap_parula;
1072
-
1073
-
1074#endif
+
1074 Colormap colormap_gray;
+
1075
+
1076 bool message_flag;
+
1077
+
1078
+
1079};
+
+
1080
+
1081
+
1082int checkerrors();
+
1083
+
1084
+
1085#endif
-
void read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a PNG image.
Definition: Visualizer.cpp:268
-
int read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a JPEG image.
Definition: Visualizer.cpp:62
-
int write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages=true)
Write current graphics window to a JPEG image file.
Definition: Visualizer.cpp:130
-
Glyph object - 2D matrix shape.
Definition: Visualizer.h:67
-
Class for visualization of simulation results.
Definition: Visualizer.h:265
-
void enableColorbar()
Enable the colorbar.
-
CoordinateSystem
Coordinate system to be used when specifying spatial coordinates.
Definition: Visualizer.h:310
-
@ COORDINATES_CARTESIAN
Coordinates are specified in a 3D Cartesian system (right-handed), where +z is vertical.
Definition: Visualizer.h:316
-
@ COORDINATES_WINDOW_NORMALIZED
Coordinates are normalized to unity and are window-aligned. The point (x,y)=(0,0) is in the bottom le...
Definition: Visualizer.h:313
-
Ctable
Pseudocolor map tables.
Definition: Visualizer.h:321
-
@ COLORMAP_HOT
"Hot" colormap
Definition: Visualizer.h:323
-
@ COLORMAP_COOL
"Cool" colormap
Definition: Visualizer.h:325
-
@ COLORMAP_CUSTOM
Custom colormap.
Definition: Visualizer.h:335
-
@ COLORMAP_GRAY
"Gray" colormap
Definition: Visualizer.h:333
-
@ COLORMAP_PARULA
"Parula" colormap
Definition: Visualizer.h:331
-
@ COLORMAP_RAINBOW
"Rainbow" colormap
Definition: Visualizer.h:327
-
@ COLORMAP_LAVA
"Lava" colormap
Definition: Visualizer.h:329
-
void colorContextPrimitivesByData(const char *data_name)
Color primitives from Context by color mapping their ‘Primitive Data’.
-
void plotDepthMap()
Plot the depth map (distance from camera to nearest object)
-
void getWindowPixelsRGB(uint *buffer)
Get R-G-B pixel data in the current display window.
Definition: Visualizer.cpp:899
-
void colorContextObjectsRandomly()
Color objects from Context with a random color.
-
int selfTest()
Visualizer self-test routine.
Definition: Visualizer.cpp:690
-
void addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
Add a point by giving its coordinates and size.
-
void printWindow()
Print the current graphics window to a JPEG image file. File will be given a default filename and sav...
Definition: Visualizer.cpp:875
-
void addTextboxByCenter(const char *textstring, const helios::vec3 &center, const helios::SphericalCoord &rotation, const helios::RGBcolor &fontcolor, uint fontsize, const char *fontname, CoordinateSystem coordFlag)
Add a text box by giving the coordinates of its center.
-
void showWatermark()
Make Helios logo watermark visible.
Definition: Visualizer.cpp:982
-
void addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a triangle by giving the coordinates of its three vertices.
-
void disableColorbar()
Disable the colorbar.
-
void setColorbarFontSize(uint font_size)
Set the font size of the colorbar text.
-
void setColorbarFontColor(helios::RGBcolor color)
Set the RGB color of the colorbar text.
-
void buildContextGeometry(helios::Context *context_ptr)
Add all geometry from the Context to the visualizer.
-
void addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)
Add Lines by giving the coordinates of points along the Lines.
-
void setLightDirection(const helios::vec3 &direction)
Set the direction of the light source.
Definition: Visualizer.cpp:788
-
void addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a voxel by giving the coordinates of its center.
-
void setCameraFieldOfView(float angle_FOV)
Set the camera field of view (angle width) in degrees. Default value is 45 degrees.
Definition: Visualizer.cpp:784
-
LightingModel
Lighting model to use for shading primitives.
Definition: Visualizer.h:372
-
@ LIGHTING_NONE
No shading, primitive is colored by its diffuse color.
Definition: Visualizer.h:374
-
@ LIGHTING_PHONG
Phong lighting model is applied to add shading effects to the diffuse color.
Definition: Visualizer.h:377
-
@ LIGHTING_PHONG_SHADOWED
Phong lighting model plus shadowing is applied to add shading effects to the diffuse color.
Definition: Visualizer.h:380
+
void read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a PNG image.
+
int read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width)
Function to create a texture map from a JPEG image.
+
void cursorCallback(GLFWwindow *window, double x, double y)
Callback function for mouse cursor movements.
+
void mouseCallback(GLFWwindow *window, int button, int action, int mods)
Callback function for mouse button presses.
+
int write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages=true)
Write current graphics window to a JPEG image file.
+
void scrollCallback(GLFWwindow *window, double xoffset, double yoffset)
Callback function for mouse scroll.
+
Glyph object - 2D matrix shape.
Definition Visualizer.h:77
+
Class for visualization of simulation results.
Definition Visualizer.h:275
+
void enableColorbar()
Enable the colorbar.
+
CoordinateSystem
Coordinate system to be used when specifying spatial coordinates.
Definition Visualizer.h:320
+
@ COORDINATES_CARTESIAN
Coordinates are specified in a 3D Cartesian system (right-handed), where +z is vertical.
Definition Visualizer.h:326
+
@ COORDINATES_WINDOW_NORMALIZED
Coordinates are normalized to unity and are window-aligned. The point (x,y)=(0,0) is in the bottom le...
Definition Visualizer.h:323
+
Ctable
Pseudocolor map tables.
Definition Visualizer.h:331
+
@ COLORMAP_HOT
"Hot" colormap
Definition Visualizer.h:333
+
@ COLORMAP_COOL
"Cool" colormap
Definition Visualizer.h:335
+
@ COLORMAP_CUSTOM
Custom colormap.
Definition Visualizer.h:345
+
@ COLORMAP_GRAY
"Gray" colormap
Definition Visualizer.h:343
+
@ COLORMAP_PARULA
"Parula" colormap
Definition Visualizer.h:341
+
@ COLORMAP_RAINBOW
"Rainbow" colormap
Definition Visualizer.h:337
+
@ COLORMAP_LAVA
"Lava" colormap
Definition Visualizer.h:339
+
void colorContextPrimitivesByData(const char *data_name)
Color primitives from Context by color mapping their ‘Primitive Data’.
+
void plotDepthMap()
Plot the depth map (distance from camera to nearest object)
+
void getWindowPixelsRGB(uint *buffer)
Get R-G-B pixel data in the current display window.
+
void colorContextObjectsRandomly()
Color objects from Context with a random color.
+
int selfTest()
Visualizer self-test routine.
+
void addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
Add a point by giving its coordinates and size.
+
void printWindow()
Print the current graphics window to a JPEG image file. File will be given a default filename and sav...
+
void addTextboxByCenter(const char *textstring, const helios::vec3 &center, const helios::SphericalCoord &rotation, const helios::RGBcolor &fontcolor, uint fontsize, const char *fontname, CoordinateSystem coordFlag)
Add a text box by giving the coordinates of its center.
+
void showWatermark()
Make Helios logo watermark visible.
+
void addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a triangle by giving the coordinates of its three vertices.
+
void disableColorbar()
Disable the colorbar.
+
void setColorbarFontSize(uint font_size)
Set the font size of the colorbar text.
+
void setColorbarFontColor(helios::RGBcolor color)
Set the RGB color of the colorbar text.
+
void buildContextGeometry(helios::Context *context_ptr)
Add all geometry from the Context to the visualizer.
+
void addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)
Add Lines by giving the coordinates of points along the Lines.
+
void setLightDirection(const helios::vec3 &direction)
Set the direction of the light source.
+
void addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a voxel by giving the coordinates of its center.
+
void setCameraFieldOfView(float angle_FOV)
Set the camera field of view (angle width) in degrees. Default value is 45 degrees.
+
LightingModel
Lighting model to use for shading primitives.
Definition Visualizer.h:382
+
@ LIGHTING_NONE
No shading, primitive is colored by its diffuse color.
Definition Visualizer.h:384
+
@ LIGHTING_PHONG
Phong lighting model is applied to add shading effects to the diffuse color.
Definition Visualizer.h:387
+
@ LIGHTING_PHONG_SHADOWED
Phong lighting model plus shadowing is applied to add shading effects to the diffuse color.
Definition Visualizer.h:390
DEPRECATED(void addSkyDomeByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file, int layer))
Add a Sky Dome, which is a hemispherical dome colored by a sky texture map.
-
void closeWindow()
Close the graphics window.
Definition: Visualizer.cpp:973
-
void addGridWireFrame(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv)
Add a coordinate axis.
-
void addSphereByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a sphere by giving the radius and center.
-
void setBackgroundColor(const helios::RGBcolor &color)
Set the background color for the visualizer window.
Definition: Visualizer.cpp:871
-
void clearGeometry()
Clear all geometry previously added to the visualizer.
Definition: Visualizer.cpp:955
-
float getDomainBoundingRadius() const
Get the radius of a sphere that bounds all primitives in the domain.
Definition: Visualizer.cpp:847
-
void getDepthMap(float *buffer)
Get depth buffer data for the current display window.
Definition: Visualizer.cpp:930
-
void setColorbarSize(helios::vec2 size)
Set the size of the colorbar in normalized window units (0-1)
-
void addCoordinateAxes()
Add a coordinate axis with at the origin with unit length.
-
void hideWatermark()
Make Helios logo watermark invisible.
Definition: Visualizer.cpp:978
-
void setColormap(Ctable colormap_name)
Set the colormap used in Colorbar/visualization based on pre-defined colormaps.
-
void plotUpdate()
Update the graphics window based on current geometry, then continue the program.
-
void setColorbarTicks(const std::vector< float > &ticks)
Set the values in the colorbar where ticks and labels should be placed.
-
void enableMessages()
Enable standard output from this plug-in (default)
Definition: Visualizer.cpp:766
-
void disableMessages()
Disable standard output from this plug-in.
Definition: Visualizer.cpp:770
-
void getFramebufferSize(uint &width, uint &height) const
Get the size of the framebuffer in pixels.
Definition: Visualizer.cpp:950
-
std::vector< helios::vec3 > plotInteractive()
Plot current geometry into an interactive graphics window.
-
void addSkyDomeByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file)
Add a Sky Dome, which is a hemispherical dome colored by a sky texture map.
-
void setColorbarRange(float cmin, float cmax)
Set the range of the Colorbar.
-
void setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)
Set camera position.
Definition: Visualizer.cpp:774
-
void addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its four vertices.
-
void colorContextPrimitivesRandomly()
Color primitives from Context with a random color.
-
void addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its center.
Definition: Visualizer.cpp:999
-
void addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a disk by giving the coordinates of its center.
-
void setColorbarPosition(helios::vec3 position)
Set the position of the colorbar in normalized window coordinates (0-1)
-
void colorContextPrimitivesByObjectData(const char *data_name)
Color primitives from Context by color mapping their ‘Object Data’.
-
void setLightIntensityFactor(float lightintensityfactor)
Set the light intensity scaling factor.
Definition: Visualizer.cpp:867
-
Colormap getCurrentColormap() const
Get the current colormap used in Colorbar/visualization.
-
void setColorbarTitle(const char *title)
Set the title of the Colorbar.
-
void getWindowSize(uint &width, uint &height) const
Get the size of the display window in pixels.
Definition: Visualizer.cpp:945
-
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
Definition: Visualizer.cpp:795
-
void setLightingModel(LightingModel lightingmodel)
Set the lighting model for shading of all primitives.
Definition: Visualizer.cpp:861
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGB color map.
Definition: Visualizer.h:165
-
OpenGL Shader data structure.
Definition: Visualizer.h:80
-
void useShader() const
Set shader as current.
-
void setLightingModel(uint lightingmodel) const
Set the lighting model.
-
void setDepthBiasMatrix(const glm::mat4 &matrix) const
Set the depth bias matrix for shadows.
-
void initialize(const char *vertex_shader_file, const char *fragment_shader_file)
Initialize the shader.
-
void setLightDirection(const helios::vec3 &direction) const
Set the direction of the light (sun)
-
void enableTextureMasks() const
Enable texture masks and color fragments by interpolating vertex colors.
-
void disableTextures() const
Disable texture maps and color fragments by interpolating vertex colors.
-
void setTextureMask(const Glyph *glyph, uint &textureID)
Set fragment opacity using a Glyph (red channel)
-
void enableTextureMaps() const
Enable texture maps and color fragments using an RGB texture map.
-
void setTextureMap(const char *texture_file, uint &textureID, helios::int2 &texture_size)
Color fragments using an RGB texture map.
-
void setLightIntensity(float lightintensity) const
Set the intensity of the light source.
-
void setTransformationMatrix(const glm::mat4 &matrix) const
Set the shader transformation matrix, i.e., the Affine transformation applied to all vertices.
-
R-G-B-A color vector.
-
R-G-B color vector.
-
float b
Blue color component.
-
float r
Red color component.
-
float g
Green color component.
-
Vector of spherical coordinates (elevation,azimuth)
-
Vector of two elements of type 'int'.
-
Vector of three elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+
void closeWindow()
Close the graphics window.
+
void addGridWireFrame(const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv)
Add a coordinate axis.
+
void addSphereByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a sphere by giving the radius and center.
+
void setBackgroundColor(const helios::RGBcolor &color)
Set the background color for the visualizer window.
+
void clearGeometry()
Clear all geometry previously added to the visualizer.
+
float getDomainBoundingRadius() const
Get the radius of a sphere that bounds all primitives in the domain.
+
void getDepthMap(float *buffer)
Get depth buffer data for the current display window.
+
void setColorbarSize(helios::vec2 size)
Set the size of the colorbar in normalized window units (0-1)
+
void addCoordinateAxes()
Add a coordinate axis with at the origin with unit length.
+
void hideWatermark()
Make Helios logo watermark invisible.
+
Visualizer(uint Wdisplay)
Visualizer constructor.
+
void setColormap(Ctable colormap_name)
Set the colormap used in Colorbar/visualization based on pre-defined colormaps.
+
void plotUpdate()
Update the graphics window based on current geometry, then continue the program.
+
void setColorbarTicks(const std::vector< float > &ticks)
Set the values in the colorbar where ticks and labels should be placed.
+
void enableMessages()
Enable standard output from this plug-in (default)
+
void disableMessages()
Disable standard output from this plug-in.
+
void getFramebufferSize(uint &width, uint &height) const
Get the size of the framebuffer in pixels.
+
std::vector< helios::vec3 > plotInteractive()
Plot current geometry into an interactive graphics window.
+
void addSkyDomeByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file)
Add a Sky Dome, which is a hemispherical dome colored by a sky texture map.
+
void setColorbarRange(float cmin, float cmax)
Set the range of the Colorbar.
+
void setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)
Set camera position.
+
void addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its four vertices.
+
void colorContextPrimitivesRandomly()
Color primitives from Context with a random color.
+
void addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a rectangle by giving the coordinates of its center.
+
void addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
Add a disk by giving the coordinates of its center.
+
void setColorbarPosition(helios::vec3 position)
Set the position of the colorbar in normalized window coordinates (0-1)
+
void colorContextPrimitivesByObjectData(const char *data_name)
Color primitives from Context by color mapping their ‘Object Data’.
+
void setLightIntensityFactor(float lightintensityfactor)
Set the light intensity scaling factor.
+
Colormap getCurrentColormap() const
Get the current colormap used in Colorbar/visualization.
+
void setColorbarTitle(const char *title)
Set the title of the Colorbar.
+
void getWindowSize(uint &width, uint &height) const
Get the size of the display window in pixels.
+
void getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
Get a box that bounds all primitives in the domain.
+
void setLightingModel(LightingModel lightingmodel)
Set the lighting model for shading of all primitives.
+
Stores the state associated with simulation.
Definition Context.h:1882
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGB color map.
Definition Visualizer.h:175
+
OpenGL Shader data structure.
Definition Visualizer.h:90
+
void useShader() const
Set shader as current.
+
void setLightingModel(uint lightingmodel) const
Set the lighting model.
+
void setDepthBiasMatrix(const glm::mat4 &matrix) const
Set the depth bias matrix for shadows.
+
void initialize(const char *vertex_shader_file, const char *fragment_shader_file)
Initialize the shader.
+
void setLightDirection(const helios::vec3 &direction) const
Set the direction of the light (sun)
+
void enableTextureMasks() const
Enable texture masks and color fragments by interpolating vertex colors.
+
void disableTextures() const
Disable texture maps and color fragments by interpolating vertex colors.
+
void setTextureMask(const Glyph *glyph, uint &textureID)
Set fragment opacity using a Glyph (red channel)
+
void enableTextureMaps() const
Enable texture maps and color fragments using an RGB texture map.
+
void setTextureMap(const char *texture_file, uint &textureID, helios::int2 &texture_size)
Color fragments using an RGB texture map.
+
void setLightIntensity(float lightintensity) const
Set the intensity of the light source.
+
void setTransformationMatrix(const glm::mat4 &matrix) const
Set the shader transformation matrix, i.e., the Affine transformation applied to all vertices.
+
R-G-B-A color vector.
+
R-G-B color vector.
+
float b
Blue color component.
+
float r
Red color component.
+
float g
Green color component.
+
Vector of spherical coordinates (elevation,azimuth)
+
Vector of two elements of type 'int'.
+
Vector of three elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+
diff --git a/doc/html/_visualizer_doc.html b/doc/html/_visualizer_doc.html index 2deb2421e..6942206a8 100644 --- a/doc/html/_visualizer_doc.html +++ b/doc/html/_visualizer_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Visualizer Plugin Documentation
+
Visualizer Plugin Documentation
@@ -142,13 +203,13 @@

Package
-td
+
-td
+
-td + X11/xorg
$ brew install Caskroom/cask/xquartz
Debian/Ubuntu:
$ sudo apt-get install libx11-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev libxrandr-dev
None (if using Visual Studio) @@ -172,11 +233,14 @@

Visualizer( uint Wdisplay, uint Hdisplay )

The class associated with the visualization is called Visualizer. The class constructor takes one or two arguments that specifies the size of the graphics window. If only one argument is provided (see Visualizer( uint Wdisplay )), the argument is an integer that specifies the width of the diplay window in pixels, with the hight of the window specified according to the default aspect ratio. If two arguments are provided (see Visualizer( uint Wdisplay, uint Hdisplay )), the two arguments correspond respectively to the width and height of the display window in pixels. Below is an example program:

-
 #include "Visualizer.h"
-
-  int main( void ){
-      Visualizer vis( 1200 ); //Opens a graphics window of width 1200 pixels with default aspect ratio
-  }

+
#include "Visualizer.h"
+
+
int main(){
+
Visualizer vis( 1200 ); //Opens a graphics window of width 1200 pixels with default aspect ratio
+
}
+ +
Class for visualization of simulation results.
Definition Visualizer.h:275
+

Using the Visualizer Plug-in

Coordinate Systems

@@ -200,22 +264,24 @@

If plotUpdate() is issued, another command printWindow() can be used to output the current visualization to file (JPEG files only).

The current window can be closed using the closeWindow() command.

Below is an example of opening a window (blank), exporting its contents to file, then closing the window:

-
 #include "Visualizer.h"
-
-   int main( void ){
-      Visualizer vis( 1200 );
-      vis.plotUpdate(); //we have not added geometry, so window is blank
-      vis.printWindow("blank_window.jpg");
-      vis.closeWindow();
-    }

+
#include "Visualizer.h"
+
+
int main(){
+
Visualizer vis( 1200 );
+
vis.plotUpdate(); //we have not added geometry, so window is blank
+
vis.printWindow("blank_window.jpg");
+
vis.closeWindow();
+
}
+

Window background

The window background can be set to a constant color via the command setBackgroundColor( RGBcolor color ). Alternatively, a three-dimensional ‘sky’ background can be set using the addSkyDomeByCenter command. This adds a hemispherical dome with a sky texture image mapped to its surface. The default sky texture is ‘SkyDome_clouds.jpg’ located in the plugins/visualizer/textures directory. The following example shows how to add a sky dome:

-
 #include "Visualizer.h"
-
-   int main( void ){
-      Visualizer vis( 1200 );
-      vis.addSkyDomeByCenter( 100, make_vec3(0,0,0), 20, "plugins/visualizer/textures/SkyDome_clouds.jpg", 0 );
-   }

In the example, we have created a sky dome with a radius of 100 centered at the origin (0,0,0), 20 divisions in the spherical coordinate directions (elevation,azimuth), and on layer 0.

+
#include "Visualizer.h"
+
+
int main(){
+
Visualizer vis( 1200 );
+
vis.addSkyDomeByCenter( 100, make_vec3(0,0,0), 20, "plugins/visualizer/textures/SkyDome_clouds.jpg", 0 );
+
}
+

In the example, we have created a sky dome with a radius of 100 centered at the origin (0,0,0), 20 divisions in the spherical coordinate directions (elevation,azimuth), and on layer 0.

Adding Geometry

Next, we will learn how to add objects to the visualization. The visualizer supports the following objects:

@@ -297,18 +363,20 @@


-

Each object can be added by calling one of the associated functions listed in the table above. The syntax is usually fairly similar to how gometry is added in the Helios context, except that you must specify a coordinate system (see Coordinate Systems).

+

Each object can be added by calling one of the associated functions listed in the table above. The syntax is usually fairly similar to how gometry is added in the Helios context, except that you must specify a coordinate system (see Coordinate Systems).

The code sample below gives an example of how to add a horizontal rectangle to the visualizer by providing the coordinates of its center:

-
 #include "Visualizer.h"
-
-   int main( void ){
-      Visualizer vis( 1200 );
-
-      vec3 center = make_vec3(0,0,0);
-      vec2 size = make_vec2(1,1);
-      SphericalCoord rotation = make_SphericalCoord(0,0);
-      vis.addRectangleByCenter(center,size,rotation,RGB::red,Visualizer::COORDINATES_CARTESIAN);
-   }

+
#include "Visualizer.h"
+
+
int main(){
+
Visualizer vis( 1200 );
+
+
vec3 center = make_vec3(0,0,0);
+
vec2 size = make_vec2(1,1);
+
SphericalCoord rotation = make_SphericalCoord(0,0);
+
vis.addRectangleByCenter(center, size, rotation, RGB::red, Visualizer::COORDINATES_CARTESIAN);
+
}
+
@ COORDINATES_CARTESIAN
Coordinates are specified in a 3D Cartesian system (right-handed), where +z is vertical.
Definition Visualizer.h:326
+

Automatically importing Context geometry

The visualizer can automatically import some or all geometry from the Context. This is accomplished using the buildContextGeometry command. To add all primitives in the Context, the buildContextGeometry command would be issued, which is passed the Context. We can add a subset of the Context geometry through an additional argument which takes a vector of UUID's.

@@ -320,47 +388,66 @@

buildContextGeometry( Context* context, std::vector<uint> UUIDs ) Add a subset of primitives in the Context to the Visualizer.

The example below shows how to add all Context geometry to the visualizer.

-
 #include "Context.h"
-   #include "Visualizer.h"
-
-   using namespace helios;
-
-   int main( void ){
-      Context context;
-
-      vec3 center = make_vec3(0,0,0);
-      vec2 size = make_vec2(1,1);
-      context.addPatch(center,size);
-
-      Visualizer vis( 1200 );
-
-      vis.buildContextGeometry(&context);
-   }

+
#include "Context.h"
+
#include "Visualizer.h"
+
+
using namespace helios;
+
+
int main(){
+
Context context;
+
+
vec3 center = make_vec3(0,0,0);
+
vec2 size = make_vec2(1,1);
+
context.addPatch(center,size);
+
+
Visualizer vis( 1200 );
+
+
vis.buildContextGeometry(&context);
+
}
+ +
Stores the state associated with simulation.
Definition Context.h:1882
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+

Plotting Geometry

To this point, we have not actually plotted anything in the Visualizer window. A final command is neede to display all of the geometry added to the Visualizer in the window we have opened. There are two functions for doing this, which are detailed below.

plotInteractive()

The plotInteractive() function can be used to generate an interactive plot of the geometry in the Visualizer. This means that the code will pause to produce the plot/visualization until the window is closed by the user. The user can interact with the plot by issuing keystrokes to, e.g., zoom. An example is given below to generate an interactive plot.

-
 #include "Context.h"
-   #include "Visualizer.h"
-
-   using namespace helios;
-
-   int main( void ){
-      Context context;
-
-      vec3 center = make_vec3(0,0,0);
-      vec2 size = make_vec2(1,1);
-      context.addRectangleByCenter(center,size);
-
-      Visualizer vis( 1200 );
-
-      vis.buildContextGeometry(&context);
-
-      vis.plotInteractive();
-   }

+
#include "Context.h"
+
#include "Visualizer.h"
+
+
using namespace helios;
+
+
int main(){
+
Context context;
+
+
vec3 center = make_vec3(0,0,0);
+
vec2 size = make_vec2(1,1);
+
context.addRectangleByCenter(center,size);
+
+
Visualizer vis( 1200 );
+
+
vis.buildContextGeometry(&context);
+
+
vis.plotInteractive();
+
}
+

View Controls

-

In an interactive plot, the view can be modified via various keystrokes, which are detailed in the table below.

+

In an interactive plot, the view can be modified via the mouse or keyboard. Note that for very large scenes, mouse-based controls may be laggy.

+

Mouse camera controls are given by:

+ + + + + + + + + +
Mouse Button Action
scroll wheel zoom in/out relative to look-at position
left mouse button (+drag) rotate camera view about look-at position
right mouse button (+drag) move look-at position
+

Keyboard camera controls are given by:

@@ -384,26 +471,27 @@

plotUpdate()

The plotUpdate() function simply updates the plot window based on current geometry, and continues on to the next lines of code. This can be useful if only a still image is to be written to file, as illustrated below.

-
 #include "Context.h"
-   #include "Visualizer.h"
-
-   using namespace helios;
-
-   int main( void ){
-      Context context;
-
-      vec3 center = make_vec3(0,0,0);
-      vec2 size = make_vec2(1,1);
-      context.addPatch(center,size);
-
-      Visualizer vis( 1200 );
-
-      vis.buildContextGeometry(&context);
-
-      vis.plotUpdate();
-      vis.printWindow("rectangle.jpg");
-      vis.closeWindow();
-   }

+
#include "Context.h"
+
#include "Visualizer.h"
+
+
using namespace helios;
+
+
int main(){
+
Context context;
+
+
vec3 center = make_vec3(0,0,0);
+
vec2 size = make_vec2(1,1);
+
context.addPatch(center,size);
+
+
Visualizer vis( 1200 );
+
+
vis.buildContextGeometry(&context);
+
+
vis.plotUpdate();
+
vis.printWindow("rectangle.jpg");
+
vis.closeWindow();
+
}
+

Colors and Shading

Coloring by r-g-b code

@@ -424,37 +512,39 @@

+ + + + + +
Key Action
Visualizer::COLORMAP_HOT
-td
Visualizer::COLORMAP_COOL
-td
Visualizer::COLORMAP_RAINBOW
-td
Visualizer::COLORMAP_LAVA
-td
Visualizer::COLORMAP_PARULA
-td
Visualizer::COLORMAP_GRAY
-td
Visualizer::COLORMAP_CUSTOM N/A

The colormap to be used is set using the following command setColormap( Ctable colormap_name ), where ‘colormap_name’ is one of the enumerations in the table above. For example, to set the ‘hot’ colormap one would use:

-
 vis.setColormap( Visualizer::COLORMAP_HOT );

To set a custom color table, the same command is used with the Visualizer::COLORMAP_CUSTOM argument, plus additional arguments that define the custom color table. These arguments are 1) a vector of r-g-b colors defining various colors in the color table, and 2) a vector of values between 0 and 1 defining the relative positions of the colors in the table. The first position value must always be 0, and the last value must be 1. The visualizer interpolates between colors to populate the full color table. The table below shows how the ‘hot’ color table is defined:

+
vis.setColormap( Visualizer::COLORMAP_HOT );
+
@ COLORMAP_HOT
"Hot" colormap
Definition Visualizer.h:333
+

To set a custom color table, the same command is used with the Visualizer::COLORMAP_CUSTOM argument, plus additional arguments that define the custom color table. These arguments are 1) a vector of r-g-b colors defining various colors in the color table, and 2) a vector of values between 0 and 1 defining the relative positions of the colors in the table. The first position value must always be 0, and the last value must be 1. The visualizer interpolates between colors to populate the full color table. The table below shows how the ‘hot’ color table is defined:

@@ -470,23 +560,25 @@

RGBcolor relative position
(1, 1, 0)
1

Example code on how to implement the color table creation is given below:

-
 Visualizer vis(1000);
-
-   std::vector<RGBcolor> ctable_colors;
-   ctable_colors.push_back( make_RGBcolor( 0.f, 0.f, 0.f ) );
-   ctable_colors.push_back( make_RGBcolor( 0.5f, 0.f, 0.5f ) );
-   ctable_colors.push_back( make_RGBcolor( 1.f, 0.f, 0.f ) );
-   ctable_colors.push_back( make_RGBcolor( 1.f, 0.5f, 0.f ) );
-   ctable_colors.push_back( make_RGBcolor( 1.f, 1.f, 0.f ) );
-
-   std::vector<float> ctable_positions;
-   ctable_positions.push_back( 0.f );
-   ctable_positions.push_back( 0.25f );
-   ctable_positions.push_back( 0.5f );
-   ctable_positions.push_back( 0.75f );
-   ctable_positions.push_back( 1.f );
-
-   vis.setColormap( Visualizer::COLORMAP_CUSTOM, ctable_colors, ctable_positions );

+
Visualizer vis(1000);
+
+
std::vector<RGBcolor> ctable_colors;
+
ctable_colors.push_back( make_RGBcolor( 0.f, 0.f, 0.f ) );
+
ctable_colors.push_back( make_RGBcolor( 0.5f, 0.f, 0.5f ) );
+
ctable_colors.push_back( make_RGBcolor( 1.f, 0.f, 0.f ) );
+
ctable_colors.push_back( make_RGBcolor( 1.f, 0.5f, 0.f ) );
+
ctable_colors.push_back( make_RGBcolor( 1.f, 1.f, 0.f ) );
+
+
std::vector<float> ctable_positions;
+
ctable_positions.push_back( 0.f );
+
ctable_positions.push_back( 0.25f );
+
ctable_positions.push_back( 0.5f );
+
ctable_positions.push_back( 0.75f );
+
ctable_positions.push_back( 1.f );
+
+
vis.setColormap( Visualizer::COLORMAP_CUSTOM, ctable_colors, ctable_positions );
+
@ COLORMAP_CUSTOM
Custom colormap.
Definition Visualizer.h:345
+

Colorbar

The colorbar is the legend showing how values are mapped to the color table. The table below gives functions for customizing colorbar behavior, including for example its position, size, and visibility.

@@ -503,7 +595,7 @@

- + @@ -528,21 +620,24 @@

setColorbarRange( float cmin, float cmax ) Set the range of data values for the colorbar/colormap.
setColorbarTicks( std::vector<float> ticks ) Set locations of data tick along colorbar.
setColorbarTicks( const std::vector<float> &ticks ) Set locations of data tick along colorbar.
setColorbarTitle( const char* title ) Set the title text displayed above the colorbar.
Phong shading model with shadows. Visualizer::LIGHTING_PHONG_SHADOWED

If the Phong shading model is used, the position of the light source should be specified. This is accomplished through the Visualizer::setLightDirection( vec3 direction ) command, which takes a unit vector pointing toward the light source. The example below shows how to enable the Phong lighting model with shadows, with the light position set according to the position of the sun.

-
 #include "Visualizer.h"
-
-   int main( void ){
-      Visualizer vis( 1200 );
-
-      vec3 center = make_vec3(0,0,0);
-      vec2 size = make_vec2(1,1);
-      SphericalCoord rotation = make_SphericalCoord(0,0);
-      vis.addRectangleByCenter(center,size,rotation,RGB::red,Visualizer::COORDINATES_CARTESIAN,0);
-
-      vec3 light_direction = make_vec3(1,1,1);
-
-      vis.setLightingModel( Visualizer::LIGHTING_PHONG_SHADOWED );
-      vis.setLightDirection( light_direction );
-   }

+
#include "Visualizer.h"
+
+
int main(){
+
Visualizer vis( 1200 );
+
+
vec3 center = make_vec3(0,0,0);
+
vec2 size = make_vec2(1,1);
+
SphericalCoord rotation = make_SphericalCoord(0,0);
+
vis.addRectangleByCenter(center,size,rotation,RGB::red,Visualizer::COORDINATES_CARTESIAN,0);
+
+
vec3 light_direction = make_vec3(1,1,1);
+
+
vis.setLightingModel( Visualizer::LIGHTING_PHONG_SHADOWED );
+
vis.setLightDirection( light_direction );
+
}
+
@ LIGHTING_PHONG_SHADOWED
Phong lighting model plus shadowing is applied to add shading effects to the diffuse color.
Definition Visualizer.h:390
+
Vector of spherical coordinates (elevation,azimuth)
+

View Options

The default camera position is at an elevation angle of 20 degrees and to the North, with the camera looking toward the origin. The distance of the camera from the origin is automatically adjusted to fit all primitives in view.

There are multiple ways of specifying custom camera views. One method involves specifying the (x,y,z) position of the camera, and the (x,y,z) position that the camera is looking at. This is accomplished using the command setCameraPosition( vec3 cameraPosition, vec3 lookAt ).

@@ -563,7 +658,8 @@

+
diff --git a/doc/html/_voxel_intersection_8cpp.html b/doc/html/_voxel_intersection_8cpp.html index 270ea26d6..16d25403b 100644 --- a/doc/html/_voxel_intersection_8cpp.html +++ b/doc/html/_voxel_intersection_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +

+
VoxelIntersection.cpp File Reference
@@ -105,7 +117,8 @@
+
diff --git a/doc/html/_voxel_intersection_8cpp_source.html b/doc/html/_voxel_intersection_8cpp_source.html index ffa59f12d..0270d9d3f 100644 --- a/doc/html/_voxel_intersection_8cpp_source.html +++ b/doc/html/_voxel_intersection_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
VoxelIntersection.cpp
@@ -97,6 +109,7 @@
17
18using namespace helios;
19
+
21
22 context = __context;
@@ -104,7 +117,9 @@
24 printmessages=true;
25
26}
+
27
+
29
30 if( printmessages ){
@@ -537,8 +552,10 @@
466
467
468}
+
469
470// find the intersection point of two lines
+
472
473 helios::vec3 g = line2_point-line1_point;
@@ -559,7 +576,9 @@
488 return line1_point - rht ;
489 }
490}
+
491
+
492std::vector<uint> VoxelIntersection::slicePrimitive(uint UUID, std::vector<helios::vec3> voxel_face_vertices)
493{
494
@@ -1773,7 +1792,9 @@
1705
1706 return resulting_UUIDs;
1707}
+
1708
+
1709std::vector<uint> VoxelIntersection::slicePrimitivesUsingGrid(std::vector<uint> UUIDs, helios::vec3 grid_center, helios::vec3 grid_size, helios::int3 grid_divisions)
1710{
1711
@@ -2022,25 +2043,33 @@
1958 return UUIDs_out;
1959
1960}
+
1961
1962
+
1963std::vector<std::vector<uint>> VoxelIntersection::getCellPrimitives(void){
1964
1965 return cell_primitives;
1966
1967}
+
1968
+
1969bool VoxelIntersection::approxSame(float a, float b, float absTol, float relTol){
1970
1971 return fabs(a-b) <= absTol || fabs(a-b) <= relTol*(std::max(fabs(a), fabs(b)));
1972
1973}
+
1974
+
1976{
1977 return fabs(a.x-b.x) <= absTol && fabs(a.y-b.y) <= absTol && fabs(a.z-b.z) <= absTol ;
1978}
+
1979
+
1981{
1982 // uv coordinate that will be output
@@ -2129,67 +2158,69 @@
2065 return uvs;
2066
2067}
-
@ OBJECT_TYPE_TILE
< Tile
Definition: Context.h:130
+
+
@ OBJECT_TYPE_TILE
< Tile
Definition Context.h:130
- -
std::vector< uint > slicePrimitivesUsingGrid(std::vector< uint > UUIDs, helios::vec3 grid_center, helios::vec3 grid_size, helios::int3 grid_divisions)
Slice a primitives based on a defined grid of voxels.
-
void calculatePrimitiveVoxelIntersection(void)
Calculate primitives that reside in all voxels for every primitive in the Context.
-
std::vector< uint > slicePrimitive(uint UUID, std::vector< helios::vec3 > voxel_face_vertices)
Slice a primitive (patch or triangle) into multiple triangles using a defined plane (often a voxel fa...
-
int selfTest(void)
Self-test function (unit tests)
-
VoxelIntersection(helios::Context *context)
Default constructor.
-
helios::vec3 linesIntersection(helios::vec3 line1_point, helios::vec3 line1_direction, helios::vec3 line2_point, helios::vec3 line2_direction)
Calculate the intersection point of two lines.
-
bool approxSame(float a, float b, float absTol, float relTol)
compare two floating point numbers to within an absolute and relative error tolerance
-
std::vector< std::vector< uint > > getCellPrimitives()
get 2D vector storing the UUIDs within each grid cell
-
void disableMessages()
Disable output messages (enabled by default)
-
helios::vec2 interpolate_texture_UV_to_slice_point(helios::vec3 p1, helios::vec2 uv1, helios::vec3 p2, helios::vec2 uv2, helios::vec3 ps)
find the uv coordinate of a slice point
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void copyPrimitiveData(uint sourceUUID, uint destinationUUID)
copy all primitive data from one primitive to another
-
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition: Context.cpp:7053
-
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:7017
-
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition: Context.cpp:7135
-
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition: Context.cpp:7159
-
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition: Context.cpp:7175
-
void setPrimitiveParentObjectID(uint UUID, uint objID)
Method to set the ID of the parent object the primitive belongs to (default is object 0)
Definition: Context.cpp:6988
-
helios::ObjectType getObjectType(uint ObjID) const
Get an enumeration specifying the type of the object.
Definition: Context.cpp:2940
-
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition: Context.cpp:7197
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition: Context.cpp:7217
-
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition: Context.cpp:7104
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition: Context.cpp:1659
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
void cropDomain(std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
Crop specified UUIDs such that they lie within some specified axis-aligned box.
Definition: Context.cpp:2213
-
float sumPrimitiveSurfaceArea(const std::vector< uint > &UUIDs) const
Sum the one-sided surface area of a group of primitives.
-
float randu()
Random number from a uniform distribution between 0 and 1.
Definition: global.cpp:223
-
float min(const std::vector< float > &vect)
Minimum value of a vector of floats.
Definition: global.cpp:1100
-
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition: Context.cpp:1328
-
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition: Context.cpp:1372
-
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition: Context.cpp:1212
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
R-G-B-A color vector.
-
Vector of spherical coordinates (elevation,azimuth)
-
Vector of three elements of type 'int'.
-
int x
First element in vector.
-
int z
Third element in vector.
-
int y
Second element in vector.
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
vec3 normalize()
Normalize vector components such that the magnitude is unity.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
+ +
std::vector< uint > slicePrimitivesUsingGrid(std::vector< uint > UUIDs, helios::vec3 grid_center, helios::vec3 grid_size, helios::int3 grid_divisions)
Slice a primitives based on a defined grid of voxels.
+
void calculatePrimitiveVoxelIntersection(void)
Calculate primitives that reside in all voxels for every primitive in the Context.
+
std::vector< uint > slicePrimitive(uint UUID, std::vector< helios::vec3 > voxel_face_vertices)
Slice a primitive (patch or triangle) into multiple triangles using a defined plane (often a voxel fa...
+
int selfTest(void)
Self-test function (unit tests)
+
VoxelIntersection(helios::Context *context)
Default constructor.
+
helios::vec3 linesIntersection(helios::vec3 line1_point, helios::vec3 line1_direction, helios::vec3 line2_point, helios::vec3 line2_direction)
Calculate the intersection point of two lines.
+
bool approxSame(float a, float b, float absTol, float relTol)
compare two floating point numbers to within an absolute and relative error tolerance
+
std::vector< std::vector< uint > > getCellPrimitives()
get 2D vector storing the UUIDs within each grid cell
+
void disableMessages()
Disable output messages (enabled by default)
+
helios::vec2 interpolate_texture_UV_to_slice_point(helios::vec3 p1, helios::vec2 uv1, helios::vec3 p2, helios::vec2 uv2, helios::vec3 ps)
find the uv coordinate of a slice point
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void copyPrimitiveData(uint sourceUUID, uint destinationUUID)
copy all primitive data from one primitive to another
+
float getPrimitiveArea(uint UUID) const
Method to return the surface area of a Primitive.
Definition Context.cpp:7053
+
void getPrimitiveData(uint UUID, const char *label, int &data) const
Get data associated with a primitive element.
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
uint getPrimitiveParentObjectID(uint UUID) const
Method to return the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:7017
+
helios::RGBAcolor getPrimitiveColorRGBA(uint UUID) const
Method to return the diffuse color of a Primitive with transparency.
Definition Context.cpp:7135
+
std::string getPrimitiveTextureFile(uint UUID) const
Get the path to texture map file for primitive. If primitive does not have a texture map,...
Definition Context.cpp:7159
+
std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
Get u-v texture coordinates at primitive vertices.
Definition Context.cpp:7175
+
void setPrimitiveParentObjectID(uint UUID, uint objID)
Method to set the ID of the parent object the primitive belongs to (default is object 0)
Definition Context.cpp:6988
+
helios::ObjectType getObjectType(uint ObjID) const
Get an enumeration specifying the type of the object.
Definition Context.cpp:2940
+
void overridePrimitiveTextureColor(uint UUID)
Override the color in the texture map for all primitives in the Compound Object, in which case the pr...
Definition Context.cpp:7197
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
bool isPrimitiveTextureColorOverridden(uint UUID) const
Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
Definition Context.cpp:7217
+
helios::vec3 getPrimitiveNormal(uint UUID) const
Method to return the normal vector of a Primitive.
Definition Context.cpp:7104
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
bool doesPrimitiveExist(uint UUID) const
Check if primitive exists for a given UUID.
Definition Context.cpp:1659
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
void cropDomain(std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
Crop specified UUIDs such that they lie within some specified axis-aligned box.
Definition Context.cpp:2213
+
float sumPrimitiveSurfaceArea(const std::vector< uint > &UUIDs) const
Sum the one-sided surface area of a group of primitives.
+
float randu()
Random number from a uniform distribution between 0 and 1.
Definition global.cpp:223
+
float min(const std::vector< float > &vect)
Minimum value of a vector of floats.
Definition global.cpp:1100
+
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition Context.cpp:1328
+
uint addVoxel(const helios::vec3 &center, const helios::vec3 &size)
Add new Voxel geometric primitive.
Definition Context.cpp:1372
+
uint addPatch()
Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
Definition Context.cpp:1212
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
R-G-B-A color vector.
+
Vector of spherical coordinates (elevation,azimuth)
+
Vector of three elements of type 'int'.
+
int x
First element in vector.
+
int z
Third element in vector.
+
int y
Second element in vector.
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+ diff --git a/doc/html/_voxel_intersection_8cu.html b/doc/html/_voxel_intersection_8cu.html index 32d01ff76..274228341 100644 --- a/doc/html/_voxel_intersection_8cu.html +++ b/doc/html/_voxel_intersection_8cu.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
Macros | @@ -101,20 +113,20 @@ - +

Macros

#define CUDA_CHECK_ERROR(ans)   { gpuAssert((ans), __FILE__, __LINE__); }
#define CUDA_CHECK_ERROR(ans)
 
- + - + - + - + - +

Functions

void gpuAssert (cudaError_t code, const char *file, int line, bool abort=true)
void gpuAssert (cudaError_t code, const char *file, int line, bool abort=true)
 
float3 vec3tofloat3 (helios::vec3 v3)
float3 vec3tofloat3 (helios::vec3 v3)
 
helios::vec3 float3tovec3 (float3 f3)
helios::vec3 float3tovec3 (float3 f3)
 
__device__ float3 d_rotatePoint_vi (const float3 &position, const float &theta, const float &phi)
__device__ float3 d_rotatePoint_vi (const float3 &position, const float &theta, const float &phi)
 
__global__ void insideVolume_vi (const uint Nhits, const float3 *d_hit_xyz, const uint Ngridcells, const float3 *d_grid_size, const float3 *d_grid_center, const float *d_grid_rotation, int *d_hit_vol)
__global__ void insideVolume_vi (const uint Nhits, const float3 *d_hit_xyz, const uint Ngridcells, const float3 *d_grid_size, const float3 *d_grid_center, const float *d_grid_rotation, int *d_hit_vol)
 

Detailed Description

@@ -134,13 +146,13 @@

#define CUDA_CHECK_ERROR ( -   - ans) -    { gpuAssert((ans), __FILE__, __LINE__); } + ans) +

@@ -155,25 +167,17 @@

__device__ float3 d_rotatePoint_vi ( - const float3 &  - position, + const float3 & position, - const float &  - theta, + const float & theta, - const float &  - phi  - - - - ) - + const float & phi )

@@ -332,8 +314,7 @@

float3 vec3tofloat3 ( - helios::vec3  - v3) + helios::vec3 v3) @@ -351,7 +332,8 @@

+

diff --git a/doc/html/_voxel_intersection_8cu_source.html b/doc/html/_voxel_intersection_8cu_source.html index 20f6ab9c3..adc4e67a6 100644 --- a/doc/html/_voxel_intersection_8cu_source.html +++ b/doc/html/_voxel_intersection_8cu_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
VoxelIntersection.cu
@@ -289,18 +301,25 @@
209
210}
211
+
213 printmessages=false;
214}
+
215
+
217 printmessages=true;
218}
+
219
+
223
+
225
226 if( printmessages ){
@@ -439,27 +458,29 @@
359 }
360
361}
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
-
PrimitiveType
Type of primitive element.
Definition: Context.h:31
-
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition: Context.h:37
+
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
+
PrimitiveType
Type of primitive element.
Definition Context.h:31
+
@ PRIMITIVE_TYPE_VOXEL
Rectangular prism primitive.
Definition Context.h:37
-
void calculatePrimitiveVoxelIntersection(void)
Calculate primitives that reside in all voxels for every primitive in the Context.
-
void enableMessages()
Re-enable output messages.
-
void disableMessages()
Disable output messages (enabled by default)
-
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition: Context.cpp:6984
-
helios::vec3 getVoxelSize(uint UUID) const
Get the size of a voxel element.
Definition: Context.cpp:1741
-
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition: Context.cpp:1763
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
helios::vec3 getVoxelCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a voxel element.
Definition: Context.cpp:1750
-
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition: Context.cpp:7122
-
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
+
void calculatePrimitiveVoxelIntersection(void)
Calculate primitives that reside in all voxels for every primitive in the Context.
+
void enableMessages()
Re-enable output messages.
+
void disableMessages()
Disable output messages (enabled by default)
+
PrimitiveType getPrimitiveType(uint UUID) const
Method to get the Primitive type.
Definition Context.cpp:6984
+
helios::vec3 getVoxelSize(uint UUID) const
Get the size of a voxel element.
Definition Context.cpp:1741
+
std::vector< uint > getAllUUIDs() const
Get all primitive UUIDs currently in the Context.
Definition Context.cpp:1763
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
helios::vec3 getVoxelCenter(uint UUID) const
Get the Cartesian (x,y,z) center position of a voxel element.
Definition Context.cpp:1750
+
std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
Method to return the (x,y,z) coordinates of the vertices of a Primitive.
Definition Context.cpp:7122
+
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+ diff --git a/doc/html/_voxel_intersection_8h.html b/doc/html/_voxel_intersection_8h.html index 61d4e72d8..65cf3971b 100644 --- a/doc/html/_voxel_intersection_8h.html +++ b/doc/html/_voxel_intersection_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
@@ -113,7 +125,8 @@
+ diff --git a/doc/html/_voxel_intersection_8h_source.html b/doc/html/_voxel_intersection_8h_source.html index 77aaac580..cde26eef8 100644 --- a/doc/html/_voxel_intersection_8h_source.html +++ b/doc/html/_voxel_intersection_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
VoxelIntersection.h
@@ -98,11 +110,12 @@
18
19#include "Context.h"
20
+
22 public:
23
25
- +
29
31 int selfTest( void );
32
@@ -145,28 +158,31 @@
120 std::vector<std::vector<uint>> cell_primitives;
121
122};
+
123
124#endif
- -
std::vector< uint > slicePrimitivesUsingGrid(std::vector< uint > UUIDs, helios::vec3 grid_center, helios::vec3 grid_size, helios::int3 grid_divisions)
Slice a primitives based on a defined grid of voxels.
-
void calculatePrimitiveVoxelIntersection(void)
Calculate primitives that reside in all voxels for every primitive in the Context.
-
void enableMessages()
Re-enable output messages.
-
std::vector< uint > slicePrimitive(uint UUID, std::vector< helios::vec3 > voxel_face_vertices)
Slice a primitive (patch or triangle) into multiple triangles using a defined plane (often a voxel fa...
-
int selfTest(void)
Self-test function (unit tests)
-
helios::vec3 linesIntersection(helios::vec3 line1_point, helios::vec3 line1_direction, helios::vec3 line2_point, helios::vec3 line2_direction)
Calculate the intersection point of two lines.
-
bool approxSame(float a, float b, float absTol, float relTol)
compare two floating point numbers to within an absolute and relative error tolerance
-
std::vector< std::vector< uint > > getCellPrimitives()
get 2D vector storing the UUIDs within each grid cell
-
void disableMessages()
Disable output messages (enabled by default)
-
helios::vec2 interpolate_texture_UV_to_slice_point(helios::vec3 p1, helios::vec2 uv1, helios::vec3 p2, helios::vec2 uv2, helios::vec3 ps)
find the uv coordinate of a slice point
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
Vector of three elements of type 'int'.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
+ +
std::vector< uint > slicePrimitivesUsingGrid(std::vector< uint > UUIDs, helios::vec3 grid_center, helios::vec3 grid_size, helios::int3 grid_divisions)
Slice a primitives based on a defined grid of voxels.
+
void calculatePrimitiveVoxelIntersection(void)
Calculate primitives that reside in all voxels for every primitive in the Context.
+
void enableMessages()
Re-enable output messages.
+
std::vector< uint > slicePrimitive(uint UUID, std::vector< helios::vec3 > voxel_face_vertices)
Slice a primitive (patch or triangle) into multiple triangles using a defined plane (often a voxel fa...
+
int selfTest(void)
Self-test function (unit tests)
+
VoxelIntersection(helios::Context *context)
Default constructor.
+
helios::vec3 linesIntersection(helios::vec3 line1_point, helios::vec3 line1_direction, helios::vec3 line2_point, helios::vec3 line2_direction)
Calculate the intersection point of two lines.
+
bool approxSame(float a, float b, float absTol, float relTol)
compare two floating point numbers to within an absolute and relative error tolerance
+
std::vector< std::vector< uint > > getCellPrimitives()
get 2D vector storing the UUIDs within each grid cell
+
void disableMessages()
Disable output messages (enabled by default)
+
helios::vec2 interpolate_texture_UV_to_slice_point(helios::vec3 p1, helios::vec2 uv1, helios::vec3 p2, helios::vec2 uv2, helios::vec3 ps)
find the uv coordinate of a slice point
+
Stores the state associated with simulation.
Definition Context.h:1882
+
Vector of three elements of type 'int'.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/_voxel_intersection_doc.html b/doc/html/_voxel_intersection_doc.html index ff584f5ca..d478ae963 100644 --- a/doc/html/_voxel_intersection_doc.html +++ b/doc/html/_voxel_intersection_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
-
Voxel Intersection Plugin Documentation
+
Voxel Intersection Plugin Documentation


@@ -126,13 +154,13 @@

Package
-td
+
-td
+
-td + NVIDIA CUDA 9.0+ Mac OSX:
$ brew install Caskroom/cask/cuda
Use CUDA installer Use CUDA installer @@ -265,7 +293,8 @@

+
diff --git a/doc/html/_weber_penn_doc.html b/doc/html/_weber_penn_doc.html index 962111319..66ff96406 100644 --- a/doc/html/_weber_penn_doc.html +++ b/doc/html/_weber_penn_doc.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +

+
-
Weber-Penn Tree Plugin Documentation
+
Weber-Penn Tree Plugin Documentation
@@ -149,7 +193,7 @@

Using the Weber-Penn Tree Plug-in

The XML Tree Library File

-

The parameters that define various tree geometries are specified in an XML file, which is loaded by the plug-in. When the WeberPennTree constructor is called, the defalut tree library is loaded. A list of trees in the default library is listed in the table below. Default tree parameters can be modified by the user, or custom tree libraries can be added, which is detailed in Section Custom Tree Library Files. An example tree definition is given below. The tree definition is encapsulated by the <WeberPennTree label="...">...</WeberPennTree> tag, where label gives a handle used to reference that specific tree geometry. Other tags define various parameters that determine the structure of the tree, which are detailed in the sections below.

+

The parameters that define various tree geometries are specified in an XML file, which is loaded by the plug-in. When the WeberPennTree constructor is called, the defalut tree library is loaded. A list of trees in the default library is listed in the table below. Default tree parameters can be modified by the user, or custom tree libraries can be added, which is detailed in Section Custom Tree Library Files. An example tree definition is given below. The tree definition is encapsulated by the <WeberPennTree label="...">...</WeberPennTree> tag, where label gives a handle used to reference that specific tree geometry. Other tags define various parameters that determine the structure of the tree, which are detailed in the sections below.

@@ -157,47 +201,47 @@

+ + + + + + + + +
Tree typeSample Image
Almond
-td
Apple
-td
Avocado
-td
Lemon
-td
Olive
-td
Orange
-td
Peach
-td
Pistachio
-td
Walnut
-td
 <?xml version=1.0?>
 
@@ -324,42 +368,42 @@ 

0Conical
-td + 1Spherical/Ellipsoidal
-td + 2Hemispherical
-td + 3Cylindrical
-td + 4Tapered Cylindrical
-td + 5Flame
-td + 6Inverse Conical
-td + 7Tend Flame
-td +

Recursive Branches

@@ -439,7 +483,8 @@

+
diff --git a/doc/html/_weber_penn_tree_8cpp.html b/doc/html/_weber_penn_tree_8cpp.html index 31f35f19e..f5ed21d92 100644 --- a/doc/html/_weber_penn_tree_8cpp.html +++ b/doc/html/_weber_penn_tree_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
WeberPennTree.cpp File Reference
@@ -107,7 +119,8 @@
+
diff --git a/doc/html/_weber_penn_tree_8cpp_source.html b/doc/html/_weber_penn_tree_8cpp_source.html index a9083134d..07b92c754 100644 --- a/doc/html/_weber_penn_tree_8cpp_source.html +++ b/doc/html/_weber_penn_tree_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
WeberPennTree.cpp
@@ -101,6 +113,7 @@
21
22using namespace helios;
23
+
25
26 context = __context;
@@ -120,7 +133,9 @@
40 generator.seed(seed);
41
42}
+
43
+
45
46 std::cout << "Building trees in the default library..." << std::flush;
@@ -157,11 +172,15 @@
77 return 0;
78
79}
+
80
+
81uint WeberPennTree::buildTree( const char* treename, helios::vec3 origin ){
82 return buildTree(treename,origin,1);
83}
+
84
+
85uint WeberPennTree::buildTree( const char* treename, helios::vec3 origin, float scale ){
86
87 if( trees_library.find(treename)==trees_library.end() ){
@@ -348,7 +367,7 @@
268
269 for( uint s=0; s<stems_per_segment; s++ ){
270
-
271 vec3 base_position = nodes.at(i-1) + (nodes.at(i)-nodes.at(i-1))*float(s+0.5)/float(stems_per_segment);
+
271 vec3 base_position = nodes.at(i-1) + (nodes.at(i)-nodes.at(i-1))*float(s+0.5)/float(stems_per_segment);
272
273 float downangle = (parameters.nDownAngle.at(1)+getVariation(parameters.nDownAngleV.at(1)))*M_PI/180.f;
274 helios::SphericalCoord child_rotation = make_SphericalCoord(downangle,phi_child);
@@ -368,7 +387,7 @@
288 }
289 }
290
-
291 theta += (-parameters.nCurve.at(0)+getVariation(parameters.nCurveV.at(0)))/float(parameters.nCurveRes.at(0))*M_PI/180.f;
+
291 theta += (-parameters.nCurve.at(0)+getVariation(parameters.nCurveV.at(0)))/float(parameters.nCurveRes.at(0))*M_PI/180.f;
292
293 }
294
@@ -417,6 +436,7 @@
337 return TreeID;
338
339}
+
340
341void WeberPennTree::recursiveBranch( WeberPennTreeParameters parameters, uint n, uint seg_start, helios::vec3 base_position, helios::vec3 parent_normal, helios::SphericalCoord child_rotation, float length_parent, float radius_parent, float offset_child, helios::vec3 origin, float scale, const uint leaf_template, float base_size, uint base_splits ){
342
@@ -500,7 +520,7 @@
420 }else if( seg_start==0 ){
421 radius.at(0) = radius_parent*pow(length_child/length_parent,parameters.RatioPower);
422 }else{
-
423 radius.at(0) = radius_parent*pow(length_child/length_parent,parameters.RatioPower)*(1-parameters.nTaper.at(n)*float(seg_start)/float(parameters.nCurveRes.at(n)));
+
423 radius.at(0) = radius_parent*pow(length_child/length_parent,parameters.RatioPower)*(1-parameters.nTaper.at(n)*float(seg_start)/float(parameters.nCurveRes.at(n)));
424 }
425 nodes.at(0) = base_position;
426 color.at(0) = parameters.WoodColor;
@@ -740,6 +760,7 @@
660
661}
662
+
663std::vector<uint> WeberPennTree::getTrunkUUIDs( const uint TreeID ){
664
665 if( TreeID >= UUID_trunk.size() ){
@@ -749,7 +770,9 @@
669
670 return UUID_trunk.at(TreeID);
671}
+
672
+
673std::vector<uint> WeberPennTree::getBranchUUIDs( const uint TreeID ){
674
675 if( TreeID >= UUID_branch.size() ){
@@ -759,7 +782,9 @@
679
680 return UUID_branch.at(TreeID);
681}
+
682
+
683std::vector<uint> WeberPennTree::getLeafUUIDs( const uint TreeID ){
684
685 if( TreeID >= UUID_leaf.size() ){
@@ -769,7 +794,9 @@
689
690 return UUID_leaf.at(TreeID);
691}
+
692
+
693std::vector<uint> WeberPennTree::getAllUUIDs( const uint TreeID ){
694
695 if( TreeID >= UUID_leaf.size() ){
@@ -783,11 +810,15 @@
703 UUIDs.insert(UUIDs.end(),UUID_leaf.at(TreeID).begin(),UUID_leaf.at(TreeID).end());
704 return UUIDs;
705}
+
706
+
708 branchLevels = level;
709}
+
710
+
712 if( segs<3 ){
713 std::cout << "WARNING (WeberPennTree::setTrunkSegmentResolution): cannot set trunk segment resolution less than 3. Ignoring this command." << std::endl;
@@ -795,7 +826,9 @@
715 trunk_segs=segs;
716 }
717}
+
718
+
720 if( segs<3 ){
721 std::cout << "WARNING (WeberPennTree::setBranchSegmentResolution): cannot set branch segment resolution less than 3. Ignoring this command." << std::endl;
@@ -803,7 +836,9 @@
723 branch_segs=segs;
724 }
725}
+
726
+
728 if( segs.x<1 || segs.y<1 ){
729 std::cout << "WARNING (WeberPennTree::setLeafSubdivisions): cannot set number of leaf subdivisions to less than 1. Ignoring this command." << std::endl;
@@ -811,7 +846,9 @@
731 leaf_segs=segs;
732 }
733}
+
734
+
736
737 if( trees_library.find(treename)==trees_library.end() ){
@@ -822,7 +859,9 @@
742 return trees_library.at(treename);
743
744}
+
745
+
746void WeberPennTree::setTreeParameters( const char* treename, const WeberPennTreeParameters parameters ){
747
748 if( trees_library.find(treename)==trees_library.end() ){
@@ -833,11 +872,15 @@
753 trees_library.at(treename) = parameters;
754
755}
+
756
+
758 generator.seed(seed);
759}
+
760
+
761void WeberPennTree::loadXML( const char* filename ){
762
763 std::cout << "Loading Weber Penn Tree library from XML file: " << filename << "..." << std::flush;
@@ -1543,7 +1586,9 @@
1463
1464
1465}
+
1466
+
1468
1469 if( strcmp(label,"element_type")==0 || strcmp(label,"branch_radius")==0 ){
@@ -1553,70 +1598,72 @@
1473 }
1474
1475}
-
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition: Context.h:45
+
+
@ HELIOS_TYPE_UINT
unsigned integer data type
Definition Context.h:45
- -
void setLeafSubdivisions(const helios::int2 leaf_segs)
Set the number of sub-patch divisions for leaves.
-
std::vector< uint > getAllUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
-
void loadXML(const char *filename)
Load tree library from an XML file.
-
void setTreeParameters(const char *treename, const WeberPennTreeParameters parameters)
Set the architectural parameters for a tree in the currently loaded library.
-
uint buildTree(const char *treename, helios::vec3 origin)
Construct a Weber-Penn tree using a tree already in the library.
-
WeberPennTree(helios::Context *context)
Weber-Penn Tree constructor.
-
void setBranchRecursionLevel(const uint level)
Only create branch primitives up to a certain recursion level (leaves are still created for all level...
-
std::vector< uint > getBranchUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree branches.
-
void seedRandomGenerator(const uint seed)
Seed the random number generator. This can be useful for generating repeatable trees,...
-
void setBranchSegmentResolution(const uint branch_segs)
Set the radial triangle subdivisions for branches.
-
int selfTest(void)
Unit testing routine.
-
WeberPennTreeParameters getTreeParameters(const char *treename)
Get the architectural parameters for a tree in the currently loaded library.
-
std::vector< uint > getTrunkUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree trunk.
-
void setTrunkSegmentResolution(const uint trunk_segs)
Set the radial triangle subdivisions for trunks.
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
std::vector< uint > getLeafUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree leaves.
-
void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
Method to rotate a Compound Object about the x-, y-, or z-axis.
Definition: Context.cpp:2377
-
void translate(const helios::vec3 &shift)
Method to translate/shift a Compound Object.
Definition: Context.cpp:2353
-
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition: Context.cpp:2256
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition: Context.cpp:2642
-
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition: Context.cpp:2574
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition: Context.cpp:2609
-
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
-
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition: Context.cpp:3312
-
vec3 getNormal() const
Get a unit vector normal to the tile object surface.
Definition: Context.cpp:3385
-
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition: global.cpp:140
-
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:5930
-
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition: Context.cpp:4550
-
vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
Function to rotate a 3D vector given spherical angles elevation and azimuth.
Definition: global.cpp:79
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
RGBAcolor string2RGBcolor(const char *str)
Convert a space-delimited string into an RGBcolor vector.
Definition: global.cpp:743
-
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition: global.cpp:617
-
std::string deblank(const char *input)
Remove all whitespace from character array.
Definition: global.cpp:994
-
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
- -
R-G-B-A color vector.
-
float r
Red color component.
-
float b
Blue color component.
-
float g
Green color component.
-
Vector of spherical coordinates (elevation,azimuth)
- -
const float & zenith
Zenithal angle (radians)
-
const float & elevation
Elevation angle (radians)
-
float azimuth
Azimuthal angle (radians)
-
Vector of two elements of type 'int'.
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of three elements of type 'float'.
-
vec3 normalize()
Normalize vector components such that the magnitude is unity.
-
float z
Third element in vector.
+ +
void setLeafSubdivisions(const helios::int2 leaf_segs)
Set the number of sub-patch divisions for leaves.
+
std::vector< uint > getAllUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
+
void loadXML(const char *filename)
Load tree library from an XML file.
+
void setTreeParameters(const char *treename, const WeberPennTreeParameters parameters)
Set the architectural parameters for a tree in the currently loaded library.
+
uint buildTree(const char *treename, helios::vec3 origin)
Construct a Weber-Penn tree using a tree already in the library.
+
WeberPennTree(helios::Context *context)
Weber-Penn Tree constructor.
+
void setBranchRecursionLevel(const uint level)
Only create branch primitives up to a certain recursion level (leaves are still created for all level...
+
std::vector< uint > getBranchUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree branches.
+
void seedRandomGenerator(const uint seed)
Seed the random number generator. This can be useful for generating repeatable trees,...
+
void setBranchSegmentResolution(const uint branch_segs)
Set the radial triangle subdivisions for branches.
+
int selfTest(void)
Unit testing routine.
+
WeberPennTreeParameters getTreeParameters(const char *treename)
Get the architectural parameters for a tree in the currently loaded library.
+
std::vector< uint > getTrunkUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree trunk.
+
void setTrunkSegmentResolution(const uint trunk_segs)
Set the radial triangle subdivisions for trunks.
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
std::vector< uint > getLeafUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree leaves.
+
void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
Method to rotate a Compound Object about the x-, y-, or z-axis.
Definition Context.cpp:2377
+
void translate(const helios::vec3 &shift)
Method to translate/shift a Compound Object.
Definition Context.cpp:2353
+
std::vector< uint > getPrimitiveUUIDs() const
Get the UUIDs for all primitives contained in the object.
Definition Context.cpp:2256
+
Stores the state associated with simulation.
Definition Context.h:1882
+
uint copyObject(uint ObjID)
Make a copy of a Compound Objects from the context.
Definition Context.cpp:2642
+
CompoundObject * getObjectPointer(uint ObjID) const
Get a pointer to a Compound Object.
Definition Context.cpp:2574
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
void deleteObject(uint ObjID)
Delete a single Compound Object from the context.
Definition Context.cpp:2609
+
void setPrimitiveData(const uint &UUID, const char *label, const int &data)
Add data value (int) associated with a primitive element.
+
Tile * getTileObjectPointer(uint ObjID) const
Get a pointer to a Tile Compound Object.
Definition Context.cpp:3312
+
vec3 getNormal() const
Get a unit vector normal to the tile object surface.
Definition Context.cpp:3385
+
vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
Rotate a 3D vector about an arbitrary line.
Definition global.cpp:140
+
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:5930
+
uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
Add a patch that is subdivided into a regular grid of sub-patches (tiled)
Definition Context.cpp:4550
+
vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
Function to rotate a 3D vector given spherical angles elevation and azimuth.
Definition global.cpp:79
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
RGBAcolor string2RGBcolor(const char *str)
Convert a space-delimited string into an RGBcolor vector.
Definition global.cpp:743
+
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition global.cpp:617
+
std::string deblank(const char *input)
Remove all whitespace from character array.
Definition global.cpp:994
+
int2 make_int2(int x, int y)
Make an int2 vector from two ints.
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
vec3 cross(const vec3 &a, const vec3 &b)
Cross product of two vec3 vectors.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+ +
R-G-B-A color vector.
+
float r
Red color component.
+
float b
Blue color component.
+
float g
Green color component.
+
Vector of spherical coordinates (elevation,azimuth)
+ +
const float & zenith
Zenithal angle (radians)
+
const float & elevation
Elevation angle (radians)
+
float azimuth
Azimuthal angle (radians)
+
Vector of two elements of type 'int'.
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of three elements of type 'float'.
+
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
float z
Third element in vector.
+
diff --git a/doc/html/_weber_penn_tree_8h.html b/doc/html/_weber_penn_tree_8h.html index 90d260ae9..96ba188b5 100644 --- a/doc/html/_weber_penn_tree_8h.html +++ b/doc/html/_weber_penn_tree_8h.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -116,7 +128,8 @@
+ diff --git a/doc/html/_weber_penn_tree_8h_source.html b/doc/html/_weber_penn_tree_8h_source.html index 0e93be565..2ab7c8139 100644 --- a/doc/html/_weber_penn_tree_8h_source.html +++ b/doc/html/_weber_penn_tree_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
WeberPennTree.h
@@ -96,6 +108,7 @@
16#include "Context.h"
17#include <random>
18
+
20
21 // Name of tree
@@ -171,12 +184,14 @@
91 std::vector<float> leafAngleCDF;
92
93};
+
94
+
96 public:
97
99
-
101 WeberPennTree( helios::Context* context );
+
101 WeberPennTree( helios::Context* context );
102
104 int selfTest( void );
105
@@ -257,33 +272,36 @@
235 std::vector<std::string> output_prim_data;
236
237};
+
- -
void setLeafSubdivisions(const helios::int2 leaf_segs)
Set the number of sub-patch divisions for leaves.
-
std::vector< uint > getAllUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
-
void loadXML(const char *filename)
Load tree library from an XML file.
-
void setTreeParameters(const char *treename, const WeberPennTreeParameters parameters)
Set the architectural parameters for a tree in the currently loaded library.
-
uint buildTree(const char *treename, helios::vec3 origin)
Construct a Weber-Penn tree using a tree already in the library.
-
void setBranchRecursionLevel(const uint level)
Only create branch primitives up to a certain recursion level (leaves are still created for all level...
-
std::vector< uint > getBranchUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree branches.
-
void seedRandomGenerator(const uint seed)
Seed the random number generator. This can be useful for generating repeatable trees,...
-
void setBranchSegmentResolution(const uint branch_segs)
Set the radial triangle subdivisions for branches.
-
int selfTest(void)
Unit testing routine.
-
WeberPennTreeParameters getTreeParameters(const char *treename)
Get the architectural parameters for a tree in the currently loaded library.
-
std::vector< uint > getTrunkUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree trunk.
-
void setTrunkSegmentResolution(const uint trunk_segs)
Set the radial triangle subdivisions for trunks.
-
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
-
std::vector< uint > getLeafUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree leaves.
-
Stores the state associated with simulation.
Definition: Context.h:1882
- -
R-G-B color vector.
-
Vector of spherical coordinates (elevation,azimuth)
-
Vector of two elements of type 'int'.
-
Vector of three elements of type 'float'.
+ +
void setLeafSubdivisions(const helios::int2 leaf_segs)
Set the number of sub-patch divisions for leaves.
+
std::vector< uint > getAllUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
+
void loadXML(const char *filename)
Load tree library from an XML file.
+
void setTreeParameters(const char *treename, const WeberPennTreeParameters parameters)
Set the architectural parameters for a tree in the currently loaded library.
+
uint buildTree(const char *treename, helios::vec3 origin)
Construct a Weber-Penn tree using a tree already in the library.
+
WeberPennTree(helios::Context *context)
Weber-Penn Tree constructor.
+
void setBranchRecursionLevel(const uint level)
Only create branch primitives up to a certain recursion level (leaves are still created for all level...
+
std::vector< uint > getBranchUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree branches.
+
void seedRandomGenerator(const uint seed)
Seed the random number generator. This can be useful for generating repeatable trees,...
+
void setBranchSegmentResolution(const uint branch_segs)
Set the radial triangle subdivisions for branches.
+
int selfTest(void)
Unit testing routine.
+
WeberPennTreeParameters getTreeParameters(const char *treename)
Get the architectural parameters for a tree in the currently loaded library.
+
std::vector< uint > getTrunkUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree trunk.
+
void setTrunkSegmentResolution(const uint trunk_segs)
Set the radial triangle subdivisions for trunks.
+
void optionalOutputPrimitiveData(const char *label)
Add optional output primitive data values to the Context.
+
std::vector< uint > getLeafUUIDs(const uint TreeID)
Get the unique universal identifiers (UUIDs) for the primitives that make up the tree leaves.
+
Stores the state associated with simulation.
Definition Context.h:1882
+ +
R-G-B color vector.
+
Vector of spherical coordinates (elevation,azimuth)
+
Vector of two elements of type 'int'.
+
Vector of three elements of type 'float'.
+ diff --git a/doc/html/aeriallidar_2include_2random_8h_source.html b/doc/html/aeriallidar_2include_2random_8h_source.html index 1fb1491a5..77094eb7a 100644 --- a/doc/html/aeriallidar_2include_2random_8h_source.html +++ b/doc/html/aeriallidar_2include_2random_8h_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
random.h
@@ -149,7 +161,8 @@
+ diff --git a/doc/html/aeriallidar_2src_2file_i_o_8cpp.html b/doc/html/aeriallidar_2src_2file_i_o_8cpp.html index e6408c3b9..1f65b2b21 100644 --- a/doc/html/aeriallidar_2src_2file_i_o_8cpp.html +++ b/doc/html/aeriallidar_2src_2file_i_o_8cpp.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
fileIO.cpp File Reference
@@ -106,7 +118,8 @@
+ diff --git a/doc/html/aeriallidar_2src_2file_i_o_8cpp_source.html b/doc/html/aeriallidar_2src_2file_i_o_8cpp_source.html index 004fd9f42..e620d7e27 100644 --- a/doc/html/aeriallidar_2src_2file_i_o_8cpp_source.html +++ b/doc/html/aeriallidar_2src_2file_i_o_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + + +
fileIO.cpp
@@ -99,6 +111,7 @@
19using namespace helios;
20using namespace std;
21
+
22void AerialLiDARcloud::loadXML( const char* filename ){
23
24 if( printmessages ){
@@ -467,36 +480,38 @@
387 }
388
389}
+
-
void addScan(const AerialScanMetadata newscan)
Add a LiDAR scan to the point cloud.
-
void addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
Specify a scan point as a hit by providing the (x,y,z) coordinates of the origin and hit point.
-
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition: fileIO.cpp:22
-
uint getScanCount(void)
Get number of scans in point cloud.
-
vec2 string2vec2(const char *str)
Convert a space-delimited string into a vec2 vector.
Definition: global.cpp:623
-
float deg2rad(float deg)
Convert degrees to radians.
Definition: global.cpp:576
-
vec3 string2vec3(const char *str)
Convert a space-delimited string into a vec3 vector.
Definition: global.cpp:643
-
std::string deblank(const char *input)
Remove all whitespace from character array.
Definition: global.cpp:994
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
-
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
Structure containing metadata for an aerial scan.
Definition: AerialLiDAR.h:26
-
R-G-B color vector.
-
float b
Blue color component.
-
float r
Red color component.
-
float g
Green color component.
-
Vector of spherical coordinates (elevation,azimuth)
-
Vector of two elements of type 'float'.
-
float x
First element in vector.
-
float y
Second element in vector.
-
Vector of three elements of type 'float'.
-
float x
First element in vector.
-
float z
Third element in vector.
-
float y
Second element in vector.
+
void addScan(const AerialScanMetadata newscan)
Add a LiDAR scan to the point cloud.
+
void addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
Specify a scan point as a hit by providing the (x,y,z) coordinates of the origin and hit point.
+
void loadXML(const char *filename)
Read an XML file containing scan information.
Definition fileIO.cpp:22
+
uint getScanCount(void)
Get number of scans in point cloud.
+
vec2 string2vec2(const char *str)
Convert a space-delimited string into a vec2 vector.
Definition global.cpp:623
+
float deg2rad(float deg)
Convert degrees to radians.
Definition global.cpp:576
+
vec3 string2vec3(const char *str)
Convert a space-delimited string into a vec3 vector.
Definition global.cpp:643
+
std::string deblank(const char *input)
Remove all whitespace from character array.
Definition global.cpp:994
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
RGBcolor make_RGBcolor(float r, float g, float b)
Make an RGBcolor vector.
+
int3 make_int3(int X, int Y, int Z)
Make an int3 vector from three ints.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
Structure containing metadata for an aerial scan.
Definition AerialLiDAR.h:26
+
R-G-B color vector.
+
float b
Blue color component.
+
float r
Red color component.
+
float g
Green color component.
+
Vector of spherical coordinates (elevation,azimuth)
+
Vector of two elements of type 'float'.
+
float x
First element in vector.
+
float y
Second element in vector.
+
Vector of three elements of type 'float'.
+
float x
First element in vector.
+
float z
Third element in vector.
+
float y
Second element in vector.
+ diff --git a/doc/html/annotated.html b/doc/html/annotated.html index f118b1fda..c80081801 100644 --- a/doc/html/annotated.html +++ b/doc/html/annotated.html @@ -38,31 +38,43 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Here are the data structures with brief descriptions:
-
[detail level 12]
- +
[detail level 12]
 Nhelios
+ @@ -128,7 +140,7 @@ - + @@ -195,7 +207,8 @@ + diff --git a/doc/html/bdwn.png b/doc/html/bdwn.png deleted file mode 100644 index 940a0b950443a0bb1b216ac03c45b8a16c955452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T
 Nhelios
 CBoxBox compound object class
 CCompoundObject
 CConeCone compound object class
 CBLConductanceModelBoundary-layer conductance model class
 CBMFcoefficientsCoefficients for simplified Buckley, Mott, & Farquhar stomatal conductance model
 CBWBcoefficientsCoefficients for original Ball, Woodrow, Berry (1987) stomatal conductance model
 CCameraCalibrationCamera calibration structure used for camera calibration tasks
 CCameraCalibrationCamera calibration structure used for camera calibration tasks
 CGradientDescentParametersParameter struct for gradient descent
 CCameraPropertiesProperties defining a radiation camera
 CCanopyGenerator
-
 v1.3.25 +
 v1.3.26
- + + + +
+
bean.cpp
@@ -382,6 +394,7 @@
288
289}
290
+
291uint CanopyGenerator::bean(const BeanParameters &params, const vec3 &origin ){
292
293 std::vector<std::vector<uint> > leaf_UUIDs;
@@ -401,47 +414,49 @@
307 return UUID_leaf.size()-1;
308
309}
+
-
helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
Interpolate the position of a point along a tube.
-
float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
Draw a random number (float) from a uniform distribution between -V and V.
-
uint bean(const BeanParameters &params, const helios::vec3 &origin)
Function to add an individual bean plant.
Definition: bean.cpp:291
-
Stores the state associated with simulation.
Definition: Context.h:1882
-
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition: Context.cpp:1406
-
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition: Context.cpp:1536
-
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition: Context.cpp:1178
-
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition: Context.cpp:1420
-
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition: Context.cpp:1578
-
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition: Context.cpp:1491
-
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition: Context.cpp:5930
-
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition: global.cpp:610
-
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition: global.cpp:617
-
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition: Context.cpp:1328
-
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
-
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
-
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
-
Parameters defining the bean plant canopy.
-
float leaflet_length
Length of the leaflet from base to tip leaf.
-
float pod_length
Length of bean pods.
-
float leaf_length
Maximum width of leaves.
-
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
-
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
-
float stem_length
Length of stems before splitting to leaflets.
-
float stem_radius
Radius of main stem at base.
-
std::string leaf_texture_file
Path to texture map file for leaves.
-
helios::RGBcolor shoot_color
Color of shoots.
-
Vector of spherical coordinates (elevation,azimuth)
-
const float & zenith
Zenithal angle (radians)
-
const float & elevation
Elevation angle (radians)
-
float azimuth
Azimuthal angle (radians)
-
int y
Second element in vector.
-
int x
First element in vector.
-
Vector of two elements of type 'float'.
-
Vector of three elements of type 'float'.
-
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
Interpolate the position of a point along a tube.
+
float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
Draw a random number (float) from a uniform distribution between -V and V.
+
uint bean(const BeanParameters &params, const helios::vec3 &origin)
Function to add an individual bean plant.
Definition bean.cpp:291
+
Stores the state associated with simulation.
Definition Context.h:1882
+
void translatePrimitive(uint UUID, const vec3 &shift)
Translate a primitive using its UUID.
Definition Context.cpp:1406
+
void deletePrimitive(uint UUID)
Delete a single primitive from the context.
Definition Context.cpp:1536
+
float randu()
Draw a random number from a uniform distribution between 0 and 1.
Definition Context.cpp:1178
+
void rotatePrimitive(uint UUID, float rot, const char *axis)
Rotate a primitive about the x, y, or z axis using its UUID.
Definition Context.cpp:1420
+
uint copyPrimitive(uint UUID)
Make a copy of a primitive from the context.
Definition Context.cpp:1578
+
void scalePrimitive(uint UUID, const helios::vec3 &S)
Scale a primitive using its UUID relative to the origin (0,0,0)
Definition Context.cpp:1491
+
std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
Add a 3D tube compound object to the Context.
Definition Context.cpp:5930
+
SphericalCoord cart2sphere(const vec3 &Cartesian)
Convert Cartesian coordinates to spherical coordinates.
Definition global.cpp:610
+
vec3 sphere2cart(const SphericalCoord &Spherical)
Convert Spherical coordinates to Cartesian coordinates.
Definition global.cpp:617
+
uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
Add new Triangle geometric primitive.
Definition Context.cpp:1328
+
vec2 make_vec2(float x, float y)
Make a vec2 from two floats.
+
vec3 make_vec3(float x, float y, float z)
Make a vec3 from three floats.
+
SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
Make a SphericalCoord by specifying elevation and azimuth.
+
Parameters defining the bean plant canopy.
+
float leaflet_length
Length of the leaflet from base to tip leaf.
+
float pod_length
Length of bean pods.
+
float leaf_length
Maximum width of leaves.
+
int shoot_subdivisions
Number of radial subdivisions for shoot tubes.
+
helios::int2 leaf_subdivisions
Number of sub-division segments per leaf.
+
float stem_length
Length of stems before splitting to leaflets.
+
float stem_radius
Radius of main stem at base.
+
std::string leaf_texture_file
Path to texture map file for leaves.
+
helios::RGBcolor shoot_color
Color of shoots.
+
Vector of spherical coordinates (elevation,azimuth)
+
const float & zenith
Zenithal angle (radians)
+
const float & elevation
Elevation angle (radians)
+
float azimuth
Azimuthal angle (radians)
+
int y
Second element in vector.
+
int x
First element in vector.
+
Vector of two elements of type 'float'.
+
Vector of three elements of type 'float'.
+
vec3 normalize()
Normalize vector components such that the magnitude is unity.
+
diff --git a/doc/html/class_aerial_li_d_a_rcloud.html b/doc/html/class_aerial_li_d_a_rcloud.html index 225b03c4f..1f3a9de4d 100644 --- a/doc/html/class_aerial_li_d_a_rcloud.html +++ b/doc/html/class_aerial_li_d_a_rcloud.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -92,222 +104,222 @@

Primary class for aerial LiDAR scan. - More...

+ More...

#include <AerialLiDAR.h>

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 AerialLiDARcloud (void)
 AerialLiDARcloud (void)
 Aerial LiDAR point cloud constructor.
 
 ~AerialLiDARcloud (void)
 ~AerialLiDARcloud (void)
 Aerial LiDAR point cloud destructor.
 
int selfTest (void)
int selfTest (void)
 Self-test (unit test) function.
 
void disableMessages (void)
void disableMessages (void)
 Disable all print messages to the screen except for fatal error messages.
 
void enableMessages (void)
void enableMessages (void)
 Enable all print messages to the screen.
 
uint getScanCount (void)
uint getScanCount (void)
 Get number of scans in point cloud.
 
void addScan (const AerialScanMetadata newscan)
void addScan (const AerialScanMetadata newscan)
 Add a LiDAR scan to the point cloud.
 
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)
 Specify a scan point as a hit by providing the (x,y,z) coordinates of the origin and hit point.
 
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction)
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction)
 Specify a scan point as a hit by providing the (x,y,z) coordinates of the hit and scan ray direction.
 
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color)
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color)
 Specify a scan point as a hit by providing the (x,y,z) coordinates of the hit and scan ray direction.
 
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const std::map< std::string, float > data)
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const std::map< std::string, float > data)
 Specify a scan point as a hit by providing the (x,y,z) coordinates of the hit and scan ray direction.
 
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color, const std::map< std::string, float > data)
void addHitPoint (const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color, const std::map< std::string, float > data)
 Specify a scan point as a hit by providing the (x,y,z) coordinates of the hit and scan ray direction.
 
void deleteHitPoint (const uint index)
void deleteHitPoint (const uint index)
 Delete a hit point in the scan.
 
uint getHitCount (void) const
uint getHitCount (void) const
 Get the number of hit points in the point cloud.
 
helios::vec3 getScanCenter (const uint scanID) const
helios::vec3 getScanCenter (const uint scanID) const
 Get the (x,y,z) of scan surface center.
 
helios::vec2 getScanExtent (const uint scanID) const
helios::vec2 getScanExtent (const uint scanID) const
 Get the (x,y) extent of scan surface.
 
float getScanConeAngle (const uint scanID) const
float getScanConeAngle (const uint scanID) const
 Get the scan cone angle in degrees.
 
float getScanDensity (const uint scanID) const
float getScanDensity (const uint scanID) const
 Get the scan point density in points/m^2.
 
float getScanBeamExitDiameter (const uint scanID) const
float getScanBeamExitDiameter (const uint scanID) const
 Get the diameter of the laser beam at exit from the instrument.
 
float getScanBeamDivergence (const uint scanID) const
float getScanBeamDivergence (const uint scanID) const
 Divergence angle of the laser beam in radians.
 
helios::vec3 getHitXYZ (uint index) const
helios::vec3 getHitXYZ (uint index) const
 Get (x,y,z) coordinate of hit point by index.
 
helios::SphericalCoord getHitRaydir (const uint index) const
helios::SphericalCoord getHitRaydir (const uint index) const
 Get ray direction of hit point in the scan based on its index.
 
float getHitData (const uint index, const char *label) const
float getHitData (const uint index, const char *label) const
 Get floating point data value associated with a hit point.
 
void setHitData (const uint index, const char *label, const float value)
void setHitData (const uint index, const char *label, const float value)
 Set floating point data value associated with a hit point.
 
bool doesHitDataExist (const uint index, const char *label) const
bool doesHitDataExist (const uint index, const char *label) const
 Check if scalar data exists for a hit point.
 
helios::RGBcolor getHitColor (const uint index) const
helios::RGBcolor getHitColor (const uint index) const
 Get color of hit point.
 
int getHitScanID (const uint index) const
int getHitScanID (const uint index) const
 Get the scan with which a hit is associated.
 
helios::int3 getHitGridCell (const uint index) const
helios::int3 getHitGridCell (const uint index) const
 Get the grid cell in which the hit point resides.
 
void setHitGridCell (const uint index, const helios::int3 ijk)
void setHitGridCell (const uint index, const helios::int3 ijk)
 Set the grid cell in which the hit point resides.
 
void coordinateShift (const helios::vec3 shift)
void coordinateShift (const helios::vec3 shift)
 
void loadXML (const char *filename)
void loadXML (const char *filename)
 Read an XML file containing scan information.
 
+
void readContextXML (void)
 Read all XML files currently loaded into the Helios context.
 
void exportPointCloud (const char *filename)
void exportPointCloud (const char *filename)
 Export to file all points in the point cloud.
 
void addHitsToVisualizer (Visualizer *visualizer, const uint pointsize) const
void addHitsToVisualizer (Visualizer *visualizer, const uint pointsize) const
 Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
 
void addHitsToVisualizer (Visualizer *visualizer, const uint pointsize, const char *color_value) const
void addHitsToVisualizer (Visualizer *visualizer, const uint pointsize, const char *color_value) const
 Add all hit points to the visualizer plug-in, and color them by a hit scalar data value.
 
void addGridToVisualizer (Visualizer *visualizer) const
void addGridToVisualizer (Visualizer *visualizer) const
 Add all grid cells to the visualizer plug-in.
 
void getHitBoundingBox (helios::vec3 &boxmin, helios::vec3 &boxmax) const
void getHitBoundingBox (helios::vec3 &boxmin, helios::vec3 &boxmax) const
 Form an axis-aligned bounding box for all hit points in the point cloud.
 
void distanceFilter (const float maxdistance)
void distanceFilter (const float maxdistance)
 Filter scan by imposing a maximum distance from the scanner.
 
void reflectanceFilter (const float minreflectance)
void reflectanceFilter (const float minreflectance)
 Filter scan by imposing a minimum reflectance value.
 
void scalarFilter (const char *scalar_field, const float threshold, const char *comparator)
void scalarFilter (const char *scalar_field, const float threshold, const char *comparator)
 Filter hit points based on a scalar field given by a column in the ASCII data.
 
helios::int3 gridindex2ijk (const int index) const
helios::int3 gridindex2ijk (const int index) const
 Use a global index of a grid cell (ranging from 0 to Ncells-1) to retrieve the local index in the x-, y-, and z-directions.
 
int gridijk2index (const helios::int3 ijk) const
int gridijk2index (const helios::int3 ijk) const
 Use a grid cell's local index in the x-, y-, and z-directions to retrieve the cells' global index (ranging from 0 to Ncells-1)
 
helios::vec3 getGridCenter (void) const
helios::vec3 getGridCenter (void) const
 Get the (x,y,z) coordinate of the grid center.
 
helios::vec3 getGridExtent (void) const
helios::vec3 getGridExtent (void) const
 Get the size of the global grid in the x-, y-, and z-directions.
 
helios::int3 getGridResolution (void) const
helios::int3 getGridResolution (void) const
 Get the total number of cells in the grid.
 
float getGridRotation () const
float getGridRotation () const
 Get the azimuthal rotation angle of the grid about its center point.
 
helios::vec3 getCellCenter (const helios::int3 ijk) const
helios::vec3 getCellCenter (const helios::int3 ijk) const
 Get the center of the (i,j,k)th grid cell.
 
helios::vec3 getCellSize () const
helios::vec3 getCellSize () const
 Get the size of grid cells.
 
void calculateHitGridCell ()
void calculateHitGridCell ()
 Determine the grid cell in which each hit point resides for the whole point cloud *‍/.
 
void syntheticScan (helios::Context *context, const char *xml_file)
void syntheticScan (helios::Context *context, const char *xml_file)
 Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file.
 
void syntheticScan (helios::Context *context, const char *xml_file, const int rays_per_pulse, const float pulse_distance_threshold)
void syntheticScan (helios::Context *context, const char *xml_file, const int rays_per_pulse, const float pulse_distance_threshold)
 Run a full-waveform synthetic LiDAR scan based on scan parameters given in an XML file (returns multiple laser hit points per pulse)
 
void calculateSyntheticLeafArea (helios::Context *context)
void calculateSyntheticLeafArea (helios::Context *context)
 Calculate the surface area of all primitives in the context.
 
void setCellLeafArea (const float area, const helios::int3 ijk)
void setCellLeafArea (const float area, const helios::int3 ijk)
 Set the leaf area of a grid cell in m^2.
 
float getCellLeafArea (const helios::int3 ijk) const
float getCellLeafArea (const helios::int3 ijk) const
 Get the leaf area of a grid cell in m^2.
 
float getCellLeafAreaDensity (const helios::int3 ijk) const
float getCellLeafAreaDensity (const helios::int3 ijk) const
 Get the leaf area density of a grid cell in 1/m.
 
void setCellTransmissionProbability (const int P_denom, const int P_trans, const helios::int3 ijk)
void setCellTransmissionProbability (const int P_denom, const int P_trans, const helios::int3 ijk)
 Set the cell transmission probability counts.
 
void getCellTransmissionProbability (const helios::int3 ijk, int &P_denom, int &P_trans) const
void getCellTransmissionProbability (const helios::int3 ijk, int &P_denom, int &P_trans) const
 Get the cell transmission probability counts.
 
void setCellRbar (const float r_bar, const helios::int3 ijk)
void setCellRbar (const float r_bar, const helios::int3 ijk)
 Set the average ray propagation distance in meters.
 
float getCellRbar (const helios::int3 ijk) const
float getCellRbar (const helios::int3 ijk) const
 Get the average ray propagation distance in meters.
 
void calculateLeafAreaGPU (const float Gtheta)
void calculateLeafAreaGPU (const float Gtheta)
 Calculate the leaf area for each grid volume.
 
void calculateLeafAreaGPU (const float Gtheta, const int minVoxelHits)
void calculateLeafAreaGPU (const float Gtheta, const int minVoxelHits)
 Calculate the leaf area for each grid volume.
 
void generateHeightModel (const int maxIter, const float threshDist_ground, const float inlierRatio_ground, const float threshDist_vegetation, const float inlierRatio_vegetation)
void generateHeightModel (const int maxIter, const float threshDist_ground, const float inlierRatio_ground, const float threshDist_vegetation, const float inlierRatio_vegetation)
 Determine the ground and vegetation height for each x-y grid cell. Inputs to this function are parameters for applying the RANSAC algorithm.
 
void setCellVegetationHeight (const float height, const helios::int2 ij)
void setCellVegetationHeight (const float height, const helios::int2 ij)
 Set the height of the vegetation at the (x,y) location of this gridcell.
 
float getCellVegetationHeight (const helios::int2 ij) const
float getCellVegetationHeight (const helios::int2 ij) const
 Get the height of the vegetation at the (x,y) location of this gridcell.
 
void setCellMaximumHitHeight (const float height, const helios::int2 ij)
void setCellMaximumHitHeight (const float height, const helios::int2 ij)
 Set the height of the highest hit point at the (x,y) location of this gridcell.
 
float getCellMaximumHitHeight (const helios::int2 ij) const
float getCellMaximumHitHeight (const helios::int2 ij) const
 Get the height of the highest hit point at the (x,y) location of this gridcell.
 
void setCellGroundHeight (const float height, const helios::int2 ij)
void setCellGroundHeight (const float height, const helios::int2 ij)
 Set the height of the ground at the (x,y) location of this gridcell.
 
float getCellGroundHeight (const helios::int2 ij) const
float getCellGroundHeight (const helios::int2 ij) const
 Get the height of the ground at the (x,y) location of this gridcell.
 
void calculateCoverFraction (void)
void calculateCoverFraction (void)
 
void setCellCoverFraction (const float cover_fraction, const helios::int2 ij)
void setCellCoverFraction (const float cover_fraction, const helios::int2 ij)
 Set the ground cover fraction at the (x,y) location of this gridcell.
 
float getCellCoverFraction (const helios::int2 ij) const
float getCellCoverFraction (const helios::int2 ij) const
 Get the height of the ground at the (x,y) location of this gridcell.
 
@@ -325,8 +337,7 @@

AerialLiDARcloud::AerialLiDARcloud ( - void  - ) + void ) @@ -347,8 +358,7 @@

AerialLiDARcloud::~AerialLiDARcloud ( - void  - ) + void ) @@ -370,8 +380,7 @@

void AerialLiDARcloud::addGridToVisualizer ( - Visualizer *  - visualizer) + Visualizer * visualizer) const @@ -398,25 +407,17 @@

void AerialLiDARcloud::addHitPoint ( - const uint  - scanID, + const uint scanID, - const helios::vec3  - hit_xyz, + const helios::vec3 hit_xyz, - const helios::SphericalCoord  - direction  - - - - ) - + const helios::SphericalCoord direction )

@@ -444,31 +445,22 @@

void AerialLiDARcloud::addHitPoint ( - const uint  - scanID, + const uint scanID, - const helios::vec3  - hit_xyz, + const helios::vec3 hit_xyz, - const helios::SphericalCoord  - direction, + const helios::SphericalCoord direction, - const helios::RGBcolor  - color  - - - - ) - + const helios::RGBcolor color )

@@ -498,37 +490,27 @@

void AerialLiDARcloud::addHitPoint ( - const uint  - scanID, + const uint scanID, - const helios::vec3  - hit_xyz, + const helios::vec3 hit_xyz, - const helios::SphericalCoord  - direction, + const helios::SphericalCoord direction, - const helios::RGBcolor  - color, + const helios::RGBcolor color, - const std::map< std::string, float >  - data  - - - - ) - + const std::map< std::string, float > data )

@@ -558,31 +540,22 @@

void AerialLiDARcloud::addHitPoint ( - const uint  - scanID, + const uint scanID, - const helios::vec3  - hit_xyz, + const helios::vec3 hit_xyz, - const helios::SphericalCoord  - direction, + const helios::SphericalCoord direction, - const std::map< std::string, float >  - data  - - - - ) - + const std::map< std::string, float > data )

@@ -611,25 +584,17 @@

void AerialLiDARcloud::addHitPoint ( - const uint  - scanID, + const uint scanID, - const helios::vec3  - hit_xyz, + const helios::vec3 hit_xyz, - const helios::vec3  - ray_origin  - - - - ) - + const helios::vec3 ray_origin )

@@ -657,19 +622,12 @@

void AerialLiDARcloud::addHitsToVisualizer ( - Visualizer *  - visualizer, + Visualizer * visualizer, - const uint  - pointsize  - - - - ) - const + const uint pointsize ) const

@@ -696,25 +654,17 @@

void AerialLiDARcloud::addHitsToVisualizer ( - Visualizer *  - visualizer, + Visualizer * visualizer, - const uint  - pointsize, + const uint pointsize, - const char *  - color_value  - - - - ) - const + const char * color_value ) const

@@ -1151,8 +1066,7 @@

helios::vec3 AerialLiDARcloud::getCellCenter ( - const helios::int3  - ijk) + const helios::int3 ijk) const @@ -1179,8 +1093,7 @@

float AerialLiDARcloud::getCellCoverFraction ( - const helios::int2  - ij) + const helios::int2 ij) const @@ -1208,8 +1121,7 @@

float AerialLiDARcloud::getCellGroundHeight ( - const helios::int2  - ij) + const helios::int2 ij) const @@ -1237,8 +1149,7 @@

float AerialLiDARcloud::getCellLeafArea ( - const helios::int3  - ijk) + const helios::int3 ijk) const @@ -1265,8 +1176,7 @@

float AerialLiDARcloud::getCellLeafAreaDensity ( - const helios::int3  - ijk) + const helios::int3 ijk) const @@ -1293,8 +1203,7 @@

float AerialLiDARcloud::getCellMaximumHitHeight ( - const helios::int2  - ij) + const helios::int2 ij) const @@ -1322,8 +1231,7 @@

float AerialLiDARcloud::getCellRbar ( - const helios::int3  - ijk) + const helios::int3 ijk) const @@ -1350,8 +1258,7 @@

vec3 AerialLiDARcloud::getCellSize ( - void  - ) + void ) const @@ -1372,25 +1279,17 @@

void AerialLiDARcloud::getCellTransmissionProbability ( - const helios::int3  - ijk, + const helios::int3 ijk, - int &  - P_denom, + int & P_denom, - int &  - P_trans  - - - - ) - const + int & P_trans ) const

@@ -1418,8 +1317,7 @@

float AerialLiDARcloud::getCellVegetationHeight ( - const helios::int2  - ij) + const helios::int2 ij) const @@ -1447,8 +1345,7 @@

helios::vec3 AerialLiDARcloud::getGridCenter ( - void  - ) + void ) const @@ -1469,8 +1366,7 @@

helios::vec3 AerialLiDARcloud::getGridExtent ( - void  - ) + void ) const @@ -1491,8 +1387,7 @@

helios::int3 AerialLiDARcloud::getGridResolution ( - void  - ) + void ) const @@ -1513,8 +1408,7 @@

float AerialLiDARcloud::getGridRotation ( - void  - ) + void ) const @@ -1535,19 +1429,12 @@

void AerialLiDARcloud::getHitBoundingBox ( - helios::vec3 &  - boxmin, + helios::vec3 & boxmin, - helios::vec3 &  - boxmax  - - - - ) - const + helios::vec3 & boxmax ) const

@@ -1664,8 +1542,7 @@

helios::int3 AerialLiDARcloud::getHitGridCell ( - const uint  - index) + const uint index) const @@ -1695,8 +1572,7 @@

helios::SphericalCoord AerialLiDARcloud::getHitRaydir ( - const uint  - index) + const uint index) const @@ -1723,8 +1599,7 @@

int AerialLiDARcloud::getHitScanID ( - const uint  - index) + const uint index) const @@ -1751,8 +1626,7 @@

helios::vec3 AerialLiDARcloud::getHitXYZ ( - uint  - index) + uint index) const @@ -1779,8 +1653,7 @@

float AerialLiDARcloud::getScanBeamDivergence ( - const uint  - scanID) + const uint scanID) const @@ -1808,8 +1681,7 @@

float AerialLiDARcloud::getScanBeamExitDiameter ( - const uint  - scanID) + const uint scanID) const @@ -1837,8 +1709,7 @@

helios::vec3 AerialLiDARcloud::getScanCenter ( - const uint  - scanID) + const uint scanID) const @@ -1865,8 +1736,7 @@

float AerialLiDARcloud::getScanConeAngle ( - const uint  - scanID) + const uint scanID) const @@ -1893,8 +1763,7 @@

uint AerialLiDARcloud::getScanCount ( - void  - ) + void ) @@ -1915,8 +1784,7 @@

float AerialLiDARcloud::getScanDensity ( - const uint  - scanID) + const uint scanID) const @@ -1937,8 +1805,7 @@

helios::vec2 AerialLiDARcloud::getScanExtent ( - const uint  - scanID) + const uint scanID) const @@ -1965,8 +1832,7 @@

int AerialLiDARcloud::gridijk2index ( - const helios::int3  - ijk) + const helios::int3 ijk) const @@ -1993,8 +1859,7 @@

helios::int3 AerialLiDARcloud::gridindex2ijk ( - const int  - index) + const int index) const @@ -2021,8 +1886,7 @@

void AerialLiDARcloud::loadXML ( - const char *  - filename) + const char * filename) @@ -2049,8 +1913,7 @@

void AerialLiDARcloud::reflectanceFilter ( - const float  - minreflectance) + const float minreflectance) @@ -2076,25 +1939,17 @@

void AerialLiDARcloud::scalarFilter ( - const char *  - scalar_field, + const char * scalar_field, - const float  - threshold, + const float threshold, - const char *  - comparator  - - - - ) - + const char * comparator )

@@ -2507,19 +2296,12 @@

void AerialLiDARcloud::syntheticScan ( - helios::Context *  - context, + helios::Context * context, - const char *  - xml_file  - - - - ) - + const char * xml_file )

@@ -2546,31 +2328,22 @@

void AerialLiDARcloud::syntheticScan ( - helios::Context *  - context, + helios::Context * context, - const char *  - xml_file, + const char * xml_file, - const int  - rays_per_pulse, + const int rays_per_pulse, - const float  - pulse_distance_threshold  - - - - ) - + const float pulse_distance_threshold )

@@ -2585,7 +2358,7 @@

Note
Calling syntheticScan() with rays_per_pulse=1 will effectively run a discrete return synthetic scan.
+
Note
Calling syntheticScan() with rays_per_pulse=1 will effectively run a discrete return synthetic scan.

Definition at line 629 of file AerialLiDAR.cu.

@@ -2600,7 +2373,8 @@

+

diff --git a/doc/html/class_b_l_conductance_model.html b/doc/html/class_b_l_conductance_model.html index 6e905b37b..8a46d3dbb 100644 --- a/doc/html/class_b_l_conductance_model.html +++ b/doc/html/class_b_l_conductance_model.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -92,37 +104,37 @@

Boundary-layer conductance model class. - More...

+ More...

#include <BoundaryLayerConductanceModel.h>

- + - + - + - + - + - + - + - + - +

Public Member Functions

 BLConductanceModel (helios::Context *context)
 BLConductanceModel (helios::Context *context)
 Constructor.
 
int selfTest ()
int selfTest ()
 Self-test.
 
void enableMessages ()
void enableMessages ()
 Enable standard output from this plug-in (default)
 
void disableMessages ()
void disableMessages ()
 Disable standard output from this plug-in.
 
void setBoundaryLayerModel (const char *gH_model)
void setBoundaryLayerModel (const char *gH_model)
 Set the boundary-layer conductance model to be used for all primitives in the Context.
 
void setBoundaryLayerModel (uint UUID, const char *gH_model)
void setBoundaryLayerModel (uint UUID, const char *gH_model)
 Set the boundary-layer conductance model to be used for a set of primitives.
 
void setBoundaryLayerModel (const std::vector< uint > &UUIDs, const char *gH_model)
void setBoundaryLayerModel (const std::vector< uint > &UUIDs, const char *gH_model)
 Set the boundary-layer conductance model to be used for a set of primitives.
 
void run ()
void run ()
 Run boundary-layer conductance calculations for all primitives in the Context.
 
void run (const std::vector< uint > &UUIDs)
void run (const std::vector< uint > &UUIDs)
 Run boundary-layer conductance calculations for a subset of primitives in the Context based on a vector of UUIDs.
 
@@ -141,8 +153,7 @@

BLConductanceModel::BLConductanceModel ( - helios::Context *  - context) + helios::Context * context) @@ -170,7 +181,7 @@

void BLConductanceModel::disableMessages ( - ) + ) @@ -191,7 +202,7 @@

void BLConductanceModel::enableMessages ( - ) + ) @@ -212,8 +223,7 @@

void BLConductanceModel::run ( - void  - ) + void ) @@ -234,8 +244,7 @@

void BLConductanceModel::run ( - const std::vector< uint > &  - UUIDs) + const std::vector< uint > & UUIDs) @@ -256,7 +265,7 @@

int BLConductanceModel::selfTest ( - ) + ) @@ -278,8 +287,7 @@

void BLConductanceModel::setBoundaryLayerModel ( - const char *  - gH_model) + const char * gH_model) @@ -306,19 +314,12 @@

void BLConductanceModel::setBoundaryLayerModel ( - const std::vector< uint > &  - UUIDs, + const std::vector< uint > & UUIDs, - const char *  - gH_model  - - - - ) - + const char * gH_model )

@@ -382,7 +376,8 @@

+

diff --git a/doc/html/class_canopy_generator.html b/doc/html/class_canopy_generator.html index ebba6319b..02c45916b 100644 --- a/doc/html/class_canopy_generator.html +++ b/doc/html/class_canopy_generator.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -93,154 +105,154 @@ - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 CanopyGenerator (helios::Context *context)
 CanopyGenerator (helios::Context *context)
 Canopy geometry generator constructor.
 
int selfTest ()
int selfTest ()
 Unit testing routine.
 
template<typename CanopyType , typename... Args>
void storeCanopyParameters (Args &&... args)
template<typename CanopyType , typename... Args>
void storeCanopyParameters (Args &&... args)
 Stores the given canopy parameters.
 
std::vector< std::shared_ptr< BaseCanopyParameters > > getCanopyParametersList ()
std::vector< std::shared_ptr< BaseCanopyParameters > > getCanopyParametersList ()
 
void loadXML (const char *filename, bool build=true)
void loadXML (const char *filename, bool build=true)
 Reads the XML file of the given name and stores all the configured canopy parameters.
 
void buildCanopies ()
void buildCanopies ()
 Builds canopies for all the stored canopy parameters.
 
void buildCanopy (const HomogeneousCanopyParameters &params)
void buildCanopy (const HomogeneousCanopyParameters &params)
 Build a canopy consisting of a homogeneous volume of leaves.
 
void buildCanopy (const SphericalCrownsCanopyParameters &params)
void buildCanopy (const SphericalCrownsCanopyParameters &params)
 Build a canopy consisting of spherical crowns filled with homogeneous leaves.
 
void buildCanopy (const ConicalCrownsCanopyParameters &params)
void buildCanopy (const ConicalCrownsCanopyParameters &params)
 Build a canopy consisting of conical crowns filled with homogeneous leaves.
 
void buildCanopy (const VSPGrapevineParameters &params)
void buildCanopy (const VSPGrapevineParameters &params)
 Build a canopy consisting of grapevines on VSP trellis.
 
void buildCanopy (const SplitGrapevineParameters &params)
void buildCanopy (const SplitGrapevineParameters &params)
 Build a canopy consisting of grapevines on split trellis.
 
void buildCanopy (const UnilateralGrapevineParameters &params)
void buildCanopy (const UnilateralGrapevineParameters &params)
 Build a canopy consisting of grapevines on unilateral trellis.
 
void buildCanopy (const GobletGrapevineParameters &params)
void buildCanopy (const GobletGrapevineParameters &params)
 Build a canopy consisting of grapevines on Goblet trellis.
 
void buildCanopy (const WhiteSpruceCanopyParameters &params)
void buildCanopy (const WhiteSpruceCanopyParameters &params)
 Build a canopy consisting of white spruce trees.
 
void buildCanopy (const TomatoParameters &params)
void buildCanopy (const TomatoParameters &params)
 Build a canopy consisting of tomato plants.
 
void buildCanopy (const StrawberryParameters &params)
void buildCanopy (const StrawberryParameters &params)
 Build a canopy consisting of strawberry plants.
 
void buildCanopy (const WalnutCanopyParameters &params)
void buildCanopy (const WalnutCanopyParameters &params)
 Build a canopy consisting of walnut trees.
 
void buildCanopy (const SorghumCanopyParameters &params)
void buildCanopy (const SorghumCanopyParameters &params)
 Build a canopy consisting of sorghum plants.
 
void buildCanopy (const BeanParameters &params)
void buildCanopy (const BeanParameters &params)
 Build a canopy consisting of common bean plants.
 
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)
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)
 Build a ground consisting of texture sub-tiles and sub-patches, which can be different sizes.
 
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)
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)
 Build a ground with azimuthal rotation consisting of texture sub-tiles and sub-patches, which can be different sizes.
 
std::vector< uint > getTrunkUUIDs (uint PlantID)
std::vector< uint > getTrunkUUIDs (uint PlantID)
 Get the unique universal identifiers (UUIDs) for the primitives that make up the plant trunk.
 
std::vector< uint > getTrunkUUIDs ()
std::vector< uint > getTrunkUUIDs ()
 Get the unique universal identifiers (UUIDs) for all trunk primitives in a single 1D vector.
 
std::vector< uint > getBranchUUIDs (uint PlantID)
std::vector< uint > getBranchUUIDs (uint PlantID)
 Get the unique universal identifiers (UUIDs) for the primitives that make up the plant branches.
 
std::vector< uint > getBranchUUIDs ()
std::vector< uint > getBranchUUIDs ()
 Get the unique universal identifiers (UUIDs) for all branch primitives in a single 1D vector.
 
std::vector< std::vector< uint > > getLeafUUIDs (uint PlantID)
std::vector< std::vector< uint > > getLeafUUIDs (uint PlantID)
 Get the unique universal identifiers (UUIDs) for the primitives that make up the plant leaves.
 
std::vector< uint > getLeafUUIDs ()
std::vector< uint > getLeafUUIDs ()
 Get the unique universal identifiers (UUIDs) for all leaf primitives in a single 1D vector.
 
std::vector< std::vector< std::vector< uint > > > getFruitUUIDs (uint PlantID)
std::vector< std::vector< std::vector< uint > > > getFruitUUIDs (uint PlantID)
 Get the unique universal identifiers (UUIDs) for the primitives that make up the tree fruit.
 
std::vector< uint > getFruitUUIDs ()
std::vector< uint > getFruitUUIDs ()
 Get the unique universal identifiers (UUIDs) for all fruit primitives in a single 1D vector.
 
std::vector< uint > getGroundUUIDs ()
std::vector< uint > getGroundUUIDs ()
 Get the unique universal identifiers (UUIDs) for the primitives that make up the ground.
 
std::vector< uint > getAllUUIDs (uint PlantID)
std::vector< uint > getAllUUIDs (uint PlantID)
 Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
 
uint getPlantCount ()
uint getPlantCount ()
 Get the current number of plants added to the Canopy Generator.
 
void seedRandomGenerator (uint seed)
void seedRandomGenerator (uint seed)
 Seed the random number generator. This can be useful for generating repeatable trees, say, within a loop.
 
void disableMessages ()
void disableMessages ()
 Disable standard messages from being printed to screen (default is to enable messages)
 
void enableMessages ()
void enableMessages ()
 Enable standard messages to be printed to screen (default is to enable messages)
 
void buildIndividualPlants (helios::vec3 position)
void buildIndividualPlants (helios::vec3 position)
 Builds individual plants based on the stored canopy parameters, at the given position.
 
void buildIndividualPlants ()
void buildIndividualPlants ()
 Builds individual plants based on the stored canopy parameters (using canopy_origin as the position)
 
std::vector< std::vector< uint > > addGrapeCluster (helios::vec3 position, float grape_rad, float cluster_rad, helios::RGBcolor grape_color, uint grape_subdiv)
std::vector< std::vector< uint > > addGrapeCluster (helios::vec3 position, float grape_rad, float cluster_rad, helios::RGBcolor grape_color, uint grape_subdiv)
 Function to add an individual grape berry cluster.
 
uint grapevineVSP (const VSPGrapevineParameters &params, const helios::vec3 &origin)
uint grapevineVSP (const VSPGrapevineParameters &params, const helios::vec3 &origin)
 Function to add an individual grapevine plant on a vertical shoot positioned (VSP) trellis.
 
uint grapevineSplit (const SplitGrapevineParameters &params, const helios::vec3 &origin)
uint grapevineSplit (const SplitGrapevineParameters &params, const helios::vec3 &origin)
 Function to add an individual grapevine plant on a split trellis.
 
uint grapevineUnilateral (const UnilateralGrapevineParameters &params, const helios::vec3 &origin)
uint grapevineUnilateral (const UnilateralGrapevineParameters &params, const helios::vec3 &origin)
 Function to add an individual grapevine plant on a unilateral trellis.
 
uint grapevineGoblet (const GobletGrapevineParameters &params, const helios::vec3 &origin)
uint grapevineGoblet (const GobletGrapevineParameters &params, const helios::vec3 &origin)
 Function to add an individual grapevine plant on a goblet (vent a taille) trellis.
 
uint whitespruce (const WhiteSpruceCanopyParameters &params, const helios::vec3 &origin)
uint whitespruce (const WhiteSpruceCanopyParameters &params, const helios::vec3 &origin)
 Function to add an individual white spruce tree.
 
uint tomato (const TomatoParameters &params, const helios::vec3 &origin)
uint tomato (const TomatoParameters &params, const helios::vec3 &origin)
 Function to add an individual tomato plant.
 
uint strawberry (const StrawberryParameters &params, const helios::vec3 &origin)
uint strawberry (const StrawberryParameters &params, const helios::vec3 &origin)
 Function to add an individual strawberry plant.
 
uint walnut (const WalnutCanopyParameters &params, const helios::vec3 &origin)
uint walnut (const WalnutCanopyParameters &params, const helios::vec3 &origin)
 Function to add an individual walnut tree.
 
uint sorghum (const SorghumCanopyParameters &params, const helios::vec3 &origin)
uint sorghum (const SorghumCanopyParameters &params, const helios::vec3 &origin)
 Function to add an individual sorghum plant.
 
uint bean (const BeanParameters &params, const helios::vec3 &origin)
uint bean (const BeanParameters &params, const helios::vec3 &origin)
 Function to add an individual bean plant.
 
void createElementLabels ()
void createElementLabels ()
 Create primitive data that explicitly labels all primitives according to the plant element they correspond to.
 
void disableElementLabels ()
void disableElementLabels ()
 Toggle off primitive data element type labels.
 
@@ -260,8 +272,7 @@

CanopyGenerator::CanopyGenerator ( - helios::Context *  - context) + helios::Context * context) @@ -294,37 +305,27 @@

std::vector< std::vector< uint > > CanopyGenerator::addGrapeCluster ( - helios::vec3  - position, + helios::vec3 position, - float  - grape_rad, + float grape_rad, - float  - cluster_rad, + float cluster_rad, - helios::RGBcolor  - grape_color, + helios::RGBcolor grape_color, - uint  - grape_subdiv  - - - - ) - + uint grape_subdiv )

@@ -354,19 +355,12 @@

uint CanopyGenerator::bean ( - const BeanParameters &  - params, + const BeanParameters & params, - const helios::vec3 &  - origin  - - - - ) - + const helios::vec3 & origin )

@@ -394,7 +388,7 @@

void CanopyGenerator::buildCanopies ( - ) + ) @@ -415,8 +409,7 @@

void CanopyGenerator::buildCanopy ( - const BeanParameters &  - params) + const BeanParameters & params) @@ -443,8 +436,7 @@

void CanopyGenerator::buildCanopy ( - const ConicalCrownsCanopyParameters &  - params) + const ConicalCrownsCanopyParameters & params) @@ -471,8 +463,7 @@

void CanopyGenerator::buildCanopy ( - const GobletGrapevineParameters &  - params) + const GobletGrapevineParameters & params) @@ -499,8 +490,7 @@

void CanopyGenerator::buildCanopy ( - const HomogeneousCanopyParameters &  - params) + const HomogeneousCanopyParameters & params) @@ -527,8 +517,7 @@

void CanopyGenerator::buildCanopy ( - const SorghumCanopyParameters &  - params) + const SorghumCanopyParameters & params) @@ -555,8 +544,7 @@

void CanopyGenerator::buildCanopy ( - const SphericalCrownsCanopyParameters &  - params) + const SphericalCrownsCanopyParameters & params) @@ -583,8 +571,7 @@

void CanopyGenerator::buildCanopy ( - const SplitGrapevineParameters &  - params) + const SplitGrapevineParameters & params) @@ -611,8 +598,7 @@

void CanopyGenerator::buildCanopy ( - const StrawberryParameters &  - params) + const StrawberryParameters & params) @@ -639,8 +625,7 @@

void CanopyGenerator::buildCanopy ( - const TomatoParameters &  - params) + const TomatoParameters & params) @@ -667,8 +652,7 @@

void CanopyGenerator::buildCanopy ( - const UnilateralGrapevineParameters &  - params) + const UnilateralGrapevineParameters & params) @@ -695,8 +679,7 @@

void CanopyGenerator::buildCanopy ( - const VSPGrapevineParameters &  - params) + const VSPGrapevineParameters & params) @@ -723,8 +706,7 @@

void CanopyGenerator::buildCanopy ( - const WalnutCanopyParameters &  - params) + const WalnutCanopyParameters & params) @@ -751,8 +733,7 @@

void CanopyGenerator::buildCanopy ( - const WhiteSpruceCanopyParameters &  - params) + const WhiteSpruceCanopyParameters & params) @@ -779,37 +760,27 @@

void CanopyGenerator::buildGround ( - const helios::vec3 &  - ground_origin, + const helios::vec3 & ground_origin, - const helios::vec2 &  - ground_extent, + const helios::vec2 & ground_extent, - const helios::int2 &  - texture_subtiles, + const helios::int2 & texture_subtiles, - const helios::int2 &  - texture_subpatches, + const helios::int2 & texture_subpatches, - const char *  - ground_texture_file  - - - - ) - + const char * ground_texture_file )

@@ -839,43 +810,32 @@

void CanopyGenerator::buildGround ( - const helios::vec3 &  - ground_origin, + const helios::vec3 & ground_origin, - const helios::vec2 &  - ground_extent, + const helios::vec2 & ground_extent, - const helios::int2 &  - texture_subtiles, + const helios::int2 & texture_subtiles, - const helios::int2 &  - texture_subpatches, + const helios::int2 & texture_subpatches, - const char *  - ground_texture_file, + const char * ground_texture_file, - float  - ground_rotation  - - - - ) - + float ground_rotation )

@@ -906,7 +866,7 @@

void CanopyGenerator::buildIndividualPlants ( - ) + ) @@ -927,8 +887,7 @@

void CanopyGenerator::buildIndividualPlants ( - helios::vec3  - position) + helios::vec3 position) @@ -950,7 +909,7 @@

void CanopyGenerator::createElementLabels ( - ) + ) @@ -971,7 +930,7 @@

void CanopyGenerator::disableElementLabels ( - ) + ) @@ -992,7 +951,7 @@

void CanopyGenerator::disableMessages ( - ) + ) @@ -1013,7 +972,7 @@

void CanopyGenerator::enableMessages ( - ) + ) @@ -1034,8 +993,7 @@

std::vector< uint > CanopyGenerator::getAllUUIDs ( - uint  - PlantID) + uint PlantID) @@ -1062,7 +1020,7 @@

std::vector< uint > CanopyGenerator::getBranchUUIDs ( - ) + ) @@ -1083,8 +1041,7 @@

std::vector< uint > CanopyGenerator::getBranchUUIDs ( - uint  - PlantID) + uint PlantID) @@ -1111,7 +1068,7 @@

std::vector< std::shared_ptr< BaseCanopyParameters > > CanopyGenerator::getCanopyParametersList ( - ) + ) @@ -1130,7 +1087,7 @@

std::vector< uint > CanopyGenerator::getFruitUUIDs ( - ) + ) @@ -1151,8 +1108,7 @@

std::vector< std::vector< std::vector< uint > > > CanopyGenerator::getFruitUUIDs ( - uint  - PlantID) + uint PlantID) @@ -1180,7 +1136,7 @@

std::vector< uint > CanopyGenerator::getGroundUUIDs ( - ) + ) @@ -1201,7 +1157,7 @@

std::vector< uint > CanopyGenerator::getLeafUUIDs ( - ) + ) @@ -1222,8 +1178,7 @@

std::vector< std::vector< uint > > CanopyGenerator::getLeafUUIDs ( - uint  - PlantID) + uint PlantID) @@ -1251,7 +1206,7 @@

uint CanopyGenerator::getPlantCount ( - ) + ) @@ -1272,7 +1227,7 @@

std::vector< uint > CanopyGenerator::getTrunkUUIDs ( - ) + ) @@ -1293,8 +1248,7 @@

std::vector< uint > CanopyGenerator::getTrunkUUIDs ( - uint  - PlantID) + uint PlantID) @@ -1321,19 +1275,12 @@

uint CanopyGenerator::grapevineGoblet ( - const GobletGrapevineParameters &  - params, + const GobletGrapevineParameters & params, - const helios::vec3 &  - origin  - - - - ) - + const helios::vec3 & origin )

@@ -1361,19 +1308,12 @@

uint CanopyGenerator::grapevineSplit ( - const SplitGrapevineParameters &  - params, + const SplitGrapevineParameters & params, - const helios::vec3 &  - origin  - - - - ) - + const helios::vec3 & origin )

@@ -1401,19 +1341,12 @@

uint CanopyGenerator::grapevineUnilateral ( - const UnilateralGrapevineParameters &  - params, + const UnilateralGrapevineParameters & params, - const helios::vec3 &  - origin  - - - - ) - + const helios::vec3 & origin )

@@ -1441,19 +1374,12 @@

uint CanopyGenerator::grapevineVSP ( - const VSPGrapevineParameters &  - params, + const VSPGrapevineParameters & params, - const helios::vec3 &  - origin  - - - - ) - + const helios::vec3 & origin )

@@ -1673,19 +1576,12 @@

uint CanopyGenerator::tomato ( - const TomatoParameters &  - params, + const TomatoParameters & params, - const helios::vec3 &  - origin  - - - - ) - + const helios::vec3 & origin )

@@ -1713,19 +1609,12 @@

uint CanopyGenerator::walnut ( - const WalnutCanopyParameters &  - params, + const WalnutCanopyParameters & params, - const helios::vec3 &  - origin  - - - - ) - + const helios::vec3 & origin )

@@ -1753,19 +1642,12 @@

uint CanopyGenerator::whitespruce ( - const WhiteSpruceCanopyParameters &  - params, + const WhiteSpruceCanopyParameters & params, - const helios::vec3 &  - origin  - - - - ) - + const helios::vec3 & origin )

@@ -1798,7 +1680,8 @@

+

diff --git a/doc/html/class_dummy_model.html b/doc/html/class_dummy_model.html index d6a836f6c..e51b83989 100644 --- a/doc/html/class_dummy_model.html +++ b/doc/html/class_dummy_model.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -92,16 +104,16 @@

Dummy model class. - More...

+ More...

#include <DummyModel.h>

- + - +

Public Member Functions

 DummyModel (helios::Context *context)
 DummyModel (helios::Context *context)
 Constructor.
 
void run (void)
void run (void)
 Function to run the dummy model.
 
@@ -120,8 +132,7 @@

DummyModel::DummyModel ( - helios::Context *  - context) + helios::Context * context) @@ -143,8 +154,7 @@

void DummyModel::run ( - void  - ) + void ) @@ -163,7 +173,8 @@

+

diff --git a/doc/html/class_energy_balance_model.html b/doc/html/class_energy_balance_model.html index a50dd924a..aece19f25 100644 --- a/doc/html/class_energy_balance_model.html +++ b/doc/html/class_energy_balance_model.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -92,49 +104,49 @@

Energy balance model class. - More...

+ More...

#include <EnergyBalanceModel.h>

- + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 EnergyBalanceModel (helios::Context *context)
 EnergyBalanceModel (helios::Context *context)
 Constructor.
 
int selfTest ()
int selfTest ()
 Self-test.
 
void enableMessages ()
void enableMessages ()
 Enable standard output from this plug-in (default)
 
void disableMessages ()
void disableMessages ()
 Disable standard output from this plug-in.
 
void run ()
void run ()
 Function to run the energy balance model for all primitives in the Context.
 
void run (float dt)
void run (float dt)
 Function to run the dynamic /non steady state energy balance model for one timestep of length "dt" seconds.
 
void run (const std::vector< uint > &UUIDs)
void run (const std::vector< uint > &UUIDs)
 Function to run the energy balance model for a select set of primitives.
 
void run (const std::vector< uint > &UUIDs, float dt)
void run (const std::vector< uint > &UUIDs, float dt)
 Function to run the energy balance model for a select set of primitives for one timestep of length "dt" seconds.
 
void addRadiationBand (const char *band)
void addRadiationBand (const char *band)
 Add the label of a radiation band in the RadiationModel plug-in that should be used in calculation of the absorbed all-wave radiation flux.
 
void addRadiationBand (const std::vector< std::string > &bands)
void addRadiationBand (const std::vector< std::string > &bands)
 Add the labels of radiation bands in the RadiationModel plug-in that should be used in calculation of the absorbed all-wave radiation flux.
 
void optionalOutputPrimitiveData (const char *label)
void optionalOutputPrimitiveData (const char *label)
 Add optional output primitive data values to the Context.
 
void printDefaultValueReport () const
void printDefaultValueReport () const
 Print a report detailing usage of default input values for all primitives in the Context.
 
void printDefaultValueReport (const std::vector< uint > &UUIDs) const
void printDefaultValueReport (const std::vector< uint > &UUIDs) const
 Print a report detailing usage of default input values based on a subset of primitive UUIDs.
 
@@ -153,8 +165,7 @@

EnergyBalanceModel::EnergyBalanceModel ( - helios::Context *  - context) + helios::Context * context) @@ -182,8 +193,7 @@

void EnergyBalanceModel::addRadiationBand ( - const char *  - band) + const char * band) @@ -210,8 +220,7 @@

void EnergyBalanceModel::addRadiationBand ( - const std::vector< std::string > &  - bands) + const std::vector< std::string > & bands) @@ -238,7 +247,7 @@

void EnergyBalanceModel::disableMessages ( - ) + ) @@ -259,7 +268,7 @@

void EnergyBalanceModel::enableMessages ( - ) + ) @@ -280,8 +289,7 @@

void EnergyBalanceModel::optionalOutputPrimitiveData ( - const char *  - label) + const char * label) @@ -308,7 +316,7 @@

void EnergyBalanceModel::printDefaultValueReport ( - ) + ) const @@ -329,8 +337,7 @@

void EnergyBalanceModel::printDefaultValueReport ( - const std::vector< uint > &  - UUIDs) + const std::vector< uint > & UUIDs) const @@ -352,8 +359,7 @@

void EnergyBalanceModel::run ( - void  - ) + void ) @@ -374,8 +380,7 @@

void EnergyBalanceModel::run ( - const std::vector< uint > &  - UUIDs) + const std::vector< uint > & UUIDs) @@ -402,19 +407,12 @@

void EnergyBalanceModel::run ( - const std::vector< uint > &  - UUIDs, + const std::vector< uint > & UUIDs, - float  - dt  - - - - ) - + float dt )

diff --git a/doc/html/class_glyph.html b/doc/html/class_glyph.html index 7a16e1d44..9977e6ac5 100644 --- a/doc/html/class_glyph.html +++ b/doc/html/class_glyph.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -93,31 +105,31 @@

Glyph object - 2D matrix shape. - More...

+ More...

#include <Visualizer.h>

-

Public Member Functions

+
void readFile (const char *glyphfile)
 
- + - + - + - +

Data Fields

helios::int2 size
helios::int2 size
 
std::vector< std::vector< uint > > data
std::vector< std::vector< uint > > data
 
float solidFraction
float solidFraction
 
char * filename
char * filename
 

Detailed Description

Glyph object - 2D matrix shape.

-

Definition at line 67 of file Visualizer.h.

+

Definition at line 77 of file Visualizer.h.

Field Documentation

◆ data

@@ -131,7 +143,7 @@

-

Definition at line 71 of file Visualizer.h.

+

Definition at line 81 of file Visualizer.h.

@@ -147,7 +159,7 @@

-

Definition at line 73 of file Visualizer.h.

+

Definition at line 83 of file Visualizer.h.

@@ -163,7 +175,7 @@

-

Definition at line 70 of file Visualizer.h.

+

Definition at line 80 of file Visualizer.h.

@@ -179,7 +191,7 @@

-

Definition at line 72 of file Visualizer.h.

+

Definition at line 82 of file Visualizer.h.

@@ -189,7 +201,8 @@

+

diff --git a/doc/html/class_hit_table.html b/doc/html/class_hit_table.html index 7e746c991..399db71f5 100644 --- a/doc/html/class_hit_table.html +++ b/doc/html/class_hit_table.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -94,22 +106,22 @@ - + - + - + - + - +

Public Member Functions

 HitTable (const int nx, const int ny)
 HitTable (const int nx, const int ny)
 
 HitTable (const int nx, const int ny, const datatype initval)
 HitTable (const int nx, const int ny, const datatype initval)
 
datatype get (const int i, const int j) const
datatype get (const int i, const int j) const
 
void set (const int i, const int j, const datatype value)
void set (const int i, const int j, const datatype value)
 
void resize (const int nx, const int ny, const datatype initval)
void resize (const int nx, const int ny, const datatype initval)
 
- + - +

Data Fields

uint Ntheta
uint Ntheta
 
uint Nphi
uint Nphi
 

Detailed Description

@@ -131,8 +143,7 @@

HitTable< datatype >::HitTable ( - void  - ) + void ) @@ -161,19 +172,12 @@

HitTable< datatype >::HitTable ( - const int  - nx, + const int nx, - const int  - ny  - - - - ) - + const int ny ) @@ -201,25 +205,17 @@

HitTable< datatype >::HitTable ( - const int  - nx, + const int nx, - const int  - ny, + const int ny, - const datatype  - initval  - - - - ) - + const datatype initval ) @@ -248,19 +244,12 @@

datatype HitTable< datatype >::get ( - const int  - i, + const int i, - const int  - j  - - - - ) - const + const int j ) const @@ -288,25 +277,17 @@

void HitTable< datatype >::resize ( - const int  - nx, + const int nx, - const int  - ny, + const int ny, - const datatype  - initval  - - - - ) - + const datatype initval ) @@ -334,25 +315,17 @@

void HitTable< datatype >::set ( - const int  - i, + const int i, - const int  - j, + const int j, - const datatype  - value  - - - - ) - + const datatype value ) @@ -409,7 +382,8 @@

+

diff --git a/doc/html/class_leaf_optics.html b/doc/html/class_leaf_optics.html index 7ec647266..d727786cd 100644 --- a/doc/html/class_leaf_optics.html +++ b/doc/html/class_leaf_optics.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -94,34 +106,34 @@ - + - + - + - + - + - + - + - +

Public Member Functions

 LeafOptics (helios::Context *a_context)
 LeafOptics (helios::Context *a_context)
 Constructor.
 
void run (const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties, const std::string &label)
void run (const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties, const std::string &label)
 Run the LeafOptics model to generate reflectivity and transmissivity spectra, create associated global data, and assign to specified primitives.
 
void run (const LeafOpticsProperties &leafproperties, const std::string &label)
void run (const LeafOpticsProperties &leafproperties, const std::string &label)
 Run the LeafOptics model to generate reflectivity and transmissivity spectra and create associated global data.
 
void PROSPECT (float numberlayers, float Chlorophyllcontent, float carotenoidcontent, float anthocyancontent, float brownpigments, float watermass, float drymass, float protein, float carbonconstituents, std::vector< float > &reflectivities_fit, std::vector< float > &transmissivities_fit)
void PROSPECT (float numberlayers, float Chlorophyllcontent, float carotenoidcontent, float anthocyancontent, float brownpigments, float watermass, float drymass, float protein, float carbonconstituents, std::vector< float > &reflectivities_fit, std::vector< float > &transmissivities_fit)
 LeafOptics model kernel.
 
void getLeafSpectra (const LeafOpticsProperties &leafproperties, std::vector< helios::vec2 > &reflectivities_fit, std::vector< helios::vec2 > &transmissivities_fit)
void getLeafSpectra (const LeafOpticsProperties &leafproperties, std::vector< helios::vec2 > &reflectivities_fit, std::vector< helios::vec2 > &transmissivities_fit)
 Get the leaf spectra.
 
void setProperties (const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties)
void setProperties (const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties)
 Set leaf optical properties for a set of primitives.
 
void disableMessages ()
void disableMessages ()
 Disable command-line output messages from this plug-in.
 
void enableMessages ()
void enableMessages ()
 Enable command-line output messages from this plug-in.
 
- +

Static Public Member Functions

static int selfTest ()
static int selfTest ()
 Self-test.
 
@@ -138,8 +150,7 @@

LeafOptics::LeafOptics ( - helios::Context *  - a_context) + helios::Context * a_context) @@ -161,7 +172,7 @@

void LeafOptics::disableMessages ( - ) + ) @@ -182,7 +193,7 @@

void LeafOptics::enableMessages ( - ) + ) @@ -203,25 +214,17 @@

void LeafOptics::getLeafSpectra ( - const LeafOpticsProperties &  - leafproperties, + const LeafOpticsProperties & leafproperties, - std::vector< helios::vec2 > &  - reflectivities_fit, + std::vector< helios::vec2 > & reflectivities_fit, - std::vector< helios::vec2 > &  - transmissivities_fit  - - - - ) - + std::vector< helios::vec2 > & transmissivities_fit )

@@ -349,19 +336,12 @@

void LeafOptics::run ( - const LeafOpticsProperties &  - leafproperties, + const LeafOpticsProperties & leafproperties, - const std::string &  - label  - - - - ) - + const std::string & label )

@@ -388,25 +368,17 @@

void LeafOptics::run ( - const std::vector< uint > &  - UUIDs, + const std::vector< uint > & UUIDs, - const LeafOpticsProperties &  - leafproperties, + const LeafOpticsProperties & leafproperties, - const std::string &  - label  - - - - ) - + const std::string & label )

@@ -501,7 +466,8 @@

+

diff --git a/doc/html/class_li_d_a_rcloud.html b/doc/html/class_li_d_a_rcloud.html index 64e61f6d9..554b36c58 100644 --- a/doc/html/class_li_d_a_rcloud.html +++ b/doc/html/class_li_d_a_rcloud.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -92,353 +104,353 @@

Primary class for terrestrial LiDAR scan. - More...

+ More...

#include <LiDAR.h>

- + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 LiDARcloud ()
 LiDARcloud ()
 LiDAR point cloud constructor.
 
+
 ~LiDARcloud ()
 LiDAR point cloud destructor.
 
int selfTest ()
int selfTest ()
 Self-test (unit test) function.
 
void validateRayDirections ()
void validateRayDirections ()
 
void disableMessages ()
void disableMessages ()
 Disable all print messages to the screen except for fatal error messages.
 
void enableMessages ()
void enableMessages ()
 Enable all print messages to the screen.
 
uint getScanCount ()
uint getScanCount ()
 Get number of scans in point cloud.
 
uint addScan (ScanMetadata &newscan)
uint addScan (ScanMetadata &newscan)
 Add a LiDAR scan to the point cloud.
 
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
 Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
 
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const helios::RGBcolor &color)
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const helios::RGBcolor &color)
 Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
 
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const std::map< std::string, double > &data)
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const std::map< std::string, double > &data)
 Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
 
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const helios::RGBcolor &color, const std::map< std::string, double > &data)
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const helios::RGBcolor &color, const std::map< std::string, double > &data)
 Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
 
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::int2 &row_column, const helios::RGBcolor &color, const std::map< std::string, double > &data)
void addHitPoint (uint scanID, const helios::vec3 &xyz, const helios::int2 &row_column, const helios::RGBcolor &color, const std::map< std::string, double > &data)
 Specify a scan point as a hit by providing the (x,y,z) coordinates and row,column in scan table.
 
void deleteHitPoint (uint index)
void deleteHitPoint (uint index)
 Delete a hit point in the scan.
 
uint getHitCount () const
uint getHitCount () const
 Get the number of hit points in the point cloud.
 
helios::vec3 getScanOrigin (uint scanID) const
helios::vec3 getScanOrigin (uint scanID) const
 Get the (x,y,z) scan origin.
 
uint getScanSizeTheta (uint scanID) const
uint getScanSizeTheta (uint scanID) const
 Get the number of scan points in the theta (zenithal) direction.
 
uint getScanSizePhi (uint scanID) const
uint getScanSizePhi (uint scanID) const
 Get the number of scan points in the phi (azimuthal) direction.
 
helios::vec2 getScanRangeTheta (uint scanID) const
helios::vec2 getScanRangeTheta (uint scanID) const
 Get the range of scan directions in the theta (zenithal) direction.
 
helios::vec2 getScanRangePhi (uint scanID) const
helios::vec2 getScanRangePhi (uint scanID) const
 Get the range of scan directions in the phi (azimuthal) direction.
 
float getScanBeamExitDiameter (uint scanID) const
float getScanBeamExitDiameter (uint scanID) const
 Get the diameter of the laser beam at exit from the instrument.
 
std::vector< std::string > getScanColumnFormat (uint scanID) const
std::vector< std::string > getScanColumnFormat (uint scanID) const
 Get the labels for columns in ASCII input/output file.
 
float getScanBeamDivergence (uint scanID) const
float getScanBeamDivergence (uint scanID) const
 Divergence angle of the laser beam in radians.
 
helios::vec3 getHitXYZ (uint index) const
helios::vec3 getHitXYZ (uint index) const
 Get (x,y,z) coordinate of hit point by index.
 
helios::SphericalCoord getHitRaydir (uint index) const
helios::SphericalCoord getHitRaydir (uint index) const
 Get ray direction of hit point in the scan based on its index.
 
double getHitData (uint index, const char *label) const
double getHitData (uint index, const char *label) const
 Set floating point data value associated with a hit point.
 
void setHitData (uint index, const char *label, double value)
void setHitData (uint index, const char *label, double value)
 Get floating point data value associated with a hit point.
 
bool doesHitDataExist (uint index, const char *label) const
bool doesHitDataExist (uint index, const char *label) const
 Check if scalar data exists for a hit point.
 
helios::RGBcolor getHitColor (uint index) const
helios::RGBcolor getHitColor (uint index) const
 Get color of hit point.
 
int getHitScanID (uint index) const
int getHitScanID (uint index) const
 Get the scan with which a hit is associated.
 
int getHitIndex (uint scanID, uint row, uint column) const
int getHitIndex (uint scanID, uint row, uint column) const
 Get the index of a scan point based on its row and column in the hit table.
 
int getHitGridCell (uint index) const
int getHitGridCell (uint index) const
 Get the grid cell in which the hit point resides.
 
void setHitGridCell (uint index, int cell)
void setHitGridCell (uint index, int cell)
 Set the grid cell in which the hit point resides.
 
void coordinateShift (const helios::vec3 &shift)
void coordinateShift (const helios::vec3 &shift)
 Apply a translation to all points in the point cloud.
 
void coordinateShift (uint scanID, const helios::vec3 &shift)
void coordinateShift (uint scanID, const helios::vec3 &shift)
 Apply a translation to all points in a given scan.
 
void coordinateRotation (const helios::SphericalCoord &rotation)
void coordinateRotation (const helios::SphericalCoord &rotation)
 Rotate all points in the point cloud about the origin.
 
void coordinateRotation (uint scanID, const helios::SphericalCoord &rotation)
void coordinateRotation (uint scanID, const helios::SphericalCoord &rotation)
 Rotate all points in the point cloud about the origin.
 
void coordinateRotation (float rotation, const helios::vec3 &line_base, const helios::vec3 &line_direction)
void coordinateRotation (float rotation, const helios::vec3 &line_base, const helios::vec3 &line_direction)
 Rotate all points in the point cloud about an arbitrary line.
 
uint getTriangleCount () const
uint getTriangleCount () const
 Get the number of triangles formed by the triangulation.
 
Triangulation getTriangle (uint index) const
Triangulation getTriangle (uint index) const
 Get hit point corresponding to first vertex of triangle.
 
void loadXML (const char *filename)
void loadXML (const char *filename)
 Read an XML file containing scan information.
 
void loadXML (const char *filename, bool load_grid_only)
void loadXML (const char *filename, bool load_grid_only)
 Read an XML file containing scan information.
 
void exportTriangleNormals (const char *filename)
void exportTriangleNormals (const char *filename)
 Export to file the normal vectors (nx,ny,nz) for all triangles formed.
 
void exportTriangleNormals (const char *filename, int gridcell)
void exportTriangleNormals (const char *filename, int gridcell)
 Export to file the normal vectors (nx,ny,nz) for triangles formed within a single gridcell.
 
void exportTriangleAreas (const char *filename)
void exportTriangleAreas (const char *filename)
 Export to file the area of all triangles formed.
 
void exportTriangleAreas (const char *filename, int gridcell)
void exportTriangleAreas (const char *filename, int gridcell)
 Export to file the area of all triangles formed within a single grid cell.
 
void exportTriangleInclinationDistribution (const char *filename, uint Nbins)
void exportTriangleInclinationDistribution (const char *filename, uint Nbins)
 Export to file discrete area-weighted inclination angle probability distribution based on the triangulation. Inclination angles are between 0 and 90 degrees. The probability distribution is normalized such that the sine-weighted integral over all angles is 1. The value of each bin is written as a column in the output file; lines correspond to each voxel grid cell.
 
void exportLeafAreas (const char *filename)
void exportLeafAreas (const char *filename)
 Export to file the leaf area within each grid cell. Lines of the file correspond to each grid cell.
 
void exportLeafAreaDensities (const char *filename)
void exportLeafAreaDensities (const char *filename)
 Export to file the leaf area density within each grid cell. Lines of the file correspond to each grid cell.
 
void exportGtheta (const char *filename)
void exportGtheta (const char *filename)
 Export to file the G(theta) value within each grid cell. Lines of the file correspond to each grid cell.
 
void exportPointCloud (const char *filename)
void exportPointCloud (const char *filename)
 Export to file all points in the point cloud to an ASCII text file following the column format specified by the <ASCII_format></ASCII_format> tag in the scan XML file.
 
void exportPointCloud (const char *filename, uint scanID)
void exportPointCloud (const char *filename, uint scanID)
 Export to file all points from a given scan to an ASCII text file following the column format specified by the <ASCII_format></ASCII_format> tag in the scan XML file.
 
void exportPointCloudPTX (const char *filename, uint scanID)
void exportPointCloudPTX (const char *filename, uint scanID)
 Export to file all points from a given scan to PTX file.
 
void addHitsToVisualizer (Visualizer *visualizer, uint pointsize) const
void addHitsToVisualizer (Visualizer *visualizer, uint pointsize) const
 Add all hit points to the visualizer plug-in, and color them by their r-g-b color.
 
void addHitsToVisualizer (Visualizer *visualizer, uint pointsize, const char *color_value) const
void addHitsToVisualizer (Visualizer *visualizer, uint pointsize, const char *color_value) const
 Add all hit points to the visualizer plug-in, and color them by a hit scalar data value.
 
void addGridToVisualizer (Visualizer *visualizer) const
void addGridToVisualizer (Visualizer *visualizer) const
 Add all grid cells to the visualizer plug-in.
 
void addGridWireFrametoVisualizer (Visualizer *visualizer) const
void addGridWireFrametoVisualizer (Visualizer *visualizer) const
 Add wire frame of the grid to the visualizer plug-in.
 
void addGrid (const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &ndiv, float rotation)
void addGrid (const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &ndiv, float rotation)
 Add a grid to point cloud instead of reading in from an xml file.
 
void addTrianglesToVisualizer (Visualizer *visualizer) const
void addTrianglesToVisualizer (Visualizer *visualizer) const
 Add all triangles to the visualizer plug-in, and color them by their r-g-b color.
 
void addTrianglesToVisualizer (Visualizer *visualizer, uint gridcell) const
void addTrianglesToVisualizer (Visualizer *visualizer, uint gridcell) const
 Add triangles within a given grid cell to the visualizer plug-in, and color them by their r-g-b color.
 
void addLeafReconstructionToVisualizer (Visualizer *visualizer) const
void addLeafReconstructionToVisualizer (Visualizer *visualizer) const
 Add reconstructed leaves (triangles or alpha masks) to the visualizer plug-in.
 
void addTrunkReconstructionToVisualizer (Visualizer *visualizer) const
void addTrunkReconstructionToVisualizer (Visualizer *visualizer) const
 Add trunk reconstruction to the visualizer plug-in. Colors reconstructed triangles by hit point color.
 
void addTrunkReconstructionToVisualizer (Visualizer *visualizer, const helios::RGBcolor &trunk_color) const
void addTrunkReconstructionToVisualizer (Visualizer *visualizer, const helios::RGBcolor &trunk_color) const
 Add trunk reconstruction to the visualizer plug-in.
 
std::vector< uint > addLeafReconstructionToContext (helios::Context *context) const
std::vector< uint > addLeafReconstructionToContext (helios::Context *context) const
 Add reconstructed leaves (texture-masked patches) to the Context.
 
std::vector< uint > addLeafReconstructionToContext (helios::Context *context, const helios::int2 &subpatches) const
std::vector< uint > addLeafReconstructionToContext (helios::Context *context, const helios::int2 &subpatches) const
 Add reconstructed leaves (texture-masked patches) to the Context with leaves divided into sub-patches (tiled)
 
std::vector< uint > addReconstructedTriangleGroupsToContext (helios::Context *context) const
std::vector< uint > addReconstructedTriangleGroupsToContext (helios::Context *context) const
 Add triangle groups used in the direct reconstruction to the Context.
 
std::vector< uint > addTrunkReconstructionToContext (helios::Context *context) const
std::vector< uint > addTrunkReconstructionToContext (helios::Context *context) const
 Add reconstructed trunk triangles to the Context.
 
void getHitBoundingBox (helios::vec3 &boxmin, helios::vec3 &boxmax) const
void getHitBoundingBox (helios::vec3 &boxmin, helios::vec3 &boxmax) const
 Form an axis-aligned bounding box for all hit points in the point cloud.
 
void getGridBoundingBox (helios::vec3 &boxmin, helios::vec3 &boxmax) const
void getGridBoundingBox (helios::vec3 &boxmin, helios::vec3 &boxmax) const
 Form an axis-aligned bounding box for all grid cells in the point cloud.
 
void distanceFilter (float maxdistance)
void distanceFilter (float maxdistance)
 Filter scan by imposing a maximum distance from the scanner.
 
void xyzFilter (float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
void xyzFilter (float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
 overloaded version of xyzFilter that defaults to deleting points outside the provided bounding box
 
void xyzFilter (float xmin, float xmax, float ymin, float ymax, float zmin, float zmax, bool deleteOutside)
void xyzFilter (float xmin, float xmax, float ymin, float ymax, float zmin, float zmax, bool deleteOutside)
 Filter scan with a bounding box.
 
void reflectanceFilter (float minreflectance)
void reflectanceFilter (float minreflectance)
 Filter scan by imposing a minimum reflectance value.
 
void scalarFilter (const char *scalar_field, float threshold, const char *comparator)
void scalarFilter (const char *scalar_field, float threshold, const char *comparator)
 Filter hit points based on a scalar field given by a column in the ASCII data.
 
void maxPulseFilter (const char *scalar)
void maxPulseFilter (const char *scalar)
 Filter full-waveform data according to the maximum scalar value along each pulse. Any scalar value can be used, provided it is a field in the hit point data file. The resulting point cloud will have only one hit point per laser pulse.
 
void minPulseFilter (const char *scalar)
void minPulseFilter (const char *scalar)
 Filter full-waveform data according to the minimum scalar value along each pulse. Any scalar value can be used, provided it is a field in the hit point data file. The resulting point cloud will have only one hit point per laser pulse.
 
void firstHitFilter ()
void firstHitFilter ()
 Filter full-waveform data to include only the first hit per laser pulse. The resulting point cloud will have only one hit point per laser pulse (first hits).
 
void lastHitFilter ()
void lastHitFilter ()
 Filter full-waveform data to include only the last hit per laser pulse. The resulting point cloud will have only one hit point per laser pulse (last hits).
 
void triangulateHitPoints (float Lmax, float max_aspect_ratio)
void triangulateHitPoints (float Lmax, float max_aspect_ratio)
 Perform triangulation on all hit points in point cloud.
 
void triangulateHitPoints (float Lmax, float max_aspect_ratio, const char *scalar_field, float threshold, const char *comparator)
void triangulateHitPoints (float Lmax, float max_aspect_ratio, const char *scalar_field, float threshold, const char *comparator)
 Perform triangulation on hit points in point cloud that meet some filtering criteria based on scalar data.
 
void addTrianglesToContext (helios::Context *context) const
void addTrianglesToContext (helios::Context *context) const
 Add triangle geometry to Helios context.
 
uint getGridCellCount () const
uint getGridCellCount () const
 Get the number of cells in the grid.
 
void addGridCell (const helios::vec3 &center, const helios::vec3 &size, float rotation)
void addGridCell (const helios::vec3 &center, const helios::vec3 &size, float rotation)
 Add a cell to the grid.
 
void addGridCell (const helios::vec3 &center, const helios::vec3 &global_anchor, const helios::vec3 &size, const helios::vec3 &global_size, float rotation, const helios::int3 &global_ijk, const helios::int3 &global_count)
void addGridCell (const helios::vec3 &center, const helios::vec3 &global_anchor, const helios::vec3 &size, const helios::vec3 &global_size, float rotation, const helios::int3 &global_ijk, const helios::int3 &global_count)
 Add a cell to the grid, where the cell is part of a larger global rectangular grid.
 
helios::vec3 getCellCenter (uint index) const
helios::vec3 getCellCenter (uint index) const
 Get the (x,y,z) coordinate of a grid cell by its index.
 
helios::vec3 getCellGlobalAnchor (uint index) const
helios::vec3 getCellGlobalAnchor (uint index) const
 Get the (x,y,z) coordinate of a grid global anchor by its index.
 
helios::vec3 getCellSize (uint index) const
helios::vec3 getCellSize (uint index) const
 Get the size of a grid cell by its index.
 
float getCellRotation (uint index) const
float getCellRotation (uint index) const
 Get the size of a grid cell by its index.
 
void calculateHitGridCellGPU ()
void calculateHitGridCellGPU ()
 Determine the grid cell in which each hit point resides for the whole point cloud - GPU accelerated version *‍/.
 
void syntheticScan (helios::Context *context)
void syntheticScan (helios::Context *context)
 Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns only one laser hit per pulse)
 
void syntheticScan (helios::Context *context, bool scan_grid_only, bool record_misses)
void syntheticScan (helios::Context *context, bool scan_grid_only, bool record_misses)
 Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns only one laser hit per pulse)
 
void syntheticScan (helios::Context *context, int rays_per_pulse, float pulse_distance_threshold)
void syntheticScan (helios::Context *context, int rays_per_pulse, float pulse_distance_threshold)
 Run a full-waveform synthetic LiDAR scan based on scan parameters given in an XML file (returns multiple laser hits per pulse)
 
void syntheticScan (helios::Context *context, int rays_per_pulse, float pulse_distance_threshold, bool scan_grid_only, bool record_misses)
void syntheticScan (helios::Context *context, int rays_per_pulse, float pulse_distance_threshold, bool scan_grid_only, bool record_misses)
 Run a full-waveform synthetic LiDAR scan based on scan parameters given in an XML file (returns multiple laser hits per pulse)
 
std::vector< float > calculateSyntheticLeafArea (helios::Context *context)
std::vector< float > calculateSyntheticLeafArea (helios::Context *context)
 Calculate the surface area of all primitives in the context.
 
std::vector< float > calculateSyntheticGtheta (helios::Context *context)
std::vector< float > calculateSyntheticGtheta (helios::Context *context)
 Calculate the G(theta) of all primitives in the context.
 
void setCellLeafArea (float area, uint index)
void setCellLeafArea (float area, uint index)
 Set the leaf area of a grid cell in m^2.
 
float getCellLeafArea (uint index) const
float getCellLeafArea (uint index) const
 Get the leaf area of a grid cell in m^2.
 
float getCellLeafAreaDensity (uint index) const
float getCellLeafAreaDensity (uint index) const
 Get the leaf area density of a grid cell in 1/m.
 
void setCellGtheta (float Gtheta, uint index)
void setCellGtheta (float Gtheta, uint index)
 Set the average G(theta) value of a grid cell.
 
float getCellGtheta (uint index) const
float getCellGtheta (uint index) const
 Get the G(theta) of a grid cell.
 
std::vector< helios::vec3gapfillMisses ()
std::vector< helios::vec3gapfillMisses ()
 For scans that are missing points (e.g., sky points), this function will attempt to fill in missing points for all scans. This increases the accuracy of LAD calculations because it makes sure all pulses are accounted for.
 
std::vector< helios::vec3gapfillMisses (uint scanID)
std::vector< helios::vec3gapfillMisses (uint scanID)
 For scans that are missing points (e.g., sky points), this function will attempt to fill in missing points. This increases the accuracy of LAD calculations because it makes sure all pulses are accounted for.
 
std::vector< helios::vec3gapfillMisses (uint scanID, const bool gapfill_grid_only, const bool add_flags)
std::vector< helios::vec3gapfillMisses (uint scanID, const bool gapfill_grid_only, const bool add_flags)
 For scans that are missing points (e.g., sky points), this function will attempt to fill in missing points. This increases the accuracy of LAD calculations because it makes sure all pulses are accounted for.
 
void calculateLeafAreaGPU ()
void calculateLeafAreaGPU ()
 Calculate the leaf area for each grid volume.
 
void calculateLeafAreaGPU (int min_voxel_hits)
void calculateLeafAreaGPU (int min_voxel_hits)
 Calculate the leaf area for each grid volume.
 
void calculateLeafAreaGPU_testing (int min_voxel_hits)
void calculateLeafAreaGPU_testing (int min_voxel_hits)
 Calculate the leaf area for each grid volume.
 
void calculateLeafAreaGPU_synthetic (helios::Context *context, bool beamoutput, bool fillAnalytic)
void calculateLeafAreaGPU_synthetic (helios::Context *context, bool beamoutput, bool fillAnalytic)
 Calculate the leaf area for each grid volume in a synthetic scan using several different method for estimating P.
 
void calculateLeafAreaGPU_equal_weighting (bool beamoutput, bool fillAnalytic)
void calculateLeafAreaGPU_equal_weighting (bool beamoutput, bool fillAnalytic)
 Calculate the leaf area for each grid volume using equal weighting method.
 
void calculateLeafAreaGPU_equal_weighting (bool beamoutput, bool fillAnalytic, std::vector< float > constant_G)
void calculateLeafAreaGPU_equal_weighting (bool beamoutput, bool fillAnalytic, std::vector< float > constant_G)
 Calculate the leaf area for each grid volume using equal weighting method.
 
void leafReconstructionAlphaMask (float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)
void leafReconstructionAlphaMask (float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)
 Perform a leaf reconstruction based on texture-masked Patches within each gridcell. The reconstruction produces Patches for each reconstructed leaf surface, with leaf size automatically estimated algorithmically.

 
void leafReconstructionAlphaMask (float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, float leaf_length_constant, const char *mask_file)
void leafReconstructionAlphaMask (float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, float leaf_length_constant, const char *mask_file)
 Perform a leaf reconstruction based on texture-masked Patches within each gridcell. The reconstruction produces Patches for each reconstructed leaf surface, with leaf size set to a constant value.
 
void trunkReconstruction (const helios::vec3 &box_center, const helios::vec3 &box_size, float Lmax, float max_aspect_ratio)
void trunkReconstruction (const helios::vec3 &box_center, const helios::vec3 &box_size, float Lmax, float max_aspect_ratio)
 Reconstruct the trunk of the tree. In order to do this, you must specify the center and size of a rectangular box that encompasses the tree trunk. This routine will then try to find the largest continuous triangle group, which is assumed to correspond to the trunk.
 
void cropBeamsToGridAngleRange (uint source)
void cropBeamsToGridAngleRange (uint source)
 Delete hitpoints that do not pass through / intersect the voxel grid.
 
std::vector< uint > peakFinder (std::vector< float > signal)
std::vector< uint > peakFinder (std::vector< float > signal)
 find the indices of the peaks of a vector of floats
 
@@ -456,7 +468,7 @@

LiDARcloud::LiDARcloud ( - ) + ) @@ -478,31 +490,22 @@

void LiDARcloud::addGrid ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec3 &  - size, + const helios::vec3 & size, - const helios::int3 &  - ndiv, + const helios::int3 & ndiv, - float  - rotation  - - - - ) - + float rotation )

@@ -531,49 +534,37 @@

void LiDARcloud::addGridCell ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec3 &  - global_anchor, + const helios::vec3 & global_anchor, - const helios::vec3 &  - size, + const helios::vec3 & size, - const helios::vec3 &  - global_size, + const helios::vec3 & global_size, - float  - rotation, + float rotation, - const helios::int3 &  - global_ijk, + const helios::int3 & global_ijk, - const helios::int3 &  - global_count  - - - - ) - + const helios::int3 & global_count )

@@ -605,25 +596,17 @@

void LiDARcloud::addGridCell ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec3 &  - size, + const helios::vec3 & size, - float  - rotation  - - - - ) - + float rotation )

@@ -651,8 +634,7 @@

void LiDARcloud::addGridToVisualizer ( - Visualizer *  - visualizer) + Visualizer * visualizer) const @@ -679,8 +661,7 @@

void LiDARcloud::addGridWireFrametoVisualizer ( - Visualizer *  - visualizer) + Visualizer * visualizer) const @@ -707,37 +688,27 @@

void LiDARcloud::addHitPoint ( - uint  - scanID, + uint scanID, - const helios::vec3 &  - xyz, + const helios::vec3 & xyz, - const helios::int2 &  - row_column, + const helios::int2 & row_column, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - const std::map< std::string, double > &  - data  - - - - ) - + const std::map< std::string, double > & data )

@@ -765,25 +736,17 @@

void LiDARcloud::addHitPoint ( - uint  - scanID, + uint scanID, - const helios::vec3 &  - xyz, + const helios::vec3 & xyz, - const helios::SphericalCoord &  - direction  - - - - ) - + const helios::SphericalCoord & direction )

@@ -812,31 +775,22 @@

void LiDARcloud::addHitPoint ( - uint  - scanID, + uint scanID, - const helios::vec3 &  - xyz, + const helios::vec3 & xyz, - const helios::SphericalCoord &  - direction, + const helios::SphericalCoord & direction, - const helios::RGBcolor &  - color  - - - - ) - + const helios::RGBcolor & color )

@@ -866,37 +820,27 @@

void LiDARcloud::addHitPoint ( - uint  - scanID, + uint scanID, - const helios::vec3 &  - xyz, + const helios::vec3 & xyz, - const helios::SphericalCoord &  - direction, + const helios::SphericalCoord & direction, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - const std::map< std::string, double > &  - data  - - - - ) - + const std::map< std::string, double > & data )

@@ -924,31 +868,22 @@

void LiDARcloud::addHitPoint ( - uint  - scanID, + uint scanID, - const helios::vec3 &  - xyz, + const helios::vec3 & xyz, - const helios::SphericalCoord &  - direction, + const helios::SphericalCoord & direction, - const std::map< std::string, double > &  - data  - - - - ) - + const std::map< std::string, double > & data )

@@ -975,19 +910,12 @@

void LiDARcloud::addHitsToVisualizer ( - Visualizer *  - visualizer, + Visualizer * visualizer, - uint  - pointsize  - - - - ) - const + uint pointsize ) const

@@ -1014,25 +942,17 @@

void LiDARcloud::addHitsToVisualizer ( - Visualizer *  - visualizer, + Visualizer * visualizer, - uint  - pointsize, + uint pointsize, - const char *  - color_value  - - - - ) - const + const char * color_value ) const

@@ -1060,8 +980,7 @@

std::vector< uint > LiDARcloud::addLeafReconstructionToContext ( - helios::Context *  - context) + helios::Context * context) const @@ -1089,19 +1008,12 @@

std::vector< uint > LiDARcloud::addLeafReconstructionToContext ( - helios::Context *  - context, + helios::Context * context, - const helios::int2 &  - subpatches  - - - - ) - const + const helios::int2 & subpatches ) const

@@ -1129,8 +1041,7 @@

void LiDARcloud::addLeafReconstructionToVisualizer ( - Visualizer *  - visualizer) + Visualizer * visualizer) const @@ -1157,8 +1068,7 @@

std::vector< uint > LiDARcloud::addReconstructedTriangleGroupsToContext ( - helios::Context *  - context) + helios::Context * context) const @@ -1186,8 +1096,7 @@

uint LiDARcloud::addScan ( - ScanMetadata &  - newscan) + ScanMetadata & newscan) @@ -1215,8 +1124,7 @@

void LiDARcloud::addTrianglesToContext ( - helios::Context *  - context) + helios::Context * context) const @@ -1238,8 +1146,7 @@

void LiDARcloud::addTrianglesToVisualizer ( - Visualizer *  - visualizer) + Visualizer * visualizer) const @@ -1266,19 +1173,12 @@

void LiDARcloud::addTrianglesToVisualizer ( - Visualizer *  - visualizer, + Visualizer * visualizer, - uint  - gridcell  - - - - ) - const + uint gridcell ) const

@@ -1305,8 +1205,7 @@

std::vector< uint > LiDARcloud::addTrunkReconstructionToContext ( - helios::Context *  - context) + helios::Context * context) const @@ -1333,8 +1232,7 @@

void LiDARcloud::addTrunkReconstructionToVisualizer ( - Visualizer *  - visualizer) + Visualizer * visualizer) const @@ -1361,19 +1259,12 @@

void LiDARcloud::addTrunkReconstructionToVisualizer ( - Visualizer *  - visualizer, + Visualizer * visualizer, - const helios::RGBcolor &  - trunk_color  - - - - ) - const + const helios::RGBcolor & trunk_color ) const

@@ -1400,7 +1291,7 @@

void LiDARcloud::calculateHitGridCellGPU ( - ) + ) @@ -1426,7 +1317,7 @@

void LiDARcloud::calculateLeafAreaGPU ( - ) + ) @@ -1447,8 +1338,7 @@

void LiDARcloud::calculateLeafAreaGPU ( - int  - min_voxel_hits) + int min_voxel_hits) @@ -1461,7 +1351,7 @@

Note
Currently, this version assumes all data is discrete-return. The function calculateLeafAreaGPU_testing() deals with waveform data, but may not be working correctly. In the next version, these two functions will be combined.
+
Note
Currently, this version assumes all data is discrete-return. The function calculateLeafAreaGPU_testing() deals with waveform data, but may not be working correctly. In the next version, these two functions will be combined.

Definition at line 901 of file LiDAR.cu.

@@ -1476,19 +1366,12 @@

void LiDARcloud::calculateLeafAreaGPU_equal_weighting ( - bool  - beamoutput, + bool beamoutput, - bool  - fillAnalytic  - - - - ) - + bool fillAnalytic )

@@ -1550,7 +1425,7 @@

Note
writes voxel level data to ../voxeloutput/voxeloutput.txt
-

old code in original calculateLeafAreaGPU_testing() ... do we need to keep this??

+

old code in original calculateLeafAreaGPU_testing() ... do we need to keep this??

Definition at line 4483 of file LiDAR.cu.

@@ -1565,25 +1440,17 @@

void LiDARcloud::calculateLeafAreaGPU_synthetic ( - helios::Context *  - context, + helios::Context * context, - bool  - beamoutput, + bool beamoutput, - bool  - fillAnalytic  - - - - ) - + bool fillAnalytic )

@@ -1813,8 +1661,7 @@

void LiDARcloud::coordinateShift ( - const helios::vec3 &  - shift) + const helios::vec3 & shift) @@ -1841,19 +1688,12 @@

void LiDARcloud::coordinateShift ( - uint  - scanID, + uint scanID, - const helios::vec3 &  - shift  - - - - ) - + const helios::vec3 & shift )

@@ -2409,7 +2198,7 @@

void LiDARcloud::firstHitFilter ( - ) + ) @@ -2431,7 +2220,7 @@

std::vector< helios::vec3 > LiDARcloud::gapfillMisses ( - ) + ) @@ -2453,8 +2242,7 @@

std::vector< helios::vec3 > LiDARcloud::gapfillMisses ( - uint  - scanID) + uint scanID) @@ -2482,25 +2270,17 @@

std::vector< helios::vec3 > LiDARcloud::gapfillMisses ( - uint  - scanID, + uint scanID, - const bool  - gapfill_grid_only, + const bool gapfill_grid_only, - const bool  - add_flags  - - - - ) - + const bool add_flags )

@@ -2529,8 +2309,7 @@

helios::vec3 LiDARcloud::getCellCenter ( - uint  - index) + uint index) const @@ -2557,8 +2336,7 @@

helios::vec3 LiDARcloud::getCellGlobalAnchor ( - uint  - index) + uint index) const @@ -2585,8 +2363,7 @@

float LiDARcloud::getCellGtheta ( - uint  - index) + uint index) const @@ -2613,8 +2390,7 @@

float LiDARcloud::getCellLeafArea ( - uint  - index) + uint index) const @@ -2641,8 +2417,7 @@

float LiDARcloud::getCellLeafAreaDensity ( - uint  - index) + uint index) const @@ -2669,8 +2444,7 @@

float LiDARcloud::getCellRotation ( - uint  - index) + uint index) const @@ -2697,8 +2471,7 @@

helios::vec3 LiDARcloud::getCellSize ( - uint  - index) + uint index) const @@ -2721,19 +2494,12 @@

void LiDARcloud::getGridBoundingBox ( - helios::vec3 &  - boxmin, + helios::vec3 & boxmin, - helios::vec3 &  - boxmax  - - - - ) - const + helios::vec3 & boxmax ) const

@@ -2988,8 +2729,7 @@

helios::SphericalCoord LiDARcloud::getHitRaydir ( - uint  - index) + uint index) const @@ -3016,8 +2756,7 @@

int LiDARcloud::getHitScanID ( - uint  - index) + uint index) const @@ -3044,8 +2783,7 @@

helios::vec3 LiDARcloud::getHitXYZ ( - uint  - index) + uint index) const @@ -3072,8 +2810,7 @@

float LiDARcloud::getScanBeamDivergence ( - uint  - scanID) + uint scanID) const @@ -3101,8 +2838,7 @@

float LiDARcloud::getScanBeamExitDiameter ( - uint  - scanID) + uint scanID) const @@ -3130,8 +2866,7 @@

std::vector< std::string > LiDARcloud::getScanColumnFormat ( - uint  - scanID) + uint scanID) const @@ -3158,7 +2893,7 @@

uint LiDARcloud::getScanCount ( - ) + ) @@ -3179,8 +2914,7 @@

helios::vec3 LiDARcloud::getScanOrigin ( - uint  - scanID) + uint scanID) const @@ -3207,8 +2941,7 @@

helios::vec2 LiDARcloud::getScanRangePhi ( - uint  - scanID) + uint scanID) const @@ -3236,8 +2969,7 @@

helios::vec2 LiDARcloud::getScanRangeTheta ( - uint  - scanID) + uint scanID) const @@ -3265,8 +2997,7 @@

uint LiDARcloud::getScanSizePhi ( - uint  - scanID) + uint scanID) const @@ -3293,8 +3024,7 @@

uint LiDARcloud::getScanSizeTheta ( - uint  - scanID) + uint scanID) const @@ -3321,8 +3051,7 @@

Triangulation LiDARcloud::getTriangle ( - uint  - index) + uint index) const @@ -3344,7 +3073,7 @@

uint LiDARcloud::getTriangleCount ( - ) + ) const @@ -3365,7 +3094,7 @@

void LiDARcloud::lastHitFilter ( - ) + ) @@ -3387,31 +3116,22 @@

void LiDARcloud::leafReconstructionAlphaMask ( - float  - minimum_leaf_group_area, + float minimum_leaf_group_area, - float  - maximum_leaf_group_area, + float maximum_leaf_group_area, - float  - leaf_aspect_ratio, + float leaf_aspect_ratio, - const char *  - mask_file  - - - - ) - + const char * mask_file )

@@ -3913,8 +3574,7 @@

void LiDARcloud::syntheticScan ( - helios::Context *  - context) + helios::Context * context) @@ -3941,25 +3601,17 @@

void LiDARcloud::syntheticScan ( - helios::Context *  - context, + helios::Context * context, - bool  - scan_grid_only, + bool scan_grid_only, - bool  - record_misses  - - - - ) - + bool record_misses )

@@ -3973,7 +3625,7 @@

Note
Calling syntheticScan() with scan_grid_only=true can save substantial memory for contexts with large domains.
+
Note
Calling syntheticScan() with scan_grid_only=true can save substantial memory for contexts with large domains.

Definition at line 3097 of file LiDAR.cu.

@@ -3988,25 +3640,17 @@

void LiDARcloud::syntheticScan ( - helios::Context *  - context, + helios::Context * context, - int  - rays_per_pulse, + int rays_per_pulse, - float  - pulse_distance_threshold  - - - - ) - + float pulse_distance_threshold )

@@ -4021,7 +3665,7 @@

Note
Calling syntheticScan() with rays_per_pulse=1 will effectively run a discrete return synthetic scan.
+
Note
Calling syntheticScan() with rays_per_pulse=1 will effectively run a discrete return synthetic scan.

Definition at line 3101 of file LiDAR.cu.

@@ -4036,37 +3680,27 @@

void LiDARcloud::syntheticScan ( - helios::Context *  - context, + helios::Context * context, - int  - rays_per_pulse, + int rays_per_pulse, - float  - pulse_distance_threshold, + float pulse_distance_threshold, - bool  - scan_grid_only, + bool scan_grid_only, - bool  - record_misses  - - - - ) - + bool record_misses )

@@ -4082,7 +3716,7 @@

Note
Calling syntheticScan() with rays_per_pulse=1 will effectively run a discrete return synthetic scan.
+
Note
Calling syntheticScan() with rays_per_pulse=1 will effectively run a discrete return synthetic scan.

Definition at line 3105 of file LiDAR.cu.

@@ -4097,19 +3731,12 @@

void LiDARcloud::triangulateHitPoints ( - float  - Lmax, + float Lmax, - float  - max_aspect_ratio  - - - - ) - + float max_aspect_ratio )

@@ -4197,31 +3814,22 @@

void LiDARcloud::trunkReconstruction ( - const helios::vec3 &  - box_center, + const helios::vec3 & box_center, - const helios::vec3 &  - box_size, + const helios::vec3 & box_size, - float  - Lmax, + float Lmax, - float  - max_aspect_ratio  - - - - ) - + float max_aspect_ratio )

@@ -4413,7 +3998,8 @@

+

diff --git a/doc/html/class_photosynthesis_model.html b/doc/html/class_photosynthesis_model.html index 3d9dd9a77..fff77878e 100644 --- a/doc/html/class_photosynthesis_model.html +++ b/doc/html/class_photosynthesis_model.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -93,66 +105,66 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 PhotosynthesisModel (helios::Context *a_context)
 PhotosynthesisModel (helios::Context *a_context)
 Default constructor.
 
int selfTest ()
int selfTest ()
 
void setModelType_Empirical ()
void setModelType_Empirical ()
 Sets photosynthesis to be calculated according to the empirical model.
 
void setModelType_Farquhar ()
void setModelType_Farquhar ()
 Sets photosynthesis to be calculated according to the Farquhar-von Caemmerer-Berry model.
 
void setModelCoefficients (const EmpiricalModelCoefficients &modelcoefficients)
void setModelCoefficients (const EmpiricalModelCoefficients &modelcoefficients)
 Set the empirical model coefficients for all primitives.
 
void setModelCoefficients (const EmpiricalModelCoefficients &modelcoefficients, const std::vector< uint > &UUIDs)
void setModelCoefficients (const EmpiricalModelCoefficients &modelcoefficients, const std::vector< uint > &UUIDs)
 Set the empirical model coefficients for a subset of primitives based on their UUIDs.
 
void setModelCoefficients (const FarquharModelCoefficients &modelcoefficients)
void setModelCoefficients (const FarquharModelCoefficients &modelcoefficients)
 Set the Farquhar-von Caemmerer-Berry model coefficients for all primitives.
 
void setModelCoefficients (const FarquharModelCoefficients &modelcoefficients, const std::vector< uint > &UUIDs)
void setModelCoefficients (const FarquharModelCoefficients &modelcoefficients, const std::vector< uint > &UUIDs)
 Set the Farquhar-von Caemmerer-Berry model coefficients for a subset of primitives based on their UUIDs.
 
void setModelCoefficients (const std::vector< FarquharModelCoefficients > &modelcoefficients, const std::vector< uint > &UUIDs)
void setModelCoefficients (const std::vector< FarquharModelCoefficients > &modelcoefficients, const std::vector< uint > &UUIDs)
 Set the Farquhar-von Caemmerer-Berry model coefficients for a subset of primitives, where coefficients differ between primitives.
 
void setFarquharCoefficientsFromLibrary (const std::string &species)
void setFarquharCoefficientsFromLibrary (const std::string &species)
 Set the Farquhar-von Caemmerer-Berry model coefficients for all primitives based on a species from the library.
 
void setFarquharCoefficientsFromLibrary (const std::string &species, const std::vector< uint > &UUIDs)
void setFarquharCoefficientsFromLibrary (const std::string &species, const std::vector< uint > &UUIDs)
 Set the Farquhar-von Caemmerer-Berry model coefficients for a subset of primitives based on a species from the library.
 
FarquharModelCoefficients getFarquharCoefficientsFromLibrary (const std::string &species)
FarquharModelCoefficients getFarquharCoefficientsFromLibrary (const std::string &species)
 Get Farquhar-von Caemmerer-Berry model coefficients for a species from the library.
 
void run ()
void run ()
 Run the model for all UUIDs in the Context.
 
void run (const std::vector< uint > &lUUIDs)
void run (const std::vector< uint > &lUUIDs)
 Run the model for a select sub-set of UUIDs.
 
EmpiricalModelCoefficients getEmpiricalModelCoefficients (uint UUID)
EmpiricalModelCoefficients getEmpiricalModelCoefficients (uint UUID)
 Get the current model coefficients for the empirical model.
 
FarquharModelCoefficients getFarquharModelCoefficients (uint UUID)
FarquharModelCoefficients getFarquharModelCoefficients (uint UUID)
 Get the current model coefficients for the Farquhar-von Caemmerer-Berry model.
 
void disableMessages ()
void disableMessages ()
 Disable output messages to the standard output.
 
void enableMessages ()
void enableMessages ()
 Enable output messages to the standard output.
 
void optionalOutputPrimitiveData (const char *label)
void optionalOutputPrimitiveData (const char *label)
 Add optional output primitive data values to the Context.
 
void printDefaultValueReport () const
void printDefaultValueReport () const
 Print a report detailing usage of default input values for all primitives in the Context.
 
void printDefaultValueReport (const std::vector< uint > &UUIDs) const
void printDefaultValueReport (const std::vector< uint > &UUIDs) const
 Print a report detailing usage of default input values based on a subset of primitive UUIDs.
 
@@ -172,8 +184,7 @@

PhotosynthesisModel::PhotosynthesisModel ( - helios::Context *  - a_context) + helios::Context * a_context) @@ -206,7 +217,7 @@

void PhotosynthesisModel::disableMessages ( - ) + ) @@ -227,7 +238,7 @@

void PhotosynthesisModel::enableMessages ( - ) + ) @@ -248,8 +259,7 @@

EmpiricalModelCoefficients PhotosynthesisModel::getEmpiricalModelCoefficients ( - uint  - UUID) + uint UUID) @@ -277,8 +287,7 @@

FarquharModelCoefficients PhotosynthesisModel::getFarquharCoefficientsFromLibrary ( - const std::string &  - species) + const std::string & species) @@ -306,8 +315,7 @@

FarquharModelCoefficients PhotosynthesisModel::getFarquharModelCoefficients ( - uint  - UUID) + uint UUID) @@ -335,8 +343,7 @@

void PhotosynthesisModel::optionalOutputPrimitiveData ( - const char *  - label) + const char * label) @@ -363,7 +370,7 @@

void PhotosynthesisModel::printDefaultValueReport ( - ) + ) const @@ -384,8 +391,7 @@

void PhotosynthesisModel::printDefaultValueReport ( - const std::vector< uint > &  - UUIDs) + const std::vector< uint > & UUIDs) const @@ -407,7 +413,7 @@

void PhotosynthesisModel::run ( - ) + ) @@ -428,8 +434,7 @@

void PhotosynthesisModel::run ( - const std::vector< uint > &  - lUUIDs) + const std::vector< uint > & lUUIDs) @@ -456,7 +461,7 @@

int PhotosynthesisModel::selfTest ( - ) + ) @@ -475,8 +480,7 @@

void PhotosynthesisModel::setFarquharCoefficientsFromLibrary ( - const std::string &  - species) + const std::string & species) @@ -503,19 +507,12 @@

void PhotosynthesisModel::setFarquharCoefficientsFromLibrary ( - const std::string &  - species, + const std::string & species, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

@@ -542,8 +539,7 @@

void PhotosynthesisModel::setModelCoefficients ( - const EmpiricalModelCoefficients &  - modelcoefficients) + const EmpiricalModelCoefficients & modelcoefficients) @@ -556,7 +552,7 @@

Note
The model type will be set based on the most recent call to setModelCoefficients().
+
Note
The model type will be set based on the most recent call to setModelCoefficients().

Definition at line 166 of file PhotosynthesisModel.cpp.

@@ -571,19 +567,12 @@

void PhotosynthesisModel::setModelCoefficients ( - const EmpiricalModelCoefficients &  - modelcoefficients, + const EmpiricalModelCoefficients & modelcoefficients, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

@@ -596,7 +585,7 @@

Note
The model type will be set based on the most recent call to setModelCoefficients().
+
Note
The model type will be set based on the most recent call to setModelCoefficients().

Definition at line 172 of file PhotosynthesisModel.cpp.

@@ -611,8 +600,7 @@

void PhotosynthesisModel::setModelCoefficients ( - const FarquharModelCoefficients &  - modelcoefficients) + const FarquharModelCoefficients & modelcoefficients) @@ -625,7 +613,7 @@

Note
The model type will be set based on the most recent call to setModelCoefficients().
+
Note
The model type will be set based on the most recent call to setModelCoefficients().

Definition at line 180 of file PhotosynthesisModel.cpp.

@@ -640,19 +628,12 @@

void PhotosynthesisModel::setModelCoefficients ( - const FarquharModelCoefficients &  - modelcoefficients, + const FarquharModelCoefficients & modelcoefficients, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

@@ -665,7 +646,7 @@

Note
The model type will be set based on the most recent call to setModelCoefficients().
+
Note
The model type will be set based on the most recent call to setModelCoefficients().

Definition at line 186 of file PhotosynthesisModel.cpp.

@@ -680,19 +661,12 @@

void PhotosynthesisModel::setModelCoefficients ( - const std::vector< FarquharModelCoefficients > &  - modelcoefficients, + const std::vector< FarquharModelCoefficients > & modelcoefficients, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

diff --git a/doc/html/class_plant_architecture.html b/doc/html/class_plant_architecture.html index 945e3918e..c4e20c297 100644 --- a/doc/html/class_plant_architecture.html +++ b/doc/html/class_plant_architecture.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -95,201 +107,201 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 PlantArchitecture (helios::Context *context_ptr)
 PlantArchitecture (helios::Context *context_ptr)
 Main architectural model class constructor.
 
void optionalOutputObjectData (const std::string &object_data_label)
void optionalOutputObjectData (const std::string &object_data_label)
 Add optional output object data values to the Context.
 
void optionalOutputObjectData (const std::vector< std::string > &object_data_labels)
void optionalOutputObjectData (const std::vector< std::string > &object_data_labels)
 Add optional output object data values to the Context.
 
void loadPlantModelFromLibrary (const std::string &plant_label)
void loadPlantModelFromLibrary (const std::string &plant_label)
 Load an existing plant model from the library.
 
uint buildPlantInstanceFromLibrary (const helios::vec3 &base_position, float age)
uint buildPlantInstanceFromLibrary (const helios::vec3 &base_position, float age)
 Build a plant instance based on the model currently loaded from the library.
 
std::vector< uint > buildPlantCanopyFromLibrary (const helios::vec3 &canopy_center_position, const helios::vec2 &plant_spacing_xy, const helios::int2 &plant_count_xy, float age, float germination_rate=1.f)
std::vector< uint > buildPlantCanopyFromLibrary (const helios::vec3 &canopy_center_position, const helios::vec2 &plant_spacing_xy, const helios::int2 &plant_count_xy, float age, float germination_rate=1.f)
 Build a canopy of regularly spaced plants based on the model currently loaded from the library.
 
ShootParameters getCurrentShootParameters (const std::string &shoot_type_label)
ShootParameters getCurrentShootParameters (const std::string &shoot_type_label)
 Get the shoot parameters structure for a specific shoot type in the current plant model.
 
std::map< std::string, ShootParametersgetCurrentShootParameters ()
std::map< std::string, ShootParametersgetCurrentShootParameters ()
 Get the shoot parameters structure for all shoot types in the current plant model.
 
std::map< std::string, PhytomerParametersgetCurrentPhytomerParameters ()
std::map< std::string, PhytomerParametersgetCurrentPhytomerParameters ()
 Get the phytomer parameters structure for all shoot types in the current plant model.
 
void updateCurrentShootParameters (const std::string &shoot_type_label, const ShootParameters &params)
void updateCurrentShootParameters (const std::string &shoot_type_label, const ShootParameters &params)
 Update the parameters of a single shoot type in the current plant model.
 
void updateCurrentShootParameters (const std::map< std::string, ShootParameters > &params)
void updateCurrentShootParameters (const std::map< std::string, ShootParameters > &params)
 Update the parameters of all shoot types in the current plant model.
 
uint addPlantInstance (const helios::vec3 &base_position, float current_age)
uint addPlantInstance (const helios::vec3 &base_position, float current_age)
 Create an instance of a plant.
 
uint duplicatePlantInstance (uint plantID, const helios::vec3 &base_position, const AxisRotation &base_rotation, float current_age)
uint duplicatePlantInstance (uint plantID, const helios::vec3 &base_position, const AxisRotation &base_rotation, float current_age)
 Duplicate an existing plant instance and specify its base position and age.
 
void deletePlantInstance (uint plantID)
void deletePlantInstance (uint plantID)
 Delete an existing plant instance.
 
void deletePlantInstance (const std::vector< uint > &plantIDs)
void deletePlantInstance (const std::vector< uint > &plantIDs)
 Delete multiple existing plant instances.
 
void setPlantPhenologicalThresholds (uint plantID, float time_to_dormancy_break, float time_to_flower_initiation, float time_to_flower_opening, float time_to_fruit_set, float time_to_fruit_maturity, float time_to_dormancy, float max_leaf_lifespan=1e6, bool is_evergreen=false)
void setPlantPhenologicalThresholds (uint plantID, float time_to_dormancy_break, float time_to_flower_initiation, float time_to_flower_opening, float time_to_fruit_set, float time_to_fruit_maturity, float time_to_dormancy, float max_leaf_lifespan=1e6, bool is_evergreen=false)
 Specify the threshold values for plant phenological stages.
 
void disablePlantPhenology (uint plantID)
void disablePlantPhenology (uint plantID)
 
void advanceTime (float time_step_days)
void advanceTime (float time_step_days)
 Advance plant growth by a specified time interval for all plants.
 
void advanceTime (int time_step_years, float time_step_days)
void advanceTime (int time_step_years, float time_step_days)
 Advance plant growth by a specified time interval for all plants.
 
void advanceTime (uint plantID, float time_step_days)
void advanceTime (uint plantID, float time_step_days)
 Advance plant growth by a specified time interval for a single plant.
 
void defineShootType (const std::string &shoot_type_label, const ShootParameters &shoot_params)
void defineShootType (const std::string &shoot_type_label, const ShootParameters &shoot_params)
 Define a new shoot type based on a set of ShootParameters.
 
uint addBaseStemShoot (uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
 Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has already been created using the addPlantInstance() method.
uint addBaseStemShoot (uint plantID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
 Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has already been created using the addPlantInstance() method.
 
uint appendShoot (uint plantID, int parent_shoot_ID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
uint appendShoot (uint plantID, int parent_shoot_ID, uint current_node_number, const AxisRotation &base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
 Manually append a new shoot at the end of an existing shoot. This is used when the characteristics of a shoot change along its length (e.g., from a unifoliate to trifoliate leaf).
 
uint addChildShoot (uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
uint addChildShoot (uint plantID, int parent_shoot_ID, uint parent_node_index, uint current_node_number, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label, uint petiole_index=0)
 Manually add a child shoot at the axillary bud of a phytomer.
 
uint addEpicormicShoot (uint plantID, int parent_shoot_ID, float parent_position_fraction, uint current_node_number, float zenith_perturbation_degrees, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
uint addEpicormicShoot (uint plantID, int parent_shoot_ID, float parent_position_fraction, uint current_node_number, float zenith_perturbation_degrees, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper, const std::string &shoot_type_label)
 Manually add a child epicormic shoot (water sprout) at an arbitrary position along the shoot.
 
int appendPhytomerToShoot (uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
int appendPhytomerToShoot (uint plantID, uint shootID, const PhytomerParameters &phytomer_parameters, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction)
 Add a new phytomer at the terminal bud of a shoot.
 
void enableEpicormicChildShoots (uint plantID, const std::string &epicormic_shoot_type_label, float epicormic_probability_perlength_perday)
void enableEpicormicChildShoots (uint plantID, const std::string &epicormic_shoot_type_label, float epicormic_probability_perlength_perday)
 Enable shoot type to produce epicormic child shoots (water sprouts)
 
void disableInternodeContextBuild ()
void disableInternodeContextBuild ()
 Do not build internode primitive geometry in the Context.
 
void disablePetioleContextBuild ()
void disablePetioleContextBuild ()
 Do not build petiole primitive geometry in the Context.
 
void disablePeduncleContextBuild ()
void disablePeduncleContextBuild ()
 Do not build peduncle primitive geometry in the Context.
 
void enableGroundClipping (float ground_height=0.f)
void enableGroundClipping (float ground_height=0.f)
 Enable automatic removal of organs that are below the ground plane.
 
void initializePlantCarbohydratePool (uint plantID, float carbohydrate_concentration_molC_m3)
void initializePlantCarbohydratePool (uint plantID, float carbohydrate_concentration_molC_m3)
 
void initializeShootCarbohydratePool (uint plantID, uint shootID, float carbohydrate_concentration_molC_m3)
void initializeShootCarbohydratePool (uint plantID, uint shootID, float carbohydrate_concentration_molC_m3)
 
void incrementPhytomerInternodeGirth (uint plantID, uint shootID, uint node_number, bool update_context_geometry)
void incrementPhytomerInternodeGirth (uint plantID, uint shootID, uint node_number, bool update_context_geometry)
 
void setPhytomerLeafScale (uint plantID, uint shootID, uint node_number, float leaf_scale_factor_fraction)
void setPhytomerLeafScale (uint plantID, uint shootID, uint node_number, float leaf_scale_factor_fraction)
 
void setPlantBasePosition (uint plantID, const helios::vec3 &base_position)
void setPlantBasePosition (uint plantID, const helios::vec3 &base_position)
 
void setPlantAge (uint plantID, float current_age)
void setPlantAge (uint plantID, float current_age)
 
void harvestPlant (uint plantID)
void harvestPlant (uint plantID)
 
void removeShootLeaves (uint plantID, uint shootID)
void removeShootLeaves (uint plantID, uint shootID)
 
void removePlantLeaves (uint plantID)
void removePlantLeaves (uint plantID)
 
void makePlantDormant (uint plantID)
void makePlantDormant (uint plantID)
 
void breakPlantDormancy (uint plantID)
void breakPlantDormancy (uint plantID)
 
float getPlantAge (uint plantID) const
float getPlantAge (uint plantID) const
 
uint getShootNodeCount (uint plantID, uint shootID) const
uint getShootNodeCount (uint plantID, uint shootID) const
 
float getShootTaper (uint plantID, uint shootID) const
float getShootTaper (uint plantID, uint shootID) const
 
helios::vec3 getPlantBasePosition (uint plantID) const
helios::vec3 getPlantBasePosition (uint plantID) const
 
float sumPlantLeafArea (uint plantID) const
float sumPlantLeafArea (uint plantID) const
 Sum the one-sided leaf area of all leaves in the plant.
 
std::vector< uint > getAllPlantObjectIDs (uint plantID) const
std::vector< uint > getAllPlantObjectIDs (uint plantID) const
 Get object IDs for all organs objects for a given plant.
 
std::vector< uint > getAllPlantUUIDs (uint plantID) const
std::vector< uint > getAllPlantUUIDs (uint plantID) const
 Get primitive UUIDs for all primitives in a given plant.
 
std::vector< uint > getPlantInternodeObjectIDs (uint plantID) const
std::vector< uint > getPlantInternodeObjectIDs (uint plantID) const
 Get object IDs for all internode (Tube) objects for a given plant.
 
std::vector< uint > getPlantPetioleObjectIDs (uint plantID) const
std::vector< uint > getPlantPetioleObjectIDs (uint plantID) const
 Get object IDs for all petiole (Tube) objects for a given plant.
 
std::vector< uint > getPlantLeafObjectIDs (uint plantID) const
std::vector< uint > getPlantLeafObjectIDs (uint plantID) const
 Get object IDs for all leaf objects for a given plant.
 
std::vector< uint > getPlantPeduncleObjectIDs (uint plantID) const
std::vector< uint > getPlantPeduncleObjectIDs (uint plantID) const
 Get object IDs for all peduncle (Tube) objects for a given plant.
 
std::vector< uint > getPlantFlowerObjectIDs (uint plantID) const
std::vector< uint > getPlantFlowerObjectIDs (uint plantID) const
 Get object IDs for all inflorescence objects for a given plant.
 
std::vector< uint > getPlantFruitObjectIDs (uint plantID) const
std::vector< uint > getPlantFruitObjectIDs (uint plantID) const
 Get object IDs for all fruit objects for a given plant.
 
std::vector< uint > getAllUUIDs () const
std::vector< uint > getAllUUIDs () const
 Get UUIDs for all existing plant primitives.
 
std::vector< uint > getAllLeafUUIDs () const
std::vector< uint > getAllLeafUUIDs () const
 Get UUIDs for all existing leaf primitives.
 
std::vector< uint > getAllInternodeUUIDs () const
std::vector< uint > getAllInternodeUUIDs () const
 Get UUIDs for all existing internode primitives.
 
std::vector< uint > getAllPetioleUUIDs () const
std::vector< uint > getAllPetioleUUIDs () const
 Get UUIDs for all existing petiole primitives.
 
std::vector< uint > getAllPeduncleUUIDs () const
std::vector< uint > getAllPeduncleUUIDs () const
 Get UUIDs for all existing peduncle primitives.
 
std::vector< uint > getAllFlowerUUIDs () const
std::vector< uint > getAllFlowerUUIDs () const
 Get UUIDs for all existing flower primitives.
 
std::vector< uint > getAllFruitUUIDs () const
std::vector< uint > getAllFruitUUIDs () const
 Get UUIDs for all existing fruit primitives.
 
std::vector< uint > getAllObjectIDs () const
std::vector< uint > getAllObjectIDs () const
 Get object IDs for all existing plant compound objects.
 
std::string getPlantString (uint plantID) const
std::string getPlantString (uint plantID) const
 
uint generatePlantFromString (const std::string &generation_string, const PhytomerParameters &phytomer_parameters)
uint generatePlantFromString (const std::string &generation_string, const PhytomerParameters &phytomer_parameters)
 
uint generatePlantFromString (const std::string &generation_string, const std::map< std::string, PhytomerParameters > &phytomer_parameters)
uint generatePlantFromString (const std::string &generation_string, const std::map< std::string, PhytomerParameters > &phytomer_parameters)
 
void writePlantStructureXML (uint plantID, const std::string &filename) const
void writePlantStructureXML (uint plantID, const std::string &filename) const
 
std::vector< uint > readPlantStructureXML (const std::string &filename, bool quiet=false)
std::vector< uint > readPlantStructureXML (const std::string &filename, bool quiet=false)
 
- +

Static Public Member Functions

static int selfTest ()
static int selfTest ()
 Unit test routines.
 
- + - +

Friends

struct Phytomer
struct Phytomer
 
struct Shoot
struct Shoot
 

Detailed Description

@@ -308,8 +320,7 @@

PlantArchitecture::PlantArchitecture ( - helios::Context *  - context_ptr) + helios::Context * context_ptr) @@ -342,66 +353,52 @@

uint PlantArchitecture::addBaseStemShoot ( - uint  - plantID, + uint plantID, - uint  - current_node_number, + uint current_node_number, - const AxisRotation &  - base_rotation, + const AxisRotation & base_rotation, - float  - internode_radius, + float internode_radius, - float  - internode_length_max, + float internode_length_max, - float  - internode_length_scale_factor_fraction, + float internode_length_scale_factor_fraction, - float  - leaf_scale_factor_fraction, + float leaf_scale_factor_fraction, - float  - radius_taper, + float radius_taper, - const std::string &  - shoot_type_label  - - - - ) - + const std::string & shoot_type_label )

-

Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has already been created using the addPlantInstance() method.

+

Define the stem/trunk shoot (base of plant) to start a new plant. This requires a plant instance has already been created using the addPlantInstance() method.

Parameters
@@ -412,7 +409,7 @@

[in]

- +
[in]plantIDID of the plant instance.
internode_length_scale_factor_fractionScaling factor of the maximum internode length to determine the actual initial internode length at the time of creation (=1 applies no scaling).
[in]leaf_scale_factor_fractionScaling factor of the leaf/petiole to determine the actual initial leaf size at the time of creation (=1 applies no scaling).
[in]radius_taperTapering factor of the internode radius along the shoot (0=constant radius, 1=linear taper to zero radius).
[in]shoot_type_labelLabel of the shoot type to be used for the base stem shoot. This requires that the shoot type has already been defined using the defineShootType() method.
[in]shoot_type_labelLabel of the shoot type to be used for the base stem shoot. This requires that the shoot type has already been defined using the defineShootType() method.
@@ -431,79 +428,62 @@

uint PlantArchitecture::addChildShoot ( - uint  - plantID, + uint plantID, - int  - parent_shoot_ID, + int parent_shoot_ID, - uint  - parent_node_index, + uint parent_node_index, - uint  - current_node_number, + uint current_node_number, - const AxisRotation &  - shoot_base_rotation, + const AxisRotation & shoot_base_rotation, - float  - internode_radius, + float internode_radius, - float  - internode_length_max, + float internode_length_max, - float  - internode_length_scale_factor_fraction, + float internode_length_scale_factor_fraction, - float  - leaf_scale_factor_fraction, + float leaf_scale_factor_fraction, - float  - radius_taper, + float radius_taper, - const std::string &  - shoot_type_label, + const std::string & shoot_type_label, - uint  - petiole_index = 0  - - - - ) - + uint petiole_index = 0 )

@@ -521,7 +501,7 @@

[in]internode_length_scale_factor_fractionScaling factor of the maximum internode length to determine the actual initial internode length at the time of creation (=1 applies no scaling). [in]leaf_scale_factor_fractionScaling factor of the leaf/petiole to determine the actual initial leaf size at the time of creation (=1 applies no scaling). [in]radius_taperTapering factor of the internode radius along the shoot (0=constant radius, 1=linear taper to zero radius). - [in]shoot_type_labelLabel of the shoot type to be used for the new shoot. This requires that the shoot type has already been defined using the defineShootType() method. + [in]shoot_type_labelLabel of the shoot type to be used for the new shoot. This requires that the shoot type has already been defined using the defineShootType() method. [in]petiole_index[OPTIONAL] Index of the petiole within the internode to which the new shoot will be attached (when there are multiple petioles per internode) @@ -541,73 +521,57 @@

uint PlantArchitecture::addEpicormicShoot ( - uint  - plantID, + uint plantID, - int  - parent_shoot_ID, + int parent_shoot_ID, - float  - parent_position_fraction, + float parent_position_fraction, - uint  - current_node_number, + uint current_node_number, - float  - zenith_perturbation_degrees, + float zenith_perturbation_degrees, - float  - internode_radius, + float internode_radius, - float  - internode_length_max, + float internode_length_max, - float  - internode_length_scale_factor_fraction, + float internode_length_scale_factor_fraction, - float  - leaf_scale_factor_fraction, + float leaf_scale_factor_fraction, - float  - radius_taper, + float radius_taper, - const std::string &  - shoot_type_label  - - - - ) - + const std::string & shoot_type_label )

@@ -790,49 +732,37 @@

int PlantArchitecture::appendPhytomerToShoot ( - uint  - plantID, + uint plantID, - uint  - shootID, + uint shootID, - const PhytomerParameters &  - phytomer_parameters, + const PhytomerParameters & phytomer_parameters, - float  - internode_radius, + float internode_radius, - float  - internode_length_max, + float internode_length_max, - float  - internode_length_scale_factor_fraction, + float internode_length_scale_factor_fraction, - float  - leaf_scale_factor_fraction  - - - - ) - + float leaf_scale_factor_fraction )

@@ -865,67 +795,52 @@

uint PlantArchitecture::appendShoot ( - uint  - plantID, + uint plantID, - int  - parent_shoot_ID, + int parent_shoot_ID, - uint  - current_node_number, + uint current_node_number, - const AxisRotation &  - base_rotation, + const AxisRotation & base_rotation, - float  - internode_radius, + float internode_radius, - float  - internode_length_max, + float internode_length_max, - float  - internode_length_scale_factor_fraction, + float internode_length_scale_factor_fraction, - float  - leaf_scale_factor_fraction, + float leaf_scale_factor_fraction, - float  - radius_taper, + float radius_taper, - const std::string &  - shoot_type_label  - - - - ) - + const std::string & shoot_type_label )

@@ -1042,19 +946,12 @@

uint PlantArchitecture::buildPlantInstanceFromLibrary ( - const helios::vec3 &  - base_position, + const helios::vec3 & base_position, - float  - age  - - - - ) - + float age )

@@ -1448,7 +1303,7 @@

std::vector< uint > PlantArchitecture::getAllFlowerUUIDs ( - ) + ) const @@ -1470,7 +1325,7 @@

std::vector< uint > PlantArchitecture::getAllFruitUUIDs ( - ) + ) const @@ -1492,7 +1347,7 @@

std::vector< uint > PlantArchitecture::getAllInternodeUUIDs ( - ) + ) const @@ -1514,7 +1369,7 @@

std::vector< uint > PlantArchitecture::getAllLeafUUIDs ( - ) + ) const @@ -1536,7 +1391,7 @@

std::vector< uint > PlantArchitecture::getAllObjectIDs ( - ) + ) const @@ -1558,7 +1413,7 @@

std::vector< uint > PlantArchitecture::getAllPeduncleUUIDs ( - ) + ) const @@ -1580,7 +1435,7 @@

std::vector< uint > PlantArchitecture::getAllPetioleUUIDs ( - ) + ) const @@ -1602,8 +1457,7 @@

std::vector< uint > PlantArchitecture::getAllPlantObjectIDs ( - uint  - plantID) + uint plantID) const @@ -1631,8 +1485,7 @@

std::vector< uint > PlantArchitecture::getAllPlantUUIDs ( - uint  - plantID) + uint plantID) const @@ -1660,7 +1513,7 @@

std::vector< uint > PlantArchitecture::getAllUUIDs ( - ) + ) const @@ -1682,7 +1535,7 @@

std::map< std::string, PhytomerParameters > PlantArchitecture::getCurrentPhytomerParameters ( - ) + ) @@ -1704,7 +1557,7 @@

std::map< std::string, ShootParameters > PlantArchitecture::getCurrentShootParameters ( - ) + ) @@ -1726,8 +1579,7 @@

ShootParameters PlantArchitecture::getCurrentShootParameters ( - const std::string &  - shoot_type_label) + const std::string & shoot_type_label) @@ -1755,8 +1607,7 @@

float PlantArchitecture::getPlantAge ( - uint  - plantID) + uint plantID) const @@ -1775,8 +1626,7 @@

helios::vec3 PlantArchitecture::getPlantBasePosition ( - uint  - plantID) + uint plantID) const @@ -1795,8 +1645,7 @@

std::vector< uint > PlantArchitecture::getPlantFlowerObjectIDs ( - uint  - plantID) + uint plantID) const @@ -1824,8 +1673,7 @@

std::vector< uint > PlantArchitecture::getPlantFruitObjectIDs ( - uint  - plantID) + uint plantID) const @@ -1853,8 +1701,7 @@

std::vector< uint > PlantArchitecture::getPlantInternodeObjectIDs ( - uint  - plantID) + uint plantID) const @@ -1882,8 +1729,7 @@

std::vector< uint > PlantArchitecture::getPlantLeafObjectIDs ( - uint  - plantID) + uint plantID) const @@ -1911,8 +1757,7 @@

std::vector< uint > PlantArchitecture::getPlantPeduncleObjectIDs ( - uint  - plantID) + uint plantID) const @@ -1940,8 +1785,7 @@

std::vector< uint > PlantArchitecture::getPlantPetioleObjectIDs ( - uint  - plantID) + uint plantID) const @@ -1969,8 +1813,7 @@

std::string PlantArchitecture::getPlantString ( - uint  - plantID) + uint plantID) const @@ -1989,19 +1832,12 @@

uint PlantArchitecture::getShootNodeCount ( - uint  - plantID, + uint plantID, - uint  - shootID  - - - - ) - const + uint shootID ) const

diff --git a/doc/html/class_radiation_model.html b/doc/html/class_radiation_model.html index b6182ab5b..83e9fd772 100644 --- a/doc/html/class_radiation_model.html +++ b/doc/html/class_radiation_model.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -92,309 +104,309 @@

Radiation transport model plugin. - More...

+ More...

#include <RadiationModel.h>

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 RadiationModel (helios::Context *context)
 RadiationModel (helios::Context *context)
 Default constructor.
 
 ~RadiationModel ()
 ~RadiationModel ()
 Destructor.
 
int selfTest ()
int selfTest ()
 Self-test.
 
void disableMessages ()
void disableMessages ()
 Disable/silence status messages.
 
void enableMessages ()
void enableMessages ()
 Enable status messages.
 
void optionalOutputPrimitiveData (const char *label)
void optionalOutputPrimitiveData (const char *label)
 Add optional output primitive data values to the Context.
 
void setDirectRayCount (const std::string &label, size_t N)
void setDirectRayCount (const std::string &label, size_t N)
 Sets variable directRayCount, the number of rays to be used in direct radiation model.
 
void setDiffuseRayCount (const std::string &label, size_t N)
void setDiffuseRayCount (const std::string &label, size_t N)
 Sets variable diffuseRayCount, the number of rays to be used in diffuse (ambient) radiation model.
 
void setDiffuseRadiationFlux (const std::string &label, float flux)
void setDiffuseRadiationFlux (const std::string &label, float flux)
 Diffuse (ambient) radiation flux.
 
void setDiffuseRadiationExtinctionCoeff (const std::string &label, float K, const helios::vec3 &peak_dir)
void setDiffuseRadiationExtinctionCoeff (const std::string &label, float K, const helios::vec3 &peak_dir)
 Extinction coefficient of diffuse ambient radiation.
 
void setDiffuseRadiationExtinctionCoeff (const std::string &label, float K, const helios::SphericalCoord &peak_dir)
void setDiffuseRadiationExtinctionCoeff (const std::string &label, float K, const helios::SphericalCoord &peak_dir)
 Extinction coefficient of diffuse ambient radiation.
 
void setDiffuseSpectrumIntegral (float spectrum_integral)
void setDiffuseSpectrumIntegral (float spectrum_integral)
 Set the integral of the diffuse spectral flux distribution across all possible wavelengths FOR ALL EXISTING BANDS (=∫Sdλ)
 
void setDiffuseSpectrumIntegral (float spectrum_integral, float wavelength1, float wavelength2)
void setDiffuseSpectrumIntegral (float spectrum_integral, float wavelength1, float wavelength2)
 Scale the source spectral flux distribution based on a prescribed integral between two wavelengths FOR ALL EXISTING BANDS (=∫Sdλ)
 
void setDiffuseSpectrumIntegral (const std::string &band_label, float spectrum_integral)
void setDiffuseSpectrumIntegral (const std::string &band_label, float spectrum_integral)
 Set the integral of the diffuse spectral flux distribution across all possible wavelengths (=∫Sdλ)
 
void setDiffuseSpectrumIntegral (const std::string &band_label, float spectrum_integral, float wavelength1, float wavelength2)
void setDiffuseSpectrumIntegral (const std::string &band_label, float spectrum_integral, float wavelength1, float wavelength2)
 Scale the source spectral flux distribution based on a prescribed integral between two wavelengths (=∫Sdλ)
 
void addRadiationBand (const std::string &label)
void addRadiationBand (const std::string &label)
 Add a spectral radiation band to the model.
 
void addRadiationBand (const std::string &label, float wavelength_min, float wavelength_max)
void addRadiationBand (const std::string &label, float wavelength_min, float wavelength_max)
 Add a spectral radiation band to the model with explicit specification of the spectral wave band.
 
void copyRadiationBand (const std::string &old_label, const std::string &new_label)
void copyRadiationBand (const std::string &old_label, const std::string &new_label)
 Copy a spectral radiation band based on a previously created band.
 
void copyRadiationBand (const std::string &old_label, const std::string &new_label, float wavelength_min, float wavelength_max)
void copyRadiationBand (const std::string &old_label, const std::string &new_label, float wavelength_min, float wavelength_max)
 Copy a spectral radiation band based on a previously created band and explicitly set new band wavelength range.
 
bool doesBandExist (const std::string &label) const
bool doesBandExist (const std::string &label) const
 Check if a radiation band exists based on its label.
 
void disableEmission (const std::string &label)
void disableEmission (const std::string &label)
 Disable emission calculations for all primitives in this band.
 
void enableEmission (const std::string &label)
void enableEmission (const std::string &label)
 Enable emission calculations for all primitives in this band.
 
uint addCollimatedRadiationSource ()
uint addCollimatedRadiationSource ()
 Add an external source of collimated radiation (i.e., source at infinite distance with parallel rays) assuming the default direction of (0,0,1)
 
uint addCollimatedRadiationSource (const helios::SphericalCoord &direction)
uint addCollimatedRadiationSource (const helios::SphericalCoord &direction)
 Add an external source of collimated radiation (i.e., source at infinite distance with parallel rays)
 
uint addCollimatedRadiationSource (const helios::vec3 &direction)
uint addCollimatedRadiationSource (const helios::vec3 &direction)
 Add an external source of collimated radiation (i.e., source at infinite distance with parallel rays)
 
uint addSphereRadiationSource (const helios::vec3 &position, float radius)
uint addSphereRadiationSource (const helios::vec3 &position, float radius)
 Add an external source of radiation that emits from the surface of a sphere.
 
uint addSunSphereRadiationSource ()
uint addSunSphereRadiationSource ()
 Add a sphere radiation source that models the sun assuming the default direction of (0,0,1)
 
uint addSunSphereRadiationSource (const helios::SphericalCoord &sun_direction)
uint addSunSphereRadiationSource (const helios::SphericalCoord &sun_direction)
 Add a sphere radiation source that models the sun.
 
uint addSunSphereRadiationSource (const helios::vec3 &sun_direction)
uint addSunSphereRadiationSource (const helios::vec3 &sun_direction)
 Add a sphere radiation source that models the sun.
 
uint addRectangleRadiationSource (const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
uint addRectangleRadiationSource (const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
 Add planar rectangular radiation source.
 
uint addDiskRadiationSource (const helios::vec3 &position, float radius, const helios::vec3 &rotation)
uint addDiskRadiationSource (const helios::vec3 &position, float radius, const helios::vec3 &rotation)
 Add planar circular radiation source.
 
void deleteRadiationSource (uint sourceID)
void deleteRadiationSource (uint sourceID)
 Delete an existing radiation source (any type)
 
void setSourceSpectrumIntegral (uint source_ID, float source_integral)
void setSourceSpectrumIntegral (uint source_ID, float source_integral)
 Set the integral of the source spectral flux distribution across all possible wavelengths (=∫Sdλ)
 
void setSourceSpectrumIntegral (uint source_ID, float source_integral, float wavelength1, float wavelength2)
void setSourceSpectrumIntegral (uint source_ID, float source_integral, float wavelength1, float wavelength2)
 Scale the source spectral flux distribution based on a prescribed integral between two wavelengths (=∫Sdλ)
 
void setSourceFlux (uint source_ID, const std::string &band_label, float flux)
void setSourceFlux (uint source_ID, const std::string &band_label, float flux)
 Set the flux of radiation source for this band.
 
void setSourceFlux (const std::vector< uint > &source_ID, const std::string &band_label, float flux)
void setSourceFlux (const std::vector< uint > &source_ID, const std::string &band_label, float flux)
 Set the flux of multiple radiation sources for this band.
 
float getSourceFlux (uint source_ID, const std::string &band_label) const
float getSourceFlux (uint source_ID, const std::string &band_label) const
 Get the flux of radiation source for this band.
 
void setSourcePosition (uint source_ID, const helios::vec3 &position)
void setSourcePosition (uint source_ID, const helios::vec3 &position)
 Set the position/direction of radiation source based on a Cartesian vector.
 
void setSourcePosition (uint source_ID, const helios::SphericalCoord &position)
void setSourcePosition (uint source_ID, const helios::SphericalCoord &position)
 Set the position/direction of radiation source based on a spherical vector.
 
helios::vec3 getSourcePosition (uint source_ID) const
helios::vec3 getSourcePosition (uint source_ID) const
 Get the position/direction of radiation source.
 
void setSourceSpectrum (uint source_ID, const std::vector< helios::vec2 > &spectrum)
void setSourceSpectrum (uint source_ID, const std::vector< helios::vec2 > &spectrum)
 Set the spectral distribution of a radiation source according to a vector of wavelength-intensity pairs.
 
void setSourceSpectrum (const std::vector< uint > &source_ID, const std::vector< helios::vec2 > &spectrum)
void setSourceSpectrum (const std::vector< uint > &source_ID, const std::vector< helios::vec2 > &spectrum)
 Set the spectral distribution of multiple radiation sources according to a vector of wavelength-intensity pairs.
 
void setSourceSpectrum (uint source_ID, const std::string &spectrum_label)
void setSourceSpectrum (uint source_ID, const std::string &spectrum_label)
 Set the spectral distribution of a radiation source based on global data of wavelength-intensity pairs.
 
void setSourceSpectrum (const std::vector< uint > &source_ID, const std::string &spectrum_label)
void setSourceSpectrum (const std::vector< uint > &source_ID, const std::string &spectrum_label)
 Set the spectral distribution of multiple radiation sources based on global data of wavelength-intensity pairs.
 
void setDiffuseSpectrum (const std::string &spectrum_label)
void setDiffuseSpectrum (const std::string &spectrum_label)
 Set the spectral distribution of diffuse ambient radiation FOR ALL BANDS based on global data of wavelength-intensity pairs.
 
void setDiffuseSpectrum (const std::string &band_label, const std::string &spectrum_label)
void setDiffuseSpectrum (const std::string &band_label, const std::string &spectrum_label)
 Set the spectral distribution of diffuse ambient radiation FOR A SINGLE BANDS based on global data of wavelength-intensity pairs.
 
float getDiffuseFlux (const std::string &band_label) const
float getDiffuseFlux (const std::string &band_label) const
 Get the diffuse flux for a given band.
 
void enableLightModelVisualization ()
void enableLightModelVisualization ()
 Add a 3D model of the light source (rectangular, disk, and sphere) to the Context for visualization purposes.
 
void disableLightModelVisualization ()
void disableLightModelVisualization ()
 Remove the 3D model of the light source from the Context.
 
void enableCameraModelVisualization ()
void enableCameraModelVisualization ()
 Add a 3D model of the camera to the Context for visualization purposes.
 
void disableCameraModelVisualization ()
void disableCameraModelVisualization ()
 Remove the 3D model of the camera from the Context.
 
float integrateSpectrum (const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const
float integrateSpectrum (const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const
 Integrate a spectral distribution between two wavelength bounds.
 
float integrateSpectrum (const std::vector< helios::vec2 > &object_spectrum) const
float integrateSpectrum (const std::vector< helios::vec2 > &object_spectrum) const
 Integrate a spectral distribution across all wavelengths.
 
float integrateSpectrum (uint source_ID, const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const
float integrateSpectrum (uint source_ID, const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const
 Integrate the product of a radiation source spectral distribution with specified spectral data between two wavelength bounds.
 
float integrateSpectrum (uint source_ID, const std::vector< helios::vec2 > &object_spectrum, const std::vector< helios::vec2 > &camera_spectrum) const
float integrateSpectrum (uint source_ID, const std::vector< helios::vec2 > &object_spectrum, const std::vector< helios::vec2 > &camera_spectrum) const
 Integrate the product of a radiation source spectral distribution, surface spectral data, and camera spectral response across all wavelengths.
 
float integrateSpectrum (const std::vector< helios::vec2 > &object_spectrum, const std::vector< helios::vec2 > &camera_spectrum) const
float integrateSpectrum (const std::vector< helios::vec2 > &object_spectrum, const std::vector< helios::vec2 > &camera_spectrum) const
 Integrate the product of surface spectral data and camera spectral response across all wavelengths.
 
float integrateSourceSpectrum (uint source_ID, float wavelength1, float wavelength2) const
float integrateSourceSpectrum (uint source_ID, float wavelength1, float wavelength2) const
 Integrate a source spectral distribution between two wavelength bounds.
 
void scaleSpectrum (const std::string &existing_global_data_label, const std::string &new_global_data_label, float scale_factor) const
void scaleSpectrum (const std::string &existing_global_data_label, const std::string &new_global_data_label, float scale_factor) const
 Scale an entire spectrum by a constant factor. Creates new global data for scaled spectrum.
 
void scaleSpectrum (const std::string &global_data_label, float scale_factor) const
void scaleSpectrum (const std::string &global_data_label, float scale_factor) const
 Scale an entire spectrum by a constant factor. Performs scaling in-place.
 
void scaleSpectrumRandomly (const std::string &existing_global_data_label, const std::string &new_global_data_label, float minimum_scale_factor, float maximum_scale_factor) const
void scaleSpectrumRandomly (const std::string &existing_global_data_label, const std::string &new_global_data_label, float minimum_scale_factor, float maximum_scale_factor) const
 Scale an entire spectrum by a random factor following a uniform distribution.
 
void blendSpectra (const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels, const std::vector< float > &weights) const
void blendSpectra (const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels, const std::vector< float > &weights) const
 Blend one or more spectra together into a new spectrum.
 
void blendSpectraRandomly (const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels) const
void blendSpectraRandomly (const std::string &new_spectrum_label, const std::vector< std::string > &spectrum_labels) const
 Blend one or more spectra together into a new spectrum, with random weights assigned to each input spectrum.
 
void setScatteringDepth (const std::string &label, uint depth)
void setScatteringDepth (const std::string &label, uint depth)
 Set the number of scattering iterations for a certain band.
 
void setMinScatterEnergy (const std::string &label, uint energy)
void setMinScatterEnergy (const std::string &label, uint energy)
 Set the energy threshold used to terminate scattering iterations. Scattering iterations are terminated when the maximum to-be-scattered energy among all primitives is less than "energy".
 
void enforcePeriodicBoundary (const std::string &boundary)
void enforcePeriodicBoundary (const std::string &boundary)
 Use a periodic boundary condition in one or more lateral directions.
 
void addRadiationCamera (const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)
void addRadiationCamera (const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)
 Add a radiation camera sensor.
 
void addRadiationCamera (const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::SphericalCoord &viewing_direction, const CameraProperties &camera_properties, uint antialiasing_samples)
void addRadiationCamera (const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::SphericalCoord &viewing_direction, const CameraProperties &camera_properties, uint antialiasing_samples)
 Add a radiation camera sensor.
 
void setCameraSpectralResponse (const std::string &camera_label, const std::string &band_label, const std::string &global_data)
void setCameraSpectralResponse (const std::string &camera_label, const std::string &band_label, const std::string &global_data)
 Set the spectral response of a camera band based on reference to global data. This function version uses all the global data array to calculate the spectral response.
 
void setCameraPosition (const std::string &camera_label, const helios::vec3 &position)
void setCameraPosition (const std::string &camera_label, const helios::vec3 &position)
 Set the position of the radiation camera.
 
helios::vec3 getCameraPosition (const std::string &camera_label) const
helios::vec3 getCameraPosition (const std::string &camera_label) const
 Get the position of the radiation camera.
 
void setCameraLookat (const std::string &camera_label, const helios::vec3 &lookat)
void setCameraLookat (const std::string &camera_label, const helios::vec3 &lookat)
 Set the position the radiation camera is pointed toward (used to calculate camera orientation)
 
helios::vec3 getCameraLookat (const std::string &camera_label) const
helios::vec3 getCameraLookat (const std::string &camera_label) const
 Get the position the radiation camera is pointed toward (used to calculate camera orientation)
 
void setCameraOrientation (const std::string &camera_label, const helios::vec3 &direction)
void setCameraOrientation (const std::string &camera_label, const helios::vec3 &direction)
 Set the orientation of the radiation camera based on a Cartesian vector.
 
void setCameraOrientation (const std::string &camera_label, const helios::SphericalCoord &direction)
void setCameraOrientation (const std::string &camera_label, const helios::SphericalCoord &direction)
 Set the orientation of the radiation camera based on a spherical coordinate.
 
helios::SphericalCoord getCameraOrientation (const std::string &camera_label) const
helios::SphericalCoord getCameraOrientation (const std::string &camera_label) const
 Get the orientation of the radiation camera based on a spherical coordinate.
 
std::vector< std::string > getAllCameraLabels ()
std::vector< std::string > getAllCameraLabels ()
 Get the labels for all radiation cameras that have been added to the radiation model.
 
void updateGeometry ()
void updateGeometry ()
 Adds all geometric primitives from the Context to OptiX.
 
void updateGeometry (const std::vector< uint > &UUIDs)
void updateGeometry (const std::vector< uint > &UUIDs)
 Adds certain geometric primitives from the Context to OptiX as specified by a list of UUIDs.
 
void runBand (const std::string &label)
void runBand (const std::string &label)
 Run the simulation for a single radiative band.
 
void runBand (const std::vector< std::string > &labels)
void runBand (const std::vector< std::string > &labels)
 Run the simulation for a multiple radiative bands.
 
std::vector< float > getTotalAbsorbedFlux ()
std::vector< float > getTotalAbsorbedFlux ()
 Get the total absorbed radiation flux summed over all bands for each primitive.
 
float getSkyEnergy ()
float getSkyEnergy ()
 Get the radiative energy lost to the sky (surroundings)
 
float calculateGtheta (helios::Context *context, helios::vec3 view_direction)
float calculateGtheta (helios::Context *context, helios::vec3 view_direction)
 Calculate G(theta) (i.e., projected area fraction) for a group of primitives given a certain viewing direction.
 
void setCameraCalibration (CameraCalibration *CameraCalibration)
void setCameraCalibration (CameraCalibration *CameraCalibration)
 
void updateCameraResponse (const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels_raw, const std::vector< std::string > &cameraresponselabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
void updateCameraResponse (const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels_raw, const std::vector< std::string > &cameraresponselabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
 Update the camera response for a given camera based on color board.
 
float getCameraResponseScale (const std::string &orginalcameralabel, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &sourcelabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues)
float getCameraResponseScale (const std::string &orginalcameralabel, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &sourcelabels, helios::vec2 &wavelengthrange, const std::vector< std::vector< float > > &truevalues)
 Get the scale factor of the camera response for a given camera.
 
void runRadiationImaging (const std::string &cameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)
void runRadiationImaging (const std::string &cameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)
 Run radiation imaging simulation.
 
void runRadiationImaging (const std::vector< std::string > &cameralabels, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)
void runRadiationImaging (const std::vector< std::string > &cameralabels, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)
 Run radiation imaging simulation.
 
void writeCameraImage (const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float flux_to_pixel_conversion=1.f)
void writeCameraImage (const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float flux_to_pixel_conversion=1.f)
 Write camera data for one or more bands to a JPEG image.
 
void writeNormCameraImage (const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
void writeNormCameraImage (const std::string &camera, const std::vector< std::string > &bands, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
 Write normalized camera data (maximum value is 1) for one or more bands to a JPEG image.
 
void writeCameraImageData (const std::string &camera, const std::string &band, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
void writeCameraImageData (const std::string &camera, const std::string &band, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
 Write camera data for one band to an ASCII text file.
 
void writePrimitiveDataLabelMap (const std::string &cameralabel, const std::string &primitive_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
void writePrimitiveDataLabelMap (const std::string &cameralabel, const std::string &primitive_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
 Write image pixel labels to text file based on primitive data. Primitive data must have type 'float', 'double', 'uint', or 'int'.
 
void writeObjectDataLabelMap (const std::string &cameralabel, const std::string &object_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
void writeObjectDataLabelMap (const std::string &cameralabel, const std::string &object_data_label, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1, float padvalue=NAN)
 Write image pixel labels to text file based on object data. Object data must have type 'float', 'double', 'uint', or 'int'.
 
void writeDepthImageData (const std::string &cameralabel, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
void writeDepthImageData (const std::string &cameralabel, const std::string &imagefile_base, const std::string &image_path="./", int frame=-1)
 Write depth image data to text file.
 
void writeNormDepthImage (const std::string &cameralabel, const std::string &imagefile_base, float max_depth, const std::string &image_path="./", int frame=-1)
void writeNormDepthImage (const std::string &cameralabel, const std::string &imagefile_base, float max_depth, const std::string &image_path="./", int frame=-1)
 Write depth image file, with grayscale normalized to the minimum and maximum depth values.
 
void writeImageBoundingBoxes (const std::string &cameralabel, const std::string &primitive_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
void writeImageBoundingBoxes (const std::string &cameralabel, const std::string &primitive_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
 Write bounding boxes based on primitive data labels (Ultralytic's YOLO format). Primitive data must have type of 'uint' or 'int'.
 
void writeImageBoundingBoxes_ObjectData (const std::string &cameralabel, const std::string &object_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
void writeImageBoundingBoxes_ObjectData (const std::string &cameralabel, const std::string &object_data_label, uint object_class_ID, const std::string &imagefile_base, const std::string &image_path="./", bool append_label_file=false, int frame=-1)
 Write bounding boxes based on object data labels (Ultralytic's YOLO format). Object data must have type of 'uint' or 'int'.
 
void setPadValue (const std::string &cameralabel, const std::vector< std::string > &bandlabels, const std::vector< float > &padvalues)
void setPadValue (const std::string &cameralabel, const std::vector< std::string > &bandlabels, const std::vector< float > &padvalues)
 Set padding value for pixels do not have valid values.
 
void calibrateCamera (const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
void calibrateCamera (const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
 Calibrate camera.
 
void calibrateCamera (const std::string &originalcameralabel, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
void calibrateCamera (const std::string &originalcameralabel, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)
 Calibrate camera.
 
@@ -415,8 +427,7 @@

RadiationModel::RadiationModel ( - helios::Context *  - context) + helios::Context * context) @@ -442,7 +453,7 @@

RadiationModel::~RadiationModel ( - ) + ) @@ -464,7 +475,7 @@

uint RadiationModel::addCollimatedRadiationSource ( - ) + ) @@ -486,8 +497,7 @@

uint RadiationModel::addCollimatedRadiationSource ( - const helios::SphericalCoord &  - direction) + const helios::SphericalCoord & direction) @@ -515,8 +525,7 @@

uint RadiationModel::addCollimatedRadiationSource ( - const helios::vec3 &  - direction) + const helios::vec3 & direction) @@ -544,25 +553,17 @@

uint RadiationModel::addDiskRadiationSource ( - const helios::vec3 &  - position, + const helios::vec3 & position, - float  - radius, + float radius, - const helios::vec3 &  - rotation  - - - - ) - + const helios::vec3 & rotation )

@@ -666,43 +658,32 @@

void RadiationModel::addRadiationCamera ( - const std::string &  - camera_label, + const std::string & camera_label, - const std::vector< std::string > &  - band_label, + const std::vector< std::string > & band_label, - const helios::vec3 &  - position, + const helios::vec3 & position, - const helios::SphericalCoord &  - viewing_direction, + const helios::SphericalCoord & viewing_direction, - const CameraProperties &  - camera_properties, + const CameraProperties & camera_properties, - uint  - antialiasing_samples  - - - - ) - + uint antialiasing_samples )

@@ -733,43 +714,32 @@

void RadiationModel::addRadiationCamera ( - const std::string &  - camera_label, + const std::string & camera_label, - const std::vector< std::string > &  - band_label, + const std::vector< std::string > & band_label, - const helios::vec3 &  - position, + const helios::vec3 & position, - const helios::vec3 &  - lookat, + const helios::vec3 & lookat, - const CameraProperties &  - camera_properties, + const CameraProperties & camera_properties, - uint  - antialiasing_samples  - - - - ) - + uint antialiasing_samples )

@@ -800,25 +770,17 @@

uint RadiationModel::addRectangleRadiationSource ( - const helios::vec3 &  - position, + const helios::vec3 & position, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::vec3 &  - rotation  - - - - ) - + const helios::vec3 & rotation )

@@ -847,19 +809,12 @@

uint RadiationModel::addSphereRadiationSource ( - const helios::vec3 &  - position, + const helios::vec3 & position, - float  - radius  - - - - ) - + float radius )

@@ -1055,19 +993,12 @@

float RadiationModel::calculateGtheta ( - helios::Context *  - context, + helios::Context * context, - helios::vec3  - view_direction  - - - - ) - + helios::vec3 view_direction )

@@ -1316,8 +1210,7 @@

void RadiationModel::deleteRadiationSource ( - uint  - sourceID) + uint sourceID) @@ -1344,7 +1237,7 @@

void RadiationModel::disableCameraModelVisualization ( - ) + ) @@ -1365,8 +1258,7 @@

void RadiationModel::disableEmission ( - const std::string &  - label) + const std::string & label) @@ -1393,7 +1285,7 @@

void RadiationModel::disableLightModelVisualization ( - ) + ) @@ -1414,7 +1306,7 @@

void RadiationModel::disableMessages ( - ) + ) @@ -1436,8 +1328,7 @@

bool RadiationModel::doesBandExist ( - const std::string &  - label) + const std::string & label) const @@ -1464,7 +1355,7 @@

void RadiationModel::enableCameraModelVisualization ( - ) + ) @@ -1485,8 +1376,7 @@

void RadiationModel::enableEmission ( - const std::string &  - label) + const std::string & label) @@ -1513,7 +1403,7 @@

void RadiationModel::enableLightModelVisualization ( - ) + ) @@ -1534,7 +1424,7 @@

void RadiationModel::enableMessages ( - ) + ) @@ -1555,8 +1445,7 @@

void RadiationModel::enforcePeriodicBoundary ( - const std::string &  - boundary) + const std::string & boundary) @@ -1569,7 +1458,7 @@

Note
This method should be called prior to calling RadiationModel::updateGeometry(), otherwise the boundary condition will not be enforced.
+
Note
This method should be called prior to calling RadiationModel::updateGeometry(), otherwise the boundary condition will not be enforced.

Definition at line 1150 of file RadiationModel.cpp.

@@ -1584,7 +1473,7 @@

std::vector< std::string > RadiationModel::getAllCameraLabels ( - ) + ) @@ -1606,8 +1495,7 @@

helios::vec3 RadiationModel::getCameraLookat ( - const std::string &  - camera_label) + const std::string & camera_label) const @@ -1635,8 +1523,7 @@

helios::SphericalCoord RadiationModel::getCameraOrientation ( - const std::string &  - camera_label) + const std::string & camera_label) const @@ -1664,8 +1551,7 @@

helios::vec3 RadiationModel::getCameraPosition ( - const std::string &  - camera_label) + const std::string & camera_label) const @@ -1693,43 +1579,32 @@

float RadiationModel::getCameraResponseScale ( - const std::string &  - orginalcameralabel, + const std::string & orginalcameralabel, - const std::vector< std::string > &  - cameraresponselabels, + const std::vector< std::string > & cameraresponselabels, - const std::vector< std::string > &  - bandlabels, + const std::vector< std::string > & bandlabels, - const std::vector< std::string > &  - sourcelabels, + const std::vector< std::string > & sourcelabels, - helios::vec2 &  - wavelengthrange, + helios::vec2 & wavelengthrange, - const std::vector< std::vector< float > > &  - truevalues  - - - - ) - + const std::vector< std::vector< float > > & truevalues )

@@ -1948,8 +1806,7 @@

float RadiationModel::integrateSpectrum ( - const std::vector< helios::vec2 > &  - object_spectrum) + const std::vector< helios::vec2 > & object_spectrum) const @@ -1977,19 +1834,12 @@

float RadiationModel::integrateSpectrum ( - const std::vector< helios::vec2 > &  - object_spectrum, + const std::vector< helios::vec2 > & object_spectrum, - const std::vector< helios::vec2 > &  - camera_spectrum  - - - - ) - const + const std::vector< helios::vec2 > & camera_spectrum ) const

@@ -2017,25 +1867,17 @@

float RadiationModel::integrateSpectrum ( - const std::vector< helios::vec2 > &  - object_spectrum, + const std::vector< helios::vec2 > & object_spectrum, - float  - wavelength1, + float wavelength1, - float  - wavelength2  - - - - ) - const + float wavelength2 ) const

@@ -2064,25 +1906,17 @@

float RadiationModel::integrateSpectrum ( - uint  - source_ID, + uint source_ID, - const std::vector< helios::vec2 > &  - object_spectrum, + const std::vector< helios::vec2 > & object_spectrum, - const std::vector< helios::vec2 > &  - camera_spectrum  - - - - ) - const + const std::vector< helios::vec2 > & camera_spectrum ) const

@@ -2111,31 +1945,22 @@

float RadiationModel::integrateSpectrum ( - uint  - source_ID, + uint source_ID, - const std::vector< helios::vec2 > &  - object_spectrum, + const std::vector< helios::vec2 > & object_spectrum, - float  - wavelength1, + float wavelength1, - float  - wavelength2  - - - - ) - const + float wavelength2 ) const

@@ -2165,8 +1990,7 @@

void RadiationModel::optionalOutputPrimitiveData ( - const char *  - label) + const char * label) @@ -2193,8 +2017,7 @@

void RadiationModel::runBand ( - const std::string &  - label) + const std::string & label) @@ -2207,7 +2030,7 @@

Note
Before running the band simulation, you must 1) add at least one radiative band to the simulation (see addRadiationBand()), 2) update the Context geometry in the model (see updateGeometry()), and 3) update radiative properties in the model (see updateRadiativeProperties).
+
Note
Before running the band simulation, you must 1) add at least one radiative band to the simulation (see addRadiationBand()), 2) update the Context geometry in the model (see updateGeometry()), and 3) update radiative properties in the model (see updateRadiativeProperties).

Definition at line 3117 of file RadiationModel.cpp.

@@ -2222,8 +2045,7 @@

void RadiationModel::runBand ( - const std::vector< std::string > &  - labels) + const std::vector< std::string > & labels) @@ -2236,7 +2058,7 @@

Note
Before running the band simulation, you must 1) add at least one radiative band to the simulation (see addRadiationBand()), 2) update the Context geometry in the model (see updateGeometry()), and 3) update radiative properties in the model (see updateRadiativeProperties).
+
Note
Before running the band simulation, you must 1) add at least one radiative band to the simulation (see addRadiationBand()), 2) update the Context geometry in the model (see updateGeometry()), and 3) update radiative properties in the model (see updateRadiativeProperties).

Definition at line 3122 of file RadiationModel.cpp.

@@ -2251,55 +2073,42 @@

void RadiationModel::runRadiationImaging ( - const std::string &  - cameralabel, + const std::string & cameralabel, - const std::vector< std::string > &  - sourcelabels, + const std::vector< std::string > & sourcelabels, - const std::vector< std::string > &  - bandlabels, + const std::vector< std::string > & bandlabels, - const std::vector< std::string > &  - cameraresponselabels, + const std::vector< std::string > & cameraresponselabels, - helios::vec2  - wavelengthrange, + helios::vec2 wavelengthrange, - float  - fluxscale = 1, + float fluxscale = 1, - float  - diffusefactor = 0.0005, + float diffusefactor = 0.0005, - uint  - scatteringdepth = 4  - - - - ) - + uint scatteringdepth = 4 )

@@ -3493,19 +3113,12 @@

void RadiationModel::setSourcePosition ( - uint  - source_ID, + uint source_ID, - const helios::vec3 &  - position  - - - - ) - + const helios::vec3 & position )

@@ -3765,7 +3334,7 @@

Note
This function will call setSourceFlux() for all bands to update source fluxes based on the new spectrum integral
+
Note
This function will call setSourceFlux() for all bands to update source fluxes based on the new spectrum integral

Definition at line 498 of file RadiationModel.cpp.

@@ -3780,43 +3349,32 @@

void RadiationModel::updateCameraResponse ( - const std::string &  - orginalcameralabel, + const std::string & orginalcameralabel, - const std::vector< std::string > &  - sourcelabels_raw, + const std::vector< std::string > & sourcelabels_raw, - const std::vector< std::string > &  - cameraresponselabels, + const std::vector< std::string > & cameraresponselabels, - helios::vec2 &  - wavelengthrange, + helios::vec2 & wavelengthrange, - const std::vector< std::vector< float > > &  - truevalues, + const std::vector< std::vector< float > > & truevalues, - const std::string &  - calibratedmark  - - - - ) - + const std::string & calibratedmark )

@@ -4477,7 +3938,8 @@

+

diff --git a/doc/html/class_solar_position.html b/doc/html/class_solar_position.html index 7308e8d71..15a1f19c4 100644 --- a/doc/html/class_solar_position.html +++ b/doc/html/class_solar_position.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -93,61 +105,61 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 SolarPosition (helios::Context *context_ptr)
 SolarPosition (helios::Context *context_ptr)
 Solar position model default constructor. Initializes location based on the location set in the Context.
 
 SolarPosition (float UTC_hrs, float latitude_deg, float longitude_deg, helios::Context *context_ptr)
 SolarPosition (float UTC_hrs, float latitude_deg, float longitude_deg, helios::Context *context_ptr)
 Solar position model constructor.
 
int selfTest () const
int selfTest () const
 Function to perform a self-test of model functions.
 
helios::Time getSunriseTime () const
helios::Time getSunriseTime () const
 Get the approximate time of sunrise at the current location.
 
helios::Time getSunsetTime () const
helios::Time getSunsetTime () const
 Get the approximate time of sunset at the current location.
 
float getSunElevation () const
float getSunElevation () const
 Get the current sun elevation angle in radians for the current location. The sun angle is computed based on the current time and date set in the Helios context.
 
float getSunZenith () const
float getSunZenith () const
 Get the current sun zenithal angle in radians for the current location. The sun angle is computed based on the current time and date set in the Helios context.
 
float getSunAzimuth () const
float getSunAzimuth () const
 Get the current sun azimuthal angle in radians for the current location. The sun angle is computed based on the current time and date set in the Helios context.
 
helios::vec3 getSunDirectionVector () const
helios::vec3 getSunDirectionVector () const
 Get a unit vector pointing toward the sun for the current location. The sun angle is computed based on the current time and date set in the Helios context.
 
helios::SphericalCoord getSunDirectionSpherical () const
helios::SphericalCoord getSunDirectionSpherical () const
 Get a spherical coordinate vector pointing toward the sun for the current location. The sun angle is computed based on the current time and date set in the Helios context.
 
void setSunDirection (const helios::SphericalCoord &sundirection)
void setSunDirection (const helios::SphericalCoord &sundirection)
 Override solar position calculation based on time in the Context by using a prescribed solar position.
 
float getSolarFlux (float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
float getSolarFlux (float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
 Get the solar radiation flux perpendicular to the sun direction.
 
float getSolarFluxPAR (float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
float getSolarFluxPAR (float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
 Get the photosynthetically active (PAR) component of solar radiation flux perpendicular to the sun direction.
 
float getSolarFluxNIR (float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
float getSolarFluxNIR (float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
 Get the near-infrared (NIR) component of solar radiation flux perpendicular to the sun direction.
 
float getDiffuseFraction (float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
float getDiffuseFraction (float pressure_Pa, float temperature_K, float humidity_rel, float turbidity) const
 Get the fraction of solar radiation flux that is diffuse.
 
float getAmbientLongwaveFlux (float temperature_K, float humidity_rel) const
float getAmbientLongwaveFlux (float temperature_K, float humidity_rel) const
 Calculate the ambient (sky) longwave radiation flux.
 
float calibrateTurbidityFromTimeseries (const std::string &timeseries_shortwave_flux_label_Wm2) const
float calibrateTurbidityFromTimeseries (const std::string &timeseries_shortwave_flux_label_Wm2) const
 Calculate the turbidity value based on a timeseries of net radiation measurements.
 
void enableCloudCalibration (const std::string &timeseries_shortwave_flux_label_Wm2)
void enableCloudCalibration (const std::string &timeseries_shortwave_flux_label_Wm2)
 Enable calibration of solar flux and diffuse fraction when possibility of clouds are present against measured solar flux data.
 
void disableCloudCalibration ()
void disableCloudCalibration ()
 Disable calibration of solar flux and diffuse fraction for clouds.
 
@@ -167,8 +179,7 @@

SolarPosition::SolarPosition ( - helios::Context *  - context_ptr) + helios::Context * context_ptr) @@ -200,31 +211,22 @@

SolarPosition::SolarPosition ( - float  - UTC_hrs, + float UTC_hrs, - float  - latitude_deg, + float latitude_deg, - float  - longitude_deg, + float longitude_deg, - helios::Context *  - context_ptr  - - - - ) - + helios::Context * context_ptr )

@@ -467,7 +442,7 @@

Note
The flux given by this function is the flux normal to the sun direction. To get the flux on a horizontal surface, multiply the returned value by cos(theta), where theta can be found by calling the getSunZenith() function.
+
Note
The flux given by this function is the flux normal to the sun direction. To get the flux on a horizontal surface, multiply the returned value by cos(theta), where theta can be found by calling the getSunZenith() function.
The solar flux model is based on Gueymard (2008).
Returns
Global solar radiation flux NORMAL TO THE SUN DIRECTION in W/m^2
@@ -485,31 +460,22 @@

float SolarPosition::getSolarFluxNIR ( - float  - pressure_Pa, + float pressure_Pa, - float  - temperature_K, + float temperature_K, - float  - humidity_rel, + float humidity_rel, - float  - turbidity  - - - - ) - const + float turbidity ) const

@@ -524,7 +490,7 @@

Note
The flux given by this function is the flux normal to the sun direction. To get the flux on a horizontal surface, multiply the returned value by cos(theta), where theta can be found by calling the getSunZenith() function.
+
Note
The flux given by this function is the flux normal to the sun direction. To get the flux on a horizontal surface, multiply the returned value by cos(theta), where theta can be found by calling the getSunZenith() function.
The solar flux model is based on Gueymard (2008).
Returns
Global solar radiation flux NORMAL TO THE SUN DIRECTION in W/m^2
@@ -542,31 +508,22 @@

float SolarPosition::getSolarFluxPAR ( - float  - pressure_Pa, + float pressure_Pa, - float  - temperature_K, + float temperature_K, - float  - humidity_rel, + float humidity_rel, - float  - turbidity  - - - - ) - const + float turbidity ) const

@@ -581,7 +538,7 @@

Note
The flux given by this function is the flux normal to the sun direction. To get the flux on a horizontal surface, multiply the returned value by cos(theta), where theta can be found by calling the getSunZenith() function.
+
Note
The flux given by this function is the flux normal to the sun direction. To get the flux on a horizontal surface, multiply the returned value by cos(theta), where theta can be found by calling the getSunZenith() function.
The solar flux model is based on Gueymard (2008).
Returns
Global solar radiation flux NORMAL TO THE SUN DIRECTION in W/m^2
@@ -599,7 +556,7 @@

float SolarPosition::getSunAzimuth ( - ) + ) const @@ -620,7 +577,7 @@

SphericalCoord SolarPosition::getSunDirectionSpherical ( - ) + ) const @@ -641,7 +598,7 @@

vec3 SolarPosition::getSunDirectionVector ( - ) + ) const @@ -662,7 +619,7 @@

float SolarPosition::getSunElevation ( - ) + ) const @@ -683,7 +640,7 @@

Time SolarPosition::getSunriseTime ( - ) + ) const @@ -704,7 +661,7 @@

Time SolarPosition::getSunsetTime ( - ) + ) const @@ -725,7 +682,7 @@

float SolarPosition::getSunZenith ( - ) + ) const @@ -746,7 +703,7 @@

int SolarPosition::selfTest ( - ) + ) const @@ -767,8 +724,7 @@

void SolarPosition::setSunDirection ( - const helios::SphericalCoord &  - sundirection) + const helios::SphericalCoord & sundirection) @@ -794,7 +750,8 @@

+

diff --git a/doc/html/class_stomatal_conductance_model.html b/doc/html/class_stomatal_conductance_model.html index 22a24d5d1..3696d1a17 100644 --- a/doc/html/class_stomatal_conductance_model.html +++ b/doc/html/class_stomatal_conductance_model.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -93,85 +105,85 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 StomatalConductanceModel (helios::Context *m_context)
 StomatalConductanceModel (helios::Context *m_context)
 Default constructor.
 
int selfTest ()
int selfTest ()
 Self-test (unit test) routine.
 
void setModelCoefficients (const BWBcoefficients &coeffs)
void setModelCoefficients (const BWBcoefficients &coeffs)
 Set the model coefficient values for all primitives - Ball, Woodrow, Berry model.
 
void setModelCoefficients (const BWBcoefficients &coeffs, const std::vector< uint > &UUIDs)
void setModelCoefficients (const BWBcoefficients &coeffs, const std::vector< uint > &UUIDs)
 Set the model coefficient values for a subset of primitives based on their UUIDs - Ball, Woodrow, Berry model.
 
void setModelCoefficients (const BBLcoefficients &coeffs)
void setModelCoefficients (const BBLcoefficients &coeffs)
 Set the model coefficient values for all primitives - Ball-Berry-Leuning model.
 
void setModelCoefficients (const BBLcoefficients &coeffs, const std::vector< uint > &UUIDs)
void setModelCoefficients (const BBLcoefficients &coeffs, const std::vector< uint > &UUIDs)
 Set the model coefficient values for a subset of primitives based on their UUIDs - Ball-Berry-Leuning model.
 
void setModelCoefficients (const MOPTcoefficients &coeffs)
void setModelCoefficients (const MOPTcoefficients &coeffs)
 Set the model coefficient values for all primitives - Medlyn et al. optimality model.
 
void setModelCoefficients (const MOPTcoefficients &coeffs, const std::vector< uint > &UUIDs)
void setModelCoefficients (const MOPTcoefficients &coeffs, const std::vector< uint > &UUIDs)
 Set the model coefficient values for a subset of primitives based on their UUIDs - Medlyn et al. optimality model.
 
void setModelCoefficients (const BMFcoefficients &coeffs)
void setModelCoefficients (const BMFcoefficients &coeffs)
 Set the model coefficient values for all primitives - Buckley, Mott, Farquhar model.
 
void setModelCoefficients (const BMFcoefficients &coeffs, const std::vector< uint > &UUIDs)
void setModelCoefficients (const BMFcoefficients &coeffs, const std::vector< uint > &UUIDs)
 Set the model coefficient values for a subset of primitives based on their UUIDs - Buckley, Mott, Farquhar model.
 
void setModelCoefficients (const BBcoefficients &coeffs)
void setModelCoefficients (const BBcoefficients &coeffs)
 Set the model coefficient values for all primitives.
 
void setModelCoefficients (const BBcoefficients &coeffs, const std::vector< uint > &UUIDs)
void setModelCoefficients (const BBcoefficients &coeffs, const std::vector< uint > &UUIDs)
 Set the model coefficient values for a subset of primitives based on their UUIDs.
 
void setModelCoefficients (const std::vector< BMFcoefficients > &coeffs, const std::vector< uint > &UUIDs)
void setModelCoefficients (const std::vector< BMFcoefficients > &coeffs, const std::vector< uint > &UUIDs)
 Set the model coefficient values for a subset of primitives based on their UUIDs.
 
void setBMFCoefficientsFromLibrary (const std::string &species)
void setBMFCoefficientsFromLibrary (const std::string &species)
 Set the model coefficient values using one of the available species in the library.
 
void setBMFCoefficientsFromLibrary (const std::string &species, const std::vector< uint > &UUIDs)
void setBMFCoefficientsFromLibrary (const std::string &species, const std::vector< uint > &UUIDs)
 Set the model coefficient values using one of the available species in the library for a subset of primitives based on their UUIDs.
 
BMFcoefficients getBMFCoefficientsFromLibrary (const std::string &species)
BMFcoefficients getBMFCoefficientsFromLibrary (const std::string &species)
 Get the model coefficient values using one of the available species in the library.
 
void setDynamicTimeConstants (float tau_open, float tau_close)
void setDynamicTimeConstants (float tau_open, float tau_close)
 Set time constants for dynamic stomatal opening and closing for all primitives.
 
void setDynamicTimeConstants (float tau_open, float tau_close, const std::vector< uint > &UUIDs)
void setDynamicTimeConstants (float tau_open, float tau_close, const std::vector< uint > &UUIDs)
 Set time constants for dynamic stomatal opening and closing for a subset of primitives based on their UUIDs.
 
void run ()
void run ()
 Update the stomatal conductance for all primitives in the context.
 
void run (const std::vector< uint > &UUIDs)
void run (const std::vector< uint > &UUIDs)
 Update the stomatal conductance for a subset of primitives in the context.
 
void run (float dt)
void run (float dt)
 Update the stomatal conductance for all primitives in the context based on the dynamic stomatal model version.
 
void run (const std::vector< uint > &UUIDs, float dt)
void run (const std::vector< uint > &UUIDs, float dt)
 Update the stomatal conductance for a subset of primitives in the context.
 
void disableMessages ()
void disableMessages ()
 Disable output messages to the standard output.
 
void enableMessages ()
void enableMessages ()
 Ensable output messages to the standard output.
 
void optionalOutputPrimitiveData (const char *label)
void optionalOutputPrimitiveData (const char *label)
 Add optional output primitive data values to the Context.
 
void printDefaultValueReport () const
void printDefaultValueReport () const
 Print a report detailing usage of default input values for all primitives in the Context.
 
void printDefaultValueReport (const std::vector< uint > &UUIDs) const
void printDefaultValueReport (const std::vector< uint > &UUIDs) const
 Print a report detailing usage of default input values based on a subset of primitive UUIDs.
 
@@ -191,8 +203,7 @@

StomatalConductanceModel::StomatalConductanceModel ( - helios::Context *  - m_context) + helios::Context * m_context) @@ -225,7 +236,7 @@

void StomatalConductanceModel::disableMessages ( - ) + ) @@ -246,7 +257,7 @@

void StomatalConductanceModel::enableMessages ( - ) + ) @@ -267,8 +278,7 @@

BMFcoefficients StomatalConductanceModel::getBMFCoefficientsFromLibrary ( - const std::string &  - species) + const std::string & species) @@ -295,8 +305,7 @@

void StomatalConductanceModel::optionalOutputPrimitiveData ( - const char *  - label) + const char * label) @@ -323,7 +332,7 @@

void StomatalConductanceModel::printDefaultValueReport ( - ) + ) const @@ -344,8 +353,7 @@

void StomatalConductanceModel::printDefaultValueReport ( - const std::vector< uint > &  - UUIDs) + const std::vector< uint > & UUIDs) const @@ -372,7 +380,7 @@

void StomatalConductanceModel::run ( - ) + ) @@ -393,8 +401,7 @@

void StomatalConductanceModel::run ( - const std::vector< uint > &  - UUIDs) + const std::vector< uint > & UUIDs) @@ -421,19 +428,12 @@

void StomatalConductanceModel::run ( - const std::vector< uint > &  - UUIDs, + const std::vector< uint > & UUIDs, - float  - dt  - - - - ) - + float dt )

@@ -661,8 +637,7 @@

void StomatalConductanceModel::setModelCoefficients ( - const BBcoefficients &  - coeffs) + const BBcoefficients & coeffs) @@ -689,19 +664,12 @@

void StomatalConductanceModel::setModelCoefficients ( - const BBcoefficients &  - coeffs, + const BBcoefficients & coeffs, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

@@ -728,8 +696,7 @@

void StomatalConductanceModel::setModelCoefficients ( - const BBLcoefficients &  - coeffs) + const BBLcoefficients & coeffs) @@ -756,19 +723,12 @@

void StomatalConductanceModel::setModelCoefficients ( - const BBLcoefficients &  - coeffs, + const BBLcoefficients & coeffs, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

@@ -795,8 +755,7 @@

void StomatalConductanceModel::setModelCoefficients ( - const BMFcoefficients &  - coeffs) + const BMFcoefficients & coeffs) @@ -823,19 +782,12 @@

void StomatalConductanceModel::setModelCoefficients ( - const BMFcoefficients &  - coeffs, + const BMFcoefficients & coeffs, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

@@ -862,8 +814,7 @@

void StomatalConductanceModel::setModelCoefficients ( - const BWBcoefficients &  - coeffs) + const BWBcoefficients & coeffs) @@ -890,19 +841,12 @@

void StomatalConductanceModel::setModelCoefficients ( - const BWBcoefficients &  - coeffs, + const BWBcoefficients & coeffs, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

@@ -929,8 +873,7 @@

void StomatalConductanceModel::setModelCoefficients ( - const MOPTcoefficients &  - coeffs) + const MOPTcoefficients & coeffs) @@ -957,19 +900,12 @@

void StomatalConductanceModel::setModelCoefficients ( - const MOPTcoefficients &  - coeffs, + const MOPTcoefficients & coeffs, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

@@ -996,19 +932,12 @@

void StomatalConductanceModel::setModelCoefficients ( - const std::vector< BMFcoefficients > &  - coeffs, + const std::vector< BMFcoefficients > & coeffs, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )

@@ -1031,7 +960,8 @@

+

diff --git a/doc/html/class_synthetic_annotation.html b/doc/html/class_synthetic_annotation.html index c8cea2b85..73ff8fa5b 100644 --- a/doc/html/class_synthetic_annotation.html +++ b/doc/html/class_synthetic_annotation.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -93,52 +105,52 @@ - + - + - + - + - + - + - + - + - + - + - + - - - + + - - + + - + - + - + - + - +

Public Member Functions

 SyntheticAnnotation (helios::Context *context)
 SyntheticAnnotation (helios::Context *context)
 Synthetic image annotation plug-in default constructor.
 
int selfTest () const
int selfTest () const
 Function to perform a self-test of plug-in functions.
 
void labelPrimitives (const char *label)
void labelPrimitives (const char *label)
 
void labelPrimitives (uint UUIDs, const char *label)
void labelPrimitives (uint UUIDs, const char *label)
 
void labelPrimitives (std::vector< uint > UUIDs, const char *label)
void labelPrimitives (std::vector< uint > UUIDs, const char *label)
 
void labelPrimitives (std::vector< std::vector< uint > > UUIDs, const char *label)
void labelPrimitives (std::vector< std::vector< uint > > UUIDs, const char *label)
 
void labelUnlabeledPrimitives (const char *label)
void labelUnlabeledPrimitives (const char *label)
 
void setBackgroundColor (const helios::RGBcolor &color)
void setBackgroundColor (const helios::RGBcolor &color)
 
void addSkyDome (const char *filename)
void addSkyDome (const char *filename)
 
void setWindowSize (uint window_width, uint window_height)
void setWindowSize (uint window_width, uint window_height)
 
void setCameraPosition (const helios::vec3 &camera_position, const helios::vec3 &camera_lookat)
void setCameraPosition (const helios::vec3 &camera_position, const helios::vec3 &camera_lookat)
 
+
void setCameraPosition (const std::vector< helios::vec3 > &camera_position, const std::vector< helios::vec3 > &camera_lookat)
 
void enableObjectDetection ()
 Enable calculation and writing of rectangular bounding boxes for object detection when render() function is called.
void enableObjectDetection ()
 Enable calculation and writing of rectangular bounding boxes for object detection when render() function is called.
 
void disableObjectDetection ()
 Disable calculation and writing of rectangular bounding boxes for object detection when render() function is called.
void disableObjectDetection ()
 Disable calculation and writing of rectangular bounding boxes for object detection when render() function is called.
 
void enableSemanticSegmentation ()
void enableSemanticSegmentation ()
 Enable calculation and writing of object mask (full image) for semantic segmentation.
 
void disableSemanticSegmentation ()
void disableSemanticSegmentation ()
 Disable calculation and writing of object mask (full image) for semantic segmentation.
 
void enableInstanceSegmentation ()
void enableInstanceSegmentation ()
 Enable calculation and writing of un-occluded object masks for each object (instance segmentation)
 
void disableInstanceSegmentation ()
void disableInstanceSegmentation ()
 Disable calculation and writing of un-occluded object masks for each object (instance segmentation)
 
void render (const char *outputdir)
void render (const char *outputdir)
 Render RGB image and generate annotations.
 
@@ -158,8 +170,7 @@

SyntheticAnnotation::SyntheticAnnotation ( - helios::Context *  - context) + helios::Context * context) @@ -192,8 +203,7 @@

void SyntheticAnnotation::addSkyDome ( - const char *  - filename) + const char * filename) @@ -212,7 +222,7 @@

void SyntheticAnnotation::disableInstanceSegmentation ( - ) + ) @@ -233,13 +243,13 @@

void SyntheticAnnotation::disableObjectDetection ( - ) + )

@@ -589,7 +560,8 @@

+

diff --git a/doc/html/class_visualizer.html b/doc/html/class_visualizer.html index 32f4a3140..1145f96dd 100644 --- a/doc/html/class_visualizer.html +++ b/doc/html/class_visualizer.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Types | @@ -93,301 +105,301 @@

Class for visualization of simulation results. - More...

+ More...

#include <Visualizer.h>

- - + - - + - - +

Public Types

enum  CoordinateSystem { COORDINATES_WINDOW_NORMALIZED = 0 -, COORDINATES_CARTESIAN = 1 +
enum  CoordinateSystem { COORDINATES_WINDOW_NORMALIZED = 0 +, COORDINATES_CARTESIAN = 1 }
 Coordinate system to be used when specifying spatial coordinates. More...
 Coordinate system to be used when specifying spatial coordinates. More...
 
enum  Ctable {
-  COLORMAP_HOT = 0 -, COLORMAP_COOL = 1 -, COLORMAP_RAINBOW = 2 -, COLORMAP_LAVA = 3 +
enum  Ctable {
+  COLORMAP_HOT = 0 +, COLORMAP_COOL = 1 +, COLORMAP_RAINBOW = 2 +, COLORMAP_LAVA = 3 ,
-  COLORMAP_PARULA = 4 -, COLORMAP_GRAY = 5 -, COLORMAP_CUSTOM = 6 +  COLORMAP_PARULA = 4 +, COLORMAP_GRAY = 5 +, COLORMAP_CUSTOM = 6
}
 Pseudocolor map tables. More...
 Pseudocolor map tables. More...
 
enum  LightingModel { LIGHTING_NONE =0 -, LIGHTING_PHONG =1 -, LIGHTING_PHONG_SHADOWED =2 +
enum  LightingModel { LIGHTING_NONE =0 +, LIGHTING_PHONG =1 +, LIGHTING_PHONG_SHADOWED =2 }
 Lighting model to use for shading primitives. More...
 Lighting model to use for shading primitives. More...
 
- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 Visualizer (uint Wdisplay)
 Visualizer (uint Wdisplay)
 Visualizer constructor.
 
 Visualizer (uint Wdisplay, uint Hdisplay)
 Visualizer (uint Wdisplay, uint Hdisplay)
 Visualizer constructor.
 
 Visualizer (uint Wdisplay, uint Hdisplay, int aliasing_samples)
 Visualizer (uint Wdisplay, uint Hdisplay, int aliasing_samples)
 
 Visualizer (uint Wdisplay, uint Hdisplay, int aliasing_samples, bool window_decorations)
 Visualizer (uint Wdisplay, uint Hdisplay, int aliasing_samples, bool window_decorations)
 Visualizer constructor with option to remove window decorations (e.g., header bar, trim). This is a workaround for an error that occurs on Linux systems when printing the window to a JPEG image (printWindow). Once a fix is found, this function will likely be removed.
 
int selfTest ()
int selfTest ()
 Visualizer self-test routine.
 
void enableMessages ()
void enableMessages ()
 Enable standard output from this plug-in (default)
 
void disableMessages ()
void disableMessages ()
 Disable standard output from this plug-in.
 
void setCameraPosition (const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)
void setCameraPosition (const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)
 Set camera position.
 
void setCameraPosition (const helios::SphericalCoord &cameraAngle, const helios::vec3 &lookAt)
void setCameraPosition (const helios::SphericalCoord &cameraAngle, const helios::vec3 &lookAt)
 Set camera position.
 
void setCameraFieldOfView (float angle_FOV)
void setCameraFieldOfView (float angle_FOV)
 Set the camera field of view (angle width) in degrees. Default value is 45 degrees.
 
void setLightDirection (const helios::vec3 &direction)
void setLightDirection (const helios::vec3 &direction)
 Set the direction of the light source.
 
void getDomainBoundingBox (helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
void getDomainBoundingBox (helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
 Get a box that bounds all primitives in the domain.
 
float getDomainBoundingRadius () const
float getDomainBoundingRadius () const
 Get the radius of a sphere that bounds all primitives in the domain.
 
void setLightingModel (LightingModel lightingmodel)
void setLightingModel (LightingModel lightingmodel)
 Set the lighting model for shading of all primitives.
 
void setLightIntensityFactor (float lightintensityfactor)
void setLightIntensityFactor (float lightintensityfactor)
 Set the light intensity scaling factor.
 
void setBackgroundColor (const helios::RGBcolor &color)
void setBackgroundColor (const helios::RGBcolor &color)
 Set the background color for the visualizer window.
 
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its center.
 
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its center.
 
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file, CoordinateSystem coordFlag)
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file, CoordinateSystem coordFlag)
 Add a texture mapped rectangle by giving the coordinates of its center.
 
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const char *texture_file, CoordinateSystem coordFlag)
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const char *texture_file, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its center - rectangle is colored by and RGB color value but is masked by the alpha channel of a PNG image file.
 
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)
void addRectangleByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)
 Add a texture masked rectangle by giving the coordinates of its center.
 
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag)
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its four vertices.
 
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its four vertices.
 
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const char *texture_file, CoordinateSystem coordFlag)
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const char *texture_file, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its four vertices.
 
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const char *texture_file, const std::vector< helios::vec2 > &uvs, CoordinateSystem coordFlag)
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const char *texture_file, const std::vector< helios::vec2 > &uvs, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its four vertices and color by texture map.
 
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const char *texture_file, const std::vector< helios::vec2 > &uvs, CoordinateSystem coordFlag)
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const char *texture_file, const std::vector< helios::vec2 > &uvs, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its four vertices and mask by texture map transparency channel, but color by R-G-B value.
 
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const char *texture_file, CoordinateSystem coordFlag)
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const char *texture_file, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its four vertices - rectangle is colored by an RGB color value but is masked by the alpha channel of a PNG image file.
 
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its four vertices.
 
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBAcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)
void addRectangleByVertices (const std::vector< helios::vec3 > &vertices, const helios::RGBAcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)
 Add a rectangle by giving the coordinates of its four vertices.
 
void addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag)
void addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag)
 Add a triangle by giving the coordinates of its three vertices.
 
void addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
void addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
 Add a triangle by giving the coordinates of its three vertices.
 
void addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, CoordinateSystem coordFlag)
void addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, CoordinateSystem coordFlag)
 Add a triangle by giving the coordinates of its three vertices and color by texture map.
 
void addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
void addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
 Add a triangle by giving the coordinates of its three vertices and color by a constant color, but mask using transparency channel of texture map.
 
void addVoxelByCenter (const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
void addVoxelByCenter (const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)
 Add a voxel by giving the coordinates of its center.
 
void addVoxelByCenter (const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
void addVoxelByCenter (const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
 Add a voxel by giving the coordinates of its center.
 
void addDiskByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
void addDiskByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
 Add a disk by giving the coordinates of its center.
 
void addDiskByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
void addDiskByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
 Add a disk by giving the coordinates of its center.
 
void addDiskByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const char *texture_file, CoordinateSystem coordFlag)
void addDiskByCenter (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const char *texture_file, CoordinateSystem coordFlag)
 Add a texture mapped disk by giving the coordinates of its center.
 
void addLine (const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)
void addLine (const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)
 Add Lines by giving the coordinates of points along the Lines.
 
void addLine (const helios::vec3 &start, const helios::vec3 &end, const helios::RGBAcolor &color, uint linewidth, CoordinateSystem coordFlag)
void addLine (const helios::vec3 &start, const helios::vec3 &end, const helios::RGBAcolor &color, uint linewidth, CoordinateSystem coordFlag)
 Add Lines by giving the coordinates of points along the Lines.
 
void addPoint (const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
void addPoint (const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)
 Add a point by giving its coordinates and size.
 
void addPoint (const helios::vec3 &position, const helios::RGBAcolor &color, uint pointsize, CoordinateSystem coordFlag)
void addPoint (const helios::vec3 &position, const helios::RGBAcolor &color, uint pointsize, CoordinateSystem coordFlag)
 Add a point by giving its coordinates and size.
 
void addSphereByCenter (float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
void addSphereByCenter (float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)
 Add a sphere by giving the radius and center.
 
void addSphereByCenter (float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
void addSphereByCenter (float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag)
 Add a sphere by giving the radius and center.
 
void addSkyDomeByCenter (float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file)
void addSkyDomeByCenter (float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file)
 Add a Sky Dome, which is a hemispherical dome colored by a sky texture map.
 
 DEPRECATED (void addSkyDomeByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file, int layer))
 DEPRECATED (void addSkyDomeByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file, int layer))
 Add a Sky Dome, which is a hemispherical dome colored by a sky texture map.
 
void addTextboxByCenter (const char *textstring, const helios::vec3 &center, const helios::SphericalCoord &rotation, const helios::RGBcolor &fontcolor, uint fontsize, const char *fontname, CoordinateSystem coordFlag)
void addTextboxByCenter (const char *textstring, const helios::vec3 &center, const helios::SphericalCoord &rotation, const helios::RGBcolor &fontcolor, uint fontsize, const char *fontname, CoordinateSystem coordFlag)
 Add a text box by giving the coordinates of its center.
 
void addCoordinateAxes ()
void addCoordinateAxes ()
 Add a coordinate axis with at the origin with unit length.
 
void addCoordinateAxes (const helios::vec3 &origin, const helios::vec3 &length, const std::string &sign)
void addCoordinateAxes (const helios::vec3 &origin, const helios::vec3 &length, const std::string &sign)
 Add a coordinate axis.
 
void addGridWireFrame (const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv)
void addGridWireFrame (const helios::vec3 &center, const helios::vec3 &size, const helios::int3 &subdiv)
 Add a coordinate axis.
 
void enableColorbar ()
void enableColorbar ()
 Enable the colorbar.
 
void disableColorbar ()
void disableColorbar ()
 Disable the colorbar.
 
void setColorbarPosition (helios::vec3 position)
void setColorbarPosition (helios::vec3 position)
 Set the position of the colorbar in normalized window coordinates (0-1)
 
void setColorbarSize (helios::vec2 size)
void setColorbarSize (helios::vec2 size)
 Set the size of the colorbar in normalized window units (0-1)
 
void setColorbarRange (float cmin, float cmax)
void setColorbarRange (float cmin, float cmax)
 Set the range of the Colorbar.
 
void setColorbarTicks (const std::vector< float > &ticks)
void setColorbarTicks (const std::vector< float > &ticks)
 Set the values in the colorbar where ticks and labels should be placed.
 
void setColorbarTitle (const char *title)
void setColorbarTitle (const char *title)
 Set the title of the Colorbar.
 
void setColorbarFontColor (helios::RGBcolor color)
void setColorbarFontColor (helios::RGBcolor color)
 Set the RGB color of the colorbar text.
 
void setColorbarFontSize (uint font_size)
void setColorbarFontSize (uint font_size)
 Set the font size of the colorbar text.
 
void setColormap (Ctable colormap_name)
void setColormap (Ctable colormap_name)
 Set the colormap used in Colorbar/visualization based on pre-defined colormaps.
 
void setColormap (const std::vector< helios::RGBcolor > &colors, const std::vector< float > &divisions)
void setColormap (const std::vector< helios::RGBcolor > &colors, const std::vector< float > &divisions)
 Set the colormap used in Colorbar/visualization based on a custom colormap.
 
Colormap getCurrentColormap () const
Colormap getCurrentColormap () const
 Get the current colormap used in Colorbar/visualization.
 
void buildContextGeometry (helios::Context *context_ptr)
void buildContextGeometry (helios::Context *context_ptr)
 Add all geometry from the Context to the visualizer.
 
void buildContextGeometry (helios::Context *context_ptr, const std::vector< uint > &UUIDs)
void buildContextGeometry (helios::Context *context_ptr, const std::vector< uint > &UUIDs)
 Add select geometry from the Context to the visualizer by their UUIDs.
 
void colorContextPrimitivesByData (const char *data_name)
void colorContextPrimitivesByData (const char *data_name)
 Color primitives from Context by color mapping their ‘Primitive Data’.
 
void colorContextPrimitivesByData (const char *data_name, const std::vector< uint > &UUIDs)
void colorContextPrimitivesByData (const char *data_name, const std::vector< uint > &UUIDs)
 Color primitives from Context by color mapping their ‘Primitive Data’.
 
void colorContextPrimitivesByObjectData (const char *data_name)
void colorContextPrimitivesByObjectData (const char *data_name)
 Color primitives from Context by color mapping their ‘Object Data’.
 
void colorContextPrimitivesByObjectData (const char *data_name, const std::vector< uint > &ObjIDs)
void colorContextPrimitivesByObjectData (const char *data_name, const std::vector< uint > &ObjIDs)
 Color primitives from Context by color mapping their ‘Object Data’.
 
void colorContextPrimitivesRandomly (const std::vector< uint > &UUIDs)
void colorContextPrimitivesRandomly (const std::vector< uint > &UUIDs)
 Color primitives from Context with a random color.
 
void colorContextPrimitivesRandomly ()
void colorContextPrimitivesRandomly ()
 Color primitives from Context with a random color.
 
void colorContextObjectsRandomly (const std::vector< uint > &ObjIDs)
void colorContextObjectsRandomly (const std::vector< uint > &ObjIDs)
 Color objects from Context with a random color.
 
void colorContextObjectsRandomly ()
void colorContextObjectsRandomly ()
 Color objects from Context with a random color.
 
void hideWatermark ()
void hideWatermark ()
 Make Helios logo watermark invisible.
 
void showWatermark ()
void showWatermark ()
 Make Helios logo watermark visible.
 
std::vector< helios::vec3plotInteractive ()
std::vector< helios::vec3plotInteractive ()
 Plot current geometry into an interactive graphics window.
 
void plotDepthMap ()
void plotDepthMap ()
 Plot the depth map (distance from camera to nearest object)
 
void plotUpdate ()
void plotUpdate ()
 Update the graphics window based on current geometry, then continue the program.
 
void plotUpdate (bool hide_window)
void plotUpdate (bool hide_window)
 Update the graphics window based on current geometry, then continue the program, with the option not to display the graphic window.
 
void printWindow ()
void printWindow ()
 Print the current graphics window to a JPEG image file. File will be given a default filename and saved to the current directory from which the executable was run.
 
void printWindow (const char *outfile)
void printWindow (const char *outfile)
 Print the current graphics window to a JPEG image file.
 
void getWindowPixelsRGB (uint *buffer)
void getWindowPixelsRGB (uint *buffer)
 Get R-G-B pixel data in the current display window.
 
void getDepthMap (float *buffer)
void getDepthMap (float *buffer)
 Get depth buffer data for the current display window.
 
void getWindowSize (uint &width, uint &height) const
void getWindowSize (uint &width, uint &height) const
 Get the size of the display window in pixels.
 
void getFramebufferSize (uint &width, uint &height) const
void getFramebufferSize (uint &width, uint &height) const
 Get the size of the framebuffer in pixels.
 
void clearGeometry ()
void clearGeometry ()
 Clear all geometry previously added to the visualizer.
 
void closeWindow ()
void closeWindow ()
 Close the graphics window.
 

Detailed Description

Class for visualization of simulation results.

-

Definition at line 265 of file Visualizer.h.

+

Definition at line 275 of file Visualizer.h.

Member Enumeration Documentation

◆ CoordinateSystem

@@ -396,7 +408,7 @@

- +
enum Visualizer::CoordinateSystemenum Visualizer::CoordinateSystem

@@ -420,7 +432,7 @@

- +
enum Visualizer::Ctableenum Visualizer::Ctable

@@ -454,7 +466,7 @@

- +
enum Visualizer::LightingModelenum Visualizer::LightingModel

@@ -486,8 +498,7 @@

Visualizer::Visualizer ( - uint  - Wdisplay) + uint Wdisplay) @@ -519,19 +530,12 @@

Visualizer::Visualizer ( - uint  - Wdisplay, + uint Wdisplay, - uint  - Hdisplay  - - - - ) - + uint Hdisplay )

-

Definition at line 668 of file Visualizer.cpp.

+

Definition at line 672 of file Visualizer.cpp.

@@ -658,7 +645,7 @@

void Visualizer::addCoordinateAxes ( - ) + ) @@ -666,7 +653,7 @@

Definition at line 2512 of file Visualizer.cpp.

+

Definition at line 2516 of file Visualizer.cpp.

@@ -679,25 +666,17 @@

void Visualizer::addCoordinateAxes ( - const helios::vec3 &  - origin, + const helios::vec3 & origin, - const helios::vec3 &  - length, + const helios::vec3 & length, - const std::string &  - sign  - - - - ) - + const std::string & sign )

@@ -712,7 +691,7 @@

Definition at line 2516 of file Visualizer.cpp.

+

Definition at line 2520 of file Visualizer.cpp.

@@ -725,43 +704,32 @@

void Visualizer::addDiskByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - uint  - Ndivisions, + uint Ndivisions, - const char *  - texture_file, + const char * texture_file, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )

@@ -778,7 +746,7 @@

Definition at line 1965 of file Visualizer.cpp.

+

Definition at line 1969 of file Visualizer.cpp.

@@ -791,43 +759,32 @@

void Visualizer::addDiskByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - uint  - Ndivisions, + uint Ndivisions, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )

@@ -844,7 +801,7 @@

Definition at line 1885 of file Visualizer.cpp.

+

Definition at line 1889 of file Visualizer.cpp.

@@ -857,43 +814,32 @@

void Visualizer::addDiskByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - uint  - Ndivisions, + uint Ndivisions, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )

@@ -910,7 +856,7 @@

Definition at line 1881 of file Visualizer.cpp.

+

Definition at line 1885 of file Visualizer.cpp.

@@ -923,25 +869,17 @@

void Visualizer::addGridWireFrame ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec3 &  - size, + const helios::vec3 & size, - const helios::int3 &  - subdiv  - - - - ) - + const helios::int3 & subdiv )

@@ -956,7 +894,7 @@

Definition at line 2554 of file Visualizer.cpp.

+

Definition at line 2558 of file Visualizer.cpp.

@@ -969,37 +907,27 @@

void Visualizer::addLine ( - const helios::vec3 &  - start, + const helios::vec3 & start, - const helios::vec3 &  - end, + const helios::vec3 & end, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - uint  - linewidth, + uint linewidth, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )

@@ -1016,7 +944,7 @@

Definition at line 2049 of file Visualizer.cpp.

+

Definition at line 2053 of file Visualizer.cpp.

@@ -1029,37 +957,27 @@

void Visualizer::addLine ( - const helios::vec3 &  - start, + const helios::vec3 & start, - const helios::vec3 &  - end, + const helios::vec3 & end, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - uint  - linewidth, + uint linewidth, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1076,7 +994,7 @@

Definition at line 2045 of file Visualizer.cpp.

+

Definition at line 2049 of file Visualizer.cpp.

@@ -1089,31 +1007,22 @@

void Visualizer::addPoint ( - const helios::vec3 &  - position, + const helios::vec3 & position, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - uint  - pointsize, + uint pointsize, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1129,7 +1038,7 @@

Definition at line 2108 of file Visualizer.cpp.

+

Definition at line 2112 of file Visualizer.cpp.

@@ -1142,31 +1051,22 @@

void Visualizer::addPoint ( - const helios::vec3 &  - position, + const helios::vec3 & position, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - uint  - pointsize, + uint pointsize, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1182,7 +1082,7 @@

Definition at line 2104 of file Visualizer.cpp.

+

Definition at line 2108 of file Visualizer.cpp.

@@ -1195,37 +1095,27 @@

void Visualizer::addRectangleByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const char *  - texture_file, + const char * texture_file, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1242,7 +1132,7 @@

Definition at line 1032 of file Visualizer.cpp.

+

Definition at line 1036 of file Visualizer.cpp.

@@ -1255,37 +1145,27 @@

void Visualizer::addRectangleByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1302,7 +1182,7 @@

Definition at line 1003 of file Visualizer.cpp.

+

Definition at line 1007 of file Visualizer.cpp.

@@ -1315,43 +1195,32 @@

void Visualizer::addRectangleByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - const char *  - texture_file, + const char * texture_file, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1369,7 +1238,7 @@

Definition at line 1061 of file Visualizer.cpp.

+

Definition at line 1065 of file Visualizer.cpp.

@@ -1382,43 +1251,32 @@

void Visualizer::addRectangleByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - const Glyph *  - glyph, + const Glyph * glyph, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1436,7 +1294,7 @@

Definition at line 1090 of file Visualizer.cpp.

+

Definition at line 1094 of file Visualizer.cpp.

@@ -1449,37 +1307,27 @@

void Visualizer::addRectangleByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1496,7 +1344,7 @@

Definition at line 999 of file Visualizer.cpp.

+

Definition at line 1003 of file Visualizer.cpp.

@@ -1509,31 +1357,22 @@

void Visualizer::addRectangleByVertices ( - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const char *  - texture_file, + const char * texture_file, - const std::vector< helios::vec2 > &  - uvs, + const std::vector< helios::vec2 > & uvs, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1549,7 +1388,7 @@

Definition at line 1229 of file Visualizer.cpp.

+

Definition at line 1233 of file Visualizer.cpp.

@@ -1562,25 +1401,17 @@

void Visualizer::addRectangleByVertices ( - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const char *  - texture_file, + const char * texture_file, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1595,7 +1426,7 @@

Definition at line 1219 of file Visualizer.cpp.

+

Definition at line 1223 of file Visualizer.cpp.

@@ -1608,31 +1439,22 @@

void Visualizer::addRectangleByVertices ( - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - const Glyph *  - glyph, + const Glyph * glyph, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1648,7 +1470,7 @@

Definition at line 1463 of file Visualizer.cpp.

+

Definition at line 1467 of file Visualizer.cpp.

@@ -1661,25 +1483,17 @@

void Visualizer::addRectangleByVertices ( - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1694,7 +1508,7 @@

Definition at line 1123 of file Visualizer.cpp.

+

Definition at line 1127 of file Visualizer.cpp.

@@ -1707,37 +1521,27 @@

void Visualizer::addRectangleByVertices ( - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - const char *  - texture_file, + const char * texture_file, - const std::vector< helios::vec2 > &  - uvs, + const std::vector< helios::vec2 > & uvs, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1754,7 +1558,7 @@

Definition at line 1347 of file Visualizer.cpp.

+

Definition at line 1351 of file Visualizer.cpp.

@@ -1767,31 +1571,22 @@

void Visualizer::addRectangleByVertices ( - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - const char *  - texture_file, + const char * texture_file, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1807,7 +1602,7 @@

Definition at line 1336 of file Visualizer.cpp.

+

Definition at line 1340 of file Visualizer.cpp.

@@ -1820,31 +1615,22 @@

void Visualizer::addRectangleByVertices ( - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - const Glyph *  - glyph, + const Glyph * glyph, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1860,7 +1646,7 @@

Definition at line 1459 of file Visualizer.cpp.

+

Definition at line 1463 of file Visualizer.cpp.

@@ -1873,25 +1659,17 @@

void Visualizer::addRectangleByVertices ( - const std::vector< helios::vec3 > &  - vertices, + const std::vector< helios::vec3 > & vertices, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -1906,7 +1684,7 @@

Definition at line 1119 of file Visualizer.cpp.

+

Definition at line 1123 of file Visualizer.cpp.

@@ -1919,31 +1697,22 @@

void Visualizer::addSkyDomeByCenter ( - float  - radius, + float radius, - const helios::vec3 &  - center, + const helios::vec3 & center, - uint  - Ndivisions, + uint Ndivisions, - const char *  - texture_file  - - - - ) - + const char * texture_file )
@@ -1959,7 +1728,7 @@

Definition at line 2200 of file Visualizer.cpp.

+

Definition at line 2204 of file Visualizer.cpp.

@@ -1972,37 +1741,27 @@

void Visualizer::addSphereByCenter ( - float  - radius, + float radius, - const helios::vec3 &  - center, + const helios::vec3 & center, - uint  - Ndivisions, + uint Ndivisions, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -2019,7 +1778,7 @@

Definition at line 2155 of file Visualizer.cpp.

+

Definition at line 2159 of file Visualizer.cpp.

@@ -2032,37 +1791,27 @@

void Visualizer::addSphereByCenter ( - float  - radius, + float radius, - const helios::vec3 &  - center, + const helios::vec3 & center, - uint  - Ndivisions, + uint Ndivisions, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -2079,7 +1828,7 @@

Definition at line 2151 of file Visualizer.cpp.

+

Definition at line 2155 of file Visualizer.cpp.

@@ -2092,49 +1841,37 @@

void Visualizer::addTextboxByCenter ( - const char *  - textstring, + const char * textstring, - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const helios::RGBcolor &  - fontcolor, + const helios::RGBcolor & fontcolor, - uint  - fontsize, + uint fontsize, - const char *  - fontname, + const char * fontname, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -2152,7 +1889,7 @@

Definition at line 2293 of file Visualizer.cpp.

+

Definition at line 2297 of file Visualizer.cpp.

@@ -2165,61 +1902,47 @@

void Visualizer::addTriangle ( - const helios::vec3 &  - vertex0, + const helios::vec3 & vertex0, - const helios::vec3 &  - vertex1, + const helios::vec3 & vertex1, - const helios::vec3 &  - vertex2, + const helios::vec3 & vertex2, - const char *  - texture_file, + const char * texture_file, - const helios::vec2 &  - uv0, + const helios::vec2 & uv0, - const helios::vec2 &  - uv1, + const helios::vec2 & uv1, - const helios::vec2 &  - uv2, + const helios::vec2 & uv2, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -2240,7 +1963,7 @@

Definition at line 1752 of file Visualizer.cpp.

+

Definition at line 1756 of file Visualizer.cpp.

@@ -2253,55 +1976,42 @@

void Visualizer::addTriangle ( - const helios::vec3 &  - vertex0, + const helios::vec3 & vertex0, - const helios::vec3 &  - vertex1, + const helios::vec3 & vertex1, - const helios::vec3 &  - vertex2, + const helios::vec3 & vertex2, - const char *  - texture_file, + const char * texture_file, - const helios::vec2 &  - uv0, + const helios::vec2 & uv0, - const helios::vec2 &  - uv1, + const helios::vec2 & uv1, - const helios::vec2 &  - uv2, + const helios::vec2 & uv2, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -2321,7 +2031,7 @@

Definition at line 1666 of file Visualizer.cpp.

+

Definition at line 1670 of file Visualizer.cpp.

@@ -2334,37 +2044,27 @@

void Visualizer::addTriangle ( - const helios::vec3 &  - vertex0, + const helios::vec3 & vertex0, - const helios::vec3 &  - vertex1, + const helios::vec3 & vertex1, - const helios::vec3 &  - vertex2, + const helios::vec3 & vertex2, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -2381,7 +2081,7 @@

Definition at line 1579 of file Visualizer.cpp.

+

Definition at line 1583 of file Visualizer.cpp.

@@ -2394,37 +2094,27 @@

void Visualizer::addTriangle ( - const helios::vec3 &  - vertex0, + const helios::vec3 & vertex0, - const helios::vec3 &  - vertex1, + const helios::vec3 & vertex1, - const helios::vec3 &  - vertex2, + const helios::vec3 & vertex2, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -2441,7 +2131,7 @@

Definition at line 1575 of file Visualizer.cpp.

+

Definition at line 1579 of file Visualizer.cpp.

@@ -2454,37 +2144,27 @@

void Visualizer::addVoxelByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec3 &  - size, + const helios::vec3 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const helios::RGBAcolor &  - color, + const helios::RGBAcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -2500,7 +2180,7 @@

Definition at line 1855 of file Visualizer.cpp.

+

Definition at line 1859 of file Visualizer.cpp.

@@ -2513,37 +2193,27 @@

void Visualizer::addVoxelByCenter ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec3 &  - size, + const helios::vec3 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const helios::RGBcolor &  - color, + const helios::RGBcolor & color, - CoordinateSystem  - coordFlag  - - - - ) - + CoordinateSystem coordFlag )
@@ -2559,7 +2229,7 @@

Definition at line 1851 of file Visualizer.cpp.

+

Definition at line 1855 of file Visualizer.cpp.

@@ -2572,8 +2242,7 @@

void Visualizer::buildContextGeometry ( - helios::Context *  - context_ptr) + helios::Context * context_ptr) @@ -2587,7 +2256,7 @@

Definition at line 2701 of file Visualizer.cpp.

+

Definition at line 2705 of file Visualizer.cpp.

@@ -2600,19 +2269,12 @@

void Visualizer::buildContextGeometry ( - helios::Context *  - context_ptr, + helios::Context * context_ptr, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs )
@@ -2626,7 +2288,7 @@

Definition at line 2706 of file Visualizer.cpp.

+

Definition at line 2710 of file Visualizer.cpp.

@@ -2639,7 +2301,7 @@

void Visualizer::clearGeometry ( - ) + ) @@ -2647,7 +2309,7 @@

Definition at line 955 of file Visualizer.cpp.

+

Definition at line 959 of file Visualizer.cpp.

@@ -2660,7 +2322,7 @@

void Visualizer::closeWindow ( - ) + ) @@ -2668,7 +2330,7 @@

Definition at line 973 of file Visualizer.cpp.

+

Definition at line 977 of file Visualizer.cpp.

@@ -2681,7 +2343,7 @@

void Visualizer::colorContextObjectsRandomly ( - ) + ) @@ -2690,7 +2352,7 @@

Note
Useful for visualizing individual objects
-

Definition at line 3272 of file Visualizer.cpp.

+

Definition at line 3276 of file Visualizer.cpp.

@@ -2703,8 +2365,7 @@

void Visualizer::colorContextObjectsRandomly ( - const std::vector< uint > &  - ObjIDs) + const std::vector< uint > & ObjIDs) @@ -2713,7 +2374,7 @@

Note
Useful for visualizing individual objects
-

Definition at line 3256 of file Visualizer.cpp.

+

Definition at line 3260 of file Visualizer.cpp.

@@ -2726,8 +2387,7 @@

void Visualizer::colorContextPrimitivesByData ( - const char *  - data_name) + const char * data_name) @@ -2742,7 +2402,7 @@

Note
If the data value does not exist for a certain primitive, a value of 0 is assumed.
-

Definition at line 3169 of file Visualizer.cpp.

+

Definition at line 3173 of file Visualizer.cpp.

@@ -2755,19 +2415,12 @@

void Visualizer::colorContextPrimitivesByData ( - const char *  - data_name, + const char * data_name, - const std::vector< uint > &  - UUIDs  - - - - ) - + const std::vector< uint > & UUIDs ) @@ -2795,8 +2448,7 @@

void Visualizer::colorContextPrimitivesByObjectData ( - const char *  - data_name) + const char * data_name) @@ -2811,7 +2463,7 @@

Note
If the data value does not exist for a certain primitive, a value of 0 is assumed.
-

Definition at line 3191 of file Visualizer.cpp.

+

Definition at line 3195 of file Visualizer.cpp.

@@ -2824,19 +2476,12 @@

void Visualizer::colorContextPrimitivesByObjectData ( - const char *  - data_name, + const char * data_name, - const std::vector< uint > &  - ObjIDs  - - - - ) - + const std::vector< uint > & ObjIDs ) @@ -2864,7 +2509,7 @@

void Visualizer::colorContextPrimitivesRandomly ( - ) + ) @@ -2873,7 +2518,7 @@

Note
Useful for visualizing individual primitives that are part of compound objects
-

Definition at line 3234 of file Visualizer.cpp.

+

Definition at line 3238 of file Visualizer.cpp.

@@ -2886,8 +2531,7 @@

void Visualizer::colorContextPrimitivesRandomly ( - const std::vector< uint > &  - UUIDs) + const std::vector< uint > & UUIDs) @@ -2902,7 +2546,7 @@

Note
Useful for visualizing individual primitives that are part of compound objects
-

Definition at line 3213 of file Visualizer.cpp.

+

Definition at line 3217 of file Visualizer.cpp.

@@ -2915,8 +2559,7 @@

Visualizer::DEPRECATED ( - void   - addSkyDomeByCenterfloat radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file, int layer) + void addSkyDomeByCenterfloat radius, const helios::vec3 &center, uint Ndivisions, const char *texture_file, int layer) @@ -2936,8 +2579,7 @@

void Visualizer::disableColorbar ( - void  - ) + void ) @@ -2945,7 +2587,7 @@

Definition at line 2594 of file Visualizer.cpp.

+

Definition at line 2598 of file Visualizer.cpp.

@@ -2958,7 +2600,7 @@

void Visualizer::disableMessages ( - ) + ) @@ -2966,7 +2608,7 @@

Definition at line 770 of file Visualizer.cpp.

+

Definition at line 774 of file Visualizer.cpp.

@@ -2979,8 +2621,7 @@

void Visualizer::enableColorbar ( - void  - ) + void ) @@ -2988,7 +2629,7 @@

Definition at line 2590 of file Visualizer.cpp.

+

Definition at line 2594 of file Visualizer.cpp.

@@ -3001,7 +2642,7 @@

void Visualizer::enableMessages ( - ) + ) @@ -3009,7 +2650,7 @@

Definition at line 766 of file Visualizer.cpp.

+

Definition at line 770 of file Visualizer.cpp.

@@ -3022,7 +2663,7 @@

Colormap Visualizer::getCurrentColormap ( - ) + ) const @@ -3030,7 +2671,7 @@

Definition at line 2697 of file Visualizer.cpp.

+

Definition at line 2701 of file Visualizer.cpp.

@@ -3043,8 +2684,7 @@

void Visualizer::getDepthMap ( - float *  - buffer) + float * buffer) @@ -3057,9 +2697,9 @@

Note
The function plotDepthMap() must be called prior to getDepthMap().
+
Note
The function plotDepthMap() must be called prior to getDepthMap().
-

Definition at line 930 of file Visualizer.cpp.

+

Definition at line 934 of file Visualizer.cpp.

@@ -3072,32 +2712,24 @@

void Visualizer::getDomainBoundingBox ( - helios::vec2 &  - xbounds, + helios::vec2 & xbounds, - helios::vec2 &  - ybounds, + helios::vec2 & ybounds, - helios::vec2 &  - zbounds  - - - - ) - const + helios::vec2 & zbounds ) const

Get a box that bounds all primitives in the domain.

-

Definition at line 795 of file Visualizer.cpp.

+

Definition at line 799 of file Visualizer.cpp.

@@ -3110,7 +2742,7 @@

float Visualizer::getDomainBoundingRadius ( - ) + ) const @@ -3118,7 +2750,7 @@

Definition at line 847 of file Visualizer.cpp.

+

Definition at line 851 of file Visualizer.cpp.

@@ -3131,19 +2763,12 @@

void Visualizer::getFramebufferSize ( - uint &  - width, + uint & width, - uint &  - height  - - - - ) - const + uint & height ) const @@ -3170,8 +2795,7 @@

void Visualizer::getWindowPixelsRGB ( - uint *  - buffer) + uint * buffer) @@ -3185,7 +2809,7 @@

Definition at line 899 of file Visualizer.cpp.

+

Definition at line 903 of file Visualizer.cpp.

@@ -3198,19 +2822,12 @@

void Visualizer::getWindowSize ( - uint &  - width, + uint & width, - uint &  - height  - - - - ) - const + uint & height ) const @@ -3237,7 +2854,7 @@

void Visualizer::hideWatermark ( - ) + ) @@ -3245,7 +2862,7 @@

Definition at line 978 of file Visualizer.cpp.

+

Definition at line 982 of file Visualizer.cpp.

@@ -3258,7 +2875,7 @@

void Visualizer::plotDepthMap ( - ) + ) @@ -3266,7 +2883,7 @@

Definition at line 3722 of file Visualizer.cpp.

+

Definition at line 3733 of file Visualizer.cpp.

@@ -3279,7 +2896,7 @@

std::vector< helios::vec3 > Visualizer::plotInteractive ( - ) + ) @@ -3287,7 +2904,7 @@

Definition at line 3295 of file Visualizer.cpp.

+

Definition at line 3306 of file Visualizer.cpp.

@@ -3300,7 +2917,7 @@

void Visualizer::plotUpdate ( - ) + ) @@ -3308,7 +2925,7 @@

Definition at line 3578 of file Visualizer.cpp.

+

Definition at line 3589 of file Visualizer.cpp.

@@ -3321,8 +2938,7 @@

void Visualizer::plotUpdate ( - bool  - hide_window) + bool hide_window) @@ -3336,7 +2952,7 @@

Definition at line 3582 of file Visualizer.cpp.

+

Definition at line 3593 of file Visualizer.cpp.

@@ -3349,7 +2965,7 @@

void Visualizer::printWindow ( - ) + ) @@ -3357,7 +2973,7 @@

Definition at line 875 of file Visualizer.cpp.

+

Definition at line 879 of file Visualizer.cpp.

@@ -3370,8 +2986,7 @@

void Visualizer::printWindow ( - const char *  - outfile) + const char * outfile) @@ -3386,7 +3001,7 @@

Note
If outfile does not have extension ‘.jpg’, it will be appended to the file name.
-

Definition at line 890 of file Visualizer.cpp.

+

Definition at line 894 of file Visualizer.cpp.

@@ -3399,7 +3014,7 @@

int Visualizer::selfTest ( - ) + ) @@ -3407,7 +3022,7 @@

Visualizer self-test routine.

-

Definition at line 690 of file Visualizer.cpp.

+

Definition at line 694 of file Visualizer.cpp.

@@ -3420,8 +3035,7 @@

void Visualizer::setBackgroundColor ( - const helios::RGBcolor &  - color) + const helios::RGBcolor & color) @@ -3435,7 +3049,7 @@

Definition at line 871 of file Visualizer.cpp.

+

Definition at line 875 of file Visualizer.cpp.

@@ -3448,8 +3062,7 @@

void Visualizer::setCameraFieldOfView ( - float  - angle_FOV) + float angle_FOV) @@ -3463,7 +3076,7 @@

Definition at line 784 of file Visualizer.cpp.

+

Definition at line 788 of file Visualizer.cpp.

@@ -3476,19 +3089,12 @@

void Visualizer::setCameraPosition ( - const helios::SphericalCoord &  - cameraAngle, + const helios::SphericalCoord & cameraAngle, - const helios::vec3 &  - lookAt  - - - - ) - + const helios::vec3 & lookAt )
@@ -3503,7 +3109,7 @@

Definition at line 779 of file Visualizer.cpp.

+

Definition at line 783 of file Visualizer.cpp.

@@ -3516,19 +3122,12 @@

void Visualizer::setCameraPosition ( - const helios::vec3 &  - cameraPosition, + const helios::vec3 & cameraPosition, - const helios::vec3 &  - lookAt  - - - - ) - + const helios::vec3 & lookAt )
@@ -3542,7 +3141,7 @@

Definition at line 774 of file Visualizer.cpp.

+

Definition at line 778 of file Visualizer.cpp.

@@ -3555,8 +3154,7 @@

void Visualizer::setColorbarFontColor ( - helios::RGBcolor  - color) + helios::RGBcolor color) @@ -3570,7 +3168,7 @@

Definition at line 2661 of file Visualizer.cpp.

+

Definition at line 2665 of file Visualizer.cpp.

@@ -3583,8 +3181,7 @@

void Visualizer::setColorbarFontSize ( - uint  - font_size) + uint font_size) @@ -3598,7 +3195,7 @@

Definition at line 2654 of file Visualizer.cpp.

+

Definition at line 2658 of file Visualizer.cpp.

@@ -3611,8 +3208,7 @@

void Visualizer::setColorbarPosition ( - helios::vec3  - position) + helios::vec3 position) @@ -3626,7 +3222,7 @@

Definition at line 2598 of file Visualizer.cpp.

+

Definition at line 2602 of file Visualizer.cpp.

@@ -3639,19 +3235,12 @@

void Visualizer::setColorbarRange ( - float  - cmin, + float cmin, - float  - cmax  - - - - ) - + float cmax ) @@ -3678,8 +3267,7 @@

void Visualizer::setColorbarSize ( - helios::vec2  - size) + helios::vec2 size) @@ -3693,7 +3281,7 @@

Definition at line 2605 of file Visualizer.cpp.

+

Definition at line 2609 of file Visualizer.cpp.

@@ -3706,8 +3294,7 @@

void Visualizer::setColorbarTicks ( - const std::vector< float > &  - ticks) + const std::vector< float > & ticks) @@ -3722,7 +3309,7 @@

Note
If tick values are outside of the colorbar range (see setColorBarRange()), the colorbar will be automatically expanded to fit the tick values.
-

Definition at line 2621 of file Visualizer.cpp.

+

Definition at line 2625 of file Visualizer.cpp.

@@ -3735,8 +3322,7 @@

void Visualizer::setColorbarTitle ( - const char *  - title) + const char * title) @@ -3750,7 +3336,7 @@

Definition at line 2650 of file Visualizer.cpp.

+

Definition at line 2654 of file Visualizer.cpp.

@@ -3763,19 +3349,12 @@

void Visualizer::setColormap ( - const std::vector< helios::RGBcolor > &  - colors, + const std::vector< helios::RGBcolor > & colors, - const std::vector< float > &  - divisions  - - - - ) - + const std::vector< float > & divisions )
@@ -3789,7 +3368,7 @@

Definition at line 2685 of file Visualizer.cpp.

+

Definition at line 2689 of file Visualizer.cpp.

@@ -3802,8 +3381,7 @@

void Visualizer::setColormap ( - Ctable  - colormap_name) + Ctable colormap_name) @@ -3818,7 +3396,7 @@

Note
Valid colormaps are "COLORMAP_HOT", "COLORMAP_COOL", "COLORMAP_LAVA", "COLORMAP_RAINBOW", "COLORMAP_PARULA", "COLORMAP_GRAY".
-

Definition at line 2665 of file Visualizer.cpp.

+

Definition at line 2669 of file Visualizer.cpp.

@@ -3831,8 +3409,7 @@

void Visualizer::setLightDirection ( - const helios::vec3 &  - direction) + const helios::vec3 & direction) @@ -3846,7 +3423,7 @@

Definition at line 788 of file Visualizer.cpp.

+

Definition at line 792 of file Visualizer.cpp.

@@ -3859,8 +3436,7 @@

void Visualizer::setLightingModel ( - LightingModel  - lightingmodel) + LightingModel lightingmodel) @@ -3873,9 +3449,9 @@

See also
LightingModel
+
See also
LightingModel
-

Definition at line 861 of file Visualizer.cpp.

+

Definition at line 865 of file Visualizer.cpp.

@@ -3888,8 +3464,7 @@

void Visualizer::setLightIntensityFactor ( - float  - lightintensityfactor) + float lightintensityfactor) @@ -3903,7 +3478,7 @@

Definition at line 867 of file Visualizer.cpp.

+

Definition at line 871 of file Visualizer.cpp.

@@ -3916,7 +3491,7 @@

void Visualizer::showWatermark ( - ) + ) @@ -3924,7 +3499,7 @@

Definition at line 982 of file Visualizer.cpp.

+

Definition at line 986 of file Visualizer.cpp.

@@ -3935,7 +3510,8 @@

+ diff --git a/doc/html/class_voxel_intersection.html b/doc/html/class_voxel_intersection.html index 6b0721be2..4e6405a5b 100644 --- a/doc/html/class_voxel_intersection.html +++ b/doc/html/class_voxel_intersection.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -93,43 +105,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 VoxelIntersection (helios::Context *context)
 VoxelIntersection (helios::Context *context)
 Default constructor.
 
int selfTest (void)
int selfTest (void)
 Self-test function (unit tests)
 
void calculatePrimitiveVoxelIntersection (void)
void calculatePrimitiveVoxelIntersection (void)
 Calculate primitives that reside in all voxels for every primitive in the Context.
 
void calculatePrimitiveVoxelIntersection (std::vector< uint > UUIDs)
void calculatePrimitiveVoxelIntersection (std::vector< uint > UUIDs)
 Calculate primitives that reside in all voxels for a subset of primitives in the Context.
 
void disableMessages ()
void disableMessages ()
 Disable output messages (enabled by default)
 
void enableMessages ()
void enableMessages ()
 Re-enable output messages.
 
helios::vec3 linesIntersection (helios::vec3 line1_point, helios::vec3 line1_direction, helios::vec3 line2_point, helios::vec3 line2_direction)
helios::vec3 linesIntersection (helios::vec3 line1_point, helios::vec3 line1_direction, helios::vec3 line2_point, helios::vec3 line2_direction)
 Calculate the intersection point of two lines.
 
std::vector< uint > slicePrimitive (uint UUID, std::vector< helios::vec3 > voxel_face_vertices)
std::vector< uint > slicePrimitive (uint UUID, std::vector< helios::vec3 > voxel_face_vertices)
 Slice a primitive (patch or triangle) into multiple triangles using a defined plane (often a voxel face)
 
std::vector< uint > slicePrimitivesUsingGrid (std::vector< uint > UUIDs, helios::vec3 grid_center, helios::vec3 grid_size, helios::int3 grid_divisions)
std::vector< uint > slicePrimitivesUsingGrid (std::vector< uint > UUIDs, helios::vec3 grid_center, helios::vec3 grid_size, helios::int3 grid_divisions)
 Slice a primitives based on a defined grid of voxels.
 
std::vector< std::vector< uint > > getCellPrimitives ()
std::vector< std::vector< uint > > getCellPrimitives ()
 get 2D vector storing the UUIDs within each grid cell
 
bool approxSame (float a, float b, float absTol, float relTol)
bool approxSame (float a, float b, float absTol, float relTol)
 compare two floating point numbers to within an absolute and relative error tolerance
 
bool approxSame (helios::vec3 a, helios::vec3 b, float absTol)
bool approxSame (helios::vec3 a, helios::vec3 b, float absTol)
 compare two vec3's to within an absolute and relative error tolerance
 
helios::vec2 interpolate_texture_UV_to_slice_point (helios::vec3 p1, helios::vec2 uv1, helios::vec3 p2, helios::vec2 uv2, helios::vec3 ps)
helios::vec2 interpolate_texture_UV_to_slice_point (helios::vec3 p1, helios::vec2 uv1, helios::vec3 p2, helios::vec2 uv2, helios::vec3 ps)
 find the uv coordinate of a slice point
 
@@ -146,8 +158,7 @@

VoxelIntersection::VoxelIntersection ( - helios::Context *  - context) + helios::Context * context) @@ -175,31 +186,22 @@

bool VoxelIntersection::approxSame ( - float  - a, + float a, - float  - b, + float b, - float  - absTol, + float absTol, - float  - relTol  - - - - ) - + float relTol )

@@ -229,25 +231,17 @@

bool VoxelIntersection::approxSame ( - helios::vec3  - a, + helios::vec3 a, - helios::vec3  - b, + helios::vec3 b, - float  - absTol  - - - - ) - + float absTol )

@@ -455,31 +434,22 @@

helios::vec3 VoxelIntersection::linesIntersection ( - helios::vec3  - line1_point, + helios::vec3 line1_point, - helios::vec3  - line1_direction, + helios::vec3 line1_direction, - helios::vec3  - line2_point, + helios::vec3 line2_point, - helios::vec3  - line2_direction  - - - - ) - + helios::vec3 line2_direction )

@@ -572,31 +534,22 @@

std::vector< uint > VoxelIntersection::slicePrimitivesUsingGrid ( - std::vector< uint >  - UUIDs, + std::vector< uint > UUIDs, - helios::vec3  - grid_center, + helios::vec3 grid_center, - helios::vec3  - grid_size, + helios::vec3 grid_size, - helios::int3  - grid_divisions  - - - - ) - + helios::int3 grid_divisions )

@@ -625,7 +578,8 @@

+

diff --git a/doc/html/class_weber_penn_tree.html b/doc/html/class_weber_penn_tree.html index 627ccd80e..353e7af38 100644 --- a/doc/html/class_weber_penn_tree.html +++ b/doc/html/class_weber_penn_tree.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -93,55 +105,55 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 WeberPennTree (helios::Context *context)
 WeberPennTree (helios::Context *context)
 Weber-Penn Tree constructor.
 
int selfTest (void)
int selfTest (void)
 Unit testing routine.
 
void loadXML (const char *filename)
void loadXML (const char *filename)
 Load tree library from an XML file.
 
uint buildTree (const char *treename, helios::vec3 origin)
uint buildTree (const char *treename, helios::vec3 origin)
 Construct a Weber-Penn tree using a tree already in the library.
 
uint buildTree (const char *treename, helios::vec3 origin, float scale)
uint buildTree (const char *treename, helios::vec3 origin, float scale)
 Construct a Weber-Penn tree using a tree already in the library.
 
std::vector< uint > getTrunkUUIDs (const uint TreeID)
std::vector< uint > getTrunkUUIDs (const uint TreeID)
 Get the unique universal identifiers (UUIDs) for the primitives that make up the tree trunk.
 
std::vector< uint > getBranchUUIDs (const uint TreeID)
std::vector< uint > getBranchUUIDs (const uint TreeID)
 Get the unique universal identifiers (UUIDs) for the primitives that make up the tree branches.
 
std::vector< uint > getLeafUUIDs (const uint TreeID)
std::vector< uint > getLeafUUIDs (const uint TreeID)
 Get the unique universal identifiers (UUIDs) for the primitives that make up the tree leaves.
 
std::vector< uint > getAllUUIDs (const uint TreeID)
std::vector< uint > getAllUUIDs (const uint TreeID)
 Get the unique universal identifiers (UUIDs) for all primitives that make up the tree.
 
void setBranchRecursionLevel (const uint level)
void setBranchRecursionLevel (const uint level)
 Only create branch primitives up to a certain recursion level (leaves are still created for all levels).
 
void setTrunkSegmentResolution (const uint trunk_segs)
void setTrunkSegmentResolution (const uint trunk_segs)
 Set the radial triangle subdivisions for trunks.
 
void setBranchSegmentResolution (const uint branch_segs)
void setBranchSegmentResolution (const uint branch_segs)
 Set the radial triangle subdivisions for branches.
 
void setLeafSubdivisions (const helios::int2 leaf_segs)
void setLeafSubdivisions (const helios::int2 leaf_segs)
 Set the number of sub-patch divisions for leaves.
 
WeberPennTreeParameters getTreeParameters (const char *treename)
WeberPennTreeParameters getTreeParameters (const char *treename)
 Get the architectural parameters for a tree in the currently loaded library.
 
void setTreeParameters (const char *treename, const WeberPennTreeParameters parameters)
void setTreeParameters (const char *treename, const WeberPennTreeParameters parameters)
 Set the architectural parameters for a tree in the currently loaded library.
 
void seedRandomGenerator (const uint seed)
void seedRandomGenerator (const uint seed)
 Seed the random number generator. This can be useful for generating repeatable trees, say, within a loop.
 
void optionalOutputPrimitiveData (const char *label)
void optionalOutputPrimitiveData (const char *label)
 Add optional output primitive data values to the Context.
 
@@ -158,8 +170,7 @@

WeberPennTree::WeberPennTree ( - helios::Context *  - context) + helios::Context * context) @@ -187,19 +198,12 @@

uint WeberPennTree::buildTree ( - const char *  - treename, + const char * treename, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin )

@@ -211,7 +215,7 @@

See also
WeberPennTree::loadXML).
+
See also
WeberPennTree::loadXML).
Parameters
@@ -233,25 +237,17 @@

uint WeberPennTree::buildTree

- - + - - + - - - - - - - +
[in]origin(x,y,z) location to place tree. Note that this position is the location of the center of the trunk base.
(const char * treename, const char * treename,
helios::vec3 origin, helios::vec3 origin,
float scale 
)float scale )

@@ -263,7 +259,7 @@

See also
WeberPennTree::loadXML).
+
See also
WeberPennTree::loadXML).
Parameters
@@ -286,8 +282,7 @@

std::vector< uint > WeberPennTree::getAllUUIDs

- - +
[in]origin(x,y,z) location to place tree. Note that this position is the location of the center of the trunk base.
(const uint TreeID)const uint TreeID)
@@ -314,8 +309,7 @@

std::vector< uint > WeberPennTree::getBranchUUIDs ( - const uint  - TreeID) + const uint TreeID) @@ -342,8 +336,7 @@

std::vector< uint > WeberPennTree::getLeafUUIDs ( - const uint  - TreeID) + const uint TreeID) @@ -370,8 +363,7 @@

WeberPennTreeParameters WeberPennTree::getTreeParameters ( - const char *  - treename) + const char * treename) @@ -399,8 +391,7 @@

std::vector< uint > WeberPennTree::getTrunkUUIDs ( - const uint  - TreeID) + const uint TreeID) @@ -427,8 +418,7 @@

void WeberPennTree::loadXML ( - const char *  - filename) + const char * filename) @@ -455,8 +445,7 @@

void WeberPennTree::optionalOutputPrimitiveData ( - const char *  - label) + const char * label) @@ -483,8 +472,7 @@

void WeberPennTree::seedRandomGenerator ( - const uint  - seed) + const uint seed) @@ -511,8 +499,7 @@

int WeberPennTree::selfTest ( - void  - ) + void ) @@ -533,8 +520,7 @@

void WeberPennTree::setBranchRecursionLevel ( - const uint  - level) + const uint level) @@ -561,8 +547,7 @@

void WeberPennTree::setBranchSegmentResolution ( - const uint  - branch_segs) + const uint branch_segs) @@ -589,8 +574,7 @@

void WeberPennTree::setLeafSubdivisions ( - const helios::int2  - leaf_segs) + const helios::int2 leaf_segs) @@ -617,19 +601,12 @@

void WeberPennTree::setTreeParameters ( - const char *  - treename, + const char * treename, - const WeberPennTreeParameters  - parameters  - - - - ) - + const WeberPennTreeParameters parameters )

diff --git a/doc/html/classes.html b/doc/html/classes.html index 0dc950877..b66391e61 100644 --- a/doc/html/classes.html +++ b/doc/html/classes.html @@ -38,31 +38,43 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + +
+
+
+
diff --git a/doc/html/classhelios_1_1_box.html b/doc/html/classhelios_1_1_box.html index a12d9ed4c..c566b0893 100644 --- a/doc/html/classhelios_1_1_box.html +++ b/doc/html/classhelios_1_1_box.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -97,7 +109,7 @@

Box compound object class. - More...

+ More...

#include <Context.h>

@@ -112,228 +124,228 @@ - + - - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 Box (uint a_OID, const std::vector< uint > &a_UUIDs, const int3 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Box (uint a_OID, const std::vector< uint > &a_UUIDs, const int3 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Default constructor.
 
+
 ~Box () override=default
 Box destructor.
 
vec3 getSize () const
vec3 getSize () const
 Get the dimensions of the box object in each Cartesian direction.
 
vec3 getCenter () const
vec3 getCenter () const
 Get the Cartesian coordinates of the center of the box object.
 
helios::int3 getSubdivisionCount () const
helios::int3 getSubdivisionCount () const
 Get the number of sub-patch divisions of the box object in each Cartesian direction.
 
void setSubdivisionCount (const helios::int3 &subdiv)
void setSubdivisionCount (const helios::int3 &subdiv)
 Set the number of box sub-patch divisions.
 
float getVolume () const
float getVolume () const
 Get the volume of the box object.
 
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
 Get the unique identifier for the object.
 
helios::ObjectType getObjectType () const
helios::ObjectType getObjectType () const
 Get an enumeration specifying the type of the object.
 
uint getPrimitiveCount () const
uint getPrimitiveCount () const
 Return the number of primitives contained in the object.
 
std::vector< uint > getPrimitiveUUIDs () const
std::vector< uint > getPrimitiveUUIDs () const
 Get the UUIDs for all primitives contained in the object.
 
bool doesObjectContainPrimitive (uint UUID)
bool doesObjectContainPrimitive (uint UUID)
 Check whether a primitive is a member of the object based on its UUID.
 
helios::vec3 getObjectCenter () const
helios::vec3 getObjectCenter () const
 Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
 
float getArea () const
float getArea () const
 Calculate the total one-sided surface area of the Compound Object.
 
void setColor (const helios::RGBcolor &color)
void setColor (const helios::RGBcolor &color)
 Method to set the diffuse color for all primitives in the Compound Object.
 
void setColor (const helios::RGBAcolor &color)
void setColor (const helios::RGBAcolor &color)
 Method to set the diffuse color (with transparency) for all primitives in the Compound Object.
 
void overrideTextureColor ()
void overrideTextureColor ()
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void useTextureColor ()
void useTextureColor ()
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
bool hasTexture () const
bool hasTexture () const
 Method to check whether this object has texture data.
 
std::string getTextureFile () const
std::string getTextureFile () const
 Method to return the texture map file of an Object.
 
void translate (const helios::vec3 &shift)
void translate (const helios::vec3 &shift)
 Method to translate/shift a Compound Object.
 
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
 Method to rotate a Compound Object about the x-, y-, or z-axis.
 
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary axis passing through the origin.
 
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary line (not necessarily passing through the origin)
 
void scale (const helios::vec3 &scale)
void scale (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutCenter (const helios::vec3 &scale)
void scaleAboutCenter (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
void getTransformationMatrix (float(&T)[16]) const
void getTransformationMatrix (float(&T)[16]) const
 Method to return the Affine transformation matrix of a Compound Object.
 
void setTransformationMatrix (float(&T)[16])
void setTransformationMatrix (float(&T)[16])
 Method to set the Affine transformation matrix of a Compound Object.
 
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
 Method to set the UUIDs of object child primitives.
 
void deleteChildPrimitive (uint UUID)
void deleteChildPrimitive (uint UUID)
 Delete a single child member of the object.
 
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
 Delete multiple child member of the object based on a vector of UUIDs.
 
bool arePrimitivesComplete () const
bool arePrimitivesComplete () const
 Method to query whether all object primitives are in tact.
 
void setObjectData (const char *label, const int &data)
void setObjectData (const char *label, const int &data)
 Add data value (int) associated with a object element.
 
void setObjectData (const char *label, const uint &data)
void setObjectData (const char *label, const uint &data)
 Add data value (uint) associated with a object element.
 
void setObjectData (const char *label, const float &data)
void setObjectData (const char *label, const float &data)
 Add data value (float) associated with a object element.
 
void setObjectData (const char *label, const double &data)
void setObjectData (const char *label, const double &data)
 Add data value (double) associated with a object element.
 
void setObjectData (const char *label, const helios::vec2 &data)
void setObjectData (const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a object element.
 
void setObjectData (const char *label, const helios::vec3 &data)
void setObjectData (const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a object element.
 
void setObjectData (const char *label, const helios::vec4 &data)
void setObjectData (const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a object element.
 
void setObjectData (const char *label, const helios::int2 &data)
void setObjectData (const char *label, const helios::int2 &data)
 Add data value (int2) associated with a object element.
 
void setObjectData (const char *label, const helios::int3 &data)
void setObjectData (const char *label, const helios::int3 &data)
 Add data value (int3) associated with a object element.
 
void setObjectData (const char *label, const helios::int4 &data)
void setObjectData (const char *label, const helios::int4 &data)
 Add data value (int4) associated with a object element.
 
void setObjectData (const char *label, const std::string &data)
void setObjectData (const char *label, const std::string &data)
 Add data value (string) associated with a object element.
 
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
 Add (array) data associated with a object element.
 
void getObjectData (const char *label, int &data) const
void getObjectData (const char *label, int &data) const
 Get data associated with a object element (integer scalar)
 
void getObjectData (const char *label, std::vector< int > &data) const
void getObjectData (const char *label, std::vector< int > &data) const
 Get data associated with a object element (vector of integers)
 
void getObjectData (const char *label, uint &data) const
void getObjectData (const char *label, uint &data) const
 Get data associated with a object element (unsigned integer scalar)
 
void getObjectData (const char *label, std::vector< uint > &data) const
void getObjectData (const char *label, std::vector< uint > &data) const
 Get data associated with a object element (vector of unsigned integers)
 
void getObjectData (const char *label, float &data) const
void getObjectData (const char *label, float &data) const
 Get data associated with a object element (float scalar)
 
void getObjectData (const char *label, std::vector< float > &data) const
void getObjectData (const char *label, std::vector< float > &data) const
 Get data associated with a object element (vector of floats)
 
void getObjectData (const char *label, double &data) const
void getObjectData (const char *label, double &data) const
 Get data associated with a object element (double scalar)
 
void getObjectData (const char *label, std::vector< double > &data) const
void getObjectData (const char *label, std::vector< double > &data) const
 Get data associated with a object element (vector of doubles)
 
void getObjectData (const char *label, vec2 &data) const
void getObjectData (const char *label, vec2 &data) const
 Get data associated with a object element (vec2 scalar)
 
void getObjectData (const char *label, std::vector< vec2 > &data) const
void getObjectData (const char *label, std::vector< vec2 > &data) const
 Get data associated with a object element (vector of vec2's)
 
void getObjectData (const char *label, vec3 &data) const
void getObjectData (const char *label, vec3 &data) const
 Get data associated with a object element (vec3 scalar)
 
void getObjectData (const char *label, std::vector< vec3 > &data) const
void getObjectData (const char *label, std::vector< vec3 > &data) const
 Get data associated with a object element (vector of vec3's)
 
void getObjectData (const char *label, vec4 &data) const
void getObjectData (const char *label, vec4 &data) const
 Get data associated with a object element (vec4 scalar)
 
void getObjectData (const char *label, std::vector< vec4 > &data) const
void getObjectData (const char *label, std::vector< vec4 > &data) const
 Get data associated with a object element (vector of vec4's)
 
void getObjectData (const char *label, int2 &data) const
void getObjectData (const char *label, int2 &data) const
 Get data associated with a object element (int2 scalar)
 
void getObjectData (const char *label, std::vector< int2 > &data) const
void getObjectData (const char *label, std::vector< int2 > &data) const
 Get data associated with a object element (vector of int2's)
 
void getObjectData (const char *label, int3 &data) const
void getObjectData (const char *label, int3 &data) const
 Get data associated with a object element (int3 scalar)
 
void getObjectData (const char *label, std::vector< int3 > &data) const
void getObjectData (const char *label, std::vector< int3 > &data) const
 Get data associated with a object element (vector of int3's)
 
void getObjectData (const char *label, int4 &data) const
void getObjectData (const char *label, int4 &data) const
 Get data associated with a object element (int4 scalar)
 
void getObjectData (const char *label, std::vector< int4 > &data) const
void getObjectData (const char *label, std::vector< int4 > &data) const
 Get data associated with a object element (vector of int4's)
 
void getObjectData (const char *label, std::string &data) const
void getObjectData (const char *label, std::string &data) const
 Get data associated with a object element (string scalar)
 
void getObjectData (const char *label, std::vector< std::string > &data) const
void getObjectData (const char *label, std::vector< std::string > &data) const
 Get data associated with a object element (vector of strings)
 
HeliosDataType getObjectDataType (const char *label) const
HeliosDataType getObjectDataType (const char *label) const
 Get the Helios data type of object data.
 
uint getObjectDataSize (const char *label) const
uint getObjectDataSize (const char *label) const
 Get the size/length of object data.
 
bool doesObjectDataExist (const char *label) const
bool doesObjectDataExist (const char *label) const
 Check if object data 'label' exists.
 
void clearObjectData (const char *label)
void clearObjectData (const char *label)
 Clear the object data for this object.
 
std::vector< std::string > listObjectData () const
std::vector< std::string > listObjectData () const
 Return labels for all object data for this particular object.
 
- +

Friends

class CompoundObject
class CompoundObject
 

Detailed Description

@@ -350,37 +362,27 @@

Box::Box ( - uint  - a_OID, + uint a_OID, - const std::vector< uint > &  - a_UUIDs, + const std::vector< uint > & a_UUIDs, - const int3 &  - a_subdiv, + const int3 & a_subdiv, - const char *  - a_texturefile, + const char * a_texturefile, - helios::Context *  - a_context  - - - - ) - + helios::Context * a_context )

@@ -401,7 +403,7 @@

vec3 Box::getCenter ( - ) + ) const @@ -422,7 +424,7 @@

vec3 Box::getSize ( - ) + ) const @@ -443,7 +445,7 @@

helios::int3 Box::getSubdivisionCount ( - ) + ) const @@ -464,7 +466,7 @@

float Box::getVolume ( - ) + ) const @@ -485,8 +487,7 @@

void Box::setSubdivisionCount ( - const helios::int3 &  - subdiv) + const helios::int3 & subdiv) @@ -504,7 +505,7 @@

Friends And Related Function Documentation

+

Friends And Related Symbol Documentation

◆ CompoundObject

@@ -536,7 +537,8 @@

+

diff --git a/doc/html/classhelios_1_1_box.png b/doc/html/classhelios_1_1_box.png index 6220820ec15393ce3f69d69f8ce0a3946c3c85ac..67fc3be264327c4258301c7d44a07ff323465a56 100644 GIT binary patch delta 21 dcmcb}a*<_%9oK^g5B~rEZ+bRt$wm)OCIEkk3m^ah delta 21 dcmcb}a*<_%9oK;a2mb&6A3W*uij5weOaOfS3nTyl diff --git a/doc/html/classhelios_1_1_compound_object.html b/doc/html/classhelios_1_1_compound_object.html index 66e14148f..1a7b6f45c 100644 --- a/doc/html/classhelios_1_1_compound_object.html +++ b/doc/html/classhelios_1_1_compound_object.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -113,205 +125,205 @@ - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

uint getObjectID () const
uint getObjectID () const
 Get the unique identifier for the object.
 
helios::ObjectType getObjectType () const
helios::ObjectType getObjectType () const
 Get an enumeration specifying the type of the object.
 
uint getPrimitiveCount () const
uint getPrimitiveCount () const
 Return the number of primitives contained in the object.
 
std::vector< uint > getPrimitiveUUIDs () const
std::vector< uint > getPrimitiveUUIDs () const
 Get the UUIDs for all primitives contained in the object.
 
bool doesObjectContainPrimitive (uint UUID)
bool doesObjectContainPrimitive (uint UUID)
 Check whether a primitive is a member of the object based on its UUID.
 
helios::vec3 getObjectCenter () const
helios::vec3 getObjectCenter () const
 Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
 
float getArea () const
float getArea () const
 Calculate the total one-sided surface area of the Compound Object.
 
void setColor (const helios::RGBcolor &color)
void setColor (const helios::RGBcolor &color)
 Method to set the diffuse color for all primitives in the Compound Object.
 
void setColor (const helios::RGBAcolor &color)
void setColor (const helios::RGBAcolor &color)
 Method to set the diffuse color (with transparency) for all primitives in the Compound Object.
 
void overrideTextureColor ()
void overrideTextureColor ()
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void useTextureColor ()
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
void useTextureColor ()
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
bool hasTexture () const
bool hasTexture () const
 Method to check whether this object has texture data.
 
std::string getTextureFile () const
std::string getTextureFile () const
 Method to return the texture map file of an Object.
 
void translate (const helios::vec3 &shift)
void translate (const helios::vec3 &shift)
 Method to translate/shift a Compound Object.
 
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
 Method to rotate a Compound Object about the x-, y-, or z-axis.
 
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary axis passing through the origin.
 
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary line (not necessarily passing through the origin)
 
void scale (const helios::vec3 &scale)
void scale (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutCenter (const helios::vec3 &scale)
void scaleAboutCenter (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
void getTransformationMatrix (float(&T)[16]) const
void getTransformationMatrix (float(&T)[16]) const
 Method to return the Affine transformation matrix of a Compound Object.
 
void setTransformationMatrix (float(&T)[16])
void setTransformationMatrix (float(&T)[16])
 Method to set the Affine transformation matrix of a Compound Object.
 
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
 Method to set the UUIDs of object child primitives.
 
void deleteChildPrimitive (uint UUID)
void deleteChildPrimitive (uint UUID)
 Delete a single child member of the object.
 
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
 Delete multiple child member of the object based on a vector of UUIDs.
 
bool arePrimitivesComplete () const
bool arePrimitivesComplete () const
 Method to query whether all object primitives are in tact.
 
void setObjectData (const char *label, const int &data)
void setObjectData (const char *label, const int &data)
 Add data value (int) associated with a object element.
 
void setObjectData (const char *label, const uint &data)
void setObjectData (const char *label, const uint &data)
 Add data value (uint) associated with a object element.
 
void setObjectData (const char *label, const float &data)
void setObjectData (const char *label, const float &data)
 Add data value (float) associated with a object element.
 
void setObjectData (const char *label, const double &data)
void setObjectData (const char *label, const double &data)
 Add data value (double) associated with a object element.
 
void setObjectData (const char *label, const helios::vec2 &data)
void setObjectData (const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a object element.
 
void setObjectData (const char *label, const helios::vec3 &data)
void setObjectData (const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a object element.
 
void setObjectData (const char *label, const helios::vec4 &data)
void setObjectData (const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a object element.
 
void setObjectData (const char *label, const helios::int2 &data)
void setObjectData (const char *label, const helios::int2 &data)
 Add data value (int2) associated with a object element.
 
void setObjectData (const char *label, const helios::int3 &data)
void setObjectData (const char *label, const helios::int3 &data)
 Add data value (int3) associated with a object element.
 
void setObjectData (const char *label, const helios::int4 &data)
void setObjectData (const char *label, const helios::int4 &data)
 Add data value (int4) associated with a object element.
 
void setObjectData (const char *label, const std::string &data)
void setObjectData (const char *label, const std::string &data)
 Add data value (string) associated with a object element.
 
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
 Add (array) data associated with a object element.
 
void getObjectData (const char *label, int &data) const
void getObjectData (const char *label, int &data) const
 Get data associated with a object element (integer scalar)
 
void getObjectData (const char *label, std::vector< int > &data) const
void getObjectData (const char *label, std::vector< int > &data) const
 Get data associated with a object element (vector of integers)
 
void getObjectData (const char *label, uint &data) const
void getObjectData (const char *label, uint &data) const
 Get data associated with a object element (unsigned integer scalar)
 
void getObjectData (const char *label, std::vector< uint > &data) const
void getObjectData (const char *label, std::vector< uint > &data) const
 Get data associated with a object element (vector of unsigned integers)
 
void getObjectData (const char *label, float &data) const
void getObjectData (const char *label, float &data) const
 Get data associated with a object element (float scalar)
 
void getObjectData (const char *label, std::vector< float > &data) const
void getObjectData (const char *label, std::vector< float > &data) const
 Get data associated with a object element (vector of floats)
 
void getObjectData (const char *label, double &data) const
void getObjectData (const char *label, double &data) const
 Get data associated with a object element (double scalar)
 
void getObjectData (const char *label, std::vector< double > &data) const
void getObjectData (const char *label, std::vector< double > &data) const
 Get data associated with a object element (vector of doubles)
 
void getObjectData (const char *label, vec2 &data) const
void getObjectData (const char *label, vec2 &data) const
 Get data associated with a object element (vec2 scalar)
 
void getObjectData (const char *label, std::vector< vec2 > &data) const
void getObjectData (const char *label, std::vector< vec2 > &data) const
 Get data associated with a object element (vector of vec2's)
 
void getObjectData (const char *label, vec3 &data) const
void getObjectData (const char *label, vec3 &data) const
 Get data associated with a object element (vec3 scalar)
 
void getObjectData (const char *label, std::vector< vec3 > &data) const
void getObjectData (const char *label, std::vector< vec3 > &data) const
 Get data associated with a object element (vector of vec3's)
 
void getObjectData (const char *label, vec4 &data) const
void getObjectData (const char *label, vec4 &data) const
 Get data associated with a object element (vec4 scalar)
 
void getObjectData (const char *label, std::vector< vec4 > &data) const
void getObjectData (const char *label, std::vector< vec4 > &data) const
 Get data associated with a object element (vector of vec4's)
 
void getObjectData (const char *label, int2 &data) const
void getObjectData (const char *label, int2 &data) const
 Get data associated with a object element (int2 scalar)
 
void getObjectData (const char *label, std::vector< int2 > &data) const
void getObjectData (const char *label, std::vector< int2 > &data) const
 Get data associated with a object element (vector of int2's)
 
void getObjectData (const char *label, int3 &data) const
void getObjectData (const char *label, int3 &data) const
 Get data associated with a object element (int3 scalar)
 
void getObjectData (const char *label, std::vector< int3 > &data) const
void getObjectData (const char *label, std::vector< int3 > &data) const
 Get data associated with a object element (vector of int3's)
 
void getObjectData (const char *label, int4 &data) const
void getObjectData (const char *label, int4 &data) const
 Get data associated with a object element (int4 scalar)
 
void getObjectData (const char *label, std::vector< int4 > &data) const
void getObjectData (const char *label, std::vector< int4 > &data) const
 Get data associated with a object element (vector of int4's)
 
void getObjectData (const char *label, std::string &data) const
void getObjectData (const char *label, std::string &data) const
 Get data associated with a object element (string scalar)
 
void getObjectData (const char *label, std::vector< std::string > &data) const
void getObjectData (const char *label, std::vector< std::string > &data) const
 Get data associated with a object element (vector of strings)
 
HeliosDataType getObjectDataType (const char *label) const
HeliosDataType getObjectDataType (const char *label) const
 Get the Helios data type of object data.
 
uint getObjectDataSize (const char *label) const
uint getObjectDataSize (const char *label) const
 Get the size/length of object data.
 
bool doesObjectDataExist (const char *label) const
bool doesObjectDataExist (const char *label) const
 Check if object data 'label' exists.
 
void clearObjectData (const char *label)
void clearObjectData (const char *label)
 Clear the object data for this object.
 
std::vector< std::string > listObjectData () const
std::vector< std::string > listObjectData () const
 Return labels for all object data for this particular object.
 
- +

Friends

class Context
class Context
 

Detailed Description

@@ -327,7 +339,7 @@

bool CompoundObject::arePrimitivesComplete ( - ) + ) const @@ -349,8 +361,7 @@

void CompoundObject::clearObjectData ( - const char *  - label) + const char * label) @@ -377,8 +388,7 @@

void CompoundObject::deleteChildPrimitive ( - const std::vector< uint > &  - UUIDs) + const std::vector< uint > & UUIDs) @@ -405,8 +415,7 @@

void CompoundObject::deleteChildPrimitive ( - uint  - UUID) + uint UUID) @@ -433,8 +442,7 @@

bool CompoundObject::doesObjectContainPrimitive ( - uint  - UUID) + uint UUID) @@ -455,8 +463,7 @@

bool CompoundObject::doesObjectDataExist ( - const char *  - label) + const char * label) const @@ -484,7 +491,7 @@

float CompoundObject::getArea ( - ) + ) const @@ -505,7 +512,7 @@

helios::vec3 CompoundObject::getObjectCenter ( - ) + ) const @@ -526,19 +533,12 @@

void CompoundObject::getObjectData ( - const char *  - label, + const char * label, - double &  - data  - - - - ) - const + double & data ) const

@@ -682,19 +661,12 @@

void CompoundObject::getObjectData ( - const char *  - label, + const char * label, - int3 &  - data  - - - - ) - const + int3 & data ) const

@@ -721,19 +693,12 @@

void CompoundObject::getObjectData ( - const char *  - label, + const char * label, - int4 &  - data  - - - - ) - const + int4 & data ) const

@@ -955,19 +885,12 @@

void CompoundObject::getObjectData ( - const char *  - label, + const char * label, - std::vector< int3 > &  - data  - - - - ) - const + std::vector< int3 > & data ) const

@@ -994,19 +917,12 @@

void CompoundObject::getObjectData ( - const char *  - label, + const char * label, - std::vector< int4 > &  - data  - - - - ) - const + std::vector< int4 > & data ) const

@@ -1150,19 +1045,12 @@

void CompoundObject::getObjectData ( - const char *  - label, + const char * label, - std::vector< vec3 > &  - data  - - - - ) - const + std::vector< vec3 > & data ) const

@@ -1189,19 +1077,12 @@

void CompoundObject::getObjectData ( - const char *  - label, + const char * label, - std::vector< vec4 > &  - data  - - - - ) - const + std::vector< vec4 > & data ) const

@@ -1306,19 +1173,12 @@

void CompoundObject::getObjectData ( - const char *  - label, + const char * label, - vec3 &  - data  - - - - ) - const + vec3 & data ) const

@@ -1338,19 +1198,12 @@

void CompoundObject::getObjectData ( - const char *  - label, + const char * label, - vec4 &  - data  - - - - ) - const + vec4 & data ) const

@@ -1671,25 +1514,17 @@

void CompoundObject::rotate ( - float  - rotation_radians, + float rotation_radians, - const helios::vec3 &  - origin, + const helios::vec3 & origin, - const helios::vec3 &  - rotation_axis_vector  - - - - ) - + const helios::vec3 & rotation_axis_vector )

@@ -1717,19 +1552,12 @@

void CompoundObject::rotate ( - float  - rotation_radians, + float rotation_radians, - const helios::vec3 &  - rotation_axis_vector  - - - - ) - + const helios::vec3 & rotation_axis_vector )

@@ -1756,8 +1584,7 @@

void CompoundObject::scale ( - const helios::vec3 &  - scale) + const helios::vec3 & scale) @@ -1784,8 +1611,7 @@

void CompoundObject::scaleAboutCenter ( - const helios::vec3 &  - scale) + const helios::vec3 & scale) @@ -1812,19 +1638,12 @@

void CompoundObject::scaleAboutPoint ( - const helios::vec3 &  - scale, + const helios::vec3 & scale, - const helios::vec3 &  - point  - - - - ) - + const helios::vec3 & point )

@@ -2326,31 +2066,22 @@

void CompoundObject::setObjectData ( - const char *  - label, + const char * label, - HeliosDataType  - type, + HeliosDataType type, - uint  - size, + uint size, - void *  - data  - - - - ) - + void * data )

-

For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.

+

For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.

Definition at line 2331 of file Context.cpp.

-

Friends And Related Function Documentation

+

Friends And Related Symbol Documentation

◆ Context

@@ -2509,7 +2237,8 @@

+

diff --git a/doc/html/classhelios_1_1_compound_object.png b/doc/html/classhelios_1_1_compound_object.png index 8fc7c8138724f9e049943875c3bc4ea877bd5cda..d17b144483627d8719ef89ceaadec5b2daee32f0 100644 GIT binary patch delta 21 dcmaFJ_mFRb9oK^g5B~rEZ+bRt$wm)Jb^wE^3uyoV delta 21 dcmaFJ_mFRb9oK;a2mb&6A3W*uij5wU>;Qot3vB=Z diff --git a/doc/html/classhelios_1_1_cone.html b/doc/html/classhelios_1_1_cone.html index 4ba97864f..aaa8eb52a 100644 --- a/doc/html/classhelios_1_1_cone.html +++ b/doc/html/classhelios_1_1_cone.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -97,7 +109,7 @@

Cone compound object class. - More...

+ More...

#include <Context.h>

@@ -112,246 +124,246 @@ - + - - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 Cone (uint a_OID, const std::vector< uint > &a_UUIDs, const vec3 &a_node0, const vec3 &a_node1, float a_radius0, float a_radius1, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Cone (uint a_OID, const std::vector< uint > &a_UUIDs, const vec3 &a_node0, const vec3 &a_node1, float a_radius0, float a_radius1, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Default constructor.
 
+
 ~Cone () override=default
 Cone destructor.
 
std::vector< helios::vec3getNodeCoordinates () const
std::vector< helios::vec3getNodeCoordinates () const
 Get the Cartesian coordinates of each of the cone object nodes.
 
helios::vec3 getNodeCoordinate (int node_index) const
helios::vec3 getNodeCoordinate (int node_index) const
 Get the Cartesian coordinates of a cone object node.
 
std::vector< float > getNodeRadii () const
std::vector< float > getNodeRadii () const
 Get the radius at each of the cone object nodes.
 
float getNodeRadius (int node_index) const
float getNodeRadius (int node_index) const
 Get the radius of a cone object node.
 
uint getSubdivisionCount () const
uint getSubdivisionCount () const
 Get the number of sub-triangle divisions of the cone object.
 
void setSubdivisionCount (uint subdiv)
void setSubdivisionCount (uint subdiv)
 Set the number of radial sub-triangle divisions.
 
helios::vec3 getAxisUnitVector () const
helios::vec3 getAxisUnitVector () const
 Get a unit vector pointing in the direction of the cone central axis.
 
float getLength () const
float getLength () const
 Get the length of the cone along the axial direction.
 
void scaleLength (float S)
void scaleLength (float S)
 Method to scale the length of the cone.
 
void scaleGirth (float S)
void scaleGirth (float S)
 Method to scale the girth of the cone.
 
float getVolume () const
float getVolume () const
 Get the volume of the cone object.
 
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
 Get the unique identifier for the object.
 
helios::ObjectType getObjectType () const
helios::ObjectType getObjectType () const
 Get an enumeration specifying the type of the object.
 
uint getPrimitiveCount () const
uint getPrimitiveCount () const
 Return the number of primitives contained in the object.
 
std::vector< uint > getPrimitiveUUIDs () const
std::vector< uint > getPrimitiveUUIDs () const
 Get the UUIDs for all primitives contained in the object.
 
bool doesObjectContainPrimitive (uint UUID)
bool doesObjectContainPrimitive (uint UUID)
 Check whether a primitive is a member of the object based on its UUID.
 
helios::vec3 getObjectCenter () const
helios::vec3 getObjectCenter () const
 Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
 
float getArea () const
float getArea () const
 Calculate the total one-sided surface area of the Compound Object.
 
void setColor (const helios::RGBcolor &color)
void setColor (const helios::RGBcolor &color)
 Method to set the diffuse color for all primitives in the Compound Object.
 
void setColor (const helios::RGBAcolor &color)
void setColor (const helios::RGBAcolor &color)
 Method to set the diffuse color (with transparency) for all primitives in the Compound Object.
 
void overrideTextureColor ()
void overrideTextureColor ()
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void useTextureColor ()
void useTextureColor ()
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
bool hasTexture () const
bool hasTexture () const
 Method to check whether this object has texture data.
 
std::string getTextureFile () const
std::string getTextureFile () const
 Method to return the texture map file of an Object.
 
void translate (const helios::vec3 &shift)
void translate (const helios::vec3 &shift)
 Method to translate/shift a Compound Object.
 
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
 Method to rotate a Compound Object about the x-, y-, or z-axis.
 
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary axis passing through the origin.
 
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary line (not necessarily passing through the origin)
 
void scale (const helios::vec3 &scale)
void scale (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutCenter (const helios::vec3 &scale)
void scaleAboutCenter (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
void getTransformationMatrix (float(&T)[16]) const
void getTransformationMatrix (float(&T)[16]) const
 Method to return the Affine transformation matrix of a Compound Object.
 
void setTransformationMatrix (float(&T)[16])
void setTransformationMatrix (float(&T)[16])
 Method to set the Affine transformation matrix of a Compound Object.
 
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
 Method to set the UUIDs of object child primitives.
 
void deleteChildPrimitive (uint UUID)
void deleteChildPrimitive (uint UUID)
 Delete a single child member of the object.
 
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
 Delete multiple child member of the object based on a vector of UUIDs.
 
bool arePrimitivesComplete () const
bool arePrimitivesComplete () const
 Method to query whether all object primitives are in tact.
 
void setObjectData (const char *label, const int &data)
void setObjectData (const char *label, const int &data)
 Add data value (int) associated with a object element.
 
void setObjectData (const char *label, const uint &data)
void setObjectData (const char *label, const uint &data)
 Add data value (uint) associated with a object element.
 
void setObjectData (const char *label, const float &data)
void setObjectData (const char *label, const float &data)
 Add data value (float) associated with a object element.
 
void setObjectData (const char *label, const double &data)
void setObjectData (const char *label, const double &data)
 Add data value (double) associated with a object element.
 
void setObjectData (const char *label, const helios::vec2 &data)
void setObjectData (const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a object element.
 
void setObjectData (const char *label, const helios::vec3 &data)
void setObjectData (const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a object element.
 
void setObjectData (const char *label, const helios::vec4 &data)
void setObjectData (const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a object element.
 
void setObjectData (const char *label, const helios::int2 &data)
void setObjectData (const char *label, const helios::int2 &data)
 Add data value (int2) associated with a object element.
 
void setObjectData (const char *label, const helios::int3 &data)
void setObjectData (const char *label, const helios::int3 &data)
 Add data value (int3) associated with a object element.
 
void setObjectData (const char *label, const helios::int4 &data)
void setObjectData (const char *label, const helios::int4 &data)
 Add data value (int4) associated with a object element.
 
void setObjectData (const char *label, const std::string &data)
void setObjectData (const char *label, const std::string &data)
 Add data value (string) associated with a object element.
 
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
 Add (array) data associated with a object element.
 
void getObjectData (const char *label, int &data) const
void getObjectData (const char *label, int &data) const
 Get data associated with a object element (integer scalar)
 
void getObjectData (const char *label, std::vector< int > &data) const
void getObjectData (const char *label, std::vector< int > &data) const
 Get data associated with a object element (vector of integers)
 
void getObjectData (const char *label, uint &data) const
void getObjectData (const char *label, uint &data) const
 Get data associated with a object element (unsigned integer scalar)
 
void getObjectData (const char *label, std::vector< uint > &data) const
void getObjectData (const char *label, std::vector< uint > &data) const
 Get data associated with a object element (vector of unsigned integers)
 
void getObjectData (const char *label, float &data) const
void getObjectData (const char *label, float &data) const
 Get data associated with a object element (float scalar)
 
void getObjectData (const char *label, std::vector< float > &data) const
void getObjectData (const char *label, std::vector< float > &data) const
 Get data associated with a object element (vector of floats)
 
void getObjectData (const char *label, double &data) const
void getObjectData (const char *label, double &data) const
 Get data associated with a object element (double scalar)
 
void getObjectData (const char *label, std::vector< double > &data) const
void getObjectData (const char *label, std::vector< double > &data) const
 Get data associated with a object element (vector of doubles)
 
void getObjectData (const char *label, vec2 &data) const
void getObjectData (const char *label, vec2 &data) const
 Get data associated with a object element (vec2 scalar)
 
void getObjectData (const char *label, std::vector< vec2 > &data) const
void getObjectData (const char *label, std::vector< vec2 > &data) const
 Get data associated with a object element (vector of vec2's)
 
void getObjectData (const char *label, vec3 &data) const
void getObjectData (const char *label, vec3 &data) const
 Get data associated with a object element (vec3 scalar)
 
void getObjectData (const char *label, std::vector< vec3 > &data) const
void getObjectData (const char *label, std::vector< vec3 > &data) const
 Get data associated with a object element (vector of vec3's)
 
void getObjectData (const char *label, vec4 &data) const
void getObjectData (const char *label, vec4 &data) const
 Get data associated with a object element (vec4 scalar)
 
void getObjectData (const char *label, std::vector< vec4 > &data) const
void getObjectData (const char *label, std::vector< vec4 > &data) const
 Get data associated with a object element (vector of vec4's)
 
void getObjectData (const char *label, int2 &data) const
void getObjectData (const char *label, int2 &data) const
 Get data associated with a object element (int2 scalar)
 
void getObjectData (const char *label, std::vector< int2 > &data) const
void getObjectData (const char *label, std::vector< int2 > &data) const
 Get data associated with a object element (vector of int2's)
 
void getObjectData (const char *label, int3 &data) const
void getObjectData (const char *label, int3 &data) const
 Get data associated with a object element (int3 scalar)
 
void getObjectData (const char *label, std::vector< int3 > &data) const
void getObjectData (const char *label, std::vector< int3 > &data) const
 Get data associated with a object element (vector of int3's)
 
void getObjectData (const char *label, int4 &data) const
void getObjectData (const char *label, int4 &data) const
 Get data associated with a object element (int4 scalar)
 
void getObjectData (const char *label, std::vector< int4 > &data) const
void getObjectData (const char *label, std::vector< int4 > &data) const
 Get data associated with a object element (vector of int4's)
 
void getObjectData (const char *label, std::string &data) const
void getObjectData (const char *label, std::string &data) const
 Get data associated with a object element (string scalar)
 
void getObjectData (const char *label, std::vector< std::string > &data) const
void getObjectData (const char *label, std::vector< std::string > &data) const
 Get data associated with a object element (vector of strings)
 
HeliosDataType getObjectDataType (const char *label) const
HeliosDataType getObjectDataType (const char *label) const
 Get the Helios data type of object data.
 
uint getObjectDataSize (const char *label) const
uint getObjectDataSize (const char *label) const
 Get the size/length of object data.
 
bool doesObjectDataExist (const char *label) const
bool doesObjectDataExist (const char *label) const
 Check if object data 'label' exists.
 
void clearObjectData (const char *label)
void clearObjectData (const char *label)
 Clear the object data for this object.
 
std::vector< std::string > listObjectData () const
std::vector< std::string > listObjectData () const
 Return labels for all object data for this particular object.
 
- +

Friends

class CompoundObject
class CompoundObject
 

Detailed Description

@@ -368,61 +380,47 @@

Cone::Cone ( - uint  - a_OID, + uint a_OID, - const std::vector< uint > &  - a_UUIDs, + const std::vector< uint > & a_UUIDs, - const vec3 &  - a_node0, + const vec3 & a_node0, - const vec3 &  - a_node1, + const vec3 & a_node1, - float  - a_radius0, + float a_radius0, - float  - a_radius1, + float a_radius1, - uint  - a_subdiv, + uint a_subdiv, - const char *  - a_texturefile, + const char * a_texturefile, - helios::Context *  - a_context  - - - - ) - + helios::Context * a_context )

diff --git a/doc/html/classhelios_1_1_cone.png b/doc/html/classhelios_1_1_cone.png index 3c43c35d65d803e6f79fc2fac80a64c0513da419..ac18d5e3886444e5c132a8f3a983bcd391f633e8 100644 GIT binary patch delta 21 dcmaFN@|b0U9oK^g5B~rEZ+bRt$wm)pCIEtb3swLC delta 21 dcmaFN@|b0U9oK;a2mb&6A3W*uij5x9OaOoJ3t9jG diff --git a/doc/html/classhelios_1_1_context.html b/doc/html/classhelios_1_1_context.html index 6fe1eceac..024ec1463 100644 --- a/doc/html/classhelios_1_1_context.html +++ b/doc/html/classhelios_1_1_context.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
helios::Context Class Reference
@@ -98,1647 +109,1647 @@

Stores the state associated with simulation. - More...

+ More...

#include <Context.h>

- + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 Context ()
 Context ()
 Context default constructor.
 
 ~Context ()
 ~Context ()
 Context destructor.
 
+
 Context (const Context &)=delete
 Deleted copy constructor to prevent copying of Context.
 
+
void operator= (const Context &)=delete
 Deleted assignment operator to prevent copying of Context.
 
void seedRandomGenerator (uint seed)
void seedRandomGenerator (uint seed)
 Set seed for random generator.
 
std::minstd_rand0 * getRandomGenerator ()
std::minstd_rand0 * getRandomGenerator ()
 Get the random number generator engine.
 
void markGeometryClean ()
void markGeometryClean ()
 Mark the Context geometry as "clean", meaning that the geometry has not been modified since last set as clean.
 
void markGeometryDirty ()
void markGeometryDirty ()
 Mark the Context geometry as "dirty", meaning that the geometry has been modified since last set as clean.
 
bool isGeometryDirty () const
bool isGeometryDirty () const
 Query whether the Context geometry is "dirty", meaning has the geometry been modified since last set as clean.
 
uint addPatch ()
uint addPatch ()
 Add new default Patch geometric primitive, which is centered at the origin (0,0,0), has unit length and width, horizontal orientation, and black color.
 
uint addPatch (const helios::vec3 &center, const helios::vec2 &size)
uint addPatch (const helios::vec3 &center, const helios::vec2 &size)
 Add new Patch geometric primitive.
 
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)
 Add new Patch geometric primitive.
 
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
 Add new Patch geometric primitive.
 
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
 Add new Patch geometric primitive.
 
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)
 Add new Patch geometric primitive.
 
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file, const helios::vec2 &uv_center, const helios::vec2 &uv_size)
uint addPatch (const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file, const helios::vec2 &uv_center, const helios::vec2 &uv_size)
 Add new Patch geometric primitive.
 
uint addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
uint addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
 Add new Triangle geometric primitive.
 
uint addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color)
uint addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color)
 Add new Triangle geometric primitive.
 
uint addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color)
uint addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color)
 Add new Triangle geometric primitive.
 
uint addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2)
uint addTriangle (const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2)
 Add new Triangle geometric primitive.
 
uint addVoxel (const helios::vec3 &center, const helios::vec3 &size)
uint addVoxel (const helios::vec3 &center, const helios::vec3 &size)
 Add new Voxel geometric primitive.
 
uint addVoxel (const helios::vec3 &center, const helios::vec3 &size, const float &rotation)
uint addVoxel (const helios::vec3 &center, const helios::vec3 &size, const float &rotation)
 Add new Voxel geometric primitive.
 
uint addVoxel (const helios::vec3 &center, const helios::vec3 &size, const float &rotation, const helios::RGBcolor &color)
uint addVoxel (const helios::vec3 &center, const helios::vec3 &size, const float &rotation, const helios::RGBcolor &color)
 Add new Voxel geometric primitive.
 
uint addVoxel (const helios::vec3 &center, const helios::vec3 &size, const float &rotation, const helios::RGBAcolor &color)
uint addVoxel (const helios::vec3 &center, const helios::vec3 &size, const float &rotation, const helios::RGBAcolor &color)
 Add new Voxel geometric primitive.
 
void translatePrimitive (uint UUID, const vec3 &shift)
void translatePrimitive (uint UUID, const vec3 &shift)
 Translate a primitive using its UUID.
 
void translatePrimitive (const std::vector< uint > &UUIDs, const vec3 &shift)
void translatePrimitive (const std::vector< uint > &UUIDs, const vec3 &shift)
 Translate a group of primitives using a vector of UUIDs.
 
void rotatePrimitive (uint UUID, float rot, const char *axis)
void rotatePrimitive (uint UUID, float rot, const char *axis)
 Rotate a primitive about the x, y, or z axis using its UUID.
 
void rotatePrimitive (const std::vector< uint > &UUIDs, float rot, const char *axis)
void rotatePrimitive (const std::vector< uint > &UUIDs, float rot, const char *axis)
 Rotate a group of primitives about the x, y, or z axis using a vector of UUIDs.
 
void rotatePrimitive (uint UUID, float rot, const helios::vec3 &axis)
void rotatePrimitive (uint UUID, float rot, const helios::vec3 &axis)
 Rotate a primitive about an arbitrary axis passing through the origin using its UUID.
 
void rotatePrimitive (const std::vector< uint > &UUIDs, float rot, const vec3 &axis)
void rotatePrimitive (const std::vector< uint > &UUIDs, float rot, const vec3 &axis)
 Rotate a group of primitives about an arbitrary axis passing through the origin using a vector of UUIDs.
 
void rotatePrimitive (uint UUID, float rot, const helios::vec3 &origin, const helios::vec3 &axis)
void rotatePrimitive (uint UUID, float rot, const helios::vec3 &origin, const helios::vec3 &axis)
 Rotate a primitive about an arbitrary line (not necessarily passing through the origin) using its UUID.
 
void rotatePrimitive (const std::vector< uint > &UUIDs, float rot, const helios::vec3 &origin, const vec3 &axis)
void rotatePrimitive (const std::vector< uint > &UUIDs, float rot, const helios::vec3 &origin, const vec3 &axis)
 Rotate a group of primitives about an arbitrary line (not necessarily passing through the origin) using a vector of UUIDs.
 
void scalePrimitive (uint UUID, const helios::vec3 &S)
void scalePrimitive (uint UUID, const helios::vec3 &S)
 Scale a primitive using its UUID relative to the origin (0,0,0)
 
void scalePrimitive (const std::vector< uint > &UUIDs, const helios::vec3 &S)
void scalePrimitive (const std::vector< uint > &UUIDs, const helios::vec3 &S)
 Scale a group of primitives using a vector of UUIDs relative to the origin (0,0,0)
 
void scalePrimitiveAboutPoint (uint UUID, const helios::vec3 &S, const helios::vec3 point)
void scalePrimitiveAboutPoint (uint UUID, const helios::vec3 &S, const helios::vec3 point)
 Scale a primitive using its UUID about an arbitrary point in space.
 
void scalePrimitiveAboutPoint (const std::vector< uint > &UUIDs, const helios::vec3 &S, const helios::vec3 point)
void scalePrimitiveAboutPoint (const std::vector< uint > &UUIDs, const helios::vec3 &S, const helios::vec3 point)
 Scale a group of primitives using a vector of UUIDs about an arbitrary point in space.
 
void deletePrimitive (uint UUID)
void deletePrimitive (uint UUID)
 Delete a single primitive from the context.
 
void deletePrimitive (const std::vector< uint > &UUIDs)
void deletePrimitive (const std::vector< uint > &UUIDs)
 Delete a group of primitives from the context.
 
uint copyPrimitive (uint UUID)
uint copyPrimitive (uint UUID)
 Make a copy of a primitive from the context.
 
std::vector< uint > copyPrimitive (const std::vector< uint > &UUIDs)
std::vector< uint > copyPrimitive (const std::vector< uint > &UUIDs)
 Make a copy of a group of primitives from the context.
 
void copyPrimitiveData (uint sourceUUID, uint destinationUUID)
void copyPrimitiveData (uint sourceUUID, uint destinationUUID)
 copy all primitive data from one primitive to another
 
void renamePrimitiveData (uint UUID, const char *old_label, const char *new_label)
void renamePrimitiveData (uint UUID, const char *old_label, const char *new_label)
 Rename primitive data for a primitive.
 
void duplicatePrimitiveData (uint UUID, const char *old_label, const char *new_label)
void duplicatePrimitiveData (uint UUID, const char *old_label, const char *new_label)
 Duplicate/copy primitive data.
 
bool doesPrimitiveExist (uint UUID) const
bool doesPrimitiveExist (uint UUID) const
 Check if primitive exists for a given UUID.
 
bool doesPrimitiveExist (const std::vector< uint > &UUIDs) const
bool doesPrimitiveExist (const std::vector< uint > &UUIDs) const
 Check if ALL primitives exists for a vector UUIDs.
 
helios::vec2 getPatchSize (uint UUID) const
helios::vec2 getPatchSize (uint UUID) const
 Get the size of a patch element.
 
helios::vec3 getPatchCenter (uint UUID) const
helios::vec3 getPatchCenter (uint UUID) const
 Get the Cartesian (x,y,z) center position of a patch element.
 
helios::vec3 getTriangleVertex (uint UUID, uint number) const
helios::vec3 getTriangleVertex (uint UUID, uint number) const
 Get a single vertex of a Triangle based on an index.
 
void setTriangleVertices (uint UUID, const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
void setTriangleVertices (uint UUID, const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
 //! Manually set the Triangle vertices
 
helios::vec3 getVoxelCenter (uint UUID) const
helios::vec3 getVoxelCenter (uint UUID) const
 Get the Cartesian (x,y,z) center position of a voxel element.
 
helios::vec3 getVoxelSize (uint UUID) const
helios::vec3 getVoxelSize (uint UUID) const
 Get the size of a voxel element.
 
uint getPrimitiveCount () const
uint getPrimitiveCount () const
 Get the total number of Primitives in the Context.
 
std::vector< uint > getAllUUIDs () const
std::vector< uint > getAllUUIDs () const
 Get all primitive UUIDs currently in the Context.
 
void hidePrimitive (const std::vector< uint > &UUIDs)
 Hide primitives in the Context such that their UUIDs are not returned in Context::getAllUUIDs()
void hidePrimitive (const std::vector< uint > &UUIDs)
 Hide primitives in the Context such that their UUIDs are not returned in Context::getAllUUIDs()
 
bool isPrimitiveHidden (uint UUID) const
bool isPrimitiveHidden (uint UUID) const
 Query whether a primitive is hidden.
 
void cleanDeletedUUIDs (std::vector< uint > &UUIDs) const
void cleanDeletedUUIDs (std::vector< uint > &UUIDs) const
 Delete UUIDs from vector if primitives no longer exist (1D vector)
 
void cleanDeletedUUIDs (std::vector< std::vector< uint > > &UUIDs) const
void cleanDeletedUUIDs (std::vector< std::vector< uint > > &UUIDs) const
 Delete UUIDs from vector if primitives no longer exist (2D vector)
 
void cleanDeletedUUIDs (std::vector< std::vector< std::vector< uint > > > &UUIDs) const
void cleanDeletedUUIDs (std::vector< std::vector< std::vector< uint > > > &UUIDs) const
 Delete UUIDs from vector if primitives no longer exist (3D vector)
 
void setPrimitiveData (const uint &UUID, const char *label, const int &data)
void setPrimitiveData (const uint &UUID, const char *label, const int &data)
 Add data value (int) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const uint &data)
void setPrimitiveData (const uint &UUID, const char *label, const uint &data)
 Add data value (uint) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const float &data)
void setPrimitiveData (const uint &UUID, const char *label, const float &data)
 Add data value (float) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const double &data)
void setPrimitiveData (const uint &UUID, const char *label, const double &data)
 Add data value (double) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const helios::vec2 &data)
void setPrimitiveData (const uint &UUID, const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const helios::vec3 &data)
void setPrimitiveData (const uint &UUID, const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const helios::vec4 &data)
void setPrimitiveData (const uint &UUID, const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const helios::int2 &data)
void setPrimitiveData (const uint &UUID, const char *label, const helios::int2 &data)
 Add data value (int2) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const helios::int3 &data)
void setPrimitiveData (const uint &UUID, const char *label, const helios::int3 &data)
 Add data value (int3) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const helios::int4 &data)
void setPrimitiveData (const uint &UUID, const char *label, const helios::int4 &data)
 Add data value (int4) associated with a primitive element.
 
void setPrimitiveData (const uint &UUID, const char *label, const std::string &data)
void setPrimitiveData (const uint &UUID, const char *label, const std::string &data)
 Add data value (string) associated with a primitive element.
 
void setPrimitiveData (const uint &UUIDs, const char *label, HeliosDataType type, uint size, void *data)
void setPrimitiveData (const uint &UUIDs, const char *label, HeliosDataType type, uint size, void *data)
 Add data associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const int &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const int &data)
 Add data value (int) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const uint &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const uint &data)
 Add data value (uint) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const float &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const float &data)
 Add data value (float) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const double &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const double &data)
 Add data value (double) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::vec2 &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::vec3 &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::vec4 &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::int2 &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::int2 &data)
 Add data value (int2) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::int3 &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::int3 &data)
 Add data value (int3) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::int4 &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const helios::int4 &data)
 Add data value (int4) associated with a primitive element.
 
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const std::string &data)
void setPrimitiveData (const std::vector< uint > &UUIDs, const char *label, const std::string &data)
 Add data value (string) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const int &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const int &data)
 Add data value (int) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const uint &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const uint &data)
 Add data value (uint) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const float &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const float &data)
 Add data value (float) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const double &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const double &data)
 Add data value (double) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec2 &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec3 &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec4 &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int2 &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int2 &data)
 Add data value (int2) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int3 &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int3 &data)
 Add data value (int3) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int4 &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int4 &data)
 Add data value (int4) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const std::string &data)
void setPrimitiveData (const std::vector< std::vector< uint > > &UUIDs, const char *label, const std::string &data)
 Add data value (string) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const int &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const int &data)
 Add data value (int) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const uint &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const uint &data)
 Add data value (uint) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const float &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const float &data)
 Add data value (float) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const double &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const double &data)
 Add data value (double) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec2 &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec3 &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec4 &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int2 &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int2 &data)
 Add data value (int2) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int3 &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int3 &data)
 Add data value (int3) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int4 &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int4 &data)
 Add data value (int4) associated with a primitive element.
 
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const std::string &data)
void setPrimitiveData (const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const std::string &data)
 Add data value (string) associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, int &data) const
void getPrimitiveData (uint UUID, const char *label, int &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< int > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< int > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, uint &data) const
void getPrimitiveData (uint UUID, const char *label, uint &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< uint > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< uint > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, float &data) const
void getPrimitiveData (uint UUID, const char *label, float &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< float > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< float > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, double &data) const
void getPrimitiveData (uint UUID, const char *label, double &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< double > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< double > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, vec2 &data) const
void getPrimitiveData (uint UUID, const char *label, vec2 &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< vec2 > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< vec2 > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, vec3 &data) const
void getPrimitiveData (uint UUID, const char *label, vec3 &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< vec3 > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< vec3 > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, vec4 &data) const
void getPrimitiveData (uint UUID, const char *label, vec4 &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< vec4 > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< vec4 > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, int2 &data) const
void getPrimitiveData (uint UUID, const char *label, int2 &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< int2 > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< int2 > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, int3 &data) const
void getPrimitiveData (uint UUID, const char *label, int3 &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< int3 > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< int3 > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, int4 &data) const
void getPrimitiveData (uint UUID, const char *label, int4 &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< int4 > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< int4 > &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::string &data) const
void getPrimitiveData (uint UUID, const char *label, std::string &data) const
 Get data associated with a primitive element.
 
void getPrimitiveData (uint UUID, const char *label, std::vector< std::string > &data) const
void getPrimitiveData (uint UUID, const char *label, std::vector< std::string > &data) const
 Get data associated with a primitive element.
 
HeliosDataType getPrimitiveDataType (uint UUID, const char *label) const
HeliosDataType getPrimitiveDataType (uint UUID, const char *label) const
 Get the Helios data type of primitive data.
 
uint getPrimitiveDataSize (uint UUID, const char *label) const
uint getPrimitiveDataSize (uint UUID, const char *label) const
 Get the size/length of primitive data.
 
bool doesPrimitiveDataExist (uint UUID, const char *label) const
bool doesPrimitiveDataExist (uint UUID, const char *label) const
 Check if primitive data 'label' exists.
 
void clearPrimitiveData (uint UUID, const char *label)
void clearPrimitiveData (uint UUID, const char *label)
 Clear primitive data for a single primitive based on its UUID.
 
void clearPrimitiveData (const std::vector< uint > &UUIDs, const char *label)
void clearPrimitiveData (const std::vector< uint > &UUIDs, const char *label)
 Clear primitive data for multiple primitives based on a vector of UUIDs.
 
PrimitiveType getPrimitiveType (uint UUID) const
PrimitiveType getPrimitiveType (uint UUID) const
 Method to get the Primitive type.
 
void setPrimitiveParentObjectID (uint UUID, uint objID)
void setPrimitiveParentObjectID (uint UUID, uint objID)
 Method to set the ID of the parent object the primitive belongs to (default is object 0)
 
void setPrimitiveParentObjectID (const std::vector< uint > &UUIDs, uint objID)
void setPrimitiveParentObjectID (const std::vector< uint > &UUIDs, uint objID)
 Method to set the ID of the parent object the primitive belongs to (default is object 0) for a vector of UUIDs.
 
uint getPrimitiveParentObjectID (uint UUID) const
uint getPrimitiveParentObjectID (uint UUID) const
 Method to return the ID of the parent object the primitive belongs to (default is object 0)
 
std::vector< uint > getUniquePrimitiveParentObjectIDs (const std::vector< uint > &UUIDs) const
std::vector< uint > getUniquePrimitiveParentObjectIDs (const std::vector< uint > &UUIDs) const
 Method to return unique parent object IDs for a vector of primitive UUIDs.
 
std::vector< uint > getUniquePrimitiveParentObjectIDs (const std::vector< uint > &UUIDs, bool include_ObjID_zero) const
std::vector< uint > getUniquePrimitiveParentObjectIDs (const std::vector< uint > &UUIDs, bool include_ObjID_zero) const
 Method to return unique parent object IDs for a vector of primitive UUIDs.
 
float getPrimitiveArea (uint UUID) const
float getPrimitiveArea (uint UUID) const
 Method to return the surface area of a Primitive.
 
void getPrimitiveBoundingBox (uint UUID, vec3 &min_corner, vec3 &max_corner) const
void getPrimitiveBoundingBox (uint UUID, vec3 &min_corner, vec3 &max_corner) const
 Get the axis-aligned bounding box for a single primitive.
 
void getPrimitiveBoundingBox (const std::vector< uint > &UUID, vec3 &min_corner, vec3 &max_corner) const
void getPrimitiveBoundingBox (const std::vector< uint > &UUID, vec3 &min_corner, vec3 &max_corner) const
 Get the axis-aligned bounding box for a group of primitives.
 
void hideObject (const std::vector< uint > &ObjIDs)
 Hide compound objects in the Context such that their object IDs are not returned in Context::getAllObjectIDs(), and are not counted in Context::getObjectCount()
void hideObject (const std::vector< uint > &ObjIDs)
 Hide compound objects in the Context such that their object IDs are not returned in Context::getAllObjectIDs(), and are not counted in Context::getObjectCount()
 
bool isObjectHidden (uint ObjID) const
bool isObjectHidden (uint ObjID) const
 Query if an object is hidden.
 
float getObjectArea (uint ObjID) const
float getObjectArea (uint ObjID) const
 Method to return the one-sided surface area of an object.
 
uint getObjectPrimitiveCount (uint ObjID) const
uint getObjectPrimitiveCount (uint ObjID) const
 Method to return the number of primitives contained in the object.
 
helios::vec3 getObjectCenter (uint ObjID) const
helios::vec3 getObjectCenter (uint ObjID) const
 Method to return the Cartesian (x,y,z) point of the center of a bounding box for the object.
 
void setObjectColor (uint ObjID, const helios::RGBcolor &color)
void setObjectColor (uint ObjID, const helios::RGBcolor &color)
 Method to set the diffuse color of an Object.
 
void setObjectColor (const std::vector< uint > &ObjIDs, const helios::RGBcolor &color)
void setObjectColor (const std::vector< uint > &ObjIDs, const helios::RGBcolor &color)
 Method to set the diffuse color of an Object for a vector of ObjIDs.
 
void setObjectColor (uint ObjID, const helios::RGBAcolor &color)
void setObjectColor (uint ObjID, const helios::RGBAcolor &color)
 Method to set the diffuse color of an Object with transparency.
 
void setObjectColor (const std::vector< uint > &ObjIDs, const helios::RGBAcolor &color)
void setObjectColor (const std::vector< uint > &ObjIDs, const helios::RGBAcolor &color)
 Method to set the diffuse color of an Object with transparency for a vector of ObjIDs.
 
std::string getObjectTextureFile (uint ObjID) const
std::string getObjectTextureFile (uint ObjID) const
 Method to return the texture map file of an Object.
 
void getObjectTransformationMatrix (uint ObjID, float(&T)[16]) const
void getObjectTransformationMatrix (uint ObjID, float(&T)[16]) const
 Method to return the Affine transformation matrix of an Object.
 
void setObjectTransformationMatrix (uint ObjID, float(&T)[16])
void setObjectTransformationMatrix (uint ObjID, float(&T)[16])
 Method to set the Affine transformation matrix of an Object.
 
void setObjectTransformationMatrix (const std::vector< uint > &ObjIDs, float(&T)[16])
void setObjectTransformationMatrix (const std::vector< uint > &ObjIDs, float(&T)[16])
 Method to set the Affine transformation matrix of an Object for a vector Object IDs.
 
bool objectHasTexture (uint ObjID) const
bool objectHasTexture (uint ObjID) const
 Method to check whether an Object has texture data.
 
bool doesObjectContainPrimitive (uint ObjID, uint UUID)
bool doesObjectContainPrimitive (uint ObjID, uint UUID)
 Method to check if an Object contains a Primitive.
 
void overrideObjectTextureColor (uint ObjID)
void overrideObjectTextureColor (uint ObjID)
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void overrideObjectTextureColor (const std::vector< uint > &ObjIDs)
void overrideObjectTextureColor (const std::vector< uint > &ObjIDs)
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void useObjectTextureColor (uint ObjID)
void useObjectTextureColor (uint ObjID)
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is function reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
void useObjectTextureColor (const std::vector< uint > &ObjIDs)
void useObjectTextureColor (const std::vector< uint > &ObjIDs)
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is function reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
void getObjectBoundingBox (uint ObjID, vec3 &min_corner, vec3 &max_corner) const
void getObjectBoundingBox (uint ObjID, vec3 &min_corner, vec3 &max_corner) const
 Get the axis-aligned bounding box for a single object.
 
void getObjectBoundingBox (const std::vector< uint > &ObjID, vec3 &min_corner, vec3 &max_corner) const
void getObjectBoundingBox (const std::vector< uint > &ObjID, vec3 &min_corner, vec3 &max_corner) const
 Get the axis-aligned bounding box for a group of objects.
 
void printObjectInfo (uint ObjID) const
void printObjectInfo (uint ObjID) const
 Prints object properties to console (useful for debugging purposes)
 
std::vector< std::string > listObjectData (uint ObjID) const
std::vector< std::string > listObjectData (uint ObjID) const
 Return labels for all object data for this particular object.
 
std::vector< std::string > listPrimitiveData (uint UUID) const
std::vector< std::string > listPrimitiveData (uint UUID) const
 Return labels for all primitive data for this particular primitive.
 
float getPrimitiveSolidFraction (uint UUID) const
float getPrimitiveSolidFraction (uint UUID) const
 Get fraction of primitive surface area that is non-transparent.
 
helios::vec3 getPrimitiveNormal (uint UUID) const
helios::vec3 getPrimitiveNormal (uint UUID) const
 Method to return the normal vector of a Primitive.
 
void getPrimitiveTransformationMatrix (uint UUID, float(&T)[16]) const
void getPrimitiveTransformationMatrix (uint UUID, float(&T)[16]) const
 Method to return the Affine transformation matrix of a Primitive.
 
void setPrimitiveTransformationMatrix (uint UUID, float(&T)[16])
void setPrimitiveTransformationMatrix (uint UUID, float(&T)[16])
 Method to set the Affine transformation matrix of a Primitive.
 
void setPrimitiveTransformationMatrix (const std::vector< uint > &UUIDs, float(&T)[16])
void setPrimitiveTransformationMatrix (const std::vector< uint > &UUIDs, float(&T)[16])
 Method to set the Affine transformation matrix of a Primitive for a vector UUIDs.
 
std::vector< helios::vec3getPrimitiveVertices (uint UUID) const
std::vector< helios::vec3getPrimitiveVertices (uint UUID) const
 Method to return the (x,y,z) coordinates of the vertices of a Primitive.
 
helios::RGBcolor getPrimitiveColor (uint UUID) const
helios::RGBcolor getPrimitiveColor (uint UUID) const
 Method to return the diffuse color of a Primitive.
 
helios::RGBcolor getPrimitiveColorRGB (uint UUID) const
helios::RGBcolor getPrimitiveColorRGB (uint UUID) const
 Method to return the diffuse color of a Primitive.
 
helios::RGBAcolor getPrimitiveColorRGBA (uint UUID) const
helios::RGBAcolor getPrimitiveColorRGBA (uint UUID) const
 Method to return the diffuse color of a Primitive with transparency.
 
void setPrimitiveColor (uint UUID, const helios::RGBcolor &color)
void setPrimitiveColor (uint UUID, const helios::RGBcolor &color)
 Method to set the diffuse color of a Primitive.
 
void setPrimitiveColor (const std::vector< uint > &UUIDs, const helios::RGBcolor &color)
void setPrimitiveColor (const std::vector< uint > &UUIDs, const helios::RGBcolor &color)
 Method to set the diffuse color of a Primitive for a vector of UUIDs.
 
void setPrimitiveColor (uint UUID, const helios::RGBAcolor &color)
void setPrimitiveColor (uint UUID, const helios::RGBAcolor &color)
 Method to set the diffuse color of a Primitive with transparency.
 
void setPrimitiveColor (const std::vector< uint > &UUIDs, const helios::RGBAcolor &color)
void setPrimitiveColor (const std::vector< uint > &UUIDs, const helios::RGBAcolor &color)
 Method to set the diffuse color of a Primitive with transparency for a vector of UUIDs.
 
std::string getPrimitiveTextureFile (uint UUID) const
std::string getPrimitiveTextureFile (uint UUID) const
 Get the path to texture map file for primitive. If primitive does not have a texture map, the result will be an empty string.
 
void setPrimitiveTextureFile (uint UUID, const std::string &texturefile)
void setPrimitiveTextureFile (uint UUID, const std::string &texturefile)
 Set the texture map file for a primitive.
 
helios::int2 getPrimitiveTextureSize (uint UUID) const
helios::int2 getPrimitiveTextureSize (uint UUID) const
 Get the size (number of pixels) of primitive texture map image.
 
std::vector< vec2getPrimitiveTextureUV (uint UUID) const
std::vector< vec2getPrimitiveTextureUV (uint UUID) const
 Get u-v texture coordinates at primitive vertices.
 
bool primitiveTextureHasTransparencyChannel (uint UUID) const
bool primitiveTextureHasTransparencyChannel (uint UUID) const
 Check if primitive texture map has a transparency channel.
 
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData (uint UUID) const
const std::vector< std::vector< bool > > * getPrimitiveTextureTransparencyData (uint UUID) const
 Get the transparency channel pixel data from primitive texture map. If transparency channel does not exist, an error will be thrown.
 
void overridePrimitiveTextureColor (uint UUID)
void overridePrimitiveTextureColor (uint UUID)
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void overridePrimitiveTextureColor (const std::vector< uint > &UUIDs)
void overridePrimitiveTextureColor (const std::vector< uint > &UUIDs)
 Override the color in the texture map for multiple primitives, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void usePrimitiveTextureColor (uint UUID)
void usePrimitiveTextureColor (uint UUID)
 Use the texture map to color the primitive rather than the constant RGB color. This is function reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
void usePrimitiveTextureColor (const std::vector< uint > &UUIDs)
void usePrimitiveTextureColor (const std::vector< uint > &UUIDs)
 Use the texture map to color the primitives rather than the constant RGB color. This is function reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
bool isPrimitiveTextureColorOverridden (uint UUID) const
bool isPrimitiveTextureColorOverridden (uint UUID) const
 Check if color of texture map is overridden by the diffuse R-G-B color of the primitive.
 
void printPrimitiveInfo (uint UUID) const
void printPrimitiveInfo (uint UUID) const
 Prints primitive properties to console (useful for debugging purposes)
 
void setObjectData (uint objID, const char *label, const int &data)
void setObjectData (uint objID, const char *label, const int &data)
 Add data value (int) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const uint &data)
void setObjectData (uint objID, const char *label, const uint &data)
 Add data value (uint) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const float &data)
void setObjectData (uint objID, const char *label, const float &data)
 Add data value (float) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const double &data)
void setObjectData (uint objID, const char *label, const double &data)
 Add data value (double) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const helios::vec2 &data)
void setObjectData (uint objID, const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const helios::vec3 &data)
void setObjectData (uint objID, const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const helios::vec4 &data)
void setObjectData (uint objID, const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const helios::int2 &data)
void setObjectData (uint objID, const char *label, const helios::int2 &data)
 Add data value (int2) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const helios::int3 &data)
void setObjectData (uint objID, const char *label, const helios::int3 &data)
 Add data value (int3) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const helios::int4 &data)
void setObjectData (uint objID, const char *label, const helios::int4 &data)
 Add data value (int4) associated with a compound object.
 
void setObjectData (uint objID, const char *label, const std::string &data)
void setObjectData (uint objID, const char *label, const std::string &data)
 Add data value (string) associated with a compound object.
 
void setObjectData (uint objIDs, const char *label, HeliosDataType type, uint size, void *data)
void setObjectData (uint objIDs, const char *label, HeliosDataType type, uint size, void *data)
 Add data associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const int &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const int &data)
 Add data value (int) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const uint &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const uint &data)
 Add data value (uint) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const float &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const float &data)
 Add data value (float) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const double &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const double &data)
 Add data value (double) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::vec2 &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::vec3 &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::vec4 &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::int2 &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::int2 &data)
 Add data value (int2) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::int3 &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::int3 &data)
 Add data value (int3) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::int4 &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const helios::int4 &data)
 Add data value (int4) associated with a compound object.
 
void setObjectData (const std::vector< uint > &objIDs, const char *label, const std::string &data)
void setObjectData (const std::vector< uint > &objIDs, const char *label, const std::string &data)
 Add data value (string) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const int &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const int &data)
 Add data value (int) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const uint &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const uint &data)
 Add data value (uint) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const float &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const float &data)
 Add data value (float) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const double &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const double &data)
 Add data value (double) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec2 &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec3 &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec4 &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int2 &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int2 &data)
 Add data value (int2) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int3 &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int3 &data)
 Add data value (int3) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int4 &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int4 &data)
 Add data value (int4) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const std::string &data)
void setObjectData (const std::vector< std::vector< uint > > &objIDs, const char *label, const std::string &data)
 Add data value (string) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const int &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const int &data)
 Add data value (int) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const uint &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const uint &data)
 Add data value (uint) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const float &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const float &data)
 Add data value (float) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const double &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const double &data)
 Add data value (double) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec2 &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec3 &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec4 &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int2 &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int2 &data)
 Add data value (int2) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int3 &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int3 &data)
 Add data value (int3) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int4 &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int4 &data)
 Add data value (int4) associated with a compound object.
 
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const std::string &data)
void setObjectData (const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const std::string &data)
 Add data value (string) associated with a compound object.
 
void getObjectData (uint objID, const char *label, int &data) const
void getObjectData (uint objID, const char *label, int &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< int > &data) const
void getObjectData (uint objID, const char *label, std::vector< int > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, uint &data) const
void getObjectData (uint objID, const char *label, uint &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< uint > &data) const
void getObjectData (uint objID, const char *label, std::vector< uint > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, float &data) const
void getObjectData (uint objID, const char *label, float &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< float > &data) const
void getObjectData (uint objID, const char *label, std::vector< float > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, double &data) const
void getObjectData (uint objID, const char *label, double &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< double > &data) const
void getObjectData (uint objID, const char *label, std::vector< double > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, vec2 &data) const
void getObjectData (uint objID, const char *label, vec2 &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< vec2 > &data) const
void getObjectData (uint objID, const char *label, std::vector< vec2 > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, vec3 &data) const
void getObjectData (uint objID, const char *label, vec3 &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< vec3 > &data) const
void getObjectData (uint objID, const char *label, std::vector< vec3 > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, vec4 &data) const
void getObjectData (uint objID, const char *label, vec4 &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< vec4 > &data) const
void getObjectData (uint objID, const char *label, std::vector< vec4 > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, int2 &data) const
void getObjectData (uint objID, const char *label, int2 &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< int2 > &data) const
void getObjectData (uint objID, const char *label, std::vector< int2 > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, int3 &data) const
void getObjectData (uint objID, const char *label, int3 &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< int3 > &data) const
void getObjectData (uint objID, const char *label, std::vector< int3 > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, int4 &data) const
void getObjectData (uint objID, const char *label, int4 &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< int4 > &data) const
void getObjectData (uint objID, const char *label, std::vector< int4 > &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::string &data) const
void getObjectData (uint objID, const char *label, std::string &data) const
 Get data associated with a compound object.
 
void getObjectData (uint objID, const char *label, std::vector< std::string > &data) const
void getObjectData (uint objID, const char *label, std::vector< std::string > &data) const
 Get data associated with a compound object.
 
HeliosDataType getObjectDataType (uint objID, const char *label) const
HeliosDataType getObjectDataType (uint objID, const char *label) const
 Get the Helios data type of primitive data.
 
uint getObjectDataSize (uint objID, const char *label) const
uint getObjectDataSize (uint objID, const char *label) const
 Get the size/length of primitive data.
 
bool doesObjectDataExist (uint objID, const char *label) const
bool doesObjectDataExist (uint objID, const char *label) const
 Check if primitive data 'label' exists.
 
void clearObjectData (uint objID, const char *label)
void clearObjectData (uint objID, const char *label)
 Clear primitive data for a single primitive based on its objID.
 
void clearObjectData (const std::vector< uint > &objIDs, const char *label)
void clearObjectData (const std::vector< uint > &objIDs, const char *label)
 Clear primitive data for multiple primitives based on a vector of objIDs.
 
bool areObjectPrimitivesComplete (uint objID) const
bool areObjectPrimitivesComplete (uint objID) const
 Method to query whether all object primitives are in tact.
 
void cleanDeletedObjectIDs (std::vector< uint > &objIDs) const
void cleanDeletedObjectIDs (std::vector< uint > &objIDs) const
 Delete Object IDs from vector if objects no longer exist (1D vector)
 
void cleanDeletedObjectIDs (std::vector< std::vector< uint > > &objIDs) const
void cleanDeletedObjectIDs (std::vector< std::vector< uint > > &objIDs) const
 Delete Object IDs from vector if objects no longer exist (2D vector)
 
void cleanDeletedObjectIDs (std::vector< std::vector< std::vector< uint > > > &objIDs) const
void cleanDeletedObjectIDs (std::vector< std::vector< std::vector< uint > > > &objIDs) const
 Delete Object IDs from vector if objects no longer exist (3D vector)
 
void setGlobalData (const char *label, const int &data)
void setGlobalData (const char *label, const int &data)
 Add global data value (int)
 
void setGlobalData (const char *label, const uint &data)
void setGlobalData (const char *label, const uint &data)
 Add global data value (uint)
 
void setGlobalData (const char *label, const float &data)
void setGlobalData (const char *label, const float &data)
 Add global data value (float)
 
void setGlobalData (const char *label, const double &data)
void setGlobalData (const char *label, const double &data)
 Add global data value (double)
 
void setGlobalData (const char *label, const helios::vec2 &data)
void setGlobalData (const char *label, const helios::vec2 &data)
 Add global data value (vec2)
 
void setGlobalData (const char *label, const helios::vec3 &data)
void setGlobalData (const char *label, const helios::vec3 &data)
 Add global data value (vec3)
 
void setGlobalData (const char *label, const helios::vec4 &data)
void setGlobalData (const char *label, const helios::vec4 &data)
 Add global data value (vec4)
 
void setGlobalData (const char *label, const helios::int2 &data)
void setGlobalData (const char *label, const helios::int2 &data)
 Add global data value (int2)
 
void setGlobalData (const char *label, const helios::int3 &data)
void setGlobalData (const char *label, const helios::int3 &data)
 Add global data value (int3)
 
void setGlobalData (const char *label, const helios::int4 &data)
void setGlobalData (const char *label, const helios::int4 &data)
 Add global data value (int4)
 
void setGlobalData (const char *label, const std::string &data)
void setGlobalData (const char *label, const std::string &data)
 Add global data value (string)
 
void setGlobalData (const char *label, HeliosDataType type, size_t size, void *data)
void setGlobalData (const char *label, HeliosDataType type, size_t size, void *data)
 Add global data value (any type)
 
void renameGlobalData (const char *old_label, const char *new_label)
void renameGlobalData (const char *old_label, const char *new_label)
 Rename global data.
 
void duplicateGlobalData (const char *old_label, const char *new_label)
void duplicateGlobalData (const char *old_label, const char *new_label)
 Make a copy of global data.
 
void clearGlobalData (const char *label)
void clearGlobalData (const char *label)
 Delete/clear global data.
 
void getGlobalData (const char *label, int &data) const
void getGlobalData (const char *label, int &data) const
 Get global data value (scalar integer)
 
void getGlobalData (const char *label, std::vector< int > &data) const
void getGlobalData (const char *label, std::vector< int > &data) const
 Get global data (array of integers)
 
void getGlobalData (const char *label, uint &data) const
void getGlobalData (const char *label, uint &data) const
 Get global data value (scalar uint)
 
void getGlobalData (const char *label, std::vector< uint > &data) const
void getGlobalData (const char *label, std::vector< uint > &data) const
 Get global data (array of uint's)
 
void getGlobalData (const char *label, float &data) const
void getGlobalData (const char *label, float &data) const
 Get global data value (scalar float)
 
void getGlobalData (const char *label, std::vector< float > &data) const
void getGlobalData (const char *label, std::vector< float > &data) const
 Get global data (array of floats)
 
void getGlobalData (const char *label, double &data) const
void getGlobalData (const char *label, double &data) const
 Get global data value (scalar double)
 
void getGlobalData (const char *label, std::vector< double > &data) const
void getGlobalData (const char *label, std::vector< double > &data) const
 Get global data (array of doubles)
 
void getGlobalData (const char *label, helios::vec2 &data) const
void getGlobalData (const char *label, helios::vec2 &data) const
 Get global data value (scalar vec2)
 
void getGlobalData (const char *label, std::vector< helios::vec2 > &data) const
void getGlobalData (const char *label, std::vector< helios::vec2 > &data) const
 Get global data (array of vec2's)
 
void getGlobalData (const char *label, helios::vec3 &data) const
void getGlobalData (const char *label, helios::vec3 &data) const
 Get global data value (scalar vec3)
 
void getGlobalData (const char *label, std::vector< helios::vec3 > &data) const
void getGlobalData (const char *label, std::vector< helios::vec3 > &data) const
 Get global data (array of vec3's)
 
void getGlobalData (const char *label, helios::vec4 &data) const
void getGlobalData (const char *label, helios::vec4 &data) const
 Get global data value (scalar vec4)
 
void getGlobalData (const char *label, std::vector< helios::vec4 > &data) const
void getGlobalData (const char *label, std::vector< helios::vec4 > &data) const
 Get global data (array of vec4's)
 
void getGlobalData (const char *label, helios::int2 &data) const
void getGlobalData (const char *label, helios::int2 &data) const
 Get global data value (scalar int2)
 
void getGlobalData (const char *label, std::vector< helios::int2 > &data) const
void getGlobalData (const char *label, std::vector< helios::int2 > &data) const
 Get global data (array of int2's)
 
void getGlobalData (const char *label, helios::int3 &data) const
void getGlobalData (const char *label, helios::int3 &data) const
 Get global data value (scalar int3)
 
void getGlobalData (const char *label, std::vector< helios::int3 > &data) const
void getGlobalData (const char *label, std::vector< helios::int3 > &data) const
 Get global data (array of int3's)
 
void getGlobalData (const char *label, helios::int4 &data) const
void getGlobalData (const char *label, helios::int4 &data) const
 Get global data value (scalar int4)
 
void getGlobalData (const char *label, std::vector< helios::int4 > &data) const
void getGlobalData (const char *label, std::vector< helios::int4 > &data) const
 Get global data (array of int4's)
 
void getGlobalData (const char *label, std::string &data) const
void getGlobalData (const char *label, std::string &data) const
 Get global data value (scalar string)
 
void getGlobalData (const char *label, std::vector< std::string > &data) const
void getGlobalData (const char *label, std::vector< std::string > &data) const
 Get global data (array of strings)
 
HeliosDataType getGlobalDataType (const char *label) const
HeliosDataType getGlobalDataType (const char *label) const
 Get the Helios data type of global data.
 
size_t getGlobalDataSize (const char *label) const
size_t getGlobalDataSize (const char *label) const
 Get the size/length of global data.
 
std::vector< std::string > listGlobalData () const
std::vector< std::string > listGlobalData () const
 List the labels for all global data in the Context.
 
bool doesGlobalDataExist (const char *label) const
bool doesGlobalDataExist (const char *label) const
 Check if global data 'label' exists.
 
void incrementGlobalData (const char *label, int increment)
void incrementGlobalData (const char *label, int increment)
 Increase value of global data (int) by some value.
 
void incrementGlobalData (const char *label, uint increment)
void incrementGlobalData (const char *label, uint increment)
 Increase value of global data (uint) by some value.
 
void incrementGlobalData (const char *label, float increment)
void incrementGlobalData (const char *label, float increment)
 Increase value of global data (float) by some value.
 
void incrementGlobalData (const char *label, double increment)
void incrementGlobalData (const char *label, double increment)
 Increase value of global data (double) by some value.
 
CompoundObjectgetObjectPointer (uint ObjID) const
CompoundObjectgetObjectPointer (uint ObjID) const
 Get a pointer to a Compound Object.
 
uint getObjectCount () const
uint getObjectCount () const
 Get the total number of objects that have been created in the Context.
 
bool doesObjectExist (uint ObjID) const
bool doesObjectExist (uint ObjID) const
 Check whether Compound Object exists in the Context.
 
std::vector< uint > getAllObjectIDs () const
std::vector< uint > getAllObjectIDs () const
 Get the IDs for all Compound Objects in the Context.
 
void deleteObject (uint ObjID)
void deleteObject (uint ObjID)
 Delete a single Compound Object from the context.
 
void deleteObject (const std::vector< uint > &ObjIDs)
void deleteObject (const std::vector< uint > &ObjIDs)
 Delete a group of Compound Objects from the context.
 
uint copyObject (uint ObjID)
uint copyObject (uint ObjID)
 Make a copy of a Compound Objects from the context.
 
std::vector< uint > copyObject (const std::vector< uint > &ObjIDs)
std::vector< uint > copyObject (const std::vector< uint > &ObjIDs)
 Make a copy of a group of Compound Objects from the context.
 
void copyObjectData (uint source_objID, uint destination_objID)
void copyObjectData (uint source_objID, uint destination_objID)
 copy all object data from one compound object to another
 
void duplicateObjectData (uint objID, const char *old_label, const char *new_label)
void duplicateObjectData (uint objID, const char *old_label, const char *new_label)
 Duplicate/copy existing object data.
 
void renameObjectData (uint objID, const char *old_label, const char *new_label)
void renameObjectData (uint objID, const char *old_label, const char *new_label)
 Rename existing object data.
 
std::vector< uint > filterObjectsByData (const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const
std::vector< uint > filterObjectsByData (const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const
 Get a vector of object IDs that meet filtering criteria based on object data.
 
void translateObject (uint ObjID, const vec3 &shift)
void translateObject (uint ObjID, const vec3 &shift)
 Translate a single compound object.
 
void translateObject (const std::vector< uint > &ObjIDs, const vec3 &shift)
void translateObject (const std::vector< uint > &ObjIDs, const vec3 &shift)
 Translate multiple compound objects based on a vector of UUIDs.
 
void rotateObject (uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
void rotateObject (uint ObjID, float rotation_radians, const char *rotation_axis_xyz)
 Rotate a single compound object about the x, y, or z axis.
 
void rotateObject (const std::vector< uint > &ObjIDs, float rotation_radians, const char *rotation_axis_xyz)
void rotateObject (const std::vector< uint > &ObjIDs, float rotation_radians, const char *rotation_axis_xyz)
 Rotate multiple compound objects about the x, y, or z axis based on a vector of UUIDs.
 
void rotateObject (uint ObjID, float rotation_radians, const vec3 &rotation_axis_vector)
void rotateObject (uint ObjID, float rotation_radians, const vec3 &rotation_axis_vector)
 Rotate a single compound object about an arbitrary axis passing through the origin.
 
void rotateObject (const std::vector< uint > &ObjIDs, float rotation_radians, const vec3 &rotation_axis_vector)
void rotateObject (const std::vector< uint > &ObjIDs, float rotation_radians, const vec3 &rotation_axis_vector)
 Rotate multiple compound objects about an arbitrary axis passing through the origin based on a vector of UUIDs.
 
void rotateObject (uint ObjID, float rotation_radians, const vec3 &rotation_origin, const vec3 &rotation_axis_vector)
void rotateObject (uint ObjID, float rotation_radians, const vec3 &rotation_origin, const vec3 &rotation_axis_vector)
 Rotate a single compound object about an arbitrary line (not necessarily passing through the origin)
 
void rotateObject (const std::vector< uint > &ObjIDs, float rotation_radians, const vec3 &rotation_origin, const vec3 &rotation_axis_vector)
void rotateObject (const std::vector< uint > &ObjIDs, float rotation_radians, const vec3 &rotation_origin, const vec3 &rotation_axis_vector)
 Rotate multiple compound objects about an arbitrary line (not necessarily passing through the origin) based on a vector of UUIDs.
 
void scaleObject (uint ObjID, const helios::vec3 &scalefact)
void scaleObject (uint ObjID, const helios::vec3 &scalefact)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleObject (const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact)
void scaleObject (const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleObjectAboutCenter (uint ObjID, const helios::vec3 &scalefact)
void scaleObjectAboutCenter (uint ObjID, const helios::vec3 &scalefact)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleObjectAboutCenter (const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact)
void scaleObjectAboutCenter (const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleObjectAboutPoint (uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)
void scaleObjectAboutPoint (uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleObjectAboutPoint (const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact, const helios::vec3 &point)
void scaleObjectAboutPoint (const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
std::vector< uint > getObjectPrimitiveUUIDs (uint ObjID) const
std::vector< uint > getObjectPrimitiveUUIDs (uint ObjID) const
 Get primitive UUIDs associated with compound object (single object ID input)
 
std::vector< uint > getObjectPrimitiveUUIDs (const std::vector< uint > &ObjIDs) const
std::vector< uint > getObjectPrimitiveUUIDs (const std::vector< uint > &ObjIDs) const
 Get primitive UUIDs associated with compound objects (1D vector of object IDs input)
 
std::vector< uint > getObjectPrimitiveUUIDs (const std::vector< std::vector< uint > > &ObjIDs) const
std::vector< uint > getObjectPrimitiveUUIDs (const std::vector< std::vector< uint > > &ObjIDs) const
 Get primitive UUIDs associated with compound objects (2D vector of object IDs input)
 
helios::ObjectType getObjectType (uint ObjID) const
helios::ObjectType getObjectType (uint ObjID) const
 Get an enumeration specifying the type of the object.
 
TilegetTileObjectPointer (uint ObjID) const
TilegetTileObjectPointer (uint ObjID) const
 Get a pointer to a Tile Compound Object.
 
float getTileObjectAreaRatio (uint ObjectID) const
float getTileObjectAreaRatio (uint ObjectID) const
 Get the area ratio of a tile object (total object area / sub-patch area)
 
std::vector< float > getTileObjectAreaRatio (const std::vector< uint > &ObjectID) const
std::vector< float > getTileObjectAreaRatio (const std::vector< uint > &ObjectID) const
 Get the area ratio of a multiple tile objects (total object area / sub-patch area)
 
void setTileObjectSubdivisionCount (const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)
void setTileObjectSubdivisionCount (const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)
 Change the subdivision count of a tile object.
 
void setTileObjectSubdivisionCount (const std::vector< uint > &ObjectIDs, float area_ratio)
void setTileObjectSubdivisionCount (const std::vector< uint > &ObjectIDs, float area_ratio)
 change the subdivisions of a tile object
 
helios::vec3 getTileObjectCenter (uint ObjID) const
helios::vec3 getTileObjectCenter (uint ObjID) const
 Get the Cartesian (x,y,z) center position of a tile object.
 
helios::vec2 getTileObjectSize (uint ObjID) const
helios::vec2 getTileObjectSize (uint ObjID) const
 get the size of a tile object from the context
 
helios::int2 getTileObjectSubdivisionCount (uint ObjID) const
helios::int2 getTileObjectSubdivisionCount (uint ObjID) const
 get the subdivision count of a tile object from the context
 
helios::vec3 getTileObjectNormal (uint ObjID) const
helios::vec3 getTileObjectNormal (uint ObjID) const
 get the normal of a tile object from the context
 
std::vector< helios::vec2getTileObjectTextureUV (uint ObjID) const
std::vector< helios::vec2getTileObjectTextureUV (uint ObjID) const
 get the texture UV coordinates of a tile object from the context
 
std::vector< helios::vec3getTileObjectVertices (uint ObjID) const
std::vector< helios::vec3getTileObjectVertices (uint ObjID) const
 get the vertices of a tile object from the context
 
SpheregetSphereObjectPointer (uint ObjID) const
SpheregetSphereObjectPointer (uint ObjID) const
 Get a pointer to a Sphere Compound Object.
 
helios::vec3 getSphereObjectCenter (uint ObjID) const
helios::vec3 getSphereObjectCenter (uint ObjID) const
 get the center of a Sphere object from the context
 
helios::vec3 getSphereObjectRadius (uint ObjID) const
helios::vec3 getSphereObjectRadius (uint ObjID) const
 get the radius of a Sphere object from the context
 
uint getSphereObjectSubdivisionCount (uint ObjID) const
uint getSphereObjectSubdivisionCount (uint ObjID) const
 get the subdivision count of a Sphere object from the context
 
float getSphereObjectVolume (uint ObjID) const
float getSphereObjectVolume (uint ObjID) const
 get the volume of a Sphere object from the context
 
TubegetTubeObjectPointer (uint ObjID) const
TubegetTubeObjectPointer (uint ObjID) const
 Get a pointer to a Tube Compound Object.
 
uint getTubeObjectSubdivisionCount (uint ObjectID) const
uint getTubeObjectSubdivisionCount (uint ObjectID) const
 get the subdivision count of a Tube object from the context
 
std::vector< helios::vec3getTubeObjectNodes (uint ObjID) const
std::vector< helios::vec3getTubeObjectNodes (uint ObjID) const
 get the nodes of a Tube object from the context
 
std::vector< float > getTubeObjectNodeRadii (uint ObjID) const
std::vector< float > getTubeObjectNodeRadii (uint ObjID) const
 get the node radii of a Tube object from the context
 
std::vector< RGBcolorgetTubeObjectNodeColors (uint ObjID) const
std::vector< RGBcolorgetTubeObjectNodeColors (uint ObjID) const
 get the node colors of a Tube object from the context
 
float getTubeObjectVolume (uint ObjID) const
float getTubeObjectVolume (uint ObjID) const
 get the volume of a Tube object from the context
 
float getTubeObjectSegmentVolume (uint ObjID, uint segment_index) const
float getTubeObjectSegmentVolume (uint ObjID, uint segment_index) const
 get the volume of a segment within a Tube object
 
void appendTubeSegment (uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)
void appendTubeSegment (uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)
 Append a tube segment to an existing tube object.
 
void appendTubeSegment (uint ObjID, const helios::vec3 &node_position, float node_radius, const char *texturefile, const helios::vec2 &textureuv_ufrac)
void appendTubeSegment (uint ObjID, const helios::vec3 &node_position, float node_radius, const char *texturefile, const helios::vec2 &textureuv_ufrac)
 Append an additional segment to the existing tube object.
 
void scaleTubeGirth (uint ObjID, float scale_factor)
void scaleTubeGirth (uint ObjID, float scale_factor)
 Scale the girth for all nodes of a tube object.
 
void setTubeRadii (uint ObjID, const std::vector< float > &node_radii)
void setTubeRadii (uint ObjID, const std::vector< float > &node_radii)
 Set tube radii at each segment node.
 
void scaleTubeLength (uint ObjID, float scale_factor)
void scaleTubeLength (uint ObjID, float scale_factor)
 Scale the length of a tube object by an arbitrary factor for all tube nodes.
 
void setTubeNodes (uint ObjID, const std::vector< helios::vec3 > &node_xyz)
void setTubeNodes (uint ObjID, const std::vector< helios::vec3 > &node_xyz)
 Set tube vertex coordinates at each segment node.
 
BoxgetBoxObjectPointer (uint ObjID) const
BoxgetBoxObjectPointer (uint ObjID) const
 Get a pointer to a Box Compound Object.
 
helios::vec3 getBoxObjectCenter (uint ObjID) const
helios::vec3 getBoxObjectCenter (uint ObjID) const
 get the center of a Box object from the context
 
helios::vec3 getBoxObjectSize (uint ObjID) const
helios::vec3 getBoxObjectSize (uint ObjID) const
 get the size of a Box object from the context
 
helios::int3 getBoxObjectSubdivisionCount (uint ObjID) const
helios::int3 getBoxObjectSubdivisionCount (uint ObjID) const
 get the subdivision count of a Box object from the context
 
float getBoxObjectVolume (uint ObjID) const
float getBoxObjectVolume (uint ObjID) const
 get the volume of a Box object from the context
 
DiskgetDiskObjectPointer (uint ObjID) const
DiskgetDiskObjectPointer (uint ObjID) const
 Get a pointer to a Disk Compound Object.
 
helios::vec3 getDiskObjectCenter (uint ObjID) const
helios::vec3 getDiskObjectCenter (uint ObjID) const
 get the center of a Disk object from the context
 
helios::vec2 getDiskObjectSize (uint ObjID) const
helios::vec2 getDiskObjectSize (uint ObjID) const
 get the size of a Disk object from the context
 
uint getDiskObjectSubdivisionCount (uint ObjID) const
uint getDiskObjectSubdivisionCount (uint ObjID) const
 get the subdivision count of a Disk object from the context
 
PolymeshgetPolymeshObjectPointer (uint ObjID) const
PolymeshgetPolymeshObjectPointer (uint ObjID) const
 Get a pointer to a Polygon Mesh Compound Object.
 
float getPolymeshObjectVolume (uint ObjID) const
float getPolymeshObjectVolume (uint ObjID) const
 Get the volume of a Polygon Mesh object from the context.
 
ConegetConeObjectPointer (uint ObjID) const
ConegetConeObjectPointer (uint ObjID) const
 Get a pointer to a Cone Compound Object.
 
uint getConeObjectSubdivisionCount (uint ObjID) const
uint getConeObjectSubdivisionCount (uint ObjID) const
 get the subdivision count of a Cone object from the context
 
std::vector< helios::vec3getConeObjectNodes (uint ObjID) const
std::vector< helios::vec3getConeObjectNodes (uint ObjID) const
 get the nodes of a Cone object from the context
 
std::vector< float > getConeObjectNodeRadii (uint ObjID) const
std::vector< float > getConeObjectNodeRadii (uint ObjID) const
 get the node radii of a Cone object from the context
 
helios::vec3 getConeObjectNode (uint ObjID, int number) const
helios::vec3 getConeObjectNode (uint ObjID, int number) const
 get a node of a Cone object from the context
 
float getConeObjectNodeRadius (uint ObjID, int number) const
float getConeObjectNodeRadius (uint ObjID, int number) const
 get a node radius of a Cone object from the context
 
helios::vec3 getConeObjectAxisUnitVector (uint ObjID) const
helios::vec3 getConeObjectAxisUnitVector (uint ObjID) const
 get the axis unit vector of a Cone object from the context
 
float getConeObjectLength (uint ObjID) const
float getConeObjectLength (uint ObjID) const
 get the length of a Cone object from the context
 
float getConeObjectVolume (uint ObjID) const
float getConeObjectVolume (uint ObjID) const
 get the volume of a Cone object from the context
 
uint addTileObject (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
uint addTileObject (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
 Add a patch that is subdivided into a regular grid of sub-patches (tiled)
 
uint addTileObject (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color)
uint addTileObject (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color)
 Add a patch that is subdivided into a regular grid of sub-patches (tiled)
 
uint addTileObject (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char *texturefile)
uint addTileObject (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char *texturefile)
 Add a patch that is subdivided into a regular grid of sub-patches (tiled)
 
uint addSphereObject (uint Ndivs, const vec3 &center, float radius)
uint addSphereObject (uint Ndivs, const vec3 &center, float radius)
 Add a spherical compound object to the Context.
 
uint addSphereObject (uint Ndivs, const vec3 &center, float radius, const RGBcolor &color)
uint addSphereObject (uint Ndivs, const vec3 &center, float radius, const RGBcolor &color)
 Add a spherical compound object to the Context.
 
uint addSphereObject (uint Ndivs, const vec3 &center, float radius, const char *texturefile)
uint addSphereObject (uint Ndivs, const vec3 &center, float radius, const char *texturefile)
 Add a spherical compound object to the Context colored by texture map.
 
uint addSphereObject (uint Ndivs, const vec3 &center, const vec3 &radius)
uint addSphereObject (uint Ndivs, const vec3 &center, const vec3 &radius)
 Add a spherical/ellipsoidal compound object to the Context.
 
uint addSphereObject (uint Ndivs, const vec3 &center, const vec3 &radius, const RGBcolor &color)
uint addSphereObject (uint Ndivs, const vec3 &center, const vec3 &radius, const RGBcolor &color)
 Add a spherical/ellipsoidal compound object to the Context.
 
uint addSphereObject (uint Ndivs, const vec3 &center, const vec3 &radius, const char *texturefile)
uint addSphereObject (uint Ndivs, const vec3 &center, const vec3 &radius, const char *texturefile)
 Add a spherical/ellipsoidal compound object to the Context colored by texture map.
 
uint addTubeObject (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
uint addTubeObject (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
 Add a 3D tube compound object to the Context.
 
uint addTubeObject (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const std::vector< RGBcolor > &color)
uint addTubeObject (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const std::vector< RGBcolor > &color)
 Add a 3D tube compound object to the Context and specify its diffuse color.
 
uint addTubeObject (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile)
uint addTubeObject (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile)
 Add a 3D tube compound object to the Context that is texture-mapped. Texture is mapped to span the entire tube.
 
uint addTubeObject (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile, const std::vector< float > &textureuv_vfrac)
uint addTubeObject (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile, const std::vector< float > &textureuv_vfrac)
 Add a 3D tube compound object to the Context that is texture-mapped.
 
uint addBoxObject (const vec3 &center, const vec3 &size, const int3 &subdiv)
uint addBoxObject (const vec3 &center, const vec3 &size, const int3 &subdiv)
 Add a rectangular prism tessellated with Patch primitives.
 
uint addBoxObject (const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color)
uint addBoxObject (const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color)
 Add a rectangular prism tessellated with Patch primitives.
 
uint addBoxObject (const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile)
uint addBoxObject (const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile)
 Add a rectangular prism tessellated with Patch primitives.
 
uint addBoxObject (const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals)
uint addBoxObject (const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals)
 Add a rectangular prism tessellated with Patch primitives.
 
uint addBoxObject (vec3 center, const vec3 &size, const int3 &subdiv, const char *texturefile, bool reverse_normals)
uint addBoxObject (vec3 center, const vec3 &size, const int3 &subdiv, const char *texturefile, bool reverse_normals)
 Add a rectangular prism tessellated with Patch primitives.
 
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
 Add new Disk geometric primitive to the Context given its center, and size.
 
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)
 Add new Disk Compound Object.
 
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
 Add new Disk Compound Object.
 
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
 Add new Disk Compound Object.
 
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)
uint addDiskObject (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)
 Add new Disk Compound Object.
 
uint addDiskObject (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
uint addDiskObject (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
 Add new Disk Compound Object.
 
uint addDiskObject (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
uint addDiskObject (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
 Add new Disk Compound Object.
 
uint addDiskObject (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texturefile)
uint addDiskObject (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texturefile)
 Add new Disk Compound Object.
 
uint addPolymeshObject (const std::vector< uint > &UUIDs)
uint addPolymeshObject (const std::vector< uint > &UUIDs)
 Add new Polymesh Compound Object.
 
uint addConeObject (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
uint addConeObject (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
 Add a 3D cone compound object to the Context.
 
uint addConeObject (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const RGBcolor &color)
uint addConeObject (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const RGBcolor &color)
 Add a 3D cone compound object to the Context and specify its diffuse color.
 
uint addConeObject (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char *texturefile)
uint addConeObject (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char *texturefile)
 Add a 3D cone compound object to the Context that is texture-mapped.
 
std::vector< uint > addSphere (uint Ndivs, const vec3 &center, float radius)
std::vector< uint > addSphere (uint Ndivs, const vec3 &center, float radius)
 Add a spherical compound object to the Context.
 
std::vector< uint > addSphere (uint Ndivs, const vec3 &center, float radius, const RGBcolor &color)
std::vector< uint > addSphere (uint Ndivs, const vec3 &center, float radius, const RGBcolor &color)
 Add a spherical compound object to the Context.
 
std::vector< uint > addSphere (uint Ndivs, const vec3 &center, float radius, const char *texturefile)
std::vector< uint > addSphere (uint Ndivs, const vec3 &center, float radius, const char *texturefile)
 Add a spherical compound object to the Context colored by texture map.
 
std::vector< uint > addTile (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
std::vector< uint > addTile (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
 Add a patch that is subdivided into a regular grid of sub-patches (tiled)
 
std::vector< uint > addTile (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color)
std::vector< uint > addTile (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color)
 Add a patch that is subdivided into a regular grid of sub-patches (tiled)
 
std::vector< uint > addTile (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char *texturefile)
std::vector< uint > addTile (const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char *texturefile)
 Add a patch that is subdivided into a regular grid of sub-patches (tiled)
 
std::vector< uint > addTube (uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
std::vector< uint > addTube (uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
 Add a 3D tube compound object to the Context.
 
std::vector< uint > addTube (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const std::vector< RGBcolor > &color)
std::vector< uint > addTube (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const std::vector< RGBcolor > &color)
 Add a 3D tube compound object to the Context and specify its diffuse color.
 
std::vector< uint > addTube (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile)
std::vector< uint > addTube (uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile)
 Add a 3D tube compound object to the Context that is texture-mapped.
 
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv)
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv)
 Add a rectangular prism tessellated with Patch primitives.
 
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color)
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color)
 Add a rectangular prism tessellated with Patch primitives.
 
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile)
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile)
 Add a rectangular prism tessellated with Patch primitives.
 
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals)
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals)
 Add a rectangular prism tessellated with Patch primitives.
 
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile, bool reverse_normals)
std::vector< uint > addBox (const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile, bool reverse_normals)
 Add a rectangular prism tessellated with Patch primitives.
 
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
 Add new Disk geometric primitive to the Context given its center, and size.
 
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)
 Add new Disk geometric primitive.
 
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
 Add new Disk geometric primitive.
 
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
 Add new Disk geometric primitive.
 
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)
std::vector< uint > addDisk (uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)
 Add new Disk geometric primitive.
 
std::vector< uint > addDisk (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
std::vector< uint > addDisk (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)
 Add new Disk geometric primitive.
 
std::vector< uint > addDisk (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
std::vector< uint > addDisk (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)
 Add new Disk geometric primitive.
 
std::vector< uint > addDisk (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texturefile)
std::vector< uint > addDisk (const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texturefile)
 Add new Disk geometric primitive.
 
std::vector< uint > addCone (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
std::vector< uint > addCone (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
 Add a 3D cone to the Context.
 
std::vector< uint > addCone (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, RGBcolor &color)
std::vector< uint > addCone (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, RGBcolor &color)
 Add a 3D cone to the Context and specify its diffuse color.
 
std::vector< uint > addCone (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char *texturefile)
std::vector< uint > addCone (uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char *texturefile)
 Add a 3D cone to the Context that is texture-mapped.
 
void addTimeseriesData (const char *label, float value, const Date &date, const Time &time)
void addTimeseriesData (const char *label, float value, const Date &date, const Time &time)
 Add a data point to timeseries of data.
 
void setCurrentTimeseriesPoint (const char *label, uint index)
void setCurrentTimeseriesPoint (const char *label, uint index)
 Set the Context date and time by providing the index of a timeseries data point.
 
float queryTimeseriesData (const char *label, const Date &date, const Time &time) const
float queryTimeseriesData (const char *label, const Date &date, const Time &time) const
 Get a timeseries data point by specifying a date and time vector.
 
float queryTimeseriesData (const char *label) const
float queryTimeseriesData (const char *label) const
 Get a timeseries data point at the time currently set in the Context.
 
float queryTimeseriesData (const char *label, uint index) const
float queryTimeseriesData (const char *label, uint index) const
 Get a timeseries data point by index in the timeseries.
 
Time queryTimeseriesTime (const char *label, uint index) const
Time queryTimeseriesTime (const char *label, uint index) const
 Get the time associated with a timeseries data point.
 
Date queryTimeseriesDate (const char *label, uint index) const
Date queryTimeseriesDate (const char *label, uint index) const
 Get the date associated with a timeseries data point.
 
uint getTimeseriesLength (const char *label) const
uint getTimeseriesLength (const char *label) const
 Get the length of timeseries data.
 
bool doesTimeseriesVariableExist (const char *label) const
bool doesTimeseriesVariableExist (const char *label) const
 Query whether a timeseries variable exists.
 
std::vector< std::string > listTimeseriesVariables () const
std::vector< std::string > listTimeseriesVariables () const
 List all existing timeseries variables.
 
void loadTabularTimeseriesData (const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
void loadTabularTimeseriesData (const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
 Load tabular weather data from text file into timeseries.
 
void getDomainBoundingBox (helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
void getDomainBoundingBox (helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
 Get a box that bounds all primitives in the domain.
 
void getDomainBoundingBox (const std::vector< uint > &UUIDs, helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
void getDomainBoundingBox (const std::vector< uint > &UUIDs, helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const
 Get a box that bounds a subset of primitives.
 
void getDomainBoundingSphere (helios::vec3 &center, float &radius) const
void getDomainBoundingSphere (helios::vec3 &center, float &radius) const
 Get the center and radius of a sphere that bounds all primitives in the domain.
 
void getDomainBoundingSphere (const std::vector< uint > &UUIDs, helios::vec3 &center, float &radius) const
void getDomainBoundingSphere (const std::vector< uint > &UUIDs, helios::vec3 &center, float &radius) const
 Get the center and radius of a sphere that bounds a subset of primitives.
 
void cropDomainX (const vec2 &xbounds)
void cropDomainX (const vec2 &xbounds)
 Crop the domain in the x-direction such that all primitives lie within some specified x interval.
 
void cropDomainY (const vec2 &ybounds)
void cropDomainY (const vec2 &ybounds)
 Crop the domain in the y-direction such that all primitives lie within some specified y interval.
 
void cropDomainZ (const vec2 &zbounds)
void cropDomainZ (const vec2 &zbounds)
 Crop the domain in the z-direction such that all primitives lie within some specified z interval.
 
void cropDomain (std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
void cropDomain (std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
 Crop specified UUIDs such that they lie within some specified axis-aligned box.
 
void cropDomain (const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
void cropDomain (const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)
 Crop the domain such that all primitives lie within some specified axis-aligned box.
 
void colorPrimitiveByDataPseudocolor (const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors)
void colorPrimitiveByDataPseudocolor (const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors)
 Overwrite primitive color based on a pseudocolor mapping of primitive data values.
 
void colorPrimitiveByDataPseudocolor (const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors, float data_min, float data_max)
void colorPrimitiveByDataPseudocolor (const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors, float data_min, float data_max)
 Overwrite primitive color based on a pseudocolor mapping of primitive data values. Clamp to specified data range.
 
std::vector< uint > loadXML (const char *filename, bool quiet=false)
std::vector< uint > loadXML (const char *filename, bool quiet=false)
 Load inputs specified in an XML file.
 
std::vector< std::string > getLoadedXMLFiles ()
std::vector< std::string > getLoadedXMLFiles ()
 Get names of XML files that are currently loaded.
 
void writeXML (const char *filename, bool quiet=false) const
void writeXML (const char *filename, bool quiet=false) const
 Write Context geometry and data to XML file for all UUIDs in the context.
 
void writeXML (const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const
void writeXML (const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const
 Write Context geometry and data to XML file for a subset of UUIDs in the context.
 
void writeXML_byobject (const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const
void writeXML_byobject (const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const
 Write Context geometry and data to XML file for a subset of compound object IDs in the context.
 
void writePrimitiveData (std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const
void writePrimitiveData (std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const
 Write primitive data to an ASCII text file for all primitives in the Context.
 
void writePrimitiveData (std::string filename, const std::vector< std::string > &column_format, const std::vector< uint > &UUIDs, bool print_header=false) const
void writePrimitiveData (std::string filename, const std::vector< std::string > &column_format, const std::vector< uint > &UUIDs, bool print_header=false) const
 Write primitive data to an ASCII text file for selected primitives in the Context.
 
std::vector< uint > loadPLY (const char *filename, bool silent=false)
std::vector< uint > loadPLY (const char *filename, bool silent=false)
 Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no scaling or rotation applied.
 
std::vector< uint > loadPLY (const char *filename, const vec3 &origin, float height, const std::string &upaxis="YUP", bool silent=false)
std::vector< uint > loadPLY (const char *filename, const vec3 &origin, float height, const std::string &upaxis="YUP", bool silent=false)
 Load geometry contained in a Stanford polygon file (.ply)
 
std::vector< uint > loadPLY (const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const std::string &upaxis="YUP", bool silent=false)
std::vector< uint > loadPLY (const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const std::string &upaxis="YUP", bool silent=false)
 Load geometry contained in a Stanford polygon file (.ply)
 
std::vector< uint > loadPLY (const char *filename, const vec3 &origin, float height, const RGBcolor &default_color, const std::string &upaxis="YUP", bool silent=false)
std::vector< uint > loadPLY (const char *filename, const vec3 &origin, float height, const RGBcolor &default_color, const std::string &upaxis="YUP", bool silent=false)
 Load geometry contained in a Stanford polygon file (.ply)
 
std::vector< uint > loadPLY (const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const std::string &upaxis="YUP", bool silent=false)
std::vector< uint > loadPLY (const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const std::string &upaxis="YUP", bool silent=false)
 Load geometry contained in a Stanford polygon file (.ply)
 
void writePLY (const char *filename) const
void writePLY (const char *filename) const
 Write geometry in the Context to a Stanford polygon file (.ply)
 
std::vector< uint > loadOBJ (const char *filename, bool silent=false)
std::vector< uint > loadOBJ (const char *filename, bool silent=false)
 Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without any scaling or rotation applied.
 
std::vector< uint > loadOBJ (const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, bool silent=false)
std::vector< uint > loadOBJ (const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, bool silent=false)
 Load geometry contained in a Wavefront OBJ file (.obj)
 
std::vector< uint > loadOBJ (const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const char *upaxis, bool silent=false)
std::vector< uint > loadOBJ (const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const char *upaxis, bool silent=false)
 Load geometry contained in a Wavefront OBJ file (.obj)
 
std::vector< uint > loadOBJ (const char *filename, const vec3 &origin, const helios::vec3 &scale, const SphericalCoord &rotation, const RGBcolor &default_color, const char *upaxis, bool silent=false)
std::vector< uint > loadOBJ (const char *filename, const vec3 &origin, const helios::vec3 &scale, const SphericalCoord &rotation, const RGBcolor &default_color, const char *upaxis, bool silent=false)
 Load geometry contained in a Wavefront OBJ file (.obj)
 
void writeOBJ (const std::string &filename) const
void writeOBJ (const std::string &filename) const
 Write geometry in the Context to a Wavefront file (.obj)
 
void writeOBJ (const std::string &filename, const std::vector< uint > &UUIDs) const
void writeOBJ (const std::string &filename, const std::vector< uint > &UUIDs) const
 Write geometry in the Context to a Wavefront file (.obj) for a subset of UUIDs.
 
void writeOBJ (const std::string &filename, const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_dat_fields) const
void writeOBJ (const std::string &filename, const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_dat_fields) const
 Write geometry in the Context to a Wavefront file (.obj)
 
void setDate (int day, int month, int year)
void setDate (int day, int month, int year)
 Set simulation date by day, month, year.
 
void setDate (const Date &date)
void setDate (const Date &date)
 Set simulation date by Date vector.
 
void setDate (int Julian_day, int year)
void setDate (int Julian_day, int year)
 Set simulation date by Julian day.
 
helios::Date getDate () const
helios::Date getDate () const
 Get simulation date.
 
const char * getMonthString () const
const char * getMonthString () const
 Get a string corresponding to the month of the simulation date.
 
int getJulianDate () const
int getJulianDate () const
 Get simulation date by Julian day.
 
void setTime (int minute, int hour)
void setTime (int minute, int hour)
 Set simulation time.
 
void setTime (int second, int minute, int hour)
void setTime (int second, int minute, int hour)
 Set simulation time.
 
void setTime (const Time &time)
void setTime (const Time &time)
 Set simulation time using Time vector.
 
helios::Time getTime () const
helios::Time getTime () const
 Get the simulation time.
 
void setLocation (const helios::Location &location)
void setLocation (const helios::Location &location)
 Set the location of the simulation (latitude, longitude, and UTC offset)
 
helios::Location getLocation () const
helios::Location getLocation () const
 Get the location of the simulation (latitude, longitude, and UTC offset)
 
float randu ()
float randu ()
 Draw a random number from a uniform distribution between 0 and 1.
 
float randu (float min, float max)
float randu (float min, float max)
 Draw a random number from a uniform distribution with specified range.
 
int randu (int min, int max)
int randu (int min, int max)
 Draw a random number from a uniform distribution with specified range.
 
float randn ()
float randn ()
 Draw a random number from a normal distribution with mean = 0, stddev = 1.
 
float randn (float mean, float stddev)
float randn (float mean, float stddev)
 Draw a random number from a normal distribution with specified mean and standard deviation.
 
void duplicatePrimitiveData (const char *existing_data_label, const char *copy_data_label)
void duplicatePrimitiveData (const char *existing_data_label, const char *copy_data_label)
 Duplicate primitive data to create a copy of the primitive data with a new name/label.
 
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, float &mean) const
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, float &mean) const
 Calculate mean of primitive data values (float) for a subset of primitives.
 
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, double &mean) const
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, double &mean) const
 Calculate mean of primitive data values (double) for a subset of primitives.
 
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &mean) const
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &mean) const
 Calculate mean of primitive data values (vec2) for a subset of primitives.
 
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &mean) const
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &mean) const
 Calculate mean of primitive data values (vec3) for a subset of primitives.
 
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &mean) const
void calculatePrimitiveDataMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &mean) const
 Calculate mean of primitive data values (vec4) for a subset of primitives.
 
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const
 Calculate mean of primitive data values (float) for a subset of primitives, where each value in the mean calculation is weighted by the primitive's one-sided surface area.
 
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, double &awt_mean) const
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, double &awt_mean) const
 Calculate mean of primitive data values (double) for a subset of primitives, where each value in the mean calculation is weighted by the primitive's one-sided surface area.
 
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &awt_mean) const
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &awt_mean) const
 Calculate mean of primitive data values (vec2) for a subset of primitives, where each value in the mean calculation is weighted by the primitive's one-sided surface area.
 
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &awt_mean) const
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &awt_mean) const
 Calculate mean of primitive data values (vec2) for a subset of primitives, where each value in the mean calculation is weighted by the primitive's one-sided surface area.
 
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &awt_mean) const
void calculatePrimitiveDataAreaWeightedMean (const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &awt_mean) const
 Calculate mean of primitive data values (vec2) for a subset of primitives, where each value in the mean calculation is weighted by the primitive's one-sided surface area.
 
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, float &sum) const
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, float &sum) const
 Calculate sum of primitive data values (float) for a subset of primitives.
 
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, double &sum) const
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, double &sum) const
 Calculate sum of primitive data values (double) for a subset of primitives.
 
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &sum) const
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &sum) const
 Calculate sum of primitive data values (vec2) for a subset of primitives.
 
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &sum) const
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &sum) const
 Calculate sum of primitive data values (vec3) for a subset of primitives.
 
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &sum) const
void calculatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &sum) const
 Calculate sum of primitive data values (vec4) for a subset of primitives.
 
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const
 Calculate sum of primitive data values (float) for a subset of primitives, where each value in the sum calculation is weighted by the primitive's one-sided surface area.
 
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, double &sum) const
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, double &sum) const
 Calculate sum of primitive data values (double) for a subset of primitives, where each value in the sum calculation is weighted by the primitive's one-sided surface area.
 
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &sum) const
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &sum) const
 Calculate sum of primitive data values (vec2) for a subset of primitives, where each value in the sum calculation is weighted by the primitive's one-sided surface area.
 
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &sum) const
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &sum) const
 Calculate sum of primitive data values (vec3) for a subset of primitives, where each value in the sum calculation is weighted by the primitive's one-sided surface area.
 
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &sum) const
void calculatePrimitiveDataAreaWeightedSum (const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &sum) const
 Calculate sum of primitive data values (vec4) for a subset of primitives, where each value in the sum calculation is weighted by the primitive's one-sided surface area.
 
void scalePrimitiveData (const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)
void scalePrimitiveData (const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)
 Multiply primitive data values by a constant scaling factor for a subset of primitives.
 
void scalePrimitiveData (const std::string &label, float scaling_factor)
void scalePrimitiveData (const std::string &label, float scaling_factor)
 Multiply primitive data values by a constant scaling factor for all primitives.
 
void incrementPrimitiveData (const std::vector< uint > &UUIDs, const char *label, int increment)
void incrementPrimitiveData (const std::vector< uint > &UUIDs, const char *label, int increment)
 Increase value of primitive data (int) by some value.
 
void incrementPrimitiveData (const std::vector< uint > &UUIDs, const char *label, uint increment)
void incrementPrimitiveData (const std::vector< uint > &UUIDs, const char *label, uint increment)
 Increase value of primitive data (uint) by some value.
 
void incrementPrimitiveData (const std::vector< uint > &UUIDs, const char *label, float increment)
void incrementPrimitiveData (const std::vector< uint > &UUIDs, const char *label, float increment)
 Increase value of primitive data (float) by some value.
 
void incrementPrimitiveData (const std::vector< uint > &UUIDs, const char *label, double increment)
void incrementPrimitiveData (const std::vector< uint > &UUIDs, const char *label, double increment)
 Increase value of primitive data (double) by some value.
 
void aggregatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
void aggregatePrimitiveDataSum (const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
 Sum multiple primitive data values for each primitive together and store result in new primitive data.
 
void aggregatePrimitiveDataProduct (const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
void aggregatePrimitiveDataProduct (const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_data_labels, const std::string &result_primitive_data_label)
 Multiply primitive data values for each primitive together and store result in new primitive data.
 
float sumPrimitiveSurfaceArea (const std::vector< uint > &UUIDs) const
float sumPrimitiveSurfaceArea (const std::vector< uint > &UUIDs) const
 Sum the one-sided surface area of a group of primitives.
 
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
 Filter a set of primitives based on their primitive data and a condition and float value.
 
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, double filter_value, const std::string &comparator)
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, double filter_value, const std::string &comparator)
 Filter a set of primitives based on their primitive data and a condition and double value.
 
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, int filter_value, const std::string &comparator)
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, int filter_value, const std::string &comparator)
 Filter a set of primitives based on their primitive data and a condition and int value.
 
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, uint filter_value, const std::string &comparator)
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, uint filter_value, const std::string &comparator)
 Filter a set of primitives based on their primitive data and a condition and uint value.
 
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, const std::string &filter_value)
std::vector< uint > filterPrimitivesByData (const std::vector< uint > &UUIDs, const std::string &primitive_data_label, const std::string &filter_value)
 Get set of primitives whose primitive data matches a given string.
 
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, float filter_value, const std::string &comparator)
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, float filter_value, const std::string &comparator)
 Filter a set of compound objects based on their object data and a condition and float value.
 
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, double filter_value, const std::string &comparator)
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, double filter_value, const std::string &comparator)
 Filter a set of compound objects based on their object data and a condition and double value.
 
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, int filter_value, const std::string &comparator)
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, int filter_value, const std::string &comparator)
 Filter a set of compound objects based on their object data and a condition and int value.
 
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, uint filter_value, const std::string &comparator)
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, uint filter_value, const std::string &comparator)
 Filter a set of compound objects based on their object data and a condition and uint value.
 
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, const std::string &filter_value)
std::vector< uint > filterObjectsByData (const std::vector< uint > &objIDs, const std::string &object_data_label, const std::string &filter_value)
 Get set of compound objects whose object data matches a given string.
 
- + - +

Static Public Member Functions

static int selfTest ()
static int selfTest ()
 Run a self-test of the Context. The Context self-test runs through validation checks of Context-related methods to ensure they are working properly.
 
static bool scanXMLForTag (const std::string &filename, const std::string &tag, const std::string &label="")
static bool scanXMLForTag (const std::string &filename, const std::string &tag, const std::string &label="")
 Scan a Helios XML file to check if a tag exists.
 
@@ -1758,7 +1769,7 @@

Context::Context ( - ) + ) @@ -1779,7 +1790,7 @@

Context::~Context ( - ) + ) @@ -1801,31 +1812,22 @@

uint Context::addPatch ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const helios::RGBAcolor &  - color  - - - - ) - + const helios::RGBAcolor & color )

@@ -1855,31 +1857,22 @@

uint Context::addPatch ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::SphericalCoord &  - rotation, + const helios::SphericalCoord & rotation, - const helios::RGBcolor &  - color  - - - - ) - + const helios::RGBcolor & color )

@@ -1909,31 +1902,22 @@

uint Context::addVoxel ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec3 &  - size, + const helios::vec3 & size, - const float &  - rotation, + const float & rotation, - const helios::RGBAcolor &  - color  - - - - ) - + const helios::RGBAcolor & color )

@@ -1963,31 +1947,22 @@

uint Context::addVoxel ( - const helios::vec3 &  - center, + const helios::vec3 & center, - const helios::vec3 &  - size, + const helios::vec3 & size, - const float &  - rotation, + const float & rotation, - const helios::RGBcolor &  - color  - - - - ) - + const helios::RGBcolor & color )

@@ -2111,37 +2070,27 @@

void Context::appendTubeSegment ( - uint  - ObjID, + uint ObjID, - const helios::vec3 &  - node_position, + const helios::vec3 & node_position, - float  - node_radius, + float node_radius, - const char *  - texturefile, + const char * texturefile, - const helios::vec2 &  - textureuv_ufrac  - - - - ) - + const helios::vec2 & textureuv_ufrac )

@@ -2171,31 +2120,22 @@

void Context::appendTubeSegment ( - uint  - ObjID, + uint ObjID, - const helios::vec3 &  - node_position, + const helios::vec3 & node_position, - float  - radius, + float radius, - const RGBcolor &  - color  - - - - ) - + const RGBcolor & color )

@@ -3842,25 +3548,17 @@

void Context::cropDomain ( - const vec2 &  - xbounds, + const vec2 & xbounds, - const vec2 &  - ybounds, + const vec2 & ybounds, - const vec2 &  - zbounds  - - - - ) - + const vec2 & zbounds )

@@ -3888,31 +3586,22 @@

void Context::cropDomain ( - std::vector< uint > &  - UUIDs, + std::vector< uint > & UUIDs, - const vec2 &  - xbounds, + const vec2 & xbounds, - const vec2 &  - ybounds, + const vec2 & ybounds, - const vec2 &  - zbounds  - - - - ) - + const vec2 & zbounds )

@@ -5128,7 +4658,7 @@

std::vector< uint > Context::getAllObjectIDs ( - ) + ) const @@ -5150,7 +4680,7 @@

std::vector< uint > Context::getAllUUIDs ( - ) + ) const @@ -5171,8 +4701,7 @@

helios::vec3 Context::getBoxObjectCenter ( - uint  - ObjID) + uint ObjID) const @@ -5199,8 +4728,7 @@

Box * Context::getBoxObjectPointer ( - uint  - ObjID) + uint ObjID) const @@ -5227,8 +4755,7 @@

helios::vec3 Context::getBoxObjectSize ( - uint  - ObjID) + uint ObjID) const @@ -5255,8 +4782,7 @@

helios::int3 Context::getBoxObjectSubdivisionCount ( - uint  - ObjID) + uint ObjID) const @@ -5283,8 +4809,7 @@

float Context::getBoxObjectVolume ( - uint  - ObjID) + uint ObjID) const @@ -5311,8 +4836,7 @@

helios::vec3 Context::getConeObjectAxisUnitVector ( - uint  - ObjID) + uint ObjID) const @@ -5339,8 +4863,7 @@

float Context::getConeObjectLength ( - uint  - ObjID) + uint ObjID) const @@ -5368,19 +4891,12 @@

helios::vec3 Context::getConeObjectNode ( - uint  - ObjID, + uint ObjID, - int  - number  - - - - ) - const + int number ) const

@@ -5472,8 +4980,7 @@

std::vector< helios::vec3 > Context::getConeObjectNodes ( - uint  - ObjID) + uint ObjID) const @@ -5500,8 +5007,7 @@

Cone * Context::getConeObjectPointer ( - uint  - ObjID) + uint ObjID) const @@ -5528,8 +5034,7 @@

uint Context::getConeObjectSubdivisionCount ( - uint  - ObjID) + uint ObjID) const @@ -5556,8 +5061,7 @@

float Context::getConeObjectVolume ( - uint  - ObjID) + uint ObjID) const @@ -5584,7 +5088,7 @@

Date Context::getDate ( - ) + ) const @@ -5592,7 +5096,7 @@

Returns
Date vector
-
See also
setDate(), getJulianDate()
+
See also
setDate(), getJulianDate()

Definition at line 1099 of file Context.cpp.

@@ -5607,8 +5111,7 @@

helios::vec3 Context::getDiskObjectCenter ( - uint  - ObjID) + uint ObjID) const @@ -5635,8 +5138,7 @@

Disk * Context::getDiskObjectPointer ( - uint  - ObjID) + uint ObjID) const @@ -5663,8 +5165,7 @@

helios::vec2 Context::getDiskObjectSize ( - uint  - ObjID) + uint ObjID) const @@ -5691,8 +5192,7 @@

uint Context::getDiskObjectSubdivisionCount ( - uint  - ObjID) + uint ObjID) const @@ -5719,31 +5219,22 @@

void Context::getDomainBoundingBox ( - const std::vector< uint > &  - UUIDs, + const std::vector< uint > & UUIDs, - helios::vec2 &  - xbounds, + helios::vec2 & xbounds, - helios::vec2 &  - ybounds, + helios::vec2 & ybounds, - helios::vec2 &  - zbounds  - - - - ) - const + helios::vec2 & zbounds ) const

@@ -5775,25 +5266,17 @@

void Context::getDomainBoundingBox ( - helios::vec2 &  - xbounds, + helios::vec2 & xbounds, - helios::vec2 &  - ybounds, + helios::vec2 & ybounds, - helios::vec2 &  - zbounds  - - - - ) - const + helios::vec2 & zbounds ) const

@@ -5821,25 +5304,17 @@

void Context::getDomainBoundingSphere ( - const std::vector< uint > &  - UUIDs, + const std::vector< uint > & UUIDs, - helios::vec3 &  - center, + helios::vec3 & center, - float &  - radius  - - - - ) - const + float & radius ) const

@@ -5867,19 +5342,12 @@

void Context::getDomainBoundingSphere ( - helios::vec3 &  - center, + helios::vec3 & center, - float &  - radius  - - - - ) - const + float & radius ) const

@@ -6023,19 +5470,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - helios::int3 &  - data  - - - - ) - const + helios::int3 & data ) const

@@ -6062,19 +5502,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - helios::int4 &  - data  - - - - ) - const + helios::int4 & data ) const

@@ -6101,19 +5534,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - helios::vec2 &  - data  - - - - ) - const + helios::vec2 & data ) const

@@ -6140,19 +5566,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - helios::vec3 &  - data  - - - - ) - const + helios::vec3 & data ) const

@@ -6179,19 +5598,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - helios::vec4 &  - data  - - - - ) - const + helios::vec4 & data ) const

@@ -6413,19 +5790,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - std::vector< helios::int3 > &  - data  - - - - ) - const + std::vector< helios::int3 > & data ) const

@@ -6452,19 +5822,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - std::vector< helios::int4 > &  - data  - - - - ) - const + std::vector< helios::int4 > & data ) const

@@ -6491,19 +5854,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - std::vector< helios::vec2 > &  - data  - - - - ) - const + std::vector< helios::vec2 > & data ) const

@@ -6530,19 +5886,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - std::vector< helios::vec3 > &  - data  - - - - ) - const + std::vector< helios::vec3 > & data ) const

@@ -6569,19 +5918,12 @@

void Context::getGlobalData ( - const char *  - label, + const char * label, - std::vector< helios::vec4 > &  - data  - - - - ) - const + std::vector< helios::vec4 > & data ) const

@@ -6986,25 +6289,17 @@

void Context::getObjectBoundingBox ( - uint  - ObjID, + uint ObjID, - vec3 &  - min_corner, + vec3 & min_corner, - vec3 &  - max_corner  - - - - ) - const + vec3 & max_corner ) const

@@ -7588,25 +6794,17 @@

void Context::getObjectData ( - uint  - objID, + uint objID, - const char *  - label, + const char * label, - std::vector< int3 > &  - data  - - - - ) - const + std::vector< int3 > & data ) const

@@ -7634,25 +6832,17 @@

void Context::getObjectData ( - uint  - objID, + uint objID, - const char *  - label, + const char * label, - std::vector< int4 > &  - data  - - - - ) - const + std::vector< int4 > & data ) const

@@ -7818,25 +6984,17 @@

void Context::getObjectData ( - uint  - objID, + uint objID, - const char *  - label, + const char * label, - std::vector< vec3 > &  - data  - - - - ) - const + std::vector< vec3 > & data ) const

@@ -7864,25 +7022,17 @@

void Context::getObjectData ( - uint  - objID, + uint objID, - const char *  - label, + const char * label, - std::vector< vec4 > &  - data  - - - - ) - const + std::vector< vec4 > & data ) const

@@ -8134,19 +7245,12 @@

HeliosDataType Context::getObjectDataType ( - uint  - objID, + uint objID, - const char *  - label  - - - - ) - const + const char * label ) const

@@ -8382,8 +7473,7 @@

helios::ObjectType Context::getObjectType ( - uint  - ObjID) + uint ObjID) const @@ -8410,8 +7500,7 @@

helios::vec3 Context::getPatchCenter ( - uint  - UUID) + uint UUID) const @@ -8440,8 +7529,7 @@

helios::vec2 Context::getPatchSize ( - uint  - UUID) + uint UUID) const @@ -8470,8 +7558,7 @@

Polymesh * Context::getPolymeshObjectPointer ( - uint  - ObjID) + uint ObjID) const @@ -8498,8 +7585,7 @@

float Context::getPolymeshObjectVolume ( - uint  - ObjID) + uint ObjID) const @@ -8526,8 +7612,7 @@

float Context::getPrimitiveArea ( - uint  - UUID) + uint UUID) const @@ -8554,25 +7639,17 @@

void Context::getPrimitiveBoundingBox ( - const std::vector< uint > &  - UUID, + const std::vector< uint > & UUID, - vec3 &  - min_corner, + vec3 & min_corner, - vec3 &  - max_corner  - - - - ) - const + vec3 & max_corner ) const

@@ -8600,25 +7677,17 @@

void Context::getPrimitiveBoundingBox ( - uint  - UUID, + uint UUID, - vec3 &  - min_corner, + vec3 & min_corner, - vec3 &  - max_corner  - - - - ) - const + vec3 & max_corner ) const

@@ -8646,8 +7715,7 @@

helios::RGBcolor Context::getPrimitiveColor ( - uint  - UUID) + uint UUID) const @@ -8674,8 +7742,7 @@

helios::RGBcolor Context::getPrimitiveColorRGB ( - uint  - UUID) + uint UUID) const @@ -8702,8 +7769,7 @@

helios::RGBAcolor Context::getPrimitiveColorRGBA ( - uint  - UUID) + uint UUID) const @@ -8730,25 +7796,17 @@

void Context::getPrimitiveData ( - uint  - UUID, + uint UUID, - const char *  - label, + const char * label, - double &  - data  - - - - ) - const + double & data ) const

@@ -9236,25 +8214,17 @@

void Context::getPrimitiveData ( - uint  - UUID, + uint UUID, - const char *  - label, + const char * label, - std::vector< int3 > &  - data  - - - - ) - const + std::vector< int3 > & data ) const

@@ -9282,25 +8252,17 @@

void Context::getPrimitiveData ( - uint  - UUID, + uint UUID, - const char *  - label, + const char * label, - std::vector< int4 > &  - data  - - - - ) - const + std::vector< int4 > & data ) const

@@ -9466,25 +8404,17 @@

void Context::getPrimitiveData ( - uint  - UUID, + uint UUID, - const char *  - label, + const char * label, - std::vector< vec3 > &  - data  - - - - ) - const + std::vector< vec3 > & data ) const

@@ -9512,25 +8442,17 @@

void Context::getPrimitiveData ( - uint  - UUID, + uint UUID, - const char *  - label, + const char * label, - std::vector< vec4 > &  - data  - - - - ) - const + std::vector< vec4 > & data ) const

@@ -9782,19 +8665,12 @@

HeliosDataType Context::getPrimitiveDataType ( - uint  - UUID, + uint UUID, - const char *  - label  - - - - ) - const + const char * label ) const

@@ -10062,8 +8924,7 @@

PrimitiveType Context::getPrimitiveType ( - uint  - UUID) + uint UUID) const @@ -10090,8 +8951,7 @@

std::vector< helios::vec3 > Context::getPrimitiveVertices ( - uint  - UUID) + uint UUID) const @@ -10118,7 +8978,7 @@

std::minstd_rand0 * Context::getRandomGenerator ( - ) + ) @@ -10140,8 +9000,7 @@

helios::vec3 Context::getSphereObjectCenter ( - uint  - ObjID) + uint ObjID) const @@ -10168,8 +9027,7 @@

Sphere * Context::getSphereObjectPointer ( - uint  - ObjID) + uint ObjID) const @@ -10196,8 +9054,7 @@

helios::vec3 Context::getSphereObjectRadius ( - uint  - ObjID) + uint ObjID) const @@ -10224,8 +9081,7 @@

uint Context::getSphereObjectSubdivisionCount ( - uint  - ObjID) + uint ObjID) const @@ -10252,8 +9108,7 @@

float Context::getSphereObjectVolume ( - uint  - ObjID) + uint ObjID) const @@ -10280,8 +9135,7 @@

std::vector< float > Context::getTileObjectAreaRatio ( - const std::vector< uint > &  - ObjectID) + const std::vector< uint > & ObjectID) const @@ -10308,8 +9162,7 @@

float Context::getTileObjectAreaRatio ( - uint  - ObjectID) + uint ObjectID) const @@ -10336,8 +9189,7 @@

helios::vec3 Context::getTileObjectCenter ( - uint  - ObjID) + uint ObjID) const @@ -10366,8 +9218,7 @@

helios::vec3 Context::getTileObjectNormal ( - uint  - ObjID) + uint ObjID) const @@ -10394,8 +9245,7 @@

Tile * Context::getTileObjectPointer ( - uint  - ObjID) + uint ObjID) const @@ -10422,8 +9272,7 @@

helios::vec2 Context::getTileObjectSize ( - uint  - ObjID) + uint ObjID) const @@ -10450,8 +9299,7 @@

helios::int2 Context::getTileObjectSubdivisionCount ( - uint  - ObjID) + uint ObjID) const @@ -10478,8 +9326,7 @@

std::vector< helios::vec2 > Context::getTileObjectTextureUV ( - uint  - ObjID) + uint ObjID) const @@ -10506,8 +9353,7 @@

std::vector< helios::vec3 > Context::getTileObjectVertices ( - uint  - ObjID) + uint ObjID) const @@ -10534,7 +9380,7 @@

Time Context::getTime ( - ) + ) const @@ -10542,7 +9388,7 @@

Returns
Time vector
-
See also
setTime()
+
See also
setTime()

Definition at line 1166 of file Context.cpp.

@@ -10557,19 +9403,12 @@

helios::vec3 Context::getTriangleVertex ( - uint  - UUID, + uint UUID, - uint  - number  - - - - ) - const + uint number ) const

@@ -10598,8 +9437,7 @@

std::vector< RGBcolor > Context::getTubeObjectNodeColors ( - uint  - ObjID) + uint ObjID) const @@ -10626,8 +9464,7 @@

std::vector< float > Context::getTubeObjectNodeRadii ( - uint  - ObjID) + uint ObjID) const @@ -10654,8 +9491,7 @@

std::vector< helios::vec3 > Context::getTubeObjectNodes ( - uint  - ObjID) + uint ObjID) const @@ -10682,8 +9518,7 @@

Tube * Context::getTubeObjectPointer ( - uint  - ObjID) + uint ObjID) const @@ -10710,19 +9545,12 @@

float Context::getTubeObjectSegmentVolume ( - uint  - ObjID, + uint ObjID, - uint  - segment_index  - - - - ) - const + uint segment_index ) const

@@ -10871,8 +9689,7 @@

helios::vec3 Context::getVoxelCenter ( - uint  - UUID) + uint UUID) const @@ -10901,8 +9718,7 @@

helios::vec3 Context::getVoxelSize ( - uint  - UUID) + uint UUID) const @@ -10931,14 +9747,13 @@

void Context::hideObject ( - const std::vector< uint > &  - ObjIDs) + const std::vector< uint > & ObjIDs)

-

Hide compound objects in the Context such that their object IDs are not returned in Context::getAllObjectIDs(), and are not counted in Context::getObjectCount()

+

Hide compound objects in the Context such that their object IDs are not returned in Context::getAllObjectIDs(), and are not counted in Context::getObjectCount()

Parameters
@@ -10959,14 +9774,13 @@

void Context::hidePrimitive

- - +
[in]ObjIDIdentifier of the object.
(const std::vector< uint > & UUIDs)const std::vector< uint > & UUIDs)
-

Hide primitives in the Context such that their UUIDs are not returned in Context::getAllUUIDs()

+

Hide primitives in the Context such that their UUIDs are not returned in Context::getAllUUIDs()

Parameters
@@ -10987,19 +9801,12 @@

void Context::incrementGlobalData

- - + - - - - - - - +
[in]UUIDsVector of primitive UUIDs to hide
(const char * label, const char * label,
double increment 
)double increment )
@@ -11571,49 +10313,37 @@

std::vector< uint > Context::loadOBJ ( - const char *  - filename, + const char * filename, - const vec3 &  - origin, + const vec3 & origin, - const helios::vec3 &  - scale, + const helios::vec3 & scale, - const SphericalCoord &  - rotation, + const SphericalCoord & rotation, - const RGBcolor &  - default_color, + const RGBcolor & default_color, - const char *  - upaxis, + const char * upaxis, - bool  - silent = false  - - - - ) - + bool silent = false )

@@ -11646,43 +10376,32 @@

std::vector< uint > Context::loadOBJ ( - const char *  - filename, + const char * filename, - const vec3 &  - origin, + const vec3 & origin, - float  - height, + float height, - const SphericalCoord &  - rotation, + const SphericalCoord & rotation, - const RGBcolor &  - default_color, + const RGBcolor & default_color, - bool  - silent = false  - - - - ) - + bool silent = false )

@@ -11714,49 +10433,37 @@

std::vector< uint > Context::loadOBJ ( - const char *  - filename, + const char * filename, - const vec3 &  - origin, + const vec3 & origin, - float  - height, + float height, - const SphericalCoord &  - rotation, + const SphericalCoord & rotation, - const RGBcolor &  - default_color, + const RGBcolor & default_color, - const char *  - upaxis, + const char * upaxis, - bool  - silent = false  - - - - ) - + bool silent = false )

@@ -11830,43 +10530,32 @@

std::vector< uint > Context::loadPLY ( - const char *  - filename, + const char * filename, - const vec3 &  - origin, + const vec3 & origin, - float  - height, + float height, - const RGBcolor &  - default_color, + const RGBcolor & default_color, - const std::string &  - upaxis = "YUP", + const std::string & upaxis = "YUP", - bool  - silent = false  - - - - ) - + bool silent = false )

@@ -11898,49 +10587,37 @@

std::vector< uint > Context::loadPLY ( - const char *  - filename, + const char * filename, - const vec3 &  - origin, + const vec3 & origin, - float  - height, + float height, - const SphericalCoord &  - rotation, + const SphericalCoord & rotation, - const RGBcolor &  - default_color, + const RGBcolor & default_color, - const std::string &  - upaxis = "YUP", + const std::string & upaxis = "YUP", - bool  - silent = false  - - - - ) - + bool silent = false )

@@ -11973,43 +10650,32 @@

std::vector< uint > Context::loadPLY ( - const char *  - filename, + const char * filename, - const vec3 &  - origin, + const vec3 & origin, - float  - height, + float height, - const SphericalCoord &  - rotation, + const SphericalCoord & rotation, - const std::string &  - upaxis = "YUP", + const std::string & upaxis = "YUP", - bool  - silent = false  - - - - ) - + bool silent = false )

@@ -12042,37 +10708,27 @@

std::vector< uint > Context::loadPLY ( - const char *  - filename, + const char * filename, - const vec3 &  - origin, + const vec3 & origin, - float  - height, + float height, - const std::string &  - upaxis = "YUP", + const std::string & upaxis = "YUP", - bool  - silent = false  - - - - ) - + bool silent = false )

Mark the Context geometry as "clean", meaning that the geometry has not been modified since last set as clean.

-
See also
markGeometryDirty()
+
See also
markGeometryDirty()
-isGeometryDirty()
+isGeometryDirty()

Definition at line 149 of file Context.cpp.

@@ -12219,16 +10858,16 @@

void Context::markGeometryDirty ( - ) + )

@@ -12854,31 +11425,22 @@

void Context::rotateObject ( - const std::vector< uint > &  - ObjIDs, + const std::vector< uint > & ObjIDs, - float  - rotation_radians, + float rotation_radians, - const vec3 &  - rotation_origin, + const vec3 & rotation_origin, - const vec3 &  - rotation_axis_vector  - - - - ) - + const vec3 & rotation_axis_vector )

@@ -12999,31 +11545,22 @@

void Context::rotateObject ( - uint  - ObjID, + uint ObjID, - float  - rotation_radians, + float rotation_radians, - const vec3 &  - rotation_origin, + const vec3 & rotation_origin, - const vec3 &  - rotation_axis_vector  - - - - ) - + const vec3 & rotation_axis_vector )

@@ -13289,31 +11785,22 @@

void Context::rotatePrimitive ( - uint  - UUID, + uint UUID, - float  - rot, + float rot, - const helios::vec3 &  - origin, + const helios::vec3 & origin, - const helios::vec3 &  - axis  - - - - ) - + const helios::vec3 & axis )

@@ -13381,19 +11861,12 @@

void Context::scaleObject ( - uint  - ObjID, + uint ObjID, - const helios::vec3 &  - scalefact  - - - - ) - + const helios::vec3 & scalefact )

@@ -13459,19 +11925,12 @@

void Context::scaleObjectAboutCenter ( - uint  - ObjID, + uint ObjID, - const helios::vec3 &  - scalefact  - - - - ) - + const helios::vec3 & scalefact )

@@ -13498,25 +11957,17 @@

void Context::scaleObjectAboutPoint ( - const std::vector< uint > &  - ObjIDs, + const std::vector< uint > & ObjIDs, - const helios::vec3 &  - scalefact, + const helios::vec3 & scalefact, - const helios::vec3 &  - point  - - - - ) - + const helios::vec3 & point )

@@ -13544,25 +11995,17 @@

void Context::scaleObjectAboutPoint ( - uint  - ObjID, + uint ObjID, - const helios::vec3 &  - scalefact, + const helios::vec3 & scalefact, - const helios::vec3 &  - point  - - - - ) - + const helios::vec3 & point )

@@ -13629,19 +12065,12 @@

void Context::scalePrimitive ( - uint  - UUID, + uint UUID, - const helios::vec3 &  - S  - - - - ) - + const helios::vec3 & S )

@@ -13714,25 +12135,17 @@

void Context::scalePrimitiveAboutPoint ( - uint  - UUID, + uint UUID, - const helios::vec3 &  - S, + const helios::vec3 & S, - const helios::vec3  - point  - - - - ) - + const helios::vec3 point )

@@ -14583,31 +12865,22 @@

void Context::setGlobalData ( - const char *  - label, + const char * label, - HeliosDataType  - type, + HeliosDataType type, - size_t  - size, + size_t size, - void *  - data  - - - - ) - + void * data )

@@ -14741,19 +12999,12 @@

void Context::setObjectColor ( - uint  - ObjID, + uint ObjID, - const helios::RGBAcolor &  - color  - - - - ) - + const helios::RGBAcolor & color )

@@ -14780,19 +13031,12 @@

void Context::setObjectColor ( - uint  - ObjID, + uint ObjID, - const helios::RGBcolor &  - color  - - - - ) - + const helios::RGBcolor & color )

@@ -17055,19 +14909,12 @@

void Context::setPrimitiveColor ( - uint  - UUID, + uint UUID, - const helios::RGBAcolor &  - color  - - - - ) - + const helios::RGBAcolor & color )

@@ -17094,19 +14941,12 @@

void Context::setPrimitiveColor ( - uint  - UUID, + uint UUID, - const helios::RGBcolor &  - color  - - - - ) - + const helios::RGBcolor & color )

@@ -19591,7 +17004,7 @@

See also
getTime()
+
See also
getTime()
setSunDirection()
@@ -19608,31 +17021,22 @@

void Context::setTriangleVertices ( - uint  - UUID, + uint UUID, - const helios::vec3 &  - vertex0, + const helios::vec3 & vertex0, - const helios::vec3 &  - vertex1, + const helios::vec3 & vertex1, - const helios::vec3 &  - vertex2  - - - - ) - + const helios::vec3 & vertex2 )

@@ -19661,19 +17065,12 @@

void Context::setTubeNodes ( - uint  - ObjID, + uint ObjID, - const std::vector< helios::vec3 > &  - node_xyz  - - - - ) - + const std::vector< helios::vec3 > & node_xyz )

@@ -19807,19 +17189,12 @@

void Context::translateObject ( - uint  - ObjID, + uint ObjID, - const vec3 &  - shift  - - - - ) - + const vec3 & shift )

@@ -19885,19 +17253,12 @@

void Context::translatePrimitive ( - uint  - UUID, + uint UUID, - const vec3 &  - shift  - - - - ) - + const vec3 & shift )

@@ -20408,7 +17708,8 @@

+

diff --git a/doc/html/classhelios_1_1_disk.html b/doc/html/classhelios_1_1_disk.html index e4a77be4a..f096342f1 100644 --- a/doc/html/classhelios_1_1_disk.html +++ b/doc/html/classhelios_1_1_disk.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -97,7 +109,7 @@

Disk compound object class. - More...

+ More...

#include <Context.h>

@@ -112,225 +124,225 @@ - + - - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 Disk (uint a_OID, const std::vector< uint > &a_UUIDs, int2 a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Disk (uint a_OID, const std::vector< uint > &a_UUIDs, int2 a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Default constructor.
 
+
 ~Disk () override=default
 Disk destructor.
 
vec2 getSize () const
vec2 getSize () const
 Get the lateral dimensions of the disk object.
 
vec3 getCenter () const
vec3 getCenter () const
 Get the Cartesian coordinates of the center of the disk object.
 
int2 getSubdivisionCount () const
int2 getSubdivisionCount () const
 Get the number of sub-triangle divisions of the disk object.
 
void setSubdivisionCount (int2 subdiv)
void setSubdivisionCount (int2 subdiv)
 Set the number of disk sub-triangle divisions.
 
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
 Get the unique identifier for the object.
 
helios::ObjectType getObjectType () const
helios::ObjectType getObjectType () const
 Get an enumeration specifying the type of the object.
 
uint getPrimitiveCount () const
uint getPrimitiveCount () const
 Return the number of primitives contained in the object.
 
std::vector< uint > getPrimitiveUUIDs () const
std::vector< uint > getPrimitiveUUIDs () const
 Get the UUIDs for all primitives contained in the object.
 
bool doesObjectContainPrimitive (uint UUID)
bool doesObjectContainPrimitive (uint UUID)
 Check whether a primitive is a member of the object based on its UUID.
 
helios::vec3 getObjectCenter () const
helios::vec3 getObjectCenter () const
 Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
 
float getArea () const
float getArea () const
 Calculate the total one-sided surface area of the Compound Object.
 
void setColor (const helios::RGBcolor &color)
void setColor (const helios::RGBcolor &color)
 Method to set the diffuse color for all primitives in the Compound Object.
 
void setColor (const helios::RGBAcolor &color)
void setColor (const helios::RGBAcolor &color)
 Method to set the diffuse color (with transparency) for all primitives in the Compound Object.
 
void overrideTextureColor ()
void overrideTextureColor ()
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void useTextureColor ()
void useTextureColor ()
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
bool hasTexture () const
bool hasTexture () const
 Method to check whether this object has texture data.
 
std::string getTextureFile () const
std::string getTextureFile () const
 Method to return the texture map file of an Object.
 
void translate (const helios::vec3 &shift)
void translate (const helios::vec3 &shift)
 Method to translate/shift a Compound Object.
 
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
 Method to rotate a Compound Object about the x-, y-, or z-axis.
 
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary axis passing through the origin.
 
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary line (not necessarily passing through the origin)
 
void scale (const helios::vec3 &scale)
void scale (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutCenter (const helios::vec3 &scale)
void scaleAboutCenter (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
void getTransformationMatrix (float(&T)[16]) const
void getTransformationMatrix (float(&T)[16]) const
 Method to return the Affine transformation matrix of a Compound Object.
 
void setTransformationMatrix (float(&T)[16])
void setTransformationMatrix (float(&T)[16])
 Method to set the Affine transformation matrix of a Compound Object.
 
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
 Method to set the UUIDs of object child primitives.
 
void deleteChildPrimitive (uint UUID)
void deleteChildPrimitive (uint UUID)
 Delete a single child member of the object.
 
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
 Delete multiple child member of the object based on a vector of UUIDs.
 
bool arePrimitivesComplete () const
bool arePrimitivesComplete () const
 Method to query whether all object primitives are in tact.
 
void setObjectData (const char *label, const int &data)
void setObjectData (const char *label, const int &data)
 Add data value (int) associated with a object element.
 
void setObjectData (const char *label, const uint &data)
void setObjectData (const char *label, const uint &data)
 Add data value (uint) associated with a object element.
 
void setObjectData (const char *label, const float &data)
void setObjectData (const char *label, const float &data)
 Add data value (float) associated with a object element.
 
void setObjectData (const char *label, const double &data)
void setObjectData (const char *label, const double &data)
 Add data value (double) associated with a object element.
 
void setObjectData (const char *label, const helios::vec2 &data)
void setObjectData (const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a object element.
 
void setObjectData (const char *label, const helios::vec3 &data)
void setObjectData (const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a object element.
 
void setObjectData (const char *label, const helios::vec4 &data)
void setObjectData (const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a object element.
 
void setObjectData (const char *label, const helios::int2 &data)
void setObjectData (const char *label, const helios::int2 &data)
 Add data value (int2) associated with a object element.
 
void setObjectData (const char *label, const helios::int3 &data)
void setObjectData (const char *label, const helios::int3 &data)
 Add data value (int3) associated with a object element.
 
void setObjectData (const char *label, const helios::int4 &data)
void setObjectData (const char *label, const helios::int4 &data)
 Add data value (int4) associated with a object element.
 
void setObjectData (const char *label, const std::string &data)
void setObjectData (const char *label, const std::string &data)
 Add data value (string) associated with a object element.
 
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
 Add (array) data associated with a object element.
 
void getObjectData (const char *label, int &data) const
void getObjectData (const char *label, int &data) const
 Get data associated with a object element (integer scalar)
 
void getObjectData (const char *label, std::vector< int > &data) const
void getObjectData (const char *label, std::vector< int > &data) const
 Get data associated with a object element (vector of integers)
 
void getObjectData (const char *label, uint &data) const
void getObjectData (const char *label, uint &data) const
 Get data associated with a object element (unsigned integer scalar)
 
void getObjectData (const char *label, std::vector< uint > &data) const
void getObjectData (const char *label, std::vector< uint > &data) const
 Get data associated with a object element (vector of unsigned integers)
 
void getObjectData (const char *label, float &data) const
void getObjectData (const char *label, float &data) const
 Get data associated with a object element (float scalar)
 
void getObjectData (const char *label, std::vector< float > &data) const
void getObjectData (const char *label, std::vector< float > &data) const
 Get data associated with a object element (vector of floats)
 
void getObjectData (const char *label, double &data) const
void getObjectData (const char *label, double &data) const
 Get data associated with a object element (double scalar)
 
void getObjectData (const char *label, std::vector< double > &data) const
void getObjectData (const char *label, std::vector< double > &data) const
 Get data associated with a object element (vector of doubles)
 
void getObjectData (const char *label, vec2 &data) const
void getObjectData (const char *label, vec2 &data) const
 Get data associated with a object element (vec2 scalar)
 
void getObjectData (const char *label, std::vector< vec2 > &data) const
void getObjectData (const char *label, std::vector< vec2 > &data) const
 Get data associated with a object element (vector of vec2's)
 
void getObjectData (const char *label, vec3 &data) const
void getObjectData (const char *label, vec3 &data) const
 Get data associated with a object element (vec3 scalar)
 
void getObjectData (const char *label, std::vector< vec3 > &data) const
void getObjectData (const char *label, std::vector< vec3 > &data) const
 Get data associated with a object element (vector of vec3's)
 
void getObjectData (const char *label, vec4 &data) const
void getObjectData (const char *label, vec4 &data) const
 Get data associated with a object element (vec4 scalar)
 
void getObjectData (const char *label, std::vector< vec4 > &data) const
void getObjectData (const char *label, std::vector< vec4 > &data) const
 Get data associated with a object element (vector of vec4's)
 
void getObjectData (const char *label, int2 &data) const
void getObjectData (const char *label, int2 &data) const
 Get data associated with a object element (int2 scalar)
 
void getObjectData (const char *label, std::vector< int2 > &data) const
void getObjectData (const char *label, std::vector< int2 > &data) const
 Get data associated with a object element (vector of int2's)
 
void getObjectData (const char *label, int3 &data) const
void getObjectData (const char *label, int3 &data) const
 Get data associated with a object element (int3 scalar)
 
void getObjectData (const char *label, std::vector< int3 > &data) const
void getObjectData (const char *label, std::vector< int3 > &data) const
 Get data associated with a object element (vector of int3's)
 
void getObjectData (const char *label, int4 &data) const
void getObjectData (const char *label, int4 &data) const
 Get data associated with a object element (int4 scalar)
 
void getObjectData (const char *label, std::vector< int4 > &data) const
void getObjectData (const char *label, std::vector< int4 > &data) const
 Get data associated with a object element (vector of int4's)
 
void getObjectData (const char *label, std::string &data) const
void getObjectData (const char *label, std::string &data) const
 Get data associated with a object element (string scalar)
 
void getObjectData (const char *label, std::vector< std::string > &data) const
void getObjectData (const char *label, std::vector< std::string > &data) const
 Get data associated with a object element (vector of strings)
 
HeliosDataType getObjectDataType (const char *label) const
HeliosDataType getObjectDataType (const char *label) const
 Get the Helios data type of object data.
 
uint getObjectDataSize (const char *label) const
uint getObjectDataSize (const char *label) const
 Get the size/length of object data.
 
bool doesObjectDataExist (const char *label) const
bool doesObjectDataExist (const char *label) const
 Check if object data 'label' exists.
 
void clearObjectData (const char *label)
void clearObjectData (const char *label)
 Clear the object data for this object.
 
std::vector< std::string > listObjectData () const
std::vector< std::string > listObjectData () const
 Return labels for all object data for this particular object.
 
- +

Friends

class CompoundObject
class CompoundObject
 

Detailed Description

@@ -347,37 +359,27 @@

Disk::Disk ( - uint  - a_OID, + uint a_OID, - const std::vector< uint > &  - a_UUIDs, + const std::vector< uint > & a_UUIDs, - int2  - a_subdiv, + int2 a_subdiv, - const char *  - a_texturefile, + const char * a_texturefile, - helios::Context *  - a_context  - - - - ) - + helios::Context * a_context )

@@ -398,7 +400,7 @@

vec3 Disk::getCenter ( - ) + ) const @@ -419,7 +421,7 @@

vec2 Disk::getSize ( - ) + ) const @@ -440,7 +442,7 @@

int2 Disk::getSubdivisionCount ( - ) + ) const @@ -461,8 +463,7 @@

void Disk::setSubdivisionCount ( - int2  - subdiv) + int2 subdiv) @@ -480,7 +481,7 @@

Friends And Related Function Documentation

+

Friends And Related Symbol Documentation

◆ CompoundObject

@@ -512,7 +513,8 @@

+

diff --git a/doc/html/classhelios_1_1_disk.png b/doc/html/classhelios_1_1_disk.png index dca1f1c18a0ce1dadc9ce246dbc7f3914b15dc91..aa8d506303f496ddee970c2eda0f48c7bef25260 100644 GIT binary patch delta 21 dcmcc1a+hU-9oK^g5B~rEZ+bRt$wm)RCIEqe3q$|_ delta 21 dcmcc1a+hU-9oK;a2mb&6A3W*uij5wkOaOlM3rGL} diff --git a/doc/html/classhelios_1_1_polymesh.html b/doc/html/classhelios_1_1_polymesh.html index 554a8734a..fd8440fca 100644 --- a/doc/html/classhelios_1_1_polymesh.html +++ b/doc/html/classhelios_1_1_polymesh.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -97,7 +109,7 @@

Polymesh compound object class. - More...

+ More...

#include <Context.h>

@@ -112,216 +124,216 @@ - + - - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 Polymesh (uint a_OID, const std::vector< uint > &a_UUIDs, const char *a_texturefile, helios::Context *a_context)
 Polymesh (uint a_OID, const std::vector< uint > &a_UUIDs, const char *a_texturefile, helios::Context *a_context)
 Default constructor.
 
+
 ~Polymesh () override=default
 Polymesh destructor.
 
float getVolume () const
float getVolume () const
 Get the volume of the polymesh object.
 
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
 Get the unique identifier for the object.
 
helios::ObjectType getObjectType () const
helios::ObjectType getObjectType () const
 Get an enumeration specifying the type of the object.
 
uint getPrimitiveCount () const
uint getPrimitiveCount () const
 Return the number of primitives contained in the object.
 
std::vector< uint > getPrimitiveUUIDs () const
std::vector< uint > getPrimitiveUUIDs () const
 Get the UUIDs for all primitives contained in the object.
 
bool doesObjectContainPrimitive (uint UUID)
bool doesObjectContainPrimitive (uint UUID)
 Check whether a primitive is a member of the object based on its UUID.
 
helios::vec3 getObjectCenter () const
helios::vec3 getObjectCenter () const
 Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
 
float getArea () const
float getArea () const
 Calculate the total one-sided surface area of the Compound Object.
 
void setColor (const helios::RGBcolor &color)
void setColor (const helios::RGBcolor &color)
 Method to set the diffuse color for all primitives in the Compound Object.
 
void setColor (const helios::RGBAcolor &color)
void setColor (const helios::RGBAcolor &color)
 Method to set the diffuse color (with transparency) for all primitives in the Compound Object.
 
void overrideTextureColor ()
void overrideTextureColor ()
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void useTextureColor ()
void useTextureColor ()
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
bool hasTexture () const
bool hasTexture () const
 Method to check whether this object has texture data.
 
std::string getTextureFile () const
std::string getTextureFile () const
 Method to return the texture map file of an Object.
 
void translate (const helios::vec3 &shift)
void translate (const helios::vec3 &shift)
 Method to translate/shift a Compound Object.
 
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
 Method to rotate a Compound Object about the x-, y-, or z-axis.
 
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary axis passing through the origin.
 
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary line (not necessarily passing through the origin)
 
void scale (const helios::vec3 &scale)
void scale (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutCenter (const helios::vec3 &scale)
void scaleAboutCenter (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
void getTransformationMatrix (float(&T)[16]) const
void getTransformationMatrix (float(&T)[16]) const
 Method to return the Affine transformation matrix of a Compound Object.
 
void setTransformationMatrix (float(&T)[16])
void setTransformationMatrix (float(&T)[16])
 Method to set the Affine transformation matrix of a Compound Object.
 
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
 Method to set the UUIDs of object child primitives.
 
void deleteChildPrimitive (uint UUID)
void deleteChildPrimitive (uint UUID)
 Delete a single child member of the object.
 
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
 Delete multiple child member of the object based on a vector of UUIDs.
 
bool arePrimitivesComplete () const
bool arePrimitivesComplete () const
 Method to query whether all object primitives are in tact.
 
void setObjectData (const char *label, const int &data)
void setObjectData (const char *label, const int &data)
 Add data value (int) associated with a object element.
 
void setObjectData (const char *label, const uint &data)
void setObjectData (const char *label, const uint &data)
 Add data value (uint) associated with a object element.
 
void setObjectData (const char *label, const float &data)
void setObjectData (const char *label, const float &data)
 Add data value (float) associated with a object element.
 
void setObjectData (const char *label, const double &data)
void setObjectData (const char *label, const double &data)
 Add data value (double) associated with a object element.
 
void setObjectData (const char *label, const helios::vec2 &data)
void setObjectData (const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a object element.
 
void setObjectData (const char *label, const helios::vec3 &data)
void setObjectData (const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a object element.
 
void setObjectData (const char *label, const helios::vec4 &data)
void setObjectData (const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a object element.
 
void setObjectData (const char *label, const helios::int2 &data)
void setObjectData (const char *label, const helios::int2 &data)
 Add data value (int2) associated with a object element.
 
void setObjectData (const char *label, const helios::int3 &data)
void setObjectData (const char *label, const helios::int3 &data)
 Add data value (int3) associated with a object element.
 
void setObjectData (const char *label, const helios::int4 &data)
void setObjectData (const char *label, const helios::int4 &data)
 Add data value (int4) associated with a object element.
 
void setObjectData (const char *label, const std::string &data)
void setObjectData (const char *label, const std::string &data)
 Add data value (string) associated with a object element.
 
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
 Add (array) data associated with a object element.
 
void getObjectData (const char *label, int &data) const
void getObjectData (const char *label, int &data) const
 Get data associated with a object element (integer scalar)
 
void getObjectData (const char *label, std::vector< int > &data) const
void getObjectData (const char *label, std::vector< int > &data) const
 Get data associated with a object element (vector of integers)
 
void getObjectData (const char *label, uint &data) const
void getObjectData (const char *label, uint &data) const
 Get data associated with a object element (unsigned integer scalar)
 
void getObjectData (const char *label, std::vector< uint > &data) const
void getObjectData (const char *label, std::vector< uint > &data) const
 Get data associated with a object element (vector of unsigned integers)
 
void getObjectData (const char *label, float &data) const
void getObjectData (const char *label, float &data) const
 Get data associated with a object element (float scalar)
 
void getObjectData (const char *label, std::vector< float > &data) const
void getObjectData (const char *label, std::vector< float > &data) const
 Get data associated with a object element (vector of floats)
 
void getObjectData (const char *label, double &data) const
void getObjectData (const char *label, double &data) const
 Get data associated with a object element (double scalar)
 
void getObjectData (const char *label, std::vector< double > &data) const
void getObjectData (const char *label, std::vector< double > &data) const
 Get data associated with a object element (vector of doubles)
 
void getObjectData (const char *label, vec2 &data) const
void getObjectData (const char *label, vec2 &data) const
 Get data associated with a object element (vec2 scalar)
 
void getObjectData (const char *label, std::vector< vec2 > &data) const
void getObjectData (const char *label, std::vector< vec2 > &data) const
 Get data associated with a object element (vector of vec2's)
 
void getObjectData (const char *label, vec3 &data) const
void getObjectData (const char *label, vec3 &data) const
 Get data associated with a object element (vec3 scalar)
 
void getObjectData (const char *label, std::vector< vec3 > &data) const
void getObjectData (const char *label, std::vector< vec3 > &data) const
 Get data associated with a object element (vector of vec3's)
 
void getObjectData (const char *label, vec4 &data) const
void getObjectData (const char *label, vec4 &data) const
 Get data associated with a object element (vec4 scalar)
 
void getObjectData (const char *label, std::vector< vec4 > &data) const
void getObjectData (const char *label, std::vector< vec4 > &data) const
 Get data associated with a object element (vector of vec4's)
 
void getObjectData (const char *label, int2 &data) const
void getObjectData (const char *label, int2 &data) const
 Get data associated with a object element (int2 scalar)
 
void getObjectData (const char *label, std::vector< int2 > &data) const
void getObjectData (const char *label, std::vector< int2 > &data) const
 Get data associated with a object element (vector of int2's)
 
void getObjectData (const char *label, int3 &data) const
void getObjectData (const char *label, int3 &data) const
 Get data associated with a object element (int3 scalar)
 
void getObjectData (const char *label, std::vector< int3 > &data) const
void getObjectData (const char *label, std::vector< int3 > &data) const
 Get data associated with a object element (vector of int3's)
 
void getObjectData (const char *label, int4 &data) const
void getObjectData (const char *label, int4 &data) const
 Get data associated with a object element (int4 scalar)
 
void getObjectData (const char *label, std::vector< int4 > &data) const
void getObjectData (const char *label, std::vector< int4 > &data) const
 Get data associated with a object element (vector of int4's)
 
void getObjectData (const char *label, std::string &data) const
void getObjectData (const char *label, std::string &data) const
 Get data associated with a object element (string scalar)
 
void getObjectData (const char *label, std::vector< std::string > &data) const
void getObjectData (const char *label, std::vector< std::string > &data) const
 Get data associated with a object element (vector of strings)
 
HeliosDataType getObjectDataType (const char *label) const
HeliosDataType getObjectDataType (const char *label) const
 Get the Helios data type of object data.
 
uint getObjectDataSize (const char *label) const
uint getObjectDataSize (const char *label) const
 Get the size/length of object data.
 
bool doesObjectDataExist (const char *label) const
bool doesObjectDataExist (const char *label) const
 Check if object data 'label' exists.
 
void clearObjectData (const char *label)
void clearObjectData (const char *label)
 Clear the object data for this object.
 
std::vector< std::string > listObjectData () const
std::vector< std::string > listObjectData () const
 Return labels for all object data for this particular object.
 
- +

Friends

class CompoundObject
class CompoundObject
 

Detailed Description

@@ -338,31 +350,22 @@

Polymesh::Polymesh ( - uint  - a_OID, + uint a_OID, - const std::vector< uint > &  - a_UUIDs, + const std::vector< uint > & a_UUIDs, - const char *  - a_texturefile, + const char * a_texturefile, - helios::Context *  - a_context  - - - - ) - + helios::Context * a_context )

diff --git a/doc/html/classhelios_1_1_polymesh.png b/doc/html/classhelios_1_1_polymesh.png index 020594b988ab4220d53e11b2850c3b20bee84eee..6de10d8727c7debcf7e546d0514a05c37572325d 100644 GIT binary patch delta 21 dcmeBR?O>f?$MxXBga7~ko1P6@veCnV2>^7o3daBd delta 21 dcmeBR?O>f?$93Sqf&c&i2T!`ZVxxxx699543d;Zh diff --git a/doc/html/classhelios_1_1_sphere.html b/doc/html/classhelios_1_1_sphere.html index effc6f3ee..f1db431fa 100644 --- a/doc/html/classhelios_1_1_sphere.html +++ b/doc/html/classhelios_1_1_sphere.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -97,7 +109,7 @@

Sphere compound object class. - More...

+ More...

#include <Context.h>

@@ -112,228 +124,228 @@ - + - - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 Sphere (uint a_OID, const std::vector< uint > &a_UUIDs, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Sphere (uint a_OID, const std::vector< uint > &a_UUIDs, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Default constructor.
 
+
 ~Sphere () override=default
 Sphere destructor.
 
helios::vec3 getRadius () const
helios::vec3 getRadius () const
 Get the radius of the sphere.
 
vec3 getCenter () const
vec3 getCenter () const
 Get the Cartesian coordinates of the center of the sphere object.
 
uint getSubdivisionCount () const
uint getSubdivisionCount () const
 Get the number of sub-patch divisions of the sphere object.
 
void setSubdivisionCount (uint subdiv)
void setSubdivisionCount (uint subdiv)
 Set the number of sphere tesselation divisions.
 
float getVolume () const
float getVolume () const
 Get the volume of the sphere object.
 
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
 Get the unique identifier for the object.
 
helios::ObjectType getObjectType () const
helios::ObjectType getObjectType () const
 Get an enumeration specifying the type of the object.
 
uint getPrimitiveCount () const
uint getPrimitiveCount () const
 Return the number of primitives contained in the object.
 
std::vector< uint > getPrimitiveUUIDs () const
std::vector< uint > getPrimitiveUUIDs () const
 Get the UUIDs for all primitives contained in the object.
 
bool doesObjectContainPrimitive (uint UUID)
bool doesObjectContainPrimitive (uint UUID)
 Check whether a primitive is a member of the object based on its UUID.
 
helios::vec3 getObjectCenter () const
helios::vec3 getObjectCenter () const
 Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
 
float getArea () const
float getArea () const
 Calculate the total one-sided surface area of the Compound Object.
 
void setColor (const helios::RGBcolor &color)
void setColor (const helios::RGBcolor &color)
 Method to set the diffuse color for all primitives in the Compound Object.
 
void setColor (const helios::RGBAcolor &color)
void setColor (const helios::RGBAcolor &color)
 Method to set the diffuse color (with transparency) for all primitives in the Compound Object.
 
void overrideTextureColor ()
void overrideTextureColor ()
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void useTextureColor ()
void useTextureColor ()
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
bool hasTexture () const
bool hasTexture () const
 Method to check whether this object has texture data.
 
std::string getTextureFile () const
std::string getTextureFile () const
 Method to return the texture map file of an Object.
 
void translate (const helios::vec3 &shift)
void translate (const helios::vec3 &shift)
 Method to translate/shift a Compound Object.
 
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
 Method to rotate a Compound Object about the x-, y-, or z-axis.
 
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary axis passing through the origin.
 
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary line (not necessarily passing through the origin)
 
void scale (const helios::vec3 &scale)
void scale (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutCenter (const helios::vec3 &scale)
void scaleAboutCenter (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
void getTransformationMatrix (float(&T)[16]) const
void getTransformationMatrix (float(&T)[16]) const
 Method to return the Affine transformation matrix of a Compound Object.
 
void setTransformationMatrix (float(&T)[16])
void setTransformationMatrix (float(&T)[16])
 Method to set the Affine transformation matrix of a Compound Object.
 
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
 Method to set the UUIDs of object child primitives.
 
void deleteChildPrimitive (uint UUID)
void deleteChildPrimitive (uint UUID)
 Delete a single child member of the object.
 
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
 Delete multiple child member of the object based on a vector of UUIDs.
 
bool arePrimitivesComplete () const
bool arePrimitivesComplete () const
 Method to query whether all object primitives are in tact.
 
void setObjectData (const char *label, const int &data)
void setObjectData (const char *label, const int &data)
 Add data value (int) associated with a object element.
 
void setObjectData (const char *label, const uint &data)
void setObjectData (const char *label, const uint &data)
 Add data value (uint) associated with a object element.
 
void setObjectData (const char *label, const float &data)
void setObjectData (const char *label, const float &data)
 Add data value (float) associated with a object element.
 
void setObjectData (const char *label, const double &data)
void setObjectData (const char *label, const double &data)
 Add data value (double) associated with a object element.
 
void setObjectData (const char *label, const helios::vec2 &data)
void setObjectData (const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a object element.
 
void setObjectData (const char *label, const helios::vec3 &data)
void setObjectData (const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a object element.
 
void setObjectData (const char *label, const helios::vec4 &data)
void setObjectData (const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a object element.
 
void setObjectData (const char *label, const helios::int2 &data)
void setObjectData (const char *label, const helios::int2 &data)
 Add data value (int2) associated with a object element.
 
void setObjectData (const char *label, const helios::int3 &data)
void setObjectData (const char *label, const helios::int3 &data)
 Add data value (int3) associated with a object element.
 
void setObjectData (const char *label, const helios::int4 &data)
void setObjectData (const char *label, const helios::int4 &data)
 Add data value (int4) associated with a object element.
 
void setObjectData (const char *label, const std::string &data)
void setObjectData (const char *label, const std::string &data)
 Add data value (string) associated with a object element.
 
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
 Add (array) data associated with a object element.
 
void getObjectData (const char *label, int &data) const
void getObjectData (const char *label, int &data) const
 Get data associated with a object element (integer scalar)
 
void getObjectData (const char *label, std::vector< int > &data) const
void getObjectData (const char *label, std::vector< int > &data) const
 Get data associated with a object element (vector of integers)
 
void getObjectData (const char *label, uint &data) const
void getObjectData (const char *label, uint &data) const
 Get data associated with a object element (unsigned integer scalar)
 
void getObjectData (const char *label, std::vector< uint > &data) const
void getObjectData (const char *label, std::vector< uint > &data) const
 Get data associated with a object element (vector of unsigned integers)
 
void getObjectData (const char *label, float &data) const
void getObjectData (const char *label, float &data) const
 Get data associated with a object element (float scalar)
 
void getObjectData (const char *label, std::vector< float > &data) const
void getObjectData (const char *label, std::vector< float > &data) const
 Get data associated with a object element (vector of floats)
 
void getObjectData (const char *label, double &data) const
void getObjectData (const char *label, double &data) const
 Get data associated with a object element (double scalar)
 
void getObjectData (const char *label, std::vector< double > &data) const
void getObjectData (const char *label, std::vector< double > &data) const
 Get data associated with a object element (vector of doubles)
 
void getObjectData (const char *label, vec2 &data) const
void getObjectData (const char *label, vec2 &data) const
 Get data associated with a object element (vec2 scalar)
 
void getObjectData (const char *label, std::vector< vec2 > &data) const
void getObjectData (const char *label, std::vector< vec2 > &data) const
 Get data associated with a object element (vector of vec2's)
 
void getObjectData (const char *label, vec3 &data) const
void getObjectData (const char *label, vec3 &data) const
 Get data associated with a object element (vec3 scalar)
 
void getObjectData (const char *label, std::vector< vec3 > &data) const
void getObjectData (const char *label, std::vector< vec3 > &data) const
 Get data associated with a object element (vector of vec3's)
 
void getObjectData (const char *label, vec4 &data) const
void getObjectData (const char *label, vec4 &data) const
 Get data associated with a object element (vec4 scalar)
 
void getObjectData (const char *label, std::vector< vec4 > &data) const
void getObjectData (const char *label, std::vector< vec4 > &data) const
 Get data associated with a object element (vector of vec4's)
 
void getObjectData (const char *label, int2 &data) const
void getObjectData (const char *label, int2 &data) const
 Get data associated with a object element (int2 scalar)
 
void getObjectData (const char *label, std::vector< int2 > &data) const
void getObjectData (const char *label, std::vector< int2 > &data) const
 Get data associated with a object element (vector of int2's)
 
void getObjectData (const char *label, int3 &data) const
void getObjectData (const char *label, int3 &data) const
 Get data associated with a object element (int3 scalar)
 
void getObjectData (const char *label, std::vector< int3 > &data) const
void getObjectData (const char *label, std::vector< int3 > &data) const
 Get data associated with a object element (vector of int3's)
 
void getObjectData (const char *label, int4 &data) const
void getObjectData (const char *label, int4 &data) const
 Get data associated with a object element (int4 scalar)
 
void getObjectData (const char *label, std::vector< int4 > &data) const
void getObjectData (const char *label, std::vector< int4 > &data) const
 Get data associated with a object element (vector of int4's)
 
void getObjectData (const char *label, std::string &data) const
void getObjectData (const char *label, std::string &data) const
 Get data associated with a object element (string scalar)
 
void getObjectData (const char *label, std::vector< std::string > &data) const
void getObjectData (const char *label, std::vector< std::string > &data) const
 Get data associated with a object element (vector of strings)
 
HeliosDataType getObjectDataType (const char *label) const
HeliosDataType getObjectDataType (const char *label) const
 Get the Helios data type of object data.
 
uint getObjectDataSize (const char *label) const
uint getObjectDataSize (const char *label) const
 Get the size/length of object data.
 
bool doesObjectDataExist (const char *label) const
bool doesObjectDataExist (const char *label) const
 Check if object data 'label' exists.
 
void clearObjectData (const char *label)
void clearObjectData (const char *label)
 Clear the object data for this object.
 
std::vector< std::string > listObjectData () const
std::vector< std::string > listObjectData () const
 Return labels for all object data for this particular object.
 
- +

Friends

class CompoundObject
class CompoundObject
 

Detailed Description

@@ -350,37 +362,27 @@

Sphere::Sphere ( - uint  - a_OID, + uint a_OID, - const std::vector< uint > &  - a_UUIDs, + const std::vector< uint > & a_UUIDs, - uint  - a_subdiv, + uint a_subdiv, - const char *  - a_texturefile, + const char * a_texturefile, - helios::Context *  - a_context  - - - - ) - + helios::Context * a_context )

diff --git a/doc/html/classhelios_1_1_sphere.png b/doc/html/classhelios_1_1_sphere.png index d767d57ebb7128b3144d8583985745fd5f89d781..0384fba0d831c938ca7c3132ff60c8f9341eed77 100644 GIT binary patch delta 21 dcmey#@{?tP9oK^g5B~rEZ+bRt$wm)DCIE&Q3zz@^ delta 21 dcmey#@{?tP9oK;a2mb&6A3W*uij5wIOaOz83!DG| diff --git a/doc/html/classhelios_1_1_texture.html b/doc/html/classhelios_1_1_texture.html index e3931024d..ac3125636 100644 --- a/doc/html/classhelios_1_1_texture.html +++ b/doc/html/classhelios_1_1_texture.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -96,28 +108,28 @@

Texture map data structure. - More...

+ More...

#include <Context.h>

- + - + - + - + - + - +

Public Member Functions

 Texture (const char *texture_file)
 Texture (const char *texture_file)
 Constructor - initialize with given texture file.
 
std::string getTextureFile () const
std::string getTextureFile () const
 Get the name/path of the texture map file.
 
helios::int2 getImageResolution () const
helios::int2 getImageResolution () const
 Get the size of the texture in pixels (horizontal x vertical)
 
bool hasTransparencyChannel () const
bool hasTransparencyChannel () const
 Check whether the texture has a transparency channel.
 
const std::vector< std::vector< bool > > * getTransparencyData () const
const std::vector< std::vector< bool > > * getTransparencyData () const
 Get the data in the texture transparency channel (if it exists)
 
float getSolidFraction () const
float getSolidFraction () const
 Get the solid fraction of the texture transparency channel (if it exists)
 
@@ -138,8 +150,7 @@

Texture::Texture ( - const char *  - texture_file) + const char * texture_file) @@ -172,7 +183,7 @@

helios::int2 Texture::getImageResolution ( - ) + ) const @@ -193,7 +204,7 @@

float Texture::getSolidFraction ( - ) + ) const @@ -214,7 +225,7 @@

std::string Texture::getTextureFile ( - ) + ) const @@ -235,7 +246,7 @@

const std::vector< std::vector< bool > > * Texture::getTransparencyData ( - ) + ) const @@ -256,7 +267,7 @@

bool Texture::hasTransparencyChannel ( - ) + ) const @@ -275,7 +286,8 @@

+

diff --git a/doc/html/classhelios_1_1_tile.html b/doc/html/classhelios_1_1_tile.html index 6bb271289..4da934211 100644 --- a/doc/html/classhelios_1_1_tile.html +++ b/doc/html/classhelios_1_1_tile.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -97,7 +109,7 @@

Tile compound object class. - More...

+ More...

#include <Context.h>

@@ -112,234 +124,234 @@ - + - - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 Tile (uint a_OID, const std::vector< uint > &a_UUIDs, const int2 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Tile (uint a_OID, const std::vector< uint > &a_UUIDs, const int2 &a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Default constructor.
 
+
 ~Tile () override=default
 Tile destructor.
 
helios::vec2 getSize () const
helios::vec2 getSize () const
 Get the dimensions of the entire tile object.
 
vec3 getCenter () const
vec3 getCenter () const
 Get the Cartesian coordinates of the center of the tile object.
 
helios::int2 getSubdivisionCount () const
helios::int2 getSubdivisionCount () const
 Get the number of sub-patch divisions of the tile.
 
void setSubdivisionCount (const helios::int2 &subdiv)
void setSubdivisionCount (const helios::int2 &subdiv)
 Set the number of tile sub-patch divisions.
 
std::vector< helios::vec3getVertices () const
std::vector< helios::vec3getVertices () const
 Get the Cartesian coordinates of each of the four corners of the tile object.
 
vec3 getNormal () const
vec3 getNormal () const
 Get a unit vector normal to the tile object surface.
 
std::vector< helios::vec2getTextureUV () const
std::vector< helios::vec2getTextureUV () const
 Get the normalized (u,v) coordinates of the texture at each of the four corners of the tile object.
 
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
 Get the unique identifier for the object.
 
helios::ObjectType getObjectType () const
helios::ObjectType getObjectType () const
 Get an enumeration specifying the type of the object.
 
uint getPrimitiveCount () const
uint getPrimitiveCount () const
 Return the number of primitives contained in the object.
 
std::vector< uint > getPrimitiveUUIDs () const
std::vector< uint > getPrimitiveUUIDs () const
 Get the UUIDs for all primitives contained in the object.
 
bool doesObjectContainPrimitive (uint UUID)
bool doesObjectContainPrimitive (uint UUID)
 Check whether a primitive is a member of the object based on its UUID.
 
helios::vec3 getObjectCenter () const
helios::vec3 getObjectCenter () const
 Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
 
float getArea () const
float getArea () const
 Calculate the total one-sided surface area of the Compound Object.
 
void setColor (const helios::RGBcolor &color)
void setColor (const helios::RGBcolor &color)
 Method to set the diffuse color for all primitives in the Compound Object.
 
void setColor (const helios::RGBAcolor &color)
void setColor (const helios::RGBAcolor &color)
 Method to set the diffuse color (with transparency) for all primitives in the Compound Object.
 
void overrideTextureColor ()
void overrideTextureColor ()
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void useTextureColor ()
void useTextureColor ()
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
bool hasTexture () const
bool hasTexture () const
 Method to check whether this object has texture data.
 
std::string getTextureFile () const
std::string getTextureFile () const
 Method to return the texture map file of an Object.
 
void translate (const helios::vec3 &shift)
void translate (const helios::vec3 &shift)
 Method to translate/shift a Compound Object.
 
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
 Method to rotate a Compound Object about the x-, y-, or z-axis.
 
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary axis passing through the origin.
 
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary line (not necessarily passing through the origin)
 
void scale (const helios::vec3 &scale)
void scale (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutCenter (const helios::vec3 &scale)
void scaleAboutCenter (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
void getTransformationMatrix (float(&T)[16]) const
void getTransformationMatrix (float(&T)[16]) const
 Method to return the Affine transformation matrix of a Compound Object.
 
void setTransformationMatrix (float(&T)[16])
void setTransformationMatrix (float(&T)[16])
 Method to set the Affine transformation matrix of a Compound Object.
 
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
 Method to set the UUIDs of object child primitives.
 
void deleteChildPrimitive (uint UUID)
void deleteChildPrimitive (uint UUID)
 Delete a single child member of the object.
 
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
 Delete multiple child member of the object based on a vector of UUIDs.
 
bool arePrimitivesComplete () const
bool arePrimitivesComplete () const
 Method to query whether all object primitives are in tact.
 
void setObjectData (const char *label, const int &data)
void setObjectData (const char *label, const int &data)
 Add data value (int) associated with a object element.
 
void setObjectData (const char *label, const uint &data)
void setObjectData (const char *label, const uint &data)
 Add data value (uint) associated with a object element.
 
void setObjectData (const char *label, const float &data)
void setObjectData (const char *label, const float &data)
 Add data value (float) associated with a object element.
 
void setObjectData (const char *label, const double &data)
void setObjectData (const char *label, const double &data)
 Add data value (double) associated with a object element.
 
void setObjectData (const char *label, const helios::vec2 &data)
void setObjectData (const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a object element.
 
void setObjectData (const char *label, const helios::vec3 &data)
void setObjectData (const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a object element.
 
void setObjectData (const char *label, const helios::vec4 &data)
void setObjectData (const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a object element.
 
void setObjectData (const char *label, const helios::int2 &data)
void setObjectData (const char *label, const helios::int2 &data)
 Add data value (int2) associated with a object element.
 
void setObjectData (const char *label, const helios::int3 &data)
void setObjectData (const char *label, const helios::int3 &data)
 Add data value (int3) associated with a object element.
 
void setObjectData (const char *label, const helios::int4 &data)
void setObjectData (const char *label, const helios::int4 &data)
 Add data value (int4) associated with a object element.
 
void setObjectData (const char *label, const std::string &data)
void setObjectData (const char *label, const std::string &data)
 Add data value (string) associated with a object element.
 
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
 Add (array) data associated with a object element.
 
void getObjectData (const char *label, int &data) const
void getObjectData (const char *label, int &data) const
 Get data associated with a object element (integer scalar)
 
void getObjectData (const char *label, std::vector< int > &data) const
void getObjectData (const char *label, std::vector< int > &data) const
 Get data associated with a object element (vector of integers)
 
void getObjectData (const char *label, uint &data) const
void getObjectData (const char *label, uint &data) const
 Get data associated with a object element (unsigned integer scalar)
 
void getObjectData (const char *label, std::vector< uint > &data) const
void getObjectData (const char *label, std::vector< uint > &data) const
 Get data associated with a object element (vector of unsigned integers)
 
void getObjectData (const char *label, float &data) const
void getObjectData (const char *label, float &data) const
 Get data associated with a object element (float scalar)
 
void getObjectData (const char *label, std::vector< float > &data) const
void getObjectData (const char *label, std::vector< float > &data) const
 Get data associated with a object element (vector of floats)
 
void getObjectData (const char *label, double &data) const
void getObjectData (const char *label, double &data) const
 Get data associated with a object element (double scalar)
 
void getObjectData (const char *label, std::vector< double > &data) const
void getObjectData (const char *label, std::vector< double > &data) const
 Get data associated with a object element (vector of doubles)
 
void getObjectData (const char *label, vec2 &data) const
void getObjectData (const char *label, vec2 &data) const
 Get data associated with a object element (vec2 scalar)
 
void getObjectData (const char *label, std::vector< vec2 > &data) const
void getObjectData (const char *label, std::vector< vec2 > &data) const
 Get data associated with a object element (vector of vec2's)
 
void getObjectData (const char *label, vec3 &data) const
void getObjectData (const char *label, vec3 &data) const
 Get data associated with a object element (vec3 scalar)
 
void getObjectData (const char *label, std::vector< vec3 > &data) const
void getObjectData (const char *label, std::vector< vec3 > &data) const
 Get data associated with a object element (vector of vec3's)
 
void getObjectData (const char *label, vec4 &data) const
void getObjectData (const char *label, vec4 &data) const
 Get data associated with a object element (vec4 scalar)
 
void getObjectData (const char *label, std::vector< vec4 > &data) const
void getObjectData (const char *label, std::vector< vec4 > &data) const
 Get data associated with a object element (vector of vec4's)
 
void getObjectData (const char *label, int2 &data) const
void getObjectData (const char *label, int2 &data) const
 Get data associated with a object element (int2 scalar)
 
void getObjectData (const char *label, std::vector< int2 > &data) const
void getObjectData (const char *label, std::vector< int2 > &data) const
 Get data associated with a object element (vector of int2's)
 
void getObjectData (const char *label, int3 &data) const
void getObjectData (const char *label, int3 &data) const
 Get data associated with a object element (int3 scalar)
 
void getObjectData (const char *label, std::vector< int3 > &data) const
void getObjectData (const char *label, std::vector< int3 > &data) const
 Get data associated with a object element (vector of int3's)
 
void getObjectData (const char *label, int4 &data) const
void getObjectData (const char *label, int4 &data) const
 Get data associated with a object element (int4 scalar)
 
void getObjectData (const char *label, std::vector< int4 > &data) const
void getObjectData (const char *label, std::vector< int4 > &data) const
 Get data associated with a object element (vector of int4's)
 
void getObjectData (const char *label, std::string &data) const
void getObjectData (const char *label, std::string &data) const
 Get data associated with a object element (string scalar)
 
void getObjectData (const char *label, std::vector< std::string > &data) const
void getObjectData (const char *label, std::vector< std::string > &data) const
 Get data associated with a object element (vector of strings)
 
HeliosDataType getObjectDataType (const char *label) const
HeliosDataType getObjectDataType (const char *label) const
 Get the Helios data type of object data.
 
uint getObjectDataSize (const char *label) const
uint getObjectDataSize (const char *label) const
 Get the size/length of object data.
 
bool doesObjectDataExist (const char *label) const
bool doesObjectDataExist (const char *label) const
 Check if object data 'label' exists.
 
void clearObjectData (const char *label)
void clearObjectData (const char *label)
 Clear the object data for this object.
 
std::vector< std::string > listObjectData () const
std::vector< std::string > listObjectData () const
 Return labels for all object data for this particular object.
 
- +

Friends

class CompoundObject
class CompoundObject
 

Detailed Description

@@ -356,37 +368,27 @@

Tile::Tile ( - uint  - a_OID, + uint a_OID, - const std::vector< uint > &  - a_UUIDs, + const std::vector< uint > & a_UUIDs, - const int2 &  - a_subdiv, + const int2 & a_subdiv, - const char *  - a_texturefile, + const char * a_texturefile, - helios::Context *  - a_context  - - - - ) - + helios::Context * a_context )

@@ -407,7 +409,7 @@

vec3 Tile::getCenter ( - ) + ) const @@ -428,7 +430,7 @@

vec3 Tile::getNormal ( - ) + ) const @@ -449,7 +451,7 @@

helios::vec2 Tile::getSize ( - ) + ) const @@ -470,7 +472,7 @@

helios::int2 Tile::getSubdivisionCount ( - ) + ) const @@ -491,7 +493,7 @@

std::vector< helios::vec2 > Tile::getTextureUV ( - ) + ) const @@ -512,7 +514,7 @@

std::vector< helios::vec3 > Tile::getVertices ( - ) + ) const @@ -533,8 +535,7 @@

void Tile::setSubdivisionCount ( - const helios::int2 &  - subdiv) + const helios::int2 & subdiv) @@ -553,7 +554,7 @@

Friends And Related Function Documentation

+

Friends And Related Symbol Documentation

◆ CompoundObject

@@ -585,7 +586,8 @@

+

diff --git a/doc/html/classhelios_1_1_tile.png b/doc/html/classhelios_1_1_tile.png index 3cc71ad6c1f3fcae5d0b702ac27fbe7ff4b03f23..479c0930fef0e67c23472e6e7082fafe4b77f441 100644 GIT binary patch delta 21 dcmcb}a*<_%9oK^g5B~rEZ+bRt$wm)OCIEkk3m^ah delta 21 dcmcb}a*<_%9oK;a2mb&6A3W*uij5weOaOfS3nTyl diff --git a/doc/html/classhelios_1_1_tube.html b/doc/html/classhelios_1_1_tube.html index 841f93c8a..b33088db5 100644 --- a/doc/html/classhelios_1_1_tube.html +++ b/doc/html/classhelios_1_1_tube.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
Public Member Functions | @@ -97,7 +109,7 @@

Tube compound object class. - More...

+ More...

#include <Context.h>

@@ -112,255 +124,255 @@ - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

 Tube (uint a_OID, const std::vector< uint > &a_UUIDs, const std::vector< vec3 > &a_nodes, const std::vector< float > &a_radius, const std::vector< helios::RGBcolor > &a_colors, const std::vector< std::vector< helios::vec3 > > &a_triangle_vertices, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Tube (uint a_OID, const std::vector< uint > &a_UUIDs, const std::vector< vec3 > &a_nodes, const std::vector< float > &a_radius, const std::vector< helios::RGBcolor > &a_colors, const std::vector< std::vector< helios::vec3 > > &a_triangle_vertices, uint a_subdiv, const char *a_texturefile, helios::Context *a_context)
 Default constructor.
 
+
 ~Tube () override=default
 Tube destructor.
 
std::vector< helios::vec3getNodes () const
std::vector< helios::vec3getNodes () const
 Get the Cartesian coordinates of each of the tube object nodes.
 
std::vector< float > getNodeRadii () const
std::vector< float > getNodeRadii () const
 Get the radius at each of the tube object nodes.
 
std::vector< helios::RGBcolorgetNodeColors () const
std::vector< helios::RGBcolorgetNodeColors () const
 Get the colors at each of the tube object nodes.
 
std::vector< std::vector< helios::vec3 > > getTriangleVertices () const
std::vector< std::vector< helios::vec3 > > getTriangleVertices () const
 Get positions of triangle vertices comprising the tube object.
 
uint getSubdivisionCount () const
uint getSubdivisionCount () const
 Get the number of sub-triangle divisions of the tube object.
 
float getLength () const
float getLength () const
 Get the length of the tube object.
 
float getVolume () const
float getVolume () const
 Get the volume of the tube object.
 
float getSegmentVolume (uint segment_index) const
float getSegmentVolume (uint segment_index) const
 Get the volume of a segment within the tube object.
 
void appendTubeSegment (const helios::vec3 &node_position, float node_radius, const helios::RGBcolor &node_color)
void appendTubeSegment (const helios::vec3 &node_position, float node_radius, const helios::RGBcolor &node_color)
 Append an additional segment to the existing tube object.
 
void appendTubeSegment (const helios::vec3 &node_position, float node_radius, const char *texturefile, const helios::vec2 &textureuv_ufrac)
void appendTubeSegment (const helios::vec3 &node_position, float node_radius, const char *texturefile, const helios::vec2 &textureuv_ufrac)
 Append an additional segment to the existing tube object.
 
void scaleTubeGirth (float S)
void scaleTubeGirth (float S)
 Scale the girth of the tube object.
 
void setTubeRadii (const std::vector< float > &node_radii)
void setTubeRadii (const std::vector< float > &node_radii)
 Set tube radii at each segment node.
 
void scaleTubeLength (float S)
void scaleTubeLength (float S)
 Scale the length of the tube object.
 
void setTubeNodes (const std::vector< helios::vec3 > &node_xyz)
void setTubeNodes (const std::vector< helios::vec3 > &node_xyz)
 Set tube vertex coordinates at each segment node.
 
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
- Public Member Functions inherited from helios::CompoundObject
uint getObjectID () const
 Get the unique identifier for the object.
 
helios::ObjectType getObjectType () const
helios::ObjectType getObjectType () const
 Get an enumeration specifying the type of the object.
 
uint getPrimitiveCount () const
uint getPrimitiveCount () const
 Return the number of primitives contained in the object.
 
std::vector< uint > getPrimitiveUUIDs () const
std::vector< uint > getPrimitiveUUIDs () const
 Get the UUIDs for all primitives contained in the object.
 
bool doesObjectContainPrimitive (uint UUID)
bool doesObjectContainPrimitive (uint UUID)
 Check whether a primitive is a member of the object based on its UUID.
 
helios::vec3 getObjectCenter () const
helios::vec3 getObjectCenter () const
 Calculate the Cartesian (x,y,z) point of the center of a bounding box for the Compound Object.
 
float getArea () const
float getArea () const
 Calculate the total one-sided surface area of the Compound Object.
 
void setColor (const helios::RGBcolor &color)
void setColor (const helios::RGBcolor &color)
 Method to set the diffuse color for all primitives in the Compound Object.
 
void setColor (const helios::RGBAcolor &color)
void setColor (const helios::RGBAcolor &color)
 Method to set the diffuse color (with transparency) for all primitives in the Compound Object.
 
void overrideTextureColor ()
void overrideTextureColor ()
 Override the color in the texture map for all primitives in the Compound Object, in which case the primitives will be colored by the constant RGB color, but will apply the transparency channel in the texture to determine its shape.
 
void useTextureColor ()
void useTextureColor ()
 For all primitives in the Compound Object, use the texture map to color the primitives rather than the constant RGB color. This is method reverses a previous call to overrideTextureColor(). Note that using the texture color is the default behavior.
 
bool hasTexture () const
bool hasTexture () const
 Method to check whether this object has texture data.
 
std::string getTextureFile () const
std::string getTextureFile () const
 Method to return the texture map file of an Object.
 
void translate (const helios::vec3 &shift)
void translate (const helios::vec3 &shift)
 Method to translate/shift a Compound Object.
 
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
void rotate (float rotation_radians, const char *rotation_axis_xyz_string)
 Method to rotate a Compound Object about the x-, y-, or z-axis.
 
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary axis passing through the origin.
 
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
void rotate (float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)
 Method to rotate a Compound Object about an arbitrary line (not necessarily passing through the origin)
 
void scale (const helios::vec3 &scale)
void scale (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutCenter (const helios::vec3 &scale)
void scaleAboutCenter (const helios::vec3 &scale)
 Method to scale a compound object in the x-, y- and z-directions.
 
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
void scaleAboutPoint (const helios::vec3 &scale, const helios::vec3 &point)
 Method to scale a compound object in the x-, y- and z-directions.
 
void getTransformationMatrix (float(&T)[16]) const
void getTransformationMatrix (float(&T)[16]) const
 Method to return the Affine transformation matrix of a Compound Object.
 
void setTransformationMatrix (float(&T)[16])
void setTransformationMatrix (float(&T)[16])
 Method to set the Affine transformation matrix of a Compound Object.
 
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
void setPrimitiveUUIDs (const std::vector< uint > &UUIDs)
 Method to set the UUIDs of object child primitives.
 
void deleteChildPrimitive (uint UUID)
void deleteChildPrimitive (uint UUID)
 Delete a single child member of the object.
 
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
void deleteChildPrimitive (const std::vector< uint > &UUIDs)
 Delete multiple child member of the object based on a vector of UUIDs.
 
bool arePrimitivesComplete () const
bool arePrimitivesComplete () const
 Method to query whether all object primitives are in tact.
 
void setObjectData (const char *label, const int &data)
void setObjectData (const char *label, const int &data)
 Add data value (int) associated with a object element.
 
void setObjectData (const char *label, const uint &data)
void setObjectData (const char *label, const uint &data)
 Add data value (uint) associated with a object element.
 
void setObjectData (const char *label, const float &data)
void setObjectData (const char *label, const float &data)
 Add data value (float) associated with a object element.
 
void setObjectData (const char *label, const double &data)
void setObjectData (const char *label, const double &data)
 Add data value (double) associated with a object element.
 
void setObjectData (const char *label, const helios::vec2 &data)
void setObjectData (const char *label, const helios::vec2 &data)
 Add data value (vec2) associated with a object element.
 
void setObjectData (const char *label, const helios::vec3 &data)
void setObjectData (const char *label, const helios::vec3 &data)
 Add data value (vec3) associated with a object element.
 
void setObjectData (const char *label, const helios::vec4 &data)
void setObjectData (const char *label, const helios::vec4 &data)
 Add data value (vec4) associated with a object element.
 
void setObjectData (const char *label, const helios::int2 &data)
void setObjectData (const char *label, const helios::int2 &data)
 Add data value (int2) associated with a object element.
 
void setObjectData (const char *label, const helios::int3 &data)
void setObjectData (const char *label, const helios::int3 &data)
 Add data value (int3) associated with a object element.
 
void setObjectData (const char *label, const helios::int4 &data)
void setObjectData (const char *label, const helios::int4 &data)
 Add data value (int4) associated with a object element.
 
void setObjectData (const char *label, const std::string &data)
void setObjectData (const char *label, const std::string &data)
 Add data value (string) associated with a object element.
 
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
void setObjectData (const char *label, HeliosDataType type, uint size, void *data)
 Add (array) data associated with a object element.
 
void getObjectData (const char *label, int &data) const
void getObjectData (const char *label, int &data) const
 Get data associated with a object element (integer scalar)
 
void getObjectData (const char *label, std::vector< int > &data) const
void getObjectData (const char *label, std::vector< int > &data) const
 Get data associated with a object element (vector of integers)
 
void getObjectData (const char *label, uint &data) const
void getObjectData (const char *label, uint &data) const
 Get data associated with a object element (unsigned integer scalar)
 
void getObjectData (const char *label, std::vector< uint > &data) const
void getObjectData (const char *label, std::vector< uint > &data) const
 Get data associated with a object element (vector of unsigned integers)
 
void getObjectData (const char *label, float &data) const
void getObjectData (const char *label, float &data) const
 Get data associated with a object element (float scalar)
 
void getObjectData (const char *label, std::vector< float > &data) const
void getObjectData (const char *label, std::vector< float > &data) const
 Get data associated with a object element (vector of floats)
 
void getObjectData (const char *label, double &data) const
void getObjectData (const char *label, double &data) const
 Get data associated with a object element (double scalar)
 
void getObjectData (const char *label, std::vector< double > &data) const
void getObjectData (const char *label, std::vector< double > &data) const
 Get data associated with a object element (vector of doubles)
 
void getObjectData (const char *label, vec2 &data) const
void getObjectData (const char *label, vec2 &data) const
 Get data associated with a object element (vec2 scalar)
 
void getObjectData (const char *label, std::vector< vec2 > &data) const
void getObjectData (const char *label, std::vector< vec2 > &data) const
 Get data associated with a object element (vector of vec2's)
 
void getObjectData (const char *label, vec3 &data) const
void getObjectData (const char *label, vec3 &data) const
 Get data associated with a object element (vec3 scalar)
 
void getObjectData (const char *label, std::vector< vec3 > &data) const
void getObjectData (const char *label, std::vector< vec3 > &data) const
 Get data associated with a object element (vector of vec3's)
 
void getObjectData (const char *label, vec4 &data) const
void getObjectData (const char *label, vec4 &data) const
 Get data associated with a object element (vec4 scalar)
 
void getObjectData (const char *label, std::vector< vec4 > &data) const
void getObjectData (const char *label, std::vector< vec4 > &data) const
 Get data associated with a object element (vector of vec4's)
 
void getObjectData (const char *label, int2 &data) const
void getObjectData (const char *label, int2 &data) const
 Get data associated with a object element (int2 scalar)
 
void getObjectData (const char *label, std::vector< int2 > &data) const
void getObjectData (const char *label, std::vector< int2 > &data) const
 Get data associated with a object element (vector of int2's)
 
void getObjectData (const char *label, int3 &data) const
void getObjectData (const char *label, int3 &data) const
 Get data associated with a object element (int3 scalar)
 
void getObjectData (const char *label, std::vector< int3 > &data) const
void getObjectData (const char *label, std::vector< int3 > &data) const
 Get data associated with a object element (vector of int3's)
 
void getObjectData (const char *label, int4 &data) const
void getObjectData (const char *label, int4 &data) const
 Get data associated with a object element (int4 scalar)
 
void getObjectData (const char *label, std::vector< int4 > &data) const
void getObjectData (const char *label, std::vector< int4 > &data) const
 Get data associated with a object element (vector of int4's)
 
void getObjectData (const char *label, std::string &data) const
void getObjectData (const char *label, std::string &data) const
 Get data associated with a object element (string scalar)
 
void getObjectData (const char *label, std::vector< std::string > &data) const
void getObjectData (const char *label, std::vector< std::string > &data) const
 Get data associated with a object element (vector of strings)
 
HeliosDataType getObjectDataType (const char *label) const
HeliosDataType getObjectDataType (const char *label) const
 Get the Helios data type of object data.
 
uint getObjectDataSize (const char *label) const
uint getObjectDataSize (const char *label) const
 Get the size/length of object data.
 
bool doesObjectDataExist (const char *label) const
bool doesObjectDataExist (const char *label) const
 Check if object data 'label' exists.
 
void clearObjectData (const char *label)
void clearObjectData (const char *label)
 Clear the object data for this object.
 
std::vector< std::string > listObjectData () const
std::vector< std::string > listObjectData () const
 Return labels for all object data for this particular object.
 
- +

Friends

class CompoundObject
class CompoundObject
 

Detailed Description

@@ -377,61 +389,47 @@

Tube::Tube ( - uint  - a_OID, + uint a_OID, - const std::vector< uint > &  - a_UUIDs, + const std::vector< uint > & a_UUIDs, - const std::vector< vec3 > &  - a_nodes, + const std::vector< vec3 > & a_nodes, - const std::vector< float > &  - a_radius, + const std::vector< float > & a_radius, - const std::vector< helios::RGBcolor > &  - a_colors, + const std::vector< helios::RGBcolor > & a_colors, - const std::vector< std::vector< helios::vec3 > > &  - a_triangle_vertices, + const std::vector< std::vector< helios::vec3 > > & a_triangle_vertices, - uint  - a_subdiv, + uint a_subdiv, - const char *  - a_texturefile, + const char * a_texturefile, - helios::Context *  - a_context  - - - - ) - + helios::Context * a_context )

@@ -452,31 +450,22 @@

void Tube::appendTubeSegment ( - const helios::vec3 &  - node_position, + const helios::vec3 & node_position, - float  - node_radius, + float node_radius, - const char *  - texturefile, + const char * texturefile, - const helios::vec2 &  - textureuv_ufrac  - - - - ) - + const helios::vec2 & textureuv_ufrac )

@@ -505,25 +494,17 @@

void Tube::appendTubeSegment ( - const helios::vec3 &  - node_position, + const helios::vec3 & node_position, - float  - node_radius, + float node_radius, - const helios::RGBcolor &  - node_color  - - - - ) - + const helios::RGBcolor & node_color )

diff --git a/doc/html/classhelios_1_1_tube.png b/doc/html/classhelios_1_1_tube.png index eaba7e8304c9f2f5d59a7e18826038f6830c25c3..e131ca2a51eb7498e46274aa4f6236547bbafad4 100644 GIT binary patch delta 21 dcmcb^a))Jt9oK^g5B~rEZ+bRt$wm(mCIEp}3qb$? delta 21 dcmcb^a))Jt9oK;a2mb&6A3W*uij5v3OaOk%3q=3` diff --git a/doc/html/classhelios_1_1_x_m_lparser.html b/doc/html/classhelios_1_1_x_m_lparser.html index 671bfdc6a..c8887b2ff 100644 --- a/doc/html/classhelios_1_1_x_m_lparser.html +++ b/doc/html/classhelios_1_1_x_m_lparser.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
@@ -96,76 +108,76 @@

Class for parsing XML input files. - More...

+ More...

#include <Context.h>

- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Static Public Member Functions

static int parse_data_float (const pugi::xml_node &node_data, std::vector< float > &data)
static int parse_data_float (const pugi::xml_node &node_data, std::vector< float > &data)
 Parse vector data of type 'float' within an XML tag.
 
static int parse_data_double (const pugi::xml_node &node_data, std::vector< double > &data)
static int parse_data_double (const pugi::xml_node &node_data, std::vector< double > &data)
 Parse vector data of type 'double' within an XML tag.
 
static int parse_data_int (const pugi::xml_node &node_data, std::vector< int > &data)
static int parse_data_int (const pugi::xml_node &node_data, std::vector< int > &data)
 Parse vector data of type 'int' within an XML tag.
 
static int parse_data_uint (const pugi::xml_node &node_data, std::vector< uint > &data)
static int parse_data_uint (const pugi::xml_node &node_data, std::vector< uint > &data)
 Parse vector data of type 'uint' within an XML tag.
 
static int parse_data_string (const pugi::xml_node &node_data, std::vector< std::string > &data)
static int parse_data_string (const pugi::xml_node &node_data, std::vector< std::string > &data)
 Parse vector data of type 'string' within an XML tag.
 
static int parse_data_vec2 (const pugi::xml_node &node_data, std::vector< vec2 > &data)
static int parse_data_vec2 (const pugi::xml_node &node_data, std::vector< vec2 > &data)
 Parse vector data of type 'vec2' within an XML tag.
 
static int parse_data_vec3 (const pugi::xml_node &node_data, std::vector< vec3 > &data)
static int parse_data_vec3 (const pugi::xml_node &node_data, std::vector< vec3 > &data)
 Parse vector data of type 'vec3' within an XML tag.
 
static int parse_data_vec4 (const pugi::xml_node &node_data, std::vector< vec4 > &data)
static int parse_data_vec4 (const pugi::xml_node &node_data, std::vector< vec4 > &data)
 Parse vector data of type 'vac4' within an XML tag.
 
static int parse_data_int2 (const pugi::xml_node &node_data, std::vector< int2 > &data)
static int parse_data_int2 (const pugi::xml_node &node_data, std::vector< int2 > &data)
 Parse vector data of type 'int2' within an XML tag.
 
static int parse_data_int3 (const pugi::xml_node &node_data, std::vector< int3 > &data)
static int parse_data_int3 (const pugi::xml_node &node_data, std::vector< int3 > &data)
 Parse vector data of type 'int3' within an XML tag.
 
static int parse_data_int4 (const pugi::xml_node &node_data, std::vector< int4 > &data)
static int parse_data_int4 (const pugi::xml_node &node_data, std::vector< int4 > &data)
 Parse vector data of type 'int4' within an XML tag.
 
static int parse_objID (const pugi::xml_node &node_data, uint &objID)
static int parse_objID (const pugi::xml_node &node_data, uint &objID)
 Parse the value within an <objID> (object ID) tag.
 
static int parse_transform (const pugi::xml_node &node_data, float(&transform)[16])
static int parse_transform (const pugi::xml_node &node_data, float(&transform)[16])
 Parse the value within a <transform> (transformation matrix) tag.
 
static int parse_texture (const pugi::xml_node &node_data, std::string &texture)
static int parse_texture (const pugi::xml_node &node_data, std::string &texture)
 Parse the value within an <texture> (path to image texture) tag.
 
static int parse_textureUV (const pugi::xml_node &node_data, std::vector< vec2 > &uvs)
static int parse_textureUV (const pugi::xml_node &node_data, std::vector< vec2 > &uvs)
 Parse the value within a <textureUV> (texture coordinates) tag.
 
static int parse_solid_fraction (const pugi::xml_node &node_data, float &solid_fraction)
static int parse_solid_fraction (const pugi::xml_node &node_data, float &solid_fraction)
 Parse the value within a <solid_fraction> (primitive solid fraction) tag.
 
static int parse_vertices (const pugi::xml_node &node_data, std::vector< float > &vertices)
static int parse_vertices (const pugi::xml_node &node_data, std::vector< float > &vertices)
 Parse the value within a <vertices> (primitive vertex coordinates) tag.
 
static int parse_subdivisions (const pugi::xml_node &node_data, uint &subdivisions)
static int parse_subdivisions (const pugi::xml_node &node_data, uint &subdivisions)
 Parse the value within a <subdivisions> (object sub-primitive resolution) tag.
 
static int parse_subdivisions (const pugi::xml_node &node_data, int2 &subdivisions)
static int parse_subdivisions (const pugi::xml_node &node_data, int2 &subdivisions)
 Parse the value within a <subdivisions> (object sub-primitive resolution) tag.
 
static int parse_subdivisions (const pugi::xml_node &node_data, int3 &subdivisions)
static int parse_subdivisions (const pugi::xml_node &node_data, int3 &subdivisions)
 Parse the value within a <subdivisions> (object sub-primitive resolution) tag.
 
static int parse_nodes (const pugi::xml_node &node_data, std::vector< vec3 > &nodes)
static int parse_nodes (const pugi::xml_node &node_data, std::vector< vec3 > &nodes)
 Parse the value within a <nodes> (coordinates defining nodes of a tube or cone) tag.
 
static int parse_radius (const pugi::xml_node &node_data, std::vector< float > &radius)
static int parse_radius (const pugi::xml_node &node_data, std::vector< float > &radius)
 Parse the value within a <radius> (radius at nodes of a tube or cone) tag.
 
@@ -186,19 +198,12 @@

int XMLparser::parse_data_double ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< double > &  - data  - - - - ) - + std::vector< double > & data ) @@ -234,19 +239,12 @@

int XMLparser::parse_data_float ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< float > &  - data  - - - - ) - + std::vector< float > & data ) @@ -282,19 +280,12 @@

int XMLparser::parse_data_int ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< int > &  - data  - - - - ) - + std::vector< int > & data ) @@ -330,19 +321,12 @@

int XMLparser::parse_data_int2 ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< int2 > &  - data  - - - - ) - + std::vector< int2 > & data ) @@ -378,19 +362,12 @@

int XMLparser::parse_data_int3 ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< int3 > &  - data  - - - - ) - + std::vector< int3 > & data ) @@ -426,19 +403,12 @@

int XMLparser::parse_data_int4 ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< int4 > &  - data  - - - - ) - + std::vector< int4 > & data ) @@ -474,19 +444,12 @@

int XMLparser::parse_data_string ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< std::string > &  - data  - - - - ) - + std::vector< std::string > & data ) @@ -522,19 +485,12 @@

int XMLparser::parse_data_uint ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< uint > &  - data  - - - - ) - + std::vector< uint > & data ) @@ -570,19 +526,12 @@

int XMLparser::parse_data_vec2 ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< vec2 > &  - data  - - - - ) - + std::vector< vec2 > & data ) @@ -618,19 +567,12 @@

int XMLparser::parse_data_vec3 ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< vec3 > &  - data  - - - - ) - + std::vector< vec3 > & data ) @@ -666,19 +608,12 @@

int XMLparser::parse_data_vec4 ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< vec4 > &  - data  - - - - ) - + std::vector< vec4 > & data ) @@ -714,19 +649,12 @@

int XMLparser::parse_nodes ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< vec3 > &  - nodes  - - - - ) - + std::vector< vec3 > & nodes ) @@ -762,19 +690,12 @@

int XMLparser::parse_objID ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - uint &  - objID  - - - - ) - + uint & objID ) @@ -810,19 +731,12 @@

int XMLparser::parse_radius ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< float > &  - radius  - - - - ) - + std::vector< float > & radius ) @@ -858,19 +772,12 @@

int XMLparser::parse_solid_fraction ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - float &  - solid_fraction  - - - - ) - + float & solid_fraction ) @@ -906,19 +813,12 @@

int XMLparser::parse_subdivisions ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - int2 &  - subdivisions  - - - - ) - + int2 & subdivisions ) @@ -954,19 +854,12 @@

int XMLparser::parse_subdivisions ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - int3 &  - subdivisions  - - - - ) - + int3 & subdivisions ) @@ -1002,19 +895,12 @@

int XMLparser::parse_subdivisions ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - uint &  - subdivisions  - - - - ) - + uint & subdivisions ) @@ -1050,19 +936,12 @@

int XMLparser::parse_texture ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::string &  - texture  - - - - ) - + std::string & texture ) @@ -1098,19 +977,12 @@

int XMLparser::parse_textureUV ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< vec2 > &  - uvs  - - - - ) - + std::vector< vec2 > & uvs ) @@ -1146,19 +1018,12 @@

int XMLparser::parse_transform ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - float(&)  - transform[16]  - - - - ) - + float(&) transform[16] ) @@ -1194,19 +1059,12 @@

int XMLparser::parse_vertices ( - const pugi::xml_node &  - node_data, + const pugi::xml_node & node_data, - std::vector< float > &  - vertices  - - - - ) - + std::vector< float > & vertices ) @@ -1237,7 +1095,8 @@

+

diff --git a/doc/html/clipboard.js b/doc/html/clipboard.js new file mode 100644 index 000000000..42c1fb0e0 --- /dev/null +++ b/doc/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/doc/html/context_globaldata.html b/doc/html/context_globaldata.html index 8d1e40b6f..aaa9917ae 100644 --- a/doc/html/context_globaldata.html +++ b/doc/html/context_globaldata.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Tutorial 6: Global Data
+
Tutorial 6: Global Data

@@ -161,7 +173,8 @@

+
diff --git a/doc/html/context_primdata.html b/doc/html/context_primdata.html index 2b0750557..1db1cf7e1 100644 --- a/doc/html/context_primdata.html +++ b/doc/html/context_primdata.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Tutorial 5: Primitive Data
+
Tutorial 5: Primitive Data

@@ -208,7 +220,8 @@

+
diff --git a/doc/html/context_primitives.html b/doc/html/context_primitives.html index f4bb15b02..66eb2b9fb 100644 --- a/doc/html/context_primitives.html +++ b/doc/html/context_primitives.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Tutorial 2: Working with Context Geometry
+
Tutorial 2: Working with Context Geometry

@@ -168,7 +180,8 @@

+
diff --git a/doc/html/context_selftest.html b/doc/html/context_selftest.html index a755eee22..148947fba 100644 --- a/doc/html/context_selftest.html +++ b/doc/html/context_selftest.html @@ -38,30 +38,41 @@ Logo -
 v1.3.25 +
 v1.3.26
- + + + +
+
-
Tutorial 0: Context Self-Test Tutorial
+
Tutorial 0: Context Self-Test Tutorial

This tutorial illustrates a very simple example of how to declare the Helios context, and run its self-test function. The self-test function runs through a series of sanity checks to verify that the core system is working properly. This tutorial will illustrate how to:

@@ -102,7 +114,9 @@
  • Build and compile the core Helios library.
  • -C++ Program <br>

    +C++ Program

    +


    +

    We will first write a basic C++ program that uses types included as part of the Helios library. The program is written in the same way any C++ program, and contains a main function. Helios simply provides a group of data types and functions that manages model geometry and data. These types and functions are defined in the header file "Context.h", which must be included in any files that use Helios constructs.

     #include "Context.h"
     
    @@ -154,7 +168,8 @@ 

    + diff --git a/doc/html/context_vectors.html b/doc/html/context_vectors.html index 467672371..2c3840cae 100644 --- a/doc/html/context_vectors.html +++ b/doc/html/context_vectors.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    -
    Tutorial 1: Helios Vector Types Tutorial
    +
    Tutorial 1: Helios Vector Types Tutorial

    There are several vector types commonly used in Helios, which are listed in the table below. These are essentially C++ structures, that contain several data elements and functions to operate on that data.

    @@ -230,7 +242,8 @@

    +
    diff --git a/doc/html/cookie.js b/doc/html/cookie.js new file mode 100644 index 000000000..53ad21d98 --- /dev/null +++ b/doc/html/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/doc/html/core_2src_2self_test_8cpp.html b/doc/html/core_2src_2self_test_8cpp.html index dcbf7f473..f324ceb0c 100644 --- a/doc/html/core_2src_2self_test_8cpp.html +++ b/doc/html/core_2src_2self_test_8cpp.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    selfTest.cpp File Reference
    @@ -105,7 +117,8 @@
    + diff --git a/doc/html/core_2src_2self_test_8cpp_source.html b/doc/html/core_2src_2self_test_8cpp_source.html index 88992e0c6..caa0ceabb 100644 --- a/doc/html/core_2src_2self_test_8cpp_source.html +++ b/doc/html/core_2src_2self_test_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    selfTest.cpp
    @@ -97,6 +109,7 @@
    17
    18using namespace helios;
    19
    +
    21
    22 std::cout << "Running Context self-test..." << std::flush;
    @@ -1334,134 +1347,136 @@
    1254 }
    1255
    1256}
    +
    -
    @ HELIOS_TYPE_DOUBLE
    double data type
    Definition: Context.h:49
    -
    @ HELIOS_TYPE_FLOAT
    floating point data type
    Definition: Context.h:47
    -
    PrimitiveType
    Type of primitive element.
    Definition: Context.h:31
    -
    @ PRIMITIVE_TYPE_PATCH
    < Rectangular primitive
    Definition: Context.h:33
    -
    @ PRIMITIVE_TYPE_TRIANGLE
    < Triangular primitive
    Definition: Context.h:35
    -
    void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
    Method to rotate a Compound Object about the x-, y-, or z-axis.
    Definition: Context.cpp:2377
    -
    void translate(const helios::vec3 &shift)
    Method to translate/shift a Compound Object.
    Definition: Context.cpp:2353
    -
    std::vector< uint > getPrimitiveUUIDs() const
    Get the UUIDs for all primitives contained in the object.
    Definition: Context.cpp:2256
    -
    void getObjectData(const char *label, int &data) const
    Get data associated with a object element (integer scalar)
    -
    std::vector< helios::vec3 > getNodeCoordinates() const
    Get the Cartesian coordinates of each of the cone object nodes.
    Definition: Context.cpp:4130
    -
    void scaleLength(float S)
    Method to scale the length of the cone.
    Definition: Context.cpp:4212
    -
    void scaleGirth(float S)
    Method to scale the girth of the cone.
    Definition: Context.cpp:4261
    -
    std::vector< float > getNodeRadii() const
    Get the radius at each of the cone object nodes.
    Definition: Context.cpp:4159
    -
    Stores the state associated with simulation.
    Definition: Context.h:1882
    -
    void setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)
    Change the subdivision count of a tile object.
    Definition: Context.cpp:2982
    -
    helios::RGBcolor getPrimitiveColor(uint UUID) const
    Method to return the diffuse color of a Primitive.
    Definition: Context.cpp:7127
    -
    std::vector< uint > loadXML(const char *filename, bool quiet=false)
    Load inputs specified in an XML file.
    -
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition: Context.cpp:1406
    -
    float getPrimitiveArea(uint UUID) const
    Method to return the surface area of a Primitive.
    Definition: Context.cpp:7053
    -
    void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
    Load tabular weather data from text file into timeseries.
    -
    void getPrimitiveData(uint UUID, const char *label, int &data) const
    Get data associated with a primitive element.
    -
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition: Context.cpp:1536
    -
    bool doesObjectDataExist(uint objID, const char *label) const
    Check if primitive data 'label' exists.
    -
    std::vector< uint > getAllObjectIDs() const
    Get the IDs for all Compound Objects in the Context.
    Definition: Context.cpp:2589
    -
    Cone * getConeObjectPointer(uint ObjID) const
    Get a pointer to a Cone Compound Object.
    Definition: Context.cpp:4123
    -
    void getObjectData(uint objID, const char *label, int &data) const
    Get data associated with a compound object.
    -
    CompoundObject * getObjectPointer(uint ObjID) const
    Get a pointer to a Compound Object.
    Definition: Context.cpp:2574
    -
    helios::vec3 getPatchCenter(uint UUID) const
    Get the Cartesian (x,y,z) center position of a patch element.
    Definition: Context.cpp:1693
    -
    std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
    Filter a set of primitives based on their primitive data and a condition and float value.
    -
    void calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, float &sum) const
    Calculate sum of primitive data values (float) for a subset of primitives.
    -
    std::string getPrimitiveTextureFile(uint UUID) const
    Get the path to texture map file for primitive. If primitive does not have a texture map,...
    Definition: Context.cpp:7159
    -
    uint getObjectCount() const
    Get the total number of objects that have been created in the Context.
    Definition: Context.cpp:2581
    -
    std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
    Get u-v texture coordinates at primitive vertices.
    Definition: Context.cpp:7175
    -
    void setDate(int day, int month, int year)
    Set simulation date by day, month, year.
    Definition: Context.cpp:1059
    -
    void setPrimitiveParentObjectID(uint UUID, uint objID)
    Method to set the ID of the parent object the primitive belongs to (default is object 0)
    Definition: Context.cpp:6988
    -
    bool doesGlobalDataExist(const char *label) const
    Check if global data 'label' exists.
    -
    PrimitiveType getPrimitiveType(uint UUID) const
    Method to get the Primitive type.
    Definition: Context.cpp:6984
    -
    void setObjectData(uint objID, const char *label, const int &data)
    Add data value (int) associated with a compound object.
    -
    float getPrimitiveSolidFraction(uint UUID) const
    Get fraction of primitive surface area that is non-transparent.
    Definition: Context.cpp:7221
    -
    bool doesPrimitiveDataExist(uint UUID, const char *label) const
    Check if primitive data 'label' exists.
    -
    std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
    Get primitive UUIDs associated with compound object (single object ID input)
    Definition: Context.cpp:2907
    -
    uint copyPrimitive(uint UUID)
    Make a copy of a primitive from the context.
    Definition: Context.cpp:1578
    -
    std::vector< uint > loadOBJ(const char *filename, bool silent=false)
    Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
    -
    void calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, float &mean) const
    Calculate mean of primitive data values (float) for a subset of primitives.
    -
    void getGlobalData(const char *label, int &data) const
    Get global data value (scalar integer)
    -
    std::vector< uint > getAllUUIDs() const
    Get all primitive UUIDs currently in the Context.
    Definition: Context.cpp:1763
    -
    float getTileObjectAreaRatio(uint ObjectID) const
    Get the area ratio of a tile object (total object area / sub-patch area)
    Definition: Context.cpp:2944
    -
    void setGlobalData(const char *label, const int &data)
    Add global data value (int)
    -
    void scalePrimitive(uint UUID, const helios::vec3 &S)
    Scale a primitive using its UUID relative to the origin (0,0,0)
    Definition: Context.cpp:1491
    -
    helios::vec2 getPatchSize(uint UUID) const
    Get the size of a patch element.
    Definition: Context.cpp:1684
    -
    void getPrimitiveBoundingBox(uint UUID, vec3 &min_corner, vec3 &max_corner) const
    Get the axis-aligned bounding box for a single primitive.
    Definition: Context.cpp:7057
    -
    void writeXML(const char *filename, bool quiet=false) const
    Write Context geometry and data to XML file for all UUIDs in the context.
    -
    helios::vec3 getPrimitiveNormal(uint UUID) const
    Method to return the normal vector of a Primitive.
    Definition: Context.cpp:7104
    -
    void setPrimitiveData(const uint &UUID, const char *label, const int &data)
    Add data value (int) associated with a primitive element.
    -
    void calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const
    Calculate mean of primitive data values (float) for a subset of primitives, where each value in the m...
    -
    bool doesPrimitiveExist(uint UUID) const
    Check if primitive exists for a given UUID.
    Definition: Context.cpp:1659
    -
    Tile * getTileObjectPointer(uint ObjID) const
    Get a pointer to a Tile Compound Object.
    Definition: Context.cpp:3312
    -
    float getBoxObjectVolume(uint ObjID) const
    get the volume of a Box object from the context
    Definition: Context.cpp:8234
    -
    void setTime(int minute, int hour)
    Set simulation time.
    Definition: Context.cpp:1136
    -
    std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
    Method to return the (x,y,z) coordinates of the vertices of a Primitive.
    Definition: Context.cpp:7122
    -
    static int selfTest()
    Run a self-test of the Context. The Context self-test runs through validation checks of Context-relat...
    Definition: selfTest.cpp:20
    -
    std::string getFileExtension(const std::string &filepath)
    Parse a file string to get the extension.
    Definition: global.cpp:3075
    -
    std::string getFileName(const std::string &filepath)
    Parse a file string to get the filename including extension.
    Definition: global.cpp:3085
    -
    int JulianDay(int day, int month, int year)
    Convert calendar day (day,month,year) to Julian day.
    Definition: global.cpp:1350
    -
    std::string getFileStem(const std::string &filepath)
    Parse a file string to get the filename without extension.
    Definition: global.cpp:3080
    -
    std::string getFilePath(const std::string &filepath, bool trailingslash=true)
    Parse a file string to get the path (i.e., portion of the string before the file name).
    Definition: global.cpp:3090
    -
    SphericalCoord nullrotation
    Default null SphericalCoord that applies no rotation.
    Definition: global.cpp:57
    -
    uint addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
    Add new Disk geometric primitive to the Context given its center, and size.
    Definition: Context.cpp:5256
    -
    uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition: Context.cpp:4728
    -
    uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
    Add a 3D cone compound object to the Context.
    Definition: Context.cpp:5426
    -
    uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
    Add a rectangular prism tessellated with Patch primitives.
    Definition: Context.cpp:5000
    -
    uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition: Context.cpp:4550
    -
    uint addSphereObject(uint Ndivs, const vec3 &center, float radius)
    Add a spherical compound object to the Context.
    Definition: Context.cpp:4310
    -
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition: global.cpp:610
    -
    helios::vec3 spline_interp3(float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
    Function to perform cubic Hermite spline interpolation.
    Definition: global.cpp:2768
    -
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition: global.cpp:617
    -
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:241
    -
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition: Context.cpp:1328
    -
    uint getPrimitiveCount() const
    Get the total number of Primitives in the Context.
    Definition: Context.cpp:1759
    -
    uint addPatch()
    Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
    Definition: Context.cpp:1212
    -
    void setCurrentTimeseriesPoint(const char *label, uint index)
    Set the Context date and time by providing the index of a timeseries data point.
    Definition: Context.cpp:1886
    -
    Time queryTimeseriesTime(const char *label, uint index) const
    Get the time associated with a timeseries data point.
    Definition: Context.cpp:1958
    -
    uint getTimeseriesLength(const char *label) const
    Get the length of timeseries data.
    Definition: Context.cpp:2014
    -
    float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
    Get a timeseries data point by specifying a date and time vector.
    Definition: Context.cpp:1894
    -
    void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
    Add a data point to timeseries of data.
    Definition: Context.cpp:1823
    -
    Date queryTimeseriesDate(const char *label, uint index) const
    Get the date associated with a timeseries data point.
    Definition: Context.cpp:1994
    -
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    -
    Time make_Time(int hour, int minute)
    Make a Time vector.
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    Date make_Date(int day, int month, int year)
    Make a Date vector.
    -
    Date Julian2Calendar(int JulianDay, int year)
    Convert a Julian day to a calendar Date vector.
    -
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    - -
    int month
    Month of year.
    -
    int day
    Day of month.
    -
    int year
    Year in YYYY format.
    -
    R-G-B color vector.
    -
    float b
    Blue color component.
    -
    float r
    Red color component.
    -
    float g
    Green color component.
    -
    Vector of spherical coordinates (elevation,azimuth)
    - -
    const float & zenith
    Zenithal angle (radians)
    -
    const float & elevation
    Elevation angle (radians)
    -
    float azimuth
    Azimuthal angle (radians)
    - -
    int second
    Second of minute.
    -
    int hour
    Hour of day.
    -
    int minute
    Minute of hour.
    -
    Vector of two elements of type 'int'.
    -
    Vector of three elements of type 'int'.
    -
    Vector of two elements of type 'float'.
    -
    float x
    First element in vector.
    -
    float y
    Second element in vector.
    -
    Vector of three elements of type 'float'.
    -
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    -
    float x
    First element in vector.
    -
    float z
    Third element in vector.
    -
    float y
    Second element in vector.
    -
    float magnitude() const
    Compute the vector magnitude.
    +
    @ HELIOS_TYPE_DOUBLE
    double data type
    Definition Context.h:49
    +
    @ HELIOS_TYPE_FLOAT
    floating point data type
    Definition Context.h:47
    +
    PrimitiveType
    Type of primitive element.
    Definition Context.h:31
    +
    @ PRIMITIVE_TYPE_PATCH
    < Rectangular primitive
    Definition Context.h:33
    +
    @ PRIMITIVE_TYPE_TRIANGLE
    < Triangular primitive
    Definition Context.h:35
    +
    void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
    Method to rotate a Compound Object about the x-, y-, or z-axis.
    Definition Context.cpp:2377
    +
    void translate(const helios::vec3 &shift)
    Method to translate/shift a Compound Object.
    Definition Context.cpp:2353
    +
    std::vector< uint > getPrimitiveUUIDs() const
    Get the UUIDs for all primitives contained in the object.
    Definition Context.cpp:2256
    +
    void getObjectData(const char *label, int &data) const
    Get data associated with a object element (integer scalar)
    +
    std::vector< helios::vec3 > getNodeCoordinates() const
    Get the Cartesian coordinates of each of the cone object nodes.
    Definition Context.cpp:4130
    +
    void scaleLength(float S)
    Method to scale the length of the cone.
    Definition Context.cpp:4212
    +
    void scaleGirth(float S)
    Method to scale the girth of the cone.
    Definition Context.cpp:4261
    +
    std::vector< float > getNodeRadii() const
    Get the radius at each of the cone object nodes.
    Definition Context.cpp:4159
    +
    Stores the state associated with simulation.
    Definition Context.h:1882
    +
    void setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)
    Change the subdivision count of a tile object.
    Definition Context.cpp:2982
    +
    helios::RGBcolor getPrimitiveColor(uint UUID) const
    Method to return the diffuse color of a Primitive.
    Definition Context.cpp:7127
    +
    std::vector< uint > loadXML(const char *filename, bool quiet=false)
    Load inputs specified in an XML file.
    +
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition Context.cpp:1406
    +
    float getPrimitiveArea(uint UUID) const
    Method to return the surface area of a Primitive.
    Definition Context.cpp:7053
    +
    void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
    Load tabular weather data from text file into timeseries.
    +
    void getPrimitiveData(uint UUID, const char *label, int &data) const
    Get data associated with a primitive element.
    +
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition Context.cpp:1536
    +
    bool doesObjectDataExist(uint objID, const char *label) const
    Check if primitive data 'label' exists.
    +
    std::vector< uint > getAllObjectIDs() const
    Get the IDs for all Compound Objects in the Context.
    Definition Context.cpp:2589
    +
    Cone * getConeObjectPointer(uint ObjID) const
    Get a pointer to a Cone Compound Object.
    Definition Context.cpp:4123
    +
    void getObjectData(uint objID, const char *label, int &data) const
    Get data associated with a compound object.
    +
    CompoundObject * getObjectPointer(uint ObjID) const
    Get a pointer to a Compound Object.
    Definition Context.cpp:2574
    +
    helios::vec3 getPatchCenter(uint UUID) const
    Get the Cartesian (x,y,z) center position of a patch element.
    Definition Context.cpp:1693
    +
    std::vector< uint > filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)
    Filter a set of primitives based on their primitive data and a condition and float value.
    +
    void calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, float &sum) const
    Calculate sum of primitive data values (float) for a subset of primitives.
    +
    std::string getPrimitiveTextureFile(uint UUID) const
    Get the path to texture map file for primitive. If primitive does not have a texture map,...
    Definition Context.cpp:7159
    +
    uint getObjectCount() const
    Get the total number of objects that have been created in the Context.
    Definition Context.cpp:2581
    +
    std::vector< vec2 > getPrimitiveTextureUV(uint UUID) const
    Get u-v texture coordinates at primitive vertices.
    Definition Context.cpp:7175
    +
    void setDate(int day, int month, int year)
    Set simulation date by day, month, year.
    Definition Context.cpp:1059
    +
    void setPrimitiveParentObjectID(uint UUID, uint objID)
    Method to set the ID of the parent object the primitive belongs to (default is object 0)
    Definition Context.cpp:6988
    +
    bool doesGlobalDataExist(const char *label) const
    Check if global data 'label' exists.
    +
    PrimitiveType getPrimitiveType(uint UUID) const
    Method to get the Primitive type.
    Definition Context.cpp:6984
    +
    void setObjectData(uint objID, const char *label, const int &data)
    Add data value (int) associated with a compound object.
    +
    float getPrimitiveSolidFraction(uint UUID) const
    Get fraction of primitive surface area that is non-transparent.
    Definition Context.cpp:7221
    +
    bool doesPrimitiveDataExist(uint UUID, const char *label) const
    Check if primitive data 'label' exists.
    +
    std::vector< uint > getObjectPrimitiveUUIDs(uint ObjID) const
    Get primitive UUIDs associated with compound object (single object ID input)
    Definition Context.cpp:2907
    +
    uint copyPrimitive(uint UUID)
    Make a copy of a primitive from the context.
    Definition Context.cpp:1578
    +
    std::vector< uint > loadOBJ(const char *filename, bool silent=false)
    Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
    +
    void calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, float &mean) const
    Calculate mean of primitive data values (float) for a subset of primitives.
    +
    void getGlobalData(const char *label, int &data) const
    Get global data value (scalar integer)
    +
    std::vector< uint > getAllUUIDs() const
    Get all primitive UUIDs currently in the Context.
    Definition Context.cpp:1763
    +
    float getTileObjectAreaRatio(uint ObjectID) const
    Get the area ratio of a tile object (total object area / sub-patch area)
    Definition Context.cpp:2944
    +
    void setGlobalData(const char *label, const int &data)
    Add global data value (int)
    +
    void scalePrimitive(uint UUID, const helios::vec3 &S)
    Scale a primitive using its UUID relative to the origin (0,0,0)
    Definition Context.cpp:1491
    +
    helios::vec2 getPatchSize(uint UUID) const
    Get the size of a patch element.
    Definition Context.cpp:1684
    +
    void getPrimitiveBoundingBox(uint UUID, vec3 &min_corner, vec3 &max_corner) const
    Get the axis-aligned bounding box for a single primitive.
    Definition Context.cpp:7057
    +
    void writeXML(const char *filename, bool quiet=false) const
    Write Context geometry and data to XML file for all UUIDs in the context.
    +
    helios::vec3 getPrimitiveNormal(uint UUID) const
    Method to return the normal vector of a Primitive.
    Definition Context.cpp:7104
    +
    void setPrimitiveData(const uint &UUID, const char *label, const int &data)
    Add data value (int) associated with a primitive element.
    +
    void calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const
    Calculate mean of primitive data values (float) for a subset of primitives, where each value in the m...
    +
    bool doesPrimitiveExist(uint UUID) const
    Check if primitive exists for a given UUID.
    Definition Context.cpp:1659
    +
    Tile * getTileObjectPointer(uint ObjID) const
    Get a pointer to a Tile Compound Object.
    Definition Context.cpp:3312
    +
    float getBoxObjectVolume(uint ObjID) const
    get the volume of a Box object from the context
    Definition Context.cpp:8234
    +
    void setTime(int minute, int hour)
    Set simulation time.
    Definition Context.cpp:1136
    +
    std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
    Method to return the (x,y,z) coordinates of the vertices of a Primitive.
    Definition Context.cpp:7122
    +
    static int selfTest()
    Run a self-test of the Context. The Context self-test runs through validation checks of Context-relat...
    Definition selfTest.cpp:20
    +
    std::string getFileExtension(const std::string &filepath)
    Parse a file string to get the extension.
    Definition global.cpp:3075
    +
    std::string getFileName(const std::string &filepath)
    Parse a file string to get the filename including extension.
    Definition global.cpp:3085
    +
    int JulianDay(int day, int month, int year)
    Convert calendar day (day,month,year) to Julian day.
    Definition global.cpp:1350
    +
    std::string getFileStem(const std::string &filepath)
    Parse a file string to get the filename without extension.
    Definition global.cpp:3080
    +
    std::string getFilePath(const std::string &filepath, bool trailingslash=true)
    Parse a file string to get the path (i.e., portion of the string before the file name).
    Definition global.cpp:3090
    +
    SphericalCoord nullrotation
    Default null SphericalCoord that applies no rotation.
    Definition global.cpp:57
    +
    uint addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
    Add new Disk geometric primitive to the Context given its center, and size.
    Definition Context.cpp:5256
    +
    uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition Context.cpp:4728
    +
    uint addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)
    Add a 3D cone compound object to the Context.
    Definition Context.cpp:5426
    +
    uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
    Add a rectangular prism tessellated with Patch primitives.
    Definition Context.cpp:5000
    +
    uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition Context.cpp:4550
    +
    uint addSphereObject(uint Ndivs, const vec3 &center, float radius)
    Add a spherical compound object to the Context.
    Definition Context.cpp:4310
    +
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition global.cpp:610
    +
    helios::vec3 spline_interp3(float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
    Function to perform cubic Hermite spline interpolation.
    Definition global.cpp:2768
    +
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition global.cpp:617
    +
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:241
    +
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition Context.cpp:1328
    +
    uint getPrimitiveCount() const
    Get the total number of Primitives in the Context.
    Definition Context.cpp:1759
    +
    uint addPatch()
    Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
    Definition Context.cpp:1212
    +
    void setCurrentTimeseriesPoint(const char *label, uint index)
    Set the Context date and time by providing the index of a timeseries data point.
    Definition Context.cpp:1886
    +
    Time queryTimeseriesTime(const char *label, uint index) const
    Get the time associated with a timeseries data point.
    Definition Context.cpp:1958
    +
    uint getTimeseriesLength(const char *label) const
    Get the length of timeseries data.
    Definition Context.cpp:2014
    +
    float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
    Get a timeseries data point by specifying a date and time vector.
    Definition Context.cpp:1894
    +
    void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
    Add a data point to timeseries of data.
    Definition Context.cpp:1823
    +
    Date queryTimeseriesDate(const char *label, uint index) const
    Get the date associated with a timeseries data point.
    Definition Context.cpp:1994
    +
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    +
    Time make_Time(int hour, int minute)
    Make a Time vector.
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    Date make_Date(int day, int month, int year)
    Make a Date vector.
    +
    Date Julian2Calendar(int JulianDay, int year)
    Convert a Julian day to a calendar Date vector.
    +
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    + +
    int month
    Month of year.
    +
    int day
    Day of month.
    +
    int year
    Year in YYYY format.
    +
    R-G-B color vector.
    +
    float b
    Blue color component.
    +
    float r
    Red color component.
    +
    float g
    Green color component.
    +
    Vector of spherical coordinates (elevation,azimuth)
    + +
    const float & zenith
    Zenithal angle (radians)
    +
    const float & elevation
    Elevation angle (radians)
    +
    float azimuth
    Azimuthal angle (radians)
    + +
    int second
    Second of minute.
    +
    int hour
    Hour of day.
    +
    int minute
    Minute of hour.
    +
    Vector of two elements of type 'int'.
    +
    Vector of three elements of type 'int'.
    +
    Vector of two elements of type 'float'.
    +
    float x
    First element in vector.
    +
    float y
    Second element in vector.
    +
    Vector of three elements of type 'float'.
    +
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    float x
    First element in vector.
    +
    float z
    Third element in vector.
    +
    float y
    Second element in vector.
    +
    float magnitude() const
    Compute the vector magnitude.
    + diff --git a/doc/html/dir_000a2e4fe776603f09c56917fe929269.html b/doc/html/dir_000a2e4fe776603f09c56917fe929269.html index 5e1859f34..f05690dfc 100644 --- a/doc/html/dir_000a2e4fe776603f09c56917fe929269.html +++ b/doc/html/dir_000a2e4fe776603f09c56917fe929269.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Files

    file  EnergyBalanceModel.cpp [code]
     EnergyBalanceModel.cpp
     
    file  EnergyBalanceModel.cu [code]
     EnergyBalanceModel.cu
     
    + diff --git a/doc/html/dir_01af3122a6d2fc081d545f111575c8ac.html b/doc/html/dir_01af3122a6d2fc081d545f111575c8ac.html index a0cb99d36..7e09ca23f 100644 --- a/doc/html/dir_01af3122a6d2fc081d545f111575c8ac.html +++ b/doc/html/dir_01af3122a6d2fc081d545f111575c8ac.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_0581b1fc91af6cc2594fe789a424270d.html b/doc/html/dir_0581b1fc91af6cc2594fe789a424270d.html index 58760569a..d01ee4c5a 100644 --- a/doc/html/dir_0581b1fc91af6cc2594fe789a424270d.html +++ b/doc/html/dir_0581b1fc91af6cc2594fe789a424270d.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_09ba98b3b490a60de71fb62d89fe47cd.html b/doc/html/dir_09ba98b3b490a60de71fb62d89fe47cd.html index 63dfe1888..b56a7f42d 100644 --- a/doc/html/dir_09ba98b3b490a60de71fb62d89fe47cd.html +++ b/doc/html/dir_09ba98b3b490a60de71fb62d89fe47cd.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  LeafOptics.cpp [code]
     LeafOptics.cpp
     
    + diff --git a/doc/html/dir_0b377c449e87c33e20eed98f7cc3a6cc.html b/doc/html/dir_0b377c449e87c33e20eed98f7cc3a6cc.html index 896946b29..24bad547c 100644 --- a/doc/html/dir_0b377c449e87c33e20eed98f7cc3a6cc.html +++ b/doc/html/dir_0b377c449e87c33e20eed98f7cc3a6cc.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  Visualizer.h [code]
     Visualizer.h
     
    + diff --git a/doc/html/dir_0ed0e5ef04d2b4b7edd36da5802052a6.html b/doc/html/dir_0ed0e5ef04d2b4b7edd36da5802052a6.html index 905c808fb..ebe6cc69d 100644 --- a/doc/html/dir_0ed0e5ef04d2b4b7edd36da5802052a6.html +++ b/doc/html/dir_0ed0e5ef04d2b4b7edd36da5802052a6.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_10651e710c37b90bb60afaa4d2c6a975.html b/doc/html/dir_10651e710c37b90bb60afaa4d2c6a975.html index 9f2c6c30d..cf0e3b477 100644 --- a/doc/html/dir_10651e710c37b90bb60afaa4d2c6a975.html +++ b/doc/html/dir_10651e710c37b90bb60afaa4d2c6a975.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Files

    file  Assets.h [code]
     Assets.h
     
    file  PlantArchitecture.h [code]
     PlantArchitecture.h
     
    + diff --git a/doc/html/dir_1736472fec890ec3b25c5f707a1ad41b.html b/doc/html/dir_1736472fec890ec3b25c5f707a1ad41b.html index d3616e3d4..8d677e856 100644 --- a/doc/html/dir_1736472fec890ec3b25c5f707a1ad41b.html +++ b/doc/html/dir_1736472fec890ec3b25c5f707a1ad41b.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + + + diff --git a/doc/html/dir_1b48a9a5d33ab4b7862a4538757abad5.html b/doc/html/dir_1b48a9a5d33ab4b7862a4538757abad5.html index b40d45e59..eeed8a288 100644 --- a/doc/html/dir_1b48a9a5d33ab4b7862a4538757abad5.html +++ b/doc/html/dir_1b48a9a5d33ab4b7862a4538757abad5.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  Visualizer.cpp [code]
     Visualizer.cpp
     
    + diff --git a/doc/html/dir_1c54673618a694dbf6d60994b9e4cd26.html b/doc/html/dir_1c54673618a694dbf6d60994b9e4cd26.html index acaf501c0..8be027d2c 100644 --- a/doc/html/dir_1c54673618a694dbf6d60994b9e4cd26.html +++ b/doc/html/dir_1c54673618a694dbf6d60994b9e4cd26.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Files

    file  selfTest.cpp [code]
     selfTest.cpp
     
    file  SolarPosition.cpp [code]
     SolarPosition.cpp
     
    + diff --git a/doc/html/dir_1f4a8e9b5fbfec7b9342d55d1c70b0d3.html b/doc/html/dir_1f4a8e9b5fbfec7b9342d55d1c70b0d3.html index 4a708f035..42dcd59eb 100644 --- a/doc/html/dir_1f4a8e9b5fbfec7b9342d55d1c70b0d3.html +++ b/doc/html/dir_1f4a8e9b5fbfec7b9342d55d1c70b0d3.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,23 +107,24 @@ - + - + - + - + - + - +

    Files

    file  Assets.cpp [code]
     Assets.cpp
     
    file  CarbohydrateModel.cpp [code]
     CarbohydrateModel.cpp
     
    file  InputOutput.cpp [code]
     InputOutput.cpp
     
    file  PlantArchitecture.cpp [code]
     PlantArchitecture.cpp
     
    file  PlantLibrary.cpp [code]
     PlantLibrary.cpp
     
    file  selfTest.cpp [code]
     selfTest.cpp
     
    + diff --git a/doc/html/dir_24d671cfcbc5d5238a6bd565a49d198f.html b/doc/html/dir_24d671cfcbc5d5238a6bd565a49d198f.html index dd58c6c98..f07907a5d 100644 --- a/doc/html/dir_24d671cfcbc5d5238a6bd565a49d198f.html +++ b/doc/html/dir_24d671cfcbc5d5238a6bd565a49d198f.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,17 +107,18 @@ - + - + - +

    Files

    file  Context.h [code]
     Context.h
     
    file  global.h [code]
     global.h
     
    file  helios_vector_types.h [code]
     helios_vector_types.h
     
    + diff --git a/doc/html/dir_2dbe15cacd8389cc56dad1ecef740014.html b/doc/html/dir_2dbe15cacd8389cc56dad1ecef740014.html index 8c4c9e139..f1dc38652 100644 --- a/doc/html/dir_2dbe15cacd8389cc56dad1ecef740014.html +++ b/doc/html/dir_2dbe15cacd8389cc56dad1ecef740014.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    solarposition Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_311a8078924eda44cf0bc3884606fa36.html b/doc/html/dir_311a8078924eda44cf0bc3884606fa36.html index 110997414..d8177d6e1 100644 --- a/doc/html/dir_311a8078924eda44cf0bc3884606fa36.html +++ b/doc/html/dir_311a8078924eda44cf0bc3884606fa36.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    aeriallidar Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_324b51d306f9962e8d7b85b82cd2c869.html b/doc/html/dir_324b51d306f9962e8d7b85b82cd2c869.html index 48c080bae..63f2ae665 100644 --- a/doc/html/dir_324b51d306f9962e8d7b85b82cd2c869.html +++ b/doc/html/dir_324b51d306f9962e8d7b85b82cd2c869.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_3771cc92d713de3e5272f9ad4d0b1912.html b/doc/html/dir_3771cc92d713de3e5272f9ad4d0b1912.html index 243bccb4f..6f38654a3 100644 --- a/doc/html/dir_3771cc92d713de3e5272f9ad4d0b1912.html +++ b/doc/html/dir_3771cc92d713de3e5272f9ad4d0b1912.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    TutorialVideos Directory Reference
    @@ -95,13 +107,14 @@ - +

    Directories

    directory  RadiationModelPt2
     RadiationModelPt2
     
    + diff --git a/doc/html/dir_38c8d24aef3972a7f87b834274e76e31.html b/doc/html/dir_38c8d24aef3972a7f87b834274e76e31.html index c5dc6642b..15a6bd654 100644 --- a/doc/html/dir_38c8d24aef3972a7f87b834274e76e31.html +++ b/doc/html/dir_38c8d24aef3972a7f87b834274e76e31.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    plugins Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_3b948ba013618d5b0560477725ec43e1.html b/doc/html/dir_3b948ba013618d5b0560477725ec43e1.html index 02003f496..b70894b6f 100644 --- a/doc/html/dir_3b948ba013618d5b0560477725ec43e1.html +++ b/doc/html/dir_3b948ba013618d5b0560477725ec43e1.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    voxelintersection Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_3d4da5c581737ecd0f864ccf0711fd92.html b/doc/html/dir_3d4da5c581737ecd0f864ccf0711fd92.html index fe4fb6049..2faada944 100644 --- a/doc/html/dir_3d4da5c581737ecd0f864ccf0711fd92.html +++ b/doc/html/dir_3d4da5c581737ecd0f864ccf0711fd92.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_3d6a603070d279a42ac417e5c8a6aba1.html b/doc/html/dir_3d6a603070d279a42ac417e5c8a6aba1.html index 5e8bf400d..6d8d3ea8f 100644 --- a/doc/html/dir_3d6a603070d279a42ac417e5c8a6aba1.html +++ b/doc/html/dir_3d6a603070d279a42ac417e5c8a6aba1.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  LeafOptics.h [code]
     LeafOptics.h
     
    + diff --git a/doc/html/dir_40ea2a4aa4adfc7dc77aa13d0834001b.html b/doc/html/dir_40ea2a4aa4adfc7dc77aa13d0834001b.html index 0d33c62c7..0594d4134 100644 --- a/doc/html/dir_40ea2a4aa4adfc7dc77aa13d0834001b.html +++ b/doc/html/dir_40ea2a4aa4adfc7dc77aa13d0834001b.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,19 +107,20 @@ - + - + - + - +

    Files

    file  CameraCalibration.h [code]
     CameraCalibration.h
     
    file  RadiationModel.h [code]
     RadiationModel.h
     
    file  random.h [code]
     random.h
     
    file  RayTracing.cu.h [code]
     RayTracing.cu.h
     
    + diff --git a/doc/html/dir_418637634c2136ee3716f84b17e3fdeb.html b/doc/html/dir_418637634c2136ee3716f84b17e3fdeb.html index 33fd1b798..b5e1c243b 100644 --- a/doc/html/dir_418637634c2136ee3716f84b17e3fdeb.html +++ b/doc/html/dir_418637634c2136ee3716f84b17e3fdeb.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  PhotosynthesisModel.h [code]
     PhotosynthesisModel.h
     
    + diff --git a/doc/html/dir_4270bfced15e0e73154b13468c7c9ad9.html b/doc/html/dir_4270bfced15e0e73154b13468c7c9ad9.html index 1f31016fd..6de653628 100644 --- a/doc/html/dir_4270bfced15e0e73154b13468c7c9ad9.html +++ b/doc/html/dir_4270bfced15e0e73154b13468c7c9ad9.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    core Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_4942485e7dfd848fb997bfbb4ff4feb4.html b/doc/html/dir_4942485e7dfd848fb997bfbb4ff4feb4.html index 663156749..b9fbbb7ed 100644 --- a/doc/html/dir_4942485e7dfd848fb997bfbb4ff4feb4.html +++ b/doc/html/dir_4942485e7dfd848fb997bfbb4ff4feb4.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Files

    file  VoxelIntersection.cpp [code]
     VoxelIntersection.cpp
     
    file  VoxelIntersection.cu [code]
     VoxelIntersection.cu
     
    + diff --git a/doc/html/dir_4ccbab8385dcba906f6a2cce80a3b511.html b/doc/html/dir_4ccbab8385dcba906f6a2cce80a3b511.html index 0455470e1..e72d0b119 100644 --- a/doc/html/dir_4ccbab8385dcba906f6a2cce80a3b511.html +++ b/doc/html/dir_4ccbab8385dcba906f6a2cce80a3b511.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  PhotosynthesisModel.cpp [code]
     PhotosynthesisModel.cpp
     
    + diff --git a/doc/html/dir_51eab06546c34d501c6cf953a16a9cc5.html b/doc/html/dir_51eab06546c34d501c6cf953a16a9cc5.html index daaac7ef6..b08fbd6c0 100644 --- a/doc/html/dir_51eab06546c34d501c6cf953a16a9cc5.html +++ b/doc/html/dir_51eab06546c34d501c6cf953a16a9cc5.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  StomatalConductanceModel.cpp [code]
     StomatalConductanceModel.cpp
     
    + diff --git a/doc/html/dir_53e799243804d32eb30709605e43a53b.html b/doc/html/dir_53e799243804d32eb30709605e43a53b.html index b577dc297..4922df8c6 100644 --- a/doc/html/dir_53e799243804d32eb30709605e43a53b.html +++ b/doc/html/dir_53e799243804d32eb30709605e43a53b.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    energybalance Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_562cb346de9113a49164a1513c42aa1c.html b/doc/html/dir_562cb346de9113a49164a1513c42aa1c.html index ab940b68a..c7a1d8b38 100644 --- a/doc/html/dir_562cb346de9113a49164a1513c42aa1c.html +++ b/doc/html/dir_562cb346de9113a49164a1513c42aa1c.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  SyntheticAnnotation.cpp [code]
     SyntheticAnnotation.cpp
     
    + diff --git a/doc/html/dir_577e0cdb3e2614f5a260ea490887b143.html b/doc/html/dir_577e0cdb3e2614f5a260ea490887b143.html index d9293e4e7..eb6f20452 100644 --- a/doc/html/dir_577e0cdb3e2614f5a260ea490887b143.html +++ b/doc/html/dir_577e0cdb3e2614f5a260ea490887b143.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  DummyModel.h [code]
     DummyModel.h
     
    + diff --git a/doc/html/dir_58badfc9ced8151ac5118cd2e12bebf1.html b/doc/html/dir_58badfc9ced8151ac5118cd2e12bebf1.html index c6a4034a6..11841bbe7 100644 --- a/doc/html/dir_58badfc9ced8151ac5118cd2e12bebf1.html +++ b/doc/html/dir_58badfc9ced8151ac5118cd2e12bebf1.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,27 +107,28 @@ - + - + - + - + - + - + - + - +

    Files

    file  bean.cpp [code]
     bean.cpp
     
    file  CanopyGenerator.cpp [code]
     CanopyGenerator.cpp
     
    file  grapevine.cpp [code]
     grapevine.cpp
     
    file  sorghum.cpp [code]
     sorghum.cpp
     
    file  strawberry.cpp [code]
     strawberry.cpp
     
    file  tomato.cpp [code]
     tomato.cpp
     
    file  walnut.cpp [code]
     walnut.cpp
     
    file  whitespruce.cpp [code]
     whitespruce.cpp
     
    + diff --git a/doc/html/dir_594f7d9c1b5f727f933fa022588b0b7d.html b/doc/html/dir_594f7d9c1b5f727f933fa022588b0b7d.html index ec2826efe..1e9442550 100644 --- a/doc/html/dir_594f7d9c1b5f727f933fa022588b0b7d.html +++ b/doc/html/dir_594f7d9c1b5f727f933fa022588b0b7d.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  StomatalConductanceModel.h [code]
     StomatalConductanceModel.h
     
    + diff --git a/doc/html/dir_59c6a555a98729b3f6a8f77608cc74a4.html b/doc/html/dir_59c6a555a98729b3f6a8f77608cc74a4.html index 5d9a98772..72d5d86ad 100644 --- a/doc/html/dir_59c6a555a98729b3f6a8f77608cc74a4.html +++ b/doc/html/dir_59c6a555a98729b3f6a8f77608cc74a4.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  CanopyGenerator.h [code]
     CanopyGenerator.h
     
    + diff --git a/doc/html/dir_615177bc4a60bdbaf2db637460677b64.html b/doc/html/dir_615177bc4a60bdbaf2db637460677b64.html index 5b99844cf..268933000 100644 --- a/doc/html/dir_615177bc4a60bdbaf2db637460677b64.html +++ b/doc/html/dir_615177bc4a60bdbaf2db637460677b64.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    canopygenerator Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_6252300d35bf0f8a4d6b5ccb98672957.html b/doc/html/dir_6252300d35bf0f8a4d6b5ccb98672957.html index 7895157d0..67fb05f85 100644 --- a/doc/html/dir_6252300d35bf0f8a4d6b5ccb98672957.html +++ b/doc/html/dir_6252300d35bf0f8a4d6b5ccb98672957.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  EnergyBalanceModel.h [code]
     EnergyBalanceModel.h
     
    + diff --git a/doc/html/dir_6576ef5c45e1ae696f88b82c16a4c6c0.html b/doc/html/dir_6576ef5c45e1ae696f88b82c16a4c6c0.html index cb29d542b..6b4840e63 100644 --- a/doc/html/dir_6576ef5c45e1ae696f88b82c16a4c6c0.html +++ b/doc/html/dir_6576ef5c45e1ae696f88b82c16a4c6c0.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_676c0954ed84853013df50d94356577b.html b/doc/html/dir_676c0954ed84853013df50d94356577b.html index 12b9197da..1f191e585 100644 --- a/doc/html/dir_676c0954ed84853013df50d94356577b.html +++ b/doc/html/dir_676c0954ed84853013df50d94356577b.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    radiation Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_67ef339cfff2cfda5a7b1755578ee854.html b/doc/html/dir_67ef339cfff2cfda5a7b1755578ee854.html index 618ff191e..595e69cfc 100644 --- a/doc/html/dir_67ef339cfff2cfda5a7b1755578ee854.html +++ b/doc/html/dir_67ef339cfff2cfda5a7b1755578ee854.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  WeberPennTree.h [code]
     WeberPennTree.h
     
    + diff --git a/doc/html/dir_6d823072f66bbcb32b0d3acc588685b0.html b/doc/html/dir_6d823072f66bbcb32b0d3acc588685b0.html index 67c53a7c1..acfd1a386 100644 --- a/doc/html/dir_6d823072f66bbcb32b0d3acc588685b0.html +++ b/doc/html/dir_6d823072f66bbcb32b0d3acc588685b0.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    plantarchitecture Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_7b945ff507247f5bd903b50b5c416c04.html b/doc/html/dir_7b945ff507247f5bd903b50b5c416c04.html index d74323ec7..7a1f58aaf 100644 --- a/doc/html/dir_7b945ff507247f5bd903b50b5c416c04.html +++ b/doc/html/dir_7b945ff507247f5bd903b50b5c416c04.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  VoxelIntersection.h [code]
     VoxelIntersection.h
     
    + diff --git a/doc/html/dir_7f186228a2612084b0fc24dff2e535bf.html b/doc/html/dir_7f186228a2612084b0fc24dff2e535bf.html index cd228ed73..ee050317c 100644 --- a/doc/html/dir_7f186228a2612084b0fc24dff2e535bf.html +++ b/doc/html/dir_7f186228a2612084b0fc24dff2e535bf.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,19 +107,20 @@ - + - + - + - +

    Files

    file  fileIO.cpp [code]
     fileIO.cpp
     
    file  LiDAR.cpp [code]
     LiDAR.cpp
     
    file  LiDAR.cu [code]
     LiDAR.cu
     
    file  selfTest.cpp [code]
     selfTest.cpp
     
    + diff --git a/doc/html/dir_8a62bca5fa5119ede20b35462196f194.html b/doc/html/dir_8a62bca5fa5119ede20b35462196f194.html index 0c7646f91..b7fba3fe3 100644 --- a/doc/html/dir_8a62bca5fa5119ede20b35462196f194.html +++ b/doc/html/dir_8a62bca5fa5119ede20b35462196f194.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  DummyModel.cpp [code]
     DummyModel.cpp
     
    + diff --git a/doc/html/dir_8add51f561986f34dfac90d296d2ac1f.html b/doc/html/dir_8add51f561986f34dfac90d296d2ac1f.html index 0136bbd83..8599bb94b 100644 --- a/doc/html/dir_8add51f561986f34dfac90d296d2ac1f.html +++ b/doc/html/dir_8add51f561986f34dfac90d296d2ac1f.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_9018c8dc5d181eb1cb047286a97fa87b.html b/doc/html/dir_9018c8dc5d181eb1cb047286a97fa87b.html index b5343750f..9f0beeef1 100644 --- a/doc/html/dir_9018c8dc5d181eb1cb047286a97fa87b.html +++ b/doc/html/dir_9018c8dc5d181eb1cb047286a97fa87b.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  BoundaryLayerConductanceModel.h [code]
     BoundaryLayerConductanceModel.h
     
    + diff --git a/doc/html/dir_90fd98a0ba30abf7a6068a44995d2d6b.html b/doc/html/dir_90fd98a0ba30abf7a6068a44995d2d6b.html index 0d9a9b222..7932d6405 100644 --- a/doc/html/dir_90fd98a0ba30abf7a6068a44995d2d6b.html +++ b/doc/html/dir_90fd98a0ba30abf7a6068a44995d2d6b.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,21 +107,22 @@ - + - + - + - + - +

    Files

    file  Context.cpp [code]
     Context.cpp
     
    file  Context_data.cpp [code]
     Context_data.cpp
     
    file  Context_fileIO.cpp [code]
     Context_fileIO.cpp
     
    file  global.cpp [code]
     global.cpp
     
    file  selfTest.cpp [code]
     selfTest.cpp
     
    + diff --git a/doc/html/dir_98f1c86a7f536ff9d6c61df9d8c64baa.html b/doc/html/dir_98f1c86a7f536ff9d6c61df9d8c64baa.html index 5955c049a..3a106f04d 100644 --- a/doc/html/dir_98f1c86a7f536ff9d6c61df9d8c64baa.html +++ b/doc/html/dir_98f1c86a7f536ff9d6c61df9d8c64baa.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Files

    file  AerialLiDAR.h [code]
     AerialLiDAR.h
     
    file  random.h [code]
     random.h
     
    + diff --git a/doc/html/dir_9a3b5787d2329f793333f6962c777986.html b/doc/html/dir_9a3b5787d2329f793333f6962c777986.html index a1a43d3d5..1ab00a269 100644 --- a/doc/html/dir_9a3b5787d2329f793333f6962c777986.html +++ b/doc/html/dir_9a3b5787d2329f793333f6962c777986.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    lidar Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_9a6cc15fde559dad335c1dc145a826ea.html b/doc/html/dir_9a6cc15fde559dad335c1dc145a826ea.html index 4252735ab..6b4b3149e 100644 --- a/doc/html/dir_9a6cc15fde559dad335c1dc145a826ea.html +++ b/doc/html/dir_9a6cc15fde559dad335c1dc145a826ea.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_a2b45ea1295f1e42b26af05f3b546a5b.html b/doc/html/dir_a2b45ea1295f1e42b26af05f3b546a5b.html index b11913040..b74383572 100644 --- a/doc/html/dir_a2b45ea1295f1e42b26af05f3b546a5b.html +++ b/doc/html/dir_a2b45ea1295f1e42b26af05f3b546a5b.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    stomatalconductance Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_a4ee10e64f839049093220f98040855a.html b/doc/html/dir_a4ee10e64f839049093220f98040855a.html index 1fa95327e..827d4f560 100644 --- a/doc/html/dir_a4ee10e64f839049093220f98040855a.html +++ b/doc/html/dir_a4ee10e64f839049093220f98040855a.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    dummy Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_a604905e97bad612ecdda55ac09d6396.html b/doc/html/dir_a604905e97bad612ecdda55ac09d6396.html index 558b17c9f..852aa2c7b 100644 --- a/doc/html/dir_a604905e97bad612ecdda55ac09d6396.html +++ b/doc/html/dir_a604905e97bad612ecdda55ac09d6396.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  SyntheticAnnotation.h [code]
     SyntheticAnnotation.h
     
    + diff --git a/doc/html/dir_a8babb820ec20ecec6aebc09dbfb576c.html b/doc/html/dir_a8babb820ec20ecec6aebc09dbfb576c.html index fc5b5e2cb..3295cdbb8 100644 --- a/doc/html/dir_a8babb820ec20ecec6aebc09dbfb576c.html +++ b/doc/html/dir_a8babb820ec20ecec6aebc09dbfb576c.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,17 +107,18 @@ - + - + - +

    Files

    file  LiDAR.h [code]
     LiDAR.h
     
    file  random.h [code]
     random.h
     
    file  s_hull_pro.h [code]
     s_hull_pro.h
     
    + diff --git a/doc/html/dir_b81f286eb903e0c3ba53b620487c01ae.html b/doc/html/dir_b81f286eb903e0c3ba53b620487c01ae.html index 3d9539c9e..ff81f7738 100644 --- a/doc/html/dir_b81f286eb903e0c3ba53b620487c01ae.html +++ b/doc/html/dir_b81f286eb903e0c3ba53b620487c01ae.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_b867f472847a1f099af0eb422541f49e.html b/doc/html/dir_b867f472847a1f099af0eb422541f49e.html index 76b21ba1d..c3b1be2a7 100644 --- a/doc/html/dir_b867f472847a1f099af0eb422541f49e.html +++ b/doc/html/dir_b867f472847a1f099af0eb422541f49e.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    leafoptics Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_bc56ed6b0b97565306d951dc61815da9.html b/doc/html/dir_bc56ed6b0b97565306d951dc61815da9.html index ee931243e..5081551f7 100644 --- a/doc/html/dir_bc56ed6b0b97565306d951dc61815da9.html +++ b/doc/html/dir_bc56ed6b0b97565306d951dc61815da9.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    boundarylayerconductance Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_c2e785b0428381d295aba3d86e865907.html b/doc/html/dir_c2e785b0428381d295aba3d86e865907.html index d73a47343..96ce138b7 100644 --- a/doc/html/dir_c2e785b0428381d295aba3d86e865907.html +++ b/doc/html/dir_c2e785b0428381d295aba3d86e865907.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_d11e5a89bd40b12607fdeb823ca30c1a.html b/doc/html/dir_d11e5a89bd40b12607fdeb823ca30c1a.html index f73feedd3..47b469fc7 100644 --- a/doc/html/dir_d11e5a89bd40b12607fdeb823ca30c1a.html +++ b/doc/html/dir_d11e5a89bd40b12607fdeb823ca30c1a.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  WeberPennTree.cpp [code]
     WeberPennTree.cpp
     
    + diff --git a/doc/html/dir_d346877beec799c6cac1a2fc56d1c290.html b/doc/html/dir_d346877beec799c6cac1a2fc56d1c290.html index 197ef4f55..4d50380c6 100644 --- a/doc/html/dir_d346877beec799c6cac1a2fc56d1c290.html +++ b/doc/html/dir_d346877beec799c6cac1a2fc56d1c290.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    RadiationModelPt2 Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  main.cpp [code]
     main.cpp
     
    + diff --git a/doc/html/dir_d39c4dd70ac914a319fbf3979f3cb0cd.html b/doc/html/dir_d39c4dd70ac914a319fbf3979f3cb0cd.html index 0fb3030c8..d79e50970 100644 --- a/doc/html/dir_d39c4dd70ac914a319fbf3979f3cb0cd.html +++ b/doc/html/dir_d39c4dd70ac914a319fbf3979f3cb0cd.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_d684e7c998fb76edbfb655ffd4cf6611.html b/doc/html/dir_d684e7c998fb76edbfb655ffd4cf6611.html index 6cf11e0ac..2aed2c5ca 100644 --- a/doc/html/dir_d684e7c998fb76edbfb655ffd4cf6611.html +++ b/doc/html/dir_d684e7c998fb76edbfb655ffd4cf6611.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_d6ff66ea9f957e81b4485948f070bc7c.html b/doc/html/dir_d6ff66ea9f957e81b4485948f070bc7c.html index 6f9d1f11c..e202e70c2 100644 --- a/doc/html/dir_d6ff66ea9f957e81b4485948f070bc7c.html +++ b/doc/html/dir_d6ff66ea9f957e81b4485948f070bc7c.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    include Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  SolarPosition.h [code]
     SolarPosition.h
     
    + diff --git a/doc/html/dir_daed1286feb5181d9374e50e34ff739d.html b/doc/html/dir_daed1286feb5181d9374e50e34ff739d.html index 36e1166b3..152376d28 100644 --- a/doc/html/dir_daed1286feb5181d9374e50e34ff739d.html +++ b/doc/html/dir_daed1286feb5181d9374e50e34ff739d.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    syntheticannotation Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_e68e8157741866f444e17edd764ebbae.html b/doc/html/dir_e68e8157741866f444e17edd764ebbae.html index 495f140cb..73c060bc1 100644 --- a/doc/html/dir_e68e8157741866f444e17edd764ebbae.html +++ b/doc/html/dir_e68e8157741866f444e17edd764ebbae.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_e725f6d562ac5b3216da834679296cd3.html b/doc/html/dir_e725f6d562ac5b3216da834679296cd3.html index cef680444..3a8d0fae9 100644 --- a/doc/html/dir_e725f6d562ac5b3216da834679296cd3.html +++ b/doc/html/dir_e725f6d562ac5b3216da834679296cd3.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_e771e57a540d4f14ef5ec2c81b56a7b6.html b/doc/html/dir_e771e57a540d4f14ef5ec2c81b56a7b6.html index 929ef047d..cb290c790 100644 --- a/doc/html/dir_e771e57a540d4f14ef5ec2c81b56a7b6.html +++ b/doc/html/dir_e771e57a540d4f14ef5ec2c81b56a7b6.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    doc Directory Reference
    @@ -95,7 +107,8 @@
    + diff --git a/doc/html/dir_e8ed08f2d5f8ac3e3b5447bfe7f0fce5.html b/doc/html/dir_e8ed08f2d5f8ac3e3b5447bfe7f0fce5.html index 88f4a2a09..d34193581 100644 --- a/doc/html/dir_e8ed08f2d5f8ac3e3b5447bfe7f0fce5.html +++ b/doc/html/dir_e8ed08f2d5f8ac3e3b5447bfe7f0fce5.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,17 +107,18 @@ - + - + - +

    Files

    file  AerialLiDAR.cpp [code]
     AerialLiDAR.cpp
     
    file  AerialLiDAR.cu [code]
     AerialLiDAR.cu
     
    file  fileIO.cpp [code]
     fileIO.cpp
     
    + diff --git a/doc/html/dir_ee14773baee519b082f78b85b263aa48.html b/doc/html/dir_ee14773baee519b082f78b85b263aa48.html index 4843d9df1..df7ffb9eb 100644 --- a/doc/html/dir_ee14773baee519b082f78b85b263aa48.html +++ b/doc/html/dir_ee14773baee519b082f78b85b263aa48.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    weberpenntree Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_f54e10c7807847345da870f7da42cdf0.html b/doc/html/dir_f54e10c7807847345da870f7da42cdf0.html index 00b1ded07..c2510d943 100644 --- a/doc/html/dir_f54e10c7807847345da870f7da42cdf0.html +++ b/doc/html/dir_f54e10c7807847345da870f7da42cdf0.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    visualizer Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_f93a58e1b1064abf3e9af98b74e2f5d5.html b/doc/html/dir_f93a58e1b1064abf3e9af98b74e2f5d5.html index 3f4d4e6d9..ba0ef78c1 100644 --- a/doc/html/dir_f93a58e1b1064abf3e9af98b74e2f5d5.html +++ b/doc/html/dir_f93a58e1b1064abf3e9af98b74e2f5d5.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    photosynthesis Directory Reference
    @@ -95,15 +107,16 @@ - + - +

    Directories

    directory  include
     include
     
    directory  src
     src
     
    + diff --git a/doc/html/dir_fceca22ca0920a3e9321d273c935ca85.html b/doc/html/dir_fceca22ca0920a3e9321d273c935ca85.html index 4523b9e0e..88575fe2c 100644 --- a/doc/html/dir_fceca22ca0920a3e9321d273c935ca85.html +++ b/doc/html/dir_fceca22ca0920a3e9321d273c935ca85.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    src Directory Reference
    @@ -95,13 +107,14 @@ - +

    Files

    file  BoundaryLayerConductanceModel.cpp [code]
     BoundaryLayerConductanceModel.cpp
     
    + diff --git a/doc/html/doc.png b/doc/html/doc.png deleted file mode 100644 index 17edabff95f7b8da13c9516a04efe05493c29501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t diff --git a/doc/html/doc.svg b/doc/html/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/html/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/html/docd.png b/doc/html/docd.png deleted file mode 100644 index d7c94fda9bf08ecc02c7190d968452b7a2dbf04b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmV1wr-rhpn+wxm%q2)IkAYsr{iGq<}_z5JCD4J;FN?6Qh;@TCubdp(_XdD-^ zG_#)IP7_z6hKNdx5^+FGArwLWTWCG!j+oKji?U!hxA#d-ljgkN`+e^@-P+RWG{Bx= z2iQyYTtEf*o~ySWrIVW}HWHi0_hd4~$E6Jx1U`>Owo}EYJ1O>iZvS?!z8}B}QwLMA zC3Keqf1c}K@?C`X>68b(EUzYUYAS&OH^VPteZLPr{S&|nQvp@6W4GH-1U8!u&7l~A zx~RUSNH+>7@q38W6!BzirtjLFCzc|XGx)EF#G%^pWION*k@?vP<2O>|XkCD3ujl%1 z{55JSVkw{~HbX>iEZ2%yJ2eHj5Yh8OTpzs0A2;tZ^x!#5D+y-es{k1&0|Ns9-|+Xt ziGiTsZ8(^nUo#wdTpIDkb-Zp(3|A*FzW}GZ5SQD-r^R`&X@`26E3W|GyrwDIZjtQ& z$g5f8Sv=VgVtDien@J(!^BK+#l;s-LgP--p7C;7;E!ysXcXK6?+9D>_-B(?Wm(U zQbNm-5TyYxIU=rs0+)!ixqzhuxw(AqKc3?KKX32{D~Qibp*r0x&Wux5-9WCMMRi3U zTd6dOCQlj>a;gr;gLwRKulT&(m@^L{&HkSC(qH05HSSf$YEhynGvH zWNez``Z8FJXE+BSg=%ak{OR z+Nylcb{?evLYLuE1_HngYw0g%LC#=$a@?4~Tx>F9295Q>9UJ|_6v-KMw;!YZSgGj@ zR8fRov=hJ#QvsO@xw*{0%zH@OKVEUr + + + + + + + + + + diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css index 486d5bfba..4da4d34c0 100644 --- a/doc/html/doxygen.css +++ b/doc/html/doxygen.css @@ -1,4 +1,4 @@ -/* The standard CSS for doxygen 1.9.6*/ +/* The standard CSS for doxygen 1.12.0*/ body { background-color: white; @@ -15,8 +15,6 @@ body, table, div, p, dl { /* @group Heading Levels */ .title { - font-weight: 400; - font-size: 14px; font-family: Roboto,sans-serif; line-height: 28px; font-size: 150%; @@ -149,6 +147,12 @@ div.qindex{ color: #A0A0A0; } +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + dt.alphachar{ font-size: 180%; font-weight: bold; @@ -208,7 +212,13 @@ a { } a:hover { - text-decoration: underline; + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a:hover > span.arrow { + text-decoration: none; + background : #F9FAFC; } a.el { @@ -259,7 +269,24 @@ dl.el { margin-left: -1cm; } +ul.check { + list-style:none; + text-indent: -16px; + padding-left: 38px; +} +li.unchecked:before { + content: "\2610\A0"; +} +li.checked:before { + content: "\2611\A0"; +} + +ol { + text-indent: 0px; +} + ul { + text-indent: 0px; overflow: visible; } @@ -284,37 +311,70 @@ ul.multicol { .fragment { text-align: left; direction: ltr; - overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-x: auto; overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid #C4CFE5; + border-radius: 4px; + background-color: #FBFCFD; + color: black; } pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; - color: black; - padding: 4px 6px; - margin: 4px 8px 4px 2px; + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; - font-family: monospace,fixed; - font-size: 105%; + fill: black; + justify-content: center; + align-items: center; + cursor: pointer; } -div.fragment { - padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ - margin: 4px 8px 4px 2px; - color: black; - background-color: #FBFCFD; - border: 1px solid #C4CFE5; +.clipboard.success { + border: 1px solid black; + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .28; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: #2EC82E; +} + +.clipboard.success { + border-color: #2EC82E; } div.line { - font-family: monospace,fixed; + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; font-size: 13px; min-height: 13px; - line-height: 1.0; + line-height: 1.2; text-wrap: unrestricted; white-space: -moz-pre-wrap; /* Moz */ white-space: -pre-wrap; /* Opera 4-6 */ @@ -347,6 +407,18 @@ div.line.glow { box-shadow: 0 0 10px cyan; } +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} span.lineno { padding-right: 4px; @@ -418,10 +490,6 @@ img.light-mode-visible { display: none; } -img.formulaDsp { - -} - img.formulaInl, img.inline { vertical-align: middle; } @@ -484,6 +552,10 @@ span.charliteral { color: #008080; } +span.xmlcdata { + color: black; +} + span.vhdldigit { color: #FF00FF; } @@ -675,7 +747,7 @@ table.memberdecls { } .overload { - font-family: monospace,fixed; + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; font-size: 65%; } @@ -717,17 +789,25 @@ dl.reflist dd { .paramtype { white-space: nowrap; + padding: 0px; + padding-bottom: 1px; } .paramname { - color: #602020; white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; } + .paramname em { + color: #602020; font-style: normal; + margin-right: 1px; } -.paramname code { - line-height: 14px; + +.paramname .paramdefval { + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; } .params, .retval, .exception, .tparams { @@ -746,7 +826,7 @@ dl.reflist dd { } .params .paramdir, .tparams .paramdir { - font-family: monospace,fixed; + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; vertical-align: top; } @@ -898,8 +978,7 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('folderopen.png'); - background-position: 0px -4px; + background-image:url('folderopen.svg'); background-repeat: repeat-y; vertical-align:top; display: inline-block; @@ -909,8 +988,7 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('folderclosed.png'); - background-position: 0px -4px; + background-image:url('folderclosed.svg'); background-repeat: repeat-y; vertical-align:top; display: inline-block; @@ -920,7 +998,7 @@ div.directory { width: 24px; height: 18px; margin-bottom: 4px; - background-image:url('doc.png'); + background-image:url('doc.svg'); background-position: 0px -4px; background-repeat: repeat-y; vertical-align:top; @@ -979,7 +1057,7 @@ table.fieldtable { padding: 3px 7px 2px; } -.fieldtable td.fieldtype, .fieldtable td.fieldname { +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { white-space: nowrap; border-right: 1px solid #A8B8D9; border-bottom: 1px solid #A8B8D9; @@ -990,6 +1068,12 @@ table.fieldtable { padding-top: 3px; } +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + + .fieldtable td.fielddoc { border-bottom: 1px solid #A8B8D9; } @@ -1063,7 +1147,6 @@ table.fieldtable { { height:32px; display:block; - text-decoration: none; outline: none; color: #283A5D; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; @@ -1152,7 +1235,8 @@ dl { padding: 0 0 0 0; } -/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +/* + dl.section { margin-left: 0px; padding-left: 0px; @@ -1165,7 +1249,7 @@ dl.note { border-color: #D0C000; } -dl.warning, dl.attention { +dl.warning, dl.attention, dl.important { margin-left: -7px; padding-left: 3px; border-left: 4px solid; @@ -1207,8 +1291,103 @@ dl.bug { border-color: #C08050; } +*/ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + dl.section dd { - margin-bottom: 6px; + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: #f8d1cc; + border-left: 8px solid #b61825; + color: #75070f; +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: #b61825; +} + +dl.note, dl.remark { + background: #faf3d8; + border-left: 8px solid #f3a600; + color: #5f4204; +} + +dl.note dt, dl.remark dt { + color: #f3a600; +} + +dl.todo { + background: #e4f3ff; + border-left: 8px solid #1879C4; + color: #274a5c; +} + +dl.todo dt { + color: #1879C4; +} + +dl.test { + background: #e8e8ff; + border-left: 8px solid #3939C4; + color: #1a1a5c; +} + +dl.test dt { + color: #3939C4; +} + +dl.bug dt a { + color: #5b2bdd !important; +} + +dl.bug { + background: #e4dafd; + border-left: 8px solid #5b2bdd; + color: #2a0d72; +} + +dl.bug dt a { + color: #5b2bdd !important; +} + +dl.deprecated { + background: #ecf0f3; + border-left: 8px solid #5b6269; + color: #43454a; +} + +dl.deprecated dt a { + color: #5b6269 !important; +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: #d8f1e3; + border-left: 8px solid #44b86f; + color: #265532; +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: #44b86f; } @@ -1223,12 +1402,12 @@ dl.section dd { vertical-align: bottom; border-collapse: separate; } - + #projectlogo img -{ +{ border: 0px none; } - + #projectalign { vertical-align: middle; @@ -1329,7 +1508,7 @@ div.toc { } div.toc li { - background: url("bdwn.png") no-repeat scroll 0 5px transparent; + background: url("data:image/svg+xml;utf8,&%238595;") no-repeat scroll 0 5px transparent; font: 10px/1.2 Verdana,'DejaVu Sans',Geneva,sans-serif; margin-top: 5px; padding-left: 10px; @@ -1349,20 +1528,17 @@ div.toc ul { padding: 0px; } -div.toc li.level1 { - margin-left: 0px; -} - -div.toc li.level2 { +div.toc li[class^='level'] { margin-left: 15px; } -div.toc li.level3 { - margin-left: 30px; +div.toc li.level1 { + margin-left: 0px; } -div.toc li.level4 { - margin-left: 45px; +div.toc li.empty { + background-image: none; + margin-top: 0px; } span.emoji { diff --git a/doc/html/doxygen.svg b/doc/html/doxygen.svg index d42dad52d..79a763540 100644 --- a/doc/html/doxygen.svg +++ b/doc/html/doxygen.svg @@ -1,4 +1,6 @@ + @@ -17,7 +19,7 @@ - + diff --git a/doc/html/doxygen_crawl.html b/doc/html/doxygen_crawl.html new file mode 100644 index 000000000..168a9e3d3 --- /dev/null +++ b/doc/html/doxygen_crawl.html @@ -0,0 +1,3525 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/dynsections.js b/doc/html/dynsections.js index 1f4cd14a6..0c3560522 100644 --- a/doc/html/dynsections.js +++ b/doc/html/dynsections.js @@ -22,106 +22,181 @@ @licend The above is the entire license notice for the JavaScript code in this file */ -function toggleVisibility(linkObj) -{ - var base = $(linkObj).attr('id'); - var summary = $('#'+base+'-summary'); - var content = $('#'+base+'-content'); - var trigger = $('#'+base+'-trigger'); - var src=$(trigger).attr('src'); - if (content.is(':visible')===true) { - content.hide(); - summary.show(); - $(linkObj).addClass('closed').removeClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); - } else { - content.show(); - summary.hide(); - $(linkObj).removeClass('closed').addClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); - } - return false; -} -function updateStripes() -{ - $('table.directory tr'). - removeClass('even').filter(':visible:even').addClass('even'); - $('table.directory tr'). - removeClass('odd').filter(':visible:odd').addClass('odd'); +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); } -function toggleLevel(level) -{ - $('table.directory tr').each(function() { - var l = this.id.split('_').length-1; - var i = $('#img'+this.id.substring(3)); - var a = $('#arr'+this.id.substring(3)); - if (l
    '); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; /* @license-end */ -$(document).ready(function() { +$(function() { $('.code,.codeRef').each(function() { $(this).data('powertip',$('#a'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html()); $.fn.powerTip.smartPlacementLists.s = [ 's', 'n', 'ne', 'se' ]; diff --git a/doc/html/files.html b/doc/html/files.html index a2eefdabe..322b19566 100644 --- a/doc/html/files.html +++ b/doc/html/files.html @@ -38,31 +38,43 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Here is a list of all documented files with brief descriptions:
    -
    [detail level 1234]
    - - +
    [detail level 1234]
      core
      include
    + + - + - - - + + + - - - + + + - + - - + + - + - - + + - + @@ -131,99 +143,100 @@ - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - +
      core
      include
     Context.h
     global.h
     helios_vector_types.h
      src
      src
     Context.cpp
     Context_data.cpp
     Context_fileIO.cpp
     global.cpp
     selfTest.cpp
      doc
      TutorialVideos
      RadiationModelPt2
      doc
      TutorialVideos
      RadiationModelPt2
      plugins
      aeriallidar
      include
      plugins
      aeriallidar
      include
      src
      src
      boundarylayerconductance
      include
      boundarylayerconductance
      include
      src
      src
      canopygenerator
      include
      canopygenerator
      include
      src
      src
      dummy
      include
      dummy
      include
      src
      src
      energybalance
      include
      energybalance
      include
      src
      src
      leafoptics
      include
      leafoptics
      include
      src
      src
      lidar
      include
      lidar
      include
      src
      src
      photosynthesis
      include
      photosynthesis
      include
      src
      src
      plantarchitecture
      include
      plantarchitecture
      include
      src
      src
      radiation
      include
      radiation
      include
      src
      src
      solarposition
      include
      solarposition
      include
      src
      src
      stomatalconductance
      include
      stomatalconductance
      include
      src
      src
      syntheticannotation
      include
      syntheticannotation
      include
      src
      src
      visualizer
      include
      visualizer
      include
      src
      src
      voxelintersection
      include
      voxelintersection
      include
      src
      src
      weberpenntree
      include
      weberpenntree
      include
      src
      src
    +
    diff --git a/doc/html/folderclosed.png b/doc/html/folderclosed.png deleted file mode 100644 index bb8ab35edce8e97554e360005ee9fc5bffb36e66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000 + + + + + + + + + diff --git a/doc/html/folderclosedd.svg b/doc/html/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/html/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/html/folderopen.png b/doc/html/folderopen.png deleted file mode 100644 index d6c7f676a3b3ef8c2c307d319dff3c6a604eb227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 597 zcmV-b0;>IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA diff --git a/doc/html/folderopen.svg b/doc/html/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/html/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/html/folderopend.svg b/doc/html/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/html/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/html/form_0.png b/doc/html/form_0.png index 9eef40c487870de026f636d93437a8a5aa06ccd0..287285b2f6b4ebdb523c58e4bff6b9783e9799d3 100644 GIT binary patch delta 4842 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 delta 2672 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 eMEHq)$0drDE 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 RD*ylh07*qo1w^hwV1gY^(JlZ0 delta 4096 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 GLSTX+w7@I? delta 2592 zcmV+*3g7kp1HKf0iBL{Q4GJ0x0000DNk~Le0000L0000M2mk;801D`c0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP~>)ELnSm+`)^V;aYrr0gLELF73$FzKqJYE?f6|7II;j{ zXs2uf8kb;#2B~{PJ{3%my9vV8_LR$A4YC~l$PKediAakr4L78kV8}0000?RA1m z5Qg8q=QiLifs{Z>FeR80ObMn0Eg_Z=OVAQR30gudVeXHak(KbVi->^poRgCn7X)OO zozHbd1j8`y&p(eo0K<3|OxO&gC;ol(0T{!@Iky0i%FBcI)=d6?CZbKm{t^I7*>(=# ze+1wx``ZE75Ybu2&H*fl=;PM&7z(D@j5=oC-zxxn`B}&8#5tEZ=e_|P!Gg9WB1c3o zMDz;aRfg`Jb2H~$3g8<+cJmnw2xkrwBLvYjdwKarM2EWZ-gYanaGn5s)NSXSTY@!T z0v7aFBASfAnPxLW(di^21nmnfXc<^=e`>cQqAl`i<#|ei2AHrJ;gs2Km587%!GiXt zwpak$n9ms#CTvD1bNStTHNb?;2tXVb>MW_%IAYtaG1m`rTV$Aa2M2%+}c())YY=7Yq(YqjmrG0kSw5^Ar>^iMTl7Hg|L114-n6ROpk z;%lk*cjwLx$t?L6PvrcPoGe=028)nXNA0+#dmP1rcsAPXxvK! z*-?%R35K7F+EX%DPDJzxwgXpX+m8hkw&zCeqYQsDKJ>=Ur1T|(4Y+PCe-#00M8>5e zP(|k6XD=}F$;9F9_ z9?m5ZS*8tof&C|ldZc!0yvB^Zd=O6wX2|FNnsKnTY=g%jJwd*~-@(@VURU6$<40t9 zjP7>^PF&V{wgd9-Jw<+>e{4buQAH@{0AAW0&rtB=Y&xY#k@uL;JhkEp>evL={V4oO z+afAlm+1*6SVl1>i0I^;djqhPV$T^^+r8ZK02G1vaL#SO(?1pB419llhVI|99k)bu zme&}g(3O_hIOp`An~J$~+1LXSy)}NIb3Zb+cE5%JT$T5{5>X}|f5|^Hr!mll%@+Iw zlxfS^1kH#b1$!j3x>(#8s7lw;sbEOFBu1UDG0|Ej<8JK0-pw`mo*eD{QzdK}3UQY* z3Qatl#?HY{D07Aw!4T2TId{N_HJWnkG;)bN;MpXcE0kmi7)BFBG>Nu$O~O{GwM4CN z5n!`PyyY-P50YVYe?^tB=~JXM1KTrH8`F4X>@ub&ykSg{w$sQp%9BRRG~o)831Aq{ zOrx-A5Yc;`0+(Vw;P2`t{@4VZ_tsnRS~A(G!=F(nzZ%1#${Xq1VJWT!YK3t3Yb#g3 zx4^=Cizc6$WJPqv=nZpY7=#Gh1#$IfHI9y%H})1+{~VkOf7Z&O(x)aZ!^^5Mo*cia zZEz0~&(TrT8bvLrPLmZl1H8=vw%X1xhD?>s=4%vL(;&}K^7)DPcyPAV7H@H79B*B({ba+l11Na;+> zP3qM@sV1Bwe{M}Le_#FznO*Q{F+!sYLgH)-RP^%mP{9h;fCbjzdZka{X z>os@vV}fRMLY=VrStOx1T!P2|wrC(os~{t;f$Vgl?dk?^|8E3;ham`I)ucbf3yTYpytTGhZ#5ov(f7)Gl)e^ zbDha@qr!pTog09yu zC_{T-1~C|6^X#=}@IppaLwJizoWYe4F%P4x@O!L;#9ga;mfpfa%gSW+)4k_#IYF+g zly-gBt+w+pVUq**4@^&B(!!?gBtiwoYXuIp2(5VIr*K^t#rnzuGjt!Hy$G;;XBhxp ze{NVky({q4{*1adA$`u{3-jHJa{#%s;OkMx)6+Sp0KSX%L&$XkaBTURGxTh)dFNJZ zKSl2E8#Rt0Jx??^*AQW|dEeO|#}as^ag@(oBfvg=aG>M@|$>EjZ) zZFkF}5>vRYdj1JGq_I{lC%^R`3SHhRe+VMV$cux@j7*E0GvsX_R}EVCvEE2I$j+XA zL;iup#mb(tHQW3ke-bB;K8MKj?NqbLK9}D0Ah1?hfdy?9aa_Tgt+1_X&mZK81ll}S zHE(5j<)ID|;-ujz*b=pPB}&0hU3p5XO`DN5w*_%F(;ITT$gdW;`*Knw3x*Icf3c++ zEg|k}`Cd4-KMckjIdRsA&))EzN0WabMUdjJa4i5FrESMuDS2Sdy!UE*qnfbY8SzxL z(M*0mU*~a0u|3qQHhA=S!NT@NY~L5P+;`}Trya3DggtD+c1OHcez)d&woOz{UJr?H(SkPj$)gT4V zgl*Vtz&B1B>SdF0X_+k~p3#%Mm*IwKYR~KdBuy39^8O4x#N66o!uB{WPwJ|hNW5o7dyv;oz zX@B7J|C6Otam^C|zn=4I6YH6crLsw@F+AkSyg=?W$sh^cG4USJe}HoUFLfCYHy$g2 zUH_eCzi7v8}$sjh|YUcxqJ%w~H&)b3N;ZH4>9 zrPK*y2xhZAA1T-)ncXw+-9d`lqbJNk dVi-N~KUs6nXseft4M+e0002ovPDHLkV1kX%R}BCF delta 3894 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 Ef=5Sa82|tP diff --git a/doc/html/form_103.png b/doc/html/form_103.png index 9625006cbdc0c4ee5c6a5764f99c8afe97e67850..9ce15f19655a4e8e5abdb4bfcbc9be818f39f445 100644 GIT binary patch delta 367 zcmeAXnak|Z8Q|y6%O%Cdz`(%k>ERLtq{V?)nu85UPJbbC8%Qx02e~^j-aM&O59F{V zdAqwX{0G4WdzVk1tjcLsZ=`2d4{p1Hr3!eYp zs5NKF(G5FRhre6(?^QKt&9(1BKi0h0sQ_XNrP}9*7T18V`r%+8p7@}eMLpBg&huMT zs>Pz(-CTdnZY5+a4izwtTho(un(@Ih{rikF6vB2#l$_^hNN4!k-@A}Kq4**D+Ff5l zc681DkpE2W@M2a^<^@;yB~@#_9q;Za3G9Bc`QNuYn>7FMPM&6S+i#x1KVWzq%;5k delta 2542 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 Eg8Jyh3jhEB diff --git a/doc/html/form_104.png b/doc/html/form_104.png index 0286d6a5b40fb09f82550bc9b16b7c93ab4d197b..6dc283f20fad10b64b76a5e1677b92eca03c783b 100644 GIT binary patch delta 3694 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 P00000NkvXXu0mjfoLcO_ delta 3234 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 DKW4Ot delta 2553 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 Ai2wiq delta 5217 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 bRyx6dfvC(A0%xLI00000NkvXXu0mjfArcsI diff --git a/doc/html/form_11.png b/doc/html/form_11.png index 5b803f3b466acd777a317fb5620bb9996e0d2d74..a33b5eddbe39c3dc9efdc60d6062fcc1eecc6629 100644 GIT binary patch delta 542 zcmV+(0^$AS6w3raiBL{Q4GJ0x0000DNk~Le0000Z0000W2nGNE0GLg|_W%F@0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i00059NklYa}Ce}R{||~CD?*j0#^c-;FX{ycqM2F+JYtQ{UCS&!9>G=JClha>+*PSvkAz| zcoln_8-Q=4fswRI4q|4>4X6MEvXnT<%t*?ChLs{E))+EXKsG|0G%%7DwAq-InGNvi ze~ptEdK!$R3fP(1IR!w=o?JaSaKNn|_uGK|9IL4U)@F8bRdaze!2vfR1!#9Nlycc2IFqB1lB#%KDei)dW4y7(hh+Mnxst9)|H2=y+{6e zLB0Rv1G}>?O&$?4r-$VzFx0Gk1ahT0f29S%nAs6f_j*t!m$bj5R@xy8RN4%$(gu7_ zL{wpF=8C?#kWBZIwrghs5_t(*NIII?cN8lucmb zB+B@gsrUGaC!h1ZdC(!c*3En9L+?fdzG`Xy;F34FuI gY+&x$OMQj-0~HFU5f;%MHUIzs07*qoM6N<$f=ns$>i_@% delta 2631 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 diff --git a/doc/html/form_110.png b/doc/html/form_110.png index 419c017d6701e16095f96924b0920c5d3e155953..39db267303cdf40746a19aa7fd71d91d4729d1fe 100644 GIT binary patch delta 2568 zcmV+j3itKM9iOV0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000S$Nkl@ z4}Nsdw?OU)yd&g}Ku4e>&=KeebObs=I|7VQMt~7sM$q?%B_e_yJ3kp^C5atd zwq;q86=G&&WMpKFiGRkfKt@JJMrK4A85yG^Gop-#0}(C8u0uu|h-gMcW$d}Z7!eUI ze}^h7BO?SN+5jlVu17{PP5{=i#bXdgL_})<8zRaBBmg2Rh-fx;Jsugtgig%-*)rdZ zh}J~3B_bxG0}=hm-?bgLL^PN8{2JVnKFoXq@CsnnBpLm$UlUv-0H`!n0@(E}b8MJ4 z6#!;%T>S{(LkQaiD*$sM`UbF1c>c)De@9cNEgWrk%)B?(X8`5^769ICo@W9PtpJqF z{9lVaGXQHi+Ux*)GV_bMU%>UtmWW>9`uYpN`;c{?D(*!eWzSEm1y+E=E3{*K+=JJ53!`oQflyaG$#1|4Mb>ZDkYP2_<(Xco9%%KhX?Ve&>- zbfM+JH#oEdWmVDi8&+t=R zewS52%8quRtU6xl1^|yuqmlY$1K^PO>{|OLw3syH)dlsTrTVGU$1t>ug{70#%qU1d zoe^9v-Y>B9pwC>i5n?VO_$)Ry5=foAwqT&6cQrHb#d~uo zJi=aIrJ3w@ytS87-jyy&&iO3mT}`5SQ@<%AQibOm(!_j~!uC@B5$S!C zGL|fpdrC!fPu!e7M!j%s(uFpmjYL#eP+JVbWtsWc3?%8iB@z|X5o?-G>?Qo}_p18| zF^=AKU zJ7sTmL-}B58kCMhFmWxTAfmZt=pqeipM)5J4%XO0prZ5w5#_#7qU+eW$0E~73YNN_ z?y+qV<~)Q^;G3CWTjse5ePpXmspW|}05D@HRU%pg_!H3$Y0TN*!if5A{nT$MI{1Z| zoDwC*`gZ1Qe|hprv!bV(p+P@XEBgbk?J;ZJl9}I#=x^xV6T%YxtVzibz2&5JmmUmC zA9I@jJl>*=NI3ZJPOHUWek~ogc~`y-0ra*E%H-FH9CLJBLVQ4o$g3xcKo^D(JyNA1 zz`1RlL_t0e875@Rd`LTs#In0$he~hN8Zs$nO$v0QfAF0;L-paN^wB0hK{|4hq9 zMify{*Kvd!^qqW(gb8iCK*U!Tc!rcnZew-ROw6ATTA&;*L=hk$ec zXq&apSIT7Fl8F*sx1U|5$LQk6%sX*kP-fA#Up5FxC?*U>3Ae3X5YbV8KY|zhjp?IX z%#w)qe_a*TK-{6RNkLslFNsOKk7>ZvO8hmh=Rrnl9I(9GBuWo{)`nTDwduXV;-ylJ zuU^`BA!g7fyeTh zy9Iq#sH|jrw3E87^@a_H)0Xg@l5Kci!vrK9e^8uaLUkxGbntYEz~Nq0Aw;6FfnZ`d zCDf@vq+Y>!akrd{X`e4eJkBW@3}KQnktFOAi-PK|10`h&3~v z_=B2MP|K%G>~C!1ppuA^!-)vPImq9+e}1KY)1Gp<6E$TdBlvV@CwY-4Qef02@Z zxre1m%9%5B>Mv z1#mu>7RsYWssAo$H#V2fX`F;=>(p95B-d0VU&F6|>ZKnt<>)r)ZqXC~+ z9?da)UX`Cc`OOWiO z&>d=lv~G+YaA74?3(`{RbQHQw;Q;BFDB&z;`xgFK-lHISYxblt+X$d02Frjr$WQO* zT_nHy&;V}IeOjg?Te}w)ab6~?9x2ff51OyD&y9)9(71&h60-HQzEgnne zmx@Poa2yOWM%Hk2iPA%8TC(|M(fM9xM9&GM!`ZX>7MQH^UvLBGwP^*L62xz1?i<86 zd}jeSaq3Q+^ZK>liWEsmo-0x5hOQQq%!r;8CNzVM>0`G{eLfaB3aI+h>#z6#;Y>=oh%z!VMn^W^ eXJllIj{gHQ+`jL~4De_G0000s_-R8! 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 diff --git a/doc/html/form_112.png b/doc/html/form_112.png index b3d854212a9f9e1b9af5e2b2faad0a2f9e846727..4a07ab15d5ac1fe1c5b7788600a8729f92b3e99c 100644 GIT binary patch delta 294 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 diff --git a/doc/html/form_113.png b/doc/html/form_113.png index 2ec5ab2d2aa1f94ef9058310e7cbecd629337606..68e55dbfa05289c414203eba0351e7a74c9beba7 100644 GIT binary patch delta 705 zcmV;y0zUn{73~E;iBL{Q4GJ0x0000DNk~Le0000g0000V2nGNE0FiWGMF0Q*0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i00071NkljAVOMnvC60#*g2~Yx*p#5QaFRR!gy8~g+jK>p2b{={! zl7px!&tShE4PdJM&N)S71ynX_;7wJxa{}{L%4lWt5?IWHWz=L$qat!7X7rD$o@PUp zf3c!QMWiNzJUtpDjK55Y^7lD_T(dEt!REspK(5(yXY`srMI?ww7_PjZW$P$~Y#O)* zxB!)iRI2)NM|_`F0y@yAh&1M3+q@%!4XS#79joeK07pQ9+O8X5)4Si={WDPI_PF)P zfvgS0(XIo~x|qtqhB-j0>aa5z#T#G?f1E6<|E4lz>z6&(3E1Z3(Ua4`;!+ZVvAr%* zZy*z`9k7^8Ph7ilnNRyQnfN3jKiVl7P5u4F9+XZ}ud4cbC6ghS{nD91L|PYmA)eHR zEqhF#J%4BZdgL)uRe<8~3@+E4lerBj^dcKX1D@Y>P+I>M1UtU;Z%|7Ew-&K9~7Hitj zV!H_-D`0P9&=`nP%lUV>X5tqqy$+OF+!1xUo0!dwt@&2>$}%|R7dje8V;smqJ#-AN z3K<<#iOIk68`(&7H_jiN#&7s8h*Sn(t*XAnrMEiSiCFgDGFzpu;Lm%b zU!gw$+1W#KwKM>K)q1`i&RccoS@Z9S9qNCVyCLO?%Hk+!z9UwZ1yQqSru6zpn20Qh nKo7vX`eM%wslT^9&7Wi+E#fY+a2qkY00000NkvXXu0mjfMT$gn delta 2720 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 Utr&BCB>(^b07*qoM6N<$f~@kt`v3p{ delta 3198 zcmV-^41x3D3zr#xiBL{Q4GJ0x0000DNk~Le0002m0000Q2mk;80Q8<6vj6}H_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP61XLh5~Ktz!IS_c#1di&Si;-~H6mt_u-QFNekf<0 zpW}?Y5kj1euTX}wX;idiM#g|);1Z(&uK)+d3i)S@2E(XD2K~oo-_W8Lg(h2=*tHSv zf=W%7I1hgiyo`K{3+gO-3LybYWzY<0cB>ZXmTQHokb4Wi@+9fsLpNOy^ktD8FSdf& zEjvK0*M$YK;|wSh^c&aySzs))XCzY?+IYDKU$i?6cu6^;UwP8>VNGcQbXk!wPaa_L zdcfBJ*COs1eC0{f2d>??Ck|0$PHQ4kJGI$ByFY&;wFG_On(T-~nQNYTBD(F;rh}?r zkR{X`+$>SI@}%ikt+`Q7q&k)HyLw`m+O3`w5!}U{M-TthN_Q?YivGmfG_1=ePaixzOQ` zu(!RktLZsp*G{2+Sk$v0s2lY* zp4&7BX$$)QZL`Z;PZ5snh`E|HYN9TS9z;Z{3n-o(M?$5|Ru;8=p#`r+qiWgFGZ1s} zaa_sEEcy=sZQlg38q$Rm!|-T+5pMoSh6NL}o$7vOi0}S?4sd0sVQwb7V=l}o! diff --git a/doc/html/form_115.png b/doc/html/form_115.png index dcc21620d881d38672f8c3ded24888d3f6785354..f2fb6ffd436ff7d133fd2ef4b30c904210cd1028 100644 GIT binary patch delta 804 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 diff --git a/doc/html/form_116.png b/doc/html/form_116.png index 71b2d3721584789adbb0ad9250bff60533905df3..fa13def5738c1550387d8cbaa2440697a4828a9a 100644 GIT binary patch delta 1517 zcmVuGxJ{Z&ZK+*I0JCGF6Hl*ncesN8hHE^Fubmr`Ph;_IrqJW zC>6AoS~wMGYE%JW2Vh1-YnaA=oIy%wSZ`PXc-jzA^IW3l`PTC8ne%ytdZIkS^i4($ z%jI`Rp7h)^b5N2>vZS&j-%KjV08RjAf1zbeB}w}(4j;<_-|h0e2*|&Yyg#XV8C#OE z7|cyd?ll^5?ig>Qi>NLNoMW*Jd{_|%(B`U{I?<2Bfg#cAVVagIckxrDbyP6r+7r` z4R64GvKh=PdXYm2&vpjCF?05a4rJ1tBaoZa+=qI^dnLQ{VFxtZAEQKrH?$biD{6Vp z`cObbg=b9B`Y;9ep@yi{hyHV)e}D&XXfd!>4CXoOLjxiziRb{+KP3_Eqz_{CVH)lO zmvw(&mT6bY<>Qk)$ElaH2UrHbpk*sYI>jz~U!Ew3LwSbT$F%w9sX0p2FLs-3>3zR* z#$FINsksk1Sre-dfk;m(WuBB}b>W+t{g6_FMsH}r%vU1X!gNqUL`znlf41?%Dw*ZG zkVGGjrElakOeN3zT<>9wF-9LI;XdSKO_VIH5PHotbKUyo|%^C&u@vlv4o|W~U_q81()`xApcdnYo>O)zzvd^hz+mRv28(MJW z3TmP~EUniV3+&;LYg5}Nuz%RddtYd()`#9Tk#+1q8S+?MXx+W?e?zsQj~K0(Vh<}; za-{B?zHN!I?;kev-s47hP==SNmz1MJQaql5A0kx|byz_ejyun8oU(gwW&k*Za)!t7 zH@ICe5lRUOvthzF^;S#jzHzu}>>FqNRnB*Cb@SoA+e}TQaodVjjll(L9d)v1~ zYQCT7pN;pu^*Sea%!)y@orrn~_c6S8RV*Z(r16tCK!<}$$w6pZI%V|nd~ov4HSczw zvs&(dVGttq;aHMza*=_(kTJM&e*2MrT>0F*n)_JZlard$YmzhjF1+vUK33F1)R>YC z`ujqN*TxbFf6m~>@*Z-sCS#gt+n#vX$0DLRPxLM$w`@1?BZ~L@e@#CZSKvM< zUHAiK$p5#K5y^Wt#LvYMxSx%Ld|pBh8!+=tR>ptj|2};oqIf5XUo$=sM6`kliQF)0 z53`cEh0!fj-)b5iVtCJn_~Ec;FMT~lL}i=C%6J}HBi^$iW@L;2StDj-i~#=tU}j&j Th`aG{00000NkvXXu0mjf{#Db$ delta 3236 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 aTF4)z^Q@&lXjY>D0000!eS@#pD8~UX^x2oD) ze;F_RYnyvzi1pQ6w+9~ak znDkeubxnJ8$Lgo(4$31S3wx$qrJJs*)_sa1;^Q@S?Lm3jui9gmg_ODsH8^;U(&5|6JRfA<~h zdBfi=9&_7o#l3`d62wHoKuqw)@yNZ@-1L=o-UF8yN6mmAqqi&sIaI2>J3mIlqpKL` zdS`1n!Ln`ghB28Mk0O$ZNNG0=oTDxpymNMe>@w_&w{7t*kYf_msH<(@Djb#NKxMR7 z#O8+-aO#pPs$pB@qzMe~d?S>;d;i^QY0jv!Ctxk?eFO$WFM-x4|-NqyGS8 zku104o+(@79eXNpO30u))6ar_U!mo#Igv#Q;B1o?2Ciz1U2$Ag(J1)>V6k@SpsKF6 zjM(PCFl-`YC*T})OpnJ(YoW((mBkb;d!#i^YZ0-jlaF6&I{7y delta 2767 zcmV;=3NZE92J01niBL{Q4GJ0x0000DNk~Le0000p0000P2mk;80J;51rT_p4_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPwsc{wajr)vu)Rw2TDq)HppfA2&!w((TY9fBMTkm<%wr0X@tXb?l zui?*{`0an$+bchKUU7zh;uM}a?#JN-5L;_*e%|6d^FDDvQlOJmImU83gkn3^@S=lg zn`;2>7n4dm=XGpTeumfHVq*hi$4b*}UEFDxR= V&GQeLQiBL{Q4GJ0x0000DNk~Le0000v0000V2nGNE0A1~6t^fc40drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0007|NkleY&_Y_sl|T!$03~EgfD%FpPy$=RQUWPK_lM=hI8Ng5v9~$Rcrw_E?I&4& zFNmu0zuT{Wy@Btrx2Z3PNCB+v=K?5zcU3(meAhO9wnp&Y0{BqXePZ4Zpbh*hd+t;< zf1D@FCWDM@Y0pj1cwx^f@NI$JfGe}WhT zIpwCz+4R%-(OaBJFQU&Wj+z@kdW%7hNwrz=qqjaW(D%*O34-0WL%uJoM-eGRq_Pv% zYkeU5Hg*$jo4gO?%j(g<)i^3!0JVs$MWjguJytwNTd)%uQ#&OqR_O02g4JP$FAQf9VAM2cSssUBgwmbjEwuRN$1srH%O)QNQQpMdzKw zBqffNYm3YllVmn_!EtF#Ao(I-sdk9g81n7N$w-K76Jsa(1k6ChDr<4X3hRHGw#;oo zww8%KCBYAZ{E5xVqf-KQ;=ZyUCtz;>yPg5G`xi<~SL<+aZXi8%c~14WN&X5zRnI0( zZ+JfWsr8f1__5-aD)zXeyu;P!Cd~HiK*Ci+Ya|y%q>B4srXZ)<+-mYJ`wMRVS{wT- RZ^Zxr002ovPDHLkV1oNAYc>D? delta 2750 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 Eg4&fgbpQYW diff --git a/doc/html/form_12.png b/doc/html/form_12.png index 4366c04e0d3ba1295ecf9aef9542b06a0f29f454..a856242ce28b80fb2e20489d2008e109885c0af0 100644 GIT binary patch delta 2803 zcmV?Qz?@ z5{1v+xee%+pp>ALpp>ALAeSJQ;FO@0AeZ2jV3%N*V3)A>2Nn`Uks?UpgOtxR!^t}y zz5>WSTrL(%KvWfk5JJlFpV}QDgpltB9WNn-6z0FRJ3#6qB5MFIwfoWFf2#UbyA$6P ze`+Exbi4!rJ^*|HSTz3rCqrAS;NNC@Av*w%8QLdtP!kyuPOcFE5Rol_edEvnRP|TJ zHkWV@+ZwUd)9BF5E0qICHFt<@GNk;C(kK|Tq5!WH>8R#f1SC~ z&!rt7L-S%H@&Y%(5%Q?2IcBx{`thKuAH64^|9`X4?HGIC*xnAncFZKz+%*yT+ePdV z6Y(yCe|?^%dGld^JBY}qi0tjnI(Pgv_?pHSxM-p6`ftW&bp6{l#%XwbKQ}nm^2AOkTG)f7tsLHUP#>PR(5tS1D=_RgF5}1gdtdublT}=ez@0 z#{T}4kH)ocGPZMwxyPmY+4wzwyaHI%w#mqAn3QgBwfBhjme$tj>$?X{Ou-&Qa=gbk zfLKbNQ3fZDM;5X?F`89c60friml9>;Vjq zcw2{HBC@c;>=!%dr{2Lr7Dmqe?jD!JHGhwX<{O9PGDl%Ao@RdmR|h-Ay#Ca5o6_Dx zSYv$c?p0=}iI7_Mf9PM2w~;4XvBz6RI=%X(Q-;BsHC1Ar;)5|CQA zOSmX$Q1q7A-h=uO?B-BpxIY6;RJBLQRmVG^4sy})-?L?8es`<=lQT~Me)KqJzhqpm z<1LxrZKA6GMC1?7ORY^m^cG4npYgNP0`rWHLp!Ov6oA||AVrmIX)bDm;57-K>@cbe2 zUgajKe{OBaz8I21OKtC=eegA^NcV|wG*i?>ZF@9{jd=ThJX`_lOu(@v85Wt03fnUg zo!_-L>9WTN%`arG;SC={@%*mG#Jq=lz>Dp{6+trH24!d~5qZ=2O&*ikdt@IraA}63 zPH)1RsA3PhAB&49`^t>n3h}dh#~IAV-!~XBf8$sCz_6Lkt)167b8P2CS4QAerSP7r zpPBB{tF^tYZL^?H$#e@hirL!Vo|@;Cu=fpp_(aCFqi3dxD)xYL-k)vv<67f>VQ59q zBFDka)|LyH-D2oCUl94?+Tq^jezymI-o{> ze@&@d1Z8GsldBJJ4to#ngPpf+a~j`G6SeITw0+^knT;SaHwe6Nux3KzCxR>nJC@!PDqx;afA4Q$t z1T|6J9;T;P)7Y7VPPV1vwenIiWuFBh~H=LhgO;> zitU5t6hBcgzj|+)h+(KEL}ahQ7nI2yFS&n$^)%k#);Fj=Tb-N0k^NQG2fy%3$!j0d z2b<{KlyZR7M4To>^qoMTRe!P>E0>{MSwX!kSMr(|E7&44b|3o62CMa<Oo7EPA%bvvTL{r zj7hBH`rV->(!z+BoDq}=0l@E4515>G`VAMSF21rBxrCZX4;?Q#QnEzIf0iv=+ObCa z5`6cvQ}t}2Ci1{k134lhFK~kYLY`$N{X-SQKUJN5E^qEo6M107O8^`vF8n&S3uNA% zA%eRYQqCD_A|H%+NjP~i8SW*rnJd&pUg&rUA*3)|B!>_}3PZp@ zd$8UB>?(JOREC=9h7m7Gf{48M^-@LT9l)2W{;b?BQW0vR8%De&e-)1aAR-&M(xJQ9 z8;jfoHPHbhUXm0MIlyfZ^P}Vz;AFZ`6PGaJCCRWIX*U3#RrSlhR$A2V7pVs|(GDFi zNy*m!^+U=X;&+fG_X#!80v#_&$qH^3`^}=7rK;xG5}eEjYN7>h?@m(k3}9uon+pIB zmHR{LLrt{6$u*J`DMmG<2{myE9WNn-6oxroLI^3${{g9ryO7oO43hu=002ovPDHLk FV1g@sVjlni delta 4011 zcmV;c4^;4u7QP>UiBL{Q4GJ0x0000DNk~Le000440000$2mk;80DAQ>-T(jy_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPIWd{C3(CP@kaD9*pVcUrL$bSO@zb0Iy} ze4yejv(xF^h$dG8AgQ26EJ(6eD{@beg~FdpMHo4T$jve4kO;KaJrYvnz*T-EfS8tW>V$6T*5y6Lhi0E%K?A_ zm9Mw#5mgzGCAzNib`gbIEjNb`s=6W8B8(jUlQAZ(c-0i0JjI56eGtY0>T1F)ChrEw z)VAWoJ?9n-JZ0ZtEyBdnJ9bQ3thRr<<^+7=Ovg?!hwuBo?|b|lvA*W^5n!Z~sV#*I zOSpN1Sv$Kzgoy+F7o*e56=N-N6nl$ZZxqitQ#Fbm5kb8~a)X6h88=U(ogcIkVdVHe zB&{J!%x9=1b5_%g!Y9sR{FL~T{HIH?01#J&XDl2#wHj^?nKp%5i7;}2F@Aqs7+~_0 zNNU$?(t%I0$7?^asU8gHa#GDv<8RW{p+sQz;##~Q{stugbpre5i0AX%N= zUPR==rZ~n}Y#8H6SN_(aR1P0D7U6!bOZQd=6_72!xL>!(9zA9Xqg!yuKId&(!9J>=}UnpK*X!_+6fLu?AL&Mj%{>rV1E`K7jgJR z_Y~re%;y#1TEuH6H1?9OAi}lcb;|JvQM`opR3co9*ce%}`x4h@h;S`pfpbys{4e)D zMTBb+i!KXDx8`3aI3~h5#~OEJK8XnD99vPZYs_!0I4{DHZJZp8J2Ia`#Q)|*095WF RREGcn002ovPDHLkV1gXGa&iCw diff --git a/doc/html/form_120.png b/doc/html/form_120.png index 14006f7b57a1795b1718637fe26c92eea1ee8bee..5aa88da4f110821a8cb71f32aca382460783dfba 100644 GIT binary patch delta 1250 zcmV<81ReXC7>No%iBL{Q4GJ0x0000DNk~Le0001d0000V2nGNE0408@N&o-=0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000DVNklvifd z4E}V_T_7uD1y;xkbcA#SIszR5MxZ0KBeWyH2rz=~4@)3i*?Ba9+!CFW(_qWCWXXCt zC1%D9j{|@1O~4Gdg<0Sa2D89_ArMhTM0>CA@2!cMVH_Z$8o&ZTDSrzWZw}gi2N2N$ zf53^E4@C41pkii<@!S(mL@NXhDG)T~jhVLt5w=9oKmhnKU4^utnE7>xweAUW;!0fh z@QayW##)b=zuMrXOuCwbrM$llK~yw10IUF1@_rb2oqI#PhphxMIxutc0k8+a0LmO* z-v>e1EKfDY8uxwxyx*EXUDNAJM(IRUek7M=qpJxO=*V(Hg)BKtV(WGe7lQyO;kKGY9~s2=9rRPme`Mxoi@?EO z{iH73*?)@0S!`yy&v5Yb+&f>$;iLi?M{b<^oSU;CvKDw=KkMV!X%{=86%YeN7TB=~l8}V)$^=MnonTK{CThRRzrDHd`B*|-{~a-38QfIb3ENk;8nv$?qma&@}4SYlybUj`CXVz*u|UIL*Q2%no%s5 z52L_G!;32rp?#zL$g`8*ZU8G|K4n~;qvIaW)mN($a3pVl+TIe0ueKlY9T4ttf9%J! zV8WSHsfiE4Y5hfyxnV;ad_x0xB44^F%%3Sg7|j29@?bCv82rKDA3Kgj02hXuTmS$7 M07*qoM6N<$g4a+@5C8xG delta 3071 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 N002ovPDHLkV1lmF%-jF~ diff --git a/doc/html/form_121.png b/doc/html/form_121.png index ee70d06a47f1e9603780f3d4849a633b6064c112..f0821db79e1cb29bd6998cfc8e367dbb71148c56 100644 GIT binary patch delta 480 zcmV<60U!R!6paKxiBL{Q4GJ0x0000DNk~Le0000V0000Q2nGNE08e9wiU0rr0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0004WNklz+ z423`Sx`0=pBV>iFkd8n{$O^0wMxZ0W2rvSS03)bBB10PNSh>=R?sVtFPkPpq>>#Sj zQuekOGw@ylh)4?r;9?$aWqwlC??hY!RHL}c@CO&U5d+jfW9tj>M3{)HjW8XfsxG%g ze`?-1V>;jr)Tw<><PHqdqw>8~eJtPtu=A)hhdfHYnZQ(b$dxCj zOLh?%N`A^GN~=8$~De`C^DShcpd9_+2>%08#xXZrgaMtAyZ`}_YO zkCp8l%2Y2S=l6S_oM>xB#B{GDzgJbj?FI)3Uh>kk$IoHuL$V#L+XD7s&VFa#^8xl~ z*z2DwPu*{4^}!yXqD{#@OmNAf($42b7|k#M00000N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP!yphuZ+mJ03s{H+EMS2rA+-<*iG)-_o`h6FDuGCterzB#^TTk4-I-l(0(kOy z;UirHn5H*ABEtf+3X)%>2ZnzL2j%HDpwtAqgXL(&MSh>J#uWOW6@F3dB;o{wNDrs14GO z($^(Lo2zDf*KH;k+H9P2bhxIb{ei?j8M^}$_-4Xkw=*91AW3s$@dcrZ5PS`%c+LO- N002ovPDHLkV1i;s+m`?U diff --git a/doc/html/form_122.png b/doc/html/form_122.png index e7646a256fbb0c7cac5a9e0c6c1f6ab9f16b4b11..647a17c45594256dbc194f74dba4694383b69d68 100644 GIT binary patch delta 930 zcmV;T16};O7R(1giBL{Q4GJ0x0000DNk~Le0000(0000Z2nGNE0M9M z42B={x`0;D3R*!K!5zUJK^-9;K^egr!5+aHAzr~Fpg#yElq`yr8Yi-^?;Xz{0KWhb z06|ez{=?zNcQ0T~_&N5ch}54kxT+pMW1O$Tl`uqP3$*t0Y%N4-4WI)q19}A%ez?zB zf94lKReKHC11F#!(gL~yZxMO{9Dvgpea)@sGeo2SYT(y|iTfioN>|kj@WQpltR6!L zx&dBPb$B!Y5Rvc*bQ9xV67*GKD2y7X)fhs@I^`TIu6@nw@h%KIBE+o1P}%1>!B=q4 z!oY1{m*AiD7Xgm<7FHn$tqD!f@fUZOe_wda$v|`c#oc0#FmnCH-C{Hyk094y03aeI zPJk7Fs{Wa`wA;V}MT5(t&%n-dqdZ~E@fQKSFq#>Cz5;t(9`py7DHp(R$Ui2t{e?ME zpR=sO$Cy%U;1#E+l3;DQ$7HF$@IqXRWo+!Tvwid~l5;KNb>`$=h^w#++2r^OQhozYnJ952Wt+eAF*y)hB?h_1i>h9w!^S7|^cf z3HaN{+O`?%sZ+d@4%EtjOG|)LfBwR2_bEI=W))**+{p{hI5H`gQre=#=JFx+-b zhwRbJ*BofYbp0hnMIr#)>Zzc&VH3^}ovI$K<sHf>T|1O@~sdNpS$cV1p9}rNj&N+ ze1~(W9nL~}nQjbXX7q3flCtEj`MuAh3S$W#^_VQeUz-*!9pGzv;Y7A delta 2846 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 diff --git a/doc/html/form_123.png b/doc/html/form_123.png index affafbd0da39e25cdfd46a3e32c29e581cb10d4a..d4ca387999285453961142fc3541628d809ff1ad 100644 GIT binary patch delta 1616 zcmV-W2CwKlcJczBQt;YH6Ak``{>umLM}y-qTuT*&`#Icwp&R3Z@>P% zXv2TZz0s{PpSgxRs8V@sAN1@Kct@ zyG~?Ve^=;BLgP1}-KIu6(Qg#Ce{!owjXy8+^%XBY5>bC%=5qr#7awgp9gF{%r4L$p zS?m>n3xI@(5@vqyICdw0UbaL4NM*v`nfW4l;S~xikP%T1x7A*R_BD!0PUYEq6X7?D zyD&7bWsFZ>_+P=Fm-*Ym@&9Z1j0ydXKW~nCKjrTpPVg5UEoN(fUIZy&f94PQd_W<1 zDKo#Bx(fh50CFPwf>VeOZ_&=eM`eaV6lx2XXMXegH~=^h(VHju&lIoRD6q)G21P#p z*9d(q&soaP!wJmRyx++CGn^2%&7&^RAwLf%cuG@dXxK#Rv+#1L%IBiu971?!0Q<=M zrM%xn`W_@lEp#5>6rC;ae=+_W_Iq=dBI~d=a&j7i$4BuWYMfd|L_qxoy>9g#30x~- zE!+JB`iKd%Rji;;n?(yMuJm!PQf?y@C+~S{{-#)rfn$-4gRZ+V2n=8~HmyxdC{KUg z$|NFRv6pXU<_j}_a`!;CwLdRDwM|oLAFL{*Rh$r>u zbGZ4iG0+!WdZr2xA8?DkC8D!f{k!pq{JiNSudu*%*0yf9QKhI$ZHAQV zDNdTb{Cw<|t$n`gf03NW!Smlr{=9jvL0O}VMm0WSCx1TDM=XFy>GiokHjixhm1a6S0KaW@nz2#+I+Ibvbz)8%@{Be_H#8cm#dI7y6hm>4IGa zKm3zcn{GDO6tma1ktrXj^lCH&y#Yqu7Mq!IajS zyo=M+(yI@idv!yCt96gK^#j!k9J%8+u{?i1CP+;zJ(LDf#>DHda-q!$@Q%ybt&(+= zzMI}fnG8ICf4<4Ctm~P`!PR7O75bVxE4lrvbt6KT!&$!nxqNb&!3q5ZE=cZ*N`W?f zR0W_Hul)v|f{H?X16YdS+A%V?1DYM*-Z$~bT*qjgIIQ5d-KEz4oJ|TQ7|}zPZOHkD z3sw$rR&tN{flmr|Dz@SxXw-mck2?b$(^v4MvyKm`f3t!MWR;iT!HUqnReq%G<^Nz% zFKvFL-KvU?sTGt1(onfM2t;ur9V}z>6e^`(Ll6rVy*b$QcA;pw{bF@E05PFDQsu#BBfo O002ov22Mn-LSTX@F#s(9 delta 3265 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

    n5Ac;qp5<9zc}A6%Q#eo%ry8Hny^s=5P+`& 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 JDnb2#{|7=jQau0w diff --git a/doc/html/form_125.png b/doc/html/form_125.png index a507efde28b317ec5d6c4e2c205f694a41558976..7c4769a0a3ab6e2106944dc4bb2ff4dd9b3fd086 100644 GIT binary patch delta 654 zcmV;90&)F~6}kmLiBL{Q4GJ0x0000DNk~Le0000c0000W2nGNE0Dfc&vj6}90drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0006ZNklfD%XvPy#7o?+>qHTgD&QKr(qV9)!GFJ*`%& z2Qo8$BK~|gfj;~mVv1fb~s@0l7P#?R-go4G}wrWS>bYS(0C7)~#cb3f~HVw<{`7jF$yt zk*~1skPcKe2;j-gPD>`3ixx4j+Gqdze_>{Szk?KXucWNe-anE^jF?#7Xn#JENQ|LN z{9}$oNtvW{+;SNAkUa%exmbjl*rL4h!;_lXtY|mUB4%cL>fFk@=A+mE|Aq`CC9cy3 zqk3s8Ls4B_!^jKs$rsm0sHD<#DNssUOWI26&ee0Bgez&1$fL@u&BzsXh;68ae`jZ& zK1V@)4w9o*wdDx$t@}%&{-9tw>SgRAZtAg;s?Oz9igrsS2*(s{P%52>y5EaJp|@O^ z*{7Mk08hZXcdx07@T-|U_vKUr!M=o|ZU6uP delta 2672 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 M07*qoM6N<$g6&2JO#lD@ delta 2943 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 delta 2851 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 BTXX;b diff --git a/doc/html/form_13.png b/doc/html/form_13.png index 762438f8a5d38f0c6a53c9b66e9d22d7809ea28d..b5a3d79e09cdc9c071b9b9ad07546d85867a088e 100644 GIT binary patch delta 607 zcmV-l0-*hc6^jKxiBL{Q4GJ0x0000DNk~Le0000Z0000V2nGNE0BvD(j{pDw0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0005HG-T7?7JNun1J;{`W zN3o~>CgAOP4nT4NpbG4D0C14>`DbJRlx|+wdJkZDXbqqy2>>mCcS+w_Y$Sz-9VQ#~ ze*~^E%ol(%y1%3>GOI);fc-M;Hit}30H?T##KghoI%EGVGHK&|09)jcNERYPvT_GZ zdWK|y-is09d1T<+9Z21kTfgU!i3aZmfq+Ekk)vUkIl&vwCU-zH@_%6-IRe-MsB(!& z3MsIUmx5$7fK=!Nu?6rdDJxFAMHJY_f6Lo|Xzeg1`jo!TZV@l&1u-OY=sdl_;MybE z6w#M9VeMMy%-6Y-OPtCPB t?uyR4fLjG{)Gm4C-^fhaLp}U|6#$tMM)zb^&olr4002ovPDHLkV1nSi3o!ry delta 2664 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 delta 3199 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 Un8&*6000002uVdwM6N<$f}Xdgr~m)} delta 3127 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 R$u9r^002ovPDHLkV1i)V=lcKv diff --git a/doc/html/form_135.png b/doc/html/form_135.png index d85d8728845568e10ec3fdc2216f4a7cb86edd80..f55b84c41ce574a39096d67635826ed9df68e150 100644 GIT binary patch delta 1397 zcmV-*1&aFE7@G?~iBL{Q4GJ0x0000DNk~Le0001p0000a2nGNE08(Uf#{d8T0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000F7NklUcVr8Xy%(ObQSpYKUk(w=)%whrcIY*8%8=2+aI;trJAl0cZdm zf2AlEQa+h^FSd>J4*;J4&c=QzuW!t3+o_m{;sB8wr0mfFxH>@Kf&*|jcqQ-8k+vK2 zeghXk0PqeMFcouxnTrbCP5A=AQr4wyB-&n@c2^npTd_UOyXJZi}D!t*#HfLt8400o61xSEB6mzo3cYrW+)gKRn zTm~7ihhkj(dA4UTt!5)gaSVS2i=Z07PaVHRuJk2Gd4FE9n?}W`3e|_@o z7Z+w%MSmRRqn{lOp@mDBotgQcf_@sf;A(;Nm@?Z_KYSedSu(jJiKqrHDb|eGEzl>p zzDkoZaLG4z?qu0(qHb5%Piy)r_A}7lTH4!5n;-JI{pkePTqWnmZ8CqXEhc7H;n;%# z95QTeFm@AeY9rTfXZsP|(mKhXe@8D-4U(Zfd|abN?x{aY`pQMN!2Z7>B~pVsml$~B zj^+pQAGf%f%PahOY$RxSRC|ojf7Tk08|x1l%TmVzrxUK$AEx~_<&X9sxh_<%{w@l9 z7>qIF9xVfPLERK%kRtXl!8V0OZj%3yLrp3m7XUVL?xfA>s{qj@OP1*^e}E+sortI< zqNVKmmH=9*Um1Tp@pmV7QN+ebL^~o{1#EY4!n!4*5AkOMCnZ)=H{6xY#U4{x#Mq9C zVHup-M|TP`h7Wi`6#Z^v&LaxDm_Ly7DrTIAfKLbU^ zBXnS>gPRR45e2@^!n+J`e?dfRj^ssds6V!Ff%@XrYi{CR`eVV&N6D7}0GRn#z^(=G z;i~H-3 zR$g@*d~paWc0GD+cA-T|$0&i+8!oWXHxhsAuM*Wsi}5F9z{c z1%1-ZpD`<#S&V{gCqw`S+KlQC&+ZF>Bp`a0XuW!6rY^()8Dmsk5%eq7?-+wT1CGG= zc@+zPw=_uR>0dc6e^k7K?k+lO4>yyKoX|sN=M}PP5!Nrtipn?}@B5-L$}Xw%?QFl| z=jE>Rr)T^P7({2$!qlxH`o+x9jdz_sDhSQ=0~}j40sG|PYV`Uel=Fz`kAwOV@wI4- zFbBKgg7pNWQ{a~F!7fM3)c?giESPyuM6Ymp1iKc$0656Lf4>3XKgoTE`;iy8#2fm& z1;kEw9%DNqed_G%h17wkJ>36}^lu%5ozH|Zz5!@Vd;bF1>XUjI%kKaqJs*R3vm!KW zgLwtZ43T=J;BKsqfFHrEXsq7!H>Pc}#~5l)0wdYS=y{Mo4MeozE6<5M6P{6|PKF4% zr+XrM4QhZ0D@4UN8JgmcLS14ilBf()kwguUiX{F6n{4c{O%*tW00000NkvXXu0mjf D^&x-h delta 3134 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 Y-{aZoDqE^X%K!iX07*qoM6N<$g8u^Fd;kCd diff --git a/doc/html/form_136.png b/doc/html/form_136.png index 07b7eb82730044cad7367e68ccd7cca3ccf29a82..f786be6ffa51777e6f66148401bdb7cbdeb973d8 100644 GIT binary patch delta 1329 zcmV-11$Y-%EKt!n%s?oTsD~&=K7m{UiUEL$3okxZg%8EubkNWk;at&JnkV&M{r)zN zY*aw4OzE@4zR7{UEEhG>ER zo&RU(MxjXyS83IN&K5qL3tz5_lKv04WC{~eH4~u$Z(%JY0-eg=hujsxf1RxV8;`E( zn}nK~L+=zbiJI%}c?dd>^$fpFAoY0DMr3-9ste%8>wkHdCiPvcHk?#r^xa8$2+$`k zDf}a1JY5u^si#9rmfb336PlDL?)N+}S_|Mt{4WE%koM=&uNF$o_3kt#I%9|bBkm3I zzu0Wx&>l$R|KPZGRsjjhf8U4H6+v!CV)^*L59cMNV@X&; zjo|^ni=+LhqM3|CkiuQdz*Zhy6H(~i5cW`$H6fxod+Gu=yedLT=P$Dv!% zjpsX{`Z*0aR&3CO`5%CtF7&d43m#rA0F~mjU67-#zJ+*G|EOf;f4KG$>Q5%sCI27> zmlU4W7hGs_5dSlC#{t^Hli$$-)}*_Ronc$2v@Q2&VK%eQ>p|~0M&=}x;Qy??pb-Bv zTN;3wmxy2YXMvet6KoFvQhCV7k5_4vh-%JUMi%7%A7TlbaOy)TfBw(C{|NV90D!9>?)C=rBRaqyI7cbu`y8?|VdkT3rr43Yfa1(e z#51xZIHGzOgEf>$?`%%VxeZk1vbTuWyBm0qkR43Daig(?5>IQW=(!poNtqj{iTUej zQ?D${T|x8z7+ymIE>5U7j;?;n&VilQKzl8eQ*Wgmz43FhXWuQ@&LcViaEUawO0h)L z*ypV4D`tMXc?S!?$R>KZw~w9pa~qH90J$KdMNUNCD;`k;WJA*GQ~kndbO3>f#wtV) nkBE^1o*ZKacyf#m@Z|Uhkjd_RG{J4k00000NkvXXu0mjfQHgOM delta 3106 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 diff --git a/doc/html/form_137.png b/doc/html/form_137.png index 50f7a7cf63a97bbf582f85e76b521fbfd330443c..dcda115f3b83c5fef35f269c4d7ca952b05a64d1 100644 GIT binary patch delta 1294 zcmV+p1@Zc%7_|yOiBL{Q4GJ0x0000DNk~Le0001V0000Z2nGNE07VflXaE2J0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000D>NklaBNJQljjWhFRh;}BVqhU}YssJqI>t2$NToM3m0UU$; ze*!?J%?&fm38}C=w1hL%yX9d-RKpo`&&)4Ieg>e%*{Bm9hzkxCW0U~iT8>LSj?H{# zJ_7he({m?00HG+F0r+I*@R$Vv5RreJZd=+tcH~dE6GDTQaNZSzFP7Q_Pk|=)PIv%L z29@I$G4B)<@^{}+F2iKdQQ&)M2H>Nke|#%{de}@?mT_=Wxg8$Yhd-zL=ZNSNDN5zf z2_wRc6h)BApWgza8H&z=O>E_AX0@3TVKeIoC!mju^(G=eu+u2h$DpbF`CU-M&1nO7 z&C*4i!7bPZXKGR77jQb`JugkT8c`Sf81bIrN$N za|YnplLlsJdWe4v$7n^pxea=Zo5E3!+bzzX>?7$Elw;RCx>F7M%>1dxX0JNTYz0ud z7PLrE@F_-7uC!ik0NqixGFGOqe}`I}kOU&iiKx^7hLN9zqC%gw)KMYPH_R9{nEZ{k z*V>Qg;cdbxmoi5**E3b86wxw0`LmTjBK0dc?pes^H3EKtGfFLG4$|iW?ls=2zE^%N zX(!{-@AZv*tnDT9aUcGaGBphTMnC>sNAnUY&pm@SNVubJEyf7Re-{{Nf1!&g{p|b+ z!-*J%J1QHCbBhs;K6W>>u~37;d7Gc+GOya&Fj9uQHl=R4(^(w?)#f2ARjUk&{e=WRoQSS!+j3HH!m8y?Tu&8;-N#-KN@onk++r^f`2U1Muc;57FkOp?*N1F z;l$B}Sb@QxxL(W*$)8sRUZieR>`0jzS_Bt!f+)IWa*;e$d3o?$e+_LZVC(q-o;VPr zERDLAwXuS7Rcw>>m~%A3lvsZU;HxD+6Gv&E%bg6WJAM{CuMiKp&8`gY@ zBs`9(Zt-xPzqK}n%&(Cbrar;>WUy1EZvf_=a@C)uys#~lPNIZ}7T&Wh zfWO>S${zqqDVxKEfAYe1H*lLM6k)2ubDRV3knzss^PACU*hYnOFdqPNB3i@U2zm)4 zX8sT*UlY+v#;$?*W6F2{fMf^U4XQ@DBVdpNswfrpqMB8$=cdbM;zel^ziqQ=! zzr@#B$2K{092TIPz<;eBx2mk;807*qoM6N<$ Ef^m{vkN^Mx delta 3082 zcmV+l4E6K13Zxi+iBL{Q4GJ0x0000DNk~Le0001P0000T2mk;80B(i`NB{r`_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPmU@I*HZ&nzycO{5?BdY39N)vLMkDVkVpUtAc07j_XEgR+ufc$FY_n4q%h2# z%cXya2}kIMk^hA&?w^nnK#WiVfSGgSZm!XkB z&Y{YBg*tyPmzSx@FVj*XUY-UUQ91TA07wbMxS^YVA?{<+LSl$oVfNm(d7=3(4FG(oRslZVV59-y z{Y@HV3mwqC;dGC%20=KIRC!GG%Wo`6G6|7LCWwDJK_*_RxVO{|Vw3TqRRCt6UC^Qo z`%-g4&G%i}q7t=K-n4Go?kP8jx}2|{mi1?d4LdNYr7|a&{lamY^PCC5TmnCD`&mjl^`qm;!52FBy zNgu2`IJFL70w70O!mV{VnWMnwN*zo0)F2&OIFbQ|bZ8&cHHQO~4r=w%lp9A9?Ygn1 zrX%|(L6Z4ocCakWdpug#?Bcz3#k<3X5=no$JW=Q@A{6WPt3R=BuNL*ML2qBs**s=M zAn9O9CRmcfkf9-&x>{J>K}_v23uJLA>GXmwpeNbo7S*C*Emc@19Y{9Io`15g8sK#H z;fe>y{^sGOlci?A;8iC8*y$^_5`ex(0Qiiv$8A7gtNK1f#J_4&4zTzz+Ivxd^QcOW zq+4!up_!H-ETz&MXS_xlZND7q=X5J??GXn&AN?5@e2W*?;O*Bp|F@el0_us7@LO^G Y2e5R-hzw97djJ3c07*qoM6N<$g1cJBivR!s diff --git a/doc/html/form_138.png b/doc/html/form_138.png index eaa34a981d94865b99226cc4c4f5173f35ccabc0..32783fd1160a13d78048208d8637a42eeb8a036a 100644 GIT binary patch delta 1350 zcmV-M1-bgn80`u`iBL{Q4GJ0x0000DNk~Le0001g0000a2nGNE0HE~cCjbBd0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000EkNklB3kC|%!Kd7?}5+N0BRxvGjGRsf{1DW1%R_0 ze;PA6PRzU)*+SX}fD?emkgw!-%gm;p2@WJ1Uj|=$eGOo=@u3V4DB~^Uyz%HRjPn)L z3jf~!u=pb8{hEywOm>ow{v-a ziYKQ=i3t``JYRc#0|4@y&HITc)tEX;G|W7C{t!eaVg*!^S6J6)XcM%rk;&dl>xz`u zN$2j-iPKL#Vm<%H>y3$%ll!$N_j>)r_j%B3d{ApM1TqvQasA1+m3GEb66Q=~i@8o!{>=o?7xoWZUo1|yu zdHw!2&TLdRtq9qX30C+FuYc?5=o;gye%HZZ=DxN-L|;%ZpX&89C?nQTW#lO11K3F) zk5Cg+5AZ^Cn$<-;QA((BakWv2f80`Z?OkmW(FwqZBcUy&T^(un9zD7rwQ;|diAcg$ zkqMZtwk22npuC;|93o`RB(qLUa%9jMz$Q|D2H*mqblm$CT{F);Z4+ z6OqvGq>xa;=gjbZ7@GM%V0|CGst{D39HwvZOJ)wW5o0{f>nXLEr(za`A7!nOoQOK#na8jonJFJm-MwQuDlB5uF@%@;*;|zCgAHdB=wn0aJ zM&loWtA|3)myi_*GdHp^VtefhiX(RjW3cB&R0U(Pg-Xafn@w_U2UV2}e+nnu@KlhU zNWBrGv4={OwoqPkGdL0^cTk4;Yw6Rg2XlAN{2zmVp@Ejke5W^oZay{V$el%p&Khb$ z??sp1#A)nz^Xhm;;{&aiu~lLvqRPHz-QO_t``tU30Y)UzOS)r>(XY=xtMP||h*m?r z@u%S#Ie#!Dl)lWDL6h+Xk{}i#N_aL*VgH3OdHxGyGX4wWKRu<^X_8Q)umAu607*qo IM6N<$f};0|fB*mh delta 3122 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 M07*qoM6N<$f;s={xc~qF diff --git a/doc/html/form_139.png b/doc/html/form_139.png index 38961d7e86256ccbcc8f2b69b286426b3dd8f8cf..10bce05261bb547c4c297b6f79e11837176d3751 100644 GIT binary patch delta 2171 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 delta 3598 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 Uio4|G-T(jq07*qoM6N<$f;XPmVgLXD diff --git a/doc/html/form_14.png b/doc/html/form_14.png index 39a675e962a340a6559e56da6da9624801b4a0fc..1c19648bcf3b94b15e13dcce3d7944097aff7ba8 100644 GIT binary patch delta 1059 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 X?Ab-qVJ{`y00000NkvXXu0mjfqUwOD diff --git a/doc/html/form_140.png b/doc/html/form_140.png index b1c918f8aa6bd29b0374bacaf5af30d82719a22a..eab8a8ec298a75466970daf0f3079297a25f565b 100644 GIT binary patch delta 2521 zcmV;~2`2W#9rhDIiBL{Q4GJ0x0000DNk~Le000360000c2nGNE0L|Hsy#N3J0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000SHNkl+WMtgo@39AvkufxgXbqsUZk++VG4sbrLz)z_ zf2EM|t3X6M01IYbG4l$*ixiziSp0fqq0kXTRK;s$#6Uz95iLe~_8I_~`Bm>R^Oc$Z zz*q}AA}Yoh+Ylh4f{2!}dfz4#<}77ZyNo@KXNL%bJ%F(`UI}1LL>o`pLH?aB9|O1o zsACH5TYL&cR0G%$(Sez--_hq(AOhjaf6Q-Vk7Z1V&@W(wV*%iUnYW4EtO1-yJiDKr ze}5I2`AS4D0FFcyT!$}P3Sw@lbd8!O&jisZ%O1=>N2sM#!D!q*r~r&6T$y>x%*4zG zPqA7rvvxL$(*6S@7`)ameKmQBi1uhaxhrOV|5Aq&fe5=3%$#P;C@CPKBaBc;e_Csy z=O=)FnR!y0TF%)g80+W1vBxt6#JVq-`Q@SPD?)*YN&q`FQg&-Qah@5%{AY1OWeA9f z0f3n)v0V*gb*+A6U_Bw)@+kjZ&F%Obg3S8@k8uC$@nHwRUgTLg<3w|m7}3<7B18!Q zKp$(cLgUPv5^5L++^-P`!0j0Ee+D!EJM`sA3Ka@TbP-`vU}8eS zaw7jKfnebsz|sv<_7VzmJ}d#~Q9+qxE{?{jYPGSU>zisRR4^HXlh}Afv>+n&A#APt z%Q=VEU5LZ=3MUNP*HWkfyjqJqiN*d7h*n#mpEm6K%wST9l$D{R8e#CVe@jwIp#4(X zcRBi%0MNskT%m&?8G;U0uEf?8W?tgSd0A+X!iyhpqDjel3c6_mVVyZx3dtt2m8aqL z$P1(HU{GXA22j6Zms}kPP$;i zN`-T;2EeAfwEm`c!7xqIJcK3;<6ZZaD}6T3{Sv^=`kSTh8bIyTU0UTTWEM`H3xLna zSSzXLYk!0Z%`IByP`CB(X}6EH8Hx@v7H+%7=D!~Ns!@csr)=lDfA7>;%iPP`y~F`* zd<$#~1s_8_(S~ZEWR~b%0|0{1h>T?J}sN9No7v0mdns|nA;Vi6^vDMiS0+9 zP)Kn!y3R!#lL|}9n|M6X8*l1I37zA;XK^{-+UIQTCv^6{m9r-dEd3QQAvWI{)i468 zOBCRaZePexh^94Q^*?d(tOC$b$uHe1so3=EB-`>Sg*8E2T*H#7)@5$CmLzzW~6ECbmwV*LckG) zf5uU@iH*5se44;hMe5nP8E)2{=GW_7OSxaean@P1eweG2cX4K3U^z!&1giU-qi;Qh z)|Zy&*Pb~9op?f*Xl{b1-5_+B!zFy)mKSq!d9tOiy}Mp+1$$%LS17Y=6R5A(!{)R$ zjO!^~Sap;UD^J@t#?kRay{-{L1+(cKe}-c;Ng}muuv+ddtOeT1eV>rK+jO4tpn$aM ztYr+9Jlhw6P%rgK>aV5l$)$6E$#&8vI1Y=+k|R(<(P1u^%<*XPT_u0Fu4jPP?`S&o zM3&CxFDz!*Sobvq=4v(7;%n{C!;lx}UUI6dY=GE11S&xFW2U8C4+2Tc0{tvve?m;! zw_0p6jxsi1XRMuR(>4dE?_NTAXgbX0l06mVy$o>`=8XJtnkRvkZt$=_hWstbHyBfA zEoqfN6Arn{gJ9+Z5xoM~6Op~~RxqEY);tH-Q~nCc1BXN|xWDIl3-eQAZio)>d2D|< zx~4T}Oa>b~Dq{fO@QL?SSXq9mk)w6pdPG!)+6r?n_#3{jDA}APJ6|9sf1*zqp);aY5x{>w{vBK>JR7L_xTpOsKZc2?|2y8urUem{nv9k)QCLZV+mK?- zKQJ2sn=HzO^LFSK*-XB{N<7N`gy~}klcW~3(zB(|5rKCWGH}yAWv0)x(e-GZg+fL~ j#vStUAtNK>4*vsOC*^1O59?1r00000NkvXXu0mjftOBcH delta 3758 zcmV;f4pH&;6T=;UiBL{Q4GJ0x0000DNk~Le000300000W2mk;80Qd{>>;M1=_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPn0SOmy-ra3A8{;U`ybYfJ?w7$R$W6NF|^Wq!OeOPzjSC0xYy^uch@#PUe@5 zV7T{kzu*_~e?`*)(yE`4{P7-H{sUYV?_2!c{EX#Y`gd>Q*)T3oKR0lIsO4ooM?a4M zKI?zdoR@#+!k)nL`?+F$a{~Z#R$_7O0N~GZ^m;Sm1ldK{b5dk9^D?VyJ0PD&wuJoA zhNAtDYJdK7gYg8{ZLGeZ^c)Miz8L7fv1mmD05i@eKv91z0Jwz#JP%_M!|_F*po^_1 zOs^~&pw92;3|Z*!B~Tsb(e}Iyca%rr^ebzEQsIC6jsd>ZUrvBKOf%pe$L~>SEbCVm zS^Wd`NvpVx|EoEbQohSnuc0pjxu4AoYc9f{$<`Tq95?4bsX&F7{H}mF?lNDX41fDV zNCj1s9A0vi2M~61{#Pe(!kqn599;P^b{TWO7W1Vq%gfm3zM+TSeCYC@hYZW_$^saV zirjy1L{$B~{`ZRkaJ>E%j(fd%4FKcC830$zODnoYp_jE7ZxZv^rs>Od)VRq?tSnpg z8zlFC$gq4Yw;O=b9}#xGLZXqWT&w=>|8gSfb_MYT=Apn2i zy4aMsW_-$isrP-xa0>l(1lo``Q_1WeT5GMf0=}&$MtosY#-rJWKS_#sST>GC4;heL zd=0@O{L9|=0mGO0d<`k*Y5>A)+O?#=n)1N6)m)UE8~u0TPjWzX?LOe~K4@Saq7yd=> z`-tHzd?oKr;n(~B(&Zv5=iC5X7bz~v0$6UN>Evh(@PQe9FWS3@ZBj-N{+-#60O%GY zFbbKM^)qbz+{<+=HX>hf77T~cjZQ#o``7ldh9qs9&7<>i)|&Ae7L+AvqThe*!hc); zW%Oc)iqs@2VkoEJHK<8D(Iz)re>k|ffcxI}5yNr#RNG|Upan?Qn+mQ|xKSIDt|nKPKRxSz%ohU0KpYy5Q2H4b2?Aag_o znHwMjX{tcduQDnb1=_t3v`ByQ)@$+z#=z5glGVEOo*0EDttY8vAnApTa`@HMBx|`L zf5LDWLrhNUp5aV-MRRep6%|Pa13(1Qp(PojAl0Yae!l-%7~#A#At>u?(u>R{Bx}){ znk0i&b!}8MT~M}8PHBn)^qAo|TJ3!6)W*Gpeb_z^ft=PrMj+Xu=D>d#{zdrNbYK!w z@O~h37Uc#&iBL{Q4GJ0x0000DNk~Le0000x0000Z2nGNE04ktzMF0Q*0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0008aNklKmaF(DY?ER6AVuU0(aOm83CL@qd*kyla z6;Ba_?P(E^-x3>V{ERf-(&1E79NBZkxyV}weT2RpxMIPl;?dV<$5mJnDFFJkYN+h@l%OkkWnpm)ZWHug zv#FHw{c33kTB#?YsUiOQa{1L`NClPaf3Gi#A;RYR>&v3ET!LOKN<DX_tgiMI9(RCZt4v%2GW zd9?Qx!Cds+rVs@_V|38~WoGzHi>6f7Q|s&QRn?o=30H%M{$Jy?vux)^(`w3nJdg3< z8GNBN?hECN*x|hj_Ur6=bZDlwf9o~QI%-^ts7S2eIZ+05D#jkhY?=utn3|B@ntHn> z9qW%|xY>|$@flPMD?%E5?!;7)krpTG8;gkVLgu8autOQ{RoQ->b9R|5cBX8S`-&z< zQ+u4i4+4qE3TNhhAH)lre9x3-T;M92BonH75s@V>r?v$yaV6?9vb^2HaE?OE!AFM` z7KIM1rCSwS(@sGV`h&gaBf0sM(Rjirzvhreg4iWJ=cx%>kA>RJI;vN6R zYjBab!D;xe;)-E1pPdq>(TYsJzOH*mVV}i2n(@>43yCo$!(9o{Q~&?~07*qoM6N<$ Ef~3=lbpQYW delta 2793 zcmV0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPMxFyg6DIu0XN-!mu5=;r360Rjc2~t8RK}wi?05$IQet2FSh2xwv zGw>y^J6Z!VViXV(LJeY#6A=-M77>x@YNQ4x_0Ex^&B5Pmm310g4Oy7U*_EjZJoz>U z9t@^PlRx1dHDu_7`VJBfeDyzKG>odLZ6lpb}UHR#R)x9AkS zX8pbld%tck<2y=^TmEfb-`RF5?=73@-M}tiJ9_8d>x#)z&+H(4blhyZA990E{EHZu zHmG@b%#UJgk2S1qXjKFl9;&eN%AUfc7M61N2vNJDq71{=&W)KiH%CZj)=87b92`IP v{U|B)^8d>3ljxi(ecP+XK8!X`SG4{BRN(=nx8`>900000NkvXXu0mjfFvUXz diff --git a/doc/html/form_142.png b/doc/html/form_142.png index 6319cda93b6f6580d04a066e893409ad4e0b6981..2b6384db2b9e3eea7f6719b6558cd6fad7622a52 100644 GIT binary patch delta 1081 zcmV-91jhS_7vcy&iBL{Q4GJ0x0000DNk~Le0000@0000a2nGNE0L=2YA^-pY0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000BYNklviKe z428eDXByCypp>8~K`9|yg0}=u2}%i02}%i0333Te32_P79|Xs;tOw;Jeq?gb(TQXc zBzOq|AQYJy- ze+ITd0X&(R%u3{%AqiV)tgYOElmo|ND~I{-!WUnxu+A*bex224S%G zV_(moF+iH6lHkVx9?k4^PN%K*U((X#e?I8&M`;V>z^j?v&F(a$9a}T|`F<6z4@Z_J zX+atT zfR?y#Cj`VD9Q(Agbw4M?NLEBr?di<5qb3mc8+ZWz=scF(o|I!rDkS9tuX9)6f2!f< z<`Q@&?7p1V&g*W^kHCU~sB2~$K%X$?Mvv=gLGxcl$Z0ra*XVp)=2!tEHJ^VSTbl%z8>xnj#TPtCl z10UIUo$I@2j9M`=$H)i#e~EUBp|rrQeKZYlj9T!-X@ypl9JS1Ikya44$z~t{t_Z%Q z9*~de&s6gLL?G^n7)kN`I7VzFZFHQ^I7ap18Ho8+#&Lo2gl-#PhGDCGg_yOG4xw#o0)kLR9_&V^+YU``R4|-$kzCzlPlZWK%xt6R;sf$_*i+ zCw&l~Om4qA+`0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP-enqLJb76W}C8Lf(5v}<`9NH0R^EX03Mlm;}bcpTonxS~A-DIpi7xS~DWpbMz6K#LWi0*2fB-8@$W)c@1)p$GJu za}-FsAU7vKTwJWS_wrPsIc@-`MYRtAfN;E*razfJJbWm3d3uWX@*JTgH}9L1g1Y$h z6+J=%8!gb6)kg~e2#X@p2|zlf>DBoPKu`d_|4x4|sqkT!O}Xu#UkjzFdaLyQ1y4{w z`m=q*K4sbcul+0jKK}rt#5uOwoPJmLy0oCZfUEe4$BM zy3^3ZlF@oni+J9Uq=m~oj5U;Xt}%MbM9%}tZ1rs5rtOVutf}X~szH+92ms-jdL@iJ zccgzh4GVi#$I%DdU85k2Cx5~ND7#P~qGl{Il2R{@Q6Q)1=CUU`)Yt_eb$P&HcGaYE zv^{!cZI|^J$!JK{$U5fsFy^1qL62(Nyz=q8005YNn_2+6%iAU~xk5{dMX* z48|Y5=UspmxFgUJ=m>NKIzkwMjzCACBZLvk2xSBqLH7^K)TQ~bofyYl{m#ju&=5Px zgCfgPLd*)lb9>5B~o`|;D`=o<7 z#Rnpq0oVh0Vdjg7w*v5onNPX;r50H6r2_E5%olk-zj@7qT42QsBC47BS^k~@I0LxA zSl~&~>T)Fq0w$sz%&$L&3xI9x4?y{aYke;{XX1jR5Hbqg!R*8ge`W_> z6ZFk(b0_U=25e&npa$^D%vq`jN=MFp4P${XFc$eWYb= z0v3n;6Tp#~pOW_KXM0aPvd=0$_2M4;p`;}w3SmPi_Zk4LVXSY8_6`6R8d@u#5CPj@ z^}R-%Dur4_>a>n9gHfemIt5Hbe>);#BC?SO z0I2O}2`2_@TfG7vP^WbSFrP|sq7p}^fSLJ~nF)YRn>#TxIZLXHq=mHKIm06ng)K}l zeFJlKs60h!x2*y$7~fk<1r6ZD1!&^bCrZKBedwyw>TAdTe~Cc1$cd1Q#fF*RM%>;% zL#Tjz#V1zL`mk%5!IDk(e>nPVL)!BZ)j}+ON7!u+BgB)hWt9B_{9GDkqWHKF!Io46HHZJ8e{Co+by{}6q9$fK z2CBitxFham^k2qDz}_+0hVR5$-%!yv)@dwwRBA-ytps5mhj=b3XoL@C=+XJ^CzgOa@x7 z%OR5-ecSxN_vAz?VnLr|dk1E2ti-r!-_8_fD+f=FO>&Z@mc*>ss_yC1Rc{1SGQUIXOc0Q{if5o^ZE$ArHWxgrugcLkl z@xdglgj592MRbkdfw8D(cotPk$9E$i5L*+s%6)PYop4*&THSnZ3v!F8$c9gmuCwyW zS$XM*aqZEN{gqhjdzSa^a(1@gyUm*&=(N^>2W1PO&V6zcopAf({A$^69`lDQI!X3} z!1rw&>eef|f3xyhc5pwX6Ad#c8>JukzAwaRKZq$Uj?4GUKse`jG&jN;yPW%c9mKJj zwR!_^k*eJ}fEQ$j%?#CP=o4|A+W@@q1BT8dd}s?{n+B&3nYjOBCXN%NJ&pl0zse|j z$n@|Iz&k(gy&x)ioy2{6??o{;_hWN&li0+YIe@nTf8w7svVYfn=$6%rN*nbp(k<#~ z^&DA)_lPdT4R%tf>pmKTvhVJNxIz`aC#Mcwo ze&Zzb1IA)CrFmXw;3hr>2rkl90hf>K+dgsg4Gs73FO? zR-A~4N59Wyp#002ovPDHLkV1l89Y@`4H delta 3463 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 diff --git a/doc/html/form_144.png b/doc/html/form_144.png index 6431cb910b79cbd34168fe4c2dd6f80f1b3c48ad..a5bc6aeec7d88c20449b28aa739b8da4ae33a6da 100644 GIT binary patch delta 879 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 TyG`g#`W&FDs0Av20sHWOzJLqG literal 6680 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 delta 2781 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 diff --git a/doc/html/form_147.png b/doc/html/form_147.png index 60a16b45c9f3d8947111285055cad2b616fae3d7..4fe8e6ef969a939528e996cf88ec664f2c3f370a 100644 GIT binary patch delta 834 zcmV-I1HJs17VQQ=iBL{Q4GJ0x0000DNk~Le0000#0000a2nGNE06tFQhX4Qo0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0008iNkl6P+YbuOFUPK(Q5|Ltz`%Q(5$%{w{gs4}S-fv2b5qSsP ze^kT+E+Q`?GY+HuP?28&^XT}dGT?0TCUP&T`aYsRlj1D$CUP@iX{WaK`w(gGfTgPL z?0A!4!&{N7A&+0C09*52;)}h4XCn7{qdU0@*rj~Wl8;1gnX@y5 z0g|;|L<(C%N9X#ggoso_>{=+*BwyWe+52(%8n~Lw~p)! zU}FgG7hdQTSR`#aI)%EZz*~FZ#6X4FsOcJGGBm zZRBTR$(%6Grf+$ivcnq-r)+<>s(S8LxdOVLJU=n%M+~jf&%&MI8f!}duol@1Eh|KXdJ)VFPcz9RUt|v=c zcF>byV&X6fY@<`?30q}L;R3(@2fZ#6k;caPoi&_V?Z2>!)a=XYL7BZKwI3b!@a2G| zW!Da`8(G}TC+aO;*|+!%m=9SZldk!%ghjmK6m7T{^5@`Q(*7*`2M2F=rCL9r2LJ#7 M07*qoM6N<$f_IsMuK)l5 delta 2812 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 Eg8SIRod5s; diff --git a/doc/html/form_149.png b/doc/html/form_149.png index 2a5ea45ab576598021553e580c525e2127ce91bb..9c37e69f9bcf2b3b5ed49754eb0a17df593d8b86 100644 GIT binary patch delta 669 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 Dl@m2dc z49CB^cMIf3$c?~_P(~;tlo84Zy%E|G$_R7>7=eyJN6_yN%fxl;#7^DR1%2Mj0~$3^ zELpZ?#}G3^Q52$6`QkBQl== z+SKdoaoM5vnXQ~R0NxVh){Z?=kL^s)e{d7sQp?UiMu&S2-$M!>7&0*Piwr?p09yc$ z8TU}8qxPwb9e|Gnxdlwncm?qPRW<6US+^cjf>cUQ;|Nm;Lcg>FebDVc_}jy)EE8+5IDe@cZ> zE=28fpRh?x-#iF}s7bffp49iSU?|@qtexLqvNcksp!TT`&0rE+3EULdaX~)e3HqE6}sN*f{2bVb~ycZ-G)dFQiJ&p zdEgaHEByiBg_(6IF&}E53Lv5de}IOWpXK*A0Bfo6Ei*qlvJU{>VJ0!I-lMHqw=q&y zoV)ps#)-z32bh_nR{)Pc-T55@mg0q(Cr|IHeX3%K{#5-6z>b;EDmycO5D}2}w!lx< zZIG0nl$-B(c27t|wlXbDM^(31&5EgI};Xu(Di^+NT0!Nd4-3WbN`A5O>dK<$NTm{RY$MJTY_Z`m^hH zEmCIpQr6$thh5Ybg?|BRp9)~+lQ(R)b{PuhuEJoD%2!m36xcW5d1F^*57Vudq3j*tMl=+vFsB?P5j$ zn$|cahH6f(=VC6@=ce}YWLuaP{v+o6rR?b}NR8erM=z1Hm3Q=-2@LjBWXj*(D=SYZ z^8eJNTaKShVJt|ccKh5R#OQ;`3{)esCnDOy6w1z%0e}Z0>LvJyf9MUsiJ70A&l;GQ zW{*U)hsnP*FfGGTWcD!YKSsy$5#806rXh z+E)GuU_(T^h+b=vJ-`fw*F*&OzH)uLwT;z(MMQ@SUk4dm(QgBV>+j2{KAA}|-E#co zB1X1W_=4G{VKXB4e<^YtIM;Z8ui$Oh0B;Ki$PRwaIrik+kX|C&%I^#lOtzlP8-Vwr z=ed{TR`zi|-@`1&@UQXd>QvC4UogEYz*IH{u=k%Qq?dnRk$V?eU;n6o#L6OKm)=%5 za$kGi)h~MslM8+3BHeQQB;$M&(kq&i%6T6QT_VrF#uDeRe_;TobqjT;-AKLQE*dY< zkNUA>am&m{H#yASw7hWld6^sA2hwUTA*+@>*@Ji8Quf?&H&i^rto!kMp__ihPK^A8;!TVGdd6M-{&h*5Zh2Cf0Tk5a+H0<>4TNzUXEJqgDyb! z8Ue>Xq4FJ^Z)`KSdFcPSmJXx_Dlc1PX9G#o1l0uM9!Pchwc>Tychp&NdG z!5eOuEC9Pn)>e*QLD&l7edpU@0`gz}L&3{mgq$np^nN8tbv3w?IdbQD|GU@1B;d}bCvBpVf5X$SM>t7t=WTw#OnElwC+}hl(d;nC ze!lW``Q_x;XD8>D0oeu2i_D?KY)N~D2;+~m%*K&_f@!U-bNjP94a|C*GpA~3DBtQWL?HMAX7a%WJ^Z9lpj{vsb25&t%rN@+doP+(x58se< zuV%wpEsPY$lkY6xO`AG_=H$sXFyrN5MG@y6dL`gjlWU(TEBQ;>b4;($HK)iq@*9}E z&aVz+6YKF{*@-Qd>@W14J4h+YJ)=QtLpljTYU2keAn(7$D2k$7jZlCB=FLed%1^-N rWR!d+m7Nav6h)~T9quWLQZ;`7AzpQ;7l-}o00000NkvXXu0mjfPaO9E delta 3572 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 uZOT8t=J)>0J#~^0&1Ly7`n~@}$bovbwI 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 delta 4607 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 diff --git a/doc/html/form_151.png b/doc/html/form_151.png index 22f0837ecf3e0da19f91892a770e7f55349bd4fd..5bed0df100018dfd868ec8cc0c64df0c5d53a45c 100644 GIT binary patch delta 652 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 JPDHLkV1i}Y6ng*w diff --git a/doc/html/form_152.png b/doc/html/form_152.png index 378c9d4d36a1a36f819c58427fdfa103783389a6..5d6599769a89475c410c48ff085ab83b062531f0 100644 GIT binary patch delta 3136 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 B=cWJv diff --git a/doc/html/form_153.png b/doc/html/form_153.png index 14d81706cbb77a303abf5ed544664a5bfb04131c..4e9646b3ffe5bdae66b6b8d828d9598e0e8a228f 100644 GIT binary patch delta 2816 zcmV+b3;*<;ADb3HiBL{Q4GJ0x0000DNk~Le0003(0000a2nGNE0Q`3|ZvX%Q0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000VtNkl32P>fxVjJv=IK$$Xe4k8GNs06SfqTE3PAfkeZW@Fdmo*_c;#LOQp z^Ua8;B%&=5F%cbz=v)4lw%-!bLf(_{OSlz(nE3?YAAogCGyH$QCRB|8pxWRZz^-qZ zW5cwm05C%}vm61u3vs((4PZe;UjX(Af6pJ8`Dp62MMc{kGw;py8Gr?VC4g6(=aE1} zYXEa*{@WtY3_yvBHah?x%=}{R7pVBMC88Hpy#566He}s1{P+$2F!PCsUZspb!STz? zy^>UnB`x}vH+DiL%zpr^o$IAspLZ;GW9XEUR!;s_&p%R<0nm!}GJqJsA=WQZe@%Md z@(%9G(hwbt>pta;oy>sS1nz&z{h~wJ+ZIA_>&YK__5ffx zHtlZAmu-kAf#-G7`A+4P;m^<5?S1q#27gek?t;o%-v%8-c<7)k$0qVX44MV*&*gsd zpfq`-8jaBM;OiX9M48z%J-p^(e`uc6)-Hog@+~D_P;1C(5PpuvA9?q;_g;@eOBH;N zAPCKj(KzFDnU$pMCXeY`+M*0e7KF^aW9FcxOHBKA zV!1iQWuc8Q|8+?H3Zz-t)urOd%&qAt7RnPFi+skQm1kWKy$fgjj(Oq z2l1H{25(TgzCY<#Y*Ql1n(V0#JRe@@$s5IXY(Fwr6 zm>?BL)FpryeV+*8t&}?>qK~%AmK$OYTr7)1uuGjzTMI(Fye)AXe@ux#+LvbL|8{~< zoLaw{IwlbnDVmKZ-yD@CX(+sPQNe!`GApeC{7KAmt zTW2~Z3qono64%k=vUejOT4Ih$gIS^4kH4pO-jqLPYw6gu z4CT9#}D0Z#u-)d))fe8uR~I1YzH$xB4wc2cHPD zQ=-P~E+@~HSD!X7`;;>@><>C+zoTk<%v!x-=2s&63B7wlSfQUa^EZ&>PuT?7GoSRn zc>sg)$3(KZ=<88ID6`1!H)hKr{n|P#v%UUB9`v@1e~a)@K@xMcUO{}Yh{(H77=cbq zA$p{0gFxjrbrJ*3B4ikoKJzZ^EE3D^iXG~G%hr&AF>BJa%!YrXK-cHoz9$+@;kmBm zHcmojTu~8643?wd&s0LjpUqWH-woBeXd2Ox6O3av` z)Asclf81vpC3I%1VW$Y;P^SnD;OPD!aORJ;S?hdd%+MvV7;$v@-&K2#4s>STiTjWW zm9~7@AfP3gFi>+;+Srnaj{4h9N_Nwph(1w`867`IdFB(9k;w{&BdXw`du9&#$*CYL z#QJ{(up**UL!L?CR{SwOuXCYYztCxsvw0gNe?~Sz9UbB-a>~6VNSL37`+DBdd)64@ ziNpC%}fGryC}%R2u3y@Z{Y}nOm6iu7;i=9&H2f{0Y^6N@-~R zf1sK~R<`UGWiEZRj#VPL;)YpC2jr)i48uZ!4^{{Smp~oD>#DHWZ2z~E0nTbG`$2dgZSxcf0+)gcc@Nu*-u((6rwJtJ01l}t9=V!(C|^bu_b#>H=8k4 zWAiP?3RHU~!TlA<|82@R;QGsc2V7c-SEw|fgUJ*8{6LGg=<>1iHb94WmZVr}e2;d$o*3z4u$f(FV;kYg3m`-@BhJN&h^AcoE=df6%Z*@=(TuL9_;q zZu8e%SF2osDx%FjMCsAfDhoE>z5RuEhE9qs+-v6ff;~?1L^ShV*L#SZkVrk<@=Qq4 z1m(FostNgTkOx^1J|@gb2OHDRE?N70tbP>8sfrW#Jw=f5G%$gO-+YtT`ME3zGwul@ z3}bN>Gco|2k2UUMHvJ_F!i>8E5iL1??JpyOHbEJ(Ak4_fczR^_nT(8#r^kO+amord SGKJ;<00000N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPd!IJ}ZV0>~upzJ^up!VP&>`3%Xb5%)8iIy^AwUS{{y-7!o@t$#-Fa^P z*l`g##iH2@`$G<=Sy+)wFd@)if&v8V18vy_;#S3&iE8bacT-XjeRdtJalDZm5`da(b z>ysoaRU#VbmSk`$45I$niU;IvoIwPVTk;IflQ)Qpq!Yttv~-i2WcmC7@#XRrbn;y=JmHE*@lxfqS4wZxQ3a7Y~ z52b&+*EqtKn=&n_&ywfz2l|=Q4vXtQBhMc_oI2!ODIqtn!XHX`uW_{GKRK`W(Ez}B zt`I7xKbDB`Qj1(N-6M=z-`%fT+$!9w*C0KX@0tmA`>sBr>~T4Oqxxy}2KaB6hf^KM3_hbT&Z$Dfa8soX*P zO*fyPr3H-o`KwFIUz%D0!d_&8?E$Ea97jN`UK-UpuH-@Rjf{QN`t`H||0Rw@zmOO2 zT^hl-0a4xKXX?v0wmVn*w6L!Be#a#vceFj=KB&p#>S)QEo* zU%rJCFS5)s3wc*30N|1Ck13m=n$<<;j)+220l;-mDdS>^s*g>+4&Maa(-uk(h-c$3 z#okVB|K03ZTiccX6}Z6OhR4cw=h%|7p`*Z1Y{84=&!>elT?aWINU zv5S}6bw9Uj{$lHhWeI@U{2F<8}e$H>xB$p|pQww=b{aB;H1Im!mO2yvW~O zyi5G9^$qf>QhnAVUSuPV7KP7ot{By}DkVv~HakvVF~nSh`T1@ea(z_PjIFMgF+q}M zzRImto@?2q3y~u&w%x(C&U1e#`+9Y{(*$Kn8q_46C$uH0l^)1$2GXcm-tu0_Gn}fX zE2`iY9Z1&2M7_I~9Dqs8*XefVMQ+)dmAtUr(o`a-PCx7lrUMB}vht)XH7DsZ$3Yey z!Fn#iQ#UM4G8~fmHM+Dzl4RIu%k zw(R8^$vL06W#<4+HblKLp2KqS3Q8;+HD!~kmUY+J%u29I+s!{9j%1B}&$NiQ zV4+;sRYosuh2;BTF@%2sndzEM>M)QT&h-8sadr*gZCB;P(mL&)G)M+ha^NdttKEHZ zlk!Lh?>rw<-lm^N`pRinETs`hwx~If$$wY6D*C`VS5@bJ39!dufMr-z>$d&8zb<~8 z^4P+a?ovqiUf0foOaW?`V_u8&%F_hW$>-~ylL`ZKH+9kf(f>I+7tPJP1$n$2a_~O1wmcY0~aYhvXs-w4DEz#9x&L@EzoR kOfKqZ6X4IwZ*2kKe~A2>jEC*i2><{907*qoM6N<$f?}nn(*OVf diff --git a/doc/html/form_154.png b/doc/html/form_154.png index 531f857364a5592b369b0fe7c0516d2966c23ff5..6add659389d479f7d5c00b732a30944dd344ba6a 100644 GIT binary patch delta 346 zcmV-g0j2)+6Nm#qiBL{Q4GJ0x0000DNk~Le0000E0000Q2nGNE0EZ84TmS$70drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0002*Nkl>@^stf1<^R=Dj-Uu7u0*pYD=kxkIRN{2!W21eO7v%CaUT6)k4~Jt sf=%?YILQ7O66yT!hnnz{SUkvgCgK+G5O|sE9{>OV07*qoM6N<$g6Lw9cmMzZ delta 2519 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 diff --git a/doc/html/form_155.png b/doc/html/form_155.png index 7ab4699300584e091717c08ba85c19e2eeae2219..ec80fc40bdaf7e4dca45e0f52be9b6b786a7ff3d 100644 GIT binary patch delta 1025 zcmV+c1pfQL7ODt9iBL{Q4GJ0x0000DNk~Le0000+0000W2nGNE0I!1%!vFvP0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000A#NklM z42GY#*9FuOlo8Yslo8w!+!34+)DfH!oDu91k`bH{>=Do(1Y?;Z<&UJcbIp6FlSG0b z01_Yx%FOt}5Z|sXz^&rTFa?}!7)iCHPSR46Nm@&K_ID?#>e056<{vBaWpK1%+#m~J ze+@LiqnXLf?#%2b@Y6|`k}63JumD~@To9384ZtXe7 zD05fv8K{mlkc zE1xsIK;D&rmf#8o%+B)BPaI#&47n0}e~`2WYT(t(?oKtfFWGA|`*Hq|T^9pak~Ae4 z1$MFG9Q=Mq+pA+RV!KWFSuf&s=hcxUZFBsG%i!<3hYnLPqAW{!Hqf4@jO zObJuwY z_@TB18ZV#p_|BZ~Vk9{h4O2Nyf8%lt=`&}Xija3PV0z@aXbQ|n>MKIpVxE*Qa{T}u z!6otfWv1=Yc`oUl$=IFq26-cP>5#O)4bbhC6%=XMC7O!Hi6fLU&Co5JUzL=1-bbC% z_vA2OIih5nlut$sW07};*IplE%Eaj$lT@9LMoXBs3ukyJqZdbTFr%FBe>yiX{*IZ$ z$q7o9j2-0|WD9b}FD}<+wl%Zgz#Z`9#WQw(`e0`FrI^w~q~D|SIMSr$-gjKp8vlRl z*QY@=!Gv&}NzZsCIpQL-x1mjs1Os>nqbtn;#Ew$~q$@;Y!(~2eIL4K%fd~Ju344|| zr89kGd0paO>D2{Fj~J=Je`ftkSE?pID@vQRslVe4>vFPW+PqlU6~EyUhFQUzqWJgJ z1;Wf;eWX*NC;j#b+Cq6vI2^w5>ySzT*j)InSD2vdqj@k{-OzmDg_xIj7-)d2B`bH^|2o%`KtXRn6(^ vLS42z)-jT6j&g9|Dkz)t{leF!ei45G>oAfnQ^$@(00000NkvXXu0mjfRK4dM delta 2852 zcmV+<3)}Rn2*4J9iBL{Q4GJ0x0000DNk~Le0000$0000Q2mk;803sI!lK=n+_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP5Y**Ht7)!SmT2mD3S9Nj#cem9`QrZv(#!?+jF;^te(W8U{yz=K~G!cIWM zl)F%&+XsJ0JURBXKu8w*5SsV2Kn>p$Ef4D1BRMF4|InXHn8E#rUmqF#u9R2hVeuYl z1~C5wn9doX0o>EhTY%Qq%$whKzLz&sFb<%3Zoo3R7pGt7TAhtI``nxgG zD=E-RibeQVl6QWT5=oLgy(ANnMzax0h$|?VSyH4(3L5d%lO$a#puTzUkuo=Q#i1>+mQ^d)c}=+gE}20XB258%jzwQa!F+1rVX`2fI19+dH` zBRgcEf>zJeF&R^@-+J1vBr0%h88l#k$ zrD%#iUf!}04<6FjY3YE)_*(^p^J(hAcVB)o#qbL#rI{dc=5T)i0000#;f>oc z428c}bOEoR6|#amf;&PwLOOywLOQ~Agxm^GboC1yroUbtl8A zU^C#U5!AVqc#Tu8z?W3|l0BJWxAH%A|B(7Wo9*ocaRXC0!+5@RRo!aIb7$BY$k^lIW^@f;y)N8GOt232BP~f6c4~ zY<^0encZKkE%T&tK8+RqL^kip_(aCHRr|thITp+3Cw;9-&w!KEC9y{Qi{fkM+u={> z61eynZ{vD7WVR0fgqf*dJtzE=X2f4N=aMgebj-nTUzPqExw;NFWLaUuK~|| zi_aScV=Q+Uk@I@G(v$L|bcEkqARa({6#4)E&HOF-4I(Z-pNQz9cK`qY07*qoM6N<$ Eg5j1LBme*a delta 2683 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 M07*qoM6N<$f)H?LZU6uP delta 2761 zcmV;)3O4n*2IUohiBL{Q4GJ0x0000DNk~Le0000s0000Q2mk;80NFtBOaK4~_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPK~y-6 zm6XwOq%aT#-(5KYrJxj)f*gV_1U3W_f;I#k0uBK}U_;P`AVTQ-KrC#P*Ouo8R7Kak zX-y%XDyq;@dOBsJsR{e5bM>p*>Is`~((U)yWs=(Zov}XHCPvapNp=M%|63(}G%}6N z4s2e7)T)2v2x&7ArPs;63VGdqw5hCkaRp#d+nVg%`e-Dn^#wuu)F&d&I*++kZVzvJkd;sDA1XF;hO`8coy{S!K zs__y)kPWE-lR5xrkI{I&f+a{Y1)@fvY%od7ci2)OMc|ozFvj(Vx?8dNa|-Vh4*evM(SsOkM2MFSg{SE&8vt2 P000R9NkvXXu0mjfG~zI7 diff --git a/doc/html/form_159.png b/doc/html/form_159.png index 8035bcb6c90c162c4c3dd5fea841d221ac171ee0..e55911232cb187e817f1643458b7b7daa3f190e8 100644 GIT binary patch delta 397 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 O0000 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 delta 2708 zcmV;F3TyS_1+f)>iBL{Q4GJ0x0000DNk~Le0000>0000M2mk;80IfAX9{>Od_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPxMKE`Oo8Y|W;fu4zSLZ>inlIQGy{MHY}NQQpMB^Jt1}|A4q}W{W-a430zfElhO5l#T#l&u zH)~Mm6O`fB_ipyyN!C6<2dXNo&S&na{eHvpq;i@!4K zr7`7NXhh#b?kRc+=9czE$&q62sI+PNi-NqBqt?Zhlt1kI&oo&}N&&x4Mz#uSw;CG& O0000z~;7vq)mL@|84bT8L5xMONybCKLs}A(Q42bD7@C6)F7=s;j?E*|d)Nz-^WP&Wf ze+YEiM<=FD;0{U{J)vgg3=EqhlrW}t3$!{XDzbF~X5hGyr8CfMiI`HmbYzPW(&+oR zCBS54waydN1ZvIEMBtdqUM?FY5nb-gGQP2<&6+NO9euX_JyBJLB60#w=2csRGwomp zUPQAa(8WBDA%s0bzMn?UG-G8-|Eht9e^F;Dd;v@~)ln1Z2tM#L| z*&tC3JR9|#+6a%!tb9)xl9dpC%{O@gPKZ64K{2hF+rBYf8O=(1CtfPD)aWLJ^>?Sw z;evvbErihB-7F&4?7}h@5xErCmPGtldyAi%AJ(c8ctWSWr2qf`07*qoM6N<$0fMPn ByV(E$ delta 2585 zcmV+!3g-3r1Gf}^iBL{Q4GJ0x0000DNk~Le0000R0000E2mk;80Q;mkp#T5~_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP)k*OWApevot=W_q*` zc9Ud(lT%@-WNUzkR9mZ(b%2?31I8AhmM1{ZN*$*8)xHf>`dQDUG|0EbaI~OH+4G$W z8;S)XsV!Ne_Sdt#yY&7#iBL{Q4GJ0x0000DNk~Le0000O0000T2nGNE0I<5OO8@`>0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0002nNklzVGV;Y z5Jun40T$4Lg;~JDEMNf(wSa|L00~&=esCkCD=G9!7B1&`M#m!lU5Rf(W=h^xXk)t>@~`fRlm% zdprP5R-Yo^Mu8@9Q~0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPoAmx5p9~J!5kH*TVzZo+bEjG?u`(}UX-O#BpQQk*&~@@tb@ju zNsB?Uj%5Z>gQr4hF=8yQ=bZO1c+WlOZa>`nx#!$-@8>{?Bz-RRA_^%gd_oui08#4; z2uA?mK^^**Ab~^uvtyO-(C|b$BH=u&el6T#AmD9_L;wf>N?8{vJ6l!A7^kNLdE+&n z3IM|C)(DHsw~D`&>|I)El!Yr&b-tI-5^#|9XLF|~060lY)EET^^(UoAf>Zh|5Q-!- zaX4sWzS<$-t>hzv1nmS|$zFT`Ck+G!+=`nK2&(c^00m3}`=~gZq)Y*9_>crTp69Rq z))aYlQw8{iBUD2nu*%W@70s4_>y9o zT#Sc&8#%b(hy`{^pHMgXBiNir{!BQ{m7*~yRM_Tn^l8rP~5?qPSg4e(GwQIjCfOZ9j^A4LW!#g_T}?$$GSrTP10U)kU#@KRaiOJ9oyR# zE3i@MJXgbF=yJt6{lC`a5Nw&P4$VH^#k5$7K)qO>UGxOEbg%zLaVFD1A%GDJ;5r>W z-la!4nfpzdX5iz2VVWvhYskNMnzwEA7OeB+s%bkNF3G1V^OnV=hc<=Xlnkt~0M*I0QdejnfkC<9&=#{^up#fPjp`OYR z$Cn3AsK+p**Q32&9J8$@KC$qd9kMCgy!$M{OndXw9|uI3{`b=Mn$$H-mNLWq4#*Rv z@meQ<0R!A5UA9^hhK`r@9Czx0;m4v6^w>pTjys=l#YFzvJP($8Obxx*e5qGM8QF$! z3#LCuEK1JHjL|-oI3&yaWRbB6`|td7TB>zJ31L%b`p#+N=)X0-51QGuyeQrHFw+M{ zdI1lo4shXLr*K)j_L{K#P?z%Bq20l^KEGqOuDWidF1g)U^dm0Uv=D-rFe0m2 znq=@eBL(+)W&5AdnF`o~J5GPZj!NoPYYbH<@2DwH8F7DY%(!({L#zB4e_CCK&>d1k ziDx>Nd^gtwhJ;?uP~twY@O{sd-@y7~PGJ}DEZ8`DUCx5gqwDB>B#}@pv_6`}&Y=dZ z@dZ^$`|PIt_EV~adqY`0irq?vf|GV8nz>9*+!)y{L6A@TYWIad7SoNdcKXRs-e$?ayD$>C zz8&q(UCHb)&LwD0Z>`2mYonAvV(Dd^MW=0b_xB90kNFqgC!FOD$@X@vEvd?0t^p@U z6giPL>Rq)8-j0tIRo^{GR71T}Ru=x~y0TU3_!E}sEIci_=B^8Y3|yC+Y6`V$4(?@b zxjNajYEg$s&qX54ROcgU31NceWSIiV0H6|Em_6qR$CrQ0=0Lgz9o2>6mb}Df4-y9K z8Zcw@=c{t#SSV$7;=atQ*pO)tnQcvnyBkbUtoxYd;SgiCbK@Q%%wYc@jb0_^UOz?oK9f=S zEfV=p+qm0C$>rH1oQnGxu`#auZ7?zbaxvt_ulaY=EQl4sYRf(QsW-1_vCnp6MAp%f zlTb{j66FZT!3;X!6~>-Pioa{8Jw!M{JV~H;umlbLCs%FEUkwt+ zAJemIb!YBGLD$Bx9E?u?(wR5g&KXaLE24i`HT4=c-CZiVxK`nTzh<4zU>wiferR+e z)Pwq>g@y|psdTx6i6`cda>D)&_2Ox}7g;C>G)ONhrlIF#{w#GiL{$9P<6x6bw6LZ8 z=)KDmf{}`tFz9Ylk?dLHh&$Ht6J-v~{}P2F@1RO@>)o4!!>{J9JBS547|FHeFHJC| zu?|MaHudQKRM$R)zCM!`L(8EBj*t!?eZf^6rSfwGvYO+nsz)WC79rXw5cXpY)&iKCA-Uowm(G7d4cd_GLA{$eu zEict}M&1jOWd!Ivh5_o5Mg=J9g}CM_;vumhANJd(gzOT!R7Y183H!;}_xZ2*;1-BH zs4(r^9+BkC$nmcB=n8TxIfg`b;WIn7iB41*919=HAinZuo5nJ{wba(UL!(^!KGAf8 z@9&D)tkeh?75b({COb!8J+^XMpEk^^W%wa6vl8Cheh#syP_H>(V2cD*^K~vCdBaAS ziN)mABS6*S3ZL&a>bzKgI^TrHq5AYk!gcT`X{5-7vLoQ57QO8fwRoCfi5fWjDEEdy zfh3_HBV%B}4>muRP983%uXs)QJGpH>)0TuUch~QvK}g#v2@L&RbuAEB=8)(SnQkH( zVe9Xsx-9fpS|OnA)W#Y!%i1IRBCwgL_W>b*{N+uYj0pq|0>s1y;pxeY*)klj_&?!N zdOWM-;S9bpe^Yju1o&uoy)iiH+G}a`Lk;h>27wE9mC{Y@*8{NzVTWWEus)AM)WiRC F@4pE4h1&oC delta 4077 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 lZP?zavz+ z423`Ux50{9e>pM-C#^9Q}W6+or;TM_wv8o9}w@j;ihO002ovPDHLkV1mKs_Xz+1 delta 2637 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 delta 2554 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 QjQ{`u07*qoM6N<$g5NX4umAu6 diff --git a/doc/html/form_168.png b/doc/html/form_168.png index a5b43c218473ba769bd2e2a4b2e04e0d2f3c88fd..b806fb32d40a2262e413e9de7cdf92a5e0948a14 100644 GIT binary patch delta 1147 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 JPDHLkV1jYZn5h5& diff --git a/doc/html/form_169.png b/doc/html/form_169.png index 2b123cc52f1226425119bd330e5b67071b22a8b8..0c910fade6bdedff6ad27fc7f4949f57a2262d51 100644 GIT binary patch delta 733 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 q{j{~ImT)82|tX_-R8! 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 o%>R><3~qJYmjog&;s5{u diff --git a/doc/html/form_171.png b/doc/html/form_171.png index ffe1ff0b497181cf00e7d6b261ddb3757243914a..7ada8254e9d2f29ee953208737167ed3ae465987 100644 GIT binary patch delta 852 zcmV-a1FQU=7XAi6iBL{Q4GJ0x0000DNk~Le0000+0000W2nGNE0I!1%!vFvP0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0008zNklRUYW#*LP1~u6P6{fk$8x_|bt8ky=EyG24#~jEI!LbISfB10x~@JwXBZeW$q$ ze}afCr|_eyyM(C**1#&&cXojhkqT(+@n|i?!WzH<_-NTnpz!Vz{*S795b2oDm|b9i zC2qklu^ktY4K6T8Rs9pO7r=%~a6;PxC{^`eb{48Sn`VnS0gIk@PJjYU&pRt%8~J|= z6v4B`-c!}tk?#t4Rn_+K0nSR|GvUzVf9IoZ7m*rRt7`k`MKQO)EP>aI-6KV;;CSX7 zTu9Do8Rp?&ZR z%kBIwSY%=Er%He#>Ni7R?>K@w;fO1It};Yg;nczRNwp~XMf{aPpWd+tkbQFee`v;t zNQ0BaHSiW@he=+;C9T_i%a(n|rS5=k?a@b~A#UZDX^`0Iq!iw;t0!6+g-h3ljLc?y zZ><0OC$psFI{Ova)5@IG1d0&@7C}%tb%@y&IE`FTwtkti#pL=(;+SMm+v1-zq8N4@ zcSI`E90t@c(;>05TU_ezaSN{Lf2l}u9Fk3Q^QR2VNZd`>r+u<2p0dTrcZDOz9oHne zj%9+OvfsDNK9sf@L#6)K`eia)1x7?xxJ%ZP{gqp&N2owi1jW^@K0|z_?ed`xPTa~hEBqEgse=&r=mn;6Kl}GeSy|@Kyi-3IG5}MNUMnLSTYgZi}A) delta 2818 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 delta 2514 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 diff --git a/doc/html/form_173.png b/doc/html/form_173.png index 23188ceb648473afa7556acbadd481464e6cd474..f9dda5304c887a0d21f16ac1f73ee762e10d3239 100644 GIT binary patch delta 3243 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 IM6N<$g69oYi~s-t delta 3026 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 V!O?$@XaE2J07*qoM6N<$0fK~dgG&Ga delta 2776 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 delta 2937 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 diff --git a/doc/html/form_178.png b/doc/html/form_178.png index e42e12366652ed8b281c69aaa937eb25daf26d79..b1f7d62926dfc8158c88b4c314ccc2bbe661d674 100644 GIT binary patch delta 801 zcmV++1K#}n70d=eiBL{Q4GJ0x0000DNk~Le0001e0000W2nGNE06&m-3;+NC0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0008BNklj6}cq)wKbM>yw<`Lz2@0Nn=TGUE6Ujes^s^S4bKHIWY3qWw#bxkKRSPq+F5# ze=}eRY&tgS>hvzs&1?xMzLzxV(40=_U8EF(GC@M>m{ zTgNBBLeis|^-clb3X)hcEU4%qq_1fK{EVSugWz&NaqO z?_Fcl#MfGUcdcs=plI{`$8jvuW0&fsW=?)&jsKY0O48q^^Bd52U6BLNZ7(|Lbk74B zFf9v#62mq(^g20l9ySCYwfau$gj`Ji^8@FTh;zJmZ)X^7`~Op597VRIiH{G@f9I7{ zM!H{+0h^lAEH2vn$ThPm!2#E11bh;Fu)P~k>%{e;?LFq{I){!L%-O^1{Ik&KR3T{u zWM=l{hYsz?dmM6l+`22H+#NR{JYBC%Z|2u6n$B;q-it?BA1Tc2BvE{7q{k?KJtFdU zDF4`zI1TTeoLsr=2|3T_2StEKe``T#@70xZiOX_SNJ}cJx~5g?Jx2M8(9+vpBqP-B zOW=w7AU@#3I>mcSL~-p(eNZ*WOYXc%h^zc>Sa0hUd=>q%4vhWW`A?4U7P?}3%b(Mo zy&(8y#jbkK3DrbpkEP1#Yr@n2U}l@`?Y_@y`BsT4-p9trysl*1ak@KrS55fo^v`9@ zO>{*$r#Gq36F;1?(`)PV#C=fS-gokOXI3RHO4;c~=(j&~XHw$Qlsj@Sqe(f|Mm_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP_qy6jE4CLO?{`H3Gzqr#nTcN%IB-=x2apm?o z>E1RUC%1pO6UvpM7`U`g&p^IE`x|tVGG`6~a2bJ_xf3Zf^9d=BIGKutyrPi{8I_au5ENn_F&K#c*riBL{Q4GJ0x0000DNk~Le0000?0000R2nGNE0M;C7WB>pF0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0005(Nklz$5=;qFLMY++2a6JN1R{*YkT-Kfa=Uw6Ht+W1 zOcGc0$Ia9m_;0v6>_ps7y@4rVW-+h?A|M6|AO~I~6(O71GR({p-~%Wmtt2fZJ-YbQ zf8~deG`m5`rXBFwB44{aI*?7h`H39%3J8c>Tl9JIu^dGh3V4&dk&?+B3>|;?%uH^)Cl?n3*jpgJQux zZ4<&YE__@n_8A$-4m)7kn9qRqNExcie?Vi6rxV}5al6fL^qLHN1{RWjiVVor z(u~dkdqnATTah-6hN4*v4#6*u_m)O&)q*HE+mR_^%1rS*Vjq_>ZI;a3?xRDme_B7? zo9{4MhK&CEpe&u#gDAVEtSg39)V;KT{{~=YS&KZa>($YETT$!kb4m9jZ1Qa2zik5` z=^-GiE*2k}w#OJ&^<0<6E0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPX&kwttIyReFiLtTH0MPr zw{&kBh=BQlj-?zaO}T-3#J!u0-fW;3f5FIFy*=D6<^NY?U3$;!x?TRJqGfz-E$RGOB%y+KXbBCB|Xc?k`T@MgzVbnclLV;w|@;~ z8oPH$R0^zu61KhG5@*^^w z66$8}SbRxIdXhu{4**^)_&%Z1e*t(`a57;%bqy<9drtY3^2e9_TT(X@h?)y>el~~1 zyQwmZ0jD>9>$8^$RDP{r1#+K&>QhEZ4kXtG<$m_Ik}d&}&%$fSB-xw(Dcm2AOTBEE z`GY;jz}DG4&S+z{JikBj#by8`JGlA>+!{5)eJ=|IYha4PH7;QLAd&}XYBt`0BO+ID zrM|`yabF~jfzAN;4W4vpBtHVZ?TOEcvRUi6Ze@W`R6;GR^fGl?*!mdpQUF%PveEk{ yr6)xj@1U#kMi;4U+#=07*S%%Bn?ITECeVKg70UFSnsW6300000N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP(GQh4Ms{vFCl*jJV_jJ7ljz%l|1|fo=jQKTW=@^smr3uFqxq*eoN! zGy<$$K7K$=vF70-G)%4q{+Jh(hrJJ_x7@o>yFAiu|Df}dl9$>}2}v_aQksR2lDymI z=_9?~00bBZdbek>*a^Y@+7))!Yk{+k9AD z1fDJc*aGE=DF*2Az*IcXc!Rb8k04-19X0Q60uq`M?RDZj z6Nc}3&)a~v1X2Q9f>Q!5uqBWZNC{9vC?P2!DFI4=66X1#5f;K9G6}Yb@9P|$%^D#I z%j40EK1Ng(gphjvH+BOE$r%a=AuarW>;^m%BC-Z>0*zFDW4DLg2WpVp zDeT|UgoXSTs`FLsH>`Y(k;f2^K}$P&OBz_Y4;(dGNQ;Zl>b$@}ihv3mEG-`87P2h(+;4U&L}Y~UW|7meQ5>V{QYIG1l3d{m;EP%Loy=04fA znX0}9$w15Iww&a;xp1QaB zI=&7kY_Y~!SQ$l2`LXs=m{w|Of7>U3_1O3EQ4=*tH(R)syW6G=>fXpta0?k@N&vB4 zF|WB+!r3J!5t&DyErNOg0D-pp5RsY9?q6WnF6yc&o3uay=|ELanlL0$)q_R`cHIMN zl!%5#a6+)N@5FB7I>UVlH{?2n`9)+UBFCT}_;y*@T!q{Nx_R%2z2)CjfAvprt$;I> zpETG{A|jut1Ys8orES)lS)Mt715BvkhGj37ZviJTJIi0d*&YY`-iy*5oeTx!&WOlN zqm5M}Qq(=9A~J8&Rwi6CpC|r*l&|ph`kDT?9i$ry2q7)d1|g&c&ZK9G*&HRD?QjBZ zhf&}VD?>~;mT<0Pz)cbsf2#U-yjD#U4zV)B4C)o!jQ0s{iAxD!&N+ zliu@m3jQVo!68;g1iKUu8tiqq`IH0Qw8KLqJum$J_KW4{@eDl~4i2&M!V3sj+hziX zSeXzEuK?f=UAlQd4U!LM?Lpzl2MS0&co!~*R~bP8$p^o`gPy94f1rS5fK34U4Nvq~ zWdsEz56;Jzrfkk4!$ASb18;v&dt?R$BoAnRWC{gjWTFL#6p+lIfQ(OgmKN=g%%Fgb z&sl?T%~gI-K*opmN5)V(ncl9St-dWf%8u9nJ{d~3_Ihdb14^aF@hTG`+J&QNP;t2lD9>jq#oejKARrpPm18&UI5uHF?p0eKOf|skk{|^e@}`|e2ajjG{PI4b!wS7 zavffUJW8MU*(%_-GtW{^iRmLC{)eYDg7!x@k1#>_D1Dx+LDU_5;f17AizEq1pXJ!m z&>`23&w=pmmE8`)N9psR?xZjkhW|aC(TP(v$oXy8HWoF)_!BRUxkxA=Il9KP>~jki z6opvz`TbfX>7;u?eN?3Lv^M_6TQyq`WEVUlZdq&8;L=cwGs%jo(WDpz^0 z`hz|=q9!h+Pbo9$;aIe=8Oe}2oO^GF%lP5FuzEgkfB9|$FKQ8CGbC#d);;>%$~eJA z&q~&qL2UXLy^a&PgAkf7O+T>EeEAkXpkykJP@q^f{_w%_cGbJKBeNe(1Hj;Wut9`F^M!W~CVEDZX&; z6)1T`e>*;2U_j0q58JXjEsjkV_=Dh*ic@@*B69=`CR z;cs%y#lxhTo!CA=pKmRH*Bpd*zaF&4zPNGzf5QvMT&tmD>!e|q4U*~$|B>Ydk$?MJ zbhLL&e#`vFt$nqH8=frzv^i0_+_$~7hY8dM&Ta~AUEiL0T}0w80ZCnp^X-ENOgP?e z`EEmbxq7j3H_-3e=c;-VksW}gh%9W_)kagjo(ac0OgJ>y3!)7BR$q9K&o3d?n$H@2%u`IkJ&~y1;6rS)=Rkf8eI6@P33Fkg}UWAEM9UjNv`1w|3i1{SlE% z7;YG}@%2ab7SZ=V+v8m!Ol z;Xa}o7VXip)Wgc%+kIPD`Rm}bqY2tNuGi{HzR$tS>!LkB7GcU%b1`n)~2NG1i=vVTn|IA z4T!Bq^_~4Zl^2M;7#4`uZP`P7L=@FGCwMN_usp&p!XG8jnlJHNUaMv2@g9$CpnwcS zeuxQG8E)*K<~R&hU}!EHP?6p-P_eFpu< zF)i8oTh%S^$ZAcRheNF42;Y#CFwTDi6p-QY0&>#KR`8N$C?LbZID`)f1!Mps7v?1F zkKY0XWEg0FJSY^9VF>LHYLEwl0x}G=KOPhc$T0Ld1e#<71?0{|OH8Oie;y19$o=sG zQhPcF$r}pD{h|Hwz)(Q$&rOG$kv!mrsXJmj?)Gr*-9KZuhxCUU>K9CapmNQiI!*i9rp5bEG4`u_?<)M`RqRe?f3Qrhf+)>1ffF zpG*g85F^+g`=P4OW4DLo0X0ZPN^tuhM?_X4@;Ov}q#qOz05+_81K^jZ4{5A>S2M|w z$q%t?|Hc{?qL?mU5;FCrCRf4j;f(ba-1gb4$gHMq=CHly7W>2R1KF97%}{Bf+CAw( zo|CFxX^@V3ww(1Je+X5bWCE~(3t~Tyt``6lz`o`?C7ke-_T4prMex}X?x9~rWyN*O z0IcorJ%DA8dKLhVW8c52q)FN!-w1ABqMB4J;NqS8BYjSGZKkFXv>KunQ8`Nhuck$2 zxIT5Uvz{Rx36o}Q2^~7Yy_pr!TRX}#w><9+pReQ3;2!#Ye{^kOtVWI znxY2T!mZrBvM)U9w8|5jy-Ovo-}>{KYbBgra*Dzrc$Tn30N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP1J>QI08BXN;eZncpCsVZrk0m zk?{2Q%}eYCyULHMQt79P~zKMZxZD_Z$wtg%Tw7P=u0oAA(r{co}*T zOxPU=W(9vh4To^T?m$2*3@@S&ChQIbw1UWN9Zs4*0$Ks~C2hh<^F}}`U_fgFit|N4 z3iU3>Qv#ZyP>POHxM1?U@%!I_9!2p_lip4rK);I+6~OWRo{SS8PO?)1f0tx+G^OQj&j6J8IcAq6?%t5Cw&DdTmJUDpX_# zO%e@BGF2o~O|oi8owCzmG>4*)PYl>0B}tus~Gi~%4^lA>~oWCM~}LhYCfRv=v#N?XY6d_=o* z!0>;ym%#TFSpr~hQzPqa$Wb3MI|ym=P}ABd6ksKQK>&bB#!G`uFxUjZFi2R0TOP%s zuqi^$k)DJEBiVl!xX2r1v8_-eiM_=an}Uh%N6{&?0q1i! z5SfA*q7Fs?qEo2x=^e?$H$rR*8-zk+3I?B^Lc2jI#J9p{kA*ElAua_oY(Zh1Y}aP~ zTgrfzH(sIOuY4$A2b}`I-lS@pe2rGHutm`VK)d_;V|eTbU&4>VUCQfr{NZ`Ff1Q6n zIxRpOOk2>@kbR(4ZQ{9P_E+v8=C=~l-ttT#KWzlaad&z>96Way{FPTYZpG%1y7>~Ip3X4hc5NwrV0IwCB zzw*I|)9rLVU%l`~eT=QO5T26!l=pwlStyVWHl9+0joKd+N3id+H6c48?p6GN@$2}TQ)09v&6jp>ssg(05N?n~jSaBT`Kg|xo3EdTf>M;orxEEiFc0A}n}OeebW8cEPOgSbfHzqIKTL@X^%M*3adCB- z-LK?(zcJT$#db@%Dh_&ZYo!E zD4m7Ec+Dka6-oj<#=_AXDaZH@QB@>7qxq)te&&`=89PBY6%Dv#x|Bl_B)d~q2SBn4 zQ03v^7tOboce8+ed=@1@R{6+aDqHD+4kR@&Gfx1LX@E6Po}d%R0G_5RC#(K7K#W>f}Du^st)u z(E-WBUw&IB_da5sJKKLX8^S7`zMJ$O<;Sroc<)|Z!)YqyQ#253Pt|U*r#&Jbg@}bC z=ZHmNi$k^vktl3(yfYyZg$+X?9tH8)t*~Jz#EXT^j1Y;!CMTUUVo{Kv-wN9qArggl zOA1kH^X!Xo5yaj=6f4xn75Ns3Lcx4u3d8Qz0Jcsy428f;9#em#PEf$_3?&f4T0ugj zFbBP*5kgZaQygA(9#rT@2tBCU7U{-~7=Hab($9cj6n+M*$_vly1GB`caDHANm?c&@ z()0SjEU|J>eO4csC02&>v--d+vC<09>I1XHN-I3856lv4Cm2ua1GB{1)b@TKnBq!7 zR&cDO@IfCKxygUp=ixIw@`-(5mRQvjX4wbkN+TFsn7nC10000viHf z5dP+#+W=bvTLLM8lt4-#B|r(J1SkPYfD%Fpp@gM`*&mt-ile736XVr)j?eBIS(2rB z&&W&6jEahi$Hjj?J%Ngfif;J-rzcQRF-8#4+;yLsPmOjH0JBE33o~C*$Er+RQBfGe zf0%Os697v9R{%Tt`Q&(HCG9T&4ss=INd zCa$RH4{9c#T|W}h0>A>mi!gpGR3@&d=nv`_yZqn{jPLu>b&x?vr$tgdG>B+QM9siO z#mGTKQvg#mf>aXl+5*_MHJ_UpEE5yae-<}?;gN9#uo;6us>s4OElflk0DESBVP>a^ z-3Hm_v`CmOOeAdr;L6Oer6wd}Y^C2_LfaWkbPqD03rvupwU3btB3i*n)^B4n^OcBR z033DC#x}w4Nz^6ZK(dZPwgosw9v@npViN%&b0yxWte_Q}8 zgoukk`kDozd3M{S%;zN1?HOjFip?hx^N`Sx-(F!Dc?{M?5ci-H7$%v+q;QVbwUqlm z?ZT)gp2E!O6@b$8sw5rcYGRcpr-lYB0+HS;0M7|+XE2g}-O$))m_>TKhc=eYh>pX| zXCm6c%(-(gW8mnOPDH!fX6g}!e`!v+fg&+++c5l&nVtDu%OAeN2r_MVBBGPbb%h&K zcS0@`F9EZNLc9ljO=Ne)7AB__G&wCve+if+b7UsXTVf7R3c-Ol0Dp*R{)1-TJCETmpCTEn;&N8i_pLlg|u;w zPaI5K7r+umv&OXW%xdeB>}{lK7tAt)RVM(m5vQGs(upwH31-hXV*VyW7KrhL~4Z+_cNsP@GPL@l;^v`q#S7 z=aLa&AAI>?8*+aKW3hCO7qrpD#U+`QGKgv6DGaj%ekQ()hO^APYYS<5#!Xs}4Smsx zT`-Ze$Gy?54I)}ffbA%^rbKjfSq{=p>3Bs%@4iz{DF`w#5p9Wxe~E~3Bf6vBD_Fpw zeaB2Nm8v1LTQ{w^#URyJTOxXwxh!xi=6KIok2B0B-`n)>1$UwoTdU;=&AX)Zn0d#{ z&&>RrnMtl^SE^L*|FYUWbusgUOw7!$%uE1&%dLwwF!@64EijYuVgZJruVDpMfP%g| z5luv*zQdShPqH~ze`a1wF7y?KnYRgD>U)lYiSI}!6%M3Er&|Xrth1HMsIF*Sswu7W zn2Sl`>IX7T5%bAPX92)(O$jvpVaWq)LB}~#ZKg~-M+-Aggw=cQa{;tI2G>BJ!OyOi zRp|)yV35niZ5BeAZza#Wn0SUbG24F7lPkYQMEk_Pa&Uxse~0JBnBVflk{7+gylZbc zQ4tu?f|v}HV!9+c5&usQ%U@xH?_0Ia*16Lsg38di>sOQr^D9&Mw6JcN^E6QlXxi)4?9Z1U zZmgAe4igR+u z_ky%wkgv@OMymy-uFP?gxVb@X(UkCVR(6U=lvSW>+DZe8=A<^y_J|ZZ@iM3!3`ibK z)_4tkIg0p&_QnPu{iX!AQqAct3=uaONe2uOf2>9+L%|APutb^XHR6X(VUB=((Ct&A zUPyt$H{s&)hpmX~F427JlCm2rQs`v#A4KR2LHcFp;01t9vtXOKwA(s5~I)f6-khET+1^q<)eM$C>#m?SCO7($38KZQvJq zPAkF=(qGm``K%LLV@i9Z(uvYRN`T7?S#wIbMiZG1(Qk~2Rl+4nSO+mTH#c;4@&Kdp zg4$SK=9J339%TDw@@{9CRN0B!R{$+w0x)B$AWEeZ{oNIy)IP=}-1@>7`u)Phe`2QW zElH`l-Wb81m<^L2C8}sPRLy59iE+a96Kv; zGqkG!ooFg@FVD~A@B0{i)XPo3fA)_{*^Ir_xJ{(+8-wI94UEa%3!#gU*mQWl^}H;B z_R!JO5_Dp%hgMd#7L5PW<)dGcA5~TBS0t4ogSpqfK)3$^qG(`(h&FBe6fNzXl)ueqrJvK^Qr9xc(s^Rcog)yi3LKFjyuA%;!e=GQmIXBEh~1 uk1HBoF(3?@i7P59;u!3IZCX)Lk%qs!eXL76ywL;z00000N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPI#;ZEYZoKDi{E;HskS1&*Oy2VBNx&$-Cnr@bEFj0q8ugxqzNTe!3`fwe>=5pPQH;Re#?tG5PRLn*cyU%X<-&%9??9asG~ z-1oFooH0qDFxy{l@d0@bp#E-D6m8Dt5rR?}5w^8JO+-{5zSrhEZ&F{8p70@3OeUq4 zefEF*+TL+w$CHYfsJAspjd&nmIV??e$JVWbwRo@aB$@PVS=HIvp7}Tt5ywPCL{l8G zzUCODvuhXpwZf_Edf4q8Icpv}VFF1evOu-@*+3kUY#47i2LSNGR=YReR*htI4c14X z>71?loMpqdl~@d?J?|mSgzpwUVGE$iGMInt1^`)y>er3~5s}XWM}4H6KM*PB!o?LsOlDRS5h)+N6EOLB<&NEpSZa5wbjT%VgMo>Gu879ZXv1gixb_<`qQe1l^V zcOkZj;VwuH9Ve7Ty*;?KURAAYXg6Pp>QVx*Ri(-kYwqLceqz8@I`6m+xpaSz#ulfW zwUDY3A7jCi$M-no;lRXt0zpEQMRPIGnVjB9!tl1P?q)O50~fy{4~b@JRLp-;Yr~3u z14;muQDLfR*W@$Tvw?{-acdSYkqxPA{tT?;Uv6T*uUAt7;GU*{@eKf|Ozr&Ae18YI zoAUuKT$@`F{7b(RuR7Y-Pr-kDe>Y1W4oACwNw>mhzc#2fu877p|CQM2n~^D^wj@$) zlOXf76uXbWgfESGm&|7l{<`oaTKIy9s1Fk=v_v$o5{&uQ$ZI85(KidWIc83|EDNQC z+SVhMJ|*78%EYPD9^rmt4ed7s;w+c|5m6cByu?h)Zo0$gdVZbzNZx<$OqqMp@6W6K zJLlJxiM#6Q-%`Fw6kh;fLKfj*SgNZ#`sK#wK_(9+cLOH4+-sRmyrFGYCUPlJ25*(p z6ztdSVxa>q2?I0@n09$Z%Ci%<-B-^cvdng;r|A@6!=ZA~@ dSW5XEegoeSs=np?jzItb002ovPDHLkV1jH_9GCzA diff --git a/doc/html/form_182.png b/doc/html/form_182.png index 6959f1c8d46535365fbd8d053046176881d942fe..4826a08f9345a56949061bb9595bfcdc84271673 100644 GIT binary patch delta 3467 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 t1p002ovPDHLkV1hh8%HRM1 delta 4457 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 delta 2664 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 WbVh%K2Kt}?0000S diff --git a/doc/html/form_184.png b/doc/html/form_184.png index e92a24b6d34a3b12cd01d2f23f4dfc76118de8f0..9e6ee5c75186343ca7ac2b65e06250902a8ed6d9 100644 GIT binary patch delta 871 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 FV1h!wQ^5cL diff --git a/doc/html/form_185.png b/doc/html/form_185.png index 311d8dc10d8f65057e80c26cad036d8a85b370b3..234ad9791abecbef40bca2c80505504e37462283 100644 GIT binary patch delta 414 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 b`&;}0g%Y|hM91!T00000NkvXXu0mjfq9X3P delta 2632 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 diff --git a/doc/html/form_187.png b/doc/html/form_187.png index 13d02e1a553310a0edc4bd63c7b1f9dd97b0ae92..e3abea053653e2d3a7ca39f4081568a7b9cb7d5a 100644 GIT binary patch delta 571 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 IM6N<$f|DrpKL7v# diff --git a/doc/html/form_188.png b/doc/html/form_188.png index f4473d96a45a1efb24cb07aef8ed88be5549d356..90393b4758fc35be9fa8243a212f3b31d62767ae 100644 GIT binary patch literal 4855 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 TSYiz<00000NkvXXu0mjf>hLwp diff --git a/doc/html/form_19.png b/doc/html/form_19.png index 52ae155b3d983285f1104ca6023ff6983c44c4dd..9be3eca49eb0fccc2ed73d858d236bbd006d2272 100644 GIT binary patch delta 443 zcmV;s0Yv_q6zKy%iBL{Q4GJ0x0000DNk~Le0000I0000R2nGNE0CBr$Xh-NVQRt6klB4|0`YR?1PB}H9aV@S3#ZmlshWM*YetNf`V%zSE&CD8Ce3i7U zW@f4viWu6WCsWP%hRh}T!cd5Fwwjqgx07?Y+?teSrmMH)L002ovPDHLkV1jE#z~cY_ delta 2556 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 delta 2652 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 KMNUMnLSTY)sQ4%V diff --git a/doc/html/form_191.png b/doc/html/form_191.png index a033eab39a3b2818c4503e3a092f391b2938931a..09b8b3b314f437a577ac6477511f8c115a373b0b 100644 GIT binary patch delta 2873 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 diff --git a/doc/html/form_192.png b/doc/html/form_192.png index 59d3439c212768978a31bd8dcd69b7c6115af9e3..d57290222e84039c3717b52c88d13e0a4e28e211 100644 GIT binary patch literal 9369 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

    W9I~^Ma5HWd^F-oBO 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 Sne*-uKv7mzrc}x#@c#e_TL^pr literal 7421 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 diff --git a/doc/html/form_195.png b/doc/html/form_195.png index a9aa1589757f2b5fdee0e41851fe1515107c27d1..87cdd857eb455113f62d48ac833855e7d4cb732d 100644 GIT binary patch delta 3510 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 delta 4534 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 a1N;wyZ|7A5^(-s^0000Od_-R8! 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 a&5^L(vlVns<|H8lGG^9?>*21uKKvg#J^D-l delta 5076 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 BmBRo4 diff --git a/doc/html/form_199.png b/doc/html/form_199.png index bbbb5a222e6373724448969bb18d0b4435588c20..f50685133d9ff1243df652f252b0f243924eeb18 100644 GIT binary patch delta 827 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 diff --git a/doc/html/form_20.png b/doc/html/form_20.png index f350b4b8ca0c54d06a3a13f26de5aa08c325b7e7..38124cec24fb0622cca2bded141e21f3bab19789 100644 GIT binary patch delta 453 zcmV;$0XqJ!6!QZ>iBL{Q4GJ0x0000DNk~Le0000N0000Q2nGNE09>@kegFUf0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i00046Nkl%tJ2y_HGLK)#Y0xQ4@9pO3xi~u9N{y3wCkmM=~QY~4h?QoJ_s zkjCdbk9qbaaj0Rn_>wGLC2$GsYOH?hgQQc9{NUM3)~A6PamREKJ}!W{>*Vu+%JpkX^B4BZIHKB9?@edtOB|8$1b21?v5KmL<4+C*Vy|xfU~>xaH^V zNd1_etjf^>6Pb>lEK=#tU(1q7Gy*3{FU^GoYrf}Z){}MJ-N>05heweI{}vyzIcsWe vW@6I&`4;lU48G<@NnmE@f3^SpYtgcAnAy!7@JV=W00000NkvXXu0mjf`&7rq delta 2576 zcmV+r3h(vv1FjT*iBL{Q4GJ0x0000DNk~Le0000H0000K2mk;808Yz^l>h(;_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP6ox`5ghC3zfsjCGA$TF&{TNGKt$)Tk^2|J={b`<~ zLcP$nCG5-*rQmx_Xr-yW;QCIPFI5AV(X)-Gk8=iq^T>Kn=aQE!a8CRH@OloY?73=W z>h(=8hk8(@U-K?*L^ne1!LDe)QrC!ua;T^+rJ(H6zl{*iBL{Q4GJ0x0000DNk~Le0000b0000Q2nGNE05GzZdjJ3c0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0005gNkl#?RA1M z6o#MM(*0*=56U4a$s2si?cpd;83bcEX<38&!_0v2uUJtqf45_oby-k_)| z&t@-w4G^>c1tlV-h_oVd7LkjHbRyD-Nd9mtRUI{82ed%p`x(#x3S59Xw(edn2Gjt% ze+k&ygDFt`3KWn7=i~zDJXCVtnr3sV1ahB8#YDtU{+f$OxjKI$W}))nT1~7u1iz=i zSDA$hUw9&J*&{#(7Ri|m$P+o$SE1so(~Ot6%Dn{h=2{m%<23?#1+IyG^kF@z>cE>K zQsd<0%D1NrhF-UQM*W*gbtnmi87nXve}?mVXXedT?JYnVaP~kW@x)1m1+9T51-TY# zmjKF%h$$|&N|SH*feOO5_;~SN(MXXrb8Bb65`6MDz?-Um%*_w1Vkj}aM`tYwVckc@de0{leiXj7<}3E9sv~Hh8pTAeJr3#~_LP6Iz5x8KxogL^FKPe) N002ovPDHLkV1kC{`X>MY delta 2653 zcmV-j3ZnJw1o{+ziBL{Q4GJ0x0000DNk~Le0000V0000K2mk;808j$CCIA2k_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPsXyq~<2NlxyYppL0+ zVn2ISXqU33rx}iU->Evl{fN))+C|y}ets^O34p-z+b{)Gt^dkbxIzPa49V75s_io`$hnm}54UDR0MwPU^Kd;y>uTfPA zs-Ap(r7C#(DFDkQ-GLLO0Vv@wS6Dq)5p_BL?4KRh*7QvR2sPm^c%)1jVk6zT00000 LNkvXXu0mjfoA>ij diff --git a/doc/html/form_201.png b/doc/html/form_201.png index a52aab429e0f5871c59cd82c304d7959d7e2d8f2..0b2169fb6c9856c1db62998adc38a945697d792b 100644 GIT binary patch delta 1249 zcmV<71Rnc~7>Ei$iBL{Q4GJ0x0000DNk~Le000220000X2nGNE07M@^-T(jq0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000DUNkldNu)6A`%%6<}!~nUFk^ ze>{`CkSs{%B%`@ydvXNfOE1FeN?9XW4**gCA0qMw;0?eJfDFKiWICsO&x(+I`MYPm z1ZJXE1Cluah{(TXo@$JDl79dk031kOMdWKHF`pH|_|n%Thyi?u5MT+=?S3yJzg^`b z@`>Acf?nMkgsAQ)dd6LzKcYh?Z1d!Dg1 zh>z5(LukHqBCKwWDS+$BTv|36eVSrT$twxBy74{KEPi12_XXfB4#2 zOVV)=04Gm*s^u2|g(my6>w5tppSy1@`#%X^nqGd=w5#MFE6*l65ouo`S`J98?+KN% zfU>1lyRk?1>O}7B$t+1fH}M9LbrQb#{ICVg0ppk4M<;6jG!gkGd4+MFe|p**3=#Pu z`72N3Xa}=(U0|tp`$Zn1OZ%->=amy~ra-6d zO~+X(dAV!SJG7Z0jHz_&*pEs1QZ)$@72-=O7ZrT|G|i6yT&s0n8G3J^f86T3MsfD2 zdlDiHFbPED1Heb$`aLl@U#f&HT{EtM^TmTpH$`Loyo~ za2zD8XAUjO#gXsz;XZ4cgD-a)Rz$w^s@&by>#|2I8}3s?s@kGN8Re*Aao6v34303a zn4QNwiP3PY%L-L`qh%y_vXHaDEPQdWymWHsm6eoLSbygT_pF#Bf6R(H>*ov$^d#Ws z7;kgR_G(GoTtKyPgSvVijp?(csrf>E@D8d8N?YO^daBdnMDsr6fhN$EcEJ4&rz=cM zei2#(_}{L|9zJOBCDtYHN;_wmF|GCAdPgtYdQMErmlm2Ofzd7r8f-Jq%Cp0CWv7CM zMVFLxOroZ-o?FI&fBhSsFKvZr?M&7>O~$yu5&7BDYoxLH(&j#FpWov|TIbGnrH1#9 zY`=MWWsJ&~Hhx&2KdlL$S}!G8=9P}|kQZ1sJRe5oi}TQR_W)UlNH3D95gh}=B1;>V zgR%M2s9}fx9!Jc{ZX@bSFa=*8YS;}Mo(bDOgWIquY=qsg7byG(w96H%d%9d+00000 LNkvXXu0mjf1BgbE delta 3057 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 diff --git a/doc/html/form_202.png b/doc/html/form_202.png index 40d60e688f32f5c03ab4f278b9bf48bff51808ff..8a9ecebcba7413bf52216473f273c0830c4e221a 100644 GIT binary patch delta 1332 zcmV-41^VF?h!txWwz`fFp<_kWajU}jr~05c~wsEuT4 z+thI$Ss&7hK%Y06>&Zgmdk49hCNQotZuY_&EM!0h^Qr^GBRulD2>mpr;n-U zuRTij9I4hAgZ3D8%=+Z|v-NWUe_$V(Bh|ybJG@d5%zR+xM*xoycl`rMV&0?Au$_C6 zN)FAYqjvXKLR)Hq!9_dk70i6LEuWb`IZ#g#x2bP5=;3mSVUIOPqVJ`fs`fG^J|v!RKD!xBdJe*jO4Jx4&A zC`<3jDA|a5jtS!p9b`T^Ni#G^d}c!2Vb9T9y^rrfTLvAIq-*D+kf~i+PX0*O>Cr_daOeZL-^rqBvdJc>|d43TL6Vx{n7rKS2 zdR|q9MPhwpW|HitGO&rrf6<2Yl_DT3-hhf5t~&2AR6n!h8_X1MWUNmcS+@joV5p3G z4JjCNTp4fFY@PSUL$n}R#U$6pHM7JUF%VHrL_O5{_P9*X?+%GG8UT+hPrqG=J(bO> zZwQ%O{c=(~y|K9@(R29HwYx!TG&?BkJVRA<4}4o0U=m2MuZdy5e+E%N9ebZZyv~tZ z-`K(093f1OQYz`6T!+Z1Z+s_+s1PsNL&Z=p%>2O2`vnoBgM%1?9fr&$N{-~`De~;0 zbWFN2CydCbpvaMHWm8pfuL2R3@={VSYtf_#Jp;Ncq>9@Cc=8YfPzLs;cki)c#T!9| z8)w*y<8lRgpu_R1e`E_~`LPnYYYyP{3T_re;rjS^hf@6F-Yk>jqJui#3Qr}sg31tw zm?#j<>KA65^$iS#E3-~0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPNAuu6e2zCe>LU#xnf`-tBAR*K~2;TcL{}W;X2l%V> zO8~A>YluD0uu@yMCgMFm-T*Co*+b9o^(6oW!yV<+h9DMgWg!-ds{r*6S_8v?Q9vJ& z-z|3SZ*zaUt@~(<*C3M`xXD(=j8ns6MMRuwL`1})MMPw@Mt-43mF5u<5$`$~1FDit z5MbPn2s~2jMi7xvrDugt{Z>9!gAINm2-6f5+%kb>x1mQ~M`WZCkt$429aL%7u!`UD zpDD})4?Qodzw@>1U3Ew0rosZP&yhK_*Q+bO6!Cv^L$t%C2f#3V&(oT1P`_$hAfodN zomz245X%1V&+sY1z;MqqF9f?YP}F%-u>xYq{BxvT5AjViTs~#6dBc&M3kMrW2`V(l z%Uo=5RO4_bLykU>@sYbS0fb%nr~#C#b`~p{bL2!1kA2FpBFNI1iQuFfNSBPEx=nYk z2G4&PlzDPUM}i7E(z|^%5E1Eu1$HZ{B}<=Z3`(Ce90*2Du1H54WZlg6cwX6H!%!Z# zbRh6lk_gr|sJ7QUs*Ocn+hCE!y(OrqMC3c=;!+K24HQdOZtKKS4PL3f^r3niR5Tv= zlL+S2Zf)wx(wkb<;@-_1ueI`Cy$kD$#sGhj>Btrv*iJ;6)o~fMy3y_=X|{Um!`&@( zx=WoR8yl2bL?kT!@Afu$`3ZWFi(7(60ucXadkJ+>0`xm? zD3_qKn$%eQi#%=S!9k|aL0<6d>{suu4cz-dY4<_u0dT##@M-K;{{in1+hn*`#3cX# N002ovPDHLkV1mBs!^i*t diff --git a/doc/html/form_203.png b/doc/html/form_203.png index 83ce895d607d8f8ad2061c649b7e60c7e4fee36b..84b7bc0998ddcdfc42de91bbf2db83b700349e24 100644 GIT binary patch delta 3939 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 diff --git a/doc/html/form_204.png b/doc/html/form_204.png index 9aa71dd4c86b3dab8b48a8cb8cdc837681c13c36..afb8c7b4c0738079ae3c2ee53c1966f110cec272 100644 GIT binary patch delta 381 zcmeAYSERLtq{V<(go6!8cGjFV08)&_LGDhBH&5!+137F- z-tI08|3PrU-sO`gt8!Y^8|fJyj=$0gR4L@?;uvDldvr?T#6t!Gt^3RQk`{_(!O(^P zl_x3FK=HzQ#CT)CJ{e-LtRTmkoL+->5al}3)s^< zgO?U4zf{Q7F`9kzJPVURImXVg7U3BJ5ou*vl-ujubw)vZ8^j&-WQSzu^ zaQ=a%OE`8|$c2e|b47l=_t;KcdF9tb$Dh1^)n)9;9)9KT*8OQ=YTxEb6|8!&`EhOU zj%Sb0J^tQZF?C1Pqox16UVSy!GJv~hx-*DckT zH?OmCO^exl`^aA*9=r7ZM&sS0i=S`&viF)?mHmXJ_xYzg20cI2buL2n-}xJF7Vc-< Yzh2oPsr#rDF!UHaUHx3vIVCg!042|)vH$=8 delta 2540 zcmV0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP z483~iHIOYKuY_y~*%Fu%paduZN`Mk(N?=NW5}*VqLHolp7~`)bhA=$eb94qKj^Ynl zlCK?znNd(MCjJ?_0tE%d2n$9>F~WkUfQXhvv~^u8Mp*E05K#kQ?z>)$u;8H}q6z^6 ze*}sV7CatH0IN`ee`6YmXab-~c-RrZk(s~K>Q?XyAfh&h9@n@N(G{+n0Xeh z2s0-Ml##JW8z{GwG6w*4s{SI+7XY6Ce|Em{lG$p0jyf=a?Z!Wg{gg)X)YMs*pw%FH$fvS^$g4e|3$J zK{XJkBi?lhVBuNtR4yY;GD2%s1T9=DqP=E{!4^CjGDh%uL4h8_W29V#>o`|X_Th_w z6!79|N~^}-~$fGIMbK;`RAq|8aia2+X^G{(rVFiFY>#bZw8>x>I$2tZLG zMD$5SJ0fBtIthi5TmM1y`(z6!e-Fsa-YC@}A4HBZPR$8}`JlM>DU`?DLve)v`%o-I z|5CoL0DN&q?o^Crjaw&S8n?~urH)BzKA2L!rBSDrh;{(Z%>3t4Fu{#BxQ5rYC^cmZ z#R)DEaq&+IHD-Nt$h>DgrgHxd249xBohOm0@&8K3DH=)xx`X^+ZXtPSf5@8WVqjoq zn-y=NX3ZRGmt>YY(*xT@u|#-??mpOe^NN~-1m9z|$sc{Wo$srlnkku<}yrSTCdvgcn5l#6V zs9*PWFjUI3868sr7)%JBwCx)7gdO<7%JVsfcjObb_c_B&1`qX&ntk|+lxu*?)>;>& z@`KqB3&$6C&fyT(HwO#uP4-33oG{Yv5cUJ^4IxUG8SRf5stZHzf9-{s5vJ}Jo97La zW{>b>H8RgQV^NSx--4Nghca^`W&br|;QGj2r%5nMK8SQr7^{$Z!sc$J<_QT8@q#iq z{u7jsNAC$Gr%x);aVDZQltX^X)e!)BD zgOGtg!_y}|$N|%af0<{@yfXAmtfG4<@6)eW=6$G@%b4`YC3_>ZZD%$FM=6>S~%7l5K%1#XJZ2QqQ%b5R#NUxhj`8win{4Exed;D5QwNEqE;W0NP@LI z*G#!job-ZJUQ;>RgRWsP`5v0#?nJItZZa0tGE}5b4$==3e<-6_OCR4+A4cCF}Jx*tIDK}E3_1>m;hKQl|+PD2_qN9iL zy~g!O+{^cYe;C`{gfZF>B)!L~^Z@}jUk2e6tNc5Ngi~i!h)vX25L|bN?n1VB$LJx5 zr@#De@Pp13n5?LG0KWN2jQz-{p%!*G3piQ4?3wv#q;XF;7nsHg`{=^6%R456Ae}ma z@gB3|2Xea5LhphNRJ*6f3*x#DqK83V0KN^48;+TXe;W3z*q>&Etaz`kZftQIlE0uh!wpn=;r&^dVuS@*pwkK4lM_)J^X|n63r0uD2@6KYU$8x#TlqF6 RMF0Q*2>?k&PDHLkV1mQo;I;q& delta 3249 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 jejA*74VX6@8v*vh67 z5QRVO*#^8NuqCi1uqBWZNC~6_QUa6!C72RI2~Yx*F#AIz5Vqt8wlQpU&(TR@`5}*H zG&6VP7!e^MA)z1qG4=ow68=v}29=P|BmNwF00{}N4r9y=nCqVxU;=DJWM4Wrqv7m#D-8GEv}hh<(F}j;R*N_f04@|1GRAS&y6vke$J%tQOcnZkzd;YscDOj z_s@VF_yJ~x<7;3ZxMtm8T)mC)Npf}uk?WZA7S~RJGq5ZiU+MAbz++!|vfk>uEcIQo z()nWxd*q3ZDd{n!>@Dw|sUiIo1@BGLPvE+|VqC@6STRSE@63%;-+A3;+^W21e_$Qy z-)etJv3q`xr9Q{Wy)>uSbH^6?$P+F)=_{}Gvf_D$QM#YkcMkN`uDYsd$DtKz0C~HG zq^UtU1Dr(qr`jJhxSq!BqKR!GdN_vW=~w4a0Al0faxB~dO0~|gc~U43a#ZVG4yCNp zK5~tZHSi_F<`1JnWw8J*63G!of8=0{0nK#_*RQY!*A^Sm+*ZesP z@yGY;4Qe1P^k>jeb;3e~#1xxsN1=*xkT9W93uDY2>)AH7C*Q7_Vng7sN1pj0Tp_h? zaXA4KW6VtM3#}WhCvOY?c`K|zUuESMU?nA1SmU}Hb26x&p~~l0#wIM?e-(A!Qtv$j z{(X3WRsnNk3{8wmpP2*S9iI6Jni|7N&z<4PPQ6A~_H#mH4n^c!*~hza)*6%-zD$c3 z7qAzRE)zW(R4{XHb%j`{)&w*6i-sf_b`^6*w#SALt->|E&l*ePKOE}mnEs`KQF+F+ z6Om^dRNHW^R13OE{LJ|wUgtO84HsMlG}O^m8wOrNEjydH)qhHtRCP+DMhF6R`Zg$nlM ztZgA>#-lT{!i}Nnt1TZGL$Hp+jjoN-qZRk`Y43IDdMX&e$UP@if3RI0=3o|*fj9rX zvS+kl`Dj?PYISTp7z`1)7-PP$Nq31^X#=^fl6~Qk zmHR^i$-P)_vctaT5_mKjKS|ibZLkxw1^#YuALpHV-4P)odt=Neb`?fMHgD*e28HU! zPItRZx$SZZ>s!Dgf1L-KRak9qFYSLtc$J1VreLk8;ffjcK-@fzP*Xt0Mg;<_p75@2 z_rV~$FL*-_)wbPjj`j9TouoRx&-DB;62WJ|d4o(>r`C|jDkk@yrY`w*6#QWO^~B~- z-&jw$lNOYE!aa(+&E4eH)i|bLL%`lg^duN#<}D1R4dc`{fAp+Nrd>T|FoV)CZ-EU( z7s~9u8(xAGE9Ou>qZfpygbx)KBlqfz8jo6h?gAUyqHJ5|ck$3x@uQ29MhtFF1~Div zXZjMGLmlvPsv(})5RP%J!%Ia;LE5}VIo*ocX}gXZQ(k*w^ZR{C^ID1T6`D*)o7Ksbx!rDEUNxYaq!|Cq`YX zlJ!L8wRJ|QI{HK8tJyJI^uHcySdc+G2JPM8ZH#qQ@DsKc(+dfpQ$TMy#FzLm00000 LNkvXXu0mjf)yhyU delta 3341 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 XM|6Ys9W!8z00000NkvXXu0mjfYY9bR diff --git a/doc/html/form_207.png b/doc/html/form_207.png index 26115312d62a8c273aa9ad7176a96a0a93aaa883..bd998b9bfc23c7f5f4b4979d7d0242b513de9124 100644 GIT binary patch delta 1218 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 diff --git a/doc/html/form_208.png b/doc/html/form_208.png index 6b94a1e6afa69eb4f33cc2cfc559ac6512bd9f5f..f77c805485582aaee2ec70bb789c3b8f3eec9ea7 100644 GIT binary patch delta 1013 zcmVqPj zmK7)>_{DYj^VJUg5BNJKKynG7GU$2*@G2tDS9>)xjFJeT3_h3oeGeces|HY$1b_{I zf0c+FZsFv&hlrRiIFdxKdO)sInHK=1RsWo?DLL^N(nBFDA}hGiE&;5kPU;--5fUvq z?^QqRY3|GuQ%LlL>Ls801PRenvf$;krfRjyMXdTlz#{`PSB{Y@vRgWKdv0NV>21AV~? zhW??-dO3;iF9CGHZ|~p^KoR#Ke}mtR>RV>)6{@2T_2}Pr8QFDozgHVgq90lY<9Y*7 zMV$0!&lsAk5<8lZ-DODJB52IQ^%n(EvsRzqCghTKRqtDZz$QahO18`R(no~Fi=gwQ zCP@rtCwKLkLDlN0sPRIHXd)Sj2bt0L60fL)o?gGVI?(qSL$TP`1xbXG)Vk74}y3em;O$?t8A2T9xp5DW~AWLm%Nt;2t?&5qer(>%> zEsa(OmJ^E!I*8oBk4|BHlR6`bWSJpoZx~>%x`=I5a(U*j63->^neUzVz~%1kp}U|z z?g6I(#P4YaOP)Xvpyifaf0jwHjj#tAMuVx)|4b5}fa81YGw8hzj-UcAJP%r{#jD{- z<;v)OtOx$tfK+IC(g1Ek^;8y5>@s|Q3^xnsF{s1$a5Z6AoR@H00000NkvXXu0mjfT_wnR delta 2899 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 diff --git a/doc/html/form_21.png b/doc/html/form_21.png index 26496798464f22353efc05d7f33280c529a2e2d6..4d3df9af557b06e375523de09c3e11d8b0e9d3c4 100644 GIT binary patch delta 351 zcmV-l0igc<6O98viBL{Q4GJ0x0000DNk~Le0000M0000J2nGNE0F-(ChyVZp0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0002=Nkl9Y=)b|-fT<~SH#05 zs#gjl=`er+n1KaQwqx%x9;fM(o4JX(^zk90l60M8UZ5*}Gw x`j%PS%&ePOF|I4DITAy2quL<rl7CQUnOpR51?002ovPDHLkV1nc{l5hY3 delta 2527 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 diff --git a/doc/html/form_210.png b/doc/html/form_210.png index 7d6be74f7bc7391fa905d6f8900729d4bb24e84b..b678c605ed360efff697b9459d8fc2256dbec080 100644 GIT binary patch delta 4134 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 diff --git a/doc/html/form_212.png b/doc/html/form_212.png index 445693b76acfcb01f54bcae9acea2d858496e347..4c625c6135077f6e2d106f3caa13844273b31d1a 100644 GIT binary patch delta 3378 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 IM6N<$g2Uu+CjbBd delta 4241 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 n6bHYEhxs`Fd+<4)}Bv7Ix$l;sOWD-#n z0X%>Zze3E6jEs!?!aqwlAR{9qJyecOMAg&{`R*X1l881F)LRiz5&KN)c4Ul43`cq$ zf18M&07MZZV-P+798x-!IP?)f8SzZEw_T_?@^9BoG4cm9|IxfvqRC!LH3F%pAO=v9E3S1Lb!B-T~}t ze>(voxL3!;!WJOL=e;@gi=L2*5%9KANO6 z8f$S`e1MxVNjMA0GlCGU_`WqYj3Y(Luqe= z`dI|V^w7$YkYlSNy}*wKYRg-ODOs5L8E$%GH{kIKz#rC)%xdjzN$sk3ZPxcRitHxWjVv8f61|^;G%gawDvZvpIKp44?&JJdu(4oGw6}cU#QBr`Fz9^)ojt>LJLH=E}2}G~7p~EfJjp#XgrMGIMWQf4CHk%i@i; zg)X%&;8MjO%KEiwxK;hk2E%#?a-`|l8z=~buip_rLW49!bd0EPN!*hxQADb&I7AF336oUer%u5e+MgVd}~AzjfnO{#0jqB(z1+2jX=F4t+iA!^)yUU{nQr3 zJj1oOM5H4uz!AVGPue&#w8!=Wv_&pIC7_*4{RA^VBD|t!DoiHJSk(4WYX&oS0G^ct zpD{?SA7B0~ZKc=-Ex-}LC{NlrGWGDZ%{E%T@aT;y7-@c`&#i8D3$N%0F!V$<+Z_8DmF5_dKwW|1c$ z$JVTL>N3n8*MX5WV6ZGibbyQ02RWpmey=2=_r_@#PXJyc7M%DrtFI@n;L`Be6i{RD z(Y7X{4H2D)=oQYfe@prOG)17B2v&I#SnSbI+{6}W~Dc4$hZ>u~BbEL7yvx0Ij zDS$WBPKv;Fr2Sy0>SEYH6-?jHfXx4cVxfW;Ake?7mAGP}Mq9nY%loyyj@ z?o}SV&ph))$B|IMcPNf_5ux6MSO>Ucc-CsLXj#0{;ZoTfj)I90r2uYWId&3RWZ`n;#WVAqfq9Yt(Kj4h_2p3JiY^7s2<)NwX z1h<2zwRe-b(UO^ejS}Em-=y}I_U-}vrwnd)g_JzeaHQ3-r2_w-A=a|kWHCt8E$eBO zq)Qtpe|u^ve}el@5}iF85xv392PfNbFr~d^|8l|1+P&g;iLpG5^}Uxd9umn5)*bs? zz@^QT*d&F$#iE;Vu8k#&1eJ4b5MB~^QKN+!*jVVu%fjPL|dM(RGSC8!28IvJ) rj3FZ(vSVjt+#$vuw2+aJVGw@-EP{+T0!npg00000NkvXXu0mjf0Blvc delta 3389 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 T$9`Ig00000NkvXXu0mjft2kpG diff --git a/doc/html/form_214.png b/doc/html/form_214.png index 56fc1b0627d9ba4b8f769f4b69a3fe7b0fd1669b..9d9621cd5f36b00d335de206cf8342b60f7d2bdd 100644 GIT binary patch delta 1037 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 W>e8_ckE9*|0000z+ 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 diff --git a/doc/html/form_216.png b/doc/html/form_216.png index 9d79ef740c774a71ae5f548b642c3e680842b94d..917bf73c5eebe4b4ef0900d6e1e7c8e6f352e1cc 100644 GIT binary patch delta 2856 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 Ef*_?o;s5{u delta 2754 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 Iu0jG}f>zx&!?QMfF z5Qd+(>H@5g6o ze}QXXyiRD9Yc>U(gag4B|IWNvr#FL($GORM%#8O$Bx=9zGm+{N?~oEDZGe)PA0<$X zin&iV_cF7a^t}5tcc<1 o`oh^AGg~hPf5iU&KipFG3&eNWY_y7O^07*qoM6N<$g5(dz3IG5A delta 2591 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 B*XjTO diff --git a/doc/html/form_22.png b/doc/html/form_22.png index 10e93f69c966517ea61b7a51ba1aa481f47d8b69..231a0a08a99a2db6a939d4056c770673110f0d2a 100644 GIT binary patch delta 726 zcmV;{0xA8y6@dmoiBL{Q4GJ0x0000DNk~Le0000@0000R2nGNE06E?QS^xk50drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0007LNkl3RvrZ%h6Xf z0VIRw3x9)S**Y;~cF|ScIC4x2MgIAJEo4eK2%4GAfZ8ACg7z)bG9bmY#{agGcA0r0 zXp{44W>%Tm#?0Q$Oh>kD_Zlg48x-*+e{<6kClCO+pxz|B=X}Dw?6CHd{pW~}IXI5| z*9_;s1iaxaN8Db+m{YtBU!HHQwmjqh??BV(D}Ze@?rrE=G1I!W>Q`!;WM&&bF3H3k zB<;*>e#)EyoXYYQFpo-3-MxQ4RYyqmhQsG9QUg;r?<&U@r%Y8seHwr6>6|YEIO<)0Lr0fP6q9Pemws7JOlp#G4X#$epM&W3;+NC07*qo IM6N<$f{hJT3jhEB delta 2720 zcmV;R3Saes2E7%3iBL{Q4GJ0x0000DNk~Le0000-0000L2mk;805P4cKL7v-_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPMBef*YeLp7y;?Z~jhW)lO;2b@GA$-IMt*HQ}{S?UH zLiq_{;Y@$s%=y3-WV9GNb2jzQaQZqtbj%rW2@|m!Fzt6?2^N9{EH^ODIp^%$lS$)B zY5lxkG}7HkGLob`z*qpBf_tj5{X6IRy64_PXCWE@@_uKn=cMp{L7)0S^HpXwRJ#zZ1$4W%=Q+oJo8Ill16$- zl#(QT;+SIdPoqMTu!(b}msE4zin*nm%<&-OrIBVUMn2WJwB%e*W*Ykc+hsMaq6Dx* a1o#22R}L=8J@irl0000KteQ diff --git a/doc/html/form_220.png b/doc/html/form_220.png index 65dcfd04be6432cb6e03291e76479c1d925b2df6..c1d3aa18c87e69945affe689fbd1f3ebfe5f0f9e 100644 GIT binary patch delta 1906 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 diff --git a/doc/html/form_221.png b/doc/html/form_221.png index dd6c710f4fa1e958a822eb558d3094941f782f9d..c42322919edca3e3bc2bc67ae840640950207b9f 100644 GIT binary patch delta 688 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 XM|*c?@$DAV00000NkvXXu0mjfF3E|n diff --git a/doc/html/form_223.png b/doc/html/form_223.png index 39eb8f222ae5f1ed271534ad6ab6472011070b64..db3981b2118bc9fc1a6bdb25f139871bc4a5b299 100644 GIT binary patch delta 2748 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 iUy;00000N8NjW&b{Z})4Au|*Eyf_e*N+N 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 Z`~zvE7pEM~lV$(_002ovPDHLkV1fy|&P4zK diff --git a/doc/html/form_225.png b/doc/html/form_225.png index d1e91da202a99638504eba324d642c591b2db4a7..f2a398e7d369cb53adebb23fd3570d558958527a 100644 GIT binary patch delta 3860 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 M+{6Z2ZR8REACLBiS^xk5 delta 4682 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 M07*qoM6N<$g80PKod5s; diff --git a/doc/html/form_226.png b/doc/html/form_226.png index e05f20fbe506ded4ac0d1f5716b1dfd3a2d32998..f29143190bc33e3604d34b866e9ad8ee6fafe3a6 100644 GIT binary patch delta 1383 zcmV-t1(^EH7>x@+iBL{Q4GJ0x0000DNk~Le0001O0000a2nGNE0E4fz@&Et;0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000E^Nkl z4F1&D1+qdqLOMb^LOMcj1a5@f2rvRS!rcfkLKy)@Q2($L9LGNra0-R{-phLs%dsq3 zvLu_B8DIFn@a@(Nd|^Jml=dIu>6Au9&8>L|frv^Xs#0`Mr8FX111N6IM+7GTU20*` zf3pN4qOcP)zk1s09Ahx^=e6G;q5{ANfEQ-odug6QX+*RF&@l5)Pg@IMEq@R4*eK-z zfIW;g*r*`Z%gmIC-wH-?KbYAa4`Akpenj9$09BxU3t$JJjy1nAXfZu>AR=z22CxZ`Gypct?7Bp| zzXmSe{Y7v}w9f_`x440^xB(toX#iRP2M%oLh$~dv6|o?r!gw#tflmOHn+80((i#Bo zz6OcX5VA6X3hR)dE3kmlnE4&Xid*~r_o*MST*aP!5zU=J!uSGVw^aamOMFHxe=QZt ze{zO!KY%@k79Y1X$=7=dXVy%rZR@)mU%Z>0COo)Y!abdy>qi~kzqPdE~qDlG8B)ijh14|RL z)(x+;0*>BQz_`p?`uGN>@Vi7_q{y+Ksm!k0LYVnPME3Va?opXNG4snce}gTE-nTD^ zi}y1N7r9p#noq)VtD%tp>Hvd?>M2JaL{tcE@|?@g6|dzl0p;79n5Q7&d5Pb0f)_SMM8GDCzE3|{jDvh)kcAp3ia4HEC zaX0&!Ko?NYi|Za$2_+(k9NRbWE8cZ8YZ=2$DbzYb!kV+6?SbA^%|S2lE6Q~_EzJ%B z4Ll)chd@XTBj_yxVKA%%L;1aeu?(B0Mj#Z1IgAV)Hfk6?N<|W>e?c=NysmLRKfCBq zQ)HCvKb0?$<3J`M!cGLgl8JPX!$hAlot#1yr_a$=oV6$#Pv2l(BfKyIC(waDM_Bny zHVTtC5?{#pnuVKPsK~tve_@WhkLLsxrlDJEvd2C~&?^GiBnzJ0c4x zEV`e`+y{#<@-4l;GP2k#SLh^!Ut^dXX>|F@P823-fEx+Ee~W-O(s$6$=~Kd#(~=>z zu8IVz9iLYaK3KmyE9_ve=qFht)6doaMGt9nO9oB4^E}^ybtyjfy{PwFrFam zZK;JVwnD^(KE-8KAb!L6o?sOoUO7;hfAotzJ=he$3vp%lj5W-)zF=bhG?u3DmEZ0K pQoSisd-c;P9qkeDH16?{@E8AlvCO|Mo5KJA002ovPDHLkV1liYch>*_ delta 3123 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 N002ovPDHLkV1kJf?@Ryy diff --git a/doc/html/form_227.png b/doc/html/form_227.png index edfea2873620cd45a3109483b9d9454eb29b90f5..e7b510dd1c79b21030f4b44da182067cc9452b91 100644 GIT binary patch delta 1306 zcmV+#1?Bp$7{LlaiBL{Q4GJ0x0000DNk~Le0001L0000a2nGNE0AX{livR!s0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000E2NklE*btZy*bpEDCIlt~2w^7#2%-0fT8xn;`2#aBFmIKsz>=(1 zf2$=?Rlafm_~+IHe4`(}1@%Snbb=C*`qngfh)5|SRiD03B`6VD0mZH9Xy6De`zVh* ze@il9LOQDIOQdZ!#T=^oHiE7K*aE*)b)W3_41yAo1yHN%|B<#iu(H4J_B2u21F*+g zK@$~brK&0;>8o(U`cGBE?>ngKLqEpk15hQ}H^2^{$}sr=l$r4d6IApY)~5!x7t&eSe>_ozdFW)qT*?esC%V+YT2(`L*BtMYk7WG7 zxx-w0C)ByTHO{hHcxXWZbKqUmK{_Wy-|mr16e`-WZ4BOkDweW8x}a*{HP&F+7Ab2o zc!s@q^edP^P^$Whv(9mQ<=#f!BXymv`Z?0-yNUv7S)w@zv+n7e>{Ob z=avj~Sd{IYS0b{*Y3B^sh)C3r-WmL2qk>Y^oJ$-MpO{ccey&nP%I3?YMVT-bz;6xq zA0o07kt(;)J3s}Ut}TbY@o8#!ddtS|xJB76-V3R z9iOg%=zM1}$}%O-fU=P^oZJ9TNVn9o8dqGsrlQ;`KB1~d5rGe$1MOtO6L?hBU!OtP z2+X)X^KKQNPWwB8eOW3!zu4SGWY*{SKtu}b+j&mZ+{;}`Uk5zhqvG(8e>FwmmEy z@4;(IRN`Az^w9NriDxsaf6S3~O*|zIHECsYgz3Mxf>aC|5})?qGS!~_J-q7~S}Gg6 zrqulB9w8#pB~GHPGa4ggLtf(*_+!5p1X_t>cJzD)r;(`xy2{2a25M%@@-t&*e4Ib^ zJ_sDUrVI~T{ZpNn#_WX=vBVDGVgd}z-wVq>ho-O^icm+!CJ*TNe{f0BliI|X0~t5Y zxtr^HatDW_)|8>SE$|Me&+O@Bj%j>TAZ23#i^lsc5&z$?fVux(MAHtzyQI=s`)Y_b zkA23jDe@g}nXP_P5$XwQX>X`$#yrhvW$6VI(X>tDf7zv}xrI+Gs8MT5d?)I1ry_KL z^TlQGejZNT5Na9pe>?cansqLNaVJIK<3dT+qO5Q7&cuX*8nve28~*-AG^S2+UCj0m zE6y_&pB27nkUiO6E6m_tjj3xJdp0f@Q{qZlo%qw#b0zwXvq49tf^sb+1pT0aRC$ZP&Z|7iN;OY7tIvAAN_L6 z3F?Z>h24z3C#-N+*0LMor?Dsx5vlc(n%ji1s!7o+);^n{zAB!^^?h~x1$96c;x*=a QN&o-=07*qoM6N<$f*7BCOaK4? delta 3093 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 diff --git a/doc/html/form_228.png b/doc/html/form_228.png index f523d402268571b62481a17fded911ef8f708e29..678ae44db3ceb682d38ee7a5d179f4a114629aff 100644 GIT binary patch delta 575 zcmV-F0>J(56zl{*iBL{Q4GJ0x0000DNk~Le0000Y0000V2nGNE0D_|*u>b%70drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0005gNklz+ z428ef>jGIJ9f1|n5$Fi%2y_HiXh(n%V1#xA7y(95e?+Dsv7I{_m+H=E&Qk1W`8^rS z%=i!XaBl#?9%F-&RzT&g2DWDQQ4&ZhBbE0{peYF;m~tGEbfC+~lbIb$0!ea2Qtcp) zf2BcWf$(!A`_dq$fGoWKx;KzN%}7eVBYsG#=(2P+v)Qv01wt}5_s zDIkF#XP^aM&FmbUl1{)Hc%BOgW;SZT0We^f@b9`$$G%%zY?0bQoPat9bWR{K)dYTQ zV}-0o6`=H~?+f~-)=E#7YO-xm>_#zp(#s1AB{2MidIizQxiC+K! N002ovPDHLkV1nvg0R#X5 delta 2641 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 diff --git a/doc/html/form_23.png b/doc/html/form_23.png index 046690191295ca6c93a345485504dff158d374c1..3ec1aa27b033a452d3dea434de5faf5bd952e6c3 100644 GIT binary patch delta 354 zcmZn>nZWGO8Q|y6%O%Cdz`(%k>ERLtq$Pk@ih~VEuH8T9Gmv5|4sv&5ym?Zm9>`%! z@^*J&_z!{$_AZ}1S(VeO-bl~zaQu}{pzL=~7sn8f&a2Zd@-{i}wC$G?-ys@tP&A?u zgyyii9S}@mi9IOziuq`R(7N&#cKytZzHRaE+eKVLEsN&zt>v4O%&2sUfw5wiuQr4D zXX{YeO$=ci3s|&1$2+87f4g**o^ivh(0hBPqz9b)GuvE~)!?P=iu$aWSv&_yn99HB zHFTVL8d)1%#(3h2J?n&}^;`tN|4pCxXzNi^&4w~I4(;#E xkHy!`KPo!AVf~_&*VdV8)&IXOQDpIe_sZ0gxzBeuZUzPdgQu&X%Q~loCIEl~j@SSI delta 2534 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 wqj)e->r*CVYQODONHVx2>DnUvgwdTze>viHx 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 Ef)c;9od5s; delta 5084 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 diff --git a/doc/html/form_231.png b/doc/html/form_231.png index 4ac4cdf17c396819b927a38e9f8dbaeb101bfd58..dffb4a5c3fcce7460d9e4cdfcc16197cb0161a48 100644 GIT binary patch delta 585 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 N002ovPDHLkV1fl5`zQba diff --git a/doc/html/form_232.png b/doc/html/form_232.png index 92d034e2a6eb5c689f785c11f886e34bfdbe44e1..138efe529b1070d4f180ed88db53f6cee691a800 100644 GIT binary patch delta 615 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 diff --git a/doc/html/form_234.png b/doc/html/form_234.png index d54df0c74d4302aa7a92e63b53e85827034714e6..1e5997edfea2b48b606bbf8eace54deaa8c740ee 100644 GIT binary patch delta 5554 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 Ay8r+H delta 5602 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 diff --git a/doc/html/form_235.png b/doc/html/form_235.png index 1824123f9eb2efc575b939352eb31b1667720955..aea43199746f84fe88fc4a7d82beee7af992a93e 100644 GIT binary patch delta 868 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 N002ovPDHLkV1h)viHV z5QV?lvklOKw*;pIQUWcoB{(HO32X_Z1SkPY2qi!XlOGxd1Aa)xSWcFEj*bm_&(&x~ zBa5o?#5nOQ^#Goz$M3cRA~FZEh&H#tUR6(>NA&~{Kn^gmX9mpdeUBsI8X2$#CL*!~ zf0j>@97H4o<~Vs~zzI0eBqLP~O28CQOVfsO6JTNGcEBXGkDr==95@2S)&C3oKd-D8 z(Lv$K2`ujk+N2gvVq!8QU{#a9w)~q#9Mj1DO5Y zxeqCg|jm!e^otHl~GkM&l?#9kz<4PjzN_pPzT@fw6WB< zkOP~Z+A2FxO*r73s0%rTYR*?BRgEFXBgPd^3O_#)=|kH?=k2ws6FFYZV~Ocydq{wH z+;(&?V&^|8|A^I`AbV5S**C%xm|kx)1K>i_TFJS?-avPaOA0gIOJHqAJqbcIf2WhZ zxmtCx8kZcZ`i9%yHhp<-u?Qij>*_C)^DnaQD4?o;aSLlBB8#E5C?vMl)!ul6x~=o^ z`+{j{U+!-m3ScH8uaBOON2BI+wKo>Y_VwPn4J{n1x>Z$qM8eq~?D_IwVlEV*O>?5{ zjj4WNKbNHw@VA4AtZ)a(myYw;e-m~9uiP%%Y)%(@Q{Y^}tr^u;h)4>zwGkpx;D~v> zV}bd4ZMLdf&MiT^BQ7Yn2n_PgiMT4jMXpykLg)5AA3?CvN0RRj*m@bZ^rgV@CaQtIo&-ir{88-SQ;(}L{SW@fTl zWA{3?uy?jdE9Wg%aB!Gc=e;416Yxh9es^Hw%JczVrbW7QOM9HtRO@UdA;->72Twxj zUw!|0BqQgEc0501A2B`w!y-Ni^>l!c00000NkvXX Hu0mjffwZgZ delta 2864 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 O0000!;c>z+ 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 IM6N<$f{QrZRsaA1 diff --git a/doc/html/form_238.png b/doc/html/form_238.png index f5921f397891c21a5a7ff8784cfcf86dee1fb7c3..2941261aaf190c9d1848269454b945260ab94370 100644 GIT binary patch delta 1107 zcmV-Z1g!hT7yAf6iBL{Q4GJ0x0000DNk~Le000100000a2nGNE0Qie`J^%m!0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000BxNkl|48@DD@J5dqQ4#0t#e^)hh ze?wB0Qw60RfQOoPZcVBp^*f>zsEE|>ic+8=QkPIlL~8(zJS~7{X8wDHok8YX~X#uR|iRtSByb{q~Hnom0bMXhj2EfKRb`O97 zv>&wDi5>>fCC0Um&9Tb*D+II^hgTV6fAX66wUs^r2~Lp#wi+z5{W}M$fC=d*shY&NL7?tkyiw%M6|-3uq?V( z&g=4(Km{(1CW#zAm4%!54jFtZ}s90HuPue*wS= zKtn_gGe0iqGV>`BjhIk<0+8(Vq=8vu;^33i#4ni8-2-@H=F`Q*z^*iyN+O26ENU?A zzIitt8-tgXH=?h@jHo1HopH$$2{WQ!4LV2PKY4#E^P{ISbmVr6_w#lhq6P1fujRe+gG2dmREPwC|-e~U14aX^=e zPmQ`138GvD*Bitq%ETe`!-S19sjwqidw^OJfr2_q88?UywMQ>eEYJ$hZ>IcVR8<{#|`){10T!E8smQ>ffbpBiFe1 zk9x_Qoo$im_Z=IZGd9Xyn3GDeJ5kKl%qHO529o(b4!+>>9D|y%e>GEQCkD*7^TE0l zQ_Z=Y3%uMttx2T%ck`b%+dMmh>7|}M3QulF*nm*T@y-Rm)g$cn9q1H zx44b>zIJWV(_#KLRY-X+|2}ZpZ2P6eeDlxDCn9?k&PDHLkV1j2^6uJNa delta 2986 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 diff --git a/doc/html/form_239.png b/doc/html/form_239.png index d333b629f93ccaae99ad4122254cf5315b5206ea..d0c7b92bc479ed10c7460c0ef453bc5ccbbf943e 100644 GIT binary patch delta 4951 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 V0R%i+4PpQQ002ovPDHLkV1h^1kS_oL delta 5068 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 id`o)w;{7y){{xxfIJmA&$6O2m0000BeW?1 diff --git a/doc/html/form_24.png b/doc/html/form_24.png index c25de5bde3c711cb2237ccc9173f9031dbc9f45e..c5dba9720114a0d642e58a511d1052b7974f5bac 100644 GIT binary patch delta 2619 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 delta 3879 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 diff --git a/doc/html/form_240.png b/doc/html/form_240.png index 6b2a0fcbd605c0067fb8a1c7c5baf5a55ed24b87..fb5cd3d7149fd69b83a656e2b33d52933951965b 100644 GIT binary patch delta 1365 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 bA^!tnA3oQH)Q_zI0000oB#j-0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0003dNkls83bs2ZGj#*MF0SpS#f$d28^|uG$TzCm7lN+Vqtq< ze-CRQH7bo$Ij&KO=xpyIpfl4$QX{FC)Rc-nUi;TFtfMWfj|!fMxe`b zt;gSIX99m5bAT-W<@qKOHtDf9v&bWyru_yWT0I;Yy0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP+BO#Fh5~zgb(3IPsKRfSYTWRD74D5VL zi~y*ao2mh5jGX^SRTcdbJ)6RGB;m;SvcpBLZCiKr#6$alsUHNg*Z=v)5zFNv7|0000;D`#k`ciSY-ZO2%G+U!MgyYpR;n ze+;}@Ycj{b0e$W_N?Q)|(LUs(s#C0|q+CVhcL|ZDRuZtO4E_r%0Uwz!4Zcl+6*9q( zGLFl9;!NweHP?yTK%WCzzaz)Q@K>L0ay53? z7m?b6AK3BUMnq}@;$^M_{uN0)Un9gbbC-7R$$UI%O)>BJYv8J?gRR1#$;MZ5d$86j z0=r{rxRNou0IgN7HDMpP&$Xb~+)S&L`sGCJ`D35Wdo2F;0>6cQ>x0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPOolKyV?%5F`i|1RH__;q^mulTM`Gk3I6~X?IWl zK$5-`lbn|%rALwly%)KHbZ39>jQ2X04N>y@W;<7iI+SOU)jn4`qxzTCzTFvBn3E)_ zt3k8eLE3)+Fo1b$J4)(1N&4$2?o>gk6bSyHn^ZznE z6lOLNdr6w=urXhfB?S_o$X)lz4uH> zc$U394e8f`k!(nIB&*eEl9CNT1whsgxwSuOuM20ndhN8982{DyP%x4e$?~CK2GRo9 ze*tJo9ydb^q+S5%02KCp#3=i6t?VVum>mFoNE+z&>%9XlAjPom)oMH6pR% zXPa?*bgsr2I_;wLB@L4L1*M&{Ebi=Ywx)RY*4L3a=iZ5^R=q(;b{NI;78$=vG@9J? zTCf5@i!lK^7B2YrVFKUeb!Dn`?o8hG-+jt`17?Epe3On0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPq<3}Mze&Y~-^!V(76KH9)YuKsCn0n#?1fmH`Jqw0meVcJuy>+RJNSsE5H zj2*DtC{0a<_@@PMjr}&#+0000$t z423`Sx&SM%f>-bg?g(DND`bUqgl2?xg^XZENJmhARP+c2V&^D#96s@QNDoOCRi)>6 z>B{yWgs&x|h%A7!>4A%?zV9KddFX7Nfbo!vs#=}E3Mk-PxVtkAGH+z-UNTi}K1vMr zf9puZEyBUp>k-1P`c*aLfqv%wP}(czAr<{ZWB_L18*n1xRQ2s)$iUe=oDZ#NH;o`2xlWa154`Jvxyz^FV^v;@^IzR&~Gwt zSJP@aoQJu7iTyKPax~;x{l;E6rA85%TQb~+uvWj`){v3;47c0E*l|T{ P00000NkvXXu0mjfx7NNU delta 2563 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 delta 2725 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 diff --git a/doc/html/form_246.png b/doc/html/form_246.png index 2005f0a1bcefa44a1a68f3efe6d6b055aeec6419..19a74d90e487ba8a36f47388aacdec3ba046d4b4 100644 GIT binary patch delta 1895 zcmV-t2blQu8i@};iBL{Q4GJ0x0000DNk~Le0002u0000)2nGNE0Gw6nBme*a0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000K?Nkl?RDZh z5Qg8m=QiM!z?R@Gfi1ze1hxcHf>Q!1fh~b8At`~BKuVbVL!)4Xgl+8LulG4eC%ec9 zd*sn*q>&`53PQ-R{4?|o5JISkgp7iJ@A;C5WB|7I-xYuiz>BK>?d!$}SrUC%!~(z? zf52xCWf8JSq|0E9S;iB9PgQ;D?XCz}7+o#m+WxXjN=OH~Dq?Pb-@D!jAxnl9k&qE^ zw~t8wkdXdpY!O9dB_iv}N3E@4qzn>)a(X;N%e+<*MPw}^2e^5|wTSFRWP=v|p@k27dEeamf81@R>ta9 z8B0i%)3RlL>n68$Bil$`VR@$p4|=7@mbbCI zlK!EH6!t*xs`{F`?p7H~fO2{~W0ZNyNAz)|e-ioLslDYN`u=t5K{*HMpqw7hfB0k` zG0QoeSx)+YsPPYR?z$>~EOE`^{hlSu31`=*Yue92=CRcmh5h|d)vFf4<_~kY`NLF; z@ntbp^(q)#L{@OCHa=AKBT>c@Sgf4XxjZqq=errD%wt{CIv~E zeA=kw)V7?7*3YP9?zy!dG1VGee<`Yn6sj8YCsRwKZYsOY-(+?VpCYnDy<llU;WR%H82?ad)wn0p}L$X#d{E%AZRbT25`tnM3^yE%RvE zi66}E$4aZzJ@4nCc7BTyNjaS|JMelz`=XvIkhL97| zBY|zpnPmNp{oU-_BKnpi!+CDe$L{@w+YNlwE$1T`LQW!5s_Ju}Wlo8)zni@(A{i$l zvW4?yxTbNW@DQ4re`Bi&GAiM?p+zKQ1T4lP+OAyMW7^jLDk05Sltt`$?Ob$WDIxc8 zp@u~8 z6VjT+C?X+az(VaZ4YuN-k4VUauqdY^fMd8Ei;76d<0x=me?D~)5JE*HVqTL^$lNGmdk1}6WR3NMPjLR>QzSo!+db=DReyfVO%O5>db5Zk zvI>H#>#Sj;10e}n0-Y7nc27RQIiPDB1^qg{4d(yZRuw0|)dbu=lK`--Y(Ek1MolJ$ zy$}0pUEfGY?=vl(P80fedg>OyZ>^k|Y6^96M6yj^e>_#LIl;}PJaNm3d0-9j4sK|^ zIslg=J|K4$VX{~{?3}zs`qUtQXvZn>-5il!mzk!Ua6YbY6MSAEI8mDEI^AUv%@-`; z&Qpl3$@8ro{ln!@0{ErZfg3q4&x{}u?)4FU9BJwloVxkJy7@&iA#8ciYeWeFXA#-p z*3f$Tf1)z&00gJ%RIYi0Q?^vT|55sfGp6#cu%2tU$0GW;(2st-gZYgdsA)(SMQmj8 ztgBk2@+*|!oYI_N&!+|VD54i^7G_i%Tv^kCdlc~% z&T?IB)>~1+Q1Bc3j^`qp!n&hdoEH(3iBstXaiFFltta$V^;1NC0oYrJ+dFJ43|0MY zigmDK%Q66eg35RXurtN=M<@Ts3Y!(2CvHinWl*W9hz3&_UIC-|WcpOx4K}b1;7;F! h9gG0(Yf8un_#cJRI-()Z9c2Ij002ovPDHLkV1m`Nn?wKr delta 3421 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 diff --git a/doc/html/form_247.png b/doc/html/form_247.png index d02f2bf8f3661431b83ad4f75a9a2dc0dba0ac1b..b231318fd218955e846eabd4d3692432a1b8b990 100644 GIT binary patch delta 305 zcmaDO{D8@!Gr-TCmrII^fq{Y7)59eQNQ(loFb5lutoL*422za0LGDhBH&5!+137F- z-tI08|3PrU-sO`gt8!Y^8|fJyj=$0gls)e0;uvDldv(e|!Da;k*ZXOg8gy?k=}r*J zIT&@xDQZL8mI*>zSacJM1=1y&Hd$4jIQNH{Yd*WYK*=I#LBRp@On77(&3@ivh|LSNT)M>n!NOIV=@XgTuG;!& zFIw4{mfBx^Almb^Y?>FV*6Ni{JxmWQSQWf6U88%Y`utyp!GbGqN(Y^sGE?Y5ZR^W* zPxF_?39egcTI&7loxoGE%r6^eoPVzLbGG|0?pNHt9=S0&Ux9vN@O1TaS?83{1OVMC BdS3tl delta 2510 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 delta 2864 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 diff --git a/doc/html/form_25.png b/doc/html/form_25.png index d874921ed1842f8267e6ecce1a280e6b18484c2e..3bd548ff380fa276123baf403c80d9f1cb85e2c2 100644 GIT binary patch delta 457 zcmV;)0XF`q6!!x_iBL{Q4GJ0x0000DNk~Le0000R0000R2nGNE0FBi2RR9100drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0004ANkl zf6gXIG9Tas2-tfz#+oCr^X5&>LI^$37hbla13tV-uRw<4`#K#4vV#{%Ub`+Q&h#8WycJWds1Nt81E>KU!YsEu_Aj!uLzu%^a4ALtLWvCJ)&2nWs7X3 zm!;Widck!XSJTTPTTd^z(rnhtJxnY6e-8L<)z&*fS|b}t?WYNKKbuHt=?&X|$b~UT zdTAxABb&QwtPKsKJ@D2_1ej;zk)&I6bQ(#G)tq0{*b)7kv{84Y3Y}a23HYR816xm! zbCoMDKRxOGaRv^O&UdA*{HI5@1~$DnZc6qC_8s1)9`LwB00000NkvXXu0mjfAOph5 delta 2570 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 diff --git a/doc/html/form_250.png b/doc/html/form_250.png index 76b62b74d0f2f0b9430f1a4aa0527d804cdb540f..1117fa61d7f7c5077c12d54b9e7985c5b5a6f734 100644 GIT binary patch delta 522 zcmV+l0`>jl6t@IGiBL{Q4GJ0x0000DNk~Le0000d0000S2nGNE0OB5|TL1t60drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0004=Nkl*90_zz+6_?i-YKLfX zA!=*TV z{-?-AQS&w#O;6I_sW9n(4Qi?M=#p$Q-loVUQS&w$ORseORlG^6+^KP!+)`>O^a#{9 z;0Toc_%%SS0V+u;;C%a{`?pa_s?BUaSRb9IE)E+KTKSVJ@rTRFBw~Hr1+}7761SM M07*qoM6N<$g3}l7;Q#;t delta 2630 zcmV-M3c2;S1mhHciBL{Q4GJ0x0000DNk~Le0000X0000M2mk;80Bi87rT_p4_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP?RDz9 z5{BQo>o&kCfn5T-1X2Pifl~sz1X2Q&z%BtwfD)1tLJ2xQG{Qniwq=|6gZEiWD+Kgm zOZIp?8fnBB140NPufzZPJ^(@pAwSFi`#u0d2>A&_WDa1V3C5T|HOtKaEOW~Z8EX85 ze~?$f3H}YNAa7D`^@QX4aVYo+AuoY3<^*7`|DH0+T>yOKmK!n@{DhEK!fE=KA1XIU zDEJ8>uf#(C=4$Ru%MB8tJ0~Gz3h3nR9KgjGb4}#=1aLLR{H~~L1}p3@#+a*!oB_;? zF~7P#?mnQ#PY4+`BC=M&yoMG02NBsufAYBpLsDxOk(rh~Xx^=eY+xS(lhF17x^ogj zMvRC!0sZD_`Fj!h6p_&NveZtmTK*AM%YO^nNR}HT)c6S@qeMh@u`b;-rf2(R|S(eXD z=7xEy%8d;!;37m(4RQ_Z^0zO^IvD{l1lsnydpoE@mGD+={vpqlgg!tUKOsKOhMW>U zZlZ58D>w%N`~8QZ;3ot(tFzjk6}r&|CtsTG_Ke`CxC?%f}MikI&9zM#fWVl)X+H}>#!PV3BC*%?DbmRG>;YB~f5B?67tNow z$}^{)uG;LImi>Nbf9gVUJr4GbN6&B7>oFQ*I!mwvaDW}OZ`eUt!mhg8X!?dd>9RVu z0M7b%t#z)0d|ORN0K4F~dDxEDVPJ)Sr{_JEqk+^igt^C1tDdgf>^n8>e|L8c2j6YO?}nE27)!6G zrys);PH3*5O+qLi0h~)NfU{oAv*5S0_j%(w&2?gs*9oCTq_dZO4}32JZTs{b>DSLt z!0QcV5P3j*V-$|76F|LP%unpQ&oZR}R>7Hh|IfYaZIjVX?RvUubI7SizaIe{g73CN zz6SOF`PTFLf9&lzIzFj`{#`i1pBSv@3F~hU8jA{|ou4nbIL_g50QgQ^NQD-)_du?RY>#n;{tDZyOV(Od^tl(YNJw~M8 zAZpi>+vbo`n|{X#O4^d;yoIF^1ayOb2Xltn1$#R!BQH zf2~q&T%Yh)bN>eL&<<4dF^_JeE3d6r;sPre+JvZcT4YXmy7v~x{F8jZUPm)8!jm7E z`yz9mHK%&DhAn?s^azt5qrtNxd|pzUG;OT$2L+Wr-|MfBQ3-~O6t{Z;Pn zWn>9{C)6WC)hA`naR=$XU*mq@Zm&L(e|Ft|-JvkKMDj1)v6>=MkGmiyXX>djCVK!I z5n1^+M8gnuCs^}B*teq%Pp8+!k3OVCWbE5ow5DahkIK~LDZSyEm=EZ^11tM-%{`4* zHP>3erGj^>4Y)-T&i1x4-cF4A^j;fd{)yCchG)YMpKvNPcEO3bm3t4iKFxpde~!!9 zrdJ3;sKv^UnanZiEJR&j;ps%gz&@l#Eij!edTQ5WA9!<1u{Zp|;NEBwGR#FD10vDK zg1qkDoTc)>zExB|P;1zbcF@IGfxXJv;qF}c^tYr-9|Hg5l03D&IG`*1A~vpd>*P3l4^SQpwDbv9@KgGt+f5i06guu2R`Q5p#X50GF(7ta>g*zuoR?eZA1ng}Q z!VeDK!W*0}QsV_SuR10a{7hp^&>aRU^6Wg>P|E?ulSz%-cat`L#vd&(cFW-|ZHJBa z3*wj%G9F57`yowi{jGK_Et}kB983>03>zZHq+@jMfRJpAF;bD`&XcF4e;()8pX1@v z>Ryjd?)r->0Q?g>aNWIe4&awzNVKOj)iF`ep<{J>+0tZQzO_^%GAR+m>zY_5gDn8(C3&CGH^U? zzo}y9m)j)rr0(@CB8s7i%+wToBc<`5U=Mx~R-O|FlXMElgplF0e}Prb7T$Iextw5y zdrIqn*q=wO5|{A)SAl{{v@|a9z%LX!C^nUzA`IZW~ zJb3ts$TzHzcXD6>D+k^~^OEih<=nteu1uMY{|&&_2^-kGUH+ojge_@D3IiakMmp#K z$RmMcLdbAgqg$a5f5f%^KLB>>`QyC#9)!NKhm{X=c$3AoHfi&z@)g&ES-B^Rez%3) zS7vZK=S_iE7!zvzgcNx0+t)gixgm|VWk$Izd4;&=$q@I*9z7frLS7HO*Bj60JqUia z0nZaAfU?kujw^tbYM~cRwSrlYI2;oI_Vt#os)TgFovA0-e-_}kd5nYUmK6U=2@TD+ zLm`j=D|nJ+NE(g_A*5?UKmOYypg_RPVHYr6VePCb0pk`Byz7d{U$B0uGZZV*NFE#$ zLP)2C8o$#FXDD8)YsJCzG}DJovUFnZ-3&7p=Ahx25JI}<&c<)r#lak70OY~LF(HI> zO}0B{vZ6vWe+>h715b#-N~+HL_z4!eJcC~lY`6V)7 zvR3XALMF!+)*U$1>=$UUGL#IP)PDSgkcp#fLG}q-fBg!K?J!wr>LG;Oq2`}68V2$v z!-pC_AtYo4yXhZ={zReRCxnD7!42^y4Fx|TKB++7WI|Bz6GD8P z;HRl)!qBUS5CY(~wZ}Ii0lvw!pvF%Kaol1*^m-KJ=}_Y*gxt{0+AehEoHi8vgb?y# g(9}Z+7$Gmle+WG6Tw-E(kpKVy07*qoM6N<$f>5=3p8x;= delta 4309 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 D0VFY9 diff --git a/doc/html/form_252.png b/doc/html/form_252.png index 39d2641d341fe06c2c4a4fb00f2aef0e87ddc9bb..ae9a887a5e276774cdb71568186babd4457971fd 100644 GIT binary patch delta 815 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 diff --git a/doc/html/form_253.png b/doc/html/form_253.png index cf8175a6a558639356e9a0c80a2514ee3c1938b3..c3a681af1ba29f4c98dd163ac577d5d45fb8da13 100644 GIT binary patch delta 807 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 diff --git a/doc/html/form_254.png b/doc/html/form_254.png index 946a02957e58acddef6a254ce8e0cc7318ed590d..8cecbba51dd0d089eada2c05bb05d384624b0c46 100644 GIT binary patch delta 865 zcmV-n1D^bv7K;Z!iBL{Q4GJ0x0000DNk~Le000160000V2nGNE0Eqvw;{X5v0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0008=Nkl@Nxo>s{JAZ zI_Y>&>H^uzu@^o9(TVV~HR|_L|HTkv7i1=czbbV{`AsAJr;0UfULfTTp1&$0$AqC+ zbj?8TBU?6*Les)(QbLAI}?64ajT5kz(!XQn@Y3`_;gh~V{5)yWA zA;C)>m)&A!YeN=VIs9ok8g-43jn4b_SFmAb%d5CK>fw6%m^`x*2@%m=+F3+9fB4hk z;3eq{U?-$ufG0C?jYhV|BI`VFXScF-7g z$7_1M)7q49*|>gFn;z<92O=%24ldy?V)+5l6EG8049!ZhS_B1Yh+Zmk(I)ujg=maz zUA~>sLy`*Ad}jkrD{Pg|1}>>qe+O^XO$6S>s)cCHL+U$TS8pU(s!C=FK|-tRH*y{e zCEh>4$Yv>Rw=&LZ?0m)@@*^itn^~WrWp2c}7}qk${}x&eOk1zR2b85zzbLn>z_8$~ z^d2&Rt*jK+oy{BC{mNW8yoBW1`lRk)tz8=|l@8%^SPn&2B9mF6Mfw%MfBV?PeS`2s zc-aF;O1$OpcZw>t>NiM<0#mX4PEtTbTOs^~nboXexNLdAQ28DZDM{ri0DQ#wYW(2a zV*&^Goqu9I+z(dq%r|xme>!gZzmbxEt%mzz2|2t4%!+8BgP$FP$ifoWa6eHphUHLy rie5@1ZZ0Da*m(T?Y(PB77akCwuwPr^Cf=K@00000NkvXXu0mjfy}gJ8 delta 2814 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 O00000N8NjW&b{Z})4Au|*Eyf_e*N+N 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 Z`VX|GYpduaaW4P>002ovPDHLkV1g}SPHg}H diff --git a/doc/html/form_256.png b/doc/html/form_256.png index 2fbb0d926f7f8471d51f45bb8af896dda1940a53..36678a8e6b56322920c11e62c7eaba2c15458191 100644 GIT binary patch delta 538 zcmV+#0_FYZ6vqTWiBL{Q4GJ0x0000DNk~Le0000Z0000P2nGNE0J}Jsk^lez0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i00055Nkl#;gRAn z428dUa}Cf!T1X3A327l)0xfVQKnq(!C?S*pC4>^RKUN-0V#mo`Zn)Eoe#Ca7?o zWM=#;_T$|EVp|19QYC5sRxpwpNjKmC>?L)QYWL%2Xv}QZffFzQb+onvdf)~aP?h2= zfAOCMMovHre3;oaO5h>s>_G2kc2B&UD`)aNkOw2FaUfSSJI`RgB;MTtd%hWLfd>#` zT!AE*x$=Y(v@_+)?)#b6&zzQ&DJfuQrSiwm3?rco6J{c-BR0xb$hyz$SH6EMh<}y9 zbFCd%$z@$+MN;K)vVt93Y0f+{>r3cge^SOpU;>ETW!vjz228l59&h;USwjD6X6D4# z1Knuqo`8-*yYduxvH_xV%@P3v`~vQhdPyB{zU@R!l$cR1}A^{KXP?LdhmbpQYW delta 2634 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 diff --git a/doc/html/form_257.png b/doc/html/form_257.png index 806753cd75e6860d28e07f705a30dd5d9c1e4cb4..40ca685fc65c1362db5e3c83c578711abdbac1e7 100644 GIT binary patch delta 2628 zcmV-K3cK~f9^n)~iBL{Q4GJ0x0000DNk~Le0003V0000a2nGNE0AF8KsQ>@~0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000TdNklC~-#{aAZ`*VDJJpM!7zrYzK@ z_5V>;k44x^iD)D+Yk#>+Uu0nffAP-Zcc}L5<(oXSzBdgb>80z{X(3ty)hU<~`ir6Y zptU7}v!xI$$L{TC;@kx<;_RBI{*LgBr%kd#$M9P;O8GZK!?I_rU$5N~weXcKmLXb1&qo6mD0bAeFd`_-T?ds@G5=QFal^9f6!Fy28vaLKOz%c z=)HmoXD98YPCc&xCZZV;Erj38K8tcNfzZ-UFP=v}&)O z+FU0z^Doh+MfWotpM9th#-}7O^OlI-VCDdrbulNR59vE7Z^(ls%qHrN|BHy;<@beH zTJOw!vBreH3jm{Yf6#jHQ!>F9Ft1p?wXw&55Ds}I6=7eX$s?)&tcd6Y;Ppc21vO|K;tBh$~QrT zbGgH#Lx&z~j0-o1IJfP7H!z#8l7BVq92K-cU`|cwbJwDIf2V#(o|Za}y@3W;4rtd{ zeES|v`oXT-cCW<~VC^VktR7o>zOcjmBcioD=d*|k7=jhjukGmGW5ChY2WH+A(cjei z4#Zk)O8|elt)XhW9hraX9B+9(tjh+Db9-I+uGQe_1|+Mz~aZIyG0vzcb{AQ0wU_ z{6NfnYKSu=$E4Ru z{UmUOf4x&3mvb1NUhROUEUp^1S#3cUu`Y6bRgUe$7f#>2{6*#7IJ5C=@gm0&d7+;T1SZMuTOG`A|431N_V=-m&7dxUV zk(lF>R;i)d7z;KPH4IO@^Je2mdxd!|iB0^|e~8}}#&WasX67)tLmvTJx<;IzY%uyG zxO*7gvTT7!UmzRbUsq__bFzJn$_o&Y)6e6B&$%3B?I_qdlhlzoBceG++}9%$DG+vT z!d0vt5jsKnFoEqQJ2FMnl(@7WDn#Zt$-Fe&c}>g^X5Md!C`DoT!s%NH*XvzTdKH5& zf1Ex?TsU1f+>l_=4S!E7{A^iFq?C29b>Bj4r4g5i=y6JUPZkF{s=Q~o&^W3tP9{sg zL8p7sbHMajiq6sTeXn!Ar>$fsJi^Zntz3NfJbOTdqZ?`A^qq`douo+3I-c!#zR@XZ7?Ikqne=TL_`&#Jf<)Jl}7EN3h&q5?qNkopHgP`F# zm(}BQDlcFdcbRPD##8%utV@}^M@opO2&5GtmoZH;xPE-WBnwvD^SWhOV6lmeLE&@& zf5bUjL#!bAc}zI{6JkxV`?aF7o@+t)xr1@Cx-7OS5$glAQyp645@6G^YRiw}|GSt~y= zptWH%sP~!%;omNnKS&R!>sh5y_y0)$JJ-6yz`ZrHLA^OFxM_P#_oOXw1iU7Yl`Qwu|OQz7^VeG|KOXR0@{RT&pmU^}Le}@5}yGq4n*X`&gQH`0ah=b3Cu(*9>pv z)8O?cQeUHtbF2QUZ>-UGE>8uCoRvU)Fq8Cp($!JT51OGWj^z_Of1HC#yAZm` zv)?dT;x`TPTG3IBvh3l$n&IIf&TDo4?_us6{t>VJ)coOu;Dflrt2qp>3Ya+sr(Re$ zPH49Jv9JE!1kV@{kzT+0AG?oSs8)IjCET+@d}lQ?$EHSPWLymo_Xqu~{GGi==+rPm zXZzcQjv)Eon~aQWA@%QSdfgoI>ZE2nU?OJSd>i|?#g8z1?+GiBEa=bCWMte55BaK< z5e5k-&p7b!U}a?73J>?Hl@Wz&UT>O_k&G;Oo)p$8|Lot%_;JXB=Xr6&h0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP51Em6n%9PW$2ZT$MPf>gzPi@LHJlu^zka_1untDj(cJoVCnCnp=k$g`Y3Q zb{0}@Ypt_RS}S0_^bNSeNT6Yk0ToFD$8W)eDLgb9dVAeyOR^DrZ9c~!Dw0MFSF5DL zQ=e!^HllQNr3|y;&}JAXCjps@bV8D(L3c>Shhcxbz82b)QTIXma~NO`$eKh+k}O1i ziaX&t+C`J>{D_mv4+koBjD|6WW>1;Y|J}eG(C`3cT+Sqix~^6h2V|9jeFMs?u|)Vr zs7X4~iE!oy6-g4-7&DO3Fitu;(OMh^((0iJjIn;0XK(3LQzfV3p(L>}520RZK+y|9T|asCZ$ z6X5}aa{k+O{~?N8F{UmA0GUyyMW`}H{8@h;b9wvqwBeM`>q<> zmHo?klbeht`IuIx_!1D~Iw60Uy1@4$F5yZqa0aAZ! zt+m=Bl(p8{M4MIS71BKoq9L6onHK{NX~mK0ZY6+Xmv(hBsw-RNE_28*Tm57a;(z0_ zH~sD>q1-b7Ed9DW)1odnat;Cj-bSDNm&?+M5^7hFDtm31w9r3W1@sEo72}^=2S!o0 z=r2v?O54|ZsM`x5Dsw&aG1TiGw7!2_3SjdibOiv&qOCzDgh?r55Q-kL5umwIBizH( zkz`@hGbc%^%vF*@bw%MkY0|37WdyR;=7c)J7#F!V3FSyygN%O-1Q;U>nMRo+hM0A@ zyt*?y2nS~7XF}&I-3t}oU{}Pt&NS&Hm-yll!&J#OCapSa40FR+-*)gR$s>OzrX}Q} z9$UF_K~hm4L9Y|KdbGs{cf?EYudLM|@ajUoMQeN``Z%k-Pn7?rKN4=OHqx0 z2GGYu_nbx;Ad52I3N2P&o@aS$GdJp~z5QB^eHQIMiV(dFvsHIWZP~u-LgLcCnrizp zj;c+IyUBVUk#0jNKS=@YdkB9r0I;X{7G<>Wi`9b4-3fE>SbsROe$R`PuGLp`-@YGjGdJVi7^u4 zOfENslds-aI#1m6N9R(HCv;DjclwfVaTUX{(Z8HS$cVIL&$EIV>Ra}q!+hI zTYe3n<2nGNE0O~Tb_W%F@0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000Q$Nkl?RDZh z5Qg8m=QhACfh~b8fs{Z>ASFNvq=ck|q=ZlclmI0pCCvSy5f&iXvNZxod{V<07+OBl48SX#rkTe~ zI$;jeM#e}{6DDTf1NfBBtJHBYVKPQau`m(Q6u=PxnE74)pVCefX8tKXr(p~c4b3zM zun#`J%D-pYNrcO^k}+B|gz3z5tI0G~EL2w1k_?HGjz%HANW^M6_e(zct@40ldk_|IExY z#!P3;RFma!BG68I6C`8ov=$~JS`yI?z!!iS5$!|+rSNG+hB0bX5?u|$u*HFff1!p6 zlVK=f!ekgqm@pZJ5++QBp+v1P5z(B8_y#4ln9xW-M3aUo3FF4phQ?*XlpTPn{ArEu zX+bl%jaU4pDj`Q^{?oDEUkMRy;Ii^xWO7`i&Kasq{|VfL``RYlGhyc10{8Hh!xA9fG=NrS<-nBK`L*fBkk)s&grIE`z^)0odI8dWTZr2AYrL_nDP!f`?wU zbA!6=rnT#{a3ES1*5?PzRpQi`J92qVjxre3i4VX($lU^pV;d646SYPTEP# zbZ-fygz49rcO`VqfOx^V|1?o*PcIPBf`|@q58IrGzKCchMNPZ*%$Zj56!=d5xFcWh zF6HsUWb;fp6od?ys6w;J*!#T;oNxDyU>*z3=i8wQFHi5?&W3B4e@I)SA!<0^#@~yq zc_+Dk2Jn{nKAc~i-@6a)T~JLEBtzq+C-?|Dd{t6cPaW`v#5_ze7^qBo-rz>o&cg-Q z+BolYDSU9D@yp_cjqh;1p&)CN;%75Qm`Y!E_97QPh4Y`boHiM5iiFvhaQjcxrQ2k` zoJ}~gGp%ky;439Jf36W;QJHQlRHk2y&=>m4k#r#<`ar|Rp?&ocGw+Eg`dXrn+~k=o z5+-K;A);qUnh~7;^c1@}cfk8XsfWrxP*)utd5K#XHQOU&06 z3T8}`=~nA2MUKz%olu$QIsQ`Zx%=v)p%rA9c`ECf_&nWc2>4MoI`T?bc#39oB&oeh zVCFr$*>x4I6x5p=+4IrYRJ}fA{+@B}Ui#<}DSkmTa8mgbxEtT}fZPHplPPjQx z(@HCOxSj75Yu^%XV0>@7?jHMS4i{0>s&CEdBwjU&g-KS)E&vQA@BmaolzL!uMpN|> zH<%!v5z#)S#S65Or%5~QkDWajr^m2B#PUCDW8M4g|hE!@K%(@xQAk~U5OJZBD!<}Za5L^oz| znFWKJtd;id5JX;3WxD%CUbWFDC}&4pwB-O`mpCq5MXOb=B74$?P4L-A@Uj;gYWLBQ z3#tg{e<5|fT`TtKID-v`2Eya_MSp`Esgqd|!Eb$tIr_i{$1Pg4XXbxXcYZjnq$xKeGIW+X$ zw|3uk>V9C24Of$2$ltytB(5nE)=6 zq)k0q$a%X44|?gNhoTb#=0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPy?-_V z9k|Q~!;t+VTwpU>;4A^)psSP}u{KbEJb`qd&MB=An~BoeKx|)pwViHxf^+6~OtHE8)kr(HxuQwj1v*5=-7*KhE!?5re$DFdG7oVxq^0)uvJ`u!$Rs1DO0!A~!WHd(^J zQkY?s&XBxFy2pi{0M5%7qq*Z*a;hO}0_8M5WXhN82FMxqcHtV7-&wWOI-<-OWC;Vn z1LYLpZj;k^>3-vo0}H(*Wi?SNIAVb#2B&|Tk#YoF<-WelDB>7J0V1LVI4*g$4@J}6 zaBeVfO6eu6H2{}VN-4%S6(Q<~4kpudY_`K^a&0nsyINBgqRUX+f!oy+IG=yRmVQdA zK-RsiftmrpuP;T$1&Q-i;LIcgHth6c_vf27d_dYwM*x7WY{629F&n$*{yNKf4FG@e zv@k{gI_pR{HgkgRC{m0Sc00VB&?O?h+vJE{UDdrP?={}O+^6K?HoiM9XbC1U4FHY{ z)}iXw)EI9QI;wd=Q`HQ^n(ZQ4iPU$;1ue%m{Az7-^RmfeqFs&>=1qnfq>BfmMa z1?QQh+a0dEjZ*&9GV~gvi{~gOhqJ!>akq&@=<;x0V7Ic=62Shd+hjaFWX@!o z$OT%lP|s~DWO`2hJQ|3uV{jI#>D2Ydqe@OhHP4k85Mbc2fJh^?#G%4 zdH~&R)Xt7i5mr~F0h(!MYz2&wYThOGIRIGm|8IhwZVr_Q(+Asac$0tZ9PD=4!|`Nq zxYphRfXSfa-H+5%viDt@ZUKP5^77Nz_p$lA#r<6TvH4tV0NCI8nq~F<|K{>Mwg5~y zb1p5k(MxN&AAzeeO*6i$))e%%*E(1CBee}+X7Yd)Vv7T`Sl>Sk#IecvQDgv+g}-}< z6tO-ZU-FD^7Q0k%SXWmR*c?%s$U$wL*a(#D)px0H!?rK3=rZUKYoxeAffShmMw|Ys zasZDlG#AzgK(6$6wnJ>M6<3PVYJ77tiBL{Q4GJ0x0000DNk~Le0001S0000V2nGNE0MLLU`Tzg`0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000AONklB}EEOB1= z5)jF|E^rDk?^*&Msv7hXRW0q$r?J)*^F$xCyp6Sx8-Z6$*(l|hDie`Wj+-w^G|u;n zjVbXSX%x~K$b0E^l!&7Xa8w$zIIqNe%M-gA@1W^M3?U_Y>)C|{*m>y}*G4P%e~wXN zhqH=}QK`4Kg@|keV@}qksxd{!Xyh0R2vT4MwC_7UfOSLqbTg=z-Kuo)5Gt!#^`Ic` zsTt0jPmvtpBixe2+$RK8Ek)$9@Av>F!6Y#ymJM~$M!L0eYb)1*ON!T*E%R*t;B)U8 z^)u0Pc+f&?=V2&+tm0%4{gyT(e-(8ldIiP2(5D_R2_1|^kG&I&V!*LhRBYotMK%Tl z79izZ7|2BC9xV6jLCqy;x!)+Mg-2395l$_s4CjSyiuo2VGzEqt=DzcFjZVF1wJFIT zC8MxVU5QPWw!+bDN|5p`=b?Fy3^`}V=f8=_2MtNTu@JcW>K7$i^qvjLe^B)^F&5CQ zaP;^mv70~T^Y8^gL}CT*MOCf}Q}6*eRHFCG5okyrfK8w=yzJ1>RAApC_jK*%ZqJ5o zhATLHc|ZH#A@=S#Hd7KBy(a%^vIiiK$^`}%HfV|KiS20N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP_2=n7zp+)(vo-Gyo8a`W`zW0RRg9 ziOUVRqb{N(^-%dq#_^05`pj}gthFiqWAWmd`WYny32V~xFEMXXheJe&;^cxE(9z>FZ&ZF&s$}0m7lI%XR}fyIm;B@ARUGzYe-KLoMda&u*R&{nC2yUReMfK&lxQq zB)P5t3vwQYZHQT}=eD`VA|F=U;oOYF8=3!hc;OGWG96e;yB?zcFpAadq;!2i_yOSJ d2NvK?e*oix6!Y(F6@&l)002ovPDHLkV1k|YW-I^z diff --git a/doc/html/form_26.png b/doc/html/form_26.png index 08cd9624ac7f81df0d29ea5c31689cb6d0a627ea..6acd3f7c3eb3f12c57ec568aad648854c2d3cda3 100644 GIT binary patch delta 553 zcmV+^0@nTc6xIYliBL{Q4GJ0x0000DNk~Le0000e0000P2nGNE07KYpWdHyG0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0005KNkluuXW z5QM)8(g0gv3v7WdK`qcFxCN#JsRfrnl^~WNl^~U{`N2JyVeTc{ij6F=5O_B{%syt1 zl9}ECAE_JN0EtH6+uZmNoU{%=p{{(I`{FR49zU-z#g~)-D<4?PQV#3 zf1oX$^Ird%BQI$W48XIQ&8whpk`7M(VrG}fyU|uKv*SIOBtc0#CpVkfArr@OyCA6n zdX`KNzzsO8@imyhHdWeCz9CckAzmml)!{ar2{P}>m}2l5AQ!S%Z`~7Fl}y+Jup!o9YqnXFi|1a+$2xHDCxvf z@(atz*%iz3N&N?zo5WT1yj}O}uXOOo=iiD*wet_>Uvdsg>Lm?{ctUw==HL90U-=i! zpc63nZnM|0e0E)9QL`w2T4l!kdCXw0TTE8Pz(_<{9&Pyk>r#h3!sP@)>cc2$cx&EJ rjwA4^Sdve+KL~zD`@jCxeTDr70qIH^5c~~}00000NkvXXu0mjf&3O03 delta 2652 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 KMNUMnLSTXh;q$5h diff --git a/doc/html/form_260.png b/doc/html/form_260.png index 32e8ef0115173e0bc9c499c060a266f20a13ebab..88f62f5fc7a9e8039b6bd85e8b99ea1226b03981 100644 GIT binary patch delta 1063 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 diff --git a/doc/html/form_261.png b/doc/html/form_261.png index f65eeb551251759aedaa14d5689d37e41115f094..5704b9ebb5ff09c994267910ee9a094714fa2ff8 100644 GIT binary patch delta 1406 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 delta 2670 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 delta 2988 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 iw@0D;KSs(+N%{xbdPpu1>W_#30000z+ z423`SxG zfb|%V&1-y#_Gx?o@_7nrP@u@zd$YF><%C1J-4!6qM{^=dZL^ySE7yX+m%-a}i{wBY zNtv-nkjn&ER;gko|a}<5ZHvC^9WDbM`j)C49~`2YqLr))y+H2Y#cc zgeK?hTg9l_dX7`_-it-dAUjechJ(r^>&z}y$xZvKfOQvtG zX;xFEB=nf&SScbcp*+us>Gp}KVinV46=YJ_ywKz)=qVr)FcpBR=1Ts#Ag+~v@wfd4 X>vb0ELJ%zf00000NkvXXu0mjf|6%Dk delta 2622 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 diff --git a/doc/html/form_28.png b/doc/html/form_28.png index 3ee5dc68f0cdd1e17327bf10102b669bcc0c558d..98d44a592d9c71fd36ea92992a3a70ff6923322d 100644 GIT binary patch delta 743 zcmVBVErAwD3EmP&33dri2~G)d37Zl^3F{VI!rKo?SjNc2W57$onbCkPp%ItI z)sv8!u`nJ#9zB4s&LZ%gNLovJOV$6Jaxh;7NjXpgD}Q`XwOu0k1|*e|4A=oVaOk^c ze~I85Ftc|+;kTr1-!)4FkIW+Q$aD%UDVJ1SsVlwFFZ6KX!I7`zk}}}8nH?pqfC{L6 zeJSYxJe%2Zn&HlmGl3vJnu1PLLZ|YSJlimTEh_1L?pnwyyYm!V_$;=4*F?n)t#>~zNumub# z+jUW!9d4Oi;XJWOw0rY?{q^T-f80{Mv)}){;DXOSQMTb4wZAI+h|Hs-kZb?|002ovPDHLkV1mMiTm=9C delta 2725 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 diff --git a/doc/html/form_29.png b/doc/html/form_29.png index 7c725d6b40b2601939be31d5d46634879d9cc45d..26c1b76b6aa05a11b28c8708fccb8b59f9f46e9c 100644 GIT binary patch delta 890 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 diff --git a/doc/html/form_3.png b/doc/html/form_3.png index 167ff1ece58d52391f554b7ac1ec77238bd87e72..fa8deaf789210867e0d54f120884da7e7d9b534f 100644 GIT binary patch delta 920 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 diff --git a/doc/html/form_30.png b/doc/html/form_30.png index 1b4423353225e09b881d731fb5b4cb45ed9f7b4d..d043d772328ff961d7c5cfc2287b58a4fc5000f3 100644 GIT binary patch delta 1290 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 diff --git a/doc/html/form_31.png b/doc/html/form_31.png index 589677e42bbfccbe16be4b3cdb1efc12dac11548..bd0f94390ded3a7852211748513145accbaaaa4e 100644 GIT binary patch literal 8716 zcmZ{qbyQSQ*YJmip<`%}?v@ZK83yU@MoDQH5QY$>LrNGzxX~=l;-(F8(AX|GnuC)dGh4nd7^^TlCJQV+F zRa)RNV17TV()wnwvo;qWU`_PjCTibt*l1-#4`b#N0aa-9fIv|(qK85vOx~WKgPnYxFb5&%ePUWp}G0X}y2E8sG($BKnm zk(y+A36s310B$WzNS>puFjy8`;DPfFB7vv^C-0^i?<1_Ji2!N03DG2AyGzS%@J4&&fkJckSwCT4;TMo=B6O zDZ-n;j%lGn*+GpyO5=LdnG$Sx}?kqc!yRLI%y@FYVR+uy-%n z_T}q!{GMLMqTH7dDHSuI3NepCKpqAp%|qMfG}N0rgvlKKDGJ#NwdFgOFWa_t4@1su z(ioTdJuzis_eFTI9j9XN4J<}0W#=^DF&E=N)^Xl6$f5Z;H_Tz94DCEw=x$N8{5a3x zfVO(WD0mg?ZxQsM`mHdB?+|5jFyM}IL(5Tln#;Kk*heJ#>26#>9+#P+NWiO+-nCpE zrIt2Fk>fmiyF$YhiJX>E1tCqs%%MU_1}QNSjnfXRAa|;3BC_}OIZ!nK=O}q*+<@r7 zyi_+YTYQz=!-P=o$6UheHj9choXI8u=Q1`;W{uxj8hoBUy#FCb_eYnF(HFHWQKhItCz~=m#-9+w93k|R{D-zV+>zI9M&kr ze%pA;6GZuCBm4Ttre`HW^CwEh{Huk=gWv907T7fG{cy(Um=n7tLP`lZ;*t2YKwHEm zdS`8~l7`(%NE}#LUO@$k#U|FUNBc0{CisK&F<_8Rmcz%=?~)S6wKHi#6yY9>aeuTH z?uoi5B#nwmdS&Up;?Fi|6AzU|-yqTx_|?5M^W%u-prU2vV%Q)c%3;EK_@cv;-r#;{ zhDXqC2;&?j*Da!_2R3k3x-4*kOlz8AWJ$~zhS9sN)%@ZH2tZOczE~fnNgrIT03DsV z8a2lJLLF{oYYER8JlqI$tQKKe9Xn}q@iJXw$<#LSEsylSRUnCRyr!dQf)MXjBzcGd zj_N*odZ~NsHnk@E3r&q5CMhk=9>|=??HmC0F$CrF-U&S9Ws?nw;p+v{XWZ>|(xK-Z zF2|TYTMH@>*%c^Of~!931e*f|H*l9d^MqvDFGTRS|LF)8jD@oo+M8EQO<_DlOPrtH80=ql=5Vkh8m8Gw5W?9{!!6G6%x!M;wqH*BH=ixfIK83+IBf_ z2e$Z$fA%94ON$dl1@S+N2x_QIrAs^c>`l-9;dYu%BJOmzlTLh^7XL;TT_^zFPC#f> z51F@%TIGRK;1=PX|ER!=&^`BTdL(m3&29-8Et~BQAUHU9MY0eO(ZO>J&Jo4*nD-17 ze?|RoY0E_i3H6YWsA1a1j9{U+UGuVn~&G-GCQZ2<^J?ur~>>8++X+hj)UP^ z9n!gqHQ=7AKLf)KwRbezS}4oSV|eO#23inQWOja?H?n&8bzdxV`%SaPCRsV+lJF5C z#p}^N+K8gZ|Hnz*_X!&52`>wBkuT)Xm zT4=kI32o`Tiym+oajIPf4L_ra0m8nF1(!dv7g3N$IIU;!`q{nQ$!-I3eyf>Zxz{5^F`qfXNr> zs<>Xf*52yQli-Y9>&R&{#seezw=1m|=-2@Yx~os;_%FR&H~8@D#xu)>?CWQI_{u4L ztv=n4oUxK#zNI?5vxmowd_EiZyK-nbs0>c-8 z0NMSkk25?G7y^TX=k#5M)J!nOf14%DyY#4lE-rhFkAT(mlw%fW+_JFrx17OBi$}^N zNfK+W^q^>Y5`2r9dX=TO#U~KoL`{WOpgoU_VqsFadgahn?X~4jKt;?b4q#2HKjr;9 zja>T32bY9-Cu9cm79b|6B@uJkpYzJXv#16=f3Jalm6D-eGjXM{;Fp|2^ZQ+>JR9rX0TJ)H&cXLKRz+HOT zi3Hv}O%r0C0einueX~Y?`NE=P)#<$O9KojZmG`eE-^$nzBet%W#krA>{MhXY9yR;= zbc9~Z9>Oc5Kd@-??yD%^|IAN**dSp1*!l{&pWXpG9{cUNeLod{>si$rW0E5(k-eEq*7^C`;k&LvhQ{AGs_`u1Ob!&kCyYs5qqAQ?uAtL5{v(3ZDG zB9yzCPrC7cD%yw;E4bz20)JiPKaK3 zra9g^*bxK^N-&xh&)_&p7UW3F>2oO`V&ePT*li7+WhUJyVTYSP{gvQZ51e6ci40t1 z#J0`YK9y#lZWWC69m`@JnF!*T_st(NhH~X#7`*z49uj@?>*aSMI5u4ydzjIwU-4#O zF>av}=BoPKy8}QlwgmR%Lkw&?(h@f5E ziLz8-CW{^19$$N8YdrK|QIZp|w30Xc>Z=b=W!fjfV}c0Fu<&~OE;Du-IxZ~|EfprY zCtGJ%PG;jRf9j$zTjQdPxF*S_3ee|bp8tn{Y31oh~P{DLT zWbuqOZlB^Cz7P#HvbESFj0Na4Ao0B?;(qLdhMuzo0#Qg1g1+X+fFL$uC} zxx31VRBfi^$9^*i{K7$kKB{jx=;OX;n?1MVO(MFY(#o5v4r-sQi(CrQnZteZ+r_FsNu%LksPH*&G{*cENYqOjNNX7|F0|(aMzDMQB0G1-i_QX~kBDB(U|zHS zQcZ`4fBJi&Q|Ag?Td^Y79*Oc=VNe%tlSL(jWEa&CI*AD`{&NTAj6f^J!@|Jma39+u8+#zdLmD0 z=&%kIx2~<<@CLnpy!^NTT2jkRHp74G#yXbIDDmomZ(f{U4}Lr6%j+h`<3D|JIVhua zWl{or>ZwjCESzYeX0E!}%u%%M*@<@3411T>@4lzI2i5yZO`G}S(d}tDW2{(UNg6mV z$y{PH#-z9!Vn!E;cEQP_C$S)uq=^S6I7Y%m&qSl)GCRIXSTpy19SnXIvcm^i9Js&Y z#wcydHYlgQG)K08bIkoS2kTT-cYL#Ji$#>6X=Tt^z3;dC0wDLkqpn86kERBdlS#F6 zJu8enR&-6}2P=6g3OPYZ*W+9BRZIA%Lugnt2+0-@shYQ@C3JyZsUR&KjgWob(4=Rm z+2`%IuHCuq%7B5`X%K!^LPY9@zu2MTOg_S=JkCe;l^(V~=n2jmnnLd6H)+KW9(AED zn(GmdX9=}mdDVutiSC*dgbMv#U)MbFs<7)EF(d9#Pc^gaJ9H`P{vpL zOgH?)BUu&?IRk0&is3C@4(1p)G6^}yeOy_`dT?SOB`kXB~kA5 za6d%5#_uOjUZU~FAWu^&jFaPQGmKcx2u^nPS+txvJ&Hd-cKQfm@LK*Zk_x*kgm+l; z;1spxL2M~|74Lt~{(4NAyd1jcWr%KC-ql8+u+TCOEQA9I+WstGF zYLMWyi(DZ%nTI}uz0k-gSJRNQZol}&Qdn|y)k#yB5k~_YGC~K>nJkOOZ{nzmKRGQx zf0jP@6{a#`0+tskSqd!o?tPDMM*a&!k>CGjfFe(Mm zfXrt`0@_n1iJe6TdU^fs9(`&0C*paDwB;igN&326y%Mf_zadx$ts;jIt^tq%VkZ^@ zo8;=dgx6w+KVB`@{*-Ad=gC+|)-K;x5_iX=+Hl9Mg>=&#*&O%mNhNrJ_DaIyM}vra zp8hl8SGIM;A1Ry3pcrBG4RkZ+2PbJzQt^T&P^t&nJU?$xYgq(^nopscM5Fd{PH=9liSOBs51@!G}WWDMrxphbXh77g?uiOS{CU~)wu#{YU77{ElODT2!+i+YOl#;M^Xq#w&;pw z8+}>!gXC$S9a8D>Y}Qgw8-GZx{?luOSM9Y3apYq$aN1oCGdSdyGBi0K7YZzjQ(Wwm z>T@>2D4#SRkZhq!79_ol+$>xv%;xvbl0T6gc&}}-u`tH0Q}>SNhu5pQS^HnX1tPUj z1id`@$HHY0Tl1S%bwL`^OVZ?+;X^tPqB339ep0|OPrbf!U(ICC3Xytpp(*%=eG??uP)zOBwaiTnb3qx;Pd2m%^#Y!0N(5mZuDlkN!7;>Qo^A8{{o zC^&si!Nd8%#4XX5hp+*Kzn+;G9k^!GHyVcy+0}`(zq!9EmK9}P~W2?k$DJY z8rhou2VD^aZ2bh2OI3dj`?D||-Cvc)X&(MIXjfcP9Vm<6B7C>Wzu@#I;ozgKOU`tV zFOs3x7wHl!8*xOqJEJStd-sOzWU1lF)nqPp0U#aJUCsM?2WBAe!NBW~<#n^aPK}$c z$L6;Z3fnNY&dgawE)lyg8*0mwS5>R{iy&;l5;}&?nO=`Nh6gt#ZEIejzq4 zxy|j-S#&KGsJUbgaho1>C>cLR$UnmjGe=$ZpdpkXUlwh1Tmfx8J}Ti;o~i zl_ps6z~3**T7`skW~KAP+!T`s(%@2_*KhTAW2nJ#c2^QqaNj^>5VU^EC{7ICepL<@ z4MtQ>N4wA31zE+0Uu?Itq<{HiMd)YdFL+7K=AY%@rk#tYFy>Q{{(LKBgJiQPiDRp@ z)2~@FnIKE4b(yE8I!vDMYw+sKZl! zwO#B2y)$$ARd@^s=Co=~y%{1k#@LYx6~E(z#4A1eaM&7ZB;bFZ(V{Y<;7Q5E!mMC; z*U0B4rMRQ~vlLj$*UR^I(^8Y0dv0JhR5ye8V~%WPi8WWbNPQ?VOr7LrFznMp zz@FtybMbi|wc_0)GI4L`Q7q|v+GDGup$YKfl0J`V2$Y=JHX2o|+h_LX2bmt%NGvru zlPcD4iW1fz>G?a_A+xi5?<$0ZTSF&O5fCFHnAzwd>E9}pGK7OekFGC?8s&MBu#D%=)t zj>kCjIz98y1{iUBF^jNbN3E-0KwN{q1FO+qYK}TaPEeT=WAChy-^zG2gNoG%1)rTL zcwNH4Sj#14@=h}HVBB|hLDcqTkmzqBwW*8k~m zV&L&v%H$f(eCx>d<2J@4{7#G`i-uaC`I)jrqfP&%k!s)lnay;I;WhVlS@m0)AS=O6 z+OC?t{VTev;gT^0rt~WOW||%Gl+Iv5tHt(ESkq}M_Y1z)a-72-63-@lZme?Y;d=!h zNY}~tLJ^y^n8GjYER`e7rPfG}y8_*_jWKfYS@OJbv8|XaOLXw<{AmI*&H@YF6fgrFd2Oc{ojT^XT zTx_YFD6V!l$0CV?LGJw zaz{0E_^iUrMSC}RdX$<2>Z+1~-BEM&o}OWb6*VbOn_+`b5VtaWqj0a9As%-hNy_U$ zV6b3I!3tlJCCd|D{opmzB#Aq$P;+NHW%7hBpUa$*^rHf4RuE&t5f~v(;gNF~NOWNy zN+`e_dzQ12!n4$eonH42YXTuy%Qf(k7UQDYKX3a~b@a#3Yn3sZnAe0j>wlhL)qWvh zsZCD8O)J8eu5HJ;5F0U7GnX0Di2(DfOO!A)?eUIV-Q(#w72=n)iGnioKeM|3uCKu1 zY?Atet7R;rE_RFubIo|lB)eTfv$bG3{FY<7a zcYLn8#`iJi{++;Vs`F>CrkC!x;zhpUA7696H6_2p*-}K9$;O)o#VXAiM>6@XaJJ!- zoUyH<#;7mx!<)k3T#yCE^bvNhh{E%On;PdoQ_^?61st~dm<_^5rh9W!jlM7ej@V7!(4?MaR9+k z%}@L6MUG_lkVmAKPCQFrtX-HZEW+ZkZrlT=@!V-Ic#V>LXw zGE3TqU>|=KaPdSq#f}hIX4ZdRj>={Wy`BRjm{_{B3#KLek4tXBf;2F0beJ_k*Ymq* zWt~^9D}Ms*3vMvN6g zLmM%@p6aTr&3i_+q&FV@Y;tn;U4Esas_|qG={n!!pbnZqfv`ku$dc9Ib=7-0(sgh8 zzZ5dn9^%vYa_tTkJJ%mbz#pE)Yveht%*H6^a!S!T<&5@ZZEd{5vV12*5s}pF$K8`e z6WTbobT2ZWX>h^D!W$IS!%H4;F%FkEcFH+C3mo|@ha*oyclDV5jfnsE`-`a4S)X9J>^R*yp%Dl39N{$aj*!++etCWWxgCzD41Tf{5Ya79{{YH zQWa+7-KS+=l*j2L_C!kmM{| zl{}?qR$w_>u#=%6j*2WH;CNxU*l2~J=P|c(@L}Zzdf>c`4%MPWyNC|OP_OCM0|4AA z-pw8>R1~2=4u(qu;6r^xaAtNHInU@Hnd*1FGF>g7oQxytdn>(6ek~JNeplP=yINmj zMUDWm*G&fJR&fTDUuzW!hZI5~9W>!_;U`rbw5_KYGQl+BlvAmdMn) zp8w?(wRL)*pNaw~I-fF2Hf#@8w>E?YO1{ZG4vLN4Jm1jvlEh=CD%Vc3H7%z;G4Ks` z)fZG9$TMDn1;nD*opZVF3+O(DWyQsa9+7cQLQ;Pi5Nn69Ntux29t*4f%iPO5NQ)G6 z_@u(tjZ6ly{J;+sxNDcDEod%=>T@oQ2$>tefJMxJUmno{)0CtQQ7r>BXJU4y8q$INpt_9Oen}T z`H$^BVC!P>|3T%{TW8xS0RV_LX%7~91S%u>PW=|y3It!v6_~>)UbHJNbs=^1JyTy!x6&1=W zuCizsd)Wa$lhplDVdr8S(cT@sd-}M6%CSEWl|)AKdEi;x`rFx|=RefpuK<}ono`{=*A-$aC6U6tJd($KVsdSi+Og@^cDij)YrLfJEBXL4bAE@@+9002mdot1es)cqdEzrWva_Qf(Y#?DyBk~Pa9%NW~OvahLV>|2ao zN=Yh|l4L892t}JEZIV(EQD}cg9-%y?MJkm?-Fwcx=ibw~=iJvhpYwkG@%^0hIq!eI z0N^XZGO!2$v2jU!dk?n1pML-Y{2Rf%#CW!wn=|+=pGE=nGw*Bt{>^VehlD2bma}Vl zHuK{7NdQ1r%dVE16#vsBmYudC`j=<^^k^>+&a&?V07v@g?oX81{G`aR&@_hU#;~N+ zV16hg(Vici&fs!53^)G9u*jIu|Kqy0B1ad$Lr~xgY4~&5sumZNg5x4>`;1AXT9*6+3 zfDckZCfEjYK|a_A4uWz}1!_S9Xa;9NJGca{ft#QY+yf)v2@rru@EXj4Phb&(AS^_N zsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu*Pz?b5cCKd zhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w;1O5=zlP@# zfDjQnqJU^2EQEu&A^}Jk!bi3sc}NLTgES+ZNH2095g@b37Ze6XMKMrXC^M7;${WQ) zC7`yT3Q*;!6R0*+59&T@95sjffhMD6(3)sdG#BlM4o9b=bI~Q}I&>@g26_ZNiT;Ga zVCWbo#u(#(@yA4AHem`dhcPXfF3b>S0yB@rVkNPfSaYl^HW-_P&Bc~sPhziPhq05` z&p0AZ9;c79!v)~taM`#LTqEuZZWuR(Tf~dtRq&>GS9}OQ9bbsA#dqQd@ss#Pf+&GW zFei8sq6pgvrG#d}4Z>5x2O^QENHih36C;URiKWET#9PF1;ujKyq(S140!hiFy`*|l z7wHk{1DQ-#C0mgL$VueAUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83ah^2{Dh+P&F&=I;S zolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyUG9+y!qb2uCwo5*f zLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3)9(=RhGD<^9&8!uZXdtG)` zjxJ{<7bRCLcSUYSo+@u4A1Plfe^ve!LyW;@#4t)3J&ZX883hN0WQA&l0fj|HrlPlE zwqlFoGbMr&ODRmLSgBiSPFY^rMLAQsN%^q~UWKI+p>jy2S7kw!sp_k`Q?*@nnkm8L zGBcP>%%^H(HA}SwwHmbt>KJvFdbIjs^?MqyhM`7;Muo$t#NI-wzGD&cDwc)9c7&Wo&7q!IzMy`bz^jEb)V=_^c?lF^*Z(5 z>uc!q^eglqtR%0rTbZ@8W92&oO@mN_BL)u*sfI3wI}N)HzZ)4F@r{~|W{j1MgN!SU z$5=F$8>@hI%LHv=ZIWej$>fWvk!h0YS<|;>T4vE^jb_uUn5#lp)vlT_S2PbcuQnH0 zFf4*Bj#>yT6)b}-Yb;+_DOrVB)mcrk)!9+(lk7Lvy4HN_R_g_hDQ7dM%LcKrx5={^ zu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk z&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou=cQ^M6_m>`e9+@7!o>b5E zo{gTLysW(ny`Ffhc_({!`w064`ZV|~_}cgu`3n4W{5Jdb`Ahjn`ga6i1AGGN0_NA) zt~t17GSDzEH*j<!!^q8y^Cq86fEqwAxW zVtiv-VsWuSu@~YfanW%-8|5~pZ5)c%jL(f1B$y@~Oqk<4@#_+y#I=bXNwnn;sy|sR zc}MbiibYCA%I8#{)N^T~X>n=&=^E*~)2A}*GLCOTZQ^a}&Q!?UmN~wey}5b|v}MDV z?kuIOoUF;M_FGSEBW#P_b~jr$yD0nPcHixtIkGuhb0&7!?`X;u%H`*d?KIn2wF|W? za@WA_mAlJ!|Huo;yOXb*Uy}c=fLCy5kKUfrJxhDT_6`&p6&~4#*%!BObid{P6Gfs$ z8ATHZTn@AqGm7(yKOS6v@OFtoN!203q2xn?Qs>f+GUc*;W#7sp%10`!D_SaLDtA{d z91b}=e8lQVbCqmWe%05bkw+g^+gG>MsMeGm!yHRF_OjNew)Z&ectf33U4Gs7`nY<* z36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdfx8$D&r;|^=Iumqe^sLj_?sKej z&F59lSGH1H^V*=c^tQS7h;~7Tf5*@T#|zz^W}U4UwJ+9RQn*xcS?qG*6~dLAD@#{1 zuFiMGcgs`aUtpi2_ZG*;x9rsM`bq=i>x-x7zeC@u?{hJTC5Bf${j|`1^k3Jj=91}bY zc{u$j=Fz*yDUTPQY<-G;n)giPS;=#m=QV$*|Is2a5?mg)8Sj7L`Qph0Z{qcziGO~Z z%y~(ESu!O*)iA9;eQCyS=H9C{uO?r|zh0cp{Y&(($~S6n&cC&K+dtWgo{00009a7bBm001F4001F40Y#QEU;qFBAaq4obW?9;ba!ELWdKJ|Odv;S zZ*z2WV{&P5bRaP>E-*7LF~Xg`z5oCdl1W5CRCt{2ovnhqzM99s|FdIO<|kKXfWI&r{(g1vd@^kO2B#DNA!N3>7YEO;qKW{3 z9sxkY>kgjZjFPo|trNBz9rog|I!aGgY|rCSpck~_arY`ylJ3S^ChvDx8J&D*ukORI zAo)(z`BuF+=k>Xo+wnL0%kIg@-!c`@PaS z@FYpLqWh2SW1XB^h^t|IMx=}3aW4*Q!V|>ht2^I->pz$-50)^B`<7BrHZgK|aaaxY4Yq&8_q6IB z`#md-n$99~cVWhp778p{^3>*d?!?|Jy&4LWkeHj`?ebqgV6*(aeOP;jl6JD^}^qZv*CL!mQ z$LAu1)U-+1C%cf&j%3wYAf!CCOJp<#pevG|Xml-pb@*J0lf&s12%gt_8aB%UDZ|;t zt7v6d^ON0Q@}%8`7l)5UU8-X~4^aWgX{!&jIGJgqM7vkY&Iof}Qh~C5sKL!|mOhpw zdU9m>sq%IW(QqbD|A?t_z`M;4DFC1n@zQ`N!NWZ#9t`_LCgR8#0HL~RpTyb36`-rm0g(eh5k1xU=*8iu!7G5q?MPEXRgJ!^ zgdV!B`9M(>g^FXQs%^eKH-#^v!>APDqAyE{c5@~)rx5_DqM7}U+?KWn0dHK$nN$do zGXUJ}UZ|1K{F#fK@vKA&q>uR?_rEwd<`|>w{x1+np#@(x3d*S)a4cG_n`AIxJ&W@+LP@_KG$2)JjSEYXz94SCbYSZLpXLl#TU=|fl z{SLk1`*uejMAI$Ig=DG(Ko-4Tm9=#0d(=J(bCR!$EJ|i>o3c0Q9){L`PHJZqTQxFF0njo4v~*@-)yLl|g>GaEAm{=_Ibs0IZtgxS-+nPi z+MYpbMgU|5B!J!kOh>WYI(TiMqF)_;7P*N4Ky`C}GZ8BdV5lNHd!@`h6vu$xia#HL4RW)&Q7+l`11eF(uiy1#frZKY*+yGA^BV9_QQZzyGv=dsDh>L=;u7;rQl#XVM#|ncG5U0GImMj1epa=p0LPSz( zHNOoaSkla2!<&nPQZt6P?#;z4z!g}0iVUrxvrYNToj^it73y}I&VVi;sN!RBus1M@ z@U7|qV50&Qy`EtQClx@+Dj`udCu_8o%I>>H;T6tyt+#cF0F8-@(FF}zzgdpom8$dw z=_KlL@-9Oz!*QKK9d1Gi0DSYf^vkobv>pjxm14#Xus(XjazHjSeXH5#05InQ27sU+ z1c*D{<@08Y+qr79(D?Z+>j017!bDgcD#MS_*IIgwxh zuM|`p`PLvayQO2oI=D!keaDnZrOP(?SPvIgQWxJbR1g95kcA8)s0l!HLZDhx6)h7g zcJ^bf>L6qaxQcYsCzb<93!z00QYQ*fw8jkb&2)z=Lii5E24C%w8)H%|gj=Q29Z^&k z8W_`ugZ1R7jWOkkP_#JOn_~*%Mw`{Z&K{o$1gp`#nSvhXzBO>~RqFO?4>r?&8clX6 z0|X0wUXD#mFaC|n_-IUf?|1#>8e@)in%4cVb(~&cy`Q{14Bj;d=k>9@w4nK-U^cFA zpO?)k_w`a-UPKoTEUio zvJ0&&;r1_eB_Gq_koU*w{Fohx1986L$Y#SZQw*a&YXoV$rZ}W5O;anU zAnkmU-Z}#7YopE2io+g@clZ)6w=DJPB$Cr6<7BaIAn&)fN=N_+Edgv<3f2~wm6}!I zav@GYsPE?N464^B-3ZS)>z;G`0`r-x-Y2A<)ing3Y5JN31Vs6u7YZ8vw`DQ z61J@2{D)+36nhA_YUs_#OCQl5CyT)&y%pq<-s zaac~$I<7__u&F8m0C0BUk`o*cR$TkA&h}-+>=zE`?dX!D>>~e@O(nK7H^qvB4pk9` zVVF(kN5%2vNTx9?pR3!l0+*Dxn?v#yD&No){EqEXv)?3pV~&i@SX?@KMUu7Ix%(Ma zv7@}(wiFM{no$|&EWc7?qmKQvH8||a!WEL%EO5+;P3BFT_t@STQw9v6L8GSiigYx% zjV=M`jDo$UDm^7$)3|guM|S-fIjc$=b7Zq-@5}fCfP|L}AaT<8IGc@5;Jknn=A|S= z2ml(^8xH^j|0o@Xc*zYWt23rv8b;#{? z(&q9GQ;+LeGy5^Xyes1F&C-Kz(@(=*{{@>RW6UuETi*7c;tQxci=d5Cw3fy>lVca3 zBek`hOq;zvt%LJ&5M|jKo0=GSP%C3k8)yf~J$%`s`C=wjzDEV!^)( zvMaLW>00Y(i3}r>+*0VMR8*(|F6EDz8%z7E@pGlx{<}L^?nj&Jhj2jxFJ^c z*tVgaTGQ_I&FK~fY43G#I=ZyA4bJX)gF{%zOEhWE8t9C(`9OiQd;wj|f*ckr!En}} zq`znzKfP4>s;4nU4Vkel*|E4>ip@4TsaVTxqsSI*8kRiML&xjTU+K~b$oV@>>QIC? z{vz+ma%tqZLx=KKX}}ji&_zF3)uA1}ZWzB!CutqdMV|{kqhXBFI)cj<`L5P2wrr_R zt!+{vUvz1zZToap-QE>(#*Wn=Z^c2oV}7P=%Q;BBk=vVguWtjFfbQ&jCrTr~9hqDR zB0GoH6vmW|2_?4ipVk{korH$8d$Wn{&7I)s8ShVlya$xv?~C zVuA$^^RZtE+Kxq-CMvn&koLzJV4AF!R-zBlP10aYfEkgF#;HYh2lDRK_){+thc=_B zw{iBf&piRu_i|nwj^x$|?;M~o#vEf7#Pvz9gK^SH_Owi0|9ao7@5i-i9WAUImTYnA zw@uusYk;GZM8=7u7ki+?=THM!dH;uA5Yo6Zl- z%zCViF~`AldF)rL8u#R&1`C7ikjHU*dB?iGXJ0^YbCTGA*KC%IF~;oeOxtc5BIE7> zp3ix4p!YnoB(|jk&Uzgp-j&uFWwqF9CH<3)ZcOX2C(KAq0KH|~x&qCdfFY+(@{&BA ztD*hka%c8VQ0ZqDMq2@$ur4TTu{83Vq0~JVeEro`=BawG1Do|a1i^efZr7|zY;h@F z-4-$;8-t$YY(H07w`t-etubJxc<#GEZN}2iBvX=F=gDGeY)oMjUASaMW>S-KI$&gx8A0xOnab@JdU3Q><+Y zU1Rxr8aY(4*;!vyUm6*@Dh?+;_)6}I4Jslu5qSr8A{W0Szfg%8j&p9Zi5rK_#G)dkuBGw zlih9UQDg7+xU%lBi46;yc{Z`{#zeNvW?5p zTb>8f*1pu^0GfqTyMU4>q@6`KUyX=acc`;PF_zICwl3FAg4$#fyW-WAWnP@mRb# zcsv#_4jzxii-X5w@#5g|SiCrRJQgnw9*^aRhw%LlnwshFSWD`8G*4z;`U@l{L1j+(w6tk8eSY$gFa|7>!jd!=Qmw=7w)RU2mIxqHntky3ddi)!Fd6H zG&$b!aj#0RM+Cg_bDcjD-apRvCj9EK9{O9;cdcdmp?oW{zh_hFSBLc=CDcV_JUtJh zP?#yJeFgva-w*1EXUc#6Q~u*WJ~6}oP2qn>d|x8BUmez@jFIqHcjDK;6U28`+w!Z! zs{Gf#{_%hRV*mc?Zu|!H|71x2_s%czs`Sc;L`A*^)DzfNbooi+m-7E7^?NRjiL=ZA O0000k0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000DiNklJ)0#|}l0#|}l0+awHBqcxzp#&%aO4$2DtFuqYvH@e~czI?R21Syk zeOCJ=M^u$39uNOby?`g~gD0^Mif?^7iAVud_A>(xz?-U`?zOP53K7YGOjQpPJ--49 ze;f}xU>V~2&_R0A4gSeGQmd-2ksGU4G)ssK-ZYK6_@$r=Nhl*$^exf~7gmKdd8N z@<`h#u;8H*ku@!W!yTWU5%|UytVjfxs=CGb*}k|qP-{zfd;~oDY3zckE^$_*e*lgm zva%C02D(m;53Y8qI;8A&KoQ%gDO*XXC=q*|Q``Nb!_S;K^O61Ctg)6AkWajx0{A2m zR63DgHFsrm7mcf=>}^q*NyFMb|hR zGdJ0Pb{($R;7@-75?bj`^ymWYf7p0VosMkAT%VB>m03uv?`sO_O{piVGljHqvsB-| z3KV9;_xAHZ+@EAdE~+Y#zat{ESUW+oelOTQDxAO$z*^%$;E>PT13$X2jgjkO$2@X_Rde}Lz#fX|+N zTV>FY+0C&_%$#Uyk@WPhIDgP;(kCXkYE#@R=N^WPT4u*v=L*vuA5KT}G|O)@``KmM ziqu?VLRC+y`lhPiai-2&lp!#;?;%`_pCe1Svt9^^^`y1g_tL)C+U*1U!Y)a~?* zi^v|Qa7*CVKvR2}bP_8ff8_;)72RDD2uy(wp`+0xwHZ$4i`2PrYs&Pmo8VxdePl9k z^lhsN&l-JhN+o;U$HJfMy9{?)yR>uC(`wb23Mb4HjVs52@#j?akV&&@l(qJ%agz%R zO>t_n3KLR~c_;C&B9e>93U@kZI6{BiiB!1ET<&m+o>DS@AWrJ)f5}&)7qM1&&vE%z zpZsdn6B`hk1Fx$3az{cvE~!y(F^iYzHx0dgXxBekYmNF+fhs z#HBiz8b)eUc&WKgjort_(S5#L#sMEh%Aa<3R_V=+krI?CP4{tJi zE2yfjMPy4&<_SmepnK_jneE~Uoi^sc_n1F!)I?vd*@#8F^z`-rTMYVMv5}VJE}CPc z`df_cwc4q!iu5G41HJRu6wI`i)KOw?uUR(HEJuEcYSbfRC2&*x#Mi*{UpyWZPhuYw ZzX6y~m$KybaoYd@002ovPDHLkV1f^ORVn}g delta 3040 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 literal 8176 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 W`!(Q(2+ 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 diff --git a/doc/html/form_35.png b/doc/html/form_35.png index c5dd90b75f9c56853fd58044c66111a50fccb37d..3ca4730bb479584f17136447791ce1583b283f75 100644 GIT binary patch delta 340 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 delta 2648 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 diff --git a/doc/html/form_39.png b/doc/html/form_39.png index 5b5ea39ab9e91968dd7f6a2ff9cc195cc59ec4cd..6f5a01bbe58103f71aa21b1b7173417b41fe2fbf 100644 GIT binary patch delta 2642 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 A!vFvP delta 3817 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 diff --git a/doc/html/form_4.png b/doc/html/form_4.png index 343981587b607d06012e76c711326f71dde731e9..e271ca3f4ed79f6a07bf52940e60fe008b46da2d 100644 GIT binary patch delta 503 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 M07*qoM6N<$f{cE&^8f$< delta 2563 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 ZJON;Hd=xNH0F3|u002ovPDHLkV1fki%CrCg diff --git a/doc/html/form_41.png b/doc/html/form_41.png index b60339eee76c19649046192152e0a8ec053bd9fb..06dea8a6d354ac484458d8e0cc1948244059579d 100644 GIT binary patch delta 500 zcmV!;cbI3 z5QRTiU4Ru>!5x8)Ku5?5bcAGtWQ1mfbc8TM7$F(q`ol+SjIoVGe)J@ZaQFOletw){ zM1*I=%TrjNN&LEYgE3|gSfB@LT?Y|4PkF@WTr-#*AgsAOpar@_ zeRRYztmS-cfwOAe@#ouzt`<0n$Y;1QcX`%xLZxKA_Zwh{?#$@>m657bee1B6>bTMF zQgPB}7Z!5FDeod84-Y#lE*&#zGY=<@f2KeR{o3M}GRG0aE=f_MFE~3wM6xB~ao*;l z)#rIuNqqZlMq7*1_Y$kmI`(w4Va>x-xZ%_TA2Cc!iU#M;+Mll;X@eX358&Oi+!UwB z@;4rpc+jo}?ab<`aP#3rB4Wf>5qb08$H4>8FLfBkWV*%tD0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPuk_H{(&y@nJ^)(g$ISbC zS#SU?a`<(4cmg14&m&@C6E6|kDdM$M1R?1xl|T+GoCg~L2Wvb*BjKR^fjb$ba2pAg zB%v+Lqcp}{a;(J~!20DM9wuE%xP;i+Q3}AM&kANlKa#hse{#<)x?Ia|;JNq!Zw`I| X{nN{=o#6(O00000NkvXXu0mjfwyEQM diff --git a/doc/html/form_42.png b/doc/html/form_42.png index efdb6e4355a95116e90e89ab4eccf148a8ea9fdb..5066bca83aa80496ca3e9db1b57837ef49561270 100644 GIT binary patch delta 831 zcmV-F1Hk;87U~8-iBL{Q4GJ0x0000DNk~Le0000#0000a2nGNE06tFQhX4Qo0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0008fNkli#hd%@N;H;1yHK$xh)Wp)f5U; zfAtvqY^U)evIdr_`h54UD&)Y{qo)Ag?6$P4i3Ok0at7X8@+IJ?B+t6u<#c z;Lv_%%w_8;u<*!szzJ9d=I(6nB_Pjizo#L4syQzrD-luiz{2zP??nL|RrP9J%L6Om zxg%s9CA@M~eW!}3c0_cd4trBvhm449e}*g+fgE@ZjBnd7rLm7@NZ;g&2Htz*H<%^c zTQXY!dyja9Cl9pb4qeG?$-roxtJFE~UWKKr_aUzvmiD*oc`oA%8}IX4hMx*ebn?A{ zqAn{8>e&N_sAt;`92D%e?1>O z&PF1Z@1u~~c<*sG21EEh7Rihkkp)%Q`f7U&lJXtWdcFYmcW^Z+-yyB>q1qk`=lQ{r zBO;l7t8_L^l4N^3&Ss1Z`LTRAW7mArEf!dZKnZm_s|lAo9N*VX;nc?Gj6c!cgCo?ZO6+$*b>$3HwY2hi z-9NN&xErSU0{qfMC$b*>8>+n3%<6k8N^Gep`R6J+Cgj})*v-lHK+d^ofBVK%byCk? zfLB!=+qjq=lW@Lq9DM}eM`NmlR{}4dZ2P4#S=j%J_}2fN@BwtR#%x)Bj->zq002ov JPDHLkV1n0YlBNIv delta 2816 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 diff --git a/doc/html/form_44.png b/doc/html/form_44.png index 8721c4484afb58ff7616c9fa9144d2f912c9cad8..04b691d3adde1036c49faaaf18788fdc403dbef0 100644 GIT binary patch delta 4701 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 diff --git a/doc/html/form_45.png b/doc/html/form_45.png index 6edafcbe0641cce3bbdbf6212cd2aee8de82c507..791a01499744da2bd547ab06fbe0270ac4ce84c1 100644 GIT binary patch delta 3909 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 c(^b diff --git a/doc/html/form_47.png b/doc/html/form_47.png index be42c01183cf941001c1240db065817871a0e25b..865c463f33cfe859afad997a7bf18734208ee468 100644 GIT binary patch delta 2909 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 diff --git a/doc/html/form_49.png b/doc/html/form_49.png index 784a47180d0b272a5b68e135a64a19ee1c96f69b..82be0dd226a0f1d2c9fa644539e3829e5a73428a 100644 GIT binary patch delta 1953 zcmV;S2VVG%8^aGkiBL{Q4GJ0x0000DNk~Le0002<0000Z2nGNE071w+5C8xG0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000LnNklnIj_J1pkI6K!b=<04t+t0pP^UUx7%9hzJfMS_4P{ ze-uXXk(s}%b!VZ>M3e#eV&<(;wgYe_qCGPo!%-Iz5eBlr9RPeV^W7-B5z(XUQ9rZ; zjEGhMZUFAg{HJn{0f3n)1Z@!!p&%>r6~LC6PnCOT07+F}=3p}y#uX6}p^(bom+drw zJAjoegbxJYX3O6HziPQb=v&&%M3g`=e{2O{4aKwq%2#lKvWp6-y9Tf^%@9vCqyQ4j z>fcbir+a732p?Fq+|xYR7{A+BW+K|jl5PzmN{Hw{L>UoXiRdibV&xQ};C|fNTf5xvye_!43 zp%(^BzLj9+r%NiNQ2TWTaIMy9x}b#f2f(gUevtB2$MXj$!Of-rg>B!yFDT)?0yukY zb0=e(16X&|O`&`VKk`iL*g4X*mOi+RE|HB~>K#JyCKNA+>c$YgkbAZKFz!9|U&qj^ zRL*)5oCslA!~L_|?^IA}D-*#Pe@%!R`c9?aAE6=f)UF=So9!fJ2+hyP@2n>owj3X= z_>=M`6fa$LW2jz0t-deMNqOyL(ndtB_P5m6FIYQZGCOh8OEo;B8R12tdNBTAt8hKX z##)i(xs5#MZFkTjP`1KpuHv&?oyX**v~R5&E_xyN^aQdNdB~dN!izUsfA;+;fP!m+ z*#N+$<7CsL=?m0MG>VNTHtB(gex#2JfF(2US)5NE`Z%Br`hWIp_g?us7POsg(~qsg zY*I|Y%ONzuK`)s3&deWB@3NA1wkU1pCw}<~O=&{9gy9>&LcFs8l&}*Kn`JfdDnOd? zP_y?2z@C)@$}8jLo%BRhf19<_2BZFH9({4JY2mQx#|(!A_iRta%YhiI7bZlhk6dO$ zYJIqv^?WIFpYR6o>@n5CQP)Q83^WwtQOuyWUnb*E9ghx0CV#(qKo*;>0^gXCRS zbGd~HFN18ejfR{rsSTE%Lnj!}qs3^$Of8yXP&iul_4wy{6 zLkW8|%VhyYbOFFAol|1EJE$$s7gT!OsPXGc4ENGjw*xP+Wm$;;Adzv>;X7Sk0N4@H z#X`8PLfYTf-19|K8x525(g7}dk;wHl0m=kc0NB4g?a9cua@9B0Lm84vp=Ku? zmbt>g`6X>V`b0-Kf5@|wCl>4pcr$nfm^I?Gk-&wm)YFRhT5`2wvlX44${_=d)limFx~}F z+fko=Z}7TP*}+K0N4XVl?YCkt7Y#O>79>E~{jV#6N17Vwe+Fg7rk-9zlEj={A)0WQ&XdYnG057iY3%ma04KB$cya@8v#zC zgfx>d9n100T*^1V<6X?{Y@hgW9rW{qcMl`b)YVr=Ud|e!lsQOzl9^8;2zw}@%O&wW zXd;9N=m)C=0ds}?l=7D?rD5+rt>(6<*vq~`e@-;@f5BXN=?Eu2_)=zDB4#mriXi-f z3ZEqKF9PFI=+V=P`eVp6^EqRgx^feN$)$&Hz^YsHxy zA_$)Vf0j`1ag{TtE`p%9#@4y$GDfxv;cI2~$&1NX<|;jvM-@xnrF$l8G@sc&)hG0LZQWlOP=>kjoz>{;2#Q$uW{H56l4C_muWdu$}8 zSDNsQKCU-Mn&yVF^&0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPK~z|U z-B{h3<0ud;?{^7sA>a_W5HumkA>a^j2vP_*1Std*f(Su`AVTPUkoAW^X1#a!&0Rgr z$k1|i(R4TXLO8|K0$vv9M&BOYlL3kYbPCxJQHAQ<>bpa;e)@B+wuc}hdbcLu90r<* zs1)?$bO(Ph#{Q+f_D|vo4gkX1KThrV2mltJ<*j?#jx%2>hOX5yH{8l3#77)C@Y6qm z_6Gpex2=zl``7K^H^z6-e8AyuS1W1gdwh9&i)!(3b=?5~+P|*#2P8XeWgJuh9u73< z0>!$?dsY#VV*Ts0DtR%U=S5SL$H5BRydJe+=#PIEQ%d1wHE^ixOpH+OW$aX_i9?|P z3MDsY1CvBVRI)|lAbG-9A|le9$>A_6A=Wi2z!EQ4YXQ_qElCEY*~{3g7?~uZu|NSL zQX91r)7SKn>vwT>l(Q16Na%NBsX-+8lRGQ5L1u6hlv^2rioQ^$kqyc~?YKl?8xFOV zzQKQ}7*7!I)@MjIY_=-YS!$D%TNy_cePu|a3e@W5k;80ve1cdK}L(?9bE0IArk=LECBd!t&|$gbvb*y>EsX3 zblfP1@>GR$9>ASVC2_M+*D5|esZtv)il9iD0)?R@1Q4leMv{RldeUnhUemUM=o3ac zl(dr(s*uVwWjPX^pQTWF+i@N2GZLPo-{3og)D%oo!{*M-vIz?MA9gS@*U=5={vPCuu9c+ zU8=;5p#zo~=Qszv70j1&nyx2e3sLP}jTz-o=HmPglme>;)m|Twx;bHS^;zF9m&>(o z!4%L1wY>{BLCh$VG7Bea&o3o%sJega-JRM1l`$327zqH@^Ih)QSZ523ewi}Bj^RgY z?)@UlzHu?~AYLBqH4=uhizWCW-Z_*3k}3{r=lPsVZDEYR-nwv7oAloRbDBc&qDTZw=66_Lz( z&-K7>_uY`ao3 zO2sa;p;0a+?PR1>Y$7rZ45A#U7w>+rc;kx%SH@^5H1)IlYI7f<`5+xG>dq)1CXkU( zaXJ2a-dZanC#YY8>zw8LgP1mV89%gT8Ra0VBBJ(xjL*(e|5bdV_HhYud;ik!;cue+ Y2{f7QIVX3E%>V!Z07*qoM6N<$f}84gqyPW_ diff --git a/doc/html/form_5.png b/doc/html/form_5.png index 82a3436f6fd89b955209d882e833bcf7ccc8d526..b87f3016cad5a0d34c7b9478f8c869b7f7ac081a 100644 GIT binary patch delta 672 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 diff --git a/doc/html/form_50.png b/doc/html/form_50.png index 93999ee619875da88bab8e295d0ee17cbb032820..cf5f5925849873b4c29872d0c1677223a798bfc4 100644 GIT binary patch delta 1026 zcmV+d1pWK$7OMzAiBL{Q4GJ0x0000DNk~Le0001C0000V2nGNE0QWAV5&!@I0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000A$Nkl< z+NU+5s*HFpem#2vBSsQl0>7U?n>U<+(jwJ1HG08=0XW~zF) zYPwH=9S5nZzDL?mfE;(GPjJpX0H3N_bF}&7PoN(kA8IiHRjn03J4zmE_o~I5mjfG{ z|0c3s3LJrt%JYRiPb2$Da7WY*NNV*xe@WN_*|VM6!}(M1baUJ?mINd22rL`wzpTFI z)CyT&=C@6gZ5s(w>%^BR)?c~Ud&H9937a(3r&b>%DM0Ab$f)_Tk%VVE?3pCk@u9%6 z!>-e&V!yZDb3yDw)scu~c8TfJCKZvzz2?+_%>EXwRxUs%A~KEaca0@LReW9v_h`ix$j;QLY zWo%EtT2()XjyVu%x5)*P(*M3~h)8dD;loA}>U)Vuf?Loh;Bry5e*~P`U4XM}3+mmTL2?=zhqE^CR2_E=%u)A=COgj3 zG`IK6&1V||YO5(GyoXk(y4&E|992t1^?|x<;taRDa`=%uAP7~RKLvJNZwaL-Dj1@UJd=H-e_12U;h(sj zwf-Ln=!+T&rsZRu+gC-@U`J36tbn}lJ>o?$STRC{1arU_PPt^^CbvT=2Fxu6T*Qbc zBG#!%w@EjuF`+EAVg?wz0xATopcW%q?-6%~f3GedG^eNgpdzg@oMS#hlB^>0qH`vJ zKD-PKro?f_)6G-n^h@9!e`(2~;TG&we)#UI(y`Bbx20!yHh3dZ*AQ?|B6^bGZG)-% z()<=TCBZt+XwISgfd^frVhOkx5x98gzl#J@)PV)LYpC0Y>TW_p>E-vFZ+uhE`Srof z8^OICYHbFM$@x~^Rf7H7k+U=MCZ&bsZ@*V%4SZ?*wM8j;mva8DIJ(v!_+9y0m{Lrw w6u58i*9GHp|4k%}cpS!`yu1KL5?%oR00s~}Zk%RtwEzGB07*qoM6N<$f{|R==Kufz delta 2897 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 diff --git a/doc/html/form_51.png b/doc/html/form_51.png index 1009008aef6417af9147ceb3a901cc7fc8e7ca7b..411a68b3bc86f72c2a720d5afb19ccdcb4ca7be8 100644 GIT binary patch delta 959 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 delta 2843 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 diff --git a/doc/html/form_53.png b/doc/html/form_53.png index cf88d631712cdfd385de17d48c04b8ea9cfb34f0..f9edd698f0df8c67b15e8127603f41cc9077bbe9 100644 GIT binary patch delta 606 zcmV-k0-^np6^aEwiBL{Q4GJ0x0000DNk~Le0000i0000V2nGNE0Gw(s0ssI20drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0005;NklQ z42B;bZUL>}6}*Bwf;)n5gxm40T*Des`b@LRaen~3it$y*w*q}8q~l_K!H56 ze;;D|8epC6>|3HQ2ddE4o5LcqvFKhW=3!+ZndRXb*s1CzF{Cu#I_|LCtz%;xm0!@m zj>ClA%4v3M6WOpn=fhJ#V0QL#Ejy!Dv2EkWJ z;KTykiNHRh}ey(rCa(+jU zr-4eKR#hL=I*K1v{VO6)L=JrIxc@F*Lf=&Y1E}gByCqASoZV?yrI}U(46XF&f7H_z z@Jj)YIm(in3wSJm8+Pf}+`vOX{;W-1!=p3{u&Tb(eA%5Bh@Ak?)EmnJoAv-A(pB6P zq2IUFQ!e_#`b0;`nE0!61dbhjr&Qn6mMY+f+D+XW74b(4HVf+DBTe1w?gbW`bXHkf s3IG5I_-R8! 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 KMNUMnLSTXh0C?sA diff --git a/doc/html/form_55.png b/doc/html/form_55.png index 645f227637d9a1add500a7f1d58af4fe3bafa6fc..e6f5d0313b754fe70e9082564daf4d62e0ed4c95 100644 GIT binary patch delta 606 zcmV-k0-^nl6^aEwiBL{Q4GJ0x0000DNk~Le0000i0000V2nGNE0Gw(s0ssI20drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0005;NklPxCAKS-4Dyen6=kVmN7SzH>2^4B;=>v z=Uriv_)7RTH-V}6a)iInO`w69t$?EC%7Cq;!(F1J*$vnL%Z_gi2w30wUw~}k#EyZO zf9f^;<9h`SUt1Q%poYzC4HS}ojeWbB<-m$sgSiu_fOkm`q$E|qk3gM9&%+w_m#lz2 z^_J`>ZtsPz?x1vkF|tku9Nn^@hJi&x&|k2bLf9L<0Gpop&g0oYjnebZ&f_6>h(I}! zaMNHO`M81&1)ASD@gg~4-$DVGNM1Cjf0KXqUAZkns#9X=&r>9?0x~mOjI8@Xy%_7p zk&19WGOzOIjj)-OW~N9JxB96F7x9!kWP#s?nr`xLJ2%%X(I$5SDoNXRf|+I1Qo920 zjequ=PSP82HM5GQd^c|7jDDQo~yS zGh6n=7wx>i#=xYsqn@tL^o)#sLw8T?9Ewe~&;TE^GBU>=z1h4q2OsGf$fufl(WG!$ s6mBQr@GrW(tNjeZ&&23IG5I_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPEuVu4Da5*7)I1tbs&AR&=3{Q-vs+D+%zoOw5S`Mim$ z`UE8gR8@RP>gej&gqI|EtF|<=)w~0Ir^mCj^kp&E8i30HiGb#NARPKwC#kh*PqOzJ zLK_d*Y*Bxb)L34Fws9c~N$mlP%-iDQJ~F!Lf@N%TyOHGVveN;-IakI#ZOR2(cIO!3 z>$b5MEFFA-w2mw5x&5sLyo*2?u4}ufv(J9)Km1gg4WKJ&ba!8C3V?+G|6TpA3g!>~ z?NzDNX7hVF5nf}BZ3nzy6^zILz(_phk{aB6c!MyKl$}3)iYMQ0ugf>HCLi(%yZ!#B eLrOk`bM^zbZX$K}b3!lx00000000y2nGNE001TPZ2$lO0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000V)Nkl;dSGn z5{2))^BV9g!CQj21g8XV2~G)d2~G)i2}ucd2}ucY37Zn;{a{G2A|#NIC3)|64rkX9 z0wKXL35aXK}iUi3u^$cV`MCJ4a-5KMPvnFQFG~{ zs+S<%62P)4P8}4K10f=709yc`78U@Wf7?DtiL|=rZTB5i^;g0(Ede~)&xPf4Ofj~L z$R5B-RUg{o5&}1ovula7f)jwgPQC)T;HQ9HS$GPrw`;1Z%1}7K38}wu!odG+1>ht6 z+Yo7WjDG-dvimgSnby_6CEU9Lpa4!|eYE-Y?JJ^V;X^DF+?e=p+R zf_<#N0Jb&P_5ePHN~=rWCb*XN|5KZwgzMe4Ds=t5O&x(f-wOpLLu#;k`;r*f*UiTG zaGGaQnm%wcr#u@tflxODJp)*JWA1n0FO0)57`5FPRWZ9 zV}tbB?v?%9X8u_x#JPfkvOH_Re+i(5IID(hebOqKcO6kdYy$TfyHP~8a7Ob{9EQpK zunC$a()}mb_HUbDT_wc1f|EJrshfH8c+D+USmmZwGVeNkMZB2cTUwqAI4!fb^4Y}C zN>v|w?_>!#>wkgsE@*Ao8TmZHbu!uSFZbSCl_`Uq)i}QH zH)@I|P_xUzp?7(jw7Q|wDw%f^mr#4O-uVdNV2$kya|If!p$&p{3~zAS%cH731j6XU zuJ=iQDI!}DIlA2U_E%1x_e-d$M%UxIlL;B1ZfD_Fcm<@XSrf6&h+TgMa3fj@Hn z*{<(%6IRu;x(#C=Oh6@nt3LN)z%un9XSN$~0&o!fBtStq1n)qr2AA4P=B8CL@96Wi z;2Y=yuA;ANg1;XAo;>zmw{Q)z_B{rTFx3TYRHj&_4#RFwWBoMOxK3Ud6qM!hyj|Zt_S~cXh$yT`IrlfEN^PjqL){m~U4LXEQe!N+N(hS9O`1qq?_P8_Zd*2P*Y;m>c-ox3J4t>(wz-DGz!7ca$;6+4U@U4aUO)Bc%)!DAs^`N>D^zu7 z8t^Gd-wWpGCKpy&_xNs@YZ39YtaI5MBiG(}%gK+fOsY(#`E3CF&bd!jpUwU4MMPfV z+LYe_;}gK2e?FcUt%6cS4sZ|t;8kHO%n9aiB_h2vm3zZJ$b$(7-vd9#h7#)b*{gMO z?2uM&{39}l)br=P)K<72nUEfc$fBbrw}v~vdr~xMl-_45 zCM2Ufb=c5+4L3CR_A#H%IWvYwLaqrmj?P+kIfWx1V$=#sdth&ih&^<4rw;2$ zb~aG}e>ji-T}zzfoF|2BRRrmXswOW)w}yC1jDAX3I z>;~e3^2&L*hSYuEQsSki)ksPI&MplrM#D8& z`qf-X+_KHJxd+9Jv8`HQiq;v#N!oL+A+MaFSW0?DX1&KGvE%6EhVc*M-&LE?NZp`e z3KS`m?Gm-KiB-SoAxC*x!4z`*5tQ(ow@N_Y@OP!}gnJk^q#_I*;N<@~4W!<2RyV)@H zUh5Cv*}@&t^Hg)~VAmQC$qM7aX?u0y!{Th3(qia*Fq1!QX`k?&ejG?P_h98(7fy5E zRA+;>^W&Yvjh_CdzV9Hf?1R{H?(I{ie@OhL#ZN7#KbbT6RK%9_ir4$5%-+J63@4@i zv8D=l{&Um)UI;D|;uLv73_sp)V*?1{`J-y1-)fFwAVImXw(%CZ_EC4uu0I6=Bt?Mv z6DvP*zfI1)eah63<{J`DM6|g3E}cP3dPVDf)20{?aA%{u1-m8tL&brK*e6LNf2pR8 zGhBn1#nxbBVs-To0EozoAC~&#FyPupZ1KYpuHA$_!(aH#cYVP3_gKR1GVZVa*cYeb`b;N8~%bn{M|% zSFH2@?N_gvKzWC=c}459eTV2~e-GNj*52n{yT4PJ8aTr?1a5K@3ih5Xa;DNy^*-xx zG5Sx=ikyzfe~US}wTzCsiGaJB1S?f0RXy7zQJb4k?vW2|3{vlZ482W-uiI}B_*PLT z<3CBFzj~Ch= zX`dXAoQ^2<1iM+Gs&{qz;|%e2ZzYw}If1KT_ZarcFm9fpL?DedaLAPJQ`$b^mW0(U zYxGBCddKgTh@3*>aZQ|MH4f=dj-4i`tQVy(B`Hf-pX#*AE=N8@8M5A2ZIsV&n%*K1 zUS9hRVTS)3%LutAgZ3=xIw{T zw=r0~r=Ywu+UzvqPSW%%tez<($&i>J^z|?lltrD)hpzWoew1Xof5`V~ihg!+X%lB5 zOSn}QX8^xABTR0@E8I}GDkyt*(zmMjVrw1=A!HCtnE4fbzu+{#gR1^-yr;^8f|3w2 zC^jtqYd;@hlP+^I`_M*72pJR`>iS8WHQZ2nRx9!-ClkXsP? zEA~F};nq-45<&*2L*gbhD{T^>pd^Icj@Qb+vw?n;gpgbDika>hM)x2>2x);sZ$b!Z ffr63{LR$DgjONvM9X;ks00000NkvXXu0mjfuK`{E delta 4028 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 delta 2576 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 mT$}z>H*fW{WmsIo)^vZBIOYrhQC5Bc0000y_d< z4E}V_ZGc+>TLN1`D1j+~ErBV4Edfe^5}*Vq0ZM=pbbnX^6YSU~55mOXIXMHwaumz5 z^{_p}%*e>d7zX}%Hv<_N8Qmc(d`8BA@b9}B$jBHvh-d;}CSUi~tr36;05J1+iDm>~ ze*xeM;8-euWah2wSy|y51`&+`%wZaT3?q;;fWORqZSXk@025~ZN~9}8`%-?N)U01S>ka?|*d@@8e}wJ;peX&m0x)ZXwog|F^5MWWkEr7$Wj6`W zJpfonm3_Ame##}vcmc5T+~3Ik(F=7Ks^HQ&S1AfFig}Q0RJym6x(-d#)@aM(m3DfU ze5^Wrihhb26op5nStLC76w7zx9e=2orG#V8{fXRncDTf6siMUyyjlcLGnjSnf6_E< zjrU{QlK2$)DBmI~Pw2CJe{AS;QwEFz;rF^BN#TiT{Km%UGscnSbav^a4JF;9 zvqp5Ms7u>J^in=HB$BUurnGm`3?F6E6VVLDAK3%AN=iucf-^4V2nUEsxX1%W;UbOT z)^WvT)!eP}y9cmlcRH#LZQszTd_;L?Ry{tK$c8=0L@BTg%I6dr1Qni$e^xNePnBsA z{tlAMB%-y?H_C7#cE+iTTgR17xPs(?MTScNCnEY1-?J&&PshvhA)+Nr+ihWH>H@%u zh^_#>DwMNz{~ZV@yeRt|M$k7VnE6UXYnV=Ob}75h^tU@lOqm$SNOwq~3E-QV|2A0P zyI{|33s@aa{{9hV-VxF7e^N)QLpx-gOEHZt5glRr=Z=V`0gEc7?@y2zF!d_DnDKL% zWqMUXnI{Hi1}I=gx;e~hp|xE;rc5lv-e22lj*`NoBmW)nMCoOA*Ad6}5-}!7OqBPhM1p$_pUGWv$DF~fI=obT)6v!7miin! zSXGDC31;3iGlecGe?E;U+g5fcSw2KGOGsIl2gg_a_hdeOCcO&J$3T$5m_flR;~ZF0 z(B%4n7u*Al#)i;UI!=+AIk9C>hqiBMRX*aDuH>`Rj}JigEvn5m{>6zqC4q2SE|fy3 z8euw{-9_1Vb?PY9ml~zF_aj%q&S7@}J0miR7*y^1b!hvBf41dgTQ@O-hEH!|pSyrR zwpIzB!mIFnjHUSRh3pe{;g!hb6J$oFV8NEa%v;H`di_|jW&q=-`7#@$Cf74abodO@ z&J(yZDmKsCCTRPH4&UUkR_Kkb) zoqX>KW1{J{$l#V&5xVZPc5e49mEXZ}z=Ort#aB-qf7%*t*~a$RR^C6EY+hT=>lka{7zYjVXYM_-WzI-ll-&gECy(97kwM^7W9iMQ?Aa)Ri9LsMLs|}rp z6j+_{0>?oKxF3KKx}0q(_3Hr-y5)6-`@t68PE?1sMmsjH@NLSc)Td8YJK6eD+0Su5 zRp_Ks1QxBn|hA{n2-ONv_k(vC6y>)$BFIY}DOmM;Md$ z?QV+%Hw)bP@*Z~BB<%})GK?$ON}IJQA8X^x1o!juwmw~P(CdMg_IZ2J^p5&g%zSeJ zk`&(Z4bIH$T}l}_C}^4g_%n7~WpsqL6@Ew{f1(Xr>AR<(oveoP1&&-t>6Yp3+9U%Wqx2aW8J~-MYHdcwfRGhFBV$1LA2ME2p+NU=-2eap07*qoM6N<$ Ef;0N8NjW&b{Z})4Au|*Eyf_e*N+N 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 delta 3103 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 diff --git a/doc/html/form_6.png b/doc/html/form_6.png index 70a8131ddb028572e8bfe03d7e07d3b55b0301db..42612abc84acc98462ccb93d25bad085ee663928 100644 GIT binary patch delta 568 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 BQ!oGk literal 8052 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 Ze*iZGjp0YGBIf`A002ovPDHLkV1h*;=k)*p delta 2621 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 diff --git a/doc/html/form_62.png b/doc/html/form_62.png index 06383b60ecde309abb44c89b6e2741a299200491..7c281a2f67840c10976a299588115a4bd57b06a5 100644 GIT binary patch delta 600 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 Vrx69ga(Ms%002ovPDHLkV1lChMVbHr delta 2709 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 P00000NkvXXu0mjf;$<0O diff --git a/doc/html/form_64.png b/doc/html/form_64.png index 0648a86236f584f6bf08996a8baa44f5013f64e3..6b598b87229f8d4060b8c356125bde7c858c4ba4 100644 GIT binary patch delta 1043 zcmV+u1nm2Y7rY2SiBL{Q4GJ0x0000DNk~Le0000=0000a2nGNE04^@9TL1t60drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i000A{Nkli4u_(C?2rX3E1RZiY(2U8%ZZs ze|-t`)pM+&svjMh1+W92RrL_v*OG`5ku}h$>QkU^1+@0>r?oChYXAqFwscWpTB@ot zkX_-(`lYJFc@C<&h-Qa80#&4c3+#b9(XYUtNWa&deWZT_Y@_@8Zh|@+-2rXlkVl|Q z%s(1YK^Zot0d|QsGf@F8*R-u$(DMU5Ed#J;r5;1Ku_=A0pj4MbGrK;~Zty>NI zekO$W&{6M0G%{QP3;6|clPQ4L5iwq)QrZOYp`Fwqf&+aG1x7T=GS^l__PATGe}S!t z1nu}r_)W!pN6I9p_$M+*@-j*hDZ4*LHOk0X1Ft&BYeZx(B30@D6HvjZX{C_spK{^% zQFi_gYm{Zjo}`Nm*)}vwmQ330a**qva^Yq4&UZnSefRh%6e0-{&i4vbTxQWzkn5jr zLP(>$|G5aq=CgJ4F>IXxd`5y(5Svg5SB)Eh_AU2ks!=Jrph>PbZ4 zd}iR%nfrxLs`@;~!gt2p{^=`kV~}sf(u14TSVZc%$|4DP`E&V8IFsM=o3ZrZYNE_s zeFl882zpS}*eA$Uns6uo6va@ZvZGI^DrhyMN>!g#_0`BZ;i6;=pInz}f6VTm44(X+ z%pp-;g-a4hlxiEoWT#ByU^0_y2H;I()=w(>f$NM&0ZR$gesBbCfz?>?%>G^j#Yi2h zu{q6z+EvZD{uC_4-B1_X5-9$~25;=JYunTYE3AbG92CDiS-u@J$T|X>ME`mqGu5Jn zyG){vAsML&g^^SfDbEhZe^*^XO#8fcu1Ds!p<8@(v$JaGymKw!&F4ZZa?C2V!3Pu7 z#!Pvx1=hI2e>wPlmFq)D)XX15lCR4LFLjpZD$8bD`jNs%#TU(pN|qPxaZg4M|Bkf$ zuTs_D!Tvdj>MT}pt}ji_ZR}mIj&1f{=)CJa#V%=451^2KDZbNsN&da>C3U$=d0hB{ zx{vX~viwJ&#XW^3EnsmPu2Vu2JGrn$d5?#S*nNEY9?niofK|AGtGaJAwcJ N002ovPDHLkV1nIX?W6zz delta 2927 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 Zt$+PNtn;Hn)CvFq002ovPDHLkV1j&yis1kN diff --git a/doc/html/form_65.png b/doc/html/form_65.png index ac44f71af40730e30b17b11f5494ac2ad512556e..3b1440eec636a45888b676e2fe5278a9d8f95fba 100644 GIT binary patch delta 528 zcmV+r0`L9a6uksMiBL{Q4GJ0x0000DNk~Le0000T0000X2nGNE03|D+*#H0l0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0004`NklV9-9 zWM)h)FOwra3-mR1gQOJL040zBXER&I*og8}QUdIN9|tOdLeeV6POPUZAO-f4GGE7w zf0+dj;8blfs6xA?3Uv}?Cju}73^>F9bd8vtW?jHs1%j1SB zkM~9~B&Q1Lz1|RxKxt;PM;#3f?`TCd1hkwIw65HzcsdGbZy|Y;KT)yC+ZdoBo(}R- zQZ6a)`YnWI>Wx95lGapYPy%O38!9UNe~JN3eD1AWNedt|vw7*7cA6c|`};_8H0D$Sx2xX#m&b)CTSgZ!oj?^93_|H!}e<;L{JX2o5h- zmdSeb3fEiTNzV-%wH4MLp2XJ&0-h(Hy91E6zF&0hzjP!?g#!Z2sjkQoST^t2MxD?m zT;IaA)K~4p%x){Xbt(h44X=X=s8vWgkOz}^qnp$QmVZt;f&{%B#+Lu{uk9DY(SyU0 S(jIsK00000N8NjW&b{Z})4Au|*Eyf_e*N+N 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 IM6N<$f&{I%`2YX_ delta 2561 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 X7I&ap@bXx=00000NkvXXu0mjfBE`+M diff --git a/doc/html/form_67.png b/doc/html/form_67.png index 88e87ba3ddd94f705aa53962ac418256229e1f98..ce0eefc7e7e761bfd4e3f48bc437a6e357f26ab3 100644 GIT binary patch delta 847 zcmV-V1F-y%7WoE1iBL{Q4GJ0x0000DNk~Le0000$0000P2nGNE0D6suq8kVp#&%aN`Mle1SkPYfD+z*MB|ML>BsfPWW#mug@|0 zf3f5OpgY@=oQX&U-~wQ+>^;eCB6|XGCOLkF!4D^ry$8Soz)1Tw0P52OvM%o{JkcG{ zkUUyn+cn930n4Vq`)4TvAa&F(!J{XL?hXLDNcnQ)0zh(}yxPu2yKj!4A7PM)Ohkmw z$}odz5PIX2j2tw89s&S>34m*1y@%3Je<4)deG!=?uciCpBh)-l*B}i6Fm(P6pl!5c zB2sD5RC)YNc7*Ouao00l-n?ME8Yewaxr6G^NezzpEjkdl+Mew_t0i{Y zwIgQ{a3%Sc=v%3dDS)xAJ;Cqe*8-U7{8qu?!zW~@oI<*}c z0FKPgb5x_`!vL(zNi}?-idG7WTlpnuuN>Y1z$ut#jiu-@Zswfuu0=(&PwT*2sBN zZ7u68Qf35z8T*-PY!BRwh4!ar2+6bN`&@TrV@b+eW-?ZIc^eZIP&K+wfB4(F>E`@Q zC3Rst>ozuWPz{OXRz#KnHX@Q5GzPHKA1W1qc{X(kphrty zw29ukTHvk_N(z#k)=UbQKOqCtGd3Sfcy>O+N>KT|$P|&<8z0hJtOUOU{r@ZcY6D(P Z@BA7Q+lu$lvH$=807*qo1w^hwV1oF`eeeJP delta 2804 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 IM6N<$g3MVfxBvhE delta 2695 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 delta 2967 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 N002ovPDHLkV1lYym;wL* diff --git a/doc/html/form_7.png b/doc/html/form_7.png index 6b16b3c9a6295d67dffd79b4d19d70adc5d7f96c..fe3cc6a7c1b98670d68fb4ecfce2457c61ca1fe1 100644 GIT binary patch literal 6422 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 delta 5460 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 KMNUMnLSTY8GJgyJ diff --git a/doc/html/form_70.png b/doc/html/form_70.png index e1adc4d169b7746f427deafd19cfce7da967840c..88f6b75e7c6819b8994194c547e8689f0c40eeb2 100644 GIT binary patch delta 862 zcmV-k1EKth7KjHxiBL{Q4GJ0x0000DNk~Le000150000U2nGNE0IXpNcmMzZ0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0008-Nkl(W{LqQWM&c{j#EExC1NaWxTAlVz z5+z|k`}lY77x*jqfA1IQBS_`|rT{VkIe;C23cym*F7}@xqAvu=0>Bo)PSQ-$SkjZ3 zf8Wi1_`gA;&xb|w7QkB4EMk8JFaq${jO-zzFT)&8E|v-V((KPo!w}JDf@B8Z15Pp? zj`%6&Geq?HnAm4|!mk35ksO5=qePR;lcMfyBh#zDgme2_*=LRDgYu4~*O%O;%af!X z$q8IZ<41HvvH~zml{CK$(ZD-`Ec{U;f7-%5lQgsM8vt`7G?z3Ee0`Zy0a#q~=D!@Z z8PJrD2@W&r6prK?nUZ{DUpmrPgJeNcH*E8+-n}Uug(R;rp1`t6GO&;6P9dozIX>-q zHclnBn_*A1>G3+Sc_P<{!`nO6XGw2eKJQl86Kx4ClntLXPZ8bAj(3ezc~`(?f6eMh zMd9npf#^7DvXt7rI~vVa>Sb{HUB!IbLUSST9b70wB^tGH0$J>0is*eJOxXPcSN;OY ziKLXw>UF=E^!ucGhx;A{ps+$NMgdCf5UNedat9Q&oNo>_H{t=1d-?`IfW}3XOfmi?har2 z-Z!j(eSc#(nCTv|Wayn!Q`{%V${w1*Eox#@aDsUGmz0h`jgu=za6njfA#M`qitmJ zV2K??ATedC1hjj-pe_|VL{1?329uA%S_$CoXrga%9&3l|A~w#@GxnO(P5HvVn2 zw+OUMQl&5L>a_O$325ttC5M|%wd`wENU0V!Z07*qoM6N<$g8SBu3jhEB delta 2797 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 diff --git a/doc/html/form_71.png b/doc/html/form_71.png index f8ecf24c48f785ff9c198e75198bcbaa25b4f357..39747259c4bf82d8043f29e071e6890db16775fe 100644 GIT binary patch delta 524 zcmV+n0`vXU6uAUIiBL{Q4GJ0x0000DNk~Le0000T0000S2nGNE0G-dYssI200drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0004?Nkl4euO19ofnqABv%)GO6(cicf2!ITO#*!Q^`NSK)W+~nw9J`!k7mFDuSa{Y zfEOZF?|C{9O^ooLEM&Eaywl~kpewS5j&p~cdtT+idoR6*W1S>&=4?X|{{6)ImIyU6 z)=4(WNQ)R|B$YC-yO@2eL%a`R*pn4qalZM+*@yTQ8A!$J$=m>+H9U7W3h$6lLi4sr ztzYe_e~mFGE{wN~sBDqbKA%aTZ?ZD12gXDF$PD^a)%3;ex8(m^w!Z-2a7-4R5M+7) O00000N8NjW&b{Z})4Au|*Eyf_e*N+N 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 Y1BL?>*APbIh5!Hn07*qoM6N<$f&$X(A^-pY diff --git a/doc/html/form_72.png b/doc/html/form_72.png index 186f3ccc5978934b600555a4ff0526dbd1cdd7e9..ddf67cb495798bb7c5e01f3a9c26eca95c695eff 100644 GIT binary patch delta 393 zcmV;40e1e66t@FFiBL{Q4GJ0x0000DNk~Le0000L0000R2nGNE0FxcW<^TWy0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0003VNklY*~QEbW>##XN=iOJ4G8FfVrlJU-|7OmIk<^JBR)O)SYMBW;?QWD^=h?Vu nlCEa<=_j06xT3b$pWORDn_8~|APY;`00000NkvXXu0mjf0Oq6+ delta 2545 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 A4FCWD delta 3407 zcmV-V4Y2aH4(1wviBL{Q4GJ0x0000DNk~Le0001c0000s2mk;80K#gy5dZ)P_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP%5pg9*b?WmperBcab?1+xhI}S#KAaL$R$$CJ!zpI3Jla0Dljjal;mCflt>YzOz0s zq4_wvNGSl{*_v-+7fH<}wL``sda#O!40}9#XvIE?G-Z7=W9C*Gi% zxF#|L>X{}YBE^Q;$`;b-jBWHlMDzff0-HD6&{T=cOGMRl(h;Pm-94Zet4+q{Q+#6j zgw`0dFx8BN$$XCPY)Ryp&(rJJm}9?$B_irkY%K|D@`m1QiaQ><7d~6b=yhv8x$0@W zDBXWNOrCZ(>DycGyhc#7XgA(0sCTzaTdADS=>x7>D{FC~94IQdlg};8PjYJ0Qv3NnIYpxZfGhWz=I4J$_NrU@IW_><`iljC*b52V6WFc%^JTa6 zSJ)5|w^Bcj7@6)m3zO31rxkj}-gesZpKu3YGtd|*;TC53!G39Syk)$X5$3L0T@T!^ zlj##(YgXomE)>{nSr5QjB+OjqR_N1$Re9)(tqK76sD!j7wpzOXIL%YdJuBv-I3|Aq zAcVDo9Ew~j03oHG1+p$h=g71|f)u20m8X3Pr!5z+?FrBSr(XL`02VN)u3N(^*DAdfsV( zs28fIhmhk=2f;==w8=Dvh-lEFYFmH9_#+ykZd;9_M3c!?SX8t^yl7;I=tKalb7GP4 z7UZq>La01+jH}W&x(nJ-ihu7{oW{TNe)eH)e}79XnxX8LGCdvlzV{LtBiyd$Q}>*_ z_SCz^c%ZXxDbv$&f1~aC0S!}>)vIqyJ>p4B&F!u>XJRz^`a?&)6-}jY-#dTNc;MlS z}hj)0PU8^iBGw%XZ-;-hhXToIu<|OyX|i|#s1FkE$ZF@UA>&RTMvH$;6g5! zyV{&;pl_D^cudH_ZS5002ovPDHLkV1hb)e(eAN diff --git a/doc/html/form_74.png b/doc/html/form_74.png index 6be739c142eec55bea603a4edfc3da2c7c5efed8..9086deffe090c39e4d5e1dc0c3b9c178871438d5 100644 GIT binary patch delta 401 zcmV;C0dD@D6u$#NiBL{Q4GJ0x0000DNk~Le0000J0000X2nGNE06XH4Y5)KL0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0003dNkl2b%Ctl6mm ze`RKN{uOLy$qwv*cc5E}yTz}-PC(27Ey92ZoN_@)m~XTJp$4pIc}W;>*rLkJ?tLcd z&9nTHWx$j*+zOU!g=wGGX6w(7VpZH1dgE%Vz#eL|Ft5KlFreE4n`X1&Cz}_btzp{U zf#&arN6RUWfLEpcn%bpPBRJqP0r$nQN11vZFMqZ|$~G8|4x2quitBH)GGAU8jXU5o v6~A^noq;F`;LClOJesoa&7Ags|AM{&jxYYMw^lzv00000NkvXXu0mjf06eey delta 2560 zcmV+b3jg)L1D+IriBL{Q4GJ0x0000DNk~Le0000D0000R2mk;80D=!%CIA2k_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPYa}78pa3we;I3q=ZlcDFI4=5}<@o!rl+9g0UqNa~TMS-;BoKm4v)n zJ-wBYnK9rz_;u+4+!6+7pAo+=J%DS4q!I806u=1B0bAhJ%yy|ZLu8)-NhPoXc4qc$ ze`XJ6_UPt~+uQAi4YD6RqF2DXnLQ`$bD#qLG$VY7?EaV#sN*$be|7t`X&55A2P751 z2Z28BI_g=f&JfxCF!t;ENWCpkNUG{LdpTRusM*1dVf4j%Tfg>qwxqG74S}yJNefA( zmliku$4IJ-4ixn-M|HNOH^TCHFtfGae=C56cQ%qVGqY_+H@Av|mCza4?&v4rB{~|w zCC$t`+jcoxQYC5Xt6?r_;**7>N#D`?YO-%Ey~l7WvXL!mOmOtt%w`>ZEHmv3;Ej-3 z&CKk@?>_-^NhhrYGh0h~IHhd{$2PlfLl=!iF3veR@>g!K3xe=J(4%HHle7coe?TiK z_zKJ{Il(_2NgDB}j(qc;X&ZOi)`R=fESipvFtga_RXXidT@&_qdFIP*{H6elvLI?)&_Fv?ooWF*6&G4YZ}@)gCceFnDk2?6>^-f zmp-VKq<62kY$%$pO*ad7^x~AZf0_PXa&(tK9DmZ8HAMd$PNbQ&3Ssjypvu@cZXc!W zUT5lc>g5BN=Gt6C@n^6O`zStZ)0X4xI3ul$$+h=UeeF{34tOL`#*z>blPk|UXYeT^ zQmE?n4$v_}D_~Lk9(D7AFmrDwL`6x6jLoGZ^dBO-aNn#lwoS^`71;m}f52AKO45Qr z3-9bzMvJdKyUWcu7C1X*o>vJA>g*B1ivm|>@$Jom;GbmD)%!f#52QwfHxb*0ZA#b( zvpc-ksm$!Y*AM?dcwm)Yq6o-7d#@M1U(nYj9s1f+_%ZO(=XZZ9EF@>Sq_2e*jrhUQ zQ>K2Th%Ws-iA$@|Z$VHwe@okEkhg^f!H?O?v@${dA6|;Y<}fB~9F0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPd^#QS0BgHt+lE_tbt7k4FH&rEUacK6j1W?xN1Z}VR z`8MMAaF}eZ+nNXfI0C5eV&j#G4P2Bha6dnuTbgyXtbdxRS43!^vhtGyVAZ*NNHtFo zTOunUkR)~7<3gvsPHX*dGB7{U0car#0DQ8wojQNl-;Pd>fKR=(Q;&Tgop6u28w*T)m8%Dm6 zs&H`j=yTm*@r6mYx@PJ~*5`Sn%9&U`Q-@@$DN{qb`j|QkY^HsRwn7gi8H{~i^qyJ) z9m$|nAjwJ^ab@GAcvJYA>L4Ts(Q)s)Kz8M9?w88KWfXXCoce6!FZCCBlN+yO(5@{2 O0000R}Ns#lDCM=I{F!#mTg_AV*y~9 zL?Fr2&W^RB3ZM$eFca8OiSsH1uo{{`f9jFb=-%BCA!kkkuH?{Lm9$ychNu8+0`iOY zX7M#%aIn&|($qC5l`6OhvR1zxzk3yaGKm`+_-c0~$k_S%(y?JOD+IK+C}D5)9Aze@8bN za;-O=ope+Bgi@vGN4=sJq~*O#i9Ub1xX!!Wl}4CU;agQt?MjBWQve55JvjPzeYfH2 z>xHWBRaN>Z0M;C44PbVIeo^gJbqio?eM-Gdn3z9Y1e)Aq@2H;#>H#1N+;Xfvbx((g zY*6ovnW}zvE!+sCwU)(#QD z2pG8VZ#&-bUMQgUeBme*%^`agMWTs5y+I1wPN<;C1C64iArTL}i7|7He<9B%8ka#$ z(X|NBB>K^LU};Z`0yY*A$vGTq*L#d1|A_=10W2Q8Ag)M6b8+rU^vw;9iGY`At}9Jl z{7sBSScxX_p2L4TlZA|7T|9v^h)#=h;8rqiy%j?oa2iUWOU zE6f&=9Kc?A%kSu)qdsqDe@O%P00s?Hy*+RV$v4sZDRm6{)yHSg--$v)`CkT4E<}SZ z0DPv5+ZVJ>6?!3$@_lL6L;7B&5qyJMI@+6eGhcqV>UzT>c?Ien`W2(x8)00yP(ExH z{5i9?Jqf7z^Fv#SF8i)f@2(s*$p;qmtn#I*qe|dk9c>qSPS9KARGIgv6M(;M@`wZK zMEC??#>72CP265pN8vXAH?()4i99E0&IWVt?E$PE!3_umAu6 delta 2919 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 IM6N<$g7iGu@&Et; delta 2890 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 diff --git a/doc/html/form_78.png b/doc/html/form_78.png index 017906af5252c9b1d0043e7755ee7b78073ea126..2c6369b9244cec9e1e6bb60bddd7a0cd9a6676b5 100644 GIT binary patch delta 5703 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 delta 5463 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 delta 4187 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 diff --git a/doc/html/form_80.png b/doc/html/form_80.png index 341cb8288aa03791486e04037bf24e7075884b53..759b1e6df38ea60a67aacf05a18cb4d48796c9ff 100644 GIT binary patch delta 2906 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 Eg7xd7kN^Mx delta 3827 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 SA|D?B00000N8NjW&b{Z})4Au|*Eyf_e*N+N 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 delta 2745 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 diff --git a/doc/html/form_84.png b/doc/html/form_84.png index 5f87caf12efd22fb7f3b08c7b6a417cd8caf7934..1a9da99a3be5d805b5a0555be1699a291f475a16 100644 GIT binary patch literal 11207 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 literal 8896 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 O0000@Bjb+0drDE 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 U>b;B(Y5)KL07*qoM6N<$f|jo0#sB~S diff --git a/doc/html/form_86.png b/doc/html/form_86.png index 8441f2d0f733e7bd7d76f5d14321ec85e5659e9f..00b9afecacd44af225896e1fd194d49155e82088 100644 GIT binary patch delta 636 zcmV-?0)zei6sQG2iBL{Q4GJ0x0000DNk~Le0000c0000V2nGNE0Ev5|v z5QV?Ja~q%qT5t>85}XpC1X2Pn!6_jwAt@o05SL(=u=j@+1F}FoY?3ph@n|K%Vc)W- zD!&nbewx4#{&puKQU&(Zs(KoFfQV$k4ye7Q4ER*l&(*{{l%1EqjFAHp;0UBPuYpB` ze{N9K-~bf(w%-eo4DIcl`2gNy`=*STj}@LqVyJ<)B?|H}O3eJ@VAH*b>>u&cDVP$K z2U^EIib(QAJ~u>(sp^&aCS8q5c}!Jn`XqU5T9Z~Hl8)_Pi@BM9Gn39D z=9x4Tk#cPR8qBVho=MB4CKZufM2Ks7Eb%sLy&^wY;+FbYpxtTwE$Cyo*69+EXLhdYf6B)i z#W^T&P96Mu>v9v|Dk6RaHokT4NdsTdqyV+wXoG0y_6%qY7p-@Z*NIXE(w;mJw!txx z-1`8r=0kS@B`EN5cVGLxUW5le)X;Jj(fFIQs(Y=~Ccd z@We)@OmQYlI`a#GU}%Qe#;3zHGL+%8mjSOjav9!?7~INIqOPwS-@7HTIrz1Is{98o Wz4EEk3Ma1s0000a3B5v delta 2656 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 O0000Kxr7{WKm@jWL;A!B$9Gm}X~ zRe1;fSsS3Q{#GwUBoEjWs(NY~Kty6-3lv^g3|v(8GMN$&)KgZ0*|os}5pV=Hc3l9o ze*oSYntW756u8>MZ@@oQy|oS|at3ayx|o8i+hA)sQ?_i4+vO!yW))n(6oII(X{{rj1P6HO0|_gD+Lk*a zkSp7?#*D^rKQrj9xt7o&Ix*s0YL#FbqqjL9eH+kUq)U+$EI4+x00000NkvXXu0mjf DosuF} delta 2682 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 diff --git a/doc/html/form_88.png b/doc/html/form_88.png index 8441f2d0f733e7bd7d76f5d14321ec85e5659e9f..00b9afecacd44af225896e1fd194d49155e82088 100644 GIT binary patch delta 636 zcmV-?0)zei6sQG2iBL{Q4GJ0x0000DNk~Le0000c0000V2nGNE0Ev5|v z5QV?Ja~q%qT5t>85}XpC1X2Pn!6_jwAt@o05SL(=u=j@+1F}FoY?3ph@n|K%Vc)W- zD!&nbewx4#{&puKQU&(Zs(KoFfQV$k4ye7Q4ER*l&(*{{l%1EqjFAHp;0UBPuYpB` ze{N9K-~bf(w%-eo4DIcl`2gNy`=*STj}@LqVyJ<)B?|H}O3eJ@VAH*b>>u&cDVP$K z2U^EIib(QAJ~u>(sp^&aCS8q5c}!Jn`XqU5T9Z~Hl8)_Pi@BM9Gn39D z=9x4Tk#cPR8qBVho=MB4CKZufM2Ks7Eb%sLy&^wY;+FbYpxtTwE$Cyo*69+EXLhdYf6B)i z#W^T&P96Mu>v9v|Dk6RaHokT4NdsTdqyV+wXoG0y_6%qY7p-@Z*NIXE(w;mJw!txx z-1`8r=0kS@B`EN5cVGLxUW5le)X;Jj(fFIQs(Y=~Ccd z@We)@OmQYlI`a#GU}%Qe#;3zHGL+%8mjSOjav9!?7~INIqOPwS-@7HTIrz1Is{98o Wz4EEk3Ma1s0000a3B5v delta 2656 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 O0000Kxr7{WKm@jWL;A!B$9Gm}X~ zRe1;fSsS3Q{#GwUBoEjWs(NY~Kty6-3lv^g3|v(8GMN$&)KgZ0*|os}5pV=Hc3l9o ze*oSYntW756u8>MZ@@oQy|oS|at3ayx|o8i+hA)sQ?_i4+vO!yW))n(6oII(X{{rj1P6HO0|_gD+Lk*a zkSp7?#*D^rKQrj9xt7o&Ix*s0YL#FbqqjL9eH+kUq)U+$EI4+x00000NkvXXu0mjf DosuF} delta 2682 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 diff --git a/doc/html/form_9.png b/doc/html/form_9.png index 7ee71570b9064208533e949afd6106b6f917a120..2c7af01d5db54cc8399e7a95abc21b1f44d4831c 100644 GIT binary patch delta 584 zcmV-O0=NBw74-x_iBL{Q4GJ0x0000DNk~Le0000V0000W2nGNE0P2FHK>z>%0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0005pNklv6&` z5QM+Wqye?y7TkhU0+awHKnZSvlmI1=5}<@o0+ew1p)&|Y61HQ)&1h`UWACwhwnbHW zmA$Y#Ow}?0q*#=y?S)qBH@o9CL`3*gq3k7aG z+VI`OxoWDKch;0rZnATDKJ@G33Cn?B$@ajxYfCkUVkfiB3dp8Cn^JtlzxY5TIedR; zfjv2?4y`vg{cnT+W+4Fn@wy0{(9~J)g_M3}lGRD;WT|!d4j8_{G^+Yx_cLT*UtZ{>WbXmHGqF WNpFS{p`lg)00000N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzP!yphv@8(+rSik}nvJ$cqus|iG5~ze!LLvbqG!lq}vkx>W>GnPibH3ruk2vX} z#~yy6lYY#!hX7;Cd|R{SJ-u9q(Ka=WO+4Z^@&f-lc&U@t>as5DiG1s#b(_rn=Cs&o z8Z>)mg&2Q;q|kWEKbU1|N_|7RY?b9kNy;amZjiDDRkGV`zZVHGDggLn&ZK}K$=0`d zEgI;g<@wotbGG%7vRvJ!ymXiL*^f_(QGp%^p%0+LX4U{xfH4vTVtn2zDNy=aW*vy2 zxi;fn>=Tff6hV}<_nGE87lSG9m#ZrBl+t~;*-a&0*Yy+0)@`f%{y>I&*`odcNl8JN T9yU^_00000NkvXXu0mjfOC$l; diff --git a/doc/html/form_90.png b/doc/html/form_90.png index 385fb14260ecb753b9664a83f69814ac1ccf4089..9e8c293ee01573fd285642ed0d1ed6d4c70ad468 100644 GIT binary patch delta 837 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 gzq0N8NjW&b{Z})4Au|*Eyf_e*N+N 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 diff --git a/doc/html/form_93.png b/doc/html/form_93.png index a507efde28b317ec5d6c4e2c205f694a41558976..7c4769a0a3ab6e2106944dc4bb2ff4dd9b3fd086 100644 GIT binary patch delta 654 zcmV;90&)F~6}kmLiBL{Q4GJ0x0000DNk~Le0000c0000W2nGNE0Dfc&vj6}90drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0006ZNklfD%XvPy#7o?+>qHTgD&QKr(qV9)!GFJ*`%& z2Qo8$BK~|gfj;~mVv1fb~s@0l7P#?R-go4G}wrWS>bYS(0C7)~#cb3f~HVw<{`7jF$yt zk*~1skPcKe2;j-gPD>`3ixx4j+Gqdze_>{Szk?KXucWNe-anE^jF?#7Xn#JENQ|LN z{9}$oNtvW{+;SNAkUa%exmbjl*rL4h!;_lXtY|mUB4%cL>fFk@=A+mE|Aq`CC9cy3 zqk3s8Ls4B_!^jKs$rsm0sHD<#DNssUOWI26&ee0Bgez&1$fL@u&BzsXh;68ae`jZ& zK1V@)4w9o*wdDx$t@}%&{-9tw>SgRAZtAg;s?Oz9igrsS2*(s{P%52>y5EaJp|@O^ z*{7Mk08hZXcdx07@T-|U_vKUr!M=o|ZU6uP delta 2672 zcmV-$3Xk==1&tMdiBL{Q4GJ0x0000DNk~Le0000W0000Q2mk;80Q2wx;{X5%_-R8! zP-JChVRdYDUuSY*c`j*VV*mh1iJg^sG}Qeb$G^YdZ}!D9GsezX$C5S6Aj=rrShBCF zXzW{zT}nwRl#*mCkqAYbC2f*Y5m9J=MjoL&r9~>0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPqe^0I$#K@I&vq*AI*axm+EQNVr4)lA^|qGkZ|6#!i2Ov@Wkt6yv2*uc8f7a~*7 zF>JqDa=8yGa@!ZM_bb=)X*pj`H&C&>_9H!ZskkU9kc2dvjhI8b6*5Iq%Pb_7h--81 zg5Tp8?MTeUF{&k3JIT e!9)0sYxf6zu(a0uaZf1#0000%j65Y*gh0N8NjW&b{Z})4Au|*Eyf_e*N+N zobx&Ff4%_VE5S0b2mrBhNql<`w!fc$00aCR!MwzHwws$X_${AC0rWHPYyJMsZ$XEI zCi0fEYk4;F;`vDcKvv7HmYNj*(<7FhwjuhLXa4kPFAvVL?*jlw`seOXl-T^F$gt2f zhUdnxq|{)4ekdc+o*$gf;Bq(&H~z-3$e7Uok55c zJr?*^rysn2bp_D}|Fh?x@RIo{|1i|AZU6xY0~(M7azF{F0WF{pjDZ=j0=B>rxB@TW z57q%5hybyG4^lxU*amVzKG+8if^tv=YC!{N24_KkJGca{ft#QY+yf)v2@rru@EXj4 zPhb&(AS^_NsE{Ni52-+!kUqqMEFfFR8S;Sqp&%$6ii47&OlUil4;4Y>P&L#5oq;Yu z*Pz?b5cCKdhi0Jn&{r6NNiYqTg;il4m<6+8C)f*K3x~rAa0Z+M?}ba@8u%pK2492w z;1O7V0KbOk5r7a8I--DRAuNQ0xFP{a7{W)kAbCg$QiC)jok%Zo9}yt4$QKj_MMW`C zS|~G=1Iio4LnWZLpbAjss1v9*R1fMtY8*9(`hg~+Wzd>vQ#2RthYm-lqI1zD=sI*O z`UZLgJ&FE=!C>eZCdL@!fbqvfVK!k3Fo!XJEtoFM5M}~1kHumov6@(OtSdGcn}p59 zmSIm~uVRO>li1HVB2FHskF&!C;No!ExDs3=?h0-gH-%foi{Mr8rg&F;2tFNOh_A(W z;s^1Q_(g&!fk`kYcoCuq+X$tEX2K1^Q^E%#k*G*CA-WSIiCc-K#M8uE#Bt&m5{0CH zLE?}CNy((WqUL@^^#*m4hM_TOTv`+@pLU8iK${bzh#83a zh^2{Dh+P&F&=I;SolB3Q7t+ttN9kY1WyRUzq2jy6o5hF47bK)5tRzAu@+4X$MkKyU zG9+y!qb2uCwo5*fLP=>zxl5%=9g(^rH7iY%Hk0N_=SiQHek=paXvlcTY?3*DCetr7 zFDoZ&FB>mgCVO3WR*o)bB^M=EEO$k2MxH8fAs;DUEPqx06+?`{X2dW`89j_S1sMeg zg=B?lg#m>{MW&*+Vzy$7;xi?J5=$vesaUC7X--*Q*+n^1xk>r43SNb!5}|TPrB`J^ zm8t5hx>L1Xb($%`qwFl}Lb(VUx`eF5Z8nA|;MubL%#-Jvw zX`~scd02C31$u?aintXuE5@`)T5PQpttPE;ZMwFzcD8oA_8T2#odBKvI=wnSbPaW5 zbZd2==uz|>^|JLk_1^1i==1a|^dGDwue4j4wX$R7I|EIFP=g}|4-Kh*hAxIX4Z97$ z8yOq%jhc;SjFpXpj4O@DSTvR!tAKUO1Z`q%l4Wwq^IiB)_m($ z>jjP}XEUeE2C=cX$+H=Mu%*~~+m_otw^OtWw`;PSvp2NgWZ&h0c5rgo?=Z%dM$IXsCP9!H!r*fwk&Kk~q=S~;c#nI(}%hS~=tK(L;y8>6P>jBqiZcMiXw~Ou= zcQ^M6_m>`e9+@7!o>b5Eo{gTLysW(ny`Ffhc_({!`w064`ZV}|Ecn{^7WoSNbo@5^ z_4!NrNBVaJU;}&t>H_B1*seLaW-`z)FgI{?Epu(!+S}`-*2S#5yk2;H@cMH>=pf&q z#-MM(uE90I^BcGuDmTpWIJ`r=*CAFR#UV4H=AlKQQ(@*|MPbw7=HUmzXCf>kN+M<> zIg#a&@1h){s-hNuqFtlwqnBcQV_ITyu|csH;wW*^aXlO5Hl}SHir0+KjTa=CCLBzd z<2&)|5~0Mki5*F_ATaXGVC&rZ$fS2 zZR*Zc$lR7WzL~wbdJD8=!i{5sBH(NKmDEs4f-|d|_vN>CG zCU)5GXv!7J<>!v=G}~FV3$-h9*TC+TyUTX}$P3B4ldqd!lK-uMS8!*K-k#DuOMAoi z4ip*{9@&T47q@S8zvccDMWRI+MH2^H4zv|Bit~y;9$bI$c8Nhr)gi*6MsMeGm!yHRF z_OjNew)Z&ectf33U4Gs7`nY<*36B#!4aN-(jWUgeO>k3k)6B`hllM;9oa$)SYOZdf zx8$D&r;|^=Iumqe^sLj_?sKej&F59lSGH1H^V*<)w)D2S_K0>thkwV=1;-2Boo1b_ z7qu_eUsAYKaartg;T6J_oGVLLGp^2e#dpnK3%@qey}tX&b-(Kmdfa;kZaCezb<^(V z^Vy7oTi>ihi2+OypU~bD8Hgf2jY_ zA}|tM9=93qf8qJ!$pmlW^`D7=QlU`j{k1yeZdFG5A`264L)|yyUjoU6#Hp$A@8%~=M!I8UwXg# zew|uO{f7Nk`d$5d=MSeJPnTksmi`7W-f!UQi*LY@KstXjE-}KLzPiH~@0(AgSSw^}r@1tt^tHH%>C35&$Sfurd6KNg*bMY*J){@&%Ou$><#bdLq!h zQJ?_(BLX;Sxl&mYvGkRm%N{Sf_2w!r3~j^fKQ`VRv5G$dJneMCq|gTg$(eB*b;Lpd O0000!;cdb& z5QV?1Simc!BV+|SLRVmgtYAi921aN{U$OlJe~iiKyO za}KpGW}}D<6ha{)ZX&D2>?Pm8{>gMI?pisgvS}zhF&CQ}l7(UibWV3qt?Qb^xL5UA z*sJj??1~j_v{3xc>J%OdF%Kl2qT)zoOuI;_vRo*pC|2%@SrB@sQ{>?8nP=U=-I6nP z76u+Ry1xgW@6!<-k-_1QV@Ua8i&nvV{x{a(2AmW8?c{l)SpWb407*qoM6N<$f{6&N A;s5{u delta 2570 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 diff --git a/doc/html/form_96.png b/doc/html/form_96.png index d61ad5adb744014ba9a11e3bb50acc3b6f69eda3..26387690e4560315b0750dec2596ee49f4dc4389 100644 GIT binary patch delta 602 zcmV-g0;T==6ov&riBL{Q4GJ0x0000DNk~Le0000X0000W2nGNE0GzlH$^ZZW0drDE zLIK&yEPnt100v@9M??Vs0RI60puMM)lO+i{e=;sH!(Y^i0005)Nkl>vf|* z428eDCk@a7TLN1GEw}|zf?Hrq@RmSIa7us@oD!T8lpko8hj~n}muz$nhp|T^U1{!U zgv^YumLFdY0KO{-NvWh#(pi#8x=5=1T}n!Ny1As&s!=nGdVmzD00YjzVKkorB~be~ ze*>;Sv1&UKz|oywfP6)_a3EJ-lidvhIJvPJNFqU>ea$sW|Iq+^-NDyYcY*NzHBW0A z3!ujz1CE?xZ>jL@y)#exjtUBe_Rc(Kat@omS@W!(32f>1>X4Yzn$7%-yMa&!^u0+wF|p}$Y_smGgZ+3McJN`7a;Q*kuYj_ oR*Cs2St{wffmo9N;)D1DqS6d?5dRLsQUCw|07*qoM6N<$f`cvy9smFU delta 2652 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 KMNUMnLSTYM=kVD8 diff --git a/doc/html/form_97.png b/doc/html/form_97.png index b02145d034e2ed8d45cfab7099d952741c35928f..4966dd78405d9ae86ed41bf1793da9cb0208a635 100644 GIT binary patch delta 284 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 BrS1R# diff --git a/doc/html/form_98.png b/doc/html/form_98.png index 0eb9dd4690c838aa0fdd09b3da362817254687b5..c3eda43a9c39d921c189e1ceb671dd94389774c8 100644 GIT binary patch delta 4439 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 delta 4967 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 diff --git a/doc/html/form_99.png b/doc/html/form_99.png index 24ba386a8d2ba633ee33914157f983297e7c914a..f3e495c17e4533498e78c3e4d0a508eb2ab5f4f7 100644 GIT binary patch delta 3118 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 delta 4125 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 bH~{<)3pU{{Sk&)x00000NkvXXu0mjf+1uTK diff --git a/doc/html/formula.repository b/doc/html/formula.repository index 6fc092c27..13b4e4e9f 100644 --- a/doc/html/formula.repository +++ b/doc/html/formula.repository @@ -222,15 +222,15 @@ \_form#207=50x17:$R_{meas,h}$ \_form#208=38x15:$R_{clear}$ \_form#209=149x17:\[ - R_{clear,h} = R_{clear}\mathrm{cos}\,\theta_s. -\] + R_{clear,h} = R_{clear}\mathrm{cos}\,\theta_s. + \] \_form#210=206x36:\[ - f_{diff} = 1-\frac{R_{meas,h} - R_{clear,h}}{R_{clear,h}}, -\] + f_{diff} = 1-\frac{R_{meas,h} - R_{clear,h}}{R_{clear,h}}, + \] \_form#211=89x17:$0\leq f_{diff} \leq 1$ \_form#212=162x36:\[ - R_{model} = R_{clear}\frac{R_{meas,h}}{R_{clear,h}}. -\] + R_{model} = R_{clear}\frac{R_{meas,h}}{R_{clear,h}}. + \] \_form#213=122x17:$(\theta-\theta_w)/(\theta_f-\theta_w)$ \_form#214=56x17:$\theta,\,\theta_f,\,\theta_w$ \_form#215=14x15:$h_s$ diff --git a/doc/html/functions.html b/doc/html/functions.html index cc22f1e98..e69cc24e0 100644 --- a/doc/html/functions.html +++ b/doc/html/functions.html @@ -38,31 +38,43 @@ Logo -

     v1.3.25 +
     v1.3.26
    - + + +
    +

      + diff --git a/doc/html/functions_b.html b/doc/html/functions_b.html index e2a34fbda..35160e596 100644 --- a/doc/html/functions_b.html +++ b/doc/html/functions_b.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - b -

      + diff --git a/doc/html/functions_d.html b/doc/html/functions_d.html index 46e9046b5..a3de14c92 100644 --- a/doc/html/functions_d.html +++ b/doc/html/functions_d.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - d -

      + diff --git a/doc/html/functions_e.html b/doc/html/functions_e.html index f82850709..8dbbb0f02 100644 --- a/doc/html/functions_e.html +++ b/doc/html/functions_e.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - e -

      + diff --git a/doc/html/functions_enum.html b/doc/html/functions_enum.html index e633f784b..160074df0 100644 --- a/doc/html/functions_enum.html +++ b/doc/html/functions_enum.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
        +
        Here is a list of all documented enums with links to the struct/union documentation for each field:
      +
      diff --git a/doc/html/functions_eval.html b/doc/html/functions_eval.html index 64f1bef0b..685a6b717 100644 --- a/doc/html/functions_eval.html +++ b/doc/html/functions_eval.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
        +
        Here is a list of all documented enum values with links to the struct/union documentation for each field:
      +
      diff --git a/doc/html/functions_f.html b/doc/html/functions_f.html index d43afec12..07e8d21ee 100644 --- a/doc/html/functions_f.html +++ b/doc/html/functions_f.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      - f -

      + diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html index 2fc9fd62c..7ea2cacab 100644 --- a/doc/html/functions_func.html +++ b/doc/html/functions_func.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - a -

      +
      diff --git a/doc/html/functions_func_b.html b/doc/html/functions_func_b.html index 1380aba6e..c5754eb80 100644 --- a/doc/html/functions_func_b.html +++ b/doc/html/functions_func_b.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      + diff --git a/doc/html/functions_func_c.html b/doc/html/functions_func_c.html index 7945a0cd7..2073c888c 100644 --- a/doc/html/functions_func_c.html +++ b/doc/html/functions_func_c.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - c -

      +
      diff --git a/doc/html/functions_func_d.html b/doc/html/functions_func_d.html index 58eff032e..b1743c948 100644 --- a/doc/html/functions_func_d.html +++ b/doc/html/functions_func_d.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - d -

      +
      diff --git a/doc/html/functions_func_e.html b/doc/html/functions_func_e.html index 26b79b9e0..2e6209648 100644 --- a/doc/html/functions_func_e.html +++ b/doc/html/functions_func_e.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - e -

      • enableCameraModelVisualization() : RadiationModel
      • @@ -115,7 +127,8 @@

        - e -

      +
      diff --git a/doc/html/functions_func_f.html b/doc/html/functions_func_f.html index 8bf3319f4..43196cee2 100644 --- a/doc/html/functions_func_f.html +++ b/doc/html/functions_func_f.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - f -

      +
      diff --git a/doc/html/functions_func_g.html b/doc/html/functions_func_g.html index 1664e660d..f26d40b1f 100644 --- a/doc/html/functions_func_g.html +++ b/doc/html/functions_func_g.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - g -

      • gapfillMisses() : LiDARcloud
      • @@ -321,7 +333,8 @@

        - g -

      +
      diff --git a/doc/html/functions_func_h.html b/doc/html/functions_func_h.html index 212291d92..20c79fcc7 100644 --- a/doc/html/functions_func_h.html +++ b/doc/html/functions_func_h.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - h -

      +
      diff --git a/doc/html/functions_func_i.html b/doc/html/functions_func_i.html index 8cb6bae60..79f8a897d 100644 --- a/doc/html/functions_func_i.html +++ b/doc/html/functions_func_i.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - i -

      +
      diff --git a/doc/html/functions_func_j.html b/doc/html/functions_func_j.html index 749af4423..6cf922baa 100644 --- a/doc/html/functions_func_j.html +++ b/doc/html/functions_func_j.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - j -

      +
      diff --git a/doc/html/functions_func_l.html b/doc/html/functions_func_l.html index 8cfde6ee3..2aa882f41 100644 --- a/doc/html/functions_func_l.html +++ b/doc/html/functions_func_l.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - l -

      • lastHitFilter() : LiDARcloud
      • @@ -109,7 +121,8 @@

        - l -

      +
      diff --git a/doc/html/functions_func_m.html b/doc/html/functions_func_m.html index 5f046d515..d6f926e47 100644 --- a/doc/html/functions_func_m.html +++ b/doc/html/functions_func_m.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - m -

      +
      diff --git a/doc/html/functions_func_n.html b/doc/html/functions_func_n.html index 0f7282336..42acd03ec 100644 --- a/doc/html/functions_func_n.html +++ b/doc/html/functions_func_n.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - n -

      +
      diff --git a/doc/html/functions_func_o.html b/doc/html/functions_func_o.html index a4b2b3d0a..b2ff633de 100644 --- a/doc/html/functions_func_o.html +++ b/doc/html/functions_func_o.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - o -

      +
      diff --git a/doc/html/functions_func_p.html b/doc/html/functions_func_p.html index b30654515..fb0596ccc 100644 --- a/doc/html/functions_func_p.html +++ b/doc/html/functions_func_p.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - p -

      +
      diff --git a/doc/html/functions_func_q.html b/doc/html/functions_func_q.html index a8e53f0e2..9018340e6 100644 --- a/doc/html/functions_func_q.html +++ b/doc/html/functions_func_q.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - q -

      +
      diff --git a/doc/html/functions_func_r.html b/doc/html/functions_func_r.html index 293c59a75..23e013107 100644 --- a/doc/html/functions_func_r.html +++ b/doc/html/functions_func_r.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - r -

      +
      diff --git a/doc/html/functions_func_s.html b/doc/html/functions_func_s.html index 27d943b98..fc3acf84c 100644 --- a/doc/html/functions_func_s.html +++ b/doc/html/functions_func_s.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - s -

      • sampleChildShootType() : Shoot
      • @@ -219,7 +231,8 @@

        - s -

      +
      diff --git a/doc/html/functions_func_t.html b/doc/html/functions_func_t.html index ff403dd30..3d3f3af5e 100644 --- a/doc/html/functions_func_t.html +++ b/doc/html/functions_func_t.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - t -

      +
      diff --git a/doc/html/functions_func_u.html b/doc/html/functions_func_u.html index d8d1e3178..3642502e1 100644 --- a/doc/html/functions_func_u.html +++ b/doc/html/functions_func_u.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - u -

      +
      diff --git a/doc/html/functions_func_v.html b/doc/html/functions_func_v.html index dba299240..30ddf71a5 100644 --- a/doc/html/functions_func_v.html +++ b/doc/html/functions_func_v.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - v -

      +
      diff --git a/doc/html/functions_func_w.html b/doc/html/functions_func_w.html index 3b5c52144..c2e260044 100644 --- a/doc/html/functions_func_w.html +++ b/doc/html/functions_func_w.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - w -

      +
      diff --git a/doc/html/functions_func_x.html b/doc/html/functions_func_x.html index 9c4cea371..319ae45c1 100644 --- a/doc/html/functions_func_x.html +++ b/doc/html/functions_func_x.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - x -

      • xyzFilter() : LiDARcloud
      • @@ -93,7 +105,8 @@

        - x -

      +
      diff --git a/doc/html/functions_func_~.html b/doc/html/functions_func_~.html index 068602267..ca2943220 100644 --- a/doc/html/functions_func_~.html +++ b/doc/html/functions_func_~.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented functions with links to the struct/union documentation for each field:

      - ~ -

      +
      diff --git a/doc/html/functions_g.html b/doc/html/functions_g.html index ddd6a5b9b..1601e7c3b 100644 --- a/doc/html/functions_g.html +++ b/doc/html/functions_g.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      - g -

      + diff --git a/doc/html/functions_h.html b/doc/html/functions_h.html index 878e7a02f..1a1352a47 100644 --- a/doc/html/functions_h.html +++ b/doc/html/functions_h.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - h -

      + diff --git a/doc/html/functions_i.html b/doc/html/functions_i.html index e3590743f..cc1ae00b8 100644 --- a/doc/html/functions_i.html +++ b/doc/html/functions_i.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - i -

      + diff --git a/doc/html/functions_j.html b/doc/html/functions_j.html index a72a9f654..8d553890c 100644 --- a/doc/html/functions_j.html +++ b/doc/html/functions_j.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - j -

      + diff --git a/doc/html/functions_l.html b/doc/html/functions_l.html index 707c908f6..7abae0fd0 100644 --- a/doc/html/functions_l.html +++ b/doc/html/functions_l.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - l -

      + diff --git a/doc/html/functions_m.html b/doc/html/functions_m.html index 6f51042f1..005243b8e 100644 --- a/doc/html/functions_m.html +++ b/doc/html/functions_m.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - m -

      + diff --git a/doc/html/functions_n.html b/doc/html/functions_n.html index 5932027ca..e84d0582a 100644 --- a/doc/html/functions_n.html +++ b/doc/html/functions_n.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - n -

      + diff --git a/doc/html/functions_o.html b/doc/html/functions_o.html index 2bc1d1453..1597db855 100644 --- a/doc/html/functions_o.html +++ b/doc/html/functions_o.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - o -

      + diff --git a/doc/html/functions_p.html b/doc/html/functions_p.html index 05556946c..2306d4754 100644 --- a/doc/html/functions_p.html +++ b/doc/html/functions_p.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - p -

      + diff --git a/doc/html/functions_q.html b/doc/html/functions_q.html index 0fb8ae5db..b696f030b 100644 --- a/doc/html/functions_q.html +++ b/doc/html/functions_q.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - q -

      + diff --git a/doc/html/functions_r.html b/doc/html/functions_r.html index d8cf776c3..1b8af239f 100644 --- a/doc/html/functions_r.html +++ b/doc/html/functions_r.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - r -

      + diff --git a/doc/html/functions_rela.html b/doc/html/functions_rela.html index 4d0967098..c6c3583f4 100644 --- a/doc/html/functions_rela.html +++ b/doc/html/functions_rela.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      +
      diff --git a/doc/html/functions_s.html b/doc/html/functions_s.html index c91e7b4eb..a201cc5c2 100644 --- a/doc/html/functions_s.html +++ b/doc/html/functions_s.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      - s -

      + diff --git a/doc/html/functions_t.html b/doc/html/functions_t.html index f5a01e373..570f51830 100644 --- a/doc/html/functions_t.html +++ b/doc/html/functions_t.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - t -

      + diff --git a/doc/html/functions_u.html b/doc/html/functions_u.html index d85105ea6..c3775161f 100644 --- a/doc/html/functions_u.html +++ b/doc/html/functions_u.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - u -

      + diff --git a/doc/html/functions_v.html b/doc/html/functions_v.html index a0158491f..9e7146639 100644 --- a/doc/html/functions_v.html +++ b/doc/html/functions_v.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - v -

      + diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html index a79a18793..9aed1168d 100644 --- a/doc/html/functions_vars.html +++ b/doc/html/functions_vars.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - a -

      +
      diff --git a/doc/html/functions_vars_b.html b/doc/html/functions_vars_b.html index 84cc1455b..2a39c9ee7 100644 --- a/doc/html/functions_vars_b.html +++ b/doc/html/functions_vars_b.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - b -

      +
      diff --git a/doc/html/functions_vars_c.html b/doc/html/functions_vars_c.html index 62b56c43d..734993f00 100644 --- a/doc/html/functions_vars_c.html +++ b/doc/html/functions_vars_c.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - c -

      +
      diff --git a/doc/html/functions_vars_d.html b/doc/html/functions_vars_d.html index b87b97768..bcbb73166 100644 --- a/doc/html/functions_vars_d.html +++ b/doc/html/functions_vars_d.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - d -

      +
      diff --git a/doc/html/functions_vars_e.html b/doc/html/functions_vars_e.html index 0738b8e3b..dde212760 100644 --- a/doc/html/functions_vars_e.html +++ b/doc/html/functions_vars_e.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - e -

      +
      diff --git a/doc/html/functions_vars_f.html b/doc/html/functions_vars_f.html index dca6c6c0d..ec367ff2f 100644 --- a/doc/html/functions_vars_f.html +++ b/doc/html/functions_vars_f.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - f -

      +
      diff --git a/doc/html/functions_vars_g.html b/doc/html/functions_vars_g.html index 32a824c1c..4c0001f85 100644 --- a/doc/html/functions_vars_g.html +++ b/doc/html/functions_vars_g.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - g -

      +
      diff --git a/doc/html/functions_vars_h.html b/doc/html/functions_vars_h.html index 171eafeb4..f1becb24b 100644 --- a/doc/html/functions_vars_h.html +++ b/doc/html/functions_vars_h.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - h -

      +
      diff --git a/doc/html/functions_vars_l.html b/doc/html/functions_vars_l.html index 8daf0188b..9a2ce0df8 100644 --- a/doc/html/functions_vars_l.html +++ b/doc/html/functions_vars_l.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - l -

      +
      diff --git a/doc/html/functions_vars_m.html b/doc/html/functions_vars_m.html index f6979dfae..ae42274cc 100644 --- a/doc/html/functions_vars_m.html +++ b/doc/html/functions_vars_m.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - m -

      • midrib_fold_fraction : LeafPrototype
      • @@ -97,7 +109,8 @@

        - m -

      +
      diff --git a/doc/html/functions_vars_n.html b/doc/html/functions_vars_n.html index 9b94b2cc2..2474a649e 100644 --- a/doc/html/functions_vars_n.html +++ b/doc/html/functions_vars_n.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - n -

      +
      diff --git a/doc/html/functions_vars_o.html b/doc/html/functions_vars_o.html index 94bcc9370..b1028f1a4 100644 --- a/doc/html/functions_vars_o.html +++ b/doc/html/functions_vars_o.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - o -

      +
      diff --git a/doc/html/functions_vars_p.html b/doc/html/functions_vars_p.html index 9e26b527e..ba901d214 100644 --- a/doc/html/functions_vars_p.html +++ b/doc/html/functions_vars_p.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - p -

      • periodic_depth : PerRayData
      • @@ -107,7 +119,8 @@

        - p -

      +
      diff --git a/doc/html/functions_vars_r.html b/doc/html/functions_vars_r.html index 27676c5cd..1d45f936e 100644 --- a/doc/html/functions_vars_r.html +++ b/doc/html/functions_vars_r.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - r -

      +
      diff --git a/doc/html/functions_vars_s.html b/doc/html/functions_vars_s.html index f3b2712df..473b57654 100644 --- a/doc/html/functions_vars_s.html +++ b/doc/html/functions_vars_s.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - s -

      +
      diff --git a/doc/html/functions_vars_t.html b/doc/html/functions_vars_t.html index ac370eb0a..98c610d98 100644 --- a/doc/html/functions_vars_t.html +++ b/doc/html/functions_vars_t.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - t -

      +
      diff --git a/doc/html/functions_vars_u.html b/doc/html/functions_vars_u.html index 306ebb628..1741951a9 100644 --- a/doc/html/functions_vars_u.html +++ b/doc/html/functions_vars_u.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - u -

      +
      diff --git a/doc/html/functions_vars_v.html b/doc/html/functions_vars_v.html index 955b6f5c2..76286e9be 100644 --- a/doc/html/functions_vars_v.html +++ b/doc/html/functions_vars_v.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - v -

      • vegetative_bud_break_probability_decay_rate : ShootParameters
      • @@ -93,7 +105,8 @@

        - v -

      +
      diff --git a/doc/html/functions_vars_w.html b/doc/html/functions_vars_w.html index 7f46a3c82..b5a0ee68c 100644 --- a/doc/html/functions_vars_w.html +++ b/doc/html/functions_vars_w.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - w -

      +
      diff --git a/doc/html/functions_vars_x.html b/doc/html/functions_vars_x.html index 9a35b6939..6d31c8aab 100644 --- a/doc/html/functions_vars_x.html +++ b/doc/html/functions_vars_x.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - x -

      +
      diff --git a/doc/html/functions_vars_y.html b/doc/html/functions_vars_y.html index 5be3d0760..58af72eb5 100644 --- a/doc/html/functions_vars_y.html +++ b/doc/html/functions_vars_y.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - y -

      +
      diff --git a/doc/html/functions_vars_z.html b/doc/html/functions_vars_z.html index 39902f471..b013b92d2 100644 --- a/doc/html/functions_vars_z.html +++ b/doc/html/functions_vars_z.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      -  +
      Here is a list of all documented variables with links to the struct/union documentation for each field:

      - z -

      +
      diff --git a/doc/html/functions_w.html b/doc/html/functions_w.html index 2b0ecca59..a6d323a99 100644 --- a/doc/html/functions_w.html +++ b/doc/html/functions_w.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      - w -

      + diff --git a/doc/html/functions_x.html b/doc/html/functions_x.html index 721298f94..66283cd41 100644 --- a/doc/html/functions_x.html +++ b/doc/html/functions_x.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - x -

      + diff --git a/doc/html/functions_y.html b/doc/html/functions_y.html index 17db906b9..ee0e97e60 100644 --- a/doc/html/functions_y.html +++ b/doc/html/functions_y.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - y -

      + diff --git a/doc/html/functions_z.html b/doc/html/functions_z.html index 700532188..27a57f549 100644 --- a/doc/html/functions_z.html +++ b/doc/html/functions_z.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - z -

      + diff --git a/doc/html/functions_~.html b/doc/html/functions_~.html index b05bc3dc0..729d7c89e 100644 --- a/doc/html/functions_~.html +++ b/doc/html/functions_~.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
      +
      - ~ -

      + diff --git a/doc/html/global_8cpp.html b/doc/html/global_8cpp.html index 445e007f2..16f9fb265 100644 --- a/doc/html/global_8cpp.html +++ b/doc/html/global_8cpp.html @@ -38,30 +38,41 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
    +
    Data Structures | @@ -111,82 +123,82 @@ - + - +

    Macros

    #define PNG_DEBUG   3
    #define PNG_DEBUG   3
     
    #define PNG_SKIP_SETJMP_CHECK   1
    #define PNG_SKIP_SETJMP_CHECK   1
     
    - +

    Typedefs

    typedef struct jpg_error_mgrjpg_error_ptr
    typedef struct jpg_error_mgrjpg_error_ptr
     
    - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    +
    template void helios::resize_vector< std::string > (std::vector< std::vector< std::string > > &, uint, uint)
     
    +
    template void helios::resize_vector< helios::vec2 > (std::vector< std::vector< helios::vec2 > > &, uint, uint)
     
    +
    template void helios::resize_vector< helios::vec3 > (std::vector< std::vector< helios::vec3 > > &, uint, uint)
     
    +
    template void helios::resize_vector< helios::vec4 > (std::vector< std::vector< helios::vec4 > > &, uint, uint)
     
    +
    template void helios::resize_vector< helios::int2 > (std::vector< std::vector< helios::int2 > > &, uint, uint)
     
    +
    template void helios::resize_vector< helios::int3 > (std::vector< std::vector< helios::int3 > > &, uint, uint)
     
    +
    template void helios::resize_vector< helios::int4 > (std::vector< std::vector< helios::int4 > > &, uint, uint)
     
    +
    template void helios::resize_vector< std::string > (std::vector< std::vector< std::vector< std::string > > > &, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::vec2 > (std::vector< std::vector< std::vector< helios::vec2 > > > &, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::vec3 > (std::vector< std::vector< std::vector< helios::vec3 > > > &, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::vec4 > (std::vector< std::vector< std::vector< helios::vec4 > > > &, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::int2 > (std::vector< std::vector< std::vector< helios::int2 > > > &, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::int3 > (std::vector< std::vector< std::vector< helios::int3 > > > &, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::int4 > (std::vector< std::vector< std::vector< helios::int4 > > > &, uint, uint, uint)
     
    +
    template void helios::resize_vector< std::string > (std::vector< std::vector< std::vector< std::vector< std::string > > > > &, uint, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::vec2 > (std::vector< std::vector< std::vector< std::vector< helios::vec2 > > > > &, uint, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::vec3 > (std::vector< std::vector< std::vector< std::vector< helios::vec3 > > > > &, uint, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::vec4 > (std::vector< std::vector< std::vector< std::vector< helios::vec4 > > > > &, uint, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::int2 > (std::vector< std::vector< std::vector< std::vector< helios::int2 > > > > &, uint, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::int3 > (std::vector< std::vector< std::vector< std::vector< helios::int3 > > > > &, uint, uint, uint, uint)
     
    +
    template void helios::resize_vector< helios::int4 > (std::vector< std::vector< std::vector< std::vector< helios::int4 > > > > &, uint, uint, uint, uint)
     
     METHODDEF (void) jpg_error_exit(j_common_ptr cinfo)
     METHODDEF (void) jpg_error_exit(j_common_ptr cinfo)
     

    Detailed Description

    @@ -256,8 +268,7 @@

    METHODDEF ( - void  - ) + void ) @@ -270,7 +281,8 @@

    +

    diff --git a/doc/html/global_8cpp_source.html b/doc/html/global_8cpp_source.html index cd37d70a9..a5c1ba694 100644 --- a/doc/html/global_8cpp_source.html +++ b/doc/html/global_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    global.cpp
    @@ -106,12 +118,14 @@
    26
    27using namespace helios;
    28
    +
    29void helios::helios_runtime_error( const std::string &error_message ){
    30#ifdef HELIOS_DEBUG
    31 std::cerr << error_message << std::endl;
    32#endif
    33 throw(std::runtime_error(error_message));
    34}
    +
    35
    36RGBcolor RGB::red = make_RGBcolor( 1.f, 0.f, 0.f );
    37RGBcolor RGB::blue = make_RGBcolor( 0.f, 0.f, 1.f );
    @@ -137,6 +151,7 @@
    59
    +
    60RGBcolor helios::blend(const RGBcolor &color0_RGB, const RGBcolor &color1_RGB, float weight_RGB ){
    61 RGBcolor color;
    62 weight_RGB = clamp(weight_RGB,0.f,1.f);
    @@ -145,7 +160,9 @@
    65 color.b = weight_RGB*color1_RGB.b+(1.f-weight_RGB)*color0_RGB.b;
    66 return color;
    67}
    +
    68
    +
    69RGBAcolor helios::blend(const RGBAcolor &color0_RGBA, const RGBAcolor &color1_RGBA, float weight_RGBA ){
    70 RGBAcolor color;
    71 weight_RGBA = clamp(weight_RGBA,0.f,1.f);
    @@ -155,11 +172,15 @@
    75 color.a = weight_RGBA*color1_RGBA.a+(1.f-weight_RGBA)*color0_RGBA.a;
    76 return color;
    77}
    +
    78
    +
    79vec3 helios::rotatePoint(const vec3& position, const SphericalCoord& rotation ) {
    80 return rotatePoint( position, rotation.elevation, rotation.azimuth );
    81}
    +
    82
    +
    83vec3 helios::rotatePoint(const vec3& position, float theta, float phi) {
    84
    85 if( theta==0.f && phi==0.f ){
    @@ -216,7 +237,9 @@
    136 return tmp;
    137
    138}
    +
    139
    +
    140vec3 helios::rotatePointAboutLine( const vec3& point, const vec3& line_base, const vec3& line_direction, float theta) {
    141
    142 if( theta==0.f ){
    @@ -251,7 +274,9 @@
    171 return position;
    172
    173}
    +
    174
    +
    175float helios::calculateTriangleArea( const vec3& v0, const vec3& v1, const vec3& v2 ){
    176 vec3 A( v1-v0 );
    177 vec3 B( v2-v0 );
    @@ -262,7 +287,9 @@
    182 float s = 0.5f*( a+b+c );
    183 return sqrtf( s*(s-a)*(s-b)*(s-c) );
    184}
    +
    185
    +
    187
    188 int skips_leap[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
    @@ -278,7 +305,9 @@
    198 return skips[month-1]+day;
    199
    200}
    +
    201
    +
    203 int JD = Calendar2Julian( *this );
    204 if( JD<365 || ( JD==356 && isLeapYear() ) ) {
    @@ -291,7 +320,9 @@
    211 year ++;
    212 }
    213}
    +
    214
    +
    216 if( (year-2000)%4 == 0 ){ //leap year
    217 return true;
    @@ -299,13 +330,17 @@
    219 return false;
    220 }
    221}
    +
    222
    +
    224
    225 return float(rand()) / float(RAND_MAX + 1.);
    226
    227}
    +
    228
    +
    229int helios::randu( int imin, int imax ){
    230
    231 float ru = randu();
    @@ -317,19 +352,25 @@
    237 }
    238
    239}
    +
    240
    +
    241float helios::acos_safe( float x ){
    242 if (x < -1.0) x = -1.0 ;
    243 else if (x > 1.0) x = 1.0 ;
    244 return acosf(x) ;
    245}
    +
    246
    +
    247float helios::asin_safe( float x ){
    248 if (x < -1.0) x = -1.0 ;
    249 else if (x > 1.0) x = 1.0 ;
    250 return asinf(x) ;
    251}
    +
    252
    +
    253bool helios::lineIntersection(const vec2 &p1, const vec2 &q1, const vec2 &p2, const vec2 &q2)
    254{
    255
    @@ -352,7 +393,9 @@
    272 return !(r < 0 || r > 1 || s < 0 || s > 1);
    273
    274}
    +
    275
    +
    276bool helios::pointInPolygon(const vec2 &point, const std::vector<vec2> &polygon_verts ){
    277
    278 std::vector<vec2> pverts = polygon_verts;
    @@ -382,14 +425,18 @@
    302 }
    303
    304}
    +
    305
    +
    306void helios::wait( float seconds ){
    307
    308 int msec = (int)lround( seconds*1000.f );
    309 std::this_thread::sleep_for(std::chrono::milliseconds(msec));
    310
    311}
    +
    312
    +
    313void helios::makeRotationMatrix( float rotation, const char* axis, float (&T)[16] ){
    314
    315 float sx = sin(rotation);
    @@ -441,7 +488,9 @@
    361 T[15]=1.f;
    362
    363}
    +
    364
    +
    365void helios::makeRotationMatrix( float rotation, const helios::vec3& axis, float (&T)[16] ){
    366
    367 vec3 u = axis;
    @@ -467,7 +516,9 @@
    387 T[15]=1.f;
    388
    389}
    +
    390
    +
    391void helios::makeRotationMatrix( float rotation, const helios::vec3& origin, const helios::vec3& axis, float (&T)[16] ){
    392
    393 //Construct inverse translation matrix to translate back to the origin
    @@ -512,7 +563,9 @@
    432 matmult(Ttrans,T,T);
    433
    434}
    +
    435
    +
    436void helios::makeTranslationMatrix( const helios::vec3& translation, float (&T)[16] ){
    437
    438 T[0] = 1.f; //(0,0)
    @@ -533,7 +586,9 @@
    453 T[15] = 1.f;//(3,3)
    454
    455}
    +
    456
    +
    457void helios::makeScaleMatrix( const helios::vec3& scale, float (&T)[16] ){
    458
    459 T[0] = scale.x; //(0,0)
    @@ -554,7 +609,9 @@
    474 T[15] = 1.f;//(3,3)
    475
    476}
    +
    477
    +
    478void helios::makeScaleMatrix( const helios::vec3 &scale, const helios::vec3 &point, float (&T)[16] ){
    479
    480 T[0] = scale.x; //(0,0)
    @@ -575,7 +632,9 @@
    495 T[15] = 1.f;//(3,3)
    496
    497}
    +
    498
    +
    499void helios::matmult( const float ML[16], const float MR[16], float (&T)[16] ){
    500
    501 float M[16]={0.f};
    @@ -593,7 +652,9 @@
    513 }
    514
    515}
    +
    516
    +
    517void helios::vecmult( const float M[16], const helios::vec3& v3, helios::vec3& result ){
    518
    519 float v[4];
    @@ -615,7 +676,9 @@
    535 result.z = V[2];
    536
    537}
    +
    538
    +
    539void helios::vecmult( const float M[16], const float v[3], float (&result)[3] ){
    540
    541 float V[4]={0.f};
    @@ -631,7 +694,9 @@
    551 }
    552
    553}
    +
    554
    +
    555void helios::makeIdentityMatrix( float (&T)[16] ){
    556
    557 /* [0,0] */ T[0] = 1.f;
    @@ -652,15 +717,21 @@
    572 /* [3,3] */ T[15] = 1.f;
    573
    574}
    +
    575
    +
    576float helios::deg2rad( float deg ){
    577 return deg*float(M_PI)/180.f;
    578}
    +
    579
    +
    580float helios::rad2deg( float rad ){
    581 return rad*180.f/float(M_PI);
    582}
    +
    583
    +
    584float helios::atan2_2pi(float y, float x){
    585
    586 float v=0;
    @@ -686,20 +757,26 @@
    606 return v;
    607
    608}
    +
    609
    +
    611
    612 float radius = sqrtf( Cartesian.x*Cartesian.x + Cartesian.y*Cartesian.y + Cartesian.z*Cartesian.z );
    613 return {radius, asin_safe( Cartesian.z/radius ), atan2_2pi( Cartesian.x, Cartesian.y )};
    614
    615}
    +
    616
    +
    618
    619 return {Spherical.radius*cosf(Spherical.elevation)*sinf(Spherical.azimuth), Spherical.radius*cosf(Spherical.elevation)*cosf(Spherical.azimuth), Spherical.radius*sinf(Spherical.elevation)};
    620
    621}
    +
    622
    +
    623vec2 helios::string2vec2( const char* str ){
    624
    625 float o[2] = {99999,99999};
    @@ -719,7 +796,9 @@
    639 return make_vec2( o[0], o[1] );
    640
    641}
    +
    642
    +
    643vec3 helios::string2vec3( const char* str ){
    644
    645 float o[3] = {99999,99999,99999};
    @@ -739,7 +818,9 @@
    659 return make_vec3( o[0], o[1], o[2] );
    660
    661}
    +
    662
    +
    663vec4 helios::string2vec4( const char* str ){
    664
    665 float o[4] = {99999,99999,99999,99999};
    @@ -759,7 +840,9 @@
    679 return make_vec4( o[0], o[1], o[2], o[3] );
    680
    681}
    +
    682
    +
    683int2 helios::string2int2( const char* str ){
    684
    685 int o[2] = {99999,99999};
    @@ -779,7 +862,9 @@
    699 return make_int2( o[0], o[1] );
    700
    701}
    +
    702
    +
    703int3 helios::string2int3( const char* str ){
    704
    705 int o[3] = {99999,99999,99999};
    @@ -799,7 +884,9 @@
    719 return make_int3( o[0], o[1], o[2] );
    720
    721}
    +
    722
    +
    723int4 helios::string2int4( const char* str ){
    724
    725 int o[4] = {99999,99999,99999,99999};
    @@ -819,7 +906,9 @@
    739 return make_int4( o[0], o[1], o[2], o[3] );
    740
    741}
    +
    742
    +
    744
    745 float o[4] = {0,0,0,1};
    @@ -839,7 +928,9 @@
    759 return make_RGBAcolor( o[0], o[1], o[2], o[3] );
    760
    761}
    +
    762
    +
    763bool helios::parse_float( const std::string &input_string, float &converted_float ){
    764
    765 try {
    @@ -855,7 +946,9 @@
    775 return true;
    776
    777}
    +
    778
    +
    779bool helios::parse_double( const std::string &input_string, double &converted_double ){
    780
    781 try {
    @@ -870,7 +963,9 @@
    790 return true;
    791
    792}
    +
    793
    +
    794bool helios::parse_int( const std::string &input_string, int &converted_int ){
    795
    796 try {
    @@ -885,7 +980,9 @@
    805 return true;
    806
    807}
    +
    808
    +
    809bool helios::parse_int2( const std::string &input_string, int2 &converted_int2 ){
    810
    811 std::istringstream vecstream(input_string);
    @@ -901,7 +998,9 @@
    821 return true;
    822
    823}
    +
    824
    +
    825bool helios::parse_int3( const std::string &input_string, int3 &converted_int3 ){
    826
    827 std::istringstream vecstream(input_string);
    @@ -918,7 +1017,9 @@
    838 return true;
    839
    840}
    +
    841
    +
    842bool helios::parse_uint( const std::string &input_string, uint &converted_uint ){
    843
    844 try {
    @@ -936,7 +1037,9 @@
    856 return true;
    857
    858}
    +
    859
    +
    860bool helios::parse_vec2( const std::string &input_string, vec2 &converted_vec2 ){
    861
    862 std::istringstream vecstream(input_string);
    @@ -952,7 +1055,9 @@
    872 return true;
    873
    874}
    +
    875
    +
    876bool helios::parse_vec3( const std::string &input_string, vec3 &converted_vec3 ){
    877
    878 std::istringstream vecstream(input_string);
    @@ -969,7 +1074,9 @@
    889 return true;
    890
    891}
    +
    892
    +
    893bool helios::parse_RGBcolor( const std::string &input_string, RGBcolor &converted_rgb ){
    894
    895 std::istringstream vecstream(input_string);
    @@ -989,6 +1096,7 @@
    909 return true;
    910
    911}
    +
    912
    913bool helios::open_xml_file( const std::string &xml_file, pugi::xml_document &xmldoc, std::string &error_string ) {
    914
    @@ -1019,6 +1127,7 @@
    939
    940}
    941
    +
    942int helios::parse_xml_tag_int(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function ){
    943 std::string value_string = node.child_value();
    944 if( value_string.empty() ){
    @@ -1030,7 +1139,9 @@
    950 }
    951 return value;
    952}
    +
    953
    +
    954float helios::parse_xml_tag_float( const pugi::xml_node &node, const std::string &tag, const std::string &calling_function ){
    955 std::string value_string = node.child_value();
    956 if( value_string.empty() ){
    @@ -1042,7 +1153,9 @@
    962 }
    963 return value;
    964}
    +
    965
    +
    966vec2 helios::parse_xml_tag_vec2( const pugi::xml_node &node, const std::string &tag, const std::string &calling_function ){
    967 std::string value_string = node.child_value();
    968 if( value_string.empty() ){
    @@ -1054,7 +1167,9 @@
    974 }
    975 return value;
    976}
    +
    977
    +
    978vec3 helios::parse_xml_tag_vec3( const pugi::xml_node &node, const std::string &tag, const std::string &calling_function ){
    979 std::string value_string = node.child_value();
    980 if( value_string.empty() ){
    @@ -1066,11 +1181,15 @@
    986 }
    987 return value;
    988}
    +
    989
    +
    990std::string helios::parse_xml_tag_string( const pugi::xml_node &node, const std::string &tag, const std::string &calling_function ){
    991 return deblank(node.child_value());
    992}
    +
    993
    +
    994std::string helios::deblank(const char* input)
    995{
    996 int i,j;
    @@ -1088,11 +1207,15 @@
    1008 return output_c;
    1009
    1010}
    +
    1011
    +
    1012std::string helios::deblank(const std::string &input){
    1013 return deblank(input.c_str());
    1014}
    +
    1015
    +
    1016std::string helios::trim_whitespace(const std::string &input){
    1017
    1018 const std::string WHITESPACE = " \n\r\t\f\v";
    @@ -1108,7 +1231,9 @@
    1028 return outstring;
    1029
    1030}
    +
    1031
    +
    1032std::vector<std::string> helios::separate_string_by_delimiter( const std::string &inputstring, const std::string &delimiter ){
    1033
    1034 std::vector<std::string> separated_string;
    @@ -1130,8 +1255,10 @@
    1050 return separated_string;
    1051
    1052}
    +
    1053
    1054template <typename anytype>
    +
    1055anytype helios::clamp( anytype value, anytype min, anytype max ){
    1056 if( value<min ){
    1057 value = min;
    @@ -1140,12 +1267,14 @@
    1060 }
    1061 return value;
    1062}
    +
    1063
    -
    1064template float helios::clamp<float>(float,float,float);
    -
    1065template double helios::clamp<double>(double,double,double);
    -
    1066template int helios::clamp<int>(int,int,int);
    -
    1067template uint helios::clamp<uint>(uint,uint,uint);
    +
    1064template float helios::clamp<float>(float,float,float);
    +
    1065template double helios::clamp<double>(double,double,double);
    +
    1066template int helios::clamp<int>(int,int,int);
    +
    1067template uint helios::clamp<uint>(uint,uint,uint);
    1068
    +
    1069float helios::sum( const std::vector<float>& vect ){
    1070
    1071 if( vect.empty() ){
    @@ -1160,7 +1289,9 @@
    1080 return m;
    1081
    1082}
    +
    1083
    +
    1084float helios::mean( const std::vector<float>& vect ){
    1085
    1086 if( vect.empty() ){
    @@ -1176,7 +1307,9 @@
    1096 return m;
    1097
    1098}
    +
    1099
    +
    1100float helios::min( const std::vector<float>& vect ){
    1101
    1102 if( vect.empty() ){
    @@ -1186,7 +1319,9 @@
    1106 return *std::min_element(vect.begin(),vect.end());
    1107
    1108}
    +
    1109
    +
    1110int helios::min( const std::vector<int>& vect ){
    1111
    1112 if( vect.empty() ){
    @@ -1196,7 +1331,9 @@
    1116 return *std::min_element(vect.begin(),vect.end());
    1117
    1118}
    +
    1119
    +
    1120vec3 helios::min( const std::vector<vec3>& vect ){
    1121
    1122 if( vect.empty() ){
    @@ -1222,7 +1359,9 @@
    1142 return vmin;
    1143
    1144}
    +
    1145
    +
    1146float helios::max( const std::vector<float>& vect ){
    1147
    1148 if( vect.empty() ){
    @@ -1232,7 +1371,9 @@
    1152 return *std::max_element(vect.begin(),vect.end());
    1153
    1154}
    +
    1155
    +
    1156int helios::max( const std::vector<int>& vect ){
    1157
    1158 if( vect.empty() ){
    @@ -1242,7 +1383,9 @@
    1162 return *std::max_element(vect.begin(),vect.end());
    1163
    1164}
    +
    1165
    +
    1166vec3 helios::max( const std::vector<vec3>& vect ){
    1167
    1168 if( vect.empty() ){
    @@ -1268,7 +1411,9 @@
    1188 return vmax;
    1189
    1190}
    +
    1191
    +
    1192float helios::stdev( const std::vector<float> &vect ){
    1193
    1194 if( vect.empty() ){
    @@ -1290,7 +1435,9 @@
    1210
    1211 return sqrtf(stdev/float(size));
    1212}
    +
    1213
    +
    1214float helios::median( std::vector<float> vect ){
    1215
    1216 if( vect.empty() ){
    @@ -1314,19 +1461,22 @@
    1234 }
    1235 return median;
    1236}
    +
    1237
    1238template <typename anytype>
    +
    1239void helios::resize_vector( std::vector<std::vector<anytype> > &vec, uint Nx, uint Ny ){
    1240 vec.resize(Ny);
    1241 for( int j=0; j<Ny; j++ ){
    1242 vec.at(j).resize(Nx);
    1243 }
    1244}
    +
    1245
    -
    1246template void helios::resize_vector<float>( std::vector<std::vector<float> > &, uint, uint );
    -
    1247template void helios::resize_vector<double>( std::vector<std::vector<double> > &, uint, uint );
    -
    1248template void helios::resize_vector<int>( std::vector<std::vector<int> > &, uint, uint );
    -
    1249template void helios::resize_vector<uint>( std::vector<std::vector<uint> > &, uint, uint );
    +
    1246template void helios::resize_vector<float>( std::vector<std::vector<float> > &, uint, uint );
    +
    1247template void helios::resize_vector<double>( std::vector<std::vector<double> > &, uint, uint );
    +
    1248template void helios::resize_vector<int>( std::vector<std::vector<int> > &, uint, uint );
    +
    1249template void helios::resize_vector<uint>( std::vector<std::vector<uint> > &, uint, uint );
    1250template void helios::resize_vector<std::string>( std::vector<std::vector<std::string> > &, uint, uint );
    1251template void helios::resize_vector<helios::vec2>( std::vector<std::vector<helios::vec2> > &, uint, uint );
    1252template void helios::resize_vector<helios::vec3>( std::vector<std::vector<helios::vec3> > &, uint, uint );
    @@ -1336,6 +1486,7 @@
    1256template void helios::resize_vector<helios::int4>( std::vector<std::vector<helios::int4> > &, uint, uint );
    1257
    1258template <typename anytype>
    +
    1259void helios::resize_vector( std::vector<std::vector<std::vector<anytype> > > &vec, uint Nx, uint Ny, uint Nz ){
    1260 vec.resize(Nz);
    1261 for( int k=0; k<Nz; k++ ){
    @@ -1345,11 +1496,12 @@
    1265 }
    1266 }
    1267}
    +
    1268
    -
    1269template void helios::resize_vector<float>( std::vector<std::vector<std::vector<float> > > &, uint, uint, uint );
    -
    1270template void helios::resize_vector<double>( std::vector<std::vector<std::vector<double> > > &, uint, uint, uint );
    -
    1271template void helios::resize_vector<int>( std::vector<std::vector<std::vector<int> > > &, uint, uint, uint );
    -
    1272template void helios::resize_vector<uint>( std::vector<std::vector<std::vector<uint> > > &, uint, uint, uint );
    +
    1269template void helios::resize_vector<float>( std::vector<std::vector<std::vector<float> > > &, uint, uint, uint );
    +
    1270template void helios::resize_vector<double>( std::vector<std::vector<std::vector<double> > > &, uint, uint, uint );
    +
    1271template void helios::resize_vector<int>( std::vector<std::vector<std::vector<int> > > &, uint, uint, uint );
    +
    1272template void helios::resize_vector<uint>( std::vector<std::vector<std::vector<uint> > > &, uint, uint, uint );
    1273template void helios::resize_vector<std::string>( std::vector<std::vector<std::vector<std::string> > > &, uint, uint, uint );
    1274template void helios::resize_vector<helios::vec2>( std::vector<std::vector<std::vector<helios::vec2> > > &, uint, uint, uint );
    1275template void helios::resize_vector<helios::vec3>( std::vector<std::vector<std::vector<helios::vec3> > > &, uint, uint, uint );
    @@ -1359,6 +1511,7 @@
    1279template void helios::resize_vector<helios::int4>( std::vector<std::vector<std::vector<helios::int4> > > &, uint, uint, uint );
    1280
    1281template <typename anytype>
    +
    1282void helios::resize_vector( std::vector<std::vector<std::vector<std::vector<anytype> > > > &vec, uint Nx, uint Ny, uint Nz, uint Nw ){
    1283 vec.resize(Nw);
    1284 for( int w=0; w<Nw; w++ ){
    @@ -1371,11 +1524,12 @@
    1291 }
    1292 }
    1293}
    +
    1294
    -
    1295template void helios::resize_vector<float>( std::vector<std::vector<std::vector<std::vector<float> > > > &, uint, uint, uint, uint );
    -
    1296template void helios::resize_vector<double>( std::vector<std::vector<std::vector<std::vector<double> > > > &, uint, uint, uint, uint );
    -
    1297template void helios::resize_vector<int>( std::vector<std::vector<std::vector<std::vector<int> > > > &, uint, uint, uint, uint );
    -
    1298template void helios::resize_vector<uint>( std::vector<std::vector<std::vector<std::vector<uint> > > > &, uint, uint, uint, uint );
    +
    1295template void helios::resize_vector<float>( std::vector<std::vector<std::vector<std::vector<float> > > > &, uint, uint, uint, uint );
    +
    1296template void helios::resize_vector<double>( std::vector<std::vector<std::vector<std::vector<double> > > > &, uint, uint, uint, uint );
    +
    1297template void helios::resize_vector<int>( std::vector<std::vector<std::vector<std::vector<int> > > > &, uint, uint, uint, uint );
    +
    1298template void helios::resize_vector<uint>( std::vector<std::vector<std::vector<std::vector<uint> > > > &, uint, uint, uint, uint );
    1299template void helios::resize_vector<std::string>( std::vector<std::vector<std::vector<std::vector<std::string> > > > &, uint, uint, uint, uint );
    1300template void helios::resize_vector<helios::vec2>( std::vector<std::vector<std::vector<std::vector<helios::vec2> > > > &, uint, uint, uint, uint );
    1301template void helios::resize_vector<helios::vec3>( std::vector<std::vector<std::vector<std::vector<helios::vec3> > > > &, uint, uint, uint, uint );
    @@ -1384,6 +1538,7 @@
    1304template void helios::resize_vector<helios::int3>( std::vector<std::vector<std::vector<std::vector<helios::int3> > > > &, uint, uint, uint, uint );
    1305template void helios::resize_vector<helios::int4>( std::vector<std::vector<std::vector<std::vector<helios::int4> > > > &, uint, uint, uint, uint );
    1306
    +
    1307Date helios::CalendarDay( int Julian_day, int year ){
    1308
    1309 if( Julian_day<1 || Julian_day>366 ){
    @@ -1426,13 +1581,17 @@
    1346 return make_Date(day,month,year);
    1347
    1348}
    +
    1349
    +
    1350int helios::JulianDay( int day, int month, int year ){
    1351
    1352 return JulianDay( make_Date(day,month,year) );
    1353
    1354}
    +
    1355
    +
    1356int helios::JulianDay( const Date& date ){
    1357
    1358 int day = date.day;
    @@ -1460,6 +1619,7 @@
    1380 return skips[month]+day;
    1381
    1382}
    +
    1383
    1384// void Glyph::readFile( const char* __filename ){
    1385
    @@ -1511,6 +1671,7 @@
    1431
    1432// }
    1433
    +
    1434bool helios::PNGHasAlpha( const char* filename ){
    1435
    1436 std::string fn = filename;
    @@ -1564,7 +1725,9 @@
    1484 }
    1485
    1486}
    +
    1487
    +
    1488std::vector<std::vector<bool> > helios::readPNGAlpha( const std::string &filename ){
    1489
    1490 std::string fn = filename;
    @@ -1663,7 +1826,9 @@
    1583 return mask;
    1584
    1585}
    +
    1586
    +
    1587void helios::readPNG( const std::string &filename, uint & width, uint & height, std::vector<helios::RGBAcolor> &texture ){
    1588
    1589 std::string fn = filename;
    @@ -1752,7 +1917,9 @@
    1672
    1673
    1674}
    +
    1675
    +
    1676void helios::writePNG( const std::string &filename, uint width, uint height, const std::vector<helios::RGBAcolor> &pixel_data ) {
    1677 int y;
    1678
    @@ -1819,13 +1986,16 @@
    1739
    1740 png_destroy_write_struct(&png, &info);
    1741}
    +
    1742
    +
    1744
    1745 struct jpeg_error_mgr pub; /* "public" fields */
    1746
    1747 jmp_buf setjmp_buffer; /* for return to caller */
    1748};
    +
    1749typedef struct jpg_error_mgr * jpg_error_ptr;
    1750METHODDEF(void) jpg_error_exit (j_common_ptr cinfo){
    1751 auto myerr = (jpg_error_ptr) cinfo->err;
    @@ -1833,6 +2003,7 @@
    1753 longjmp(myerr->setjmp_buffer, 1);
    1754}
    1755
    +
    1756void helios::readJPEG( const std::string &filename, uint &width, uint &height, std::vector<helios::RGBcolor> &pixel_data ) {
    1757
    1758 auto file_extension = getFileExtension(filename);
    @@ -1902,7 +2073,9 @@
    1822 fclose(infile);
    1823
    1824}
    +
    1825
    +
    1826helios::int2 helios::getImageResolutionJPEG( const std::string &filename ){
    1827
    1828 auto file_extension = getFileExtension(filename);
    @@ -1944,7 +2117,9 @@
    1864 return make_int2(cinfo.output_width,cinfo.output_height);
    1865
    1866}
    +
    1867
    +
    1868void helios::writeJPEG( const std::string &a_filename, uint width, uint height, const std::vector<helios::RGBcolor> &pixel_data ) {
    1869
    1870 struct my_error_mgr {
    @@ -2019,7 +2194,9 @@
    1939 jpeg_destroy_compress(&cinfo);
    1940
    1941}
    +
    1942
    +
    1943std::vector<int> helios::flatten( const std::vector<std::vector<int> > &vec ){
    1944
    1945 size_t ind = 0;
    @@ -2040,7 +2217,9 @@
    1960 return flat;
    1961
    1962}
    +
    1963
    +
    1964std::vector<uint> helios::flatten( const std::vector<std::vector<uint> > &vec ){
    1965
    1966 size_t ind = 0;
    @@ -2061,7 +2240,9 @@
    1981 return flat;
    1982
    1983}
    +
    1984
    +
    1985std::vector<float> helios::flatten( const std::vector<std::vector<float> > &vec ){
    1986
    1987 size_t ind = 0;
    @@ -2082,7 +2263,9 @@
    2002 return flat;
    2003
    2004}
    +
    2005
    +
    2006std::vector<double> helios::flatten( const std::vector<std::vector<double> > &vec ){
    2007
    2008 size_t ind = 0;
    @@ -2103,7 +2286,9 @@
    2023 return flat;
    2024
    2025}
    +
    2026
    +
    2027std::vector<helios::vec2> helios::flatten( const std::vector<std::vector<helios::vec2> > &vec ){
    2028
    2029 size_t ind = 0;
    @@ -2124,7 +2309,9 @@
    2044 return flat;
    2045
    2046}
    +
    2047
    +
    2048std::vector<helios::vec3> helios::flatten( const std::vector<std::vector<helios::vec3> > &vec ){
    2049
    2050 size_t ind = 0;
    @@ -2145,7 +2332,9 @@
    2065 return flat;
    2066
    2067}
    +
    2068
    +
    2069std::vector<helios::vec4> helios::flatten( const std::vector<std::vector<helios::vec4> > &vec ){
    2070
    2071 size_t ind = 0;
    @@ -2166,7 +2355,9 @@
    2086 return flat;
    2087
    2088}
    +
    2089
    +
    2090std::vector<helios::int2> helios::flatten( const std::vector<std::vector<helios::int2> > &vec ){
    2091
    2092 size_t ind = 0;
    @@ -2187,7 +2378,9 @@
    2107 return flat;
    2108
    2109}
    +
    2110
    +
    2111std::vector<helios::int3> helios::flatten( const std::vector<std::vector<helios::int3> > &vec ){
    2112
    2113 size_t ind = 0;
    @@ -2208,7 +2401,9 @@
    2128 return flat;
    2129
    2130}
    +
    2131
    +
    2132std::vector<helios::int4> helios::flatten( const std::vector<std::vector<helios::int4> > &vec ){
    2133
    2134 size_t ind = 0;
    @@ -2229,7 +2424,9 @@
    2149 return flat;
    2150
    2151}
    +
    2152
    +
    2153std::vector<std::string> helios::flatten( const std::vector<std::vector<std::string> > &vec ){
    2154
    2155 size_t ind = 0;
    @@ -2250,7 +2447,9 @@
    2170 return flat;
    2171
    2172}
    +
    2173
    +
    2174std::vector<int> helios::flatten( const std::vector<std::vector<std::vector<int> > > &vec ){
    2175
    2176 size_t ind = 0;
    @@ -2275,7 +2474,9 @@
    2195 return flat;
    2196
    2197}
    +
    2198
    +
    2199std::vector<uint> helios::flatten( const std::vector<std::vector<std::vector<uint> > > &vec ){
    2200
    2201 size_t ind = 0;
    @@ -2300,7 +2501,9 @@
    2220 return flat;
    2221
    2222}
    +
    2223
    +
    2224std::vector<float> helios::flatten( const std::vector<std::vector<std::vector<float> > > &vec ){
    2225
    2226 size_t ind = 0;
    @@ -2325,7 +2528,9 @@
    2245 return flat;
    2246
    2247}
    +
    2248
    +
    2249std::vector<double> helios::flatten( const std::vector<std::vector<std::vector<double> > > &vec ){
    2250
    2251 size_t ind = 0;
    @@ -2350,7 +2555,9 @@
    2270 return flat;
    2271
    2272}
    +
    2273
    +
    2274std::vector<helios::vec2> helios::flatten( const std::vector<std::vector<std::vector<helios::vec2> > > &vec ){
    2275
    2276 size_t ind = 0;
    @@ -2375,7 +2582,9 @@
    2295 return flat;
    2296
    2297}
    +
    2298
    +
    2299std::vector<helios::vec3> helios::flatten( const std::vector<std::vector<std::vector<helios::vec3> > > &vec ){
    2300
    2301 size_t ind = 0;
    @@ -2400,7 +2609,9 @@
    2320 return flat;
    2321
    2322}
    +
    2323
    +
    2324std::vector<helios::vec4> helios::flatten( const std::vector<std::vector<std::vector<helios::vec4> > > &vec ){
    2325
    2326 size_t ind = 0;
    @@ -2425,7 +2636,9 @@
    2345 return flat;
    2346
    2347}
    +
    2348
    +
    2349std::vector<helios::int2> helios::flatten( const std::vector<std::vector<std::vector<helios::int2> > > &vec ){
    2350
    2351 size_t ind = 0;
    @@ -2450,7 +2663,9 @@
    2370 return flat;
    2371
    2372}
    +
    2373
    +
    2374std::vector<helios::int3> helios::flatten( const std::vector<std::vector<std::vector<helios::int3> > > &vec ){
    2375
    2376 size_t ind = 0;
    @@ -2475,7 +2690,9 @@
    2395 return flat;
    2396
    2397}
    +
    2398
    +
    2399std::vector<helios::int4> helios::flatten( const std::vector<std::vector<std::vector<helios::int4> > > &vec ){
    2400
    2401 size_t ind = 0;
    @@ -2500,7 +2717,9 @@
    2420 return flat;
    2421
    2422}
    +
    2423
    +
    2424std::vector<std::string> helios::flatten( const std::vector<std::vector<std::vector<std::string> > > &vec ){
    2425
    2426 size_t ind = 0;
    @@ -2525,7 +2744,9 @@
    2445 return flat;
    2446
    2447}
    +
    2448
    +
    2449std::vector<int> helios::flatten( const std::vector<std::vector<std::vector<std::vector<int> > > > &vec ){
    2450
    2451 size_t ind = 0;
    @@ -2554,7 +2775,9 @@
    2474 return flat;
    2475
    2476}
    +
    2477
    +
    2478std::vector<uint> helios::flatten( const std::vector<std::vector<std::vector<std::vector<uint> > > > &vec ){
    2479
    2480 size_t ind = 0;
    @@ -2583,7 +2806,9 @@
    2503 return flat;
    2504
    2505}
    +
    2506
    +
    2507std::vector<float> helios::flatten( const std::vector<std::vector<std::vector<std::vector<float> > > > &vec ){
    2508
    2509 size_t ind = 0;
    @@ -2612,7 +2837,9 @@
    2532 return flat;
    2533
    2534}
    +
    2535
    +
    2536std::vector<double> helios::flatten( const std::vector<std::vector<std::vector<std::vector<double> > > > &vec ){
    2537
    2538 size_t ind = 0;
    @@ -2641,7 +2868,9 @@
    2561 return flat;
    2562
    2563}
    +
    2564
    +
    2565std::vector<helios::vec2> helios::flatten( const std::vector<std::vector<std::vector<std::vector<helios::vec2> > > > &vec ){
    2566
    2567 size_t ind = 0;
    @@ -2670,7 +2899,9 @@
    2590 return flat;
    2591
    2592}
    +
    2593
    +
    2594std::vector<helios::vec3> helios::flatten( const std::vector<std::vector<std::vector<std::vector<helios::vec3> > > > &vec ){
    2595
    2596 size_t ind = 0;
    @@ -2699,7 +2930,9 @@
    2619 return flat;
    2620
    2621}
    +
    2622
    +
    2623std::vector<helios::vec4> helios::flatten( const std::vector<std::vector<std::vector<std::vector<helios::vec4> > > > &vec ){
    2624
    2625 size_t ind = 0;
    @@ -2728,7 +2961,9 @@
    2648 return flat;
    2649
    2650}
    +
    2651
    +
    2652std::vector<helios::int2> helios::flatten( const std::vector<std::vector<std::vector<std::vector<helios::int2> > > > &vec ){
    2653
    2654 size_t ind = 0;
    @@ -2757,7 +2992,9 @@
    2677 return flat;
    2678
    2679}
    +
    2680
    +
    2681std::vector<helios::int3> helios::flatten( const std::vector<std::vector<std::vector<std::vector<helios::int3> > > > &vec ){
    2682
    2683 size_t ind = 0;
    @@ -2786,7 +3023,9 @@
    2706 return flat;
    2707
    2708}
    +
    2709
    +
    2710std::vector<helios::int4> helios::flatten( const std::vector<std::vector<std::vector<std::vector<helios::int4> > > > &vec ){
    2711
    2712 size_t ind = 0;
    @@ -2815,7 +3054,9 @@
    2735 return flat;
    2736
    2737}
    +
    2738
    +
    2739std::vector<std::string> helios::flatten( const std::vector<std::vector<std::vector<std::vector<std::string> > > > &vec ){
    2740
    2741 size_t ind = 0;
    @@ -2844,7 +3085,9 @@
    2764 return flat;
    2765
    2766}
    +
    2767
    +
    2768helios::vec3 helios::spline_interp3(float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end ){
    2769
    2770 //Perform interpolation between two 3D points using Cubic Hermite Spline
    @@ -2884,7 +3127,9 @@
    2804 return make_vec3(xq[0],xq[1],xq[2]);
    2805
    2806}
    +
    2807
    +
    2808float helios::XMLloadfloat( pugi::xml_node node, const char* field ){
    2809
    2810 const char* field_str = node.child_value(field);
    @@ -2901,7 +3146,9 @@
    2821 return value;
    2822
    2823}
    +
    2824
    +
    2825int helios::XMLloadint( pugi::xml_node node, const char* field ){
    2826
    2827 const char* field_str = node.child_value(field);
    @@ -2918,7 +3165,9 @@
    2838 return value;
    2839
    2840}
    +
    2841
    +
    2842std::string helios::XMLloadstring( pugi::xml_node node, const char* field ){
    2843
    2844 std::string field_str = deblank(node.child_value(field));
    @@ -2933,7 +3182,9 @@
    2853 return value;
    2854
    2855}
    +
    2856
    +
    2857helios::vec2 helios::XMLloadvec2( pugi::xml_node node, const char* field ){
    2858
    2859 const char* field_str = node.child_value(field);
    @@ -2948,7 +3199,9 @@
    2868 return value;
    2869
    2870}
    +
    2871
    +
    2872helios::vec3 helios::XMLloadvec3( pugi::xml_node node, const char* field ){
    2873
    2874 const char* field_str = node.child_value(field);
    @@ -2963,7 +3216,9 @@
    2883 return value;
    2884
    2885}
    +
    2886
    +
    2887helios::vec4 helios::XMLloadvec4( pugi::xml_node node, const char* field ){
    2888
    2889 const char* field_str = node.child_value(field);
    @@ -2978,7 +3233,9 @@
    2898 return value;
    2899
    2900}
    +
    2901
    +
    2902helios::int2 helios::XMLloadint2( pugi::xml_node node, const char* field ){
    2903
    2904 const char* field_str = node.child_value(field);
    @@ -2993,7 +3250,9 @@
    2913 return value;
    2914
    2915}
    +
    2916
    +
    2917helios::int3 helios::XMLloadint3( pugi::xml_node node, const char* field ){
    2918
    2919 const char* field_str = node.child_value(field);
    @@ -3008,7 +3267,9 @@
    2928 return value;
    2929
    2930}
    +
    2931
    +
    2932helios::int4 helios::XMLloadint4( pugi::xml_node node, const char* field ){
    2933
    2934 const char* field_str = node.child_value(field);
    @@ -3023,7 +3284,9 @@
    2943 return value;
    2944
    2945}
    +
    2946
    +
    2947helios::RGBcolor helios::XMLloadrgb( pugi::xml_node node, const char* field ){
    2948
    2949 const char* field_str = node.child_value(field);
    @@ -3038,7 +3301,9 @@
    2958 return make_RGBcolor(value.r,value.g,value.b);
    2959
    2960}
    +
    2961
    +
    2962helios::RGBAcolor helios::XMLloadrgba( pugi::xml_node node, const char* field ){
    2963
    2964 const char* field_str = node.child_value(field);
    @@ -3053,7 +3318,9 @@
    2973 return value;
    2974
    2975}
    +
    2976
    +
    2977float helios::fzero(float(*function)(float value, std::vector<float> &variables, const void *parameters), std::vector<float> &variables, const void *parameters, float init_guess, float err_tol, int max_iterations ){
    2978
    2979 float T;
    @@ -3098,7 +3365,9 @@
    3018 return T;
    3019
    3020}
    +
    3021
    +
    3022float helios::interp1( const std::vector<helios::vec2> &points, float x ) {
    3023
    3024 //Ensure that no 2 adjacent x values are equal, and that x values are monotonically increasing
    @@ -3147,26 +3416,36 @@
    3067 return lowerY + ((x - lowerX)/ deltaX) * deltaY;
    3068
    3069}
    +
    3070
    +
    3072 return (p1-p2).magnitude();
    3073}
    +
    3074
    +
    3075std::string helios::getFileExtension( const std::string &filepath ){
    3076 std::filesystem::path output_path_fs = filepath;
    3077 return output_path_fs.extension().string();
    3078}
    +
    3079
    +
    3080std::string helios::getFileStem( const std::string &filepath ){
    3081 std::filesystem::path output_path_fs = filepath;
    3082 return output_path_fs.stem().string();
    3083}
    +
    3084
    +
    3085std::string helios::getFileName( const std::string &filepath ){
    3086 std::filesystem::path output_path_fs = filepath;
    3087 return output_path_fs.filename().string();
    3088}
    +
    3089
    +
    3090std::string helios::getFilePath( const std::string &filepath, bool trailingslash ){
    3091 std::filesystem::path output_path_fs = filepath;
    3092 std::string output_path = output_path_fs.parent_path().string();
    @@ -3178,7 +3457,9 @@
    3098
    3099 return output_path;
    3100}
    +
    3101
    +
    3102bool helios::validateOutputPath(std::string &output_path, const std::vector<std::string> &allowable_file_extensions){
    3103
    3104 if( output_path.empty() ){ //path was empty
    @@ -3226,7 +3507,9 @@
    3146 return true;
    3147
    3148}
    +
    3149
    +
    3150std::vector<float> helios::importVectorFromFile(const std::string &filepath){
    3151
    3152 std::ifstream stream(filepath.c_str());
    @@ -3240,150 +3523,152 @@
    3160 return vec;
    3161
    3162}
    +
    -
    bool parse_double(const std::string &input_string, double &converted_double)
    Convert a string into a double with error checking.
    Definition: global.cpp:779
    -
    float parse_xml_tag_float(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a float value.
    Definition: global.cpp:954
    -
    bool PNGHasAlpha(const char *filename)
    Check whether PNG image file has an alpha/transparency channel.
    Definition: global.cpp:1434
    -
    helios::int4 XMLloadint4(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a int4.
    Definition: global.cpp:2932
    -
    vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
    Rotate a 3D vector about an arbitrary line.
    Definition: global.cpp:140
    -
    std::vector< float > importVectorFromFile(const std::string &filepath)
    Read values contained in a text file into a one-dimensional vector of floats.
    Definition: global.cpp:3150
    -
    bool parse_int2(const std::string &input_string, int2 &converted_int2)
    Convert a string into an int2 with error checking.
    Definition: global.cpp:809
    -
    helios::RGBAcolor XMLloadrgba(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into an RGBA color vector.
    Definition: global.cpp:2962
    -
    bool parse_float(const std::string &input_string, float &converted_float)
    Convert a string into a float with error checking.
    Definition: global.cpp:763
    -
    RGBcolor blend(const RGBcolor &color0, const RGBcolor &color1, float weight)
    Blend two RGB colors together.
    Definition: global.cpp:60
    -
    vec3 parse_xml_tag_vec3(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a vec3 value (i.e., three space delimited floats)
    Definition: global.cpp:978
    -
    helios::vec2 XMLloadvec2(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a vec2.
    Definition: global.cpp:2857
    -
    void matmult(const float ML[16], const float MR[16], float(&T)[16])
    Multiply 4x4 matrices: T=ML*MR.
    Definition: global.cpp:499
    -
    void readJPEG(const std::string &filename, uint &width, uint &height, std::vector< helios::RGBcolor > &pixel_data)
    Function to read a JPEG image file into pixel data array.
    Definition: global.cpp:1756
    -
    bool parse_vec3(const std::string &input_string, vec3 &converted_vec3)
    Convert a string into a vec3 with error checking.
    Definition: global.cpp:876
    -
    Date CalendarDay(int Julian_day, int year)
    Convert Julian day to calendar day (day,month,year)
    Definition: global.cpp:1307
    -
    bool parse_vec2(const std::string &input_string, vec2 &converted_vec2)
    Convert a string into a vec2 with error checking.
    Definition: global.cpp:860
    -
    float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
    Use Newton-Raphson method to find the zero of a function.
    Definition: global.cpp:2977
    -
    int XMLloadint(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into an int.
    Definition: global.cpp:2825
    -
    float interp1(const std::vector< helios::vec2 > &points, float x)
    Function to perform linear interpolation based on a vector of discrete (x,y) values.
    Definition: global.cpp:3022
    -
    float point_distance(const helios::vec3 &p1, const helios::vec3 &p2)
    Function to calculate the distance between two points.
    Definition: global.cpp:3071
    -
    bool parse_uint(const std::string &input_string, uint &converted_uint)
    Convert a string into an unsigned integer with error checking.
    Definition: global.cpp:842
    -
    std::string getFileExtension(const std::string &filepath)
    Parse a file string to get the extension.
    Definition: global.cpp:3075
    -
    bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
    Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
    Definition: global.cpp:3102
    -
    std::string getFileName(const std::string &filepath)
    Parse a file string to get the filename including extension.
    Definition: global.cpp:3085
    -
    void helios_runtime_error(const std::string &error_message)
    Function to throw a runtime error.
    Definition: global.cpp:29
    -
    bool parse_int(const std::string &input_string, int &converted_int)
    Convert a string into an integer with error checking.
    Definition: global.cpp:794
    -
    vec2 parse_xml_tag_vec2(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a vec2 value (i.e., two space delimited floats)
    Definition: global.cpp:966
    -
    float XMLloadfloat(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a float.
    Definition: global.cpp:2808
    -
    bool parse_RGBcolor(const std::string &input_string, RGBcolor &converted_rgb)
    Convert a string into an RGBcolor with error checking.
    Definition: global.cpp:893
    -
    int JulianDay(int day, int month, int year)
    Convert calendar day (day,month,year) to Julian day.
    Definition: global.cpp:1350
    -
    std::string XMLloadstring(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a string.
    Definition: global.cpp:2842
    -
    vec3 nullorigin
    Default null vec3 that gives the origin (0,0,0)
    Definition: global.cpp:58
    -
    bool parse_int3(const std::string &input_string, int3 &converted_int3)
    Convert a string into an int3 with error checking.
    Definition: global.cpp:825
    -
    std::string parse_xml_tag_string(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a string.
    Definition: global.cpp:990
    -
    helios::vec4 XMLloadvec4(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a vec4.
    Definition: global.cpp:2887
    -
    helios::int2 getImageResolutionJPEG(const std::string &filename)
    Function to read a JPEG image file into pixel data array.
    Definition: global.cpp:1826
    -
    void writeJPEG(const std::string &filename, uint width, uint height, const std::vector< helios::RGBcolor > &pixel_data)
    Function to write a JPEG image based on pixel data.
    Definition: global.cpp:1868
    -
    void readPNG(const std::string &filename, uint &width, uint &height, std::vector< helios::RGBAcolor > &pixel_data)
    Function to read a PNG image file into pixel data array.
    Definition: global.cpp:1587
    -
    std::string getFileStem(const std::string &filepath)
    Parse a file string to get the filename without extension.
    Definition: global.cpp:3080
    -
    helios::vec3 XMLloadvec3(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a vec3.
    Definition: global.cpp:2872
    -
    void makeIdentityMatrix(float(&T)[16])
    Construct an identity matrix.
    Definition: global.cpp:555
    -
    helios::RGBcolor XMLloadrgb(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into an RGB color vector.
    Definition: global.cpp:2947
    -
    std::string getFilePath(const std::string &filepath, bool trailingslash=true)
    Parse a file string to get the path (i.e., portion of the string before the file name).
    Definition: global.cpp:3090
    -
    SphericalCoord nullrotation
    Default null SphericalCoord that applies no rotation.
    Definition: global.cpp:57
    -
    std::vector< std::vector< bool > > readPNGAlpha(const std::string &filename)
    Function to read the alpha channel from a PNG image.
    Definition: global.cpp:1488
    -
    helios::int3 XMLloadint3(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a int3.
    Definition: global.cpp:2917
    -
    helios::int2 XMLloadint2(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a vec2.
    Definition: global.cpp:2902
    -
    void vecmult(const float M[16], const float v[3], float(&result)[3])
    Multiply 4x4 transformation matrix by 3-element vector: T=M*v.
    Definition: global.cpp:539
    -
    void writePNG(const std::string &filename, uint width, uint height, const std::vector< helios::RGBAcolor > &pixel_data)
    Function to write a PNG image based on pixel data.
    Definition: global.cpp:1676
    -
    int parse_xml_tag_int(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing an integer value.
    Definition: global.cpp:942
    -
    float randu()
    Random number from a uniform distribution between 0 and 1.
    Definition: global.cpp:223
    -
    float rad2deg(float rad)
    Convert radians to degrees.
    Definition: global.cpp:580
    -
    std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
    Function to flatten a 2D int vector into a 1D vector.
    Definition: global.cpp:1943
    -
    vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
    Function to rotate a 3D vector given spherical angles elevation and azimuth.
    Definition: global.cpp:79
    -
    vec2 string2vec2(const char *str)
    Convert a space-delimited string into a vec2 vector.
    Definition: global.cpp:623
    -
    int2 string2int2(const char *str)
    Convert a space-delimited string into an int2 vector.
    Definition: global.cpp:683
    -
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition: global.cpp:610
    -
    float atan2_2pi(float y, float x)
    Four quadrant arc tangent between 0 and 2*pi.
    Definition: global.cpp:584
    -
    bool lineIntersection(const vec2 &p1, const vec2 &q1, const vec2 &p2, const vec2 &q2)
    Determine if two line segments intersect. The lines segments are defined by vertices (p1,...
    Definition: global.cpp:253
    -
    void makeRotationMatrix(float rotation, const char *axis, float(&transform)[16])
    Construct a rotation matrix to perform rotation about the x-, y-, or z-axis.
    Definition: global.cpp:313
    -
    float median(std::vector< float > vect)
    Median of a vector of floats.
    Definition: global.cpp:1214
    -
    int4 string2int4(const char *str)
    Convert a space-delimited string into an int4 vector.
    Definition: global.cpp:723
    -
    float min(const std::vector< float > &vect)
    Minimum value of a vector of floats.
    Definition: global.cpp:1100
    -
    std::string trim_whitespace(const std::string &input)
    Remove leading and trailing whitespace from a string.
    Definition: global.cpp:1016
    -
    float deg2rad(float deg)
    Convert degrees to radians.
    Definition: global.cpp:576
    -
    vec3 string2vec3(const char *str)
    Convert a space-delimited string into a vec3 vector.
    Definition: global.cpp:643
    -
    void makeTranslationMatrix(const helios::vec3 &translation, float(&transform)[16])
    Construct translation matrix.
    Definition: global.cpp:436
    -
    float calculateTriangleArea(const vec3 &v0, const vec3 &v1, const vec3 &v2)
    Calculate the area of a triangle given its three vertices.
    Definition: global.cpp:175
    -
    helios::vec3 spline_interp3(float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
    Function to perform cubic Hermite spline interpolation.
    Definition: global.cpp:2768
    -
    RGBAcolor string2RGBcolor(const char *str)
    Convert a space-delimited string into an RGBcolor vector.
    Definition: global.cpp:743
    -
    float max(const std::vector< float > &vect)
    Maximum value of a vector of floats.
    Definition: global.cpp:1146
    -
    float stdev(const std::vector< float > &vect)
    Standard deviation of a vector of floats.
    Definition: global.cpp:1192
    -
    void resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)
    Resize 2D C++ vector.
    Definition: global.cpp:1239
    -
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition: global.cpp:617
    -
    void makeScaleMatrix(const helios::vec3 &scale, float(&T)[16])
    Construct matrix to scale about the origin.
    Definition: global.cpp:457
    -
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:241
    -
    float sum(const std::vector< float > &vect)
    Sum of a vector of floats.
    Definition: global.cpp:1069
    -
    bool pointInPolygon(const vec2 &point, const std::vector< vec2 > &polygon_verts)
    Determine whether point lines within a polygon.
    Definition: global.cpp:276
    -
    float asin_safe(float x)
    arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:247
    -
    int3 string2int3(const char *str)
    Convert a space-delimited string into an int3 vector.
    Definition: global.cpp:703
    -
    void wait(float seconds)
    Wait/sleep for a specified amount of time.
    Definition: global.cpp:306
    -
    std::string deblank(const char *input)
    Remove all whitespace from character array.
    Definition: global.cpp:994
    -
    vec4 string2vec4(const char *str)
    Convert a space-delimited string into a vec4 vector.
    Definition: global.cpp:663
    -
    float mean(const std::vector< float > &vect)
    Mean value of a vector of floats.
    Definition: global.cpp:1084
    -
    std::vector< std::string > separate_string_by_delimiter(const std::string &inputstring, const std::string &delimiter)
    Separate string by delimiter and store into a vector.
    Definition: global.cpp:1032
    -
    anytype clamp(anytype value, anytype min, anytype max)
    Clamp value to be within some specified bounds.
    Definition: global.cpp:1055
    -
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
    Make an RGBAcolor vector.
    -
    Date make_Date(int day, int month, int year)
    Make a Date vector.
    -
    Date Julian2Calendar(int JulianDay, int year)
    Convert a Julian day to a calendar Date vector.
    -
    int Calendar2Julian(Date date)
    Convert a calendar Date vector to Julian day.
    -
    RGBcolor make_RGBcolor(float r, float g, float b)
    Make an RGBcolor vector.
    -
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    vec4 make_vec4(float x, float y, float z, float w)
    Make a vec4 from three floats.
    -
    int4 make_int4(int x, int y, int z, int w)
    Make an int4 vector from three ints.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    - -
    int month
    Month of year.
    -
    void incrementDay()
    Increment Date vector by one day.
    Definition: global.cpp:202
    -
    int day
    Day of month.
    -
    int JulianDay() const
    Convert to Julian day.
    Definition: global.cpp:186
    -
    bool isLeapYear() const
    Check whether it is a leap year.
    Definition: global.cpp:215
    -
    int year
    Year in YYYY format.
    -
    R-G-B-A color vector.
    -
    float r
    Red color component.
    -
    float a
    Alpha (transparency) component.
    -
    float b
    Blue color component.
    -
    float g
    Green color component.
    -
    R-G-B color vector.
    -
    float b
    Blue color component.
    -
    float r
    Red color component.
    -
    float g
    Green color component.
    -
    Vector of spherical coordinates (elevation,azimuth)
    - -
    const float & elevation
    Elevation angle (radians)
    -
    float azimuth
    Azimuthal angle (radians)
    -
    Vector of two elements of type 'int'.
    -
    int y
    Second element in vector.
    -
    int x
    First element in vector.
    -
    Vector of three elements of type 'int'.
    -
    int x
    First element in vector.
    -
    int z
    Third element in vector.
    -
    int y
    Second element in vector.
    -
    Vector of four elements of type 'int'.
    -
    Vector of two elements of type 'float'.
    -
    float x
    First element in vector.
    -
    float y
    Second element in vector.
    -
    Vector of three elements of type 'float'.
    -
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    -
    float x
    First element in vector.
    -
    float z
    Third element in vector.
    -
    float y
    Second element in vector.
    -
    float magnitude() const
    Compute the vector magnitude.
    -
    Vector of four elements of type 'float'.
    - - +
    bool parse_double(const std::string &input_string, double &converted_double)
    Convert a string into a double with error checking.
    Definition global.cpp:779
    +
    float parse_xml_tag_float(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a float value.
    Definition global.cpp:954
    +
    bool PNGHasAlpha(const char *filename)
    Check whether PNG image file has an alpha/transparency channel.
    Definition global.cpp:1434
    +
    helios::int4 XMLloadint4(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a int4.
    Definition global.cpp:2932
    +
    vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
    Rotate a 3D vector about an arbitrary line.
    Definition global.cpp:140
    +
    std::vector< float > importVectorFromFile(const std::string &filepath)
    Read values contained in a text file into a one-dimensional vector of floats.
    Definition global.cpp:3150
    +
    bool parse_int2(const std::string &input_string, int2 &converted_int2)
    Convert a string into an int2 with error checking.
    Definition global.cpp:809
    +
    helios::RGBAcolor XMLloadrgba(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into an RGBA color vector.
    Definition global.cpp:2962
    +
    bool parse_float(const std::string &input_string, float &converted_float)
    Convert a string into a float with error checking.
    Definition global.cpp:763
    +
    RGBcolor blend(const RGBcolor &color0, const RGBcolor &color1, float weight)
    Blend two RGB colors together.
    Definition global.cpp:60
    +
    vec3 parse_xml_tag_vec3(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a vec3 value (i.e., three space delimited floats)
    Definition global.cpp:978
    +
    helios::vec2 XMLloadvec2(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a vec2.
    Definition global.cpp:2857
    +
    void matmult(const float ML[16], const float MR[16], float(&T)[16])
    Multiply 4x4 matrices: T=ML*MR.
    Definition global.cpp:499
    +
    void readJPEG(const std::string &filename, uint &width, uint &height, std::vector< helios::RGBcolor > &pixel_data)
    Function to read a JPEG image file into pixel data array.
    Definition global.cpp:1756
    +
    bool parse_vec3(const std::string &input_string, vec3 &converted_vec3)
    Convert a string into a vec3 with error checking.
    Definition global.cpp:876
    +
    Date CalendarDay(int Julian_day, int year)
    Convert Julian day to calendar day (day,month,year)
    Definition global.cpp:1307
    +
    bool parse_vec2(const std::string &input_string, vec2 &converted_vec2)
    Convert a string into a vec2 with error checking.
    Definition global.cpp:860
    +
    float fzero(float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
    Use Newton-Raphson method to find the zero of a function.
    Definition global.cpp:2977
    +
    int XMLloadint(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into an int.
    Definition global.cpp:2825
    +
    float interp1(const std::vector< helios::vec2 > &points, float x)
    Function to perform linear interpolation based on a vector of discrete (x,y) values.
    Definition global.cpp:3022
    +
    float point_distance(const helios::vec3 &p1, const helios::vec3 &p2)
    Function to calculate the distance between two points.
    Definition global.cpp:3071
    +
    bool parse_uint(const std::string &input_string, uint &converted_uint)
    Convert a string into an unsigned integer with error checking.
    Definition global.cpp:842
    +
    std::string getFileExtension(const std::string &filepath)
    Parse a file string to get the extension.
    Definition global.cpp:3075
    +
    bool validateOutputPath(std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
    Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
    Definition global.cpp:3102
    +
    std::string getFileName(const std::string &filepath)
    Parse a file string to get the filename including extension.
    Definition global.cpp:3085
    +
    void helios_runtime_error(const std::string &error_message)
    Function to throw a runtime error.
    Definition global.cpp:29
    +
    bool parse_int(const std::string &input_string, int &converted_int)
    Convert a string into an integer with error checking.
    Definition global.cpp:794
    +
    vec2 parse_xml_tag_vec2(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a vec2 value (i.e., two space delimited floats)
    Definition global.cpp:966
    +
    float XMLloadfloat(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a float.
    Definition global.cpp:2808
    +
    bool parse_RGBcolor(const std::string &input_string, RGBcolor &converted_rgb)
    Convert a string into an RGBcolor with error checking.
    Definition global.cpp:893
    +
    int JulianDay(int day, int month, int year)
    Convert calendar day (day,month,year) to Julian day.
    Definition global.cpp:1350
    +
    std::string XMLloadstring(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a string.
    Definition global.cpp:2842
    +
    vec3 nullorigin
    Default null vec3 that gives the origin (0,0,0)
    Definition global.cpp:58
    +
    bool parse_int3(const std::string &input_string, int3 &converted_int3)
    Convert a string into an int3 with error checking.
    Definition global.cpp:825
    +
    std::string parse_xml_tag_string(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a string.
    Definition global.cpp:990
    +
    helios::vec4 XMLloadvec4(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a vec4.
    Definition global.cpp:2887
    +
    helios::int2 getImageResolutionJPEG(const std::string &filename)
    Function to read a JPEG image file into pixel data array.
    Definition global.cpp:1826
    +
    void writeJPEG(const std::string &filename, uint width, uint height, const std::vector< helios::RGBcolor > &pixel_data)
    Function to write a JPEG image based on pixel data.
    Definition global.cpp:1868
    +
    void readPNG(const std::string &filename, uint &width, uint &height, std::vector< helios::RGBAcolor > &pixel_data)
    Function to read a PNG image file into pixel data array.
    Definition global.cpp:1587
    +
    std::string getFileStem(const std::string &filepath)
    Parse a file string to get the filename without extension.
    Definition global.cpp:3080
    +
    helios::vec3 XMLloadvec3(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a vec3.
    Definition global.cpp:2872
    +
    void makeIdentityMatrix(float(&T)[16])
    Construct an identity matrix.
    Definition global.cpp:555
    +
    helios::RGBcolor XMLloadrgb(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into an RGB color vector.
    Definition global.cpp:2947
    +
    std::string getFilePath(const std::string &filepath, bool trailingslash=true)
    Parse a file string to get the path (i.e., portion of the string before the file name).
    Definition global.cpp:3090
    +
    SphericalCoord nullrotation
    Default null SphericalCoord that applies no rotation.
    Definition global.cpp:57
    +
    std::vector< std::vector< bool > > readPNGAlpha(const std::string &filename)
    Function to read the alpha channel from a PNG image.
    Definition global.cpp:1488
    +
    helios::int3 XMLloadint3(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a int3.
    Definition global.cpp:2917
    +
    helios::int2 XMLloadint2(pugi::xml_node node, const char *field)
    Function to load and convert a field in a pugi XML node into a vec2.
    Definition global.cpp:2902
    +
    void vecmult(const float M[16], const float v[3], float(&result)[3])
    Multiply 4x4 transformation matrix by 3-element vector: T=M*v.
    Definition global.cpp:539
    +
    void writePNG(const std::string &filename, uint width, uint height, const std::vector< helios::RGBAcolor > &pixel_data)
    Function to write a PNG image based on pixel data.
    Definition global.cpp:1676
    +
    int parse_xml_tag_int(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing an integer value.
    Definition global.cpp:942
    +
    float randu()
    Random number from a uniform distribution between 0 and 1.
    Definition global.cpp:223
    +
    float rad2deg(float rad)
    Convert radians to degrees.
    Definition global.cpp:580
    +
    std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
    Function to flatten a 2D int vector into a 1D vector.
    Definition global.cpp:1943
    +
    vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
    Function to rotate a 3D vector given spherical angles elevation and azimuth.
    Definition global.cpp:79
    +
    vec2 string2vec2(const char *str)
    Convert a space-delimited string into a vec2 vector.
    Definition global.cpp:623
    +
    int2 string2int2(const char *str)
    Convert a space-delimited string into an int2 vector.
    Definition global.cpp:683
    +
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition global.cpp:610
    +
    float atan2_2pi(float y, float x)
    Four quadrant arc tangent between 0 and 2*pi.
    Definition global.cpp:584
    +
    bool lineIntersection(const vec2 &p1, const vec2 &q1, const vec2 &p2, const vec2 &q2)
    Determine if two line segments intersect. The lines segments are defined by vertices (p1,...
    Definition global.cpp:253
    +
    void makeRotationMatrix(float rotation, const char *axis, float(&transform)[16])
    Construct a rotation matrix to perform rotation about the x-, y-, or z-axis.
    Definition global.cpp:313
    +
    float median(std::vector< float > vect)
    Median of a vector of floats.
    Definition global.cpp:1214
    +
    int4 string2int4(const char *str)
    Convert a space-delimited string into an int4 vector.
    Definition global.cpp:723
    +
    float min(const std::vector< float > &vect)
    Minimum value of a vector of floats.
    Definition global.cpp:1100
    +
    std::string trim_whitespace(const std::string &input)
    Remove leading and trailing whitespace from a string.
    Definition global.cpp:1016
    +
    float deg2rad(float deg)
    Convert degrees to radians.
    Definition global.cpp:576
    +
    vec3 string2vec3(const char *str)
    Convert a space-delimited string into a vec3 vector.
    Definition global.cpp:643
    +
    void makeTranslationMatrix(const helios::vec3 &translation, float(&transform)[16])
    Construct translation matrix.
    Definition global.cpp:436
    +
    float calculateTriangleArea(const vec3 &v0, const vec3 &v1, const vec3 &v2)
    Calculate the area of a triangle given its three vertices.
    Definition global.cpp:175
    +
    helios::vec3 spline_interp3(float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
    Function to perform cubic Hermite spline interpolation.
    Definition global.cpp:2768
    +
    RGBAcolor string2RGBcolor(const char *str)
    Convert a space-delimited string into an RGBcolor vector.
    Definition global.cpp:743
    +
    float max(const std::vector< float > &vect)
    Maximum value of a vector of floats.
    Definition global.cpp:1146
    +
    float stdev(const std::vector< float > &vect)
    Standard deviation of a vector of floats.
    Definition global.cpp:1192
    +
    void resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)
    Resize 2D C++ vector.
    Definition global.cpp:1239
    +
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition global.cpp:617
    +
    void makeScaleMatrix(const helios::vec3 &scale, float(&T)[16])
    Construct matrix to scale about the origin.
    Definition global.cpp:457
    +
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:241
    +
    float sum(const std::vector< float > &vect)
    Sum of a vector of floats.
    Definition global.cpp:1069
    +
    bool pointInPolygon(const vec2 &point, const std::vector< vec2 > &polygon_verts)
    Determine whether point lines within a polygon.
    Definition global.cpp:276
    +
    float asin_safe(float x)
    arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:247
    +
    int3 string2int3(const char *str)
    Convert a space-delimited string into an int3 vector.
    Definition global.cpp:703
    +
    void wait(float seconds)
    Wait/sleep for a specified amount of time.
    Definition global.cpp:306
    +
    std::string deblank(const char *input)
    Remove all whitespace from character array.
    Definition global.cpp:994
    +
    vec4 string2vec4(const char *str)
    Convert a space-delimited string into a vec4 vector.
    Definition global.cpp:663
    +
    float mean(const std::vector< float > &vect)
    Mean value of a vector of floats.
    Definition global.cpp:1084
    +
    std::vector< std::string > separate_string_by_delimiter(const std::string &inputstring, const std::string &delimiter)
    Separate string by delimiter and store into a vector.
    Definition global.cpp:1032
    +
    anytype clamp(anytype value, anytype min, anytype max)
    Clamp value to be within some specified bounds.
    Definition global.cpp:1055
    +
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
    Make an RGBAcolor vector.
    +
    Date make_Date(int day, int month, int year)
    Make a Date vector.
    +
    Date Julian2Calendar(int JulianDay, int year)
    Convert a Julian day to a calendar Date vector.
    +
    int Calendar2Julian(Date date)
    Convert a calendar Date vector to Julian day.
    +
    RGBcolor make_RGBcolor(float r, float g, float b)
    Make an RGBcolor vector.
    +
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    vec4 make_vec4(float x, float y, float z, float w)
    Make a vec4 from three floats.
    +
    int4 make_int4(int x, int y, int z, int w)
    Make an int4 vector from three ints.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    + +
    int month
    Month of year.
    +
    void incrementDay()
    Increment Date vector by one day.
    Definition global.cpp:202
    +
    int day
    Day of month.
    +
    int JulianDay() const
    Convert to Julian day.
    Definition global.cpp:186
    +
    bool isLeapYear() const
    Check whether it is a leap year.
    Definition global.cpp:215
    +
    int year
    Year in YYYY format.
    +
    R-G-B-A color vector.
    +
    float r
    Red color component.
    +
    float a
    Alpha (transparency) component.
    +
    float b
    Blue color component.
    +
    float g
    Green color component.
    +
    R-G-B color vector.
    +
    float b
    Blue color component.
    +
    float r
    Red color component.
    +
    float g
    Green color component.
    +
    Vector of spherical coordinates (elevation,azimuth)
    + +
    const float & elevation
    Elevation angle (radians)
    +
    float azimuth
    Azimuthal angle (radians)
    +
    Vector of two elements of type 'int'.
    +
    int y
    Second element in vector.
    +
    int x
    First element in vector.
    +
    Vector of three elements of type 'int'.
    +
    int x
    First element in vector.
    +
    int z
    Third element in vector.
    +
    int y
    Second element in vector.
    +
    Vector of four elements of type 'int'.
    +
    Vector of two elements of type 'float'.
    +
    float x
    First element in vector.
    +
    float y
    Second element in vector.
    +
    Vector of three elements of type 'float'.
    +
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    float x
    First element in vector.
    +
    float z
    Third element in vector.
    +
    float y
    Second element in vector.
    +
    float magnitude() const
    Compute the vector magnitude.
    +
    Vector of four elements of type 'float'.
    + +
    + diff --git a/doc/html/global_8h.html b/doc/html/global_8h.html index 5710eccbd..fd0ac6402 100644 --- a/doc/html/global_8h.html +++ b/doc/html/global_8h.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    Data Structures | @@ -131,429 +143,429 @@ - + - +

    Macros

    #define DEPRECATED(func)   func
    #define DEPRECATED(func)
     
    #define M_PI   3.14159265358979323846
    #define M_PI   3.14159265358979323846
     
    - +

    Typedefs

    typedef unsigned int uint
    typedef unsigned int uint
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Functions

    void helios::helios_runtime_error (const std::string &error_message)
    void helios::helios_runtime_error (const std::string &error_message)
     Function to throw a runtime error.
     
    void helios::makeRotationMatrix (float rotation, const char *axis, float(&transform)[16])
    void helios::makeRotationMatrix (float rotation, const char *axis, float(&transform)[16])
     Construct a rotation matrix to perform rotation about the x-, y-, or z-axis.
     
    void helios::makeRotationMatrix (float rotation, const helios::vec3 &axis, float(&transform)[16])
    void helios::makeRotationMatrix (float rotation, const helios::vec3 &axis, float(&transform)[16])
     Construct a rotation matrix to perform rotation about an arbitrary axis passing through the origin.
     
    void helios::makeRotationMatrix (float rotation, const helios::vec3 &origin, const helios::vec3 &axis, float(&transform)[16])
    void helios::makeRotationMatrix (float rotation, const helios::vec3 &origin, const helios::vec3 &axis, float(&transform)[16])
     Construct a rotation matrix to perform rotation about an arbitrary line (not necessarily passing through the origin).
     
    void helios::makeTranslationMatrix (const helios::vec3 &translation, float(&transform)[16])
    void helios::makeTranslationMatrix (const helios::vec3 &translation, float(&transform)[16])
     Construct translation matrix.
     
    void helios::makeScaleMatrix (const helios::vec3 &scale, float(&T)[16])
    void helios::makeScaleMatrix (const helios::vec3 &scale, float(&T)[16])
     Construct matrix to scale about the origin.
     
    void helios::makeScaleMatrix (const helios::vec3 &scale, const helios::vec3 &point, float(&T)[16])
    void helios::makeScaleMatrix (const helios::vec3 &scale, const helios::vec3 &point, float(&T)[16])
     Construct matrix to scale about arbitrary point in space.
     
    void helios::matmult (const float ML[16], const float MR[16], float(&T)[16])
    void helios::matmult (const float ML[16], const float MR[16], float(&T)[16])
     Multiply 4x4 matrices: T=ML*MR.
     
    void helios::vecmult (const float M[16], const float v[3], float(&result)[3])
    void helios::vecmult (const float M[16], const float v[3], float(&result)[3])
     Multiply 4x4 transformation matrix by 3-element vector: T=M*v.
     
    void helios::vecmult (const float M[16], const helios::vec3 &v3, helios::vec3 &result)
    void helios::vecmult (const float M[16], const helios::vec3 &v3, helios::vec3 &result)
     Multiply 4x4 transformation matrix by 3-element vector: T=M*v.
     
    void helios::makeIdentityMatrix (float(&T)[16])
    void helios::makeIdentityMatrix (float(&T)[16])
     Construct an identity matrix.
     
    float helios::deg2rad (float deg)
    float helios::deg2rad (float deg)
     Convert degrees to radians.
     
    float helios::rad2deg (float rad)
    float helios::rad2deg (float rad)
     Convert radians to degrees.
     
    float helios::atan2_2pi (float y, float x)
    float helios::atan2_2pi (float y, float x)
     Four quadrant arc tangent between 0 and 2*pi.
     
    SphericalCoord helios::cart2sphere (const vec3 &Cartesian)
    SphericalCoord helios::cart2sphere (const vec3 &Cartesian)
     Convert Cartesian coordinates to spherical coordinates.
     
    vec3 helios::sphere2cart (const SphericalCoord &Spherical)
    vec3 helios::sphere2cart (const SphericalCoord &Spherical)
     Convert Spherical coordinates to Cartesian coordinates.
     
    vec2 helios::string2vec2 (const char *str)
    vec2 helios::string2vec2 (const char *str)
     Convert a space-delimited string into a vec2 vector.
     
    vec3 helios::string2vec3 (const char *str)
    vec3 helios::string2vec3 (const char *str)
     Convert a space-delimited string into a vec3 vector.
     
    vec4 helios::string2vec4 (const char *str)
    vec4 helios::string2vec4 (const char *str)
     Convert a space-delimited string into a vec4 vector.
     
    int2 helios::string2int2 (const char *str)
    int2 helios::string2int2 (const char *str)
     Convert a space-delimited string into an int2 vector.
     
    int3 helios::string2int3 (const char *str)
    int3 helios::string2int3 (const char *str)
     Convert a space-delimited string into an int3 vector.
     
    int4 helios::string2int4 (const char *str)
    int4 helios::string2int4 (const char *str)
     Convert a space-delimited string into an int4 vector.
     
    bool helios::parse_float (const std::string &input_string, float &converted_float)
    bool helios::parse_float (const std::string &input_string, float &converted_float)
     Convert a string into a float with error checking.
     
    bool helios::parse_double (const std::string &input_string, double &converted_double)
    bool helios::parse_double (const std::string &input_string, double &converted_double)
     Convert a string into a double with error checking.
     
    bool helios::parse_int (const std::string &input_string, int &converted_int)
    bool helios::parse_int (const std::string &input_string, int &converted_int)
     Convert a string into an integer with error checking.
     
    bool helios::parse_int2 (const std::string &input_string, int2 &converted_int2)
    bool helios::parse_int2 (const std::string &input_string, int2 &converted_int2)
     Convert a string into an int2 with error checking.
     
    bool helios::parse_int3 (const std::string &input_string, int3 &converted_int3)
    bool helios::parse_int3 (const std::string &input_string, int3 &converted_int3)
     Convert a string into an int3 with error checking.
     
    bool helios::parse_uint (const std::string &input_string, uint &converted_uint)
    bool helios::parse_uint (const std::string &input_string, uint &converted_uint)
     Convert a string into an unsigned integer with error checking.
     
    bool helios::parse_vec2 (const std::string &input_string, vec2 &converted_vec2)
    bool helios::parse_vec2 (const std::string &input_string, vec2 &converted_vec2)
     Convert a string into a vec2 with error checking.
     
    bool helios::parse_vec3 (const std::string &input_string, vec3 &converted_vec3)
    bool helios::parse_vec3 (const std::string &input_string, vec3 &converted_vec3)
     Convert a string into a vec3 with error checking.
     
    bool helios::parse_RGBcolor (const std::string &input_string, RGBcolor &converted_rgb)
    bool helios::parse_RGBcolor (const std::string &input_string, RGBcolor &converted_rgb)
     Convert a string into an RGBcolor with error checking.
     
    bool helios::open_xml_file (const std::string &xml_file, pugi::xml_document &xmldoc, std::string &error_string)
    bool helios::open_xml_file (const std::string &xml_file, pugi::xml_document &xmldoc, std::string &error_string)
     
    int helios::parse_xml_tag_int (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    int helios::parse_xml_tag_int (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
     Parse an XML tag containing an integer value.
     
    float helios::parse_xml_tag_float (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    float helios::parse_xml_tag_float (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
     Parse an XML tag containing a float value.
     
    vec2 helios::parse_xml_tag_vec2 (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    vec2 helios::parse_xml_tag_vec2 (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
     Parse an XML tag containing a vec2 value (i.e., two space delimited floats)
     
    vec3 helios::parse_xml_tag_vec3 (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    vec3 helios::parse_xml_tag_vec3 (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
     Parse an XML tag containing a vec3 value (i.e., three space delimited floats)
     
    std::string helios::parse_xml_tag_string (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    std::string helios::parse_xml_tag_string (const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
     Parse an XML tag containing a string.
     
    RGBAcolor helios::string2RGBcolor (const char *str)
    RGBAcolor helios::string2RGBcolor (const char *str)
     Convert a space-delimited string into an RGBcolor vector.
     
    std::string helios::deblank (const char *input)
    std::string helios::deblank (const char *input)
     Remove all whitespace from character array.
     
    std::string helios::deblank (const std::string &input)
    std::string helios::deblank (const std::string &input)
     Remove all whitespace from a string.
     
    std::string helios::trim_whitespace (const std::string &input)
    std::string helios::trim_whitespace (const std::string &input)
     Remove leading and trailing whitespace from a string.
     
    std::vector< std::string > helios::separate_string_by_delimiter (const std::string &inputstring, const std::string &delimiter)
    std::vector< std::string > helios::separate_string_by_delimiter (const std::string &inputstring, const std::string &delimiter)
     Separate string by delimiter and store into a vector.
     
    template<typename anytype >
    anytype helios::clamp (anytype value, anytype min, anytype max)
    template<typename anytype >
    anytype helios::clamp (anytype value, anytype min, anytype max)
     Clamp value to be within some specified bounds.
     
    float helios::sum (const std::vector< float > &vect)
    float helios::sum (const std::vector< float > &vect)
     Sum of a vector of floats.
     
    float helios::mean (const std::vector< float > &vect)
    float helios::mean (const std::vector< float > &vect)
     Mean value of a vector of floats.
     
    float helios::min (const std::vector< float > &vect)
    float helios::min (const std::vector< float > &vect)
     Minimum value of a vector of floats.
     
    int helios::min (const std::vector< int > &vect)
    int helios::min (const std::vector< int > &vect)
     Minimum value of a vector of ints.
     
    vec3 helios::min (const std::vector< vec3 > &vect)
    vec3 helios::min (const std::vector< vec3 > &vect)
     Minimum value of a vector of vec3's.
     
    float helios::max (const std::vector< float > &vect)
    float helios::max (const std::vector< float > &vect)
     Maximum value of a vector of floats.
     
    int helios::max (const std::vector< int > &vect)
    int helios::max (const std::vector< int > &vect)
     Maximum value of a vector of ints.
     
    vec3 helios::max (const std::vector< vec3 > &vect)
    vec3 helios::max (const std::vector< vec3 > &vect)
     Maximum value of a vector of vec3's.
     
    float helios::stdev (const std::vector< float > &vect)
    float helios::stdev (const std::vector< float > &vect)
     Standard deviation of a vector of floats.
     
    float helios::median (std::vector< float > vect)
    float helios::median (std::vector< float > vect)
     Median of a vector of floats.
     
    template<typename anytype >
    template<typename anytype >
    void helios::resize_vector (std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)
     Resize 2D C++ vector.
     
    template<typename anytype >
    template<typename anytype >
    void helios::resize_vector (std::vector< std::vector< std::vector< anytype > > > &vec, uint Nx, uint Ny, uint Nz)
     Resize 3D C++ vector.
     
    template<typename anytype >
    template<typename anytype >
    void helios::resize_vector (std::vector< std::vector< std::vector< std::vector< anytype > > > > &vec, uint Nx, uint Ny, uint Nz, uint Nw)
     Resize 4D C++ vector.
     
    RGBcolor helios::blend (const RGBcolor &color0, const RGBcolor &color1, float weight)
    RGBcolor helios::blend (const RGBcolor &color0, const RGBcolor &color1, float weight)
     Blend two RGB colors together.
     
    RGBAcolor helios::blend (const RGBAcolor &color0, const RGBAcolor &color1, float weight)
    RGBAcolor helios::blend (const RGBAcolor &color0, const RGBAcolor &color1, float weight)
     Blend two RGBA colors together.
     
    vec3 helios::rotatePoint (const vec3 &position, const SphericalCoord &rotation)
    vec3 helios::rotatePoint (const vec3 &position, const SphericalCoord &rotation)
     Function to rotate a 3D vector given spherical angles elevation and azimuth.
     
    vec3 helios::rotatePoint (const vec3 &position, float theta, float phi)
    vec3 helios::rotatePoint (const vec3 &position, float theta, float phi)
     Function to rotate a 3D vector given spherical angles elevation and azimuth.
     
    vec3 helios::rotatePointAboutLine (const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
    vec3 helios::rotatePointAboutLine (const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
     Rotate a 3D vector about an arbitrary line.
     
    float helios::calculateTriangleArea (const vec3 &v0, const vec3 &v1, const vec3 &v2)
    float helios::calculateTriangleArea (const vec3 &v0, const vec3 &v1, const vec3 &v2)
     Calculate the area of a triangle given its three vertices.
     
    Date helios::CalendarDay (int Julian_day, int year)
    Date helios::CalendarDay (int Julian_day, int year)
     Convert Julian day to calendar day (day,month,year)
     
    int helios::JulianDay (int day, int month, int year)
    int helios::JulianDay (int day, int month, int year)
     Convert calendar day (day,month,year) to Julian day.
     
    int helios::JulianDay (const Date &date)
    int helios::JulianDay (const Date &date)
     Convert calendar day (day,month,year) to Julian day.
     
    float helios::randu ()
    float helios::randu ()
     Random number from a uniform distribution between 0 and 1.
     
    int helios::randu (int imin, int imax)
    int helios::randu (int imin, int imax)
     Random integer from a uniform distribution between imin and imax.
     
    float helios::acos_safe (float x)
    float helios::acos_safe (float x)
     arccosine function to handle cases when round-off errors cause an argument <-1 or >1, and thus regular acos() returns NaN
     
    float helios::asin_safe (float x)
    float helios::asin_safe (float x)
     arcsine function to handle cases when round-off errors cause an argument <-1 or >1, and thus regular asin() returns NaN
     
    bool helios::lineIntersection (const vec2 &p1, const vec2 &q1, const vec2 &p2, const vec2 &q2)
    bool helios::lineIntersection (const vec2 &p1, const vec2 &q1, const vec2 &p2, const vec2 &q2)
     Determine if two line segments intersect. The lines segments are defined by vertices (p1,q1) and (p2,q2)
     
    bool helios::pointInPolygon (const vec2 &point, const std::vector< vec2 > &polygon_verts)
    bool helios::pointInPolygon (const vec2 &point, const std::vector< vec2 > &polygon_verts)
     Determine whether point lines within a polygon.
     
    void helios::wait (float seconds)
    void helios::wait (float seconds)
     Wait/sleep for a specified amount of time.
     
    bool helios::PNGHasAlpha (const char *filename)
    bool helios::PNGHasAlpha (const char *filename)
     Check whether PNG image file has an alpha/transparency channel.
     
    std::vector< std::vector< bool > > helios::readPNGAlpha (const std::string &filename)
    std::vector< std::vector< bool > > helios::readPNGAlpha (const std::string &filename)
     Function to read the alpha channel from a PNG image.
     
    void helios::readPNG (const std::string &filename, uint &width, uint &height, std::vector< helios::RGBAcolor > &pixel_data)
    void helios::readPNG (const std::string &filename, uint &width, uint &height, std::vector< helios::RGBAcolor > &pixel_data)
     Function to read a PNG image file into pixel data array.
     
    void helios::writePNG (const std::string &filename, uint width, uint height, const std::vector< helios::RGBAcolor > &pixel_data)
    void helios::writePNG (const std::string &filename, uint width, uint height, const std::vector< helios::RGBAcolor > &pixel_data)
     Function to write a PNG image based on pixel data.
     
    void helios::readJPEG (const std::string &filename, uint &width, uint &height, std::vector< helios::RGBcolor > &pixel_data)
    void helios::readJPEG (const std::string &filename, uint &width, uint &height, std::vector< helios::RGBcolor > &pixel_data)
     Function to read a JPEG image file into pixel data array.
     
    helios::int2 helios::getImageResolutionJPEG (const std::string &filename)
    helios::int2 helios::getImageResolutionJPEG (const std::string &filename)
     Function to read a JPEG image file into pixel data array.
     
    void helios::writeJPEG (const std::string &filename, uint width, uint height, const std::vector< helios::RGBcolor > &pixel_data)
    void helios::writeJPEG (const std::string &filename, uint width, uint height, const std::vector< helios::RGBcolor > &pixel_data)
     Function to write a JPEG image based on pixel data.
     
    std::vector< int > helios::flatten (const std::vector< std::vector< int > > &vec)
    std::vector< int > helios::flatten (const std::vector< std::vector< int > > &vec)
     Function to flatten a 2D int vector into a 1D vector.
     
    std::vector< uint > helios::flatten (const std::vector< std::vector< uint > > &vec)
    std::vector< uint > helios::flatten (const std::vector< std::vector< uint > > &vec)
     Function to flatten a 2D uint &vector into a 1D vector.
     
    std::vector< float > helios::flatten (const std::vector< std::vector< float > > &vec)
    std::vector< float > helios::flatten (const std::vector< std::vector< float > > &vec)
     Function to flatten a 2D float vector into a 1D vector.
     
    std::vector< double > helios::flatten (const std::vector< std::vector< double > > &vec)
    std::vector< double > helios::flatten (const std::vector< std::vector< double > > &vec)
     Function to flatten a 2D double vector into a 1D vector.
     
    std::vector< helios::vec2helios::flatten (const std::vector< std::vector< helios::vec2 > > &vec)
    std::vector< helios::vec2helios::flatten (const std::vector< std::vector< helios::vec2 > > &vec)
     Function to flatten a 2D vec2 vector into a 1D vector.
     
    std::vector< helios::vec3helios::flatten (const std::vector< std::vector< helios::vec3 > > &vec)
    std::vector< helios::vec3helios::flatten (const std::vector< std::vector< helios::vec3 > > &vec)
     Function to flatten a 2D vec3 vector into a 1D vector.
     
    std::vector< helios::vec4helios::flatten (const std::vector< std::vector< helios::vec4 > > &vec)
    std::vector< helios::vec4helios::flatten (const std::vector< std::vector< helios::vec4 > > &vec)
     Function to flatten a 2D vec4 vector into a 1D vector.
     
    std::vector< helios::int2helios::flatten (const std::vector< std::vector< helios::int2 > > &vec)
    std::vector< helios::int2helios::flatten (const std::vector< std::vector< helios::int2 > > &vec)
     Function to flatten a 2D int2 vector into a 1D vector.
     
    std::vector< helios::int3helios::flatten (const std::vector< std::vector< helios::int3 > > &vec)
    std::vector< helios::int3helios::flatten (const std::vector< std::vector< helios::int3 > > &vec)
     Function to flatten a 2D int3 vector into a 1D vector.
     
    std::vector< helios::int4helios::flatten (const std::vector< std::vector< helios::int4 > > &vec)
    std::vector< helios::int4helios::flatten (const std::vector< std::vector< helios::int4 > > &vec)
     Function to flatten a 2D int4 vector into a 1D vector.
     
    std::vector< std::string > helios::flatten (const std::vector< std::vector< std::string > > &vec)
    std::vector< std::string > helios::flatten (const std::vector< std::vector< std::string > > &vec)
     Function to flatten a 2D string vector into a 1D vector.
     
    std::vector< int > helios::flatten (const std::vector< std::vector< std::vector< int > > > &vec)
    std::vector< int > helios::flatten (const std::vector< std::vector< std::vector< int > > > &vec)
     Function to flatten a 3D int vector into a 1D vector.
     
    std::vector< uint > helios::flatten (const std::vector< std::vector< std::vector< uint > > > &vec)
    std::vector< uint > helios::flatten (const std::vector< std::vector< std::vector< uint > > > &vec)
     Function to flatten a 3D uint vector into a 1D vector.
     
    std::vector< float > helios::flatten (const std::vector< std::vector< std::vector< float > > > &vec)
    std::vector< float > helios::flatten (const std::vector< std::vector< std::vector< float > > > &vec)
     Function to flatten a 3D float vector into a 1D vector.
     
    std::vector< double > helios::flatten (const std::vector< std::vector< std::vector< double > > > &vec)
    std::vector< double > helios::flatten (const std::vector< std::vector< std::vector< double > > > &vec)
     Function to flatten a 3D double vector into a 1D vector.
     
    std::vector< helios::vec2helios::flatten (const std::vector< std::vector< std::vector< helios::vec2 > > > &vec)
    std::vector< helios::vec2helios::flatten (const std::vector< std::vector< std::vector< helios::vec2 > > > &vec)
     Function to flatten a 3D vec2 vector into a 1D vector.
     
    std::vector< helios::vec3helios::flatten (const std::vector< std::vector< std::vector< helios::vec3 > > > &vec)
    std::vector< helios::vec3helios::flatten (const std::vector< std::vector< std::vector< helios::vec3 > > > &vec)
     Function to flatten a 3D vec3 vector into a 1D vector.
     
    std::vector< helios::vec4helios::flatten (const std::vector< std::vector< std::vector< helios::vec4 > > > &vec)
    std::vector< helios::vec4helios::flatten (const std::vector< std::vector< std::vector< helios::vec4 > > > &vec)
     Function to flatten a 3D vec4 vector into a 1D vector.
     
    std::vector< helios::int2helios::flatten (const std::vector< std::vector< std::vector< helios::int2 > > > &vec)
    std::vector< helios::int2helios::flatten (const std::vector< std::vector< std::vector< helios::int2 > > > &vec)
     Function to flatten a 3D int2 vector into a 1D vector.
     
    std::vector< helios::int3helios::flatten (const std::vector< std::vector< std::vector< helios::int3 > > > &vec)
    std::vector< helios::int3helios::flatten (const std::vector< std::vector< std::vector< helios::int3 > > > &vec)
     Function to flatten a 3D int3 vector into a 1D vector.
     
    std::vector< helios::int4helios::flatten (const std::vector< std::vector< std::vector< helios::int4 > > > &vec)
    std::vector< helios::int4helios::flatten (const std::vector< std::vector< std::vector< helios::int4 > > > &vec)
     Function to flatten a 3D int4 vector into a 1D vector.
     
    std::vector< std::string > helios::flatten (const std::vector< std::vector< std::vector< std::string > > > &vec)
    std::vector< std::string > helios::flatten (const std::vector< std::vector< std::vector< std::string > > > &vec)
     Function to flatten a 3D string vector into a 1D vector.
     
    std::vector< int > helios::flatten (const std::vector< std::vector< std::vector< std::vector< int > > > > &vec)
    std::vector< int > helios::flatten (const std::vector< std::vector< std::vector< std::vector< int > > > > &vec)
     Function to flatten a 4D int vector into a 1D vector.
     
    std::vector< uint > helios::flatten (const std::vector< std::vector< std::vector< std::vector< uint > > > > &vec)
    std::vector< uint > helios::flatten (const std::vector< std::vector< std::vector< std::vector< uint > > > > &vec)
     Function to flatten a 4D uint vector into a 1D vector.
     
    std::vector< float > helios::flatten (const std::vector< std::vector< std::vector< std::vector< float > > > > &vec)
    std::vector< float > helios::flatten (const std::vector< std::vector< std::vector< std::vector< float > > > > &vec)
     Function to flatten a 4D float vector into a 1D vector.
     
    std::vector< double > helios::flatten (const std::vector< std::vector< std::vector< std::vector< double > > > > &vec)
    std::vector< double > helios::flatten (const std::vector< std::vector< std::vector< std::vector< double > > > > &vec)
     Function to flatten a 4D double vector into a 1D vector.
     
    std::vector< helios::vec2helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::vec2 > > > > &vec)
    std::vector< helios::vec2helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::vec2 > > > > &vec)
     Function to flatten a 4D vec2 vector into a 1D vector.
     
    std::vector< helios::vec3helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::vec3 > > > > &vec)
    std::vector< helios::vec3helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::vec3 > > > > &vec)
     Function to flatten a 4D vec3 vector into a 1D vector.
     
    std::vector< helios::vec4helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::vec4 > > > > &vec)
    std::vector< helios::vec4helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::vec4 > > > > &vec)
     Function to flatten a 4D vec4 vector into a 1D vector.
     
    std::vector< helios::int2helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::int2 > > > > &vec)
    std::vector< helios::int2helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::int2 > > > > &vec)
     Function to flatten a 4D int2 vector into a 1D vector.
     
    std::vector< helios::int3helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::int3 > > > > &vec)
    std::vector< helios::int3helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::int3 > > > > &vec)
     Function to flatten a 4D int3 vector into a 1D vector.
     
    std::vector< helios::int4helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::int4 > > > > &vec)
    std::vector< helios::int4helios::flatten (const std::vector< std::vector< std::vector< std::vector< helios::int4 > > > > &vec)
     Function to flatten a 4D int4 vector into a 1D vector.
     
    std::vector< std::string > helios::flatten (const std::vector< std::vector< std::vector< std::vector< std::string > > > > &vec)
    std::vector< std::string > helios::flatten (const std::vector< std::vector< std::vector< std::vector< std::string > > > > &vec)
     Function to flatten a 4D string vector into a 1D vector.
     
    helios::vec3 helios::spline_interp3 (float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
    helios::vec3 helios::spline_interp3 (float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
     Function to perform cubic Hermite spline interpolation.
     
    float helios::XMLloadfloat (pugi::xml_node node, const char *field)
    float helios::XMLloadfloat (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into a float.
     
    int helios::XMLloadint (pugi::xml_node node, const char *field)
    int helios::XMLloadint (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into an int.
     
    std::string helios::XMLloadstring (pugi::xml_node node, const char *field)
    std::string helios::XMLloadstring (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into a string.
     
    helios::vec2 helios::XMLloadvec2 (pugi::xml_node node, const char *field)
    helios::vec2 helios::XMLloadvec2 (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into a vec2.
     
    helios::vec3 helios::XMLloadvec3 (pugi::xml_node node, const char *field)
    helios::vec3 helios::XMLloadvec3 (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into a vec3.
     
    helios::vec4 helios::XMLloadvec4 (pugi::xml_node node, const char *field)
    helios::vec4 helios::XMLloadvec4 (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into a vec4.
     
    helios::int2 helios::XMLloadint2 (pugi::xml_node node, const char *field)
    helios::int2 helios::XMLloadint2 (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into a vec2.
     
    helios::int3 helios::XMLloadint3 (pugi::xml_node node, const char *field)
    helios::int3 helios::XMLloadint3 (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into a int3.
     
    helios::int4 helios::XMLloadint4 (pugi::xml_node node, const char *field)
    helios::int4 helios::XMLloadint4 (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into a int4.
     
    helios::RGBcolor helios::XMLloadrgb (pugi::xml_node node, const char *field)
    helios::RGBcolor helios::XMLloadrgb (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into an RGB color vector.
     
    helios::RGBAcolor helios::XMLloadrgba (pugi::xml_node node, const char *field)
    helios::RGBAcolor helios::XMLloadrgba (pugi::xml_node node, const char *field)
     Function to load and convert a field in a pugi XML node into an RGBA color vector.
     
    float helios::fzero (float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
    float helios::fzero (float(*function)(float value, std::vector< float > &variables, const void *parameters), std::vector< float > &variables, const void *parameters, float init_guess, float err_tol=0.0001f, int max_iterations=100)
     Use Newton-Raphson method to find the zero of a function.
     
    float helios::interp1 (const std::vector< helios::vec2 > &points, float x)
    float helios::interp1 (const std::vector< helios::vec2 > &points, float x)
     Function to perform linear interpolation based on a vector of discrete (x,y) values.
     
    float helios::point_distance (const helios::vec3 &p1, const helios::vec3 &p2)
    float helios::point_distance (const helios::vec3 &p1, const helios::vec3 &p2)
     Function to calculate the distance between two points.
     
    std::string helios::getFileExtension (const std::string &filepath)
    std::string helios::getFileExtension (const std::string &filepath)
     Parse a file string to get the extension.
     
    std::string helios::getFileStem (const std::string &filepath)
    std::string helios::getFileStem (const std::string &filepath)
     Parse a file string to get the filename without extension.
     
    std::string helios::getFileName (const std::string &filepath)
    std::string helios::getFileName (const std::string &filepath)
     Parse a file string to get the filename including extension.
     
    std::string helios::getFilePath (const std::string &filepath, bool trailingslash=true)
    std::string helios::getFilePath (const std::string &filepath, bool trailingslash=true)
     Parse a file string to get the path (i.e., portion of the string before the file name).
     
    bool helios::validateOutputPath (std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
    bool helios::validateOutputPath (std::string &output_directory, const std::vector< std::string > &allowable_file_extensions={})
     Check whether output file and/or directory is valid. Add a trailing slash if it is a directory.
     
    std::vector< float > helios::importVectorFromFile (const std::string &filepath)
    std::vector< float > helios::importVectorFromFile (const std::string &filepath)
     Read values contained in a text file into a one-dimensional vector of floats.
     
    - + - + - +

    Variables

    constexpr float PI_F = 3.14159265358979323846f
    constexpr float PI_F = 3.14159265358979323846f
     
    SphericalCoord helios::nullrotation = make_SphericalCoord(0,0)
    SphericalCoord helios::nullrotation = make_SphericalCoord(0,0)
     Default null SphericalCoord that applies no rotation.
     
    vec3 helios::nullorigin = make_vec3(0,0,0)
    vec3 helios::nullorigin = make_vec3(0,0,0)
     Default null vec3 that gives the origin (0,0,0)
     
    @@ -574,13 +586,13 @@

    #define DEPRECATED ( -   - func) -    func + func) +

    @@ -628,25 +640,17 @@

    RGBAcolor helios::blend ( - const RGBAcolor &  - color0, + const RGBAcolor & color0, - const RGBAcolor &  - color1, + const RGBAcolor & color1, - float  - weight_RGBA  - - - - ) - + float weight_RGBA )

    @@ -677,25 +681,17 @@

    RGBcolor helios::blend ( - const RGBcolor &  - color0_RGB, + const RGBcolor & color0_RGB, - const RGBcolor &  - color1_RGB, + const RGBcolor & color1_RGB, - float  - weight_RGB  - - - - ) - + float weight_RGB )

    @@ -726,19 +722,12 @@

    Date helios::CalendarDay ( - int  - Julian_day, + int Julian_day, - int  - year  - - - - ) - + int year )

    @@ -1394,19 +1299,12 @@

    bool helios::parse_int3 ( - const std::string &  - input_string, + const std::string & input_string, - int3 &  - converted_int3  - - - - ) - + int3 & converted_int3 )

    @@ -1554,19 +1431,12 @@

    bool helios::parse_vec3 ( - const std::string &  - input_string, + const std::string & input_string, - vec3 &  - converted_vec3  - - - - ) - + vec3 & converted_vec3 )

    @@ -1735,25 +1581,17 @@

    vec2 helios::parse_xml_tag_vec2 ( - const pugi::xml_node &  - node, + const pugi::xml_node & node, - const std::string &  - tag, + const std::string & tag, - const std::string &  - calling_function  - - - - ) - + const std::string & calling_function )

    @@ -1782,25 +1620,17 @@

    vec3 helios::parse_xml_tag_vec3 ( - const pugi::xml_node &  - node, + const pugi::xml_node & node, - const std::string &  - tag, + const std::string & tag, - const std::string &  - calling_function  - - - - ) - + const std::string & calling_function )

    @@ -2003,8 +1807,7 @@

    std::vector< std::vector< bool > > helios::readPNGAlpha ( - const std::string &  - filename) + const std::string & filename) @@ -2032,31 +1835,22 @@

    vec3 helios::rotatePointAboutLine ( - const vec3 &  - point, + const vec3 & point, - const vec3 &  - line_base, + const vec3 & line_base, - const vec3 &  - line_direction, + const vec3 & line_direction, - float  - theta  - - - - ) - + float theta )

    @@ -2385,19 +2124,12 @@

    helios::int2 helios::XMLloadint2 ( - pugi::xml_node  - node, + pugi::xml_node node, - const char *  - field  - - - - ) - + const char * field )

    @@ -2424,19 +2156,12 @@

    helios::int3 helios::XMLloadint3 ( - pugi::xml_node  - node, + pugi::xml_node node, - const char *  - field  - - - - ) - + const char * field )

    @@ -2463,19 +2188,12 @@

    helios::int4 helios::XMLloadint4 ( - pugi::xml_node  - node, + pugi::xml_node node, - const char *  - field  - - - - ) - + const char * field )

    @@ -2502,19 +2220,12 @@

    helios::RGBcolor helios::XMLloadrgb ( - pugi::xml_node  - node, + pugi::xml_node node, - const char *  - field  - - - - ) - + const char * field )

    @@ -2541,19 +2252,12 @@

    helios::RGBAcolor helios::XMLloadrgba ( - pugi::xml_node  - node, + pugi::xml_node node, - const char *  - field  - - - - ) - + const char * field )

    @@ -2619,19 +2316,12 @@

    helios::vec2 helios::XMLloadvec2 ( - pugi::xml_node  - node, + pugi::xml_node node, - const char *  - field  - - - - ) - + const char * field )

    @@ -2658,19 +2348,12 @@

    helios::vec3 helios::XMLloadvec3 ( - pugi::xml_node  - node, + pugi::xml_node node, - const char *  - field  - - - - ) - + const char * field )

    @@ -2697,19 +2380,12 @@

    helios::vec4 helios::XMLloadvec4 ( - pugi::xml_node  - node, + pugi::xml_node node, - const char *  - field  - - - - ) - + const char * field )

    -

    Definition at line 29 of file global.h.

    +

    Definition at line 32 of file global.h.

    + diff --git a/doc/html/global_8h_source.html b/doc/html/global_8h_source.html index 6cdaa927a..0aefff803 100644 --- a/doc/html/global_8h_source.html +++ b/doc/html/global_8h_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    global.h
    @@ -98,7 +110,7 @@
    18#elif defined(_MSC_VER)
    19#define DEPRECATED(func) __declspec(deprecated) func
    20#else
    -
    21#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
    +
    21#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
    22#define DEPRECATED(func) func
    23#endif
    24
    @@ -106,10 +118,10 @@
    26#define M_PI 3.14159265358979323846
    27#endif
    28
    -
    29inline constexpr float PI_F = 3.14159265358979323846f;
    -
    30
    -
    31#ifndef HELIOS_GLOBAL
    -
    32#define HELIOS_GLOBAL
    +
    29#ifndef HELIOS_GLOBAL
    +
    30#define HELIOS_GLOBAL
    +
    31
    +
    32constexpr float PI_F = 3.14159265358979323846f;
    33
    34#include <cstdlib>
    35#include <cstdio>
    @@ -362,6 +374,7 @@
    613 bool pointInPolygon(const vec2 &point, const std::vector<vec2> &polygon_verts );
    614
    616
    +
    619 struct Timer{
    620 public:
    621
    @@ -369,16 +382,21 @@
    623 running=false;
    624 }
    625
    +
    627 void tic(){
    628 timer_start = std::chrono::high_resolution_clock::now();
    629 running = true;
    630 };
    +
    631
    +
    633 double toc() const{
    634 return toc("");
    635 }
    +
    636
    638
    +
    641 double toc( const char* message ) const {
    642 if (!running) {
    643 std::cerr << "ERROR (Timer): You must call `tic' before calling `toc'. Ignoring call to `toc'..." << std::endl;
    @@ -392,6 +410,7 @@
    651 }
    652 return duration;
    653 }
    +
    654
    655 private:
    656
    @@ -399,6 +418,7 @@
    658 std::chrono::high_resolution_clock::time_point timer_start;
    659
    660 };
    +
    661
    663
    667 void wait( float seconds );
    @@ -595,84 +615,85 @@
    1098}
    1099
    1100#endif
    -
    bool parse_double(const std::string &input_string, double &converted_double)
    Convert a string into a double with error checking.
    Definition: global.cpp:779
    -
    float parse_xml_tag_float(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a float value.
    Definition: global.cpp:954
    -
    vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
    Rotate a 3D vector about an arbitrary line.
    Definition: global.cpp:140
    -
    std::vector< float > importVectorFromFile(const std::string &filepath)
    Read values contained in a text file into a one-dimensional vector of floats.
    Definition: global.cpp:3150
    -
    bool parse_int2(const std::string &input_string, int2 &converted_int2)
    Convert a string into an int2 with error checking.
    Definition: global.cpp:809
    -
    bool parse_float(const std::string &input_string, float &converted_float)
    Convert a string into a float with error checking.
    Definition: global.cpp:763
    -
    RGBcolor blend(const RGBcolor &color0, const RGBcolor &color1, float weight)
    Blend two RGB colors together.
    Definition: global.cpp:60
    -
    vec3 parse_xml_tag_vec3(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a vec3 value (i.e., three space delimited floats)
    Definition: global.cpp:978
    -
    void matmult(const float ML[16], const float MR[16], float(&T)[16])
    Multiply 4x4 matrices: T=ML*MR.
    Definition: global.cpp:499
    -
    bool parse_vec3(const std::string &input_string, vec3 &converted_vec3)
    Convert a string into a vec3 with error checking.
    Definition: global.cpp:876
    -
    Date CalendarDay(int Julian_day, int year)
    Convert Julian day to calendar day (day,month,year)
    Definition: global.cpp:1307
    -
    bool parse_vec2(const std::string &input_string, vec2 &converted_vec2)
    Convert a string into a vec2 with error checking.
    Definition: global.cpp:860
    -
    bool parse_uint(const std::string &input_string, uint &converted_uint)
    Convert a string into an unsigned integer with error checking.
    Definition: global.cpp:842
    -
    void helios_runtime_error(const std::string &error_message)
    Function to throw a runtime error.
    Definition: global.cpp:29
    -
    bool parse_int(const std::string &input_string, int &converted_int)
    Convert a string into an integer with error checking.
    Definition: global.cpp:794
    -
    vec2 parse_xml_tag_vec2(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a vec2 value (i.e., two space delimited floats)
    Definition: global.cpp:966
    -
    bool parse_RGBcolor(const std::string &input_string, RGBcolor &converted_rgb)
    Convert a string into an RGBcolor with error checking.
    Definition: global.cpp:893
    -
    int JulianDay(int day, int month, int year)
    Convert calendar day (day,month,year) to Julian day.
    Definition: global.cpp:1350
    -
    vec3 nullorigin
    Default null vec3 that gives the origin (0,0,0)
    Definition: global.cpp:58
    -
    bool parse_int3(const std::string &input_string, int3 &converted_int3)
    Convert a string into an int3 with error checking.
    Definition: global.cpp:825
    -
    std::string parse_xml_tag_string(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a string.
    Definition: global.cpp:990
    -
    void makeIdentityMatrix(float(&T)[16])
    Construct an identity matrix.
    Definition: global.cpp:555
    -
    SphericalCoord nullrotation
    Default null SphericalCoord that applies no rotation.
    Definition: global.cpp:57
    -
    void vecmult(const float M[16], const float v[3], float(&result)[3])
    Multiply 4x4 transformation matrix by 3-element vector: T=M*v.
    Definition: global.cpp:539
    -
    int parse_xml_tag_int(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing an integer value.
    Definition: global.cpp:942
    -
    float randu()
    Random number from a uniform distribution between 0 and 1.
    Definition: global.cpp:223
    -
    float rad2deg(float rad)
    Convert radians to degrees.
    Definition: global.cpp:580
    -
    std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
    Function to flatten a 2D int vector into a 1D vector.
    Definition: global.cpp:1943
    -
    vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
    Function to rotate a 3D vector given spherical angles elevation and azimuth.
    Definition: global.cpp:79
    -
    vec2 string2vec2(const char *str)
    Convert a space-delimited string into a vec2 vector.
    Definition: global.cpp:623
    -
    int2 string2int2(const char *str)
    Convert a space-delimited string into an int2 vector.
    Definition: global.cpp:683
    -
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition: global.cpp:610
    -
    float atan2_2pi(float y, float x)
    Four quadrant arc tangent between 0 and 2*pi.
    Definition: global.cpp:584
    -
    bool lineIntersection(const vec2 &p1, const vec2 &q1, const vec2 &p2, const vec2 &q2)
    Determine if two line segments intersect. The lines segments are defined by vertices (p1,...
    Definition: global.cpp:253
    -
    void makeRotationMatrix(float rotation, const char *axis, float(&transform)[16])
    Construct a rotation matrix to perform rotation about the x-, y-, or z-axis.
    Definition: global.cpp:313
    -
    float median(std::vector< float > vect)
    Median of a vector of floats.
    Definition: global.cpp:1214
    -
    int4 string2int4(const char *str)
    Convert a space-delimited string into an int4 vector.
    Definition: global.cpp:723
    -
    float min(const std::vector< float > &vect)
    Minimum value of a vector of floats.
    Definition: global.cpp:1100
    -
    std::string trim_whitespace(const std::string &input)
    Remove leading and trailing whitespace from a string.
    Definition: global.cpp:1016
    -
    float deg2rad(float deg)
    Convert degrees to radians.
    Definition: global.cpp:576
    -
    vec3 string2vec3(const char *str)
    Convert a space-delimited string into a vec3 vector.
    Definition: global.cpp:643
    -
    void makeTranslationMatrix(const helios::vec3 &translation, float(&transform)[16])
    Construct translation matrix.
    Definition: global.cpp:436
    -
    float calculateTriangleArea(const vec3 &v0, const vec3 &v1, const vec3 &v2)
    Calculate the area of a triangle given its three vertices.
    Definition: global.cpp:175
    -
    helios::vec3 spline_interp3(float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
    Function to perform cubic Hermite spline interpolation.
    Definition: global.cpp:2768
    -
    RGBAcolor string2RGBcolor(const char *str)
    Convert a space-delimited string into an RGBcolor vector.
    Definition: global.cpp:743
    -
    float max(const std::vector< float > &vect)
    Maximum value of a vector of floats.
    Definition: global.cpp:1146
    -
    float stdev(const std::vector< float > &vect)
    Standard deviation of a vector of floats.
    Definition: global.cpp:1192
    -
    void resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)
    Resize 2D C++ vector.
    Definition: global.cpp:1239
    -
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition: global.cpp:617
    -
    void makeScaleMatrix(const helios::vec3 &scale, float(&T)[16])
    Construct matrix to scale about the origin.
    Definition: global.cpp:457
    -
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:241
    -
    float sum(const std::vector< float > &vect)
    Sum of a vector of floats.
    Definition: global.cpp:1069
    -
    bool pointInPolygon(const vec2 &point, const std::vector< vec2 > &polygon_verts)
    Determine whether point lines within a polygon.
    Definition: global.cpp:276
    -
    float asin_safe(float x)
    arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:247
    -
    int3 string2int3(const char *str)
    Convert a space-delimited string into an int3 vector.
    Definition: global.cpp:703
    -
    void wait(float seconds)
    Wait/sleep for a specified amount of time.
    Definition: global.cpp:306
    -
    std::string deblank(const char *input)
    Remove all whitespace from character array.
    Definition: global.cpp:994
    -
    vec4 string2vec4(const char *str)
    Convert a space-delimited string into a vec4 vector.
    Definition: global.cpp:663
    -
    float mean(const std::vector< float > &vect)
    Mean value of a vector of floats.
    Definition: global.cpp:1084
    -
    std::vector< std::string > separate_string_by_delimiter(const std::string &inputstring, const std::string &delimiter)
    Separate string by delimiter and store into a vector.
    Definition: global.cpp:1032
    -
    anytype clamp(anytype value, anytype min, anytype max)
    Clamp value to be within some specified bounds.
    Definition: global.cpp:1055
    +
    bool parse_double(const std::string &input_string, double &converted_double)
    Convert a string into a double with error checking.
    Definition global.cpp:779
    +
    float parse_xml_tag_float(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a float value.
    Definition global.cpp:954
    +
    vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
    Rotate a 3D vector about an arbitrary line.
    Definition global.cpp:140
    +
    std::vector< float > importVectorFromFile(const std::string &filepath)
    Read values contained in a text file into a one-dimensional vector of floats.
    Definition global.cpp:3150
    +
    bool parse_int2(const std::string &input_string, int2 &converted_int2)
    Convert a string into an int2 with error checking.
    Definition global.cpp:809
    +
    bool parse_float(const std::string &input_string, float &converted_float)
    Convert a string into a float with error checking.
    Definition global.cpp:763
    +
    RGBcolor blend(const RGBcolor &color0, const RGBcolor &color1, float weight)
    Blend two RGB colors together.
    Definition global.cpp:60
    +
    vec3 parse_xml_tag_vec3(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a vec3 value (i.e., three space delimited floats)
    Definition global.cpp:978
    +
    void matmult(const float ML[16], const float MR[16], float(&T)[16])
    Multiply 4x4 matrices: T=ML*MR.
    Definition global.cpp:499
    +
    bool parse_vec3(const std::string &input_string, vec3 &converted_vec3)
    Convert a string into a vec3 with error checking.
    Definition global.cpp:876
    +
    Date CalendarDay(int Julian_day, int year)
    Convert Julian day to calendar day (day,month,year)
    Definition global.cpp:1307
    +
    bool parse_vec2(const std::string &input_string, vec2 &converted_vec2)
    Convert a string into a vec2 with error checking.
    Definition global.cpp:860
    +
    bool parse_uint(const std::string &input_string, uint &converted_uint)
    Convert a string into an unsigned integer with error checking.
    Definition global.cpp:842
    +
    void helios_runtime_error(const std::string &error_message)
    Function to throw a runtime error.
    Definition global.cpp:29
    +
    bool parse_int(const std::string &input_string, int &converted_int)
    Convert a string into an integer with error checking.
    Definition global.cpp:794
    +
    vec2 parse_xml_tag_vec2(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a vec2 value (i.e., two space delimited floats)
    Definition global.cpp:966
    +
    bool parse_RGBcolor(const std::string &input_string, RGBcolor &converted_rgb)
    Convert a string into an RGBcolor with error checking.
    Definition global.cpp:893
    +
    int JulianDay(int day, int month, int year)
    Convert calendar day (day,month,year) to Julian day.
    Definition global.cpp:1350
    +
    vec3 nullorigin
    Default null vec3 that gives the origin (0,0,0)
    Definition global.cpp:58
    +
    bool parse_int3(const std::string &input_string, int3 &converted_int3)
    Convert a string into an int3 with error checking.
    Definition global.cpp:825
    +
    std::string parse_xml_tag_string(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing a string.
    Definition global.cpp:990
    +
    void makeIdentityMatrix(float(&T)[16])
    Construct an identity matrix.
    Definition global.cpp:555
    +
    SphericalCoord nullrotation
    Default null SphericalCoord that applies no rotation.
    Definition global.cpp:57
    +
    void vecmult(const float M[16], const float v[3], float(&result)[3])
    Multiply 4x4 transformation matrix by 3-element vector: T=M*v.
    Definition global.cpp:539
    +
    int parse_xml_tag_int(const pugi::xml_node &node, const std::string &tag, const std::string &calling_function)
    Parse an XML tag containing an integer value.
    Definition global.cpp:942
    +
    float randu()
    Random number from a uniform distribution between 0 and 1.
    Definition global.cpp:223
    +
    float rad2deg(float rad)
    Convert radians to degrees.
    Definition global.cpp:580
    +
    std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
    Function to flatten a 2D int vector into a 1D vector.
    Definition global.cpp:1943
    +
    vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
    Function to rotate a 3D vector given spherical angles elevation and azimuth.
    Definition global.cpp:79
    +
    vec2 string2vec2(const char *str)
    Convert a space-delimited string into a vec2 vector.
    Definition global.cpp:623
    +
    int2 string2int2(const char *str)
    Convert a space-delimited string into an int2 vector.
    Definition global.cpp:683
    +
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition global.cpp:610
    +
    float atan2_2pi(float y, float x)
    Four quadrant arc tangent between 0 and 2*pi.
    Definition global.cpp:584
    +
    bool lineIntersection(const vec2 &p1, const vec2 &q1, const vec2 &p2, const vec2 &q2)
    Determine if two line segments intersect. The lines segments are defined by vertices (p1,...
    Definition global.cpp:253
    +
    void makeRotationMatrix(float rotation, const char *axis, float(&transform)[16])
    Construct a rotation matrix to perform rotation about the x-, y-, or z-axis.
    Definition global.cpp:313
    +
    float median(std::vector< float > vect)
    Median of a vector of floats.
    Definition global.cpp:1214
    +
    int4 string2int4(const char *str)
    Convert a space-delimited string into an int4 vector.
    Definition global.cpp:723
    +
    float min(const std::vector< float > &vect)
    Minimum value of a vector of floats.
    Definition global.cpp:1100
    +
    std::string trim_whitespace(const std::string &input)
    Remove leading and trailing whitespace from a string.
    Definition global.cpp:1016
    +
    float deg2rad(float deg)
    Convert degrees to radians.
    Definition global.cpp:576
    +
    vec3 string2vec3(const char *str)
    Convert a space-delimited string into a vec3 vector.
    Definition global.cpp:643
    +
    void makeTranslationMatrix(const helios::vec3 &translation, float(&transform)[16])
    Construct translation matrix.
    Definition global.cpp:436
    +
    float calculateTriangleArea(const vec3 &v0, const vec3 &v1, const vec3 &v2)
    Calculate the area of a triangle given its three vertices.
    Definition global.cpp:175
    +
    helios::vec3 spline_interp3(float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
    Function to perform cubic Hermite spline interpolation.
    Definition global.cpp:2768
    +
    RGBAcolor string2RGBcolor(const char *str)
    Convert a space-delimited string into an RGBcolor vector.
    Definition global.cpp:743
    +
    float max(const std::vector< float > &vect)
    Maximum value of a vector of floats.
    Definition global.cpp:1146
    +
    float stdev(const std::vector< float > &vect)
    Standard deviation of a vector of floats.
    Definition global.cpp:1192
    +
    void resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)
    Resize 2D C++ vector.
    Definition global.cpp:1239
    +
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition global.cpp:617
    +
    void makeScaleMatrix(const helios::vec3 &scale, float(&T)[16])
    Construct matrix to scale about the origin.
    Definition global.cpp:457
    +
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:241
    +
    float sum(const std::vector< float > &vect)
    Sum of a vector of floats.
    Definition global.cpp:1069
    +
    bool pointInPolygon(const vec2 &point, const std::vector< vec2 > &polygon_verts)
    Determine whether point lines within a polygon.
    Definition global.cpp:276
    +
    float asin_safe(float x)
    arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:247
    +
    int3 string2int3(const char *str)
    Convert a space-delimited string into an int3 vector.
    Definition global.cpp:703
    +
    void wait(float seconds)
    Wait/sleep for a specified amount of time.
    Definition global.cpp:306
    +
    std::string deblank(const char *input)
    Remove all whitespace from character array.
    Definition global.cpp:994
    +
    vec4 string2vec4(const char *str)
    Convert a space-delimited string into a vec4 vector.
    Definition global.cpp:663
    +
    float mean(const std::vector< float > &vect)
    Mean value of a vector of floats.
    Definition global.cpp:1084
    +
    std::vector< std::string > separate_string_by_delimiter(const std::string &inputstring, const std::string &delimiter)
    Separate string by delimiter and store into a vector.
    Definition global.cpp:1032
    +
    anytype clamp(anytype value, anytype min, anytype max)
    Clamp value to be within some specified bounds.
    Definition global.cpp:1055
    -
    R-G-B-A color vector.
    -
    R-G-B color vector.
    -
    MATLAB-style timer. Call tic() to start timer, call toc() to stop timer and print duration.
    Definition: global.h:619
    -
    double toc(const char *message) const
    Stop timer and print elapsed time and a user-defined message.
    Definition: global.h:641
    -
    void tic()
    Start timer.
    Definition: global.h:627
    -
    double toc() const
    Stop timer and print elapsed time.
    Definition: global.h:633
    -
    Vector of two elements of type 'int'.
    -
    Vector of three elements of type 'int'.
    -
    Vector of four elements of type 'int'.
    -
    Vector of two elements of type 'float'.
    -
    Vector of three elements of type 'float'.
    -
    Vector of four elements of type 'float'.
    +
    R-G-B-A color vector.
    +
    R-G-B color vector.
    +
    MATLAB-style timer. Call tic() to start timer, call toc() to stop timer and print duration.
    Definition global.h:619
    +
    double toc(const char *message) const
    Stop timer and print elapsed time and a user-defined message.
    Definition global.h:641
    +
    void tic()
    Start timer.
    Definition global.h:627
    +
    double toc() const
    Stop timer and print elapsed time.
    Definition global.h:633
    +
    Vector of two elements of type 'int'.
    +
    Vector of three elements of type 'int'.
    +
    Vector of four elements of type 'int'.
    +
    Vector of two elements of type 'float'.
    +
    Vector of three elements of type 'float'.
    +
    Vector of four elements of type 'float'.
    + diff --git a/doc/html/globals.html b/doc/html/globals.html index 1f56e24cb..8c8ecccd7 100644 --- a/doc/html/globals.html +++ b/doc/html/globals.html @@ -38,31 +38,43 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    - b -

    +

    - c -

    + +

    - d -

    +
    helios_vector_types.h
    @@ -114,6 +126,7 @@
    38namespace helios{
    39
    41
    +
    44struct int2{
    45public:
    46
    @@ -123,6 +136,7 @@
    53 /* initializes to zero */
    54 int2() : x(0), y(0) {}
    55
    +
    57 explicit int2( const std::vector<int> &v ){
    58 if( v.size()!=2){
    59 throw(std::runtime_error("ERROR: vector for initialization of int2 must have length 2."));
    @@ -130,6 +144,7 @@
    61 x=v[0];
    62 y=v[1];
    63 }
    +
    65 explicit int2( const int v[2] ) : x(v[0]), y(v[1]) {}
    66
    68 int2( int v0, int v1 ) : x(v0), y(v1) {}
    @@ -143,55 +158,77 @@
    82 bool operator!=( const int2& a ) const;
    84 int2 operator-() const;
    85
    +
    87 friend std::ostream &operator<<(std::ostream &os, const helios::int2 &vec) {
    88 return os << "helios::int2<" << vec.x << ", " << vec.y << ">";
    89 }
    +
    90
    91};
    +
    92
    94
    +
    99inline int2 make_int2( int x, int y ){
    100 return {x,y};
    101}
    +
    102
    104
    +
    108inline int2 make_int2( int X[2] ){
    109 return {X[0],X[1]};
    110}
    +
    111
    +
    112inline int2 int2::operator+(const int2& a) const{
    113 return {a.x+x, a.y+y};
    114}
    +
    115
    +
    116inline int2& int2::operator+=(const int2& a){
    117 this->x += a.x;
    118 this->y += a.y;
    119 return *this;
    120}
    +
    121
    +
    122inline int2& int2::operator-=(const int2& a){
    123 this->x -= a.x;
    124 this->y -= a.y;
    125 return *this;
    126}
    +
    127
    +
    128inline int2 int2::operator-(const int2& a) const{
    129 return {x-a.x, y-a.y};
    130}
    +
    131
    +
    132inline bool int2::operator==( const int2& a ) const{
    133 return a.x==x && a.y==y;
    134}
    +
    135
    +
    136inline bool int2::operator!=( const int2& a ) const{
    137 return a.x!=x || a.y!=y;
    138}
    +
    139
    +
    140inline int2 int2::operator-() const{
    141 return {-x,-y};
    142}
    +
    143
    145
    +
    146struct int3{
    147public:
    148
    @@ -202,6 +239,7 @@
    157 /* initializes to zero */
    158 int3() : x(0), y(0), z(0) {}
    159
    +
    161 explicit int3( const std::vector<int> &v ){
    162 if( v.size()!=3){
    163 throw(std::runtime_error("ERROR: vector for initialization of int3 must have length 3."));
    @@ -210,6 +248,7 @@
    166 y=v[1];
    167 z=v[2];
    168 }
    +
    170 explicit int3( const int v[3] ) : x(v[0]), y(v[1]), z(v[2]) {}
    171
    173 int3( int v0, int v1, int v2 ) : x(v0), y(v1), z(v2) {}
    @@ -222,55 +261,77 @@
    186 bool operator!=( const int3& a ) const;
    188 int3 operator-() const;
    189
    +
    191 friend std::ostream &operator<<(std::ostream &os, const helios::int3 &vec) {
    192 return os << "helios::int3<" << vec.x << ", " << vec.y << ", " << vec.z << ">";
    193 }
    +
    194
    195};
    +
    196
    +
    198inline int3 make_int3( int X, int Y, int Z ){
    199 return {X,Y,Z};
    200}
    +
    201
    +
    203inline int3 make_int3( int X[3] ){
    204 return {X[0],X[1],X[2]};
    205}
    +
    206
    +
    207inline int3 int3::operator+(const int3& a) const{
    208 return {a.x+x, a.y+y, a.z+z};
    209}
    +
    210
    +
    211inline int3& int3::operator+=(const int3& a){
    212 this->x += a.x;
    213 this->y += a.y;
    214 this->z += a.z;
    215 return *this;
    216}
    +
    217
    +
    218inline int3& int3::operator-=(const int3& a){
    219 this->x -= a.x;
    220 this->y -= a.y;
    221 this->z -= a.z;
    222 return *this;
    223}
    +
    224
    +
    225inline int3 int3::operator-(const int3& a) const{
    226 return {x-a.x, y-a.y, z-a.z};
    227}
    +
    228
    +
    229inline bool int3::operator==( const int3& a ) const{
    230 return a.x==x && a.y==y && a.z==z;
    231}
    +
    232
    +
    233inline bool int3::operator!=( const int3& a ) const{
    234 return a.x!=x || a.y!=y || a.z!=z;
    235}
    +
    236
    +
    237inline int3 int3::operator-() const{
    238 return {-x,-y,-z};
    239}
    +
    240
    242
    +
    243struct int4{
    244public:
    245
    @@ -282,6 +343,7 @@
    256 /* initializes to zero */
    257 int4() : x(0), y(0), z(0), w(0) {}
    258
    +
    260 explicit int4( const std::vector<int> &v ){
    261 if( v.size()!=4){
    262 throw(std::runtime_error("ERROR: vector for initialization of int4 must have length 4."));
    @@ -291,6 +353,7 @@
    266 z=v[2];
    267 w=v[3];
    268 }
    +
    269
    271 explicit int4( const int v[3] ) : x(v[0]), y(v[1]), z(v[2]), w(v[3]) {}
    272
    @@ -304,24 +367,34 @@
    287 bool operator!=( const int4& a ) const;
    289 int4 operator-() const;
    290
    +
    292 friend std::ostream &operator<<(std::ostream &os, const helios::int4 &vec) {
    293 return os << "helios::int4<" << vec.x << ", " << vec.y << ", " << vec.z << ", " << vec.w << ">";
    294 }
    +
    295
    296};
    +
    297
    +
    299 inline int4 make_int4(int x, int y, int z, int w ){
    300 return {x, y, z, w};
    301 }
    +
    302
    +
    304inline int4 make_int4( const int X[4] ){
    305 return {X[0],X[1],X[2],X[3]};
    306}
    +
    307
    +
    308inline int4 int4::operator+(const int4& a) const{
    309 return {a.x+x, a.y+y, a.z+z, a.w+w};
    310}
    +
    311
    +
    312inline int4& int4::operator+=(const int4& a){
    313 this->x += a.x;
    314 this->y += a.y;
    @@ -329,7 +402,9 @@
    316 this->w += a.w;
    317 return *this;
    318}
    +
    319
    +
    320inline int4& int4::operator-=(const int4& a){
    321 this->x -= a.x;
    322 this->y -= a.y;
    @@ -337,45 +412,60 @@
    324 this->w -= a.w;
    325 return *this;
    326}
    +
    327
    +
    328inline int4 int4::operator-(const int4& a) const{
    329 return {a.x-x, a.y-y, a.z-z, a.w-w};
    330}
    +
    331
    +
    332inline bool int4::operator==( const int4& a ) const{
    333 return a.x==x && a.y==y && a.z==z && a.w==w;
    334}
    +
    335
    +
    336inline bool int4::operator!=( const int4& a ) const{
    337 return a.x!=x || a.y!=y || a.z!=z || a.w!=w;
    338}
    +
    339
    +
    340inline int4 int4::operator-() const{
    341 return {-x,-y,-z,-w};
    342}
    +
    343
    345
    +
    346struct vec2{
    347public:
    348
    350 float x;
    352 float y;
    353
    +
    356 float mag = sqrt( x*x + y*y );
    357 x/=mag;
    358 y/=mag;
    359 return {x,y};
    360 }
    +
    361
    363
    +
    366 [[nodiscard]] float magnitude() const{
    367 return sqrtf( x*x + y*y );
    368 }
    +
    369
    371
    372 vec2() : x(0), y(0) {}
    373
    +
    375 explicit vec2( const std::vector<float> &v ){
    376 if( v.size()!=2){
    377 throw(std::runtime_error("ERROR: vector for initialization of vec2 must have length 2."));
    @@ -383,6 +473,7 @@
    379 x=v.at(0);
    380 y=v.at(1);
    381 }
    +
    383 explicit vec2( const float v[2] ) : x(v[0]), y(v[1]) {}
    384
    386 vec2( float v0, float v1 ) : x(v0), y(v1) {}
    @@ -400,86 +491,122 @@
    409 bool operator!=(const vec2& a) const;
    411 vec2 operator-() const;
    412
    +
    414 friend std::ostream &operator<<(std::ostream &os, const helios::vec2 &vec) {
    415 return os << "helios::vec2<" << vec.x << ", " << vec.y << ">";
    416 }
    +
    417
    418};
    +
    419
    421vec2 operator*( float a, const vec2& v);
    423vec2 operator+( float a, const vec2& v);
    425vec2 operator-( float a, const vec2& v);
    426
    428
    +
    433inline vec2 make_vec2(float x, float y ){
    434 return {x, y};
    435}
    +
    436
    +
    437inline float vec2::operator*(const vec2& a) const{
    438 return a.x*x+a.y*y;
    439}
    +
    440
    +
    441inline vec2 vec2::operator+(const vec2& a) const{
    442 return {a.x+x,a.y+y};
    443}
    +
    444
    +
    445inline vec2& vec2::operator+=(const vec2& a){
    446 this->x += a.x;
    447 this->y += a.y;
    448 return *this;
    449}
    +
    450
    +
    451inline vec2& vec2::operator-=(const vec2& a){
    452 this->x -= a.x;
    453 this->y -= a.y;
    454 return *this;
    455}
    +
    456
    +
    457inline vec2 vec2::operator+(const float a) const {
    458 return {a+x, a+y};
    459}
    +
    460
    +
    461inline vec2 operator+(const float a, const vec2& v){
    462 return {a+v.x, a+v.y};
    463}
    +
    464
    +
    465inline vec2 vec2::operator-(const vec2& a) const{
    466 return {x-a.x,y-a.y};
    467}
    +
    468
    +
    469inline vec2 vec2::operator-(const float a) const {
    470 return {x-a, y-a};
    471}
    +
    472
    +
    473inline vec2 operator-(const float a, const vec2& v) {
    474 return {a-v.x, a-v.y};
    475}
    +
    476
    +
    477inline vec2 vec2::operator*(const float a) const{
    478 return {x*a,y*a};
    479}
    +
    480
    +
    481inline vec2 operator*(const float a, const vec2& v) {
    482 return {a * v.x, a * v.y};
    483}
    +
    484
    +
    485inline vec2 vec2::operator/(const float a) const{
    486 return {x/a,y/a};
    487}
    +
    488
    +
    489inline bool vec2::operator==(const vec2& a) const{
    490 return x == a.x && y == a.y;
    491}
    +
    492
    +
    493inline bool vec2::operator!=(const vec2& a) const{
    494 return x != a.x || y != a.y;
    495}
    +
    496
    +
    497inline vec2 vec2::operator-() const{
    498 return {-x,-y};
    499}
    +
    500
    502
    +
    503struct vec3{
    504public:
    505
    @@ -487,6 +614,7 @@
    509 float y;
    511 float z;
    512
    +
    515 float mag = sqrt( x*x + y*y + z*z );
    516 x/=mag;
    @@ -494,15 +622,19 @@
    518 z/=mag;
    519 return {x,y,z};
    520 }
    +
    521
    523
    +
    526 [[nodiscard]] float magnitude() const{
    527 return sqrtf( x*x + y*y + z*z );
    528 }
    +
    529
    531
    532 vec3() : x(0), y(0), z(0) {}
    533
    +
    535 explicit vec3( const std::vector<float> &v ){
    536 if( v.size()!=3){
    537 throw(std::runtime_error("ERROR: vector for initialization of vec3 must have length 3."));
    @@ -511,6 +643,7 @@
    540 y=v[1];
    541 z=v[2];
    542 }
    +
    544 explicit vec3( const float v[3] ) : x(v[0]), y(v[1]), z(v[2]) {}
    545
    547 vec3( float v0, float v1, float v2 ) : x(v0), y(v1), z(v2) {}
    @@ -528,95 +661,135 @@
    570 bool operator!=(const vec3& a) const;
    572 vec3 operator-() const;
    573
    +
    575 friend std::ostream &operator<<(std::ostream &os, const helios::vec3 &vec) {
    576 return os << "helios::vec3<" << vec.x << ", " << vec.y << ", " << vec.z << ">";
    577 }
    +
    578
    579};
    +
    580
    582vec3 operator*( float a, const vec3& v);
    584vec3 operator+( float a, const vec3& v);
    586vec3 operator-( float a, const vec3& v);
    587
    +
    589inline vec3 make_vec3(float x, float y, float z ){
    590 return {x, y, z};
    591}
    +
    592
    +
    594inline vec3 make_vec3( float X[3] ){
    595 return {X[0],X[1],X[2]};
    596}
    +
    597
    +
    599inline vec3 cross(const vec3 &a, const vec3 &b ){
    600 return {a.y*b.z - b.y*a.z,b.x*a.z - a.x*b.z,a.x*b.y - b.x*a.y };
    601}
    +
    602
    +
    603inline float vec3::operator*(const vec3& a) const{
    604 return a.x*x+a.y*y+a.z*z;
    605}
    +
    606
    +
    607inline vec3 vec3::operator+(const vec3& a) const{
    608 return {a.x+x,a.y+y,a.z+z};
    609}
    +
    610
    +
    611inline vec3& vec3::operator+=(const vec3& a){
    612 this->x += a.x;
    613 this->y += a.y;
    614 this->z += a.z;
    615 return *this;
    616}
    +
    617
    +
    618inline vec3& vec3::operator-=(const vec3& a){
    619 this->x -= a.x;
    620 this->y -= a.y;
    621 this->z -= a.z;
    622 return *this;
    623}
    +
    624
    +
    625inline vec3 vec3::operator+(const float a) const{
    626 return { x+a, y+a, z+a };
    627}
    +
    628
    +
    629inline vec3 operator+(const float a, const vec3& v) {
    630 return {a+v.x, a+v.y, a+v.z};
    631}
    +
    632
    +
    633inline vec3 vec3::operator-(const vec3& a) const{
    634 return {x-a.x,y-a.y,z-a.z};
    635}
    +
    636
    +
    637inline vec3 vec3::operator-(const float a) const{
    638 return { x-a, y-a, z-a };
    639}
    +
    640
    +
    641inline vec3 operator-(const float a, const vec3& v) {
    642 return {a-v.x, a-v.y, a-v.z};
    643}
    +
    644
    +
    645inline vec3 vec3::operator*(const float a) const{
    646 return {x*a,y*a,z*a};
    647}
    +
    648
    +
    649inline vec3 operator*(const float a, const vec3& v) {
    650 return {a * v.x, a * v.y, a * v.z};
    651}
    +
    652
    +
    653inline vec3 vec3::operator/(const float a) const{
    654 return {x/a,y/a,z/a};
    655}
    +
    656
    +
    657inline bool vec3::operator==(const vec3& a) const{
    658 return x == a.x && y == a.y && z == a.z;
    659}
    +
    660
    +
    661inline bool vec3::operator!=(const vec3& a) const{
    662 return x != a.x || y != a.y || z != a.z;
    663}
    +
    664
    +
    665inline vec3 vec3::operator-() const{
    666 return {-x,-y,-z};
    667}
    +
    668
    670
    +
    673struct vec4{
    674public:
    675
    @@ -625,6 +798,7 @@
    681 float z;
    683 float w;
    684
    +
    687 float mag = sqrt( x*x + y*y + z*z + w*w );
    688 x/=mag;
    @@ -633,15 +807,19 @@
    691 w/=mag;
    692 return {x,y,z,w};
    693 }
    +
    694
    696
    +
    699 [[nodiscard]] float magnitude() const{
    700 return sqrt( x*x + y*y + z*z + w*w );
    701 }
    +
    702
    704
    705 vec4() : x(0), y(0), z(0), w(0) {}
    706
    +
    708 explicit vec4( const std::vector<float> &v ){
    709 if( v.size()!=4){
    710 throw(std::runtime_error("ERROR: vector for initialization of vec4 must have length 4."));
    @@ -651,6 +829,7 @@
    714 z=v[2];
    715 w=v[3];
    716 }
    +
    718 explicit vec4( const float v[4] ) : x(v[0]), y(v[1]), z(v[2]), w(v[3]) {}
    719
    721 vec4( float v0, float v1, float v2, float v3 ) : x(v0), y(v1), z(v2), w(v3) {}
    @@ -668,32 +847,44 @@
    744 bool operator!=(const vec4& a) const;
    746 vec4 operator-() const;
    747
    +
    749 friend std::ostream &operator<<(std::ostream &os, const helios::vec4 &vec) {
    750 return os << "helios::vec4<" << vec.x << ", " << vec.y << ", " << vec.z << ", " << vec.w << ">";
    751 }
    +
    752
    753};
    +
    754
    756vec4 operator*( float a, const vec4& v);
    758vec4 operator+( float a, const vec4& v);
    760vec4 operator-( float a, const vec4& v);
    761
    +
    763 inline vec4 make_vec4( float x, float y, float z, float w ){
    764 return {x, y, z, w};
    765}
    +
    766
    +
    768inline vec4 make_vec4( float X[4] ){
    769 return {X[0],X[1],X[2],X[3]};
    770}
    +
    771
    +
    772inline float vec4::operator*(const vec4& a) const{
    773 return a.x*x+a.y*y+a.z*z+a.w*w;
    774}
    +
    775
    +
    776inline vec4 vec4::operator+(const vec4& a) const{
    777 return {a.x+x,a.y+y,a.z+z,a.w+w};
    778}
    +
    779
    +
    780inline vec4& vec4::operator+=(const vec4& a){
    781 this->x += a.x;
    782 this->y += a.y;
    @@ -701,7 +892,9 @@
    784 this->w += a.w;
    785 return *this;
    786 }
    +
    787
    +
    788inline vec4& vec4::operator-=(const vec4& a){
    789 this->x -= a.x;
    790 this->y -= a.y;
    @@ -709,52 +902,76 @@
    792 this->w -= a.w;
    793 return *this;
    794 }
    +
    795
    +
    796inline vec4 vec4::operator+(const float a) const{
    797 return { x+a, y+a, z+a, w+a };
    798}
    +
    799
    +
    800inline vec4 operator+(const float a, const vec4& v) {
    801 return {a+v.x, a+v.y, a+v.z, a+v.w};
    802}
    +
    803
    +
    804inline vec4 vec4::operator-(const vec4& a) const{
    805 return {x-a.x,y-a.y,z-a.z,w-a.w};
    806}
    +
    807
    +
    808inline vec4 vec4::operator-(const float a) const{
    809 return { x-a, y-a, z-a, w-a };
    810}
    +
    811
    +
    812inline vec4 operator-(const float a, const vec4& v) {
    813 return {a-v.x, a-v.y, a-v.z, a-v.w};
    814}
    +
    815
    +
    816inline vec4 vec4::operator*(const float a) const{
    817 return {x*a,y*a,z*a,w*a};
    818}
    +
    819
    +
    820inline vec4 operator*(const float a, const vec4& v) {
    821 return {a * v.x, a * v.y, a * v.z, a * v.w};
    822}
    +
    823
    +
    824inline vec4 vec4::operator/(const float a) const{
    825 return {x/a,y/a,z/a,w/a};
    826}
    +
    827
    +
    828inline bool vec4::operator==(const vec4& a) const{
    829 return x == a.x && y == a.y && z == a.z && w == a.w;
    830}
    +
    831
    +
    832inline bool vec4::operator!=(const vec4& a) const{
    833 return x != a.x || y != a.y || z != a.z || w != a.w;
    834}
    +
    835
    +
    836inline vec4 vec4::operator-() const{
    837 return {-x,-y,-z, -w};
    838}
    +
    839
    841
    +
    844struct RGBcolor{
    845public:
    846
    @@ -768,18 +985,23 @@
    858 RGBcolor() : r(0), g(0), b(0) {}
    859
    861
    +
    867 RGBcolor( float r, float g, float b ){
    868 this->r=clamp(r);
    869 this->g=clamp(g);
    870 this->b=clamp(b);
    871 }
    +
    873
    +
    877 explicit RGBcolor( const float C[3] ){
    878 r=clamp(C[0]);
    879 g=clamp(C[1]);
    880 b=clamp(C[2]);
    881 }
    +
    883
    +
    887 explicit RGBcolor( const std::vector<float> &C ){
    888 if( C.size()!=3 ){
    889 throw(std::runtime_error("ERROR: cannot initialize RGBcolor using supplied vector - size should be 3."));
    @@ -788,14 +1010,18 @@
    892 g=clamp(C[1]);
    893 b=clamp(C[2]);
    894 }
    +
    896
    +
    900 explicit RGBcolor(const vec3 &C ){
    901 r=clamp(C.x);
    902 g=clamp(C.y);
    903 b=clamp(C.z);
    904 }
    +
    905
    907
    +
    910 void scale( float scale_factor ){
    911 if(scale_factor < 0 ){
    912 throw(std::runtime_error("ERROR (RGBcolor::scale): cannot scale RGBcolor by negative factor."));
    @@ -804,10 +1030,13 @@
    915 g*=scale_factor;
    916 b*=scale_factor;
    917 }
    +
    918
    +
    920 friend std::ostream &operator<<(std::ostream &os, const helios::RGBcolor &c) {
    921 return os << "helios::RGBcolor<" << c.r << ", " << c.g << ", " << c.b << ">";
    922 }
    +
    923
    925 bool operator==( const RGBcolor &c ) const;
    927 bool operator!=( const RGBcolor &c ) const;
    @@ -825,22 +1054,29 @@
    943 }
    944
    945};
    +
    946
    948
    +
    954inline RGBcolor make_RGBcolor( float r, float g, float b ){
    955 return {r,g,b};
    956}
    +
    957
    959
    964RGBcolor blend(const RGBcolor &color0_RGB, const RGBcolor &color1_RGB, float weight_RGB );
    965
    +
    966inline bool RGBcolor::operator==( const RGBcolor &c ) const{
    967 return c.r==r && c.g==g && c.b==b;
    968}
    +
    969
    +
    970inline bool RGBcolor::operator!=( const RGBcolor &c ) const{
    971 return c.r!=r || c.g!=g || c.b!=b;
    972}
    +
    973
    975namespace RGB{
    976
    @@ -868,6 +1104,7 @@
    1018}
    1019
    1021
    +
    1025public:
    1026
    @@ -883,20 +1120,25 @@
    1041 RGBAcolor() : r(0), g(0), b(0), a(1) {}
    1042
    1044
    +
    1051 RGBAcolor( float r, float g, float b, float a ){
    1052 this->r=clamp(r);
    1053 this->g=clamp(g);
    1054 this->b=clamp(b);
    1055 this->a=clamp(a);
    1056 }
    +
    1058
    +
    1062 explicit RGBAcolor( const float C[4] ){
    1063 r=clamp(C[0]);
    1064 g=clamp(C[1]);
    1065 b=clamp(C[2]);
    1066 a=clamp(C[3]);
    1067 }
    +
    1069
    +
    1073 explicit RGBAcolor( const std::vector<float> &C ){
    1074 if( C.size()!=4 ){
    1075 throw(std::runtime_error("ERROR: cannot initialize RGBAcolor using supplied vector - size should be 4."));
    @@ -906,8 +1148,10 @@
    1079 b=clamp(C[2]);
    1080 a=clamp(C[3]);
    1081 }
    +
    1082
    1084
    +
    1087 void scale( float scale_factor ){
    1088 if(scale_factor < 0 ){
    1089 throw(std::runtime_error("ERROR (RGBAcolor::scale): cannot scale RGBAcolor by negative factor."));
    @@ -917,10 +1161,13 @@
    1093 b*=scale_factor;
    1094 a*=scale_factor;
    1095 }
    +
    1096
    +
    1098 friend std::ostream &operator<<(std::ostream &os, const helios::RGBAcolor &c) {
    1099 return os << "helios::RGBAcolor<" << c.r << ", " << c.g << ", " << c.b << ", " << c.a << ">";
    1100 }
    +
    1101
    1103 bool operator==( const helios::RGBAcolor &c ) const;
    1105 bool operator!=( const helios::RGBAcolor &c ) const;
    @@ -938,29 +1185,39 @@
    1121 }
    1122
    1123};
    +
    1124
    1126
    +
    1133inline RGBAcolor make_RGBAcolor( float r, float g, float b, float a ){
    1134 return {r,g,b,a};
    1135}
    +
    1136
    1138
    +
    1143inline RGBAcolor make_RGBAcolor( RGBcolor color, float a ){
    1144 return {color.r,color.g,color.b,a};
    1145}
    +
    1146
    1148
    1153RGBAcolor blend(const helios::RGBAcolor &color0_RGBA, const helios::RGBAcolor &color1_RGBA, float weight_RGBA );
    1154
    +
    1155inline bool RGBAcolor::operator==( const RGBAcolor &c ) const{
    1156 return c.r==r && c.g==g && c.b==b && c.a==a;
    1157}
    +
    1158
    +
    1159inline bool RGBAcolor::operator!=( const RGBAcolor &c ) const{
    1160 return c.r!=r || c.g!=g || c.b!=b || c.a!=a;
    1161}
    +
    1162
    1164
    +
    1168struct Date{
    1169public:
    1170
    @@ -968,18 +1225,21 @@
    1176 int year;
    1177
    +
    1180 day = 1;
    1181 month = 1;
    1182 year = 2000;
    1183 }
    +
    1184
    1186
    +
    1191 Date(int day, int month, int year ){
    1192
    -
    1193 if(day < 1 || day > 31 ){
    +
    1193 if(day < 1 || day > 31 ){
    1194 throw(std::runtime_error("ERROR (Date constructor): Day of month is out of range (day of " + std::to_string(day) + " was given)."));
    -
    1195 }else if(month < 1 || month > 12){
    +
    1195 }else if(month < 1 || month > 12){
    1196 throw(std::runtime_error("ERROR (Date constructor): Month of year is out of range (month of " + std::to_string(month) + " was given)."));
    1197 }else if( year<1000 ){
    1198 throw(std::runtime_error( "ERROR (Date constructor): Year should be specified in YYYY format."));
    @@ -990,6 +1250,7 @@
    1203 this->year = year;
    1204
    1205 }
    +
    1206
    1208
    1211 [[nodiscard]] int JulianDay() const;
    @@ -1002,13 +1263,17 @@
    1223 bool operator==( const helios::Date &c ) const;
    1225 bool operator!=( const helios::Date &c ) const;
    1226
    +
    1228 friend std::ostream &operator<<(std::ostream &os, helios::Date const &d) {
    1229 return os << d.year << "-" << std::setfill('0') << std::setw(2) << d.month << "-" << std::setfill('0') << std::setw(2) << d.day;
    1230 }
    +
    1231
    1232};
    +
    1233
    1235
    +
    1241inline Date make_Date( int day, int month, int year ){
    1242 if( day<1 || day>31 ){
    1243 throw(std::runtime_error("ERROR (make_Date): Day of month is out of range (day of " + std::to_string(day) + " was given)."));
    @@ -1021,16 +1286,22 @@
    1250 return {day,month,year};
    1251
    1252}
    +
    1253
    +
    1254inline bool Date::operator==( const Date &c ) const{
    1255 return c.day==day && c.month==month && c.year==year;
    1256}
    +
    1257
    +
    1258inline bool Date::operator!=( const Date &c ) const{
    1259 return c.day!=day || c.month!=month || c.year!=year;
    1260}
    +
    1261
    1263
    +
    1268inline Date Julian2Calendar( int JulianDay, int year ){
    1269
    1270 int day, month;
    @@ -1067,8 +1338,10 @@
    1301 return make_Date(day,month,year);
    1302
    1303}
    +
    1304
    1306
    +
    1310inline int Calendar2Julian( Date date ){
    1311
    1312 int skips_leap[] = {0, 31, 60, 91, 121, 152, 182, 214, 244, 274, 305, 335};
    @@ -1087,8 +1360,10 @@
    1325 return JD;
    1326
    1327}
    +
    1328
    1330
    +
    1335inline Date make_Date( int JulianDay, int year ){
    1336 if( JulianDay<1 || JulianDay>366 ){
    1337 throw(std::runtime_error("ERROR (make_Date): Julian day is out of range (Julian day of " + std::to_string(JulianDay) + " was given)."));
    @@ -1099,27 +1374,32 @@
    1342 return Julian2Calendar(JulianDay,year);
    1343
    1344}
    +
    1345
    1346
    1348
    +
    1352struct Time{
    1353
    1359 int hour;
    1360
    +
    1363 second = 0;
    1364 minute = 0;
    1365 hour = 0;
    1366 }
    +
    1367
    1369
    +
    1373 Time( int hour, int minute ){
    1374
    -
    1375 if( minute<0 || minute>59 ){
    +
    1375 if( minute<0 || minute>59 ){
    1376 throw(std::runtime_error("ERROR (Time constructor): Minute out of range (0-59)."));
    -
    1377 }else if( hour<0 || hour>23 ){
    +
    1377 }else if( hour<0 || hour>23 ){
    1378 throw(std::runtime_error("ERROR (Time constructor): Hour out of range (0-23)."));
    1379 }
    1380
    @@ -1128,15 +1408,17 @@
    1383 this->hour = hour;
    1384
    1385 }
    +
    1386
    1388
    +
    1393 Time( int hour, int minute, int second ){
    1394
    -
    1395 if( second<0 || second>59 ){
    +
    1395 if( second<0 || second>59 ){
    1396 throw(std::runtime_error("ERROR (Time constructor): Second out of range (0-59)."));
    -
    1397 }else if( minute<0 || minute>59 ){
    +
    1397 }else if( minute<0 || minute>59 ){
    1398 throw(std::runtime_error("ERROR (Time constructor): Minute out of range (0-59)."));
    -
    1399 }else if( hour<0 || hour>23 ){
    +
    1399 }else if( hour<0 || hour>23 ){
    1400 throw(std::runtime_error("ERROR (Time constructor): Hour out of range (0-23)."));
    1401 }
    1402
    @@ -1145,17 +1427,22 @@
    1405 this->hour = hour;
    1406
    1407 }
    +
    1408
    1410 bool operator==( const helios::Time &c ) const;
    1412 bool operator!=( const helios::Time &c ) const;
    1413
    +
    1415 friend std::ostream &operator<<(std::ostream &os, helios::Time const &t) {
    1416 return os << t.hour << ":" << std::setfill('0') << std::setw(2) << t.minute << ":" << std::setfill('0') << std::setw(2) << t.second;
    1417 }
    +
    1418
    1419};
    +
    1420
    1422
    +
    1427inline Time make_Time( int hour, int minute ){
    1428 if( minute<0 || minute>59 ){
    1429 throw(std::runtime_error("ERROR (make_Time): Minute of " + std::to_string(minute) + " out of range (0-59)."));
    @@ -1166,8 +1453,10 @@
    1434 return {hour,minute,0};
    1435
    1436}
    +
    1437
    1439
    +
    1445inline Time make_Time( int hour, int minute, int second ){
    1446 if( second<0 || second>59 ){
    1447 throw(std::runtime_error("ERROR (make_Time): Second of " + std::to_string(second) + " out of range (0-59)."));
    @@ -1180,29 +1469,38 @@
    1454 return {hour,minute,second};
    1455
    1456}
    +
    1457
    +
    1458inline bool Time::operator==( const Time &c ) const{
    1459 return c.hour==hour && c.minute==minute && c.second==second;
    1460}
    +
    1461
    +
    1462inline bool Time::operator!=( const Time &c ) const{
    1463 return c.hour!=hour || c.minute!=minute || c.second!=second;
    1464}
    +
    1465
    1467
    +
    1470 struct Location{
    1471
    1478
    +
    1481 latitude_deg = 38.55f;
    1482 longitude_deg = 121.76f;
    1483 UTC_offset = 8;
    1484 }
    +
    1485
    1487
    +
    1492
    1493 this->latitude_deg = latitude_deg;
    @@ -1210,30 +1508,41 @@
    1495 this->UTC_offset = UTC_offset;
    1496
    1497 }
    +
    1498
    1500 bool operator==( const helios::Location &c ) const;
    1502 bool operator!=( const helios::Location &c ) const;
    1503
    +
    1505 friend std::ostream &operator<<(std::ostream &os, helios::Location const &t) {
    1506 return os << "<" << t.latitude_deg << "," << t.longitude_deg << "," << t.UTC_offset << ">";
    1507 }
    +
    1508
    1509 };
    +
    1510
    1512
    +
    1518 inline Location make_Location( float latitude_deg, float longitude_deg, float UTC_offset ){
    1519 return {latitude_deg,longitude_deg,UTC_offset};
    1520 }
    +
    1521
    +
    1522 inline bool Location::operator==( const Location &c ) const{
    1524 }
    +
    1525
    +
    1526 inline bool Location::operator!=( const Location &c ) const{
    1528 }
    +
    1529
    1531
    +
    1535private:
    1536
    @@ -1254,15 +1563,18 @@
    1555 float azimuth;
    1556
    1558
    +
    1559 SphericalCoord() : elevation_private(0.5f*float(M_PI)), zenith_private(0.f), elevation(elevation_private), zenith(zenith_private) {
    1560 radius=1;
    1561 azimuth=0;
    1562 }
    +
    1564
    1569 SphericalCoord(float radius, float elevation_radians, float azimuth_radians ) : elevation_private(elevation_radians), zenith_private(0.5f * float(M_PI) - elevation_radians), radius(radius), elevation(elevation_private), zenith(zenith_private), azimuth(azimuth_radians) {}
    1570
    1572 SphericalCoord( const SphericalCoord &c ) : elevation_private(c.elevation_private), zenith_private(c.zenith_private), radius(c.radius), elevation(c.elevation_private), zenith(c.zenith_private), azimuth(c.azimuth) {}
    1573
    +
    1576 if( this != &c ){
    1577 elevation_private = c.elevation_private;
    @@ -1272,232 +1584,245 @@
    1581 }
    1582 return *this;
    1583 }
    +
    1584
    1586 bool operator==( const helios::SphericalCoord &c ) const;
    1588 bool operator!=( const helios::SphericalCoord &c ) const;
    1589
    +
    1591 friend std::ostream &operator<<(std::ostream &os, helios::SphericalCoord const &coord) {
    1592 return os << "helios::SphericalCoord<" << coord.radius << ", " << coord.elevation << ", " << coord.azimuth << ">";
    1593 }
    +
    1594
    1595};
    +
    1596
    1598
    +
    1602inline SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians ){
    1603 return {1, elevation_radians, azimuth_radians};
    1604}
    +
    1605
    1607
    +
    1612 inline SphericalCoord make_SphericalCoord(float radius, float elevation_radians, float azimuth_radians ){
    1613 return {radius, elevation_radians, azimuth_radians};
    1614}
    +
    1615
    +
    1616inline bool SphericalCoord::operator==( const SphericalCoord &c ) const{
    1617 return c.radius==radius && c.zenith==zenith && c.elevation==elevation && c.azimuth==azimuth;
    1618}
    +
    1619
    +
    1620inline bool SphericalCoord::operator!=( const SphericalCoord &c ) const {
    1621 return c.radius!=radius || c.zenith!=zenith || c.elevation!=elevation || c.azimuth!=azimuth;
    1622}
    +
    1623
    1624
    1625}
    1626
    1627#endif
    -
    int JulianDay(int day, int month, int year)
    Convert calendar day (day,month,year) to Julian day.
    Definition: global.cpp:1350
    -
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    -
    Time make_Time(int hour, int minute)
    Make a Time vector.
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    Location make_Location(float latitude_deg, float longitude_deg, float UTC_offset)
    Make a Location vector.
    -
    RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
    Make an RGBAcolor vector.
    -
    Date make_Date(int day, int month, int year)
    Make a Date vector.
    -
    Date Julian2Calendar(int JulianDay, int year)
    Convert a Julian day to a calendar Date vector.
    -
    int Calendar2Julian(Date date)
    Convert a calendar Date vector to Julian day.
    -
    RGBcolor make_RGBcolor(float r, float g, float b)
    Make an RGBcolor vector.
    -
    vec2 operator*(float a, const vec2 &v)
    Multiply each element by scalar (scalar is multiplied on left: a*vec2)
    -
    vec2 operator-(float a, const vec2 &v)
    Subtract a scalar from each element (scalar is subtracted on left: a-vec2)
    -
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    -
    vec2 operator+(float a, const vec2 &v)
    Add a scalar to each element (scalar is added on left: a+vec2)
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    -
    vec4 make_vec4(float x, float y, float z, float w)
    Make a vec4 from three floats.
    -
    int4 make_int4(int x, int y, int z, int w)
    Make an int4 vector from three ints.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    - -
    bool operator==(const helios::Date &c) const
    check for equality of two dates
    -
    Date()
    Default constructor.
    -
    friend std::ostream & operator<<(std::ostream &os, helios::Date const &d)
    Write Date to output stream.
    -
    int month
    Month of year.
    -
    void incrementDay()
    Increment Date vector by one day.
    Definition: global.cpp:202
    -
    int day
    Day of month.
    -
    bool operator!=(const helios::Date &c) const
    check for inequality of two Dates
    -
    Date(int day, int month, int year)
    Day/Month/Year constructor.
    -
    int JulianDay() const
    Convert to Julian day.
    Definition: global.cpp:186
    -
    bool isLeapYear() const
    Check whether it is a leap year.
    Definition: global.cpp:215
    -
    int year
    Year in YYYY format.
    -
    Location vector.
    -
    Location()
    Default constructor.
    -
    float longitude_deg
    Longitude in degrees (+western hemisphere, -eastern hemisphere)
    -
    bool operator==(const helios::Location &c) const
    check for equality of two locations
    -
    float latitude_deg
    Latitude in degrees (+northern hemisphere, -southern hemisphere)
    -
    friend std::ostream & operator<<(std::ostream &os, helios::Location const &t)
    Write Location to output stream.
    -
    Location(float latitude_deg, float longitude_deg, float UTC_offset)
    latitude/longitude/UTC constructor
    -
    bool operator!=(const helios::Location &c) const
    check for inequality of two locations
    -
    float UTC_offset
    Offset from UTC in hours (+moving West)
    -
    R-G-B-A color vector.
    -
    float r
    Red color component.
    -
    float a
    Alpha (transparency) component.
    -
    RGBAcolor()
    Default constructor - initializes color to black.
    -
    RGBAcolor(float r, float g, float b, float a)
    Constructor given three floats denoting R-G-B components.
    -
    void scale(float scale_factor)
    Scale RGBAcolor by some factor.
    -
    bool operator!=(const helios::RGBAcolor &c) const
    check for inequality of two RGBA colors
    -
    RGBAcolor(const float C[4])
    Constructor given an array of three floats denoting R-G-B-A components.
    -
    friend std::ostream & operator<<(std::ostream &os, const helios::RGBAcolor &c)
    write RGBAcolor to output stream
    -
    float b
    Blue color component.
    -
    bool operator==(const helios::RGBAcolor &c) const
    check for equality of two RGBA colors
    -
    float g
    Green color component.
    -
    RGBAcolor(const std::vector< float > &C)
    Constructor given a vector of three floats denoting R-G-B-A components.
    -
    R-G-B color vector.
    -
    RGBcolor()
    Default constructor - initializes color to black.
    -
    float b
    Blue color component.
    -
    bool operator==(const RGBcolor &c) const
    check for equality of two RGB colors
    -
    float r
    Red color component.
    -
    RGBcolor(float r, float g, float b)
    Constructor given three floats denoting R-G-B components.
    -
    friend std::ostream & operator<<(std::ostream &os, const helios::RGBcolor &c)
    write RGBcolor to output stream
    -
    void scale(float scale_factor)
    Scale RGBcolor by some factor.
    -
    RGBcolor(const std::vector< float > &C)
    Constructor given a vector of three floats denoting R-G-B components.
    -
    bool operator!=(const RGBcolor &c) const
    check for inequality of two RGB colors
    -
    RGBcolor(const float C[3])
    Constructor given an array of three floats denoting R-G-B components.
    -
    float g
    Green color component.
    -
    RGBcolor(const vec3 &C)
    Constructor given a vec3 denoting R-G-B components.
    -
    Vector of spherical coordinates (elevation,azimuth)
    - -
    bool operator!=(const helios::SphericalCoord &c) const
    check for inequality of two spherical coordinates
    -
    const float & zenith
    Zenithal angle (radians)
    -
    SphericalCoord()
    Default constructor.
    -
    SphericalCoord(const SphericalCoord &c)
    Copy constructor.
    -
    const float & elevation
    Elevation angle (radians)
    -
    friend std::ostream & operator<<(std::ostream &os, helios::SphericalCoord const &coord)
    Write SphericalCoord to output stream.
    -
    SphericalCoord(float radius, float elevation_radians, float azimuth_radians)
    Initialize SphericalCoord by specifying radius, elevation, and azimuth.
    -
    float azimuth
    Azimuthal angle (radians)
    -
    bool operator==(const helios::SphericalCoord &c) const
    check for equality of two spherical coordinates
    -
    SphericalCoord & operator=(const SphericalCoord &c)
    Assignment operator.
    - -
    Time(int hour, int minute)
    second/minute/hour constructor
    -
    friend std::ostream & operator<<(std::ostream &os, helios::Time const &t)
    Write Time to output stream.
    -
    Time()
    Default constructor.
    -
    int second
    Second of minute.
    -
    int hour
    Hour of day.
    -
    int minute
    Minute of hour.
    -
    bool operator==(const helios::Time &c) const
    check for equality of two times
    -
    Time(int hour, int minute, int second)
    minute/hour constructor
    -
    bool operator!=(const helios::Time &c) const
    check for inequality of two times
    -
    Vector of two elements of type 'int'.
    -
    int2 operator+(const int2 &a) const
    Add two int2 vectors.
    -
    int y
    Second element in vector.
    -
    int2 operator-() const
    Multiply each element by -1.
    -
    int2 & operator-=(const int2 &a)
    Deccrement int2 vector.
    -
    bool operator==(const int2 &a) const
    Equality for all elements.
    -
    int2(const std::vector< int > &v)
    Construct int2 from a vector of ints.
    -
    int2 & operator+=(const int2 &a)
    Increment int2 vector.
    -
    bool operator!=(const int2 &a) const
    Inequality for all elements.
    -
    int2(int v0, int v1)
    Construct int2 from two ints.
    -
    friend std::ostream & operator<<(std::ostream &os, const helios::int2 &vec)
    Write int2 to output stream.
    -
    int x
    First element in vector.
    -
    int2()
    Default constructor.
    -
    int2(const int v[2])
    Construct int2 from an array of ints.
    -
    Vector of three elements of type 'int'.
    -
    int3()
    Default constructor.
    -
    int x
    First element in vector.
    -
    int3(int v0, int v1, int v2)
    Construct int3 from three ints.
    -
    int3 & operator-=(const int3 &a)
    Decrement int3 vector.
    -
    int3(const int v[3])
    Construct int3 from an array of ints.
    -
    int3 & operator+=(const int3 &a)
    Increment int3 vector.
    -
    friend std::ostream & operator<<(std::ostream &os, const helios::int3 &vec)
    Write int3 to output stream.
    -
    bool operator!=(const int3 &a) const
    Inequality for all elements.
    -
    int3(const std::vector< int > &v)
    Construct int3 from a vector of ints.
    -
    int3 operator+(const int3 &a) const
    Add two int3 vectors.
    -
    bool operator==(const int3 &a) const
    Equality for all elements.
    -
    int z
    Third element in vector.
    -
    int3 operator-() const
    Multiply each element by -1.
    -
    int y
    Second element in vector.
    -
    Vector of four elements of type 'int'.
    -
    int4(const std::vector< int > &v)
    Construct int3 from a vector of ints.
    -
    int x
    First element in vector.
    -
    int4 & operator-=(const int4 &a)
    Decrement int4 vector.
    -
    int4()
    Default constructor.
    -
    int4 operator-() const
    Multiply each element by -1.
    -
    int4(int v0, int v1, int v2, int v3)
    Construct int4 from four ints.
    -
    int z
    Third element in vector.
    -
    int4 operator+(const int4 &a) const
    Add two int4 vectors.
    -
    bool operator==(const int4 &a) const
    Equality for all elements.
    -
    int w
    Fourth element in vector.
    -
    int4 & operator+=(const int4 &a)
    Increment int4 vector.
    -
    friend std::ostream & operator<<(std::ostream &os, const helios::int4 &vec)
    Write int4 to output stream.
    -
    int4(const int v[3])
    Construct int4 from an array of ints.
    -
    int y
    Second element in vector.
    -
    bool operator!=(const int4 &a) const
    Inequality for all elements.
    -
    Vector of two elements of type 'float'.
    -
    vec2 & operator+=(const vec2 &a)
    Increment vec2 vector.
    -
    vec2 normalize()
    Normalize vector components such that the magnitude is unity.
    -
    bool operator!=(const vec2 &a) const
    check for inequality of two vec2 vectors
    -
    float magnitude() const
    Compute the vector magnitude.
    -
    vec2(const std::vector< float > &v)
    Initialize vec2 using a vector of floats.
    -
    vec2 & operator-=(const vec2 &a)
    Decrement vec2 vector.
    -
    friend std::ostream & operator<<(std::ostream &os, const helios::vec2 &vec)
    Write vec2 to output stream.
    -
    vec2(const float v[2])
    Initialize vec2 using an array of floats.
    -
    float x
    First element in vector.
    -
    vec2 operator/(float a) const
    Divide each element by scalar (scalar is divided on right: vec2/a)
    -
    vec2()
    Default constructor.
    -
    bool operator==(const vec2 &a) const
    check for equality of two vec2 vectors
    -
    vec2 operator+(const vec2 &a) const
    Sum of two vec2 vectors.
    -
    float y
    Second element in vector.
    -
    vec2 operator-() const
    Multiply each element by -1.
    -
    vec2(float v0, float v1)
    Initialize vec2 using two floats.
    -
    float operator*(const vec2 &a) const
    Dot (scalar) product of two vec2 vectors.
    -
    Vector of three elements of type 'float'.
    -
    bool operator==(const vec3 &a) const
    check for equality of two vec3 vectors
    -
    vec3 operator/(float a) const
    Divide each element by scalar (scalar is divided on right: vec3/a)
    -
    vec3 operator+(const vec3 &a) const
    Sum of two vec3 vectors.
    -
    vec3 & operator-=(const vec3 &a)
    Decrement vec3 vector.
    -
    vec3 operator-() const
    Multiply vector by -1.
    -
    vec3(const float v[3])
    Initialize vec3 using an array of floats.
    -
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    -
    float x
    First element in vector.
    -
    float z
    Third element in vector.
    -
    friend std::ostream & operator<<(std::ostream &os, const helios::vec3 &vec)
    Write vec3 to output stream.
    -
    vec3()
    Default constructor.
    -
    vec3(float v0, float v1, float v2)
    Initialize vec3 using three floats.
    -
    vec3 & operator+=(const vec3 &a)
    Increment vec3 vector.
    -
    float y
    Second element in vector.
    -
    vec3(const std::vector< float > &v)
    Initialize vec3 using a vector of floats.
    -
    bool operator!=(const vec3 &a) const
    check for inequality of two vec3 vectors
    -
    float magnitude() const
    Compute the vector magnitude.
    -
    float operator*(const vec3 &a) const
    Dot (scalar) product of two vec3 vectors.
    -
    Vector of four elements of type 'float'.
    -
    vec4 operator+(const vec4 &a) const
    Sum of two vec4 vectors.
    -
    vec4(const std::vector< float > &v)
    Initialize vec4 using a vector of floats.
    -
    friend std::ostream & operator<<(std::ostream &os, const helios::vec4 &vec)
    Write vec4 to output stream.
    -
    float y
    Second element in vector.
    -
    float magnitude() const
    Compute the vector magnitude.
    -
    vec4 & operator-=(const vec4 &a)
    Decrement vec4 vector.
    -
    float w
    Fourth element in vector.
    -
    bool operator!=(const vec4 &a) const
    check for equality of two vec4 vectors
    -
    vec4 operator-() const
    Multiply each element by -1.
    -
    float z
    Third element in vector.
    -
    vec4 normalize()
    Normalize vector components such that the magnitude is unity.
    -
    vec4 & operator+=(const vec4 &a)
    Increment vec4 vector.
    -
    vec4()
    Default constructor.
    -
    float x
    First element in vector.
    -
    vec4 operator/(float a) const
    Divide each element by scalar (scalar is divided on right: vec4/a)
    -
    bool operator==(const vec4 &a) const
    check for equality of two vec4 vectors
    -
    vec4(const float v[4])
    Initialize vec3 using an array of floats.
    -
    float operator*(const vec4 &a) const
    Dot (scalar) product of two vec4 vectors.
    -
    vec4(float v0, float v1, float v2, float v3)
    Initialize vec4 using four floats.
    +
    int JulianDay(int day, int month, int year)
    Convert calendar day (day,month,year) to Julian day.
    Definition global.cpp:1350
    +
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    +
    Time make_Time(int hour, int minute)
    Make a Time vector.
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    Location make_Location(float latitude_deg, float longitude_deg, float UTC_offset)
    Make a Location vector.
    +
    RGBAcolor make_RGBAcolor(float r, float g, float b, float a)
    Make an RGBAcolor vector.
    +
    Date make_Date(int day, int month, int year)
    Make a Date vector.
    +
    Date Julian2Calendar(int JulianDay, int year)
    Convert a Julian day to a calendar Date vector.
    +
    int Calendar2Julian(Date date)
    Convert a calendar Date vector to Julian day.
    +
    RGBcolor make_RGBcolor(float r, float g, float b)
    Make an RGBcolor vector.
    +
    vec2 operator*(float a, const vec2 &v)
    Multiply each element by scalar (scalar is multiplied on left: a*vec2)
    +
    vec2 operator-(float a, const vec2 &v)
    Subtract a scalar from each element (scalar is subtracted on left: a-vec2)
    +
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    +
    vec2 operator+(float a, const vec2 &v)
    Add a scalar to each element (scalar is added on left: a+vec2)
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    +
    vec4 make_vec4(float x, float y, float z, float w)
    Make a vec4 from three floats.
    +
    int4 make_int4(int x, int y, int z, int w)
    Make an int4 vector from three ints.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    + +
    bool operator==(const helios::Date &c) const
    check for equality of two dates
    +
    Date()
    Default constructor.
    +
    friend std::ostream & operator<<(std::ostream &os, helios::Date const &d)
    Write Date to output stream.
    +
    int month
    Month of year.
    +
    void incrementDay()
    Increment Date vector by one day.
    Definition global.cpp:202
    +
    int day
    Day of month.
    +
    bool operator!=(const helios::Date &c) const
    check for inequality of two Dates
    +
    Date(int day, int month, int year)
    Day/Month/Year constructor.
    +
    int JulianDay() const
    Convert to Julian day.
    Definition global.cpp:186
    +
    bool isLeapYear() const
    Check whether it is a leap year.
    Definition global.cpp:215
    +
    int year
    Year in YYYY format.
    + +
    Location()
    Default constructor.
    +
    float longitude_deg
    Longitude in degrees (+western hemisphere, -eastern hemisphere)
    +
    bool operator==(const helios::Location &c) const
    check for equality of two locations
    +
    float latitude_deg
    Latitude in degrees (+northern hemisphere, -southern hemisphere)
    +
    friend std::ostream & operator<<(std::ostream &os, helios::Location const &t)
    Write Location to output stream.
    +
    Location(float latitude_deg, float longitude_deg, float UTC_offset)
    latitude/longitude/UTC constructor
    +
    bool operator!=(const helios::Location &c) const
    check for inequality of two locations
    +
    float UTC_offset
    Offset from UTC in hours (+moving West)
    +
    R-G-B-A color vector.
    +
    float r
    Red color component.
    +
    float a
    Alpha (transparency) component.
    +
    RGBAcolor()
    Default constructor - initializes color to black.
    +
    RGBAcolor(float r, float g, float b, float a)
    Constructor given three floats denoting R-G-B components.
    +
    void scale(float scale_factor)
    Scale RGBAcolor by some factor.
    +
    bool operator!=(const helios::RGBAcolor &c) const
    check for inequality of two RGBA colors
    +
    RGBAcolor(const float C[4])
    Constructor given an array of three floats denoting R-G-B-A components.
    +
    friend std::ostream & operator<<(std::ostream &os, const helios::RGBAcolor &c)
    write RGBAcolor to output stream
    +
    float b
    Blue color component.
    +
    bool operator==(const helios::RGBAcolor &c) const
    check for equality of two RGBA colors
    +
    float g
    Green color component.
    +
    RGBAcolor(const std::vector< float > &C)
    Constructor given a vector of three floats denoting R-G-B-A components.
    +
    R-G-B color vector.
    +
    RGBcolor()
    Default constructor - initializes color to black.
    +
    float b
    Blue color component.
    +
    bool operator==(const RGBcolor &c) const
    check for equality of two RGB colors
    +
    float r
    Red color component.
    +
    RGBcolor(float r, float g, float b)
    Constructor given three floats denoting R-G-B components.
    +
    friend std::ostream & operator<<(std::ostream &os, const helios::RGBcolor &c)
    write RGBcolor to output stream
    +
    void scale(float scale_factor)
    Scale RGBcolor by some factor.
    +
    RGBcolor(const std::vector< float > &C)
    Constructor given a vector of three floats denoting R-G-B components.
    +
    bool operator!=(const RGBcolor &c) const
    check for inequality of two RGB colors
    +
    RGBcolor(const float C[3])
    Constructor given an array of three floats denoting R-G-B components.
    +
    float g
    Green color component.
    +
    RGBcolor(const vec3 &C)
    Constructor given a vec3 denoting R-G-B components.
    +
    Vector of spherical coordinates (elevation,azimuth)
    + +
    bool operator!=(const helios::SphericalCoord &c) const
    check for inequality of two spherical coordinates
    +
    const float & zenith
    Zenithal angle (radians)
    +
    SphericalCoord()
    Default constructor.
    +
    SphericalCoord(const SphericalCoord &c)
    Copy constructor.
    +
    const float & elevation
    Elevation angle (radians)
    +
    friend std::ostream & operator<<(std::ostream &os, helios::SphericalCoord const &coord)
    Write SphericalCoord to output stream.
    +
    SphericalCoord(float radius, float elevation_radians, float azimuth_radians)
    Initialize SphericalCoord by specifying radius, elevation, and azimuth.
    +
    float azimuth
    Azimuthal angle (radians)
    +
    bool operator==(const helios::SphericalCoord &c) const
    check for equality of two spherical coordinates
    +
    SphericalCoord & operator=(const SphericalCoord &c)
    Assignment operator.
    + +
    Time(int hour, int minute)
    second/minute/hour constructor
    +
    friend std::ostream & operator<<(std::ostream &os, helios::Time const &t)
    Write Time to output stream.
    +
    Time()
    Default constructor.
    +
    int second
    Second of minute.
    +
    int hour
    Hour of day.
    +
    int minute
    Minute of hour.
    +
    bool operator==(const helios::Time &c) const
    check for equality of two times
    +
    Time(int hour, int minute, int second)
    minute/hour constructor
    +
    bool operator!=(const helios::Time &c) const
    check for inequality of two times
    +
    Vector of two elements of type 'int'.
    +
    int2 operator+(const int2 &a) const
    Add two int2 vectors.
    +
    int y
    Second element in vector.
    +
    int2 operator-() const
    Multiply each element by -1.
    +
    int2 & operator-=(const int2 &a)
    Deccrement int2 vector.
    +
    bool operator==(const int2 &a) const
    Equality for all elements.
    +
    int2(const std::vector< int > &v)
    Construct int2 from a vector of ints.
    +
    int2 & operator+=(const int2 &a)
    Increment int2 vector.
    +
    bool operator!=(const int2 &a) const
    Inequality for all elements.
    +
    int2(int v0, int v1)
    Construct int2 from two ints.
    +
    friend std::ostream & operator<<(std::ostream &os, const helios::int2 &vec)
    Write int2 to output stream.
    +
    int x
    First element in vector.
    +
    int2()
    Default constructor.
    +
    int2(const int v[2])
    Construct int2 from an array of ints.
    +
    Vector of three elements of type 'int'.
    +
    int3()
    Default constructor.
    +
    int x
    First element in vector.
    +
    int3(int v0, int v1, int v2)
    Construct int3 from three ints.
    +
    int3 & operator-=(const int3 &a)
    Decrement int3 vector.
    +
    int3(const int v[3])
    Construct int3 from an array of ints.
    +
    int3 & operator+=(const int3 &a)
    Increment int3 vector.
    +
    friend std::ostream & operator<<(std::ostream &os, const helios::int3 &vec)
    Write int3 to output stream.
    +
    bool operator!=(const int3 &a) const
    Inequality for all elements.
    +
    int3(const std::vector< int > &v)
    Construct int3 from a vector of ints.
    +
    int3 operator+(const int3 &a) const
    Add two int3 vectors.
    +
    bool operator==(const int3 &a) const
    Equality for all elements.
    +
    int z
    Third element in vector.
    +
    int3 operator-() const
    Multiply each element by -1.
    +
    int y
    Second element in vector.
    +
    Vector of four elements of type 'int'.
    +
    int4(const std::vector< int > &v)
    Construct int3 from a vector of ints.
    +
    int x
    First element in vector.
    +
    int4 & operator-=(const int4 &a)
    Decrement int4 vector.
    +
    int4()
    Default constructor.
    +
    int4 operator-() const
    Multiply each element by -1.
    +
    int4(int v0, int v1, int v2, int v3)
    Construct int4 from four ints.
    +
    int z
    Third element in vector.
    +
    int4 operator+(const int4 &a) const
    Add two int4 vectors.
    +
    bool operator==(const int4 &a) const
    Equality for all elements.
    +
    int w
    Fourth element in vector.
    +
    int4 & operator+=(const int4 &a)
    Increment int4 vector.
    +
    friend std::ostream & operator<<(std::ostream &os, const helios::int4 &vec)
    Write int4 to output stream.
    +
    int4(const int v[3])
    Construct int4 from an array of ints.
    +
    int y
    Second element in vector.
    +
    bool operator!=(const int4 &a) const
    Inequality for all elements.
    +
    Vector of two elements of type 'float'.
    +
    vec2 & operator+=(const vec2 &a)
    Increment vec2 vector.
    +
    vec2 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    bool operator!=(const vec2 &a) const
    check for inequality of two vec2 vectors
    +
    float magnitude() const
    Compute the vector magnitude.
    +
    vec2(const std::vector< float > &v)
    Initialize vec2 using a vector of floats.
    +
    vec2 & operator-=(const vec2 &a)
    Decrement vec2 vector.
    +
    friend std::ostream & operator<<(std::ostream &os, const helios::vec2 &vec)
    Write vec2 to output stream.
    +
    vec2(const float v[2])
    Initialize vec2 using an array of floats.
    +
    float x
    First element in vector.
    +
    vec2 operator/(float a) const
    Divide each element by scalar (scalar is divided on right: vec2/a)
    +
    vec2()
    Default constructor.
    +
    bool operator==(const vec2 &a) const
    check for equality of two vec2 vectors
    +
    vec2 operator+(const vec2 &a) const
    Sum of two vec2 vectors.
    +
    float y
    Second element in vector.
    +
    vec2 operator-() const
    Multiply each element by -1.
    +
    vec2(float v0, float v1)
    Initialize vec2 using two floats.
    +
    float operator*(const vec2 &a) const
    Dot (scalar) product of two vec2 vectors.
    +
    Vector of three elements of type 'float'.
    +
    bool operator==(const vec3 &a) const
    check for equality of two vec3 vectors
    +
    vec3 operator/(float a) const
    Divide each element by scalar (scalar is divided on right: vec3/a)
    +
    vec3 operator+(const vec3 &a) const
    Sum of two vec3 vectors.
    +
    vec3 & operator-=(const vec3 &a)
    Decrement vec3 vector.
    +
    vec3 operator-() const
    Multiply vector by -1.
    +
    vec3(const float v[3])
    Initialize vec3 using an array of floats.
    +
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    float x
    First element in vector.
    +
    float z
    Third element in vector.
    +
    friend std::ostream & operator<<(std::ostream &os, const helios::vec3 &vec)
    Write vec3 to output stream.
    +
    vec3()
    Default constructor.
    +
    vec3(float v0, float v1, float v2)
    Initialize vec3 using three floats.
    +
    vec3 & operator+=(const vec3 &a)
    Increment vec3 vector.
    +
    float y
    Second element in vector.
    +
    vec3(const std::vector< float > &v)
    Initialize vec3 using a vector of floats.
    +
    bool operator!=(const vec3 &a) const
    check for inequality of two vec3 vectors
    +
    float magnitude() const
    Compute the vector magnitude.
    +
    float operator*(const vec3 &a) const
    Dot (scalar) product of two vec3 vectors.
    +
    Vector of four elements of type 'float'.
    +
    vec4 operator+(const vec4 &a) const
    Sum of two vec4 vectors.
    +
    vec4(const std::vector< float > &v)
    Initialize vec4 using a vector of floats.
    +
    friend std::ostream & operator<<(std::ostream &os, const helios::vec4 &vec)
    Write vec4 to output stream.
    +
    float y
    Second element in vector.
    +
    float magnitude() const
    Compute the vector magnitude.
    +
    vec4 & operator-=(const vec4 &a)
    Decrement vec4 vector.
    +
    float w
    Fourth element in vector.
    +
    bool operator!=(const vec4 &a) const
    check for equality of two vec4 vectors
    +
    vec4 operator-() const
    Multiply each element by -1.
    +
    float z
    Third element in vector.
    +
    vec4 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    vec4 & operator+=(const vec4 &a)
    Increment vec4 vector.
    +
    vec4()
    Default constructor.
    +
    float x
    First element in vector.
    +
    vec4 operator/(float a) const
    Divide each element by scalar (scalar is divided on right: vec4/a)
    +
    bool operator==(const vec4 &a) const
    check for equality of two vec4 vectors
    +
    vec4(const float v[4])
    Initialize vec3 using an array of floats.
    +
    float operator*(const vec4 &a) const
    Dot (scalar) product of two vec4 vectors.
    +
    vec4(float v0, float v1, float v2, float v3)
    Initialize vec4 using four floats.
    + diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html index 0220d16e2..be32c13f3 100644 --- a/doc/html/hierarchy.html +++ b/doc/html/hierarchy.html @@ -38,31 +38,43 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    This inheritance list is sorted roughly, but not completely, alphabetically:
    -
    [detail level 123]
    +
    [detail level 123]
    - - + + @@ -118,7 +130,7 @@ - + @@ -194,7 +206,8 @@ + diff --git a/doc/html/index.html b/doc/html/index.html index 35c6de8a5..91b01e0ee 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -38,31 +38,43 @@
     CAerialHitPointStructure containing metadata for an aerial hit point
     CAerialLiDARcloudPrimary class for aerial LiDAR scan
     CAerialScanMetadataStructure containing metadata for an aerial scan
     CAxisRotation
     CBaseCanopyParametersBase struct class for Canopy parameters
     CBaseGrapeVineParameters
     CBaseCanopyParametersBase struct class for Canopy parameters
     CBaseGrapeVineParameters
     CGobletGrapevineParametersParameters defining the grapevine canopy with goblet (vent a taille) trellis
     CSplitGrapevineParametersParameters defining the grapevine canopy with a split (quad) trellis
     CUnilateralGrapevineParametersParameters defining the grapevine canopy with unilateral trellis
     CCameraPropertiesProperties defining a radiation camera
     CCanopyGenerator
     CColormapRGB color map
     Chelios::CompoundObject
     Chelios::CompoundObject
     Chelios::BoxBox compound object class
     Chelios::ConeCone compound object class
     Chelios::DiskDisk compound object class
    -
     v1.3.25 +
     v1.3.26
    - + + +
    +
    +
    -
    Helios Documentation v1.3.25
    +
    Helios Documentation v1.3.26


    @@ -135,10 +147,12 @@

    Downloading the Code

    zlib: Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler

    Plug-ins may use other third-party software, which is acknowledged in their documentation pages.

    +
    +
    diff --git a/doc/html/jquery.js b/doc/html/jquery.js index 1dffb65b5..875ada738 100644 --- a/doc/html/jquery.js +++ b/doc/html/jquery.js @@ -1,17 +1,143 @@ /*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
    "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n
    ").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e
    ").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
    "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + */!function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 * http://www.smartmenus.org/ - * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/doc/html/lidar_2include_2random_8h_source.html b/doc/html/lidar_2include_2random_8h_source.html index ab556a8c3..13e6d7440 100644 --- a/doc/html/lidar_2include_2random_8h_source.html +++ b/doc/html/lidar_2include_2random_8h_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    random.h
    @@ -149,7 +161,8 @@
    + diff --git a/doc/html/lidar_2src_2file_i_o_8cpp.html b/doc/html/lidar_2src_2file_i_o_8cpp.html index 70c4bf53a..851721a53 100644 --- a/doc/html/lidar_2src_2file_i_o_8cpp.html +++ b/doc/html/lidar_2src_2file_i_o_8cpp.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    fileIO.cpp File Reference
    @@ -106,7 +118,8 @@
    + diff --git a/doc/html/lidar_2src_2file_i_o_8cpp_source.html b/doc/html/lidar_2src_2file_i_o_8cpp_source.html index 93b3ad66a..f94964c16 100644 --- a/doc/html/lidar_2src_2file_i_o_8cpp_source.html +++ b/doc/html/lidar_2src_2file_i_o_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    fileIO.cpp
    @@ -99,10 +111,13 @@
    19using namespace helios;
    20using namespace std;
    21
    +
    22void LiDARcloud::loadXML( const char* filename ){
    23 loadXML( filename, false );
    24}
    +
    25
    +
    26void LiDARcloud::loadXML( const char* filename, bool load_grid_only ){
    27
    28 if( printmessages ){
    @@ -469,6 +484,7 @@
    389 }
    390
    391}
    +
    392
    393size_t LiDARcloud::loadASCIIFile( uint scanID, ScanMetadata &scandata ){
    394
    @@ -576,6 +592,7 @@
    496
    497}
    498
    +
    499void LiDARcloud::exportTriangleNormals( const char* filename ){
    500
    501 ofstream file;
    @@ -604,7 +621,9 @@
    524 file.close();
    525
    526}
    +
    527
    +
    528void LiDARcloud::exportTriangleNormals( const char* filename, int gridcell ){
    529
    530 ofstream file;
    @@ -638,7 +657,9 @@
    558
    559
    560}
    +
    561
    +
    562void LiDARcloud::exportTriangleAreas( const char* filename ){
    563
    564 ofstream file;
    @@ -660,7 +681,9 @@
    580 file.close();
    581
    582}
    +
    583
    +
    584void LiDARcloud::exportTriangleAreas( const char* filename, int gridcell ){
    585
    586 ofstream file;
    @@ -686,7 +709,9 @@
    606 file.close();
    607
    608}
    +
    609
    +
    610void LiDARcloud::exportTriangleInclinationDistribution( const char* filename, uint Nbins ){
    611
    612 std::vector<std::vector<float>> inclinations( getGridCellCount() );
    @@ -744,7 +769,9 @@
    664 file.close();
    665
    666}
    +
    667
    +
    668void LiDARcloud::exportLeafAreas( const char* filename ){
    669
    670 ofstream file;
    @@ -764,7 +791,9 @@
    684 file.close();
    685
    686}
    +
    687
    +
    688void LiDARcloud::exportLeafAreaDensities( const char* filename ){
    689
    690 ofstream file;
    @@ -784,7 +813,9 @@
    704 file.close();
    705
    706}
    +
    707
    +
    708void LiDARcloud::exportGtheta( const char* filename ){
    709
    710 ofstream file;
    @@ -804,7 +835,9 @@
    724 file.close();
    725
    726}
    +
    727
    +
    728void LiDARcloud::exportPointCloud( const char* filename ){
    729
    730 if(getScanCount() ==1 ){
    @@ -831,8 +864,10 @@
    751
    752 }
    753}
    +
    754
    755
    +
    756void LiDARcloud::exportPointCloud( const char* filename, uint scanID ){
    757
    758 if( scanID> getScanCount()){
    @@ -919,7 +954,9 @@
    839 file.close();
    840
    841}
    +
    842
    +
    843void LiDARcloud::exportPointCloudPTX( const char* filename, uint scanID ){
    844
    845 if( scanID> getScanCount()){
    @@ -997,83 +1034,85 @@
    917 file.close();
    918
    919}
    +
    920
    -
    void coordinateRotation(const helios::SphericalCoord &rotation)
    Rotate all points in the point cloud about the origin.
    Definition: LiDAR.cpp:464
    -
    double getHitData(uint index, const char *label) const
    Set floating point data value associated with a hit point.
    Definition: LiDAR.cpp:345
    -
    uint getGridCellCount() const
    Get the number of cells in the grid.
    Definition: LiDAR.cpp:1791
    -
    void exportPointCloud(const char *filename)
    Export to file all points in the point cloud to an ASCII text file following the column format specif...
    Definition: fileIO.cpp:728
    -
    float getCellLeafAreaDensity(uint index) const
    Get the leaf area density of a grid cell in 1/m.
    Definition: LiDAR.cpp:1938
    -
    uint getScanSizeTheta(uint scanID) const
    Get the number of scan points in the theta (zenithal) direction.
    Definition: LiDAR.cpp:265
    -
    void exportTriangleAreas(const char *filename)
    Export to file the area of all triangles formed.
    Definition: fileIO.cpp:562
    -
    float getCellGtheta(uint index) const
    Get the G(theta) of a grid cell.
    Definition: LiDAR.cpp:1959
    -
    int getHitScanID(uint index) const
    Get the scan with which a hit is associated.
    Definition: LiDAR.cpp:385
    -
    uint getHitCount() const
    Get the number of hit points in the point cloud.
    Definition: LiDAR.cpp:254
    -
    void loadXML(const char *filename)
    Read an XML file containing scan information.
    Definition: fileIO.cpp:22
    -
    void exportLeafAreaDensities(const char *filename)
    Export to file the leaf area density within each grid cell. Lines of the file correspond to each grid...
    Definition: fileIO.cpp:688
    -
    void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
    Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
    Definition: LiDAR.cpp:171
    -
    void coordinateShift(const helios::vec3 &shift)
    Apply a translation to all points in the point cloud.
    Definition: LiDAR.cpp:436
    -
    void exportLeafAreas(const char *filename)
    Export to file the leaf area within each grid cell. Lines of the file correspond to each grid cell.
    Definition: fileIO.cpp:668
    -
    helios::vec3 getScanOrigin(uint scanID) const
    Get the (x,y,z) scan origin.
    Definition: LiDAR.cpp:258
    -
    helios::SphericalCoord getHitRaydir(uint index) const
    Get ray direction of hit point in the scan based on its index.
    Definition: LiDAR.cpp:324
    -
    uint getScanCount()
    Get number of scans in point cloud.
    Definition: LiDAR.cpp:135
    -
    void exportTriangleInclinationDistribution(const char *filename, uint Nbins)
    Export to file discrete area-weighted inclination angle probability distribution based on the triangu...
    Definition: fileIO.cpp:610
    -
    uint getScanSizePhi(uint scanID) const
    Get the number of scan points in the phi (azimuthal) direction.
    Definition: LiDAR.cpp:272
    -
    helios::RGBcolor getHitColor(uint index) const
    Get color of hit point.
    Definition: LiDAR.cpp:375
    -
    uint addScan(ScanMetadata &newscan)
    Add a LiDAR scan to the point cloud.
    Definition: LiDAR.cpp:139
    -
    std::vector< std::string > getScanColumnFormat(uint scanID) const
    Get the labels for columns in ASCII input/output file.
    Definition: LiDAR.cpp:307
    -
    void exportPointCloudPTX(const char *filename, uint scanID)
    Export to file all points from a given scan to PTX file.
    Definition: fileIO.cpp:843
    -
    helios::vec3 getHitXYZ(uint index) const
    Get (x,y,z) coordinate of hit point by index.
    Definition: LiDAR.cpp:314
    -
    void addGridCell(const helios::vec3 &center, const helios::vec3 &size, float rotation)
    Add a cell to the grid.
    Definition: LiDAR.cpp:1795
    -
    float getCellLeafArea(uint index) const
    Get the leaf area of a grid cell in m^2.
    Definition: LiDAR.cpp:1928
    -
    void exportTriangleNormals(const char *filename)
    Export to file the normal vectors (nx,ny,nz) for all triangles formed.
    Definition: fileIO.cpp:499
    -
    void distanceFilter(float maxdistance)
    Filter scan by imposing a maximum distance from the scanner.
    Definition: LiDAR.cpp:1035
    -
    void exportGtheta(const char *filename)
    Export to file the G(theta) value within each grid cell. Lines of the file correspond to each grid ce...
    Definition: fileIO.cpp:708
    -
    void helios_runtime_error(const std::string &error_message)
    Function to throw a runtime error.
    Definition: global.cpp:29
    -
    vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
    Function to rotate a 3D vector given spherical angles elevation and azimuth.
    Definition: global.cpp:79
    -
    vec2 string2vec2(const char *str)
    Convert a space-delimited string into a vec2 vector.
    Definition: global.cpp:623
    -
    int2 string2int2(const char *str)
    Convert a space-delimited string into an int2 vector.
    Definition: global.cpp:683
    -
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition: global.cpp:610
    -
    float deg2rad(float deg)
    Convert degrees to radians.
    Definition: global.cpp:576
    -
    vec3 string2vec3(const char *str)
    Convert a space-delimited string into a vec3 vector.
    Definition: global.cpp:643
    -
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:241
    -
    std::string deblank(const char *input)
    Remove all whitespace from character array.
    Definition: global.cpp:994
    -
    RGBcolor make_RGBcolor(float r, float g, float b)
    Make an RGBcolor vector.
    -
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    -
    vec4 make_vec4(float x, float y, float z, float w)
    Make a vec4 from three floats.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    -
    Structure containing metadata for a terrestrial scan.
    Definition: LiDAR.h:188
    -
    helios::vec3 origin
    (x,y,z) coordinate of scanner location
    Definition: LiDAR.h:235
    -
    std::string data_file
    File containing hit point data.
    Definition: LiDAR.h:206
    -
    std::vector< std::string > columnFormat
    Vector of strings specifying the columns of the scan ASCII file for input/output.
    Definition: LiDAR.h:250
    - -
    R-G-B color vector.
    -
    float b
    Blue color component.
    -
    float r
    Red color component.
    -
    float g
    Green color component.
    -
    Vector of spherical coordinates (elevation,azimuth)
    -
    const float & zenith
    Zenithal angle (radians)
    -
    const float & elevation
    Elevation angle (radians)
    -
    float azimuth
    Azimuthal angle (radians)
    -
    Vector of two elements of type 'int'.
    -
    int y
    Second element in vector.
    -
    int x
    First element in vector.
    -
    Vector of three elements of type 'int'.
    -
    Vector of two elements of type 'float'.
    -
    float x
    First element in vector.
    -
    float y
    Second element in vector.
    -
    Vector of three elements of type 'float'.
    -
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    -
    float x
    First element in vector.
    -
    float z
    Third element in vector.
    -
    float y
    Second element in vector.
    -
    float magnitude() const
    Compute the vector magnitude.
    +
    void coordinateRotation(const helios::SphericalCoord &rotation)
    Rotate all points in the point cloud about the origin.
    Definition LiDAR.cpp:464
    +
    double getHitData(uint index, const char *label) const
    Set floating point data value associated with a hit point.
    Definition LiDAR.cpp:345
    +
    uint getGridCellCount() const
    Get the number of cells in the grid.
    Definition LiDAR.cpp:1791
    +
    void exportPointCloud(const char *filename)
    Export to file all points in the point cloud to an ASCII text file following the column format specif...
    Definition fileIO.cpp:728
    +
    float getCellLeafAreaDensity(uint index) const
    Get the leaf area density of a grid cell in 1/m.
    Definition LiDAR.cpp:1938
    +
    uint getScanSizeTheta(uint scanID) const
    Get the number of scan points in the theta (zenithal) direction.
    Definition LiDAR.cpp:265
    +
    void exportTriangleAreas(const char *filename)
    Export to file the area of all triangles formed.
    Definition fileIO.cpp:562
    +
    float getCellGtheta(uint index) const
    Get the G(theta) of a grid cell.
    Definition LiDAR.cpp:1959
    +
    int getHitScanID(uint index) const
    Get the scan with which a hit is associated.
    Definition LiDAR.cpp:385
    +
    uint getHitCount() const
    Get the number of hit points in the point cloud.
    Definition LiDAR.cpp:254
    +
    void loadXML(const char *filename)
    Read an XML file containing scan information.
    Definition fileIO.cpp:22
    +
    void exportLeafAreaDensities(const char *filename)
    Export to file the leaf area density within each grid cell. Lines of the file correspond to each grid...
    Definition fileIO.cpp:688
    +
    void addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)
    Specify a scan point as a hit by providing the (x,y,z) coordinates and scan ray direction.
    Definition LiDAR.cpp:171
    +
    void coordinateShift(const helios::vec3 &shift)
    Apply a translation to all points in the point cloud.
    Definition LiDAR.cpp:436
    +
    void exportLeafAreas(const char *filename)
    Export to file the leaf area within each grid cell. Lines of the file correspond to each grid cell.
    Definition fileIO.cpp:668
    +
    helios::vec3 getScanOrigin(uint scanID) const
    Get the (x,y,z) scan origin.
    Definition LiDAR.cpp:258
    +
    helios::SphericalCoord getHitRaydir(uint index) const
    Get ray direction of hit point in the scan based on its index.
    Definition LiDAR.cpp:324
    +
    uint getScanCount()
    Get number of scans in point cloud.
    Definition LiDAR.cpp:135
    +
    void exportTriangleInclinationDistribution(const char *filename, uint Nbins)
    Export to file discrete area-weighted inclination angle probability distribution based on the triangu...
    Definition fileIO.cpp:610
    +
    uint getScanSizePhi(uint scanID) const
    Get the number of scan points in the phi (azimuthal) direction.
    Definition LiDAR.cpp:272
    +
    helios::RGBcolor getHitColor(uint index) const
    Get color of hit point.
    Definition LiDAR.cpp:375
    +
    uint addScan(ScanMetadata &newscan)
    Add a LiDAR scan to the point cloud.
    Definition LiDAR.cpp:139
    +
    std::vector< std::string > getScanColumnFormat(uint scanID) const
    Get the labels for columns in ASCII input/output file.
    Definition LiDAR.cpp:307
    +
    void exportPointCloudPTX(const char *filename, uint scanID)
    Export to file all points from a given scan to PTX file.
    Definition fileIO.cpp:843
    +
    helios::vec3 getHitXYZ(uint index) const
    Get (x,y,z) coordinate of hit point by index.
    Definition LiDAR.cpp:314
    +
    void addGridCell(const helios::vec3 &center, const helios::vec3 &size, float rotation)
    Add a cell to the grid.
    Definition LiDAR.cpp:1795
    +
    float getCellLeafArea(uint index) const
    Get the leaf area of a grid cell in m^2.
    Definition LiDAR.cpp:1928
    +
    void exportTriangleNormals(const char *filename)
    Export to file the normal vectors (nx,ny,nz) for all triangles formed.
    Definition fileIO.cpp:499
    +
    void distanceFilter(float maxdistance)
    Filter scan by imposing a maximum distance from the scanner.
    Definition LiDAR.cpp:1035
    +
    void exportGtheta(const char *filename)
    Export to file the G(theta) value within each grid cell. Lines of the file correspond to each grid ce...
    Definition fileIO.cpp:708
    +
    void helios_runtime_error(const std::string &error_message)
    Function to throw a runtime error.
    Definition global.cpp:29
    +
    vec3 rotatePoint(const vec3 &position, const SphericalCoord &rotation)
    Function to rotate a 3D vector given spherical angles elevation and azimuth.
    Definition global.cpp:79
    +
    vec2 string2vec2(const char *str)
    Convert a space-delimited string into a vec2 vector.
    Definition global.cpp:623
    +
    int2 string2int2(const char *str)
    Convert a space-delimited string into an int2 vector.
    Definition global.cpp:683
    +
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition global.cpp:610
    +
    float deg2rad(float deg)
    Convert degrees to radians.
    Definition global.cpp:576
    +
    vec3 string2vec3(const char *str)
    Convert a space-delimited string into a vec3 vector.
    Definition global.cpp:643
    +
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:241
    +
    std::string deblank(const char *input)
    Remove all whitespace from character array.
    Definition global.cpp:994
    +
    RGBcolor make_RGBcolor(float r, float g, float b)
    Make an RGBcolor vector.
    +
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    +
    vec4 make_vec4(float x, float y, float z, float w)
    Make a vec4 from three floats.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    +
    Structure containing metadata for a terrestrial scan.
    Definition LiDAR.h:188
    +
    helios::vec3 origin
    (x,y,z) coordinate of scanner location
    Definition LiDAR.h:235
    +
    std::string data_file
    File containing hit point data.
    Definition LiDAR.h:206
    +
    std::vector< std::string > columnFormat
    Vector of strings specifying the columns of the scan ASCII file for input/output.
    Definition LiDAR.h:250
    + +
    R-G-B color vector.
    +
    float b
    Blue color component.
    +
    float r
    Red color component.
    +
    float g
    Green color component.
    +
    Vector of spherical coordinates (elevation,azimuth)
    +
    const float & zenith
    Zenithal angle (radians)
    +
    const float & elevation
    Elevation angle (radians)
    +
    float azimuth
    Azimuthal angle (radians)
    +
    Vector of two elements of type 'int'.
    +
    int y
    Second element in vector.
    +
    int x
    First element in vector.
    +
    Vector of three elements of type 'int'.
    +
    Vector of two elements of type 'float'.
    +
    float x
    First element in vector.
    +
    float y
    Second element in vector.
    +
    Vector of three elements of type 'float'.
    +
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    float x
    First element in vector.
    +
    float z
    Third element in vector.
    +
    float y
    Second element in vector.
    +
    float magnitude() const
    Compute the vector magnitude.
    + diff --git a/doc/html/main_8cpp_source.html b/doc/html/main_8cpp_source.html index 4758c2b4b..146120074 100644 --- a/doc/html/main_8cpp_source.html +++ b/doc/html/main_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    main.cpp
    @@ -183,31 +195,32 @@ -
    Radiation transport model plugin.
    - -
    Class for visualization of simulation results.
    Definition: Visualizer.h:265
    -
    Stores the state associated with simulation.
    Definition: Context.h:1882
    -
    void scalePrimitiveData(const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)
    Multiply primitive data values by a constant scaling factor for a subset of primitives.
    -
    std::vector< uint > loadPLY(const char *filename, bool silent=false)
    Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
    -
    void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
    Load tabular weather data from text file into timeseries.
    -
    void setDate(int day, int month, int year)
    Set simulation date by day, month, year.
    Definition: Context.cpp:1059
    -
    helios::Time getTime() const
    Get the simulation time.
    Definition: Context.cpp:1166
    -
    void duplicatePrimitiveData(uint UUID, const char *old_label, const char *new_label)
    Duplicate/copy primitive data.
    -
    helios::Date getDate() const
    Get simulation date.
    Definition: Context.cpp:1099
    -
    std::vector< uint > getAllUUIDs() const
    Get all primitive UUIDs currently in the Context.
    Definition: Context.cpp:1763
    -
    void setPrimitiveData(const uint &UUID, const char *label, const int &data)
    Add data value (int) associated with a primitive element.
    -
    void setTime(int minute, int hour)
    Set simulation time.
    Definition: Context.cpp:1136
    -
    std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition: Context.cpp:5809
    -
    void wait(float seconds)
    Wait/sleep for a specified amount of time.
    Definition: global.cpp:306
    -
    void setCurrentTimeseriesPoint(const char *label, uint index)
    Set the Context date and time by providing the index of a timeseries data point.
    Definition: Context.cpp:1886
    -
    float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
    Get a timeseries data point by specifying a date and time vector.
    Definition: Context.cpp:1894
    -
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    Vector of three elements of type 'float'.
    +
    Radiation transport model plugin.
    + +
    Class for visualization of simulation results.
    Definition Visualizer.h:275
    +
    Stores the state associated with simulation.
    Definition Context.h:1882
    +
    void scalePrimitiveData(const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)
    Multiply primitive data values by a constant scaling factor for a subset of primitives.
    +
    std::vector< uint > loadPLY(const char *filename, bool silent=false)
    Load geometry contained in a Stanford polygon file (.ply). Model will be placed at the origin with no...
    +
    void loadTabularTimeseriesData(const std::string &data_file, const std::vector< std::string > &column_labels, const std::string &delimiter, const std::string &date_string_format="YYYYMMDD", uint headerlines=0)
    Load tabular weather data from text file into timeseries.
    +
    void setDate(int day, int month, int year)
    Set simulation date by day, month, year.
    Definition Context.cpp:1059
    +
    helios::Time getTime() const
    Get the simulation time.
    Definition Context.cpp:1166
    +
    void duplicatePrimitiveData(uint UUID, const char *old_label, const char *new_label)
    Duplicate/copy primitive data.
    +
    helios::Date getDate() const
    Get simulation date.
    Definition Context.cpp:1099
    +
    std::vector< uint > getAllUUIDs() const
    Get all primitive UUIDs currently in the Context.
    Definition Context.cpp:1763
    +
    void setPrimitiveData(const uint &UUID, const char *label, const int &data)
    Add data value (int) associated with a primitive element.
    +
    void setTime(int minute, int hour)
    Set simulation time.
    Definition Context.cpp:1136
    +
    std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition Context.cpp:5809
    +
    void wait(float seconds)
    Wait/sleep for a specified amount of time.
    Definition global.cpp:306
    +
    void setCurrentTimeseriesPoint(const char *label, uint index)
    Set the Context date and time by providing the index of a timeseries data point.
    Definition Context.cpp:1886
    +
    float queryTimeseriesData(const char *label, const Date &date, const Time &time) const
    Get a timeseries data point by specifying a date and time vector.
    Definition Context.cpp:1894
    +
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    Vector of three elements of type 'float'.
    + diff --git a/doc/html/menu.js b/doc/html/menu.js index b0b26936a..0fd1e9901 100644 --- a/doc/html/menu.js +++ b/doc/html/menu.js @@ -22,15 +22,14 @@ @licend The above is the entire license notice for the JavaScript code in this file */ -function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { function makeTree(data,relPath) { - var result=''; + let result=''; if ('children' in data) { result+='
      '; - for (var i in data.children) { - var url; - var link; - link = data.children[i].url; + for (let i in data.children) { + let url; + const link = data.children[i].url; if (link.substring(0,1)=='^') { url = link.substring(1); } else { @@ -44,7 +43,7 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { } return result; } - var searchBoxHtml; + let searchBoxHtml; if (searchEnabled) { if (serverSide) { searchBoxHtml='
      '+ @@ -88,29 +87,28 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { if (searchBoxHtml) { $('#main-menu').append('
    • '); } - var $mainMenuState = $('#main-menu-state'); - var prevWidth = 0; + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; if ($mainMenuState.length) { - function initResizableIfExists() { - if (typeof initResizable==='function') initResizable(); + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); } // animate mobile menu - $mainMenuState.change(function(e) { - var $menu = $('#main-menu'); - var options = { duration: 250, step: initResizableIfExists }; + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; if (this.checked) { - options['complete'] = function() { $menu.css('display', 'block') }; + options['complete'] = () => $menu.css('display', 'block'); $menu.hide().slideDown(options); } else { - options['complete'] = function() { $menu.css('display', 'none') }; + options['complete'] = () => $menu.css('display', 'none'); $menu.show().slideUp(options); } }); // set default menu visibility - function resetState() { - var $menu = $('#main-menu'); - var $mainMenuState = $('#main-menu-state'); - var newWidth = $(window).outerWidth(); + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); if (newWidth!=prevWidth) { if ($(window).outerWidth()<768) { $mainMenuState.prop('checked',false); $menu.hide(); diff --git a/doc/html/menudata.js b/doc/html/menudata.js index f82847a23..745ea0397 100644 --- a/doc/html/menudata.js +++ b/doc/html/menudata.js @@ -32,7 +32,6 @@ var menudata={children:[ {text:"Tutorials",url:"_tutorials.html"}]}, {text:"Plug-ins",url:"_plug_ins.html"}, {text:"Related Pages",url:"pages.html"}, -{text:"Modules",url:"modules.html"}, {text:"Data Structures",url:"annotated.html",children:[ {text:"Data Structures",url:"annotated.html"}, {text:"Data Structure Index",url:"classes.html"}, @@ -115,29 +114,33 @@ var menudata={children:[ {text:"z",url:"functions_vars_z.html#index_z"}]}, {text:"Enumerations",url:"functions_enum.html"}, {text:"Enumerator",url:"functions_eval.html"}, -{text:"Related Functions",url:"functions_rela.html"}]}]}, +{text:"Related Symbols",url:"functions_rela.html"}]}]}, {text:"Files",url:"files.html",children:[ {text:"File List",url:"files.html"}, {text:"Globals",url:"globals.html",children:[ {text:"All",url:"globals.html",children:[ {text:"b",url:"globals.html#index_b"}, +{text:"c",url:"globals.html#index_c"}, {text:"d",url:"globals.html#index_d"}, {text:"e",url:"globals.html#index_e"}, {text:"g",url:"globals.html#index_g"}, {text:"i",url:"globals.html#index_i"}, {text:"m",url:"globals.html#index_m"}, {text:"r",url:"globals.html#index_r"}, +{text:"s",url:"globals.html#index_s"}, {text:"t",url:"globals.html#index_t"}, {text:"v",url:"globals.html#index_v"}, {text:"w",url:"globals.html#index_w"}]}, {text:"Functions",url:"globals_func.html",children:[ {text:"b",url:"globals_func.html#index_b"}, +{text:"c",url:"globals_func.html#index_c"}, {text:"d",url:"globals_func.html#index_d"}, {text:"e",url:"globals_func.html#index_e"}, {text:"g",url:"globals_func.html#index_g"}, {text:"i",url:"globals_func.html#index_i"}, {text:"m",url:"globals_func.html#index_m"}, {text:"r",url:"globals_func.html#index_r"}, +{text:"s",url:"globals_func.html#index_s"}, {text:"t",url:"globals_func.html#index_t"}, {text:"v",url:"globals_func.html#index_v"}, {text:"w",url:"globals_func.html#index_w"}]}, diff --git a/doc/html/minus.svg b/doc/html/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/html/minusd.svg b/doc/html/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/html/modules.html b/doc/html/modules.html deleted file mode 100644 index e80ad8e65..000000000 --- a/doc/html/modules.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - -.: Helios Documentation - - - - - - - - - - - - - - - -
      -
      - - - - - - - -
      -
       v1.3.25 -
      -
      -
      - - - - - - -
      - -
      -
      - - -
      -
      -
      -
      -
      -
      Loading...
      -
      Searching...
      -
      No Matches
      -
      -
      -
      -
      - -
      -
      Modules
      -
      -
      -
      Here is a list of all modules:
      - - - - - - -
       TimeseriesTimeseries-related functions
       Utility functionsMiscellaneous helper functions
       Geometric PrimitivesBasic geometric objects to construct the domain
       Compound ObjectsGeometric objects comprised of multiple primitives
       VectorsVector data structures
      -
      -
      - - - - diff --git a/doc/html/navtree.css b/doc/html/navtree.css new file mode 100644 index 000000000..6b1e5e46b --- /dev/null +++ b/doc/html/navtree.css @@ -0,0 +1,149 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: white; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +#nav-tree .selected .arrow { + color: #9CAFD4; + text-shadow: none; +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:white; +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: $width; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background-image:url('splitbar.png'); + background-size:100%; + background-repeat:repeat-y; + background-attachment: scroll; + cursor:ew-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-repeat:repeat-x; + background-color: #F9FAFC; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/doc/html/pages.html b/doc/html/pages.html index c613297c6..d68c36b9e 100644 --- a/doc/html/pages.html +++ b/doc/html/pages.html @@ -38,31 +38,43 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + +
      +
      +
      Here is a list of all related documentation pages:
      -
      [detail level 12]
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
      [detail level 12]
       Using the CLion IDE with Helios
       Tutorials
       Tutorial 0: Context Self-Test Tutorial
       Tutorial 1: Helios Vector Types Tutorial
       Tutorial 2: Working with Context Geometry
       Tutorial 5: Primitive Data
       Tutorial 6: Global Data
       Tutorial 7: Visualizer Basics
       Tutorial 8: Visualizing primitive data values
       Tutorial 10: Radiation model basics - tree light interception
       Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy
       Overview
       Plug-ins
       Visualizer Plugin Documentation
       Weber-Penn Tree Plugin Documentation
       Radiation Model Plugin Documentation
       Energy Balance Model Plugin Documentation
       Boundary-Layer Conductance Model Plugin Documentation
       LiDAR Point Cloud Plugin Documentation
       Aerial LiDAR Point Cloud Plugin Documentation
       Photosynthesis Model Plugin Documentation
       Stomatal Conductance Model Plugin Documentation
       Solar Position Plugin Documentation
       Voxel Intersection Plugin Documentation
       Canopy Generator Plugin Documentation
       Plant Architecture Model Plugin Documentation
       Install and Set-up
       User/API Guide
       File Input/Output
       Writing Plugins
       Making texture mask files with transparency using GIMP
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - +
       Using the CLion IDE with Helios
       Tutorials
       Tutorial 0: Context Self-Test Tutorial
       Tutorial 1: Helios Vector Types Tutorial
       Tutorial 2: Working with Context Geometry
       Tutorial 5: Primitive Data
       Tutorial 6: Global Data
       Tutorial 7: Visualizer Basics
       Tutorial 8: Visualizing primitive data values
       Tutorial 10: Radiation model basics - tree light interception
       Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy
       Overview
       Plug-ins
       Visualizer Plugin Documentation
       Weber-Penn Tree Plugin Documentation
       Radiation Model Plugin Documentation
       Energy Balance Model Plugin Documentation
       Boundary-Layer Conductance Model Plugin Documentation
       LiDAR Point Cloud Plugin Documentation
       Aerial LiDAR Point Cloud Plugin Documentation
       Photosynthesis Model Plugin Documentation
       Stomatal Conductance Model Plugin Documentation
       Solar Position Plugin Documentation
       Voxel Intersection Plugin Documentation
       Canopy Generator Plugin Documentation
       Plant Architecture Model Plugin Documentation
       Install and Set-up
       User/API Guide
       File Input/Output
       Writing Plugins
       Making texture mask files with transparency using GIMP
       Converting polygon file formats to .ply using Blender
       Choosing the right CUDA and OptiX version
       Choosing the right CUDA and OptiX version
       Increasing graphics driver timeout
       Dummy Model Plugin Documentation
       Dummy Model Plugin Documentation
      +
      diff --git a/doc/html/plugins_2lidar_2src_2self_test_8cpp.html b/doc/html/plugins_2lidar_2src_2self_test_8cpp.html index 24ea485d9..a7bd7113c 100644 --- a/doc/html/plugins_2lidar_2src_2self_test_8cpp.html +++ b/doc/html/plugins_2lidar_2src_2self_test_8cpp.html @@ -38,30 +38,41 @@ Logo -
       v1.3.25 +
       v1.3.26
      - + + + +
    +
    selfTest.cpp File Reference
    @@ -105,7 +117,8 @@
    + diff --git a/doc/html/plugins_2lidar_2src_2self_test_8cpp_source.html b/doc/html/plugins_2lidar_2src_2self_test_8cpp_source.html index be10b35ec..f9eca4470 100644 --- a/doc/html/plugins_2lidar_2src_2self_test_8cpp_source.html +++ b/doc/html/plugins_2lidar_2src_2self_test_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    selfTest.cpp
    @@ -98,6 +110,7 @@
    18using namespace std;
    19using namespace helios;
    20
    +
    22
    23 std::cout << "Running LiDAR self-test..." << std::endl;;
    @@ -337,7 +350,7 @@
    257 LAD = synthetic_4.getCellLeafArea(i);
    258 if( LAD==LAD && total_area.at(i)>0 && total_area.at(i)==total_area.at(i) ){
    259 RMSE_LAD += pow( LAD - total_area.at(i), 2)/float(Ncells);
    -
    260 bias_LAD += (LAD - total_area.at(i))/float(Ncells);
    +
    260 bias_LAD += (LAD - total_area.at(i))/float(Ncells);
    261 }
    262 float Gtheta_bar = synthetic_4.getCellGtheta(i);
    263 if( Gtheta_bar==Gtheta_bar && Gtheta.at(i)>0 && Gtheta.at(i)==Gtheta.at(i) ){
    @@ -369,46 +382,48 @@
    289 }
    290
    291}
    +
    -
    Primary class for terrestrial LiDAR scan.
    Definition: LiDAR.h:270
    -
    std::vector< float > calculateSyntheticLeafArea(helios::Context *context)
    Calculate the surface area of all primitives in the context.
    Definition: LiDAR.cu:3712
    -
    uint getGridCellCount() const
    Get the number of cells in the grid.
    Definition: LiDAR.cpp:1791
    -
    float getCellLeafAreaDensity(uint index) const
    Get the leaf area density of a grid cell in 1/m.
    Definition: LiDAR.cpp:1938
    -
    float getCellGtheta(uint index) const
    Get the G(theta) of a grid cell.
    Definition: LiDAR.cpp:1959
    -
    void addTrianglesToContext(helios::Context *context) const
    Add triangle geometry to Helios context.
    Definition: LiDAR.cpp:1772
    -
    helios::vec3 getCellSize(uint index) const
    Get the size of a grid cell by its index.
    Definition: LiDAR.cpp:1829
    -
    void loadXML(const char *filename)
    Read an XML file containing scan information.
    Definition: fileIO.cpp:22
    -
    std::vector< float > calculateSyntheticGtheta(helios::Context *context)
    Calculate the G(theta) of all primitives in the context.
    Definition: LiDAR.cpp:1849
    -
    helios::vec3 getScanOrigin(uint scanID) const
    Get the (x,y,z) scan origin.
    Definition: LiDAR.cpp:258
    -
    int selfTest()
    Self-test (unit test) function.
    Definition: selfTest.cpp:21
    -
    uint getScanCount()
    Get number of scans in point cloud.
    Definition: LiDAR.cpp:135
    -
    void syntheticScan(helios::Context *context)
    Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns onl...
    Definition: LiDAR.cu:3093
    -
    void triangulateHitPoints(float Lmax, float max_aspect_ratio)
    Perform triangulation on all hit points in point cloud.
    Definition: LiDAR.cpp:1382
    -
    float getCellLeafArea(uint index) const
    Get the leaf area of a grid cell in m^2.
    Definition: LiDAR.cpp:1928
    -
    void disableMessages()
    Disable all print messages to the screen except for fatal error messages.
    Definition: LiDAR.cpp:100
    -
    void calculateLeafAreaGPU()
    Calculate the leaf area for each grid volume.
    Definition: LiDAR.cu:897
    -
    Stores the state associated with simulation.
    Definition: Context.h:1882
    -
    std::vector< uint > loadXML(const char *filename, bool quiet=false)
    Load inputs specified in an XML file.
    -
    float getPrimitiveArea(uint UUID) const
    Method to return the surface area of a Primitive.
    Definition: Context.cpp:7053
    -
    void getPrimitiveData(uint UUID, const char *label, int &data) const
    Get data associated with a primitive element.
    -
    bool doesPrimitiveDataExist(uint UUID, const char *label) const
    Check if primitive data 'label' exists.
    -
    std::vector< uint > loadOBJ(const char *filename, bool silent=false)
    Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
    -
    std::vector< uint > getAllUUIDs() const
    Get all primitive UUIDs currently in the Context.
    Definition: Context.cpp:1763
    -
    helios::vec3 getPrimitiveNormal(uint UUID) const
    Method to return the normal vector of a Primitive.
    Definition: Context.cpp:7104
    -
    std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
    Method to return the (x,y,z) coordinates of the vertices of a Primitive.
    Definition: Context.cpp:7122
    -
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:241
    -
    uint getPrimitiveCount() const
    Get the total number of Primitives in the Context.
    Definition: Context.cpp:1759
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    -
    Vector of three elements of type 'float'.
    -
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    -
    float x
    First element in vector.
    -
    float z
    Third element in vector.
    -
    float y
    Second element in vector.
    +
    Primary class for terrestrial LiDAR scan.
    Definition LiDAR.h:270
    +
    std::vector< float > calculateSyntheticLeafArea(helios::Context *context)
    Calculate the surface area of all primitives in the context.
    Definition LiDAR.cu:3712
    +
    uint getGridCellCount() const
    Get the number of cells in the grid.
    Definition LiDAR.cpp:1791
    +
    float getCellLeafAreaDensity(uint index) const
    Get the leaf area density of a grid cell in 1/m.
    Definition LiDAR.cpp:1938
    +
    float getCellGtheta(uint index) const
    Get the G(theta) of a grid cell.
    Definition LiDAR.cpp:1959
    +
    void addTrianglesToContext(helios::Context *context) const
    Add triangle geometry to Helios context.
    Definition LiDAR.cpp:1772
    +
    helios::vec3 getCellSize(uint index) const
    Get the size of a grid cell by its index.
    Definition LiDAR.cpp:1829
    +
    void loadXML(const char *filename)
    Read an XML file containing scan information.
    Definition fileIO.cpp:22
    +
    std::vector< float > calculateSyntheticGtheta(helios::Context *context)
    Calculate the G(theta) of all primitives in the context.
    Definition LiDAR.cpp:1849
    +
    helios::vec3 getScanOrigin(uint scanID) const
    Get the (x,y,z) scan origin.
    Definition LiDAR.cpp:258
    +
    int selfTest()
    Self-test (unit test) function.
    Definition selfTest.cpp:21
    +
    uint getScanCount()
    Get number of scans in point cloud.
    Definition LiDAR.cpp:135
    +
    void syntheticScan(helios::Context *context)
    Run a discrete return synthetic LiDAR scan based on scan parameters given in an XML file (returns onl...
    Definition LiDAR.cu:3093
    +
    void triangulateHitPoints(float Lmax, float max_aspect_ratio)
    Perform triangulation on all hit points in point cloud.
    Definition LiDAR.cpp:1382
    +
    float getCellLeafArea(uint index) const
    Get the leaf area of a grid cell in m^2.
    Definition LiDAR.cpp:1928
    +
    void disableMessages()
    Disable all print messages to the screen except for fatal error messages.
    Definition LiDAR.cpp:100
    +
    void calculateLeafAreaGPU()
    Calculate the leaf area for each grid volume.
    Definition LiDAR.cu:897
    +
    Stores the state associated with simulation.
    Definition Context.h:1882
    +
    std::vector< uint > loadXML(const char *filename, bool quiet=false)
    Load inputs specified in an XML file.
    +
    float getPrimitiveArea(uint UUID) const
    Method to return the surface area of a Primitive.
    Definition Context.cpp:7053
    +
    void getPrimitiveData(uint UUID, const char *label, int &data) const
    Get data associated with a primitive element.
    +
    bool doesPrimitiveDataExist(uint UUID, const char *label) const
    Check if primitive data 'label' exists.
    +
    std::vector< uint > loadOBJ(const char *filename, bool silent=false)
    Load geometry contained in a Wavefront OBJ file (.obj). Model will be placed at the origin without an...
    +
    std::vector< uint > getAllUUIDs() const
    Get all primitive UUIDs currently in the Context.
    Definition Context.cpp:1763
    +
    helios::vec3 getPrimitiveNormal(uint UUID) const
    Method to return the normal vector of a Primitive.
    Definition Context.cpp:7104
    +
    std::vector< helios::vec3 > getPrimitiveVertices(uint UUID) const
    Method to return the (x,y,z) coordinates of the vertices of a Primitive.
    Definition Context.cpp:7122
    +
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:241
    +
    uint getPrimitiveCount() const
    Get the total number of Primitives in the Context.
    Definition Context.cpp:1759
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    +
    Vector of three elements of type 'float'.
    +
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    float x
    First element in vector.
    +
    float z
    Third element in vector.
    +
    float y
    Second element in vector.
    + diff --git a/doc/html/plugins_2plantarchitecture_2src_2self_test_8cpp.html b/doc/html/plugins_2plantarchitecture_2src_2self_test_8cpp.html index 8c9c8c41b..aaea9e34f 100644 --- a/doc/html/plugins_2plantarchitecture_2src_2self_test_8cpp.html +++ b/doc/html/plugins_2plantarchitecture_2src_2self_test_8cpp.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    selfTest.cpp File Reference
    @@ -105,7 +117,8 @@
    + diff --git a/doc/html/plugins_2plantarchitecture_2src_2self_test_8cpp_source.html b/doc/html/plugins_2plantarchitecture_2src_2self_test_8cpp_source.html index 5fb20b359..fc2ee0c67 100644 --- a/doc/html/plugins_2plantarchitecture_2src_2self_test_8cpp_source.html +++ b/doc/html/plugins_2plantarchitecture_2src_2self_test_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    selfTest.cpp
    @@ -98,6 +110,7 @@
    18using namespace std;
    19using namespace helios;
    20
    +
    22
    23 int error_count = 0;
    @@ -120,37 +133,33 @@
    40
    41 std::cout << "Running self-test to build all plants in the library..." << std::endl;
    42
    -
    43 Timer timer;
    -
    44 for ( auto &plant_label : plant_labels ) {
    -
    45 timer.tic();
    -
    46 test_buildPlantFromLibrary( plant_label );
    -
    47 timer.toc();
    -
    48 }
    -
    49
    -
    50 if ( error_count==0 ) {
    -
    51 std::cout << "passed." << std::endl;
    -
    52 return 0;
    -
    53 } else {
    -
    54 std::cout << "failed " << error_count << " tests." << std::endl;
    -
    55 return 1;
    -
    56 }
    -
    57
    -
    58 return 0;
    -
    59}
    +
    43 for ( auto &plant_label : plant_labels ) {
    +
    44 test_buildPlantFromLibrary( plant_label );
    +
    45 }
    +
    46
    +
    47 if ( error_count==0 ) {
    +
    48 std::cout << "passed." << std::endl;
    +
    49 return 0;
    +
    50 } else {
    +
    51 std::cout << "failed " << error_count << " tests." << std::endl;
    +
    52 return 1;
    +
    53 }
    +
    54
    +
    55 return 0;
    +
    56}
    +
    - -
    static int selfTest()
    Unit test routines.
    Definition: selfTest.cpp:21
    -
    uint buildPlantInstanceFromLibrary(const helios::vec3 &base_position, float age)
    Build a plant instance based on the model currently loaded from the library.
    -
    void loadPlantModelFromLibrary(const std::string &plant_label)
    Load an existing plant model from the library.
    -
    Stores the state associated with simulation.
    Definition: Context.h:1882
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    MATLAB-style timer. Call tic() to start timer, call toc() to stop timer and print duration.
    Definition: global.h:619
    -
    void tic()
    Start timer.
    Definition: global.h:627
    -
    double toc() const
    Stop timer and print elapsed time.
    Definition: global.h:633
    + +
    static int selfTest()
    Unit test routines.
    Definition selfTest.cpp:21
    +
    uint buildPlantInstanceFromLibrary(const helios::vec3 &base_position, float age)
    Build a plant instance based on the model currently loaded from the library.
    +
    void loadPlantModelFromLibrary(const std::string &plant_label)
    Load an existing plant model from the library.
    +
    Stores the state associated with simulation.
    Definition Context.h:1882
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    + diff --git a/doc/html/plugins_2radiation_2src_2self_test_8cpp.html b/doc/html/plugins_2radiation_2src_2self_test_8cpp.html index b675a9a72..8af750e92 100644 --- a/doc/html/plugins_2radiation_2src_2self_test_8cpp.html +++ b/doc/html/plugins_2radiation_2src_2self_test_8cpp.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    selfTest.cpp File Reference
    @@ -105,7 +117,8 @@
    + diff --git a/doc/html/plugins_2radiation_2src_2self_test_8cpp_source.html b/doc/html/plugins_2radiation_2src_2self_test_8cpp_source.html index 6139dcc9d..705f5aec0 100644 --- a/doc/html/plugins_2radiation_2src_2self_test_8cpp_source.html +++ b/doc/html/plugins_2radiation_2src_2self_test_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    selfTest.cpp
    @@ -97,6 +109,7 @@
    17
    18using namespace helios;
    19
    +
    21
    22 std::cout << "Running radiation model self-test..." << std::endl;
    @@ -1839,85 +1852,87 @@
    1759
    1760
    1761}
    +
    1762
    -
    @ HELIOS_TYPE_VEC2
    helios::vec2 data type
    Definition: Context.h:51
    -
    @ HELIOS_TYPE_FLOAT
    floating point data type
    Definition: Context.h:47
    +
    @ HELIOS_TYPE_VEC2
    helios::vec2 data type
    Definition Context.h:51
    +
    @ HELIOS_TYPE_FLOAT
    floating point data type
    Definition Context.h:47
    -
    Radiation transport model plugin.
    -
    void disableMessages()
    Disable/silence status messages.
    -
    void setCameraSpectralResponse(const std::string &camera_label, const std::string &band_label, const std::string &global_data)
    Set the spectral response of a camera band based on reference to global data. This function version u...
    -
    void setSourceFlux(uint source_ID, const std::string &band_label, float flux)
    Set the flux of radiation source for this band.
    -
    uint addSphereRadiationSource(const helios::vec3 &position, float radius)
    Add an external source of radiation that emits from the surface of a sphere.
    -
    void enforcePeriodicBoundary(const std::string &boundary)
    Use a periodic boundary condition in one or more lateral directions.
    -
    void setDirectRayCount(const std::string &label, size_t N)
    Sets variable directRayCount, the number of rays to be used in direct radiation model.
    -
    int selfTest()
    Self-test.
    Definition: selfTest.cpp:20
    -
    void setScatteringDepth(const std::string &label, uint depth)
    Set the number of scattering iterations for a certain band.
    -
    void disableEmission(const std::string &label)
    Disable emission calculations for all primitives in this band.
    -
    void setSourceSpectrum(uint source_ID, const std::vector< helios::vec2 > &spectrum)
    Set the spectral distribution of a radiation source according to a vector of wavelength-intensity pai...
    -
    void runBand(const std::string &label)
    Run the simulation for a single radiative band.
    -
    uint addSunSphereRadiationSource()
    Add a sphere radiation source that models the sun assuming the default direction of (0,...
    -
    uint addDiskRadiationSource(const helios::vec3 &position, float radius, const helios::vec3 &rotation)
    Add planar circular radiation source.
    -
    void setDiffuseRadiationFlux(const std::string &label, float flux)
    Diffuse (ambient) radiation flux.
    -
    void setDiffuseRayCount(const std::string &label, size_t N)
    Sets variable diffuseRayCount, the number of rays to be used in diffuse (ambient) radiation model.
    -
    uint addRectangleRadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
    Add planar rectangular radiation source.
    -
    void setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::vec3 &peak_dir)
    Extinction coefficient of diffuse ambient radiation.
    -
    void updateGeometry()
    Adds all geometric primitives from the Context to OptiX.
    -
    void addRadiationBand(const std::string &label)
    Add a spectral radiation band to the model.
    -
    uint addCollimatedRadiationSource()
    Add an external source of collimated radiation (i.e., source at infinite distance with parallel rays)...
    -
    void addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)
    Add a radiation camera sensor.
    -
    void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
    Method to rotate a Compound Object about the x-, y-, or z-axis.
    Definition: Context.cpp:2377
    -
    void translate(const helios::vec3 &shift)
    Method to translate/shift a Compound Object.
    Definition: Context.cpp:2353
    -
    std::vector< uint > getPrimitiveUUIDs() const
    Get the UUIDs for all primitives contained in the object.
    Definition: Context.cpp:2256
    -
    Stores the state associated with simulation.
    Definition: Context.h:1882
    -
    uint copyObject(uint ObjID)
    Make a copy of a Compound Objects from the context.
    Definition: Context.cpp:2642
    -
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition: Context.cpp:1406
    -
    float getPrimitiveArea(uint UUID) const
    Method to return the surface area of a Primitive.
    Definition: Context.cpp:7053
    -
    void getPrimitiveData(uint UUID, const char *label, int &data) const
    Get data associated with a primitive element.
    -
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition: Context.cpp:1536
    -
    CompoundObject * getObjectPointer(uint ObjID) const
    Get a pointer to a Compound Object.
    Definition: Context.cpp:2574
    -
    helios::vec3 getPatchCenter(uint UUID) const
    Get the Cartesian (x,y,z) center position of a patch element.
    Definition: Context.cpp:1693
    -
    float randu()
    Draw a random number from a uniform distribution between 0 and 1.
    Definition: Context.cpp:1178
    -
    void getGlobalData(const char *label, int &data) const
    Get global data value (scalar integer)
    -
    void setGlobalData(const char *label, const int &data)
    Add global data value (int)
    -
    void deleteObject(uint ObjID)
    Delete a single Compound Object from the context.
    Definition: Context.cpp:2609
    -
    void setPrimitiveData(const uint &UUID, const char *label, const int &data)
    Add data value (int) associated with a primitive element.
    -
    bool doesPrimitiveExist(uint UUID) const
    Check if primitive exists for a given UUID.
    Definition: Context.cpp:1659
    -
    SphericalCoord nullrotation
    Default null SphericalCoord that applies no rotation.
    Definition: global.cpp:57
    -
    std::vector< uint > addBox(const vec3 &center, const vec3 &size, const int3 &subdiv)
    Add a rectangular prism tessellated with Patch primitives.
    Definition: Context.cpp:6147
    -
    uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
    Add a rectangular prism tessellated with Patch primitives.
    Definition: Context.cpp:5000
    -
    std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition: Context.cpp:5809
    -
    uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition: Context.cpp:4550
    -
    float deg2rad(float deg)
    Convert degrees to radians.
    Definition: global.cpp:576
    -
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition: global.cpp:617
    -
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:241
    -
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition: Context.cpp:1328
    -
    uint addPatch()
    Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
    Definition: Context.cpp:1212
    -
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    -
    Camera calibration structure used for camera calibration tasks.
    -
    std::vector< uint > readROMCCanopy()
    Read ROMC canopy file (Used for self test).
    -
    Properties defining a radiation camera.
    -
    helios::int2 camera_resolution
    Camera sensor resolution (number of pixels) in the horizontal (.x) and vertical (....
    -
    float focal_plane_distance
    Distance from the viewing plane to the focal plane.
    -
    float HFOV
    Camera horizontal field of view in degrees.
    -
    float lens_diameter
    Diameter of the camera lens (lens_diameter = 0 gives a 'pinhole' camera with everything in focus)
    -
    float FOV_aspect_ratio
    Physical dimensions of the pixel array sensor in the horizontal (.x) and vertical (....
    -
    Vector of spherical coordinates (elevation,azimuth)
    -
    const float & elevation
    Elevation angle (radians)
    -
    float azimuth
    Azimuthal angle (radians)
    -
    Vector of two elements of type 'float'.
    -
    float x
    First element in vector.
    -
    float y
    Second element in vector.
    -
    Vector of three elements of type 'float'.
    -
    float x
    First element in vector.
    -
    float y
    Second element in vector.
    +
    Radiation transport model plugin.
    +
    void disableMessages()
    Disable/silence status messages.
    +
    void setCameraSpectralResponse(const std::string &camera_label, const std::string &band_label, const std::string &global_data)
    Set the spectral response of a camera band based on reference to global data. This function version u...
    +
    void setSourceFlux(uint source_ID, const std::string &band_label, float flux)
    Set the flux of radiation source for this band.
    +
    uint addSphereRadiationSource(const helios::vec3 &position, float radius)
    Add an external source of radiation that emits from the surface of a sphere.
    +
    void enforcePeriodicBoundary(const std::string &boundary)
    Use a periodic boundary condition in one or more lateral directions.
    +
    void setDirectRayCount(const std::string &label, size_t N)
    Sets variable directRayCount, the number of rays to be used in direct radiation model.
    +
    int selfTest()
    Self-test.
    Definition selfTest.cpp:20
    +
    void setScatteringDepth(const std::string &label, uint depth)
    Set the number of scattering iterations for a certain band.
    +
    void disableEmission(const std::string &label)
    Disable emission calculations for all primitives in this band.
    +
    void setSourceSpectrum(uint source_ID, const std::vector< helios::vec2 > &spectrum)
    Set the spectral distribution of a radiation source according to a vector of wavelength-intensity pai...
    +
    void runBand(const std::string &label)
    Run the simulation for a single radiative band.
    +
    uint addSunSphereRadiationSource()
    Add a sphere radiation source that models the sun assuming the default direction of (0,...
    +
    uint addDiskRadiationSource(const helios::vec3 &position, float radius, const helios::vec3 &rotation)
    Add planar circular radiation source.
    +
    void setDiffuseRadiationFlux(const std::string &label, float flux)
    Diffuse (ambient) radiation flux.
    +
    void setDiffuseRayCount(const std::string &label, size_t N)
    Sets variable diffuseRayCount, the number of rays to be used in diffuse (ambient) radiation model.
    +
    uint addRectangleRadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
    Add planar rectangular radiation source.
    +
    void setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::vec3 &peak_dir)
    Extinction coefficient of diffuse ambient radiation.
    +
    void updateGeometry()
    Adds all geometric primitives from the Context to OptiX.
    +
    void addRadiationBand(const std::string &label)
    Add a spectral radiation band to the model.
    +
    uint addCollimatedRadiationSource()
    Add an external source of collimated radiation (i.e., source at infinite distance with parallel rays)...
    +
    void addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)
    Add a radiation camera sensor.
    +
    void rotate(float rotation_radians, const char *rotation_axis_xyz_string)
    Method to rotate a Compound Object about the x-, y-, or z-axis.
    Definition Context.cpp:2377
    +
    void translate(const helios::vec3 &shift)
    Method to translate/shift a Compound Object.
    Definition Context.cpp:2353
    +
    std::vector< uint > getPrimitiveUUIDs() const
    Get the UUIDs for all primitives contained in the object.
    Definition Context.cpp:2256
    +
    Stores the state associated with simulation.
    Definition Context.h:1882
    +
    uint copyObject(uint ObjID)
    Make a copy of a Compound Objects from the context.
    Definition Context.cpp:2642
    +
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition Context.cpp:1406
    +
    float getPrimitiveArea(uint UUID) const
    Method to return the surface area of a Primitive.
    Definition Context.cpp:7053
    +
    void getPrimitiveData(uint UUID, const char *label, int &data) const
    Get data associated with a primitive element.
    +
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition Context.cpp:1536
    +
    CompoundObject * getObjectPointer(uint ObjID) const
    Get a pointer to a Compound Object.
    Definition Context.cpp:2574
    +
    helios::vec3 getPatchCenter(uint UUID) const
    Get the Cartesian (x,y,z) center position of a patch element.
    Definition Context.cpp:1693
    +
    float randu()
    Draw a random number from a uniform distribution between 0 and 1.
    Definition Context.cpp:1178
    +
    void getGlobalData(const char *label, int &data) const
    Get global data value (scalar integer)
    +
    void setGlobalData(const char *label, const int &data)
    Add global data value (int)
    +
    void deleteObject(uint ObjID)
    Delete a single Compound Object from the context.
    Definition Context.cpp:2609
    +
    void setPrimitiveData(const uint &UUID, const char *label, const int &data)
    Add data value (int) associated with a primitive element.
    +
    bool doesPrimitiveExist(uint UUID) const
    Check if primitive exists for a given UUID.
    Definition Context.cpp:1659
    +
    SphericalCoord nullrotation
    Default null SphericalCoord that applies no rotation.
    Definition global.cpp:57
    +
    std::vector< uint > addBox(const vec3 &center, const vec3 &size, const int3 &subdiv)
    Add a rectangular prism tessellated with Patch primitives.
    Definition Context.cpp:6147
    +
    uint addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)
    Add a rectangular prism tessellated with Patch primitives.
    Definition Context.cpp:5000
    +
    std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition Context.cpp:5809
    +
    uint addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition Context.cpp:4550
    +
    float deg2rad(float deg)
    Convert degrees to radians.
    Definition global.cpp:576
    +
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition global.cpp:617
    +
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:241
    +
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition Context.cpp:1328
    +
    uint addPatch()
    Add new default Patch geometric primitive, which is centered at the origin (0,0,0),...
    Definition Context.cpp:1212
    +
    int2 make_int2(int x, int y)
    Make an int2 vector from two ints.
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    int3 make_int3(int X, int Y, int Z)
    Make an int3 vector from three ints.
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    +
    Camera calibration structure used for camera calibration tasks.
    +
    std::vector< uint > readROMCCanopy()
    Read ROMC canopy file (Used for self test).
    +
    Properties defining a radiation camera.
    +
    helios::int2 camera_resolution
    Camera sensor resolution (number of pixels) in the horizontal (.x) and vertical (....
    +
    float focal_plane_distance
    Distance from the viewing plane to the focal plane.
    +
    float HFOV
    Camera horizontal field of view in degrees.
    +
    float lens_diameter
    Diameter of the camera lens (lens_diameter = 0 gives a 'pinhole' camera with everything in focus)
    +
    float FOV_aspect_ratio
    Physical dimensions of the pixel array sensor in the horizontal (.x) and vertical (....
    +
    Vector of spherical coordinates (elevation,azimuth)
    +
    const float & elevation
    Elevation angle (radians)
    +
    float azimuth
    Azimuthal angle (radians)
    +
    Vector of two elements of type 'float'.
    +
    float x
    First element in vector.
    +
    float y
    Second element in vector.
    +
    Vector of three elements of type 'float'.
    +
    float x
    First element in vector.
    +
    float y
    Second element in vector.
    + diff --git a/doc/html/plugins_2solarposition_2src_2self_test_8cpp_source.html b/doc/html/plugins_2solarposition_2src_2self_test_8cpp_source.html index 1e815248e..4db693b6b 100644 --- a/doc/html/plugins_2solarposition_2src_2self_test_8cpp_source.html +++ b/doc/html/plugins_2solarposition_2src_2self_test_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    selfTest.cpp
    @@ -96,6 +108,7 @@
    2
    3using namespace helios;
    4
    +
    6
    7 std::cout << "Running solar position model self-test..." << std::flush;
    @@ -265,29 +278,31 @@
    171
    172
    173}
    +
    - -
    float getSunAzimuth() const
    Get the current sun azimuthal angle in radians for the current location. The sun angle is computed ba...
    -
    helios::Time getSunriseTime() const
    Get the approximate time of sunrise at the current location.
    -
    float getSunElevation() const
    Get the current sun elevation angle in radians for the current location. The sun angle is computed ba...
    -
    float getAmbientLongwaveFlux(float temperature_K, float humidity_rel) const
    Calculate the ambient (sky) longwave radiation flux.
    -
    void enableCloudCalibration(const std::string &timeseries_shortwave_flux_label_Wm2)
    Enable calibration of solar flux and diffuse fraction when possibility of clouds are present against ...
    -
    int selfTest() const
    Function to perform a self-test of model functions.
    Definition: selfTest.cpp:5
    -
    float calibrateTurbidityFromTimeseries(const std::string &timeseries_shortwave_flux_label_Wm2) const
    Calculate the turbidity value based on a timeseries of net radiation measurements.
    -
    Stores the state associated with simulation.
    Definition: Context.h:1882
    -
    void setDate(int day, int month, int year)
    Set simulation date by day, month, year.
    Definition: Context.cpp:1059
    -
    helios::Time getTime() const
    Get the simulation time.
    Definition: Context.cpp:1166
    -
    helios::Date getDate() const
    Get simulation date.
    Definition: Context.cpp:1099
    -
    void setTime(int minute, int hour)
    Set simulation time.
    Definition: Context.cpp:1136
    -
    void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
    Add a data point to timeseries of data.
    Definition: Context.cpp:1823
    -
    Time make_Time(int hour, int minute)
    Make a Time vector.
    -
    Date make_Date(int day, int month, int year)
    Make a Date vector.
    - - + +
    float getSunAzimuth() const
    Get the current sun azimuthal angle in radians for the current location. The sun angle is computed ba...
    +
    helios::Time getSunriseTime() const
    Get the approximate time of sunrise at the current location.
    +
    float getSunElevation() const
    Get the current sun elevation angle in radians for the current location. The sun angle is computed ba...
    +
    float getAmbientLongwaveFlux(float temperature_K, float humidity_rel) const
    Calculate the ambient (sky) longwave radiation flux.
    +
    void enableCloudCalibration(const std::string &timeseries_shortwave_flux_label_Wm2)
    Enable calibration of solar flux and diffuse fraction when possibility of clouds are present against ...
    +
    int selfTest() const
    Function to perform a self-test of model functions.
    Definition selfTest.cpp:5
    +
    float calibrateTurbidityFromTimeseries(const std::string &timeseries_shortwave_flux_label_Wm2) const
    Calculate the turbidity value based on a timeseries of net radiation measurements.
    +
    Stores the state associated with simulation.
    Definition Context.h:1882
    +
    void setDate(int day, int month, int year)
    Set simulation date by day, month, year.
    Definition Context.cpp:1059
    +
    helios::Time getTime() const
    Get the simulation time.
    Definition Context.cpp:1166
    +
    helios::Date getDate() const
    Get simulation date.
    Definition Context.cpp:1099
    +
    void setTime(int minute, int hour)
    Set simulation time.
    Definition Context.cpp:1136
    +
    void addTimeseriesData(const char *label, float value, const Date &date, const Time &time)
    Add a data point to timeseries of data.
    Definition Context.cpp:1823
    +
    Time make_Time(int hour, int minute)
    Make a Time vector.
    +
    Date make_Date(int day, int month, int year)
    Make a Date vector.
    + +
    + diff --git a/doc/html/plus.svg b/doc/html/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/html/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/html/plusd.svg b/doc/html/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/html/primitive_intersection_8cu.html b/doc/html/primitive_intersection_8cu.html index 083c603d7..536317397 100644 --- a/doc/html/primitive_intersection_8cu.html +++ b/doc/html/primitive_intersection_8cu.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    Functions | @@ -105,82 +117,82 @@ - - - - - + - + - + - + - + - + - + - + - + - + - + - +

    Functions

    +
     rtDeclareVariable (uint2, launch_index, rtLaunchIndex,)
     
    +
     rtDeclareVariable (Ray, ray, rtCurrentRay,)
     
    +
     rtDeclareVariable (PerRayData, prd, rtPayload,)
     
    +
     rtDeclareVariable (unsigned int, UUID, attribute UUID,)
     
    RT_PROGRAM void rectangle_intersect (int objID)
    RT_PROGRAM void rectangle_intersect (int objID)
     
    RT_PROGRAM void rectangle_bounds (int objID, float result[6])
    RT_PROGRAM void rectangle_bounds (int objID, float result[6])
     
    RT_PROGRAM void triangle_intersect (int objID)
    RT_PROGRAM void triangle_intersect (int objID)
     
    RT_PROGRAM void triangle_bounds (int objID, float result[6])
    RT_PROGRAM void triangle_bounds (int objID, float result[6])
     
    RT_PROGRAM void disk_intersect (int objID)
    RT_PROGRAM void disk_intersect (int objID)
     
    RT_PROGRAM void disk_bounds (int objID, float result[6])
    RT_PROGRAM void disk_bounds (int objID, float result[6])
     
    RT_PROGRAM void voxel_intersect (int objID)
    RT_PROGRAM void voxel_intersect (int objID)
     
    RT_PROGRAM void voxel_bounds (int objID, float result[6])
    RT_PROGRAM void voxel_bounds (int objID, float result[6])
     
    RT_PROGRAM void bbox_intersect (int objID)
    RT_PROGRAM void bbox_intersect (int objID)
     
    RT_PROGRAM void bbox_bounds (int objID, float result[6])
    RT_PROGRAM void bbox_bounds (int objID, float result[6])
     
    RT_PROGRAM void tile_intersect (int objID)
    RT_PROGRAM void tile_intersect (int objID)
     
    RT_PROGRAM void tile_bounds (int objID, float result[6])
    RT_PROGRAM void tile_bounds (int objID, float result[6])
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Variables

    rtBuffer< float3, 2 > patch_vertices
    rtBuffer< float3, 2 > patch_vertices
     
    rtBuffer< unsigned int, 1 > patch_UUID
    rtBuffer< unsigned int, 1 > patch_UUID
     
    rtBuffer< float3, 2 > triangle_vertices
    rtBuffer< float3, 2 > triangle_vertices
     
    rtBuffer< unsigned int, 1 > triangle_UUID
    rtBuffer< unsigned int, 1 > triangle_UUID
     
    rtBuffer< unsigned int, 1 > disk_UUID
    rtBuffer< unsigned int, 1 > disk_UUID
     
    rtBuffer< float3, 2 > tile_vertices
    rtBuffer< float3, 2 > tile_vertices
     
    rtBuffer< unsigned int, 1 > tile_UUID
    rtBuffer< unsigned int, 1 > tile_UUID
     
    rtBuffer< float3, 2 > voxel_vertices
    rtBuffer< float3, 2 > voxel_vertices
     
    rtBuffer< unsigned int, 1 > voxel_UUID
    rtBuffer< unsigned int, 1 > voxel_UUID
     
    rtBuffer< float3, 2 > bbox_vertices
    rtBuffer< float3, 2 > bbox_vertices
     
    rtBuffer< unsigned int, 1 > bbox_UUID
    rtBuffer< unsigned int, 1 > bbox_UUID
     
    rtBuffer< bool, 3 > maskdata
    rtBuffer< bool, 3 > maskdata
     
    rtBuffer< int2, 1 > masksize
    rtBuffer< int2, 1 > masksize
     
    rtBuffer< int, 1 > maskID
    rtBuffer< int, 1 > maskID
     
    rtBuffer< float2, 2 > uvdata
    rtBuffer< float2, 2 > uvdata
     
    rtBuffer< int, 1 > uvID
    rtBuffer< int, 1 > uvID
     
    rtBuffer< uint, 1 > objectID
    rtBuffer< uint, 1 > objectID
     
    rtBuffer< int2, 1 > object_subdivisions
    rtBuffer< int2, 1 > object_subdivisions
     
    rtBuffer< char, 1 > twosided_flag
    rtBuffer< char, 1 > twosided_flag
     

    Detailed Description

    @@ -200,19 +212,12 @@

    RT_PROGRAM void bbox_bounds ( - int  - objID, + int objID, - float  - result[6]  - - - - ) - + float result[6] )

    diff --git a/doc/html/primitive_intersection_8cu_source.html b/doc/html/primitive_intersection_8cu_source.html index 80ae7cbf2..b72e5886b 100644 --- a/doc/html/primitive_intersection_8cu_source.html +++ b/doc/html/primitive_intersection_8cu_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    primitiveIntersection.cu
    @@ -148,6 +160,7 @@
    68
    69//----------------- Rectangle Primitive ----------------------//
    70
    +
    73RT_PROGRAM void rectangle_intersect(int objID )
    74{
    75
    @@ -227,7 +240,9 @@
    149 }
    150
    151}
    +
    152
    +
    155RT_PROGRAM void rectangle_bounds (int objID, float result[6])
    156{
    157 optix::Aabb* aabb = (optix::Aabb*)result;
    @@ -239,9 +254,11 @@
    163 float3 max = make_float3( fmax(fmax(v0.x,v1.x),fmax(v2.x,v3.x)), fmax(fmax(v0.y,v1.y),fmax(v2.y,v3.y)), fmax(fmax(v0.z,v1.z),fmax(v2.z,v3.z)) );
    164 aabb->set(min, max);
    165}
    +
    166
    167//----------------- Triangle Primitive ----------------------//
    168
    +
    171RT_PROGRAM void triangle_intersect(int objID )
    172{
    173
    @@ -322,8 +339,10 @@
    248
    249
    250}
    +
    251
    252
    +
    254RT_PROGRAM void triangle_bounds (int objID, float result[6])
    255{
    256 optix::Aabb* aabb = (optix::Aabb*)result;
    @@ -334,9 +353,11 @@
    261 float3 mx = make_float3( fmax(fmax(v0.x,v1.x),v2.x), fmax(fmax(v0.y,v1.y),v2.y), fmax(fmax(v0.z,v1.z),v2.z) );
    262 aabb->set(mn, mx);
    263}
    +
    264
    265//----------------- Disk Primitive ----------------------//
    266
    +
    269RT_PROGRAM void disk_intersect(int objID )
    270{
    271
    @@ -369,8 +390,10 @@
    298 }
    299
    300}
    +
    301
    302
    +
    304RT_PROGRAM void disk_bounds (int objID, float result[6])
    305{
    306 optix::Aabb* aabb = (optix::Aabb*)result;
    @@ -378,9 +401,11 @@
    308 float3 mx = make_float3( 1, 1, 0.001f );
    309 aabb->set(mn, mx);
    310}
    +
    311
    312//----------------- Voxel Primitive ----------------------//
    313
    +
    316RT_PROGRAM void voxel_intersect(int objID )
    317{
    318
    @@ -465,7 +490,9 @@
    397 }
    398
    399}
    +
    400
    +
    403RT_PROGRAM void voxel_bounds (int objID, float result[6])
    404{
    405 optix::Aabb* aabb = (optix::Aabb*)result;
    @@ -473,9 +500,11 @@
    407 float3 max = voxel_vertices[ make_uint2(1, objID) ];
    408 aabb->set(min, max);
    409}
    +
    410
    411//----------------- Bounding Box Primitive ----------------------//
    412
    +
    415RT_PROGRAM void bbox_intersect(int objID )
    416{
    417
    @@ -521,7 +550,9 @@
    457 }
    458
    459}
    +
    460
    +
    463RT_PROGRAM void bbox_bounds (int objID, float result[6])
    464{
    465 optix::Aabb* aabb = (optix::Aabb*)result;
    @@ -533,9 +564,11 @@
    471 float3 max = make_float3( fmax(fmax(v0.x,v1.x),fmax(v2.x,v3.x)), fmax(fmax(v0.y,v1.y),fmax(v2.y,v3.y)), fmax(fmax(v0.z,v1.z),fmax(v2.z,v3.z)) );
    472 aabb->set(min, max);
    473}
    +
    474
    475//----------------- Tile Object ----------------------//
    476
    +
    479RT_PROGRAM void tile_intersect(int objID )
    480{
    481
    @@ -605,7 +638,9 @@
    545 }
    546
    547}
    +
    548
    +
    551RT_PROGRAM void tile_bounds (int objID, float result[6])
    552{
    553 optix::Aabb* aabb = (optix::Aabb*)result;
    @@ -617,25 +652,27 @@
    559 float3 max = make_float3( fmax(fmax(v0.x,v1.x),fmax(v2.x,v3.x)), fmax(fmax(v0.y,v1.y),fmax(v2.y,v3.y)), fmax(fmax(v0.z,v1.z),fmax(v2.z,v3.z)) );
    560 aabb->set(min, max);
    561}
    +
    -
    __device__ float d_magnitude(const float3 v)
    Function to calculate the magnitude of float3 vector on the GPU.
    -
    RT_PROGRAM void triangle_bounds(int objID, float result[6])
    -
    RT_PROGRAM void rectangle_bounds(int objID, float result[6])
    -
    RT_PROGRAM void triangle_intersect(int objID)
    -
    RT_PROGRAM void disk_intersect(int objID)
    -
    RT_PROGRAM void bbox_bounds(int objID, float result[6])
    -
    RT_PROGRAM void bbox_intersect(int objID)
    -
    RT_PROGRAM void tile_bounds(int objID, float result[6])
    -
    RT_PROGRAM void rectangle_intersect(int objID)
    -
    RT_PROGRAM void voxel_bounds(int objID, float result[6])
    -
    RT_PROGRAM void disk_bounds(int objID, float result[6])
    -
    RT_PROGRAM void voxel_intersect(int objID)
    -
    RT_PROGRAM void tile_intersect(int objID)
    - +
    __device__ float d_magnitude(const float3 v)
    Function to calculate the magnitude of float3 vector on the GPU.
    +
    RT_PROGRAM void triangle_bounds(int objID, float result[6])
    +
    RT_PROGRAM void rectangle_bounds(int objID, float result[6])
    +
    RT_PROGRAM void triangle_intersect(int objID)
    +
    RT_PROGRAM void disk_intersect(int objID)
    +
    RT_PROGRAM void bbox_bounds(int objID, float result[6])
    +
    RT_PROGRAM void bbox_intersect(int objID)
    +
    RT_PROGRAM void tile_bounds(int objID, float result[6])
    +
    RT_PROGRAM void rectangle_intersect(int objID)
    +
    RT_PROGRAM void voxel_bounds(int objID, float result[6])
    +
    RT_PROGRAM void disk_bounds(int objID, float result[6])
    +
    RT_PROGRAM void voxel_intersect(int objID)
    +
    RT_PROGRAM void tile_intersect(int objID)
    +
    + diff --git a/doc/html/radiation_2include_2random_8h_source.html b/doc/html/radiation_2include_2random_8h_source.html index 1bf21c210..8e2d5cca3 100644 --- a/doc/html/radiation_2include_2random_8h_source.html +++ b/doc/html/radiation_2include_2random_8h_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    random.h
    @@ -206,11 +218,12 @@
    112{
    113 return seed ^ frame;
    114}
    -
    float sum(const std::vector< float > &vect)
    Sum of a vector of floats.
    Definition: global.cpp:1069
    +
    float sum(const std::vector< float > &vect)
    Sum of a vector of floats.
    Definition global.cpp:1069
    + diff --git a/doc/html/radiation__beers_law.html b/doc/html/radiation__beers_law.html index 78633e636..38af27112 100644 --- a/doc/html/radiation__beers_law.html +++ b/doc/html/radiation__beers_law.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    -
    Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy
    +
    Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy

    In this tutorial, we will consider radiation transfer in a homogeneous, horizontally infinite canopy. This canonical canopy case will allow for comparison against theoretical values computed from Beer's law. Our goal will be to simulate the fraction of photosynthetically active radiation (PAR) absorbed by the canopy and the fraction of sunlit/shaded leaf area, and compare the 3D simulated values against Beer's law. This tutorial will integrate the Canopy Generator plug-in to create the canopy geometry, and the Voxel Intersection plug-in to slice leaves that lie on the canopy boundary.

    @@ -311,7 +323,8 @@

    +
    diff --git a/doc/html/radiation_basics.html b/doc/html/radiation_basics.html index 8ff07c4a2..e304bd13c 100644 --- a/doc/html/radiation_basics.html +++ b/doc/html/radiation_basics.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    -
    Tutorial 10: Radiation model basics - tree light interception
    +
    Tutorial 10: Radiation model basics - tree light interception

    This tutorial will illustrate how to simulate and calculate photosynthetically active radiation (PAR) interception of a tree canopy using the radiation model plug-in.

    @@ -187,7 +199,8 @@

    +
    diff --git a/doc/html/ray_generation_8cu.html b/doc/html/ray_generation_8cu.html index cefec6f13..be7604838 100644 --- a/doc/html/ray_generation_8cu.html +++ b/doc/html/ray_generation_8cu.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Functions | @@ -102,102 +114,102 @@ - - - - - - - - - - - - - - - - - + - + - + - +

    Functions

    +
     rtDeclareVariable (rtObject, top_object,,)
     
    +
     rtDeclareVariable (unsigned int, direct_ray_type,,)
     
    +
     rtDeclareVariable (unsigned int, diffuse_ray_type,,)
     
    +
     rtDeclareVariable (unsigned int, camera_ray_type,,)
     
    +
     rtDeclareVariable (unsigned int, pixel_label_ray_type,,)
     
    +
     rtDeclareVariable (unsigned int, random_seed,,)
     
    +
     rtDeclareVariable (unsigned int, launch_offset,,)
     
    +
     rtDeclareVariable (uint3, launch_index, rtLaunchIndex,)
     
    +
     rtDeclareVariable (uint3, launch_dim, rtLaunchDim,)
     
    +
     rtDeclareVariable (unsigned int, Nsources,,)
     
    +
     rtDeclareVariable (float3, camera_position,,)
     
    +
     rtDeclareVariable (float2, camera_direction,,)
     
    +
     rtDeclareVariable (float, camera_lens_diameter,,)
     
    +
     rtDeclareVariable (float, FOV_aspect_ratio,,)
     
    +
     rtDeclareVariable (float, camera_focal_length,,)
     
    +
     rtDeclareVariable (float, camera_viewplane_length,,)
     
    RT_PROGRAM void direct_raygen ()
    RT_PROGRAM void direct_raygen ()
     
    RT_PROGRAM void diffuse_raygen ()
    RT_PROGRAM void diffuse_raygen ()
     
    RT_PROGRAM void camera_raygen ()
    RT_PROGRAM void camera_raygen ()
     
    RT_PROGRAM void pixel_label_raygen ()
    RT_PROGRAM void pixel_label_raygen ()
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Variables

    rtBuffer< bool, 3 > maskdata
    rtBuffer< bool, 3 > maskdata
     
    rtBuffer< int2, 1 > masksize
    rtBuffer< int2, 1 > masksize
     
    rtBuffer< int, 1 > maskID
    rtBuffer< int, 1 > maskID
     
    rtBuffer< float2, 2 > uvdata
    rtBuffer< float2, 2 > uvdata
     
    rtBuffer< int, 1 > uvID
    rtBuffer< int, 1 > uvID
     
    rtBuffer< float, 2 > transform_matrix
    rtBuffer< float, 2 > transform_matrix
     
    rtBuffer< unsigned int, 1 > primitive_type
    rtBuffer< unsigned int, 1 > primitive_type
     
    rtBuffer< float, 1 > primitive_area
    rtBuffer< float, 1 > primitive_area
     
    rtBuffer< char, 1 > twosided_flag
    rtBuffer< char, 1 > twosided_flag
     
    rtBuffer< float, 1 > radiation_out_top
    rtBuffer< float, 1 > radiation_out_top
     
    rtBuffer< float, 1 > radiation_out_bottom
    rtBuffer< float, 1 > radiation_out_bottom
     
    rtBuffer< uint, 1 > objectID
    rtBuffer< uint, 1 > objectID
     
    rtBuffer< int2, 1 > object_subdivisions
    rtBuffer< int2, 1 > object_subdivisions
     
    rtBuffer< uint, 1 > primitiveID
    rtBuffer< uint, 1 > primitiveID
     
    rtBuffer< float, 1 > source_fluxes
    rtBuffer< float, 1 > source_fluxes
     
    rtBuffer< float3, 1 > source_positions
    rtBuffer< float3, 1 > source_positions
     
    rtBuffer< float3, 1 > source_rotations
    rtBuffer< float3, 1 > source_rotations
     
    rtBuffer< float2, 1 > source_widths
    rtBuffer< float2, 1 > source_widths
     
    rtBuffer< unsigned int, 1 > source_types
    rtBuffer< unsigned int, 1 > source_types
     

    Detailed Description

    @@ -217,7 +229,7 @@

    RT_PROGRAM void camera_raygen ( - ) + ) @@ -236,7 +248,7 @@

    RT_PROGRAM void diffuse_raygen ( - ) + ) @@ -255,7 +267,7 @@

    RT_PROGRAM void direct_raygen ( - ) + ) @@ -274,7 +286,7 @@

    RT_PROGRAM void pixel_label_raygen ( - ) + ) @@ -592,7 +604,8 @@

    +

    diff --git a/doc/html/ray_generation_8cu_source.html b/doc/html/ray_generation_8cu_source.html index 50705b7c8..99255ed38 100644 --- a/doc/html/ray_generation_8cu_source.html +++ b/doc/html/ray_generation_8cu_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    rayGeneration.cu
    @@ -817,8 +829,8 @@
    737 // Map sample to pixel
    738 float half_HFOV_radians = atanf(0.5f/camera_viewplane_length);
    739 float multiplier = tanf(half_HFOV_radians/FOV_aspect_ratio) / tanf(half_HFOV_radians);
    -
    740 sp.y = (-0.5f * PPointsRatioy + (ii+Rx)/float(camera_resolution.x));
    -
    741 sp.z = (0.5f * PPointsRatiox - (jj+Ry)/float(camera_resolution.y))*multiplier;
    +
    740 sp.y = (-0.5f * PPointsRatioy + (ii+Rx)/float(camera_resolution.x));
    +
    741 sp.z = (0.5f * PPointsRatiox - (jj+Ry)/float(camera_resolution.y))*multiplier;
    742 sp.x = camera_viewplane_length;
    743
    744 // *** Determine point 'p' on focal plane that passes through the lens center (0,0) and pixel sample (view direction coordinate aligned) *** //
    @@ -881,8 +893,8 @@
    801 // Map sample to center of pixel
    802 float half_HFOV_radians = atanf(0.5f/camera_viewplane_length);
    803 float multiplier = tanf(half_HFOV_radians/FOV_aspect_ratio) / tanf(half_HFOV_radians);
    -
    804 sp.y = (-0.5f + (ii+0.5f)/float(camera_resolution.x));
    -
    805 sp.z = (0.5f - (jj+0.5f)/float(camera_resolution.y))*multiplier;
    +
    804 sp.y = (-0.5f + (ii+0.5f)/float(camera_resolution.x));
    +
    805 sp.z = (0.5f - (jj+0.5f)/float(camera_resolution.y))*multiplier;
    806 sp.x = camera_viewplane_length;
    807
    808
    @@ -922,24 +934,25 @@
    842
    843}
    -
    __device__ void d_transformPoint(const float(&transform_matrix)[16], float3 &v)
    Function to transform a 3D point based on current affine transformation matrix on the GPU.
    -
    __device__ float d_magnitude(const float3 v)
    Function to calculate the magnitude of float3 vector on the GPU.
    -
    __device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
    -
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:241
    -
    float asin_safe(float x)
    arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:247
    -
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    - -
    unsigned char source_ID
    Numerical identifier for radiation source corresponding to each ray.
    Definition: RayTracing.cu.h:44
    -
    double strength
    "strength" or amount of energy associated with the ray.
    Definition: RayTracing.cu.h:29
    -
    float area
    Area of primitive (note for voxels, this is area density)
    Definition: RayTracing.cu.h:35
    -
    uint origin_UUID
    UUID of primitive from which ray originated.
    Definition: RayTracing.cu.h:31
    -
    uint seed
    Seed for curand random number generator.
    Definition: RayTracing.cu.h:37
    -
    unsigned char periodic_depth
    Number of periodic boundary intersections for ray.
    Definition: RayTracing.cu.h:39
    -
    bool face
    Face of primitive from which ray was launched (true=top, false=bottom)
    Definition: RayTracing.cu.h:33
    +
    __device__ void d_transformPoint(const float(&transform_matrix)[16], float3 &v)
    Function to transform a 3D point based on current affine transformation matrix on the GPU.
    +
    __device__ float d_magnitude(const float3 v)
    Function to calculate the magnitude of float3 vector on the GPU.
    +
    __device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
    +
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:241
    +
    float asin_safe(float x)
    arcsine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:247
    +
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    + +
    unsigned char source_ID
    Numerical identifier for radiation source corresponding to each ray.
    +
    double strength
    "strength" or amount of energy associated with the ray.
    +
    float area
    Area of primitive (note for voxels, this is area density)
    +
    uint origin_UUID
    UUID of primitive from which ray originated.
    +
    uint seed
    Seed for curand random number generator.
    +
    unsigned char periodic_depth
    Number of periodic boundary intersections for ray.
    +
    bool face
    Face of primitive from which ray was launched (true=top, false=bottom)
    +
    diff --git a/doc/html/ray_hit_8cu.html b/doc/html/ray_hit_8cu.html index ea736cc3c..8a88e95a1 100644 --- a/doc/html/ray_hit_8cu.html +++ b/doc/html/ray_hit_8cu.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Functions | @@ -103,119 +115,119 @@ - - - - - - - - - - - - - - + - + - + - + - + - + - + - +

    Functions

    +
     rtDeclareVariable (optix::Ray, ray, rtCurrentRay,)
     
    +
     rtDeclareVariable (float, t_hit, rtIntersectionDistance,)
     
    +
     rtDeclareVariable (PerRayData, prd, rtPayload,)
     
    +
     rtDeclareVariable (uint3, launch_dim, rtLaunchDim,)
     
    +
     rtDeclareVariable (rtObject, top_object,,)
     
    +
     rtDeclareVariable (unsigned int, UUID, attribute UUID,)
     
    +
     rtDeclareVariable (unsigned int, Nbands,,)
     
    +
     rtDeclareVariable (unsigned int, Nprimitives,,)
     
    +
     rtDeclareVariable (float2, periodic_flag,,)
     
    +
     rtDeclareVariable (unsigned int, camera_ID,,)
     
    +
     rtDeclareVariable (unsigned int, Ncameras,,)
     
    +
     rtDeclareVariable (unsigned int, Nsources,,)
     
    +
     rtDeclareVariable (float2, camera_direction,,)
     
    RT_PROGRAM void closest_hit_direct ()
    RT_PROGRAM void closest_hit_direct ()
     
    RT_PROGRAM void closest_hit_diffuse ()
    RT_PROGRAM void closest_hit_diffuse ()
     
    RT_PROGRAM void closest_hit_camera ()
    RT_PROGRAM void closest_hit_camera ()
     
    RT_PROGRAM void closest_hit_pixel_label ()
    RT_PROGRAM void closest_hit_pixel_label ()
     
    RT_PROGRAM void miss_direct ()
    RT_PROGRAM void miss_direct ()
     
    RT_PROGRAM void miss_diffuse ()
    RT_PROGRAM void miss_diffuse ()
     
    RT_PROGRAM void miss_camera ()
    RT_PROGRAM void miss_camera ()
     
    RT_PROGRAM void miss_pixel_label ()
    RT_PROGRAM void miss_pixel_label ()
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Variables

    rtBuffer< bool, 1 > band_launch_flag
    rtBuffer< bool, 1 > band_launch_flag
     
    rtBuffer< float, 1 > diffuse_flux
    rtBuffer< float, 1 > diffuse_flux
     
    rtBuffer< float, 1 > diffuse_extinction
    rtBuffer< float, 1 > diffuse_extinction
     
    rtBuffer< float3, 1 > diffuse_peak_dir
    rtBuffer< float3, 1 > diffuse_peak_dir
     
    rtBuffer< float, 1 > diffuse_dist_norm
    rtBuffer< float, 1 > diffuse_dist_norm
     
    rtBuffer< float, 1 > rho
    rtBuffer< float, 1 > rho
     
    rtBuffer< float, 1 > tau
    rtBuffer< float, 1 > tau
     
    rtBuffer< float, 1 > rho_cam
    rtBuffer< float, 1 > rho_cam
     
    rtBuffer< float, 1 > tau_cam
    rtBuffer< float, 1 > tau_cam
     
    rtBuffer< unsigned int, 1 > primitive_type
    rtBuffer< unsigned int, 1 > primitive_type
     
    rtBuffer< float, 1 > radiation_in
    rtBuffer< float, 1 > radiation_in
     
    rtBuffer< float, 1 > radiation_in_camera
    rtBuffer< float, 1 > radiation_in_camera
     
    rtBuffer< float, 1 > radiation_out_top
    rtBuffer< float, 1 > radiation_out_top
     
    rtBuffer< float, 1 > radiation_out_bottom
    rtBuffer< float, 1 > radiation_out_bottom
     
    rtBuffer< float, 1 > scatter_buff_top
    rtBuffer< float, 1 > scatter_buff_top
     
    rtBuffer< float, 1 > scatter_buff_bottom
    rtBuffer< float, 1 > scatter_buff_bottom
     
    rtBuffer< float, 1 > scatter_buff_top_cam
    rtBuffer< float, 1 > scatter_buff_top_cam
     
    rtBuffer< float, 1 > scatter_buff_bottom_cam
    rtBuffer< float, 1 > scatter_buff_bottom_cam
     
    rtBuffer< unsigned int, 1 > camera_pixel_label
    rtBuffer< unsigned int, 1 > camera_pixel_label
     
    rtBuffer< float, 1 > camera_pixel_depth
    rtBuffer< float, 1 > camera_pixel_depth
     
    rtBuffer< float, 1 > source_fluxes
    rtBuffer< float, 1 > source_fluxes
     
    rtBuffer< float3, 1 > source_positions
    rtBuffer< float3, 1 > source_positions
     
    rtBuffer< float2, 1 > source_widths
    rtBuffer< float2, 1 > source_widths
     
    rtBuffer< unsigned int, 1 > source_types
    rtBuffer< unsigned int, 1 > source_types
     
    rtBuffer< float, 1 > Rsky
    rtBuffer< float, 1 > Rsky
     
    rtBuffer< float, 2 > transform_matrix
    rtBuffer< float, 2 > transform_matrix
     
    rtBuffer< float3, 2 > bbox_vertices
    rtBuffer< float3, 2 > bbox_vertices
     
    rtBuffer< uint, 1 > objectID
    rtBuffer< uint, 1 > objectID
     

    Detailed Description

    @@ -235,7 +247,7 @@

    RT_PROGRAM void closest_hit_camera ( - ) + ) @@ -254,7 +266,7 @@

    RT_PROGRAM void closest_hit_diffuse ( - ) + ) @@ -273,7 +285,7 @@

    RT_PROGRAM void closest_hit_direct ( - ) + ) @@ -292,7 +304,7 @@

    RT_PROGRAM void closest_hit_pixel_label ( - ) + ) @@ -311,7 +323,7 @@

    RT_PROGRAM void miss_camera ( - ) + ) @@ -330,7 +342,7 @@

    RT_PROGRAM void miss_diffuse ( - ) + ) @@ -349,7 +361,7 @@

    RT_PROGRAM void miss_direct ( - ) + ) @@ -368,7 +380,7 @@

    RT_PROGRAM void miss_pixel_label ( - ) + ) @@ -830,7 +842,8 @@

    +

    diff --git a/doc/html/ray_hit_8cu_source.html b/doc/html/ray_hit_8cu_source.html index ddbc16d60..bbddcf5fd 100644 --- a/doc/html/ray_hit_8cu_source.html +++ b/doc/html/ray_hit_8cu_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    rayHit.cu
    @@ -490,7 +502,7 @@
    411//
    412// strength_spec += spec * powf( abs(dot(specular_direction,ray.direction)), 1.7f) *1.f/float(launch_dim.x*launch_dim.y);
    413//
    -
    415//
    +
    415//
    416// }
    417
    418 // absorption
    @@ -718,17 +730,18 @@
    640
    641}
    -
    __device__ void d_transformPoint(const float(&transform_matrix)[16], float3 &v)
    Function to transform a 3D point based on current affine transformation matrix on the GPU.
    -
    __device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
    -
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition: global.cpp:241
    -
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    - -
    double strength
    "strength" or amount of energy associated with the ray.
    Definition: RayTracing.cu.h:29
    -
    unsigned char periodic_depth
    Number of periodic boundary intersections for ray.
    Definition: RayTracing.cu.h:39
    +
    __device__ void d_transformPoint(const float(&transform_matrix)[16], float3 &v)
    Function to transform a 3D point based on current affine transformation matrix on the GPU.
    +
    __device__ float3 d_rotatePoint(const float3 &position, const float &theta, const float &phi)
    +
    float acos_safe(float x)
    arccosine function to handle cases when round-off errors cause an argument <-1 or >1,...
    Definition global.cpp:241
    +
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    + +
    double strength
    "strength" or amount of energy associated with the ray.
    +
    unsigned char periodic_depth
    Number of periodic boundary intersections for ray.
    + diff --git a/doc/html/resize.js b/doc/html/resize.js new file mode 100644 index 000000000..178d03bcb --- /dev/null +++ b/doc/html/resize.js @@ -0,0 +1,147 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initResizable(treeview) { + let sidenav,navtree,content,header,footer,barWidth=6; + const RESIZE_COOKIE_NAME = ''+'width'; + + function resizeWidth() { + const sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(sidenavWidth)+"px"}); + } + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + function restoreWidth(navWidth) { + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + } + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight(treeview) { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + if (treeview) + { + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + } + else + { + contentHeight = windowHeight - headerHeight; + } + content.css({height:contentHeight + "px"}); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + function collapseExpand() { + let newWidth; + if (sidenav.width()>0) { + newWidth=0; + } else { + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + newWidth = (width>250 && width<$(window).width()) ? width : 250; + } + restoreWidth(newWidth); + const sidenavWidth = $(sidenav).outerWidth(); + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (!treeview) { +// title = $("#titlearea"); +// titleH = $(title).height(); +// let animating = false; +// content.on("scroll", function() { +// slideOpts = { duration: 200, +// step: function() { +// contentHeight = $(window).height() - header.outerHeight(); +// content.css({ height : contentHeight + "px" }); +// }, +// done: function() { animating=false; } +// }; +// if (content.scrollTop()>titleH && title.css('display')!='none' && !animating) { +// title.slideUp(slideOpts); +// animating=true; +// } else if (content.scrollTop()<=titleH && title.css('display')=='none' && !animating) { +// title.slideDown(slideOpts); +// animating=true; +// } +// }); + } else { + navtree = $("#nav-tree"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + } + $(window).resize(function() { resizeHeight(treeview); }); + if (treeview) + { + const device = navigator.userAgent.toLowerCase(); + const touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + if (width) { restoreWidth(width); } else { resizeWidth(); } + } + resizeHeight(treeview); + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + if (treeview) + { + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + // workaround for firefox + $("body").css({overflow: "hidden"}); + } + $(window).on('load',function() { resizeHeight(treeview); }); +} +/* @license-end */ diff --git a/doc/html/s__hull__pro_8h_source.html b/doc/html/s__hull__pro_8h_source.html index fb4376546..75ccd762e 100644 --- a/doc/html/s__hull__pro_8h_source.html +++ b/doc/html/s__hull__pro_8h_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    s_hull_pro.h
    @@ -124,6 +136,7 @@
    30 */
    31
    32
    +
    33struct Triad
    34{
    35 int a,b, c;
    @@ -152,6 +165,7 @@
    58 return *this;
    59 };
    60};
    +
    61
    62
    63
    @@ -162,6 +176,7 @@
    68*/
    69
    70
    +
    71struct Shx
    72{
    73 int id, trid;
    @@ -185,6 +200,7 @@
    91 };
    92
    93};
    +
    94
    95
    96// sort into descending order (for use in corner responce ranking).
    @@ -200,6 +216,7 @@
    106};
    107
    108
    +
    109struct Dupex
    110{
    111 int id;
    @@ -218,6 +235,7 @@
    124 return *this;
    125 };
    126};
    +
    127
    128
    129
    @@ -257,13 +275,14 @@
    163
    164
    165#endif
    - -
    Definition: s_hull_pro.h:72
    - + + +
    + diff --git a/doc/html/search/all_0.js b/doc/html/search/all_0.js index 5dd1fd1aa..1070107fd 100644 --- a/doc/html/search/all_0.js +++ b/doc/html/search/all_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['_25lidar_20point_20cloud_20plugin_20documentation_0',['%LiDAR Point Cloud Plugin Documentation',['../_li_d_a_r_doc.html',1,'PlugIns']]], - ['_25visualizer_20plugin_20documentation_1',['%Visualizer Plugin Documentation',['../_visualizer_doc.html',1,'PlugIns']]] + ['0_20theory_0',['0. Theory',['../radiation__beers_law.html#tutorial11_theory',1,'']]], + ['0_3a_20context_20self_20test_20tutorial_1',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/all_1.js b/doc/html/search/all_1.js index 20367565b..5231c9e18 100644 --- a/doc/html/search/all_1.js +++ b/doc/html/search/all_1.js @@ -1,87 +1,11 @@ var searchData= [ - ['a_0',['a',['../structhelios_1_1_r_g_b_acolor.html#a1941a63762f40fe1aabc5bb863a7aa1e',1,'helios::RGBAcolor']]], - ['acos_5fsafe_1',['acos_safe',['../group__functions.html#ga9f732ec5c2153020247c879034f81432',1,'helios']]], - ['addbasestemshoot_2',['addBaseStemShoot',['../class_plant_architecture.html#a32e88ebd4d0bb468f6c0a2655833bff6',1,'PlantArchitecture']]], - ['addbox_3',['addBox',['../group__compoundobjects.html#gaad6b1c9613d3e1e70519e145166c8879',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv)'],['../group__compoundobjects.html#ga9a00c2f632e5625524dc8cd7587b771e',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color)'],['../group__compoundobjects.html#gac9d9b47750abac76a5630d2218db5861',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile)'],['../group__compoundobjects.html#ga73e5eea0a4841336b41ed2848327c12a',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals)'],['../group__compoundobjects.html#ga8d7f04707bc24f049cb60212c3ba29d2',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile, bool reverse_normals)']]], - ['addboxobject_4',['addBoxObject',['../group__compoundobjects.html#gac29332e0332233ea902a94e4822f739f',1,'helios::Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals)'],['../group__compoundobjects.html#gab2549ca65442372287b30c874b0c2b1c',1,'helios::Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)'],['../group__compoundobjects.html#ga71aa11aa723683d18807fda36397f7e3',1,'helios::Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color)'],['../group__compoundobjects.html#ga23b4391b46d9c4b8f9452fc7a0812ce2',1,'helios::Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile)'],['../group__compoundobjects.html#gab3b99bd7bee16911a3f47173dba06cbc',1,'helios::Context::addBoxObject(vec3 center, const vec3 &size, const int3 &subdiv, const char *texturefile, bool reverse_normals)']]], - ['addcheckerboard_5',['addCheckerboard',['../struct_camera_calibration.html#ab101fe425760d29aab58073d626be460',1,'CameraCalibration']]], - ['addchildshoot_6',['addChildShoot',['../class_plant_architecture.html#a0832e7e5e15d64c3ee52ea3d640dee27',1,'PlantArchitecture']]], - ['addcollimatedradiationsource_7',['addCollimatedRadiationSource',['../class_radiation_model.html#adea522844d6fe85df2f1dc3b78f514eb',1,'RadiationModel::addCollimatedRadiationSource()'],['../class_radiation_model.html#aaa7660215edce07be51d4dae3cf4ffb1',1,'RadiationModel::addCollimatedRadiationSource(const helios::SphericalCoord &direction)'],['../class_radiation_model.html#a768434aa4802835d706a07e29f8500fd',1,'RadiationModel::addCollimatedRadiationSource(const helios::vec3 &direction)']]], - ['addcolorboard_8',['addColorboard',['../struct_camera_calibration.html#ad1c0a4605b3b3ea355b9f3dee1706ec9',1,'CameraCalibration']]], - ['addcone_9',['addCone',['../group__compoundobjects.html#gae6dfe37103da5348a8e09541e6832579',1,'helios::Context::addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)'],['../group__compoundobjects.html#gaa90786c814a02a713c73e3f2063f7b15',1,'helios::Context::addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, RGBcolor &color)'],['../group__compoundobjects.html#gadaded2acc62c6bf577b840097cf63715',1,'helios::Context::addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char *texturefile)']]], - ['addconeobject_10',['addConeObject',['../group__compoundobjects.html#gaff21895b974a64df8fd78b3604d7c404',1,'helios::Context::addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char *texturefile)'],['../group__compoundobjects.html#ga5dfcb74a1406d4a2ee15c251dedcd744',1,'helios::Context::addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const RGBcolor &color)'],['../group__compoundobjects.html#ga91e46b44e9d7ece5a7e75e739cac4610',1,'helios::Context::addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)']]], - ['addcoordinateaxes_11',['addCoordinateAxes',['../class_visualizer.html#a309ce95c73229321d06d52f219b30510',1,'Visualizer::addCoordinateAxes(const helios::vec3 &origin, const helios::vec3 &length, const std::string &sign)'],['../class_visualizer.html#a831a69f2320707924c582e27d29a0ee5',1,'Visualizer::addCoordinateAxes()']]], - ['adddefaultcheckerboard_12',['addDefaultCheckerboard',['../struct_camera_calibration.html#a73e6dfb0a8a3a68beeed498797310702',1,'CameraCalibration']]], - ['adddefaultcolorboard_13',['addDefaultColorboard',['../struct_camera_calibration.html#a4b1c43adcd27bc075327a239f31f03b8',1,'CameraCalibration']]], - ['adddisk_14',['addDisk',['../group__compoundobjects.html#ga3c0d84f0ade9148214d0a7ec5e574aeb',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)'],['../group__compoundobjects.html#gac774b33822ae284009dc761146e37670',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)'],['../group__compoundobjects.html#gaf323d883bfc3392b3817fce85a5205ae',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__compoundobjects.html#gaee1c741715ce7367c8198e573b9684ec',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)'],['../group__compoundobjects.html#gac196d3c8356561ef33b6e41c80cf8b4a',1,'helios::Context::addDisk(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)'],['../group__compoundobjects.html#ga9e43e2dc65df7b0aa93e140881fd2bfa',1,'helios::Context::addDisk(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__compoundobjects.html#gacb1267c95cec56efb0150e292c12f24c',1,'helios::Context::addDisk(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texturefile)'],['../group__compoundobjects.html#gaad3d5c21579728fa839c6a95514991bb',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)']]], - ['adddiskbycenter_15',['addDiskByCenter',['../class_visualizer.html#acd7256a79fdfe2b37f270bec45bb3568',1,'Visualizer::addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a1f4ef2ddcab0f1ed6bc1b4378b25e2df',1,'Visualizer::addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a2886b6f91cd376bd83a945bc1b551f01',1,'Visualizer::addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const char *texture_file, CoordinateSystem coordFlag)']]], - ['adddiskobject_16',['addDiskObject',['../group__compoundobjects.html#ga064d0343ca8556d8a6a00c7cdce3bf0d',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)'],['../group__compoundobjects.html#ga826e790ed5999e168c22ddcc7e57e514',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)'],['../group__compoundobjects.html#gadcc9c858b2c3afe1430ff4013f69b780',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)'],['../group__compoundobjects.html#gaed3cc3a47ff86ea9dfcf70cd9b295b23',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__compoundobjects.html#ga4fb358731a06c9eafc267e9e6f522577',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)'],['../group__compoundobjects.html#ga8b77c42881f1b6d4a6abb712256a87cd',1,'helios::Context::addDiskObject(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)'],['../group__compoundobjects.html#ga259d1db05876a3dbf7a37ac5612935c4',1,'helios::Context::addDiskObject(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__compoundobjects.html#ga9edafbc21c49d4f76294279a2818cfb4',1,'helios::Context::addDiskObject(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texturefile)']]], - ['adddiskradiationsource_17',['addDiskRadiationSource',['../class_radiation_model.html#a8ef94c0bf6286d3e64d7d8c8b96f33bc',1,'RadiationModel']]], - ['addepicormicshoot_18',['addEpicormicShoot',['../class_plant_architecture.html#ade786dc8bb429eb033d29ccf9df6b254',1,'PlantArchitecture']]], - ['addgrapecluster_19',['addGrapeCluster',['../class_canopy_generator.html#a6c8cbbd68ca9bd84d42324622cfba0d9',1,'CanopyGenerator']]], - ['addgrid_20',['addGrid',['../class_li_d_a_rcloud.html#a755ab5b665c80e30a49450ccfa1592d1',1,'LiDARcloud']]], - ['addgridcell_21',['addGridCell',['../class_li_d_a_rcloud.html#a60a1e6e5eeb76df93e99c0bbaa971b93',1,'LiDARcloud::addGridCell(const helios::vec3 &center, const helios::vec3 &global_anchor, const helios::vec3 &size, const helios::vec3 &global_size, float rotation, const helios::int3 &global_ijk, const helios::int3 &global_count)'],['../class_li_d_a_rcloud.html#ac850f71f86e2872a78d8ff9bc6df6d08',1,'LiDARcloud::addGridCell(const helios::vec3 &center, const helios::vec3 &size, float rotation)']]], - ['addgridtovisualizer_22',['addGridToVisualizer',['../class_li_d_a_rcloud.html#a2b7b76c26d6dd976bf37c0595b761507',1,'LiDARcloud::addGridToVisualizer()'],['../class_aerial_li_d_a_rcloud.html#afc659e4837184ee76ce5b165ea2515df',1,'AerialLiDARcloud::addGridToVisualizer()']]], - ['addgridwireframe_23',['addGridWireFrame',['../class_visualizer.html#a6cbeaf6c6b6e877106173bc42a018d10',1,'Visualizer']]], - ['addgridwireframetovisualizer_24',['addGridWireFrametoVisualizer',['../class_li_d_a_rcloud.html#af8c99daa924206b8172bb3bb1657e251',1,'LiDARcloud']]], - ['addhitpoint_25',['addHitPoint',['../class_li_d_a_rcloud.html#a244a1de12e8f6a3518b8715086c28e46',1,'LiDARcloud::addHitPoint()'],['../class_aerial_li_d_a_rcloud.html#a746b984566c871ff37d87cd52ed046a2',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)'],['../class_aerial_li_d_a_rcloud.html#a9ba0abbd9a178fbac01e5fcadfafe2b3',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction)'],['../class_aerial_li_d_a_rcloud.html#a8fc59bf1e7995b74ebc260dc31e66edc',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color)'],['../class_aerial_li_d_a_rcloud.html#a2caa78d1f8a3b4136ae270c9b741eaf7',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const std::map< std::string, float > data)'],['../class_aerial_li_d_a_rcloud.html#a2de9fafdab55721b424abf420b15c1b2',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color, const std::map< std::string, float > data)'],['../class_li_d_a_rcloud.html#a6f01d5c6bdab78ee7bc08c90ba5f2217',1,'LiDARcloud::addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)'],['../class_li_d_a_rcloud.html#ae1955f2181dab90400fcabedb8997c71',1,'LiDARcloud::addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const helios::RGBcolor &color)'],['../class_li_d_a_rcloud.html#aed09112c241e9d60aea781c9684a2633',1,'LiDARcloud::addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const std::map< std::string, double > &data)'],['../class_li_d_a_rcloud.html#a794f9370ba56a29651a95709c528a6a4',1,'LiDARcloud::addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const helios::RGBcolor &color, const std::map< std::string, double > &data)']]], - ['addhitstovisualizer_26',['addHitsToVisualizer',['../class_aerial_li_d_a_rcloud.html#a2e72b963be7631462f852103f415eeae',1,'AerialLiDARcloud::addHitsToVisualizer()'],['../class_li_d_a_rcloud.html#a6292d1b6fce7638a256e090608c8c309',1,'LiDARcloud::addHitsToVisualizer(Visualizer *visualizer, uint pointsize, const char *color_value) const'],['../class_li_d_a_rcloud.html#a2102dd4711658414cca10fd40a66af18',1,'LiDARcloud::addHitsToVisualizer(Visualizer *visualizer, uint pointsize) const'],['../class_aerial_li_d_a_rcloud.html#a36a118297008063457035ef2e281b6cc',1,'AerialLiDARcloud::addHitsToVisualizer()']]], - ['addleafreconstructiontocontext_27',['addLeafReconstructionToContext',['../class_li_d_a_rcloud.html#ab2b1545809e3537b4e7e803acc8c13c1',1,'LiDARcloud::addLeafReconstructionToContext(helios::Context *context, const helios::int2 &subpatches) const'],['../class_li_d_a_rcloud.html#aeca8578d8b5ecbc92fa669c612196f8c',1,'LiDARcloud::addLeafReconstructionToContext(helios::Context *context) const']]], - ['addleafreconstructiontovisualizer_28',['addLeafReconstructionToVisualizer',['../class_li_d_a_rcloud.html#a9c9cff3d1f5a68814ff2121d3b12d9b8',1,'LiDARcloud']]], - ['addline_29',['addLine',['../class_visualizer.html#a48a8390c82a8ee31172827b9aa378eb3',1,'Visualizer::addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)'],['../class_visualizer.html#ae287d6fdfab2cac58d0c1be890eff057',1,'Visualizer::addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBAcolor &color, uint linewidth, CoordinateSystem coordFlag)']]], - ['addpatch_30',['addPatch',['../group__primitives.html#ga953a329d019e3c91948b139215c748af',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)'],['../group__primitives.html#ga542e67cc428fb707452c216091a7f24f',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file, const helios::vec2 &uv_center, const helios::vec2 &uv_size)'],['../classhelios_1_1_context.html#a5118575675393453c5d927e66d59293e',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__primitives.html#gaf4aec42f3f104b7c71150577ef129659',1,'helios::Context::addPatch()'],['../group__primitives.html#gafaae593d52d284c5aab98e29cee0cd76',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size)'],['../group__primitives.html#ga148090c69c7b04bbfbae4eed2443a235',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)'],['../classhelios_1_1_context.html#a7ead8162aab12a399925aa89a6f9007c',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)']]], - ['addplantinstance_31',['addPlantInstance',['../class_plant_architecture.html#a046541b573d8e03845a2038370cd6665',1,'PlantArchitecture']]], - ['addpoint_32',['addPoint',['../class_visualizer.html#a228b710936fbf5e2bda8701c717b4019',1,'Visualizer::addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)'],['../class_visualizer.html#a4767d80ec00f90b36b9547da4bcc3d77',1,'Visualizer::addPoint(const helios::vec3 &position, const helios::RGBAcolor &color, uint pointsize, CoordinateSystem coordFlag)']]], - ['addpolymeshobject_33',['addPolymeshObject',['../group__compoundobjects.html#gababf99153757527880fe3866cc23fd1b',1,'helios::Context']]], - ['addradiationband_34',['addRadiationBand',['../class_radiation_model.html#ad0a4554dfa67054804de534229805054',1,'RadiationModel::addRadiationBand()'],['../class_energy_balance_model.html#a7ce12c9b4baf734d49562fe45e7eb272',1,'EnergyBalanceModel::addRadiationBand(const char *band)'],['../class_energy_balance_model.html#a4de3ab8046e5926fa022d877a11953c3',1,'EnergyBalanceModel::addRadiationBand(const std::vector< std::string > &bands)'],['../class_radiation_model.html#a066dd10dcf1ebd8902b197bb6812b5e1',1,'RadiationModel::addRadiationBand(const std::string &label, float wavelength_min, float wavelength_max)']]], - ['addradiationcamera_35',['addRadiationCamera',['../class_radiation_model.html#aedf80552eaf2bf6a8544dcb2c72cb331',1,'RadiationModel::addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)'],['../class_radiation_model.html#ab4509110acf603466cbed2ad05fcc1a3',1,'RadiationModel::addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::SphericalCoord &viewing_direction, const CameraProperties &camera_properties, uint antialiasing_samples)']]], - ['addreconstructedtrianglegroupstocontext_36',['addReconstructedTriangleGroupsToContext',['../class_li_d_a_rcloud.html#a503c74fc549e5c3b25a5f5bf2d6a8955',1,'LiDARcloud']]], - ['addrectanglebycenter_37',['addRectangleByCenter',['../class_visualizer.html#acd331a705d12dcec86131612cf433e88',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a48e6d180f3751da810b8ff1ec02a4cfe',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#af86d3df98bbfa845e9c6bb4d8945429d',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file, CoordinateSystem coordFlag)'],['../class_visualizer.html#a8ca1611eccfefb20cdfb2a686a78bd00',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const char *texture_file, CoordinateSystem coordFlag)'],['../class_visualizer.html#af0d855cd55a8ae6f9734ddaf7c02ef24',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)']]], - ['addrectanglebyvertices_38',['addRectangleByVertices',['../class_visualizer.html#ac778d07346ddf94b7341181ed4640e28',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a342a0315efa1aaf7844f704fed0244bd',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a28ed082b9f1dea0e81e28535a23b1521',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const char *texture_file, CoordinateSystem coordFlag)'],['../class_visualizer.html#afe1be9b4d0cfa14298e162d59f5749bf',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const char *texture_file, const std::vector< helios::vec2 > &uvs, CoordinateSystem coordFlag)'],['../class_visualizer.html#acbcf904d891cc28d56a12cb9672c6893',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const char *texture_file, const std::vector< helios::vec2 > &uvs, CoordinateSystem coordFlag)'],['../class_visualizer.html#a546e454af8cdfee4db207ddbc3abcd7e',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const char *texture_file, CoordinateSystem coordFlag)'],['../class_visualizer.html#a7ff15e66eb2ef54b7cc0c03deda255fe',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)'],['../class_visualizer.html#af11f22cfc12cf5abad785bc0b8d875d2',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBAcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)']]], - ['addrectangleradiationsource_39',['addRectangleRadiationSource',['../class_radiation_model.html#abb39d616c6b37bd56b2ea3014a19c6bf',1,'RadiationModel']]], - ['addscan_40',['addScan',['../class_li_d_a_rcloud.html#abbe448db446aa64f5ce5a923c597eae8',1,'LiDARcloud::addScan()'],['../class_aerial_li_d_a_rcloud.html#a2912db8a137ffa0add4261e63c6d72c2',1,'AerialLiDARcloud::addScan()']]], - ['addskydomebycenter_41',['addSkyDomeByCenter',['../class_visualizer.html#abc14ae2206a8b46c9724cc6aac06b44b',1,'Visualizer']]], - ['addsphere_42',['addSphere',['../group__compoundobjects.html#ga2b10346e874dd539c742102b385c9370',1,'helios::Context::addSphere(uint Ndivs, const vec3 &center, float radius, const char *texturefile)'],['../group__compoundobjects.html#ga645ee8b5e829c08e8e3549eceea815cc',1,'helios::Context::addSphere(uint Ndivs, const vec3 &center, float radius, const RGBcolor &color)'],['../group__compoundobjects.html#gac5df0d862dd8d6783edc037804c452bf',1,'helios::Context::addSphere(uint Ndivs, const vec3 &center, float radius)']]], - ['addspherebycenter_43',['addSphereByCenter',['../class_visualizer.html#a6ce8c982a4576eb8d8fd5dc9be3a8ddf',1,'Visualizer::addSphereByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#aff40781cf9b38f2f23e7fc998351105a',1,'Visualizer::addSphereByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag)']]], - ['addsphereobject_44',['addSphereObject',['../group__compoundobjects.html#gac1787b97a96f2c4d21d13ed130b263d0',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, const vec3 &radius)'],['../group__compoundobjects.html#gae7cb6682b28087b6d1d68c12d6814a23',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, float radius)'],['../group__compoundobjects.html#gac0836f609016ffc2726788a252832003',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, float radius, const RGBcolor &color)'],['../group__compoundobjects.html#ga6c66a36c17dbf43376909fdc1f4df826',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, float radius, const char *texturefile)'],['../group__compoundobjects.html#ga2b30de9aefefbbac2400f79dfc7c74fb',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, const vec3 &radius, const RGBcolor &color)'],['../group__compoundobjects.html#gaa0f43d59a2c0341dfe3ab97814c37962',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, const vec3 &radius, const char *texturefile)']]], - ['addsphereradiationsource_45',['addSphereRadiationSource',['../class_radiation_model.html#a44fbd20dd6ee50666f8d693dbba89822',1,'RadiationModel']]], - ['addsunsphereradiationsource_46',['addSunSphereRadiationSource',['../class_radiation_model.html#a8edb972e53fecddc21f0c23d08e355d0',1,'RadiationModel::addSunSphereRadiationSource()'],['../class_radiation_model.html#ab6220aa1f1e5ad425df93c9abdef3d07',1,'RadiationModel::addSunSphereRadiationSource(const helios::SphericalCoord &sun_direction)'],['../class_radiation_model.html#a5ffce4db04c85848d55c895f9aedc5f5',1,'RadiationModel::addSunSphereRadiationSource(const helios::vec3 &sun_direction)']]], - ['addtextboxbycenter_47',['addTextboxByCenter',['../class_visualizer.html#a2e139e1e6446b90f29d9e280fe3111db',1,'Visualizer']]], - ['addtile_48',['addTile',['../group__compoundobjects.html#ga8d8cdafde1ebfaebf8edd27aa36ae82b',1,'helios::Context::addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char *texturefile)'],['../group__compoundobjects.html#gae15ba3f5741d27c52c43a35eec6c866b',1,'helios::Context::addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)'],['../group__compoundobjects.html#ga48feb2165a7adfbb11cb402c7db56d4b',1,'helios::Context::addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color)']]], - ['addtileobject_49',['addTileObject',['../group__compoundobjects.html#gae5c1fa3bae1ff170c14a4378fb8abd95',1,'helios::Context::addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)'],['../group__compoundobjects.html#gae846d22b6cba8b50582ace8509c16e12',1,'helios::Context::addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color)'],['../group__compoundobjects.html#gad5c5cd832ce014a4862d72ccf52e2100',1,'helios::Context::addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char *texturefile)']]], - ['addtimeseriesdata_50',['addTimeseriesData',['../group__timeseries.html#gab4e83017576a164eaa7c61cd0812d8a2',1,'helios::Context']]], - ['addtriangle_51',['addTriangle',['../class_visualizer.html#acc411df8e5d30efd31e69c46b4ce9875',1,'Visualizer::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a0b45fc611a368a72d7f62e27aa4d4bfa',1,'Visualizer::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, CoordinateSystem coordFlag)'],['../class_visualizer.html#a7c57ae2c58acb076e43848d650912733',1,'Visualizer::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../group__primitives.html#ga2a78a464a4c7ef3375a0ced2f1005b77',1,'helios::Context::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)'],['../group__primitives.html#gafedf69d3c13704eac0b1cdbaedfc2f5c',1,'helios::Context::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color)'],['../group__primitives.html#ga6c541321006498aa976afd7a1a65cafb',1,'helios::Context::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color)'],['../group__primitives.html#ga6d8025b542a52a8683f76ae292934c76',1,'helios::Context::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2)'],['../class_visualizer.html#a30fa7fb8430e7e8e93e283710ea26a37',1,'Visualizer::addTriangle()']]], - ['addtrianglestocontext_52',['addTrianglesToContext',['../class_li_d_a_rcloud.html#a65c36191d1f0f82b77ebd2ffa2fe3821',1,'LiDARcloud']]], - ['addtrianglestovisualizer_53',['addTrianglesToVisualizer',['../class_li_d_a_rcloud.html#a55d1d5c311e4cfa45fa47f36ac875e7f',1,'LiDARcloud::addTrianglesToVisualizer(Visualizer *visualizer, uint gridcell) const'],['../class_li_d_a_rcloud.html#a11d8d20197aa909080d70954c97395e6',1,'LiDARcloud::addTrianglesToVisualizer(Visualizer *visualizer) const']]], - ['addtrunkreconstructiontocontext_54',['addTrunkReconstructionToContext',['../class_li_d_a_rcloud.html#a4af78b2f167575f641e867f0f0688dd1',1,'LiDARcloud']]], - ['addtrunkreconstructiontovisualizer_55',['addTrunkReconstructionToVisualizer',['../class_li_d_a_rcloud.html#a9fa20f56e1dbb38de35a48a599cda711',1,'LiDARcloud::addTrunkReconstructionToVisualizer(Visualizer *visualizer, const helios::RGBcolor &trunk_color) const'],['../class_li_d_a_rcloud.html#aa23c198a2c7492b8b6c865a42971a93d',1,'LiDARcloud::addTrunkReconstructionToVisualizer(Visualizer *visualizer) const']]], - ['addtube_56',['addTube',['../group__compoundobjects.html#gad1d3bab869a03fe7c35d33cf8a03841a',1,'helios::Context::addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)'],['../group__compoundobjects.html#ga622745a32ac6545e607b2dc18812dba9',1,'helios::Context::addTube(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const std::vector< RGBcolor > &color)'],['../group__compoundobjects.html#ga90ce3e295347f72bbd84322e491f7626',1,'helios::Context::addTube(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile)']]], - ['addtubeobject_57',['addTubeObject',['../group__compoundobjects.html#gad109dcdc4ae24e03945a8d39c0dc7cc5',1,'helios::Context::addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile, const std::vector< float > &textureuv_vfrac)'],['../group__compoundobjects.html#gac244937b4bb6a2e57e6c2b25e59a741f',1,'helios::Context::addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile)'],['../group__compoundobjects.html#ga0bb97aacf2830f27c1ad9b35609477c9',1,'helios::Context::addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const std::vector< RGBcolor > &color)'],['../group__compoundobjects.html#ga51f79fece15fee384255237359563a18',1,'helios::Context::addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)']]], - ['addvoxel_58',['addVoxel',['../classhelios_1_1_context.html#a16ca40cdd79ff77f7fab6506f0e06895',1,'helios::Context::addVoxel(const helios::vec3 &center, const helios::vec3 &size, const float &rotation, const helios::RGBAcolor &color)'],['../classhelios_1_1_context.html#a722c6b3018a5a4cd7a1ccdb06fe21c4b',1,'helios::Context::addVoxel(const helios::vec3 &center, const helios::vec3 &size, const float &rotation, const helios::RGBcolor &color)'],['../group__primitives.html#ga5c3476d33e4c6125276bcae114b49b10',1,'helios::Context::addVoxel(const helios::vec3 &center, const helios::vec3 &size)'],['../group__primitives.html#gab03110bd9b0a7d4bdfedfe1e7881b6b0',1,'helios::Context::addVoxel(const helios::vec3 &center, const helios::vec3 &size, const float &rotation)']]], - ['addvoxelbycenter_59',['addVoxelByCenter',['../class_visualizer.html#a2c289bcb13fa935f78f2d032fa852b90',1,'Visualizer::addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a4b814571e4dccc0e550d3f184a48fab8',1,'Visualizer::addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)']]], - ['advancetime_60',['advanceTime',['../class_plant_architecture.html#a48c8a01f66fb38357bddc9eac35173e4',1,'PlantArchitecture::advanceTime(uint plantID, float time_step_days)'],['../class_plant_architecture.html#a30eb9cf338188dd725852d63919a9aa4',1,'PlantArchitecture::advanceTime(int time_step_years, float time_step_days)'],['../class_plant_architecture.html#a1df979fc7a8523961ae37d934be5bfa7',1,'PlantArchitecture::advanceTime(float time_step_days)']]], - ['aerial_20_25lidar_20point_20cloud_20plugin_20documentation_61',['Aerial %LiDAR Point Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'PlugIns']]], - ['aerialhitpoint_62',['AerialHitPoint',['../struct_aerial_hit_point.html',1,'']]], - ['aeriallidar_2ecpp_63',['AerialLiDAR.cpp',['../_aerial_li_d_a_r_8cpp.html',1,'']]], - ['aeriallidar_2ecu_64',['AerialLiDAR.cu',['../_aerial_li_d_a_r_8cu.html',1,'']]], - ['aeriallidar_2eh_65',['AerialLiDAR.h',['../_aerial_li_d_a_r_8h.html',1,'']]], - ['aeriallidarcloud_66',['AerialLiDARcloud',['../class_aerial_li_d_a_rcloud.html#acbcca37e844dc4e5e72c703c619d8962',1,'AerialLiDARcloud::AerialLiDARcloud()'],['../class_aerial_li_d_a_rcloud.html',1,'AerialLiDARcloud']]], - ['aerialscanmetadata_67',['AerialScanMetadata',['../struct_aerial_scan_metadata.html',1,'AerialScanMetadata'],['../struct_aerial_scan_metadata.html#a7335ab6e76b88c50520e3fd205d4c575',1,'AerialScanMetadata::AerialScanMetadata()']]], - ['age_68',['age',['../struct_phytomer.html#adca1542efc0d16f0117d533f86c849e5',1,'Phytomer']]], - ['aggregateprimitivedataproduct_69',['aggregatePrimitiveDataProduct',['../classhelios_1_1_context.html#a66b69dc68ed0a21353485eff97257047',1,'helios::Context']]], - ['aggregateprimitivedatasum_70',['aggregatePrimitiveDataSum',['../classhelios_1_1_context.html#aad6f828c598f574cab637a263562bea2',1,'helios::Context']]], - ['appendphytomer_71',['appendPhytomer',['../struct_shoot.html#a624619a8a5106774aa25dc99ba06cd41',1,'Shoot']]], - ['appendphytomertoshoot_72',['appendPhytomerToShoot',['../class_plant_architecture.html#a122fad48603e2e0f2fe6d870c691bfd1',1,'PlantArchitecture']]], - ['appendshoot_73',['appendShoot',['../class_plant_architecture.html#a25a69b3eee4eab6501a8bedc777b8c55',1,'PlantArchitecture']]], - ['appendtubesegment_74',['appendTubeSegment',['../classhelios_1_1_tube.html#aac259b1a564be7ac9cc11bd14ab8cf82',1,'helios::Tube::appendTubeSegment(const helios::vec3 &node_position, float node_radius, const helios::RGBcolor &node_color)'],['../classhelios_1_1_tube.html#a7cb8cf830e6017d29c7396c28846f83b',1,'helios::Tube::appendTubeSegment(const helios::vec3 &node_position, float node_radius, const char *texturefile, const helios::vec2 &textureuv_ufrac)'],['../classhelios_1_1_context.html#a646f6a5449870a191fe3d60db849b190',1,'helios::Context::appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)'],['../classhelios_1_1_context.html#a9d097ed9d14b9d575e494bf000ce33ec',1,'helios::Context::appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float node_radius, const char *texturefile, const helios::vec2 &textureuv_ufrac)']]], - ['approxsame_75',['approxSame',['../class_voxel_intersection.html#a7b67a822c84c1086e3d0a8e05114c4bc',1,'VoxelIntersection::approxSame(float a, float b, float absTol, float relTol)'],['../class_voxel_intersection.html#af78fea330c0c2e38e3a02db732ed7dd7',1,'VoxelIntersection::approxSame(helios::vec3 a, helios::vec3 b, float absTol)']]], - ['area_76',['area',['../struct_per_ray_data.html#a3bf336505e26e0fe714a4347524f7407',1,'PerRayData']]], - ['areobjectprimitivescomplete_77',['areObjectPrimitivesComplete',['../classhelios_1_1_context.html#ad1ad7d600c2d436ae48d218c1aa19668',1,'helios::Context']]], - ['areprimitivescomplete_78',['arePrimitivesComplete',['../classhelios_1_1_compound_object.html#a74e4a36175853a8e14153678c035accb',1,'helios::CompoundObject']]], - ['asin_5fsafe_79',['asin_safe',['../group__functions.html#gac400d6d37ff2494ec592a9f0a17ee9ab',1,'helios']]], - ['assets_2ecpp_80',['Assets.cpp',['../_assets_8cpp.html',1,'']]], - ['atan2_5f2pi_81',['atan2_2pi',['../group__functions.html#ga37a64a73b3318125a778bb77c29f7dcf',1,'helios']]], - ['axisrotation_82',['AxisRotation',['../struct_axis_rotation.html',1,'']]], - ['azimuth_83',['azimuth',['../structhelios_1_1_spherical_coord.html#af63b7ee76a5d57bf5881079eff52aa59',1,'helios::SphericalCoord']]] + ['1_20choosing_20the_20image_0',['1. Choosing the image',['../_making_masks.html#One',1,'']]], + ['1_20declare_20and_20initialize_20the_20visualizer_20class_1',['Step 1. Declare and initialize the Visualizer class',['../visualizer_basics.html#vis_step1',1,'']]], + ['1_20model_20geometry_20creation_2',['1 Model geometry creation',['../radiation_basics.html#Tutorial10_geom',1,'1. Model geometry creation'],['../radiation__beers_law.html#tutorial11_geom',1,'1. Model geometry creation']]], + ['1_20the_20polhausen_20equation_20laminar_20flat_20plate_20forced_20convection_3',['1. The Polhausen Equation (Laminar Flat Plate, Forced Convection)',['../_b_l_conductance_doc.html#BLC1',1,'']]], + ['10_3a_20radiation_20model_20basics_20tree_20light_20interception_4',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['11_3a_20light_20interception_20and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_5',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['1987_20model_20theory_6',['Ball, Woodrow, Berry (1987) Model Theory',['../_stomatal_doc.html#BWBTheory',1,'']]], + ['1_3a_20helios_20vector_20types_20tutorial_7',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/all_10.js b/doc/html/search/all_10.js index 98c13c3b3..ea8251879 100644 --- a/doc/html/search/all_10.js +++ b/doc/html/search/all_10.js @@ -1,6 +1,40 @@ var searchData= [ - ['querytimeseriesdata_0',['queryTimeseriesData',['../group__timeseries.html#ga8845155a8f5df1e6db968b78f5a5fb18',1,'helios::Context::queryTimeseriesData(const char *label, const Date &date, const Time &time) const'],['../group__timeseries.html#gab52bde84b96d02a4d928a610794ab146',1,'helios::Context::queryTimeseriesData(const char *label) const'],['../group__timeseries.html#gadffd45c3717c9255d035ce098349ca74',1,'helios::Context::queryTimeseriesData(const char *label, uint index) const']]], - ['querytimeseriesdate_1',['queryTimeseriesDate',['../group__timeseries.html#gae15d53565b2a699d212de636318290b8',1,'helios::Context']]], - ['querytimeseriestime_2',['queryTimeseriesTime',['../group__timeseries.html#ga520b33fad86d1514ceb5eeafa52c81ef',1,'helios::Context']]] + ['hastexture_0',['hasTexture',['../classhelios_1_1_compound_object.html#a547a3a56f24fdaf541d12dc74776318e',1,'helios::CompoundObject']]], + ['hastransparencychannel_1',['hasTransparencyChannel',['../classhelios_1_1_texture.html#a44d0d36861494725a85bfbc100f398da',1,'helios::Texture']]], + ['heat_20storage_2',['Unsteady model with heat storage',['../_energy_balance_doc.html#EBRunUS',1,'']]], + ['height_20maps_3',['2D raster height maps',['../_aerial_li_d_a_r_doc.html#AerialRasters',1,'']]], + ['helios_4',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['helios_20context_5',['The Helios Context',['../_overview.html#ContextOverview',1,'']]], + ['helios_20dependencies_6',['Installing Helios Dependencies',['../_dependent_software.html#Automatically',1,'']]], + ['helios_20documentation_20v1_203_2026_7',['Helios Documentation v1.3.26',['../index.html',1,'']]], + ['helios_20prerequisites_8',['Helios Prerequisites',['../_overview.html#PrereqsHelios',1,'']]], + ['helios_20programming_9',['Which platform to use for Helios programming?',['../_dependent_software.html#WhichPlatform',1,'']]], + ['helios_20vector_20types_20tutorial_10',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]], + ['helios_5fruntime_5ferror_11',['helios_runtime_error',['../global_8h.html#a672182e7d8beb63c7cf256fa8294dc86',1,'helios']]], + ['helios_5ftype_5fdouble_12',['HELIOS_TYPE_DOUBLE',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a520daf05a1b3086aabd6cbe6a712c1c3',1,'helios']]], + ['helios_5ftype_5ffloat_13',['HELIOS_TYPE_FLOAT',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3ae8cb6622468bda0078b0bcfde7677ba0',1,'helios']]], + ['helios_5ftype_5fint_14',['HELIOS_TYPE_INT',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a7a7039490fc92b5d76ca18b70563ed52',1,'helios']]], + ['helios_5ftype_5fint2_15',['HELIOS_TYPE_INT2',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3ad586d734313fa5492db5b8cc84d9eabd',1,'helios']]], + ['helios_5ftype_5fint3_16',['HELIOS_TYPE_INT3',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a28e69c60e380496c8c35892e76ee4ad3',1,'helios']]], + ['helios_5ftype_5fint4_17',['HELIOS_TYPE_INT4',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3aa6e12ea3a9160f59a1208f7cbb6c1ce7',1,'helios']]], + ['helios_5ftype_5fstring_18',['HELIOS_TYPE_STRING',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a7c1f526f519f173e5931fd73b78ccbb3',1,'helios']]], + ['helios_5ftype_5fuint_19',['HELIOS_TYPE_UINT',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3aa8887c77409aaaecc3cd1a097488776f',1,'helios']]], + ['helios_5ftype_5fvec2_20',['HELIOS_TYPE_VEC2',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a6269d91d936a3d60a8a763ec122ba233',1,'helios']]], + ['helios_5ftype_5fvec3_21',['HELIOS_TYPE_VEC3',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a8da4db5333fb4d726d17ad82300c9d6c',1,'helios']]], + ['helios_5ftype_5fvec4_22',['HELIOS_TYPE_VEC4',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3ade0fe2a24f299ca147b95a0eebe43e5d',1,'helios']]], + ['helios_5fvector_5ftypes_2eh_23',['helios_vector_types.h',['../helios__vector__types_8h.html',1,'']]], + ['heliosdatatype_24',['HeliosDataType',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3',1,'helios']]], + ['hfov_25',['HFOV',['../struct_camera_properties.html#ac1419dfa651f1f8343f5fb5a2fad2148',1,'CameraProperties']]], + ['hideobject_26',['hideObject',['../classhelios_1_1_context.html#a983606fef144a460d4b987032a8ad005',1,'helios::Context']]], + ['hideprimitive_27',['hidePrimitive',['../classhelios_1_1_context.html#a8c68c830335865618227463fbb9d2663',1,'helios::Context']]], + ['hidewatermark_28',['hideWatermark',['../class_visualizer.html#a90d0c5630620d30d062c0af4bace0a99',1,'Visualizer']]], + ['hit_20point_20data_29',['Hit point data',['../_li_d_a_r_doc.html#AddHits',1,'']]], + ['hit_20point_20triangulation_30',['Hit point triangulation',['../_li_d_a_r_doc.html#LiDARtri',1,'']]], + ['hitpoint_31',['HitPoint',['../struct_hit_point.html',1,'']]], + ['hittable_32',['HitTable',['../class_hit_table.html',1,'']]], + ['homogeneous_20canopy_33',['Spatially Homogeneous Canopy',['../_canopy_generator_doc.html#CGenHomogeneous',1,'']]], + ['homogeneous_20canopy_34',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['homogeneouscanopyparameters_35',['HomogeneousCanopyParameters',['../struct_homogeneous_canopy_parameters.html',1,'HomogeneousCanopyParameters'],['../struct_homogeneous_canopy_parameters.html#ad5f583b7f483df9fdaf86bbdaf0e5a92',1,'HomogeneousCanopyParameters::HomogeneousCanopyParameters()'],['../struct_homogeneous_canopy_parameters.html#aac168c38c41f7c11830c36707a744620',1,'HomogeneousCanopyParameters::HomogeneousCanopyParameters(const pugi::xml_node canopy_node)']]], + ['hour_36',['hour',['../structhelios_1_1_time.html#a6ec639cf61cf283c5e999d152d27839f',1,'helios::Time']]] ]; diff --git a/doc/html/search/all_11.js b/doc/html/search/all_11.js index c4df5203a..69e4f0c34 100644 --- a/doc/html/search/all_11.js +++ b/doc/html/search/all_11.js @@ -1,51 +1,79 @@ var searchData= [ - ['r_0',['r',['../structhelios_1_1_r_g_b_acolor.html#a15af7f1c4d0e5e23a7ec2488fe0964df',1,'helios::RGBAcolor::r()'],['../structhelios_1_1_r_g_bcolor.html#a3e16659a90c69e6043c33c113b2fffe8',1,'helios::RGBcolor::r()']]], - ['rad2deg_1',['rad2deg',['../group__functions.html#ga0b9a2dac200293044d7e2ae1c03a3140',1,'helios']]], - ['radiation_20model_20plugin_20documentation_2',['Radiation Model Plugin Documentation',['../_radiation_doc.html',1,'PlugIns']]], - ['radiationband_3',['RadiationBand',['../struct_radiation_band.html',1,'RadiationBand'],['../struct_radiation_band.html#a24a8c605f4553fd80e47f8cb7dd77744',1,'RadiationBand::RadiationBand()']]], - ['radiationcamera_4',['RadiationCamera',['../struct_radiation_camera.html',1,'']]], - ['radiationmodel_5',['RadiationModel',['../class_radiation_model.html',1,'RadiationModel'],['../class_radiation_model.html#acfcbd32e59e2b2728dabde1c7fa74329',1,'RadiationModel::RadiationModel()']]], - ['radiationmodel_2ecpp_6',['RadiationModel.cpp',['../_radiation_model_8cpp.html',1,'']]], - ['radiationmodel_2eh_7',['RadiationModel.h',['../_radiation_model_8h.html',1,'']]], - ['radiationsource_8',['RadiationSource',['../struct_radiation_source.html',1,'RadiationSource'],['../struct_radiation_source.html#a1d16744d95956e385117f14a10597985',1,'RadiationSource::RadiationSource(const helios::vec3 &position)'],['../struct_radiation_source.html#a6b8bd173e37c83e1534580ab919d5446',1,'RadiationSource::RadiationSource(const helios::vec3 &position, float width)'],['../struct_radiation_source.html#a13db4b713a7fa670799c426676bc771f',1,'RadiationSource::RadiationSource(const helios::vec3 &position, float position_scaling_factor, float width, float flux_scaling_factor)'],['../struct_radiation_source.html#a858a27adea32f97904b4bceb3eb253ce',1,'RadiationSource::RadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)'],['../struct_radiation_source.html#aedecf6adc5056dc241007993e375f260',1,'RadiationSource::RadiationSource(const helios::vec3 &position, float width, const helios::vec3 &rotation)']]], - ['radiationsourcetype_9',['RadiationSourceType',['../_radiation_model_8h.html#a87dc3655cd959da2cde2b3b72e844579',1,'RadiationModel.h']]], - ['radiativepropertiesinitialized_10',['radiativepropertiesinitialized',['../struct_radiation_band.html#ac4e08f643cd7c5d85a02a475c7c9bdbf',1,'RadiationBand']]], - ['radius_11',['radius',['../structhelios_1_1_spherical_coord.html#a017f345f74aeaa332cdd36b66b22c906',1,'helios::SphericalCoord']]], - ['randn_12',['randn',['../classhelios_1_1_context.html#a1792e2ad0a31efec76fecd1554e0aa07',1,'helios::Context::randn()'],['../classhelios_1_1_context.html#a903aa1e3e016c522cac528c0377c0fe4',1,'helios::Context::randn(float mean, float stddev)']]], - ['randomparameter_5ffloat_13',['RandomParameter_float',['../struct_random_parameter__float.html',1,'RandomParameter_float'],['../struct_random_parameter__float.html#aaf1fc58b78ae982d6065c5cfbd87a1dd',1,'RandomParameter_float::RandomParameter_float(std::minstd_rand0 *rand_generator)'],['../struct_random_parameter__float.html#ab0d3df0a653e4325a6485b7a31450365',1,'RandomParameter_float::RandomParameter_float(float val)'],['../struct_random_parameter__float.html#a7a817ca20cc05025ce5d84fc0603d41b',1,'RandomParameter_float::RandomParameter_float()']]], - ['randomparameter_5fint_14',['RandomParameter_int',['../struct_random_parameter__int.html',1,'']]], - ['randu_15',['randu',['../classhelios_1_1_context.html#a4caa001e21890bca8bb952e1206153dc',1,'helios::Context::randu()'],['../classhelios_1_1_context.html#a2f7842a2902bce8a8978a19aa9862a70',1,'helios::Context::randu(float min, float max)'],['../classhelios_1_1_context.html#a4dfca3b6d71d2016661da51c38cac565',1,'helios::Context::randu(int min, int max)'],['../group__functions.html#ga06cb0bc53a3903c6c487dd524bc2315e',1,'helios::randu()'],['../group__functions.html#gad8ccb7b3d22876e477b80d5c2bdb94c1',1,'helios::randu(int imin, int imax)']]], - ['raygeneration_2ecu_16',['rayGeneration.cu',['../ray_generation_8cu.html',1,'']]], - ['rayhit_2ecu_17',['rayHit.cu',['../ray_hit_8cu.html',1,'']]], - ['raytracing_2ecu_2eh_18',['RayTracing.cu.h',['../_ray_tracing_8cu_8h.html',1,'']]], - ['rc2direction_19',['rc2direction',['../struct_scan_metadata.html#ae28f6042e5eae2adaaacbeaaa6109a8c',1,'ScanMetadata']]], - ['read_5fjpeg_5ffile_20',['read_JPEG_file',['../_visualizer_8h.html#a1ffc8a34ba2895084c71e95ed615d10a',1,'read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width): Visualizer.cpp'],['../_visualizer_8cpp.html#a1ffc8a34ba2895084c71e95ed615d10a',1,'read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width): Visualizer.cpp']]], - ['read_5fpng_5ffile_21',['read_png_file',['../_visualizer_8h.html#a0e60a86e54784ea9f2b178ce9540713f',1,'read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width): Visualizer.cpp'],['../_visualizer_8cpp.html#a0e60a86e54784ea9f2b178ce9540713f',1,'read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width): Visualizer.cpp']]], - ['readcontextxml_22',['readContextXML',['../class_aerial_li_d_a_rcloud.html#a146bfba2241154ce7fa958bf7c797153',1,'AerialLiDARcloud']]], - ['readjpeg_23',['readJPEG',['../global_8h.html#a248b712fb0f1b77074a223179850a6dd',1,'helios']]], - ['readparametersfromxml_24',['readParametersFromXML',['../struct_goblet_grapevine_parameters.html#a79f3f790ebb458d89fdb26d485d718da',1,'GobletGrapevineParameters::readParametersFromXML()'],['../struct_white_spruce_canopy_parameters.html#a2dbc61de09c55a8dfdd9a490d2ef3be3',1,'WhiteSpruceCanopyParameters::readParametersFromXML()'],['../struct_tomato_parameters.html#a94bd8a46a188d88039685eb4576c3e8b',1,'TomatoParameters::readParametersFromXML()'],['../struct_strawberry_parameters.html#a621e67abb2a43aac9714f6e8fde5aa96',1,'StrawberryParameters::readParametersFromXML()'],['../struct_walnut_canopy_parameters.html#a888acadc0f54524dc3aabe152a7a1679',1,'WalnutCanopyParameters::readParametersFromXML()'],['../struct_sorghum_canopy_parameters.html#a616f622ac8a7387b0ec94509340ccd18',1,'SorghumCanopyParameters::readParametersFromXML()'],['../struct_bean_parameters.html#ac37cccbcb4b68058724f2c09bde4007e',1,'BeanParameters::readParametersFromXML()'],['../struct_unilateral_grapevine_parameters.html#a78630bdc04ab711e118de436e4e03b20',1,'UnilateralGrapevineParameters::readParametersFromXML()'],['../struct_base_canopy_parameters.html#a929e1fee86e6408cf42ca398510fc672',1,'BaseCanopyParameters::readParametersFromXML()'],['../struct_homogeneous_canopy_parameters.html#a199c70328138eb4af32e22fb974b8783',1,'HomogeneousCanopyParameters::readParametersFromXML()'],['../struct_spherical_crowns_canopy_parameters.html#addf82e2fd57315136b747531ecb4200a',1,'SphericalCrownsCanopyParameters::readParametersFromXML()'],['../struct_conical_crowns_canopy_parameters.html#adcca81e7a3f0f5791d83cf38317603d3',1,'ConicalCrownsCanopyParameters::readParametersFromXML()'],['../struct_base_grape_vine_parameters.html#a39fd838f1f07fca0f8c5b38619379167',1,'BaseGrapeVineParameters::readParametersFromXML()'],['../struct_v_s_p_grapevine_parameters.html#a07f45311c1199758112af1c5ecd93b66',1,'VSPGrapevineParameters::readParametersFromXML()'],['../struct_split_grapevine_parameters.html#a3263eaf412ecd633ef785b96a65f6bec',1,'SplitGrapevineParameters::readParametersFromXML()']]], - ['readpng_25',['readPNG',['../global_8h.html#a99f41f50ffe7f2c092e16377f5cef979',1,'helios']]], - ['readpngalpha_26',['readPNGAlpha',['../global_8h.html#ade5b9b8370f50d8c2002ba48d47521f5',1,'helios']]], - ['readromccanopy_27',['readROMCCanopy',['../struct_camera_calibration.html#ae4f513355e7095b19417ad62d6f9f89f',1,'CameraCalibration']]], - ['rectangle_5fbounds_28',['rectangle_bounds',['../primitive_intersection_8cu.html#a31b2bef2ed3e97edbd08bfa1243e9d40',1,'primitiveIntersection.cu']]], - ['rectangle_5fintersect_29',['rectangle_intersect',['../primitive_intersection_8cu.html#a84078834a363095c77877d20e45cc16b',1,'primitiveIntersection.cu']]], - ['reflectancefilter_30',['reflectanceFilter',['../class_aerial_li_d_a_rcloud.html#ad9b43918cdfd1b4489dca2ac098f9ca9',1,'AerialLiDARcloud::reflectanceFilter()'],['../class_li_d_a_rcloud.html#adf2d9ef2301fd7fdee97e2adc0947dd3',1,'LiDARcloud::reflectanceFilter()']]], - ['renameglobaldata_31',['renameGlobalData',['../classhelios_1_1_context.html#a842cfdcdce20fb9fef8dc8703f12f1fa',1,'helios::Context']]], - ['renameobjectdata_32',['renameObjectData',['../classhelios_1_1_context.html#aa34c4f240d760708cf845546cb6bdb93',1,'helios::Context']]], - ['renameprimitivedata_33',['renamePrimitiveData',['../classhelios_1_1_context.html#a5c76017adb8c397c3b2398861ee23c7d',1,'helios::Context']]], - ['render_34',['render',['../class_synthetic_annotation.html#ab217bc96eaee704af3fd032eb0f999fc',1,'SyntheticAnnotation']]], - ['resize_5fvector_35',['resize_vector',['../group__functions.html#ga8b6573f58a513ebbc539ae7529daa748',1,'helios::resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)'],['../group__functions.html#ga71f9bf6c09e75b9c8d8ff36c7187a31d',1,'helios::resize_vector(std::vector< std::vector< std::vector< anytype > > > &vec, uint Nx, uint Ny, uint Nz)'],['../group__functions.html#ga9c202da0366b53b742824bfac2e8f536',1,'helios::resize_vector(std::vector< std::vector< std::vector< std::vector< anytype > > > > &vec, uint Nx, uint Ny, uint Nz, uint Nw)']]], - ['rgbacolor_36',['RGBAcolor',['../structhelios_1_1_r_g_b_acolor.html',1,'helios::RGBAcolor'],['../structhelios_1_1_r_g_b_acolor.html#ae03b805667e5f6f2914e0ec53375588f',1,'helios::RGBAcolor::RGBAcolor(const std::vector< float > &C)'],['../structhelios_1_1_r_g_b_acolor.html#aa479f8992b4b3201bf45b5e7140c3920',1,'helios::RGBAcolor::RGBAcolor(const float C[4])'],['../structhelios_1_1_r_g_b_acolor.html#a45e32082a71599a971bf927981959b55',1,'helios::RGBAcolor::RGBAcolor(float r, float g, float b, float a)'],['../structhelios_1_1_r_g_b_acolor.html#a37d62b0c0e7d5a2d19a8ea0159984bea',1,'helios::RGBAcolor::RGBAcolor()']]], - ['rgbcolor_37',['RGBcolor',['../structhelios_1_1_r_g_bcolor.html',1,'helios::RGBcolor'],['../structhelios_1_1_r_g_bcolor.html#a80d4a3e0c267ee3d93b832b0e575be4a',1,'helios::RGBcolor::RGBcolor(const std::vector< float > &C)'],['../structhelios_1_1_r_g_bcolor.html#a030dae08fe8c38ad9bb7c735254ac53e',1,'helios::RGBcolor::RGBcolor()'],['../structhelios_1_1_r_g_bcolor.html#a3e99268f14b8cdff29d50230585fad36',1,'helios::RGBcolor::RGBcolor(float r, float g, float b)'],['../structhelios_1_1_r_g_bcolor.html#adbf756a81c862233091e6b823d35e904',1,'helios::RGBcolor::RGBcolor(const float C[3])'],['../structhelios_1_1_r_g_bcolor.html#ae9ae503986d99822085d79d27a8e8362',1,'helios::RGBcolor::RGBcolor(const vec3 &C)']]], - ['rotate_38',['rotate',['../classhelios_1_1_compound_object.html#a06cb565db4569677cdfde7d0bb33c61e',1,'helios::CompoundObject::rotate(float rotation_radians, const char *rotation_axis_xyz_string)'],['../classhelios_1_1_compound_object.html#a7a4ab077211799f617a423bf05282aee',1,'helios::CompoundObject::rotate(float rotation_radians, const helios::vec3 &rotation_axis_vector)'],['../classhelios_1_1_compound_object.html#ab09695c9859a79b17806f7a4a18b56f4',1,'helios::CompoundObject::rotate(float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)']]], - ['rotateobject_39',['rotateObject',['../classhelios_1_1_context.html#a3b4ffa6ef56001319b2b63703b9f2acd',1,'helios::Context::rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)'],['../classhelios_1_1_context.html#a54589e1ad3210184bde2c0f84df193c2',1,'helios::Context::rotateObject(const std::vector< uint > &ObjIDs, float rotation_radians, const char *rotation_axis_xyz)'],['../classhelios_1_1_context.html#a7e40a23540dccd04d111b523759789e5',1,'helios::Context::rotateObject(uint ObjID, float rotation_radians, const vec3 &rotation_axis_vector)'],['../classhelios_1_1_context.html#a1a18c9a548406cbb4490e4ca7b75399b',1,'helios::Context::rotateObject(const std::vector< uint > &ObjIDs, float rotation_radians, const vec3 &rotation_axis_vector)'],['../classhelios_1_1_context.html#a6b9587a6ccab5dd8aac367bf19a939d8',1,'helios::Context::rotateObject(uint ObjID, float rotation_radians, const vec3 &rotation_origin, const vec3 &rotation_axis_vector)'],['../classhelios_1_1_context.html#ae7904c86f3479719ed6f7da045546d29',1,'helios::Context::rotateObject(const std::vector< uint > &ObjIDs, float rotation_radians, const vec3 &rotation_origin, const vec3 &rotation_axis_vector)']]], - ['rotatepoint_40',['rotatePoint',['../group__functions.html#gaa8705d90b2af04d56fa5086b917d9b7a',1,'helios::rotatePoint(const vec3 &position, float theta, float phi)'],['../group__functions.html#ga17de9e03f309dedcd648606653ddd05e',1,'helios::rotatePoint(const vec3 &position, const SphericalCoord &rotation)']]], - ['rotatepointaboutline_41',['rotatePointAboutLine',['../global_8h.html#a09ae9efe6ba5dddb144519931bcf94b5',1,'helios']]], - ['rotateprimitive_42',['rotatePrimitive',['../classhelios_1_1_context.html#ac325bb44ad539aac6ce37d03ff51de3c',1,'helios::Context::rotatePrimitive(uint UUID, float rot, const helios::vec3 &origin, const helios::vec3 &axis)'],['../classhelios_1_1_context.html#ae32a831a933122e64bc2bca4d23d3777',1,'helios::Context::rotatePrimitive(const std::vector< uint > &UUIDs, float rot, const helios::vec3 &origin, const vec3 &axis)'],['../classhelios_1_1_context.html#aca6e120f1607b07c71c4da83ab449813',1,'helios::Context::rotatePrimitive(const std::vector< uint > &UUIDs, float rot, const vec3 &axis)'],['../classhelios_1_1_context.html#a5e5dd3ef9b56a0bf148ed9d315422fe7',1,'helios::Context::rotatePrimitive(uint UUID, float rot, const char *axis)'],['../classhelios_1_1_context.html#a236cf95ad565a77338bd45fe098e9b83',1,'helios::Context::rotatePrimitive(const std::vector< uint > &UUIDs, float rot, const char *axis)'],['../classhelios_1_1_context.html#a55a61fb7f4a3829b04680dabb9a0276a',1,'helios::Context::rotatePrimitive(uint UUID, float rot, const helios::vec3 &axis)']]], - ['row_5fspacing_43',['row_spacing',['../struct_base_grape_vine_parameters.html#a4c2005587aecf5648ca2bf6fcf57b5a7',1,'BaseGrapeVineParameters::row_spacing()'],['../struct_tomato_parameters.html#a5b019fdf3087dbe150ef61cb68afd6f6',1,'TomatoParameters::row_spacing()'],['../struct_strawberry_parameters.html#ae2383458132397e4bbe111d4b4fc38b9',1,'StrawberryParameters::row_spacing()'],['../struct_walnut_canopy_parameters.html#af95c46150f1f3ed22dcea4d23e5821d8',1,'WalnutCanopyParameters::row_spacing()'],['../struct_sorghum_canopy_parameters.html#ad03798a817bc923891357b0298050b6a',1,'SorghumCanopyParameters::row_spacing()'],['../struct_bean_parameters.html#ad1b0816e394a4d7f5f848d99ef4d8527',1,'BeanParameters::row_spacing()']]], - ['row_5fspacing_5fspread_44',['row_spacing_spread',['../struct_base_grape_vine_parameters.html#adc793dabe989efe16fbca06821eaf11f',1,'BaseGrapeVineParameters']]], - ['run_45',['run',['../class_energy_balance_model.html#a2053c71e6ae107ba6ba612c56b245cf4',1,'EnergyBalanceModel::run(const std::vector< uint > &UUIDs)'],['../class_energy_balance_model.html#a4accc5ed86460c662db1352ef1857e0c',1,'EnergyBalanceModel::run(const std::vector< uint > &UUIDs, float dt)'],['../class_energy_balance_model.html#a5048dec148d795d76d10d331bdb35156',1,'EnergyBalanceModel::run(float dt)'],['../class_energy_balance_model.html#aaee8cda49702db14f26e26bddaf3c16a',1,'EnergyBalanceModel::run()'],['../class_dummy_model.html#aed84f7d16e80cd5a1b6ca01ef45d3842',1,'DummyModel::run()'],['../class_b_l_conductance_model.html#a0b46d5ade5b84be8e8a44723c5dcf720',1,'BLConductanceModel::run(const std::vector< uint > &UUIDs)'],['../class_b_l_conductance_model.html#aaa522103af850ee1fff89c0f698ee049',1,'BLConductanceModel::run()'],['../class_leaf_optics.html#a883df20abfc7c37120262108ac056507',1,'LeafOptics::run()'],['../class_stomatal_conductance_model.html#ab3cf7261085bc4f5292a5340285a75ec',1,'StomatalConductanceModel::run(const std::vector< uint > &UUIDs, float dt)'],['../class_stomatal_conductance_model.html#ab83b66067cdd933ec48ee1c75cbfe1b7',1,'StomatalConductanceModel::run(float dt)'],['../class_stomatal_conductance_model.html#ae08af8bff0c6924133948c7459baf91f',1,'StomatalConductanceModel::run(const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#acb041e756e00d5ced85b03905a97f5c6',1,'StomatalConductanceModel::run()'],['../class_photosynthesis_model.html#a837fd2c9c8a84c584e31c5cf3ce7de89',1,'PhotosynthesisModel::run(const std::vector< uint > &lUUIDs)'],['../class_photosynthesis_model.html#abb06ce82388d1147e720c3591f9d17b6',1,'PhotosynthesisModel::run()'],['../class_leaf_optics.html#affa921ab4465e6d89cdbe41e15a087ba',1,'LeafOptics::run()']]], - ['runband_46',['runBand',['../class_radiation_model.html#a19c42659077eb909a6dc7fa137459b69',1,'RadiationModel::runBand(const std::vector< std::string > &labels)'],['../class_radiation_model.html#a7d803f2b67bc4d0d89b2dc98a58d9ff1',1,'RadiationModel::runBand(const std::string &label)']]], - ['runradiationimaging_47',['runRadiationImaging',['../class_radiation_model.html#a728c89b679cfcb957567b43e52023baf',1,'RadiationModel::runRadiationImaging(const std::string &cameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)'],['../class_radiation_model.html#a63f23da646aac79163c8154ef3a6e93e',1,'RadiationModel::runRadiationImaging(const std::vector< std::string > &cameralabels, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)']]] + ['ide_20with_20helios_0',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['identifiers_20uuids_1',['Unique Universal Identifiers (UUIDs)',['../context_primitives.html#AddPatch_UUIDs',1,'']]], + ['ids_20and_20primitive_20uuids_20of_20model_20geometry_2',['Getting Object IDs and Primitive UUIDs of Model Geometry',['../_plant_architecture_doc.html#PlantArchQueryobjIDs',1,'']]], + ['if_20using_20windows_20subsystem_20for_20linux_20wsl_3',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]], + ['image_4',['1. Choosing the image',['../_making_masks.html#One',1,'']]], + ['image_20transparency_20channel_5',['Masking Primitives by Image Transparency Channel',['../_a_p_i.html#TextureMask',1,'']]], + ['images_20to_20file_6',['Writing Camera Images to File',['../_radiation_doc.html#RadCamOut',1,'']]], + ['importing_20context_20geometry_7',['Automatically importing Context geometry',['../_visualizer_doc.html#ContextGeom',1,'']]], + ['importvectorfromfile_8',['importVectorFromFile',['../global_8h.html#a125e8bef86fb7272d4d66898afb7d368',1,'helios']]], + ['in_9',['In',['../_tutorials.html#RadiationTuts',1,'Radiation Model Plug-In'],['../_voxel_intersection_doc.html#VoxelIntersectionUse',1,'Using the Plug-In'],['../_radiation_doc.html#RadUse',1,'Using the Radiation Model Plug-In'],['../_tutorials.html#VisualizerTuts',1,'Visualizer Plug-In'],['../_radiation_doc.html#RadVis',1,'Visualizing Model Outputs using the Visualizer Plug-In']]], + ['in_10',['in',['../_dependent_software.html#SetupLinuxVis',1,'Dependencies of the Visualizer Plug-in'],['../_radiation_doc.html#RadSolar',1,'Integrating with the SolarPosition Plug-in'],['../_b_l_conductance_doc.html#BLUse',1,'Using the Boundary Layer Conductance Model Plug-in'],['../_energy_balance_doc.html#EBUse',1,'Using the Energy Balance Model Plug-in'],['../_solar_position_doc.html#SolarLib',1,'Using the SolarPosition Plug-in'],['../_visualizer_doc.html#UseVis',1,'Using the Visualizer Plug-in'],['../_weber_penn_doc.html#WPTreeUse',1,'Using the Weber-Penn Tree Plug-in']]], + ['in_20buckley_20turnbull_20and_20adams_202012_11',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['in_20dynamic_20mode_12',['Running the Model in Dynamic Mode',['../_stomatal_doc.html#StomatalRunDyn',1,'']]], + ['in_20overview_13',['Plug-in Overview',['../_plant_architecture_doc.html#PlantArchOverview',1,'']]], + ['inclined_20plate_20mixed_20free_20forced_20convection_14',['2. Laminar Inclined Plate, Mixed Free-Forced Convection',['../_b_l_conductance_doc.html#BLC2',1,'']]], + ['include_20directories_15',['Include Directories',['../_plugins.html#include',1,'']]], + ['include_20files_16',['C++ Standard Library Include Files',['../_a_p_i.html#GlobalInclude',1,'']]], + ['incorporating_20the_20effects_20of_20clouds_17',['Incorporating the effects of clouds',['../_solar_position_doc.html#SolarFluxClouds',1,'']]], + ['increasing_20graphics_20driver_20timeout_18',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], + ['increasing_20timout_20detection_20tdr_20delay_19',['Increasing Timout Detection (TDR) Delay',['../_dependent_software.html#TdrDelay',1,'']]], + ['incrementday_20',['incrementDay',['../structhelios_1_1_date.html#a82d115420d5c45d28e35d6226c3c8636',1,'helios::Date']]], + ['incrementglobaldata_21',['incrementGlobalData',['../classhelios_1_1_context.html#ac5b4311cbca56d1d7f0d605d19adf6f9',1,'helios::Context::incrementGlobalData(const char *label, int increment)'],['../classhelios_1_1_context.html#ac09c095f00af2544ac74f5b18a7f6e9a',1,'helios::Context::incrementGlobalData(const char *label, uint increment)'],['../classhelios_1_1_context.html#a1c3d180b9f658fe61e2ae7aad2dac96f',1,'helios::Context::incrementGlobalData(const char *label, float increment)'],['../classhelios_1_1_context.html#a65bade6c654b836ff0c097b728a45dd4',1,'helios::Context::incrementGlobalData(const char *label, double increment)']]], + ['incrementprimitivedata_22',['incrementPrimitiveData',['../classhelios_1_1_context.html#a4fe0481b73bf5f6225b4b8a5a6c52d8e',1,'helios::Context::incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, int increment)'],['../classhelios_1_1_context.html#aa1b4c2cd46df6941caf1e95e8c6876bb',1,'helios::Context::incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, uint increment)'],['../classhelios_1_1_context.html#a83fcbc3d3debc230c0a8df670d88b60c',1,'helios::Context::incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, float increment)'],['../classhelios_1_1_context.html#aa58aeb5e56184e6f0c696922d99ba4cc',1,'helios::Context::incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, double increment)']]], + ['independent_20variables_23',['Independent Variables',['../_photosynthesis_doc.html#PhotoVars',1,'Summary of Empirical Model Independent Variables'],['../_photosynthesis_doc.html#FvCBPhotoVars',1,'Summary of FvCB Model Independent Variables']]], + ['individual_20plant_24',['Building an Individual Plant',['../_canopy_generator_doc.html#CGenBuildPlant',1,'']]], + ['inflorescence_25',['Inflorescence',['../_plant_architecture_doc.html#PlantArch_flowers',1,'']]], + ['information_26',['information',['../_aerial_li_d_a_r_doc.html#AerialLiDARbg',1,'Background information'],['../_li_d_a_r_doc.html#LiDARbg',1,'Background information']]], + ['information_20from_20the_20model_27',['Retrieving Information from the Model',['../_plant_architecture_doc.html#PlantArchQuery',1,'']]], + ['initialize_28',['initialize',['../struct_shader.html#a168524d306867180df143651ed73ce3b',1,'Shader']]], + ['initialize_20the_20visualizer_20class_29',['Step 1. Declare and initialize the Visualizer class',['../visualizer_basics.html#vis_step1',1,'']]], + ['input_20output_30',['File Input/Output',['../_i_o.html',1,'']]], + ['input_20output_20primitive_20data_31',['Input Output Primitive Data',['../_b_l_conductance_doc.html#BLCData',1,'Input/Output Primitive Data'],['../_energy_balance_doc.html#EBData',1,'Input/Output Primitive Data'],['../_radiation_doc.html#RadVarsAndProps',1,'Input/Output Primitive Data']]], + ['input_20primitive_20data_32',['Input Primitive Data',['../_b_l_conductance_doc.html#BLCInputData',1,'Input Primitive Data'],['../_energy_balance_doc.html#EBInputData',1,'Input Primitive Data'],['../_li_d_a_r_doc.html#LiDARInputData',1,'Input Primitive Data'],['../_photosynthesis_doc.html#PhotoInputData',1,'Input Primitive Data'],['../_radiation_doc.html#RadInputData',1,'Input Primitive Data'],['../_stomatal_doc.html#StomatalInputData',1,'Input Primitive Data']]], + ['input_20radiative_20bands_33',['Input Radiative Bands',['../_energy_balance_doc.html#EBRad',1,'']]], + ['input_20spectral_20data_34',['Input Spectral Data',['../_radiation_doc.html#InputSpectra',1,'']]], + ['input_20variables_35',['Input Variables',['../_b_l_conductance_doc.html#BLPrimData',1,'Input Variables'],['../_energy_balance_doc.html#EBPrimData',1,'Input Variables']]], + ['inputoutput_2ecpp_36',['InputOutput.cpp',['../_input_output_8cpp.html',1,'']]], + ['inputs_37',['Data Timeseries (Weather Inputs)',['../_a_p_i.html#DataTimeseries',1,'']]], + ['ins_38',['ins',['../_overview.html#PluginsOverview',1,'Model Plug-ins'],['../_plug_ins.html',1,'Plug-ins']]], + ['insertion_5fangle_5fdecay_5frate_39',['insertion_angle_tip and insertion_angle_decay_rate',['../_plant_architecture_doc.html#ShootParam_insertion',1,'']]], + ['insertion_5fangle_5ftip_20and_20insertion_5fangle_5fdecay_5frate_40',['insertion_angle_tip and insertion_angle_decay_rate',['../_plant_architecture_doc.html#ShootParam_insertion',1,'']]], + ['install_20and_20set_20up_41',['Install and Set-up',['../_dependent_software.html',1,'']]], + ['install_20microsoft_20visual_20studio_20c_20compiler_20tools_42',['Install Microsoft Visual Studio C++ compiler tools',['../_dependent_software.html#SetupPCMSVC',1,'']]], + ['installing_20helios_20dependencies_43',['Installing Helios Dependencies',['../_dependent_software.html#Automatically',1,'']]], + ['installing_20optix_20if_20using_20windows_20subsystem_20for_20linux_20wsl_44',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]], + ['int2_45',['int2',['../structhelios_1_1int2.html',1,'helios::int2'],['../structhelios_1_1int2.html#ae80f1c6c40c21e97047d6db1c2496a45',1,'helios::int2::int2()'],['../structhelios_1_1int2.html#a8e3f84e45ffe63afd76374fdaa8cfb86',1,'helios::int2::int2(const std::vector< int > &v)'],['../structhelios_1_1int2.html#af32c6b747588deb32596333589573774',1,'helios::int2::int2(const int v[2])'],['../structhelios_1_1int2.html#aa5d8b588ac6ea94d0a30b0bce4e8f198',1,'helios::int2::int2(int v0, int v1)']]], + ['int3_46',['int3',['../structhelios_1_1int3.html',1,'helios::int3'],['../structhelios_1_1int3.html#a083ddc83d97c9eb4963c61a008a8ed98',1,'helios::int3::int3()'],['../structhelios_1_1int3.html#a7d8c299d611aaff2092ef6c6811a1435',1,'helios::int3::int3(const std::vector< int > &v)'],['../structhelios_1_1int3.html#a4be47afa5e91a293126a39b9928d7d21',1,'helios::int3::int3(const int v[3])'],['../structhelios_1_1int3.html#a3522bf2be027f0897d62a56fe412096c',1,'helios::int3::int3(int v0, int v1, int v2)']]], + ['int4_47',['int4',['../structhelios_1_1int4.html',1,'helios::int4'],['../structhelios_1_1int4.html#a495ca613c03f0b6748dc484e1d5bc6a6',1,'helios::int4::int4()'],['../structhelios_1_1int4.html#a0c96514a7e15c6638d34ddfe50b7c7fc',1,'helios::int4::int4(const std::vector< int > &v)'],['../structhelios_1_1int4.html#ad4011b8fcdb338dd35b97eab6a90e978',1,'helios::int4::int4(const int v[3])'],['../structhelios_1_1int4.html#a56c4775603496c334254104c76608e1f',1,'helios::int4::int4(int v0, int v1, int v2, int v3)']]], + ['integers_48',['Vector of Integers',['../context_vectors.html#int3tut',1,'']]], + ['integratesourcespectrum_49',['integrateSourceSpectrum',['../class_radiation_model.html#afadd1370bef086ee0e69c3d0469c5941',1,'RadiationModel']]], + ['integratespectrum_50',['integrateSpectrum',['../class_radiation_model.html#a47c0fce1e3ee937cd53f7380b6002c69',1,'RadiationModel::integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const'],['../class_radiation_model.html#ab6be78d097793b7738daeb95f5cd3fda',1,'RadiationModel::integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum) const'],['../class_radiation_model.html#a355137712ebe1c4025db448d7b5e58fb',1,'RadiationModel::integrateSpectrum(uint source_ID, const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const'],['../class_radiation_model.html#a98d3a2322d58841f001c5dfccbf03391',1,'RadiationModel::integrateSpectrum(uint source_ID, const std::vector< helios::vec2 > &object_spectrum, const std::vector< helios::vec2 > &camera_spectrum) const'],['../class_radiation_model.html#ab688ee5e6d5997711ca4ae24151148d7',1,'RadiationModel::integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum, const std::vector< helios::vec2 > &camera_spectrum) const']]], + ['integrating_20fluxes_51',['Integrating Fluxes',['../_radiation_doc.html#RadDataInt',1,'']]], + ['integrating_20with_20the_20solarposition_20plug_20in_52',['Integrating with the SolarPosition Plug-in',['../_radiation_doc.html#RadSolar',1,'']]], + ['integration_53',['Git/GitHub integration',['../_c_lion_i_d_e.html#CLionGit',1,'']]], + ['intercellular_20co2_20concentration_54',['Intercellular CO2 Concentration',['../_photosynthesis_doc.html#Ci',1,'']]], + ['interception_55',['interception',['../radiation_basics.html#Tutorial10_run',1,'3. Run the model and calculate PAR interception'],['../radiation_basics.html',1,'Tutorial 10: Radiation model basics - tree light interception']]], + ['interception_20and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_56',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['internode_5flength_5fdecay_5frate_57',['internode_length_max, internode_length_min, and internode_length_decay_rate',['../_plant_architecture_doc.html#ShootParam_length',1,'']]], + ['internode_5flength_5fmax_20internode_5flength_5fmin_20and_20internode_5flength_5fdecay_5frate_58',['internode_length_max, internode_length_min, and internode_length_decay_rate',['../_plant_architecture_doc.html#ShootParam_length',1,'']]], + ['internode_5flength_5fmin_20and_20internode_5flength_5fdecay_5frate_59',['internode_length_max, internode_length_min, and internode_length_decay_rate',['../_plant_architecture_doc.html#ShootParam_length',1,'']]], + ['interp1_60',['interp1',['../global_8h.html#a4d45cb06725a89f41266c8c89974c73e',1,'helios']]], + ['interpolate_5ftexture_5fuv_5fto_5fslice_5fpoint_61',['interpolate_texture_UV_to_slice_point',['../class_voxel_intersection.html#aba4e8fce246ada7df4f9975bc7b9624f',1,'VoxelIntersection']]], + ['interpolatetube_62',['interpolateTube',['../_canopy_generator_8h.html#a339d165bb0c396a75ce255fbe16a20d4',1,'interpolateTube(const std::vector< helios::vec3 > &P, float frac): CanopyGenerator.cpp'],['../_canopy_generator_8h.html#a3d09d2e054283f9202ad662a2c131018',1,'interpolateTube(const std::vector< float > &P, float frac): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#a2d10c56b3c11e46ebfd346ce37f38612',1,'interpolateTube(const std::vector< vec3 > &P, float frac): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#a3d09d2e054283f9202ad662a2c131018',1,'interpolateTube(const std::vector< float > &P, float frac): CanopyGenerator.cpp'],['../_plant_architecture_8cpp.html#a3d09d2e054283f9202ad662a2c131018',1,'interpolateTube(const std::vector< float > &P, float frac): PlantArchitecture.cpp'],['../_plant_architecture_8cpp.html#a2d10c56b3c11e46ebfd346ce37f38612',1,'interpolateTube(const std::vector< vec3 > &P, float frac): PlantArchitecture.cpp']]], + ['intersection_20plugin_20documentation_63',['Voxel Intersection Plugin Documentation',['../_voxel_intersection_doc.html',1,'PlugIns']]], + ['introduction_64',['Introduction',['../_plugins.html#PluginIntro',1,'Introduction'],['../_aerial_li_d_a_r_doc.html#AerialLiDARintro',1,'Introduction'],['../_b_l_conductance_doc.html#BLCIntro',1,'Introduction'],['../_dummy.html#DummyIntro',1,'Introduction'],['../_energy_balance_doc.html#EBIntro',1,'Introduction'],['../_li_d_a_r_doc.html#LiDARintro',1,'Introduction'],['../_photosynthesis_doc.html#PhotoDescription',1,'Introduction'],['../_radiation_doc.html#RadIntro',1,'Introduction'],['../_solar_position_doc.html#SolarIntro',1,'Introduction'],['../_stomatal_doc.html#StomatalIntro',1,'Introduction'],['../_visualizer_doc.html#VisIntro',1,'Introduction'],['../_voxel_intersection_doc.html#VoxelIntersectionIntro',1,'Introduction'],['../_weber_penn_doc.html#WPTreeIntro',1,'Introduction']]], + ['introduction_20to_20global_20data_65',['Introduction to Global Data',['../context_globaldata.html#context_globaldata_intro',1,'']]], + ['introduction_20to_20primitive_20data_66',['Introduction to Primitive Data',['../context_primdata.html#context_primdata_intro',1,'']]], + ['is_20an_20api_67',['What is an API?',['../_overview.html#whatisAPI',1,'']]], + ['isgeometrydirty_68',['isGeometryDirty',['../classhelios_1_1_context.html#a64f402ff71dd246be8c1b06699c05e26',1,'helios::Context']]], + ['isleapyear_69',['isLeapYear',['../structhelios_1_1_date.html#ae54ee66704fedfe50c8efc16695f3e9e',1,'helios::Date']]], + ['isobjecthidden_70',['isObjectHidden',['../classhelios_1_1_context.html#a084b7fb6ef0cec4a83207ce3c7f70843',1,'helios::Context']]], + ['isprimitivehidden_71',['isPrimitiveHidden',['../classhelios_1_1_context.html#a94d5c318d9f7edaf1f5410ad8b17e141',1,'helios::Context']]], + ['isprimitivetexturecoloroverridden_72',['isPrimitiveTextureColorOverridden',['../classhelios_1_1_context.html#aaaa6de8a55765b258d6e65c52bf5df69',1,'helios::Context']]], + ['issues_73',['Issues',['../_aerial_li_d_a_r_doc.html#AerialLiDARissues',1,'Known Issues'],['../_b_l_conductance_doc.html#BLCissues',1,'Known Issues'],['../_energy_balance_doc.html#EBissues',1,'Known Issues'],['../_li_d_a_r_doc.html#LiDARissues',1,'Known Issues'],['../_visualizer_doc.html#VisIssues',1,'Known Issues'],['../_voxel_intersection_doc.html#VoxelIssues',1,'Known Issues'],['../_weber_penn_doc.html#WPTissues',1,'Known Issues']]], + ['iterations_74',['Scattering Iterations',['../_radiation_doc.html#RadScatter',1,'']]], + ['its_20parameters_75',['Defining the Phytomer and its Parameters',['../_plant_architecture_doc.html#PlantArchPhytomerParams',1,'']]] ]; diff --git a/doc/html/search/all_12.js b/doc/html/search/all_12.js index 97ff066e5..937e12973 100644 --- a/doc/html/search/all_12.js +++ b/doc/html/search/all_12.js @@ -1,246 +1,6 @@ var searchData= [ - ['s1_5fleaf1_5fangle_0',['s1_leaf1_angle',['../struct_sorghum_canopy_parameters.html#a055da9b13d5d33b8b62e3fb9d8432f08',1,'SorghumCanopyParameters']]], - ['s1_5fleaf2_5fangle_1',['s1_leaf2_angle',['../struct_sorghum_canopy_parameters.html#adaf3271852908daf8b55121ce7fffd7c',1,'SorghumCanopyParameters']]], - ['s1_5fleaf3_5fangle_2',['s1_leaf3_angle',['../struct_sorghum_canopy_parameters.html#aed23ed04b3ddca133071f74f4a6c4aad',1,'SorghumCanopyParameters']]], - ['s1_5fleaf_5fsize1_3',['s1_leaf_size1',['../struct_sorghum_canopy_parameters.html#a5f043e646e579018dfa6fec8fb458368',1,'SorghumCanopyParameters']]], - ['s1_5fleaf_5fsize2_4',['s1_leaf_size2',['../struct_sorghum_canopy_parameters.html#a1f43b856d67a2d0d827445d898f7527c',1,'SorghumCanopyParameters']]], - ['s1_5fleaf_5fsize3_5',['s1_leaf_size3',['../struct_sorghum_canopy_parameters.html#a7e30b11a0539a22e26b5ba0b62e74c89',1,'SorghumCanopyParameters']]], - ['s1_5fleaf_5fsubdivisions_6',['s1_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#ac84f20cc1f137d8969c1166d78589161',1,'SorghumCanopyParameters']]], - ['s1_5fleaf_5ftexture_5ffile_7',['s1_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#a1ba7822b8d7b621236d3fb26339f3b80',1,'SorghumCanopyParameters']]], - ['s1_5fstem_5flength_8',['s1_stem_length',['../struct_sorghum_canopy_parameters.html#ae2e5589dba50b2dc31be67b2b27582a2',1,'SorghumCanopyParameters']]], - ['s1_5fstem_5fradius_9',['s1_stem_radius',['../struct_sorghum_canopy_parameters.html#aa6f75372512d2cbbe72091f90b416c8c',1,'SorghumCanopyParameters']]], - ['s1_5fstem_5fsubdivisions_10',['s1_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#ac18297754bb4664c4b06917edea77a82',1,'SorghumCanopyParameters']]], - ['s2_5fleaf1_5fangle_11',['s2_leaf1_angle',['../struct_sorghum_canopy_parameters.html#a35058e0b3485d531348a82d0fcbfb92f',1,'SorghumCanopyParameters']]], - ['s2_5fleaf2_5fangle_12',['s2_leaf2_angle',['../struct_sorghum_canopy_parameters.html#af96017371615c50147f5ac71cead2b6d',1,'SorghumCanopyParameters']]], - ['s2_5fleaf3_5fangle_13',['s2_leaf3_angle',['../struct_sorghum_canopy_parameters.html#a546b3ffb7e55a1f3050d914b3cf3fb0c',1,'SorghumCanopyParameters']]], - ['s2_5fleaf4_5fangle_14',['s2_leaf4_angle',['../struct_sorghum_canopy_parameters.html#a42b6683f425584df7d87da2b096ac901',1,'SorghumCanopyParameters']]], - ['s2_5fleaf5_5fangle_15',['s2_leaf5_angle',['../struct_sorghum_canopy_parameters.html#a4b5828b945f8f2ab30855bee3aabc9c5',1,'SorghumCanopyParameters']]], - ['s2_5fleaf_5fsize1_16',['s2_leaf_size1',['../struct_sorghum_canopy_parameters.html#aedaf27d8e335d46e89d8f3f960a5fdd5',1,'SorghumCanopyParameters']]], - ['s2_5fleaf_5fsize2_17',['s2_leaf_size2',['../struct_sorghum_canopy_parameters.html#ace2b6a18a80e6f53d4459f4233d329c1',1,'SorghumCanopyParameters']]], - ['s2_5fleaf_5fsize3_18',['s2_leaf_size3',['../struct_sorghum_canopy_parameters.html#a92fda41cc4d33cc1bbda5647b2b85116',1,'SorghumCanopyParameters']]], - ['s2_5fleaf_5fsize4_19',['s2_leaf_size4',['../struct_sorghum_canopy_parameters.html#ac69d718bffad7c7586615440de9f4339',1,'SorghumCanopyParameters']]], - ['s2_5fleaf_5fsize5_20',['s2_leaf_size5',['../struct_sorghum_canopy_parameters.html#ab1722a2d04435a3d9ebeefdffde6d3dd',1,'SorghumCanopyParameters']]], - ['s2_5fleaf_5fsubdivisions_21',['s2_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#a4cc923591186631e81670cba369764f5',1,'SorghumCanopyParameters']]], - ['s2_5fleaf_5ftexture_5ffile_22',['s2_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#a3d4def312245c9351ed27b6e4e2ccedd',1,'SorghumCanopyParameters']]], - ['s2_5fstem_5flength_23',['s2_stem_length',['../struct_sorghum_canopy_parameters.html#adab00887989b76b54f6fe5cbe0b00fa4',1,'SorghumCanopyParameters']]], - ['s2_5fstem_5fradius_24',['s2_stem_radius',['../struct_sorghum_canopy_parameters.html#a566d945dca39d9064e76349db76b3b6e',1,'SorghumCanopyParameters']]], - ['s2_5fstem_5fsubdivisions_25',['s2_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#a02d288c3ce64c16aa3ed35bbde1a3e72',1,'SorghumCanopyParameters']]], - ['s3_5fleaf_5fsize_26',['s3_leaf_size',['../struct_sorghum_canopy_parameters.html#ad6dc4e8e1c43d9e85cc303c4270b995d',1,'SorghumCanopyParameters']]], - ['s3_5fleaf_5fsubdivisions_27',['s3_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#a13cd4f9fa100a7f945549d215f8e2dd7',1,'SorghumCanopyParameters']]], - ['s3_5fleaf_5ftexture_5ffile_28',['s3_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#a87f1e1ec6df26337ea31b9d235bfa6f4',1,'SorghumCanopyParameters']]], - ['s3_5fmean_5fleaf_5fangle_29',['s3_mean_leaf_angle',['../struct_sorghum_canopy_parameters.html#a2d470fce2f09d835c48d5f8a04e6a0f3',1,'SorghumCanopyParameters']]], - ['s3_5fnumber_5fof_5fleaves_30',['s3_number_of_leaves',['../struct_sorghum_canopy_parameters.html#aadb0291f1b07d6de354e2bf86050ab76',1,'SorghumCanopyParameters']]], - ['s3_5fstem_5flength_31',['s3_stem_length',['../struct_sorghum_canopy_parameters.html#a874045edcb46926aaddeb3588061a275',1,'SorghumCanopyParameters']]], - ['s3_5fstem_5fradius_32',['s3_stem_radius',['../struct_sorghum_canopy_parameters.html#a6862b2e046366ce852896fca526a8857',1,'SorghumCanopyParameters']]], - ['s3_5fstem_5fsubdivisions_33',['s3_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#ae0a4609f94d4e1104ff5a411c8e1b28e',1,'SorghumCanopyParameters']]], - ['s4_5fleaf_5fsize_34',['s4_leaf_size',['../struct_sorghum_canopy_parameters.html#a542b812d6c48b3c41cab4111261ee242',1,'SorghumCanopyParameters']]], - ['s4_5fleaf_5fsubdivisions_35',['s4_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#a55fdb0febc1cc573d59bcad2db07d6a7',1,'SorghumCanopyParameters']]], - ['s4_5fleaf_5ftexture_5ffile_36',['s4_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#acc23aed799e76667167f474ecd29af4b',1,'SorghumCanopyParameters']]], - ['s4_5fmean_5fleaf_5fangle_37',['s4_mean_leaf_angle',['../struct_sorghum_canopy_parameters.html#a4ab179de4931853476bb68cf9cccfb57',1,'SorghumCanopyParameters']]], - ['s4_5fnumber_5fof_5fleaves_38',['s4_number_of_leaves',['../struct_sorghum_canopy_parameters.html#a823d78f11ca9b5d8f8f3a5dfe9c3ab8f',1,'SorghumCanopyParameters']]], - ['s4_5fpanicle_5fsize_39',['s4_panicle_size',['../struct_sorghum_canopy_parameters.html#af6380b91e8a559b711e0b973ef862bc2',1,'SorghumCanopyParameters']]], - ['s4_5fpanicle_5fsubdivisions_40',['s4_panicle_subdivisions',['../struct_sorghum_canopy_parameters.html#a83893b5e61c2501509fc2f0c9d7b7634',1,'SorghumCanopyParameters']]], - ['s4_5fseed_5ftexture_5ffile_41',['s4_seed_texture_file',['../struct_sorghum_canopy_parameters.html#a0e592b9ddd3bdaf213c154dd3865c710',1,'SorghumCanopyParameters']]], - ['s4_5fstem_5flength_42',['s4_stem_length',['../struct_sorghum_canopy_parameters.html#a11feead673b9e86c4559a8670c290257',1,'SorghumCanopyParameters']]], - ['s4_5fstem_5fradius_43',['s4_stem_radius',['../struct_sorghum_canopy_parameters.html#a2a80af374f3d050df6ecf568e831a739',1,'SorghumCanopyParameters']]], - ['s4_5fstem_5fsubdivisions_44',['s4_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#a321d838cea5a50a7131e71c3c732367a',1,'SorghumCanopyParameters']]], - ['s5_5fleaf_5fsize_45',['s5_leaf_size',['../struct_sorghum_canopy_parameters.html#ab6c381612b2ca76fc409401dc75bab3f',1,'SorghumCanopyParameters']]], - ['s5_5fleaf_5fsubdivisions_46',['s5_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#a78ef9c1a644caad89f52d759630d9a0b',1,'SorghumCanopyParameters']]], - ['s5_5fleaf_5ftexture_5ffile_47',['s5_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#a6ad429a68501b5a1fecb795a73d943d8',1,'SorghumCanopyParameters']]], - ['s5_5fmean_5fleaf_5fangle_48',['s5_mean_leaf_angle',['../struct_sorghum_canopy_parameters.html#a10c15107111fdd0b73cfef24d45d3ab4',1,'SorghumCanopyParameters']]], - ['s5_5fnumber_5fof_5fleaves_49',['s5_number_of_leaves',['../struct_sorghum_canopy_parameters.html#a0fd7a4e7d5f5a2fa419e738a35d368e1',1,'SorghumCanopyParameters']]], - ['s5_5fpanicle_5fsize_50',['s5_panicle_size',['../struct_sorghum_canopy_parameters.html#aad64258f9ac6ec9df2f86c5ff9bb8d0d',1,'SorghumCanopyParameters']]], - ['s5_5fpanicle_5fsubdivisions_51',['s5_panicle_subdivisions',['../struct_sorghum_canopy_parameters.html#a3dd303738e509f6b67e423f303b39e13',1,'SorghumCanopyParameters']]], - ['s5_5fseed_5ftexture_5ffile_52',['s5_seed_texture_file',['../struct_sorghum_canopy_parameters.html#af5ce42735f214b47e215759c8c6b02ee',1,'SorghumCanopyParameters']]], - ['s5_5fstem_5fbend_53',['s5_stem_bend',['../struct_sorghum_canopy_parameters.html#a5d8dcff59a7cb1604c67595efaa04b36',1,'SorghumCanopyParameters']]], - ['s5_5fstem_5flength_54',['s5_stem_length',['../struct_sorghum_canopy_parameters.html#a09aa6e060ca74d672d20742ff6f330dc',1,'SorghumCanopyParameters']]], - ['s5_5fstem_5fradius_55',['s5_stem_radius',['../struct_sorghum_canopy_parameters.html#a667cefb6b9b105d58c3bef82db61c52f',1,'SorghumCanopyParameters']]], - ['s5_5fstem_5fsubdivisions_56',['s5_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#a016f6dbe9526e4411d9b7f1480e562b6',1,'SorghumCanopyParameters']]], - ['samplechildshoottype_57',['sampleChildShootType',['../struct_shoot.html#aab304a4f16758e32927dba357f6fb775',1,'Shoot']]], - ['sampleepicormicshoot_58',['sampleEpicormicShoot',['../struct_shoot.html#afe4fa0bc2d46f94087c88b658d8aef13',1,'Shoot']]], - ['samplevegetativebudbreak_59',['sampleVegetativeBudBreak',['../struct_shoot.html#a79c44586c03664cfe2e7e8e114821f4f',1,'Shoot']]], - ['scalarfilter_60',['scalarFilter',['../class_li_d_a_rcloud.html#aa2ea59f063b3c951a1e58af9e4ddfd7e',1,'LiDARcloud::scalarFilter()'],['../class_aerial_li_d_a_rcloud.html#a4e1870a07129fc6b64427fd36896cb62',1,'AerialLiDARcloud::scalarFilter()']]], - ['scale_61',['scale',['../structhelios_1_1_r_g_b_acolor.html#a4d6937733ccdd97cee440a56bd556ff3',1,'helios::RGBAcolor::scale()'],['../classhelios_1_1_compound_object.html#a4b2124d89efe900244fb51426ab1f4ce',1,'helios::CompoundObject::scale()'],['../structhelios_1_1_r_g_bcolor.html#a5b7b7b5734588bcf49444997b091f8b6',1,'helios::RGBcolor::scale()']]], - ['scaleaboutcenter_62',['scaleAboutCenter',['../classhelios_1_1_compound_object.html#a63e491c5eed7b39ef26a67718da2a10f',1,'helios::CompoundObject']]], - ['scaleaboutpoint_63',['scaleAboutPoint',['../classhelios_1_1_compound_object.html#a6e3b6e95498c551dc124b2653603e10f',1,'helios::CompoundObject']]], - ['scalegirth_64',['scaleGirth',['../classhelios_1_1_cone.html#ad40b7cda9baac86be967058736b2bb78',1,'helios::Cone']]], - ['scaleinternodemaxlength_65',['scaleInternodeMaxLength',['../struct_phytomer.html#aecc6f52f3490562f4daf581bec7f4260',1,'Phytomer']]], - ['scalelength_66',['scaleLength',['../classhelios_1_1_cone.html#aaefa3caee5b8e46ca46650031d0bee0a',1,'helios::Cone']]], - ['scaleobject_67',['scaleObject',['../classhelios_1_1_context.html#afe9817e155de4a39bc82b000c5d0e888',1,'helios::Context::scaleObject(uint ObjID, const helios::vec3 &scalefact)'],['../classhelios_1_1_context.html#a781c1e297264aa37c92f4b72eb5277c9',1,'helios::Context::scaleObject(const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact)']]], - ['scaleobjectaboutcenter_68',['scaleObjectAboutCenter',['../classhelios_1_1_context.html#a72ccb742cc258704655c7fda792e58eb',1,'helios::Context::scaleObjectAboutCenter(uint ObjID, const helios::vec3 &scalefact)'],['../classhelios_1_1_context.html#a6f6e1b33ed92d3b852301a2ddef531d7',1,'helios::Context::scaleObjectAboutCenter(const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact)']]], - ['scaleobjectaboutpoint_69',['scaleObjectAboutPoint',['../classhelios_1_1_context.html#a0c84572898729e1a1d40415ad633066d',1,'helios::Context::scaleObjectAboutPoint(uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)'],['../classhelios_1_1_context.html#ab5b5b78157ccf325cf3924630833c0e1',1,'helios::Context::scaleObjectAboutPoint(const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact, const helios::vec3 &point)']]], - ['scaleprimitive_70',['scalePrimitive',['../classhelios_1_1_context.html#aaeafd65954d09be5773fbdaba35c694e',1,'helios::Context::scalePrimitive(uint UUID, const helios::vec3 &S)'],['../classhelios_1_1_context.html#a04cb06f3f2db846e6fbf725a0980259a',1,'helios::Context::scalePrimitive(const std::vector< uint > &UUIDs, const helios::vec3 &S)']]], - ['scaleprimitiveaboutpoint_71',['scalePrimitiveAboutPoint',['../classhelios_1_1_context.html#aa5cc5ee1ba536b5b7565b780a272d6b4',1,'helios::Context::scalePrimitiveAboutPoint(const std::vector< uint > &UUIDs, const helios::vec3 &S, const helios::vec3 point)'],['../classhelios_1_1_context.html#ad510492e34ffad178aa3a47e7932093e',1,'helios::Context::scalePrimitiveAboutPoint(uint UUID, const helios::vec3 &S, const helios::vec3 point)']]], - ['scaleprimitivedata_72',['scalePrimitiveData',['../classhelios_1_1_context.html#a0860253c22d51b274a8f63b806ff08c7',1,'helios::Context::scalePrimitiveData(const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)'],['../classhelios_1_1_context.html#ad307d199229f2fd1b36ad7efb4450696',1,'helios::Context::scalePrimitiveData(const std::string &label, float scaling_factor)']]], - ['scalespectrum_73',['scaleSpectrum',['../class_radiation_model.html#a32496f56edc4837c7cc2b28d154a108f',1,'RadiationModel::scaleSpectrum(const std::string &existing_global_data_label, const std::string &new_global_data_label, float scale_factor) const'],['../class_radiation_model.html#abfd1f6bc9d59a09ff3baab866c0b124c',1,'RadiationModel::scaleSpectrum(const std::string &global_data_label, float scale_factor) const']]], - ['scalespectrumrandomly_74',['scaleSpectrumRandomly',['../class_radiation_model.html#ac292f5d218647fc7cbb0a58bc3d284ae',1,'RadiationModel']]], - ['scaletubegirth_75',['scaleTubeGirth',['../classhelios_1_1_tube.html#a3fafe2daf9caaf3590e2c3fe2cecc914',1,'helios::Tube::scaleTubeGirth()'],['../classhelios_1_1_context.html#aa77f3e51de5230a69bdd70c26c7173e6',1,'helios::Context::scaleTubeGirth()']]], - ['scaletubelength_76',['scaleTubeLength',['../classhelios_1_1_tube.html#aceabd5281c442abf90725bb3728caf8b',1,'helios::Tube::scaleTubeLength()'],['../classhelios_1_1_context.html#a049755c6b0b7a3affa2c8dcdd0623935',1,'helios::Context::scaleTubeLength()']]], - ['scandensity_77',['scandensity',['../struct_aerial_scan_metadata.html#ab6e7d1152e1b122a4751c733f04a3803',1,'AerialScanMetadata']]], - ['scanmetadata_78',['ScanMetadata',['../struct_scan_metadata.html',1,'ScanMetadata'],['../struct_scan_metadata.html#a6aa59ee9ecf89c9c6a2ae3a734c5ccd4',1,'ScanMetadata::ScanMetadata(const helios::vec3 &a_origin, uint a_Ntheta, float a_thetaMin, float a_thetaMax, uint a_Nphi, float a_phiMin, float a_phiMax, float a_exitDiameter, float a_beamDivergence, const std::vector< std::string > &a_columnFormat)'],['../struct_scan_metadata.html#a2f625c96f54068fb8de34b528e7f770d',1,'ScanMetadata::ScanMetadata()']]], - ['scanxmlfortag_79',['scanXMLForTag',['../classhelios_1_1_context.html#adb6486c864423085b1ef7cb8bdc0278b',1,'helios::Context']]], - ['scatteringdepth_80',['scatteringDepth',['../struct_radiation_band.html#a1e6751a77faec064c49aba70539865de',1,'RadiationBand']]], - ['second_81',['second',['../structhelios_1_1_time.html#a627acedd68e0228600727b867db537dd',1,'helios::Time']]], - ['seed_82',['seed',['../struct_per_ray_data.html#a757f60a4367093c4aa8bf21e6042c1dd',1,'PerRayData']]], - ['seedrandomgenerator_83',['seedRandomGenerator',['../class_weber_penn_tree.html#a8a9df18ae61815739063b0baff142f9d',1,'WeberPennTree::seedRandomGenerator()'],['../class_canopy_generator.html#ad23ca24fa4ccb033293c8d5118903d16',1,'CanopyGenerator::seedRandomGenerator()'],['../classhelios_1_1_context.html#a337936c3123ff382da12cb37725170c1',1,'helios::Context::seedRandomGenerator()']]], - ['selftest_84',['selfTest',['../class_solar_position.html#aced032bb94f6fcff47e66747f7547396',1,'SolarPosition::selfTest()'],['../class_weber_penn_tree.html#a9fc96eafd81b0aa3ca628e25abbda28b',1,'WeberPennTree::selfTest()'],['../class_voxel_intersection.html#a320f16f7b1ee5c32b35c91331b426221',1,'VoxelIntersection::selfTest()'],['../class_visualizer.html#a1dc0a74852187800f44d2eaba4154650',1,'Visualizer::selfTest()'],['../class_synthetic_annotation.html#a8ed7db69b40f2b0c49da32a87d5ef34e',1,'SyntheticAnnotation::selfTest()'],['../class_radiation_model.html#a4c9038e22b7457bc0eae2ef0ffed25ad',1,'RadiationModel::selfTest()'],['../class_plant_architecture.html#a6b3134c58139507a4dcdce7c523ce039',1,'PlantArchitecture::selfTest()'],['../class_stomatal_conductance_model.html#aa32dad6bf0ee3ecb37b02957ebea0e3d',1,'StomatalConductanceModel::selfTest()'],['../classhelios_1_1_context.html#af55c655d7c570741080048ef28a0f750',1,'helios::Context::selfTest()'],['../class_aerial_li_d_a_rcloud.html#a330d36513eee2cc559c09fb71c18f566',1,'AerialLiDARcloud::selfTest()'],['../class_b_l_conductance_model.html#a6e85abcd1e8544d66af25394cace6ed4',1,'BLConductanceModel::selfTest()'],['../class_canopy_generator.html#af7f6d2ec2ee512af381cfaf5c414b505',1,'CanopyGenerator::selfTest()'],['../class_energy_balance_model.html#ad4a1681ae6edd9f82d23e6a8ef3fc26c',1,'EnergyBalanceModel::selfTest()'],['../class_leaf_optics.html#a5f5d878ba9b955e52c3dfff46e10416f',1,'LeafOptics::selfTest()'],['../class_li_d_a_rcloud.html#aaa2f35f02a65d4a7a731c4989dd9aa36',1,'LiDARcloud::selfTest()']]], - ['selftest_2ecpp_85',['selfTest.cpp',['../core_2src_2self_test_8cpp.html',1,'(Global Namespace)'],['../plugins_2lidar_2src_2self_test_8cpp.html',1,'(Global Namespace)'],['../plugins_2plantarchitecture_2src_2self_test_8cpp.html',1,'(Global Namespace)'],['../plugins_2radiation_2src_2self_test_8cpp.html',1,'(Global Namespace)']]], - ['separate_5fstring_5fby_5fdelimiter_86',['separate_string_by_delimiter',['../group__functions.html#gae239abbec7c2ff618b3603bf69ccf2ed',1,'helios']]], - ['setbackgroundcolor_87',['setBackgroundColor',['../class_visualizer.html#a6e54e59d971acaadbf4cef72a28585ce',1,'Visualizer']]], - ['setbmfcoefficientsfromlibrary_88',['setBMFCoefficientsFromLibrary',['../class_stomatal_conductance_model.html#abca589232617a8543feff66ca10d5d79',1,'StomatalConductanceModel::setBMFCoefficientsFromLibrary(const std::string &species, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a67b1af836d98f934a9e4ba1390523413',1,'StomatalConductanceModel::setBMFCoefficientsFromLibrary(const std::string &species)']]], - ['setboundarylayermodel_89',['setBoundaryLayerModel',['../class_b_l_conductance_model.html#ab07e423e0cbc9a431368b9fddcfd93c7',1,'BLConductanceModel::setBoundaryLayerModel(uint UUID, const char *gH_model)'],['../class_b_l_conductance_model.html#a601d3eba5024cff7290fa564f619c9df',1,'BLConductanceModel::setBoundaryLayerModel(const char *gH_model)'],['../class_b_l_conductance_model.html#a0a9e992d831834b188474e973cd41ee4',1,'BLConductanceModel::setBoundaryLayerModel(const std::vector< uint > &UUIDs, const char *gH_model)']]], - ['setbranchrecursionlevel_90',['setBranchRecursionLevel',['../class_weber_penn_tree.html#a7aee9ed5ca2f7696179029b0c3ec5522',1,'WeberPennTree']]], - ['setbranchsegmentresolution_91',['setBranchSegmentResolution',['../class_weber_penn_tree.html#a8b39281ab94cb9d77bcc4aa67a226796',1,'WeberPennTree']]], - ['setcamerafieldofview_92',['setCameraFieldOfView',['../class_visualizer.html#a4b92cdf1bb8f0c5411f9834839c3def4',1,'Visualizer']]], - ['setcameralookat_93',['setCameraLookat',['../class_radiation_model.html#a8560b5c278ae279e0a2bf78ec33409bf',1,'RadiationModel']]], - ['setcameraorientation_94',['setCameraOrientation',['../class_radiation_model.html#a2fb90fb962f16b13e4afc020ecb74b31',1,'RadiationModel::setCameraOrientation(const std::string &camera_label, const helios::vec3 &direction)'],['../class_radiation_model.html#aa8e73030b94c82fc52635affca88ebf9',1,'RadiationModel::setCameraOrientation(const std::string &camera_label, const helios::SphericalCoord &direction)']]], - ['setcameraposition_95',['setCameraPosition',['../class_radiation_model.html#a9ec01ae743b29b5a0e9da04b24a7b230',1,'RadiationModel::setCameraPosition()'],['../class_visualizer.html#ac6af1cee39fc442f47548e0dd69ebb1c',1,'Visualizer::setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)'],['../class_visualizer.html#a7dd09cda5b3865b9ca5799560bf3e008',1,'Visualizer::setCameraPosition(const helios::SphericalCoord &cameraAngle, const helios::vec3 &lookAt)']]], - ['setcameraspectralresponse_96',['setCameraSpectralResponse',['../class_radiation_model.html#a1ea2acedb464217f1acc38f0e05d353f',1,'RadiationModel']]], - ['setcellcoverfraction_97',['setCellCoverFraction',['../class_aerial_li_d_a_rcloud.html#a41adc0bac55f6b4bf6dbf8aa00b87d47',1,'AerialLiDARcloud']]], - ['setcellgroundheight_98',['setCellGroundHeight',['../class_aerial_li_d_a_rcloud.html#a7e9921a6fa458f6f9ff71272d81ed711',1,'AerialLiDARcloud']]], - ['setcellgtheta_99',['setCellGtheta',['../class_li_d_a_rcloud.html#a4c8d55452f2423ddf8b77effbf443075',1,'LiDARcloud']]], - ['setcellleafarea_100',['setCellLeafArea',['../class_li_d_a_rcloud.html#a32643f365dda44670b5b132c4eee8442',1,'LiDARcloud::setCellLeafArea()'],['../class_aerial_li_d_a_rcloud.html#a789143d75bd6e27e4eecd4af676d03a0',1,'AerialLiDARcloud::setCellLeafArea(const float area, const helios::int3 ijk)']]], - ['setcellmaximumhitheight_101',['setCellMaximumHitHeight',['../class_aerial_li_d_a_rcloud.html#a5de093096f98d0f7ac30bb17de6f8815',1,'AerialLiDARcloud']]], - ['setcellrbar_102',['setCellRbar',['../class_aerial_li_d_a_rcloud.html#a0e16c7d7d1c6e876d234e2409f24fafe',1,'AerialLiDARcloud']]], - ['setcelltransmissionprobability_103',['setCellTransmissionProbability',['../class_aerial_li_d_a_rcloud.html#a6fae4d874d859d1b09e10eacc23dee7e',1,'AerialLiDARcloud']]], - ['setcellvegetationheight_104',['setCellVegetationHeight',['../class_aerial_li_d_a_rcloud.html#afa007ec27f0e1b321c522e5ce780d812',1,'AerialLiDARcloud']]], - ['setcolor_105',['setColor',['../classhelios_1_1_compound_object.html#a2c652ccbd87bd8308706a2ed0989e32b',1,'helios::CompoundObject::setColor(const helios::RGBAcolor &color)'],['../classhelios_1_1_compound_object.html#acc54a3160aa1bc81789d627a108e61bb',1,'helios::CompoundObject::setColor(const helios::RGBcolor &color)']]], - ['setcolorbarfontcolor_106',['setColorbarFontColor',['../class_visualizer.html#a452fa37af4c7294b8b631ee83c6fe46c',1,'Visualizer']]], - ['setcolorbarfontsize_107',['setColorbarFontSize',['../class_visualizer.html#a40280c3f96152de174a4d9b26cc58c9d',1,'Visualizer']]], - ['setcolorbarposition_108',['setColorbarPosition',['../class_visualizer.html#ad0a19f3097299a4407919d6fd9c5fefe',1,'Visualizer']]], - ['setcolorbarrange_109',['setColorbarRange',['../class_visualizer.html#ac41ea2148985f9797ca84a3affa35da9',1,'Visualizer']]], - ['setcolorbarsize_110',['setColorbarSize',['../class_visualizer.html#a7efb1e8bc6de19f885781b564573066f',1,'Visualizer']]], - ['setcolorbarticks_111',['setColorbarTicks',['../class_visualizer.html#aabe4913f9a3444a5fea906382eeb6037',1,'Visualizer']]], - ['setcolorbartitle_112',['setColorbarTitle',['../class_visualizer.html#ae30cb19cb7d003ebbc0851c51c45d8a8',1,'Visualizer']]], - ['setcolormap_113',['setColormap',['../class_visualizer.html#a9ec2fbf7ed0518b053dc831574dd9446',1,'Visualizer::setColormap(const std::vector< helios::RGBcolor > &colors, const std::vector< float > &divisions)'],['../class_visualizer.html#a992f636c4c406bbfc3f29add1fa3a278',1,'Visualizer::setColormap(Ctable colormap_name)']]], - ['setcurrenttimeseriespoint_114',['setCurrentTimeseriesPoint',['../group__timeseries.html#ga3ca2e5c0a2c1983d552fd7ee57d04997',1,'helios::Context']]], - ['setdate_115',['setDate',['../classhelios_1_1_context.html#a5b9565e477a321ec7b7b9b62d43b2139',1,'helios::Context::setDate(int day, int month, int year)'],['../classhelios_1_1_context.html#a76a34480ca16cfde5e940d07235fcbbb',1,'helios::Context::setDate(const Date &date)'],['../classhelios_1_1_context.html#a810169fc94d22368ff83c357e13b0a61',1,'helios::Context::setDate(int Julian_day, int year)']]], - ['setdepthbiasmatrix_116',['setDepthBiasMatrix',['../struct_shader.html#a0efa9af9639f9dc4b2c119a8b3a3981b',1,'Shader']]], - ['setdiffuseradiationextinctioncoeff_117',['setDiffuseRadiationExtinctionCoeff',['../class_radiation_model.html#a11255a6b9afa49a30b164d0eb9640767',1,'RadiationModel::setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::SphericalCoord &peak_dir)'],['../class_radiation_model.html#ac85aa79af6c1b3b50081216c6c257225',1,'RadiationModel::setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::vec3 &peak_dir)']]], - ['setdiffuseradiationflux_118',['setDiffuseRadiationFlux',['../class_radiation_model.html#aa976502e7f722222399fbfe4f25dbe05',1,'RadiationModel']]], - ['setdiffuseraycount_119',['setDiffuseRayCount',['../class_radiation_model.html#ab279259e3c925d3213d8bf097156fd02',1,'RadiationModel']]], - ['setdiffusespectrum_120',['setDiffuseSpectrum',['../class_radiation_model.html#a1b1ae98cd2ba54fb8d1da8d434014e3d',1,'RadiationModel::setDiffuseSpectrum(const std::string &band_label, const std::string &spectrum_label)'],['../class_radiation_model.html#af698122e4c9cb2855cca5e54037c985d',1,'RadiationModel::setDiffuseSpectrum(const std::string &spectrum_label)']]], - ['setdiffusespectrumintegral_121',['setDiffuseSpectrumIntegral',['../class_radiation_model.html#a278b621362ef2fdb528f0669a6cd0224',1,'RadiationModel::setDiffuseSpectrumIntegral(const std::string &band_label, float spectrum_integral, float wavelength1, float wavelength2)'],['../class_radiation_model.html#a5469495a0aee0e2d9f29100fa5d8683e',1,'RadiationModel::setDiffuseSpectrumIntegral(const std::string &band_label, float spectrum_integral)'],['../class_radiation_model.html#afa3b8ade09099752b11e5249b975a6c6',1,'RadiationModel::setDiffuseSpectrumIntegral(float spectrum_integral, float wavelength1, float wavelength2)'],['../class_radiation_model.html#a6b733f931af8bed3bf13452d971d5c29',1,'RadiationModel::setDiffuseSpectrumIntegral(float spectrum_integral)']]], - ['setdirectraycount_122',['setDirectRayCount',['../class_radiation_model.html#a48c6ea6e90806e3c4942348996c29391',1,'RadiationModel']]], - ['setdynamictimeconstants_123',['setDynamicTimeConstants',['../class_stomatal_conductance_model.html#a317e6d8d262ddffb5e66839ee987a067',1,'StomatalConductanceModel::setDynamicTimeConstants(float tau_open, float tau_close, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a045fd837e2328617901dfd4e15f1da29',1,'StomatalConductanceModel::setDynamicTimeConstants(float tau_open, float tau_close)']]], - ['setfarquharcoefficientsfromlibrary_124',['setFarquharCoefficientsFromLibrary',['../class_photosynthesis_model.html#afc73dbd1a744c6f4aae456349e040b27',1,'PhotosynthesisModel::setFarquharCoefficientsFromLibrary(const std::string &species, const std::vector< uint > &UUIDs)'],['../class_photosynthesis_model.html#a3e47f7c5fe8100cf93ba9454b911bba4',1,'PhotosynthesisModel::setFarquharCoefficientsFromLibrary(const std::string &species)']]], - ['setglobaldata_125',['setGlobalData',['../classhelios_1_1_context.html#a526467937f59154a0c9a2915c5153d1e',1,'helios::Context::setGlobalData(const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a05f1b6122de12b60a94ad9d8ad673ee7',1,'helios::Context::setGlobalData(const char *label, HeliosDataType type, size_t size, void *data)'],['../classhelios_1_1_context.html#aa92b28a9c26bbff7e5621e1c9dd48086',1,'helios::Context::setGlobalData(const char *label, const int &data)'],['../classhelios_1_1_context.html#a4218481857cdd07cae78f2b7808534b0',1,'helios::Context::setGlobalData(const char *label, const uint &data)'],['../classhelios_1_1_context.html#a0cb1f9f692d9e2f225f148eedc180c3f',1,'helios::Context::setGlobalData(const char *label, const float &data)'],['../classhelios_1_1_context.html#a86ae444d6a565d3a53b40ab86d90e31f',1,'helios::Context::setGlobalData(const char *label, const double &data)'],['../classhelios_1_1_context.html#a843249de363a1fff0ce37175c4731ac0',1,'helios::Context::setGlobalData(const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#aede18efe430ee34910042933d8ed3810',1,'helios::Context::setGlobalData(const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a6dcd5f1df0ee040046f68cd1be8f05a1',1,'helios::Context::setGlobalData(const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#ae13ebc953481eb686436ad5c0ec0feef',1,'helios::Context::setGlobalData(const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a6244085c9792f55eecd47fcb1139d716',1,'helios::Context::setGlobalData(const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#ad7503da3c31420ba92d4a4e2bec76ff9',1,'helios::Context::setGlobalData(const char *label, const helios::int4 &data)']]], - ['sethitdata_126',['setHitData',['../class_li_d_a_rcloud.html#a4ad8b12380a24f48ecfbae0ad6b5cfaa',1,'LiDARcloud::setHitData()'],['../class_aerial_li_d_a_rcloud.html#aba54610f999856adb4ae4ab4b244a553',1,'AerialLiDARcloud::setHitData()']]], - ['sethitgridcell_127',['setHitGridCell',['../class_li_d_a_rcloud.html#a122b1716c42af6a07d48ad23b5acb427',1,'LiDARcloud::setHitGridCell()'],['../class_aerial_li_d_a_rcloud.html#afa9735ddfc392110712a20029cbfd2ed',1,'AerialLiDARcloud::setHitGridCell()']]], - ['setinternodemaxlength_128',['setInternodeMaxLength',['../struct_phytomer.html#a25a09ac7a2eb07d34fed5c6d9fad213e',1,'Phytomer']]], - ['setinternodemaxradius_129',['setInternodeMaxRadius',['../struct_phytomer.html#a70aa0f62afdf829d9f2af6167d30f8ca',1,'Phytomer']]], - ['setleafprototypescale_130',['setLeafPrototypeScale',['../struct_phytomer.html#ae6bbbd7dcf85fb3b11062e2b0cb415e3',1,'Phytomer']]], - ['setleafscalefraction_131',['setLeafScaleFraction',['../struct_phytomer.html#ab089057c5102fd40a09a92d5a424bfdb',1,'Phytomer']]], - ['setleafsubdivisions_132',['setLeafSubdivisions',['../class_weber_penn_tree.html#a085a56d129e306469147762509fa7378',1,'WeberPennTree']]], - ['setlightdirection_133',['setLightDirection',['../class_visualizer.html#a492533fe226fa92d08b010dc9a3f6e93',1,'Visualizer::setLightDirection()'],['../struct_shader.html#a197c0e45d7c831ffb337b892b3e29594',1,'Shader::setLightDirection()']]], - ['setlightingmodel_134',['setLightingModel',['../class_visualizer.html#afc496b8bd99bbb786d553c4b3e8dfded',1,'Visualizer::setLightingModel()'],['../struct_shader.html#a08f9e96dbdea98bf178f902549c8096b',1,'Shader::setLightingModel(uint lightingmodel) const']]], - ['setlightintensity_135',['setLightIntensity',['../struct_shader.html#adb7e2c4c14638b056e39b6b9827bef97',1,'Shader']]], - ['setlightintensityfactor_136',['setLightIntensityFactor',['../class_visualizer.html#ae2227bdf3b92fb67bcad6acf7e9279b0',1,'Visualizer']]], - ['setlocation_137',['setLocation',['../classhelios_1_1_context.html#adb901722158039153a7556ef06827e21',1,'helios::Context']]], - ['setminscatterenergy_138',['setMinScatterEnergy',['../class_radiation_model.html#a68adae041b6d017cc640ff90a2648f02',1,'RadiationModel']]], - ['setmodelcoefficients_139',['setModelCoefficients',['../class_stomatal_conductance_model.html#a5939354a840f4a2199ad6610b22e4d89',1,'StomatalConductanceModel::setModelCoefficients(const std::vector< BMFcoefficients > &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a29e691b7d3fa4348b8a5ef859483ed91',1,'StomatalConductanceModel::setModelCoefficients(const BBcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a07294b1dfa951bcdf2fb1608959607c4',1,'StomatalConductanceModel::setModelCoefficients(const BBcoefficients &coeffs)'],['../class_stomatal_conductance_model.html#a1b6ffb0b1beef707d77b273b9cc7f9c9',1,'StomatalConductanceModel::setModelCoefficients(const BMFcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a97e78eaec6ca94159c55499a40bc7807',1,'StomatalConductanceModel::setModelCoefficients(const BMFcoefficients &coeffs)'],['../class_stomatal_conductance_model.html#a17211c4b6d87e120f182de8cc3cc7aa7',1,'StomatalConductanceModel::setModelCoefficients(const MOPTcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a24ba00d45416d57afe43628712a32fc3',1,'StomatalConductanceModel::setModelCoefficients(const MOPTcoefficients &coeffs)'],['../class_stomatal_conductance_model.html#a48b91aeb301f53d13656d0a6f1d16fe7',1,'StomatalConductanceModel::setModelCoefficients(const BBLcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a37d7b81a2082a09d351bea4590d3eadb',1,'StomatalConductanceModel::setModelCoefficients(const BBLcoefficients &coeffs)'],['../class_stomatal_conductance_model.html#ae0ce3cb199ab635b5563ec2added7ae8',1,'StomatalConductanceModel::setModelCoefficients(const BWBcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#afbbb0af7d8b3c7966058dbb1289dca13',1,'StomatalConductanceModel::setModelCoefficients(const BWBcoefficients &coeffs)'],['../class_photosynthesis_model.html#ab9ae18a68ca6b3f5639385a7c29076bf',1,'PhotosynthesisModel::setModelCoefficients(const std::vector< FarquharModelCoefficients > &modelcoefficients, const std::vector< uint > &UUIDs)'],['../class_photosynthesis_model.html#a80a8bb51f617da1a7e2d03a67890bf1d',1,'PhotosynthesisModel::setModelCoefficients(const EmpiricalModelCoefficients &modelcoefficients)'],['../class_photosynthesis_model.html#a5a17e8185dd7ad90b4d155bb4f610d85',1,'PhotosynthesisModel::setModelCoefficients(const EmpiricalModelCoefficients &modelcoefficients, const std::vector< uint > &UUIDs)'],['../class_photosynthesis_model.html#a394870e63a056a12b7031bfadbf9ae6b',1,'PhotosynthesisModel::setModelCoefficients(const FarquharModelCoefficients &modelcoefficients)'],['../class_photosynthesis_model.html#a37ee0175960589edf257726c2a3e0356',1,'PhotosynthesisModel::setModelCoefficients(const FarquharModelCoefficients &modelcoefficients, const std::vector< uint > &UUIDs)']]], - ['setmodeltype_5fempirical_140',['setModelType_Empirical',['../class_photosynthesis_model.html#ae4f1ad6808c1b8ccc28912a4a7dd9363',1,'PhotosynthesisModel']]], - ['setmodeltype_5ffarquhar_141',['setModelType_Farquhar',['../class_photosynthesis_model.html#a63e25c843c66fcca47e816a3978e989d',1,'PhotosynthesisModel']]], - ['setobjectcolor_142',['setObjectColor',['../classhelios_1_1_context.html#a53a30c9a819df9153025ef3b7e89c536',1,'helios::Context::setObjectColor(const std::vector< uint > &ObjIDs, const helios::RGBAcolor &color)'],['../classhelios_1_1_context.html#a0c9146e4df91eeed82989fd89a436dcf',1,'helios::Context::setObjectColor(uint ObjID, const helios::RGBAcolor &color)'],['../classhelios_1_1_context.html#a41e1e95cb347f0ad25008f4fd128b0ff',1,'helios::Context::setObjectColor(const std::vector< uint > &ObjIDs, const helios::RGBcolor &color)'],['../classhelios_1_1_context.html#a62bdd296ce410e272e6f82a41c27935d',1,'helios::Context::setObjectColor(uint ObjID, const helios::RGBcolor &color)']]], - ['setobjectdata_143',['setObjectData',['../classhelios_1_1_context.html#add1f2dff968114e12cc8f2a8f7b364d9',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#aa4d8933f40fc51cab3abe9cfcdb34e7d',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#af321368266e6b84665817b875deb530b',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#aac050e413c74fc286f57a077ace9ad8a',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#af85ecaf6d6d040258e66758e30739324',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#aeec21f6416d64e7a5b7dddbe3a07372a',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a80cc9fac3b3411d1470e8b7a37a9f867',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#add40dc92c4e4d0fb1f7a2fc10da5214e',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a638267ca0da2ad2070da281eaf34f04a',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a4a90397534b17c91d2a5897c0fa4e110',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a503793f406ad42ab94e23cf890f6dd0b',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a61b179ccebf291849bc79ac76de78940',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a410b495a7408fda18da26a815b76889d',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#ab30e197faaa31bc942ca6519d9212e64',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a667a87b0fdd41ce1d01fe01e97b12d8d',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#a33eb32f1916ccb4aa920d8e6adc3ae81',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a01a97d15d63268ac511ca8859b4c68f8',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_compound_object.html#a6442aef7859238fc3a49cb9187548c7c',1,'helios::CompoundObject::setObjectData(const char *label, const helios::vec2 &data)'],['../classhelios_1_1_compound_object.html#acf473c0595a525618fc6a5e39fca40e6',1,'helios::CompoundObject::setObjectData(const char *label, const int &data)'],['../classhelios_1_1_compound_object.html#a5730d9c317726f1a0ed3a396575a0957',1,'helios::CompoundObject::setObjectData(const char *label, const uint &data)'],['../classhelios_1_1_compound_object.html#ac657af83b036f3c886d2f64d0697378f',1,'helios::CompoundObject::setObjectData(const char *label, const float &data)'],['../classhelios_1_1_compound_object.html#a316d892dd85e920bfb964d3017dc25c4',1,'helios::CompoundObject::setObjectData(const char *label, const double &data)'],['../classhelios_1_1_context.html#aee97bd83087427bd59fcb287f5dc3531',1,'helios::Context::setObjectData()'],['../classhelios_1_1_compound_object.html#af93de91ec2dc1cdeca58c09d6f1febb1',1,'helios::CompoundObject::setObjectData(const char *label, const helios::vec3 &data)'],['../classhelios_1_1_compound_object.html#ac7815b7cda94f76a87e564f9d9b05a3c',1,'helios::CompoundObject::setObjectData(const char *label, const helios::vec4 &data)'],['../classhelios_1_1_compound_object.html#ae19d6e464af601cea45a1c631c8f44b2',1,'helios::CompoundObject::setObjectData(const char *label, const helios::int2 &data)'],['../classhelios_1_1_compound_object.html#a48d6781ec37e21f405cf368f854ef19a',1,'helios::CompoundObject::setObjectData(const char *label, const helios::int3 &data)'],['../classhelios_1_1_compound_object.html#a3b03b96096e7618e7a3865225413b7b9',1,'helios::CompoundObject::setObjectData(const char *label, const helios::int4 &data)'],['../classhelios_1_1_compound_object.html#a3369928e9718d521cf135051a3f60e81',1,'helios::CompoundObject::setObjectData(const char *label, const std::string &data)'],['../classhelios_1_1_compound_object.html#a93395e379a6266f31364ea1cd7f65cea',1,'helios::CompoundObject::setObjectData(const char *label, HeliosDataType type, uint size, void *data)'],['../classhelios_1_1_context.html#a6ad7971a0c42fcf3b185d92354cb95b2',1,'helios::Context::setObjectData(uint objID, const char *label, const int &data)'],['../classhelios_1_1_context.html#a13c69bf3d81189d4a0c93409ba0d9207',1,'helios::Context::setObjectData(uint objID, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a43a3a8d47b237941ff8cb5a8e37bec0c',1,'helios::Context::setObjectData(uint objID, const char *label, const float &data)'],['../classhelios_1_1_context.html#a65866490e5eca5169c8865038bbad7a0',1,'helios::Context::setObjectData(uint objID, const char *label, const double &data)'],['../classhelios_1_1_context.html#a476c80474522dfa1b1e24e7ea2aaba41',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a2513df3e1520fde62df047d62d7e6645',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a9fe071caed6756577d147c130e10f6aa',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#a862846ca49277adcee6350e598999743',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#ac20d7c0ffe64e39835be77b4d0932a1b',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#a0345eb747604912fe02af987e0b5950a',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#ace339d1e727d6aa4308e9153ea0df480',1,'helios::Context::setObjectData(uint objID, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#ab25c2b85edded276a5e100702c63c07e',1,'helios::Context::setObjectData(uint objIDs, const char *label, HeliosDataType type, uint size, void *data)'],['../classhelios_1_1_context.html#af1cfa4877dd8e1ecc1dca0e819378ff6',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#af2f608a87e8b8552e9cb3632a24c3ab9',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a8423c26081c83aeaf24e9d3002449450',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#ab023969f177745818be2bb909fbf97c0',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#a55584d6bd6e20c67375cf91c6d56ec91',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#ac97287d999956f8e689ea6df0d035516',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a05b21f0772970223c636f32ab2cd51ec',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#aacd2386732ad774427ea7e034bf5642b',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a6d12369392b2092af37bd64b904021f6',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#aaf0447235525b6f26c706b06f159446e',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a2e2a4371cd1af5af7ee256db1c5f3f94',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a86111a5ee990e7d4fd0cf45ba676d776',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#ac35897c934684bf6bc274b06d67dc10c',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a11bc2418b81e2e771fdbb0cacde189ae',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#a80d2bd91fc42731a50b091b96c610660',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const double &data)']]], - ['setobjecttransformationmatrix_144',['setObjectTransformationMatrix',['../classhelios_1_1_context.html#a31d7cc0676201cf2513e7c4c87ed7481',1,'helios::Context::setObjectTransformationMatrix(const std::vector< uint > &ObjIDs, float(&T)[16])'],['../classhelios_1_1_context.html#ae9627595f57c55b4c540d239fa7889e1',1,'helios::Context::setObjectTransformationMatrix(uint ObjID, float(&T)[16])']]], - ['setpadvalue_145',['setPadValue',['../class_radiation_model.html#a73fac0b01c685471de95cd7bdfb5ef7b',1,'RadiationModel']]], - ['setplantphenologicalthresholds_146',['setPlantPhenologicalThresholds',['../class_plant_architecture.html#a041d11df76990a5b0beb694955788301',1,'PlantArchitecture']]], - ['setprimitivecolor_147',['setPrimitiveColor',['../classhelios_1_1_context.html#a22dce781917215d2e80784ae5eb78d60',1,'helios::Context::setPrimitiveColor(uint UUID, const helios::RGBAcolor &color)'],['../classhelios_1_1_context.html#af445c8f33a279ce7374d1b2691ef1f1c',1,'helios::Context::setPrimitiveColor(const std::vector< uint > &UUIDs, const helios::RGBcolor &color)'],['../classhelios_1_1_context.html#a029f95ee0056f027866f8bad2fe9e48e',1,'helios::Context::setPrimitiveColor(uint UUID, const helios::RGBcolor &color)'],['../classhelios_1_1_context.html#aa4e3d7f71aaa0823edd9341b3c2d786c',1,'helios::Context::setPrimitiveColor(const std::vector< uint > &UUIDs, const helios::RGBAcolor &color)']]], - ['setprimitivedata_148',['setPrimitiveData',['../classhelios_1_1_context.html#accd3e2ac5a3d87d6232fc22b83bcda12',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#aace047cba0c9e4c1eff9576d972c1911',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#a1804c156ced6f5170c2598a08bcef591',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a67cd49500d77ca6308b9d78a19bf88e1',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#aae92b01f3ddb4cc429201690915d40d1',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#af083c0cb69b3d9550848a9995b8feb18',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a9c4326dc8d8c8b7e195b9a1ba76ac59f',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#a6ff3779ada111fc103a7ecefa6a8a736',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#acd544b707254a434620527f7df1014a5',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a952aab995b6549ebd30204c84666f315',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a0ae4cb43e3ef7a1e2de9471480549252',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a7eac4377c1c06b4967f0817386ff0b4f',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#a6af8952525fc82f010e800fa36a67719',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a2704360051e07066eff51e8056b4aa46',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a9e9465353484026f03c8b1bf531a5258',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a2eb91839363153ca1f35feabf41043eb',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#aaeb1ac9f83289382d93f7f928678e43d',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#a86baeff8b954def960e6c99ebbb10c86',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#ac7677094a3bbcb62506ce461d982af1d',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const int &data)'],['../classhelios_1_1_context.html#a62ee96ec6df77c6451a6c67efd4d67da',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a5271a627fdfd0731cfde8016fbc42652',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const float &data)'],['../classhelios_1_1_context.html#a16457aac3e2c40890c2d05bbf4d36e3d',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const double &data)'],['../classhelios_1_1_context.html#a480acac6101b32110856aabe4c674ad1',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a9512442e3771220e49946af21db01b9b',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#aaae3a5abba76fd76b37f3488522a9ef2',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#ad87da629799dd7cd5469676675145f37',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a9d7bc32ca67260588402ca9999326ecb',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#a135888cd244b54848cc6117613e0bf5d',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a8002c535b841c78d0ec9430362186c9e',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a866183b15bb63a464a7de9de0faef0f4',1,'helios::Context::setPrimitiveData(const uint &UUIDs, const char *label, HeliosDataType type, uint size, void *data)'],['../classhelios_1_1_context.html#acff5da084e7c9d2c90c73edca24c07d3',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#aa3a6f6eae58a58be9d212b0c3956eaf9',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a075ecb2de0d5239188a643b1bd937396',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#a1f4e4e874b0aa4419616044086267d65',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a5cc520e5d9325eca45103430dc5c93be',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a8ad05382759041555c89c26069f30e48',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a7a8797c39a45b7e265edd7741b2510e5',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#a28ab165fde1de4555e832ec7dd6bfcbb',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#af54a5f531284ea6b04be4cfb99db7d06',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#a0293ea9fb3750432f27f716d46d61f7b',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#aaf69d2f0621b95dfadcccae2594c5645',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a0946dae4ec20fe3ea42ad8e5bec56767',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#a643cfcaed693097e98c340c6c9e8d5d2',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#ae93791b3c29ac4879451bcbe16d76956',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#aa8b86ea5363d7a88b7954385320f72d3',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec4 &data)']]], - ['setprimitiveparentobjectid_149',['setPrimitiveParentObjectID',['../classhelios_1_1_context.html#a5d7974e92bd4ac128ffae0c36cfad85d',1,'helios::Context::setPrimitiveParentObjectID(uint UUID, uint objID)'],['../classhelios_1_1_context.html#ac97ab81d1324437cadae575a76f5ef80',1,'helios::Context::setPrimitiveParentObjectID(const std::vector< uint > &UUIDs, uint objID)']]], - ['setprimitivetexturefile_150',['setPrimitiveTextureFile',['../classhelios_1_1_context.html#a89466d607b5499cbee7614c425270570',1,'helios::Context']]], - ['setprimitivetransformationmatrix_151',['setPrimitiveTransformationMatrix',['../classhelios_1_1_context.html#af7d8333251195bcc4788792d9aa6f37c',1,'helios::Context::setPrimitiveTransformationMatrix(uint UUID, float(&T)[16])'],['../classhelios_1_1_context.html#a9447c0c5ad7f1f19d606f227d164f679',1,'helios::Context::setPrimitiveTransformationMatrix(const std::vector< uint > &UUIDs, float(&T)[16])']]], - ['setprimitiveuuids_152',['setPrimitiveUUIDs',['../classhelios_1_1_compound_object.html#a0b00455ff0bab50e012bd6e7b5a54a51',1,'helios::CompoundObject']]], - ['setproperties_153',['setProperties',['../class_leaf_optics.html#ac7a1cfe512d9417c26ad798a94cbdba1',1,'LeafOptics']]], - ['setscatteringdepth_154',['setScatteringDepth',['../class_radiation_model.html#a6d2c7374b0de7f50b1857b95c606182f',1,'RadiationModel']]], - ['setsourceflux_155',['setSourceFlux',['../class_radiation_model.html#a2fa24d994612857ddc889e705b0444b1',1,'RadiationModel::setSourceFlux(uint source_ID, const std::string &band_label, float flux)'],['../class_radiation_model.html#a85a5126035acb66aeea93886255dca47',1,'RadiationModel::setSourceFlux(const std::vector< uint > &source_ID, const std::string &band_label, float flux)']]], - ['setsourceposition_156',['setSourcePosition',['../class_radiation_model.html#aa25715f947c98e00efebb1cc96af7071',1,'RadiationModel::setSourcePosition(uint source_ID, const helios::vec3 &position)'],['../class_radiation_model.html#a9ccfc277d9f9f38c29b7cb4cbb8e98f1',1,'RadiationModel::setSourcePosition(uint source_ID, const helios::SphericalCoord &position)']]], - ['setsourcespectrum_157',['setSourceSpectrum',['../class_radiation_model.html#ab99467c6cee84a59d6b4df6b34f0fba7',1,'RadiationModel::setSourceSpectrum(uint source_ID, const std::string &spectrum_label)'],['../class_radiation_model.html#a790ce56ed07f2f40b80be9676fa02c05',1,'RadiationModel::setSourceSpectrum(uint source_ID, const std::vector< helios::vec2 > &spectrum)'],['../class_radiation_model.html#a88b8a77a11c6aa1caf6ef931c39710c2',1,'RadiationModel::setSourceSpectrum(const std::vector< uint > &source_ID, const std::vector< helios::vec2 > &spectrum)'],['../class_radiation_model.html#a04c39684e5ac12c403f6dc68cec06877',1,'RadiationModel::setSourceSpectrum(const std::vector< uint > &source_ID, const std::string &spectrum_label)']]], - ['setsourcespectrumintegral_158',['setSourceSpectrumIntegral',['../class_radiation_model.html#a0d07935957cc6651d38a621513581189',1,'RadiationModel::setSourceSpectrumIntegral(uint source_ID, float source_integral)'],['../class_radiation_model.html#af39f938b1c2bde9af59d0d96311c8d9a',1,'RadiationModel::setSourceSpectrumIntegral(uint source_ID, float source_integral, float wavelength1, float wavelength2)']]], - ['setsubdivisioncount_159',['setSubdivisionCount',['../classhelios_1_1_tile.html#a8d9bd065c9607ccb2ac0b20e945fb51f',1,'helios::Tile::setSubdivisionCount()'],['../classhelios_1_1_sphere.html#a7e215edcae37bcd70051deea1bfb59eb',1,'helios::Sphere::setSubdivisionCount()'],['../classhelios_1_1_box.html#a4659cc09d90d34f4d993c107612ac6aa',1,'helios::Box::setSubdivisionCount()'],['../classhelios_1_1_disk.html#af3481e8589adbf120be158a591b0acda',1,'helios::Disk::setSubdivisionCount()'],['../classhelios_1_1_cone.html#a44fce4adcb863c4049640d4e8757563f',1,'helios::Cone::setSubdivisionCount()']]], - ['setsundirection_160',['setSunDirection',['../class_solar_position.html#af52dad396956d1699fb08ceed6f9a29e',1,'SolarPosition']]], - ['settexturemap_161',['setTextureMap',['../struct_shader.html#ab2e9dda74f59acd1bfa0bbfb6d405526',1,'Shader']]], - ['settexturemask_162',['setTextureMask',['../struct_shader.html#a7800ac33a9f3fdaefad983d6fe851fa7',1,'Shader::setTextureMask(const Glyph *glyph, uint &textureID)'],['../struct_shader.html#acabe2ce63e1a7fc5773803e3174de7ac',1,'Shader::setTextureMask(const char *texture_file, uint &textureID, helios::int2 &texture_size)']]], - ['settileobjectsubdivisioncount_163',['setTileObjectSubdivisionCount',['../classhelios_1_1_context.html#a01957c516d832789a0fe613accc71f72',1,'helios::Context::setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)'],['../classhelios_1_1_context.html#a14626fb1701c57a683418b9b9d442913',1,'helios::Context::setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, float area_ratio)']]], - ['settime_164',['setTime',['../classhelios_1_1_context.html#ae3d9e19581787775556b8dd7dc1ac845',1,'helios::Context::setTime(int minute, int hour)'],['../classhelios_1_1_context.html#a940a77e10a3210bcf3b292e029cc3fda',1,'helios::Context::setTime(int second, int minute, int hour)'],['../classhelios_1_1_context.html#ad40aa40adbee471a588a1e32eb721db4',1,'helios::Context::setTime(const Time &time)']]], - ['settransformationmatrix_165',['setTransformationMatrix',['../classhelios_1_1_compound_object.html#a55a1ebd9699cb1c9ae0ca39b3db8f9b4',1,'helios::CompoundObject::setTransformationMatrix()'],['../struct_shader.html#af0ef553d486d1c50da7e2a96ec048ba9',1,'Shader::setTransformationMatrix()']]], - ['settreeparameters_166',['setTreeParameters',['../class_weber_penn_tree.html#a43a71d285a4dba83a6afc3870847e8eb',1,'WeberPennTree']]], - ['settrianglevertices_167',['setTriangleVertices',['../classhelios_1_1_context.html#a639c36e288b6a154ee6a827a9e497351',1,'helios::Context']]], - ['settrunksegmentresolution_168',['setTrunkSegmentResolution',['../class_weber_penn_tree.html#ab7ee7dfc8e8d599ea6875203af7ec002',1,'WeberPennTree']]], - ['settubenodes_169',['setTubeNodes',['../classhelios_1_1_tube.html#ae11824e0497c6a97e912e341da388a7d',1,'helios::Tube::setTubeNodes()'],['../classhelios_1_1_context.html#af3076c6a493bb0b888882adee34d039e',1,'helios::Context::setTubeNodes()']]], - ['settuberadii_170',['setTubeRadii',['../classhelios_1_1_tube.html#a50362d071c320d6ec8d5aa9b26c5570f',1,'helios::Tube::setTubeRadii()'],['../classhelios_1_1_context.html#afbbb8692fb22c4c7475738556af0ec6a',1,'helios::Context::setTubeRadii()']]], - ['shader_171',['Shader',['../struct_shader.html',1,'']]], - ['shoot_172',['Shoot',['../struct_shoot.html',1,'']]], - ['shoot_5fangle_173',['shoot_angle',['../struct_white_spruce_canopy_parameters.html#a6d61ce74788b23c5539f4bc1a65caf1e',1,'WhiteSpruceCanopyParameters']]], - ['shoot_5fangle_5fbase_174',['shoot_angle_base',['../struct_split_grapevine_parameters.html#a37ae8efcf5324eed693d79ebd33edb91',1,'SplitGrapevineParameters']]], - ['shoot_5fangle_5fbase_5fspread_175',['shoot_angle_base_spread',['../struct_split_grapevine_parameters.html#a17998fb21f60d03be7f2c7844deaec3d',1,'SplitGrapevineParameters']]], - ['shoot_5fangle_5ftip_176',['shoot_angle_tip',['../struct_split_grapevine_parameters.html#af4c2209be803fc0118328b97eeb50ab3',1,'SplitGrapevineParameters']]], - ['shoot_5fangle_5ftip_5fspread_177',['shoot_angle_tip_spread',['../struct_split_grapevine_parameters.html#ad8b40619cc10ce5d1a71077972658084',1,'SplitGrapevineParameters']]], - ['shoot_5fcolor_178',['shoot_color',['../struct_bean_parameters.html#ac98b67b586790c21f7c78a53829a62da',1,'BeanParameters::shoot_color()'],['../struct_tomato_parameters.html#a55cd91024165c3139c172ec3add2333c',1,'TomatoParameters::shoot_color()']]], - ['shoot_5findex_179',['shoot_index',['../struct_phytomer.html#aa35d5da6c2d3ae761d1b4ce491db2e17',1,'Phytomer']]], - ['shoot_5flength_180',['shoot_length',['../struct_base_grape_vine_parameters.html#a93f5db8eb3001cdc8a5d84c0addd6b2b',1,'BaseGrapeVineParameters']]], - ['shoot_5flength_5fspread_181',['shoot_length_spread',['../struct_base_grape_vine_parameters.html#a53fe3fa053a5aa71ca4ea22956e554ec',1,'BaseGrapeVineParameters']]], - ['shoot_5fradius_182',['shoot_radius',['../struct_white_spruce_canopy_parameters.html#a515f8b93fb025d4413e06ed4afef82d3',1,'WhiteSpruceCanopyParameters::shoot_radius()'],['../struct_base_grape_vine_parameters.html#ab849b6c742cec6ae33db7aeb4d94b6dd',1,'BaseGrapeVineParameters::shoot_radius()']]], - ['shoot_5fradius_5fspread_183',['shoot_radius_spread',['../struct_base_grape_vine_parameters.html#a0988985e1efda816cbee5273f67fcb28',1,'BaseGrapeVineParameters']]], - ['shoot_5fsubdivisions_184',['shoot_subdivisions',['../struct_bean_parameters.html#a35e44fe9bff11ba69c7d1dce97fa2883',1,'BeanParameters::shoot_subdivisions()'],['../struct_tomato_parameters.html#a056a0790faac4d769f749f75979c37af',1,'TomatoParameters::shoot_subdivisions()']]], - ['shootparameters_185',['ShootParameters',['../struct_shoot_parameters.html',1,'ShootParameters'],['../struct_shoot_parameters.html#ab3003af230c520f6ff26010ca3ef850e',1,'ShootParameters::ShootParameters()'],['../struct_shoot_parameters.html#ab02d5fb11149500aae2d2480c3a75b6e',1,'ShootParameters::ShootParameters(std::minstd_rand0 *generator)']]], - ['shoots_5fper_5fcordon_186',['shoots_per_cordon',['../struct_base_grape_vine_parameters.html#a80a0060ddd5de6e77e9071d320f49702',1,'BaseGrapeVineParameters']]], - ['shoots_5fper_5fcordon_5fspread_187',['shoots_per_cordon_spread',['../struct_base_grape_vine_parameters.html#a5b20278772fcefb3ecace03fda12885e',1,'BaseGrapeVineParameters']]], - ['showwatermark_188',['showWatermark',['../class_visualizer.html#a2f5e413bb5e48d98f061845065dfb830',1,'Visualizer']]], - ['shx_189',['Shx',['../struct_shx.html',1,'']]], - ['sliceprimitive_190',['slicePrimitive',['../class_voxel_intersection.html#a31bb0e73e1018d371b8927c10fb415cb',1,'VoxelIntersection']]], - ['sliceprimitivesusinggrid_191',['slicePrimitivesUsingGrid',['../class_voxel_intersection.html#a03d0dcdbf67ada3ba0d99b0e3754ef61',1,'VoxelIntersection']]], - ['solar_20position_20plugin_20documentation_192',['Solar Position Plugin Documentation',['../_solar_position_doc.html',1,'PlugIns']]], - ['solarposition_193',['SolarPosition',['../class_solar_position.html#a25fa8345e4101fa2d63757ca1bc9fe10',1,'SolarPosition::SolarPosition(helios::Context *context_ptr)'],['../class_solar_position.html#aad8b52cdec7e725441001f99dce4316f',1,'SolarPosition::SolarPosition(float UTC_hrs, float latitude_deg, float longitude_deg, helios::Context *context_ptr)'],['../class_solar_position.html',1,'SolarPosition']]], - ['solarposition_2ecpp_194',['SolarPosition.cpp',['../_solar_position_8cpp.html',1,'']]], - ['solarposition_2eh_195',['SolarPosition.h',['../_solar_position_8h.html',1,'']]], - ['sorghum_196',['sorghum',['../class_canopy_generator.html#a1e1b20fe60767277a4440e7a918d507c',1,'CanopyGenerator']]], - ['sorghum_5fstage_197',['sorghum_stage',['../struct_sorghum_canopy_parameters.html#ae438f61b66b95f9ada7f9f34a7162e2c',1,'SorghumCanopyParameters']]], - ['sorghumcanopyparameters_198',['SorghumCanopyParameters',['../struct_sorghum_canopy_parameters.html#a135111963ff4580035611f3af2babe37',1,'SorghumCanopyParameters::SorghumCanopyParameters()'],['../struct_sorghum_canopy_parameters.html',1,'SorghumCanopyParameters'],['../struct_sorghum_canopy_parameters.html#a5d06ca3cd236193ada9662f0787abd40',1,'SorghumCanopyParameters::SorghumCanopyParameters()']]], - ['source_5fflux_5fscaling_5ffactor_199',['source_flux_scaling_factor',['../struct_radiation_source.html#a96bb8f5309cd171067e2693a6fb0118f',1,'RadiationSource']]], - ['source_5ffluxes_200',['source_fluxes',['../struct_radiation_source.html#af57db9db9cd4f389eecd547e474644d3',1,'RadiationSource']]], - ['source_5fid_201',['source_ID',['../struct_per_ray_data.html#a1c5097650f40749e55c984db780e1b1a',1,'PerRayData']]], - ['source_5fposition_202',['source_position',['../struct_radiation_source.html#a7b6944d5b003d2001d4e0a096c2d72c2',1,'RadiationSource']]], - ['source_5fposition_5fscaling_5ffactor_203',['source_position_scaling_factor',['../struct_radiation_source.html#a1a48a8fce4d1edba23aba7490fd1a6f7',1,'RadiationSource']]], - ['source_5frotation_204',['source_rotation',['../struct_radiation_source.html#ac436b7a30a4f1a614df2d4b4fa5a4b5a',1,'RadiationSource']]], - ['source_5fspectrum_205',['source_spectrum',['../struct_radiation_source.html#a2a5320be3f9facc5863928f81dbc8823',1,'RadiationSource']]], - ['source_5ftype_206',['source_type',['../struct_radiation_source.html#ad6e32df75c976c45dbf00b6f76eb1c48',1,'RadiationSource']]], - ['source_5fwidth_207',['source_width',['../struct_radiation_source.html#a6135f3233535ed8dbbf0075d4123dc07',1,'RadiationSource']]], - ['sphere_208',['Sphere',['../classhelios_1_1_sphere.html',1,'helios::Sphere'],['../classhelios_1_1_sphere.html#a4b215db8d3d2c52925b5bdd8b5b02eae',1,'helios::Sphere::Sphere()']]], - ['sphere2cart_209',['sphere2cart',['../group__functions.html#ga97e12cf9fda6bf8b65b3ccc17e788c12',1,'helios']]], - ['sphericalcoord_210',['SphericalCoord',['../structhelios_1_1_spherical_coord.html',1,'helios::SphericalCoord'],['../structhelios_1_1_spherical_coord.html#a93171497b8c90975366e1945e6993dcd',1,'helios::SphericalCoord::SphericalCoord()'],['../structhelios_1_1_spherical_coord.html#adb761c897335d495e5f2b42064ccb5b1',1,'helios::SphericalCoord::SphericalCoord(float radius, float elevation_radians, float azimuth_radians)'],['../structhelios_1_1_spherical_coord.html#aada6ce13523a731118c7a603a8d7c4d2',1,'helios::SphericalCoord::SphericalCoord(const SphericalCoord &c)']]], - ['sphericalcrownscanopyparameters_211',['SphericalCrownsCanopyParameters',['../struct_spherical_crowns_canopy_parameters.html',1,'SphericalCrownsCanopyParameters'],['../struct_spherical_crowns_canopy_parameters.html#a9f4c0922be93c14cbeefcf816a392077',1,'SphericalCrownsCanopyParameters::SphericalCrownsCanopyParameters()'],['../struct_spherical_crowns_canopy_parameters.html#a6109ceebfa172d0a452c67bd4add93da',1,'SphericalCrownsCanopyParameters::SphericalCrownsCanopyParameters(const pugi::xml_node canopy_node)']]], - ['spline_5finterp3_212',['spline_interp3',['../group__functions.html#ga7f8e948aa3a70481ebd3a829531bee4e',1,'helios']]], - ['splitgrapevineparameters_213',['SplitGrapevineParameters',['../struct_split_grapevine_parameters.html',1,'SplitGrapevineParameters'],['../struct_split_grapevine_parameters.html#a63c5f4e090194bc74f35c1099b5520d4',1,'SplitGrapevineParameters::SplitGrapevineParameters()'],['../struct_split_grapevine_parameters.html#a9f1e4d3e220effa2eccc0f4040ce15db',1,'SplitGrapevineParameters::SplitGrapevineParameters(const pugi::xml_node canopy_node)']]], - ['stdev_214',['stdev',['../group__functions.html#ga8a9b7ab24b0bb17b901c3ba41af760ec',1,'helios']]], - ['stem_5fcolor_215',['stem_color',['../struct_strawberry_parameters.html#aef7973d815b5bfb9c09e27130681d857',1,'StrawberryParameters']]], - ['stem_5flength_216',['stem_length',['../struct_bean_parameters.html#a68612ab1ea804835e5fd7c1723144e4f',1,'BeanParameters']]], - ['stem_5fradius_217',['stem_radius',['../struct_bean_parameters.html#a9636c5c02d104a795fa06b759df1f888',1,'BeanParameters::stem_radius()'],['../struct_strawberry_parameters.html#ac774348e3a59b3a79cf21e1b4634489f',1,'StrawberryParameters::stem_radius()']]], - ['stem_5fsubdivisions_218',['stem_subdivisions',['../struct_strawberry_parameters.html#a07bd64fa21e059f5db73fbfb9d4c9607',1,'StrawberryParameters']]], - ['stems_5fper_5fplant_219',['stems_per_plant',['../struct_strawberry_parameters.html#a26ecd0d74e8339a2c40f05a7de926ef9',1,'StrawberryParameters']]], - ['stomatal_20conductance_20model_20plugin_20documentation_220',['Stomatal Conductance Model Plugin Documentation',['../_stomatal_doc.html',1,'PlugIns']]], - ['stomatalconductancemodel_221',['StomatalConductanceModel',['../class_stomatal_conductance_model.html#a8d0993a2649b696c37c2f24799b1b545',1,'StomatalConductanceModel::StomatalConductanceModel()'],['../class_stomatal_conductance_model.html',1,'StomatalConductanceModel']]], - ['stomatalconductancemodel_2ecpp_222',['StomatalConductanceModel.cpp',['../_stomatal_conductance_model_8cpp.html',1,'']]], - ['stomatalconductancemodel_2eh_223',['StomatalConductanceModel.h',['../_stomatal_conductance_model_8h.html',1,'']]], - ['storecanopyparameters_224',['storeCanopyParameters',['../class_canopy_generator.html#a1d73a30e5717cdd18a89ff51fe9970e3',1,'CanopyGenerator']]], - ['strawberry_225',['strawberry',['../class_canopy_generator.html#a61ad89294ae8c964aff9cd18d273fc10',1,'CanopyGenerator']]], - ['strawberryparameters_226',['StrawberryParameters',['../struct_strawberry_parameters.html#a4eb336cbf5135adf114135c958fdb41e',1,'StrawberryParameters::StrawberryParameters()'],['../struct_strawberry_parameters.html#aa58f8ff7655ded0ad470c81a3b34d718',1,'StrawberryParameters::StrawberryParameters(const pugi::xml_node canopy_node)'],['../struct_strawberry_parameters.html',1,'StrawberryParameters']]], - ['strength_227',['strength',['../struct_per_ray_data.html#a3510f98e1f2a49183edf5173a2d9f935',1,'PerRayData']]], - ['string2int2_228',['string2int2',['../group__functions.html#ga2f83561e691aad4ecd41ac3879e59568',1,'helios']]], - ['string2int3_229',['string2int3',['../group__functions.html#gad1dbf51cdf1912828487e67ca51cccef',1,'helios']]], - ['string2int4_230',['string2int4',['../group__functions.html#ga4aa73326d27fdaba24fac984db5b8009',1,'helios']]], - ['string2rgbcolor_231',['string2RGBcolor',['../group__functions.html#ga8180158609698aae15da7574b085b817',1,'helios']]], - ['string2vec2_232',['string2vec2',['../group__functions.html#ga18616cd1df8b05b03eb6c2be0de54e3b',1,'helios']]], - ['string2vec3_233',['string2vec3',['../group__functions.html#ga65954cbb0f79c3fd5032f2cc27ad3b4f',1,'helios']]], - ['string2vec4_234',['string2vec4',['../group__functions.html#gadf3012a1d77a5aa50347de3a7175cb1a',1,'helios']]], - ['subdivisions_235',['subdivisions',['../struct_leaf_prototype.html#a2a90483933ca70d5bd87079e607d5d38',1,'LeafPrototype']]], - ['sum_236',['sum',['../group__functions.html#gaa20cc657b6475964d10022adc9850313',1,'helios']]], - ['sumplantleafarea_237',['sumPlantLeafArea',['../class_plant_architecture.html#ae8be24e5a963c49e7ab9ce5641fddec6',1,'PlantArchitecture']]], - ['sumprimitivesurfacearea_238',['sumPrimitiveSurfaceArea',['../classhelios_1_1_context.html#af7fae7c44d5608b23016300d8a917d9a',1,'helios::Context']]], - ['syntheticannotation_239',['SyntheticAnnotation',['../class_synthetic_annotation.html#a4a5fa05deea2f4a9ce20f7b941c23725',1,'SyntheticAnnotation::SyntheticAnnotation()'],['../class_synthetic_annotation.html',1,'SyntheticAnnotation']]], - ['syntheticannotation_2ecpp_240',['SyntheticAnnotation.cpp',['../_synthetic_annotation_8cpp.html',1,'']]], - ['syntheticannotation_2eh_241',['SyntheticAnnotation.h',['../_synthetic_annotation_8h.html',1,'']]], - ['syntheticscan_242',['syntheticScan',['../class_li_d_a_rcloud.html#a0a4118588bb1a17e5d855a18ffbde299',1,'LiDARcloud::syntheticScan(helios::Context *context, int rays_per_pulse, float pulse_distance_threshold, bool scan_grid_only, bool record_misses)'],['../class_li_d_a_rcloud.html#a027d03054878ad27a705a839c36ba0cf',1,'LiDARcloud::syntheticScan(helios::Context *context, bool scan_grid_only, bool record_misses)'],['../class_li_d_a_rcloud.html#aac5cafa2281f9d479f2bb56be0780e31',1,'LiDARcloud::syntheticScan(helios::Context *context)'],['../class_aerial_li_d_a_rcloud.html#a82abe2d47cc135f9f795ffaa15e4e041',1,'AerialLiDARcloud::syntheticScan(helios::Context *context, const char *xml_file, const int rays_per_pulse, const float pulse_distance_threshold)'],['../class_aerial_li_d_a_rcloud.html#a0d56ae98d2ab2ad7008640b0ea4ffaea',1,'AerialLiDARcloud::syntheticScan(helios::Context *context, const char *xml_file)'],['../class_li_d_a_rcloud.html#aca2bef5f45b9c7f65e04952ed1551f25',1,'LiDARcloud::syntheticScan()']]] + ['jpg_5ferror_5fmgr_0',['jpg_error_mgr',['../structjpg__error__mgr.html',1,'']]], + ['julian2calendar_1',['Julian2Calendar',['../group__vectors.html#gad744b2f0b25c66570a13cba4ace0455b',1,'helios']]], + ['julianday_2',['JulianDay',['../structhelios_1_1_date.html#abf3a401379adb23851174683a9191efc',1,'helios::Date::JulianDay()'],['../global_8h.html#a7a889dd38f803c031f3e2ce6936b1cdc',1,'helios::JulianDay(int day, int month, int year)'],['../group__functions.html#ga4e5ae2905291ff8a5ed97bc93e7fe71d',1,'helios::JulianDay(const Date &date)']]] ]; diff --git a/doc/html/search/all_13.js b/doc/html/search/all_13.js index 4eab46a6c..71b1661d2 100644 --- a/doc/html/search/all_13.js +++ b/doc/html/search/all_13.js @@ -1,41 +1,4 @@ var searchData= [ - ['texture_0',['Texture',['../classhelios_1_1_texture.html',1,'helios::Texture'],['../classhelios_1_1_texture.html#a219d0c23431e27022fbac3c0b38befd6',1,'helios::Texture::Texture()']]], - ['thetamax_1',['thetaMax',['../struct_scan_metadata.html#a2654da6ef2d7d383ba912cbc6cbfeedf',1,'ScanMetadata']]], - ['thetamin_2',['thetaMin',['../struct_scan_metadata.html#a1b5a4f80f3d64d54755d2b6499f3863f',1,'ScanMetadata']]], - ['tic_3',['tic',['../structhelios_1_1_timer.html#a47d04d3a8054ad2b6bbb9623c000090c',1,'helios::Timer']]], - ['tile_4',['Tile',['../classhelios_1_1_tile.html',1,'helios::Tile'],['../classhelios_1_1_tile.html#ae7a684eae38bd9f5b3397962cd1a2774',1,'helios::Tile::Tile()']]], - ['tile_5fbounds_5',['tile_bounds',['../primitive_intersection_8cu.html#a4fd84a7124be9fea427690a9a2442b3b',1,'primitiveIntersection.cu']]], - ['tile_5fintersect_6',['tile_intersect',['../primitive_intersection_8cu.html#ac645addc8bc3071933ca33a0f053af07',1,'primitiveIntersection.cu']]], - ['time_7',['Time',['../structhelios_1_1_time.html',1,'helios::Time'],['../structhelios_1_1_time.html#a6265f89a66bfff369fecf125bebfa3e2',1,'helios::Time::Time()'],['../structhelios_1_1_time.html#a2b47ac09cf37b9183c1236beebd2bd10',1,'helios::Time::Time(int hour, int minute)'],['../structhelios_1_1_time.html#a98d45a9c451c5ff2013b78f7d1ee7f57',1,'helios::Time::Time(int hour, int minute, int second)']]], - ['timer_8',['Timer',['../structhelios_1_1_timer.html',1,'helios']]], - ['timeseries_9',['Timeseries',['../group__timeseries.html',1,'']]], - ['toc_10',['toc',['../structhelios_1_1_timer.html#a9d3f79551cc1089cb6dd81d3bb68f537',1,'helios::Timer::toc() const'],['../structhelios_1_1_timer.html#a0449918d3129616aa908b5580069c7b6',1,'helios::Timer::toc(const char *message) const']]], - ['tomato_11',['tomato',['../class_canopy_generator.html#a47b1aef12b71a5a406b6ac1caa7c7363',1,'CanopyGenerator']]], - ['tomatoparameters_12',['TomatoParameters',['../struct_tomato_parameters.html',1,'TomatoParameters'],['../struct_tomato_parameters.html#ab799d673013e4ef5c257293d9951a462',1,'TomatoParameters::TomatoParameters()'],['../struct_tomato_parameters.html#ab687e0d3051c1c94fff2c61e5db971b4',1,'TomatoParameters::TomatoParameters(const pugi::xml_node canopy_node)']]], - ['translate_13',['translate',['../classhelios_1_1_compound_object.html#aa16f6ad8ec100173147c89bb2c5e0446',1,'helios::CompoundObject']]], - ['translateobject_14',['translateObject',['../classhelios_1_1_context.html#a70805980c2c201082507dcfdde4399d1',1,'helios::Context::translateObject(uint ObjID, const vec3 &shift)'],['../classhelios_1_1_context.html#a886b95e094bc80e95c602e9e81b568ad',1,'helios::Context::translateObject(const std::vector< uint > &ObjIDs, const vec3 &shift)']]], - ['translateprimitive_15',['translatePrimitive',['../classhelios_1_1_context.html#a1ae827c4e0c90a883430bd1db95993e1',1,'helios::Context::translatePrimitive(uint UUID, const vec3 &shift)'],['../classhelios_1_1_context.html#a1e98dca73f3e6282b2d1c3a0458b14a4',1,'helios::Context::translatePrimitive(const std::vector< uint > &UUIDs, const vec3 &shift)']]], - ['triad_16',['Triad',['../struct_triad.html',1,'']]], - ['triangle_5fbounds_17',['triangle_bounds',['../primitive_intersection_8cu.html#a0a93209b8d30eee91f87b1b714991b3a',1,'primitiveIntersection.cu']]], - ['triangle_5fintersect_18',['triangle_intersect',['../primitive_intersection_8cu.html#a393a839ba1216483ca3d447e45d930ab',1,'primitiveIntersection.cu']]], - ['triangulatehitpoints_19',['triangulateHitPoints',['../class_li_d_a_rcloud.html#a2e2d9ac728f839b64cedb20582d77d48',1,'LiDARcloud::triangulateHitPoints(float Lmax, float max_aspect_ratio, const char *scalar_field, float threshold, const char *comparator)'],['../class_li_d_a_rcloud.html#ac495385c9dc7cc7773819ce77175242a',1,'LiDARcloud::triangulateHitPoints(float Lmax, float max_aspect_ratio)']]], - ['triangulation_20',['Triangulation',['../struct_triangulation.html',1,'']]], - ['trim_5fwhitespace_21',['trim_whitespace',['../group__functions.html#ga56b873fa7b729dd84412d44156fa2dca',1,'helios']]], - ['trunk_5fheight_22',['trunk_height',['../struct_walnut_canopy_parameters.html#aeaa0ebb5a837d6a57254f8a1f023aef9',1,'WalnutCanopyParameters::trunk_height()'],['../struct_base_grape_vine_parameters.html#a85d8f22abdda39c464a48e1fc60bd064',1,'BaseGrapeVineParameters::trunk_height()'],['../struct_white_spruce_canopy_parameters.html#a46f1f25dba30c6af07228680d80837a6',1,'WhiteSpruceCanopyParameters::trunk_height()']]], - ['trunk_5fheight_5fspread_23',['trunk_height_spread',['../struct_base_grape_vine_parameters.html#a5980a12f332f92c2d084d1a1120a8dd3',1,'BaseGrapeVineParameters']]], - ['trunk_5fradius_24',['trunk_radius',['../struct_base_grape_vine_parameters.html#ab842729ff885c8d8476e5c2c204e2979',1,'BaseGrapeVineParameters::trunk_radius()'],['../struct_white_spruce_canopy_parameters.html#ab5771594720bf44fc57c40cedd629ff5',1,'WhiteSpruceCanopyParameters::trunk_radius()'],['../struct_walnut_canopy_parameters.html#a4d86caeb5dffe23b091a9c808005f307',1,'WalnutCanopyParameters::trunk_radius()']]], - ['trunk_5fradius_5fspread_25',['trunk_radius_spread',['../struct_base_grape_vine_parameters.html#a6f2bca2ded24fa8da8f71d9b7ae5e033',1,'BaseGrapeVineParameters']]], - ['trunkreconstruction_26',['trunkReconstruction',['../class_li_d_a_rcloud.html#aa7d6abb997267bce460c48cf02dc3545',1,'LiDARcloud']]], - ['tube_27',['Tube',['../classhelios_1_1_tube.html',1,'helios::Tube'],['../classhelios_1_1_tube.html#a10d74e5d06813e05c2b188ee170339c9',1,'helios::Tube::Tube()']]], - ['tutorial_200_3a_20context_20self_2dtest_20tutorial_28',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], - ['tutorial_2010_3a_20radiation_20model_20basics_20_2d_20tree_20light_20interception_29',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], - ['tutorial_2011_3a_20light_20interception_20and_20fraction_20of_20sunlit_2fshaded_20leaf_20area_20for_20a_20homogeneous_20canopy_30',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], - ['tutorial_201_3a_20helios_20vector_20types_20tutorial_31',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]], - ['tutorial_202_3a_20working_20with_20context_20geometry_32',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], - ['tutorial_205_3a_20primitive_20data_33',['Tutorial 5: Primitive Data',['../context_primdata.html',1,'Tutorials']]], - ['tutorial_206_3a_20global_20data_34',['Tutorial 6: Global Data',['../context_globaldata.html',1,'Tutorials']]], - ['tutorial_207_3a_20_25visualizer_20basics_35',['Tutorial 7: %Visualizer Basics',['../visualizer_basics.html',1,'Tutorials']]], - ['tutorial_208_3a_20visualizing_20primitive_20data_20values_36',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], - ['tutorials_37',['Tutorials',['../_tutorials.html',1,'']]] + ['known_20issues_0',['Known Issues',['../_aerial_li_d_a_r_doc.html#AerialLiDARissues',1,'Known Issues'],['../_b_l_conductance_doc.html#BLCissues',1,'Known Issues'],['../_energy_balance_doc.html#EBissues',1,'Known Issues'],['../_li_d_a_r_doc.html#LiDARissues',1,'Known Issues'],['../_visualizer_doc.html#VisIssues',1,'Known Issues'],['../_voxel_intersection_doc.html#VoxelIssues',1,'Known Issues'],['../_weber_penn_doc.html#WPTissues',1,'Known Issues']]] ]; diff --git a/doc/html/search/all_14.js b/doc/html/search/all_14.js index 41c7c7b7b..f4ce4ddfc 100644 --- a/doc/html/search/all_14.js +++ b/doc/html/search/all_14.js @@ -1,18 +1,89 @@ var searchData= [ - ['unilateralgrapevineparameters_0',['UnilateralGrapevineParameters',['../struct_unilateral_grapevine_parameters.html',1,'UnilateralGrapevineParameters'],['../struct_unilateral_grapevine_parameters.html#a1f4063470113acb28186cf92b3030283',1,'UnilateralGrapevineParameters::UnilateralGrapevineParameters()'],['../struct_unilateral_grapevine_parameters.html#ab85a40a1bc4bd1880f74814278ff7fd2',1,'UnilateralGrapevineParameters::UnilateralGrapevineParameters(const pugi::xml_node canopy_node)']]], - ['unique_5fprototypes_1',['unique_prototypes',['../struct_leaf_prototype.html#a900f658b122d42dc24a42838fb16f189',1,'LeafPrototype']]], - ['updatecameraresponse_2',['updateCameraResponse',['../class_radiation_model.html#afabb4e1a6c8c67ccc9c68aab7dfd07e3',1,'RadiationModel']]], - ['updatecameraresponsespectra_3',['updateCameraResponseSpectra',['../struct_camera_calibration.html#a900b08896dc2c3bf892311478d895883',1,'CameraCalibration']]], - ['updatecurrentshootparameters_4',['updateCurrentShootParameters',['../class_plant_architecture.html#a2074dfe285a623833dd07b4aa0b93a7c',1,'PlantArchitecture::updateCurrentShootParameters(const std::string &shoot_type_label, const ShootParameters &params)'],['../class_plant_architecture.html#a4539115c4ba145fa10277d3dcfa63685',1,'PlantArchitecture::updateCurrentShootParameters(const std::map< std::string, ShootParameters > &params)']]], - ['updategeometry_5',['updateGeometry',['../class_radiation_model.html#acf5fe304146a9270bf0e841f59e51934',1,'RadiationModel::updateGeometry()'],['../class_radiation_model.html#a28ab342e5959369755037fa5ec039e70',1,'RadiationModel::updateGeometry(const std::vector< uint > &UUIDs)']]], - ['updateshootnodes_6',['updateShootNodes',['../struct_shoot.html#a19eb5d6e3248c45de08774d11cbf329b',1,'Shoot']]], - ['useobjecttexturecolor_7',['useObjectTextureColor',['../classhelios_1_1_context.html#ad58362537512f6df9028a60181d88af0',1,'helios::Context::useObjectTextureColor(uint ObjID)'],['../classhelios_1_1_context.html#a92457a1277ce0e5918e20007193001bf',1,'helios::Context::useObjectTextureColor(const std::vector< uint > &ObjIDs)']]], - ['useprimitivetexturecolor_8',['usePrimitiveTextureColor',['../classhelios_1_1_context.html#a60aaa1a72ff6ebcd28c48b7dfbc3ca7c',1,'helios::Context::usePrimitiveTextureColor(uint UUID)'],['../classhelios_1_1_context.html#a563083497cce82f251e0eaf238cb3600',1,'helios::Context::usePrimitiveTextureColor(const std::vector< uint > &UUIDs)']]], - ['user_2fapi_20guide_9',['User/API Guide',['../_a_p_i.html',1,'']]], - ['useshader_10',['useShader',['../struct_shader.html#a07520fd004cb1fd118597151d00e2c24',1,'Shader']]], - ['usetexturecolor_11',['useTextureColor',['../classhelios_1_1_compound_object.html#ad40fa98ddefc9ba9d24cd45ca0df44d5',1,'helios::CompoundObject']]], - ['using_20the_20clion_20ide_20with_20helios_12',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], - ['utc_5foffset_13',['UTC_offset',['../structhelios_1_1_location.html#afd6a8f1100ee868e966f191719733058',1,'helios::Location']]], - ['utility_20functions_14',['Utility functions',['../group__functions.html',1,'']]] + ['label_0',['label',['../struct_radiation_band.html#a2929fde6f333f2aeba923886fc84887f',1,'RadiationBand']]], + ['laminar_20flat_20plate_20forced_20convection_1',['1. The Polhausen Equation (Laminar Flat Plate, Forced Convection)',['../_b_l_conductance_doc.html#BLC1',1,'']]], + ['laminar_20flow_20around_20a_20sphere_2',['3. Laminar flow around a sphere',['../_b_l_conductance_doc.html#BLC3',1,'']]], + ['laminar_20inclined_20plate_20mixed_20free_20forced_20convection_3',['2. Laminar Inclined Plate, Mixed Free-Forced Convection',['../_b_l_conductance_doc.html#BLC2',1,'']]], + ['lasthitfilter_4',['lastHitFilter',['../class_li_d_a_rcloud.html#ab812d48fd5d81a8cc382bf0d1214496d',1,'LiDARcloud']]], + ['lateral_5fcurvature_5',['lateral_curvature',['../struct_leaf_prototype.html#a6ccef984c87ae4203d7b620d3ac4e177',1,'LeafPrototype']]], + ['latitude_5fdeg_6',['latitude_deg',['../structhelios_1_1_location.html#a3924339ab5a0e35c47519792c335ff22',1,'helios::Location']]], + ['law_7',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['layer_20conductance_20model_8',['Boundary-layer Conductance Model',['../_energy_balance_doc.html#EBblc',1,'']]], + ['layer_20conductance_20model_20plug_20in_9',['Using the Boundary Layer Conductance Model Plug-in',['../_b_l_conductance_doc.html#BLUse',1,'']]], + ['layer_20conductance_20model_20plugin_20documentation_10',['Boundary-Layer Conductance Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'PlugIns']]], + ['layer_20conductance_20model_20to_20be_20used_11',['Setting the Boundary-layer Conductance Model To Be Used',['../_b_l_conductance_doc.html#BLCSet',1,'']]], + ['layer_20conductance_20models_12',['Boundary-layer Conductance Models',['../_b_l_conductance_doc.html#BLCModels',1,'']]], + ['leaf_20angle_20distribution_20functions_13',['User-Defined Leaf Angle Distribution Functions',['../_weber_penn_doc.html#WPTgL',1,'']]], + ['leaf_20area_14',['Leaf area',['../_aerial_li_d_a_r_doc.html#AerialLeafArea',1,'']]], + ['leaf_20area_20for_20a_20homogeneous_20canopy_15',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['leaf_20area_20for_20each_20grid_20cell_16',['Calculating leaf area for each grid cell',['../_li_d_a_r_doc.html#LiDARleafarea',1,'']]], + ['leaf_20area_20fraction_20from_20the_20simulation_17',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['leaf_20mask_18',['Leaf mask',['../_weber_penn_doc.html#WPTreeMask',1,'']]], + ['leaf_20prototypes_19',['Leaf Prototypes',['../_plant_architecture_doc.html#LeafPrototypes',1,'']]], + ['leaf_5fangle_5fdistribution_20',['leaf_angle_distribution',['../struct_homogeneous_canopy_parameters.html#a9d22fee5250b0fc616acdd91e5cb34b2',1,'HomogeneousCanopyParameters::leaf_angle_distribution'],['../struct_spherical_crowns_canopy_parameters.html#ab11d57364434c44388b83a7a04dc9bd0',1,'SphericalCrownsCanopyParameters::leaf_angle_distribution'],['../struct_conical_crowns_canopy_parameters.html#a071b3d2e2ebaa9921702b483682fb6d6',1,'ConicalCrownsCanopyParameters::leaf_angle_distribution']]], + ['leaf_5farea_5fdensity_21',['leaf_area_density',['../struct_spherical_crowns_canopy_parameters.html#ab625b07dbc7f73b11d4af2932e96158d',1,'SphericalCrownsCanopyParameters::leaf_area_density'],['../struct_conical_crowns_canopy_parameters.html#ac15b062cb9d964163b49f7590e3804a8',1,'ConicalCrownsCanopyParameters::leaf_area_density']]], + ['leaf_5farea_5findex_22',['leaf_area_index',['../struct_homogeneous_canopy_parameters.html#ae8880f6cbbdd6c69caee3cedba4ef542',1,'HomogeneousCanopyParameters']]], + ['leaf_5fbuckle_5fangle_23',['leaf_buckle_angle',['../struct_leaf_prototype.html#ab24b8cb372c52a7cd2c138d415fc9622',1,'LeafPrototype']]], + ['leaf_5fbuckle_5flength_24',['leaf_buckle_length',['../struct_leaf_prototype.html#ab628d133df921861f8db3d36f4fc6496',1,'LeafPrototype']]], + ['leaf_5fcolor_25',['leaf_color',['../struct_homogeneous_canopy_parameters.html#a3fc69732f3f0790dc858fe4ed8abf3fd',1,'HomogeneousCanopyParameters::leaf_color'],['../struct_spherical_crowns_canopy_parameters.html#a7d08f35ed3ce045b74bd4479ca4cb5b4',1,'SphericalCrownsCanopyParameters::leaf_color'],['../struct_conical_crowns_canopy_parameters.html#a3ace8715f3b5e0b91272e9a718642ee4',1,'ConicalCrownsCanopyParameters::leaf_color']]], + ['leaf_5flength_26',['leaf_length',['../struct_tomato_parameters.html#a0fc2acabb718f35337f71046fb540f83',1,'TomatoParameters::leaf_length'],['../struct_strawberry_parameters.html#afcfe4fd8f2cdba4df2d031e048ff18cb',1,'StrawberryParameters::leaf_length'],['../struct_walnut_canopy_parameters.html#a7b59b3a39200e3cd904806700ebcef03',1,'WalnutCanopyParameters::leaf_length'],['../struct_bean_parameters.html#a1c21ac308fa92de4fa722701e714b473',1,'BeanParameters::leaf_length']]], + ['leaf_5foffset_27',['leaf_offset',['../struct_leaf_prototype.html#aa8fc5dd4868a81ef7c8d34d4aa255daf',1,'LeafPrototype']]], + ['leaf_5fsize_28',['leaf_size',['../struct_homogeneous_canopy_parameters.html#a2edb9f81abc15976ca0d338677105b06',1,'HomogeneousCanopyParameters::leaf_size'],['../struct_spherical_crowns_canopy_parameters.html#a48c2ab4110bc38b4f412250d8e3e8051',1,'SphericalCrownsCanopyParameters::leaf_size'],['../struct_conical_crowns_canopy_parameters.html#a914f22b9bd8d046d5c2d661ddacbfb69',1,'ConicalCrownsCanopyParameters::leaf_size']]], + ['leaf_5fspacing_5ffraction_29',['leaf_spacing_fraction',['../struct_base_grape_vine_parameters.html#a55cc37c53fdd62e586f836129bde9a45',1,'BaseGrapeVineParameters']]], + ['leaf_5fspacing_5ffraction_5fspread_30',['leaf_spacing_fraction_spread',['../struct_base_grape_vine_parameters.html#a4406907ab0df63e9aa3f11416b79dd17',1,'BaseGrapeVineParameters']]], + ['leaf_5fsubdivisions_31',['leaf_subdivisions',['../struct_homogeneous_canopy_parameters.html#a7e385ca3b257c8012d8336c03a617b31',1,'HomogeneousCanopyParameters::leaf_subdivisions'],['../struct_spherical_crowns_canopy_parameters.html#aa7ddee04ae15e0aa0814702a0ef4a034',1,'SphericalCrownsCanopyParameters::leaf_subdivisions'],['../struct_conical_crowns_canopy_parameters.html#a1871e049c234ab2237ccf1fa717d632b',1,'ConicalCrownsCanopyParameters::leaf_subdivisions'],['../struct_base_grape_vine_parameters.html#a93f3e632f8d7dd45f17559ca5a131091',1,'BaseGrapeVineParameters::leaf_subdivisions'],['../struct_tomato_parameters.html#a2a3d8f1b74a1800db22926eaf2ec9ea8',1,'TomatoParameters::leaf_subdivisions'],['../struct_strawberry_parameters.html#a863f21593c3e36c1a43730e8a1594e9d',1,'StrawberryParameters::leaf_subdivisions'],['../struct_walnut_canopy_parameters.html#a4709a2450a721bd0cd148917c866663f',1,'WalnutCanopyParameters::leaf_subdivisions'],['../struct_bean_parameters.html#a3e033c07426c9626a9d465c1113b3667',1,'BeanParameters::leaf_subdivisions']]], + ['leaf_5ftexture_5ffile_32',['leaf_texture_file',['../struct_homogeneous_canopy_parameters.html#ada090628a7e4d792005768eef445658d',1,'HomogeneousCanopyParameters::leaf_texture_file'],['../struct_spherical_crowns_canopy_parameters.html#a6b01f45dcaefadaf8bb4ebd67b92197b',1,'SphericalCrownsCanopyParameters::leaf_texture_file'],['../struct_conical_crowns_canopy_parameters.html#a3d54bb0c814adced34e4e1f3b26bf41f',1,'ConicalCrownsCanopyParameters::leaf_texture_file'],['../struct_base_grape_vine_parameters.html#a436f25d4bd25818fe97592b5feadce80',1,'BaseGrapeVineParameters::leaf_texture_file'],['../struct_tomato_parameters.html#ab800737ab2431324662b39f46d6e8b06',1,'TomatoParameters::leaf_texture_file'],['../struct_strawberry_parameters.html#ad19120d86ed515a1bfe29be284c0fbd1',1,'StrawberryParameters::leaf_texture_file'],['../struct_walnut_canopy_parameters.html#a7927fbdc60d70addb5762ef2caf4eccf',1,'WalnutCanopyParameters::leaf_texture_file'],['../struct_bean_parameters.html#ab07f50052e6f91914239d6bbe4e3608a',1,'BeanParameters::leaf_texture_file'],['../struct_leaf_prototype.html#a418960ee0b7f6c6693d09cd5f0d2ba59',1,'LeafPrototype::leaf_texture_file']]], + ['leaf_5fwidth_33',['leaf_width',['../struct_base_grape_vine_parameters.html#a75f9ad83c0f7d963e9f528fcd3ba23b9',1,'BaseGrapeVineParameters']]], + ['leaf_5fwidth_5fspread_34',['leaf_width_spread',['../struct_base_grape_vine_parameters.html#aca739e4edc970f7ef36ac4913279b656',1,'BaseGrapeVineParameters']]], + ['leaflet_5flength_35',['leaflet_length',['../struct_bean_parameters.html#a0ba15d0731c1116186120d1b365438e8',1,'BeanParameters']]], + ['leafoptics_36',['LeafOptics',['../class_leaf_optics.html',1,'LeafOptics'],['../class_leaf_optics.html#a8f286671c723166c8aae098d0efd9b04',1,'LeafOptics::LeafOptics()']]], + ['leafoptics_2ecpp_37',['LeafOptics.cpp',['../_leaf_optics_8cpp.html',1,'']]], + ['leafoptics_2eh_38',['LeafOptics.h',['../_leaf_optics_8h.html',1,'']]], + ['leafopticsproperties_39',['LeafOpticsProperties',['../struct_leaf_optics_properties.html',1,'']]], + ['leafprototype_40',['LeafPrototype',['../struct_leaf_prototype.html',1,'LeafPrototype'],['../struct_leaf_prototype.html#af29d0b590d0c675ff43134797d4ade6b',1,'LeafPrototype::LeafPrototype(std::minstd_rand0 *generator)'],['../struct_leaf_prototype.html#a1ad2dbbc6bf4c55f598f7060d8d436cd',1,'LeafPrototype::LeafPrototype()']]], + ['leafreconstructionalphamask_41',['leafReconstructionAlphaMask',['../class_li_d_a_rcloud.html#aba102c6c5036ffb99b105fb2b4850935',1,'LiDARcloud::leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)'],['../class_li_d_a_rcloud.html#a0c80f96188fb83f444e7e08cbf888690',1,'LiDARcloud::leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, float leaf_length_constant, const char *mask_file)']]], + ['leaves_42',['Leaves',['../_plant_architecture_doc.html#PlantArch_compound',1,'Compound Leaves'],['../_weber_penn_doc.html#WPTreeLeaves',1,'Leaves']]], + ['lens_5fdiameter_43',['lens_diameter',['../struct_camera_properties.html#acf2d9d32a978b027658045c8068c7d1a',1,'CameraProperties']]], + ['leuning_20model_20theory_44',['Ball-Berry-Leuning Model Theory',['../_stomatal_doc.html#BBLTheory',1,'']]], + ['level_5fspacing_45',['level_spacing',['../struct_white_spruce_canopy_parameters.html#a4b00e11bfdda7982ce18779b40eadd6d',1,'WhiteSpruceCanopyParameters']]], + ['library_46',['Library',['../_weber_penn_doc.html#WPTadd',1,'Adding Trees from the Tree Library'],['../_plant_architecture_doc.html#PlantArchBuild',1,'Existing Plant Library'],['../_plant_architecture_doc.html#PlantArchGettingStarted',1,'Getting Started with the Existing Plant Library'],['../_plant_architecture_doc.html#PlantArchBuild_custom',1,'Modifying Parameters of a Plant from the Library']]], + ['library_20file_47',['The XML Tree Library File',['../_weber_penn_doc.html#WPTLibrary',1,'']]], + ['library_20files_48',['Custom Tree Library Files',['../_weber_penn_doc.html#WPTCustom',1,'']]], + ['library_20include_20files_49',['C++ Standard Library Include Files',['../_a_p_i.html#GlobalInclude',1,'']]], + ['library_20with_20default_20parameters_50',['Loading a Plant from the Library with Default Parameters',['../_plant_architecture_doc.html#PlantArchBuild_default',1,'']]], + ['lidar_20data_51',['Generating Synthetic (Simulated) LiDAR Data',['../_li_d_a_r_doc.html#LiDARsynthetic',1,'']]], + ['lidar_20data_52',['LiDAR data',['../_aerial_li_d_a_r_doc.html#AerialLiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#LiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_aerial_li_d_a_r_doc.html#AerialLiDARprocess',1,'Processing LiDAR data'],['../_li_d_a_r_doc.html#LiDARprocess',1,'Processing LiDAR data']]], + ['lidar_20point_20cloud_20plugin_20documentation_53',['LiDAR Point Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation']]], + ['lidar_2ecpp_54',['LiDAR.cpp',['../_li_d_a_r_8cpp.html',1,'']]], + ['lidar_2ecu_55',['LiDAR.cu',['../_li_d_a_r_8cu.html',1,'']]], + ['lidar_2eh_56',['LiDAR.h',['../_li_d_a_r_8h.html',1,'']]], + ['lidarcloud_57',['LiDARcloud',['../class_li_d_a_rcloud.html',1,'LiDARcloud'],['../class_li_d_a_rcloud.html#a1c946f80a3431e82e48fc54c611dca2c',1,'LiDARcloud::LiDARcloud()']]], + ['light_58',['Response of Assimilation Rate to Light',['../_photosynthesis_doc.html#PhotoLightParam',1,'']]], + ['light_20interception_59',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['light_20interception_20and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_60',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['light_20response_20function_61',['Light Response Function',['../_photosynthesis_doc.html#LightResponse',1,'']]], + ['lighting_5fnone_62',['LIGHTING_NONE',['../class_visualizer.html#a580a78fe3e25c423e2d13aebc1b54573ac864e3d3a92a93d2d070faee3a6b4789',1,'Visualizer']]], + ['lighting_5fphong_63',['LIGHTING_PHONG',['../class_visualizer.html#a580a78fe3e25c423e2d13aebc1b54573adce805e52c5b47950ecc3cfdddd2160c',1,'Visualizer']]], + ['lighting_5fphong_5fshadowed_64',['LIGHTING_PHONG_SHADOWED',['../class_visualizer.html#a580a78fe3e25c423e2d13aebc1b54573afe63a1dd4fcd9bbf57ad0dc2c168c864',1,'Visualizer']]], + ['lightingmodel_65',['LightingModel',['../class_visualizer.html#a580a78fe3e25c423e2d13aebc1b54573',1,'Visualizer']]], + ['lineintersection_66',['lineIntersection',['../group__functions.html#ga3fd112746616c33aae6ac56d9863c9a6',1,'helios']]], + ['linesintersection_67',['linesIntersection',['../class_voxel_intersection.html#a69cda90cd28f478ae007a88615994df2',1,'VoxelIntersection']]], + ['linux_68',['Set-up on Linux',['../_dependent_software.html#SetupLinux',1,'']]], + ['linux_20wsl_69',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]], + ['listglobaldata_70',['listGlobalData',['../classhelios_1_1_context.html#adf9a2febe48629536b06cdaa9903dbe3',1,'helios::Context']]], + ['listobjectdata_71',['listObjectData',['../classhelios_1_1_compound_object.html#a4750278bd9c519d57c3f27891dcf666d',1,'helios::CompoundObject::listObjectData()'],['../classhelios_1_1_context.html#adc44dfce7e5dc7deaa42139795eee942',1,'helios::Context::listObjectData(uint ObjID) const']]], + ['listprimitivedata_72',['listPrimitiveData',['../classhelios_1_1_context.html#a7cb64e054e6dacbab27f31cd73852cc3',1,'helios::Context']]], + ['listtimeseriesvariables_73',['listTimeseriesVariables',['../classhelios_1_1_context.html#a0850fc1a35fd563e4008a4a152105307',1,'helios::Context']]], + ['loading_20a_20plant_20from_20the_20library_20with_20default_20parameters_74',['Loading a Plant from the Library with Default Parameters',['../_plant_architecture_doc.html#PlantArchBuild_default',1,'']]], + ['loading_20scan_20data_20from_20file_75',['Loading scan data from file',['../_aerial_li_d_a_r_doc.html#AerialScanIO',1,'Loading scan data from file'],['../_li_d_a_r_doc.html#ScanIO',1,'Loading scan data from file']]], + ['loadobj_76',['loadOBJ',['../classhelios_1_1_context.html#a8657240a0b2926e8c73b083f0fdc339d',1,'helios::Context::loadOBJ(const char *filename, bool silent=false)'],['../classhelios_1_1_context.html#a90fd1a67dd60550207b1f29bfcd385ca',1,'helios::Context::loadOBJ(const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, bool silent=false)'],['../classhelios_1_1_context.html#ae3014d59a9e1668cb84725a30fd8ef68',1,'helios::Context::loadOBJ(const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const char *upaxis, bool silent=false)'],['../classhelios_1_1_context.html#a7455810db826dfed35a36eb452e817a9',1,'helios::Context::loadOBJ(const char *filename, const vec3 &origin, const helios::vec3 &scale, const SphericalCoord &rotation, const RGBcolor &default_color, const char *upaxis, bool silent=false)']]], + ['loadplantmodelfromlibrary_77',['loadPlantModelFromLibrary',['../class_plant_architecture.html#adc41de628e65a52f560b4d0685c64c3a',1,'PlantArchitecture']]], + ['loadply_78',['loadPLY',['../classhelios_1_1_context.html#a116724929091eabd6324047ed66cef85',1,'helios::Context::loadPLY(const char *filename, bool silent=false)'],['../classhelios_1_1_context.html#a99cda26e82d56d9241b10346ce097010',1,'helios::Context::loadPLY(const char *filename, const vec3 &origin, float height, const std::string &upaxis="YUP", bool silent=false)'],['../classhelios_1_1_context.html#a2748413487ea587e30b9d7be3ef61350',1,'helios::Context::loadPLY(const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const std::string &upaxis="YUP", bool silent=false)'],['../classhelios_1_1_context.html#a8f1777b7f07ddfedaafac1c6d781c1d0',1,'helios::Context::loadPLY(const char *filename, const vec3 &origin, float height, const RGBcolor &default_color, const std::string &upaxis="YUP", bool silent=false)'],['../classhelios_1_1_context.html#a7965b2ac5e884fbbf067a2355aca497e',1,'helios::Context::loadPLY(const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const std::string &upaxis="YUP", bool silent=false)']]], + ['loadtabulartimeseriesdata_79',['loadTabularTimeseriesData',['../classhelios_1_1_context.html#a1dc9a0f79be2477c4873755586744e51',1,'helios::Context']]], + ['loadxml_80',['loadXML',['../classhelios_1_1_context.html#a129516a8fce035705a541e7b877eba2f',1,'helios::Context::loadXML()'],['../class_aerial_li_d_a_rcloud.html#aa87abfc0d5538d3d8fe28458c7093c2c',1,'AerialLiDARcloud::loadXML()'],['../class_canopy_generator.html#aa481909b393a67953f2366217cf98843',1,'CanopyGenerator::loadXML()'],['../class_li_d_a_rcloud.html#a6bd7e1839d1a6ecb738233b20b93f1f7',1,'LiDARcloud::loadXML(const char *filename)'],['../class_li_d_a_rcloud.html#ac966b0aae37889c288277b950b2fd30a',1,'LiDARcloud::loadXML(const char *filename, bool load_grid_only)'],['../class_weber_penn_tree.html#a3cc9a0c0b3039e5fa44fc77a117a72dc',1,'WeberPennTree::loadXML()']]], + ['loadxmllabeldata_81',['loadXMLlabeldata',['../struct_camera_calibration.html#a0e689ece69868c47a8d6f392dac06d19',1,'CameraCalibration']]], + ['location_82',['Location',['../structhelios_1_1_location.html',1,'helios::Location'],['../structhelios_1_1_location.html#a15dfbb1d375999d28e857fca72e12b74',1,'helios::Location::Location()'],['../structhelios_1_1_location.html#aa91915971c5c6f75a99540b5517bea2b',1,'helios::Location::Location(float latitude_deg, float longitude_deg, float UTC_offset)']]], + ['longitude_5fdeg_83',['longitude_deg',['../structhelios_1_1_location.html#a29c4f6f1b7453821766f833673eeaff3',1,'helios::Location']]], + ['longitudinal_5fcurvature_84',['longitudinal_curvature',['../struct_leaf_prototype.html#af14f092796a2c241521be4f50cad1552',1,'LeafPrototype']]], + ['longwave_20flux_85',['Longwave Flux',['../_solar_position_doc.html#LWTheory',1,'Ambient Longwave Flux'],['../_solar_position_doc.html#LWFlux',1,'Getting the Sky Longwave Flux']]] ]; diff --git a/doc/html/search/all_15.js b/doc/html/search/all_15.js index a3ded7182..f5d4e1e93 100644 --- a/doc/html/search/all_15.js +++ b/doc/html/search/all_15.js @@ -1,22 +1,93 @@ var searchData= [ - ['validateoutputpath_0',['validateOutputPath',['../global_8h.html#a614486c4ac0686c5b58813f03f0cedf9',1,'helios']]], - ['vec2_1',['vec2',['../structhelios_1_1vec2.html',1,'helios::vec2'],['../structhelios_1_1vec2.html#af23055ca8145b094c275e9790c1ef8c2',1,'helios::vec2::vec2(float v0, float v1)'],['../structhelios_1_1vec2.html#a61b92b2d15fa008486ca55b7baf3d8ce',1,'helios::vec2::vec2(const float v[2])'],['../structhelios_1_1vec2.html#a4b3c6f1a3d5f981fd5c0b858088462aa',1,'helios::vec2::vec2(const std::vector< float > &v)'],['../structhelios_1_1vec2.html#a951e897069d3cc32a062667a54422882',1,'helios::vec2::vec2()']]], - ['vec3_2',['vec3',['../structhelios_1_1vec3.html',1,'helios::vec3'],['../structhelios_1_1vec3.html#a98f0ea866d759cc41f85af848bd47392',1,'helios::vec3::vec3(float v0, float v1, float v2)'],['../structhelios_1_1vec3.html#a872ffa408ca0c7a9ae8f48bdcb1ff59f',1,'helios::vec3::vec3()'],['../structhelios_1_1vec3.html#ad72bf7ebc0bf7a337c33fd804b047f17',1,'helios::vec3::vec3(const std::vector< float > &v)'],['../structhelios_1_1vec3.html#a674873bc59af57ba7149ad5339e45266',1,'helios::vec3::vec3(const float v[3])']]], - ['vec4_3',['vec4',['../structhelios_1_1vec4.html',1,'helios::vec4'],['../structhelios_1_1vec4.html#a94756adab8fcf1382e2bde79c00014f0',1,'helios::vec4::vec4()'],['../structhelios_1_1vec4.html#a2fbcf26c016cdceafd9f3354b430363d',1,'helios::vec4::vec4(const std::vector< float > &v)'],['../structhelios_1_1vec4.html#ab92cc5f8e93238b01c9639f011347281',1,'helios::vec4::vec4(const float v[4])'],['../structhelios_1_1vec4.html#ade4e8c762963b0ce0a195805f1ebccbd',1,'helios::vec4::vec4(float v0, float v1, float v2, float v3)']]], - ['vecmult_4',['vecmult',['../global_8h.html#ae8cc6f4a10a4efab6057ab6c4c114304',1,'helios::vecmult(const float M[16], const float v[3], float(&result)[3])'],['../global_8h.html#a40054144f951b396cd9f9ba32586862a',1,'helios::vecmult(const float M[16], const helios::vec3 &v3, helios::vec3 &result)']]], - ['vectors_5',['Vectors',['../group__vectors.html',1,'']]], - ['vegetative_5fbud_5fbreak_5fprobability_5fdecay_5frate_6',['vegetative_bud_break_probability_decay_rate',['../struct_shoot_parameters.html#abe60e69a5cf66199d1dfd6688e4d4ced',1,'ShootParameters']]], - ['vegetativebud_7',['VegetativeBud',['../struct_vegetative_bud.html',1,'']]], - ['visualizer_8',['Visualizer',['../class_visualizer.html',1,'Visualizer'],['../class_visualizer.html#a9277e99596d46d77d31a2249a1406983',1,'Visualizer::Visualizer(uint Wdisplay)'],['../class_visualizer.html#ac39e631c7d248c0e0f4f9ebba58a6dc4',1,'Visualizer::Visualizer(uint Wdisplay, uint Hdisplay)'],['../class_visualizer.html#a9c6edf93389fa78548f2024aec944b82',1,'Visualizer::Visualizer(uint Wdisplay, uint Hdisplay, int aliasing_samples, bool window_decorations)']]], - ['visualizer_2ecpp_9',['Visualizer.cpp',['../_visualizer_8cpp.html',1,'']]], - ['visualizer_2eh_10',['Visualizer.h',['../_visualizer_8h.html',1,'']]], - ['voxel_20intersection_20plugin_20documentation_11',['Voxel Intersection Plugin Documentation',['../_voxel_intersection_doc.html',1,'PlugIns']]], - ['voxel_5fbounds_12',['voxel_bounds',['../primitive_intersection_8cu.html#a904cdd1733732aa1a8dbaf2e958176a9',1,'primitiveIntersection.cu']]], - ['voxel_5fintersect_13',['voxel_intersect',['../primitive_intersection_8cu.html#ac0a2a895d2e98227a3905e56939228fe',1,'primitiveIntersection.cu']]], - ['voxelintersection_14',['VoxelIntersection',['../class_voxel_intersection.html',1,'VoxelIntersection'],['../class_voxel_intersection.html#a45bf9a3a44c9373452753480c8e47c72',1,'VoxelIntersection::VoxelIntersection()']]], - ['voxelintersection_2ecpp_15',['VoxelIntersection.cpp',['../_voxel_intersection_8cpp.html',1,'']]], - ['voxelintersection_2ecu_16',['VoxelIntersection.cu',['../_voxel_intersection_8cu.html',1,'']]], - ['voxelintersection_2eh_17',['VoxelIntersection.h',['../_voxel_intersection_8h.html',1,'']]], - ['vspgrapevineparameters_18',['VSPGrapevineParameters',['../struct_v_s_p_grapevine_parameters.html',1,'VSPGrapevineParameters'],['../struct_v_s_p_grapevine_parameters.html#af61690f86b14f0f6852e2c43b5549217',1,'VSPGrapevineParameters::VSPGrapevineParameters()'],['../struct_v_s_p_grapevine_parameters.html#a07cb2adfeec316d0cf5ce9ffb2266dc2',1,'VSPGrapevineParameters::VSPGrapevineParameters(const pugi::xml_node canopy_node)']]] + ['mac_0',['Set-up on Mac',['../_dependent_software.html#SetupMac',1,'']]], + ['magnitude_1',['magnitude',['../structhelios_1_1vec2.html#a1931ec5c78112202c14634634f429073',1,'helios::vec2::magnitude()'],['../structhelios_1_1vec3.html#adb96b24e6544d106a19e029c2594fee4',1,'helios::vec3::magnitude()'],['../structhelios_1_1vec4.html#a416f39c133309add363f43fd5f1e340c',1,'helios::vec4::magnitude()']]], + ['main_20and_20auxiliary_20cpp_20files_2',['Main and auxiliary .cpp files',['../_a_p_i.html#Source',1,'']]], + ['make_5fdate_3',['make_Date',['../group__vectors.html#gad4c811a7a39319de43f58c93e14ecda6',1,'helios::make_Date(int day, int month, int year)'],['../group__vectors.html#ga5199de860b171749c8e153e94a2984b2',1,'helios::make_Date(int JulianDay, int year)']]], + ['make_5fint2_4',['make_int2',['../group__vectors.html#ga39457188bb8c3aba1fdc9217ecc16f74',1,'helios::make_int2(int x, int y)'],['../group__vectors.html#ga61cbe7ba7a687fde1273f9883e54c2ac',1,'helios::make_int2(int X[2])']]], + ['make_5fint3_5',['make_int3',['../helios__vector__types_8h.html#a88347513c8d7e764d5c820b61e5905e2',1,'helios::make_int3(int X, int Y, int Z)'],['../helios__vector__types_8h.html#a7003de16002f0da5916c10bb566ad0eb',1,'helios::make_int3(int X[3])']]], + ['make_5fint4_6',['make_int4',['../helios__vector__types_8h.html#acdfd23cf323df4bdd409c8e4e2bcdfdc',1,'helios::make_int4(int x, int y, int z, int w)'],['../helios__vector__types_8h.html#ad1dc8d4f618d34d2f7ada3eb0ca7e4db',1,'helios::make_int4(const int X[4])']]], + ['make_5flocation_7',['make_Location',['../group__vectors.html#gaa720b1e8afc6a431dda4e3ecb97df112',1,'helios']]], + ['make_5frgbacolor_8',['make_RGBAcolor',['../group__vectors.html#gacc4916e29a0757214b7c558c6e5f7cd3',1,'helios::make_RGBAcolor(float r, float g, float b, float a)'],['../group__vectors.html#ga55bc372b981da2d30826fcb5f9254888',1,'helios::make_RGBAcolor(RGBcolor color, float a)']]], + ['make_5frgbcolor_9',['make_RGBcolor',['../group__vectors.html#gae5b981fa224fe6f30b850467ec655c0b',1,'helios']]], + ['make_5fsphericalcoord_10',['make_SphericalCoord',['../helios__vector__types_8h.html#ad89212892cf1bdc45eeae189e6d490a1',1,'helios::make_SphericalCoord(float elevation_radians, float azimuth_radians)'],['../helios__vector__types_8h.html#a6e6a11dede0cfd0c725e11224f48d2b7',1,'helios::make_SphericalCoord(float radius, float elevation_radians, float azimuth_radians)']]], + ['make_5ftime_11',['make_Time',['../group__vectors.html#ga7a29e9916b97d9f7533e87e7125e5b66',1,'helios::make_Time(int hour, int minute)'],['../group__vectors.html#ga57bfa5a4e5595e2e385d03883733f978',1,'helios::make_Time(int hour, int minute, int second)']]], + ['make_5fvec2_12',['make_vec2',['../group__vectors.html#ga7e3752eb5ff9909862380d188d2b3f24',1,'helios']]], + ['make_5fvec3_13',['make_vec3',['../helios__vector__types_8h.html#aa19986ef06f067d450534135735bc36b',1,'helios::make_vec3(float x, float y, float z)'],['../helios__vector__types_8h.html#a7a7e3dfbb0f3b50e9a5992a25a913566',1,'helios::make_vec3(float X[3])']]], + ['make_5fvec4_14',['make_vec4',['../helios__vector__types_8h.html#ab232dd96cf103ad9ac02b6f5c264ced0',1,'helios::make_vec4(float x, float y, float z, float w)'],['../helios__vector__types_8h.html#a797d2ee9d38d23a6a7a3fa2b826b053b',1,'helios::make_vec4(float X[4])']]], + ['makeidentitymatrix_15',['makeIdentityMatrix',['../global_8h.html#ab044c22f6798031f34744e63d95ca614',1,'helios']]], + ['makerotationmatrix_16',['makeRotationMatrix',['../group__functions.html#ga42c109f6c1a5b59ffcefc262ee78d291',1,'helios::makeRotationMatrix(float rotation, const char *axis, float(&transform)[16])'],['../group__functions.html#gaae1a72fb7a970c9bf65e10b26ab6fb51',1,'helios::makeRotationMatrix(float rotation, const helios::vec3 &axis, float(&transform)[16])'],['../group__functions.html#ga55a4cd9377af44ec86d945ffd72e1dc5',1,'helios::makeRotationMatrix(float rotation, const helios::vec3 &origin, const helios::vec3 &axis, float(&transform)[16])']]], + ['makescalematrix_17',['makeScaleMatrix',['../group__functions.html#ga9af58af4f070bf9f81a45141569e9c72',1,'helios::makeScaleMatrix(const helios::vec3 &scale, float(&T)[16])'],['../group__functions.html#gaf092b1b3100fcbc2f9d106a4b560efcd',1,'helios::makeScaleMatrix(const helios::vec3 &scale, const helios::vec3 &point, float(&T)[16])']]], + ['maketranslationmatrix_18',['makeTranslationMatrix',['../group__functions.html#ga6c071a3206c9d7a7d8694275b46b8d42',1,'helios']]], + ['maketubefromcones_19',['makeTubeFromCones',['../_plant_architecture_8h.html#a90314e1f16ad76c838da858b9bf0ae86',1,'PlantArchitecture.h']]], + ['making_20texture_20mask_20files_20with_20transparency_20using_20gimp_20',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['manually_20installing_20optix_20if_20using_20windows_20subsystem_20for_20linux_20wsl_21',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]], + ['map_22',['Coloring Primitives by Texture Map',['../_a_p_i.html#TextureColor',1,'']]], + ['map_23',['map',['../_visualizer_doc.html#ColoringPseudo',1,'Coloring by pseudocolor map'],['../_visualizer_doc.html#ColoringTexture',1,'Coloring by texture map']]], + ['mapping_24',['Texture Mapping',['../_a_p_i.html#Texture',1,'']]], + ['maps_25',['2D raster height maps',['../_aerial_li_d_a_r_doc.html#AerialRasters',1,'']]], + ['markgeometryclean_26',['markGeometryClean',['../classhelios_1_1_context.html#a368852580048c62c2b16ebec000b35ed',1,'helios::Context']]], + ['markgeometrydirty_27',['markGeometryDirty',['../classhelios_1_1_context.html#aba4b1c6f469953791017770fd8c18fa1',1,'helios::Context']]], + ['mask_28',['Leaf mask',['../_weber_penn_doc.html#WPTreeMask',1,'']]], + ['mask_20files_20with_20transparency_20using_20gimp_29',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['masking_20primitives_20by_20image_20transparency_20channel_30',['Masking Primitives by Image Transparency Channel',['../_a_p_i.html#TextureMask',1,'']]], + ['matmult_31',['matmult',['../global_8h.html#a2404c4bfe8b03cdbde4421a2e0be2b19',1,'helios']]], + ['max_32',['max',['../group__functions.html#ga828d302d1bb6e0aee3e2bf5efd670f86',1,'helios::max(const std::vector< float > &vect)'],['../group__functions.html#ga812947a11191483677a73636e0b7ed06',1,'helios::max(const std::vector< int > &vect)'],['../group__functions.html#gaa3b7bf55e065bf2ab8a9d975963ce7ca',1,'helios::max(const std::vector< vec3 > &vect)']]], + ['max_5fnodes_20and_20max_5fnodes_5fper_5fseason_33',['max_nodes and max_nodes_per_season',['../_plant_architecture_doc.html#ShootParam_max_nodes',1,'']]], + ['max_5fnodes_5fper_5fseason_34',['max_nodes and max_nodes_per_season',['../_plant_architecture_doc.html#ShootParam_max_nodes',1,'']]], + ['maxpulsefilter_35',['maxPulseFilter',['../class_li_d_a_rcloud.html#aa5c2bd82b67b3e84069090d75ed2973d',1,'LiDARcloud']]], + ['mean_36',['mean',['../group__functions.html#gadfcde1fcf4db2a62012ed5ddf43c943d',1,'helios']]], + ['median_37',['median',['../group__functions.html#ga461699c384fe606656ce1cc59618e727',1,'helios']]], + ['medlyn_20et_20al_202011_20optimality_20based_20model_38',['Medlyn et al. (2011) Optimality-Based Model',['../_stomatal_doc.html#MoptTheory',1,'']]], + ['metadata_39',['Scan metadata',['../_li_d_a_r_doc.html#ScanMetadata',1,'']]], + ['microsoft_20visual_20studio_20c_20compiler_20tools_40',['Install Microsoft Visual Studio C++ compiler tools',['../_dependent_software.html#SetupPCMSVC',1,'']]], + ['midrib_5ffold_5ffraction_41',['midrib_fold_fraction',['../struct_leaf_prototype.html#ab6a5584fbf19ee9c61f979e020eeb834',1,'LeafPrototype']]], + ['min_42',['min',['../group__functions.html#ga522f5d4232ccb2c899ff620eafc744b5',1,'helios::min(const std::vector< float > &vect)'],['../group__functions.html#gabdeaa8440597bcdcf1f43cd3a8f2383f',1,'helios::min(const std::vector< int > &vect)'],['../group__functions.html#ga656494728a1221b22464a693936d41f5',1,'helios::min(const std::vector< vec3 > &vect)']]], + ['minpulsefilter_43',['minPulseFilter',['../class_li_d_a_rcloud.html#a530582b532eb13ca938d5e843d902327',1,'LiDARcloud']]], + ['minscatterenergy_44',['minScatterEnergy',['../struct_radiation_band.html#a2f54d84dc4a82db6bdd50ba3648cae59',1,'RadiationBand']]], + ['minute_45',['minute',['../structhelios_1_1_time.html#a744b90da076192b90a3ee4ce2ff3743a',1,'helios::Time']]], + ['missing_5fplant_5fprobability_46',['missing_plant_probability',['../struct_base_grape_vine_parameters.html#a1d9460b443217dccd867a587c5bf57f7',1,'BaseGrapeVineParameters']]], + ['mixed_20free_20forced_20convection_47',['2. Laminar Inclined Plate, Mixed Free-Forced Convection',['../_b_l_conductance_doc.html#BLC2',1,'']]], + ['mode_48',['Running the Model in Dynamic Mode',['../_stomatal_doc.html#StomatalRunDyn',1,'']]], + ['mode_49',['Running the Model (steady-state mode)',['../_stomatal_doc.html#StomatalRun',1,'']]], + ['model_50',['Model',['../_energy_balance_doc.html#EBblc',1,'Boundary-layer Conductance Model'],['../_stomatal_doc.html#MoptTheory',1,'Medlyn et al. (2011) Optimality-Based Model'],['../_plant_architecture_doc.html#PlantArchQuery',1,'Retrieving Information from the Model'],['../_b_l_conductance_doc.html#BLCRun',1,'Running the Model'],['../_energy_balance_doc.html#EBRun',1,'Running the Steady-State Model'],['../_stomatal_doc.html#StomatalUse',1,'Using the Stomatal Conductance Model']]], + ['model_20and_20calculate_20par_20interception_51',['3. Run the model and calculate PAR interception',['../radiation_basics.html#Tutorial10_run',1,'']]], + ['model_20and_20process_20results_52',['4. Run model and process results',['../radiation__beers_law.html#tutorial11_run',1,'']]], + ['model_20basics_20tree_20light_20interception_53',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['model_20calibration_20procedure_54',['Empirical Model Calibration Procedure',['../_photosynthesis_doc.html#PhotoCalib',1,'']]], + ['model_20class_20constructor_55',['Model Class Constructor',['../_radiation_doc.html#RadConst',1,'']]], + ['model_20coefficients_56',['Setting the Model Coefficients',['../_stomatal_doc.html#StomatalCoeffs',1,'']]], + ['model_20description_57',['Model Description',['../_photosynthesis_doc.html#EmpiricalDescription',1,'Empirical Model Description'],['../_photosynthesis_doc.html#FarquharDescription',1,'Farquhar, von Caemmerer, Berry Model Description']]], + ['model_20geometry_58',['Getting Object IDs and Primitive UUIDs of Model Geometry',['../_plant_architecture_doc.html#PlantArchQueryobjIDs',1,'']]], + ['model_20geometry_59',['Model geometry',['../visualizer_pdata.html#Tutorial8_geom',1,'']]], + ['model_20geometry_20and_20data_60',['Model Geometry and Data',['../_overview.html#ModelGeom',1,'']]], + ['model_20geometry_20creation_61',['Model geometry creation',['../radiation_basics.html#Tutorial10_geom',1,'1. Model geometry creation'],['../radiation__beers_law.html#tutorial11_geom',1,'1. Model geometry creation']]], + ['model_20in_20dynamic_20mode_62',['Running the Model in Dynamic Mode',['../_stomatal_doc.html#StomatalRunDyn',1,'']]], + ['model_20independent_20variables_63',['Model Independent Variables',['../_photosynthesis_doc.html#PhotoVars',1,'Summary of Empirical Model Independent Variables'],['../_photosynthesis_doc.html#FvCBPhotoVars',1,'Summary of FvCB Model Independent Variables']]], + ['model_20outputs_64',['Model Outputs',['../_radiation_doc.html#ModelOutputs',1,'']]], + ['model_20outputs_20using_20the_20visualizer_20plug_20in_65',['Visualizing Model Outputs using the Visualizer Plug-In',['../_radiation_doc.html#RadVis',1,'']]], + ['model_20over_20time_66',['Growing the Model over Time',['../_plant_architecture_doc.html#PlantArchGrowth',1,'']]], + ['model_20parameters_67',['Model Parameters',['../_photosynthesis_doc.html#FvCBSettingPhotoParams',1,'Setting FvCB Model Parameters'],['../_photosynthesis_doc.html#PhotoParams',1,'Summary of Empirical Model Parameters'],['../_photosynthesis_doc.html#FvCBPhotoParams',1,'Summary of FvCB Model Parameters']]], + ['model_20parameters_68',['Temperature response of model parameters',['../_photosynthesis_doc.html#FvCBtemperature',1,'']]], + ['model_20plug_20in_69',['Model Plug In',['../_tutorials.html#RadiationTuts',1,'Radiation Model Plug-In'],['../_radiation_doc.html#RadUse',1,'Using the Radiation Model Plug-In']]], + ['model_20plug_20in_70',['Model Plug in',['../_b_l_conductance_doc.html#BLUse',1,'Using the Boundary Layer Conductance Model Plug-in'],['../_energy_balance_doc.html#EBUse',1,'Using the Energy Balance Model Plug-in']]], + ['model_20plug_20ins_71',['Model Plug-ins',['../_overview.html#PluginsOverview',1,'']]], + ['model_20plugin_20documentation_72',['Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'Boundary-Layer Conductance Model Plugin Documentation'],['../_dummy.html',1,'Dummy Model Plugin Documentation'],['../_energy_balance_doc.html',1,'Energy Balance Model Plugin Documentation'],['../_photosynthesis_doc.html',1,'Photosynthesis Model Plugin Documentation'],['../_plant_architecture_doc.html',1,'Plant Architecture Model Plugin Documentation'],['../_radiation_doc.html',1,'Radiation Model Plugin Documentation'],['../_stomatal_doc.html',1,'Stomatal Conductance Model Plugin Documentation']]], + ['model_20set_20up_73',['model set up',['../radiation_basics.html#Tutorial10_rad',1,'2. Radiation model set-up'],['../radiation__beers_law.html#tutorial11_rad',1,'3. Radiation model set-up']]], + ['model_20simplified_20version_20given_20in_20buckley_20turnbull_20and_20adams_202012_74',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['model_20steady_20state_20mode_75',['Running the Model (steady-state mode)',['../_stomatal_doc.html#StomatalRun',1,'']]], + ['model_20theory_76',['Model Theory',['../_stomatal_doc.html#BWBTheory',1,'Ball, Woodrow, Berry (1987) Model Theory'],['../_stomatal_doc.html#BBLTheory',1,'Ball-Berry-Leuning Model Theory'],['../_solar_position_doc.html#SolarTheory',1,'Model Theory']]], + ['model_20to_20be_20used_77',['Setting the Boundary-layer Conductance Model To Be Used',['../_b_l_conductance_doc.html#BLCSet',1,'']]], + ['model_20with_20heat_20storage_78',['Unsteady model with heat storage',['../_energy_balance_doc.html#EBRunUS',1,'']]], + ['models_79',['Boundary-layer Conductance Models',['../_b_l_conductance_doc.html#BLCModels',1,'']]], + ['modify_20visualizer_20options_80',['Step 3. Modify Visualizer options',['../visualizer_basics.html#vis_step3',1,'']]], + ['modifying_20geometric_20parameters_20from_20default_20values_81',['Modifying Geometric Parameters from Default Values',['../_canopy_generator_doc.html#CGenParameterMod',1,'']]], + ['modifying_20parameters_20of_20a_20plant_20from_20the_20library_82',['Modifying Parameters of a Plant from the Library',['../_plant_architecture_doc.html#PlantArchBuild_custom',1,'']]], + ['modifying_20phenological_20threshold_20parameters_83',['Modifying Phenological Threshold Parameters',['../_plant_architecture_doc.html#PlantArchPhenoMod',1,'']]], + ['moisture_20conductance_84',['Moisture Conductance',['../_energy_balance_doc.html#EBgm',1,'']]], + ['month_85',['month',['../structhelios_1_1_date.html#a5d75f8c8616d778e470a59e0b3e890a3',1,'helios::Date']]], + ['moptcoefficients_86',['MOPTcoefficients',['../struct_m_o_p_tcoefficients.html',1,'']]], + ['mott_20farquhar_202003_20model_20simplified_20version_20given_20in_20buckley_20turnbull_20and_20adams_202012_87',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['mousecallback_88',['mouseCallback',['../_visualizer_8h.html#a8b8e3d832e0aeb8c7bf0e77f0ddf0c94',1,'mouseCallback(GLFWwindow *window, int button, int action, int mods): Visualizer.cpp'],['../_visualizer_8cpp.html#a8b8e3d832e0aeb8c7bf0e77f0ddf0c94',1,'mouseCallback(GLFWwindow *window, int button, int action, int mods): Visualizer.cpp']]], + ['my_5ferror_5fmgr_89',['my_error_mgr',['../structmy__error__mgr.html',1,'']]] ]; diff --git a/doc/html/search/all_16.js b/doc/html/search/all_16.js index 41e02d71b..4e8756533 100644 --- a/doc/html/search/all_16.js +++ b/doc/html/search/all_16.js @@ -1,40 +1,17 @@ var searchData= [ - ['w_0',['w',['../structhelios_1_1int4.html#a997159b161576d521fdad7e2d5e3786f',1,'helios::int4::w()'],['../structhelios_1_1vec4.html#a5d4e8add341c4076176aac3574fe0937',1,'helios::vec4::w()']]], - ['wait_1',['wait',['../group__functions.html#gad28da0b06687dc68c1212c1624e54bd0',1,'helios']]], - ['walnut_2',['walnut',['../class_canopy_generator.html#af8b7088179f65a2d3d05a1f21207dd54',1,'CanopyGenerator']]], - ['walnutcanopyparameters_3',['WalnutCanopyParameters',['../struct_walnut_canopy_parameters.html',1,'WalnutCanopyParameters'],['../struct_walnut_canopy_parameters.html#ac233d993d5d15fd3fff46245a0365b93',1,'WalnutCanopyParameters::WalnutCanopyParameters(const pugi::xml_node canopy_node)'],['../struct_walnut_canopy_parameters.html#a3e9529efe557947137c49fefa450bb85',1,'WalnutCanopyParameters::WalnutCanopyParameters()']]], - ['wave_5famplitude_4',['wave_amplitude',['../struct_leaf_prototype.html#ab86a62f2f03c638481bfdd28997c74d1',1,'LeafPrototype']]], - ['wave_5fperiod_5',['wave_period',['../struct_leaf_prototype.html#aa62b74d58f6a490473f3e30c5e5aa01a',1,'LeafPrototype']]], - ['wavebandbounds_6',['wavebandBounds',['../struct_radiation_band.html#a11a0c1b2fe1f6be6efb8052fa247b396',1,'RadiationBand']]], - ['weber_2dpenn_20tree_20plugin_20documentation_7',['Weber-Penn Tree Plugin Documentation',['../_weber_penn_doc.html',1,'PlugIns']]], - ['weberpenntree_8',['WeberPennTree',['../class_weber_penn_tree.html#a5b949a2008b9e4817f2df4b5861c49b5',1,'WeberPennTree::WeberPennTree()'],['../class_weber_penn_tree.html',1,'WeberPennTree']]], - ['weberpenntree_2ecpp_9',['WeberPennTree.cpp',['../_weber_penn_tree_8cpp.html',1,'']]], - ['weberpenntree_2eh_10',['WeberPennTree.h',['../_weber_penn_tree_8h.html',1,'']]], - ['weberpenntreeparameters_11',['WeberPennTreeParameters',['../struct_weber_penn_tree_parameters.html',1,'']]], - ['whitespruce_12',['whitespruce',['../class_canopy_generator.html#a00d9f2222a38ef4a8494aef9650d11f3',1,'CanopyGenerator']]], - ['whitesprucecanopyparameters_13',['WhiteSpruceCanopyParameters',['../struct_white_spruce_canopy_parameters.html',1,'WhiteSpruceCanopyParameters'],['../struct_white_spruce_canopy_parameters.html#abab47c6661e734271286dbe4808f484b',1,'WhiteSpruceCanopyParameters::WhiteSpruceCanopyParameters()'],['../struct_white_spruce_canopy_parameters.html#a5b11a0899997319c0371c0bc89330f05',1,'WhiteSpruceCanopyParameters::WhiteSpruceCanopyParameters(const pugi::xml_node canopy_node)']]], - ['wood_5fsubdivisions_14',['wood_subdivisions',['../struct_base_grape_vine_parameters.html#a49d391b42c6aafd088bb89f29a3f8d5e',1,'BaseGrapeVineParameters::wood_subdivisions()'],['../struct_white_spruce_canopy_parameters.html#a57cc0a77f816bddab4701f2777c13317',1,'WhiteSpruceCanopyParameters::wood_subdivisions()'],['../struct_walnut_canopy_parameters.html#a1c61b154388db34cd6cff475de3e2dd7',1,'WalnutCanopyParameters::wood_subdivisions()']]], - ['wood_5fsubdivisions_5fspread_15',['wood_subdivisions_spread',['../struct_base_grape_vine_parameters.html#a7d1ef566d2bdbd0495f95bc6b1938e17',1,'BaseGrapeVineParameters']]], - ['wood_5ftexture_5ffile_16',['wood_texture_file',['../struct_base_grape_vine_parameters.html#ae28d9e75240a23e0c534af9b884ce41d',1,'BaseGrapeVineParameters::wood_texture_file()'],['../struct_white_spruce_canopy_parameters.html#a3062fb397f90b7f5d29faf21794a04aa',1,'WhiteSpruceCanopyParameters::wood_texture_file()'],['../struct_walnut_canopy_parameters.html#aaa467205c3f449a3b11bd4fe19c4716e',1,'WalnutCanopyParameters::wood_texture_file()']]], - ['write_5fjpeg_5ffile_17',['write_JPEG_file',['../_visualizer_8cpp.html#a72ab446b93211938da98a8eec0c5d33a',1,'write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages): Visualizer.cpp'],['../_visualizer_8h.html#a76a6dfb6593ca66bbd332f6ad6f6a1ea',1,'write_JPEG_file(const char *filename, const uint width, const uint height, const std::vector< helios::RGBcolor > &data, bool print_messages=true): Visualizer.h'],['../_visualizer_8h.html#aa1897ed232569d651810d146af02d878',1,'write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages=true): Visualizer.cpp']]], - ['writecalibratedcameraresponses_18',['writeCalibratedCameraResponses',['../struct_camera_calibration.html#a148bdc83d9f7a3d564a3aa10793a5d70',1,'CameraCalibration']]], - ['writecameraimage_19',['writeCameraImage',['../class_radiation_model.html#aa30ec7ec3b6c3b109e9a9544b890e8de',1,'RadiationModel']]], - ['writecameraimagedata_20',['writeCameraImageData',['../class_radiation_model.html#a546c959be8d158f17ab1cb9ada0ebe6d',1,'RadiationModel']]], - ['writedepthimagedata_21',['writeDepthImageData',['../class_radiation_model.html#ad495efb7a88df316cc8117e1d181d104',1,'RadiationModel']]], - ['writeimageboundingboxes_22',['writeImageBoundingBoxes',['../class_radiation_model.html#a59db63fb5cf7d82ab641f636378923fd',1,'RadiationModel']]], - ['writeimageboundingboxes_5fobjectdata_23',['writeImageBoundingBoxes_ObjectData',['../class_radiation_model.html#ac78340f2c7f5cf9089e26d15ea5dc41b',1,'RadiationModel']]], - ['writejpeg_24',['writeJPEG',['../global_8h.html#a95600894b45bcc627d66c3dd8c202cd8',1,'helios']]], - ['writenormcameraimage_25',['writeNormCameraImage',['../class_radiation_model.html#a61abdff90fd75f3ebebc6b8f189cdac9',1,'RadiationModel']]], - ['writenormdepthimage_26',['writeNormDepthImage',['../class_radiation_model.html#a633d84a823ad4cd99495a06afc13d7a3',1,'RadiationModel']]], - ['writeobj_27',['writeOBJ',['../classhelios_1_1_context.html#a8249b03fa781c9382863b7cf2caf0dd8',1,'helios::Context::writeOBJ(const std::string &filename) const'],['../classhelios_1_1_context.html#a8a5040ff4aaa061eddabe881ac668a01',1,'helios::Context::writeOBJ(const std::string &filename, const std::vector< uint > &UUIDs) const'],['../classhelios_1_1_context.html#ae976f6626930c925c8fdacb543e1e923',1,'helios::Context::writeOBJ(const std::string &filename, const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_dat_fields) const']]], - ['writeobjectdatalabelmap_28',['writeObjectDataLabelMap',['../class_radiation_model.html#afdbe940b3c4ae5855a0fcbe5b0b7f708',1,'RadiationModel']]], - ['writeply_29',['writePLY',['../classhelios_1_1_context.html#aa47b8b6f8cefb3c9d55a3cda10d851d7',1,'helios::Context']]], - ['writepng_30',['writePNG',['../global_8h.html#afc2520441ef9a290c5221dd892ea9f01',1,'helios']]], - ['writeprimitivedata_31',['writePrimitiveData',['../classhelios_1_1_context.html#ab643fc787ea7b1a215605c369f446844',1,'helios::Context::writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const'],['../classhelios_1_1_context.html#a97378b12bfaf42c2052960c54ff096d4',1,'helios::Context::writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, const std::vector< uint > &UUIDs, bool print_header=false) const']]], - ['writeprimitivedatalabelmap_32',['writePrimitiveDataLabelMap',['../class_radiation_model.html#a771c53fe19d75303c3f60017db8a2b50',1,'RadiationModel']]], - ['writespectralxmlfile_33',['writeSpectralXMLfile',['../struct_camera_calibration.html#a96b8a246adb36d20a09e3d527be9de25',1,'CameraCalibration']]], - ['writexml_34',['writeXML',['../classhelios_1_1_context.html#abfcac5a56c13e86298609ed3fccf354d',1,'helios::Context::writeXML(const char *filename, bool quiet=false) const'],['../classhelios_1_1_context.html#a499545512efe3645e2085e4815dcb94e',1,'helios::Context::writeXML(const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const']]], - ['writexml_5fbyobject_35',['writeXML_byobject',['../classhelios_1_1_context.html#ae2ada2bfdce5226cd970a6e6fa0ccc88',1,'helios::Context']]], - ['writing_20plugins_36',['Writing Plugins',['../_plugins.html',1,'']]] + ['needle_5fcolor_0',['needle_color',['../struct_white_spruce_canopy_parameters.html#ab3687772981118c2b4aaeb4ff544289a',1,'WhiteSpruceCanopyParameters']]], + ['needle_5flength_1',['needle_length',['../struct_white_spruce_canopy_parameters.html#a41a653b953bd7a5f9c6cecfb07f1bfb4',1,'WhiteSpruceCanopyParameters']]], + ['needle_5fsubdivisions_2',['needle_subdivisions',['../struct_white_spruce_canopy_parameters.html#a28eb26d944a0e67a41b1b06343090fc0',1,'WhiteSpruceCanopyParameters']]], + ['needle_5fwidth_3',['needle_width',['../struct_white_spruce_canopy_parameters.html#a11cc85d4a6176b908aff31b408d70cf3',1,'WhiteSpruceCanopyParameters']]], + ['new_20project_20script_4',['New Project Script',['../_a_p_i.html#DirScript',1,'']]], + ['normalization_5',['Setting the Radiation Source Spectral Distribution and Normalization',['../_radiation_doc.html#SourceDist',1,'']]], + ['normalize_6',['normalize',['../structhelios_1_1vec2.html#a04c00c49095d3bbc0a19d5da3d61493f',1,'helios::vec2::normalize()'],['../structhelios_1_1vec3.html#a7a6826239394edc32ce6ae58b4622524',1,'helios::vec3::normalize()'],['../structhelios_1_1vec4.html#a6bb8bb78aaea6e5703fd1d40dbd39865',1,'helios::vec4::normalize()']]], + ['nphi_7',['Nphi',['../struct_scan_metadata.html#a8d9273e0fccbfc20916c284ab6c573ac',1,'ScanMetadata']]], + ['nrays_8',['Nrays',['../struct_aerial_scan_metadata.html#a14b34575b0c5f8de6e1e203667a1d8a6',1,'AerialScanMetadata']]], + ['ntheta_9',['Ntheta',['../struct_scan_metadata.html#a8432ab0ab545a0027bb47ce84f0a6704',1,'ScanMetadata']]], + ['nullorigin_10',['nullorigin',['../global_8h.html#a876dc18d1da8ace50c131f428f8883be',1,'helios']]], + ['nullrotation_11',['nullrotation',['../global_8h.html#adcd5a98ec7c45292736ec8e19ce9de51',1,'helios']]], + ['number_20generator_12',['Seeding the Random Number Generator',['../_canopy_generator_doc.html#CGenSeed',1,'']]], + ['nvidia_20cuda_13',['NVIDIA CUDA',['../_dependent_software.html#SetupPCCUDA',1,'Setting up NVIDIA CUDA'],['../_dependent_software.html#SetupLinuxCUDA',1,'Setting up NVIDIA CUDA']]] ]; diff --git a/doc/html/search/all_17.js b/doc/html/search/all_17.js index 484e0c454..54516c8f2 100644 --- a/doc/html/search/all_17.js +++ b/doc/html/search/all_17.js @@ -1,17 +1,82 @@ var searchData= [ - ['x_0',['x',['../structhelios_1_1int2.html#ae14968ab74816df03efc977bb5d7b9c7',1,'helios::int2::x()'],['../structhelios_1_1int3.html#a1ce8c8391637ea6e33bb30b1d0adfc50',1,'helios::int3::x()'],['../structhelios_1_1int4.html#a1ac3b0b91901dc1d1497267bd3f3b4c3',1,'helios::int4::x()'],['../structhelios_1_1vec2.html#a8dda241c2560b203a3b0a479d1c9e12e',1,'helios::vec2::x()'],['../structhelios_1_1vec3.html#a80003da235393c031b8561e678a184a1',1,'helios::vec3::x()'],['../structhelios_1_1vec4.html#a96036e1d3ac15f03190a7bbf74ce0d73',1,'helios::vec4::x()']]], - ['xmlloadfloat_1',['XMLloadfloat',['../global_8h.html#a74ae3a9e16e2ca39dab735a1ac97a506',1,'helios']]], - ['xmlloadint_2',['XMLloadint',['../global_8h.html#a4b756357236942bec6cc7f853aa77fc5',1,'helios']]], - ['xmlloadint2_3',['XMLloadint2',['../global_8h.html#ae55d4cef14213f642705952dc1ad4659',1,'helios']]], - ['xmlloadint3_4',['XMLloadint3',['../global_8h.html#ae4661a50a9f13eb6fb645e9f767b51a2',1,'helios']]], - ['xmlloadint4_5',['XMLloadint4',['../global_8h.html#a08c21d08fc1e1dd07ff612f8b503e295',1,'helios']]], - ['xmlloadrgb_6',['XMLloadrgb',['../global_8h.html#acb80e4e13497682968468c596a9b3690',1,'helios']]], - ['xmlloadrgba_7',['XMLloadrgba',['../global_8h.html#a148e80cd6b8477c0704e642243ab2547',1,'helios']]], - ['xmlloadstring_8',['XMLloadstring',['../global_8h.html#a8240b43ac3ce36bc7a4d52128bc9fda3',1,'helios']]], - ['xmlloadvec2_9',['XMLloadvec2',['../global_8h.html#a1f3041e69cbe61a909866a24c8d77457',1,'helios']]], - ['xmlloadvec3_10',['XMLloadvec3',['../global_8h.html#aa4c58cabe7bc5244435613ffdb00cf34',1,'helios']]], - ['xmlloadvec4_11',['XMLloadvec4',['../global_8h.html#a928c91522128145370150652ca59f3af',1,'helios']]], - ['xmlparser_12',['XMLparser',['../classhelios_1_1_x_m_lparser.html',1,'helios']]], - ['xyzfilter_13',['xyzFilter',['../class_li_d_a_rcloud.html#ac17ca020e2f2fd4f1ce91ef5101353d0',1,'LiDARcloud::xyzFilter(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)'],['../class_li_d_a_rcloud.html#a56ee72fba222c399c256adf577ae860d',1,'LiDARcloud::xyzFilter(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax, bool deleteOutside)']]] + ['obj_20wavefront_20files_0',['OBJ Wavefront Files',['../_i_o.html#OBJread',1,'Reading OBJ (Wavefront) Files'],['../_i_o.html#OBJwrite',1,'Writing OBJ (Wavefront) Files']]], + ['obj_5fmodel_5ffile_1',['OBJ_model_file',['../struct_leaf_prototype.html#abf799f4b6c6a0eb64ddccb0e310c6259',1,'LeafPrototype']]], + ['object_20data_2',['Optional Output Object Data',['../_plant_architecture_doc.html#PlantArchOutputData',1,'']]], + ['object_20ids_20and_20primitive_20uuids_20of_20model_20geometry_3',['Getting Object IDs and Primitive UUIDs of Model Geometry',['../_plant_architecture_doc.html#PlantArchQueryobjIDs',1,'']]], + ['object_5ftype_5fbox_4',['OBJECT_TYPE_BOX',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a2f065407387865d0564746c763c78d66',1,'helios']]], + ['object_5ftype_5fcone_5',['OBJECT_TYPE_CONE',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a6bcd175267f2f6d4f4a75b8e1e520def',1,'helios']]], + ['object_5ftype_5fdisk_6',['OBJECT_TYPE_DISK',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a7d26aca591c366d41bca9d184a07ee51',1,'helios']]], + ['object_5ftype_5fpolymesh_7',['OBJECT_TYPE_POLYMESH',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a40bb0200100d500b738a6c3efc70df38',1,'helios']]], + ['object_5ftype_5fsphere_8',['OBJECT_TYPE_SPHERE',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682af4e336a18e47e54ca6e9a7f57e665175',1,'helios']]], + ['object_5ftype_5ftile_9',['OBJECT_TYPE_TILE',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682aed347b5fb08bc5551b61310a964f0bde',1,'helios']]], + ['object_5ftype_5ftube_10',['OBJECT_TYPE_TUBE',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a4c8545d7bc5d79cd8d150eca0624b623',1,'helios']]], + ['objecthastexture_11',['objectHasTexture',['../classhelios_1_1_context.html#afbdf67c60f6a4efc93cd9526151d5d89',1,'helios::Context']]], + ['objects_12',['Objects',['../group__compoundobjects.html',1,'Compound Objects'],['../_a_p_i.html#Objects',1,'Objects']]], + ['objecttype_13',['ObjectType',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682',1,'helios']]], + ['of_20a_20plant_20from_20the_20library_14',['Modifying Parameters of a Plant from the Library',['../_plant_architecture_doc.html#PlantArchBuild_custom',1,'']]], + ['of_20a_20plant_20shoot_15',['The Phytomer: Basic unit of a plant shoot',['../_plant_architecture_doc.html#PlantArchPhytomer',1,'']]], + ['of_20assimilation_20rate_20to_20co2_16',['Response of Assimilation Rate to CO2',['../_photosynthesis_doc.html#PhotoCO2Param',1,'']]], + ['of_20assimilation_20rate_20to_20light_17',['Response of Assimilation Rate to Light',['../_photosynthesis_doc.html#PhotoLightParam',1,'']]], + ['of_20assimilation_20rate_20to_20temperature_18',['Response of Assimilation Rate to Temperature',['../_photosynthesis_doc.html#PhotoTempParam',1,'']]], + ['of_20clouds_19',['Incorporating the effects of clouds',['../_solar_position_doc.html#SolarFluxClouds',1,'']]], + ['of_20conical_20crowns_20',['Canopy of Conical Crowns',['../_canopy_generator_doc.html#CGenCone',1,'']]], + ['of_20empirical_20model_20independent_20variables_21',['Summary of Empirical Model Independent Variables',['../_photosynthesis_doc.html#PhotoVars',1,'']]], + ['of_20empirical_20model_20parameters_22',['Summary of Empirical Model Parameters',['../_photosynthesis_doc.html#PhotoParams',1,'']]], + ['of_20floats_23',['Vector of Floats',['../context_vectors.html#vec3tut',1,'']]], + ['of_20fvcb_20model_20independent_20variables_24',['Summary of FvCB Model Independent Variables',['../_photosynthesis_doc.html#FvCBPhotoVars',1,'']]], + ['of_20fvcb_20model_20parameters_25',['Summary of FvCB Model Parameters',['../_photosynthesis_doc.html#FvCBPhotoParams',1,'']]], + ['of_20integers_26',['Vector of Integers',['../context_vectors.html#int3tut',1,'']]], + ['of_20model_20geometry_27',['Getting Object IDs and Primitive UUIDs of Model Geometry',['../_plant_architecture_doc.html#PlantArchQueryobjIDs',1,'']]], + ['of_20model_20parameters_28',['Temperature response of model parameters',['../_photosynthesis_doc.html#FvCBtemperature',1,'']]], + ['of_20parameters_29',['Randomization of Parameters',['../_plant_architecture_doc.html#PlantArchRandParam',1,'']]], + ['of_20respiration_20rate_20to_20temperature_30',['Response of Respiration Rate to Temperature',['../_photosynthesis_doc.html#PhotoRespParam',1,'']]], + ['of_20spherical_20crowns_31',['Canopy of Spherical Crowns',['../_canopy_generator_doc.html#CGenSphere',1,'']]], + ['of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_32',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['of_20the_20shoot_33',['of the Shoot',['../_plant_architecture_doc.html#ShootParametersGeom',1,'Geometric Parameters of the Shoot'],['../_plant_architecture_doc.html#ShootParametersGrowth',1,'Growth Parameters of the Shoot']]], + ['of_20the_20sun_34',['of the Sun',['../_solar_position_doc.html#SolarPos',1,'Getting the Direction of the Sun'],['../_solar_position_doc.html#SolarPosTheory',1,'Position of the Sun']]], + ['of_20the_20visualizer_20plug_20in_35',['Dependencies of the Visualizer Plug-in',['../_dependent_software.html#SetupLinuxVis',1,'']]], + ['on_20a_20ground_20area_20basis_36',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['on_20linux_37',['Set-up on Linux',['../_dependent_software.html#SetupLinux',1,'']]], + ['on_20mac_38',['Set-up on Mac',['../_dependent_software.html#SetupMac',1,'']]], + ['on_20the_20boundaries_39',['2. Slicing and cropping primitives on the boundaries',['../radiation__beers_law.html#tutorial11_slice',1,'']]], + ['on_20windows_20pc_40',['Set-up on Windows PC',['../_dependent_software.html#SetupPC',1,'']]], + ['opening_20and_20building_20a_20project_41',['Opening and building a project',['../_c_lion_i_d_e.html#CLionProject',1,'']]], + ['operator_21_3d_42',['operator!=',['../structhelios_1_1int2.html#aa56785402e6db8119c1ed30a49948218',1,'helios::int2::operator!=()'],['../structhelios_1_1int3.html#a71f26f049c1fb4f1cdd066c13ce77f62',1,'helios::int3::operator!=()'],['../structhelios_1_1int4.html#affc0813de0395a8aad56f4be7d0b04ca',1,'helios::int4::operator!=()'],['../structhelios_1_1vec2.html#a17f3c1246cb0d3ac6c3f7e88d925fc8c',1,'helios::vec2::operator!=()'],['../structhelios_1_1vec3.html#ada103df1691b54465c2b1b529e0c5832',1,'helios::vec3::operator!=()'],['../structhelios_1_1vec4.html#a628c2b9a02267a04a7a0cea2f81751ea',1,'helios::vec4::operator!=()'],['../structhelios_1_1_r_g_bcolor.html#ac0fa9361ccd323b9f6be61c51523a3ce',1,'helios::RGBcolor::operator!=()'],['../structhelios_1_1_r_g_b_acolor.html#a8adb7872a82b7d73660cca8d8e597f98',1,'helios::RGBAcolor::operator!=()'],['../structhelios_1_1_date.html#aa22bf3af71b348a4d5ffda2ec0f711d1',1,'helios::Date::operator!=()'],['../structhelios_1_1_time.html#a9e2b7c5426528477fb14973543bd55be',1,'helios::Time::operator!=()'],['../structhelios_1_1_location.html#af4aa7f58f7b88f7cff711d77f018bccd',1,'helios::Location::operator!=()'],['../structhelios_1_1_spherical_coord.html#a145cb6d467be654bc647c15e4fd9646a',1,'helios::SphericalCoord::operator!=()']]], + ['operator_2a_43',['operator*',['../structhelios_1_1vec2.html#aff56c21393bd165f0f7a716535caa9e0',1,'helios::vec2::operator*(const vec2 &a) const'],['../structhelios_1_1vec2.html#ad8557c2528c67f4736853e0eb2da84ad',1,'helios::vec2::operator*(float a) const'],['../structhelios_1_1vec3.html#af73b1a2553239424ec86cdb0c8c40396',1,'helios::vec3::operator*(const vec3 &a) const'],['../structhelios_1_1vec3.html#add5a63009e9808b16ba05b6f13a247c9',1,'helios::vec3::operator*(float a) const'],['../structhelios_1_1vec4.html#ac2e0c4e83c5996aaae993fc465793c46',1,'helios::vec4::operator*(const vec4 &a) const'],['../structhelios_1_1vec4.html#af4405b9a3827567189c0386ce937ed1b',1,'helios::vec4::operator*(float a) const'],['../helios__vector__types_8h.html#a36a0796c19320ea5804ade9835341060',1,'helios::operator*(float a, const vec2 &v)'],['../helios__vector__types_8h.html#a5b21978f962a37f7edd5837241d17821',1,'helios::operator*(float a, const vec3 &v)'],['../helios__vector__types_8h.html#a9a2cbdb93bb7a6f7460ea0a8ffcc62c6',1,'helios::operator*(float a, const vec4 &v)']]], + ['operator_2b_44',['operator+',['../structhelios_1_1int2.html#a14302add4995370f272dd321216a64ec',1,'helios::int2::operator+()'],['../structhelios_1_1int3.html#ac05dad4f6ff3f71fcd5dd3549d00fc3d',1,'helios::int3::operator+()'],['../structhelios_1_1int4.html#a6b3eb9a070e397d5a0e7c60e0b4696b1',1,'helios::int4::operator+()'],['../structhelios_1_1vec2.html#ab10677029f53c641eb7a16f2b05a5b77',1,'helios::vec2::operator+(const vec2 &a) const'],['../structhelios_1_1vec2.html#a6e0dfda32de091ffaead085c42e9da6c',1,'helios::vec2::operator+(float a) const'],['../structhelios_1_1vec3.html#a3c9cee7dfe117cf1e89c79308562df2c',1,'helios::vec3::operator+(const vec3 &a) const'],['../structhelios_1_1vec3.html#a4d847b9be59bfb23ea7ea5a5a8f21cb7',1,'helios::vec3::operator+(float a) const'],['../structhelios_1_1vec4.html#a12ed9a7a675ba5a734326d90d82d4ffc',1,'helios::vec4::operator+(const vec4 &a) const'],['../structhelios_1_1vec4.html#a766b22dfe3aa73999248fa60fd753960',1,'helios::vec4::operator+(float a) const'],['../helios__vector__types_8h.html#a8dfabc1a2f089ccb3b49eef4813dbb88',1,'helios::operator+(float a, const vec2 &v)'],['../helios__vector__types_8h.html#aba7a658887aa3d4fdf041fea304a6c35',1,'helios::operator+(float a, const vec3 &v)'],['../helios__vector__types_8h.html#a145447708e8a06709ff6904b22087d1b',1,'helios::operator+(float a, const vec4 &v)']]], + ['operator_2b_3d_45',['operator+=',['../structhelios_1_1int2.html#aa09f5fff701bf0847ba3d90ae9ea8583',1,'helios::int2::operator+=()'],['../structhelios_1_1int3.html#a5569b625b5206c5c6074d2498dbc2295',1,'helios::int3::operator+=()'],['../structhelios_1_1int4.html#ab7ec3cec60a44e6ac8fc4dc6d422fde1',1,'helios::int4::operator+=()'],['../structhelios_1_1vec2.html#a04b63f7eea6d70bb1d05a1d3f5cae24c',1,'helios::vec2::operator+=()'],['../structhelios_1_1vec3.html#abd94e98635de454f86ad00ce77e6e2ad',1,'helios::vec3::operator+=()'],['../structhelios_1_1vec4.html#a795da5aba8f107010589dffda7f11d4d',1,'helios::vec4::operator+=()']]], + ['operator_2d_46',['operator-',['../structhelios_1_1int2.html#acfb7317221012445f653b395c28f774f',1,'helios::int2::operator-(const int2 &a) const'],['../structhelios_1_1int2.html#a39dfd15acdd548f1c93be6e7b8a1a475',1,'helios::int2::operator-() const'],['../structhelios_1_1int3.html#adbe1fd230ee2591e64fdc15d71204848',1,'helios::int3::operator-(const int3 &a) const'],['../structhelios_1_1int3.html#ade3be6bb42b51bd8875e485ca9e6274b',1,'helios::int3::operator-() const'],['../structhelios_1_1int4.html#a67b8bf23d9a9377fb295d4dad92ead6a',1,'helios::int4::operator-(const int4 &a) const'],['../structhelios_1_1int4.html#a4d7a1b7d29e0d436fe35f927d645b7c7',1,'helios::int4::operator-() const'],['../structhelios_1_1vec2.html#a91e810accf20886a20afc9ed0c3d5f07',1,'helios::vec2::operator-(const vec2 &a) const'],['../structhelios_1_1vec2.html#a919b93ba0bf660ae2b7e65500982e3d7',1,'helios::vec2::operator-(float a) const'],['../structhelios_1_1vec2.html#ad37fb5771915e31225d39d3df8c669ed',1,'helios::vec2::operator-() const'],['../structhelios_1_1vec3.html#ab6d099de4a986d24b7414114700bb66a',1,'helios::vec3::operator-(const vec3 &a) const'],['../structhelios_1_1vec3.html#ad5557e6f3320abb0cab521a0aa87532f',1,'helios::vec3::operator-(float a) const'],['../structhelios_1_1vec3.html#a5a0176fe2d334f8a30ab00a975c2bdb1',1,'helios::vec3::operator-() const'],['../structhelios_1_1vec4.html#a98039082899cd4872d383e039cc0b812',1,'helios::vec4::operator-(const vec4 &a) const'],['../structhelios_1_1vec4.html#afd6f6b82dd6d3512cc8e1560e218bab2',1,'helios::vec4::operator-(float a) const'],['../structhelios_1_1vec4.html#a64f1627b4f2c6487231f315527afbf15',1,'helios::vec4::operator-() const'],['../helios__vector__types_8h.html#a7436b011b35d256deae673fe5c35cf75',1,'helios::operator-(float a, const vec2 &v)'],['../helios__vector__types_8h.html#a434fe3718d57c13e067aa06818652be3',1,'helios::operator-(float a, const vec3 &v)'],['../helios__vector__types_8h.html#a2ac8eb255c768eba03401b9d7f58df50',1,'helios::operator-(float a, const vec4 &v)']]], + ['operator_2d_3d_47',['operator-=',['../structhelios_1_1int2.html#a5838914611d1837e927638c83f4a1bf9',1,'helios::int2::operator-=()'],['../structhelios_1_1int3.html#a383f2cb4438661dd93bef01cfb52d646',1,'helios::int3::operator-=()'],['../structhelios_1_1int4.html#a3726af5576f9ed3ed3cf5d7c97a8159d',1,'helios::int4::operator-=()'],['../structhelios_1_1vec2.html#a575d6107bcec4582c106b711142a17c2',1,'helios::vec2::operator-=()'],['../structhelios_1_1vec3.html#a47a2080f5ba1e3690956ad8dd9160780',1,'helios::vec3::operator-=()'],['../structhelios_1_1vec4.html#a5cff99d238392c388015d1a0ac4456ae',1,'helios::vec4::operator-=()']]], + ['operator_2f_48',['operator/',['../structhelios_1_1vec2.html#a910c611bcf9c2ea1cd3ff38f0bd375e8',1,'helios::vec2::operator/()'],['../structhelios_1_1vec3.html#a09c648b26b7333d2726b7fbceab85be7',1,'helios::vec3::operator/()'],['../structhelios_1_1vec4.html#aa86d6caee3381dd0a14a74ea5e743604',1,'helios::vec4::operator/()']]], + ['operator_3c_3c_49',['operator<<',['../structhelios_1_1int2.html#aa70779f707686be8b004587a4220a153',1,'helios::int2::operator<<'],['../structhelios_1_1int3.html#a6f576c885af0d781aadda850a2ca77af',1,'helios::int3::operator<<'],['../structhelios_1_1int4.html#ac6b32d39d92de0b8585c64048040f0f9',1,'helios::int4::operator<<'],['../structhelios_1_1vec2.html#a5e585083b0cf16b2e73958747390e152',1,'helios::vec2::operator<<'],['../structhelios_1_1vec3.html#a87277dd90e0869e2e8e7ce376dfc7033',1,'helios::vec3::operator<<'],['../structhelios_1_1vec4.html#a32f014dbb41084ece2ad85f19c540874',1,'helios::vec4::operator<<'],['../structhelios_1_1_r_g_bcolor.html#a47b1d94ed5f6fa0c8ae897e02a06435c',1,'helios::RGBcolor::operator<<'],['../structhelios_1_1_r_g_b_acolor.html#aaa76985ee048b321703f78175e2b87b7',1,'helios::RGBAcolor::operator<<'],['../structhelios_1_1_date.html#a189b8537a2e0696e2f38da34e0f13eec',1,'helios::Date::operator<<'],['../structhelios_1_1_time.html#a5d53ebf9a42b3aa2d959a3cd5023c71a',1,'helios::Time::operator<<'],['../structhelios_1_1_location.html#a60375cac034fe50880b47569df6e8f69',1,'helios::Location::operator<<'],['../structhelios_1_1_spherical_coord.html#ad9381fdcb8448d8834b4ce43465b5335',1,'helios::SphericalCoord::operator<<']]], + ['operator_3d_50',['operator=',['../classhelios_1_1_context.html#aef8acffd049cf98f2544143188c164e2',1,'helios::Context::operator=()'],['../structhelios_1_1_spherical_coord.html#afe4ef2437aad9bca5863eeb387b1eee5',1,'helios::SphericalCoord::operator=()'],['../struct_leaf_prototype.html#a2dc8e0e35313b52c69cb7076d0392c2a',1,'LeafPrototype::operator=()']]], + ['operator_3d_3d_51',['operator==',['../structhelios_1_1int2.html#a6f1ec1cd4223e5f0bbfaa16e636af533',1,'helios::int2::operator==()'],['../structhelios_1_1int3.html#aced326938393fe95e1725e55b9bd4dd8',1,'helios::int3::operator==()'],['../structhelios_1_1int4.html#a779368fbba5e30ad5bba83072c9fdf83',1,'helios::int4::operator==()'],['../structhelios_1_1vec2.html#ab0c78672d242efe3aede0a4bd03eaeea',1,'helios::vec2::operator==()'],['../structhelios_1_1vec3.html#a00f6165fb3f01c65d7046111b6143fd4',1,'helios::vec3::operator==()'],['../structhelios_1_1vec4.html#aa8f6ace5ba502b2b958b64b1d032d1c3',1,'helios::vec4::operator==()'],['../structhelios_1_1_r_g_bcolor.html#a3cfc4c0f132c841f3a18ff9bdae21e22',1,'helios::RGBcolor::operator==()'],['../structhelios_1_1_r_g_b_acolor.html#abed23df133a671e295dcbf559c8a3ff5',1,'helios::RGBAcolor::operator==()'],['../structhelios_1_1_date.html#a097ff893e7fc52d101fdcb4ced84354b',1,'helios::Date::operator==()'],['../structhelios_1_1_time.html#a8a0bab271dcb31616ba52c4fd5f754cd',1,'helios::Time::operator==()'],['../structhelios_1_1_location.html#a2d451323ab20191a7f123849da04e269',1,'helios::Location::operator==()'],['../structhelios_1_1_spherical_coord.html#afa6791361ed489019d0689a52cac5621',1,'helios::SphericalCoord::operator==()']]], + ['optimality_20based_20model_52',['Medlyn et al. (2011) Optimality-Based Model',['../_stomatal_doc.html#MoptTheory',1,'']]], + ['optional_53',['2. Rotating and cropping (OPTIONAL)',['../_making_masks.html#Two',1,'']]], + ['optional_20output_20object_20data_54',['Optional Output Object Data',['../_plant_architecture_doc.html#PlantArchOutputData',1,'']]], + ['optional_20output_20primitive_20data_55',['Optional Output Primitive Data',['../_energy_balance_doc.html#EBOptionalOutputData',1,'Optional Output Primitive Data'],['../_photosynthesis_doc.html#PhotoOptionalOutputData',1,'Optional Output Primitive Data']]], + ['optionaloutputobjectdata_56',['optionalOutputObjectData',['../class_plant_architecture.html#acc53c4a5dd259f25b2b4a26907f8b749',1,'PlantArchitecture::optionalOutputObjectData(const std::string &object_data_label)'],['../class_plant_architecture.html#a435b4a07a5ce3ed4e0de58b286c5b883',1,'PlantArchitecture::optionalOutputObjectData(const std::vector< std::string > &object_data_labels)']]], + ['optionaloutputprimitivedata_57',['optionalOutputPrimitiveData',['../class_energy_balance_model.html#a8fd349c962047a29384e3f8099f1a054',1,'EnergyBalanceModel::optionalOutputPrimitiveData()'],['../class_photosynthesis_model.html#a9ec83db517f4c7d0eb09c20a9f61ef20',1,'PhotosynthesisModel::optionalOutputPrimitiveData()'],['../class_radiation_model.html#ac42245154cfb4f125cfe1ef4671ca19f',1,'RadiationModel::optionalOutputPrimitiveData()'],['../class_stomatal_conductance_model.html#a9618e00c9b4649c289debff2a4a1cfd4',1,'StomatalConductanceModel::optionalOutputPrimitiveData()'],['../class_weber_penn_tree.html#adb6095aad4b1dd1da8adc15fbd295775',1,'WeberPennTree::optionalOutputPrimitiveData()']]], + ['options_58',['View Options',['../_visualizer_doc.html#Options',1,'']]], + ['options_59',['Step 3. Modify Visualizer options',['../visualizer_basics.html#vis_step3',1,'']]], + ['optix_20if_20using_20windows_20subsystem_20for_20linux_20wsl_60',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]], + ['optix_20version_61',['OptiX Version',['../_choosing_c_u_d_a.html#chooseOptiX',1,'']]], + ['optix_20version_62',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['organ_20prototypes_63',['Creating Plant Organ Prototypes',['../_plant_architecture_doc.html#PlantArchOrgans',1,'']]], + ['organ_20sub_20components_64',['Getting Primitive UUIDs for Organ Sub-Components',['../_plant_architecture_doc.html#PlantArchQueryUUIDs',1,'']]], + ['origin_65',['origin',['../struct_scan_metadata.html#a200bf65b728866855ace6456365d66a3',1,'ScanMetadata']]], + ['origin_5fuuid_66',['origin_UUID',['../struct_per_ray_data.html#a6eb01aac11b5c8d4cfe02f15330dd868',1,'PerRayData']]], + ['output_67',['File Input/Output',['../_i_o.html',1,'']]], + ['output_20object_20data_68',['Optional Output Object Data',['../_plant_architecture_doc.html#PlantArchOutputData',1,'']]], + ['output_20primitive_20data_69',['Output Primitive Data',['../_b_l_conductance_doc.html#BLOutputData',1,'Default Output Primitive Data'],['../_energy_balance_doc.html#EBOutputData',1,'Default Output Primitive Data'],['../_photosynthesis_doc.html#PhotoOutputData',1,'Default Output Primitive Data'],['../_b_l_conductance_doc.html#BLCData',1,'Input/Output Primitive Data'],['../_energy_balance_doc.html#EBData',1,'Input/Output Primitive Data'],['../_radiation_doc.html#RadVarsAndProps',1,'Input/Output Primitive Data'],['../_energy_balance_doc.html#EBOptionalOutputData',1,'Optional Output Primitive Data'],['../_photosynthesis_doc.html#PhotoOptionalOutputData',1,'Optional Output Primitive Data'],['../_radiation_doc.html#RadOutputData',1,'Output Primitive Data'],['../_stomatal_doc.html#StomatalOutputData',1,'Output Primitive Data'],['../_voxel_intersection_doc.html#VoxelIntersectionOutputData',1,'Output Primitive Data']]], + ['outputs_70',['Model Outputs',['../_radiation_doc.html#ModelOutputs',1,'']]], + ['outputs_20using_20the_20visualizer_20plug_20in_71',['Visualizing Model Outputs using the Visualizer Plug-In',['../_radiation_doc.html#RadVis',1,'']]], + ['over_20bare_20ground_72',['4. Flow over bare ground',['../_b_l_conductance_doc.html#BLC4',1,'']]], + ['over_20time_73',['Growing the Model over Time',['../_plant_architecture_doc.html#PlantArchGrowth',1,'']]], + ['overrideobjecttexturecolor_74',['overrideObjectTextureColor',['../classhelios_1_1_context.html#a17e6824df31545c92187c6529122aada',1,'helios::Context::overrideObjectTextureColor(uint ObjID)'],['../classhelios_1_1_context.html#afe34537e4079b477f2eaf2b0e2e0d8a9',1,'helios::Context::overrideObjectTextureColor(const std::vector< uint > &ObjIDs)']]], + ['overrideprimitivetexturecolor_75',['overridePrimitiveTextureColor',['../classhelios_1_1_context.html#a90df70161f5ded2f8a79e995464598e0',1,'helios::Context::overridePrimitiveTextureColor(uint UUID)'],['../classhelios_1_1_context.html#a7173c1deabbe8dd57791ff94bcdf0621',1,'helios::Context::overridePrimitiveTextureColor(const std::vector< uint > &UUIDs)']]], + ['overridetexturecolor_76',['overrideTextureColor',['../classhelios_1_1_compound_object.html#a247e9f55e89ce5bb4621cc395069a20d',1,'helios::CompoundObject']]], + ['overview_77',['Overview',['../_weber_penn_doc.html#WPTOverview',1,'General Overview'],['../_overview.html',1,'Overview'],['../context_primitives.html#context_primitives_overview',1,'Overview'],['../_plant_architecture_doc.html#PlantArchOverview',1,'Plug-in Overview']]], + ['own_20projects_78',['Building and Compiling Your Own Projects',['../_a_p_i.html#BuildCompile',1,'']]] ]; diff --git a/doc/html/search/all_18.js b/doc/html/search/all_18.js index 471c15923..9b4a901ca 100644 --- a/doc/html/search/all_18.js +++ b/doc/html/search/all_18.js @@ -1,5 +1,166 @@ var searchData= [ - ['y_0',['y',['../structhelios_1_1int2.html#a369861259a6061aa4287f954238e1e21',1,'helios::int2::y()'],['../structhelios_1_1int3.html#aeba3aa4380ec4d9c216f98be95083d5c',1,'helios::int3::y()'],['../structhelios_1_1int4.html#ae979ffc27c702a6b67258d07ddcdf3b3',1,'helios::int4::y()'],['../structhelios_1_1vec2.html#ab4afff51f764cbf9bab0949ae067977e',1,'helios::vec2::y()'],['../structhelios_1_1vec3.html#ac0be54042f7a639c99ea4dce377f9a65',1,'helios::vec3::y()'],['../structhelios_1_1vec4.html#a3dd547e787593c51f07a6ea131bcab8d',1,'helios::vec4::y()']]], - ['year_1',['year',['../structhelios_1_1_date.html#aee4be32c2bd722143658b4771fe96253',1,'helios::Date']]] + ['par_20flux_20using_20beer_20s_20law_0',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['par_20interception_1',['3. Run the model and calculate PAR interception',['../radiation_basics.html#Tutorial10_run',1,'']]], + ['parameter_20file_2',['XML parameter file',['../_li_d_a_r_doc.html#LiDARsynthxml',1,'']]], + ['parameters_3',['Parameters',['../_canopy_generator_doc.html#CGenGeometries',1,'Available Geometries and Parameters'],['../_plant_architecture_doc.html#PlantArchShoot',1,'Defining Shoots and their Parameters'],['../_plant_architecture_doc.html#PlantArchPhytomerParams',1,'Defining the Phytomer and its Parameters'],['../_plant_architecture_doc.html#PlantArchBuild_default',1,'Loading a Plant from the Library with Default Parameters'],['../_plant_architecture_doc.html#PlantArchPhenoMod',1,'Modifying Phenological Threshold Parameters'],['../_plant_architecture_doc.html#PlantArchRandParam',1,'Randomization of Parameters'],['../_photosynthesis_doc.html#FvCBSettingPhotoParams',1,'Setting FvCB Model Parameters'],['../_photosynthesis_doc.html#PhotoParams',1,'Summary of Empirical Model Parameters'],['../_photosynthesis_doc.html#FvCBPhotoParams',1,'Summary of FvCB Model Parameters']]], + ['parameters_4',['Temperature response of model parameters',['../_photosynthesis_doc.html#FvCBtemperature',1,'']]], + ['parameters_20from_20default_20values_5',['Modifying Geometric Parameters from Default Values',['../_canopy_generator_doc.html#CGenParameterMod',1,'']]], + ['parameters_20of_20a_20plant_20from_20the_20library_6',['Modifying Parameters of a Plant from the Library',['../_plant_architecture_doc.html#PlantArchBuild_custom',1,'']]], + ['parameters_20of_20the_20shoot_7',['Parameters of the Shoot',['../_plant_architecture_doc.html#ShootParametersGeom',1,'Geometric Parameters of the Shoot'],['../_plant_architecture_doc.html#ShootParametersGrowth',1,'Growth Parameters of the Shoot']]], + ['parse_5fdata_5fdouble_8',['parse_data_double',['../classhelios_1_1_x_m_lparser.html#aac51870b44d9e154437bac6e7dc42b8e',1,'helios::XMLparser']]], + ['parse_5fdata_5ffloat_9',['parse_data_float',['../classhelios_1_1_x_m_lparser.html#a3afb5eec57e5843b001767937f36b9c2',1,'helios::XMLparser']]], + ['parse_5fdata_5fint_10',['parse_data_int',['../classhelios_1_1_x_m_lparser.html#a88315be708bb812d033bdbadb9350b5d',1,'helios::XMLparser']]], + ['parse_5fdata_5fint2_11',['parse_data_int2',['../classhelios_1_1_x_m_lparser.html#a0c352c0d3d26a7f29b9a9b3a76dfc8a0',1,'helios::XMLparser']]], + ['parse_5fdata_5fint3_12',['parse_data_int3',['../classhelios_1_1_x_m_lparser.html#a7f7e5d85e2a974300ddb3d843b280e1a',1,'helios::XMLparser']]], + ['parse_5fdata_5fint4_13',['parse_data_int4',['../classhelios_1_1_x_m_lparser.html#af2bcebc1922c7bb9624db407ea7892e9',1,'helios::XMLparser']]], + ['parse_5fdata_5fstring_14',['parse_data_string',['../classhelios_1_1_x_m_lparser.html#a80da32f5fa8a60c77d2414f917469ac6',1,'helios::XMLparser']]], + ['parse_5fdata_5fuint_15',['parse_data_uint',['../classhelios_1_1_x_m_lparser.html#a49b26b22ae7a92decd6de9339140c7ae',1,'helios::XMLparser']]], + ['parse_5fdata_5fvec2_16',['parse_data_vec2',['../classhelios_1_1_x_m_lparser.html#aa64e4581e6f68b40020055691b50b5ad',1,'helios::XMLparser']]], + ['parse_5fdata_5fvec3_17',['parse_data_vec3',['../classhelios_1_1_x_m_lparser.html#a0448bf0bdc7c001f6ac0db02346d1476',1,'helios::XMLparser']]], + ['parse_5fdata_5fvec4_18',['parse_data_vec4',['../classhelios_1_1_x_m_lparser.html#a6bc81fd82cba23fbf7e1d1e5ae472860',1,'helios::XMLparser']]], + ['parse_5fdouble_19',['parse_double',['../global_8h.html#a0209e53a2bdd31c9977de93b27e968b6',1,'helios']]], + ['parse_5ffloat_20',['parse_float',['../global_8h.html#a162c3d8c139c75bac9607b512768b937',1,'helios']]], + ['parse_5fint_21',['parse_int',['../global_8h.html#a6b9de37fd00d939cb9e049a9002e8db0',1,'helios']]], + ['parse_5fint2_22',['parse_int2',['../global_8h.html#a142375b255b9dcb456764558725becc1',1,'helios']]], + ['parse_5fint3_23',['parse_int3',['../global_8h.html#a88766e5973accffb6a548fb321c288df',1,'helios']]], + ['parse_5fnodes_24',['parse_nodes',['../classhelios_1_1_x_m_lparser.html#af00467ad05df3f28bf13814689732696',1,'helios::XMLparser']]], + ['parse_5fobjid_25',['parse_objID',['../classhelios_1_1_x_m_lparser.html#ab66f7f38b4cc8a78eeddf41dfa255898',1,'helios::XMLparser']]], + ['parse_5fradius_26',['parse_radius',['../classhelios_1_1_x_m_lparser.html#a39805884a1c0b15145c73ec57f14b5cd',1,'helios::XMLparser']]], + ['parse_5frgbcolor_27',['parse_RGBcolor',['../global_8h.html#a786c694c21d9115a7c3e18deba6a8732',1,'helios']]], + ['parse_5fsolid_5ffraction_28',['parse_solid_fraction',['../classhelios_1_1_x_m_lparser.html#ab0c6e4fa5a7873ac0e5b085118ea1153',1,'helios::XMLparser']]], + ['parse_5fsubdivisions_29',['parse_subdivisions',['../classhelios_1_1_x_m_lparser.html#a4fedde5cb50beb8206cb16abd31a68f3',1,'helios::XMLparser::parse_subdivisions(const pugi::xml_node &node_data, uint &subdivisions)'],['../classhelios_1_1_x_m_lparser.html#af120c45679d45a3d9be6f78cf571ed29',1,'helios::XMLparser::parse_subdivisions(const pugi::xml_node &node_data, int2 &subdivisions)'],['../classhelios_1_1_x_m_lparser.html#aa7beca055af1ef613195bc87f45cb525',1,'helios::XMLparser::parse_subdivisions(const pugi::xml_node &node_data, int3 &subdivisions)']]], + ['parse_5ftexture_30',['parse_texture',['../classhelios_1_1_x_m_lparser.html#a9c3d37073f119d28de29ff6c83928c35',1,'helios::XMLparser']]], + ['parse_5ftextureuv_31',['parse_textureUV',['../classhelios_1_1_x_m_lparser.html#ae6565b20e7f842b16a3662d5c8c4f00e',1,'helios::XMLparser']]], + ['parse_5ftransform_32',['parse_transform',['../classhelios_1_1_x_m_lparser.html#a4745083d40dd356ec11d4ddf0395947b',1,'helios::XMLparser']]], + ['parse_5fuint_33',['parse_uint',['../global_8h.html#a51430e9e359c2aad9d22d41650b2221a',1,'helios']]], + ['parse_5fvec2_34',['parse_vec2',['../global_8h.html#a3e1e35a11454f9616bad5639ccb49ff3',1,'helios']]], + ['parse_5fvec3_35',['parse_vec3',['../global_8h.html#a2e62477aa096b070d49a68b88427f7a5',1,'helios']]], + ['parse_5fvertices_36',['parse_vertices',['../classhelios_1_1_x_m_lparser.html#afc81fac144aa1b0a3eee3000ee874639',1,'helios::XMLparser']]], + ['parse_5fxml_5ftag_5ffloat_37',['parse_xml_tag_float',['../global_8h.html#a0627913352046dda81c72c9ce234a7e7',1,'helios']]], + ['parse_5fxml_5ftag_5fint_38',['parse_xml_tag_int',['../global_8h.html#afcb3f2f96f4679210db6f68845c87a51',1,'helios']]], + ['parse_5fxml_5ftag_5fstring_39',['parse_xml_tag_string',['../global_8h.html#a8a48786337175ba01ad180ef493f460b',1,'helios']]], + ['parse_5fxml_5ftag_5fvec2_40',['parse_xml_tag_vec2',['../global_8h.html#a6d4fc938af8d1e0db7836a610b7feda0',1,'helios']]], + ['parse_5fxml_5ftag_5fvec3_41',['parse_xml_tag_vec3',['../global_8h.html#a1b7e887e4b92085bc9f52a00227ca1d0',1,'helios']]], + ['patch_20to_20the_20context_42',['Adding a Patch to the Context',['../context_primitives.html#AddPatch',1,'']]], + ['patches_43',['Adding Patches',['../_a_p_i.html#AddingPatch',1,'']]], + ['pattern_44',['pattern',['../_aerial_li_d_a_r_doc.html#AerialLiDARcoord',1,'Coordinates and scan pattern'],['../_li_d_a_r_doc.html#LiDARcoord',1,'Coordinates and scan pattern']]], + ['pc_45',['Set-up on Windows PC',['../_dependent_software.html#SetupPC',1,'']]], + ['peakfinder_46',['peakFinder',['../class_li_d_a_rcloud.html#acffd90677f0584b05b73183747be4e0c',1,'LiDARcloud']]], + ['penn_20tree_20plug_20in_47',['Using the Weber-Penn Tree Plug-in',['../_weber_penn_doc.html#WPTreeUse',1,'']]], + ['penn_20tree_20plugin_20documentation_48',['Weber-Penn Tree Plugin Documentation',['../_weber_penn_doc.html',1,'PlugIns']]], + ['periodic_20boundary_20conditions_49',['Periodic Boundary Conditions',['../_radiation_doc.html#RadPeriodic',1,'']]], + ['periodic_5fdepth_50',['periodic_depth',['../struct_per_ray_data.html#ad10350ee3268a1f18cca466d764247a5',1,'PerRayData']]], + ['perraydata_51',['PerRayData',['../struct_per_ray_data.html',1,'']]], + ['petiole_5froll_52',['petiole_roll',['../struct_leaf_prototype.html#a8719e0541fc2360c8f9d889df70642a9',1,'LeafPrototype']]], + ['petiole_5fvertices_53',['petiole_vertices',['../struct_phytomer.html#a63c1deff7ef09e41bddc155cb4e22861',1,'Phytomer']]], + ['phenological_20threshold_20parameters_54',['Modifying Phenological Threshold Parameters',['../_plant_architecture_doc.html#PlantArchPhenoMod',1,'']]], + ['phenology_55',['Growth Phenology',['../_plant_architecture_doc.html#PlantArchPheno',1,'']]], + ['phimax_56',['phiMax',['../struct_scan_metadata.html#a29f41bdfbec57a32c60755944b4c0a7f',1,'ScanMetadata']]], + ['phimin_57',['phiMin',['../struct_scan_metadata.html#a019acfcaf7a3ba3fe062af1a59c24513',1,'ScanMetadata']]], + ['photosynthesis_20model_20plugin_20documentation_58',['Photosynthesis Model Plugin Documentation',['../_photosynthesis_doc.html',1,'PlugIns']]], + ['photosynthesismodel_59',['PhotosynthesisModel',['../class_photosynthesis_model.html',1,'PhotosynthesisModel'],['../class_photosynthesis_model.html#a2cfdf33f994c6b6cb84432dcb7e57b3b',1,'PhotosynthesisModel::PhotosynthesisModel()']]], + ['photosynthesismodel_2ecpp_60',['PhotosynthesisModel.cpp',['../_photosynthesis_model_8cpp.html',1,'']]], + ['photosynthesismodel_2eh_61',['PhotosynthesisModel.h',['../_photosynthesis_model_8h.html',1,'']]], + ['photosynthetictemperatureresponseparameters_62',['PhotosyntheticTemperatureResponseParameters',['../struct_photosynthetic_temperature_response_parameters.html',1,'']]], + ['phyllochron_5fmin_63',['phyllochron_min',['../_plant_architecture_doc.html#ShootParam_phyllochron',1,'']]], + ['phytomer_64',['Phytomer',['../struct_phytomer.html',1,'']]], + ['phytomer_20and_20its_20parameters_65',['Defining the Phytomer and its Parameters',['../_plant_architecture_doc.html#PlantArchPhytomerParams',1,'']]], + ['phytomer_3a_20basic_20unit_20of_20a_20plant_20shoot_66',['The Phytomer: Basic unit of a plant shoot',['../_plant_architecture_doc.html#PlantArchPhytomer',1,'']]], + ['phytomer_5fcallback_5ffunction_67',['phytomer_callback_function',['../struct_phytomer_parameters.html#a4460d1a8a04f27ad90908a4752c33cfb',1,'PhytomerParameters']]], + ['phytomer_5fcreation_5ffunction_68',['phytomer_creation_function',['../struct_phytomer_parameters.html#ab97ce4b897b2ec905235ca2efbf8545d',1,'PhytomerParameters']]], + ['phytomerparameters_69',['PhytomerParameters',['../struct_phytomer_parameters.html',1,'PhytomerParameters'],['../struct_phytomer_parameters.html#a00985415187962da3e18fbc024595277',1,'PhytomerParameters::PhytomerParameters()'],['../struct_phytomer_parameters.html#a23034eb00d8036aad3177e752cf4d8e7',1,'PhytomerParameters::PhytomerParameters(std::minstd_rand0 *generator)']]], + ['plant_70',['Building an Individual Plant',['../_canopy_generator_doc.html#CGenBuildPlant',1,'']]], + ['plant_20architecture_20model_20plugin_20documentation_71',['Plant Architecture Model Plugin Documentation',['../_plant_architecture_doc.html',1,'PlugIns']]], + ['plant_20from_20the_20library_72',['Modifying Parameters of a Plant from the Library',['../_plant_architecture_doc.html#PlantArchBuild_custom',1,'']]], + ['plant_20from_20the_20library_20with_20default_20parameters_73',['Loading a Plant from the Library with Default Parameters',['../_plant_architecture_doc.html#PlantArchBuild_default',1,'']]], + ['plant_20library_74',['Plant Library',['../_plant_architecture_doc.html#PlantArchBuild',1,'Existing Plant Library'],['../_plant_architecture_doc.html#PlantArchGettingStarted',1,'Getting Started with the Existing Plant Library']]], + ['plant_20organ_20prototypes_75',['Creating Plant Organ Prototypes',['../_plant_architecture_doc.html#PlantArchOrgans',1,'']]], + ['plant_20reconstruction_76',['Plant reconstruction',['../_li_d_a_r_doc.html#LiDARresonstruction',1,'']]], + ['plant_20shoot_77',['The Phytomer: Basic unit of a plant shoot',['../_plant_architecture_doc.html#PlantArchPhytomer',1,'']]], + ['plant_5fcount_78',['plant_count',['../struct_spherical_crowns_canopy_parameters.html#a8ac3d5fbeee86db6289693aa5e14a76f',1,'SphericalCrownsCanopyParameters::plant_count'],['../struct_conical_crowns_canopy_parameters.html#a001d43bc659ec5ee0ca8204a7b0d07e3',1,'ConicalCrownsCanopyParameters::plant_count'],['../struct_base_grape_vine_parameters.html#ad8aa5493feef5a08a5d2ff1b9ce9f513',1,'BaseGrapeVineParameters::plant_count'],['../struct_white_spruce_canopy_parameters.html#a6df2f849f402259e099b1dafdabc0a2c',1,'WhiteSpruceCanopyParameters::plant_count'],['../struct_tomato_parameters.html#a3e32aed174650e40d708fb75fc7d6a41',1,'TomatoParameters::plant_count'],['../struct_strawberry_parameters.html#a5c4fc3e9da6d07f98bc4116f56be8916',1,'StrawberryParameters::plant_count'],['../struct_walnut_canopy_parameters.html#a0a8fd703c9e0f1beedf990d85038d173',1,'WalnutCanopyParameters::plant_count'],['../struct_sorghum_canopy_parameters.html#a66cb3200529a5b83416a43267ade724e',1,'SorghumCanopyParameters::plant_count'],['../struct_bean_parameters.html#af11292adc0e3c6835e6de7f79bf9f58f',1,'BeanParameters::plant_count']]], + ['plant_5fheight_79',['plant_height',['../struct_tomato_parameters.html#adf398ca857bb113ffa65f3ded195ab23',1,'TomatoParameters::plant_height'],['../struct_strawberry_parameters.html#a612148d98514861b02a4def15489206d',1,'StrawberryParameters::plant_height']]], + ['plant_5fspacing_80',['plant_spacing',['../struct_spherical_crowns_canopy_parameters.html#a9be21b26afb7d32b61a236bbe5372acd',1,'SphericalCrownsCanopyParameters::plant_spacing'],['../struct_conical_crowns_canopy_parameters.html#a605e547c57f08fc248fa39a42cb64877',1,'ConicalCrownsCanopyParameters::plant_spacing'],['../struct_base_grape_vine_parameters.html#a0904dc05cf1becdeaaa46d9361893506',1,'BaseGrapeVineParameters::plant_spacing'],['../struct_white_spruce_canopy_parameters.html#a3a46d591c89d1436a2892b76c4703e34',1,'WhiteSpruceCanopyParameters::plant_spacing'],['../struct_tomato_parameters.html#a979927066ea306b2f5d3897ba0d5b09c',1,'TomatoParameters::plant_spacing'],['../struct_strawberry_parameters.html#a4df2a5b0e030df75e54f2d519a7b87bf',1,'StrawberryParameters::plant_spacing'],['../struct_walnut_canopy_parameters.html#a250d9f9ed73cd73c39f9dd6033771fe3',1,'WalnutCanopyParameters::plant_spacing'],['../struct_sorghum_canopy_parameters.html#a4d2e359bc3e33b9e04019575e8e4e30f',1,'SorghumCanopyParameters::plant_spacing'],['../struct_bean_parameters.html#a0b814b2a7af5e252859183bdb951d95c',1,'BeanParameters::plant_spacing']]], + ['plant_5fspacing_5fspread_81',['plant_spacing_spread',['../struct_base_grape_vine_parameters.html#a53486547ca872fbad9335c7c612a6c28',1,'BaseGrapeVineParameters']]], + ['plantarchitecture_82',['PlantArchitecture',['../class_plant_architecture.html',1,'PlantArchitecture'],['../class_plant_architecture.html#ab55c86604c49abcedde90adb395074e9',1,'PlantArchitecture::PlantArchitecture()']]], + ['plantarchitecture_2ecpp_83',['PlantArchitecture.cpp',['../_plant_architecture_8cpp.html',1,'']]], + ['plantarchitecture_2eh_84',['PlantArchitecture.h',['../_plant_architecture_8h.html',1,'']]], + ['plantinstance_85',['PlantInstance',['../struct_plant_instance.html',1,'']]], + ['plantlibrary_2ecpp_86',['PlantLibrary.cpp',['../_plant_library_8cpp.html',1,'']]], + ['plate_20forced_20convection_87',['1. The Polhausen Equation (Laminar Flat Plate, Forced Convection)',['../_b_l_conductance_doc.html#BLC1',1,'']]], + ['plate_20mixed_20free_20forced_20convection_88',['2. Laminar Inclined Plate, Mixed Free-Forced Convection',['../_b_l_conductance_doc.html#BLC2',1,'']]], + ['platform_20to_20use_20for_20helios_20programming_89',['Which platform to use for Helios programming?',['../_dependent_software.html#WhichPlatform',1,'']]], + ['plot_20the_20result_90',['Step 4. Plot the result',['../visualizer_basics.html#vis_step4',1,'']]], + ['plotdepthmap_91',['plotDepthMap',['../class_visualizer.html#a133187767033ad1f89c312a2d6f4a533',1,'Visualizer']]], + ['plotinteractive_92',['plotInteractive',['../class_visualizer.html#ab4858ed12fa78fe451569f4bbc27cd7c',1,'Visualizer::plotInteractive()'],['../_visualizer_doc.html#PlotInteractive',1,'plotInteractive()']]], + ['plotting_20geometry_93',['Plotting Geometry',['../_visualizer_doc.html#PlotWindow',1,'']]], + ['plotupdate_94',['plotUpdate',['../class_visualizer.html#aa87c684dd84db8d1ae0d12872b1dda22',1,'Visualizer::plotUpdate()'],['../class_visualizer.html#a0c0af4bbebf814a6220f8876f5b13fc3',1,'Visualizer::plotUpdate(bool hide_window)'],['../_visualizer_doc.html#PlotUpdate',1,'plotUpdate()']]], + ['plug_20in_95',['Plug In',['../_tutorials.html#RadiationTuts',1,'Radiation Model Plug-In'],['../_voxel_intersection_doc.html#VoxelIntersectionUse',1,'Using the Plug-In'],['../_radiation_doc.html#RadUse',1,'Using the Radiation Model Plug-In'],['../_tutorials.html#VisualizerTuts',1,'Visualizer Plug-In'],['../_radiation_doc.html#RadVis',1,'Visualizing Model Outputs using the Visualizer Plug-In']]], + ['plug_20in_96',['Plug in',['../_dependent_software.html#SetupLinuxVis',1,'Dependencies of the Visualizer Plug-in'],['../_radiation_doc.html#RadSolar',1,'Integrating with the SolarPosition Plug-in'],['../_b_l_conductance_doc.html#BLUse',1,'Using the Boundary Layer Conductance Model Plug-in'],['../_energy_balance_doc.html#EBUse',1,'Using the Energy Balance Model Plug-in'],['../_solar_position_doc.html#SolarLib',1,'Using the SolarPosition Plug-in'],['../_visualizer_doc.html#UseVis',1,'Using the Visualizer Plug-in'],['../_weber_penn_doc.html#WPTreeUse',1,'Using the Weber-Penn Tree Plug-in']]], + ['plug_20in_20overview_97',['Plug-in Overview',['../_plant_architecture_doc.html#PlantArchOverview',1,'']]], + ['plug_20ins_98',['Plug ins',['../_overview.html#PluginsOverview',1,'Model Plug-ins'],['../_plug_ins.html',1,'Plug-ins']]], + ['plugin_20documentation_99',['Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_b_l_conductance_doc.html',1,'Boundary-Layer Conductance Model Plugin Documentation'],['../_canopy_generator_doc.html',1,'Canopy Generator Plugin Documentation'],['../_dummy.html',1,'Dummy Model Plugin Documentation'],['../_energy_balance_doc.html',1,'Energy Balance Model Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation'],['../_photosynthesis_doc.html',1,'Photosynthesis Model Plugin Documentation'],['../_plant_architecture_doc.html',1,'Plant Architecture Model Plugin Documentation'],['../_radiation_doc.html',1,'Radiation Model Plugin Documentation'],['../_solar_position_doc.html',1,'Solar Position Plugin Documentation'],['../_stomatal_doc.html',1,'Stomatal Conductance Model Plugin Documentation'],['../_visualizer_doc.html',1,'Visualizer Plugin Documentation'],['../_voxel_intersection_doc.html',1,'Voxel Intersection Plugin Documentation'],['../_weber_penn_doc.html',1,'Weber-Penn Tree Plugin Documentation']]], + ['plugins_100',['Writing Plugins',['../_plugins.html',1,'']]], + ['ply_20stanford_20polygon_20files_101',['PLY Stanford Polygon Files',['../_i_o.html#PLYread',1,'Reading PLY (Stanford Polygon) Files'],['../_i_o.html#PLYwrite',1,'Writing PLY (Stanford Polygon) Files']]], + ['ply_20using_20blender_102',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['png_20format_103',['4. Exporting to .png format',['../_making_masks.html#Four',1,'']]], + ['pnghasalpha_104',['PNGHasAlpha',['../global_8h.html#a07b0dda8b9aee4100e9f6332dbfe7f64',1,'helios']]], + ['pod_5fcolor_105',['pod_color',['../struct_bean_parameters.html#a3b485cb8999c93db10fb30b21826b5be',1,'BeanParameters']]], + ['pod_5flength_106',['pod_length',['../struct_bean_parameters.html#a143874bf6130c1e02315f745dfac5f13',1,'BeanParameters']]], + ['pod_5fsubdivisions_107',['pod_subdivisions',['../struct_bean_parameters.html#a7f447a601152e1428ad752b6f3417fc9',1,'BeanParameters']]], + ['point_20cloud_20plugin_20documentation_108',['Point Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation']]], + ['point_20data_109',['Hit point data',['../_li_d_a_r_doc.html#AddHits',1,'']]], + ['point_20triangulation_110',['Hit point triangulation',['../_li_d_a_r_doc.html#LiDARtri',1,'']]], + ['point_5fdistance_111',['point_distance',['../global_8h.html#a4d55bb8abc86cb7dabab1d4e6201a754',1,'helios']]], + ['pointinpolygon_112',['pointInPolygon',['../group__functions.html#gaaa7da223bd02271d4f037b9e5305c023',1,'helios']]], + ['polhausen_20equation_20laminar_20flat_20plate_20forced_20convection_113',['1. The Polhausen Equation (Laminar Flat Plate, Forced Convection)',['../_b_l_conductance_doc.html#BLC1',1,'']]], + ['polygon_20file_20formats_114',['Reading Standard Polygon File Formats',['../_i_o.html#Poly',1,'']]], + ['polygon_20file_20formats_20to_20ply_20using_20blender_115',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['polygon_20files_116',['Polygon Files',['../_i_o.html#PLYread',1,'Reading PLY (Stanford Polygon) Files'],['../_i_o.html#PLYwrite',1,'Writing PLY (Stanford Polygon) Files']]], + ['polymesh_117',['Polymesh',['../classhelios_1_1_polymesh.html',1,'helios::Polymesh'],['../classhelios_1_1_polymesh.html#a4a3c02f97dac295f584090ccd622cb94',1,'helios::Polymesh::Polymesh()']]], + ['position_20of_20the_20sun_118',['Position of the Sun',['../_solar_position_doc.html#SolarPosTheory',1,'']]], + ['position_20plugin_20documentation_119',['Solar Position Plugin Documentation',['../_solar_position_doc.html',1,'PlugIns']]], + ['preprocessspectra_120',['preprocessSpectra',['../struct_camera_calibration.html#a7f11687ea932b11dd32efb4a5a2d79e8',1,'CameraCalibration']]], + ['prerequisites_121',['Prerequisites',['../_overview.html#Prereqs',1,'C++ Prerequisites'],['../_overview.html#PrereqsHelios',1,'Helios Prerequisites']]], + ['primitive_20data_122',['Primitive Data',['../_b_l_conductance_doc.html#BLOutputData',1,'Default Output Primitive Data'],['../_energy_balance_doc.html#EBOutputData',1,'Default Output Primitive Data'],['../_photosynthesis_doc.html#PhotoOutputData',1,'Default Output Primitive Data'],['../_b_l_conductance_doc.html#BLCInputData',1,'Input Primitive Data'],['../_energy_balance_doc.html#EBInputData',1,'Input Primitive Data'],['../_li_d_a_r_doc.html#LiDARInputData',1,'Input Primitive Data'],['../_photosynthesis_doc.html#PhotoInputData',1,'Input Primitive Data'],['../_radiation_doc.html#RadInputData',1,'Input Primitive Data'],['../_stomatal_doc.html#StomatalInputData',1,'Input Primitive Data'],['../_b_l_conductance_doc.html#BLCData',1,'Input/Output Primitive Data'],['../_energy_balance_doc.html#EBData',1,'Input/Output Primitive Data'],['../_radiation_doc.html#RadVarsAndProps',1,'Input/Output Primitive Data'],['../context_primdata.html#context_primdata_intro',1,'Introduction to Primitive Data'],['../_energy_balance_doc.html#EBOptionalOutputData',1,'Optional Output Primitive Data'],['../_photosynthesis_doc.html#PhotoOptionalOutputData',1,'Optional Output Primitive Data'],['../_radiation_doc.html#RadOutputData',1,'Output Primitive Data'],['../_stomatal_doc.html#StomatalOutputData',1,'Output Primitive Data'],['../_voxel_intersection_doc.html#VoxelIntersectionOutputData',1,'Output Primitive Data'],['../_a_p_i.html#PrimData',1,'Primitive Data'],['../_photosynthesis_doc.html#PhotoVarsAndProps',1,'Primitive Data'],['../_plant_architecture_doc.html#PlantArchVarsAndProps',1,'Primitive Data'],['../_stomatal_doc.html#VarsAndProps',1,'Primitive Data'],['../context_primdata.html',1,'Tutorial 5: Primitive Data'],['../_voxel_intersection_doc.html#VoxVarsAndProps',1,'Variables and Primitive Data']]], + ['primitive_20data_20arrays_123',['Creating Primitive Data (Arrays)',['../context_primdata.html#context_primdata_arrays',1,'']]], + ['primitive_20data_20query_20functions_124',['Primitive Data Query Functions',['../_a_p_i.html#PrimDataHelpers',1,'']]], + ['primitive_20data_20scalars_125',['Creating Primitive Data (Scalars)',['../context_primdata.html#context_primdata_scalar',1,'']]], + ['primitive_20data_20to_20text_20file_126',['Exporting Primitive Data to Text File',['../_i_o.html#ExportASCII',1,'']]], + ['primitive_20data_20values_127',['Primitive Data Values',['../_a_p_i.html#GetPrimData',1,'Getting Primitive Data Values'],['../_a_p_i.html#SetPrimData',1,'Setting Primitive Data Values']]], + ['primitive_20data_20values_128',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], + ['primitive_20properties_129',['Primitive Properties',['../_a_p_i.html#PrimProps',1,'']]], + ['primitive_20transformations_130',['Primitive Transformations',['../_a_p_i.html#PrimTransform',1,'']]], + ['primitive_20types_131',['Primitive Types',['../_a_p_i.html#PrimitiveTypes',1,'']]], + ['primitive_20uuids_20for_20organ_20sub_20components_132',['Getting Primitive UUIDs for Organ Sub-Components',['../_plant_architecture_doc.html#PlantArchQueryUUIDs',1,'']]], + ['primitive_20uuids_20of_20model_20geometry_133',['Getting Object IDs and Primitive UUIDs of Model Geometry',['../_plant_architecture_doc.html#PlantArchQueryobjIDs',1,'']]], + ['primitive_5ftype_5fpatch_134',['PRIMITIVE_TYPE_PATCH',['../_context_8h.html#aa2778fcacd9c556a5ce0d9de2ffc1601a6fcd29f0c812849b3eb5bedec52cd744',1,'helios']]], + ['primitive_5ftype_5ftriangle_135',['PRIMITIVE_TYPE_TRIANGLE',['../_context_8h.html#aa2778fcacd9c556a5ce0d9de2ffc1601aeed8005c1692d92beefcbafe8147207c',1,'helios']]], + ['primitive_5ftype_5fvoxel_136',['PRIMITIVE_TYPE_VOXEL',['../_context_8h.html#aa2778fcacd9c556a5ce0d9de2ffc1601a963e2e943d9bd4d5c4648473802cf78c',1,'helios']]], + ['primitiveintersection_2ecu_137',['primitiveIntersection.cu',['../primitive_intersection_8cu.html',1,'']]], + ['primitives_138',['Primitives',['../_a_p_i.html#AddingPrims',1,'Adding Primitives'],['../_i_o.html#PrimXML',1,'Adding Primitives'],['../group__primitives.html',1,'Geometric Primitives'],['../_canopy_generator_doc.html#CGenUUIDs',1,'Retrieving UUIDs for Primitives']]], + ['primitives_20by_20image_20transparency_20channel_139',['Masking Primitives by Image Transparency Channel',['../_a_p_i.html#TextureMask',1,'']]], + ['primitives_20by_20texture_20map_140',['Coloring Primitives by Texture Map',['../_a_p_i.html#TextureColor',1,'']]], + ['primitives_20on_20the_20boundaries_141',['2. Slicing and cropping primitives on the boundaries',['../radiation__beers_law.html#tutorial11_slice',1,'']]], + ['primitivetexturehastransparencychannel_142',['primitiveTextureHasTransparencyChannel',['../classhelios_1_1_context.html#a5e10a8afe134f4a55f65c81a9398c69c',1,'helios::Context']]], + ['primitivetype_143',['PrimitiveType',['../_context_8h.html#aa2778fcacd9c556a5ce0d9de2ffc1601',1,'helios']]], + ['printdefaultvaluereport_144',['printDefaultValueReport',['../class_energy_balance_model.html#a058d24583430bffdf78b53a8f9a5a851',1,'EnergyBalanceModel::printDefaultValueReport() const'],['../class_energy_balance_model.html#aa8f66c144733765289f7748dee193d5e',1,'EnergyBalanceModel::printDefaultValueReport(const std::vector< uint > &UUIDs) const'],['../class_photosynthesis_model.html#ab4ed6afbb715d143cedf136ff355c1b3',1,'PhotosynthesisModel::printDefaultValueReport() const'],['../class_photosynthesis_model.html#a5de185fd3e46ef009c362b116e3d7771',1,'PhotosynthesisModel::printDefaultValueReport(const std::vector< uint > &UUIDs) const'],['../class_stomatal_conductance_model.html#a66e680118d189c0ed79ca45636262a35',1,'StomatalConductanceModel::printDefaultValueReport() const'],['../class_stomatal_conductance_model.html#a28c60dbd86a0aa2c3b8a90704205abde',1,'StomatalConductanceModel::printDefaultValueReport(const std::vector< uint > &UUIDs) const']]], + ['printobjectinfo_145',['printObjectInfo',['../classhelios_1_1_context.html#a963fbdd1d4c3d270d2eb8f49a22b274a',1,'helios::Context']]], + ['printprimitiveinfo_146',['printPrimitiveInfo',['../classhelios_1_1_context.html#a355617da1f3faa4d01ca4d95425e9c0b',1,'helios::Context']]], + ['printwindow_147',['printWindow',['../class_visualizer.html#a2db00c518bf610fdcb70e0ec5a5a0e32',1,'Visualizer::printWindow()'],['../class_visualizer.html#a1840b4285caa645e6b8b28144478cfe1',1,'Visualizer::printWindow(const char *outfile)']]], + ['procedure_148',['Empirical Model Calibration Procedure',['../_photosynthesis_doc.html#PhotoCalib',1,'']]], + ['process_20results_149',['4. Run model and process results',['../radiation__beers_law.html#tutorial11_run',1,'']]], + ['processing_20lidar_20data_150',['Processing LiDAR data',['../_aerial_li_d_a_r_doc.html#AerialLiDARprocess',1,'Processing LiDAR data'],['../_li_d_a_r_doc.html#LiDARprocess',1,'Processing LiDAR data']]], + ['processing_20setup_151',['Data processing setup',['../_aerial_li_d_a_r_doc.html#AerialSetup',1,'']]], + ['program_152',['C++ Program',['../context_selftest.html#program_1',1,'']]], + ['programming_153',['Which platform to use for Helios programming?',['../_dependent_software.html#WhichPlatform',1,'']]], + ['project_154',['Opening and building a project',['../_c_lion_i_d_e.html#CLionProject',1,'']]], + ['project_20script_155',['New Project Script',['../_a_p_i.html#DirScript',1,'']]], + ['project_20to_20xml_20file_20format_156',['Exporting Project to XML File Format',['../_i_o.html#Export',1,'']]], + ['projects_157',['Building and Compiling Your Own Projects',['../_a_p_i.html#BuildCompile',1,'']]], + ['properties_158',['Properties',['../_a_p_i.html#PrimProps',1,'Primitive Properties'],['../_radiation_doc.html#RadProps',1,'Radiative Properties']]], + ['prospect_159',['PROSPECT',['../class_leaf_optics.html#a8af86e8cce4d721230ddc746580b7dcf',1,'LeafOptics']]], + ['prototype_5ffunction_160',['prototype_function',['../struct_leaf_prototype.html#ab709ab7749bf4ad562946441bc7a937e',1,'LeafPrototype']]], + ['prototypes_161',['Prototypes',['../_plant_architecture_doc.html#PlantArchOrgans',1,'Creating Plant Organ Prototypes'],['../_plant_architecture_doc.html#FlowerPrototypes',1,'Flower Prototypes'],['../_plant_architecture_doc.html#FruitPrototypes',1,'Fruit Prototypes'],['../_plant_architecture_doc.html#LeafPrototypes',1,'Leaf Prototypes']]], + ['pseudocolor_20map_162',['Coloring by pseudocolor map',['../_visualizer_doc.html#ColoringPseudo',1,'']]] ]; diff --git a/doc/html/search/all_19.js b/doc/html/search/all_19.js index f8da8af0d..d2b1789c7 100644 --- a/doc/html/search/all_19.js +++ b/doc/html/search/all_19.js @@ -1,5 +1,7 @@ var searchData= [ - ['z_0',['z',['../structhelios_1_1int3.html#adb4b47bc05bdb62677200e025e4bf641',1,'helios::int3::z()'],['../structhelios_1_1int4.html#a5c5969a3b94d165c3a24a5235ea50a99',1,'helios::int4::z()'],['../structhelios_1_1vec3.html#a870c14ca45729f58e8628a050ce38b6f',1,'helios::vec3::z()'],['../structhelios_1_1vec4.html#a660ee0cf07d74bac3c989ce39e035d3b',1,'helios::vec4::z()']]], - ['zenith_1',['zenith',['../structhelios_1_1_spherical_coord.html#a1cf17b1a139ed955ab0dd765e49b0643',1,'helios::SphericalCoord']]] + ['query_20functions_0',['Primitive Data Query Functions',['../_a_p_i.html#PrimDataHelpers',1,'']]], + ['querytimeseriesdata_1',['queryTimeseriesData',['../group__timeseries.html#ga8845155a8f5df1e6db968b78f5a5fb18',1,'helios::Context::queryTimeseriesData(const char *label, const Date &date, const Time &time) const'],['../group__timeseries.html#gab52bde84b96d02a4d928a610794ab146',1,'helios::Context::queryTimeseriesData(const char *label) const'],['../group__timeseries.html#gadffd45c3717c9255d035ce098349ca74',1,'helios::Context::queryTimeseriesData(const char *label, uint index) const']]], + ['querytimeseriesdate_2',['queryTimeseriesDate',['../group__timeseries.html#gae15d53565b2a699d212de636318290b8',1,'helios::Context']]], + ['querytimeseriestime_3',['queryTimeseriesTime',['../group__timeseries.html#ga520b33fad86d1514ceb5eeafa52c81ef',1,'helios::Context']]] ]; diff --git a/doc/html/search/all_1a.js b/doc/html/search/all_1a.js index 683551a36..b270fb9cd 100644 --- a/doc/html/search/all_1a.js +++ b/doc/html/search/all_1a.js @@ -1,14 +1,108 @@ var searchData= [ - ['_7eaeriallidarcloud_0',['~AerialLiDARcloud',['../class_aerial_li_d_a_rcloud.html#acdf5d5239f43e8809a615d4c6e1323e3',1,'AerialLiDARcloud']]], - ['_7ebox_1',['~Box',['../classhelios_1_1_box.html#ab040ad0ee078cb1c9b4fc3c29ec3688d',1,'helios::Box']]], - ['_7econe_2',['~Cone',['../classhelios_1_1_cone.html#ac4f380f30c6bb1dbdf2e8c215c05677c',1,'helios::Cone']]], - ['_7econtext_3',['~Context',['../classhelios_1_1_context.html#a2d34e4556448e40693f61d15e091b604',1,'helios::Context']]], - ['_7edisk_4',['~Disk',['../classhelios_1_1_disk.html#aa670ffa43a0cf0570ea1d789cb8653a5',1,'helios::Disk']]], - ['_7elidarcloud_5',['~LiDARcloud',['../class_li_d_a_rcloud.html#a849627f4e1cd43c49ab21757e812ca68',1,'LiDARcloud']]], - ['_7epolymesh_6',['~Polymesh',['../classhelios_1_1_polymesh.html#a19617972bebd43a3bff944250fc7ddb1',1,'helios::Polymesh']]], - ['_7eradiationmodel_7',['~RadiationModel',['../class_radiation_model.html#aeae03b4de9b9c57ac987407fdfd6afa4',1,'RadiationModel']]], - ['_7esphere_8',['~Sphere',['../classhelios_1_1_sphere.html#ae7e8121c9a60f9c4e4efa853fd2cee59',1,'helios::Sphere']]], - ['_7etile_9',['~Tile',['../classhelios_1_1_tile.html#a001e45730aa531c75c90a599b5524956',1,'helios::Tile']]], - ['_7etube_10',['~Tube',['../classhelios_1_1_tube.html#a15d0248cb525ce91129abcb398f728e8',1,'helios::Tube']]] + ['r_0',['r',['../structhelios_1_1_r_g_bcolor.html#a3e16659a90c69e6043c33c113b2fffe8',1,'helios::RGBcolor::r'],['../structhelios_1_1_r_g_b_acolor.html#a15af7f1c4d0e5e23a7ec2488fe0964df',1,'helios::RGBAcolor::r']]], + ['r_20g_20b_20a_20color_20vectors_1',['R-G-B(-A) color vectors',['../_a_p_i.html#RGB',1,'']]], + ['r_20g_20b_20code_2',['Coloring by r-g-b code',['../_visualizer_doc.html#ColoringRGB',1,'']]], + ['rad2deg_3',['rad2deg',['../group__functions.html#ga0b9a2dac200293044d7e2ae1c03a3140',1,'helios']]], + ['radiation_20camera_4',['Adding a Radiation Camera',['../_radiation_doc.html#RadCamAdd',1,'']]], + ['radiation_20camera_20color_20calibration_5',['Radiation Camera Color Calibration',['../_radiation_doc.html#RadCamCalibColor',1,'']]], + ['radiation_20cameras_6',['Radiation Cameras',['../_radiation_doc.html#RadCam',1,'']]], + ['radiation_20flux_20absorbed_20by_20the_20canopy_20on_20a_20ground_20area_20basis_7',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['radiation_20model_20basics_20tree_20light_20interception_8',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['radiation_20model_20plug_20in_9',['Radiation Model Plug In',['../_tutorials.html#RadiationTuts',1,'Radiation Model Plug-In'],['../_radiation_doc.html#RadUse',1,'Using the Radiation Model Plug-In']]], + ['radiation_20model_20plugin_20documentation_10',['Radiation Model Plugin Documentation',['../_radiation_doc.html',1,'PlugIns']]], + ['radiation_20model_20set_20up_11',['Radiation model set up',['../radiation_basics.html#Tutorial10_rad',1,'2. Radiation model set-up'],['../radiation__beers_law.html#tutorial11_rad',1,'3. Radiation model set-up']]], + ['radiation_20source_20spectral_20distribution_20and_20normalization_12',['Setting the Radiation Source Spectral Distribution and Normalization',['../_radiation_doc.html#SourceDist',1,'']]], + ['radiation_20sources_13',['Radiation Sources',['../_radiation_doc.html#DiskSource',1,'Adding Disk Radiation Sources'],['../_radiation_doc.html#RectSource',1,'Adding Rectangular Radiation Sources'],['../_radiation_doc.html#PointSource',1,'Adding Spherical Radiation Sources'],['../_radiation_doc.html#RadSources',1,'External Radiation Sources']]], + ['radiationband_14',['RadiationBand',['../struct_radiation_band.html',1,'RadiationBand'],['../struct_radiation_band.html#a24a8c605f4553fd80e47f8cb7dd77744',1,'RadiationBand::RadiationBand()']]], + ['radiationcamera_15',['RadiationCamera',['../struct_radiation_camera.html',1,'']]], + ['radiationmodel_16',['RadiationModel',['../class_radiation_model.html',1,'RadiationModel'],['../class_radiation_model.html#acfcbd32e59e2b2728dabde1c7fa74329',1,'RadiationModel::RadiationModel()']]], + ['radiationmodel_20class_20constructor_17',['RadiationModel Class Constructor',['../_radiation_doc.html#RadConstructor',1,'']]], + ['radiationmodel_2ecpp_18',['RadiationModel.cpp',['../_radiation_model_8cpp.html',1,'']]], + ['radiationmodel_2eh_19',['RadiationModel.h',['../_radiation_model_8h.html',1,'']]], + ['radiationsource_20',['RadiationSource',['../struct_radiation_source.html',1,'RadiationSource'],['../struct_radiation_source.html#a1d16744d95956e385117f14a10597985',1,'RadiationSource::RadiationSource(const helios::vec3 &position)'],['../struct_radiation_source.html#a6b8bd173e37c83e1534580ab919d5446',1,'RadiationSource::RadiationSource(const helios::vec3 &position, float width)'],['../struct_radiation_source.html#a13db4b713a7fa670799c426676bc771f',1,'RadiationSource::RadiationSource(const helios::vec3 &position, float position_scaling_factor, float width, float flux_scaling_factor)'],['../struct_radiation_source.html#a858a27adea32f97904b4bceb3eb253ce',1,'RadiationSource::RadiationSource(const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)'],['../struct_radiation_source.html#aedecf6adc5056dc241007993e375f260',1,'RadiationSource::RadiationSource(const helios::vec3 &position, float width, const helios::vec3 &rotation)']]], + ['radiationsourcetype_21',['RadiationSourceType',['../_radiation_model_8h.html#a87dc3655cd959da2cde2b3b72e844579',1,'RadiationModel.h']]], + ['radiative_20bands_22',['Input Radiative Bands',['../_energy_balance_doc.html#EBRad',1,'']]], + ['radiative_20emission_23',['Radiative Emission',['../_radiation_doc.html#RadEmission',1,'']]], + ['radiative_20properties_24',['Radiative Properties',['../_radiation_doc.html#RadProps',1,'']]], + ['radiativepropertiesinitialized_25',['radiativepropertiesinitialized',['../struct_radiation_band.html#ac4e08f643cd7c5d85a02a475c7c9bdbf',1,'RadiationBand']]], + ['radiometer_20data_26',['Calibrating the turbidity using weather station (radiometer) data',['../_solar_position_doc.html#SolarFluxTurb',1,'']]], + ['radius_27',['radius',['../structhelios_1_1_spherical_coord.html#a017f345f74aeaa332cdd36b66b22c906',1,'helios::SphericalCoord']]], + ['randn_28',['randn',['../classhelios_1_1_context.html#a1792e2ad0a31efec76fecd1554e0aa07',1,'helios::Context::randn()'],['../classhelios_1_1_context.html#a903aa1e3e016c522cac528c0377c0fe4',1,'helios::Context::randn(float mean, float stddev)']]], + ['random_20number_20generator_29',['Seeding the Random Number Generator',['../_canopy_generator_doc.html#CGenSeed',1,'']]], + ['randomization_20of_20parameters_30',['Randomization of Parameters',['../_plant_architecture_doc.html#PlantArchRandParam',1,'']]], + ['randomparameter_5ffloat_31',['RandomParameter_float',['../struct_random_parameter__float.html',1,'RandomParameter_float'],['../struct_random_parameter__float.html#a7a817ca20cc05025ce5d84fc0603d41b',1,'RandomParameter_float::RandomParameter_float()'],['../struct_random_parameter__float.html#ab0d3df0a653e4325a6485b7a31450365',1,'RandomParameter_float::RandomParameter_float(float val)'],['../struct_random_parameter__float.html#aaf1fc58b78ae982d6065c5cfbd87a1dd',1,'RandomParameter_float::RandomParameter_float(std::minstd_rand0 *rand_generator)']]], + ['randomparameter_5fint_32',['RandomParameter_int',['../struct_random_parameter__int.html',1,'']]], + ['randu_33',['randu',['../classhelios_1_1_context.html#a4caa001e21890bca8bb952e1206153dc',1,'helios::Context::randu()'],['../classhelios_1_1_context.html#a2f7842a2902bce8a8978a19aa9862a70',1,'helios::Context::randu(float min, float max)'],['../classhelios_1_1_context.html#a4dfca3b6d71d2016661da51c38cac565',1,'helios::Context::randu(int min, int max)'],['../group__functions.html#ga06cb0bc53a3903c6c487dd524bc2315e',1,'helios::randu()'],['../group__functions.html#gad8ccb7b3d22876e477b80d5c2bdb94c1',1,'helios::randu(int imin, int imax)']]], + ['raster_20ground_20cover_20fraction_34',['2D raster ground cover fraction',['../_aerial_li_d_a_r_doc.html#AerialGroundCover',1,'']]], + ['raster_20height_20maps_35',['2D raster height maps',['../_aerial_li_d_a_r_doc.html#AerialRasters',1,'']]], + ['rate_20to_20co2_36',['Response of Assimilation Rate to CO2',['../_photosynthesis_doc.html#PhotoCO2Param',1,'']]], + ['rate_20to_20light_37',['Response of Assimilation Rate to Light',['../_photosynthesis_doc.html#PhotoLightParam',1,'']]], + ['rate_20to_20temperature_38',['Rate to Temperature',['../_photosynthesis_doc.html#PhotoTempParam',1,'Response of Assimilation Rate to Temperature'],['../_photosynthesis_doc.html#PhotoRespParam',1,'Response of Respiration Rate to Temperature']]], + ['raygeneration_2ecu_39',['rayGeneration.cu',['../ray_generation_8cu.html',1,'']]], + ['rayhit_2ecu_40',['rayHit.cu',['../ray_hit_8cu.html',1,'']]], + ['raytracing_2ecu_2eh_41',['RayTracing.cu.h',['../_ray_tracing_8cu_8h.html',1,'']]], + ['rc2direction_42',['rc2direction',['../struct_scan_metadata.html#ae28f6042e5eae2adaaacbeaaa6109a8c',1,'ScanMetadata']]], + ['read_5fjpeg_5ffile_43',['read_JPEG_file',['../_visualizer_8h.html#a1ffc8a34ba2895084c71e95ed615d10a',1,'read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width): Visualizer.cpp'],['../_visualizer_8cpp.html#a1ffc8a34ba2895084c71e95ed615d10a',1,'read_JPEG_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width): Visualizer.cpp']]], + ['read_5fpng_5ffile_44',['read_png_file',['../_visualizer_8h.html#a0e60a86e54784ea9f2b178ce9540713f',1,'read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width): Visualizer.cpp'],['../_visualizer_8cpp.html#a0e60a86e54784ea9f2b178ce9540713f',1,'read_png_file(const char *filename, std::vector< unsigned char > &texture, uint &height, uint &width): Visualizer.cpp']]], + ['readcontextxml_45',['readContextXML',['../class_aerial_li_d_a_rcloud.html#a146bfba2241154ce7fa958bf7c797153',1,'AerialLiDARcloud']]], + ['reading_20obj_20wavefront_20files_46',['Reading OBJ (Wavefront) Files',['../_i_o.html#OBJread',1,'']]], + ['reading_20ply_20stanford_20polygon_20files_47',['Reading PLY (Stanford Polygon) Files',['../_i_o.html#PLYread',1,'']]], + ['reading_20standard_20polygon_20file_20formats_48',['Reading Standard Polygon File Formats',['../_i_o.html#Poly',1,'']]], + ['reading_20xml_20files_49',['Reading XML Files',['../_i_o.html#XMLread',1,'']]], + ['readjpeg_50',['readJPEG',['../global_8h.html#a248b712fb0f1b77074a223179850a6dd',1,'helios']]], + ['readparametersfromxml_51',['readParametersFromXML',['../struct_base_canopy_parameters.html#a929e1fee86e6408cf42ca398510fc672',1,'BaseCanopyParameters::readParametersFromXML()'],['../struct_homogeneous_canopy_parameters.html#a199c70328138eb4af32e22fb974b8783',1,'HomogeneousCanopyParameters::readParametersFromXML()'],['../struct_spherical_crowns_canopy_parameters.html#addf82e2fd57315136b747531ecb4200a',1,'SphericalCrownsCanopyParameters::readParametersFromXML()'],['../struct_conical_crowns_canopy_parameters.html#adcca81e7a3f0f5791d83cf38317603d3',1,'ConicalCrownsCanopyParameters::readParametersFromXML()'],['../struct_base_grape_vine_parameters.html#a39fd838f1f07fca0f8c5b38619379167',1,'BaseGrapeVineParameters::readParametersFromXML()'],['../struct_v_s_p_grapevine_parameters.html#a07f45311c1199758112af1c5ecd93b66',1,'VSPGrapevineParameters::readParametersFromXML()'],['../struct_split_grapevine_parameters.html#a3263eaf412ecd633ef785b96a65f6bec',1,'SplitGrapevineParameters::readParametersFromXML()'],['../struct_unilateral_grapevine_parameters.html#a78630bdc04ab711e118de436e4e03b20',1,'UnilateralGrapevineParameters::readParametersFromXML()'],['../struct_goblet_grapevine_parameters.html#a79f3f790ebb458d89fdb26d485d718da',1,'GobletGrapevineParameters::readParametersFromXML()'],['../struct_white_spruce_canopy_parameters.html#a2dbc61de09c55a8dfdd9a490d2ef3be3',1,'WhiteSpruceCanopyParameters::readParametersFromXML()'],['../struct_tomato_parameters.html#a94bd8a46a188d88039685eb4576c3e8b',1,'TomatoParameters::readParametersFromXML()'],['../struct_strawberry_parameters.html#a621e67abb2a43aac9714f6e8fde5aa96',1,'StrawberryParameters::readParametersFromXML()'],['../struct_walnut_canopy_parameters.html#a888acadc0f54524dc3aabe152a7a1679',1,'WalnutCanopyParameters::readParametersFromXML()'],['../struct_sorghum_canopy_parameters.html#a616f622ac8a7387b0ec94509340ccd18',1,'SorghumCanopyParameters::readParametersFromXML()'],['../struct_bean_parameters.html#ac37cccbcb4b68058724f2c09bde4007e',1,'BeanParameters::readParametersFromXML()']]], + ['readpng_52',['readPNG',['../global_8h.html#a99f41f50ffe7f2c092e16377f5cef979',1,'helios']]], + ['readpngalpha_53',['readPNGAlpha',['../global_8h.html#ade5b9b8370f50d8c2002ba48d47521f5',1,'helios']]], + ['readromccanopy_54',['readROMCCanopy',['../struct_camera_calibration.html#ae4f513355e7095b19417ad62d6f9f89f',1,'CameraCalibration']]], + ['reconstruction_55',['Plant reconstruction',['../_li_d_a_r_doc.html#LiDARresonstruction',1,'']]], + ['rectangle_5fbounds_56',['rectangle_bounds',['../primitive_intersection_8cu.html#a31b2bef2ed3e97edbd08bfa1243e9d40',1,'primitiveIntersection.cu']]], + ['rectangle_5fintersect_57',['rectangle_intersect',['../primitive_intersection_8cu.html#a84078834a363095c77877d20e45cc16b',1,'primitiveIntersection.cu']]], + ['rectangular_20radiation_20sources_58',['Adding Rectangular Radiation Sources',['../_radiation_doc.html#RectSource',1,'']]], + ['recursive_20branches_59',['Recursive Branches',['../_weber_penn_doc.html#WPTreeR1',1,'']]], + ['reflectancefilter_60',['reflectanceFilter',['../class_aerial_li_d_a_rcloud.html#ad9b43918cdfd1b4489dca2ac098f9ca9',1,'AerialLiDARcloud::reflectanceFilter()'],['../class_li_d_a_rcloud.html#adf2d9ef2301fd7fdee97e2adc0947dd3',1,'LiDARcloud::reflectanceFilter()']]], + ['removing_20the_20background_61',['3. Removing the background',['../_making_masks.html#Three',1,'']]], + ['renameglobaldata_62',['renameGlobalData',['../classhelios_1_1_context.html#a842cfdcdce20fb9fef8dc8703f12f1fa',1,'helios::Context']]], + ['renameobjectdata_63',['renameObjectData',['../classhelios_1_1_context.html#aa34c4f240d760708cf845546cb6bdb93',1,'helios::Context']]], + ['renameprimitivedata_64',['renamePrimitiveData',['../classhelios_1_1_context.html#a5c76017adb8c397c3b2398861ee23c7d',1,'helios::Context']]], + ['render_65',['render',['../class_synthetic_annotation.html#ab217bc96eaee704af3fd032eb0f999fc',1,'SyntheticAnnotation']]], + ['resize_5fvector_66',['resize_vector',['../group__functions.html#ga8b6573f58a513ebbc539ae7529daa748',1,'helios::resize_vector(std::vector< std::vector< anytype > > &vec, uint Nx, uint Ny)'],['../group__functions.html#ga71f9bf6c09e75b9c8d8ff36c7187a31d',1,'helios::resize_vector(std::vector< std::vector< std::vector< anytype > > > &vec, uint Nx, uint Ny, uint Nz)'],['../group__functions.html#ga9c202da0366b53b742824bfac2e8f536',1,'helios::resize_vector(std::vector< std::vector< std::vector< std::vector< anytype > > > > &vec, uint Nx, uint Ny, uint Nz, uint Nw)']]], + ['respiration_20rate_20to_20temperature_67',['Response of Respiration Rate to Temperature',['../_photosynthesis_doc.html#PhotoRespParam',1,'']]], + ['response_68',['Temperature Response',['../_photosynthesis_doc.html#TempResponse',1,'']]], + ['response_20function_69',['Response Function',['../_photosynthesis_doc.html#CO2Response',1,'CO2 Response Function'],['../_photosynthesis_doc.html#LightResponse',1,'Light Response Function']]], + ['response_20of_20assimilation_20rate_20to_20co2_70',['Response of Assimilation Rate to CO2',['../_photosynthesis_doc.html#PhotoCO2Param',1,'']]], + ['response_20of_20assimilation_20rate_20to_20light_71',['Response of Assimilation Rate to Light',['../_photosynthesis_doc.html#PhotoLightParam',1,'']]], + ['response_20of_20assimilation_20rate_20to_20temperature_72',['Response of Assimilation Rate to Temperature',['../_photosynthesis_doc.html#PhotoTempParam',1,'']]], + ['response_20of_20model_20parameters_73',['Temperature response of model parameters',['../_photosynthesis_doc.html#FvCBtemperature',1,'']]], + ['response_20of_20respiration_20rate_20to_20temperature_74',['Response of Respiration Rate to Temperature',['../_photosynthesis_doc.html#PhotoRespParam',1,'']]], + ['result_75',['Step 4. Plot the result',['../visualizer_basics.html#vis_step4',1,'']]], + ['results_76',['results',['../radiation__beers_law.html#tutorial11_run',1,'4. Run model and process results'],['../_li_d_a_r_doc.html#LiDARvis',1,'Visualizing results']]], + ['results_20to_20file_77',['Writing results to file',['../_li_d_a_r_doc.html#LiDARoutput',1,'']]], + ['retrieving_20information_20from_20the_20model_78',['Retrieving Information from the Model',['../_plant_architecture_doc.html#PlantArchQuery',1,'']]], + ['retrieving_20uuids_20for_20primitives_79',['Retrieving UUIDs for Primitives',['../_canopy_generator_doc.html#CGenUUIDs',1,'']]], + ['return_20and_20full_20waveform_20lidar_20data_80',['return and full waveform LiDAR data',['../_aerial_li_d_a_r_doc.html#AerialLiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#LiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data']]], + ['return_20data_81',['Synthetic discrete-return data',['../_li_d_a_r_doc.html#LiDARsynthdiscrete',1,'']]], + ['rgb_20color_20vector_82',['RGB Color Vector',['../context_vectors.html#RGBtut',1,'']]], + ['rgbacolor_83',['RGBAcolor',['../structhelios_1_1_r_g_b_acolor.html',1,'helios::RGBAcolor'],['../structhelios_1_1_r_g_b_acolor.html#a37d62b0c0e7d5a2d19a8ea0159984bea',1,'helios::RGBAcolor::RGBAcolor()'],['../structhelios_1_1_r_g_b_acolor.html#a45e32082a71599a971bf927981959b55',1,'helios::RGBAcolor::RGBAcolor(float r, float g, float b, float a)'],['../structhelios_1_1_r_g_b_acolor.html#aa479f8992b4b3201bf45b5e7140c3920',1,'helios::RGBAcolor::RGBAcolor(const float C[4])'],['../structhelios_1_1_r_g_b_acolor.html#ae03b805667e5f6f2914e0ec53375588f',1,'helios::RGBAcolor::RGBAcolor(const std::vector< float > &C)']]], + ['rgbcolor_84',['RGBcolor',['../structhelios_1_1_r_g_bcolor.html',1,'helios::RGBcolor'],['../structhelios_1_1_r_g_bcolor.html#a030dae08fe8c38ad9bb7c735254ac53e',1,'helios::RGBcolor::RGBcolor()'],['../structhelios_1_1_r_g_bcolor.html#a3e99268f14b8cdff29d50230585fad36',1,'helios::RGBcolor::RGBcolor(float r, float g, float b)'],['../structhelios_1_1_r_g_bcolor.html#adbf756a81c862233091e6b823d35e904',1,'helios::RGBcolor::RGBcolor(const float C[3])'],['../structhelios_1_1_r_g_bcolor.html#a80d4a3e0c267ee3d93b832b0e575be4a',1,'helios::RGBcolor::RGBcolor(const std::vector< float > &C)'],['../structhelios_1_1_r_g_bcolor.html#ae9ae503986d99822085d79d27a8e8362',1,'helios::RGBcolor::RGBcolor(const vec3 &C)']]], + ['right_20cuda_20and_20optix_20version_85',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['rotate_86',['rotate',['../classhelios_1_1_compound_object.html#a06cb565db4569677cdfde7d0bb33c61e',1,'helios::CompoundObject::rotate(float rotation_radians, const char *rotation_axis_xyz_string)'],['../classhelios_1_1_compound_object.html#a7a4ab077211799f617a423bf05282aee',1,'helios::CompoundObject::rotate(float rotation_radians, const helios::vec3 &rotation_axis_vector)'],['../classhelios_1_1_compound_object.html#ab09695c9859a79b17806f7a4a18b56f4',1,'helios::CompoundObject::rotate(float rotation_radians, const helios::vec3 &origin, const helios::vec3 &rotation_axis_vector)']]], + ['rotateobject_87',['rotateObject',['../classhelios_1_1_context.html#a3b4ffa6ef56001319b2b63703b9f2acd',1,'helios::Context::rotateObject(uint ObjID, float rotation_radians, const char *rotation_axis_xyz)'],['../classhelios_1_1_context.html#a54589e1ad3210184bde2c0f84df193c2',1,'helios::Context::rotateObject(const std::vector< uint > &ObjIDs, float rotation_radians, const char *rotation_axis_xyz)'],['../classhelios_1_1_context.html#a7e40a23540dccd04d111b523759789e5',1,'helios::Context::rotateObject(uint ObjID, float rotation_radians, const vec3 &rotation_axis_vector)'],['../classhelios_1_1_context.html#a1a18c9a548406cbb4490e4ca7b75399b',1,'helios::Context::rotateObject(const std::vector< uint > &ObjIDs, float rotation_radians, const vec3 &rotation_axis_vector)'],['../classhelios_1_1_context.html#a6b9587a6ccab5dd8aac367bf19a939d8',1,'helios::Context::rotateObject(uint ObjID, float rotation_radians, const vec3 &rotation_origin, const vec3 &rotation_axis_vector)'],['../classhelios_1_1_context.html#ae7904c86f3479719ed6f7da045546d29',1,'helios::Context::rotateObject(const std::vector< uint > &ObjIDs, float rotation_radians, const vec3 &rotation_origin, const vec3 &rotation_axis_vector)']]], + ['rotatepoint_88',['rotatePoint',['../group__functions.html#ga17de9e03f309dedcd648606653ddd05e',1,'helios::rotatePoint(const vec3 &position, const SphericalCoord &rotation)'],['../group__functions.html#gaa8705d90b2af04d56fa5086b917d9b7a',1,'helios::rotatePoint(const vec3 &position, float theta, float phi)']]], + ['rotatepointaboutline_89',['rotatePointAboutLine',['../global_8h.html#a09ae9efe6ba5dddb144519931bcf94b5',1,'helios']]], + ['rotateprimitive_90',['rotatePrimitive',['../classhelios_1_1_context.html#a5e5dd3ef9b56a0bf148ed9d315422fe7',1,'helios::Context::rotatePrimitive(uint UUID, float rot, const char *axis)'],['../classhelios_1_1_context.html#a236cf95ad565a77338bd45fe098e9b83',1,'helios::Context::rotatePrimitive(const std::vector< uint > &UUIDs, float rot, const char *axis)'],['../classhelios_1_1_context.html#a55a61fb7f4a3829b04680dabb9a0276a',1,'helios::Context::rotatePrimitive(uint UUID, float rot, const helios::vec3 &axis)'],['../classhelios_1_1_context.html#aca6e120f1607b07c71c4da83ab449813',1,'helios::Context::rotatePrimitive(const std::vector< uint > &UUIDs, float rot, const vec3 &axis)'],['../classhelios_1_1_context.html#ac325bb44ad539aac6ce37d03ff51de3c',1,'helios::Context::rotatePrimitive(uint UUID, float rot, const helios::vec3 &origin, const helios::vec3 &axis)'],['../classhelios_1_1_context.html#ae32a831a933122e64bc2bca4d23d3777',1,'helios::Context::rotatePrimitive(const std::vector< uint > &UUIDs, float rot, const helios::vec3 &origin, const vec3 &axis)']]], + ['rotating_20and_20cropping_20optional_91',['2. Rotating and cropping (OPTIONAL)',['../_making_masks.html#Two',1,'']]], + ['row_5fspacing_92',['row_spacing',['../struct_base_grape_vine_parameters.html#a4c2005587aecf5648ca2bf6fcf57b5a7',1,'BaseGrapeVineParameters::row_spacing'],['../struct_tomato_parameters.html#a5b019fdf3087dbe150ef61cb68afd6f6',1,'TomatoParameters::row_spacing'],['../struct_strawberry_parameters.html#ae2383458132397e4bbe111d4b4fc38b9',1,'StrawberryParameters::row_spacing'],['../struct_walnut_canopy_parameters.html#af95c46150f1f3ed22dcea4d23e5821d8',1,'WalnutCanopyParameters::row_spacing'],['../struct_sorghum_canopy_parameters.html#ad03798a817bc923891357b0298050b6a',1,'SorghumCanopyParameters::row_spacing'],['../struct_bean_parameters.html#ad1b0816e394a4d7f5f848d99ef4d8527',1,'BeanParameters::row_spacing']]], + ['row_5fspacing_5fspread_93',['row_spacing_spread',['../struct_base_grape_vine_parameters.html#adc793dabe989efe16fbca06821eaf11f',1,'BaseGrapeVineParameters']]], + ['run_94',['run',['../class_b_l_conductance_model.html#aaa522103af850ee1fff89c0f698ee049',1,'BLConductanceModel::run()'],['../class_b_l_conductance_model.html#a0b46d5ade5b84be8e8a44723c5dcf720',1,'BLConductanceModel::run(const std::vector< uint > &UUIDs)'],['../class_dummy_model.html#aed84f7d16e80cd5a1b6ca01ef45d3842',1,'DummyModel::run()'],['../class_energy_balance_model.html#aaee8cda49702db14f26e26bddaf3c16a',1,'EnergyBalanceModel::run()'],['../class_energy_balance_model.html#a5048dec148d795d76d10d331bdb35156',1,'EnergyBalanceModel::run(float dt)'],['../class_energy_balance_model.html#a2053c71e6ae107ba6ba612c56b245cf4',1,'EnergyBalanceModel::run(const std::vector< uint > &UUIDs)'],['../class_energy_balance_model.html#a4accc5ed86460c662db1352ef1857e0c',1,'EnergyBalanceModel::run(const std::vector< uint > &UUIDs, float dt)'],['../class_leaf_optics.html#a883df20abfc7c37120262108ac056507',1,'LeafOptics::run(const std::vector< uint > &UUIDs, const LeafOpticsProperties &leafproperties, const std::string &label)'],['../class_leaf_optics.html#affa921ab4465e6d89cdbe41e15a087ba',1,'LeafOptics::run(const LeafOpticsProperties &leafproperties, const std::string &label)'],['../class_photosynthesis_model.html#abb06ce82388d1147e720c3591f9d17b6',1,'PhotosynthesisModel::run()'],['../class_photosynthesis_model.html#a837fd2c9c8a84c584e31c5cf3ce7de89',1,'PhotosynthesisModel::run(const std::vector< uint > &lUUIDs)'],['../class_stomatal_conductance_model.html#acb041e756e00d5ced85b03905a97f5c6',1,'StomatalConductanceModel::run()'],['../class_stomatal_conductance_model.html#ae08af8bff0c6924133948c7459baf91f',1,'StomatalConductanceModel::run(const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#ab83b66067cdd933ec48ee1c75cbfe1b7',1,'StomatalConductanceModel::run(float dt)'],['../class_stomatal_conductance_model.html#ab3cf7261085bc4f5292a5340285a75ec',1,'StomatalConductanceModel::run(const std::vector< uint > &UUIDs, float dt)']]], + ['run_20model_20and_20process_20results_95',['4. Run model and process results',['../radiation__beers_law.html#tutorial11_run',1,'']]], + ['run_20the_20model_20and_20calculate_20par_20interception_96',['3. Run the model and calculate PAR interception',['../radiation_basics.html#Tutorial10_run',1,'']]], + ['runband_97',['runBand',['../class_radiation_model.html#a7d803f2b67bc4d0d89b2dc98a58d9ff1',1,'RadiationModel::runBand(const std::string &label)'],['../class_radiation_model.html#a19c42659077eb909a6dc7fa137459b69',1,'RadiationModel::runBand(const std::vector< std::string > &labels)']]], + ['running_98',['Building, Compiling, and Running',['../context_selftest.html#build_2',1,'']]], + ['running_20simulations_99',['Running Simulations',['../_radiation_doc.html#RadRun',1,'']]], + ['running_20the_20model_100',['Running the Model',['../_b_l_conductance_doc.html#BLCRun',1,'']]], + ['running_20the_20model_20in_20dynamic_20mode_101',['Running the Model in Dynamic Mode',['../_stomatal_doc.html#StomatalRunDyn',1,'']]], + ['running_20the_20model_20steady_20state_20mode_102',['Running the Model (steady-state mode)',['../_stomatal_doc.html#StomatalRun',1,'']]], + ['running_20the_20steady_20state_20model_103',['Running the Steady-State Model',['../_energy_balance_doc.html#EBRun',1,'']]], + ['runradiationimaging_104',['runRadiationImaging',['../class_radiation_model.html#a728c89b679cfcb957567b43e52023baf',1,'RadiationModel::runRadiationImaging(const std::string &cameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)'],['../class_radiation_model.html#a63f23da646aac79163c8154ef3a6e93e',1,'RadiationModel::runRadiationImaging(const std::vector< std::string > &cameralabels, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &bandlabels, const std::vector< std::string > &cameraresponselabels, helios::vec2 wavelengthrange, float fluxscale=1, float diffusefactor=0.0005, uint scatteringdepth=4)']]] ]; diff --git a/doc/html/search/all_1b.js b/doc/html/search/all_1b.js new file mode 100644 index 000000000..b14cf2f1c --- /dev/null +++ b/doc/html/search/all_1b.js @@ -0,0 +1,332 @@ +var searchData= +[ + ['s_0',['Class Constructor(s)',['../_visualizer_doc.html#VisClass',1,'']]], + ['s_20law_1',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['s1_5fleaf1_5fangle_2',['s1_leaf1_angle',['../struct_sorghum_canopy_parameters.html#a055da9b13d5d33b8b62e3fb9d8432f08',1,'SorghumCanopyParameters']]], + ['s1_5fleaf2_5fangle_3',['s1_leaf2_angle',['../struct_sorghum_canopy_parameters.html#adaf3271852908daf8b55121ce7fffd7c',1,'SorghumCanopyParameters']]], + ['s1_5fleaf3_5fangle_4',['s1_leaf3_angle',['../struct_sorghum_canopy_parameters.html#aed23ed04b3ddca133071f74f4a6c4aad',1,'SorghumCanopyParameters']]], + ['s1_5fleaf_5fsize1_5',['s1_leaf_size1',['../struct_sorghum_canopy_parameters.html#a5f043e646e579018dfa6fec8fb458368',1,'SorghumCanopyParameters']]], + ['s1_5fleaf_5fsize2_6',['s1_leaf_size2',['../struct_sorghum_canopy_parameters.html#a1f43b856d67a2d0d827445d898f7527c',1,'SorghumCanopyParameters']]], + ['s1_5fleaf_5fsize3_7',['s1_leaf_size3',['../struct_sorghum_canopy_parameters.html#a7e30b11a0539a22e26b5ba0b62e74c89',1,'SorghumCanopyParameters']]], + ['s1_5fleaf_5fsubdivisions_8',['s1_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#ac84f20cc1f137d8969c1166d78589161',1,'SorghumCanopyParameters']]], + ['s1_5fleaf_5ftexture_5ffile_9',['s1_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#a1ba7822b8d7b621236d3fb26339f3b80',1,'SorghumCanopyParameters']]], + ['s1_5fstem_5flength_10',['s1_stem_length',['../struct_sorghum_canopy_parameters.html#ae2e5589dba50b2dc31be67b2b27582a2',1,'SorghumCanopyParameters']]], + ['s1_5fstem_5fradius_11',['s1_stem_radius',['../struct_sorghum_canopy_parameters.html#aa6f75372512d2cbbe72091f90b416c8c',1,'SorghumCanopyParameters']]], + ['s1_5fstem_5fsubdivisions_12',['s1_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#ac18297754bb4664c4b06917edea77a82',1,'SorghumCanopyParameters']]], + ['s2_5fleaf1_5fangle_13',['s2_leaf1_angle',['../struct_sorghum_canopy_parameters.html#a35058e0b3485d531348a82d0fcbfb92f',1,'SorghumCanopyParameters']]], + ['s2_5fleaf2_5fangle_14',['s2_leaf2_angle',['../struct_sorghum_canopy_parameters.html#af96017371615c50147f5ac71cead2b6d',1,'SorghumCanopyParameters']]], + ['s2_5fleaf3_5fangle_15',['s2_leaf3_angle',['../struct_sorghum_canopy_parameters.html#a546b3ffb7e55a1f3050d914b3cf3fb0c',1,'SorghumCanopyParameters']]], + ['s2_5fleaf4_5fangle_16',['s2_leaf4_angle',['../struct_sorghum_canopy_parameters.html#a42b6683f425584df7d87da2b096ac901',1,'SorghumCanopyParameters']]], + ['s2_5fleaf5_5fangle_17',['s2_leaf5_angle',['../struct_sorghum_canopy_parameters.html#a4b5828b945f8f2ab30855bee3aabc9c5',1,'SorghumCanopyParameters']]], + ['s2_5fleaf_5fsize1_18',['s2_leaf_size1',['../struct_sorghum_canopy_parameters.html#aedaf27d8e335d46e89d8f3f960a5fdd5',1,'SorghumCanopyParameters']]], + ['s2_5fleaf_5fsize2_19',['s2_leaf_size2',['../struct_sorghum_canopy_parameters.html#ace2b6a18a80e6f53d4459f4233d329c1',1,'SorghumCanopyParameters']]], + ['s2_5fleaf_5fsize3_20',['s2_leaf_size3',['../struct_sorghum_canopy_parameters.html#a92fda41cc4d33cc1bbda5647b2b85116',1,'SorghumCanopyParameters']]], + ['s2_5fleaf_5fsize4_21',['s2_leaf_size4',['../struct_sorghum_canopy_parameters.html#ac69d718bffad7c7586615440de9f4339',1,'SorghumCanopyParameters']]], + ['s2_5fleaf_5fsize5_22',['s2_leaf_size5',['../struct_sorghum_canopy_parameters.html#ab1722a2d04435a3d9ebeefdffde6d3dd',1,'SorghumCanopyParameters']]], + ['s2_5fleaf_5fsubdivisions_23',['s2_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#a4cc923591186631e81670cba369764f5',1,'SorghumCanopyParameters']]], + ['s2_5fleaf_5ftexture_5ffile_24',['s2_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#a3d4def312245c9351ed27b6e4e2ccedd',1,'SorghumCanopyParameters']]], + ['s2_5fstem_5flength_25',['s2_stem_length',['../struct_sorghum_canopy_parameters.html#adab00887989b76b54f6fe5cbe0b00fa4',1,'SorghumCanopyParameters']]], + ['s2_5fstem_5fradius_26',['s2_stem_radius',['../struct_sorghum_canopy_parameters.html#a566d945dca39d9064e76349db76b3b6e',1,'SorghumCanopyParameters']]], + ['s2_5fstem_5fsubdivisions_27',['s2_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#a02d288c3ce64c16aa3ed35bbde1a3e72',1,'SorghumCanopyParameters']]], + ['s3_5fleaf_5fsize_28',['s3_leaf_size',['../struct_sorghum_canopy_parameters.html#ad6dc4e8e1c43d9e85cc303c4270b995d',1,'SorghumCanopyParameters']]], + ['s3_5fleaf_5fsubdivisions_29',['s3_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#a13cd4f9fa100a7f945549d215f8e2dd7',1,'SorghumCanopyParameters']]], + ['s3_5fleaf_5ftexture_5ffile_30',['s3_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#a87f1e1ec6df26337ea31b9d235bfa6f4',1,'SorghumCanopyParameters']]], + ['s3_5fmean_5fleaf_5fangle_31',['s3_mean_leaf_angle',['../struct_sorghum_canopy_parameters.html#a2d470fce2f09d835c48d5f8a04e6a0f3',1,'SorghumCanopyParameters']]], + ['s3_5fnumber_5fof_5fleaves_32',['s3_number_of_leaves',['../struct_sorghum_canopy_parameters.html#aadb0291f1b07d6de354e2bf86050ab76',1,'SorghumCanopyParameters']]], + ['s3_5fstem_5flength_33',['s3_stem_length',['../struct_sorghum_canopy_parameters.html#a874045edcb46926aaddeb3588061a275',1,'SorghumCanopyParameters']]], + ['s3_5fstem_5fradius_34',['s3_stem_radius',['../struct_sorghum_canopy_parameters.html#a6862b2e046366ce852896fca526a8857',1,'SorghumCanopyParameters']]], + ['s3_5fstem_5fsubdivisions_35',['s3_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#ae0a4609f94d4e1104ff5a411c8e1b28e',1,'SorghumCanopyParameters']]], + ['s4_5fleaf_5fsize_36',['s4_leaf_size',['../struct_sorghum_canopy_parameters.html#a542b812d6c48b3c41cab4111261ee242',1,'SorghumCanopyParameters']]], + ['s4_5fleaf_5fsubdivisions_37',['s4_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#a55fdb0febc1cc573d59bcad2db07d6a7',1,'SorghumCanopyParameters']]], + ['s4_5fleaf_5ftexture_5ffile_38',['s4_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#acc23aed799e76667167f474ecd29af4b',1,'SorghumCanopyParameters']]], + ['s4_5fmean_5fleaf_5fangle_39',['s4_mean_leaf_angle',['../struct_sorghum_canopy_parameters.html#a4ab179de4931853476bb68cf9cccfb57',1,'SorghumCanopyParameters']]], + ['s4_5fnumber_5fof_5fleaves_40',['s4_number_of_leaves',['../struct_sorghum_canopy_parameters.html#a823d78f11ca9b5d8f8f3a5dfe9c3ab8f',1,'SorghumCanopyParameters']]], + ['s4_5fpanicle_5fsize_41',['s4_panicle_size',['../struct_sorghum_canopy_parameters.html#af6380b91e8a559b711e0b973ef862bc2',1,'SorghumCanopyParameters']]], + ['s4_5fpanicle_5fsubdivisions_42',['s4_panicle_subdivisions',['../struct_sorghum_canopy_parameters.html#a83893b5e61c2501509fc2f0c9d7b7634',1,'SorghumCanopyParameters']]], + ['s4_5fseed_5ftexture_5ffile_43',['s4_seed_texture_file',['../struct_sorghum_canopy_parameters.html#a0e592b9ddd3bdaf213c154dd3865c710',1,'SorghumCanopyParameters']]], + ['s4_5fstem_5flength_44',['s4_stem_length',['../struct_sorghum_canopy_parameters.html#a11feead673b9e86c4559a8670c290257',1,'SorghumCanopyParameters']]], + ['s4_5fstem_5fradius_45',['s4_stem_radius',['../struct_sorghum_canopy_parameters.html#a2a80af374f3d050df6ecf568e831a739',1,'SorghumCanopyParameters']]], + ['s4_5fstem_5fsubdivisions_46',['s4_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#a321d838cea5a50a7131e71c3c732367a',1,'SorghumCanopyParameters']]], + ['s5_5fleaf_5fsize_47',['s5_leaf_size',['../struct_sorghum_canopy_parameters.html#ab6c381612b2ca76fc409401dc75bab3f',1,'SorghumCanopyParameters']]], + ['s5_5fleaf_5fsubdivisions_48',['s5_leaf_subdivisions',['../struct_sorghum_canopy_parameters.html#a78ef9c1a644caad89f52d759630d9a0b',1,'SorghumCanopyParameters']]], + ['s5_5fleaf_5ftexture_5ffile_49',['s5_leaf_texture_file',['../struct_sorghum_canopy_parameters.html#a6ad429a68501b5a1fecb795a73d943d8',1,'SorghumCanopyParameters']]], + ['s5_5fmean_5fleaf_5fangle_50',['s5_mean_leaf_angle',['../struct_sorghum_canopy_parameters.html#a10c15107111fdd0b73cfef24d45d3ab4',1,'SorghumCanopyParameters']]], + ['s5_5fnumber_5fof_5fleaves_51',['s5_number_of_leaves',['../struct_sorghum_canopy_parameters.html#a0fd7a4e7d5f5a2fa419e738a35d368e1',1,'SorghumCanopyParameters']]], + ['s5_5fpanicle_5fsize_52',['s5_panicle_size',['../struct_sorghum_canopy_parameters.html#aad64258f9ac6ec9df2f86c5ff9bb8d0d',1,'SorghumCanopyParameters']]], + ['s5_5fpanicle_5fsubdivisions_53',['s5_panicle_subdivisions',['../struct_sorghum_canopy_parameters.html#a3dd303738e509f6b67e423f303b39e13',1,'SorghumCanopyParameters']]], + ['s5_5fseed_5ftexture_5ffile_54',['s5_seed_texture_file',['../struct_sorghum_canopy_parameters.html#af5ce42735f214b47e215759c8c6b02ee',1,'SorghumCanopyParameters']]], + ['s5_5fstem_5fbend_55',['s5_stem_bend',['../struct_sorghum_canopy_parameters.html#a5d8dcff59a7cb1604c67595efaa04b36',1,'SorghumCanopyParameters']]], + ['s5_5fstem_5flength_56',['s5_stem_length',['../struct_sorghum_canopy_parameters.html#a09aa6e060ca74d672d20742ff6f330dc',1,'SorghumCanopyParameters']]], + ['s5_5fstem_5fradius_57',['s5_stem_radius',['../struct_sorghum_canopy_parameters.html#a667cefb6b9b105d58c3bef82db61c52f',1,'SorghumCanopyParameters']]], + ['s5_5fstem_5fsubdivisions_58',['s5_stem_subdivisions',['../struct_sorghum_canopy_parameters.html#a016f6dbe9526e4411d9b7f1480e562b6',1,'SorghumCanopyParameters']]], + ['samplechildshoottype_59',['sampleChildShootType',['../struct_shoot.html#aab304a4f16758e32927dba357f6fb775',1,'Shoot']]], + ['sampleepicormicshoot_60',['sampleEpicormicShoot',['../struct_shoot.html#afe4fa0bc2d46f94087c88b658d8aef13',1,'Shoot']]], + ['samplevegetativebudbreak_61',['sampleVegetativeBudBreak',['../struct_shoot.html#a79c44586c03664cfe2e7e8e114821f4f',1,'Shoot']]], + ['scalarfilter_62',['scalarFilter',['../class_aerial_li_d_a_rcloud.html#a4e1870a07129fc6b64427fd36896cb62',1,'AerialLiDARcloud::scalarFilter()'],['../class_li_d_a_rcloud.html#aa2ea59f063b3c951a1e58af9e4ddfd7e',1,'LiDARcloud::scalarFilter()']]], + ['scalars_63',['Scalars',['../context_globaldata.html#context_globaldata_scalar',1,'Creating Global Data (Scalars)'],['../context_primdata.html#context_primdata_scalar',1,'Creating Primitive Data (Scalars)']]], + ['scale_64',['scale',['../classhelios_1_1_compound_object.html#a4b2124d89efe900244fb51426ab1f4ce',1,'helios::CompoundObject::scale()'],['../structhelios_1_1_r_g_bcolor.html#a5b7b7b5734588bcf49444997b091f8b6',1,'helios::RGBcolor::scale()'],['../structhelios_1_1_r_g_b_acolor.html#a4d6937733ccdd97cee440a56bd556ff3',1,'helios::RGBAcolor::scale()']]], + ['scaleaboutcenter_65',['scaleAboutCenter',['../classhelios_1_1_compound_object.html#a63e491c5eed7b39ef26a67718da2a10f',1,'helios::CompoundObject']]], + ['scaleaboutpoint_66',['scaleAboutPoint',['../classhelios_1_1_compound_object.html#a6e3b6e95498c551dc124b2653603e10f',1,'helios::CompoundObject']]], + ['scalegirth_67',['scaleGirth',['../classhelios_1_1_cone.html#ad40b7cda9baac86be967058736b2bb78',1,'helios::Cone']]], + ['scaleinternodemaxlength_68',['scaleInternodeMaxLength',['../struct_phytomer.html#aecc6f52f3490562f4daf581bec7f4260',1,'Phytomer']]], + ['scalelength_69',['scaleLength',['../classhelios_1_1_cone.html#aaefa3caee5b8e46ca46650031d0bee0a',1,'helios::Cone']]], + ['scaleobject_70',['scaleObject',['../classhelios_1_1_context.html#afe9817e155de4a39bc82b000c5d0e888',1,'helios::Context::scaleObject(uint ObjID, const helios::vec3 &scalefact)'],['../classhelios_1_1_context.html#a781c1e297264aa37c92f4b72eb5277c9',1,'helios::Context::scaleObject(const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact)']]], + ['scaleobjectaboutcenter_71',['scaleObjectAboutCenter',['../classhelios_1_1_context.html#a72ccb742cc258704655c7fda792e58eb',1,'helios::Context::scaleObjectAboutCenter(uint ObjID, const helios::vec3 &scalefact)'],['../classhelios_1_1_context.html#a6f6e1b33ed92d3b852301a2ddef531d7',1,'helios::Context::scaleObjectAboutCenter(const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact)']]], + ['scaleobjectaboutpoint_72',['scaleObjectAboutPoint',['../classhelios_1_1_context.html#a0c84572898729e1a1d40415ad633066d',1,'helios::Context::scaleObjectAboutPoint(uint ObjID, const helios::vec3 &scalefact, const helios::vec3 &point)'],['../classhelios_1_1_context.html#ab5b5b78157ccf325cf3924630833c0e1',1,'helios::Context::scaleObjectAboutPoint(const std::vector< uint > &ObjIDs, const helios::vec3 &scalefact, const helios::vec3 &point)']]], + ['scaleprimitive_73',['scalePrimitive',['../classhelios_1_1_context.html#aaeafd65954d09be5773fbdaba35c694e',1,'helios::Context::scalePrimitive(uint UUID, const helios::vec3 &S)'],['../classhelios_1_1_context.html#a04cb06f3f2db846e6fbf725a0980259a',1,'helios::Context::scalePrimitive(const std::vector< uint > &UUIDs, const helios::vec3 &S)']]], + ['scaleprimitiveaboutpoint_74',['scalePrimitiveAboutPoint',['../classhelios_1_1_context.html#ad510492e34ffad178aa3a47e7932093e',1,'helios::Context::scalePrimitiveAboutPoint(uint UUID, const helios::vec3 &S, const helios::vec3 point)'],['../classhelios_1_1_context.html#aa5cc5ee1ba536b5b7565b780a272d6b4',1,'helios::Context::scalePrimitiveAboutPoint(const std::vector< uint > &UUIDs, const helios::vec3 &S, const helios::vec3 point)']]], + ['scaleprimitivedata_75',['scalePrimitiveData',['../classhelios_1_1_context.html#a0860253c22d51b274a8f63b806ff08c7',1,'helios::Context::scalePrimitiveData(const std::vector< uint > &UUIDs, const std::string &label, float scaling_factor)'],['../classhelios_1_1_context.html#ad307d199229f2fd1b36ad7efb4450696',1,'helios::Context::scalePrimitiveData(const std::string &label, float scaling_factor)']]], + ['scalespectrum_76',['scaleSpectrum',['../class_radiation_model.html#a32496f56edc4837c7cc2b28d154a108f',1,'RadiationModel::scaleSpectrum(const std::string &existing_global_data_label, const std::string &new_global_data_label, float scale_factor) const'],['../class_radiation_model.html#abfd1f6bc9d59a09ff3baab866c0b124c',1,'RadiationModel::scaleSpectrum(const std::string &global_data_label, float scale_factor) const']]], + ['scalespectrumrandomly_77',['scaleSpectrumRandomly',['../class_radiation_model.html#ac292f5d218647fc7cbb0a58bc3d284ae',1,'RadiationModel']]], + ['scaletubegirth_78',['scaleTubeGirth',['../classhelios_1_1_tube.html#a3fafe2daf9caaf3590e2c3fe2cecc914',1,'helios::Tube::scaleTubeGirth()'],['../classhelios_1_1_context.html#aa77f3e51de5230a69bdd70c26c7173e6',1,'helios::Context::scaleTubeGirth()']]], + ['scaletubelength_79',['scaleTubeLength',['../classhelios_1_1_tube.html#aceabd5281c442abf90725bb3728caf8b',1,'helios::Tube::scaleTubeLength()'],['../classhelios_1_1_context.html#a049755c6b0b7a3affa2c8dcdd0623935',1,'helios::Context::scaleTubeLength()']]], + ['scan_20data_20from_20file_80',['scan data from file',['../_aerial_li_d_a_r_doc.html#AerialScanIO',1,'Loading scan data from file'],['../_li_d_a_r_doc.html#ScanIO',1,'Loading scan data from file']]], + ['scan_20metadata_81',['Scan metadata',['../_li_d_a_r_doc.html#ScanMetadata',1,'']]], + ['scan_20pattern_82',['scan pattern',['../_aerial_li_d_a_r_doc.html#AerialLiDARcoord',1,'Coordinates and scan pattern'],['../_li_d_a_r_doc.html#LiDARcoord',1,'Coordinates and scan pattern']]], + ['scandensity_83',['scandensity',['../struct_aerial_scan_metadata.html#ab6e7d1152e1b122a4751c733f04a3803',1,'AerialScanMetadata']]], + ['scanmetadata_84',['ScanMetadata',['../struct_scan_metadata.html',1,'ScanMetadata'],['../struct_scan_metadata.html#a2f625c96f54068fb8de34b528e7f770d',1,'ScanMetadata::ScanMetadata()'],['../struct_scan_metadata.html#a6aa59ee9ecf89c9c6a2ae3a734c5ccd4',1,'ScanMetadata::ScanMetadata(const helios::vec3 &a_origin, uint a_Ntheta, float a_thetaMin, float a_thetaMax, uint a_Nphi, float a_phiMin, float a_phiMax, float a_exitDiameter, float a_beamDivergence, const std::vector< std::string > &a_columnFormat)']]], + ['scanxmlfortag_85',['scanXMLForTag',['../classhelios_1_1_context.html#adb6486c864423085b1ef7cb8bdc0278b',1,'helios::Context']]], + ['scattering_20iterations_86',['Scattering Iterations',['../_radiation_doc.html#RadScatter',1,'']]], + ['scatteringdepth_87',['scatteringDepth',['../struct_radiation_band.html#a1e6751a77faec064c49aba70539865de',1,'RadiationBand']]], + ['script_88',['New Project Script',['../_a_p_i.html#DirScript',1,'']]], + ['scrollcallback_89',['scrollCallback',['../_visualizer_8h.html#aa9b224479e8c1cc5251b8e7f3fdabacd',1,'scrollCallback(GLFWwindow *window, double xoffset, double yoffset): Visualizer.cpp'],['../_visualizer_8cpp.html#aa9b224479e8c1cc5251b8e7f3fdabacd',1,'scrollCallback(GLFWwindow *window, double xoffset, double yoffset): Visualizer.cpp']]], + ['second_90',['second',['../structhelios_1_1_time.html#a627acedd68e0228600727b867db537dd',1,'helios::Time']]], + ['seed_91',['seed',['../struct_per_ray_data.html#a757f60a4367093c4aa8bf21e6042c1dd',1,'PerRayData']]], + ['seeding_20the_20random_20number_20generator_92',['Seeding the Random Number Generator',['../_canopy_generator_doc.html#CGenSeed',1,'']]], + ['seedrandomgenerator_93',['seedRandomGenerator',['../classhelios_1_1_context.html#a337936c3123ff382da12cb37725170c1',1,'helios::Context::seedRandomGenerator()'],['../class_canopy_generator.html#ad23ca24fa4ccb033293c8d5118903d16',1,'CanopyGenerator::seedRandomGenerator()'],['../class_weber_penn_tree.html#a8a9df18ae61815739063b0baff142f9d',1,'WeberPennTree::seedRandomGenerator()']]], + ['self_20test_20tutorial_94',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], + ['selftest_95',['selfTest',['../classhelios_1_1_context.html#af55c655d7c570741080048ef28a0f750',1,'helios::Context::selfTest()'],['../class_aerial_li_d_a_rcloud.html#a330d36513eee2cc559c09fb71c18f566',1,'AerialLiDARcloud::selfTest()'],['../class_b_l_conductance_model.html#a6e85abcd1e8544d66af25394cace6ed4',1,'BLConductanceModel::selfTest()'],['../class_canopy_generator.html#af7f6d2ec2ee512af381cfaf5c414b505',1,'CanopyGenerator::selfTest()'],['../class_energy_balance_model.html#ad4a1681ae6edd9f82d23e6a8ef3fc26c',1,'EnergyBalanceModel::selfTest()'],['../class_leaf_optics.html#a5f5d878ba9b955e52c3dfff46e10416f',1,'LeafOptics::selfTest()'],['../class_li_d_a_rcloud.html#aaa2f35f02a65d4a7a731c4989dd9aa36',1,'LiDARcloud::selfTest()'],['../class_plant_architecture.html#a6b3134c58139507a4dcdce7c523ce039',1,'PlantArchitecture::selfTest()'],['../class_radiation_model.html#a4c9038e22b7457bc0eae2ef0ffed25ad',1,'RadiationModel::selfTest()'],['../class_solar_position.html#aced032bb94f6fcff47e66747f7547396',1,'SolarPosition::selfTest()'],['../class_stomatal_conductance_model.html#aa32dad6bf0ee3ecb37b02957ebea0e3d',1,'StomatalConductanceModel::selfTest()'],['../class_synthetic_annotation.html#a8ed7db69b40f2b0c49da32a87d5ef34e',1,'SyntheticAnnotation::selfTest()'],['../class_visualizer.html#a1dc0a74852187800f44d2eaba4154650',1,'Visualizer::selfTest()'],['../class_voxel_intersection.html#a320f16f7b1ee5c32b35c91331b426221',1,'VoxelIntersection::selfTest()'],['../class_weber_penn_tree.html#a9fc96eafd81b0aa3ca628e25abbda28b',1,'WeberPennTree::selfTest()']]], + ['selftest_2ecpp_96',['selfTest.cpp',['../core_2src_2self_test_8cpp.html',1,'(Global Namespace)'],['../plugins_2lidar_2src_2self_test_8cpp.html',1,'(Global Namespace)'],['../plugins_2plantarchitecture_2src_2self_test_8cpp.html',1,'(Global Namespace)'],['../plugins_2radiation_2src_2self_test_8cpp.html',1,'(Global Namespace)']]], + ['separate_5fstring_5fby_5fdelimiter_97',['separate_string_by_delimiter',['../group__functions.html#gae239abbec7c2ff618b3603bf69ccf2ed',1,'helios']]], + ['set_20up_98',['Install and Set-up',['../_dependent_software.html',1,'']]], + ['set_20up_99',['set up',['../radiation_basics.html#Tutorial10_rad',1,'2. Radiation model set-up'],['../radiation__beers_law.html#tutorial11_rad',1,'3. Radiation model set-up']]], + ['set_20up_20on_20linux_100',['Set-up on Linux',['../_dependent_software.html#SetupLinux',1,'']]], + ['set_20up_20on_20mac_101',['Set-up on Mac',['../_dependent_software.html#SetupMac',1,'']]], + ['set_20up_20on_20windows_20pc_102',['Set-up on Windows PC',['../_dependent_software.html#SetupPC',1,'']]], + ['setbackgroundcolor_103',['setBackgroundColor',['../class_visualizer.html#a6e54e59d971acaadbf4cef72a28585ce',1,'Visualizer']]], + ['setbmfcoefficientsfromlibrary_104',['setBMFCoefficientsFromLibrary',['../class_stomatal_conductance_model.html#a67b1af836d98f934a9e4ba1390523413',1,'StomatalConductanceModel::setBMFCoefficientsFromLibrary(const std::string &species)'],['../class_stomatal_conductance_model.html#abca589232617a8543feff66ca10d5d79',1,'StomatalConductanceModel::setBMFCoefficientsFromLibrary(const std::string &species, const std::vector< uint > &UUIDs)']]], + ['setboundarylayermodel_105',['setBoundaryLayerModel',['../class_b_l_conductance_model.html#a601d3eba5024cff7290fa564f619c9df',1,'BLConductanceModel::setBoundaryLayerModel(const char *gH_model)'],['../class_b_l_conductance_model.html#ab07e423e0cbc9a431368b9fddcfd93c7',1,'BLConductanceModel::setBoundaryLayerModel(uint UUID, const char *gH_model)'],['../class_b_l_conductance_model.html#a0a9e992d831834b188474e973cd41ee4',1,'BLConductanceModel::setBoundaryLayerModel(const std::vector< uint > &UUIDs, const char *gH_model)']]], + ['setbranchrecursionlevel_106',['setBranchRecursionLevel',['../class_weber_penn_tree.html#a7aee9ed5ca2f7696179029b0c3ec5522',1,'WeberPennTree']]], + ['setbranchsegmentresolution_107',['setBranchSegmentResolution',['../class_weber_penn_tree.html#a8b39281ab94cb9d77bcc4aa67a226796',1,'WeberPennTree']]], + ['setcamerafieldofview_108',['setCameraFieldOfView',['../class_visualizer.html#a4b92cdf1bb8f0c5411f9834839c3def4',1,'Visualizer']]], + ['setcameralookat_109',['setCameraLookat',['../class_radiation_model.html#a8560b5c278ae279e0a2bf78ec33409bf',1,'RadiationModel']]], + ['setcameraorientation_110',['setCameraOrientation',['../class_radiation_model.html#a2fb90fb962f16b13e4afc020ecb74b31',1,'RadiationModel::setCameraOrientation(const std::string &camera_label, const helios::vec3 &direction)'],['../class_radiation_model.html#aa8e73030b94c82fc52635affca88ebf9',1,'RadiationModel::setCameraOrientation(const std::string &camera_label, const helios::SphericalCoord &direction)']]], + ['setcameraposition_111',['setCameraPosition',['../class_radiation_model.html#a9ec01ae743b29b5a0e9da04b24a7b230',1,'RadiationModel::setCameraPosition()'],['../class_visualizer.html#ac6af1cee39fc442f47548e0dd69ebb1c',1,'Visualizer::setCameraPosition(const helios::vec3 &cameraPosition, const helios::vec3 &lookAt)'],['../class_visualizer.html#a7dd09cda5b3865b9ca5799560bf3e008',1,'Visualizer::setCameraPosition(const helios::SphericalCoord &cameraAngle, const helios::vec3 &lookAt)']]], + ['setcameraspectralresponse_112',['setCameraSpectralResponse',['../class_radiation_model.html#a1ea2acedb464217f1acc38f0e05d353f',1,'RadiationModel']]], + ['setcellcoverfraction_113',['setCellCoverFraction',['../class_aerial_li_d_a_rcloud.html#a41adc0bac55f6b4bf6dbf8aa00b87d47',1,'AerialLiDARcloud']]], + ['setcellgroundheight_114',['setCellGroundHeight',['../class_aerial_li_d_a_rcloud.html#a7e9921a6fa458f6f9ff71272d81ed711',1,'AerialLiDARcloud']]], + ['setcellgtheta_115',['setCellGtheta',['../class_li_d_a_rcloud.html#a4c8d55452f2423ddf8b77effbf443075',1,'LiDARcloud']]], + ['setcellleafarea_116',['setCellLeafArea',['../class_aerial_li_d_a_rcloud.html#a789143d75bd6e27e4eecd4af676d03a0',1,'AerialLiDARcloud::setCellLeafArea()'],['../class_li_d_a_rcloud.html#a32643f365dda44670b5b132c4eee8442',1,'LiDARcloud::setCellLeafArea()']]], + ['setcellmaximumhitheight_117',['setCellMaximumHitHeight',['../class_aerial_li_d_a_rcloud.html#a5de093096f98d0f7ac30bb17de6f8815',1,'AerialLiDARcloud']]], + ['setcellrbar_118',['setCellRbar',['../class_aerial_li_d_a_rcloud.html#a0e16c7d7d1c6e876d234e2409f24fafe',1,'AerialLiDARcloud']]], + ['setcelltransmissionprobability_119',['setCellTransmissionProbability',['../class_aerial_li_d_a_rcloud.html#a6fae4d874d859d1b09e10eacc23dee7e',1,'AerialLiDARcloud']]], + ['setcellvegetationheight_120',['setCellVegetationHeight',['../class_aerial_li_d_a_rcloud.html#afa007ec27f0e1b321c522e5ce780d812',1,'AerialLiDARcloud']]], + ['setcolor_121',['setColor',['../classhelios_1_1_compound_object.html#acc54a3160aa1bc81789d627a108e61bb',1,'helios::CompoundObject::setColor(const helios::RGBcolor &color)'],['../classhelios_1_1_compound_object.html#a2c652ccbd87bd8308706a2ed0989e32b',1,'helios::CompoundObject::setColor(const helios::RGBAcolor &color)']]], + ['setcolorbarfontcolor_122',['setColorbarFontColor',['../class_visualizer.html#a452fa37af4c7294b8b631ee83c6fe46c',1,'Visualizer']]], + ['setcolorbarfontsize_123',['setColorbarFontSize',['../class_visualizer.html#a40280c3f96152de174a4d9b26cc58c9d',1,'Visualizer']]], + ['setcolorbarposition_124',['setColorbarPosition',['../class_visualizer.html#ad0a19f3097299a4407919d6fd9c5fefe',1,'Visualizer']]], + ['setcolorbarrange_125',['setColorbarRange',['../class_visualizer.html#ac41ea2148985f9797ca84a3affa35da9',1,'Visualizer']]], + ['setcolorbarsize_126',['setColorbarSize',['../class_visualizer.html#a7efb1e8bc6de19f885781b564573066f',1,'Visualizer']]], + ['setcolorbarticks_127',['setColorbarTicks',['../class_visualizer.html#aabe4913f9a3444a5fea906382eeb6037',1,'Visualizer']]], + ['setcolorbartitle_128',['setColorbarTitle',['../class_visualizer.html#ae30cb19cb7d003ebbc0851c51c45d8a8',1,'Visualizer']]], + ['setcolormap_129',['setColormap',['../class_visualizer.html#a992f636c4c406bbfc3f29add1fa3a278',1,'Visualizer::setColormap(Ctable colormap_name)'],['../class_visualizer.html#a9ec2fbf7ed0518b053dc831574dd9446',1,'Visualizer::setColormap(const std::vector< helios::RGBcolor > &colors, const std::vector< float > &divisions)']]], + ['setcurrenttimeseriespoint_130',['setCurrentTimeseriesPoint',['../group__timeseries.html#ga3ca2e5c0a2c1983d552fd7ee57d04997',1,'helios::Context']]], + ['setdate_131',['setDate',['../classhelios_1_1_context.html#a5b9565e477a321ec7b7b9b62d43b2139',1,'helios::Context::setDate(int day, int month, int year)'],['../classhelios_1_1_context.html#a76a34480ca16cfde5e940d07235fcbbb',1,'helios::Context::setDate(const Date &date)'],['../classhelios_1_1_context.html#a810169fc94d22368ff83c357e13b0a61',1,'helios::Context::setDate(int Julian_day, int year)']]], + ['setdepthbiasmatrix_132',['setDepthBiasMatrix',['../struct_shader.html#a0efa9af9639f9dc4b2c119a8b3a3981b',1,'Shader']]], + ['setdiffuseradiationextinctioncoeff_133',['setDiffuseRadiationExtinctionCoeff',['../class_radiation_model.html#ac85aa79af6c1b3b50081216c6c257225',1,'RadiationModel::setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::vec3 &peak_dir)'],['../class_radiation_model.html#a11255a6b9afa49a30b164d0eb9640767',1,'RadiationModel::setDiffuseRadiationExtinctionCoeff(const std::string &label, float K, const helios::SphericalCoord &peak_dir)']]], + ['setdiffuseradiationflux_134',['setDiffuseRadiationFlux',['../class_radiation_model.html#aa976502e7f722222399fbfe4f25dbe05',1,'RadiationModel']]], + ['setdiffuseraycount_135',['setDiffuseRayCount',['../class_radiation_model.html#ab279259e3c925d3213d8bf097156fd02',1,'RadiationModel']]], + ['setdiffusespectrum_136',['setDiffuseSpectrum',['../class_radiation_model.html#af698122e4c9cb2855cca5e54037c985d',1,'RadiationModel::setDiffuseSpectrum(const std::string &spectrum_label)'],['../class_radiation_model.html#a1b1ae98cd2ba54fb8d1da8d434014e3d',1,'RadiationModel::setDiffuseSpectrum(const std::string &band_label, const std::string &spectrum_label)']]], + ['setdiffusespectrumintegral_137',['setDiffuseSpectrumIntegral',['../class_radiation_model.html#a6b733f931af8bed3bf13452d971d5c29',1,'RadiationModel::setDiffuseSpectrumIntegral(float spectrum_integral)'],['../class_radiation_model.html#afa3b8ade09099752b11e5249b975a6c6',1,'RadiationModel::setDiffuseSpectrumIntegral(float spectrum_integral, float wavelength1, float wavelength2)'],['../class_radiation_model.html#a5469495a0aee0e2d9f29100fa5d8683e',1,'RadiationModel::setDiffuseSpectrumIntegral(const std::string &band_label, float spectrum_integral)'],['../class_radiation_model.html#a278b621362ef2fdb528f0669a6cd0224',1,'RadiationModel::setDiffuseSpectrumIntegral(const std::string &band_label, float spectrum_integral, float wavelength1, float wavelength2)']]], + ['setdirectraycount_138',['setDirectRayCount',['../class_radiation_model.html#a48c6ea6e90806e3c4942348996c29391',1,'RadiationModel']]], + ['setdynamictimeconstants_139',['setDynamicTimeConstants',['../class_stomatal_conductance_model.html#a045fd837e2328617901dfd4e15f1da29',1,'StomatalConductanceModel::setDynamicTimeConstants(float tau_open, float tau_close)'],['../class_stomatal_conductance_model.html#a317e6d8d262ddffb5e66839ee987a067',1,'StomatalConductanceModel::setDynamicTimeConstants(float tau_open, float tau_close, const std::vector< uint > &UUIDs)']]], + ['setfarquharcoefficientsfromlibrary_140',['setFarquharCoefficientsFromLibrary',['../class_photosynthesis_model.html#a3e47f7c5fe8100cf93ba9454b911bba4',1,'PhotosynthesisModel::setFarquharCoefficientsFromLibrary(const std::string &species)'],['../class_photosynthesis_model.html#afc73dbd1a744c6f4aae456349e040b27',1,'PhotosynthesisModel::setFarquharCoefficientsFromLibrary(const std::string &species, const std::vector< uint > &UUIDs)']]], + ['setglobaldata_141',['setGlobalData',['../classhelios_1_1_context.html#aa92b28a9c26bbff7e5621e1c9dd48086',1,'helios::Context::setGlobalData(const char *label, const int &data)'],['../classhelios_1_1_context.html#a4218481857cdd07cae78f2b7808534b0',1,'helios::Context::setGlobalData(const char *label, const uint &data)'],['../classhelios_1_1_context.html#a0cb1f9f692d9e2f225f148eedc180c3f',1,'helios::Context::setGlobalData(const char *label, const float &data)'],['../classhelios_1_1_context.html#a86ae444d6a565d3a53b40ab86d90e31f',1,'helios::Context::setGlobalData(const char *label, const double &data)'],['../classhelios_1_1_context.html#a843249de363a1fff0ce37175c4731ac0',1,'helios::Context::setGlobalData(const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#aede18efe430ee34910042933d8ed3810',1,'helios::Context::setGlobalData(const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a6dcd5f1df0ee040046f68cd1be8f05a1',1,'helios::Context::setGlobalData(const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#ae13ebc953481eb686436ad5c0ec0feef',1,'helios::Context::setGlobalData(const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a6244085c9792f55eecd47fcb1139d716',1,'helios::Context::setGlobalData(const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#ad7503da3c31420ba92d4a4e2bec76ff9',1,'helios::Context::setGlobalData(const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a526467937f59154a0c9a2915c5153d1e',1,'helios::Context::setGlobalData(const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a05f1b6122de12b60a94ad9d8ad673ee7',1,'helios::Context::setGlobalData(const char *label, HeliosDataType type, size_t size, void *data)']]], + ['sethitdata_142',['setHitData',['../class_aerial_li_d_a_rcloud.html#aba54610f999856adb4ae4ab4b244a553',1,'AerialLiDARcloud::setHitData()'],['../class_li_d_a_rcloud.html#a4ad8b12380a24f48ecfbae0ad6b5cfaa',1,'LiDARcloud::setHitData()']]], + ['sethitgridcell_143',['setHitGridCell',['../class_aerial_li_d_a_rcloud.html#afa9735ddfc392110712a20029cbfd2ed',1,'AerialLiDARcloud::setHitGridCell()'],['../class_li_d_a_rcloud.html#a122b1716c42af6a07d48ad23b5acb427',1,'LiDARcloud::setHitGridCell()']]], + ['setinternodemaxlength_144',['setInternodeMaxLength',['../struct_phytomer.html#a25a09ac7a2eb07d34fed5c6d9fad213e',1,'Phytomer']]], + ['setinternodemaxradius_145',['setInternodeMaxRadius',['../struct_phytomer.html#a70aa0f62afdf829d9f2af6167d30f8ca',1,'Phytomer']]], + ['setleafprototypescale_146',['setLeafPrototypeScale',['../struct_phytomer.html#ae6bbbd7dcf85fb3b11062e2b0cb415e3',1,'Phytomer']]], + ['setleafscalefraction_147',['setLeafScaleFraction',['../struct_phytomer.html#ab089057c5102fd40a09a92d5a424bfdb',1,'Phytomer']]], + ['setleafsubdivisions_148',['setLeafSubdivisions',['../class_weber_penn_tree.html#a085a56d129e306469147762509fa7378',1,'WeberPennTree']]], + ['setlightdirection_149',['setLightDirection',['../struct_shader.html#a197c0e45d7c831ffb337b892b3e29594',1,'Shader::setLightDirection()'],['../class_visualizer.html#a492533fe226fa92d08b010dc9a3f6e93',1,'Visualizer::setLightDirection()']]], + ['setlightingmodel_150',['setLightingModel',['../struct_shader.html#a08f9e96dbdea98bf178f902549c8096b',1,'Shader::setLightingModel()'],['../class_visualizer.html#afc496b8bd99bbb786d553c4b3e8dfded',1,'Visualizer::setLightingModel()']]], + ['setlightintensity_151',['setLightIntensity',['../struct_shader.html#adb7e2c4c14638b056e39b6b9827bef97',1,'Shader']]], + ['setlightintensityfactor_152',['setLightIntensityFactor',['../class_visualizer.html#ae2227bdf3b92fb67bcad6acf7e9279b0',1,'Visualizer']]], + ['setlocation_153',['setLocation',['../classhelios_1_1_context.html#adb901722158039153a7556ef06827e21',1,'helios::Context']]], + ['setminscatterenergy_154',['setMinScatterEnergy',['../class_radiation_model.html#a68adae041b6d017cc640ff90a2648f02',1,'RadiationModel']]], + ['setmodelcoefficients_155',['setModelCoefficients',['../class_photosynthesis_model.html#a80a8bb51f617da1a7e2d03a67890bf1d',1,'PhotosynthesisModel::setModelCoefficients(const EmpiricalModelCoefficients &modelcoefficients)'],['../class_photosynthesis_model.html#a5a17e8185dd7ad90b4d155bb4f610d85',1,'PhotosynthesisModel::setModelCoefficients(const EmpiricalModelCoefficients &modelcoefficients, const std::vector< uint > &UUIDs)'],['../class_photosynthesis_model.html#a394870e63a056a12b7031bfadbf9ae6b',1,'PhotosynthesisModel::setModelCoefficients(const FarquharModelCoefficients &modelcoefficients)'],['../class_photosynthesis_model.html#a37ee0175960589edf257726c2a3e0356',1,'PhotosynthesisModel::setModelCoefficients(const FarquharModelCoefficients &modelcoefficients, const std::vector< uint > &UUIDs)'],['../class_photosynthesis_model.html#ab9ae18a68ca6b3f5639385a7c29076bf',1,'PhotosynthesisModel::setModelCoefficients(const std::vector< FarquharModelCoefficients > &modelcoefficients, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#afbbb0af7d8b3c7966058dbb1289dca13',1,'StomatalConductanceModel::setModelCoefficients(const BWBcoefficients &coeffs)'],['../class_stomatal_conductance_model.html#ae0ce3cb199ab635b5563ec2added7ae8',1,'StomatalConductanceModel::setModelCoefficients(const BWBcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a37d7b81a2082a09d351bea4590d3eadb',1,'StomatalConductanceModel::setModelCoefficients(const BBLcoefficients &coeffs)'],['../class_stomatal_conductance_model.html#a48b91aeb301f53d13656d0a6f1d16fe7',1,'StomatalConductanceModel::setModelCoefficients(const BBLcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a24ba00d45416d57afe43628712a32fc3',1,'StomatalConductanceModel::setModelCoefficients(const MOPTcoefficients &coeffs)'],['../class_stomatal_conductance_model.html#a17211c4b6d87e120f182de8cc3cc7aa7',1,'StomatalConductanceModel::setModelCoefficients(const MOPTcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a97e78eaec6ca94159c55499a40bc7807',1,'StomatalConductanceModel::setModelCoefficients(const BMFcoefficients &coeffs)'],['../class_stomatal_conductance_model.html#a1b6ffb0b1beef707d77b273b9cc7f9c9',1,'StomatalConductanceModel::setModelCoefficients(const BMFcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a07294b1dfa951bcdf2fb1608959607c4',1,'StomatalConductanceModel::setModelCoefficients(const BBcoefficients &coeffs)'],['../class_stomatal_conductance_model.html#a29e691b7d3fa4348b8a5ef859483ed91',1,'StomatalConductanceModel::setModelCoefficients(const BBcoefficients &coeffs, const std::vector< uint > &UUIDs)'],['../class_stomatal_conductance_model.html#a5939354a840f4a2199ad6610b22e4d89',1,'StomatalConductanceModel::setModelCoefficients(const std::vector< BMFcoefficients > &coeffs, const std::vector< uint > &UUIDs)']]], + ['setmodeltype_5fempirical_156',['setModelType_Empirical',['../class_photosynthesis_model.html#ae4f1ad6808c1b8ccc28912a4a7dd9363',1,'PhotosynthesisModel']]], + ['setmodeltype_5ffarquhar_157',['setModelType_Farquhar',['../class_photosynthesis_model.html#a63e25c843c66fcca47e816a3978e989d',1,'PhotosynthesisModel']]], + ['setobjectcolor_158',['setObjectColor',['../classhelios_1_1_context.html#a62bdd296ce410e272e6f82a41c27935d',1,'helios::Context::setObjectColor(uint ObjID, const helios::RGBcolor &color)'],['../classhelios_1_1_context.html#a41e1e95cb347f0ad25008f4fd128b0ff',1,'helios::Context::setObjectColor(const std::vector< uint > &ObjIDs, const helios::RGBcolor &color)'],['../classhelios_1_1_context.html#a0c9146e4df91eeed82989fd89a436dcf',1,'helios::Context::setObjectColor(uint ObjID, const helios::RGBAcolor &color)'],['../classhelios_1_1_context.html#a53a30c9a819df9153025ef3b7e89c536',1,'helios::Context::setObjectColor(const std::vector< uint > &ObjIDs, const helios::RGBAcolor &color)']]], + ['setobjectdata_159',['setObjectData',['../classhelios_1_1_compound_object.html#acf473c0595a525618fc6a5e39fca40e6',1,'helios::CompoundObject::setObjectData(const char *label, const int &data)'],['../classhelios_1_1_compound_object.html#a5730d9c317726f1a0ed3a396575a0957',1,'helios::CompoundObject::setObjectData(const char *label, const uint &data)'],['../classhelios_1_1_compound_object.html#ac657af83b036f3c886d2f64d0697378f',1,'helios::CompoundObject::setObjectData(const char *label, const float &data)'],['../classhelios_1_1_compound_object.html#a316d892dd85e920bfb964d3017dc25c4',1,'helios::CompoundObject::setObjectData(const char *label, const double &data)'],['../classhelios_1_1_compound_object.html#a6442aef7859238fc3a49cb9187548c7c',1,'helios::CompoundObject::setObjectData(const char *label, const helios::vec2 &data)'],['../classhelios_1_1_compound_object.html#af93de91ec2dc1cdeca58c09d6f1febb1',1,'helios::CompoundObject::setObjectData(const char *label, const helios::vec3 &data)'],['../classhelios_1_1_compound_object.html#ac7815b7cda94f76a87e564f9d9b05a3c',1,'helios::CompoundObject::setObjectData(const char *label, const helios::vec4 &data)'],['../classhelios_1_1_compound_object.html#ae19d6e464af601cea45a1c631c8f44b2',1,'helios::CompoundObject::setObjectData(const char *label, const helios::int2 &data)'],['../classhelios_1_1_compound_object.html#a48d6781ec37e21f405cf368f854ef19a',1,'helios::CompoundObject::setObjectData(const char *label, const helios::int3 &data)'],['../classhelios_1_1_compound_object.html#a3b03b96096e7618e7a3865225413b7b9',1,'helios::CompoundObject::setObjectData(const char *label, const helios::int4 &data)'],['../classhelios_1_1_compound_object.html#a3369928e9718d521cf135051a3f60e81',1,'helios::CompoundObject::setObjectData(const char *label, const std::string &data)'],['../classhelios_1_1_compound_object.html#a93395e379a6266f31364ea1cd7f65cea',1,'helios::CompoundObject::setObjectData(const char *label, HeliosDataType type, uint size, void *data)'],['../classhelios_1_1_context.html#a6ad7971a0c42fcf3b185d92354cb95b2',1,'helios::Context::setObjectData(uint objID, const char *label, const int &data)'],['../classhelios_1_1_context.html#a13c69bf3d81189d4a0c93409ba0d9207',1,'helios::Context::setObjectData(uint objID, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a43a3a8d47b237941ff8cb5a8e37bec0c',1,'helios::Context::setObjectData(uint objID, const char *label, const float &data)'],['../classhelios_1_1_context.html#a65866490e5eca5169c8865038bbad7a0',1,'helios::Context::setObjectData(uint objID, const char *label, const double &data)'],['../classhelios_1_1_context.html#a476c80474522dfa1b1e24e7ea2aaba41',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a2513df3e1520fde62df047d62d7e6645',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a9fe071caed6756577d147c130e10f6aa',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#a862846ca49277adcee6350e598999743',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#ac20d7c0ffe64e39835be77b4d0932a1b',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#a0345eb747604912fe02af987e0b5950a',1,'helios::Context::setObjectData(uint objID, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#ace339d1e727d6aa4308e9153ea0df480',1,'helios::Context::setObjectData(uint objID, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#ab25c2b85edded276a5e100702c63c07e',1,'helios::Context::setObjectData(uint objIDs, const char *label, HeliosDataType type, uint size, void *data)'],['../classhelios_1_1_context.html#af1cfa4877dd8e1ecc1dca0e819378ff6',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#af2f608a87e8b8552e9cb3632a24c3ab9',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a8423c26081c83aeaf24e9d3002449450',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#ab023969f177745818be2bb909fbf97c0',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#a55584d6bd6e20c67375cf91c6d56ec91',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#ac97287d999956f8e689ea6df0d035516',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a05b21f0772970223c636f32ab2cd51ec',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#aacd2386732ad774427ea7e034bf5642b',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a6d12369392b2092af37bd64b904021f6',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#aaf0447235525b6f26c706b06f159446e',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a2e2a4371cd1af5af7ee256db1c5f3f94',1,'helios::Context::setObjectData(const std::vector< uint > &objIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a86111a5ee990e7d4fd0cf45ba676d776',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#ac35897c934684bf6bc274b06d67dc10c',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a11bc2418b81e2e771fdbb0cacde189ae',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#a80d2bd91fc42731a50b091b96c610660',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#a01a97d15d63268ac511ca8859b4c68f8',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a33eb32f1916ccb4aa920d8e6adc3ae81',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a667a87b0fdd41ce1d01fe01e97b12d8d',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#ab30e197faaa31bc942ca6519d9212e64',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a410b495a7408fda18da26a815b76889d',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#a503793f406ad42ab94e23cf890f6dd0b',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a4a90397534b17c91d2a5897c0fa4e110',1,'helios::Context::setObjectData(const std::vector< std::vector< uint > > &objIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#aee97bd83087427bd59fcb287f5dc3531',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#a61b179ccebf291849bc79ac76de78940',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#add1f2dff968114e12cc8f2a8f7b364d9',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#aa4d8933f40fc51cab3abe9cfcdb34e7d',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#af321368266e6b84665817b875deb530b',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#aac050e413c74fc286f57a077ace9ad8a',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#af85ecaf6d6d040258e66758e30739324',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#aeec21f6416d64e7a5b7dddbe3a07372a',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a80cc9fac3b3411d1470e8b7a37a9f867',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#add40dc92c4e4d0fb1f7a2fc10da5214e',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a638267ca0da2ad2070da281eaf34f04a',1,'helios::Context::setObjectData(const std::vector< std::vector< std::vector< uint > > > &objIDs, const char *label, const std::string &data)']]], + ['setobjecttransformationmatrix_160',['setObjectTransformationMatrix',['../classhelios_1_1_context.html#ae9627595f57c55b4c540d239fa7889e1',1,'helios::Context::setObjectTransformationMatrix(uint ObjID, float(&T)[16])'],['../classhelios_1_1_context.html#a31d7cc0676201cf2513e7c4c87ed7481',1,'helios::Context::setObjectTransformationMatrix(const std::vector< uint > &ObjIDs, float(&T)[16])']]], + ['setpadvalue_161',['setPadValue',['../class_radiation_model.html#a73fac0b01c685471de95cd7bdfb5ef7b',1,'RadiationModel']]], + ['setplantphenologicalthresholds_162',['setPlantPhenologicalThresholds',['../class_plant_architecture.html#a041d11df76990a5b0beb694955788301',1,'PlantArchitecture']]], + ['setprimitivecolor_163',['setPrimitiveColor',['../classhelios_1_1_context.html#a029f95ee0056f027866f8bad2fe9e48e',1,'helios::Context::setPrimitiveColor(uint UUID, const helios::RGBcolor &color)'],['../classhelios_1_1_context.html#af445c8f33a279ce7374d1b2691ef1f1c',1,'helios::Context::setPrimitiveColor(const std::vector< uint > &UUIDs, const helios::RGBcolor &color)'],['../classhelios_1_1_context.html#a22dce781917215d2e80784ae5eb78d60',1,'helios::Context::setPrimitiveColor(uint UUID, const helios::RGBAcolor &color)'],['../classhelios_1_1_context.html#aa4e3d7f71aaa0823edd9341b3c2d786c',1,'helios::Context::setPrimitiveColor(const std::vector< uint > &UUIDs, const helios::RGBAcolor &color)']]], + ['setprimitivedata_164',['setPrimitiveData',['../classhelios_1_1_context.html#ac7677094a3bbcb62506ce461d982af1d',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const int &data)'],['../classhelios_1_1_context.html#a62ee96ec6df77c6451a6c67efd4d67da',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a5271a627fdfd0731cfde8016fbc42652',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const float &data)'],['../classhelios_1_1_context.html#a16457aac3e2c40890c2d05bbf4d36e3d',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const double &data)'],['../classhelios_1_1_context.html#a480acac6101b32110856aabe4c674ad1',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a9512442e3771220e49946af21db01b9b',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#aaae3a5abba76fd76b37f3488522a9ef2',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#ad87da629799dd7cd5469676675145f37',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a9d7bc32ca67260588402ca9999326ecb',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#a135888cd244b54848cc6117613e0bf5d',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a8002c535b841c78d0ec9430362186c9e',1,'helios::Context::setPrimitiveData(const uint &UUID, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a866183b15bb63a464a7de9de0faef0f4',1,'helios::Context::setPrimitiveData(const uint &UUIDs, const char *label, HeliosDataType type, uint size, void *data)'],['../classhelios_1_1_context.html#acff5da084e7c9d2c90c73edca24c07d3',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#aa3a6f6eae58a58be9d212b0c3956eaf9',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#a075ecb2de0d5239188a643b1bd937396',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#accd3e2ac5a3d87d6232fc22b83bcda12',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#a5cc520e5d9325eca45103430dc5c93be',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a8ad05382759041555c89c26069f30e48',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a7a8797c39a45b7e265edd7741b2510e5',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#a28ab165fde1de4555e832ec7dd6bfcbb',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#af54a5f531284ea6b04be4cfb99db7d06',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#a0293ea9fb3750432f27f716d46d61f7b',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#aaf69d2f0621b95dfadcccae2594c5645',1,'helios::Context::setPrimitiveData(const std::vector< uint > &UUIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a0946dae4ec20fe3ea42ad8e5bec56767',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#a643cfcaed693097e98c340c6c9e8d5d2',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#ae93791b3c29ac4879451bcbe16d76956',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#aace047cba0c9e4c1eff9576d972c1911',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#a2704360051e07066eff51e8056b4aa46',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a6af8952525fc82f010e800fa36a67719',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#a7eac4377c1c06b4967f0817386ff0b4f',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#a0ae4cb43e3ef7a1e2de9471480549252',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#a86baeff8b954def960e6c99ebbb10c86',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#acd544b707254a434620527f7df1014a5',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a6ff3779ada111fc103a7ecefa6a8a736',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< uint > > &UUIDs, const char *label, const std::string &data)'],['../classhelios_1_1_context.html#a9c4326dc8d8c8b7e195b9a1ba76ac59f',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const int &data)'],['../classhelios_1_1_context.html#af083c0cb69b3d9550848a9995b8feb18',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const uint &data)'],['../classhelios_1_1_context.html#aae92b01f3ddb4cc429201690915d40d1',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const float &data)'],['../classhelios_1_1_context.html#a67cd49500d77ca6308b9d78a19bf88e1',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const double &data)'],['../classhelios_1_1_context.html#a1804c156ced6f5170c2598a08bcef591',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec2 &data)'],['../classhelios_1_1_context.html#a952aab995b6549ebd30204c84666f315',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec3 &data)'],['../classhelios_1_1_context.html#aa8b86ea5363d7a88b7954385320f72d3',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::vec4 &data)'],['../classhelios_1_1_context.html#a1f4e4e874b0aa4419616044086267d65',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int2 &data)'],['../classhelios_1_1_context.html#aaeb1ac9f83289382d93f7f928678e43d',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int3 &data)'],['../classhelios_1_1_context.html#a2eb91839363153ca1f35feabf41043eb',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const helios::int4 &data)'],['../classhelios_1_1_context.html#a9e9465353484026f03c8b1bf531a5258',1,'helios::Context::setPrimitiveData(const std::vector< std::vector< std::vector< uint > > > &UUIDs, const char *label, const std::string &data)']]], + ['setprimitiveparentobjectid_165',['setPrimitiveParentObjectID',['../classhelios_1_1_context.html#a5d7974e92bd4ac128ffae0c36cfad85d',1,'helios::Context::setPrimitiveParentObjectID(uint UUID, uint objID)'],['../classhelios_1_1_context.html#ac97ab81d1324437cadae575a76f5ef80',1,'helios::Context::setPrimitiveParentObjectID(const std::vector< uint > &UUIDs, uint objID)']]], + ['setprimitivetexturefile_166',['setPrimitiveTextureFile',['../classhelios_1_1_context.html#a89466d607b5499cbee7614c425270570',1,'helios::Context']]], + ['setprimitivetransformationmatrix_167',['setPrimitiveTransformationMatrix',['../classhelios_1_1_context.html#af7d8333251195bcc4788792d9aa6f37c',1,'helios::Context::setPrimitiveTransformationMatrix(uint UUID, float(&T)[16])'],['../classhelios_1_1_context.html#a9447c0c5ad7f1f19d606f227d164f679',1,'helios::Context::setPrimitiveTransformationMatrix(const std::vector< uint > &UUIDs, float(&T)[16])']]], + ['setprimitiveuuids_168',['setPrimitiveUUIDs',['../classhelios_1_1_compound_object.html#a0b00455ff0bab50e012bd6e7b5a54a51',1,'helios::CompoundObject']]], + ['setproperties_169',['setProperties',['../class_leaf_optics.html#ac7a1cfe512d9417c26ad798a94cbdba1',1,'LeafOptics']]], + ['setscatteringdepth_170',['setScatteringDepth',['../class_radiation_model.html#a6d2c7374b0de7f50b1857b95c606182f',1,'RadiationModel']]], + ['setsourceflux_171',['setSourceFlux',['../class_radiation_model.html#a2fa24d994612857ddc889e705b0444b1',1,'RadiationModel::setSourceFlux(uint source_ID, const std::string &band_label, float flux)'],['../class_radiation_model.html#a85a5126035acb66aeea93886255dca47',1,'RadiationModel::setSourceFlux(const std::vector< uint > &source_ID, const std::string &band_label, float flux)']]], + ['setsourceposition_172',['setSourcePosition',['../class_radiation_model.html#aa25715f947c98e00efebb1cc96af7071',1,'RadiationModel::setSourcePosition(uint source_ID, const helios::vec3 &position)'],['../class_radiation_model.html#a9ccfc277d9f9f38c29b7cb4cbb8e98f1',1,'RadiationModel::setSourcePosition(uint source_ID, const helios::SphericalCoord &position)']]], + ['setsourcespectrum_173',['setSourceSpectrum',['../class_radiation_model.html#a790ce56ed07f2f40b80be9676fa02c05',1,'RadiationModel::setSourceSpectrum(uint source_ID, const std::vector< helios::vec2 > &spectrum)'],['../class_radiation_model.html#a88b8a77a11c6aa1caf6ef931c39710c2',1,'RadiationModel::setSourceSpectrum(const std::vector< uint > &source_ID, const std::vector< helios::vec2 > &spectrum)'],['../class_radiation_model.html#ab99467c6cee84a59d6b4df6b34f0fba7',1,'RadiationModel::setSourceSpectrum(uint source_ID, const std::string &spectrum_label)'],['../class_radiation_model.html#a04c39684e5ac12c403f6dc68cec06877',1,'RadiationModel::setSourceSpectrum(const std::vector< uint > &source_ID, const std::string &spectrum_label)']]], + ['setsourcespectrumintegral_174',['setSourceSpectrumIntegral',['../class_radiation_model.html#a0d07935957cc6651d38a621513581189',1,'RadiationModel::setSourceSpectrumIntegral(uint source_ID, float source_integral)'],['../class_radiation_model.html#af39f938b1c2bde9af59d0d96311c8d9a',1,'RadiationModel::setSourceSpectrumIntegral(uint source_ID, float source_integral, float wavelength1, float wavelength2)']]], + ['setsubdivisioncount_175',['setSubdivisionCount',['../classhelios_1_1_tile.html#a8d9bd065c9607ccb2ac0b20e945fb51f',1,'helios::Tile::setSubdivisionCount()'],['../classhelios_1_1_sphere.html#a7e215edcae37bcd70051deea1bfb59eb',1,'helios::Sphere::setSubdivisionCount()'],['../classhelios_1_1_box.html#a4659cc09d90d34f4d993c107612ac6aa',1,'helios::Box::setSubdivisionCount()'],['../classhelios_1_1_disk.html#af3481e8589adbf120be158a591b0acda',1,'helios::Disk::setSubdivisionCount()'],['../classhelios_1_1_cone.html#a44fce4adcb863c4049640d4e8757563f',1,'helios::Cone::setSubdivisionCount()']]], + ['setsundirection_176',['setSunDirection',['../class_solar_position.html#af52dad396956d1699fb08ceed6f9a29e',1,'SolarPosition']]], + ['settexturemap_177',['setTextureMap',['../struct_shader.html#ab2e9dda74f59acd1bfa0bbfb6d405526',1,'Shader']]], + ['settexturemask_178',['setTextureMask',['../struct_shader.html#a7800ac33a9f3fdaefad983d6fe851fa7',1,'Shader::setTextureMask(const Glyph *glyph, uint &textureID)'],['../struct_shader.html#acabe2ce63e1a7fc5773803e3174de7ac',1,'Shader::setTextureMask(const char *texture_file, uint &textureID, helios::int2 &texture_size)']]], + ['settileobjectsubdivisioncount_179',['setTileObjectSubdivisionCount',['../classhelios_1_1_context.html#a01957c516d832789a0fe613accc71f72',1,'helios::Context::setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, const int2 &new_subdiv)'],['../classhelios_1_1_context.html#a14626fb1701c57a683418b9b9d442913',1,'helios::Context::setTileObjectSubdivisionCount(const std::vector< uint > &ObjectIDs, float area_ratio)']]], + ['settime_180',['setTime',['../classhelios_1_1_context.html#ae3d9e19581787775556b8dd7dc1ac845',1,'helios::Context::setTime(int minute, int hour)'],['../classhelios_1_1_context.html#a940a77e10a3210bcf3b292e029cc3fda',1,'helios::Context::setTime(int second, int minute, int hour)'],['../classhelios_1_1_context.html#ad40aa40adbee471a588a1e32eb721db4',1,'helios::Context::setTime(const Time &time)']]], + ['setting_20fvcb_20model_20parameters_181',['Setting FvCB Model Parameters',['../_photosynthesis_doc.html#FvCBSettingPhotoParams',1,'']]], + ['setting_20primitive_20data_20values_182',['Setting Primitive Data Values',['../_a_p_i.html#SetPrimData',1,'']]], + ['setting_20the_20boundary_20layer_20conductance_20model_20to_20be_20used_183',['Setting the Boundary-layer Conductance Model To Be Used',['../_b_l_conductance_doc.html#BLCSet',1,'']]], + ['setting_20the_20model_20coefficients_184',['Setting the Model Coefficients',['../_stomatal_doc.html#StomatalCoeffs',1,'']]], + ['setting_20the_20radiation_20source_20spectral_20distribution_20and_20normalization_185',['Setting the Radiation Source Spectral Distribution and Normalization',['../_radiation_doc.html#SourceDist',1,'']]], + ['setting_20up_20basic_20build_20functionality_186',['Setting up basic build functionality',['../_dependent_software.html#SetupPCCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupLinuxCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupMacCLion',1,'Setting up basic build functionality']]], + ['setting_20up_20cmake_20and_20compilers_20toolchains_187',['Setting up CMake and compilers (Toolchains)',['../_c_lion_i_d_e.html#CLionToolchains',1,'']]], + ['setting_20up_20nvidia_20cuda_188',['Setting up NVIDIA CUDA',['../_dependent_software.html#SetupPCCUDA',1,'Setting up NVIDIA CUDA'],['../_dependent_software.html#SetupLinuxCUDA',1,'Setting up NVIDIA CUDA']]], + ['settransformationmatrix_189',['setTransformationMatrix',['../classhelios_1_1_compound_object.html#a55a1ebd9699cb1c9ae0ca39b3db8f9b4',1,'helios::CompoundObject::setTransformationMatrix()'],['../struct_shader.html#af0ef553d486d1c50da7e2a96ec048ba9',1,'Shader::setTransformationMatrix()']]], + ['settreeparameters_190',['setTreeParameters',['../class_weber_penn_tree.html#a43a71d285a4dba83a6afc3870847e8eb',1,'WeberPennTree']]], + ['settrianglevertices_191',['setTriangleVertices',['../classhelios_1_1_context.html#a639c36e288b6a154ee6a827a9e497351',1,'helios::Context']]], + ['settrunksegmentresolution_192',['setTrunkSegmentResolution',['../class_weber_penn_tree.html#ab7ee7dfc8e8d599ea6875203af7ec002',1,'WeberPennTree']]], + ['settubenodes_193',['setTubeNodes',['../classhelios_1_1_tube.html#ae11824e0497c6a97e912e341da388a7d',1,'helios::Tube::setTubeNodes()'],['../classhelios_1_1_context.html#af3076c6a493bb0b888882adee34d039e',1,'helios::Context::setTubeNodes()']]], + ['settuberadii_194',['setTubeRadii',['../classhelios_1_1_tube.html#a50362d071c320d6ec8d5aa9b26c5570f',1,'helios::Tube::setTubeRadii()'],['../classhelios_1_1_context.html#afbbb8692fb22c4c7475738556af0ec6a',1,'helios::Context::setTubeRadii()']]], + ['setup_195',['Data processing setup',['../_aerial_li_d_a_r_doc.html#AerialSetup',1,'']]], + ['shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_196',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['shader_197',['Shader',['../struct_shader.html',1,'']]], + ['shading_198',['Shading',['../_visualizer_doc.html#ColorShade',1,'Colors and Shading'],['../_visualizer_doc.html#Shading',1,'Shading']]], + ['shape_199',['Trunk and general tree shape',['../_weber_penn_doc.html#WPTreeShape',1,'']]], + ['shoot_200',['Shoot',['../_plant_architecture_doc.html#ShootParametersGeom',1,'Geometric Parameters of the Shoot'],['../_plant_architecture_doc.html#ShootParametersGrowth',1,'Growth Parameters of the Shoot'],['../struct_shoot.html',1,'Shoot']]], + ['shoot_201',['The Phytomer: Basic unit of a plant shoot',['../_plant_architecture_doc.html#PlantArchPhytomer',1,'']]], + ['shoot_5fangle_202',['shoot_angle',['../struct_white_spruce_canopy_parameters.html#a6d61ce74788b23c5539f4bc1a65caf1e',1,'WhiteSpruceCanopyParameters']]], + ['shoot_5fangle_5fbase_203',['shoot_angle_base',['../struct_split_grapevine_parameters.html#a37ae8efcf5324eed693d79ebd33edb91',1,'SplitGrapevineParameters']]], + ['shoot_5fangle_5fbase_5fspread_204',['shoot_angle_base_spread',['../struct_split_grapevine_parameters.html#a17998fb21f60d03be7f2c7844deaec3d',1,'SplitGrapevineParameters']]], + ['shoot_5fangle_5ftip_205',['shoot_angle_tip',['../struct_split_grapevine_parameters.html#af4c2209be803fc0118328b97eeb50ab3',1,'SplitGrapevineParameters']]], + ['shoot_5fangle_5ftip_5fspread_206',['shoot_angle_tip_spread',['../struct_split_grapevine_parameters.html#ad8b40619cc10ce5d1a71077972658084',1,'SplitGrapevineParameters']]], + ['shoot_5fcolor_207',['shoot_color',['../struct_tomato_parameters.html#a55cd91024165c3139c172ec3add2333c',1,'TomatoParameters::shoot_color'],['../struct_bean_parameters.html#ac98b67b586790c21f7c78a53829a62da',1,'BeanParameters::shoot_color']]], + ['shoot_5findex_208',['shoot_index',['../struct_phytomer.html#aa35d5da6c2d3ae761d1b4ce491db2e17',1,'Phytomer']]], + ['shoot_5flength_209',['shoot_length',['../struct_base_grape_vine_parameters.html#a93f5db8eb3001cdc8a5d84c0addd6b2b',1,'BaseGrapeVineParameters']]], + ['shoot_5flength_5fspread_210',['shoot_length_spread',['../struct_base_grape_vine_parameters.html#a53fe3fa053a5aa71ca4ea22956e554ec',1,'BaseGrapeVineParameters']]], + ['shoot_5fradius_211',['shoot_radius',['../struct_base_grape_vine_parameters.html#ab849b6c742cec6ae33db7aeb4d94b6dd',1,'BaseGrapeVineParameters::shoot_radius'],['../struct_white_spruce_canopy_parameters.html#a515f8b93fb025d4413e06ed4afef82d3',1,'WhiteSpruceCanopyParameters::shoot_radius']]], + ['shoot_5fradius_5fspread_212',['shoot_radius_spread',['../struct_base_grape_vine_parameters.html#a0988985e1efda816cbee5273f67fcb28',1,'BaseGrapeVineParameters']]], + ['shoot_5fsubdivisions_213',['shoot_subdivisions',['../struct_tomato_parameters.html#a056a0790faac4d769f749f75979c37af',1,'TomatoParameters::shoot_subdivisions'],['../struct_bean_parameters.html#a35e44fe9bff11ba69c7d1dce97fa2883',1,'BeanParameters::shoot_subdivisions']]], + ['shootparameters_214',['ShootParameters',['../struct_shoot_parameters.html',1,'ShootParameters'],['../struct_shoot_parameters.html#ab3003af230c520f6ff26010ca3ef850e',1,'ShootParameters::ShootParameters()'],['../struct_shoot_parameters.html#ab02d5fb11149500aae2d2480c3a75b6e',1,'ShootParameters::ShootParameters(std::minstd_rand0 *generator)']]], + ['shoots_20and_20their_20parameters_215',['Defining Shoots and their Parameters',['../_plant_architecture_doc.html#PlantArchShoot',1,'']]], + ['shoots_5fper_5fcordon_216',['shoots_per_cordon',['../struct_base_grape_vine_parameters.html#a80a0060ddd5de6e77e9071d320f49702',1,'BaseGrapeVineParameters']]], + ['shoots_5fper_5fcordon_5fspread_217',['shoots_per_cordon_spread',['../struct_base_grape_vine_parameters.html#a5b20278772fcefb3ecace03fda12885e',1,'BaseGrapeVineParameters']]], + ['showwatermark_218',['showWatermark',['../class_visualizer.html#a2f5e413bb5e48d98f061845065dfb830',1,'Visualizer']]], + ['shx_219',['Shx',['../struct_shx.html',1,'']]], + ['simplified_20version_20given_20in_20buckley_20turnbull_20and_20adams_202012_220',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['simulated_20lidar_20data_221',['Generating Synthetic (Simulated) LiDAR Data',['../_li_d_a_r_doc.html#LiDARsynthetic',1,'']]], + ['simulation_222',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['simulations_223',['Running Simulations',['../_radiation_doc.html#RadRun',1,'']]], + ['sky_20longwave_20flux_224',['Getting the Sky Longwave Flux',['../_solar_position_doc.html#LWFlux',1,'']]], + ['sliceprimitive_225',['slicePrimitive',['../class_voxel_intersection.html#a31bb0e73e1018d371b8927c10fb415cb',1,'VoxelIntersection']]], + ['sliceprimitivesusinggrid_226',['slicePrimitivesUsingGrid',['../class_voxel_intersection.html#a03d0dcdbf67ada3ba0d99b0e3754ef61',1,'VoxelIntersection']]], + ['slicing_20and_20cropping_20primitives_20on_20the_20boundaries_227',['2. Slicing and cropping primitives on the boundaries',['../radiation__beers_law.html#tutorial11_slice',1,'']]], + ['solar_20flux_228',['Solar Flux',['../_solar_position_doc.html#SolarFluxTheory',1,'Direct and Diffuse Solar Flux'],['../_solar_position_doc.html#SolarFlux',1,'Getting the Solar Flux']]], + ['solar_20position_20plugin_20documentation_229',['Solar Position Plugin Documentation',['../_solar_position_doc.html',1,'PlugIns']]], + ['solarposition_230',['SolarPosition',['../class_solar_position.html',1,'SolarPosition'],['../class_solar_position.html#a25fa8345e4101fa2d63757ca1bc9fe10',1,'SolarPosition::SolarPosition(helios::Context *context_ptr)'],['../class_solar_position.html#aad8b52cdec7e725441001f99dce4316f',1,'SolarPosition::SolarPosition(float UTC_hrs, float latitude_deg, float longitude_deg, helios::Context *context_ptr)']]], + ['solarposition_20class_20constructor_231',['SolarPosition Class Constructor',['../_solar_position_doc.html#SolarConstructor',1,'']]], + ['solarposition_20plug_20in_232',['SolarPosition Plug in',['../_radiation_doc.html#RadSolar',1,'Integrating with the SolarPosition Plug-in'],['../_solar_position_doc.html#SolarLib',1,'Using the SolarPosition Plug-in']]], + ['solarposition_2ecpp_233',['SolarPosition.cpp',['../_solar_position_8cpp.html',1,'']]], + ['solarposition_2eh_234',['SolarPosition.h',['../_solar_position_8h.html',1,'']]], + ['sorghum_235',['sorghum',['../class_canopy_generator.html#a1e1b20fe60767277a4440e7a918d507c',1,'CanopyGenerator']]], + ['sorghum_20canopy_236',['sorghum Canopy',['../_canopy_generator_doc.html#CGenSorghum',1,'']]], + ['sorghum_5fstage_237',['sorghum_stage',['../struct_sorghum_canopy_parameters.html#ae438f61b66b95f9ada7f9f34a7162e2c',1,'SorghumCanopyParameters']]], + ['sorghumcanopyparameters_238',['SorghumCanopyParameters',['../struct_sorghum_canopy_parameters.html',1,'SorghumCanopyParameters'],['../struct_sorghum_canopy_parameters.html#a5d06ca3cd236193ada9662f0787abd40',1,'SorghumCanopyParameters::SorghumCanopyParameters()'],['../struct_sorghum_canopy_parameters.html#a135111963ff4580035611f3af2babe37',1,'SorghumCanopyParameters::SorghumCanopyParameters(const pugi::xml_node canopy_node)']]], + ['source_239',['Adding Spherical Sun Source',['../_radiation_doc.html#SunSphereSource',1,'']]], + ['source_20spectral_20distribution_20and_20normalization_240',['Setting the Radiation Source Spectral Distribution and Normalization',['../_radiation_doc.html#SourceDist',1,'']]], + ['source_5fflux_5fscaling_5ffactor_241',['source_flux_scaling_factor',['../struct_radiation_source.html#a96bb8f5309cd171067e2693a6fb0118f',1,'RadiationSource']]], + ['source_5ffluxes_242',['source_fluxes',['../struct_radiation_source.html#af57db9db9cd4f389eecd547e474644d3',1,'RadiationSource']]], + ['source_5fid_243',['source_ID',['../struct_per_ray_data.html#a1c5097650f40749e55c984db780e1b1a',1,'PerRayData']]], + ['source_5fposition_244',['source_position',['../struct_radiation_source.html#a7b6944d5b003d2001d4e0a096c2d72c2',1,'RadiationSource']]], + ['source_5fposition_5fscaling_5ffactor_245',['source_position_scaling_factor',['../struct_radiation_source.html#a1a48a8fce4d1edba23aba7490fd1a6f7',1,'RadiationSource']]], + ['source_5frotation_246',['source_rotation',['../struct_radiation_source.html#ac436b7a30a4f1a614df2d4b4fa5a4b5a',1,'RadiationSource']]], + ['source_5fspectrum_247',['source_spectrum',['../struct_radiation_source.html#a2a5320be3f9facc5863928f81dbc8823',1,'RadiationSource']]], + ['source_5ftype_248',['source_type',['../struct_radiation_source.html#ad6e32df75c976c45dbf00b6f76eb1c48',1,'RadiationSource']]], + ['source_5fwidth_249',['source_width',['../struct_radiation_source.html#a6135f3233535ed8dbbf0075d4123dc07',1,'RadiationSource']]], + ['sources_250',['Sources',['../_radiation_doc.html#ColSource',1,'Adding Collimated Sources'],['../_radiation_doc.html#AmbSource',1,'Adding Diffuse/Ambient Sources'],['../_radiation_doc.html#DiskSource',1,'Adding Disk Radiation Sources'],['../_radiation_doc.html#RectSource',1,'Adding Rectangular Radiation Sources'],['../_radiation_doc.html#PointSource',1,'Adding Spherical Radiation Sources'],['../_radiation_doc.html#RadSources',1,'External Radiation Sources']]], + ['spatially_20homogeneous_20canopy_251',['Spatially Homogeneous Canopy',['../_canopy_generator_doc.html#CGenHomogeneous',1,'']]], + ['spectral_20data_252',['Input Spectral Data',['../_radiation_doc.html#InputSpectra',1,'']]], + ['spectral_20distribution_20and_20normalization_253',['Setting the Radiation Source Spectral Distribution and Normalization',['../_radiation_doc.html#SourceDist',1,'']]], + ['sphere_254',['Sphere',['../classhelios_1_1_sphere.html',1,'helios::Sphere'],['../classhelios_1_1_sphere.html#a4b215db8d3d2c52925b5bdd8b5b02eae',1,'helios::Sphere::Sphere()']]], + ['sphere_255',['3. Laminar flow around a sphere',['../_b_l_conductance_doc.html#BLC3',1,'']]], + ['sphere2cart_256',['sphere2cart',['../group__functions.html#ga97e12cf9fda6bf8b65b3ccc17e788c12',1,'helios']]], + ['spherical_20crowns_257',['Canopy of Spherical Crowns',['../_canopy_generator_doc.html#CGenSphere',1,'']]], + ['spherical_20radiation_20sources_258',['Adding Spherical Radiation Sources',['../_radiation_doc.html#PointSource',1,'']]], + ['spherical_20sun_20source_259',['Adding Spherical Sun Source',['../_radiation_doc.html#SunSphereSource',1,'']]], + ['sphericalcoord_260',['SphericalCoord',['../structhelios_1_1_spherical_coord.html',1,'helios::SphericalCoord'],['../structhelios_1_1_spherical_coord.html#a93171497b8c90975366e1945e6993dcd',1,'helios::SphericalCoord::SphericalCoord()'],['../structhelios_1_1_spherical_coord.html#adb761c897335d495e5f2b42064ccb5b1',1,'helios::SphericalCoord::SphericalCoord(float radius, float elevation_radians, float azimuth_radians)'],['../structhelios_1_1_spherical_coord.html#aada6ce13523a731118c7a603a8d7c4d2',1,'helios::SphericalCoord::SphericalCoord(const SphericalCoord &c)']]], + ['sphericalcrownscanopyparameters_261',['SphericalCrownsCanopyParameters',['../struct_spherical_crowns_canopy_parameters.html',1,'SphericalCrownsCanopyParameters'],['../struct_spherical_crowns_canopy_parameters.html#a9f4c0922be93c14cbeefcf816a392077',1,'SphericalCrownsCanopyParameters::SphericalCrownsCanopyParameters()'],['../struct_spherical_crowns_canopy_parameters.html#a6109ceebfa172d0a452c67bd4add93da',1,'SphericalCrownsCanopyParameters::SphericalCrownsCanopyParameters(const pugi::xml_node canopy_node)']]], + ['spline_5finterp3_262',['spline_interp3',['../group__functions.html#ga7f8e948aa3a70481ebd3a829531bee4e',1,'helios']]], + ['split_20trellis_263',['Grapevine Canopy with a Split Trellis',['../_canopy_generator_doc.html#CGenSplit',1,'']]], + ['splitgrapevineparameters_264',['SplitGrapevineParameters',['../struct_split_grapevine_parameters.html',1,'SplitGrapevineParameters'],['../struct_split_grapevine_parameters.html#a63c5f4e090194bc74f35c1099b5520d4',1,'SplitGrapevineParameters::SplitGrapevineParameters()'],['../struct_split_grapevine_parameters.html#a9f1e4d3e220effa2eccc0f4040ce15db',1,'SplitGrapevineParameters::SplitGrapevineParameters(const pugi::xml_node canopy_node)']]], + ['standard_20library_20include_20files_265',['C++ Standard Library Include Files',['../_a_p_i.html#GlobalInclude',1,'']]], + ['standard_20polygon_20file_20formats_266',['Reading Standard Polygon File Formats',['../_i_o.html#Poly',1,'']]], + ['stanford_20polygon_20files_267',['Stanford Polygon Files',['../_i_o.html#PLYread',1,'Reading PLY (Stanford Polygon) Files'],['../_i_o.html#PLYwrite',1,'Writing PLY (Stanford Polygon) Files']]], + ['started_20with_20the_20existing_20plant_20library_268',['Getting Started with the Existing Plant Library',['../_plant_architecture_doc.html#PlantArchGettingStarted',1,'']]], + ['state_20mode_269',['Running the Model (steady-state mode)',['../_stomatal_doc.html#StomatalRun',1,'']]], + ['state_20model_270',['Running the Steady-State Model',['../_energy_balance_doc.html#EBRun',1,'']]], + ['station_20radiometer_20data_271',['Calibrating the turbidity using weather station (radiometer) data',['../_solar_position_doc.html#SolarFluxTurb',1,'']]], + ['stdev_272',['stdev',['../group__functions.html#ga8a9b7ab24b0bb17b901c3ba41af760ec',1,'helios']]], + ['steady_20state_20mode_273',['Running the Model (steady-state mode)',['../_stomatal_doc.html#StomatalRun',1,'']]], + ['steady_20state_20model_274',['Running the Steady-State Model',['../_energy_balance_doc.html#EBRun',1,'']]], + ['stem_5fcolor_275',['stem_color',['../struct_strawberry_parameters.html#aef7973d815b5bfb9c09e27130681d857',1,'StrawberryParameters']]], + ['stem_5flength_276',['stem_length',['../struct_bean_parameters.html#a68612ab1ea804835e5fd7c1723144e4f',1,'BeanParameters']]], + ['stem_5fradius_277',['stem_radius',['../struct_strawberry_parameters.html#ac774348e3a59b3a79cf21e1b4634489f',1,'StrawberryParameters::stem_radius'],['../struct_bean_parameters.html#a9636c5c02d104a795fa06b759df1f888',1,'BeanParameters::stem_radius']]], + ['stem_5fsubdivisions_278',['stem_subdivisions',['../struct_strawberry_parameters.html#a07bd64fa21e059f5db73fbfb9d4c9607',1,'StrawberryParameters']]], + ['stems_5fper_5fplant_279',['stems_per_plant',['../struct_strawberry_parameters.html#a26ecd0d74e8339a2c40f05a7de926ef9',1,'StrawberryParameters']]], + ['step_201_20declare_20and_20initialize_20the_20visualizer_20class_280',['Step 1. Declare and initialize the Visualizer class',['../visualizer_basics.html#vis_step1',1,'']]], + ['step_202_20add_20geometry_20to_20the_20visualizer_281',['Step 2. Add geometry to the Visualizer',['../visualizer_basics.html#vis_step2',1,'']]], + ['step_203_20modify_20visualizer_20options_282',['Step 3. Modify Visualizer options',['../visualizer_basics.html#vis_step3',1,'']]], + ['step_204_20plot_20the_20result_283',['Step 4. Plot the result',['../visualizer_basics.html#vis_step4',1,'']]], + ['stomatal_20conductance_20model_284',['Using the Stomatal Conductance Model',['../_stomatal_doc.html#StomatalUse',1,'']]], + ['stomatal_20conductance_20model_20plugin_20documentation_285',['Stomatal Conductance Model Plugin Documentation',['../_stomatal_doc.html',1,'PlugIns']]], + ['stomatalconductancemodel_286',['StomatalConductanceModel',['../class_stomatal_conductance_model.html',1,'StomatalConductanceModel'],['../class_stomatal_conductance_model.html#a8d0993a2649b696c37c2f24799b1b545',1,'StomatalConductanceModel::StomatalConductanceModel()']]], + ['stomatalconductancemodel_2ecpp_287',['StomatalConductanceModel.cpp',['../_stomatal_conductance_model_8cpp.html',1,'']]], + ['stomatalconductancemodel_2eh_288',['StomatalConductanceModel.h',['../_stomatal_conductance_model_8h.html',1,'']]], + ['storage_289',['Unsteady model with heat storage',['../_energy_balance_doc.html#EBRunUS',1,'']]], + ['storecanopyparameters_290',['storeCanopyParameters',['../class_canopy_generator.html#a1d73a30e5717cdd18a89ff51fe9970e3',1,'CanopyGenerator']]], + ['strawberry_291',['strawberry',['../class_canopy_generator.html#a61ad89294ae8c964aff9cd18d273fc10',1,'CanopyGenerator']]], + ['strawberry_20canopy_292',['Strawberry Canopy',['../_canopy_generator_doc.html#CGenStrawberry',1,'']]], + ['strawberryparameters_293',['StrawberryParameters',['../struct_strawberry_parameters.html',1,'StrawberryParameters'],['../struct_strawberry_parameters.html#a4eb336cbf5135adf114135c958fdb41e',1,'StrawberryParameters::StrawberryParameters()'],['../struct_strawberry_parameters.html#aa58f8ff7655ded0ad470c81a3b34d718',1,'StrawberryParameters::StrawberryParameters(const pugi::xml_node canopy_node)']]], + ['strength_294',['strength',['../struct_per_ray_data.html#a3510f98e1f2a49183edf5173a2d9f935',1,'PerRayData']]], + ['string2int2_295',['string2int2',['../group__functions.html#ga2f83561e691aad4ecd41ac3879e59568',1,'helios']]], + ['string2int3_296',['string2int3',['../group__functions.html#gad1dbf51cdf1912828487e67ca51cccef',1,'helios']]], + ['string2int4_297',['string2int4',['../group__functions.html#ga4aa73326d27fdaba24fac984db5b8009',1,'helios']]], + ['string2rgbcolor_298',['string2RGBcolor',['../group__functions.html#ga8180158609698aae15da7574b085b817',1,'helios']]], + ['string2vec2_299',['string2vec2',['../group__functions.html#ga18616cd1df8b05b03eb6c2be0de54e3b',1,'helios']]], + ['string2vec3_300',['string2vec3',['../group__functions.html#ga65954cbb0f79c3fd5032f2cc27ad3b4f',1,'helios']]], + ['string2vec4_301',['string2vec4',['../group__functions.html#gadf3012a1d77a5aa50347de3a7175cb1a',1,'helios']]], + ['structure_302',['Structure',['../_a_p_i.html#DirStruct',1,'Basic Directory Structure'],['../_i_o.html#XMLstructure',1,'XML File Structure']]], + ['structures_303',['Data Structures',['../_a_p_i.html#Data',1,'']]], + ['studio_20c_20compiler_20tools_304',['Install Microsoft Visual Studio C++ compiler tools',['../_dependent_software.html#SetupPCMSVC',1,'']]], + ['sub_20components_305',['Getting Primitive UUIDs for Organ Sub-Components',['../_plant_architecture_doc.html#PlantArchQueryUUIDs',1,'']]], + ['subdivisions_306',['subdivisions',['../struct_leaf_prototype.html#a2a90483933ca70d5bd87079e607d5d38',1,'LeafPrototype']]], + ['subsystem_20for_20linux_20wsl_307',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]], + ['sum_308',['sum',['../group__functions.html#gaa20cc657b6475964d10022adc9850313',1,'helios']]], + ['summary_20of_20empirical_20model_20independent_20variables_309',['Summary of Empirical Model Independent Variables',['../_photosynthesis_doc.html#PhotoVars',1,'']]], + ['summary_20of_20empirical_20model_20parameters_310',['Summary of Empirical Model Parameters',['../_photosynthesis_doc.html#PhotoParams',1,'']]], + ['summary_20of_20fvcb_20model_20independent_20variables_311',['Summary of FvCB Model Independent Variables',['../_photosynthesis_doc.html#FvCBPhotoVars',1,'']]], + ['summary_20of_20fvcb_20model_20parameters_312',['Summary of FvCB Model Parameters',['../_photosynthesis_doc.html#FvCBPhotoParams',1,'']]], + ['sumplantleafarea_313',['sumPlantLeafArea',['../class_plant_architecture.html#ae8be24e5a963c49e7ab9ce5641fddec6',1,'PlantArchitecture']]], + ['sumprimitivesurfacearea_314',['sumPrimitiveSurfaceArea',['../classhelios_1_1_context.html#af7fae7c44d5608b23016300d8a917d9a',1,'helios::Context']]], + ['sun_315',['Sun',['../_solar_position_doc.html#SolarPos',1,'Getting the Direction of the Sun'],['../_solar_position_doc.html#SolarPosTheory',1,'Position of the Sun']]], + ['sun_20source_316',['Adding Spherical Sun Source',['../_radiation_doc.html#SunSphereSource',1,'']]], + ['sunlit_20area_20fraction_317',['4e. Calculate the theoretical sunlit area fraction',['../radiation__beers_law.html#tutorial11_fsunBeer',1,'']]], + ['sunlit_20leaf_20area_20fraction_20from_20the_20simulation_318',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_319',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['synthetic_20discrete_20return_20data_320',['Synthetic discrete-return data',['../_li_d_a_r_doc.html#LiDARsynthdiscrete',1,'']]], + ['synthetic_20simulated_20lidar_20data_321',['Generating Synthetic (Simulated) LiDAR Data',['../_li_d_a_r_doc.html#LiDARsynthetic',1,'']]], + ['synthetic_20waveform_20data_322',['Synthetic waveform data',['../_li_d_a_r_doc.html#LiDARsynthwaveform',1,'']]], + ['syntheticannotation_323',['SyntheticAnnotation',['../class_synthetic_annotation.html',1,'SyntheticAnnotation'],['../class_synthetic_annotation.html#a4a5fa05deea2f4a9ce20f7b941c23725',1,'SyntheticAnnotation::SyntheticAnnotation()']]], + ['syntheticannotation_2ecpp_324',['SyntheticAnnotation.cpp',['../_synthetic_annotation_8cpp.html',1,'']]], + ['syntheticannotation_2eh_325',['SyntheticAnnotation.h',['../_synthetic_annotation_8h.html',1,'']]], + ['syntheticscan_326',['syntheticScan',['../class_aerial_li_d_a_rcloud.html#a0d56ae98d2ab2ad7008640b0ea4ffaea',1,'AerialLiDARcloud::syntheticScan(helios::Context *context, const char *xml_file)'],['../class_aerial_li_d_a_rcloud.html#a82abe2d47cc135f9f795ffaa15e4e041',1,'AerialLiDARcloud::syntheticScan(helios::Context *context, const char *xml_file, const int rays_per_pulse, const float pulse_distance_threshold)'],['../class_li_d_a_rcloud.html#aac5cafa2281f9d479f2bb56be0780e31',1,'LiDARcloud::syntheticScan(helios::Context *context)'],['../class_li_d_a_rcloud.html#a027d03054878ad27a705a839c36ba0cf',1,'LiDARcloud::syntheticScan(helios::Context *context, bool scan_grid_only, bool record_misses)'],['../class_li_d_a_rcloud.html#aca2bef5f45b9c7f65e04952ed1551f25',1,'LiDARcloud::syntheticScan(helios::Context *context, int rays_per_pulse, float pulse_distance_threshold)'],['../class_li_d_a_rcloud.html#a0a4118588bb1a17e5d855a18ffbde299',1,'LiDARcloud::syntheticScan(helios::Context *context, int rays_per_pulse, float pulse_distance_threshold, bool scan_grid_only, bool record_misses)']]], + ['system_327',['System',['../_a_p_i.html#Coord',1,'Coordinate System'],['../_plant_architecture_doc.html#PlantArchCoord',1,'Coordinate System']]], + ['systems_328',['Coordinate Systems',['../_visualizer_doc.html#coord',1,'']]] +]; diff --git a/doc/html/search/all_1c.js b/doc/html/search/all_1c.js new file mode 100644 index 000000000..a5a0c181a --- /dev/null +++ b/doc/html/search/all_1c.js @@ -0,0 +1,156 @@ +var searchData= +[ + ['tabular_20text_20files_0',['Adding Timeseries (Weather) Data from Tabular Text Files',['../_i_o.html#ASCIItimeseries',1,'']]], + ['tdr_20delay_1',['Increasing Timout Detection (TDR) Delay',['../_dependent_software.html#TdrDelay',1,'']]], + ['temperature_2',['Temperature',['../_photosynthesis_doc.html#PhotoTempParam',1,'Response of Assimilation Rate to Temperature'],['../_photosynthesis_doc.html#PhotoRespParam',1,'Response of Respiration Rate to Temperature']]], + ['temperature_20response_3',['Temperature Response',['../_photosynthesis_doc.html#TempResponse',1,'']]], + ['temperature_20response_20of_20model_20parameters_4',['Temperature response of model parameters',['../_photosynthesis_doc.html#FvCBtemperature',1,'']]], + ['test_20tutorial_5',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], + ['text_20file_6',['Exporting Primitive Data to Text File',['../_i_o.html#ExportASCII',1,'']]], + ['text_20files_7',['Adding Timeseries (Weather) Data from Tabular Text Files',['../_i_o.html#ASCIItimeseries',1,'']]], + ['texture_8',['Texture',['../classhelios_1_1_texture.html',1,'helios::Texture'],['../classhelios_1_1_texture.html#a219d0c23431e27022fbac3c0b38befd6',1,'helios::Texture::Texture()']]], + ['texture_20map_9',['Coloring Primitives by Texture Map',['../_a_p_i.html#TextureColor',1,'']]], + ['texture_20map_10',['Coloring by texture map',['../_visualizer_doc.html#ColoringTexture',1,'']]], + ['texture_20mapping_11',['Texture Mapping',['../_a_p_i.html#Texture',1,'']]], + ['texture_20mask_20files_20with_20transparency_20using_20gimp_12',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['the_20background_13',['3. Removing the background',['../_making_masks.html#Three',1,'']]], + ['the_20boundaries_14',['2. Slicing and cropping primitives on the boundaries',['../radiation__beers_law.html#tutorial11_slice',1,'']]], + ['the_20boundary_20layer_20conductance_20model_20plug_20in_15',['Using the Boundary Layer Conductance Model Plug-in',['../_b_l_conductance_doc.html#BLUse',1,'']]], + ['the_20boundary_20layer_20conductance_20model_20to_20be_20used_16',['Setting the Boundary-layer Conductance Model To Be Used',['../_b_l_conductance_doc.html#BLCSet',1,'']]], + ['the_20canopy_20on_20a_20ground_20area_20basis_17',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['the_20clion_20ide_20with_20helios_18',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['the_20context_19',['Adding a Patch to the Context',['../context_primitives.html#AddPatch',1,'']]], + ['the_20direction_20of_20the_20sun_20',['Getting the Direction of the Sun',['../_solar_position_doc.html#SolarPos',1,'']]], + ['the_20documentation_21',['Using the Documentation',['../_overview.html#DocOverview',1,'']]], + ['the_20effects_20of_20clouds_22',['Incorporating the effects of clouds',['../_solar_position_doc.html#SolarFluxClouds',1,'']]], + ['the_20energy_20balance_20model_20plug_20in_23',['Using the Energy Balance Model Plug-in',['../_energy_balance_doc.html#EBUse',1,'']]], + ['the_20existing_20plant_20library_24',['Getting Started with the Existing Plant Library',['../_plant_architecture_doc.html#PlantArchGettingStarted',1,'']]], + ['the_20ground_25',['Building the Ground',['../_canopy_generator_doc.html#CGenBuildGround',1,'']]], + ['the_20helios_20context_26',['The Helios Context',['../_overview.html#ContextOverview',1,'']]], + ['the_20image_27',['1. Choosing the image',['../_making_masks.html#One',1,'']]], + ['the_20library_28',['Modifying Parameters of a Plant from the Library',['../_plant_architecture_doc.html#PlantArchBuild_custom',1,'']]], + ['the_20library_20with_20default_20parameters_29',['Loading a Plant from the Library with Default Parameters',['../_plant_architecture_doc.html#PlantArchBuild_default',1,'']]], + ['the_20model_30',['the Model',['../_plant_architecture_doc.html#PlantArchQuery',1,'Retrieving Information from the Model'],['../_b_l_conductance_doc.html#BLCRun',1,'Running the Model']]], + ['the_20model_20and_20calculate_20par_20interception_31',['3. Run the model and calculate PAR interception',['../radiation_basics.html#Tutorial10_run',1,'']]], + ['the_20model_20coefficients_32',['Setting the Model Coefficients',['../_stomatal_doc.html#StomatalCoeffs',1,'']]], + ['the_20model_20in_20dynamic_20mode_33',['Running the Model in Dynamic Mode',['../_stomatal_doc.html#StomatalRunDyn',1,'']]], + ['the_20model_20over_20time_34',['Growing the Model over Time',['../_plant_architecture_doc.html#PlantArchGrowth',1,'']]], + ['the_20model_20steady_20state_20mode_35',['Running the Model (steady-state mode)',['../_stomatal_doc.html#StomatalRun',1,'']]], + ['the_20phytomer_20and_20its_20parameters_36',['Defining the Phytomer and its Parameters',['../_plant_architecture_doc.html#PlantArchPhytomerParams',1,'']]], + ['the_20phytomer_3a_20basic_20unit_20of_20a_20plant_20shoot_37',['The Phytomer: Basic unit of a plant shoot',['../_plant_architecture_doc.html#PlantArchPhytomer',1,'']]], + ['the_20plug_20in_38',['Using the Plug-In',['../_voxel_intersection_doc.html#VoxelIntersectionUse',1,'']]], + ['the_20polhausen_20equation_20laminar_20flat_20plate_20forced_20convection_39',['1. The Polhausen Equation (Laminar Flat Plate, Forced Convection)',['../_b_l_conductance_doc.html#BLC1',1,'']]], + ['the_20radiation_20model_20plug_20in_40',['Using the Radiation Model Plug-In',['../_radiation_doc.html#RadUse',1,'']]], + ['the_20radiation_20source_20spectral_20distribution_20and_20normalization_41',['Setting the Radiation Source Spectral Distribution and Normalization',['../_radiation_doc.html#SourceDist',1,'']]], + ['the_20random_20number_20generator_42',['Seeding the Random Number Generator',['../_canopy_generator_doc.html#CGenSeed',1,'']]], + ['the_20result_43',['Step 4. Plot the result',['../visualizer_basics.html#vis_step4',1,'']]], + ['the_20right_20cuda_20and_20optix_20version_44',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['the_20shoot_45',['the Shoot',['../_plant_architecture_doc.html#ShootParametersGeom',1,'Geometric Parameters of the Shoot'],['../_plant_architecture_doc.html#ShootParametersGrowth',1,'Growth Parameters of the Shoot']]], + ['the_20simulation_46',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['the_20sky_20longwave_20flux_47',['Getting the Sky Longwave Flux',['../_solar_position_doc.html#LWFlux',1,'']]], + ['the_20solar_20flux_48',['Getting the Solar Flux',['../_solar_position_doc.html#SolarFlux',1,'']]], + ['the_20solarposition_20plug_20in_49',['the SolarPosition Plug in',['../_radiation_doc.html#RadSolar',1,'Integrating with the SolarPosition Plug-in'],['../_solar_position_doc.html#SolarLib',1,'Using the SolarPosition Plug-in']]], + ['the_20steady_20state_20model_50',['Running the Steady-State Model',['../_energy_balance_doc.html#EBRun',1,'']]], + ['the_20stomatal_20conductance_20model_51',['Using the Stomatal Conductance Model',['../_stomatal_doc.html#StomatalUse',1,'']]], + ['the_20sun_52',['the Sun',['../_solar_position_doc.html#SolarPos',1,'Getting the Direction of the Sun'],['../_solar_position_doc.html#SolarPosTheory',1,'Position of the Sun']]], + ['the_20sunlit_20leaf_20area_20fraction_20from_20the_20simulation_53',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['the_20theoretical_20absorbed_20par_20flux_20using_20beer_20s_20law_54',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['the_20theoretical_20sunlit_20area_20fraction_55',['4e. Calculate the theoretical sunlit area fraction',['../radiation__beers_law.html#tutorial11_fsunBeer',1,'']]], + ['the_20tree_20library_56',['Adding Trees from the Tree Library',['../_weber_penn_doc.html#WPTadd',1,'']]], + ['the_20turbidity_20using_20weather_20station_20radiometer_20data_57',['Calibrating the turbidity using weather station (radiometer) data',['../_solar_position_doc.html#SolarFluxTurb',1,'']]], + ['the_20visualizer_58',['Step 2. Add geometry to the Visualizer',['../visualizer_basics.html#vis_step2',1,'']]], + ['the_20visualizer_20class_59',['Step 1. Declare and initialize the Visualizer class',['../visualizer_basics.html#vis_step1',1,'']]], + ['the_20visualizer_20plug_20in_60',['Visualizing Model Outputs using the Visualizer Plug-In',['../_radiation_doc.html#RadVis',1,'']]], + ['the_20visualizer_20plug_20in_61',['the Visualizer Plug in',['../_dependent_software.html#SetupLinuxVis',1,'Dependencies of the Visualizer Plug-in'],['../_visualizer_doc.html#UseVis',1,'Using the Visualizer Plug-in']]], + ['the_20weber_20penn_20tree_20plug_20in_62',['Using the Weber-Penn Tree Plug-in',['../_weber_penn_doc.html#WPTreeUse',1,'']]], + ['the_20xml_20tree_20library_20file_63',['The XML Tree Library File',['../_weber_penn_doc.html#WPTLibrary',1,'']]], + ['their_20parameters_64',['Defining Shoots and their Parameters',['../_plant_architecture_doc.html#PlantArchShoot',1,'']]], + ['theoretical_20absorbed_20par_20flux_20using_20beer_20s_20law_65',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['theoretical_20sunlit_20area_20fraction_66',['4e. Calculate the theoretical sunlit area fraction',['../radiation__beers_law.html#tutorial11_fsunBeer',1,'']]], + ['theory_67',['Theory',['../radiation__beers_law.html#tutorial11_theory',1,'0. Theory'],['../_plant_architecture_doc.html#PlantArchDescription',1,'Background Theory'],['../_stomatal_doc.html#BWBTheory',1,'Ball, Woodrow, Berry (1987) Model Theory'],['../_stomatal_doc.html#BBLTheory',1,'Ball-Berry-Leuning Model Theory'],['../_solar_position_doc.html#SolarTheory',1,'Model Theory']]], + ['theta_68',['4a. Calculate G(theta)',['../radiation__beers_law.html#tutorial11_G',1,'']]], + ['thetamax_69',['thetaMax',['../struct_scan_metadata.html#a2654da6ef2d7d383ba912cbc6cbfeedf',1,'ScanMetadata']]], + ['thetamin_70',['thetaMin',['../struct_scan_metadata.html#a1b5a4f80f3d64d54755d2b6499f3863f',1,'ScanMetadata']]], + ['threshold_20parameters_71',['Modifying Phenological Threshold Parameters',['../_plant_architecture_doc.html#PlantArchPhenoMod',1,'']]], + ['tic_72',['tic',['../structhelios_1_1_timer.html#a47d04d3a8054ad2b6bbb9623c000090c',1,'helios::Timer']]], + ['tile_73',['Tile',['../classhelios_1_1_tile.html',1,'helios::Tile'],['../classhelios_1_1_tile.html#ae7a684eae38bd9f5b3397962cd1a2774',1,'helios::Tile::Tile()']]], + ['tile_5fbounds_74',['tile_bounds',['../primitive_intersection_8cu.html#a4fd84a7124be9fea427690a9a2442b3b',1,'primitiveIntersection.cu']]], + ['tile_5fintersect_75',['tile_intersect',['../primitive_intersection_8cu.html#ac645addc8bc3071933ca33a0f053af07',1,'primitiveIntersection.cu']]], + ['time_76',['Time',['../_plant_architecture_doc.html#PlantArchGrowth',1,'Growing the Model over Time'],['../structhelios_1_1_time.html',1,'helios::Time'],['../structhelios_1_1_time.html#a6265f89a66bfff369fecf125bebfa3e2',1,'helios::Time::Time()'],['../structhelios_1_1_time.html#a2b47ac09cf37b9183c1236beebd2bd10',1,'helios::Time::Time(int hour, int minute)'],['../structhelios_1_1_time.html#a98d45a9c451c5ff2013b78f7d1ee7f57',1,'helios::Time::Time(int hour, int minute, int second)']]], + ['time_20vector_77',['Time Vector',['../context_vectors.html#Timetut',1,'']]], + ['timeout_78',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], + ['timer_79',['Timer',['../structhelios_1_1_timer.html',1,'helios']]], + ['timeseries_80',['Timeseries',['../group__timeseries.html',1,'']]], + ['timeseries_20data_81',['Adding Timeseries Data',['../_i_o.html#TimeXML',1,'']]], + ['timeseries_20weather_20data_20from_20tabular_20text_20files_82',['Adding Timeseries (Weather) Data from Tabular Text Files',['../_i_o.html#ASCIItimeseries',1,'']]], + ['timeseries_20weather_20inputs_83',['Data Timeseries (Weather Inputs)',['../_a_p_i.html#DataTimeseries',1,'']]], + ['timout_20detection_20tdr_20delay_84',['Increasing Timout Detection (TDR) Delay',['../_dependent_software.html#TdrDelay',1,'']]], + ['to_20be_20used_85',['Setting the Boundary-layer Conductance Model To Be Used',['../_b_l_conductance_doc.html#BLCSet',1,'']]], + ['to_20co2_86',['Response of Assimilation Rate to CO2',['../_photosynthesis_doc.html#PhotoCO2Param',1,'']]], + ['to_20file_87',['Writing Camera Images to File',['../_radiation_doc.html#RadCamOut',1,'']]], + ['to_20file_88',['Writing results to file',['../_li_d_a_r_doc.html#LiDARoutput',1,'']]], + ['to_20global_20data_89',['Introduction to Global Data',['../context_globaldata.html#context_globaldata_intro',1,'']]], + ['to_20light_90',['Response of Assimilation Rate to Light',['../_photosynthesis_doc.html#PhotoLightParam',1,'']]], + ['to_20ply_20using_20blender_91',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['to_20png_20format_92',['4. Exporting to .png format',['../_making_masks.html#Four',1,'']]], + ['to_20primitive_20data_93',['Introduction to Primitive Data',['../context_primdata.html#context_primdata_intro',1,'']]], + ['to_20temperature_94',['to Temperature',['../_photosynthesis_doc.html#PhotoTempParam',1,'Response of Assimilation Rate to Temperature'],['../_photosynthesis_doc.html#PhotoRespParam',1,'Response of Respiration Rate to Temperature']]], + ['to_20text_20file_95',['Exporting Primitive Data to Text File',['../_i_o.html#ExportASCII',1,'']]], + ['to_20the_20context_96',['Adding a Patch to the Context',['../context_primitives.html#AddPatch',1,'']]], + ['to_20the_20visualizer_97',['Step 2. Add geometry to the Visualizer',['../visualizer_basics.html#vis_step2',1,'']]], + ['to_20use_20for_20helios_20programming_98',['Which platform to use for Helios programming?',['../_dependent_software.html#WhichPlatform',1,'']]], + ['to_20xml_20file_20format_99',['Exporting Project to XML File Format',['../_i_o.html#Export',1,'']]], + ['toc_100',['toc',['../structhelios_1_1_timer.html#a9d3f79551cc1089cb6dd81d3bb68f537',1,'helios::Timer::toc() const'],['../structhelios_1_1_timer.html#a0449918d3129616aa908b5580069c7b6',1,'helios::Timer::toc(const char *message) const']]], + ['tomato_101',['tomato',['../class_canopy_generator.html#a47b1aef12b71a5a406b6ac1caa7c7363',1,'CanopyGenerator']]], + ['tomatoparameters_102',['TomatoParameters',['../struct_tomato_parameters.html',1,'TomatoParameters'],['../struct_tomato_parameters.html#ab799d673013e4ef5c257293d9951a462',1,'TomatoParameters::TomatoParameters()'],['../struct_tomato_parameters.html#ab687e0d3051c1c94fff2c61e5db971b4',1,'TomatoParameters::TomatoParameters(const pugi::xml_node canopy_node)']]], + ['toolchains_103',['Setting up CMake and compilers (Toolchains)',['../_c_lion_i_d_e.html#CLionToolchains',1,'']]], + ['tools_104',['Install Microsoft Visual Studio C++ compiler tools',['../_dependent_software.html#SetupPCMSVC',1,'']]], + ['tortuosity_105',['tortuosity',['../_plant_architecture_doc.html#ShootParam_tortuosity',1,'']]], + ['transformations_106',['Primitive Transformations',['../_a_p_i.html#PrimTransform',1,'']]], + ['translate_107',['translate',['../classhelios_1_1_compound_object.html#aa16f6ad8ec100173147c89bb2c5e0446',1,'helios::CompoundObject']]], + ['translateobject_108',['translateObject',['../classhelios_1_1_context.html#a70805980c2c201082507dcfdde4399d1',1,'helios::Context::translateObject(uint ObjID, const vec3 &shift)'],['../classhelios_1_1_context.html#a886b95e094bc80e95c602e9e81b568ad',1,'helios::Context::translateObject(const std::vector< uint > &ObjIDs, const vec3 &shift)']]], + ['translateprimitive_109',['translatePrimitive',['../classhelios_1_1_context.html#a1ae827c4e0c90a883430bd1db95993e1',1,'helios::Context::translatePrimitive(uint UUID, const vec3 &shift)'],['../classhelios_1_1_context.html#a1e98dca73f3e6282b2d1c3a0458b14a4',1,'helios::Context::translatePrimitive(const std::vector< uint > &UUIDs, const vec3 &shift)']]], + ['transparency_20channel_110',['Masking Primitives by Image Transparency Channel',['../_a_p_i.html#TextureMask',1,'']]], + ['transparency_20using_20gimp_111',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['tree_20library_112',['Adding Trees from the Tree Library',['../_weber_penn_doc.html#WPTadd',1,'']]], + ['tree_20library_20file_113',['The XML Tree Library File',['../_weber_penn_doc.html#WPTLibrary',1,'']]], + ['tree_20library_20files_114',['Custom Tree Library Files',['../_weber_penn_doc.html#WPTCustom',1,'']]], + ['tree_20light_20interception_115',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['tree_20plug_20in_116',['Using the Weber-Penn Tree Plug-in',['../_weber_penn_doc.html#WPTreeUse',1,'']]], + ['tree_20plugin_20documentation_117',['Weber-Penn Tree Plugin Documentation',['../_weber_penn_doc.html',1,'PlugIns']]], + ['tree_20shape_118',['Trunk and general tree shape',['../_weber_penn_doc.html#WPTreeShape',1,'']]], + ['trees_20from_20the_20tree_20library_119',['Adding Trees from the Tree Library',['../_weber_penn_doc.html#WPTadd',1,'']]], + ['trellis_120',['Trellis',['../_canopy_generator_doc.html#CGenGoblet',1,'Grapevine Canopy with a Goblet Trellis'],['../_canopy_generator_doc.html#CGenSplit',1,'Grapevine Canopy with a Split Trellis'],['../_canopy_generator_doc.html#CGenUnilateral',1,'Grapevine Canopy with a Unilateral VSP Trellis'],['../_canopy_generator_doc.html#CGenVSP',1,'Grapevine Canopy with VSP Trellis']]], + ['triad_121',['Triad',['../struct_triad.html',1,'']]], + ['triangle_5fbounds_122',['triangle_bounds',['../primitive_intersection_8cu.html#a0a93209b8d30eee91f87b1b714991b3a',1,'primitiveIntersection.cu']]], + ['triangle_5fintersect_123',['triangle_intersect',['../primitive_intersection_8cu.html#a393a839ba1216483ca3d447e45d930ab',1,'primitiveIntersection.cu']]], + ['triangles_124',['Adding Triangles',['../_a_p_i.html#AddingTriangle',1,'']]], + ['triangulatehitpoints_125',['triangulateHitPoints',['../class_li_d_a_rcloud.html#ac495385c9dc7cc7773819ce77175242a',1,'LiDARcloud::triangulateHitPoints(float Lmax, float max_aspect_ratio)'],['../class_li_d_a_rcloud.html#a2e2d9ac728f839b64cedb20582d77d48',1,'LiDARcloud::triangulateHitPoints(float Lmax, float max_aspect_ratio, const char *scalar_field, float threshold, const char *comparator)']]], + ['triangulation_126',['Triangulation',['../struct_triangulation.html',1,'']]], + ['triangulation_127',['Hit point triangulation',['../_li_d_a_r_doc.html#LiDARtri',1,'']]], + ['trim_5fwhitespace_128',['trim_whitespace',['../group__functions.html#ga56b873fa7b729dd84412d44156fa2dca',1,'helios']]], + ['trunk_20and_20general_20tree_20shape_129',['Trunk and general tree shape',['../_weber_penn_doc.html#WPTreeShape',1,'']]], + ['trunk_5fheight_130',['trunk_height',['../struct_base_grape_vine_parameters.html#a85d8f22abdda39c464a48e1fc60bd064',1,'BaseGrapeVineParameters::trunk_height'],['../struct_white_spruce_canopy_parameters.html#a46f1f25dba30c6af07228680d80837a6',1,'WhiteSpruceCanopyParameters::trunk_height'],['../struct_walnut_canopy_parameters.html#aeaa0ebb5a837d6a57254f8a1f023aef9',1,'WalnutCanopyParameters::trunk_height']]], + ['trunk_5fheight_5fspread_131',['trunk_height_spread',['../struct_base_grape_vine_parameters.html#a5980a12f332f92c2d084d1a1120a8dd3',1,'BaseGrapeVineParameters']]], + ['trunk_5fradius_132',['trunk_radius',['../struct_base_grape_vine_parameters.html#ab842729ff885c8d8476e5c2c204e2979',1,'BaseGrapeVineParameters::trunk_radius'],['../struct_white_spruce_canopy_parameters.html#ab5771594720bf44fc57c40cedd629ff5',1,'WhiteSpruceCanopyParameters::trunk_radius'],['../struct_walnut_canopy_parameters.html#a4d86caeb5dffe23b091a9c808005f307',1,'WalnutCanopyParameters::trunk_radius']]], + ['trunk_5fradius_5fspread_133',['trunk_radius_spread',['../struct_base_grape_vine_parameters.html#a6f2bca2ded24fa8da8f71d9b7ae5e033',1,'BaseGrapeVineParameters']]], + ['trunkreconstruction_134',['trunkReconstruction',['../class_li_d_a_rcloud.html#aa7d6abb997267bce460c48cf02dc3545',1,'LiDARcloud']]], + ['tube_135',['Tube',['../classhelios_1_1_tube.html',1,'helios::Tube'],['../classhelios_1_1_tube.html#a10d74e5d06813e05c2b188ee170339c9',1,'helios::Tube::Tube()']]], + ['turbidity_20using_20weather_20station_20radiometer_20data_136',['Calibrating the turbidity using weather station (radiometer) data',['../_solar_position_doc.html#SolarFluxTurb',1,'']]], + ['turnbull_20and_20adams_202012_137',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['tutorial_138',['Tutorial',['../context_selftest.html',1,'Tutorial 0: Context Self-Test Tutorial'],['../context_vectors.html',1,'Tutorial 1: Helios Vector Types Tutorial']]], + ['tutorial_200_3a_20context_20self_20test_20tutorial_139',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], + ['tutorial_2010_3a_20radiation_20model_20basics_20tree_20light_20interception_140',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['tutorial_2011_3a_20light_20interception_20and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_141',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['tutorial_201_3a_20helios_20vector_20types_20tutorial_142',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]], + ['tutorial_202_3a_20working_20with_20context_20geometry_143',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['tutorial_205_3a_20primitive_20data_144',['Tutorial 5: Primitive Data',['../context_primdata.html',1,'Tutorials']]], + ['tutorial_206_3a_20global_20data_145',['Tutorial 6: Global Data',['../context_globaldata.html',1,'Tutorials']]], + ['tutorial_207_3a_20visualizer_20basics_146',['Tutorial 7: Visualizer Basics',['../visualizer_basics.html',1,'Tutorials']]], + ['tutorial_208_3a_20visualizing_20primitive_20data_20values_147',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], + ['tutorials_148',['Tutorials',['../_tutorials.html',1,'']]], + ['txt_20file_149',['CMakeLists.txt File',['../_a_p_i.html#CMake',1,'']]], + ['txt_20file_150',['CMakeLists.txt file',['../_plugins.html#cmake',1,'']]], + ['types_151',['Types',['../_a_p_i.html#PrimitiveTypes',1,'Primitive Types'],['../_a_p_i.html#VecTypes',1,'Vector Types']]], + ['types_20tutorial_152',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]] +]; diff --git a/doc/html/search/all_1d.js b/doc/html/search/all_1d.js new file mode 100644 index 000000000..55c9488ef --- /dev/null +++ b/doc/html/search/all_1d.js @@ -0,0 +1,52 @@ +var searchData= +[ + ['unilateral_20vsp_20trellis_0',['Grapevine Canopy with a Unilateral VSP Trellis',['../_canopy_generator_doc.html#CGenUnilateral',1,'']]], + ['unilateralgrapevineparameters_1',['UnilateralGrapevineParameters',['../struct_unilateral_grapevine_parameters.html',1,'UnilateralGrapevineParameters'],['../struct_unilateral_grapevine_parameters.html#a1f4063470113acb28186cf92b3030283',1,'UnilateralGrapevineParameters::UnilateralGrapevineParameters()'],['../struct_unilateral_grapevine_parameters.html#ab85a40a1bc4bd1880f74814278ff7fd2',1,'UnilateralGrapevineParameters::UnilateralGrapevineParameters(const pugi::xml_node canopy_node)']]], + ['unique_20universal_20identifiers_20uuids_2',['Unique Universal Identifiers (UUIDs)',['../context_primitives.html#AddPatch_UUIDs',1,'']]], + ['unique_5fprototypes_3',['unique_prototypes',['../struct_leaf_prototype.html#a900f658b122d42dc24a42838fb16f189',1,'LeafPrototype']]], + ['unit_20of_20a_20plant_20shoot_4',['The Phytomer: Basic unit of a plant shoot',['../_plant_architecture_doc.html#PlantArchPhytomer',1,'']]], + ['universal_20identifiers_20uuids_5',['Unique Universal Identifiers (UUIDs)',['../context_primitives.html#AddPatch_UUIDs',1,'']]], + ['unsteady_20model_20with_20heat_20storage_6',['Unsteady model with heat storage',['../_energy_balance_doc.html#EBRunUS',1,'']]], + ['up_7',['up',['../radiation_basics.html#Tutorial10_rad',1,'2. Radiation model set-up'],['../radiation__beers_law.html#tutorial11_rad',1,'3. Radiation model set-up'],['../_dependent_software.html',1,'Install and Set-up']]], + ['up_20basic_20build_20functionality_8',['up basic build functionality',['../_dependent_software.html#SetupPCCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupLinuxCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupMacCLion',1,'Setting up basic build functionality']]], + ['up_20cmake_20and_20compilers_20toolchains_9',['Setting up CMake and compilers (Toolchains)',['../_c_lion_i_d_e.html#CLionToolchains',1,'']]], + ['up_20nvidia_20cuda_10',['up NVIDIA CUDA',['../_dependent_software.html#SetupPCCUDA',1,'Setting up NVIDIA CUDA'],['../_dependent_software.html#SetupLinuxCUDA',1,'Setting up NVIDIA CUDA']]], + ['up_20on_20linux_11',['Set-up on Linux',['../_dependent_software.html#SetupLinux',1,'']]], + ['up_20on_20mac_12',['Set-up on Mac',['../_dependent_software.html#SetupMac',1,'']]], + ['up_20on_20windows_20pc_13',['Set-up on Windows PC',['../_dependent_software.html#SetupPC',1,'']]], + ['updatecameraresponse_14',['updateCameraResponse',['../class_radiation_model.html#afabb4e1a6c8c67ccc9c68aab7dfd07e3',1,'RadiationModel']]], + ['updatecameraresponsespectra_15',['updateCameraResponseSpectra',['../struct_camera_calibration.html#a900b08896dc2c3bf892311478d895883',1,'CameraCalibration']]], + ['updatecurrentshootparameters_16',['updateCurrentShootParameters',['../class_plant_architecture.html#a2074dfe285a623833dd07b4aa0b93a7c',1,'PlantArchitecture::updateCurrentShootParameters(const std::string &shoot_type_label, const ShootParameters &params)'],['../class_plant_architecture.html#a4539115c4ba145fa10277d3dcfa63685',1,'PlantArchitecture::updateCurrentShootParameters(const std::map< std::string, ShootParameters > &params)']]], + ['updategeometry_17',['updateGeometry',['../class_radiation_model.html#acf5fe304146a9270bf0e841f59e51934',1,'RadiationModel::updateGeometry()'],['../class_radiation_model.html#a28ab342e5959369755037fa5ec039e70',1,'RadiationModel::updateGeometry(const std::vector< uint > &UUIDs)']]], + ['updateshootnodes_18',['updateShootNodes',['../struct_shoot.html#a19eb5d6e3248c45de08774d11cbf329b',1,'Shoot']]], + ['use_20for_20helios_20programming_19',['Which platform to use for Helios programming?',['../_dependent_software.html#WhichPlatform',1,'']]], + ['used_20',['Setting the Boundary-layer Conductance Model To Be Used',['../_b_l_conductance_doc.html#BLCSet',1,'']]], + ['useobjecttexturecolor_21',['useObjectTextureColor',['../classhelios_1_1_context.html#ad58362537512f6df9028a60181d88af0',1,'helios::Context::useObjectTextureColor(uint ObjID)'],['../classhelios_1_1_context.html#a92457a1277ce0e5918e20007193001bf',1,'helios::Context::useObjectTextureColor(const std::vector< uint > &ObjIDs)']]], + ['useprimitivetexturecolor_22',['usePrimitiveTextureColor',['../classhelios_1_1_context.html#a60aaa1a72ff6ebcd28c48b7dfbc3ca7c',1,'helios::Context::usePrimitiveTextureColor(uint UUID)'],['../classhelios_1_1_context.html#a563083497cce82f251e0eaf238cb3600',1,'helios::Context::usePrimitiveTextureColor(const std::vector< uint > &UUIDs)']]], + ['user_20api_20guide_23',['User/API Guide',['../_a_p_i.html',1,'']]], + ['user_20defined_20leaf_20angle_20distribution_20functions_24',['User-Defined Leaf Angle Distribution Functions',['../_weber_penn_doc.html#WPTgL',1,'']]], + ['useshader_25',['useShader',['../struct_shader.html#a07520fd004cb1fd118597151d00e2c24',1,'Shader']]], + ['usetexturecolor_26',['useTextureColor',['../classhelios_1_1_compound_object.html#ad40fa98ddefc9ba9d24cd45ca0df44d5',1,'helios::CompoundObject']]], + ['using_20beer_20s_20law_27',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['using_20blender_28',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['using_20gimp_29',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['using_20the_20boundary_20layer_20conductance_20model_20plug_20in_30',['Using the Boundary Layer Conductance Model Plug-in',['../_b_l_conductance_doc.html#BLUse',1,'']]], + ['using_20the_20clion_20ide_20with_20helios_31',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['using_20the_20documentation_32',['Using the Documentation',['../_overview.html#DocOverview',1,'']]], + ['using_20the_20energy_20balance_20model_20plug_20in_33',['Using the Energy Balance Model Plug-in',['../_energy_balance_doc.html#EBUse',1,'']]], + ['using_20the_20plug_20in_34',['Using the Plug-In',['../_voxel_intersection_doc.html#VoxelIntersectionUse',1,'']]], + ['using_20the_20radiation_20model_20plug_20in_35',['Using the Radiation Model Plug-In',['../_radiation_doc.html#RadUse',1,'']]], + ['using_20the_20solarposition_20plug_20in_36',['Using the SolarPosition Plug-in',['../_solar_position_doc.html#SolarLib',1,'']]], + ['using_20the_20stomatal_20conductance_20model_37',['Using the Stomatal Conductance Model',['../_stomatal_doc.html#StomatalUse',1,'']]], + ['using_20the_20visualizer_20plug_20in_38',['Using the Visualizer Plug-in',['../_visualizer_doc.html#UseVis',1,'']]], + ['using_20the_20visualizer_20plug_20in_39',['Visualizing Model Outputs using the Visualizer Plug-In',['../_radiation_doc.html#RadVis',1,'']]], + ['using_20the_20weber_20penn_20tree_20plug_20in_40',['Using the Weber-Penn Tree Plug-in',['../_weber_penn_doc.html#WPTreeUse',1,'']]], + ['using_20weather_20station_20radiometer_20data_41',['Calibrating the turbidity using weather station (radiometer) data',['../_solar_position_doc.html#SolarFluxTurb',1,'']]], + ['using_20windows_20subsystem_20for_20linux_20wsl_42',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]], + ['utc_5foffset_43',['UTC_offset',['../structhelios_1_1_location.html#afd6a8f1100ee868e966f191719733058',1,'helios::Location']]], + ['utility_20functions_44',['Utility functions',['../group__functions.html',1,'']]], + ['uuids_45',['Unique Universal Identifiers (UUIDs)',['../context_primitives.html#AddPatch_UUIDs',1,'']]], + ['uuids_20for_20organ_20sub_20components_46',['Getting Primitive UUIDs for Organ Sub-Components',['../_plant_architecture_doc.html#PlantArchQueryUUIDs',1,'']]], + ['uuids_20for_20primitives_47',['Retrieving UUIDs for Primitives',['../_canopy_generator_doc.html#CGenUUIDs',1,'']]], + ['uuids_20of_20model_20geometry_48',['Getting Object IDs and Primitive UUIDs of Model Geometry',['../_plant_architecture_doc.html#PlantArchQueryobjIDs',1,'']]] +]; diff --git a/doc/html/search/all_1e.js b/doc/html/search/all_1e.js new file mode 100644 index 000000000..f646c2dda --- /dev/null +++ b/doc/html/search/all_1e.js @@ -0,0 +1,54 @@ +var searchData= +[ + ['v1_203_2026_0',['Helios Documentation v1.3.26',['../index.html',1,'']]], + ['validateoutputpath_1',['validateOutputPath',['../global_8h.html#a614486c4ac0686c5b58813f03f0cedf9',1,'helios']]], + ['values_2',['Values',['../_a_p_i.html#GetPrimData',1,'Getting Primitive Data Values'],['../_canopy_generator_doc.html#CGenParameterMod',1,'Modifying Geometric Parameters from Default Values'],['../_a_p_i.html#SetPrimData',1,'Setting Primitive Data Values']]], + ['values_3',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], + ['variables_4',['Variables',['../_b_l_conductance_doc.html#BLPrimData',1,'Input Variables'],['../_energy_balance_doc.html#EBPrimData',1,'Input Variables'],['../_photosynthesis_doc.html#PhotoVars',1,'Summary of Empirical Model Independent Variables'],['../_photosynthesis_doc.html#FvCBPhotoVars',1,'Summary of FvCB Model Independent Variables']]], + ['variables_20and_20primitive_20data_5',['Variables and Primitive Data',['../_voxel_intersection_doc.html#VoxVarsAndProps',1,'']]], + ['vec2_6',['vec2',['../structhelios_1_1vec2.html',1,'helios::vec2'],['../structhelios_1_1vec2.html#a951e897069d3cc32a062667a54422882',1,'helios::vec2::vec2()'],['../structhelios_1_1vec2.html#a4b3c6f1a3d5f981fd5c0b858088462aa',1,'helios::vec2::vec2(const std::vector< float > &v)'],['../structhelios_1_1vec2.html#a61b92b2d15fa008486ca55b7baf3d8ce',1,'helios::vec2::vec2(const float v[2])'],['../structhelios_1_1vec2.html#af23055ca8145b094c275e9790c1ef8c2',1,'helios::vec2::vec2(float v0, float v1)']]], + ['vec3_7',['vec3',['../structhelios_1_1vec3.html',1,'helios::vec3'],['../structhelios_1_1vec3.html#a872ffa408ca0c7a9ae8f48bdcb1ff59f',1,'helios::vec3::vec3()'],['../structhelios_1_1vec3.html#ad72bf7ebc0bf7a337c33fd804b047f17',1,'helios::vec3::vec3(const std::vector< float > &v)'],['../structhelios_1_1vec3.html#a674873bc59af57ba7149ad5339e45266',1,'helios::vec3::vec3(const float v[3])'],['../structhelios_1_1vec3.html#a98f0ea866d759cc41f85af848bd47392',1,'helios::vec3::vec3(float v0, float v1, float v2)']]], + ['vec4_8',['vec4',['../structhelios_1_1vec4.html',1,'helios::vec4'],['../structhelios_1_1vec4.html#a94756adab8fcf1382e2bde79c00014f0',1,'helios::vec4::vec4()'],['../structhelios_1_1vec4.html#a2fbcf26c016cdceafd9f3354b430363d',1,'helios::vec4::vec4(const std::vector< float > &v)'],['../structhelios_1_1vec4.html#ab92cc5f8e93238b01c9639f011347281',1,'helios::vec4::vec4(const float v[4])'],['../structhelios_1_1vec4.html#ade4e8c762963b0ce0a195805f1ebccbd',1,'helios::vec4::vec4(float v0, float v1, float v2, float v3)']]], + ['vecmult_9',['vecmult',['../global_8h.html#ae8cc6f4a10a4efab6057ab6c4c114304',1,'helios::vecmult(const float M[16], const float v[3], float(&result)[3])'],['../global_8h.html#a40054144f951b396cd9f9ba32586862a',1,'helios::vecmult(const float M[16], const helios::vec3 &v3, helios::vec3 &result)']]], + ['vector_10',['Vector',['../context_vectors.html#Datetut',1,'Date Vector'],['../context_vectors.html#RGBtut',1,'RGB Color Vector'],['../context_vectors.html#Timetut',1,'Time Vector']]], + ['vector_20of_20floats_11',['Vector of Floats',['../context_vectors.html#vec3tut',1,'']]], + ['vector_20of_20integers_12',['Vector of Integers',['../context_vectors.html#int3tut',1,'']]], + ['vector_20types_13',['Vector Types',['../_a_p_i.html#VecTypes',1,'']]], + ['vector_20types_20tutorial_14',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]], + ['vectors_15',['Vectors',['../group__vectors.html',1,'']]], + ['vectors_16',['R-G-B(-A) color vectors',['../_a_p_i.html#RGB',1,'']]], + ['vegetative_5fbud_5fbreak_5fprobability_5fdecay_5frate_17',['vegetative_bud_break_probability_decay_rate',['../struct_shoot_parameters.html#abe60e69a5cf66199d1dfd6688e4d4ced',1,'ShootParameters::vegetative_bud_break_probability_decay_rate'],['../_plant_architecture_doc.html#ShootParam_vegetative_prob',1,'vegetative_bud_break_probability_min and vegetative_bud_break_probability_decay_rate']]], + ['vegetative_5fbud_5fbreak_5fprobability_5fmin_20and_20vegetative_5fbud_5fbreak_5fprobability_5fdecay_5frate_18',['vegetative_bud_break_probability_min and vegetative_bud_break_probability_decay_rate',['../_plant_architecture_doc.html#ShootParam_vegetative_prob',1,'']]], + ['vegetativebud_19',['VegetativeBud',['../struct_vegetative_bud.html',1,'']]], + ['version_20',['Version',['../_choosing_c_u_d_a.html#chooseCUDA',1,'CUDA Version'],['../_choosing_c_u_d_a.html#chooseOptiX',1,'OptiX Version']]], + ['version_21',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['version_20given_20in_20buckley_20turnbull_20and_20adams_202012_22',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['view_20controls_23',['View Controls',['../_visualizer_doc.html#ViewControls',1,'']]], + ['view_20options_24',['View Options',['../_visualizer_doc.html#Options',1,'']]], + ['visual_20studio_20c_20compiler_20tools_25',['Install Microsoft Visual Studio C++ compiler tools',['../_dependent_software.html#SetupPCMSVC',1,'']]], + ['visualization_26',['Visualization',['../visualizer_pdata.html#Tutorial8_vis',1,'']]], + ['visualization_20window_27',['Visualization Window',['../_visualizer_doc.html#Window',1,'']]], + ['visualizer_28',['Visualizer',['../visualizer_basics.html#vis_step2',1,'Step 2. Add geometry to the Visualizer'],['../class_visualizer.html',1,'Visualizer'],['../class_visualizer.html#a9277e99596d46d77d31a2249a1406983',1,'Visualizer::Visualizer(uint Wdisplay)'],['../class_visualizer.html#ac39e631c7d248c0e0f4f9ebba58a6dc4',1,'Visualizer::Visualizer(uint Wdisplay, uint Hdisplay)'],['../class_visualizer.html#a9c6edf93389fa78548f2024aec944b82',1,'Visualizer::Visualizer(uint Wdisplay, uint Hdisplay, int aliasing_samples, bool window_decorations)']]], + ['visualizer_20basics_29',['Tutorial 7: Visualizer Basics',['../visualizer_basics.html',1,'Tutorials']]], + ['visualizer_20class_30',['Step 1. Declare and initialize the Visualizer class',['../visualizer_basics.html#vis_step1',1,'']]], + ['visualizer_20options_31',['Step 3. Modify Visualizer options',['../visualizer_basics.html#vis_step3',1,'']]], + ['visualizer_20plug_20in_32',['Visualizer Plug In',['../_tutorials.html#VisualizerTuts',1,'Visualizer Plug-In'],['../_radiation_doc.html#RadVis',1,'Visualizing Model Outputs using the Visualizer Plug-In']]], + ['visualizer_20plug_20in_33',['Visualizer Plug in',['../_dependent_software.html#SetupLinuxVis',1,'Dependencies of the Visualizer Plug-in'],['../_visualizer_doc.html#UseVis',1,'Using the Visualizer Plug-in']]], + ['visualizer_20plugin_20documentation_34',['Visualizer Plugin Documentation',['../_visualizer_doc.html',1,'PlugIns']]], + ['visualizer_2ecpp_35',['Visualizer.cpp',['../_visualizer_8cpp.html',1,'']]], + ['visualizer_2eh_36',['Visualizer.h',['../_visualizer_8h.html',1,'']]], + ['visualizing_20model_20outputs_20using_20the_20visualizer_20plug_20in_37',['Visualizing Model Outputs using the Visualizer Plug-In',['../_radiation_doc.html#RadVis',1,'']]], + ['visualizing_20primitive_20data_20values_38',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], + ['visualizing_20results_39',['Visualizing results',['../_li_d_a_r_doc.html#LiDARvis',1,'']]], + ['von_20caemmerer_20berry_20model_20description_40',['Farquhar, von Caemmerer, Berry Model Description',['../_photosynthesis_doc.html#FarquharDescription',1,'']]], + ['voxel_20intersection_20plugin_20documentation_41',['Voxel Intersection Plugin Documentation',['../_voxel_intersection_doc.html',1,'PlugIns']]], + ['voxel_5fbounds_42',['voxel_bounds',['../primitive_intersection_8cu.html#a904cdd1733732aa1a8dbaf2e958176a9',1,'primitiveIntersection.cu']]], + ['voxel_5fintersect_43',['voxel_intersect',['../primitive_intersection_8cu.html#ac0a2a895d2e98227a3905e56939228fe',1,'primitiveIntersection.cu']]], + ['voxelintersection_44',['VoxelIntersection',['../class_voxel_intersection.html',1,'VoxelIntersection'],['../class_voxel_intersection.html#a45bf9a3a44c9373452753480c8e47c72',1,'VoxelIntersection::VoxelIntersection()']]], + ['voxelintersection_2ecpp_45',['VoxelIntersection.cpp',['../_voxel_intersection_8cpp.html',1,'']]], + ['voxelintersection_2ecu_46',['VoxelIntersection.cu',['../_voxel_intersection_8cu.html',1,'']]], + ['voxelintersection_2eh_47',['VoxelIntersection.h',['../_voxel_intersection_8h.html',1,'']]], + ['voxels_48',['Adding Voxels',['../_a_p_i.html#AddingVoxel',1,'']]], + ['vsp_20trellis_49',['VSP Trellis',['../_canopy_generator_doc.html#CGenUnilateral',1,'Grapevine Canopy with a Unilateral VSP Trellis'],['../_canopy_generator_doc.html#CGenVSP',1,'Grapevine Canopy with VSP Trellis']]], + ['vspgrapevineparameters_50',['VSPGrapevineParameters',['../struct_v_s_p_grapevine_parameters.html',1,'VSPGrapevineParameters'],['../struct_v_s_p_grapevine_parameters.html#af61690f86b14f0f6852e2c43b5549217',1,'VSPGrapevineParameters::VSPGrapevineParameters()'],['../struct_v_s_p_grapevine_parameters.html#a07cb2adfeec316d0cf5ce9ffb2266dc2',1,'VSPGrapevineParameters::VSPGrapevineParameters(const pugi::xml_node canopy_node)']]] +]; diff --git a/doc/html/search/all_1f.js b/doc/html/search/all_1f.js new file mode 100644 index 000000000..da5459aaa --- /dev/null +++ b/doc/html/search/all_1f.js @@ -0,0 +1,77 @@ +var searchData= +[ + ['w_0',['w',['../structhelios_1_1int4.html#a997159b161576d521fdad7e2d5e3786f',1,'helios::int4::w'],['../structhelios_1_1vec4.html#a5d4e8add341c4076176aac3574fe0937',1,'helios::vec4::w']]], + ['wait_1',['wait',['../group__functions.html#gad28da0b06687dc68c1212c1624e54bd0',1,'helios']]], + ['walnut_2',['walnut',['../class_canopy_generator.html#af8b7088179f65a2d3d05a1f21207dd54',1,'CanopyGenerator']]], + ['walnut_20canopy_3',['Walnut Canopy',['../_canopy_generator_doc.html#CGenWalnut',1,'']]], + ['walnutcanopyparameters_4',['WalnutCanopyParameters',['../struct_walnut_canopy_parameters.html',1,'WalnutCanopyParameters'],['../struct_walnut_canopy_parameters.html#a3e9529efe557947137c49fefa450bb85',1,'WalnutCanopyParameters::WalnutCanopyParameters()'],['../struct_walnut_canopy_parameters.html#ac233d993d5d15fd3fff46245a0365b93',1,'WalnutCanopyParameters::WalnutCanopyParameters(const pugi::xml_node canopy_node)']]], + ['wave_5famplitude_5',['wave_amplitude',['../struct_leaf_prototype.html#ab86a62f2f03c638481bfdd28997c74d1',1,'LeafPrototype']]], + ['wave_5fperiod_6',['wave_period',['../struct_leaf_prototype.html#aa62b74d58f6a490473f3e30c5e5aa01a',1,'LeafPrototype']]], + ['wavebandbounds_7',['wavebandBounds',['../struct_radiation_band.html#a11a0c1b2fe1f6be6efb8052fa247b396',1,'RadiationBand']]], + ['waveform_20data_8',['Synthetic waveform data',['../_li_d_a_r_doc.html#LiDARsynthwaveform',1,'']]], + ['waveform_20lidar_20data_9',['waveform LiDAR data',['../_aerial_li_d_a_r_doc.html#AerialLiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#LiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data']]], + ['wavefront_20files_10',['Wavefront Files',['../_i_o.html#OBJread',1,'Reading OBJ (Wavefront) Files'],['../_i_o.html#OBJwrite',1,'Writing OBJ (Wavefront) Files']]], + ['wavelength_20bands_11',['Defining Wavelength Bands',['../_radiation_doc.html#RadBands',1,'']]], + ['weather_20data_20from_20tabular_20text_20files_12',['Adding Timeseries (Weather) Data from Tabular Text Files',['../_i_o.html#ASCIItimeseries',1,'']]], + ['weather_20inputs_13',['Data Timeseries (Weather Inputs)',['../_a_p_i.html#DataTimeseries',1,'']]], + ['weather_20station_20radiometer_20data_14',['Calibrating the turbidity using weather station (radiometer) data',['../_solar_position_doc.html#SolarFluxTurb',1,'']]], + ['weber_20penn_20tree_20plug_20in_15',['Using the Weber-Penn Tree Plug-in',['../_weber_penn_doc.html#WPTreeUse',1,'']]], + ['weber_20penn_20tree_20plugin_20documentation_16',['Weber-Penn Tree Plugin Documentation',['../_weber_penn_doc.html',1,'PlugIns']]], + ['weberpenntree_17',['WeberPennTree',['../class_weber_penn_tree.html',1,'WeberPennTree'],['../class_weber_penn_tree.html#a5b949a2008b9e4817f2df4b5861c49b5',1,'WeberPennTree::WeberPennTree()']]], + ['weberpenntree_20class_20constructor_18',['WeberPennTree Class Constructor',['../_weber_penn_doc.html#WPTConstructor',1,'']]], + ['weberpenntree_2ecpp_19',['WeberPennTree.cpp',['../_weber_penn_tree_8cpp.html',1,'']]], + ['weberpenntree_2eh_20',['WeberPennTree.h',['../_weber_penn_tree_8h.html',1,'']]], + ['weberpenntreeparameters_21',['WeberPennTreeParameters',['../struct_weber_penn_tree_parameters.html',1,'']]], + ['what_20is_20an_20api_22',['What is an API?',['../_overview.html#whatisAPI',1,'']]], + ['which_20platform_20to_20use_20for_20helios_20programming_23',['Which platform to use for Helios programming?',['../_dependent_software.html#WhichPlatform',1,'']]], + ['whitespruce_24',['whitespruce',['../class_canopy_generator.html#a00d9f2222a38ef4a8494aef9650d11f3',1,'CanopyGenerator']]], + ['whitesprucecanopyparameters_25',['WhiteSpruceCanopyParameters',['../struct_white_spruce_canopy_parameters.html',1,'WhiteSpruceCanopyParameters'],['../struct_white_spruce_canopy_parameters.html#abab47c6661e734271286dbe4808f484b',1,'WhiteSpruceCanopyParameters::WhiteSpruceCanopyParameters()'],['../struct_white_spruce_canopy_parameters.html#a5b11a0899997319c0371c0bc89330f05',1,'WhiteSpruceCanopyParameters::WhiteSpruceCanopyParameters(const pugi::xml_node canopy_node)']]], + ['window_26',['Visualization Window',['../_visualizer_doc.html#Window',1,'']]], + ['window_20background_27',['Window background',['../_visualizer_doc.html#Background',1,'']]], + ['windows_20pc_28',['Set-up on Windows PC',['../_dependent_software.html#SetupPC',1,'']]], + ['windows_20subsystem_20for_20linux_20wsl_29',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]], + ['with_20a_20goblet_20trellis_30',['Grapevine Canopy with a Goblet Trellis',['../_canopy_generator_doc.html#CGenGoblet',1,'']]], + ['with_20a_20split_20trellis_31',['Grapevine Canopy with a Split Trellis',['../_canopy_generator_doc.html#CGenSplit',1,'']]], + ['with_20a_20unilateral_20vsp_20trellis_32',['Grapevine Canopy with a Unilateral VSP Trellis',['../_canopy_generator_doc.html#CGenUnilateral',1,'']]], + ['with_20context_20data_33',['Working with Context Data',['../_tutorials.html#PrimDataTut',1,'']]], + ['with_20context_20geometry_34',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['with_20default_20parameters_35',['Loading a Plant from the Library with Default Parameters',['../_plant_architecture_doc.html#PlantArchBuild_default',1,'']]], + ['with_20heat_20storage_36',['Unsteady model with heat storage',['../_energy_balance_doc.html#EBRunUS',1,'']]], + ['with_20helios_37',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['with_20the_20existing_20plant_20library_38',['Getting Started with the Existing Plant Library',['../_plant_architecture_doc.html#PlantArchGettingStarted',1,'']]], + ['with_20the_20solarposition_20plug_20in_39',['Integrating with the SolarPosition Plug-in',['../_radiation_doc.html#RadSolar',1,'']]], + ['with_20transparency_20using_20gimp_40',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['with_20vsp_20trellis_41',['Grapevine Canopy with VSP Trellis',['../_canopy_generator_doc.html#CGenVSP',1,'']]], + ['wood_5fsubdivisions_42',['wood_subdivisions',['../struct_base_grape_vine_parameters.html#a49d391b42c6aafd088bb89f29a3f8d5e',1,'BaseGrapeVineParameters::wood_subdivisions'],['../struct_white_spruce_canopy_parameters.html#a57cc0a77f816bddab4701f2777c13317',1,'WhiteSpruceCanopyParameters::wood_subdivisions'],['../struct_walnut_canopy_parameters.html#a1c61b154388db34cd6cff475de3e2dd7',1,'WalnutCanopyParameters::wood_subdivisions']]], + ['wood_5fsubdivisions_5fspread_43',['wood_subdivisions_spread',['../struct_base_grape_vine_parameters.html#a7d1ef566d2bdbd0495f95bc6b1938e17',1,'BaseGrapeVineParameters']]], + ['wood_5ftexture_5ffile_44',['wood_texture_file',['../struct_base_grape_vine_parameters.html#ae28d9e75240a23e0c534af9b884ce41d',1,'BaseGrapeVineParameters::wood_texture_file'],['../struct_white_spruce_canopy_parameters.html#a3062fb397f90b7f5d29faf21794a04aa',1,'WhiteSpruceCanopyParameters::wood_texture_file'],['../struct_walnut_canopy_parameters.html#aaa467205c3f449a3b11bd4fe19c4716e',1,'WalnutCanopyParameters::wood_texture_file']]], + ['woodrow_20berry_201987_20model_20theory_45',['Ball, Woodrow, Berry (1987) Model Theory',['../_stomatal_doc.html#BWBTheory',1,'']]], + ['working_20with_20context_20data_46',['Working with Context Data',['../_tutorials.html#PrimDataTut',1,'']]], + ['working_20with_20context_20geometry_47',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['write_5fjpeg_5ffile_48',['write_JPEG_file',['../_visualizer_8h.html#aa1897ed232569d651810d146af02d878',1,'write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages=true): Visualizer.cpp'],['../_visualizer_8h.html#a76a6dfb6593ca66bbd332f6ad6f6a1ea',1,'write_JPEG_file(const char *filename, const uint width, const uint height, const std::vector< helios::RGBcolor > &data, bool print_messages=true): Visualizer.h'],['../_visualizer_8cpp.html#a72ab446b93211938da98a8eec0c5d33a',1,'write_JPEG_file(const char *filename, uint width, uint height, void *_window, bool print_messages): Visualizer.cpp']]], + ['writecalibratedcameraresponses_49',['writeCalibratedCameraResponses',['../struct_camera_calibration.html#a148bdc83d9f7a3d564a3aa10793a5d70',1,'CameraCalibration']]], + ['writecameraimage_50',['writeCameraImage',['../class_radiation_model.html#aa30ec7ec3b6c3b109e9a9544b890e8de',1,'RadiationModel']]], + ['writecameraimagedata_51',['writeCameraImageData',['../class_radiation_model.html#a546c959be8d158f17ab1cb9ada0ebe6d',1,'RadiationModel']]], + ['writedepthimagedata_52',['writeDepthImageData',['../class_radiation_model.html#ad495efb7a88df316cc8117e1d181d104',1,'RadiationModel']]], + ['writeimageboundingboxes_53',['writeImageBoundingBoxes',['../class_radiation_model.html#a59db63fb5cf7d82ab641f636378923fd',1,'RadiationModel']]], + ['writeimageboundingboxes_5fobjectdata_54',['writeImageBoundingBoxes_ObjectData',['../class_radiation_model.html#ac78340f2c7f5cf9089e26d15ea5dc41b',1,'RadiationModel']]], + ['writejpeg_55',['writeJPEG',['../global_8h.html#a95600894b45bcc627d66c3dd8c202cd8',1,'helios']]], + ['writenormcameraimage_56',['writeNormCameraImage',['../class_radiation_model.html#a61abdff90fd75f3ebebc6b8f189cdac9',1,'RadiationModel']]], + ['writenormdepthimage_57',['writeNormDepthImage',['../class_radiation_model.html#a633d84a823ad4cd99495a06afc13d7a3',1,'RadiationModel']]], + ['writeobj_58',['writeOBJ',['../classhelios_1_1_context.html#a8249b03fa781c9382863b7cf2caf0dd8',1,'helios::Context::writeOBJ(const std::string &filename) const'],['../classhelios_1_1_context.html#a8a5040ff4aaa061eddabe881ac668a01',1,'helios::Context::writeOBJ(const std::string &filename, const std::vector< uint > &UUIDs) const'],['../classhelios_1_1_context.html#ae976f6626930c925c8fdacb543e1e923',1,'helios::Context::writeOBJ(const std::string &filename, const std::vector< uint > &UUIDs, const std::vector< std::string > &primitive_dat_fields) const']]], + ['writeobjectdatalabelmap_59',['writeObjectDataLabelMap',['../class_radiation_model.html#afdbe940b3c4ae5855a0fcbe5b0b7f708',1,'RadiationModel']]], + ['writeply_60',['writePLY',['../classhelios_1_1_context.html#aa47b8b6f8cefb3c9d55a3cda10d851d7',1,'helios::Context']]], + ['writepng_61',['writePNG',['../global_8h.html#afc2520441ef9a290c5221dd892ea9f01',1,'helios']]], + ['writeprimitivedata_62',['writePrimitiveData',['../classhelios_1_1_context.html#ab643fc787ea7b1a215605c369f446844',1,'helios::Context::writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, bool print_header=false) const'],['../classhelios_1_1_context.html#a97378b12bfaf42c2052960c54ff096d4',1,'helios::Context::writePrimitiveData(std::string filename, const std::vector< std::string > &column_format, const std::vector< uint > &UUIDs, bool print_header=false) const']]], + ['writeprimitivedatalabelmap_63',['writePrimitiveDataLabelMap',['../class_radiation_model.html#a771c53fe19d75303c3f60017db8a2b50',1,'RadiationModel']]], + ['writespectralxmlfile_64',['writeSpectralXMLfile',['../struct_camera_calibration.html#a96b8a246adb36d20a09e3d527be9de25',1,'CameraCalibration']]], + ['writexml_65',['writeXML',['../classhelios_1_1_context.html#abfcac5a56c13e86298609ed3fccf354d',1,'helios::Context::writeXML(const char *filename, bool quiet=false) const'],['../classhelios_1_1_context.html#a499545512efe3645e2085e4815dcb94e',1,'helios::Context::writeXML(const char *filename, const std::vector< uint > &UUIDs, bool quiet=false) const']]], + ['writexml_5fbyobject_66',['writeXML_byobject',['../classhelios_1_1_context.html#ae2ada2bfdce5226cd970a6e6fa0ccc88',1,'helios::Context']]], + ['writing_20camera_20images_20to_20file_67',['Writing Camera Images to File',['../_radiation_doc.html#RadCamOut',1,'']]], + ['writing_20documentation_68',['Writing Documentation',['../_plugins.html#PluginWriting',1,'']]], + ['writing_20obj_20wavefront_20files_69',['Writing OBJ (Wavefront) Files',['../_i_o.html#OBJwrite',1,'']]], + ['writing_20plugins_70',['Writing Plugins',['../_plugins.html',1,'']]], + ['writing_20ply_20stanford_20polygon_20files_71',['Writing PLY (Stanford Polygon) Files',['../_i_o.html#PLYwrite',1,'']]], + ['writing_20results_20to_20file_72',['Writing results to file',['../_li_d_a_r_doc.html#LiDARoutput',1,'']]], + ['wsl_73',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]] +]; diff --git a/doc/html/search/all_2.js b/doc/html/search/all_2.js index f265b2921..b986ccdab 100644 --- a/doc/html/search/all_2.js +++ b/doc/html/search/all_2.js @@ -1,37 +1,15 @@ var searchData= [ - ['b_0',['b',['../structhelios_1_1_r_g_bcolor.html#a1b3ba3f5b77ef3082088eff853d4c335',1,'helios::RGBcolor::b()'],['../structhelios_1_1_r_g_b_acolor.html#aaa86bd3e17f03ffdc182c5c9b67587e3',1,'helios::RGBAcolor::b()']]], - ['base_5fheight_1',['base_height',['../struct_white_spruce_canopy_parameters.html#a6f6626318bb82788ba433efecde7830c',1,'WhiteSpruceCanopyParameters']]], - ['basecanopyparameters_2',['BaseCanopyParameters',['../struct_base_canopy_parameters.html',1,'BaseCanopyParameters'],['../struct_base_canopy_parameters.html#a164f6d2b463a7ff7bf58551f1295e1f5',1,'BaseCanopyParameters::BaseCanopyParameters()'],['../struct_base_canopy_parameters.html#a22b341ef9edf0edcd95030aec4bf0a3a',1,'BaseCanopyParameters::BaseCanopyParameters(const pugi::xml_node canopy_node)']]], - ['basegrapevineparameters_3',['BaseGrapeVineParameters',['../struct_base_grape_vine_parameters.html',1,'BaseGrapeVineParameters'],['../struct_base_grape_vine_parameters.html#a422125376a63e56695eb9f58581217b0',1,'BaseGrapeVineParameters::BaseGrapeVineParameters()'],['../struct_base_grape_vine_parameters.html#a7f439fd0f30ce24900ae9a299e28aa3c',1,'BaseGrapeVineParameters::BaseGrapeVineParameters(const pugi::xml_node canopy_node)']]], - ['bbcoefficients_4',['BBcoefficients',['../struct_b_bcoefficients.html',1,'']]], - ['bblcoefficients_5',['BBLcoefficients',['../struct_b_b_lcoefficients.html',1,'']]], - ['bbox_5fbounds_6',['bbox_bounds',['../primitive_intersection_8cu.html#a463610deabc8971f8d92607f462e28f3',1,'primitiveIntersection.cu']]], - ['bbox_5fintersect_7',['bbox_intersect',['../primitive_intersection_8cu.html#a4b1369e96290adffabbbcc86b92d8560',1,'primitiveIntersection.cu']]], - ['beamdivergence_8',['beamDivergence',['../struct_aerial_scan_metadata.html#a8572a62a5c28d56c69e55737272d07b4',1,'AerialScanMetadata::beamDivergence()'],['../struct_scan_metadata.html#acec69b1556a96236c0702f03b231d008',1,'ScanMetadata::beamDivergence()']]], - ['bean_9',['bean',['../class_canopy_generator.html#ad23ee37e5873fe542f6fc799f541384f',1,'CanopyGenerator']]], - ['beanparameters_10',['BeanParameters',['../struct_bean_parameters.html',1,'BeanParameters'],['../struct_bean_parameters.html#a2fdf7cbadfebd5c8494ad9bbdb0e8bf5',1,'BeanParameters::BeanParameters()'],['../struct_bean_parameters.html#a901e474f4df9ef7639832c9359e21e0a',1,'BeanParameters::BeanParameters(const pugi::xml_node canopy_node)']]], - ['blconductancemodel_11',['BLConductanceModel',['../class_b_l_conductance_model.html',1,'BLConductanceModel'],['../class_b_l_conductance_model.html#af507e5b75f21372ec225d5e5c0c8c97a',1,'BLConductanceModel::BLConductanceModel()']]], - ['blend_12',['blend',['../global_8h.html#a06a8d8b0bee35e1fd8c564a7674bd07a',1,'helios::blend(const RGBAcolor &color0, const RGBAcolor &color1, float weight)'],['../global_8h.html#a192c018f83c0598738e048212904202d',1,'helios::blend(const RGBcolor &color0, const RGBcolor &color1, float weight)']]], - ['blendspectra_13',['blendSpectra',['../class_radiation_model.html#a43a328dde4dd5f1a431afe9dc5e8664e',1,'RadiationModel']]], - ['blendspectrarandomly_14',['blendSpectraRandomly',['../class_radiation_model.html#a3f52651f2144aaca702824028964a076',1,'RadiationModel']]], - ['bmfcoefficients_15',['BMFcoefficients',['../struct_b_m_fcoefficients.html',1,'']]], - ['boundary_2dlayer_20conductance_20model_20plugin_20documentation_16',['Boundary-Layer Conductance Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'PlugIns']]], - ['boundarylayerconductancemodel_2ecpp_17',['BoundaryLayerConductanceModel.cpp',['../_boundary_layer_conductance_model_8cpp.html',1,'']]], - ['boundarylayerconductancemodel_2eh_18',['BoundaryLayerConductanceModel.h',['../_boundary_layer_conductance_model_8h.html',1,'']]], - ['box_19',['Box',['../classhelios_1_1_box.html#ab93cb2d8f6948617f67d236d85b3682a',1,'helios::Box::Box()'],['../classhelios_1_1_box.html',1,'helios::Box']]], - ['branch_5flength_20',['branch_length',['../struct_walnut_canopy_parameters.html#aabf3f873a3ed1d5850b7697b297ae295',1,'WalnutCanopyParameters']]], - ['branches_5fper_5flevel_21',['branches_per_level',['../struct_white_spruce_canopy_parameters.html#afa54ff0b14e18e615a40ed80386491dc',1,'WhiteSpruceCanopyParameters']]], - ['buffer_22',['buffer',['../struct_homogeneous_canopy_parameters.html#a1b6de173fb1f5e71f4d8e7ff9ae99881',1,'HomogeneousCanopyParameters']]], - ['build_5fpetiolule_23',['build_petiolule',['../struct_leaf_prototype.html#a97e0456a85a039b8c7c318a0cd57663e',1,'LeafPrototype']]], - ['buildcanopies_24',['buildCanopies',['../class_canopy_generator.html#a7f9ffbcc969d0f50ed12c3de9b3d3b2a',1,'CanopyGenerator']]], - ['buildcanopy_25',['buildCanopy',['../struct_base_grape_vine_parameters.html#a8251daae21fcd0cfccffab9f23812c18',1,'BaseGrapeVineParameters::buildCanopy()'],['../struct_v_s_p_grapevine_parameters.html#ae045693dbcb6e4935b292b226b6d98d6',1,'VSPGrapevineParameters::buildCanopy()'],['../struct_split_grapevine_parameters.html#a0e1bad7d21a9d1e2f2be2fc9b1a4a135',1,'SplitGrapevineParameters::buildCanopy()'],['../struct_unilateral_grapevine_parameters.html#a84f41cb676c8614d336ed930457eaee1',1,'UnilateralGrapevineParameters::buildCanopy()'],['../struct_goblet_grapevine_parameters.html#a462a7445a2ceb304db57c507a5a0e9b7',1,'GobletGrapevineParameters::buildCanopy()'],['../struct_white_spruce_canopy_parameters.html#a2ee193c4c845ce721cb30d9fc473beb2',1,'WhiteSpruceCanopyParameters::buildCanopy()'],['../struct_tomato_parameters.html#adc34c3b3dcb59f81fb3d0f21059e8b9a',1,'TomatoParameters::buildCanopy()'],['../struct_strawberry_parameters.html#a9487c5f22f2dc3dce45a853c6c88c553',1,'StrawberryParameters::buildCanopy()'],['../struct_walnut_canopy_parameters.html#ad0cb95df36b8fea5edd3f5c3b801999a',1,'WalnutCanopyParameters::buildCanopy()'],['../struct_conical_crowns_canopy_parameters.html#a71bba52f726b16ac52e3d44c41cc7b03',1,'ConicalCrownsCanopyParameters::buildCanopy()'],['../struct_bean_parameters.html#ab9c791e070fc12c5ddb185de38a96097',1,'BeanParameters::buildCanopy()'],['../class_canopy_generator.html#a1c7efa40c83c82ec081a7723c9c9ed98',1,'CanopyGenerator::buildCanopy(const HomogeneousCanopyParameters &params)'],['../class_canopy_generator.html#a19bdddcfb98212395400598df88f04e1',1,'CanopyGenerator::buildCanopy(const SphericalCrownsCanopyParameters &params)'],['../class_canopy_generator.html#ac0a75c0d86d884a5bf5f618e55814ea1',1,'CanopyGenerator::buildCanopy(const ConicalCrownsCanopyParameters &params)'],['../class_canopy_generator.html#a65a8e9f3edd2d73423cab95ec218a524',1,'CanopyGenerator::buildCanopy(const VSPGrapevineParameters &params)'],['../class_canopy_generator.html#aa2a653e079dccfa1ee9849ef1fb83a51',1,'CanopyGenerator::buildCanopy(const SplitGrapevineParameters &params)'],['../class_canopy_generator.html#a50fac34470e512a92504c91128d1a437',1,'CanopyGenerator::buildCanopy(const UnilateralGrapevineParameters &params)'],['../class_canopy_generator.html#a4ac7daae385ca391c756f8c46e7c1b6d',1,'CanopyGenerator::buildCanopy(const GobletGrapevineParameters &params)'],['../class_canopy_generator.html#a589132c50598208a158c21298f11a56c',1,'CanopyGenerator::buildCanopy(const WhiteSpruceCanopyParameters &params)'],['../class_canopy_generator.html#abc8543a9998fa835990580e7e7ded1c0',1,'CanopyGenerator::buildCanopy(const TomatoParameters &params)'],['../class_canopy_generator.html#a75022ad53ae8b8a1f631e6e876ee1bea',1,'CanopyGenerator::buildCanopy(const StrawberryParameters &params)'],['../class_canopy_generator.html#a5a80279ea1b73ab9c493b8f7819aa50d',1,'CanopyGenerator::buildCanopy(const WalnutCanopyParameters &params)'],['../class_canopy_generator.html#a49c39faf194a1c84891001eac5074374',1,'CanopyGenerator::buildCanopy(const SorghumCanopyParameters &params)'],['../class_canopy_generator.html#adee8550880aaf26ebe1d46cdfcf4e06f',1,'CanopyGenerator::buildCanopy(const BeanParameters &params)'],['../struct_base_canopy_parameters.html#a741a7c822b8f84d8f658cebd54e23eed',1,'BaseCanopyParameters::buildCanopy()'],['../struct_homogeneous_canopy_parameters.html#a45be1a4822a85324643eee2612dda1b5',1,'HomogeneousCanopyParameters::buildCanopy()'],['../struct_spherical_crowns_canopy_parameters.html#ae1670d0366828f06f04936530e94af89',1,'SphericalCrownsCanopyParameters::buildCanopy()'],['../struct_sorghum_canopy_parameters.html#ae21bba784a6af20966ba7a87e9c283dc',1,'SorghumCanopyParameters::buildCanopy()']]], - ['buildcontextgeometry_26',['buildContextGeometry',['../class_visualizer.html#ada78ef51373f63718a95841f564a83ef',1,'Visualizer::buildContextGeometry(helios::Context *context_ptr, const std::vector< uint > &UUIDs)'],['../class_visualizer.html#a4834cddbcc01696bf0b1ef1b0a2cde0c',1,'Visualizer::buildContextGeometry(helios::Context *context_ptr)']]], - ['buildground_27',['buildGround',['../class_canopy_generator.html#a5933faa26fa34d44a52ba969d939818b',1,'CanopyGenerator::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)'],['../class_canopy_generator.html#ab2069cca4af62c08bdf867a91aacf595',1,'CanopyGenerator::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)']]], - ['buildindividualplants_28',['buildIndividualPlants',['../class_canopy_generator.html#a5a4d5cac8dff6a4b9a3d80dd87501b55',1,'CanopyGenerator::buildIndividualPlants(helios::vec3 position)'],['../class_canopy_generator.html#ad55b3c912c7256b895b55c4dae4c2a5d',1,'CanopyGenerator::buildIndividualPlants()']]], - ['buildplant_29',['buildPlant',['../struct_base_canopy_parameters.html#afcbe470fe8e3e7106f0da0a93e540cce',1,'BaseCanopyParameters::buildPlant()'],['../struct_homogeneous_canopy_parameters.html#a4204162f4c57227e9328b8fcff59cb4d',1,'HomogeneousCanopyParameters::buildPlant()'],['../struct_spherical_crowns_canopy_parameters.html#af127df26f4a93e6422e23720f5b0a136',1,'SphericalCrownsCanopyParameters::buildPlant()'],['../struct_conical_crowns_canopy_parameters.html#adabbdff81275869121f3308bf31aa4cc',1,'ConicalCrownsCanopyParameters::buildPlant()'],['../struct_base_grape_vine_parameters.html#a7577cb650adee17f4343f30af8e3179d',1,'BaseGrapeVineParameters::buildPlant()'],['../struct_v_s_p_grapevine_parameters.html#a8c7d85f23ca257d820f7c28f6d6d4deb',1,'VSPGrapevineParameters::buildPlant()'],['../struct_split_grapevine_parameters.html#a6116fc97e1f19bcdb9b0c49714413c1c',1,'SplitGrapevineParameters::buildPlant()'],['../struct_unilateral_grapevine_parameters.html#a4141eeadb3aa3269b739a08965ffa676',1,'UnilateralGrapevineParameters::buildPlant()'],['../struct_goblet_grapevine_parameters.html#a410a1bc232e9c55829ef493096e387f3',1,'GobletGrapevineParameters::buildPlant()'],['../struct_white_spruce_canopy_parameters.html#ab5cbed92a2f2de16b9c5ff1b559a2f55',1,'WhiteSpruceCanopyParameters::buildPlant()'],['../struct_tomato_parameters.html#a0915f161732f561e479d9eea9a375254',1,'TomatoParameters::buildPlant()'],['../struct_strawberry_parameters.html#a739703fbc934574475585466357292a3',1,'StrawberryParameters::buildPlant()'],['../struct_walnut_canopy_parameters.html#a3f356a99983d3540171519f42e270808',1,'WalnutCanopyParameters::buildPlant()'],['../struct_sorghum_canopy_parameters.html#a1139c684da4cde5c7b34500da0e87bb5',1,'SorghumCanopyParameters::buildPlant()'],['../struct_bean_parameters.html#a8be910632031fbec98a6185a0aab6efb',1,'BeanParameters::buildPlant()']]], - ['buildplantcanopyfromlibrary_30',['buildPlantCanopyFromLibrary',['../class_plant_architecture.html#a9cc3b3b4f6e37fa416c139f6bf1618bd',1,'PlantArchitecture']]], - ['buildplantinstancefromlibrary_31',['buildPlantInstanceFromLibrary',['../class_plant_architecture.html#ab98a62363a5e4553c5052a23e39711ba',1,'PlantArchitecture']]], - ['buildtree_32',['buildTree',['../class_weber_penn_tree.html#a49f706c54cbf91ea5c40fb247d4e3559',1,'WeberPennTree::buildTree(const char *treename, helios::vec3 origin)'],['../class_weber_penn_tree.html#af1dc9499df0c1cc26f3d0c5782da10bd',1,'WeberPennTree::buildTree(const char *treename, helios::vec3 origin, float scale)']]], - ['bwbcoefficients_33',['BWBcoefficients',['../struct_b_w_bcoefficients.html',1,'']]] + ['2_20add_20geometry_20to_20the_20visualizer_0',['Step 2. Add geometry to the Visualizer',['../visualizer_basics.html#vis_step2',1,'']]], + ['2_20laminar_20inclined_20plate_20mixed_20free_20forced_20convection_1',['2. Laminar Inclined Plate, Mixed Free-Forced Convection',['../_b_l_conductance_doc.html#BLC2',1,'']]], + ['2_20radiation_20model_20set_20up_2',['2. Radiation model set-up',['../radiation_basics.html#Tutorial10_rad',1,'']]], + ['2_20rotating_20and_20cropping_20optional_3',['2. Rotating and cropping (OPTIONAL)',['../_making_masks.html#Two',1,'']]], + ['2_20slicing_20and_20cropping_20primitives_20on_20the_20boundaries_4',['2. Slicing and cropping primitives on the boundaries',['../radiation__beers_law.html#tutorial11_slice',1,'']]], + ['2003_20model_20simplified_20version_20given_20in_20buckley_20turnbull_20and_20adams_202012_5',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['2011_20optimality_20based_20model_6',['Medlyn et al. (2011) Optimality-Based Model',['../_stomatal_doc.html#MoptTheory',1,'']]], + ['2012_7',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['26_8',['Helios Documentation v1.3.26',['../index.html',1,'']]], + ['2_3a_20working_20with_20context_20geometry_9',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['2d_20raster_20ground_20cover_20fraction_10',['2D raster ground cover fraction',['../_aerial_li_d_a_r_doc.html#AerialGroundCover',1,'']]], + ['2d_20raster_20height_20maps_11',['2D raster height maps',['../_aerial_li_d_a_r_doc.html#AerialRasters',1,'']]] ]; diff --git a/doc/html/search/all_20.js b/doc/html/search/all_20.js new file mode 100644 index 000000000..312cd3ed6 --- /dev/null +++ b/doc/html/search/all_20.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['x_0',['x',['../structhelios_1_1int2.html#ae14968ab74816df03efc977bb5d7b9c7',1,'helios::int2::x'],['../structhelios_1_1int3.html#a1ce8c8391637ea6e33bb30b1d0adfc50',1,'helios::int3::x'],['../structhelios_1_1int4.html#a1ac3b0b91901dc1d1497267bd3f3b4c3',1,'helios::int4::x'],['../structhelios_1_1vec2.html#a8dda241c2560b203a3b0a479d1c9e12e',1,'helios::vec2::x'],['../structhelios_1_1vec3.html#a80003da235393c031b8561e678a184a1',1,'helios::vec3::x'],['../structhelios_1_1vec4.html#a96036e1d3ac15f03190a7bbf74ce0d73',1,'helios::vec4::x']]], + ['xml_20file_20format_1',['Exporting Project to XML File Format',['../_i_o.html#Export',1,'']]], + ['xml_20file_20structure_2',['XML File Structure',['../_i_o.html#XMLstructure',1,'']]], + ['xml_20files_3',['XML Files',['../_weber_penn_doc.html#WPTreeXML',1,'Creating Custom XML Files'],['../_i_o.html#XMLread',1,'Reading XML Files']]], + ['xml_20parameter_20file_4',['XML parameter file',['../_li_d_a_r_doc.html#LiDARsynthxml',1,'']]], + ['xml_20tree_20library_20file_5',['The XML Tree Library File',['../_weber_penn_doc.html#WPTLibrary',1,'']]], + ['xmlloadfloat_6',['XMLloadfloat',['../global_8h.html#a74ae3a9e16e2ca39dab735a1ac97a506',1,'helios']]], + ['xmlloadint_7',['XMLloadint',['../global_8h.html#a4b756357236942bec6cc7f853aa77fc5',1,'helios']]], + ['xmlloadint2_8',['XMLloadint2',['../global_8h.html#ae55d4cef14213f642705952dc1ad4659',1,'helios']]], + ['xmlloadint3_9',['XMLloadint3',['../global_8h.html#ae4661a50a9f13eb6fb645e9f767b51a2',1,'helios']]], + ['xmlloadint4_10',['XMLloadint4',['../global_8h.html#a08c21d08fc1e1dd07ff612f8b503e295',1,'helios']]], + ['xmlloadrgb_11',['XMLloadrgb',['../global_8h.html#acb80e4e13497682968468c596a9b3690',1,'helios']]], + ['xmlloadrgba_12',['XMLloadrgba',['../global_8h.html#a148e80cd6b8477c0704e642243ab2547',1,'helios']]], + ['xmlloadstring_13',['XMLloadstring',['../global_8h.html#a8240b43ac3ce36bc7a4d52128bc9fda3',1,'helios']]], + ['xmlloadvec2_14',['XMLloadvec2',['../global_8h.html#a1f3041e69cbe61a909866a24c8d77457',1,'helios']]], + ['xmlloadvec3_15',['XMLloadvec3',['../global_8h.html#aa4c58cabe7bc5244435613ffdb00cf34',1,'helios']]], + ['xmlloadvec4_16',['XMLloadvec4',['../global_8h.html#a928c91522128145370150652ca59f3af',1,'helios']]], + ['xmlparser_17',['XMLparser',['../classhelios_1_1_x_m_lparser.html',1,'helios']]], + ['xyzfilter_18',['xyzFilter',['../class_li_d_a_rcloud.html#ac17ca020e2f2fd4f1ce91ef5101353d0',1,'LiDARcloud::xyzFilter(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)'],['../class_li_d_a_rcloud.html#a56ee72fba222c399c256adf577ae860d',1,'LiDARcloud::xyzFilter(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax, bool deleteOutside)']]] +]; diff --git a/doc/html/search/all_21.js b/doc/html/search/all_21.js new file mode 100644 index 000000000..20290adbe --- /dev/null +++ b/doc/html/search/all_21.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['y_0',['y',['../structhelios_1_1int2.html#a369861259a6061aa4287f954238e1e21',1,'helios::int2::y'],['../structhelios_1_1int3.html#aeba3aa4380ec4d9c216f98be95083d5c',1,'helios::int3::y'],['../structhelios_1_1int4.html#ae979ffc27c702a6b67258d07ddcdf3b3',1,'helios::int4::y'],['../structhelios_1_1vec2.html#ab4afff51f764cbf9bab0949ae067977e',1,'helios::vec2::y'],['../structhelios_1_1vec3.html#ac0be54042f7a639c99ea4dce377f9a65',1,'helios::vec3::y'],['../structhelios_1_1vec4.html#a3dd547e787593c51f07a6ea131bcab8d',1,'helios::vec4::y']]], + ['year_1',['year',['../structhelios_1_1_date.html#aee4be32c2bd722143658b4771fe96253',1,'helios::Date']]], + ['your_20own_20projects_2',['Building and Compiling Your Own Projects',['../_a_p_i.html#BuildCompile',1,'']]] +]; diff --git a/doc/html/search/all_22.js b/doc/html/search/all_22.js new file mode 100644 index 000000000..35e8e0440 --- /dev/null +++ b/doc/html/search/all_22.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['z_0',['z',['../structhelios_1_1int3.html#adb4b47bc05bdb62677200e025e4bf641',1,'helios::int3::z'],['../structhelios_1_1int4.html#a5c5969a3b94d165c3a24a5235ea50a99',1,'helios::int4::z'],['../structhelios_1_1vec3.html#a870c14ca45729f58e8628a050ce38b6f',1,'helios::vec3::z'],['../structhelios_1_1vec4.html#a660ee0cf07d74bac3c989ce39e035d3b',1,'helios::vec4::z']]], + ['zenith_1',['zenith',['../structhelios_1_1_spherical_coord.html#a1cf17b1a139ed955ab0dd765e49b0643',1,'helios::SphericalCoord']]] +]; diff --git a/doc/html/search/all_23.js b/doc/html/search/all_23.js new file mode 100644 index 000000000..683551a36 --- /dev/null +++ b/doc/html/search/all_23.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['_7eaeriallidarcloud_0',['~AerialLiDARcloud',['../class_aerial_li_d_a_rcloud.html#acdf5d5239f43e8809a615d4c6e1323e3',1,'AerialLiDARcloud']]], + ['_7ebox_1',['~Box',['../classhelios_1_1_box.html#ab040ad0ee078cb1c9b4fc3c29ec3688d',1,'helios::Box']]], + ['_7econe_2',['~Cone',['../classhelios_1_1_cone.html#ac4f380f30c6bb1dbdf2e8c215c05677c',1,'helios::Cone']]], + ['_7econtext_3',['~Context',['../classhelios_1_1_context.html#a2d34e4556448e40693f61d15e091b604',1,'helios::Context']]], + ['_7edisk_4',['~Disk',['../classhelios_1_1_disk.html#aa670ffa43a0cf0570ea1d789cb8653a5',1,'helios::Disk']]], + ['_7elidarcloud_5',['~LiDARcloud',['../class_li_d_a_rcloud.html#a849627f4e1cd43c49ab21757e812ca68',1,'LiDARcloud']]], + ['_7epolymesh_6',['~Polymesh',['../classhelios_1_1_polymesh.html#a19617972bebd43a3bff944250fc7ddb1',1,'helios::Polymesh']]], + ['_7eradiationmodel_7',['~RadiationModel',['../class_radiation_model.html#aeae03b4de9b9c57ac987407fdfd6afa4',1,'RadiationModel']]], + ['_7esphere_8',['~Sphere',['../classhelios_1_1_sphere.html#ae7e8121c9a60f9c4e4efa853fd2cee59',1,'helios::Sphere']]], + ['_7etile_9',['~Tile',['../classhelios_1_1_tile.html#a001e45730aa531c75c90a599b5524956',1,'helios::Tile']]], + ['_7etube_10',['~Tube',['../classhelios_1_1_tube.html#a15d0248cb525ce91129abcb398f728e8',1,'helios::Tube']]] +]; diff --git a/doc/html/search/all_3.js b/doc/html/search/all_3.js index 76198b712..3f929cb36 100644 --- a/doc/html/search/all_3.js +++ b/doc/html/search/all_3.js @@ -1,107 +1,9 @@ var searchData= [ - ['calculategtheta_0',['calculateGtheta',['../class_radiation_model.html#a12d9870f22e5f3719baa7fde8e07fb0a',1,'RadiationModel']]], - ['calculatehitgridcell_1',['calculateHitGridCell',['../class_aerial_li_d_a_rcloud.html#abe3e99a406251c388a3d934a7519ddb2',1,'AerialLiDARcloud']]], - ['calculatehitgridcellgpu_2',['calculateHitGridCellGPU',['../class_li_d_a_rcloud.html#ab16514fff6766e89b91409077daf35fc',1,'LiDARcloud']]], - ['calculateleafareagpu_3',['calculateLeafAreaGPU',['../class_li_d_a_rcloud.html#a865b46e46b3f20d879a0122b2ec21b7c',1,'LiDARcloud::calculateLeafAreaGPU()'],['../class_aerial_li_d_a_rcloud.html#a5dd671b27dbc6f27e19c66a5ee15934d',1,'AerialLiDARcloud::calculateLeafAreaGPU(const float Gtheta)'],['../class_aerial_li_d_a_rcloud.html#a2b334f5eb21554cfab456808e669322b',1,'AerialLiDARcloud::calculateLeafAreaGPU(const float Gtheta, const int minVoxelHits)'],['../class_li_d_a_rcloud.html#aff9aeedaa500516d1c227e5161fb599a',1,'LiDARcloud::calculateLeafAreaGPU()']]], - ['calculateleafareagpu_5fequal_5fweighting_4',['calculateLeafAreaGPU_equal_weighting',['../class_li_d_a_rcloud.html#a7b23ba7fb6a900ff86d7957fcaa89f83',1,'LiDARcloud::calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic)'],['../class_li_d_a_rcloud.html#a5751d6482bc6747b3b0e8d4566b46ca2',1,'LiDARcloud::calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic, std::vector< float > constant_G)']]], - ['calculateleafareagpu_5fsynthetic_5',['calculateLeafAreaGPU_synthetic',['../class_li_d_a_rcloud.html#ac6824b871a54f9a25c0c6d1725cb4ee0',1,'LiDARcloud']]], - ['calculateleafareagpu_5ftesting_6',['calculateLeafAreaGPU_testing',['../class_li_d_a_rcloud.html#aa6640bd0d26f6cd8e5b8225fe14eaa4d',1,'LiDARcloud']]], - ['calculateprimitivedataareaweightedmean_7',['calculatePrimitiveDataAreaWeightedMean',['../classhelios_1_1_context.html#a8ecb78b9926d1a41b0d05ddc63de89cf',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &awt_mean) const'],['../classhelios_1_1_context.html#af0ac56f7ead05e93c49ca64364e1de94',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &awt_mean) const'],['../classhelios_1_1_context.html#a1aded7761f3571d8b162521308b6982a',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &awt_mean) const'],['../classhelios_1_1_context.html#a57646963eb21eed16ced61fad28d176d',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, double &awt_mean) const'],['../classhelios_1_1_context.html#acbc8e2f6b09248ef0e1b4039ae49dc3f',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const']]], - ['calculateprimitivedataareaweightedsum_8',['calculatePrimitiveDataAreaWeightedSum',['../classhelios_1_1_context.html#a8c269c7aafedc057c4cdbbfbb0ae050c',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &sum) const'],['../classhelios_1_1_context.html#af7b74178a6b1c7baa3efd06656a287d8',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &sum) const'],['../classhelios_1_1_context.html#a715cddf9567a06b1f6a61fa10f08c145',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &sum) const'],['../classhelios_1_1_context.html#a074b0b3ba7069e416206ab3c84138b93',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, double &sum) const'],['../classhelios_1_1_context.html#ac3f0cb99c782cc18b34c1565d83ea754',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const']]], - ['calculateprimitivedatamean_9',['calculatePrimitiveDataMean',['../classhelios_1_1_context.html#a6ccd7935e4e453ae32bbd8ba704dbdd6',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &mean) const'],['../classhelios_1_1_context.html#a019706d872616a6ee74de1c763055b58',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &mean) const'],['../classhelios_1_1_context.html#acea0629aca8ecead44f6801ed8760e98',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &mean) const'],['../classhelios_1_1_context.html#a7ae0ab4e81a6359e4e5c290211869028',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, double &mean) const'],['../classhelios_1_1_context.html#a915ef6fe6a947427508e75a584150290',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, float &mean) const']]], - ['calculateprimitivedatasum_10',['calculatePrimitiveDataSum',['../classhelios_1_1_context.html#a0525d3480cc5136811cb779b81915db1',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &sum) const'],['../classhelios_1_1_context.html#a275251f326d7b04887307991fa7ec122',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &sum) const'],['../classhelios_1_1_context.html#a4d5c413fd13de34ccbf63db430b84747',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, float &sum) const'],['../classhelios_1_1_context.html#a8da7a17942e11fa41938f022f9827cb8',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, double &sum) const'],['../classhelios_1_1_context.html#a2166638f224b3d8c78c92699d1d6be06',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &sum) const']]], - ['calculateprimitivevoxelintersection_11',['calculatePrimitiveVoxelIntersection',['../class_voxel_intersection.html#a11089d71d85cd247bd281edd664052fb',1,'VoxelIntersection::calculatePrimitiveVoxelIntersection(void)'],['../class_voxel_intersection.html#ab8514a6e5868e77b6074bcd15bda831f',1,'VoxelIntersection::calculatePrimitiveVoxelIntersection(std::vector< uint > UUIDs)']]], - ['calculatesyntheticgtheta_12',['calculateSyntheticGtheta',['../class_li_d_a_rcloud.html#a94fe14aa32343dc25e366fe2ad7dfdfd',1,'LiDARcloud']]], - ['calculatesyntheticleafarea_13',['calculateSyntheticLeafArea',['../class_aerial_li_d_a_rcloud.html#ab5fec2c248d5889adf521cac3bb107b3',1,'AerialLiDARcloud::calculateSyntheticLeafArea()'],['../class_li_d_a_rcloud.html#a22f9c93700be5e5a808b97ecca6752fe',1,'LiDARcloud::calculateSyntheticLeafArea()']]], - ['calculatetrianglearea_14',['calculateTriangleArea',['../group__functions.html#ga76dc2dce64e911fc0c5d2bc3ff4f6fe0',1,'helios']]], - ['calendar2julian_15',['Calendar2Julian',['../group__vectors.html#gada57ce3d59ce227448a97e8631a4430e',1,'helios']]], - ['calendarday_16',['CalendarDay',['../global_8h.html#a35cf3fa6f900627c962472dd550e3d39',1,'helios']]], - ['calibratecamera_17',['calibrateCamera',['../class_radiation_model.html#ab04cda35cd54937070cb63344630ada8',1,'RadiationModel::calibrateCamera(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)'],['../class_radiation_model.html#a1da3d8b0b1654693cb1261e909612997',1,'RadiationModel::calibrateCamera(const std::string &originalcameralabel, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)']]], - ['calibrateturbidityfromtimeseries_18',['calibrateTurbidityFromTimeseries',['../class_solar_position.html#aeefa73ede0d1797f94fd4ca2739f7f3e',1,'SolarPosition']]], - ['camera_5fresolution_19',['camera_resolution',['../struct_camera_properties.html#a2806b640deeab5fbcd9dda8ea240f345',1,'CameraProperties']]], - ['cameracalibration_20',['CameraCalibration',['../struct_camera_calibration.html',1,'']]], - ['cameracalibration_2ecpp_21',['CameraCalibration.cpp',['../_camera_calibration_8cpp.html',1,'']]], - ['cameracalibration_2eh_22',['CameraCalibration.h',['../_camera_calibration_8h.html',1,'']]], - ['cameraproperties_23',['CameraProperties',['../struct_camera_properties.html',1,'']]], - ['canopy_20generator_20plugin_20documentation_24',['Canopy Generator Plugin Documentation',['../_canopy_generator_doc.html',1,'PlugIns']]], - ['canopy_5fconfiguration_25',['canopy_configuration',['../struct_spherical_crowns_canopy_parameters.html#acb6042ba8355cae63a24a1b98ca3aa58',1,'SphericalCrownsCanopyParameters::canopy_configuration()'],['../struct_conical_crowns_canopy_parameters.html#a72eaaa43483eb64d79780418e726f749',1,'ConicalCrownsCanopyParameters::canopy_configuration()'],['../struct_white_spruce_canopy_parameters.html#aff224456a6befb2203c9f225ad6e4fe7',1,'WhiteSpruceCanopyParameters::canopy_configuration()']]], - ['canopy_5fextent_26',['canopy_extent',['../struct_homogeneous_canopy_parameters.html#a68c488e6bd2f209af3a46ce8aca4bf60',1,'HomogeneousCanopyParameters']]], - ['canopy_5fheight_27',['canopy_height',['../struct_homogeneous_canopy_parameters.html#a80df27cc13e2b7f113d52e405ddb2737',1,'HomogeneousCanopyParameters']]], - ['canopy_5forigin_28',['canopy_origin',['../struct_base_canopy_parameters.html#a0b5eb48ff33aaab57a3ea0616bc8d5eb',1,'BaseCanopyParameters']]], - ['canopy_5frotation_29',['canopy_rotation',['../struct_base_canopy_parameters.html#afb6abc2b3cf2cf3283261915be329117',1,'BaseCanopyParameters']]], - ['canopy_5frotation_5fspread_30',['canopy_rotation_spread',['../struct_base_grape_vine_parameters.html#a7a4245a8a58c9342f83544f4c4fbe84c',1,'BaseGrapeVineParameters']]], - ['canopygenerator_31',['CanopyGenerator',['../class_canopy_generator.html',1,'CanopyGenerator'],['../class_canopy_generator.html#ac146e7630eb8d80fb91a3795d7b9f9f4',1,'CanopyGenerator::CanopyGenerator()']]], - ['canopygenerator_2ecpp_32',['CanopyGenerator.cpp',['../_canopy_generator_8cpp.html',1,'']]], - ['canopygenerator_2eh_33',['CanopyGenerator.h',['../_canopy_generator_8h.html',1,'']]], - ['carbohydratemodel_2ecpp_34',['CarbohydrateModel.cpp',['../_carbohydrate_model_8cpp.html',1,'']]], - ['cart2sphere_35',['cart2sphere',['../group__functions.html#ga32a34b00e0a28f4b35e501b8b34cfccd',1,'helios']]], - ['center_36',['center',['../struct_aerial_scan_metadata.html#a8aaa9b231aca939a27d438bdf203699c',1,'AerialScanMetadata']]], - ['choosing_20the_20right_20cuda_20and_20optix_20version_37',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], - ['clamp_38',['clamp',['../group__functions.html#gafc2084bde2f2a0e15d637e973658a5a4',1,'helios']]], - ['cleandeletedobjectids_39',['cleanDeletedObjectIDs',['../classhelios_1_1_context.html#af62f212e01997e02b9e6650984441c81',1,'helios::Context::cleanDeletedObjectIDs(std::vector< uint > &objIDs) const'],['../classhelios_1_1_context.html#a1bd5d91491521ff07c7d96e20349e21d',1,'helios::Context::cleanDeletedObjectIDs(std::vector< std::vector< uint > > &objIDs) const'],['../classhelios_1_1_context.html#a82d9c7f1149b51645f34b87f1d5e8b32',1,'helios::Context::cleanDeletedObjectIDs(std::vector< std::vector< std::vector< uint > > > &objIDs) const']]], - ['cleandeleteduuids_40',['cleanDeletedUUIDs',['../classhelios_1_1_context.html#a1f8686dea9f4b1029e1a13034492e725',1,'helios::Context::cleanDeletedUUIDs(std::vector< uint > &UUIDs) const'],['../classhelios_1_1_context.html#a13b8a75c8986e5461e26f559dc6e1675',1,'helios::Context::cleanDeletedUUIDs(std::vector< std::vector< uint > > &UUIDs) const'],['../classhelios_1_1_context.html#a2957986f92393ef6d429daa4927551dc',1,'helios::Context::cleanDeletedUUIDs(std::vector< std::vector< std::vector< uint > > > &UUIDs) const']]], - ['cleargeometry_41',['clearGeometry',['../class_visualizer.html#a6ed171a1cff8b411bc45d097a38cd81b',1,'Visualizer']]], - ['clearglobaldata_42',['clearGlobalData',['../classhelios_1_1_context.html#aa2facabc7384ac82a0e51acd59486ae8',1,'helios::Context']]], - ['clearobjectdata_43',['clearObjectData',['../classhelios_1_1_context.html#abde8caac74d1da85a5f9503aba64be48',1,'helios::Context::clearObjectData(const std::vector< uint > &objIDs, const char *label)'],['../classhelios_1_1_context.html#a6c96c0f3fbb3c31ae9aad750d647903b',1,'helios::Context::clearObjectData(uint objID, const char *label)'],['../classhelios_1_1_compound_object.html#abc9415005f1f45902b6834cb9d5aa987',1,'helios::CompoundObject::clearObjectData()']]], - ['clearprimitivedata_44',['clearPrimitiveData',['../classhelios_1_1_context.html#ac6ef3bc00a8d091f9408033af63f162b',1,'helios::Context::clearPrimitiveData(uint UUID, const char *label)'],['../classhelios_1_1_context.html#ab4cc7c915a03f7eb5dbbce24bbbc6903',1,'helios::Context::clearPrimitiveData(const std::vector< uint > &UUIDs, const char *label)']]], - ['closewindow_45',['closeWindow',['../class_visualizer.html#a6b7be76387563b2981bba995a7578d78',1,'Visualizer']]], - ['cluster_5fheight_5fmax_46',['cluster_height_max',['../struct_base_grape_vine_parameters.html#a400d6647ac782d95810095028b3fc896',1,'BaseGrapeVineParameters']]], - ['cluster_5fheight_5fmax_5fspread_47',['cluster_height_max_spread',['../struct_base_grape_vine_parameters.html#a953ff61ba4aafb94fea7965b9034595d',1,'BaseGrapeVineParameters']]], - ['cluster_5fradius_48',['cluster_radius',['../struct_base_grape_vine_parameters.html#a33068ecf3f8ab89c8b427f9496c5c887',1,'BaseGrapeVineParameters']]], - ['cluster_5fradius_5fspread_49',['cluster_radius_spread',['../struct_base_grape_vine_parameters.html#ac2be7d544dc5b8a4362eff523532445a',1,'BaseGrapeVineParameters']]], - ['clusters_5fper_5fstem_50',['clusters_per_stem',['../struct_strawberry_parameters.html#aac9b43d90dcf4883834708376c5514c9',1,'StrawberryParameters']]], - ['colorcontextobjectsrandomly_51',['colorContextObjectsRandomly',['../class_visualizer.html#a1eeba834ac28642f0e884ce68160d644',1,'Visualizer::colorContextObjectsRandomly(const std::vector< uint > &ObjIDs)'],['../class_visualizer.html#a16770662445e4a697353871a370174cb',1,'Visualizer::colorContextObjectsRandomly()']]], - ['colorcontextprimitivesbydata_52',['colorContextPrimitivesByData',['../class_visualizer.html#a0c75972b0cc0300a4fa0139af6a32234',1,'Visualizer::colorContextPrimitivesByData(const char *data_name)'],['../class_visualizer.html#ac9b9fb0076f62a9a06542d876db34563',1,'Visualizer::colorContextPrimitivesByData(const char *data_name, const std::vector< uint > &UUIDs)']]], - ['colorcontextprimitivesbyobjectdata_53',['colorContextPrimitivesByObjectData',['../class_visualizer.html#ad6479e1f6bb7f0f06d0c83b0351b4424',1,'Visualizer::colorContextPrimitivesByObjectData(const char *data_name)'],['../class_visualizer.html#af221d03db54adff2d38f8a938a1512b7',1,'Visualizer::colorContextPrimitivesByObjectData(const char *data_name, const std::vector< uint > &ObjIDs)']]], - ['colorcontextprimitivesrandomly_54',['colorContextPrimitivesRandomly',['../class_visualizer.html#afb87c8a06744966e4e02b61cf011ea79',1,'Visualizer::colorContextPrimitivesRandomly(const std::vector< uint > &UUIDs)'],['../class_visualizer.html#ac82b9c5274ec13dae412a9972fe2a080',1,'Visualizer::colorContextPrimitivesRandomly()']]], - ['colormap_55',['Colormap',['../struct_colormap.html',1,'']]], - ['colormap_5fcool_56',['COLORMAP_COOL',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba65fd6eb9eefd4fbd10caa6ccceb689f5',1,'Visualizer']]], - ['colormap_5fcustom_57',['COLORMAP_CUSTOM',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba915aba9d8ae7c0796d8ed705671003a7',1,'Visualizer']]], - ['colormap_5fgray_58',['COLORMAP_GRAY',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba9902d02656030da0e50afae4ac10ab58',1,'Visualizer']]], - ['colormap_5fhot_59',['COLORMAP_HOT',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba50215b5b3fb3a48fc83d7b4670da2026',1,'Visualizer']]], - ['colormap_5flava_60',['COLORMAP_LAVA',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194baae3d180822a9415592cd938ef445e128',1,'Visualizer']]], - ['colormap_5fparula_61',['COLORMAP_PARULA',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba9a15b906eca8c544a6b83f885877fbe7',1,'Visualizer']]], - ['colormap_5frainbow_62',['COLORMAP_RAINBOW',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194baae019baa3e114715bf2a8feab826608d',1,'Visualizer']]], - ['colorprimitivebydatapseudocolor_63',['colorPrimitiveByDataPseudocolor',['../classhelios_1_1_context.html#a1a6a0cf71941e344dc086a13e49ddb78',1,'helios::Context::colorPrimitiveByDataPseudocolor(const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors, float data_min, float data_max)'],['../classhelios_1_1_context.html#a77832cbf16fff127553ea797db74caa1',1,'helios::Context::colorPrimitiveByDataPseudocolor(const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors)']]], - ['columnformat_64',['columnFormat',['../struct_scan_metadata.html#accc2b308821e99b3e9aeed5d0a797130',1,'ScanMetadata']]], - ['compound_20objects_65',['Compound Objects',['../group__compoundobjects.html',1,'']]], - ['compoundobject_66',['CompoundObject',['../classhelios_1_1_compound_object.html',1,'helios']]], - ['cone_67',['Cone',['../classhelios_1_1_cone.html#a1812816ea32de6d7a28fae76ebd66f80',1,'helios::Cone::Cone()'],['../classhelios_1_1_cone.html',1,'helios::Cone']]], - ['coneangle_68',['coneangle',['../struct_aerial_scan_metadata.html#a5fbcc96d692e7be7e52c983eb9d242fd',1,'AerialScanMetadata']]], - ['conicalcrownscanopyparameters_69',['ConicalCrownsCanopyParameters',['../struct_conical_crowns_canopy_parameters.html',1,'ConicalCrownsCanopyParameters'],['../struct_conical_crowns_canopy_parameters.html#a14c7ca248edf64af6b1882aea58d7d74',1,'ConicalCrownsCanopyParameters::ConicalCrownsCanopyParameters()'],['../struct_conical_crowns_canopy_parameters.html#a687c4bb375077d6eb1fbe96ff438fb0f',1,'ConicalCrownsCanopyParameters::ConicalCrownsCanopyParameters(const pugi::xml_node canopy_node)']]], - ['context_70',['Context',['../classhelios_1_1_context.html#a859979bfe3d7d03b07d3c640ccbc0efa',1,'helios::Context::Context(const Context &)=delete'],['../classhelios_1_1_context.html#a652cdcd2eedc8dbd9110bd284c5d5cf0',1,'helios::Context::Context()'],['../classhelios_1_1_context.html',1,'helios::Context']]], - ['context_2ecpp_71',['Context.cpp',['../_context_8cpp.html',1,'']]], - ['context_2eh_72',['Context.h',['../_context_8h.html',1,'']]], - ['context_5fdata_2ecpp_73',['Context_data.cpp',['../_context__data_8cpp.html',1,'']]], - ['context_5ffileio_2ecpp_74',['Context_fileIO.cpp',['../_context__file_i_o_8cpp.html',1,'']]], - ['converting_20polygon_20file_20formats_20to_20_2eply_20using_20blender_75',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], - ['coordinaterotation_76',['coordinateRotation',['../class_li_d_a_rcloud.html#a263717159dde05f5b98ae4133dec3d5e',1,'LiDARcloud::coordinateRotation(const helios::SphericalCoord &rotation)'],['../class_li_d_a_rcloud.html#aeae9aaa404a67082f849e1c8d56579e5',1,'LiDARcloud::coordinateRotation(uint scanID, const helios::SphericalCoord &rotation)'],['../class_li_d_a_rcloud.html#abf2f7677b1a92cba5b51ad0336e3743e',1,'LiDARcloud::coordinateRotation(float rotation, const helios::vec3 &line_base, const helios::vec3 &line_direction)']]], - ['coordinates_5fcartesian_77',['COORDINATES_CARTESIAN',['../class_visualizer.html#a084713b3d4d0720dcc1ee44d270b42e3a83efc5e87fcf84a8c3d646e77adf53d4',1,'Visualizer']]], - ['coordinates_5fwindow_5fnormalized_78',['COORDINATES_WINDOW_NORMALIZED',['../class_visualizer.html#a084713b3d4d0720dcc1ee44d270b42e3a9392af82f887f2fc1982a8315bcc95f5',1,'Visualizer']]], - ['coordinateshift_79',['coordinateShift',['../class_li_d_a_rcloud.html#ab37566564d8e421a123c8b1b8cdb2347',1,'LiDARcloud::coordinateShift(uint scanID, const helios::vec3 &shift)'],['../class_li_d_a_rcloud.html#a72bc752975f8783ad8b1710cefa1d2a9',1,'LiDARcloud::coordinateShift(const helios::vec3 &shift)']]], - ['coordinatesystem_80',['CoordinateSystem',['../class_visualizer.html#a084713b3d4d0720dcc1ee44d270b42e3',1,'Visualizer']]], - ['copyobject_81',['copyObject',['../classhelios_1_1_context.html#a14f83860167c061e537f29f7754c12c3',1,'helios::Context::copyObject(uint ObjID)'],['../classhelios_1_1_context.html#a293850533a36a27b1403bbf1ae0da67d',1,'helios::Context::copyObject(const std::vector< uint > &ObjIDs)']]], - ['copyobjectdata_82',['copyObjectData',['../classhelios_1_1_context.html#ae36135cf1bcbbe48d170012e47818752',1,'helios::Context']]], - ['copyprimitive_83',['copyPrimitive',['../classhelios_1_1_context.html#a7eb6409748de787c4a8f2cc10c290144',1,'helios::Context::copyPrimitive(uint UUID)'],['../classhelios_1_1_context.html#a33af572acef6f81e93fe723cdc4eb501',1,'helios::Context::copyPrimitive(const std::vector< uint > &UUIDs)']]], - ['copyprimitivedata_84',['copyPrimitiveData',['../classhelios_1_1_context.html#a001b487c911a93940aa4d4621eda0053',1,'helios::Context']]], - ['copyradiationband_85',['copyRadiationBand',['../class_radiation_model.html#ab0e729819054765ad2c40d30fd56c7a6',1,'RadiationModel::copyRadiationBand(const std::string &old_label, const std::string &new_label, float wavelength_min, float wavelength_max)'],['../class_radiation_model.html#a516dafe4d898ad38af6f5bc23bdfb4d8',1,'RadiationModel::copyRadiationBand(const std::string &old_label, const std::string &new_label)']]], - ['cordon_5fheight_86',['cordon_height',['../struct_base_grape_vine_parameters.html#ae0039b667a66a05e79bc4391c33fea85',1,'BaseGrapeVineParameters']]], - ['cordon_5fheight_5fspread_87',['cordon_height_spread',['../struct_base_grape_vine_parameters.html#a7987cea6f3fa47a7bd6c3e26985f27f9',1,'BaseGrapeVineParameters']]], - ['cordon_5flength_88',['cordon_length',['../struct_base_grape_vine_parameters.html#ac1b85687c9d616cecbcd5669cc306f6f',1,'BaseGrapeVineParameters']]], - ['cordon_5flength_5fspread_89',['cordon_length_spread',['../struct_base_grape_vine_parameters.html#aff36939081dff4eb93a98a06d3453fde',1,'BaseGrapeVineParameters']]], - ['cordon_5fradius_90',['cordon_radius',['../struct_base_grape_vine_parameters.html#a6d1ddbd96a217d8d744058cd4edca266',1,'BaseGrapeVineParameters']]], - ['cordon_5fradius_5fspread_91',['cordon_radius_spread',['../struct_base_grape_vine_parameters.html#ac9906e333606068b757f6a5bf0b529ad',1,'BaseGrapeVineParameters']]], - ['cordon_5fspacing_92',['cordon_spacing',['../struct_split_grapevine_parameters.html#a6d65cd7d6a101ce083020c08f7237dcb',1,'SplitGrapevineParameters']]], - ['cordon_5fspacing_5fspread_93',['cordon_spacing_spread',['../struct_split_grapevine_parameters.html#abe4c3510d79f5543ea86ec9d4c5baf81',1,'SplitGrapevineParameters']]], - ['createelementlabels_94',['createElementLabels',['../class_canopy_generator.html#ade5c366887c712553b134ef23509f255',1,'CanopyGenerator']]], - ['cropbeamstogridanglerange_95',['cropBeamsToGridAngleRange',['../class_li_d_a_rcloud.html#a85e1a7d8dc2df6eba9b798bb2a456473',1,'LiDARcloud']]], - ['cropdomain_96',['cropDomain',['../classhelios_1_1_context.html#a646610820710e8012084aeb0fe0ec0f1',1,'helios::Context::cropDomain(const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)'],['../classhelios_1_1_context.html#aea4ea9dfed93b6e75cdc49ab3a94b023',1,'helios::Context::cropDomain(std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)']]], - ['cropdomainx_97',['cropDomainX',['../classhelios_1_1_context.html#a5a9ae91eb630bf727ce994e7d1c0fb40',1,'helios::Context']]], - ['cropdomainy_98',['cropDomainY',['../classhelios_1_1_context.html#a743a39dcf2a6688cc8aeabf79f6bc0b6',1,'helios::Context']]], - ['cropdomainz_99',['cropDomainZ',['../classhelios_1_1_context.html#a574cfb5f54a48a49d3a9f2b292f65786',1,'helios::Context']]], - ['cross_100',['cross',['../helios__vector__types_8h.html#aa4e7459e7404915c12903a5c08588f5b',1,'helios']]], - ['crown_5fheight_101',['crown_height',['../struct_conical_crowns_canopy_parameters.html#a40b24b7e99ad96e967bc4d3d9af277e2',1,'ConicalCrownsCanopyParameters']]], - ['crown_5fradius_102',['crown_radius',['../struct_spherical_crowns_canopy_parameters.html#a1695b7794ffb1c8ab8618ebb701fbb6d',1,'SphericalCrownsCanopyParameters::crown_radius()'],['../struct_conical_crowns_canopy_parameters.html#ab8ad6dd9a6bdb0ccfbccb268a58e3275',1,'ConicalCrownsCanopyParameters::crown_radius()'],['../struct_white_spruce_canopy_parameters.html#a97c71fefdb2f53e1e058f0be363ee592',1,'WhiteSpruceCanopyParameters::crown_radius()']]], - ['ctable_103',['Ctable',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194b',1,'Visualizer']]] + ['3_2026_0',['Helios Documentation v1.3.26',['../index.html',1,'']]], + ['3_20laminar_20flow_20around_20a_20sphere_1',['3. Laminar flow around a sphere',['../_b_l_conductance_doc.html#BLC3',1,'']]], + ['3_20modify_20visualizer_20options_2',['Step 3. Modify Visualizer options',['../visualizer_basics.html#vis_step3',1,'']]], + ['3_20radiation_20model_20set_20up_3',['3. Radiation model set-up',['../radiation__beers_law.html#tutorial11_rad',1,'']]], + ['3_20removing_20the_20background_4',['3. Removing the background',['../_making_masks.html#Three',1,'']]], + ['3_20run_20the_20model_20and_20calculate_20par_20interception_5',['3. Run the model and calculate PAR interception',['../radiation_basics.html#Tutorial10_run',1,'']]] ]; diff --git a/doc/html/search/all_4.js b/doc/html/search/all_4.js index c14d3ead3..58e1dc02b 100644 --- a/doc/html/search/all_4.js +++ b/doc/html/search/all_4.js @@ -1,66 +1,12 @@ var searchData= [ - ['d_5fcalculateprimitivearea_0',['d_calculatePrimitiveArea',['../_ray_tracing_8cu_8h.html#a216a63a21845766a5ad1fe4b8002e983',1,'RayTracing.cu.h']]], - ['d_5fmagnitude_1',['d_magnitude',['../_ray_tracing_8cu_8h.html#a59b52bcf03b8801f444e081e943f7138',1,'RayTracing.cu.h']]], - ['d_5frotatepoint_2',['d_rotatePoint',['../_ray_tracing_8cu_8h.html#af48d117e18e1319cd61b4af9ef999b01',1,'RayTracing.cu.h']]], - ['d_5ftransformpoint_3',['d_transformPoint',['../_ray_tracing_8cu_8h.html#a515aa9bdd11a5648143611f9c9d76500',1,'RayTracing.cu.h']]], - ['data_5ffile_4',['data_file',['../struct_scan_metadata.html#a9314565da4824fbee86ced28382cc1dc',1,'ScanMetadata']]], - ['date_5',['Date',['../structhelios_1_1_date.html#ab6a3fd0b6aa30e71a995f71c24c68d1b',1,'helios::Date::Date(int day, int month, int year)'],['../structhelios_1_1_date.html#a0cf0a25b63afde0c55203451e827b56a',1,'helios::Date::Date()'],['../structhelios_1_1_date.html',1,'helios::Date']]], - ['day_6',['day',['../structhelios_1_1_date.html#a876b0513daf0bcf0ab305029be3377d8',1,'helios::Date']]], - ['dead_5fprobability_7',['dead_probability',['../struct_base_grape_vine_parameters.html#a23c655ac5643e9d9d4a0ad1e4d989e8e',1,'BaseGrapeVineParameters']]], - ['deblank_8',['deblank',['../group__functions.html#gaaf03682753b330b32f6c5d117df90db7',1,'helios::deblank(const std::string &input)'],['../group__functions.html#gad5aa3cd5124a2e1e526d6070e53c2bc8',1,'helios::deblank(const char *input)']]], - ['defineshoottype_9',['defineShootType',['../class_plant_architecture.html#a9700f223b8f60bf37852ad87d30e7fc0',1,'PlantArchitecture']]], - ['deg2rad_10',['deg2rad',['../group__functions.html#ga60f429b247883516de80687774f4155c',1,'helios']]], - ['deletechildprimitive_11',['deleteChildPrimitive',['../classhelios_1_1_compound_object.html#a5448b4bd356d7f772b8a0c7a848cfb89',1,'helios::CompoundObject::deleteChildPrimitive(uint UUID)'],['../classhelios_1_1_compound_object.html#a4b8f242ec7d96ef82bd9d49658fb605f',1,'helios::CompoundObject::deleteChildPrimitive(const std::vector< uint > &UUIDs)']]], - ['deletehitpoint_12',['deleteHitPoint',['../class_aerial_li_d_a_rcloud.html#a9d374100b86e8becf578b65b81f99b67',1,'AerialLiDARcloud::deleteHitPoint()'],['../class_li_d_a_rcloud.html#accf5ec6015b0b68c89716ffff1a016bb',1,'LiDARcloud::deleteHitPoint()']]], - ['deleteobject_13',['deleteObject',['../classhelios_1_1_context.html#aaae58688c97d14257223911be4bb13e6',1,'helios::Context::deleteObject(uint ObjID)'],['../classhelios_1_1_context.html#a690553ff4b945d117782addb96c5add0',1,'helios::Context::deleteObject(const std::vector< uint > &ObjIDs)']]], - ['deleteplantinstance_14',['deletePlantInstance',['../class_plant_architecture.html#a892ccc80c958b43d7528fa07006117e7',1,'PlantArchitecture::deletePlantInstance(uint plantID)'],['../class_plant_architecture.html#afda177f49619fda164fd0ad6cfe512e9',1,'PlantArchitecture::deletePlantInstance(const std::vector< uint > &plantIDs)']]], - ['deleteprimitive_15',['deletePrimitive',['../classhelios_1_1_context.html#a06b7dc6a572fcf33f499f249ea44db5a',1,'helios::Context::deletePrimitive(const std::vector< uint > &UUIDs)'],['../classhelios_1_1_context.html#a24324ccb5318cb103846a71d44dda23e',1,'helios::Context::deletePrimitive(uint UUID)']]], - ['deleteradiationsource_16',['deleteRadiationSource',['../class_radiation_model.html#a1078def47ddf309e01c908a775c1ecd4',1,'RadiationModel']]], - ['deprecated_17',['DEPRECATED',['../class_visualizer.html#a66b16cf0e4d56836fad694658ccb7931',1,'Visualizer']]], - ['diffuse_5fspectrum_18',['diffuse_spectrum',['../struct_radiation_band.html#a24a0753d9bc91d02db11046a7278220b',1,'RadiationBand']]], - ['diffusedistnorm_19',['diffuseDistNorm',['../struct_radiation_band.html#a774ee8eb75fc96a086688fe4c643cdec',1,'RadiationBand']]], - ['diffuseextinction_20',['diffuseExtinction',['../struct_radiation_band.html#a8d765b32b7feb274d2e4b19c46256454',1,'RadiationBand']]], - ['diffuseflux_21',['diffuseFlux',['../struct_radiation_band.html#a8eab113387b2e1435640b0e5eb7cc0ce',1,'RadiationBand']]], - ['diffusepeakdir_22',['diffusePeakDir',['../struct_radiation_band.html#a640846a7f7b0b525ff33ea0d8143e866',1,'RadiationBand']]], - ['diffuseraycount_23',['diffuseRayCount',['../struct_radiation_band.html#ad96ca3a5bd5aa77844ac2c9fe16e042d',1,'RadiationBand']]], - ['direction2rc_24',['direction2rc',['../struct_scan_metadata.html#aab2db5e4c22f1eb7979294a7f8993611',1,'ScanMetadata']]], - ['directraycount_25',['directRayCount',['../struct_radiation_band.html#aff62997df11af06fad82b946b298ee90',1,'RadiationBand']]], - ['disablecameramodelvisualization_26',['disableCameraModelVisualization',['../class_radiation_model.html#a697a43f3706fe60094dab0e525b370f8',1,'RadiationModel']]], - ['disablecloudcalibration_27',['disableCloudCalibration',['../class_solar_position.html#a282ed51f351684b847255212dcd53869',1,'SolarPosition']]], - ['disablecolorbar_28',['disableColorbar',['../class_visualizer.html#a3580188fe9f0daf71e1c434fe7f14103',1,'Visualizer']]], - ['disableelementlabels_29',['disableElementLabels',['../class_canopy_generator.html#a96b61b2224ca9adb3ccef157447d07c1',1,'CanopyGenerator']]], - ['disableemission_30',['disableEmission',['../class_radiation_model.html#a764f6cfd8e79569cc7a110fccd36857b',1,'RadiationModel']]], - ['disableinstancesegmentation_31',['disableInstanceSegmentation',['../class_synthetic_annotation.html#a04117857ddc185b3b3595fcc2cfa97ae',1,'SyntheticAnnotation']]], - ['disableinternodecontextbuild_32',['disableInternodeContextBuild',['../class_plant_architecture.html#af66af0968daf0fef4135b4434c61dc60',1,'PlantArchitecture']]], - ['disablelightmodelvisualization_33',['disableLightModelVisualization',['../class_radiation_model.html#abe728e1b9804571c0125ad92659d6a9e',1,'RadiationModel']]], - ['disablemessages_34',['disableMessages',['../class_canopy_generator.html#aae25f707aa8f8f0409e497faa127d599',1,'CanopyGenerator::disableMessages()'],['../class_energy_balance_model.html#aaee48ad61d28ce32bdc8fb3650471b5b',1,'EnergyBalanceModel::disableMessages()'],['../class_leaf_optics.html#acc78ee64bd0569888dbaab2b29b4e7d5',1,'LeafOptics::disableMessages()'],['../class_li_d_a_rcloud.html#af5d0590b160e7069826c52eeeb4e0129',1,'LiDARcloud::disableMessages()'],['../class_photosynthesis_model.html#a53e70a6e8e335d605154d565e283aec1',1,'PhotosynthesisModel::disableMessages()'],['../class_radiation_model.html#a173a9cb77b4dfda7a008267d6331b7b7',1,'RadiationModel::disableMessages()'],['../class_stomatal_conductance_model.html#a1ec3059345b100a8d9df83b36e1c821d',1,'StomatalConductanceModel::disableMessages()'],['../class_visualizer.html#ab095acf8151f5825077b2ff36846c7df',1,'Visualizer::disableMessages()'],['../class_voxel_intersection.html#a899b91a48fbd227ff96b233c90709e74',1,'VoxelIntersection::disableMessages()'],['../class_aerial_li_d_a_rcloud.html#aae637046290c1276c8f816d975489b86',1,'AerialLiDARcloud::disableMessages()'],['../class_b_l_conductance_model.html#a11bd8193606442d8393bf22131fa0720',1,'BLConductanceModel::disableMessages()']]], - ['disableobjectdetection_35',['disableObjectDetection',['../class_synthetic_annotation.html#a482f3217d844ba462f3640c07902ea58',1,'SyntheticAnnotation']]], - ['disablepedunclecontextbuild_36',['disablePeduncleContextBuild',['../class_plant_architecture.html#a71918ef58e5257e4a8a338dba4f9b328',1,'PlantArchitecture']]], - ['disablepetiolecontextbuild_37',['disablePetioleContextBuild',['../class_plant_architecture.html#ab4ae495e7aebc365826f2a2f02a24338',1,'PlantArchitecture']]], - ['disablesemanticsegmentation_38',['disableSemanticSegmentation',['../class_synthetic_annotation.html#aaacbec2f1a8da152494b802d98f54cde',1,'SyntheticAnnotation']]], - ['disabletextures_39',['disableTextures',['../struct_shader.html#a487913973657c8817a5aa03422c43be5',1,'Shader']]], - ['disk_40',['Disk',['../classhelios_1_1_disk.html#aedc5a15466aa7b07a76605473a00ba15',1,'helios::Disk::Disk()'],['../classhelios_1_1_disk.html',1,'helios::Disk']]], - ['disk_5fbounds_41',['disk_bounds',['../primitive_intersection_8cu.html#aab2e16ff4d5a4bca2d90c49f777500e9',1,'primitiveIntersection.cu']]], - ['disk_5fintersect_42',['disk_intersect',['../primitive_intersection_8cu.html#a45dc4da4927abe579fd24be608e4cd75',1,'primitiveIntersection.cu']]], - ['distancefilter_43',['distanceFilter',['../class_aerial_li_d_a_rcloud.html#acc26240eea9ec98c6b354041cd9b9efc',1,'AerialLiDARcloud::distanceFilter()'],['../class_li_d_a_rcloud.html#af21b843806f22fb9bc80e7ef370aee1d',1,'LiDARcloud::distanceFilter()']]], - ['distortimage_44',['distortImage',['../struct_camera_calibration.html#a75a0688aa37a6d7706cef4ee4b92dd7f',1,'CameraCalibration']]], - ['doesbandexist_45',['doesBandExist',['../class_radiation_model.html#a966780925811e3a710a6d91f4ac852fb',1,'RadiationModel']]], - ['doesglobaldataexist_46',['doesGlobalDataExist',['../classhelios_1_1_context.html#a65ad9cb057b0cb2be3ef2734847608cc',1,'helios::Context']]], - ['doeshitdataexist_47',['doesHitDataExist',['../class_aerial_li_d_a_rcloud.html#a9b5aa652c94d4dee19a4f956a62f2ab1',1,'AerialLiDARcloud::doesHitDataExist()'],['../class_li_d_a_rcloud.html#aabb8d404b7f3fa00d8281cb6b74f90c0',1,'LiDARcloud::doesHitDataExist()']]], - ['doesobjectcontainprimitive_48',['doesObjectContainPrimitive',['../classhelios_1_1_compound_object.html#ae06ed1275c9ba5ed5ed59b08bdfd1216',1,'helios::CompoundObject::doesObjectContainPrimitive()'],['../classhelios_1_1_context.html#a60b571dd1cfd525caedcfd725162721e',1,'helios::Context::doesObjectContainPrimitive()']]], - ['doesobjectdataexist_49',['doesObjectDataExist',['../classhelios_1_1_compound_object.html#aac66c9dbdba0e7418051a9eb9c688618',1,'helios::CompoundObject::doesObjectDataExist()'],['../classhelios_1_1_context.html#a2834b9a6eee49d644f201f696ae5a4d5',1,'helios::Context::doesObjectDataExist(uint objID, const char *label) const']]], - ['doesobjectexist_50',['doesObjectExist',['../classhelios_1_1_context.html#a9b410e55075482b8cbc549f9bf571541',1,'helios::Context']]], - ['doesprimitivedataexist_51',['doesPrimitiveDataExist',['../classhelios_1_1_context.html#a780d83edd66f25cd38b5059359b48a7b',1,'helios::Context']]], - ['doesprimitiveexist_52',['doesPrimitiveExist',['../classhelios_1_1_context.html#acf4a7fa9ba97f03d0a9218e5c4b7bc66',1,'helios::Context::doesPrimitiveExist(uint UUID) const'],['../classhelios_1_1_context.html#a0c478e8ce47bfad4db16829f76305946',1,'helios::Context::doesPrimitiveExist(const std::vector< uint > &UUIDs) const']]], - ['doestimeseriesvariableexist_53',['doesTimeseriesVariableExist',['../group__timeseries.html#ga8beaa8454ad248064b74698f7f0534a2',1,'helios::Context']]], - ['dummy_20model_20plugin_20documentation_54',['Dummy Model Plugin Documentation',['../_dummy.html',1,'']]], - ['dummymodel_55',['DummyModel',['../class_dummy_model.html#ae48cd297d1bf8b94c296218e767b9f70',1,'DummyModel::DummyModel()'],['../class_dummy_model.html',1,'DummyModel']]], - ['dummymodel_2ecpp_56',['DummyModel.cpp',['../_dummy_model_8cpp.html',1,'']]], - ['dummymodel_2eh_57',['DummyModel.h',['../_dummy_model_8h.html',1,'']]], - ['dupex_58',['Dupex',['../struct_dupex.html',1,'']]], - ['duplicateglobaldata_59',['duplicateGlobalData',['../classhelios_1_1_context.html#ae89abaa03d7585e7f3abc6c5f16a0223',1,'helios::Context']]], - ['duplicateobjectdata_60',['duplicateObjectData',['../classhelios_1_1_context.html#a613366ab9fdbfd69428535d5c1867b73',1,'helios::Context']]], - ['duplicateplantinstance_61',['duplicatePlantInstance',['../class_plant_architecture.html#acd6de0d13dbc534992b94a203a16b76d',1,'PlantArchitecture']]], - ['duplicateprimitivedata_62',['duplicatePrimitiveData',['../classhelios_1_1_context.html#a86be37149a98b13141175da5793d053e',1,'helios::Context::duplicatePrimitiveData(uint UUID, const char *old_label, const char *new_label)'],['../classhelios_1_1_context.html#a3796eae362aec38408e40a3a83b3d8a4',1,'helios::Context::duplicatePrimitiveData(const char *existing_data_label, const char *copy_data_label)']]] + ['4_20exporting_20to_20png_20format_0',['4. Exporting to .png format',['../_making_masks.html#Four',1,'']]], + ['4_20flow_20over_20bare_20ground_1',['4. Flow over bare ground',['../_b_l_conductance_doc.html#BLC4',1,'']]], + ['4_20plot_20the_20result_2',['Step 4. Plot the result',['../visualizer_basics.html#vis_step4',1,'']]], + ['4_20run_20model_20and_20process_20results_3',['4. Run model and process results',['../radiation__beers_law.html#tutorial11_run',1,'']]], + ['4a_20calculate_20g_20theta_4',['4a. Calculate G(theta)',['../radiation__beers_law.html#tutorial11_G',1,'']]], + ['4b_20calculate_20radiation_20flux_20absorbed_20by_20the_20canopy_20on_20a_20ground_20area_20basis_5',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['4c_20calculate_20the_20theoretical_20absorbed_20par_20flux_20using_20beer_20s_20law_6',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['4d_20calculate_20the_20sunlit_20leaf_20area_20fraction_20from_20the_20simulation_7',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['4e_20calculate_20the_20theoretical_20sunlit_20area_20fraction_8',['4e. Calculate the theoretical sunlit area fraction',['../radiation__beers_law.html#tutorial11_fsunBeer',1,'']]] ]; diff --git a/doc/html/search/all_5.js b/doc/html/search/all_5.js index 3118eb516..a4833130f 100644 --- a/doc/html/search/all_5.js +++ b/doc/html/search/all_5.js @@ -1,36 +1,4 @@ var searchData= [ - ['elevation_0',['elevation',['../structhelios_1_1_spherical_coord.html#abaa336d9a00b67f486ab1ff040420a73',1,'helios::SphericalCoord']]], - ['emissionflag_1',['emissionFlag',['../struct_radiation_band.html#ace749bf8f3e89cf3ea93fb58d3e28e1b',1,'RadiationBand']]], - ['empiricalmodelcoefficients_2',['EmpiricalModelCoefficients',['../struct_empirical_model_coefficients.html',1,'']]], - ['enablecameramodelvisualization_3',['enableCameraModelVisualization',['../class_radiation_model.html#ad4236469b34bcb4b216a78c96872b760',1,'RadiationModel']]], - ['enablecloudcalibration_4',['enableCloudCalibration',['../class_solar_position.html#abee2003c22cbbffb671e8e6a9305b66f',1,'SolarPosition']]], - ['enablecolorbar_5',['enableColorbar',['../class_visualizer.html#a050807f8462ca95bde2fd737b26830c4',1,'Visualizer']]], - ['enableemission_6',['enableEmission',['../class_radiation_model.html#a7ac4bd9e9cf3ff4252818d984b782e79',1,'RadiationModel']]], - ['enableepicormicchildshoots_7',['enableEpicormicChildShoots',['../class_plant_architecture.html#a8fc29c4a5b44430a34fc780180a01e8b',1,'PlantArchitecture']]], - ['enablegroundclipping_8',['enableGroundClipping',['../class_plant_architecture.html#a27dd2c46b6bb9f5c922d18acb6d9ba69',1,'PlantArchitecture']]], - ['enableinstancesegmentation_9',['enableInstanceSegmentation',['../class_synthetic_annotation.html#af2bc966a2a1074b763c8bbd5d81eda37',1,'SyntheticAnnotation']]], - ['enablelightmodelvisualization_10',['enableLightModelVisualization',['../class_radiation_model.html#a5a4c7643cb05be9f7f893d65dee33dc2',1,'RadiationModel']]], - ['enablemessages_11',['enableMessages',['../class_voxel_intersection.html#a203e5402eba704b3e403ba7974cceaf3',1,'VoxelIntersection::enableMessages()'],['../class_aerial_li_d_a_rcloud.html#af5a5942d197f59c6f61cde76bb06a1ca',1,'AerialLiDARcloud::enableMessages()'],['../class_b_l_conductance_model.html#afd2d53808eb3ab1d3b104229c7bf3817',1,'BLConductanceModel::enableMessages()'],['../class_canopy_generator.html#a42eb441c5fb1f49d5ce758785f1e1700',1,'CanopyGenerator::enableMessages()'],['../class_energy_balance_model.html#a261480763ea918e133bb594ce9f3e14c',1,'EnergyBalanceModel::enableMessages()'],['../class_leaf_optics.html#abf74f6bab17e5ef1465efca7803be71a',1,'LeafOptics::enableMessages()'],['../class_li_d_a_rcloud.html#a2e87dc18538155b35368ff27ed6a1504',1,'LiDARcloud::enableMessages()'],['../class_photosynthesis_model.html#ade42037f5602cd241150133f496fc1a9',1,'PhotosynthesisModel::enableMessages()'],['../class_radiation_model.html#abd5d02245b9dbd9401e2a7a65b37c95c',1,'RadiationModel::enableMessages()'],['../class_stomatal_conductance_model.html#a8cb0e8867b0c74c2777fd6c5f0b0b200',1,'StomatalConductanceModel::enableMessages()'],['../class_visualizer.html#aaf6a79caee464bfe52cb4fd34d3882d2',1,'Visualizer::enableMessages()']]], - ['enableobjectdetection_12',['enableObjectDetection',['../class_synthetic_annotation.html#a999f1f8f6e0135c20af979044668abb2',1,'SyntheticAnnotation']]], - ['enablesemanticsegmentation_13',['enableSemanticSegmentation',['../class_synthetic_annotation.html#abd40e35ef90be948265ef8b0d08206e1',1,'SyntheticAnnotation']]], - ['enabletexturemaps_14',['enableTextureMaps',['../struct_shader.html#a7a7ec6989dd0c90dcf290b07fab781a7',1,'Shader']]], - ['enabletexturemasks_15',['enableTextureMasks',['../struct_shader.html#a1da903f6c4f0aabd7df4e1cbcb67137c',1,'Shader']]], - ['energy_20balance_20model_20plugin_20documentation_16',['Energy Balance Model Plugin Documentation',['../_energy_balance_doc.html',1,'PlugIns']]], - ['energybalancemodel_17',['EnergyBalanceModel',['../class_energy_balance_model.html#ad6c6f535390c7fcb4957a33cfc13b140',1,'EnergyBalanceModel::EnergyBalanceModel()'],['../class_energy_balance_model.html',1,'EnergyBalanceModel']]], - ['energybalancemodel_2ecpp_18',['EnergyBalanceModel.cpp',['../_energy_balance_model_8cpp.html',1,'']]], - ['energybalancemodel_2ecu_19',['EnergyBalanceModel.cu',['../_energy_balance_model_8cu.html',1,'']]], - ['energybalancemodel_2eh_20',['EnergyBalanceModel.h',['../_energy_balance_model_8h.html',1,'']]], - ['enforceperiodicboundary_21',['enforcePeriodicBoundary',['../class_radiation_model.html#a46c60b11342d10feed8f3a431df415bd',1,'RadiationModel']]], - ['evaluatecdfresid_22',['evaluateCDFresid',['../_canopy_generator_8h.html#a22e592a9de7a15c01e7c87d077fdde2a',1,'evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#a22e592a9de7a15c01e7c87d077fdde2a',1,'evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution): CanopyGenerator.cpp']]], - ['exitdiameter_23',['exitDiameter',['../struct_aerial_scan_metadata.html#aa42ea7d97c0d88bedea8ebeab10c4c84',1,'AerialScanMetadata::exitDiameter()'],['../struct_scan_metadata.html#a86d36162498a4de96a04ce83976c8e22',1,'ScanMetadata::exitDiameter()']]], - ['exportgtheta_24',['exportGtheta',['../class_li_d_a_rcloud.html#af680cbb9eb0c1ebf49f71f0062d18c0c',1,'LiDARcloud']]], - ['exportleafareadensities_25',['exportLeafAreaDensities',['../class_li_d_a_rcloud.html#a6e438fd60af7f54f4d1c09ac64fd7338',1,'LiDARcloud']]], - ['exportleafareas_26',['exportLeafAreas',['../class_li_d_a_rcloud.html#a8e8bd43bf3b2c107994fee402c41240f',1,'LiDARcloud']]], - ['exportpointcloud_27',['exportPointCloud',['../class_aerial_li_d_a_rcloud.html#a7f0992570b8535f687fd7067eb9f3593',1,'AerialLiDARcloud::exportPointCloud()'],['../class_li_d_a_rcloud.html#a2d0c11c6d8001171269232ff5d7f6322',1,'LiDARcloud::exportPointCloud(const char *filename)'],['../class_li_d_a_rcloud.html#ae9910fa1aae6b8b077d57417c130e753',1,'LiDARcloud::exportPointCloud(const char *filename, uint scanID)']]], - ['exportpointcloudptx_28',['exportPointCloudPTX',['../class_li_d_a_rcloud.html#ac48fe9018f26664dd9abd8c100fccaa6',1,'LiDARcloud']]], - ['exporttriangleareas_29',['exportTriangleAreas',['../class_li_d_a_rcloud.html#a416638f486c4fd2572a9589b69605fe7',1,'LiDARcloud::exportTriangleAreas(const char *filename)'],['../class_li_d_a_rcloud.html#adb93e3a16abc8100b2e5dac956c6cc3e',1,'LiDARcloud::exportTriangleAreas(const char *filename, int gridcell)']]], - ['exporttriangleinclinationdistribution_30',['exportTriangleInclinationDistribution',['../class_li_d_a_rcloud.html#aadeb8297b74a75fd003f6c96fe378043',1,'LiDARcloud']]], - ['exporttrianglenormals_31',['exportTriangleNormals',['../class_li_d_a_rcloud.html#ad030fdddcfa669d6af513eb66a9cbd1a',1,'LiDARcloud::exportTriangleNormals(const char *filename)'],['../class_li_d_a_rcloud.html#aa8376ce652d2e95e886d4d60d321c274',1,'LiDARcloud::exportTriangleNormals(const char *filename, int gridcell)']]], - ['extent_32',['extent',['../struct_aerial_scan_metadata.html#a5c51ed2d651b82502f0921bb52d80095',1,'AerialScanMetadata']]] + ['5_3a_20primitive_20data_0',['Tutorial 5: Primitive Data',['../context_primdata.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/all_6.js b/doc/html/search/all_6.js index 2e921a919..24ffab6ff 100644 --- a/doc/html/search/all_6.js +++ b/doc/html/search/all_6.js @@ -1,19 +1,4 @@ var searchData= [ - ['face_0',['face',['../struct_per_ray_data.html#afc61137cf7b0e132eeb05b908b899790',1,'PerRayData']]], - ['farquharmodelcoefficients_1',['FarquharModelCoefficients',['../struct_farquhar_model_coefficients.html',1,'']]], - ['file_20input_2foutput_2',['File Input/Output',['../_i_o.html',1,'']]], - ['fileio_2ecpp_3',['fileIO.cpp',['../lidar_2src_2file_i_o_8cpp.html',1,'(Global Namespace)'],['../aeriallidar_2src_2file_i_o_8cpp.html',1,'(Global Namespace)']]], - ['filterobjectsbydata_4',['filterObjectsByData',['../classhelios_1_1_context.html#a6263c6f3b15c1e66f7bd902f1da6d8a8',1,'helios::Context::filterObjectsByData(const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const'],['../classhelios_1_1_context.html#a6c14f758352ebe13c74ec4ebcb1d29a9',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, float filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#aaf93fbdf1f58127a5af34cc166247649',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, double filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#ac677208cd4aca4855e6681bff3a430b8',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, int filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#af5740b7d57d1b7fe2c7e699b498c66f0',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, uint filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#a05ee48c5e13900f8c9815954bb4c7b06',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, const std::string &filter_value)']]], - ['filterprimitivesbydata_5',['filterPrimitivesByData',['../classhelios_1_1_context.html#a416b75bbf3ddf4ca0184df35651f41b7',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#a93513af810192e6802d20a7e5579b005',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, double filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#a271237c1395c7460e89fcd25452d6d68',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, int filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#ad37d63ef2955fcef29ddcc6908055c1b',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, uint filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#a622fabc835cfed565c78fa6db6a34535',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, const std::string &filter_value)']]], - ['firsthitfilter_6',['firstHitFilter',['../class_li_d_a_rcloud.html#a869540860f4cace62dbd2fb54353bd33',1,'LiDARcloud']]], - ['flatten_7',['flatten',['../group__functions.html#ga1d91aa279bfa52924ce4ad1ff25e73fa',1,'helios::flatten(const std::vector< std::vector< helios::vec3 > > &vec)'],['../group__functions.html#ga46b186805c705dc05ded72b791ed90a4',1,'helios::flatten(const std::vector< std::vector< std::vector< uint > > > &vec)'],['../group__functions.html#ga14adccb0f309850b9d5aa740588b8624',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< std::string > > > > &vec)'],['../group__functions.html#gac6c182edd6f37635bbce1abbb5306a20',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::int4 > > > > &vec)'],['../group__functions.html#gac15b07838d4cd90b7b7f863821d34665',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::int3 > > > > &vec)'],['../group__functions.html#ga228d0ed0a34866dd6ae4be83ec7d3246',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::int2 > > > > &vec)'],['../group__functions.html#ga4bcec227cba69446f0c211a8efa79fa7',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::vec4 > > > > &vec)'],['../group__functions.html#gad0ba764dc082b4fe92c2edf2b691df06',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::vec3 > > > > &vec)'],['../group__functions.html#ga17ade4062b75a329ec1b59f28d854614',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::vec2 > > > > &vec)'],['../group__functions.html#ga1872f5844481b4cd876848cb7282a76a',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< double > > > > &vec)'],['../group__functions.html#gac265cf2f4fcc89d40729f11cccdcd334',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< float > > > > &vec)'],['../group__functions.html#ga121757e2774279472d1ffa068313dbfc',1,'helios::flatten(const std::vector< std::vector< int > > &vec)'],['../group__functions.html#gabbee61759ee5dbc76a83f1356bc4e427',1,'helios::flatten(const std::vector< std::vector< uint > > &vec)'],['../group__functions.html#gacce06754824eb0f9ec29d043c8970fdd',1,'helios::flatten(const std::vector< std::vector< float > > &vec)'],['../group__functions.html#ga024396adf0d734eb2a5dab7150455412',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< uint > > > > &vec)'],['../group__functions.html#gaa82d824f02499ea89a35f49837c73c16',1,'helios::flatten(const std::vector< std::vector< helios::vec2 > > &vec)'],['../group__functions.html#ga3499b80c2201907203b3457f1fb62c80',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< int > > > > &vec)'],['../group__functions.html#gab81afa45742b33913932e93d18027bb9',1,'helios::flatten(const std::vector< std::vector< helios::vec4 > > &vec)'],['../group__functions.html#ga7d6b41f67d574ad1eda29386f7602fd3',1,'helios::flatten(const std::vector< std::vector< helios::int2 > > &vec)'],['../group__functions.html#gaacf3de9501039033bbf3ce1192a5b980',1,'helios::flatten(const std::vector< std::vector< helios::int3 > > &vec)'],['../group__functions.html#gaba0182e0dee319764079263d3c6515cb',1,'helios::flatten(const std::vector< std::vector< helios::int4 > > &vec)'],['../group__functions.html#gacba6e64852b80969f8529e7e4ca9cd0c',1,'helios::flatten(const std::vector< std::vector< std::string > > &vec)'],['../group__functions.html#ga9b7c03082c314d9f694fb939c0ea1550',1,'helios::flatten(const std::vector< std::vector< std::vector< int > > > &vec)'],['../group__functions.html#ga8148b3dd86a772edcee01ed3e788c344',1,'helios::flatten(const std::vector< std::vector< double > > &vec)'],['../group__functions.html#ga4837a536a7387f8721f7b9d8cad201e8',1,'helios::flatten(const std::vector< std::vector< std::vector< float > > > &vec)'],['../group__functions.html#ga480225bd53c0fbc332edca0a0d9a9ebf',1,'helios::flatten(const std::vector< std::vector< std::vector< double > > > &vec)'],['../group__functions.html#ga69b9012c4d9aa9c34bba25cca4e53119',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::vec2 > > > &vec)'],['../group__functions.html#ga31baa6f6552d52b2cc79561fc3457a88',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::vec3 > > > &vec)'],['../group__functions.html#ga82feb62a40fb10cba137a8d38eacf003',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::vec4 > > > &vec)'],['../group__functions.html#ga96b392b637a3fcc21a7944000323e57e',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::int2 > > > &vec)'],['../group__functions.html#gadc8836b0f49c4a8b5bc5bcab058a63ad',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::int3 > > > &vec)'],['../group__functions.html#ga4e10f3b2de7e94bf1d7e6c7c4e5f2573',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::int4 > > > &vec)'],['../group__functions.html#ga0da91aa5e844a63b491026a1b772cea9',1,'helios::flatten(const std::vector< std::vector< std::vector< std::string > > > &vec)']]], - ['floralbud_8',['FloralBud',['../struct_floral_bud.html',1,'']]], - ['focal_5fplane_5fdistance_9',['focal_plane_distance',['../struct_camera_properties.html#a7eae760b6f6729b2e391d0b96d07b209',1,'CameraProperties']]], - ['fov_5faspect_5fratio_10',['FOV_aspect_ratio',['../struct_camera_properties.html#ae1e4df4d4612fd652ccd1e57fc71d104',1,'CameraProperties']]], - ['fruit_5fcolor_11',['fruit_color',['../struct_tomato_parameters.html#a279c4b778fee52501f8daedd4133f469',1,'TomatoParameters']]], - ['fruit_5fradius_12',['fruit_radius',['../struct_walnut_canopy_parameters.html#a620fceb81c9e7cdc0d350f51183f9b8e',1,'WalnutCanopyParameters::fruit_radius()'],['../struct_strawberry_parameters.html#a4dd66f8aa042b1815999674beb9015e6',1,'StrawberryParameters::fruit_radius()'],['../struct_tomato_parameters.html#ae1c9e01c2ec65614c5302c8287ecd80a',1,'TomatoParameters::fruit_radius()']]], - ['fruit_5fsubdivisions_13',['fruit_subdivisions',['../struct_walnut_canopy_parameters.html#a4c3ac117f2b32ee15b22ff2e0ec4c325',1,'WalnutCanopyParameters::fruit_subdivisions()'],['../struct_strawberry_parameters.html#a5834190bacb193cf1fba6a1c68aa4116',1,'StrawberryParameters::fruit_subdivisions()'],['../struct_tomato_parameters.html#a42340b46c2de4ed21b1520cbfe7897db',1,'TomatoParameters::fruit_subdivisions()']]], - ['fruit_5ftexture_5ffile_14',['fruit_texture_file',['../struct_walnut_canopy_parameters.html#a43de7836434a46b15520a96a80036d89',1,'WalnutCanopyParameters::fruit_texture_file()'],['../struct_strawberry_parameters.html#aa15e29acb98b00a55cada2dfaca847ac',1,'StrawberryParameters::fruit_texture_file()']]], - ['fzero_15',['fzero',['../global_8h.html#a464923f1888b6ba4dc1a3b6881fa9e80',1,'helios']]] + ['6_3a_20global_20data_0',['Tutorial 6: Global Data',['../context_globaldata.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/all_7.js b/doc/html/search/all_7.js index 59b3edf60..5a8ca5087 100644 --- a/doc/html/search/all_7.js +++ b/doc/html/search/all_7.js @@ -1,253 +1,4 @@ var searchData= [ - ['g_0',['g',['../structhelios_1_1_r_g_b_acolor.html#ac018f8ed01b4d4128a68ebe42e1e6a00',1,'helios::RGBAcolor::g()'],['../structhelios_1_1_r_g_bcolor.html#ae002d220d8695538760eee2a6c4e9023',1,'helios::RGBcolor::g()']]], - ['gapfillmisses_1',['gapfillMisses',['../class_li_d_a_rcloud.html#aa70d9c9fb6ca8c20a818c2bc68d39077',1,'LiDARcloud::gapfillMisses(uint scanID, const bool gapfill_grid_only, const bool add_flags)'],['../class_li_d_a_rcloud.html#a544384a19e7d060c85eb5a8daa1aeef4',1,'LiDARcloud::gapfillMisses(uint scanID)'],['../class_li_d_a_rcloud.html#a53b80def6bff07231b8d2b10eb3e0330',1,'LiDARcloud::gapfillMisses()']]], - ['generateheightmodel_2',['generateHeightModel',['../class_aerial_li_d_a_rcloud.html#afc44503e2a6eb986fa79b5af56069468',1,'AerialLiDARcloud']]], - ['geometric_20primitives_3',['Geometric Primitives',['../group__primitives.html',1,'']]], - ['germination_5fprobability_4',['germination_probability',['../struct_bean_parameters.html#a9bec1a611d5100e6e7417b70a47cbe06',1,'BeanParameters']]], - ['getallcameralabels_5',['getAllCameraLabels',['../class_radiation_model.html#a4719caf3bacb35b9d58dc853b56d6a0b',1,'RadiationModel']]], - ['getallfloweruuids_6',['getAllFlowerUUIDs',['../class_plant_architecture.html#a056eb82b161cc72288da7844d35f44f5',1,'PlantArchitecture']]], - ['getallfruituuids_7',['getAllFruitUUIDs',['../class_plant_architecture.html#aa4da1e4c28959b7f5540aa5ff160b2d1',1,'PlantArchitecture']]], - ['getallinternodeuuids_8',['getAllInternodeUUIDs',['../class_plant_architecture.html#a70553116dc967d84f17063dd9d734db9',1,'PlantArchitecture']]], - ['getallleafuuids_9',['getAllLeafUUIDs',['../class_plant_architecture.html#a5431bd0712f4def9fd27cad03065d755',1,'PlantArchitecture']]], - ['getallobjectids_10',['getAllObjectIDs',['../classhelios_1_1_context.html#a2ef355a3298b21313700acec64232e22',1,'helios::Context::getAllObjectIDs()'],['../class_plant_architecture.html#a9069b1d637752f0a74ded148ae1706b0',1,'PlantArchitecture::getAllObjectIDs() const']]], - ['getallpeduncleuuids_11',['getAllPeduncleUUIDs',['../class_plant_architecture.html#ad46693fc275721338c8f24cb764b2bf1',1,'PlantArchitecture']]], - ['getallpetioleuuids_12',['getAllPetioleUUIDs',['../class_plant_architecture.html#afd1c00e6b5b6aa45e212aeb6b68cb825',1,'PlantArchitecture']]], - ['getallplantobjectids_13',['getAllPlantObjectIDs',['../class_plant_architecture.html#acf9855048c790d30d8d4de7fa1dc3550',1,'PlantArchitecture']]], - ['getallplantuuids_14',['getAllPlantUUIDs',['../class_plant_architecture.html#a3bdffb4e53fe0da836a40de80946d31f',1,'PlantArchitecture']]], - ['getalluuids_15',['getAllUUIDs',['../classhelios_1_1_context.html#a98516632daccf958cca6b5b6582310bb',1,'helios::Context::getAllUUIDs()'],['../class_canopy_generator.html#a8e395619077d656e206f4159f0bf8d34',1,'CanopyGenerator::getAllUUIDs()'],['../class_plant_architecture.html#afec06c56ae296984727c90413511cf6a',1,'PlantArchitecture::getAllUUIDs()'],['../class_weber_penn_tree.html#a19e16f9a51493680afebc38f3c434400',1,'WeberPennTree::getAllUUIDs()']]], - ['getambientlongwaveflux_16',['getAmbientLongwaveFlux',['../class_solar_position.html#a30ee555eedece8b7e19855877a74da71',1,'SolarPosition']]], - ['getarea_17',['getArea',['../classhelios_1_1_compound_object.html#a8bb518f6166e2a2831a68a7626787ac1',1,'helios::CompoundObject']]], - ['getaxisunitvector_18',['getAxisUnitVector',['../classhelios_1_1_cone.html#a60fc92fbb15149017956449123c0e4d0',1,'helios::Cone']]], - ['getbmfcoefficientsfromlibrary_19',['getBMFCoefficientsFromLibrary',['../class_stomatal_conductance_model.html#ada09940a1cc67dbfc0192f6e0a50c967',1,'StomatalConductanceModel']]], - ['getboxobjectcenter_20',['getBoxObjectCenter',['../classhelios_1_1_context.html#af73c44dace71ec805136b7d6ad6095a9',1,'helios::Context']]], - ['getboxobjectpointer_21',['getBoxObjectPointer',['../classhelios_1_1_context.html#a1ecbb5a8cfa6764bade6e0650d2f6990',1,'helios::Context']]], - ['getboxobjectsize_22',['getBoxObjectSize',['../classhelios_1_1_context.html#a4e5799ba4b6a0a889f446bef9e4d3dc0',1,'helios::Context']]], - ['getboxobjectsubdivisioncount_23',['getBoxObjectSubdivisionCount',['../classhelios_1_1_context.html#a258f524d38cdeb5f6c83a7f387608490',1,'helios::Context']]], - ['getboxobjectvolume_24',['getBoxObjectVolume',['../classhelios_1_1_context.html#ae31cc8855aacb6380a288a4b7fa8db82',1,'helios::Context']]], - ['getbranchuuids_25',['getBranchUUIDs',['../class_canopy_generator.html#ab7115aaa287346b9c8e7854bd66f8b5f',1,'CanopyGenerator::getBranchUUIDs(uint PlantID)'],['../class_canopy_generator.html#a7db6f05ab623b77de4e8a81dc132e914',1,'CanopyGenerator::getBranchUUIDs()'],['../class_weber_penn_tree.html#a813cb8959272b535050dc97aa49d3ed3',1,'WeberPennTree::getBranchUUIDs()']]], - ['getcameralookat_26',['getCameraLookat',['../class_radiation_model.html#a68c8736e58c7daf440ff9c93bb00522d',1,'RadiationModel']]], - ['getcameraorientation_27',['getCameraOrientation',['../class_radiation_model.html#a0b67b056aa1f2b5e6c42a06e358f4eb8',1,'RadiationModel']]], - ['getcameraposition_28',['getCameraPosition',['../class_radiation_model.html#a6785deae272a9464920030fc3f124bc3',1,'RadiationModel']]], - ['getcameraresponsescale_29',['getCameraResponseScale',['../struct_camera_calibration.html#a18eff4a7ecab1038f27b68c3963a5513',1,'CameraCalibration::getCameraResponseScale()'],['../class_radiation_model.html#adb5a74547d51a18018d3daeba0ec5f3c',1,'RadiationModel::getCameraResponseScale()']]], - ['getcellcenter_30',['getCellCenter',['../class_li_d_a_rcloud.html#a6e2ce01abb33cc0f80b2aa653ac6a445',1,'LiDARcloud::getCellCenter()'],['../class_aerial_li_d_a_rcloud.html#a6e83c157d63d12253af3b81b995e1a33',1,'AerialLiDARcloud::getCellCenter(const helios::int3 ijk) const']]], - ['getcellcoverfraction_31',['getCellCoverFraction',['../class_aerial_li_d_a_rcloud.html#ac714e2231b63d1455237662661590b16',1,'AerialLiDARcloud']]], - ['getcellglobalanchor_32',['getCellGlobalAnchor',['../class_li_d_a_rcloud.html#ad1ad4f851b5b7fcbf5b088b161aed83e',1,'LiDARcloud']]], - ['getcellgroundheight_33',['getCellGroundHeight',['../class_aerial_li_d_a_rcloud.html#a3b9d9ac013a041c30d58e68e5dc92bee',1,'AerialLiDARcloud']]], - ['getcellgtheta_34',['getCellGtheta',['../class_li_d_a_rcloud.html#a54351e18e3f4155e9d55eb02bd63c722',1,'LiDARcloud']]], - ['getcellleafarea_35',['getCellLeafArea',['../class_li_d_a_rcloud.html#ac9d20a35bdb7ee2d45490ac1cd520117',1,'LiDARcloud::getCellLeafArea()'],['../class_aerial_li_d_a_rcloud.html#a9f90891b20b8996e983e66640684b6cc',1,'AerialLiDARcloud::getCellLeafArea()']]], - ['getcellleafareadensity_36',['getCellLeafAreaDensity',['../class_li_d_a_rcloud.html#a3c1744984481f9629dc1371291fa397e',1,'LiDARcloud::getCellLeafAreaDensity()'],['../class_aerial_li_d_a_rcloud.html#a4ca0903b642daffdff27e69a172c96b5',1,'AerialLiDARcloud::getCellLeafAreaDensity(const helios::int3 ijk) const']]], - ['getcellmaximumhitheight_37',['getCellMaximumHitHeight',['../class_aerial_li_d_a_rcloud.html#a00f6479153ac2025031b70bd5637b65b',1,'AerialLiDARcloud']]], - ['getcellprimitives_38',['getCellPrimitives',['../class_voxel_intersection.html#a7d50123db71cf5cd7c7cc4582abd5cb2',1,'VoxelIntersection']]], - ['getcellrbar_39',['getCellRbar',['../class_aerial_li_d_a_rcloud.html#ae35261c7fc1553cb15fb318a2b14a3b2',1,'AerialLiDARcloud']]], - ['getcellrotation_40',['getCellRotation',['../class_li_d_a_rcloud.html#aa2cba1d0bcd9a2ae35d9a5be03832efc',1,'LiDARcloud']]], - ['getcellsize_41',['getCellSize',['../class_aerial_li_d_a_rcloud.html#a5bf5379ee229ebb51fdc8195af8cf3e7',1,'AerialLiDARcloud::getCellSize()'],['../class_li_d_a_rcloud.html#a6662330b95ee7ee77ea6647871695c55',1,'LiDARcloud::getCellSize()']]], - ['getcelltransmissionprobability_42',['getCellTransmissionProbability',['../class_aerial_li_d_a_rcloud.html#a98770b70c510e7611fb171d3fe920554',1,'AerialLiDARcloud']]], - ['getcellvegetationheight_43',['getCellVegetationHeight',['../class_aerial_li_d_a_rcloud.html#a12fe426a267cbef9982138537198558a',1,'AerialLiDARcloud']]], - ['getcenter_44',['getCenter',['../classhelios_1_1_tile.html#a18178d0280f8ecc1149663558947ca06',1,'helios::Tile::getCenter()'],['../classhelios_1_1_sphere.html#a48eada17c3dab899a91158f1424518d6',1,'helios::Sphere::getCenter()'],['../classhelios_1_1_box.html#a96e72a40ff113d6a6b463fe8c60b672a',1,'helios::Box::getCenter()'],['../classhelios_1_1_disk.html#ae8ed884a95cbfa2440e3bd9f8e3e4057',1,'helios::Disk::getCenter()']]], - ['getconeobjectaxisunitvector_45',['getConeObjectAxisUnitVector',['../classhelios_1_1_context.html#acaa3fb162b17cb7f912162f5d4be894e',1,'helios::Context']]], - ['getconeobjectlength_46',['getConeObjectLength',['../classhelios_1_1_context.html#ad2b045f361aa8e8596bcf325c1707a25',1,'helios::Context']]], - ['getconeobjectnode_47',['getConeObjectNode',['../classhelios_1_1_context.html#a54e9f0b7c5014a37cd9d5bf74e7d5935',1,'helios::Context']]], - ['getconeobjectnoderadii_48',['getConeObjectNodeRadii',['../classhelios_1_1_context.html#ade2608274b311c809d46bb13943b9e4e',1,'helios::Context']]], - ['getconeobjectnoderadius_49',['getConeObjectNodeRadius',['../classhelios_1_1_context.html#af5acc5647e6bf9cd1649da1dec677110',1,'helios::Context']]], - ['getconeobjectnodes_50',['getConeObjectNodes',['../classhelios_1_1_context.html#a8c4ec2d90ccd3d44a97597ecd80d78b6',1,'helios::Context']]], - ['getconeobjectpointer_51',['getConeObjectPointer',['../classhelios_1_1_context.html#a3221051ea9c1025e8fb00d9dec01839f',1,'helios::Context']]], - ['getconeobjectsubdivisioncount_52',['getConeObjectSubdivisionCount',['../classhelios_1_1_context.html#a1ff97eb95d5896e096156320f5bd5ff0',1,'helios::Context']]], - ['getconeobjectvolume_53',['getConeObjectVolume',['../classhelios_1_1_context.html#af6c1c571171be2604822a8df44d2349c',1,'helios::Context']]], - ['getcurrentcolormap_54',['getCurrentColormap',['../class_visualizer.html#ae2bba6102a283a31ec4f5780817a15da',1,'Visualizer']]], - ['getcurrentphytomerparameters_55',['getCurrentPhytomerParameters',['../class_plant_architecture.html#aaba5ecb6c069be56b3706a4060f5ff49',1,'PlantArchitecture']]], - ['getcurrentshootparameters_56',['getCurrentShootParameters',['../class_plant_architecture.html#a190d91f02c5cfcfad036879460b2e495',1,'PlantArchitecture::getCurrentShootParameters()'],['../class_plant_architecture.html#aa696281e805e8879a78dacdf4354ff38',1,'PlantArchitecture::getCurrentShootParameters(const std::string &shoot_type_label)']]], - ['getdate_57',['getDate',['../classhelios_1_1_context.html#a95dd5bc221cd8bcb4efabd0122d59b4f',1,'helios::Context']]], - ['getdepthmap_58',['getDepthMap',['../class_visualizer.html#a7c6362d7dc0f0bd4bba53195ce92b84e',1,'Visualizer']]], - ['getdiffuseflux_59',['getDiffuseFlux',['../class_radiation_model.html#af8450f2308aee38272b4aef87f0c547b',1,'RadiationModel']]], - ['getdiffusefraction_60',['getDiffuseFraction',['../class_solar_position.html#af8dbd15453ce775dab5b2c5a49b1c93b',1,'SolarPosition']]], - ['getdiskobjectcenter_61',['getDiskObjectCenter',['../classhelios_1_1_context.html#a213aea1539e0bb38965cf2953b1831df',1,'helios::Context']]], - ['getdiskobjectpointer_62',['getDiskObjectPointer',['../classhelios_1_1_context.html#a17c1256a1f57fbae1f34e04b66b76ca8',1,'helios::Context']]], - ['getdiskobjectsize_63',['getDiskObjectSize',['../classhelios_1_1_context.html#acee51918d3ee1d9892e5a51106a625d9',1,'helios::Context']]], - ['getdiskobjectsubdivisioncount_64',['getDiskObjectSubdivisionCount',['../classhelios_1_1_context.html#a86ffc9a6cdcd3851231c64dcc152123c',1,'helios::Context']]], - ['getdomainboundingbox_65',['getDomainBoundingBox',['../classhelios_1_1_context.html#a8690412a63d1eff69e679e48d03c9838',1,'helios::Context::getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const'],['../classhelios_1_1_context.html#ad4ac166bb01547d1cefb1ace7a9b966d',1,'helios::Context::getDomainBoundingBox(const std::vector< uint > &UUIDs, helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const'],['../class_visualizer.html#ae9c98dee278e9bcd5f85b871ff8ddfe5',1,'Visualizer::getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const']]], - ['getdomainboundingradius_66',['getDomainBoundingRadius',['../class_visualizer.html#a783739e072baeafc943a077dcb1cc3d5',1,'Visualizer']]], - ['getdomainboundingsphere_67',['getDomainBoundingSphere',['../classhelios_1_1_context.html#a3a6b0d25c5d9febb17787982c9f09d63',1,'helios::Context::getDomainBoundingSphere(helios::vec3 &center, float &radius) const'],['../classhelios_1_1_context.html#af3e048e969f06e3a0cf36ed3d76766ca',1,'helios::Context::getDomainBoundingSphere(const std::vector< uint > &UUIDs, helios::vec3 &center, float &radius) const']]], - ['getempiricalmodelcoefficients_68',['getEmpiricalModelCoefficients',['../class_photosynthesis_model.html#a86094d579852c2dc846acc2a97e6ac44',1,'PhotosynthesisModel']]], - ['getfarquharcoefficientsfromlibrary_69',['getFarquharCoefficientsFromLibrary',['../class_photosynthesis_model.html#ae40570ef642d5d4dc070dce9ba093f16',1,'PhotosynthesisModel']]], - ['getfarquharmodelcoefficients_70',['getFarquharModelCoefficients',['../class_photosynthesis_model.html#aeab92cd73298c5f89626b30ce8c41cf9',1,'PhotosynthesisModel']]], - ['getfileextension_71',['getFileExtension',['../global_8h.html#a58e660bb08e1ce13466825ae666467ef',1,'helios']]], - ['getfilename_72',['getFileName',['../global_8h.html#a63bd49091fdab0e262b051f61fb9a902',1,'helios']]], - ['getfilepath_73',['getFilePath',['../global_8h.html#ad76f15d03b511d1bf5123d64d804d6e8',1,'helios']]], - ['getfilestem_74',['getFileStem',['../global_8h.html#a9fff8cb6c3474de479f81c12f173d3ed',1,'helios']]], - ['getframebuffersize_75',['getFramebufferSize',['../class_visualizer.html#ab3b0261a21e7f552d55e4d2fda55f94f',1,'Visualizer']]], - ['getfruituuids_76',['getFruitUUIDs',['../class_canopy_generator.html#abdcc431929f98e57db4b9ed2dc26a616',1,'CanopyGenerator::getFruitUUIDs()'],['../class_canopy_generator.html#a8ab509f22c4bdffd57b44f67f43ce728',1,'CanopyGenerator::getFruitUUIDs(uint PlantID)']]], - ['getglobaldata_77',['getGlobalData',['../classhelios_1_1_context.html#a0572c1557ec60ae7389072e8ab3c2113',1,'helios::Context::getGlobalData(const char *label, std::vector< std::string > &data) const'],['../classhelios_1_1_context.html#a890583b0897bfcd730d137838fa7e155',1,'helios::Context::getGlobalData(const char *label, std::string &data) const'],['../classhelios_1_1_context.html#a972fa4a45b2775f6047d41b88dc69d03',1,'helios::Context::getGlobalData(const char *label, int &data) const'],['../classhelios_1_1_context.html#a175d9a1955f428b0f2d6b11ab3b17659',1,'helios::Context::getGlobalData(const char *label, std::vector< int > &data) const'],['../classhelios_1_1_context.html#a98cbb0d37dc9fafaad14184cb889534f',1,'helios::Context::getGlobalData(const char *label, uint &data) const'],['../classhelios_1_1_context.html#a931a92ba7e9916c64d164bc1f29ff754',1,'helios::Context::getGlobalData(const char *label, std::vector< uint > &data) const'],['../classhelios_1_1_context.html#ac1f5f6c3f24577cd5c4657c441483425',1,'helios::Context::getGlobalData(const char *label, float &data) const'],['../classhelios_1_1_context.html#a863264ab1339ba35c3754bfbf4c69eec',1,'helios::Context::getGlobalData(const char *label, std::vector< float > &data) const'],['../classhelios_1_1_context.html#a8ec49c820f10831b4b27059d4d1749d6',1,'helios::Context::getGlobalData(const char *label, double &data) const'],['../classhelios_1_1_context.html#a66e7d689b62d9ad47fb85ad45664c97f',1,'helios::Context::getGlobalData(const char *label, std::vector< double > &data) const'],['../classhelios_1_1_context.html#a6f4d6971c05d78aff30b92d277014b9f',1,'helios::Context::getGlobalData(const char *label, helios::vec2 &data) const'],['../classhelios_1_1_context.html#afc90a3d0143273e436541fc3bc9c5554',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::vec2 > &data) const'],['../classhelios_1_1_context.html#a990fdccf51979e235a1acba08e54583b',1,'helios::Context::getGlobalData(const char *label, helios::vec3 &data) const'],['../classhelios_1_1_context.html#a0376e2dc456e481bd055d5a84b7785f2',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::vec3 > &data) const'],['../classhelios_1_1_context.html#a3f621b536c3585d7f808698e2f0cd826',1,'helios::Context::getGlobalData(const char *label, helios::vec4 &data) const'],['../classhelios_1_1_context.html#ab0f329c8584b002dda2d77719073bf5d',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::vec4 > &data) const'],['../classhelios_1_1_context.html#aea16d4845e23fe44ae1da4c032ea57e3',1,'helios::Context::getGlobalData(const char *label, helios::int2 &data) const'],['../classhelios_1_1_context.html#a609563835616233b15fd263bb2e8857d',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::int2 > &data) const'],['../classhelios_1_1_context.html#aba7c4fe63193509f40ca6682cddfa9a3',1,'helios::Context::getGlobalData(const char *label, helios::int3 &data) const'],['../classhelios_1_1_context.html#abbc6d463f6d722fca56ad219c8278c16',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::int3 > &data) const'],['../classhelios_1_1_context.html#a2b2f0570e50711f34bb24dc01c8a7b43',1,'helios::Context::getGlobalData(const char *label, helios::int4 &data) const'],['../classhelios_1_1_context.html#ad08d9d2bea2c93b14ae2b3678aea2e29',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::int4 > &data) const']]], - ['getglobaldatasize_78',['getGlobalDataSize',['../classhelios_1_1_context.html#a96d1060d1329dc467380ce2e5eafd559',1,'helios::Context']]], - ['getglobaldatatype_79',['getGlobalDataType',['../classhelios_1_1_context.html#a94bf0b919e5e6034fa45fbae2f575947',1,'helios::Context']]], - ['getgridboundingbox_80',['getGridBoundingBox',['../class_li_d_a_rcloud.html#a041ac4ba388c407a35b7f895029038e6',1,'LiDARcloud']]], - ['getgridcellcount_81',['getGridCellCount',['../class_li_d_a_rcloud.html#a28297a71becd69b30820d69b110fcc90',1,'LiDARcloud']]], - ['getgridcenter_82',['getGridCenter',['../class_aerial_li_d_a_rcloud.html#ad639b0d2337b74b1bd4949cc2aba88e0',1,'AerialLiDARcloud']]], - ['getgridextent_83',['getGridExtent',['../class_aerial_li_d_a_rcloud.html#a85ea1ea67ed12f2bbcfc28ef9a78dd77',1,'AerialLiDARcloud']]], - ['getgridresolution_84',['getGridResolution',['../class_aerial_li_d_a_rcloud.html#ae750e548d565d6305e600c5af8360fdb',1,'AerialLiDARcloud']]], - ['getgridrotation_85',['getGridRotation',['../class_aerial_li_d_a_rcloud.html#aace3b3baae4a75be461eb31f617ee695',1,'AerialLiDARcloud']]], - ['getgrounduuids_86',['getGroundUUIDs',['../class_canopy_generator.html#a6f0003d6ca29cbb56657442c7a48ad14',1,'CanopyGenerator']]], - ['gethitboundingbox_87',['getHitBoundingBox',['../class_aerial_li_d_a_rcloud.html#a74b0e833ecb6ee1b3ce3010f3d38d74d',1,'AerialLiDARcloud::getHitBoundingBox()'],['../class_li_d_a_rcloud.html#a45bc37a4d26eb74a944c594a7f3cb54b',1,'LiDARcloud::getHitBoundingBox()']]], - ['gethitcolor_88',['getHitColor',['../class_aerial_li_d_a_rcloud.html#af8f49444eb1d166837c322d03ea1cbfa',1,'AerialLiDARcloud::getHitColor()'],['../class_li_d_a_rcloud.html#aafafed9102966992d3cfb3772fa2ada1',1,'LiDARcloud::getHitColor()']]], - ['gethitcount_89',['getHitCount',['../class_aerial_li_d_a_rcloud.html#aaf287ef121543f10e9e73579bf77281a',1,'AerialLiDARcloud::getHitCount()'],['../class_li_d_a_rcloud.html#a691fd3bbd1262d80e10a674c82c6f568',1,'LiDARcloud::getHitCount()']]], - ['gethitdata_90',['getHitData',['../class_aerial_li_d_a_rcloud.html#a240af79b825bc886e886ff7ff0e0476c',1,'AerialLiDARcloud::getHitData()'],['../class_li_d_a_rcloud.html#a274ef68850afa3f288bb648d9fd6a59a',1,'LiDARcloud::getHitData()']]], - ['gethitgridcell_91',['getHitGridCell',['../class_aerial_li_d_a_rcloud.html#a26bc32e67d3195222f11fb72fb7d63da',1,'AerialLiDARcloud::getHitGridCell()'],['../class_li_d_a_rcloud.html#a251c4f3bbefdd07212cd8fe1037dc0d7',1,'LiDARcloud::getHitGridCell(uint index) const']]], - ['gethitindex_92',['getHitIndex',['../class_li_d_a_rcloud.html#a34eee980f365fdd5469a0cc6ee3a36f5',1,'LiDARcloud']]], - ['gethitraydir_93',['getHitRaydir',['../class_aerial_li_d_a_rcloud.html#ac0f8ba05e24d146d01ee2af0fb9ece7d',1,'AerialLiDARcloud::getHitRaydir()'],['../class_li_d_a_rcloud.html#aa91258bd97d6fcacd3313d8b55cceed4',1,'LiDARcloud::getHitRaydir(uint index) const']]], - ['gethitscanid_94',['getHitScanID',['../class_li_d_a_rcloud.html#a5510b2a0d0a878930e9f11331494bf41',1,'LiDARcloud::getHitScanID()'],['../class_aerial_li_d_a_rcloud.html#aaa2bbd15dad66355175fb733630456a4',1,'AerialLiDARcloud::getHitScanID()']]], - ['gethitxyz_95',['getHitXYZ',['../class_li_d_a_rcloud.html#ac5f234b6200419f10fe82c9abe409cbd',1,'LiDARcloud::getHitXYZ()'],['../class_aerial_li_d_a_rcloud.html#a3363ac3ffff1bbdd164b6074010d75ba',1,'AerialLiDARcloud::getHitXYZ()']]], - ['getimageresolution_96',['getImageResolution',['../classhelios_1_1_texture.html#a4e106c0c80f0c4c065e5ff71193aaeab',1,'helios::Texture']]], - ['getimageresolutionjpeg_97',['getImageResolutionJPEG',['../global_8h.html#a94c80cbffdccaea7991b439acf8e9eb4',1,'helios']]], - ['getjuliandate_98',['getJulianDate',['../classhelios_1_1_context.html#a23f2611ed71eeefe8cf772cab98de4d4',1,'helios::Context']]], - ['getleafspectra_99',['getLeafSpectra',['../class_leaf_optics.html#a6b9fa9b6fb34fe7738e425b19118005a',1,'LeafOptics']]], - ['getleafuuids_100',['getLeafUUIDs',['../class_canopy_generator.html#a3509012720b5fd256a14bc2924a3b164',1,'CanopyGenerator::getLeafUUIDs(uint PlantID)'],['../class_canopy_generator.html#a73680976a2826f0b5dbf567551fd5593',1,'CanopyGenerator::getLeafUUIDs()'],['../class_weber_penn_tree.html#af4368c1f900503f6d72f0c0e569fe8e5',1,'WeberPennTree::getLeafUUIDs()']]], - ['getlength_101',['getLength',['../classhelios_1_1_tube.html#ad3c194a0f9977e212ac425aefe4032bf',1,'helios::Tube::getLength()'],['../classhelios_1_1_cone.html#ada36b3fe4850f16c4dfa58c38a8da80c',1,'helios::Cone::getLength()']]], - ['getloadedxmlfiles_102',['getLoadedXMLFiles',['../classhelios_1_1_context.html#a48a8a843b99c36ad357dba13ee6f1774',1,'helios::Context']]], - ['getlocation_103',['getLocation',['../classhelios_1_1_context.html#af4b1fa52419259a0c8a2faeb7484a439',1,'helios::Context']]], - ['getmonthstring_104',['getMonthString',['../classhelios_1_1_context.html#a6189f6ab35669f4fefde571ec362247c',1,'helios::Context']]], - ['getnodecolors_105',['getNodeColors',['../classhelios_1_1_tube.html#aae753418cb304e97c296240dc9919388',1,'helios::Tube']]], - ['getnodecoordinate_106',['getNodeCoordinate',['../classhelios_1_1_cone.html#a4f6ddd7fd23d61528ada9df1e333ad17',1,'helios::Cone']]], - ['getnodecoordinates_107',['getNodeCoordinates',['../classhelios_1_1_cone.html#a9eaab4331e325c85ce9f4c101135c966',1,'helios::Cone']]], - ['getnoderadii_108',['getNodeRadii',['../classhelios_1_1_tube.html#a29823b956371d22b35add97fc6831cab',1,'helios::Tube::getNodeRadii()'],['../classhelios_1_1_cone.html#adc5370734810e4b526bf0d42e143ecf8',1,'helios::Cone::getNodeRadii() const']]], - ['getnoderadius_109',['getNodeRadius',['../classhelios_1_1_cone.html#a2334ca87f6bb556b411c8a51476b523c',1,'helios::Cone']]], - ['getnodes_110',['getNodes',['../classhelios_1_1_tube.html#ab55e8f7d7a948941027f169d714e365b',1,'helios::Tube']]], - ['getnormal_111',['getNormal',['../classhelios_1_1_tile.html#ab8c70daf8c14bc60caf499b5adce301c',1,'helios::Tile']]], - ['getobjectarea_112',['getObjectArea',['../classhelios_1_1_context.html#aac46a608ec7719e4702cd861667925f1',1,'helios::Context']]], - ['getobjectboundingbox_113',['getObjectBoundingBox',['../classhelios_1_1_context.html#a1b9871bf670404adc1d952e59429ec38',1,'helios::Context::getObjectBoundingBox(uint ObjID, vec3 &min_corner, vec3 &max_corner) const'],['../classhelios_1_1_context.html#ab5aef932bd4b64b1cee932423172ab6f',1,'helios::Context::getObjectBoundingBox(const std::vector< uint > &ObjID, vec3 &min_corner, vec3 &max_corner) const']]], - ['getobjectcenter_114',['getObjectCenter',['../classhelios_1_1_compound_object.html#aff66ca85a22d7f8a2501039e2e7183a7',1,'helios::CompoundObject::getObjectCenter()'],['../classhelios_1_1_context.html#a4fe8ddd10f0d34bfe0b2a4aea648442a',1,'helios::Context::getObjectCenter(uint ObjID) const']]], - ['getobjectcount_115',['getObjectCount',['../classhelios_1_1_context.html#a54b9c5503ad33d1dcc8f6a5c74f7ea76',1,'helios::Context']]], - ['getobjectdata_116',['getObjectData',['../classhelios_1_1_context.html#a293d899bb22cae1db8cf6c2cc813055d',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< float > &data) const'],['../classhelios_1_1_context.html#a8935a9cdf6e34e72bcb636a97043a474',1,'helios::Context::getObjectData(uint objID, const char *label, float &data) const'],['../classhelios_1_1_compound_object.html#ac91c73ac495bc4a93cc9a89d0eb58f47',1,'helios::CompoundObject::getObjectData(const char *label, int &data) const'],['../classhelios_1_1_compound_object.html#aed77927b3d3fe0ea7ea674b20a8acce1',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< int > &data) const'],['../classhelios_1_1_compound_object.html#ac91bb0e57aa261b003de76b3e008a762',1,'helios::CompoundObject::getObjectData(const char *label, uint &data) const'],['../classhelios_1_1_compound_object.html#a7be991a83ada928f25c23cf7ca3b1822',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< uint > &data) const'],['../classhelios_1_1_compound_object.html#ac222719662ca008014cdd045bedd3d96',1,'helios::CompoundObject::getObjectData(const char *label, float &data) const'],['../classhelios_1_1_compound_object.html#ac128057ff1d7cabb9dfbfb33216cb0c5',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< float > &data) const'],['../classhelios_1_1_compound_object.html#a6d99ef1cacec7471bb79b57601a7a6ee',1,'helios::CompoundObject::getObjectData(const char *label, double &data) const'],['../classhelios_1_1_compound_object.html#ac7af8838d7132683dd9fdbffd1288579',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< double > &data) const'],['../classhelios_1_1_compound_object.html#aef1aadca9de0e9a66500ca5879ab3755',1,'helios::CompoundObject::getObjectData(const char *label, vec2 &data) const'],['../classhelios_1_1_compound_object.html#af7574c29395681941d4d875e304b93de',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< vec2 > &data) const'],['../classhelios_1_1_compound_object.html#acea74a2c138c1e5d832df864a231e486',1,'helios::CompoundObject::getObjectData(const char *label, vec3 &data) const'],['../classhelios_1_1_compound_object.html#a797a5fd8f08ff7220b15ae1d5accb6cd',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< vec3 > &data) const'],['../classhelios_1_1_compound_object.html#a52661efba4b57415b073fcf839069623',1,'helios::CompoundObject::getObjectData(const char *label, vec4 &data) const'],['../classhelios_1_1_compound_object.html#a15ef0fda0196b4de933e4379d5f8234f',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< vec4 > &data) const'],['../classhelios_1_1_compound_object.html#a768a439ecb0d6e8449b31cd137317168',1,'helios::CompoundObject::getObjectData(const char *label, int2 &data) const'],['../classhelios_1_1_compound_object.html#af4d1accb01b8dd2f968296c43dfb6d97',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< int2 > &data) const'],['../classhelios_1_1_compound_object.html#a95f20aead49e80032b0673273de436f2',1,'helios::CompoundObject::getObjectData(const char *label, int3 &data) const'],['../classhelios_1_1_compound_object.html#a6cb032fa5f5b6de86f234eb237980586',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< int3 > &data) const'],['../classhelios_1_1_compound_object.html#a2c0dcefe9e05ec04b001ad94f475f34c',1,'helios::CompoundObject::getObjectData(const char *label, int4 &data) const'],['../classhelios_1_1_compound_object.html#aba75ef4dd5b01b02fc99f9a1d957d70b',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< int4 > &data) const'],['../classhelios_1_1_compound_object.html#afa77a9712c207752cd56522f2dbca52b',1,'helios::CompoundObject::getObjectData(const char *label, std::string &data) const'],['../classhelios_1_1_compound_object.html#adfd1f35dc8785f223c02cc940360e6a5',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< std::string > &data) const'],['../classhelios_1_1_context.html#a3511ff568337b501ca878c99d97c9b52',1,'helios::Context::getObjectData(uint objID, const char *label, int &data) const'],['../classhelios_1_1_context.html#ae75ddc9a945ec876533211f52b8cd22e',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< int > &data) const'],['../classhelios_1_1_context.html#abbd59cc4e7bcad35b43ea7240c4d5558',1,'helios::Context::getObjectData(uint objID, const char *label, uint &data) const'],['../classhelios_1_1_context.html#a22d510fad177ca319bdac0a94ee8f069',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< uint > &data) const'],['../classhelios_1_1_context.html#a158215e07c921d11e495b3805823b725',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< std::string > &data) const'],['../classhelios_1_1_context.html#a1eae737b91ec70ae6490a8c403936975',1,'helios::Context::getObjectData(uint objID, const char *label, std::string &data) const'],['../classhelios_1_1_context.html#ae222f3351535f3aea35e76cbe2ca2d67',1,'helios::Context::getObjectData(uint objID, const char *label, double &data) const'],['../classhelios_1_1_context.html#acda7f75e833791bcbd74ca8b37272a8b',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< double > &data) const'],['../classhelios_1_1_context.html#af8fa05c716517966f7abcc2f4019c709',1,'helios::Context::getObjectData(uint objID, const char *label, vec2 &data) const'],['../classhelios_1_1_context.html#a2e691b7f0b630792f50b5423e23ebab1',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< vec2 > &data) const'],['../classhelios_1_1_context.html#a628cf051625e33549044cd20656519ac',1,'helios::Context::getObjectData(uint objID, const char *label, vec3 &data) const'],['../classhelios_1_1_context.html#a6606603899859e211de9f56cd49bf92d',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< vec3 > &data) const'],['../classhelios_1_1_context.html#ac2b7e667ec37c88868ba0752919da1c9',1,'helios::Context::getObjectData(uint objID, const char *label, vec4 &data) const'],['../classhelios_1_1_context.html#ace5025b962226a75c4984ee6ecc21356',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< vec4 > &data) const'],['../classhelios_1_1_context.html#ae56639e95fae8796545efde94fa84bcc',1,'helios::Context::getObjectData(uint objID, const char *label, int2 &data) const'],['../classhelios_1_1_context.html#a39b169b41cf94516afd863f580c2b772',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< int2 > &data) const'],['../classhelios_1_1_context.html#ac58fc8f10c12dc54265491576650a0c6',1,'helios::Context::getObjectData(uint objID, const char *label, int3 &data) const'],['../classhelios_1_1_context.html#ac097e42620523f2d57d28eecd02954a4',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< int3 > &data) const'],['../classhelios_1_1_context.html#aa393d7b0f24855b2e54480be71c09ad2',1,'helios::Context::getObjectData(uint objID, const char *label, int4 &data) const'],['../classhelios_1_1_context.html#a7ca032799776268d30fe185a76100e0e',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< int4 > &data) const']]], - ['getobjectdatasize_117',['getObjectDataSize',['../classhelios_1_1_compound_object.html#a03b2516f8e7e8ae921ea61e4f571eb1d',1,'helios::CompoundObject::getObjectDataSize()'],['../classhelios_1_1_context.html#ac251e9be64f3a35b6d2e6441c2a46f40',1,'helios::Context::getObjectDataSize()']]], - ['getobjectdatatype_118',['getObjectDataType',['../classhelios_1_1_compound_object.html#abbcfd5c545991ee59cf3f77acf300b1e',1,'helios::CompoundObject::getObjectDataType()'],['../classhelios_1_1_context.html#af77ff3ea4a7668d2b5cb03bc6fc5f5b6',1,'helios::Context::getObjectDataType()']]], - ['getobjectid_119',['getObjectID',['../classhelios_1_1_compound_object.html#a28c85b0cf4dee51dd7997b7b78e4f442',1,'helios::CompoundObject']]], - ['getobjectpointer_120',['getObjectPointer',['../classhelios_1_1_context.html#a3d9493949db2c5d8ddeef30afd2a9a0a',1,'helios::Context']]], - ['getobjectprimitivecount_121',['getObjectPrimitiveCount',['../classhelios_1_1_context.html#a457ccd0bcf9870aef138b22c4a160aeb',1,'helios::Context']]], - ['getobjectprimitiveuuids_122',['getObjectPrimitiveUUIDs',['../classhelios_1_1_context.html#a266fba7ca4a0a1536c49f1e3ce918b1e',1,'helios::Context::getObjectPrimitiveUUIDs(const std::vector< std::vector< uint > > &ObjIDs) const'],['../classhelios_1_1_context.html#a7d0b3a6ca36b02702b06208a735a3b03',1,'helios::Context::getObjectPrimitiveUUIDs(uint ObjID) const'],['../classhelios_1_1_context.html#a09e60fbbd3c4be1f8345a9de3695ccdd',1,'helios::Context::getObjectPrimitiveUUIDs(const std::vector< uint > &ObjIDs) const']]], - ['getobjecttexturefile_123',['getObjectTextureFile',['../classhelios_1_1_context.html#aacd4cff3b170281516dcafb3fa83b84a',1,'helios::Context']]], - ['getobjecttransformationmatrix_124',['getObjectTransformationMatrix',['../classhelios_1_1_context.html#af9e972c138b0626cece9eea5f018b418',1,'helios::Context']]], - ['getobjecttype_125',['getObjectType',['../classhelios_1_1_compound_object.html#ab07473392ca1e4c439c909c83cc9730b',1,'helios::CompoundObject::getObjectType()'],['../classhelios_1_1_context.html#a75ae3ee4580c4420059fe95755dc22d2',1,'helios::Context::getObjectType(uint ObjID) const']]], - ['getpatchcenter_126',['getPatchCenter',['../classhelios_1_1_context.html#a4165df43e5ab752e81bc2b7d7caf19d5',1,'helios::Context']]], - ['getpatchsize_127',['getPatchSize',['../classhelios_1_1_context.html#ab3f802aca8dd1930127d9f76358e71cf',1,'helios::Context']]], - ['getplantcount_128',['getPlantCount',['../class_canopy_generator.html#aba9e186286ade3cd2ced0be80b3b8b89',1,'CanopyGenerator']]], - ['getplantflowerobjectids_129',['getPlantFlowerObjectIDs',['../class_plant_architecture.html#a1cb3e4ba93c7a94558c3c07496e550c2',1,'PlantArchitecture']]], - ['getplantfruitobjectids_130',['getPlantFruitObjectIDs',['../class_plant_architecture.html#aac602c603ac136c3aaffad052bd844d4',1,'PlantArchitecture']]], - ['getplantinternodeobjectids_131',['getPlantInternodeObjectIDs',['../class_plant_architecture.html#a53967340a1c9b88f4b804522f081ce62',1,'PlantArchitecture']]], - ['getplantleafobjectids_132',['getPlantLeafObjectIDs',['../class_plant_architecture.html#afcdea7f14c6ca722d39d94ff19ba87b4',1,'PlantArchitecture']]], - ['getplantpeduncleobjectids_133',['getPlantPeduncleObjectIDs',['../class_plant_architecture.html#af8a9f26212baf6695d71d44b982e6adf',1,'PlantArchitecture']]], - ['getplantpetioleobjectids_134',['getPlantPetioleObjectIDs',['../class_plant_architecture.html#aee2486b87dca29982dd1b380aa3510fb',1,'PlantArchitecture']]], - ['getpolymeshobjectpointer_135',['getPolymeshObjectPointer',['../classhelios_1_1_context.html#a5a10781f6c1e24b226a32b1e1369f5c1',1,'helios::Context']]], - ['getpolymeshobjectvolume_136',['getPolymeshObjectVolume',['../classhelios_1_1_context.html#aad71b3e493ab0e47c6d4496d14e89803',1,'helios::Context']]], - ['getprimitivearea_137',['getPrimitiveArea',['../classhelios_1_1_context.html#a1dafe58b3251d2ef9d09112258b2e85d',1,'helios::Context']]], - ['getprimitiveboundingbox_138',['getPrimitiveBoundingBox',['../classhelios_1_1_context.html#abf2e26ac2b32556878be6626a8876569',1,'helios::Context::getPrimitiveBoundingBox(uint UUID, vec3 &min_corner, vec3 &max_corner) const'],['../classhelios_1_1_context.html#a808527f76dec2683cbc168250c4f69be',1,'helios::Context::getPrimitiveBoundingBox(const std::vector< uint > &UUID, vec3 &min_corner, vec3 &max_corner) const']]], - ['getprimitivecolor_139',['getPrimitiveColor',['../classhelios_1_1_context.html#a1223205f1080b0b7024b8f97950779b8',1,'helios::Context']]], - ['getprimitivecolorrgb_140',['getPrimitiveColorRGB',['../classhelios_1_1_context.html#a8550633570ee91e4f09ec1464810bd7b',1,'helios::Context']]], - ['getprimitivecolorrgba_141',['getPrimitiveColorRGBA',['../classhelios_1_1_context.html#a4e29adcb908d55172efd239f294b49e5',1,'helios::Context']]], - ['getprimitivecount_142',['getPrimitiveCount',['../group__primitives.html#ga4d3447fb04c25e685bcc82599e2b173d',1,'helios::Context::getPrimitiveCount()'],['../classhelios_1_1_compound_object.html#a0eb06d37710a7dc9f5b915fc33f191a0',1,'helios::CompoundObject::getPrimitiveCount()']]], - ['getprimitivedata_143',['getPrimitiveData',['../classhelios_1_1_context.html#a2144eea981e4030c973287ce2c38315e',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, int &data) const'],['../classhelios_1_1_context.html#a1d8cd543d68c2bc3b7ef876421284f15',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< std::string > &data) const'],['../classhelios_1_1_context.html#ad1f6453da61e8e64ba91f589b7cc4eb0',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< int > &data) const'],['../classhelios_1_1_context.html#a420487af4a23ed5b527069c6471efd93',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, uint &data) const'],['../classhelios_1_1_context.html#add62ecdb7cc13510670c9c45bc8725a3',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< uint > &data) const'],['../classhelios_1_1_context.html#aa54fb6e8a942845010ae669505adc2e8',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, float &data) const'],['../classhelios_1_1_context.html#a466dea76918a4bd02e4a355ab70f161b',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< float > &data) const'],['../classhelios_1_1_context.html#a802b10b84762052e52b9ff1861604c58',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, double &data) const'],['../classhelios_1_1_context.html#a65d1918df796575a5e5bc8c470ff3201',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< double > &data) const'],['../classhelios_1_1_context.html#a2ac5198c45a57b7926f4dbd9129fcad5',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, vec2 &data) const'],['../classhelios_1_1_context.html#ab0fb70ff8b6e81901df14efe07ae7ff4',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< vec2 > &data) const'],['../classhelios_1_1_context.html#abbe503b705cfdeb903becdb7fb082dae',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, vec3 &data) const'],['../classhelios_1_1_context.html#a83619185959d1dae4570674a3855f808',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< vec3 > &data) const'],['../classhelios_1_1_context.html#a0e62c9bb97e4cbbcd56518b060e9cae5',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, vec4 &data) const'],['../classhelios_1_1_context.html#a29fed63e84bf5b5111b0e98f499da56e',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< vec4 > &data) const'],['../classhelios_1_1_context.html#a72ee49f503ff0c4937d9aa81b72689ed',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, int2 &data) const'],['../classhelios_1_1_context.html#ae76119a1083016c2cffed9eb443aaa62',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< int2 > &data) const'],['../classhelios_1_1_context.html#a18f0ede968126842068551834391e3ad',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, int3 &data) const'],['../classhelios_1_1_context.html#a5c37491d4bc0a1d69ffcaf214e6c2fe7',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< int3 > &data) const'],['../classhelios_1_1_context.html#afe292fdf1d3c7983427c699e4a2eca3a',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, int4 &data) const'],['../classhelios_1_1_context.html#a8ebaded3f143fc9c673765ab3fda5366',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< int4 > &data) const'],['../classhelios_1_1_context.html#ad1a2ca668fb5f5043f23f7a50c22483f',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::string &data) const']]], - ['getprimitivedatasize_144',['getPrimitiveDataSize',['../classhelios_1_1_context.html#a4b64585d356463ac759472f099660eca',1,'helios::Context']]], - ['getprimitivedatatype_145',['getPrimitiveDataType',['../classhelios_1_1_context.html#a9c894ecd12e0d893c53ffcfa9e90c0b6',1,'helios::Context']]], - ['getprimitivenormal_146',['getPrimitiveNormal',['../classhelios_1_1_context.html#abfeadf8e6a35eb97da1439abc21c434e',1,'helios::Context']]], - ['getprimitiveparentobjectid_147',['getPrimitiveParentObjectID',['../classhelios_1_1_context.html#a2d3e254d04f913e590a645b54886436e',1,'helios::Context']]], - ['getprimitivesolidfraction_148',['getPrimitiveSolidFraction',['../classhelios_1_1_context.html#a6e8a5e2044331158d69d6f9bd88fc0f7',1,'helios::Context']]], - ['getprimitivetexturefile_149',['getPrimitiveTextureFile',['../classhelios_1_1_context.html#a4fffad72d1ebb517d9c41837e448d4f5',1,'helios::Context']]], - ['getprimitivetexturesize_150',['getPrimitiveTextureSize',['../classhelios_1_1_context.html#a7fec62cbf2c2d56603b2750cbb4a4d9f',1,'helios::Context']]], - ['getprimitivetexturetransparencydata_151',['getPrimitiveTextureTransparencyData',['../classhelios_1_1_context.html#a98ad773979fff9efda47b44d71ac8e06',1,'helios::Context']]], - ['getprimitivetextureuv_152',['getPrimitiveTextureUV',['../classhelios_1_1_context.html#a5702f94aaba15bf6757aeb4d72d7774d',1,'helios::Context']]], - ['getprimitivetransformationmatrix_153',['getPrimitiveTransformationMatrix',['../classhelios_1_1_context.html#a046e855d15fa88088be01adea38a67fd',1,'helios::Context']]], - ['getprimitivetype_154',['getPrimitiveType',['../classhelios_1_1_context.html#a67bfd66f0a445f6485f1099f9eadc949',1,'helios::Context']]], - ['getprimitiveuuids_155',['getPrimitiveUUIDs',['../classhelios_1_1_compound_object.html#ab3973a7c8ccb1aa0ce3f21ffe461ef7b',1,'helios::CompoundObject']]], - ['getprimitivevertices_156',['getPrimitiveVertices',['../classhelios_1_1_context.html#ae8542fd1452150d3302675a0a3d991ed',1,'helios::Context']]], - ['getradius_157',['getRadius',['../classhelios_1_1_sphere.html#a38cf8b6959d22577a1a2f9a6c675bc8b',1,'helios::Sphere']]], - ['getrandomgenerator_158',['getRandomGenerator',['../classhelios_1_1_context.html#a96a928fa28d3d771ba310f798b56bd63',1,'helios::Context']]], - ['getscanbeamdivergence_159',['getScanBeamDivergence',['../class_aerial_li_d_a_rcloud.html#a4097c1d3994f57e0f0e2e602c7ca5c04',1,'AerialLiDARcloud::getScanBeamDivergence()'],['../class_li_d_a_rcloud.html#a9d93e6cd9decccf271fbf3fbd5c74a5a',1,'LiDARcloud::getScanBeamDivergence()']]], - ['getscanbeamexitdiameter_160',['getScanBeamExitDiameter',['../class_aerial_li_d_a_rcloud.html#ae6cbd6375be39129231233d66061afca',1,'AerialLiDARcloud::getScanBeamExitDiameter()'],['../class_li_d_a_rcloud.html#abab6b81a3d96226a766cc2450993407f',1,'LiDARcloud::getScanBeamExitDiameter()']]], - ['getscancenter_161',['getScanCenter',['../class_aerial_li_d_a_rcloud.html#a1ce1efbe6af71f54dcccd3743918aa72',1,'AerialLiDARcloud']]], - ['getscancolumnformat_162',['getScanColumnFormat',['../class_li_d_a_rcloud.html#abbe892f01508dc69bcc5b28bea5472bf',1,'LiDARcloud']]], - ['getscanconeangle_163',['getScanConeAngle',['../class_aerial_li_d_a_rcloud.html#a0dbf5535304d6d87d67a0d41c5d2310f',1,'AerialLiDARcloud']]], - ['getscancount_164',['getScanCount',['../class_aerial_li_d_a_rcloud.html#ab363717911dada3af4fdafa914532a6a',1,'AerialLiDARcloud::getScanCount()'],['../class_li_d_a_rcloud.html#aaa463ea1aaebb03abd8c3ec87091291a',1,'LiDARcloud::getScanCount()']]], - ['getscandensity_165',['getScanDensity',['../class_aerial_li_d_a_rcloud.html#a0c4627b15014ebe8c79053ed75f6cfb4',1,'AerialLiDARcloud']]], - ['getscanextent_166',['getScanExtent',['../class_aerial_li_d_a_rcloud.html#ad5bd68f06fef597d8c1f1aac3142acc6',1,'AerialLiDARcloud']]], - ['getscanorigin_167',['getScanOrigin',['../class_li_d_a_rcloud.html#aa657ed32a8831ebf4f2e4a9203b683ef',1,'LiDARcloud']]], - ['getscanrangephi_168',['getScanRangePhi',['../class_li_d_a_rcloud.html#ab314aac88834eb3938fc2f37e34807e3',1,'LiDARcloud']]], - ['getscanrangetheta_169',['getScanRangeTheta',['../class_li_d_a_rcloud.html#a7f0237a83da6997e973fde9939440979',1,'LiDARcloud']]], - ['getscansizephi_170',['getScanSizePhi',['../class_li_d_a_rcloud.html#aaf04cd04c2b1bc162106a0e47cff6d29',1,'LiDARcloud']]], - ['getscansizetheta_171',['getScanSizeTheta',['../class_li_d_a_rcloud.html#a40809c7a709a6c9ccb4beddca21f8ac9',1,'LiDARcloud']]], - ['getsegmentvolume_172',['getSegmentVolume',['../classhelios_1_1_tube.html#a2966ff764897904282082f23a76756b8',1,'helios::Tube']]], - ['getsize_173',['getSize',['../classhelios_1_1_tile.html#aa8daadd99bd57f647837e26890fcfeac',1,'helios::Tile::getSize()'],['../classhelios_1_1_disk.html#a23c03df1f2e351659a08420a41a74eb5',1,'helios::Disk::getSize()'],['../classhelios_1_1_box.html#afd79ee17402ab6367896fe8278800f34',1,'helios::Box::getSize()']]], - ['getskyenergy_174',['getSkyEnergy',['../class_radiation_model.html#a9c9a5f6cb6b0ba6e3780aba8a4da8a0d',1,'RadiationModel']]], - ['getsolarflux_175',['getSolarFlux',['../class_solar_position.html#a9701cb29a0336a11c445d285405b6956',1,'SolarPosition']]], - ['getsolarfluxnir_176',['getSolarFluxNIR',['../class_solar_position.html#a611461f700df9efa7c56b6f4ee7712b7',1,'SolarPosition']]], - ['getsolarfluxpar_177',['getSolarFluxPAR',['../class_solar_position.html#a5c6635160944b5b8202ea9965da6de9d',1,'SolarPosition']]], - ['getsolidfraction_178',['getSolidFraction',['../classhelios_1_1_texture.html#a685024e8394b49433f26a0dcd6665d86',1,'helios::Texture']]], - ['getsourceflux_179',['getSourceFlux',['../class_radiation_model.html#a9d4ea3e08514b90e617695ab2ee2fbf8',1,'RadiationModel']]], - ['getsourceposition_180',['getSourcePosition',['../class_radiation_model.html#ab8ec35514a0e4b53ce8a64d3f390427c',1,'RadiationModel']]], - ['getsphereobjectcenter_181',['getSphereObjectCenter',['../classhelios_1_1_context.html#a4f75af0785498d14eb3f5a3539cb16b1',1,'helios::Context']]], - ['getsphereobjectpointer_182',['getSphereObjectPointer',['../classhelios_1_1_context.html#a8ed7580efa323c0f5e53e97d00e16c85',1,'helios::Context']]], - ['getsphereobjectradius_183',['getSphereObjectRadius',['../classhelios_1_1_context.html#a5afb4fd92e9a726fb396779d1f2ae92b',1,'helios::Context']]], - ['getsphereobjectsubdivisioncount_184',['getSphereObjectSubdivisionCount',['../classhelios_1_1_context.html#adadbc5a5378a874cd6705ed681fb9e6a',1,'helios::Context']]], - ['getsphereobjectvolume_185',['getSphereObjectVolume',['../classhelios_1_1_context.html#ae92df5975ec7fa257e7633d6551e2a87',1,'helios::Context']]], - ['getsubdivisioncount_186',['getSubdivisionCount',['../classhelios_1_1_cone.html#a051a2c5760d53a6c0b95f66cab9cbf73',1,'helios::Cone::getSubdivisionCount()'],['../classhelios_1_1_disk.html#a8dc2a195735ee3321b274274e7e0352e',1,'helios::Disk::getSubdivisionCount()'],['../classhelios_1_1_tile.html#a4f4198becfe3cafd989b5aa6cd21d5cf',1,'helios::Tile::getSubdivisionCount()'],['../classhelios_1_1_sphere.html#a152107e463d6765ba27ff8f3ab737711',1,'helios::Sphere::getSubdivisionCount()'],['../classhelios_1_1_tube.html#abf9bb1153b3607a5d616aafeee06e43e',1,'helios::Tube::getSubdivisionCount()'],['../classhelios_1_1_box.html#a6f25b211d8740257329f841cda737a4f',1,'helios::Box::getSubdivisionCount()']]], - ['getsunazimuth_187',['getSunAzimuth',['../class_solar_position.html#a2b736578f75ecb8532556931b8263dc4',1,'SolarPosition']]], - ['getsundirectionspherical_188',['getSunDirectionSpherical',['../class_solar_position.html#adad5310db742ef9f2754e75095aeea92',1,'SolarPosition']]], - ['getsundirectionvector_189',['getSunDirectionVector',['../class_solar_position.html#af889756d5b3d7d3c366887fae1fb86ab',1,'SolarPosition']]], - ['getsunelevation_190',['getSunElevation',['../class_solar_position.html#a307e963d840abb9ee7867579fec69fa2',1,'SolarPosition']]], - ['getsunrisetime_191',['getSunriseTime',['../class_solar_position.html#a2d15fe2ca0d29adf33971916b1d8cd83',1,'SolarPosition']]], - ['getsunsettime_192',['getSunsetTime',['../class_solar_position.html#a4c58aa642b4fc2300d1c1447388bc0d8',1,'SolarPosition']]], - ['getsunzenith_193',['getSunZenith',['../class_solar_position.html#a4c4ba4931d13c6cc2ad69e8eab90ac14',1,'SolarPosition']]], - ['gettexturefile_194',['getTextureFile',['../classhelios_1_1_compound_object.html#a3e43ebd386e7a6663fa877613b9d27fa',1,'helios::CompoundObject::getTextureFile()'],['../classhelios_1_1_texture.html#a0371473a81deb9bb19b8274109b75ef8',1,'helios::Texture::getTextureFile()']]], - ['gettextureuv_195',['getTextureUV',['../classhelios_1_1_tile.html#a94deb25ac31abc1eb02dfe6913b4546f',1,'helios::Tile']]], - ['gettileobjectarearatio_196',['getTileObjectAreaRatio',['../classhelios_1_1_context.html#a9943834b21ccfb9ac1c519e47f959c92',1,'helios::Context::getTileObjectAreaRatio(uint ObjectID) const'],['../classhelios_1_1_context.html#afdebad3fd25bb8b9fa228020c3b11329',1,'helios::Context::getTileObjectAreaRatio(const std::vector< uint > &ObjectID) const']]], - ['gettileobjectcenter_197',['getTileObjectCenter',['../classhelios_1_1_context.html#aa60f87c9bc771e613f60db73188a149d',1,'helios::Context']]], - ['gettileobjectnormal_198',['getTileObjectNormal',['../classhelios_1_1_context.html#a64f4bcadff461357aa390d7f5dad2ba7',1,'helios::Context']]], - ['gettileobjectpointer_199',['getTileObjectPointer',['../classhelios_1_1_context.html#ad2b762dd7b31126150c6e6dc350a3914',1,'helios::Context']]], - ['gettileobjectsize_200',['getTileObjectSize',['../classhelios_1_1_context.html#a457654b4a1f96a4979f83299dd9752df',1,'helios::Context']]], - ['gettileobjectsubdivisioncount_201',['getTileObjectSubdivisionCount',['../classhelios_1_1_context.html#a9320e4577eb131e7efe05677d30591b3',1,'helios::Context']]], - ['gettileobjecttextureuv_202',['getTileObjectTextureUV',['../classhelios_1_1_context.html#a00718598a9c308dabe8fc24f85683210',1,'helios::Context']]], - ['gettileobjectvertices_203',['getTileObjectVertices',['../classhelios_1_1_context.html#ab77b708ac6b39c1c5e8ecaa4988403b0',1,'helios::Context']]], - ['gettime_204',['getTime',['../classhelios_1_1_context.html#a847ecbb2297e60220a23b67c39b0f6e2',1,'helios::Context']]], - ['gettimeserieslength_205',['getTimeseriesLength',['../group__timeseries.html#ga56d13f8c949e68137581a3c974790892',1,'helios::Context']]], - ['gettotalabsorbedflux_206',['getTotalAbsorbedFlux',['../class_radiation_model.html#a5e95e775550a2000798a97b00857bdd2',1,'RadiationModel']]], - ['gettransformationmatrix_207',['getTransformationMatrix',['../classhelios_1_1_compound_object.html#ac1e98d4f8098dadda345f9dc6dae73ca',1,'helios::CompoundObject']]], - ['gettransparencydata_208',['getTransparencyData',['../classhelios_1_1_texture.html#a798c3a24b21fc853db299d1f1f84a61c',1,'helios::Texture']]], - ['gettreeparameters_209',['getTreeParameters',['../class_weber_penn_tree.html#aac5619ac480517f8f01cb465d0dc4a6f',1,'WeberPennTree']]], - ['gettriangle_210',['getTriangle',['../class_li_d_a_rcloud.html#aa1a1af5eea22185e59c267c8e4d94c9e',1,'LiDARcloud']]], - ['gettrianglecount_211',['getTriangleCount',['../class_li_d_a_rcloud.html#abcdbf834959379a189a60efed41f3e52',1,'LiDARcloud']]], - ['gettrianglevertex_212',['getTriangleVertex',['../classhelios_1_1_context.html#a846f93175f8b45f44237e88155af8fde',1,'helios::Context']]], - ['gettrianglevertices_213',['getTriangleVertices',['../classhelios_1_1_tube.html#a6aedd14e533981bd79497ba13b33f2c9',1,'helios::Tube']]], - ['gettrunkuuids_214',['getTrunkUUIDs',['../class_canopy_generator.html#aa8e95a610c03588592acebbbba5d638e',1,'CanopyGenerator::getTrunkUUIDs(uint PlantID)'],['../class_canopy_generator.html#a44b2d0846bb08d331281a822df41daa6',1,'CanopyGenerator::getTrunkUUIDs()'],['../class_weber_penn_tree.html#ab247d9368368263dfdded18a43917f98',1,'WeberPennTree::getTrunkUUIDs()']]], - ['gettubeobjectnodecolors_215',['getTubeObjectNodeColors',['../classhelios_1_1_context.html#a7ad271dabb4291067f9a39d4c92e6ffd',1,'helios::Context']]], - ['gettubeobjectnoderadii_216',['getTubeObjectNodeRadii',['../classhelios_1_1_context.html#a6a58d8f1a8446a213d9a21e67ae8ed97',1,'helios::Context']]], - ['gettubeobjectnodes_217',['getTubeObjectNodes',['../classhelios_1_1_context.html#aa4650e7a0a16be12615870ff9a567ae3',1,'helios::Context']]], - ['gettubeobjectpointer_218',['getTubeObjectPointer',['../classhelios_1_1_context.html#ab26f963c75aa99d797a43860479910b0',1,'helios::Context']]], - ['gettubeobjectsegmentvolume_219',['getTubeObjectSegmentVolume',['../classhelios_1_1_context.html#a10928031db222e77e93ac8088f4b001d',1,'helios::Context']]], - ['gettubeobjectsubdivisioncount_220',['getTubeObjectSubdivisionCount',['../classhelios_1_1_context.html#a272ba030971b86c7d3da57ff90784e0f',1,'helios::Context']]], - ['gettubeobjectvolume_221',['getTubeObjectVolume',['../classhelios_1_1_context.html#a56b82c3f009084451225003b2b461b6f',1,'helios::Context']]], - ['getuniqueprimitiveparentobjectids_222',['getUniquePrimitiveParentObjectIDs',['../classhelios_1_1_context.html#a18a276db8d3c1d754bbd1ca475deec82',1,'helios::Context::getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs) const'],['../classhelios_1_1_context.html#a1f50af8c859a5b2ee0973c9ed5c10284',1,'helios::Context::getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs, bool include_ObjID_zero) const']]], - ['getvariation_223',['getVariation',['../_canopy_generator_8cpp.html#a6cdee9cb4984f78c818e46eb2a5b62e6',1,'getVariation(uint V, std::minstd_rand0 &generator): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#a9f90ba8fe8a074a822424ff748579f25',1,'getVariation(int V, std::minstd_rand0 &generator, bool positive): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#aa0b21a2d6b9506b33d05047716d671e0',1,'getVariation(float V, std::minstd_rand0 &generator, bool positive): CanopyGenerator.cpp'],['../_canopy_generator_8h.html#a6cdee9cb4984f78c818e46eb2a5b62e6',1,'getVariation(uint V, std::minstd_rand0 &generator): CanopyGenerator.cpp'],['../_canopy_generator_8h.html#aa3a6e1a26b799f4a2006703314499fed',1,'getVariation(int V, std::minstd_rand0 &generator, bool positive=false): CanopyGenerator.cpp'],['../_canopy_generator_8h.html#accfb46da54c7b0e83878a1331bbc94d1',1,'getVariation(float V, std::minstd_rand0 &generator, bool positive=false): CanopyGenerator.cpp']]], - ['getvertices_224',['getVertices',['../classhelios_1_1_tile.html#aaea21403039646db33792c95be929afd',1,'helios::Tile']]], - ['getvolume_225',['getVolume',['../classhelios_1_1_sphere.html#a3d6a8e9f8c0daee1e093593d6006c906',1,'helios::Sphere::getVolume()'],['../classhelios_1_1_tube.html#aaa11cc27d6f704a989c3e5b0fe1b8055',1,'helios::Tube::getVolume()'],['../classhelios_1_1_box.html#a3d3d0b20e22aff306fde02bd7e2a4f84',1,'helios::Box::getVolume()'],['../classhelios_1_1_polymesh.html#ad901c4de0e202f44c16fc9af29481538',1,'helios::Polymesh::getVolume()'],['../classhelios_1_1_cone.html#aff2cb2fc89c68b75a038a9604ce73cd0',1,'helios::Cone::getVolume()']]], - ['getvoxelcenter_226',['getVoxelCenter',['../classhelios_1_1_context.html#acadf5206cbfed7b8eaa2835702349cd9',1,'helios::Context']]], - ['getvoxelsize_227',['getVoxelSize',['../classhelios_1_1_context.html#a6a3f85d4f29f8f7432b6ef605172a1cb',1,'helios::Context']]], - ['getwindowpixelsrgb_228',['getWindowPixelsRGB',['../class_visualizer.html#a15828ea9966b9729b56c9ddfccd4c117',1,'Visualizer']]], - ['getwindowsize_229',['getWindowSize',['../class_visualizer.html#ae6b83402c798f56334851f77b898de52',1,'Visualizer']]], - ['global_2ecpp_230',['global.cpp',['../global_8cpp.html',1,'']]], - ['global_2eh_231',['global.h',['../global_8h.html',1,'']]], - ['globaldata_232',['GlobalData',['../structhelios_1_1_global_data.html',1,'helios']]], - ['glyph_233',['Glyph',['../class_glyph.html',1,'']]], - ['gobletgrapevineparameters_234',['GobletGrapevineParameters',['../struct_goblet_grapevine_parameters.html',1,'GobletGrapevineParameters'],['../struct_goblet_grapevine_parameters.html#a498ce7f62d575b0bc914e9d48d94fbb2',1,'GobletGrapevineParameters::GobletGrapevineParameters(const pugi::xml_node canopy_node)'],['../struct_goblet_grapevine_parameters.html#a0274d6f6b1f13bbf7a383de5c2bc8726',1,'GobletGrapevineParameters::GobletGrapevineParameters()']]], - ['gradientdescent_235',['GradientDescent',['../struct_camera_calibration.html#a5bfbb206b8271b406cda85eb5ae23a1b',1,'CameraCalibration']]], - ['gradientdescentparameters_236',['GradientDescentParameters',['../struct_camera_calibration_1_1_gradient_descent_parameters.html',1,'CameraCalibration']]], - ['grape_5fcolor_237',['grape_color',['../struct_base_grape_vine_parameters.html#ac90904eec34fa3e0dea393dd1c12faf6',1,'BaseGrapeVineParameters']]], - ['grape_5fradius_238',['grape_radius',['../struct_base_grape_vine_parameters.html#afa20674518acbb9fdfaafc893f362e01',1,'BaseGrapeVineParameters']]], - ['grape_5fradius_5fspread_239',['grape_radius_spread',['../struct_base_grape_vine_parameters.html#ace081969ad453ba66d60e394554d50b9',1,'BaseGrapeVineParameters']]], - ['grape_5fsubdivisions_240',['grape_subdivisions',['../struct_base_grape_vine_parameters.html#a510a2a5876fe8b3fb8ec70701c32df48',1,'BaseGrapeVineParameters']]], - ['grape_5fsubdivisions_5fspread_241',['grape_subdivisions_spread',['../struct_base_grape_vine_parameters.html#aa27b9934f658e9047462703e7d059d74',1,'BaseGrapeVineParameters']]], - ['grapevine_2ecpp_242',['grapevine.cpp',['../grapevine_8cpp.html',1,'']]], - ['grapevinegoblet_243',['grapevineGoblet',['../class_canopy_generator.html#a8f2d498637c464ee852109e6085cde8a',1,'CanopyGenerator']]], - ['grapevinesplit_244',['grapevineSplit',['../class_canopy_generator.html#a8747bad1af97214059c38043241f0b47',1,'CanopyGenerator']]], - ['grapevineunilateral_245',['grapevineUnilateral',['../class_canopy_generator.html#aac9104d7c6565e860737310de06981f8',1,'CanopyGenerator']]], - ['grapevinevsp_246',['grapevineVSP',['../class_canopy_generator.html#aaffe5cdb82a779785bc6d5e35e622812',1,'CanopyGenerator']]], - ['gridcell_247',['GridCell',['../struct_grid_cell.html',1,'']]], - ['gridijk2index_248',['gridijk2index',['../class_aerial_li_d_a_rcloud.html#a35c81e8cda423b84c94fc33ee4163d47',1,'AerialLiDARcloud']]], - ['gridindex2ijk_249',['gridindex2ijk',['../class_aerial_li_d_a_rcloud.html#add78af9b69161c5c532a23c8df009d2e',1,'AerialLiDARcloud']]] + ['7_3a_20visualizer_20basics_0',['Tutorial 7: Visualizer Basics',['../visualizer_basics.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/all_8.js b/doc/html/search/all_8.js index 473108f9a..2c7084b8a 100644 --- a/doc/html/search/all_8.js +++ b/doc/html/search/all_8.js @@ -1,28 +1,4 @@ var searchData= [ - ['hastexture_0',['hasTexture',['../classhelios_1_1_compound_object.html#a547a3a56f24fdaf541d12dc74776318e',1,'helios::CompoundObject']]], - ['hastransparencychannel_1',['hasTransparencyChannel',['../classhelios_1_1_texture.html#a44d0d36861494725a85bfbc100f398da',1,'helios::Texture']]], - ['helios_20documentation_20v1_2e3_2e25_2',['Helios Documentation v1.3.25',['../index.html',1,'']]], - ['helios_5fruntime_5ferror_3',['helios_runtime_error',['../global_8h.html#a672182e7d8beb63c7cf256fa8294dc86',1,'helios']]], - ['helios_5ftype_5fdouble_4',['HELIOS_TYPE_DOUBLE',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a520daf05a1b3086aabd6cbe6a712c1c3',1,'helios']]], - ['helios_5ftype_5ffloat_5',['HELIOS_TYPE_FLOAT',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3ae8cb6622468bda0078b0bcfde7677ba0',1,'helios']]], - ['helios_5ftype_5fint_6',['HELIOS_TYPE_INT',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a7a7039490fc92b5d76ca18b70563ed52',1,'helios']]], - ['helios_5ftype_5fint2_7',['HELIOS_TYPE_INT2',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3ad586d734313fa5492db5b8cc84d9eabd',1,'helios']]], - ['helios_5ftype_5fint3_8',['HELIOS_TYPE_INT3',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a28e69c60e380496c8c35892e76ee4ad3',1,'helios']]], - ['helios_5ftype_5fint4_9',['HELIOS_TYPE_INT4',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3aa6e12ea3a9160f59a1208f7cbb6c1ce7',1,'helios']]], - ['helios_5ftype_5fstring_10',['HELIOS_TYPE_STRING',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a7c1f526f519f173e5931fd73b78ccbb3',1,'helios']]], - ['helios_5ftype_5fuint_11',['HELIOS_TYPE_UINT',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3aa8887c77409aaaecc3cd1a097488776f',1,'helios']]], - ['helios_5ftype_5fvec2_12',['HELIOS_TYPE_VEC2',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a6269d91d936a3d60a8a763ec122ba233',1,'helios']]], - ['helios_5ftype_5fvec3_13',['HELIOS_TYPE_VEC3',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3a8da4db5333fb4d726d17ad82300c9d6c',1,'helios']]], - ['helios_5ftype_5fvec4_14',['HELIOS_TYPE_VEC4',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3ade0fe2a24f299ca147b95a0eebe43e5d',1,'helios']]], - ['helios_5fvector_5ftypes_2eh_15',['helios_vector_types.h',['../helios__vector__types_8h.html',1,'']]], - ['heliosdatatype_16',['HeliosDataType',['../_context_8h.html#a935eb2a4249411a8f376a27820c70de3',1,'helios']]], - ['hfov_17',['HFOV',['../struct_camera_properties.html#ac1419dfa651f1f8343f5fb5a2fad2148',1,'CameraProperties']]], - ['hideobject_18',['hideObject',['../classhelios_1_1_context.html#a983606fef144a460d4b987032a8ad005',1,'helios::Context']]], - ['hideprimitive_19',['hidePrimitive',['../classhelios_1_1_context.html#a8c68c830335865618227463fbb9d2663',1,'helios::Context']]], - ['hidewatermark_20',['hideWatermark',['../class_visualizer.html#a90d0c5630620d30d062c0af4bace0a99',1,'Visualizer']]], - ['hitpoint_21',['HitPoint',['../struct_hit_point.html',1,'']]], - ['hittable_22',['HitTable',['../class_hit_table.html',1,'']]], - ['homogeneouscanopyparameters_23',['HomogeneousCanopyParameters',['../struct_homogeneous_canopy_parameters.html',1,'HomogeneousCanopyParameters'],['../struct_homogeneous_canopy_parameters.html#ad5f583b7f483df9fdaf86bbdaf0e5a92',1,'HomogeneousCanopyParameters::HomogeneousCanopyParameters()'],['../struct_homogeneous_canopy_parameters.html#aac168c38c41f7c11830c36707a744620',1,'HomogeneousCanopyParameters::HomogeneousCanopyParameters(const pugi::xml_node canopy_node)']]], - ['hour_24',['hour',['../structhelios_1_1_time.html#a6ec639cf61cf283c5e999d152d27839f',1,'helios::Time']]] + ['8_3a_20visualizing_20primitive_20data_20values_0',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/all_9.js b/doc/html/search/all_9.js index be7f59638..e765cc524 100644 --- a/doc/html/search/all_9.js +++ b/doc/html/search/all_9.js @@ -1,24 +1,175 @@ var searchData= [ - ['importvectorfromfile_0',['importVectorFromFile',['../global_8h.html#a125e8bef86fb7272d4d66898afb7d368',1,'helios']]], - ['increasing_20graphics_20driver_20timeout_1',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], - ['incrementday_2',['incrementDay',['../structhelios_1_1_date.html#a82d115420d5c45d28e35d6226c3c8636',1,'helios::Date']]], - ['incrementglobaldata_3',['incrementGlobalData',['../classhelios_1_1_context.html#ac5b4311cbca56d1d7f0d605d19adf6f9',1,'helios::Context::incrementGlobalData(const char *label, int increment)'],['../classhelios_1_1_context.html#ac09c095f00af2544ac74f5b18a7f6e9a',1,'helios::Context::incrementGlobalData(const char *label, uint increment)'],['../classhelios_1_1_context.html#a1c3d180b9f658fe61e2ae7aad2dac96f',1,'helios::Context::incrementGlobalData(const char *label, float increment)'],['../classhelios_1_1_context.html#a65bade6c654b836ff0c097b728a45dd4',1,'helios::Context::incrementGlobalData(const char *label, double increment)']]], - ['incrementprimitivedata_4',['incrementPrimitiveData',['../classhelios_1_1_context.html#a4fe0481b73bf5f6225b4b8a5a6c52d8e',1,'helios::Context::incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, int increment)'],['../classhelios_1_1_context.html#aa1b4c2cd46df6941caf1e95e8c6876bb',1,'helios::Context::incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, uint increment)'],['../classhelios_1_1_context.html#a83fcbc3d3debc230c0a8df670d88b60c',1,'helios::Context::incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, float increment)'],['../classhelios_1_1_context.html#aa58aeb5e56184e6f0c696922d99ba4cc',1,'helios::Context::incrementPrimitiveData(const std::vector< uint > &UUIDs, const char *label, double increment)']]], - ['initialize_5',['initialize',['../struct_shader.html#a168524d306867180df143651ed73ce3b',1,'Shader']]], - ['inputoutput_2ecpp_6',['InputOutput.cpp',['../_input_output_8cpp.html',1,'']]], - ['install_20and_20set_2dup_7',['Install and Set-up',['../_dependent_software.html',1,'']]], - ['int2_8',['int2',['../structhelios_1_1int2.html',1,'helios::int2'],['../structhelios_1_1int2.html#a8e3f84e45ffe63afd76374fdaa8cfb86',1,'helios::int2::int2(const std::vector< int > &v)'],['../structhelios_1_1int2.html#af32c6b747588deb32596333589573774',1,'helios::int2::int2(const int v[2])'],['../structhelios_1_1int2.html#aa5d8b588ac6ea94d0a30b0bce4e8f198',1,'helios::int2::int2(int v0, int v1)'],['../structhelios_1_1int2.html#ae80f1c6c40c21e97047d6db1c2496a45',1,'helios::int2::int2()']]], - ['int3_9',['int3',['../structhelios_1_1int3.html',1,'helios::int3'],['../structhelios_1_1int3.html#a083ddc83d97c9eb4963c61a008a8ed98',1,'helios::int3::int3()'],['../structhelios_1_1int3.html#a7d8c299d611aaff2092ef6c6811a1435',1,'helios::int3::int3(const std::vector< int > &v)'],['../structhelios_1_1int3.html#a4be47afa5e91a293126a39b9928d7d21',1,'helios::int3::int3(const int v[3])'],['../structhelios_1_1int3.html#a3522bf2be027f0897d62a56fe412096c',1,'helios::int3::int3(int v0, int v1, int v2)']]], - ['int4_10',['int4',['../structhelios_1_1int4.html',1,'helios::int4'],['../structhelios_1_1int4.html#a56c4775603496c334254104c76608e1f',1,'helios::int4::int4(int v0, int v1, int v2, int v3)'],['../structhelios_1_1int4.html#ad4011b8fcdb338dd35b97eab6a90e978',1,'helios::int4::int4(const int v[3])'],['../structhelios_1_1int4.html#a0c96514a7e15c6638d34ddfe50b7c7fc',1,'helios::int4::int4(const std::vector< int > &v)'],['../structhelios_1_1int4.html#a495ca613c03f0b6748dc484e1d5bc6a6',1,'helios::int4::int4()']]], - ['integratesourcespectrum_11',['integrateSourceSpectrum',['../class_radiation_model.html#afadd1370bef086ee0e69c3d0469c5941',1,'RadiationModel']]], - ['integratespectrum_12',['integrateSpectrum',['../class_radiation_model.html#a47c0fce1e3ee937cd53f7380b6002c69',1,'RadiationModel::integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const'],['../class_radiation_model.html#ab6be78d097793b7738daeb95f5cd3fda',1,'RadiationModel::integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum) const'],['../class_radiation_model.html#a355137712ebe1c4025db448d7b5e58fb',1,'RadiationModel::integrateSpectrum(uint source_ID, const std::vector< helios::vec2 > &object_spectrum, float wavelength1, float wavelength2) const'],['../class_radiation_model.html#a98d3a2322d58841f001c5dfccbf03391',1,'RadiationModel::integrateSpectrum(uint source_ID, const std::vector< helios::vec2 > &object_spectrum, const std::vector< helios::vec2 > &camera_spectrum) const'],['../class_radiation_model.html#ab688ee5e6d5997711ca4ae24151148d7',1,'RadiationModel::integrateSpectrum(const std::vector< helios::vec2 > &object_spectrum, const std::vector< helios::vec2 > &camera_spectrum) const']]], - ['interp1_13',['interp1',['../global_8h.html#a4d45cb06725a89f41266c8c89974c73e',1,'helios']]], - ['interpolate_5ftexture_5fuv_5fto_5fslice_5fpoint_14',['interpolate_texture_UV_to_slice_point',['../class_voxel_intersection.html#aba4e8fce246ada7df4f9975bc7b9624f',1,'VoxelIntersection']]], - ['interpolatetube_15',['interpolateTube',['../_canopy_generator_8h.html#a339d165bb0c396a75ce255fbe16a20d4',1,'interpolateTube(const std::vector< helios::vec3 > &P, float frac): CanopyGenerator.cpp'],['../_canopy_generator_8h.html#a3d09d2e054283f9202ad662a2c131018',1,'interpolateTube(const std::vector< float > &P, float frac): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#a2d10c56b3c11e46ebfd346ce37f38612',1,'interpolateTube(const std::vector< vec3 > &P, float frac): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#a3d09d2e054283f9202ad662a2c131018',1,'interpolateTube(const std::vector< float > &P, float frac): CanopyGenerator.cpp'],['../_plant_architecture_8cpp.html#a3d09d2e054283f9202ad662a2c131018',1,'interpolateTube(const std::vector< float > &P, float frac): PlantArchitecture.cpp'],['../_plant_architecture_8cpp.html#a2d10c56b3c11e46ebfd346ce37f38612',1,'interpolateTube(const std::vector< vec3 > &P, float frac): PlantArchitecture.cpp']]], - ['isgeometrydirty_16',['isGeometryDirty',['../classhelios_1_1_context.html#a64f402ff71dd246be8c1b06699c05e26',1,'helios::Context']]], - ['isleapyear_17',['isLeapYear',['../structhelios_1_1_date.html#ae54ee66704fedfe50c8efc16695f3e9e',1,'helios::Date']]], - ['isobjecthidden_18',['isObjectHidden',['../classhelios_1_1_context.html#a084b7fb6ef0cec4a83207ce3c7f70843',1,'helios::Context']]], - ['isprimitivehidden_19',['isPrimitiveHidden',['../classhelios_1_1_context.html#a94d5c318d9f7edaf1f5410ad8b17e141',1,'helios::Context']]], - ['isprimitivetexturecoloroverridden_20',['isPrimitiveTextureColorOverridden',['../classhelios_1_1_context.html#aaaa6de8a55765b258d6e65c52bf5df69',1,'helios::Context']]] + ['a_0',['a',['../structhelios_1_1_r_g_b_acolor.html#a1941a63762f40fe1aabc5bb863a7aa1e',1,'helios::RGBAcolor']]], + ['a_20canopy_1',['Building a Canopy',['../_canopy_generator_doc.html#CGenBuildCanopy',1,'']]], + ['a_20color_20vectors_2',['R-G-B(-A) color vectors',['../_a_p_i.html#RGB',1,'']]], + ['a_20goblet_20trellis_3',['Grapevine Canopy with a Goblet Trellis',['../_canopy_generator_doc.html#CGenGoblet',1,'']]], + ['a_20ground_20area_20basis_4',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['a_20homogeneous_20canopy_5',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['a_20patch_20to_20the_20context_6',['Adding a Patch to the Context',['../context_primitives.html#AddPatch',1,'']]], + ['a_20plant_20from_20the_20library_7',['Modifying Parameters of a Plant from the Library',['../_plant_architecture_doc.html#PlantArchBuild_custom',1,'']]], + ['a_20plant_20from_20the_20library_20with_20default_20parameters_8',['Loading a Plant from the Library with Default Parameters',['../_plant_architecture_doc.html#PlantArchBuild_default',1,'']]], + ['a_20plant_20shoot_9',['The Phytomer: Basic unit of a plant shoot',['../_plant_architecture_doc.html#PlantArchPhytomer',1,'']]], + ['a_20project_10',['Opening and building a project',['../_c_lion_i_d_e.html#CLionProject',1,'']]], + ['a_20radiation_20camera_11',['Adding a Radiation Camera',['../_radiation_doc.html#RadCamAdd',1,'']]], + ['a_20sphere_12',['3. Laminar flow around a sphere',['../_b_l_conductance_doc.html#BLC3',1,'']]], + ['a_20split_20trellis_13',['Grapevine Canopy with a Split Trellis',['../_canopy_generator_doc.html#CGenSplit',1,'']]], + ['a_20unilateral_20vsp_20trellis_14',['Grapevine Canopy with a Unilateral VSP Trellis',['../_canopy_generator_doc.html#CGenUnilateral',1,'']]], + ['absorbed_20by_20the_20canopy_20on_20a_20ground_20area_20basis_15',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['absorbed_20par_20flux_20using_20beer_20s_20law_16',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['acknowledgements_17',['Acknowledgements',['../_visualizer_doc.html#VisAcklowledgements',1,'']]], + ['acos_5fsafe_18',['acos_safe',['../group__functions.html#ga9f732ec5c2153020247c879034f81432',1,'helios']]], + ['adams_202012_19',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['add_20geometry_20to_20the_20visualizer_20',['Step 2. Add geometry to the Visualizer',['../visualizer_basics.html#vis_step2',1,'']]], + ['addbasestemshoot_21',['addBaseStemShoot',['../class_plant_architecture.html#a32e88ebd4d0bb468f6c0a2655833bff6',1,'PlantArchitecture']]], + ['addbox_22',['addBox',['../group__compoundobjects.html#gaad6b1c9613d3e1e70519e145166c8879',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv)'],['../group__compoundobjects.html#ga9a00c2f632e5625524dc8cd7587b771e',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color)'],['../group__compoundobjects.html#gac9d9b47750abac76a5630d2218db5861',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile)'],['../group__compoundobjects.html#ga73e5eea0a4841336b41ed2848327c12a',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals)'],['../group__compoundobjects.html#ga8d7f04707bc24f049cb60212c3ba29d2',1,'helios::Context::addBox(const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile, bool reverse_normals)']]], + ['addboxobject_23',['addBoxObject',['../group__compoundobjects.html#gab2549ca65442372287b30c874b0c2b1c',1,'helios::Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv)'],['../group__compoundobjects.html#ga71aa11aa723683d18807fda36397f7e3',1,'helios::Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color)'],['../group__compoundobjects.html#ga23b4391b46d9c4b8f9452fc7a0812ce2',1,'helios::Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv, const char *texturefile)'],['../group__compoundobjects.html#gac29332e0332233ea902a94e4822f739f',1,'helios::Context::addBoxObject(const vec3 &center, const vec3 &size, const int3 &subdiv, const RGBcolor &color, bool reverse_normals)'],['../group__compoundobjects.html#gab3b99bd7bee16911a3f47173dba06cbc',1,'helios::Context::addBoxObject(vec3 center, const vec3 &size, const int3 &subdiv, const char *texturefile, bool reverse_normals)']]], + ['addcheckerboard_24',['addCheckerboard',['../struct_camera_calibration.html#ab101fe425760d29aab58073d626be460',1,'CameraCalibration']]], + ['addchildshoot_25',['addChildShoot',['../class_plant_architecture.html#a0832e7e5e15d64c3ee52ea3d640dee27',1,'PlantArchitecture']]], + ['addcollimatedradiationsource_26',['addCollimatedRadiationSource',['../class_radiation_model.html#adea522844d6fe85df2f1dc3b78f514eb',1,'RadiationModel::addCollimatedRadiationSource()'],['../class_radiation_model.html#aaa7660215edce07be51d4dae3cf4ffb1',1,'RadiationModel::addCollimatedRadiationSource(const helios::SphericalCoord &direction)'],['../class_radiation_model.html#a768434aa4802835d706a07e29f8500fd',1,'RadiationModel::addCollimatedRadiationSource(const helios::vec3 &direction)']]], + ['addcolorboard_27',['addColorboard',['../struct_camera_calibration.html#ad1c0a4605b3b3ea355b9f3dee1706ec9',1,'CameraCalibration']]], + ['addcone_28',['addCone',['../group__compoundobjects.html#gae6dfe37103da5348a8e09541e6832579',1,'helios::Context::addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)'],['../group__compoundobjects.html#gaa90786c814a02a713c73e3f2063f7b15',1,'helios::Context::addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, RGBcolor &color)'],['../group__compoundobjects.html#gadaded2acc62c6bf577b840097cf63715',1,'helios::Context::addCone(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char *texturefile)']]], + ['addconeobject_29',['addConeObject',['../group__compoundobjects.html#ga91e46b44e9d7ece5a7e75e739cac4610',1,'helios::Context::addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1)'],['../group__compoundobjects.html#ga5dfcb74a1406d4a2ee15c251dedcd744',1,'helios::Context::addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const RGBcolor &color)'],['../group__compoundobjects.html#gaff21895b974a64df8fd78b3604d7c404',1,'helios::Context::addConeObject(uint Ndivs, const vec3 &node0, const vec3 &node1, float radius0, float radius1, const char *texturefile)']]], + ['addcoordinateaxes_30',['addCoordinateAxes',['../class_visualizer.html#a831a69f2320707924c582e27d29a0ee5',1,'Visualizer::addCoordinateAxes()'],['../class_visualizer.html#a309ce95c73229321d06d52f219b30510',1,'Visualizer::addCoordinateAxes(const helios::vec3 &origin, const helios::vec3 &length, const std::string &sign)']]], + ['adddefaultcheckerboard_31',['addDefaultCheckerboard',['../struct_camera_calibration.html#a73e6dfb0a8a3a68beeed498797310702',1,'CameraCalibration']]], + ['adddefaultcolorboard_32',['addDefaultColorboard',['../struct_camera_calibration.html#a4b1c43adcd27bc075327a239f31f03b8',1,'CameraCalibration']]], + ['adddisk_33',['addDisk',['../group__compoundobjects.html#gaad3d5c21579728fa839c6a95514991bb',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)'],['../group__compoundobjects.html#ga3c0d84f0ade9148214d0a7ec5e574aeb',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)'],['../group__compoundobjects.html#gac774b33822ae284009dc761146e37670',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)'],['../group__compoundobjects.html#gaf323d883bfc3392b3817fce85a5205ae',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__compoundobjects.html#gaee1c741715ce7367c8198e573b9684ec',1,'helios::Context::addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)'],['../group__compoundobjects.html#gac196d3c8356561ef33b6e41c80cf8b4a',1,'helios::Context::addDisk(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)'],['../group__compoundobjects.html#ga9e43e2dc65df7b0aa93e140881fd2bfa',1,'helios::Context::addDisk(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__compoundobjects.html#gacb1267c95cec56efb0150e292c12f24c',1,'helios::Context::addDisk(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texturefile)']]], + ['adddiskbycenter_34',['addDiskByCenter',['../class_visualizer.html#acd7256a79fdfe2b37f270bec45bb3568',1,'Visualizer::addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a1f4ef2ddcab0f1ed6bc1b4378b25e2df',1,'Visualizer::addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a2886b6f91cd376bd83a945bc1b551f01',1,'Visualizer::addDiskByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, uint Ndivisions, const char *texture_file, CoordinateSystem coordFlag)']]], + ['adddiskobject_35',['addDiskObject',['../group__compoundobjects.html#ga064d0343ca8556d8a6a00c7cdce3bf0d',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)'],['../group__compoundobjects.html#ga826e790ed5999e168c22ddcc7e57e514',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)'],['../group__compoundobjects.html#gadcc9c858b2c3afe1430ff4013f69b780',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)'],['../group__compoundobjects.html#gaed3cc3a47ff86ea9dfcf70cd9b295b23',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__compoundobjects.html#ga4fb358731a06c9eafc267e9e6f522577',1,'helios::Context::addDiskObject(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)'],['../group__compoundobjects.html#ga8b77c42881f1b6d4a6abb712256a87cd',1,'helios::Context::addDiskObject(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)'],['../group__compoundobjects.html#ga259d1db05876a3dbf7a37ac5612935c4',1,'helios::Context::addDiskObject(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__compoundobjects.html#ga9edafbc21c49d4f76294279a2818cfb4',1,'helios::Context::addDiskObject(const int2 &Ndivs, const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texturefile)']]], + ['adddiskradiationsource_36',['addDiskRadiationSource',['../class_radiation_model.html#a8ef94c0bf6286d3e64d7d8c8b96f33bc',1,'RadiationModel']]], + ['addepicormicshoot_37',['addEpicormicShoot',['../class_plant_architecture.html#ade786dc8bb429eb033d29ccf9df6b254',1,'PlantArchitecture']]], + ['addgrapecluster_38',['addGrapeCluster',['../class_canopy_generator.html#a6c8cbbd68ca9bd84d42324622cfba0d9',1,'CanopyGenerator']]], + ['addgrid_39',['addGrid',['../class_li_d_a_rcloud.html#a755ab5b665c80e30a49450ccfa1592d1',1,'LiDARcloud']]], + ['addgridcell_40',['addGridCell',['../class_li_d_a_rcloud.html#ac850f71f86e2872a78d8ff9bc6df6d08',1,'LiDARcloud::addGridCell(const helios::vec3 &center, const helios::vec3 &size, float rotation)'],['../class_li_d_a_rcloud.html#a60a1e6e5eeb76df93e99c0bbaa971b93',1,'LiDARcloud::addGridCell(const helios::vec3 &center, const helios::vec3 &global_anchor, const helios::vec3 &size, const helios::vec3 &global_size, float rotation, const helios::int3 &global_ijk, const helios::int3 &global_count)']]], + ['addgridtovisualizer_41',['addGridToVisualizer',['../class_aerial_li_d_a_rcloud.html#afc659e4837184ee76ce5b165ea2515df',1,'AerialLiDARcloud::addGridToVisualizer()'],['../class_li_d_a_rcloud.html#a2b7b76c26d6dd976bf37c0595b761507',1,'LiDARcloud::addGridToVisualizer()']]], + ['addgridwireframe_42',['addGridWireFrame',['../class_visualizer.html#a6cbeaf6c6b6e877106173bc42a018d10',1,'Visualizer']]], + ['addgridwireframetovisualizer_43',['addGridWireFrametoVisualizer',['../class_li_d_a_rcloud.html#af8c99daa924206b8172bb3bb1657e251',1,'LiDARcloud']]], + ['addhitpoint_44',['addHitPoint',['../class_aerial_li_d_a_rcloud.html#a746b984566c871ff37d87cd52ed046a2',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::vec3 ray_origin)'],['../class_aerial_li_d_a_rcloud.html#a9ba0abbd9a178fbac01e5fcadfafe2b3',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction)'],['../class_aerial_li_d_a_rcloud.html#a8fc59bf1e7995b74ebc260dc31e66edc',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color)'],['../class_aerial_li_d_a_rcloud.html#a2caa78d1f8a3b4136ae270c9b741eaf7',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const std::map< std::string, float > data)'],['../class_aerial_li_d_a_rcloud.html#a2de9fafdab55721b424abf420b15c1b2',1,'AerialLiDARcloud::addHitPoint(const uint scanID, const helios::vec3 hit_xyz, const helios::SphericalCoord direction, const helios::RGBcolor color, const std::map< std::string, float > data)'],['../class_li_d_a_rcloud.html#a6f01d5c6bdab78ee7bc08c90ba5f2217',1,'LiDARcloud::addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction)'],['../class_li_d_a_rcloud.html#ae1955f2181dab90400fcabedb8997c71',1,'LiDARcloud::addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const helios::RGBcolor &color)'],['../class_li_d_a_rcloud.html#aed09112c241e9d60aea781c9684a2633',1,'LiDARcloud::addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const std::map< std::string, double > &data)'],['../class_li_d_a_rcloud.html#a794f9370ba56a29651a95709c528a6a4',1,'LiDARcloud::addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::SphericalCoord &direction, const helios::RGBcolor &color, const std::map< std::string, double > &data)'],['../class_li_d_a_rcloud.html#a244a1de12e8f6a3518b8715086c28e46',1,'LiDARcloud::addHitPoint(uint scanID, const helios::vec3 &xyz, const helios::int2 &row_column, const helios::RGBcolor &color, const std::map< std::string, double > &data)']]], + ['addhitstovisualizer_45',['addHitsToVisualizer',['../class_aerial_li_d_a_rcloud.html#a2e72b963be7631462f852103f415eeae',1,'AerialLiDARcloud::addHitsToVisualizer(Visualizer *visualizer, const uint pointsize) const'],['../class_aerial_li_d_a_rcloud.html#a36a118297008063457035ef2e281b6cc',1,'AerialLiDARcloud::addHitsToVisualizer(Visualizer *visualizer, const uint pointsize, const char *color_value) const'],['../class_li_d_a_rcloud.html#a2102dd4711658414cca10fd40a66af18',1,'LiDARcloud::addHitsToVisualizer(Visualizer *visualizer, uint pointsize) const'],['../class_li_d_a_rcloud.html#a6292d1b6fce7638a256e090608c8c309',1,'LiDARcloud::addHitsToVisualizer(Visualizer *visualizer, uint pointsize, const char *color_value) const']]], + ['adding_20a_20patch_20to_20the_20context_46',['Adding a Patch to the Context',['../context_primitives.html#AddPatch',1,'']]], + ['adding_20a_20radiation_20camera_47',['Adding a Radiation Camera',['../_radiation_doc.html#RadCamAdd',1,'']]], + ['adding_20collimated_20sources_48',['Adding Collimated Sources',['../_radiation_doc.html#ColSource',1,'']]], + ['adding_20diffuse_20ambient_20sources_49',['Adding Diffuse/Ambient Sources',['../_radiation_doc.html#AmbSource',1,'']]], + ['adding_20disk_20radiation_20sources_50',['Adding Disk Radiation Sources',['../_radiation_doc.html#DiskSource',1,'']]], + ['adding_20geometry_51',['Adding Geometry',['../_visualizer_doc.html#AddGeom',1,'']]], + ['adding_20patches_52',['Adding Patches',['../_a_p_i.html#AddingPatch',1,'']]], + ['adding_20primitives_53',['Adding Primitives',['../_a_p_i.html#AddingPrims',1,'Adding Primitives'],['../_i_o.html#PrimXML',1,'Adding Primitives']]], + ['adding_20rectangular_20radiation_20sources_54',['Adding Rectangular Radiation Sources',['../_radiation_doc.html#RectSource',1,'']]], + ['adding_20spherical_20radiation_20sources_55',['Adding Spherical Radiation Sources',['../_radiation_doc.html#PointSource',1,'']]], + ['adding_20spherical_20sun_20source_56',['Adding Spherical Sun Source',['../_radiation_doc.html#SunSphereSource',1,'']]], + ['adding_20timeseries_20data_57',['Adding Timeseries Data',['../_i_o.html#TimeXML',1,'']]], + ['adding_20timeseries_20weather_20data_20from_20tabular_20text_20files_58',['Adding Timeseries (Weather) Data from Tabular Text Files',['../_i_o.html#ASCIItimeseries',1,'']]], + ['adding_20trees_20from_20the_20tree_20library_59',['Adding Trees from the Tree Library',['../_weber_penn_doc.html#WPTadd',1,'']]], + ['adding_20triangles_60',['Adding Triangles',['../_a_p_i.html#AddingTriangle',1,'']]], + ['adding_20voxels_61',['Adding Voxels',['../_a_p_i.html#AddingVoxel',1,'']]], + ['addleafreconstructiontocontext_62',['addLeafReconstructionToContext',['../class_li_d_a_rcloud.html#aeca8578d8b5ecbc92fa669c612196f8c',1,'LiDARcloud::addLeafReconstructionToContext(helios::Context *context) const'],['../class_li_d_a_rcloud.html#ab2b1545809e3537b4e7e803acc8c13c1',1,'LiDARcloud::addLeafReconstructionToContext(helios::Context *context, const helios::int2 &subpatches) const']]], + ['addleafreconstructiontovisualizer_63',['addLeafReconstructionToVisualizer',['../class_li_d_a_rcloud.html#a9c9cff3d1f5a68814ff2121d3b12d9b8',1,'LiDARcloud']]], + ['addline_64',['addLine',['../class_visualizer.html#a48a8390c82a8ee31172827b9aa378eb3',1,'Visualizer::addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBcolor &color, uint linewidth, CoordinateSystem coordFlag)'],['../class_visualizer.html#ae287d6fdfab2cac58d0c1be890eff057',1,'Visualizer::addLine(const helios::vec3 &start, const helios::vec3 &end, const helios::RGBAcolor &color, uint linewidth, CoordinateSystem coordFlag)']]], + ['addpatch_65',['addPatch',['../group__primitives.html#gaf4aec42f3f104b7c71150577ef129659',1,'helios::Context::addPatch()'],['../group__primitives.html#gafaae593d52d284c5aab98e29cee0cd76',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size)'],['../group__primitives.html#ga148090c69c7b04bbfbae4eed2443a235',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation)'],['../classhelios_1_1_context.html#a7ead8162aab12a399925aa89a6f9007c',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color)'],['../classhelios_1_1_context.html#a5118575675393453c5d927e66d59293e',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color)'],['../group__primitives.html#ga953a329d019e3c91948b139215c748af',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file)'],['../group__primitives.html#ga542e67cc428fb707452c216091a7f24f',1,'helios::Context::addPatch(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file, const helios::vec2 &uv_center, const helios::vec2 &uv_size)']]], + ['addplantinstance_66',['addPlantInstance',['../class_plant_architecture.html#a046541b573d8e03845a2038370cd6665',1,'PlantArchitecture']]], + ['addpoint_67',['addPoint',['../class_visualizer.html#a228b710936fbf5e2bda8701c717b4019',1,'Visualizer::addPoint(const helios::vec3 &position, const helios::RGBcolor &color, uint pointsize, CoordinateSystem coordFlag)'],['../class_visualizer.html#a4767d80ec00f90b36b9547da4bcc3d77',1,'Visualizer::addPoint(const helios::vec3 &position, const helios::RGBAcolor &color, uint pointsize, CoordinateSystem coordFlag)']]], + ['addpolymeshobject_68',['addPolymeshObject',['../group__compoundobjects.html#gababf99153757527880fe3866cc23fd1b',1,'helios::Context']]], + ['addradiationband_69',['addRadiationBand',['../class_energy_balance_model.html#a7ce12c9b4baf734d49562fe45e7eb272',1,'EnergyBalanceModel::addRadiationBand(const char *band)'],['../class_energy_balance_model.html#a4de3ab8046e5926fa022d877a11953c3',1,'EnergyBalanceModel::addRadiationBand(const std::vector< std::string > &bands)'],['../class_radiation_model.html#ad0a4554dfa67054804de534229805054',1,'RadiationModel::addRadiationBand(const std::string &label)'],['../class_radiation_model.html#a066dd10dcf1ebd8902b197bb6812b5e1',1,'RadiationModel::addRadiationBand(const std::string &label, float wavelength_min, float wavelength_max)']]], + ['addradiationcamera_70',['addRadiationCamera',['../class_radiation_model.html#aedf80552eaf2bf6a8544dcb2c72cb331',1,'RadiationModel::addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::vec3 &lookat, const CameraProperties &camera_properties, uint antialiasing_samples)'],['../class_radiation_model.html#ab4509110acf603466cbed2ad05fcc1a3',1,'RadiationModel::addRadiationCamera(const std::string &camera_label, const std::vector< std::string > &band_label, const helios::vec3 &position, const helios::SphericalCoord &viewing_direction, const CameraProperties &camera_properties, uint antialiasing_samples)']]], + ['addreconstructedtrianglegroupstocontext_71',['addReconstructedTriangleGroupsToContext',['../class_li_d_a_rcloud.html#a503c74fc549e5c3b25a5f5bf2d6a8955',1,'LiDARcloud']]], + ['addrectanglebycenter_72',['addRectangleByCenter',['../class_visualizer.html#acd331a705d12dcec86131612cf433e88',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a48e6d180f3751da810b8ff1ec02a4cfe',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#af86d3df98bbfa845e9c6bb4d8945429d',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const char *texture_file, CoordinateSystem coordFlag)'],['../class_visualizer.html#a8ca1611eccfefb20cdfb2a686a78bd00',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const char *texture_file, CoordinateSystem coordFlag)'],['../class_visualizer.html#af0d855cd55a8ae6f9734ddaf7c02ef24',1,'Visualizer::addRectangleByCenter(const helios::vec3 &center, const helios::vec2 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)']]], + ['addrectanglebyvertices_73',['addRectangleByVertices',['../class_visualizer.html#ac778d07346ddf94b7341181ed4640e28',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a342a0315efa1aaf7844f704fed0244bd',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a28ed082b9f1dea0e81e28535a23b1521',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const char *texture_file, CoordinateSystem coordFlag)'],['../class_visualizer.html#afe1be9b4d0cfa14298e162d59f5749bf',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const char *texture_file, const std::vector< helios::vec2 > &uvs, CoordinateSystem coordFlag)'],['../class_visualizer.html#acbcf904d891cc28d56a12cb9672c6893',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const char *texture_file, const std::vector< helios::vec2 > &uvs, CoordinateSystem coordFlag)'],['../class_visualizer.html#a546e454af8cdfee4db207ddbc3abcd7e',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const char *texture_file, CoordinateSystem coordFlag)'],['../class_visualizer.html#a7ff15e66eb2ef54b7cc0c03deda255fe',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)'],['../class_visualizer.html#af11f22cfc12cf5abad785bc0b8d875d2',1,'Visualizer::addRectangleByVertices(const std::vector< helios::vec3 > &vertices, const helios::RGBAcolor &color, const Glyph *glyph, CoordinateSystem coordFlag)']]], + ['addrectangleradiationsource_74',['addRectangleRadiationSource',['../class_radiation_model.html#abb39d616c6b37bd56b2ea3014a19c6bf',1,'RadiationModel']]], + ['addscan_75',['addScan',['../class_aerial_li_d_a_rcloud.html#a2912db8a137ffa0add4261e63c6d72c2',1,'AerialLiDARcloud::addScan()'],['../class_li_d_a_rcloud.html#abbe448db446aa64f5ce5a923c597eae8',1,'LiDARcloud::addScan()']]], + ['addskydomebycenter_76',['addSkyDomeByCenter',['../class_visualizer.html#abc14ae2206a8b46c9724cc6aac06b44b',1,'Visualizer']]], + ['addsphere_77',['addSphere',['../group__compoundobjects.html#gac5df0d862dd8d6783edc037804c452bf',1,'helios::Context::addSphere(uint Ndivs, const vec3 &center, float radius)'],['../group__compoundobjects.html#ga645ee8b5e829c08e8e3549eceea815cc',1,'helios::Context::addSphere(uint Ndivs, const vec3 &center, float radius, const RGBcolor &color)'],['../group__compoundobjects.html#ga2b10346e874dd539c742102b385c9370',1,'helios::Context::addSphere(uint Ndivs, const vec3 &center, float radius, const char *texturefile)']]], + ['addspherebycenter_78',['addSphereByCenter',['../class_visualizer.html#a6ce8c982a4576eb8d8fd5dc9be3a8ddf',1,'Visualizer::addSphereByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#aff40781cf9b38f2f23e7fc998351105a',1,'Visualizer::addSphereByCenter(float radius, const helios::vec3 &center, uint Ndivisions, const helios::RGBAcolor &color, CoordinateSystem coordFlag)']]], + ['addsphereobject_79',['addSphereObject',['../group__compoundobjects.html#gae7cb6682b28087b6d1d68c12d6814a23',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, float radius)'],['../group__compoundobjects.html#gac0836f609016ffc2726788a252832003',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, float radius, const RGBcolor &color)'],['../group__compoundobjects.html#ga6c66a36c17dbf43376909fdc1f4df826',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, float radius, const char *texturefile)'],['../group__compoundobjects.html#gac1787b97a96f2c4d21d13ed130b263d0',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, const vec3 &radius)'],['../group__compoundobjects.html#ga2b30de9aefefbbac2400f79dfc7c74fb',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, const vec3 &radius, const RGBcolor &color)'],['../group__compoundobjects.html#gaa0f43d59a2c0341dfe3ab97814c37962',1,'helios::Context::addSphereObject(uint Ndivs, const vec3 &center, const vec3 &radius, const char *texturefile)']]], + ['addsphereradiationsource_80',['addSphereRadiationSource',['../class_radiation_model.html#a44fbd20dd6ee50666f8d693dbba89822',1,'RadiationModel']]], + ['addsunsphereradiationsource_81',['addSunSphereRadiationSource',['../class_radiation_model.html#a8edb972e53fecddc21f0c23d08e355d0',1,'RadiationModel::addSunSphereRadiationSource()'],['../class_radiation_model.html#ab6220aa1f1e5ad425df93c9abdef3d07',1,'RadiationModel::addSunSphereRadiationSource(const helios::SphericalCoord &sun_direction)'],['../class_radiation_model.html#a5ffce4db04c85848d55c895f9aedc5f5',1,'RadiationModel::addSunSphereRadiationSource(const helios::vec3 &sun_direction)']]], + ['addtextboxbycenter_82',['addTextboxByCenter',['../class_visualizer.html#a2e139e1e6446b90f29d9e280fe3111db',1,'Visualizer']]], + ['addtile_83',['addTile',['../group__compoundobjects.html#gae15ba3f5741d27c52c43a35eec6c866b',1,'helios::Context::addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)'],['../group__compoundobjects.html#ga48feb2165a7adfbb11cb402c7db56d4b',1,'helios::Context::addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color)'],['../group__compoundobjects.html#ga8d8cdafde1ebfaebf8edd27aa36ae82b',1,'helios::Context::addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char *texturefile)']]], + ['addtileobject_84',['addTileObject',['../group__compoundobjects.html#gae5c1fa3bae1ff170c14a4378fb8abd95',1,'helios::Context::addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)'],['../group__compoundobjects.html#gae846d22b6cba8b50582ace8509c16e12',1,'helios::Context::addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const RGBcolor &color)'],['../group__compoundobjects.html#gad5c5cd832ce014a4862d72ccf52e2100',1,'helios::Context::addTileObject(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv, const char *texturefile)']]], + ['addtimeseriesdata_85',['addTimeseriesData',['../group__timeseries.html#gab4e83017576a164eaa7c61cd0812d8a2',1,'helios::Context']]], + ['addtriangle_86',['addTriangle',['../group__primitives.html#ga2a78a464a4c7ef3375a0ced2f1005b77',1,'helios::Context::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)'],['../group__primitives.html#gafedf69d3c13704eac0b1cdbaedfc2f5c',1,'helios::Context::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color)'],['../group__primitives.html#ga6c541321006498aa976afd7a1a65cafb',1,'helios::Context::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color)'],['../group__primitives.html#ga6d8025b542a52a8683f76ae292934c76',1,'helios::Context::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2)'],['../class_visualizer.html#a30fa7fb8430e7e8e93e283710ea26a37',1,'Visualizer::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a7c57ae2c58acb076e43848d650912733',1,'Visualizer::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const helios::RGBAcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a0b45fc611a368a72d7f62e27aa4d4bfa',1,'Visualizer::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, CoordinateSystem coordFlag)'],['../class_visualizer.html#acc411df8e5d30efd31e69c46b4ce9875',1,'Visualizer::addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2, const char *texture_file, const helios::vec2 &uv0, const helios::vec2 &uv1, const helios::vec2 &uv2, const helios::RGBAcolor &color, CoordinateSystem coordFlag)']]], + ['addtrianglestocontext_87',['addTrianglesToContext',['../class_li_d_a_rcloud.html#a65c36191d1f0f82b77ebd2ffa2fe3821',1,'LiDARcloud']]], + ['addtrianglestovisualizer_88',['addTrianglesToVisualizer',['../class_li_d_a_rcloud.html#a11d8d20197aa909080d70954c97395e6',1,'LiDARcloud::addTrianglesToVisualizer(Visualizer *visualizer) const'],['../class_li_d_a_rcloud.html#a55d1d5c311e4cfa45fa47f36ac875e7f',1,'LiDARcloud::addTrianglesToVisualizer(Visualizer *visualizer, uint gridcell) const']]], + ['addtrunkreconstructiontocontext_89',['addTrunkReconstructionToContext',['../class_li_d_a_rcloud.html#a4af78b2f167575f641e867f0f0688dd1',1,'LiDARcloud']]], + ['addtrunkreconstructiontovisualizer_90',['addTrunkReconstructionToVisualizer',['../class_li_d_a_rcloud.html#aa23c198a2c7492b8b6c865a42971a93d',1,'LiDARcloud::addTrunkReconstructionToVisualizer(Visualizer *visualizer) const'],['../class_li_d_a_rcloud.html#a9fa20f56e1dbb38de35a48a599cda711',1,'LiDARcloud::addTrunkReconstructionToVisualizer(Visualizer *visualizer, const helios::RGBcolor &trunk_color) const']]], + ['addtube_91',['addTube',['../group__compoundobjects.html#gad1d3bab869a03fe7c35d33cf8a03841a',1,'helios::Context::addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)'],['../group__compoundobjects.html#ga622745a32ac6545e607b2dc18812dba9',1,'helios::Context::addTube(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const std::vector< RGBcolor > &color)'],['../group__compoundobjects.html#ga90ce3e295347f72bbd84322e491f7626',1,'helios::Context::addTube(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile)']]], + ['addtubeobject_92',['addTubeObject',['../group__compoundobjects.html#ga51f79fece15fee384255237359563a18',1,'helios::Context::addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)'],['../group__compoundobjects.html#ga0bb97aacf2830f27c1ad9b35609477c9',1,'helios::Context::addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const std::vector< RGBcolor > &color)'],['../group__compoundobjects.html#gac244937b4bb6a2e57e6c2b25e59a741f',1,'helios::Context::addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile)'],['../group__compoundobjects.html#gad109dcdc4ae24e03945a8d39c0dc7cc5',1,'helios::Context::addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius, const char *texturefile, const std::vector< float > &textureuv_vfrac)']]], + ['addvoxel_93',['addVoxel',['../group__primitives.html#ga5c3476d33e4c6125276bcae114b49b10',1,'helios::Context::addVoxel(const helios::vec3 &center, const helios::vec3 &size)'],['../group__primitives.html#gab03110bd9b0a7d4bdfedfe1e7881b6b0',1,'helios::Context::addVoxel(const helios::vec3 &center, const helios::vec3 &size, const float &rotation)'],['../classhelios_1_1_context.html#a722c6b3018a5a4cd7a1ccdb06fe21c4b',1,'helios::Context::addVoxel(const helios::vec3 &center, const helios::vec3 &size, const float &rotation, const helios::RGBcolor &color)'],['../classhelios_1_1_context.html#a16ca40cdd79ff77f7fab6506f0e06895',1,'helios::Context::addVoxel(const helios::vec3 &center, const helios::vec3 &size, const float &rotation, const helios::RGBAcolor &color)']]], + ['addvoxelbycenter_94',['addVoxelByCenter',['../class_visualizer.html#a4b814571e4dccc0e550d3f184a48fab8',1,'Visualizer::addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBcolor &color, CoordinateSystem coordFlag)'],['../class_visualizer.html#a2c289bcb13fa935f78f2d032fa852b90',1,'Visualizer::addVoxelByCenter(const helios::vec3 &center, const helios::vec3 &size, const helios::SphericalCoord &rotation, const helios::RGBAcolor &color, CoordinateSystem coordFlag)']]], + ['advancetime_95',['advanceTime',['../class_plant_architecture.html#a1df979fc7a8523961ae37d934be5bfa7',1,'PlantArchitecture::advanceTime(float time_step_days)'],['../class_plant_architecture.html#a30eb9cf338188dd725852d63919a9aa4',1,'PlantArchitecture::advanceTime(int time_step_years, float time_step_days)'],['../class_plant_architecture.html#a48c8a01f66fb38357bddc9eac35173e4',1,'PlantArchitecture::advanceTime(uint plantID, float time_step_days)']]], + ['aerial_20lidar_20point_20cloud_20plugin_20documentation_96',['Aerial LiDAR Point Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'PlugIns']]], + ['aerialhitpoint_97',['AerialHitPoint',['../struct_aerial_hit_point.html',1,'']]], + ['aeriallidar_2ecpp_98',['AerialLiDAR.cpp',['../_aerial_li_d_a_r_8cpp.html',1,'']]], + ['aeriallidar_2ecu_99',['AerialLiDAR.cu',['../_aerial_li_d_a_r_8cu.html',1,'']]], + ['aeriallidar_2eh_100',['AerialLiDAR.h',['../_aerial_li_d_a_r_8h.html',1,'']]], + ['aeriallidarcloud_101',['AerialLiDARcloud',['../class_aerial_li_d_a_rcloud.html',1,'AerialLiDARcloud'],['../class_aerial_li_d_a_rcloud.html#acbcca37e844dc4e5e72c703c619d8962',1,'AerialLiDARcloud::AerialLiDARcloud()']]], + ['aerialscanmetadata_102',['AerialScanMetadata',['../struct_aerial_scan_metadata.html',1,'AerialScanMetadata'],['../struct_aerial_scan_metadata.html#a7335ab6e76b88c50520e3fd205d4c575',1,'AerialScanMetadata::AerialScanMetadata()']]], + ['age_103',['age',['../struct_phytomer.html#adca1542efc0d16f0117d533f86c849e5',1,'Phytomer']]], + ['aggregateprimitivedataproduct_104',['aggregatePrimitiveDataProduct',['../classhelios_1_1_context.html#a66b69dc68ed0a21353485eff97257047',1,'helios::Context']]], + ['aggregateprimitivedatasum_105',['aggregatePrimitiveDataSum',['../classhelios_1_1_context.html#aad6f828c598f574cab637a263562bea2',1,'helios::Context']]], + ['al_202011_20optimality_20based_20model_106',['Medlyn et al. (2011) Optimality-Based Model',['../_stomatal_doc.html#MoptTheory',1,'']]], + ['ambient_20longwave_20flux_107',['Ambient Longwave Flux',['../_solar_position_doc.html#LWTheory',1,'']]], + ['ambient_20sources_108',['Adding Diffuse/Ambient Sources',['../_radiation_doc.html#AmbSource',1,'']]], + ['an_20api_109',['What is an API?',['../_overview.html#whatisAPI',1,'']]], + ['an_20individual_20plant_110',['Building an Individual Plant',['../_canopy_generator_doc.html#CGenBuildPlant',1,'']]], + ['and_20adams_202012_111',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['and_20auxiliary_20cpp_20files_112',['Main and auxiliary .cpp files',['../_a_p_i.html#Source',1,'']]], + ['and_20building_20a_20project_113',['Opening and building a project',['../_c_lion_i_d_e.html#CLionProject',1,'']]], + ['and_20calculate_20par_20interception_114',['3. Run the model and calculate PAR interception',['../radiation_basics.html#Tutorial10_run',1,'']]], + ['and_20compilers_20toolchains_115',['Setting up CMake and compilers (Toolchains)',['../_c_lion_i_d_e.html#CLionToolchains',1,'']]], + ['and_20compiling_20your_20own_20projects_116',['Building and Compiling Your Own Projects',['../_a_p_i.html#BuildCompile',1,'']]], + ['and_20cropping_20optional_117',['2. Rotating and cropping (OPTIONAL)',['../_making_masks.html#Two',1,'']]], + ['and_20cropping_20primitives_20on_20the_20boundaries_118',['2. Slicing and cropping primitives on the boundaries',['../radiation__beers_law.html#tutorial11_slice',1,'']]], + ['and_20data_119',['Model Geometry and Data',['../_overview.html#ModelGeom',1,'']]], + ['and_20diffuse_20solar_20flux_120',['Direct and Diffuse Solar Flux',['../_solar_position_doc.html#SolarFluxTheory',1,'']]], + ['and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_121',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['and_20full_20waveform_20lidar_20data_122',['and full waveform LiDAR data',['../_aerial_li_d_a_r_doc.html#AerialLiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#LiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data']]], + ['and_20general_20tree_20shape_123',['Trunk and general tree shape',['../_weber_penn_doc.html#WPTreeShape',1,'']]], + ['and_20initialize_20the_20visualizer_20class_124',['Step 1. Declare and initialize the Visualizer class',['../visualizer_basics.html#vis_step1',1,'']]], + ['and_20insertion_5fangle_5fdecay_5frate_125',['insertion_angle_tip and insertion_angle_decay_rate',['../_plant_architecture_doc.html#ShootParam_insertion',1,'']]], + ['and_20internode_5flength_5fdecay_5frate_126',['internode_length_max, internode_length_min, and internode_length_decay_rate',['../_plant_architecture_doc.html#ShootParam_length',1,'']]], + ['and_20its_20parameters_127',['Defining the Phytomer and its Parameters',['../_plant_architecture_doc.html#PlantArchPhytomerParams',1,'']]], + ['and_20max_5fnodes_5fper_5fseason_128',['max_nodes and max_nodes_per_season',['../_plant_architecture_doc.html#ShootParam_max_nodes',1,'']]], + ['and_20normalization_129',['Setting the Radiation Source Spectral Distribution and Normalization',['../_radiation_doc.html#SourceDist',1,'']]], + ['and_20optix_20version_130',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['and_20parameters_131',['Available Geometries and Parameters',['../_canopy_generator_doc.html#CGenGeometries',1,'']]], + ['and_20primitive_20data_132',['Variables and Primitive Data',['../_voxel_intersection_doc.html#VoxVarsAndProps',1,'']]], + ['and_20primitive_20uuids_20of_20model_20geometry_133',['Getting Object IDs and Primitive UUIDs of Model Geometry',['../_plant_architecture_doc.html#PlantArchQueryobjIDs',1,'']]], + ['and_20process_20results_134',['4. Run model and process results',['../radiation__beers_law.html#tutorial11_run',1,'']]], + ['and_20running_135',['Building, Compiling, and Running',['../context_selftest.html#build_2',1,'']]], + ['and_20scan_20pattern_136',['and scan pattern',['../_aerial_li_d_a_r_doc.html#AerialLiDARcoord',1,'Coordinates and scan pattern'],['../_li_d_a_r_doc.html#LiDARcoord',1,'Coordinates and scan pattern']]], + ['and_20set_20up_137',['Install and Set-up',['../_dependent_software.html',1,'']]], + ['and_20shading_138',['Colors and Shading',['../_visualizer_doc.html#ColorShade',1,'']]], + ['and_20their_20parameters_139',['Defining Shoots and their Parameters',['../_plant_architecture_doc.html#PlantArchShoot',1,'']]], + ['and_20vegetative_5fbud_5fbreak_5fprobability_5fdecay_5frate_140',['vegetative_bud_break_probability_min and vegetative_bud_break_probability_decay_rate',['../_plant_architecture_doc.html#ShootParam_vegetative_prob',1,'']]], + ['angle_20distribution_20functions_141',['User-Defined Leaf Angle Distribution Functions',['../_weber_penn_doc.html#WPTgL',1,'']]], + ['api_142',['What is an API?',['../_overview.html#whatisAPI',1,'']]], + ['api_20guide_143',['User/API Guide',['../_a_p_i.html',1,'']]], + ['appendphytomer_144',['appendPhytomer',['../struct_shoot.html#a624619a8a5106774aa25dc99ba06cd41',1,'Shoot']]], + ['appendphytomertoshoot_145',['appendPhytomerToShoot',['../class_plant_architecture.html#a122fad48603e2e0f2fe6d870c691bfd1',1,'PlantArchitecture']]], + ['appendshoot_146',['appendShoot',['../class_plant_architecture.html#a25a69b3eee4eab6501a8bedc777b8c55',1,'PlantArchitecture']]], + ['appendtubesegment_147',['appendTubeSegment',['../classhelios_1_1_tube.html#aac259b1a564be7ac9cc11bd14ab8cf82',1,'helios::Tube::appendTubeSegment(const helios::vec3 &node_position, float node_radius, const helios::RGBcolor &node_color)'],['../classhelios_1_1_tube.html#a7cb8cf830e6017d29c7396c28846f83b',1,'helios::Tube::appendTubeSegment(const helios::vec3 &node_position, float node_radius, const char *texturefile, const helios::vec2 &textureuv_ufrac)'],['../classhelios_1_1_context.html#a646f6a5449870a191fe3d60db849b190',1,'helios::Context::appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float radius, const RGBcolor &color)'],['../classhelios_1_1_context.html#a9d097ed9d14b9d575e494bf000ce33ec',1,'helios::Context::appendTubeSegment(uint ObjID, const helios::vec3 &node_position, float node_radius, const char *texturefile, const helios::vec2 &textureuv_ufrac)']]], + ['approxsame_148',['approxSame',['../class_voxel_intersection.html#a7b67a822c84c1086e3d0a8e05114c4bc',1,'VoxelIntersection::approxSame(float a, float b, float absTol, float relTol)'],['../class_voxel_intersection.html#af78fea330c0c2e38e3a02db732ed7dd7',1,'VoxelIntersection::approxSame(helios::vec3 a, helios::vec3 b, float absTol)']]], + ['architecture_20model_20plugin_20documentation_149',['Plant Architecture Model Plugin Documentation',['../_plant_architecture_doc.html',1,'PlugIns']]], + ['area_150',['area',['../struct_per_ray_data.html#a3bf336505e26e0fe714a4347524f7407',1,'PerRayData::area'],['../_aerial_li_d_a_r_doc.html#AerialLeafArea',1,'Leaf area']]], + ['area_20basis_151',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['area_20basis_20for_20calculating_20fluxes_152',['Area Basis for Calculating Fluxes',['../_radiation_doc.html#RadTwoSided',1,'']]], + ['area_20for_20a_20homogeneous_20canopy_153',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['area_20for_20each_20grid_20cell_154',['Calculating leaf area for each grid cell',['../_li_d_a_r_doc.html#LiDARleafarea',1,'']]], + ['area_20fraction_155',['4e. Calculate the theoretical sunlit area fraction',['../radiation__beers_law.html#tutorial11_fsunBeer',1,'']]], + ['area_20fraction_20from_20the_20simulation_156',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['areobjectprimitivescomplete_157',['areObjectPrimitivesComplete',['../classhelios_1_1_context.html#ad1ad7d600c2d436ae48d218c1aa19668',1,'helios::Context']]], + ['areprimitivescomplete_158',['arePrimitivesComplete',['../classhelios_1_1_compound_object.html#a74e4a36175853a8e14153678c035accb',1,'helios::CompoundObject']]], + ['around_20a_20sphere_159',['3. Laminar flow around a sphere',['../_b_l_conductance_doc.html#BLC3',1,'']]], + ['arrays_160',['Arrays',['../context_globaldata.html#context_globaldata_arrays',1,'Creating Global Data (Arrays)'],['../context_primdata.html#context_primdata_arrays',1,'Creating Primitive Data (Arrays)']]], + ['asin_5fsafe_161',['asin_safe',['../group__functions.html#gac400d6d37ff2494ec592a9f0a17ee9ab',1,'helios']]], + ['assets_2ecpp_162',['Assets.cpp',['../_assets_8cpp.html',1,'']]], + ['assimilation_20rate_20to_20co2_163',['Response of Assimilation Rate to CO2',['../_photosynthesis_doc.html#PhotoCO2Param',1,'']]], + ['assimilation_20rate_20to_20light_164',['Response of Assimilation Rate to Light',['../_photosynthesis_doc.html#PhotoLightParam',1,'']]], + ['assimilation_20rate_20to_20temperature_165',['Response of Assimilation Rate to Temperature',['../_photosynthesis_doc.html#PhotoTempParam',1,'']]], + ['atan2_5f2pi_166',['atan2_2pi',['../group__functions.html#ga37a64a73b3318125a778bb77c29f7dcf',1,'helios']]], + ['automatically_20importing_20context_20geometry_167',['Automatically importing Context geometry',['../_visualizer_doc.html#ContextGeom',1,'']]], + ['auxiliary_20cpp_20files_168',['Main and auxiliary .cpp files',['../_a_p_i.html#Source',1,'']]], + ['available_20geometries_20and_20parameters_169',['Available Geometries and Parameters',['../_canopy_generator_doc.html#CGenGeometries',1,'']]], + ['axisrotation_170',['AxisRotation',['../struct_axis_rotation.html',1,'']]], + ['azimuth_171',['azimuth',['../structhelios_1_1_spherical_coord.html#af63b7ee76a5d57bf5881079eff52aa59',1,'helios::SphericalCoord']]] ]; diff --git a/doc/html/search/all_a.js b/doc/html/search/all_a.js index 937e12973..5117a181b 100644 --- a/doc/html/search/all_a.js +++ b/doc/html/search/all_a.js @@ -1,6 +1,88 @@ var searchData= [ - ['jpg_5ferror_5fmgr_0',['jpg_error_mgr',['../structjpg__error__mgr.html',1,'']]], - ['julian2calendar_1',['Julian2Calendar',['../group__vectors.html#gad744b2f0b25c66570a13cba4ace0455b',1,'helios']]], - ['julianday_2',['JulianDay',['../structhelios_1_1_date.html#abf3a401379adb23851174683a9191efc',1,'helios::Date::JulianDay()'],['../global_8h.html#a7a889dd38f803c031f3e2ce6936b1cdc',1,'helios::JulianDay(int day, int month, int year)'],['../group__functions.html#ga4e5ae2905291ff8a5ed97bc93e7fe71d',1,'helios::JulianDay(const Date &date)']]] + ['b_0',['b',['../structhelios_1_1_r_g_bcolor.html#a1b3ba3f5b77ef3082088eff853d4c335',1,'helios::RGBcolor::b'],['../structhelios_1_1_r_g_b_acolor.html#aaa86bd3e17f03ffdc182c5c9b67587e3',1,'helios::RGBAcolor::b']]], + ['b_20a_20color_20vectors_1',['R-G-B(-A) color vectors',['../_a_p_i.html#RGB',1,'']]], + ['b_20code_2',['Coloring by r-g-b code',['../_visualizer_doc.html#ColoringRGB',1,'']]], + ['background_3',['background',['../_making_masks.html#Three',1,'3. Removing the background'],['../_visualizer_doc.html#Background',1,'Window background']]], + ['background_20information_4',['Background information',['../_aerial_li_d_a_r_doc.html#AerialLiDARbg',1,'Background information'],['../_li_d_a_r_doc.html#LiDARbg',1,'Background information']]], + ['background_20theory_5',['Background Theory',['../_plant_architecture_doc.html#PlantArchDescription',1,'']]], + ['balance_20model_20plug_20in_6',['Using the Energy Balance Model Plug-in',['../_energy_balance_doc.html#EBUse',1,'']]], + ['balance_20model_20plugin_20documentation_7',['Energy Balance Model Plugin Documentation',['../_energy_balance_doc.html',1,'PlugIns']]], + ['ball_20berry_20leuning_20model_20theory_8',['Ball-Berry-Leuning Model Theory',['../_stomatal_doc.html#BBLTheory',1,'']]], + ['ball_20woodrow_20berry_201987_20model_20theory_9',['Ball, Woodrow, Berry (1987) Model Theory',['../_stomatal_doc.html#BWBTheory',1,'']]], + ['bands_10',['Bands',['../_radiation_doc.html#RadBands',1,'Defining Wavelength Bands'],['../_energy_balance_doc.html#EBRad',1,'Input Radiative Bands']]], + ['bare_20ground_11',['4. Flow over bare ground',['../_b_l_conductance_doc.html#BLC4',1,'']]], + ['base_5fheight_12',['base_height',['../struct_white_spruce_canopy_parameters.html#a6f6626318bb82788ba433efecde7830c',1,'WhiteSpruceCanopyParameters']]], + ['base_5froll_13',['base_roll',['../_plant_architecture_doc.html#ShootParam_base_roll',1,'']]], + ['basecanopyparameters_14',['BaseCanopyParameters',['../struct_base_canopy_parameters.html',1,'BaseCanopyParameters'],['../struct_base_canopy_parameters.html#a164f6d2b463a7ff7bf58551f1295e1f5',1,'BaseCanopyParameters::BaseCanopyParameters()'],['../struct_base_canopy_parameters.html#a22b341ef9edf0edcd95030aec4bf0a3a',1,'BaseCanopyParameters::BaseCanopyParameters(const pugi::xml_node canopy_node)']]], + ['based_20model_15',['Medlyn et al. (2011) Optimality-Based Model',['../_stomatal_doc.html#MoptTheory',1,'']]], + ['basegrapevineparameters_16',['BaseGrapeVineParameters',['../struct_base_grape_vine_parameters.html',1,'BaseGrapeVineParameters'],['../struct_base_grape_vine_parameters.html#a422125376a63e56695eb9f58581217b0',1,'BaseGrapeVineParameters::BaseGrapeVineParameters()'],['../struct_base_grape_vine_parameters.html#a7f439fd0f30ce24900ae9a299e28aa3c',1,'BaseGrapeVineParameters::BaseGrapeVineParameters(const pugi::xml_node canopy_node)']]], + ['basic_20build_20functionality_17',['basic build functionality',['../_dependent_software.html#SetupPCCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupLinuxCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupMacCLion',1,'Setting up basic build functionality']]], + ['basic_20directory_20structure_18',['Basic Directory Structure',['../_a_p_i.html#DirStruct',1,'']]], + ['basic_20unit_20of_20a_20plant_20shoot_19',['The Phytomer: Basic unit of a plant shoot',['../_plant_architecture_doc.html#PlantArchPhytomer',1,'']]], + ['basics_20',['Basics',['../_tutorials.html#ContextBasicsTut',1,'Context Basics'],['../visualizer_basics.html',1,'Tutorial 7: Visualizer Basics']]], + ['basics_20tree_20light_20interception_21',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['basis_22',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['basis_20for_20calculating_20fluxes_23',['Area Basis for Calculating Fluxes',['../_radiation_doc.html#RadTwoSided',1,'']]], + ['bbcoefficients_24',['BBcoefficients',['../struct_b_bcoefficients.html',1,'']]], + ['bblcoefficients_25',['BBLcoefficients',['../struct_b_b_lcoefficients.html',1,'']]], + ['bbox_5fbounds_26',['bbox_bounds',['../primitive_intersection_8cu.html#a463610deabc8971f8d92607f462e28f3',1,'primitiveIntersection.cu']]], + ['bbox_5fintersect_27',['bbox_intersect',['../primitive_intersection_8cu.html#a4b1369e96290adffabbbcc86b92d8560',1,'primitiveIntersection.cu']]], + ['be_20used_28',['Setting the Boundary-layer Conductance Model To Be Used',['../_b_l_conductance_doc.html#BLCSet',1,'']]], + ['beamdivergence_29',['beamDivergence',['../struct_aerial_scan_metadata.html#a8572a62a5c28d56c69e55737272d07b4',1,'AerialScanMetadata::beamDivergence'],['../struct_scan_metadata.html#acec69b1556a96236c0702f03b231d008',1,'ScanMetadata::beamDivergence']]], + ['bean_30',['bean',['../class_canopy_generator.html#ad23ee37e5873fe542f6fc799f541384f',1,'CanopyGenerator']]], + ['beanparameters_31',['BeanParameters',['../struct_bean_parameters.html',1,'BeanParameters'],['../struct_bean_parameters.html#a2fdf7cbadfebd5c8494ad9bbdb0e8bf5',1,'BeanParameters::BeanParameters()'],['../struct_bean_parameters.html#a901e474f4df9ef7639832c9359e21e0a',1,'BeanParameters::BeanParameters(const pugi::xml_node canopy_node)']]], + ['beer_20s_20law_32',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['berry_201987_20model_20theory_33',['Ball, Woodrow, Berry (1987) Model Theory',['../_stomatal_doc.html#BWBTheory',1,'']]], + ['berry_20leuning_20model_20theory_34',['Ball-Berry-Leuning Model Theory',['../_stomatal_doc.html#BBLTheory',1,'']]], + ['berry_20model_20description_35',['Farquhar, von Caemmerer, Berry Model Description',['../_photosynthesis_doc.html#FarquharDescription',1,'']]], + ['between_20discrete_20return_20and_20full_20waveform_20lidar_20data_36',['between discrete return and full waveform LiDAR data',['../_aerial_li_d_a_r_doc.html#AerialLiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#LiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data']]], + ['blconductancemodel_37',['BLConductanceModel',['../class_b_l_conductance_model.html',1,'BLConductanceModel'],['../class_b_l_conductance_model.html#af507e5b75f21372ec225d5e5c0c8c97a',1,'BLConductanceModel::BLConductanceModel()']]], + ['blconductancemodel_20class_20constructor_38',['BLConductanceModel Class Constructor',['../_b_l_conductance_doc.html#BLCConstructor',1,'']]], + ['blend_39',['blend',['../global_8h.html#a192c018f83c0598738e048212904202d',1,'helios::blend(const RGBcolor &color0, const RGBcolor &color1, float weight)'],['../global_8h.html#a06a8d8b0bee35e1fd8c564a7674bd07a',1,'helios::blend(const RGBAcolor &color0, const RGBAcolor &color1, float weight)']]], + ['blender_40',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['blendspectra_41',['blendSpectra',['../class_radiation_model.html#a43a328dde4dd5f1a431afe9dc5e8664e',1,'RadiationModel']]], + ['blendspectrarandomly_42',['blendSpectraRandomly',['../class_radiation_model.html#a3f52651f2144aaca702824028964a076',1,'RadiationModel']]], + ['bmfcoefficients_43',['BMFcoefficients',['../struct_b_m_fcoefficients.html',1,'']]], + ['boundaries_44',['2. Slicing and cropping primitives on the boundaries',['../radiation__beers_law.html#tutorial11_slice',1,'']]], + ['boundary_20conditions_45',['Periodic Boundary Conditions',['../_radiation_doc.html#RadPeriodic',1,'']]], + ['boundary_20layer_20conductance_20model_46',['Boundary-layer Conductance Model',['../_energy_balance_doc.html#EBblc',1,'']]], + ['boundary_20layer_20conductance_20model_20plug_20in_47',['Using the Boundary Layer Conductance Model Plug-in',['../_b_l_conductance_doc.html#BLUse',1,'']]], + ['boundary_20layer_20conductance_20model_20plugin_20documentation_48',['Boundary-Layer Conductance Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'PlugIns']]], + ['boundary_20layer_20conductance_20model_20to_20be_20used_49',['Setting the Boundary-layer Conductance Model To Be Used',['../_b_l_conductance_doc.html#BLCSet',1,'']]], + ['boundary_20layer_20conductance_20models_50',['Boundary-layer Conductance Models',['../_b_l_conductance_doc.html#BLCModels',1,'']]], + ['boundarylayerconductancemodel_2ecpp_51',['BoundaryLayerConductanceModel.cpp',['../_boundary_layer_conductance_model_8cpp.html',1,'']]], + ['boundarylayerconductancemodel_2eh_52',['BoundaryLayerConductanceModel.h',['../_boundary_layer_conductance_model_8h.html',1,'']]], + ['box_53',['Box',['../classhelios_1_1_box.html',1,'helios::Box'],['../classhelios_1_1_box.html#ab93cb2d8f6948617f67d236d85b3682a',1,'helios::Box::Box()']]], + ['branch_5flength_54',['branch_length',['../struct_walnut_canopy_parameters.html#aabf3f873a3ed1d5850b7697b297ae295',1,'WalnutCanopyParameters']]], + ['branches_55',['Recursive Branches',['../_weber_penn_doc.html#WPTreeR1',1,'']]], + ['branches_5fper_5flevel_56',['branches_per_level',['../struct_white_spruce_canopy_parameters.html#afa54ff0b14e18e615a40ed80386491dc',1,'WhiteSpruceCanopyParameters']]], + ['buckley_20mott_20farquhar_202003_20model_20simplified_20version_20given_20in_20buckley_20turnbull_20and_20adams_202012_57',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['buckley_20turnbull_20and_20adams_202012_58',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['buffer_59',['buffer',['../struct_homogeneous_canopy_parameters.html#a1b6de173fb1f5e71f4d8e7ff9ae99881',1,'HomogeneousCanopyParameters']]], + ['build_20directory_60',['Build Directory',['../_a_p_i.html#BuildDir',1,'']]], + ['build_20functionality_61',['build functionality',['../_dependent_software.html#SetupPCCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupLinuxCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupMacCLion',1,'Setting up basic build functionality']]], + ['build_5fpetiolule_62',['build_petiolule',['../struct_leaf_prototype.html#a97e0456a85a039b8c7c318a0cd57663e',1,'LeafPrototype']]], + ['buildcanopies_63',['buildCanopies',['../class_canopy_generator.html#a7f9ffbcc969d0f50ed12c3de9b3d3b2a',1,'CanopyGenerator']]], + ['buildcanopy_64',['buildCanopy',['../struct_base_canopy_parameters.html#a741a7c822b8f84d8f658cebd54e23eed',1,'BaseCanopyParameters::buildCanopy()'],['../struct_homogeneous_canopy_parameters.html#a45be1a4822a85324643eee2612dda1b5',1,'HomogeneousCanopyParameters::buildCanopy()'],['../struct_spherical_crowns_canopy_parameters.html#ae1670d0366828f06f04936530e94af89',1,'SphericalCrownsCanopyParameters::buildCanopy()'],['../struct_conical_crowns_canopy_parameters.html#a71bba52f726b16ac52e3d44c41cc7b03',1,'ConicalCrownsCanopyParameters::buildCanopy()'],['../struct_base_grape_vine_parameters.html#a8251daae21fcd0cfccffab9f23812c18',1,'BaseGrapeVineParameters::buildCanopy()'],['../struct_v_s_p_grapevine_parameters.html#ae045693dbcb6e4935b292b226b6d98d6',1,'VSPGrapevineParameters::buildCanopy()'],['../struct_split_grapevine_parameters.html#a0e1bad7d21a9d1e2f2be2fc9b1a4a135',1,'SplitGrapevineParameters::buildCanopy()'],['../struct_unilateral_grapevine_parameters.html#a84f41cb676c8614d336ed930457eaee1',1,'UnilateralGrapevineParameters::buildCanopy()'],['../struct_goblet_grapevine_parameters.html#a462a7445a2ceb304db57c507a5a0e9b7',1,'GobletGrapevineParameters::buildCanopy()'],['../struct_white_spruce_canopy_parameters.html#a2ee193c4c845ce721cb30d9fc473beb2',1,'WhiteSpruceCanopyParameters::buildCanopy()'],['../struct_tomato_parameters.html#adc34c3b3dcb59f81fb3d0f21059e8b9a',1,'TomatoParameters::buildCanopy()'],['../struct_strawberry_parameters.html#a9487c5f22f2dc3dce45a853c6c88c553',1,'StrawberryParameters::buildCanopy()'],['../struct_walnut_canopy_parameters.html#ad0cb95df36b8fea5edd3f5c3b801999a',1,'WalnutCanopyParameters::buildCanopy()'],['../struct_sorghum_canopy_parameters.html#ae21bba784a6af20966ba7a87e9c283dc',1,'SorghumCanopyParameters::buildCanopy()'],['../struct_bean_parameters.html#ab9c791e070fc12c5ddb185de38a96097',1,'BeanParameters::buildCanopy()'],['../class_canopy_generator.html#a1c7efa40c83c82ec081a7723c9c9ed98',1,'CanopyGenerator::buildCanopy(const HomogeneousCanopyParameters &params)'],['../class_canopy_generator.html#a19bdddcfb98212395400598df88f04e1',1,'CanopyGenerator::buildCanopy(const SphericalCrownsCanopyParameters &params)'],['../class_canopy_generator.html#ac0a75c0d86d884a5bf5f618e55814ea1',1,'CanopyGenerator::buildCanopy(const ConicalCrownsCanopyParameters &params)'],['../class_canopy_generator.html#a65a8e9f3edd2d73423cab95ec218a524',1,'CanopyGenerator::buildCanopy(const VSPGrapevineParameters &params)'],['../class_canopy_generator.html#aa2a653e079dccfa1ee9849ef1fb83a51',1,'CanopyGenerator::buildCanopy(const SplitGrapevineParameters &params)'],['../class_canopy_generator.html#a50fac34470e512a92504c91128d1a437',1,'CanopyGenerator::buildCanopy(const UnilateralGrapevineParameters &params)'],['../class_canopy_generator.html#a4ac7daae385ca391c756f8c46e7c1b6d',1,'CanopyGenerator::buildCanopy(const GobletGrapevineParameters &params)'],['../class_canopy_generator.html#a589132c50598208a158c21298f11a56c',1,'CanopyGenerator::buildCanopy(const WhiteSpruceCanopyParameters &params)'],['../class_canopy_generator.html#abc8543a9998fa835990580e7e7ded1c0',1,'CanopyGenerator::buildCanopy(const TomatoParameters &params)'],['../class_canopy_generator.html#a75022ad53ae8b8a1f631e6e876ee1bea',1,'CanopyGenerator::buildCanopy(const StrawberryParameters &params)'],['../class_canopy_generator.html#a5a80279ea1b73ab9c493b8f7819aa50d',1,'CanopyGenerator::buildCanopy(const WalnutCanopyParameters &params)'],['../class_canopy_generator.html#a49c39faf194a1c84891001eac5074374',1,'CanopyGenerator::buildCanopy(const SorghumCanopyParameters &params)'],['../class_canopy_generator.html#adee8550880aaf26ebe1d46cdfcf4e06f',1,'CanopyGenerator::buildCanopy(const BeanParameters &params)']]], + ['buildcontextgeometry_65',['buildContextGeometry',['../class_visualizer.html#a4834cddbcc01696bf0b1ef1b0a2cde0c',1,'Visualizer::buildContextGeometry(helios::Context *context_ptr)'],['../class_visualizer.html#ada78ef51373f63718a95841f564a83ef',1,'Visualizer::buildContextGeometry(helios::Context *context_ptr, const std::vector< uint > &UUIDs)']]], + ['buildground_66',['buildGround',['../class_canopy_generator.html#a5933faa26fa34d44a52ba969d939818b',1,'CanopyGenerator::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)'],['../class_canopy_generator.html#ab2069cca4af62c08bdf867a91aacf595',1,'CanopyGenerator::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)']]], + ['buildindividualplants_67',['buildIndividualPlants',['../class_canopy_generator.html#a5a4d5cac8dff6a4b9a3d80dd87501b55',1,'CanopyGenerator::buildIndividualPlants(helios::vec3 position)'],['../class_canopy_generator.html#ad55b3c912c7256b895b55c4dae4c2a5d',1,'CanopyGenerator::buildIndividualPlants()']]], + ['building_20a_20canopy_68',['Building a Canopy',['../_canopy_generator_doc.html#CGenBuildCanopy',1,'']]], + ['building_20a_20project_69',['Opening and building a project',['../_c_lion_i_d_e.html#CLionProject',1,'']]], + ['building_20an_20individual_20plant_70',['Building an Individual Plant',['../_canopy_generator_doc.html#CGenBuildPlant',1,'']]], + ['building_20and_20compiling_20your_20own_20projects_71',['Building and Compiling Your Own Projects',['../_a_p_i.html#BuildCompile',1,'']]], + ['building_20compiling_20and_20running_72',['Building, Compiling, and Running',['../context_selftest.html#build_2',1,'']]], + ['building_20the_20ground_73',['Building the Ground',['../_canopy_generator_doc.html#CGenBuildGround',1,'']]], + ['buildplant_74',['buildPlant',['../struct_base_canopy_parameters.html#afcbe470fe8e3e7106f0da0a93e540cce',1,'BaseCanopyParameters::buildPlant()'],['../struct_homogeneous_canopy_parameters.html#a4204162f4c57227e9328b8fcff59cb4d',1,'HomogeneousCanopyParameters::buildPlant()'],['../struct_spherical_crowns_canopy_parameters.html#af127df26f4a93e6422e23720f5b0a136',1,'SphericalCrownsCanopyParameters::buildPlant()'],['../struct_conical_crowns_canopy_parameters.html#adabbdff81275869121f3308bf31aa4cc',1,'ConicalCrownsCanopyParameters::buildPlant()'],['../struct_base_grape_vine_parameters.html#a7577cb650adee17f4343f30af8e3179d',1,'BaseGrapeVineParameters::buildPlant()'],['../struct_v_s_p_grapevine_parameters.html#a8c7d85f23ca257d820f7c28f6d6d4deb',1,'VSPGrapevineParameters::buildPlant()'],['../struct_split_grapevine_parameters.html#a6116fc97e1f19bcdb9b0c49714413c1c',1,'SplitGrapevineParameters::buildPlant()'],['../struct_unilateral_grapevine_parameters.html#a4141eeadb3aa3269b739a08965ffa676',1,'UnilateralGrapevineParameters::buildPlant()'],['../struct_goblet_grapevine_parameters.html#a410a1bc232e9c55829ef493096e387f3',1,'GobletGrapevineParameters::buildPlant()'],['../struct_white_spruce_canopy_parameters.html#ab5cbed92a2f2de16b9c5ff1b559a2f55',1,'WhiteSpruceCanopyParameters::buildPlant()'],['../struct_tomato_parameters.html#a0915f161732f561e479d9eea9a375254',1,'TomatoParameters::buildPlant()'],['../struct_strawberry_parameters.html#a739703fbc934574475585466357292a3',1,'StrawberryParameters::buildPlant()'],['../struct_walnut_canopy_parameters.html#a3f356a99983d3540171519f42e270808',1,'WalnutCanopyParameters::buildPlant()'],['../struct_sorghum_canopy_parameters.html#a1139c684da4cde5c7b34500da0e87bb5',1,'SorghumCanopyParameters::buildPlant()'],['../struct_bean_parameters.html#a8be910632031fbec98a6185a0aab6efb',1,'BeanParameters::buildPlant()']]], + ['buildplantcanopyfromlibrary_75',['buildPlantCanopyFromLibrary',['../class_plant_architecture.html#a9cc3b3b4f6e37fa416c139f6bf1618bd',1,'PlantArchitecture']]], + ['buildplantinstancefromlibrary_76',['buildPlantInstanceFromLibrary',['../class_plant_architecture.html#ab98a62363a5e4553c5052a23e39711ba',1,'PlantArchitecture']]], + ['buildtree_77',['buildTree',['../class_weber_penn_tree.html#a49f706c54cbf91ea5c40fb247d4e3559',1,'WeberPennTree::buildTree(const char *treename, helios::vec3 origin)'],['../class_weber_penn_tree.html#af1dc9499df0c1cc26f3d0c5782da10bd',1,'WeberPennTree::buildTree(const char *treename, helios::vec3 origin, float scale)']]], + ['bwbcoefficients_78',['BWBcoefficients',['../struct_b_w_bcoefficients.html',1,'']]], + ['by_20image_20transparency_20channel_79',['Masking Primitives by Image Transparency Channel',['../_a_p_i.html#TextureMask',1,'']]], + ['by_20pseudocolor_20map_80',['Coloring by pseudocolor map',['../_visualizer_doc.html#ColoringPseudo',1,'']]], + ['by_20r_20g_20b_20code_81',['Coloring by r-g-b code',['../_visualizer_doc.html#ColoringRGB',1,'']]], + ['by_20texture_20map_82',['Coloring Primitives by Texture Map',['../_a_p_i.html#TextureColor',1,'']]], + ['by_20texture_20map_83',['Coloring by texture map',['../_visualizer_doc.html#ColoringTexture',1,'']]], + ['by_20the_20canopy_20on_20a_20ground_20area_20basis_84',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]] ]; diff --git a/doc/html/search/all_b.js b/doc/html/search/all_b.js index ae0a1fdb6..c8fd4774d 100644 --- a/doc/html/search/all_b.js +++ b/doc/html/search/all_b.js @@ -1,54 +1,213 @@ var searchData= [ - ['label_0',['label',['../struct_radiation_band.html#a2929fde6f333f2aeba923886fc84887f',1,'RadiationBand']]], - ['lasthitfilter_1',['lastHitFilter',['../class_li_d_a_rcloud.html#ab812d48fd5d81a8cc382bf0d1214496d',1,'LiDARcloud']]], - ['lateral_5fcurvature_2',['lateral_curvature',['../struct_leaf_prototype.html#a6ccef984c87ae4203d7b620d3ac4e177',1,'LeafPrototype']]], - ['latitude_5fdeg_3',['latitude_deg',['../structhelios_1_1_location.html#a3924339ab5a0e35c47519792c335ff22',1,'helios::Location']]], - ['leaf_5fangle_5fdistribution_4',['leaf_angle_distribution',['../struct_conical_crowns_canopy_parameters.html#a071b3d2e2ebaa9921702b483682fb6d6',1,'ConicalCrownsCanopyParameters::leaf_angle_distribution()'],['../struct_spherical_crowns_canopy_parameters.html#ab11d57364434c44388b83a7a04dc9bd0',1,'SphericalCrownsCanopyParameters::leaf_angle_distribution()'],['../struct_homogeneous_canopy_parameters.html#a9d22fee5250b0fc616acdd91e5cb34b2',1,'HomogeneousCanopyParameters::leaf_angle_distribution()']]], - ['leaf_5farea_5fdensity_5',['leaf_area_density',['../struct_conical_crowns_canopy_parameters.html#ac15b062cb9d964163b49f7590e3804a8',1,'ConicalCrownsCanopyParameters::leaf_area_density()'],['../struct_spherical_crowns_canopy_parameters.html#ab625b07dbc7f73b11d4af2932e96158d',1,'SphericalCrownsCanopyParameters::leaf_area_density()']]], - ['leaf_5farea_5findex_6',['leaf_area_index',['../struct_homogeneous_canopy_parameters.html#ae8880f6cbbdd6c69caee3cedba4ef542',1,'HomogeneousCanopyParameters']]], - ['leaf_5fbuckle_5fangle_7',['leaf_buckle_angle',['../struct_leaf_prototype.html#ab24b8cb372c52a7cd2c138d415fc9622',1,'LeafPrototype']]], - ['leaf_5fbuckle_5flength_8',['leaf_buckle_length',['../struct_leaf_prototype.html#ab628d133df921861f8db3d36f4fc6496',1,'LeafPrototype']]], - ['leaf_5fcolor_9',['leaf_color',['../struct_homogeneous_canopy_parameters.html#a3fc69732f3f0790dc858fe4ed8abf3fd',1,'HomogeneousCanopyParameters::leaf_color()'],['../struct_spherical_crowns_canopy_parameters.html#a7d08f35ed3ce045b74bd4479ca4cb5b4',1,'SphericalCrownsCanopyParameters::leaf_color()'],['../struct_conical_crowns_canopy_parameters.html#a3ace8715f3b5e0b91272e9a718642ee4',1,'ConicalCrownsCanopyParameters::leaf_color()']]], - ['leaf_5flength_10',['leaf_length',['../struct_tomato_parameters.html#a0fc2acabb718f35337f71046fb540f83',1,'TomatoParameters::leaf_length()'],['../struct_strawberry_parameters.html#afcfe4fd8f2cdba4df2d031e048ff18cb',1,'StrawberryParameters::leaf_length()'],['../struct_walnut_canopy_parameters.html#a7b59b3a39200e3cd904806700ebcef03',1,'WalnutCanopyParameters::leaf_length()'],['../struct_bean_parameters.html#a1c21ac308fa92de4fa722701e714b473',1,'BeanParameters::leaf_length()']]], - ['leaf_5foffset_11',['leaf_offset',['../struct_leaf_prototype.html#aa8fc5dd4868a81ef7c8d34d4aa255daf',1,'LeafPrototype']]], - ['leaf_5fsize_12',['leaf_size',['../struct_homogeneous_canopy_parameters.html#a2edb9f81abc15976ca0d338677105b06',1,'HomogeneousCanopyParameters::leaf_size()'],['../struct_spherical_crowns_canopy_parameters.html#a48c2ab4110bc38b4f412250d8e3e8051',1,'SphericalCrownsCanopyParameters::leaf_size()'],['../struct_conical_crowns_canopy_parameters.html#a914f22b9bd8d046d5c2d661ddacbfb69',1,'ConicalCrownsCanopyParameters::leaf_size()']]], - ['leaf_5fspacing_5ffraction_13',['leaf_spacing_fraction',['../struct_base_grape_vine_parameters.html#a55cc37c53fdd62e586f836129bde9a45',1,'BaseGrapeVineParameters']]], - ['leaf_5fspacing_5ffraction_5fspread_14',['leaf_spacing_fraction_spread',['../struct_base_grape_vine_parameters.html#a4406907ab0df63e9aa3f11416b79dd17',1,'BaseGrapeVineParameters']]], - ['leaf_5fsubdivisions_15',['leaf_subdivisions',['../struct_homogeneous_canopy_parameters.html#a7e385ca3b257c8012d8336c03a617b31',1,'HomogeneousCanopyParameters::leaf_subdivisions()'],['../struct_spherical_crowns_canopy_parameters.html#aa7ddee04ae15e0aa0814702a0ef4a034',1,'SphericalCrownsCanopyParameters::leaf_subdivisions()'],['../struct_conical_crowns_canopy_parameters.html#a1871e049c234ab2237ccf1fa717d632b',1,'ConicalCrownsCanopyParameters::leaf_subdivisions()'],['../struct_base_grape_vine_parameters.html#a93f3e632f8d7dd45f17559ca5a131091',1,'BaseGrapeVineParameters::leaf_subdivisions()'],['../struct_tomato_parameters.html#a2a3d8f1b74a1800db22926eaf2ec9ea8',1,'TomatoParameters::leaf_subdivisions()'],['../struct_strawberry_parameters.html#a863f21593c3e36c1a43730e8a1594e9d',1,'StrawberryParameters::leaf_subdivisions()'],['../struct_walnut_canopy_parameters.html#a4709a2450a721bd0cd148917c866663f',1,'WalnutCanopyParameters::leaf_subdivisions()'],['../struct_bean_parameters.html#a3e033c07426c9626a9d465c1113b3667',1,'BeanParameters::leaf_subdivisions()']]], - ['leaf_5ftexture_5ffile_16',['leaf_texture_file',['../struct_strawberry_parameters.html#ad19120d86ed515a1bfe29be284c0fbd1',1,'StrawberryParameters::leaf_texture_file()'],['../struct_conical_crowns_canopy_parameters.html#a3d54bb0c814adced34e4e1f3b26bf41f',1,'ConicalCrownsCanopyParameters::leaf_texture_file()'],['../struct_base_grape_vine_parameters.html#a436f25d4bd25818fe97592b5feadce80',1,'BaseGrapeVineParameters::leaf_texture_file()'],['../struct_tomato_parameters.html#ab800737ab2431324662b39f46d6e8b06',1,'TomatoParameters::leaf_texture_file()'],['../struct_walnut_canopy_parameters.html#a7927fbdc60d70addb5762ef2caf4eccf',1,'WalnutCanopyParameters::leaf_texture_file()'],['../struct_bean_parameters.html#ab07f50052e6f91914239d6bbe4e3608a',1,'BeanParameters::leaf_texture_file()'],['../struct_leaf_prototype.html#a418960ee0b7f6c6693d09cd5f0d2ba59',1,'LeafPrototype::leaf_texture_file()'],['../struct_homogeneous_canopy_parameters.html#ada090628a7e4d792005768eef445658d',1,'HomogeneousCanopyParameters::leaf_texture_file()'],['../struct_spherical_crowns_canopy_parameters.html#a6b01f45dcaefadaf8bb4ebd67b92197b',1,'SphericalCrownsCanopyParameters::leaf_texture_file()']]], - ['leaf_5fwidth_17',['leaf_width',['../struct_base_grape_vine_parameters.html#a75f9ad83c0f7d963e9f528fcd3ba23b9',1,'BaseGrapeVineParameters']]], - ['leaf_5fwidth_5fspread_18',['leaf_width_spread',['../struct_base_grape_vine_parameters.html#aca739e4edc970f7ef36ac4913279b656',1,'BaseGrapeVineParameters']]], - ['leaflet_5flength_19',['leaflet_length',['../struct_bean_parameters.html#a0ba15d0731c1116186120d1b365438e8',1,'BeanParameters']]], - ['leafoptics_20',['LeafOptics',['../class_leaf_optics.html',1,'LeafOptics'],['../class_leaf_optics.html#a8f286671c723166c8aae098d0efd9b04',1,'LeafOptics::LeafOptics()']]], - ['leafoptics_2ecpp_21',['LeafOptics.cpp',['../_leaf_optics_8cpp.html',1,'']]], - ['leafoptics_2eh_22',['LeafOptics.h',['../_leaf_optics_8h.html',1,'']]], - ['leafopticsproperties_23',['LeafOpticsProperties',['../struct_leaf_optics_properties.html',1,'']]], - ['leafprototype_24',['LeafPrototype',['../struct_leaf_prototype.html',1,'LeafPrototype'],['../struct_leaf_prototype.html#af29d0b590d0c675ff43134797d4ade6b',1,'LeafPrototype::LeafPrototype(std::minstd_rand0 *generator)'],['../struct_leaf_prototype.html#a1ad2dbbc6bf4c55f598f7060d8d436cd',1,'LeafPrototype::LeafPrototype()']]], - ['leafreconstructionalphamask_25',['leafReconstructionAlphaMask',['../class_li_d_a_rcloud.html#aba102c6c5036ffb99b105fb2b4850935',1,'LiDARcloud::leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, const char *mask_file)'],['../class_li_d_a_rcloud.html#a0c80f96188fb83f444e7e08cbf888690',1,'LiDARcloud::leafReconstructionAlphaMask(float minimum_leaf_group_area, float maximum_leaf_group_area, float leaf_aspect_ratio, float leaf_length_constant, const char *mask_file)']]], - ['lens_5fdiameter_26',['lens_diameter',['../struct_camera_properties.html#acf2d9d32a978b027658045c8068c7d1a',1,'CameraProperties']]], - ['level_5fspacing_27',['level_spacing',['../struct_white_spruce_canopy_parameters.html#a4b00e11bfdda7982ce18779b40eadd6d',1,'WhiteSpruceCanopyParameters']]], - ['lidar_2ecpp_28',['LiDAR.cpp',['../_li_d_a_r_8cpp.html',1,'']]], - ['lidar_2ecu_29',['LiDAR.cu',['../_li_d_a_r_8cu.html',1,'']]], - ['lidar_2eh_30',['LiDAR.h',['../_li_d_a_r_8h.html',1,'']]], - ['lidarcloud_31',['LiDARcloud',['../class_li_d_a_rcloud.html',1,'LiDARcloud'],['../class_li_d_a_rcloud.html#a1c946f80a3431e82e48fc54c611dca2c',1,'LiDARcloud::LiDARcloud()']]], - ['lighting_5fnone_32',['LIGHTING_NONE',['../class_visualizer.html#a580a78fe3e25c423e2d13aebc1b54573ac864e3d3a92a93d2d070faee3a6b4789',1,'Visualizer']]], - ['lighting_5fphong_33',['LIGHTING_PHONG',['../class_visualizer.html#a580a78fe3e25c423e2d13aebc1b54573adce805e52c5b47950ecc3cfdddd2160c',1,'Visualizer']]], - ['lighting_5fphong_5fshadowed_34',['LIGHTING_PHONG_SHADOWED',['../class_visualizer.html#a580a78fe3e25c423e2d13aebc1b54573afe63a1dd4fcd9bbf57ad0dc2c168c864',1,'Visualizer']]], - ['lightingmodel_35',['LightingModel',['../class_visualizer.html#a580a78fe3e25c423e2d13aebc1b54573',1,'Visualizer']]], - ['lineintersection_36',['lineIntersection',['../group__functions.html#ga3fd112746616c33aae6ac56d9863c9a6',1,'helios']]], - ['linesintersection_37',['linesIntersection',['../class_voxel_intersection.html#a69cda90cd28f478ae007a88615994df2',1,'VoxelIntersection']]], - ['listglobaldata_38',['listGlobalData',['../classhelios_1_1_context.html#adf9a2febe48629536b06cdaa9903dbe3',1,'helios::Context']]], - ['listobjectdata_39',['listObjectData',['../classhelios_1_1_compound_object.html#a4750278bd9c519d57c3f27891dcf666d',1,'helios::CompoundObject::listObjectData()'],['../classhelios_1_1_context.html#adc44dfce7e5dc7deaa42139795eee942',1,'helios::Context::listObjectData(uint ObjID) const']]], - ['listprimitivedata_40',['listPrimitiveData',['../classhelios_1_1_context.html#a7cb64e054e6dacbab27f31cd73852cc3',1,'helios::Context']]], - ['listtimeseriesvariables_41',['listTimeseriesVariables',['../classhelios_1_1_context.html#a0850fc1a35fd563e4008a4a152105307',1,'helios::Context']]], - ['loadobj_42',['loadOBJ',['../classhelios_1_1_context.html#a8657240a0b2926e8c73b083f0fdc339d',1,'helios::Context::loadOBJ(const char *filename, bool silent=false)'],['../classhelios_1_1_context.html#a90fd1a67dd60550207b1f29bfcd385ca',1,'helios::Context::loadOBJ(const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, bool silent=false)'],['../classhelios_1_1_context.html#ae3014d59a9e1668cb84725a30fd8ef68',1,'helios::Context::loadOBJ(const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const char *upaxis, bool silent=false)'],['../classhelios_1_1_context.html#a7455810db826dfed35a36eb452e817a9',1,'helios::Context::loadOBJ(const char *filename, const vec3 &origin, const helios::vec3 &scale, const SphericalCoord &rotation, const RGBcolor &default_color, const char *upaxis, bool silent=false)']]], - ['loadplantmodelfromlibrary_43',['loadPlantModelFromLibrary',['../class_plant_architecture.html#adc41de628e65a52f560b4d0685c64c3a',1,'PlantArchitecture']]], - ['loadply_44',['loadPLY',['../classhelios_1_1_context.html#a116724929091eabd6324047ed66cef85',1,'helios::Context::loadPLY(const char *filename, bool silent=false)'],['../classhelios_1_1_context.html#a99cda26e82d56d9241b10346ce097010',1,'helios::Context::loadPLY(const char *filename, const vec3 &origin, float height, const std::string &upaxis="YUP", bool silent=false)'],['../classhelios_1_1_context.html#a2748413487ea587e30b9d7be3ef61350',1,'helios::Context::loadPLY(const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const std::string &upaxis="YUP", bool silent=false)'],['../classhelios_1_1_context.html#a8f1777b7f07ddfedaafac1c6d781c1d0',1,'helios::Context::loadPLY(const char *filename, const vec3 &origin, float height, const RGBcolor &default_color, const std::string &upaxis="YUP", bool silent=false)'],['../classhelios_1_1_context.html#a7965b2ac5e884fbbf067a2355aca497e',1,'helios::Context::loadPLY(const char *filename, const vec3 &origin, float height, const SphericalCoord &rotation, const RGBcolor &default_color, const std::string &upaxis="YUP", bool silent=false)']]], - ['loadtabulartimeseriesdata_45',['loadTabularTimeseriesData',['../classhelios_1_1_context.html#a1dc9a0f79be2477c4873755586744e51',1,'helios::Context']]], - ['loadxml_46',['loadXML',['../classhelios_1_1_context.html#a129516a8fce035705a541e7b877eba2f',1,'helios::Context::loadXML()'],['../class_aerial_li_d_a_rcloud.html#aa87abfc0d5538d3d8fe28458c7093c2c',1,'AerialLiDARcloud::loadXML()'],['../class_canopy_generator.html#aa481909b393a67953f2366217cf98843',1,'CanopyGenerator::loadXML()'],['../class_li_d_a_rcloud.html#a6bd7e1839d1a6ecb738233b20b93f1f7',1,'LiDARcloud::loadXML(const char *filename)'],['../class_li_d_a_rcloud.html#ac966b0aae37889c288277b950b2fd30a',1,'LiDARcloud::loadXML(const char *filename, bool load_grid_only)'],['../class_weber_penn_tree.html#a3cc9a0c0b3039e5fa44fc77a117a72dc',1,'WeberPennTree::loadXML()']]], - ['loadxmllabeldata_47',['loadXMLlabeldata',['../struct_camera_calibration.html#a0e689ece69868c47a8d6f392dac06d19',1,'CameraCalibration']]], - ['location_48',['Location',['../structhelios_1_1_location.html',1,'helios::Location'],['../structhelios_1_1_location.html#a15dfbb1d375999d28e857fca72e12b74',1,'helios::Location::Location()'],['../structhelios_1_1_location.html#aa91915971c5c6f75a99540b5517bea2b',1,'helios::Location::Location(float latitude_deg, float longitude_deg, float UTC_offset)']]], - ['longitude_5fdeg_49',['longitude_deg',['../structhelios_1_1_location.html#a29c4f6f1b7453821766f833673eeaff3',1,'helios::Location']]], - ['longitudinal_5fcurvature_50',['longitudinal_curvature',['../struct_leaf_prototype.html#af14f092796a2c241521be4f50cad1552',1,'LeafPrototype']]] + ['c_20compiler_20tools_0',['Install Microsoft Visual Studio C++ compiler tools',['../_dependent_software.html#SetupPCMSVC',1,'']]], + ['c_20prerequisites_1',['C++ Prerequisites',['../_overview.html#Prereqs',1,'']]], + ['c_20program_2',['C++ Program',['../context_selftest.html#program_1',1,'']]], + ['c_20standard_20library_20include_20files_3',['C++ Standard Library Include Files',['../_a_p_i.html#GlobalInclude',1,'']]], + ['caemmerer_20berry_20model_20description_4',['Farquhar, von Caemmerer, Berry Model Description',['../_photosynthesis_doc.html#FarquharDescription',1,'']]], + ['calculate_20g_20theta_5',['4a. Calculate G(theta)',['../radiation__beers_law.html#tutorial11_G',1,'']]], + ['calculate_20par_20interception_6',['3. Run the model and calculate PAR interception',['../radiation_basics.html#Tutorial10_run',1,'']]], + ['calculate_20radiation_20flux_20absorbed_20by_20the_20canopy_20on_20a_20ground_20area_20basis_7',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['calculate_20the_20sunlit_20leaf_20area_20fraction_20from_20the_20simulation_8',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['calculate_20the_20theoretical_20absorbed_20par_20flux_20using_20beer_20s_20law_9',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['calculate_20the_20theoretical_20sunlit_20area_20fraction_10',['4e. Calculate the theoretical sunlit area fraction',['../radiation__beers_law.html#tutorial11_fsunBeer',1,'']]], + ['calculategtheta_11',['calculateGtheta',['../class_radiation_model.html#a12d9870f22e5f3719baa7fde8e07fb0a',1,'RadiationModel']]], + ['calculatehitgridcell_12',['calculateHitGridCell',['../class_aerial_li_d_a_rcloud.html#abe3e99a406251c388a3d934a7519ddb2',1,'AerialLiDARcloud']]], + ['calculatehitgridcellgpu_13',['calculateHitGridCellGPU',['../class_li_d_a_rcloud.html#ab16514fff6766e89b91409077daf35fc',1,'LiDARcloud']]], + ['calculateleafareagpu_14',['calculateLeafAreaGPU',['../class_aerial_li_d_a_rcloud.html#a5dd671b27dbc6f27e19c66a5ee15934d',1,'AerialLiDARcloud::calculateLeafAreaGPU(const float Gtheta)'],['../class_aerial_li_d_a_rcloud.html#a2b334f5eb21554cfab456808e669322b',1,'AerialLiDARcloud::calculateLeafAreaGPU(const float Gtheta, const int minVoxelHits)'],['../class_li_d_a_rcloud.html#aff9aeedaa500516d1c227e5161fb599a',1,'LiDARcloud::calculateLeafAreaGPU()'],['../class_li_d_a_rcloud.html#a865b46e46b3f20d879a0122b2ec21b7c',1,'LiDARcloud::calculateLeafAreaGPU(int min_voxel_hits)']]], + ['calculateleafareagpu_5fequal_5fweighting_15',['calculateLeafAreaGPU_equal_weighting',['../class_li_d_a_rcloud.html#a7b23ba7fb6a900ff86d7957fcaa89f83',1,'LiDARcloud::calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic)'],['../class_li_d_a_rcloud.html#a5751d6482bc6747b3b0e8d4566b46ca2',1,'LiDARcloud::calculateLeafAreaGPU_equal_weighting(bool beamoutput, bool fillAnalytic, std::vector< float > constant_G)']]], + ['calculateleafareagpu_5fsynthetic_16',['calculateLeafAreaGPU_synthetic',['../class_li_d_a_rcloud.html#ac6824b871a54f9a25c0c6d1725cb4ee0',1,'LiDARcloud']]], + ['calculateleafareagpu_5ftesting_17',['calculateLeafAreaGPU_testing',['../class_li_d_a_rcloud.html#aa6640bd0d26f6cd8e5b8225fe14eaa4d',1,'LiDARcloud']]], + ['calculateprimitivedataareaweightedmean_18',['calculatePrimitiveDataAreaWeightedMean',['../classhelios_1_1_context.html#acbc8e2f6b09248ef0e1b4039ae49dc3f',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, float &awt_mean) const'],['../classhelios_1_1_context.html#a57646963eb21eed16ced61fad28d176d',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, double &awt_mean) const'],['../classhelios_1_1_context.html#a1aded7761f3571d8b162521308b6982a',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &awt_mean) const'],['../classhelios_1_1_context.html#af0ac56f7ead05e93c49ca64364e1de94',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &awt_mean) const'],['../classhelios_1_1_context.html#a8ecb78b9926d1a41b0d05ddc63de89cf',1,'helios::Context::calculatePrimitiveDataAreaWeightedMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &awt_mean) const']]], + ['calculateprimitivedataareaweightedsum_19',['calculatePrimitiveDataAreaWeightedSum',['../classhelios_1_1_context.html#ac3f0cb99c782cc18b34c1565d83ea754',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, float &awt_sum) const'],['../classhelios_1_1_context.html#a074b0b3ba7069e416206ab3c84138b93',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, double &sum) const'],['../classhelios_1_1_context.html#a715cddf9567a06b1f6a61fa10f08c145',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &sum) const'],['../classhelios_1_1_context.html#af7b74178a6b1c7baa3efd06656a287d8',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &sum) const'],['../classhelios_1_1_context.html#a8c269c7aafedc057c4cdbbfbb0ae050c',1,'helios::Context::calculatePrimitiveDataAreaWeightedSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &sum) const']]], + ['calculateprimitivedatamean_20',['calculatePrimitiveDataMean',['../classhelios_1_1_context.html#a915ef6fe6a947427508e75a584150290',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, float &mean) const'],['../classhelios_1_1_context.html#a7ae0ab4e81a6359e4e5c290211869028',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, double &mean) const'],['../classhelios_1_1_context.html#acea0629aca8ecead44f6801ed8760e98',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &mean) const'],['../classhelios_1_1_context.html#a019706d872616a6ee74de1c763055b58',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &mean) const'],['../classhelios_1_1_context.html#a6ccd7935e4e453ae32bbd8ba704dbdd6',1,'helios::Context::calculatePrimitiveDataMean(const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &mean) const']]], + ['calculateprimitivedatasum_21',['calculatePrimitiveDataSum',['../classhelios_1_1_context.html#a4d5c413fd13de34ccbf63db430b84747',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, float &sum) const'],['../classhelios_1_1_context.html#a8da7a17942e11fa41938f022f9827cb8',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, double &sum) const'],['../classhelios_1_1_context.html#a2166638f224b3d8c78c92699d1d6be06',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec2 &sum) const'],['../classhelios_1_1_context.html#a0525d3480cc5136811cb779b81915db1',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec3 &sum) const'],['../classhelios_1_1_context.html#a275251f326d7b04887307991fa7ec122',1,'helios::Context::calculatePrimitiveDataSum(const std::vector< uint > &UUIDs, const std::string &label, helios::vec4 &sum) const']]], + ['calculateprimitivevoxelintersection_22',['calculatePrimitiveVoxelIntersection',['../class_voxel_intersection.html#a11089d71d85cd247bd281edd664052fb',1,'VoxelIntersection::calculatePrimitiveVoxelIntersection(void)'],['../class_voxel_intersection.html#ab8514a6e5868e77b6074bcd15bda831f',1,'VoxelIntersection::calculatePrimitiveVoxelIntersection(std::vector< uint > UUIDs)']]], + ['calculatesyntheticgtheta_23',['calculateSyntheticGtheta',['../class_li_d_a_rcloud.html#a94fe14aa32343dc25e366fe2ad7dfdfd',1,'LiDARcloud']]], + ['calculatesyntheticleafarea_24',['calculateSyntheticLeafArea',['../class_aerial_li_d_a_rcloud.html#ab5fec2c248d5889adf521cac3bb107b3',1,'AerialLiDARcloud::calculateSyntheticLeafArea()'],['../class_li_d_a_rcloud.html#a22f9c93700be5e5a808b97ecca6752fe',1,'LiDARcloud::calculateSyntheticLeafArea()']]], + ['calculatetrianglearea_25',['calculateTriangleArea',['../group__functions.html#ga76dc2dce64e911fc0c5d2bc3ff4f6fe0',1,'helios']]], + ['calculating_20fluxes_26',['Area Basis for Calculating Fluxes',['../_radiation_doc.html#RadTwoSided',1,'']]], + ['calculating_20leaf_20area_20for_20each_20grid_20cell_27',['Calculating leaf area for each grid cell',['../_li_d_a_r_doc.html#LiDARleafarea',1,'']]], + ['calendar2julian_28',['Calendar2Julian',['../group__vectors.html#gada57ce3d59ce227448a97e8631a4430e',1,'helios']]], + ['calendarday_29',['CalendarDay',['../global_8h.html#a35cf3fa6f900627c962472dd550e3d39',1,'helios']]], + ['calibratecamera_30',['calibrateCamera',['../class_radiation_model.html#ab04cda35cd54937070cb63344630ada8',1,'RadiationModel::calibrateCamera(const std::string &orginalcameralabel, const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameraresponselabels, const std::vector< std::string > &bandlabels, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)'],['../class_radiation_model.html#a1da3d8b0b1654693cb1261e909612997',1,'RadiationModel::calibrateCamera(const std::string &originalcameralabel, const float scalefactor, const std::vector< std::vector< float > > &truevalues, const std::string &calibratedmark)']]], + ['calibrateturbidityfromtimeseries_31',['calibrateTurbidityFromTimeseries',['../class_solar_position.html#aeefa73ede0d1797f94fd4ca2739f7f3e',1,'SolarPosition']]], + ['calibrating_20the_20turbidity_20using_20weather_20station_20radiometer_20data_32',['Calibrating the turbidity using weather station (radiometer) data',['../_solar_position_doc.html#SolarFluxTurb',1,'']]], + ['calibration_33',['Radiation Camera Color Calibration',['../_radiation_doc.html#RadCamCalibColor',1,'']]], + ['calibration_20procedure_34',['Empirical Model Calibration Procedure',['../_photosynthesis_doc.html#PhotoCalib',1,'']]], + ['camera_35',['Adding a Radiation Camera',['../_radiation_doc.html#RadCamAdd',1,'']]], + ['camera_20color_20calibration_36',['Radiation Camera Color Calibration',['../_radiation_doc.html#RadCamCalibColor',1,'']]], + ['camera_20images_20to_20file_37',['Writing Camera Images to File',['../_radiation_doc.html#RadCamOut',1,'']]], + ['camera_5fresolution_38',['camera_resolution',['../struct_camera_properties.html#a2806b640deeab5fbcd9dda8ea240f345',1,'CameraProperties']]], + ['cameracalibration_39',['CameraCalibration',['../struct_camera_calibration.html',1,'']]], + ['cameracalibration_2ecpp_40',['CameraCalibration.cpp',['../_camera_calibration_8cpp.html',1,'']]], + ['cameracalibration_2eh_41',['CameraCalibration.h',['../_camera_calibration_8h.html',1,'']]], + ['cameraproperties_42',['CameraProperties',['../struct_camera_properties.html',1,'']]], + ['cameras_43',['Radiation Cameras',['../_radiation_doc.html#RadCam',1,'']]], + ['canopy_44',['Canopy',['../_canopy_generator_doc.html#CGenBuildCanopy',1,'Building a Canopy'],['../_canopy_generator_doc.html#CGenSorghum',1,'sorghum Canopy'],['../_canopy_generator_doc.html#CGenHomogeneous',1,'Spatially Homogeneous Canopy'],['../_canopy_generator_doc.html#CGenStrawberry',1,'Strawberry Canopy'],['../_canopy_generator_doc.html#CGenWalnut',1,'Walnut Canopy']]], + ['canopy_45',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['canopy_20generator_20plugin_20documentation_46',['Canopy Generator Plugin Documentation',['../_canopy_generator_doc.html',1,'PlugIns']]], + ['canopy_20of_20conical_20crowns_47',['Canopy of Conical Crowns',['../_canopy_generator_doc.html#CGenCone',1,'']]], + ['canopy_20of_20spherical_20crowns_48',['Canopy of Spherical Crowns',['../_canopy_generator_doc.html#CGenSphere',1,'']]], + ['canopy_20on_20a_20ground_20area_20basis_49',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['canopy_20with_20a_20goblet_20trellis_50',['Grapevine Canopy with a Goblet Trellis',['../_canopy_generator_doc.html#CGenGoblet',1,'']]], + ['canopy_20with_20a_20split_20trellis_51',['Grapevine Canopy with a Split Trellis',['../_canopy_generator_doc.html#CGenSplit',1,'']]], + ['canopy_20with_20a_20unilateral_20vsp_20trellis_52',['Grapevine Canopy with a Unilateral VSP Trellis',['../_canopy_generator_doc.html#CGenUnilateral',1,'']]], + ['canopy_20with_20vsp_20trellis_53',['Grapevine Canopy with VSP Trellis',['../_canopy_generator_doc.html#CGenVSP',1,'']]], + ['canopy_5fconfiguration_54',['canopy_configuration',['../struct_spherical_crowns_canopy_parameters.html#acb6042ba8355cae63a24a1b98ca3aa58',1,'SphericalCrownsCanopyParameters::canopy_configuration'],['../struct_conical_crowns_canopy_parameters.html#a72eaaa43483eb64d79780418e726f749',1,'ConicalCrownsCanopyParameters::canopy_configuration'],['../struct_white_spruce_canopy_parameters.html#aff224456a6befb2203c9f225ad6e4fe7',1,'WhiteSpruceCanopyParameters::canopy_configuration']]], + ['canopy_5fextent_55',['canopy_extent',['../struct_homogeneous_canopy_parameters.html#a68c488e6bd2f209af3a46ce8aca4bf60',1,'HomogeneousCanopyParameters']]], + ['canopy_5fheight_56',['canopy_height',['../struct_homogeneous_canopy_parameters.html#a80df27cc13e2b7f113d52e405ddb2737',1,'HomogeneousCanopyParameters']]], + ['canopy_5forigin_57',['canopy_origin',['../struct_base_canopy_parameters.html#a0b5eb48ff33aaab57a3ea0616bc8d5eb',1,'BaseCanopyParameters']]], + ['canopy_5frotation_58',['canopy_rotation',['../struct_base_canopy_parameters.html#afb6abc2b3cf2cf3283261915be329117',1,'BaseCanopyParameters']]], + ['canopy_5frotation_5fspread_59',['canopy_rotation_spread',['../struct_base_grape_vine_parameters.html#a7a4245a8a58c9342f83544f4c4fbe84c',1,'BaseGrapeVineParameters']]], + ['canopygenerator_60',['CanopyGenerator',['../class_canopy_generator.html',1,'CanopyGenerator'],['../class_canopy_generator.html#ac146e7630eb8d80fb91a3795d7b9f9f4',1,'CanopyGenerator::CanopyGenerator()']]], + ['canopygenerator_20class_20constructor_61',['CanopyGenerator Class Constructor',['../_canopy_generator_doc.html#CGenConstructor',1,'']]], + ['canopygenerator_2ecpp_62',['CanopyGenerator.cpp',['../_canopy_generator_8cpp.html',1,'']]], + ['canopygenerator_2eh_63',['CanopyGenerator.h',['../_canopy_generator_8h.html',1,'']]], + ['carbohydratemodel_2ecpp_64',['CarbohydrateModel.cpp',['../_carbohydrate_model_8cpp.html',1,'']]], + ['cart2sphere_65',['cart2sphere',['../group__functions.html#ga32a34b00e0a28f4b35e501b8b34cfccd',1,'helios']]], + ['cell_66',['Calculating leaf area for each grid cell',['../_li_d_a_r_doc.html#LiDARleafarea',1,'']]], + ['cells_67',['cells',['../_aerial_li_d_a_r_doc.html#AerialLiDARgrid',1,'Establishing grid cells'],['../_li_d_a_r_doc.html#LiDARgrid',1,'Establishing grid cells']]], + ['center_68',['center',['../struct_aerial_scan_metadata.html#a8aaa9b231aca939a27d438bdf203699c',1,'AerialScanMetadata']]], + ['channel_69',['Masking Primitives by Image Transparency Channel',['../_a_p_i.html#TextureMask',1,'']]], + ['choosing_20the_20image_70',['1. Choosing the image',['../_making_masks.html#One',1,'']]], + ['choosing_20the_20right_20cuda_20and_20optix_20version_71',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['clamp_72',['clamp',['../group__functions.html#gafc2084bde2f2a0e15d637e973658a5a4',1,'helios']]], + ['class_73',['Step 1. Declare and initialize the Visualizer class',['../visualizer_basics.html#vis_step1',1,'']]], + ['class_20constructor_74',['Class Constructor',['../_b_l_conductance_doc.html#BLCConstructor',1,'BLConductanceModel Class Constructor'],['../_canopy_generator_doc.html#CGenConstructor',1,'CanopyGenerator Class Constructor'],['../_aerial_li_d_a_r_doc.html#AerialLiDARConstructor',1,'Class Constructor'],['../_li_d_a_r_doc.html#LiDARConstructor',1,'Class Constructor'],['../_photosynthesis_doc.html#PhotoConstructor',1,'Class Constructor'],['../_plant_architecture_doc.html#PlantArchConstructor',1,'Class Constructor'],['../_stomatal_doc.html#StomataConstructor',1,'Class Constructor'],['../_voxel_intersection_doc.html#VoxelIntersectionConstructor',1,'Class Constructor'],['../_energy_balance_doc.html#EBConstructor',1,'EnergyBalanceModel Class Constructor'],['../_radiation_doc.html#RadConst',1,'Model Class Constructor'],['../_radiation_doc.html#RadConstructor',1,'RadiationModel Class Constructor'],['../_solar_position_doc.html#SolarConstructor',1,'SolarPosition Class Constructor'],['../_weber_penn_doc.html#WPTConstructor',1,'WeberPennTree Class Constructor']]], + ['class_20constructor_20s_75',['Class Constructor(s)',['../_visualizer_doc.html#VisClass',1,'']]], + ['cleandeletedobjectids_76',['cleanDeletedObjectIDs',['../classhelios_1_1_context.html#af62f212e01997e02b9e6650984441c81',1,'helios::Context::cleanDeletedObjectIDs(std::vector< uint > &objIDs) const'],['../classhelios_1_1_context.html#a1bd5d91491521ff07c7d96e20349e21d',1,'helios::Context::cleanDeletedObjectIDs(std::vector< std::vector< uint > > &objIDs) const'],['../classhelios_1_1_context.html#a82d9c7f1149b51645f34b87f1d5e8b32',1,'helios::Context::cleanDeletedObjectIDs(std::vector< std::vector< std::vector< uint > > > &objIDs) const']]], + ['cleandeleteduuids_77',['cleanDeletedUUIDs',['../classhelios_1_1_context.html#a1f8686dea9f4b1029e1a13034492e725',1,'helios::Context::cleanDeletedUUIDs(std::vector< uint > &UUIDs) const'],['../classhelios_1_1_context.html#a13b8a75c8986e5461e26f559dc6e1675',1,'helios::Context::cleanDeletedUUIDs(std::vector< std::vector< uint > > &UUIDs) const'],['../classhelios_1_1_context.html#a2957986f92393ef6d429daa4927551dc',1,'helios::Context::cleanDeletedUUIDs(std::vector< std::vector< std::vector< uint > > > &UUIDs) const']]], + ['cleargeometry_78',['clearGeometry',['../class_visualizer.html#a6ed171a1cff8b411bc45d097a38cd81b',1,'Visualizer']]], + ['clearglobaldata_79',['clearGlobalData',['../classhelios_1_1_context.html#aa2facabc7384ac82a0e51acd59486ae8',1,'helios::Context']]], + ['clearobjectdata_80',['clearObjectData',['../classhelios_1_1_compound_object.html#abc9415005f1f45902b6834cb9d5aa987',1,'helios::CompoundObject::clearObjectData()'],['../classhelios_1_1_context.html#a6c96c0f3fbb3c31ae9aad750d647903b',1,'helios::Context::clearObjectData(uint objID, const char *label)'],['../classhelios_1_1_context.html#abde8caac74d1da85a5f9503aba64be48',1,'helios::Context::clearObjectData(const std::vector< uint > &objIDs, const char *label)']]], + ['clearprimitivedata_81',['clearPrimitiveData',['../classhelios_1_1_context.html#ac6ef3bc00a8d091f9408033af63f162b',1,'helios::Context::clearPrimitiveData(uint UUID, const char *label)'],['../classhelios_1_1_context.html#ab4cc7c915a03f7eb5dbbce24bbbc6903',1,'helios::Context::clearPrimitiveData(const std::vector< uint > &UUIDs, const char *label)']]], + ['clion_20ide_20with_20helios_82',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['closewindow_83',['closeWindow',['../class_visualizer.html#a6b7be76387563b2981bba995a7578d78',1,'Visualizer']]], + ['cloud_20plugin_20documentation_84',['Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation']]], + ['clouds_85',['Incorporating the effects of clouds',['../_solar_position_doc.html#SolarFluxClouds',1,'']]], + ['cluster_5fheight_5fmax_86',['cluster_height_max',['../struct_base_grape_vine_parameters.html#a400d6647ac782d95810095028b3fc896',1,'BaseGrapeVineParameters']]], + ['cluster_5fheight_5fmax_5fspread_87',['cluster_height_max_spread',['../struct_base_grape_vine_parameters.html#a953ff61ba4aafb94fea7965b9034595d',1,'BaseGrapeVineParameters']]], + ['cluster_5fradius_88',['cluster_radius',['../struct_base_grape_vine_parameters.html#a33068ecf3f8ab89c8b427f9496c5c887',1,'BaseGrapeVineParameters']]], + ['cluster_5fradius_5fspread_89',['cluster_radius_spread',['../struct_base_grape_vine_parameters.html#ac2be7d544dc5b8a4362eff523532445a',1,'BaseGrapeVineParameters']]], + ['clusters_5fper_5fstem_90',['clusters_per_stem',['../struct_strawberry_parameters.html#aac9b43d90dcf4883834708376c5514c9',1,'StrawberryParameters']]], + ['cmake_20and_20compilers_20toolchains_91',['Setting up CMake and compilers (Toolchains)',['../_c_lion_i_d_e.html#CLionToolchains',1,'']]], + ['cmakelists_20txt_20file_92',['CMakeLists.txt File',['../_a_p_i.html#CMake',1,'']]], + ['cmakelists_20txt_20file_93',['CMakeLists.txt file',['../_plugins.html#cmake',1,'']]], + ['co2_94',['Response of Assimilation Rate to CO2',['../_photosynthesis_doc.html#PhotoCO2Param',1,'']]], + ['co2_20concentration_95',['Intercellular CO2 Concentration',['../_photosynthesis_doc.html#Ci',1,'']]], + ['co2_20response_20function_96',['CO2 Response Function',['../_photosynthesis_doc.html#CO2Response',1,'']]], + ['code_97',['Coloring by r-g-b code',['../_visualizer_doc.html#ColoringRGB',1,'']]], + ['code_20errors_98',['Debugging code errors',['../_c_lion_i_d_e.html#CLionDebug',1,'']]], + ['coefficients_99',['Setting the Model Coefficients',['../_stomatal_doc.html#StomatalCoeffs',1,'']]], + ['collimated_20sources_100',['Adding Collimated Sources',['../_radiation_doc.html#ColSource',1,'']]], + ['collision_20detection_101',['Ground Collision Detection',['../_plant_architecture_doc.html#PlantArchCollision',1,'']]], + ['color_20calibration_102',['Radiation Camera Color Calibration',['../_radiation_doc.html#RadCamCalibColor',1,'']]], + ['color_20vector_103',['RGB Color Vector',['../context_vectors.html#RGBtut',1,'']]], + ['color_20vectors_104',['R-G-B(-A) color vectors',['../_a_p_i.html#RGB',1,'']]], + ['colorbar_105',['Colorbar',['../_visualizer_doc.html#Cbar',1,'']]], + ['colorcontextobjectsrandomly_106',['colorContextObjectsRandomly',['../class_visualizer.html#a1eeba834ac28642f0e884ce68160d644',1,'Visualizer::colorContextObjectsRandomly(const std::vector< uint > &ObjIDs)'],['../class_visualizer.html#a16770662445e4a697353871a370174cb',1,'Visualizer::colorContextObjectsRandomly()']]], + ['colorcontextprimitivesbydata_107',['colorContextPrimitivesByData',['../class_visualizer.html#a0c75972b0cc0300a4fa0139af6a32234',1,'Visualizer::colorContextPrimitivesByData(const char *data_name)'],['../class_visualizer.html#ac9b9fb0076f62a9a06542d876db34563',1,'Visualizer::colorContextPrimitivesByData(const char *data_name, const std::vector< uint > &UUIDs)']]], + ['colorcontextprimitivesbyobjectdata_108',['colorContextPrimitivesByObjectData',['../class_visualizer.html#ad6479e1f6bb7f0f06d0c83b0351b4424',1,'Visualizer::colorContextPrimitivesByObjectData(const char *data_name)'],['../class_visualizer.html#af221d03db54adff2d38f8a938a1512b7',1,'Visualizer::colorContextPrimitivesByObjectData(const char *data_name, const std::vector< uint > &ObjIDs)']]], + ['colorcontextprimitivesrandomly_109',['colorContextPrimitivesRandomly',['../class_visualizer.html#afb87c8a06744966e4e02b61cf011ea79',1,'Visualizer::colorContextPrimitivesRandomly(const std::vector< uint > &UUIDs)'],['../class_visualizer.html#ac82b9c5274ec13dae412a9972fe2a080',1,'Visualizer::colorContextPrimitivesRandomly()']]], + ['coloring_20by_20pseudocolor_20map_110',['Coloring by pseudocolor map',['../_visualizer_doc.html#ColoringPseudo',1,'']]], + ['coloring_20by_20r_20g_20b_20code_111',['Coloring by r-g-b code',['../_visualizer_doc.html#ColoringRGB',1,'']]], + ['coloring_20by_20texture_20map_112',['Coloring by texture map',['../_visualizer_doc.html#ColoringTexture',1,'']]], + ['coloring_20primitives_20by_20texture_20map_113',['Coloring Primitives by Texture Map',['../_a_p_i.html#TextureColor',1,'']]], + ['colormap_114',['Colormap',['../struct_colormap.html',1,'']]], + ['colormap_5fcool_115',['COLORMAP_COOL',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba65fd6eb9eefd4fbd10caa6ccceb689f5',1,'Visualizer']]], + ['colormap_5fcustom_116',['COLORMAP_CUSTOM',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba915aba9d8ae7c0796d8ed705671003a7',1,'Visualizer']]], + ['colormap_5fgray_117',['COLORMAP_GRAY',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba9902d02656030da0e50afae4ac10ab58',1,'Visualizer']]], + ['colormap_5fhot_118',['COLORMAP_HOT',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba50215b5b3fb3a48fc83d7b4670da2026',1,'Visualizer']]], + ['colormap_5flava_119',['COLORMAP_LAVA',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194baae3d180822a9415592cd938ef445e128',1,'Visualizer']]], + ['colormap_5fparula_120',['COLORMAP_PARULA',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194ba9a15b906eca8c544a6b83f885877fbe7',1,'Visualizer']]], + ['colormap_5frainbow_121',['COLORMAP_RAINBOW',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194baae019baa3e114715bf2a8feab826608d',1,'Visualizer']]], + ['colorprimitivebydatapseudocolor_122',['colorPrimitiveByDataPseudocolor',['../classhelios_1_1_context.html#a77832cbf16fff127553ea797db74caa1',1,'helios::Context::colorPrimitiveByDataPseudocolor(const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors)'],['../classhelios_1_1_context.html#a1a6a0cf71941e344dc086a13e49ddb78',1,'helios::Context::colorPrimitiveByDataPseudocolor(const std::vector< uint > &UUIDs, const std::string &primitive_data, const std::string &colormap, uint Ncolors, float data_min, float data_max)']]], + ['colors_20and_20shading_123',['Colors and Shading',['../_visualizer_doc.html#ColorShade',1,'']]], + ['columnformat_124',['columnFormat',['../struct_scan_metadata.html#accc2b308821e99b3e9aeed5d0a797130',1,'ScanMetadata']]], + ['compiler_20tools_125',['Install Microsoft Visual Studio C++ compiler tools',['../_dependent_software.html#SetupPCMSVC',1,'']]], + ['compilers_20toolchains_126',['Setting up CMake and compilers (Toolchains)',['../_c_lion_i_d_e.html#CLionToolchains',1,'']]], + ['compiling_20and_20running_127',['Building, Compiling, and Running',['../context_selftest.html#build_2',1,'']]], + ['compiling_20your_20own_20projects_128',['Building and Compiling Your Own Projects',['../_a_p_i.html#BuildCompile',1,'']]], + ['components_129',['Getting Primitive UUIDs for Organ Sub-Components',['../_plant_architecture_doc.html#PlantArchQueryUUIDs',1,'']]], + ['compound_20geometry_130',['Compound Geometry',['../_a_p_i.html#Compound',1,'']]], + ['compound_20leaves_131',['Compound Leaves',['../_plant_architecture_doc.html#PlantArch_compound',1,'']]], + ['compound_20objects_132',['Compound Objects',['../group__compoundobjects.html',1,'']]], + ['compoundobject_133',['CompoundObject',['../classhelios_1_1_compound_object.html',1,'helios']]], + ['concentration_134',['Intercellular CO2 Concentration',['../_photosynthesis_doc.html#Ci',1,'']]], + ['conditions_135',['Periodic Boundary Conditions',['../_radiation_doc.html#RadPeriodic',1,'']]], + ['conductance_136',['Moisture Conductance',['../_energy_balance_doc.html#EBgm',1,'']]], + ['conductance_20model_137',['Conductance Model',['../_energy_balance_doc.html#EBblc',1,'Boundary-layer Conductance Model'],['../_stomatal_doc.html#StomatalUse',1,'Using the Stomatal Conductance Model']]], + ['conductance_20model_20plug_20in_138',['Using the Boundary Layer Conductance Model Plug-in',['../_b_l_conductance_doc.html#BLUse',1,'']]], + ['conductance_20model_20plugin_20documentation_139',['Conductance Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'Boundary-Layer Conductance Model Plugin Documentation'],['../_stomatal_doc.html',1,'Stomatal Conductance Model Plugin Documentation']]], + ['conductance_20model_20to_20be_20used_140',['Setting the Boundary-layer Conductance Model To Be Used',['../_b_l_conductance_doc.html#BLCSet',1,'']]], + ['conductance_20models_141',['Boundary-layer Conductance Models',['../_b_l_conductance_doc.html#BLCModels',1,'']]], + ['cone_142',['Cone',['../classhelios_1_1_cone.html',1,'helios::Cone'],['../classhelios_1_1_cone.html#a1812816ea32de6d7a28fae76ebd66f80',1,'helios::Cone::Cone()']]], + ['coneangle_143',['coneangle',['../struct_aerial_scan_metadata.html#a5fbcc96d692e7be7e52c983eb9d242fd',1,'AerialScanMetadata']]], + ['conical_20crowns_144',['Canopy of Conical Crowns',['../_canopy_generator_doc.html#CGenCone',1,'']]], + ['conicalcrownscanopyparameters_145',['ConicalCrownsCanopyParameters',['../struct_conical_crowns_canopy_parameters.html',1,'ConicalCrownsCanopyParameters'],['../struct_conical_crowns_canopy_parameters.html#a14c7ca248edf64af6b1882aea58d7d74',1,'ConicalCrownsCanopyParameters::ConicalCrownsCanopyParameters()'],['../struct_conical_crowns_canopy_parameters.html#a687c4bb375077d6eb1fbe96ff438fb0f',1,'ConicalCrownsCanopyParameters::ConicalCrownsCanopyParameters(const pugi::xml_node canopy_node)']]], + ['constructor_146',['Constructor',['../_b_l_conductance_doc.html#BLCConstructor',1,'BLConductanceModel Class Constructor'],['../_canopy_generator_doc.html#CGenConstructor',1,'CanopyGenerator Class Constructor'],['../_aerial_li_d_a_r_doc.html#AerialLiDARConstructor',1,'Class Constructor'],['../_li_d_a_r_doc.html#LiDARConstructor',1,'Class Constructor'],['../_photosynthesis_doc.html#PhotoConstructor',1,'Class Constructor'],['../_plant_architecture_doc.html#PlantArchConstructor',1,'Class Constructor'],['../_stomatal_doc.html#StomataConstructor',1,'Class Constructor'],['../_voxel_intersection_doc.html#VoxelIntersectionConstructor',1,'Class Constructor'],['../_energy_balance_doc.html#EBConstructor',1,'EnergyBalanceModel Class Constructor'],['../_radiation_doc.html#RadConst',1,'Model Class Constructor'],['../_radiation_doc.html#RadConstructor',1,'RadiationModel Class Constructor'],['../_solar_position_doc.html#SolarConstructor',1,'SolarPosition Class Constructor'],['../_weber_penn_doc.html#WPTConstructor',1,'WeberPennTree Class Constructor']]], + ['constructor_20s_147',['Class Constructor(s)',['../_visualizer_doc.html#VisClass',1,'']]], + ['context_148',['Context',['../context_primitives.html#AddPatch',1,'Adding a Patch to the Context'],['../classhelios_1_1_context.html',1,'helios::Context'],['../classhelios_1_1_context.html#a652cdcd2eedc8dbd9110bd284c5d5cf0',1,'helios::Context::Context()'],['../classhelios_1_1_context.html#a859979bfe3d7d03b07d3c640ccbc0efa',1,'helios::Context::Context(const Context &)=delete'],['../_tutorials.html#ContextTuts',1,'Context'],['../_a_p_i.html#ContextSect',1,'Context'],['../_overview.html#ContextOverview',1,'The Helios Context']]], + ['context_20basics_149',['Context Basics',['../_tutorials.html#ContextBasicsTut',1,'']]], + ['context_20data_150',['Working with Context Data',['../_tutorials.html#PrimDataTut',1,'']]], + ['context_20geometry_151',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['context_20geometry_152',['Automatically importing Context geometry',['../_visualizer_doc.html#ContextGeom',1,'']]], + ['context_20self_20test_20tutorial_153',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], + ['context_2ecpp_154',['Context.cpp',['../_context_8cpp.html',1,'']]], + ['context_2eh_155',['Context.h',['../_context_8h.html',1,'']]], + ['context_5fdata_2ecpp_156',['Context_data.cpp',['../_context__data_8cpp.html',1,'']]], + ['context_5ffileio_2ecpp_157',['Context_fileIO.cpp',['../_context__file_i_o_8cpp.html',1,'']]], + ['controls_158',['View Controls',['../_visualizer_doc.html#ViewControls',1,'']]], + ['convection_159',['Convection',['../_b_l_conductance_doc.html#BLC1',1,'1. The Polhausen Equation (Laminar Flat Plate, Forced Convection)'],['../_b_l_conductance_doc.html#BLC2',1,'2. Laminar Inclined Plate, Mixed Free-Forced Convection']]], + ['converting_20polygon_20file_20formats_20to_20ply_20using_20blender_160',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['coordinate_20system_161',['Coordinate System',['../_a_p_i.html#Coord',1,'Coordinate System'],['../_plant_architecture_doc.html#PlantArchCoord',1,'Coordinate System']]], + ['coordinate_20systems_162',['Coordinate Systems',['../_visualizer_doc.html#coord',1,'']]], + ['coordinaterotation_163',['coordinateRotation',['../class_li_d_a_rcloud.html#a263717159dde05f5b98ae4133dec3d5e',1,'LiDARcloud::coordinateRotation(const helios::SphericalCoord &rotation)'],['../class_li_d_a_rcloud.html#aeae9aaa404a67082f849e1c8d56579e5',1,'LiDARcloud::coordinateRotation(uint scanID, const helios::SphericalCoord &rotation)'],['../class_li_d_a_rcloud.html#abf2f7677b1a92cba5b51ad0336e3743e',1,'LiDARcloud::coordinateRotation(float rotation, const helios::vec3 &line_base, const helios::vec3 &line_direction)']]], + ['coordinates_20and_20scan_20pattern_164',['Coordinates and scan pattern',['../_aerial_li_d_a_r_doc.html#AerialLiDARcoord',1,'Coordinates and scan pattern'],['../_li_d_a_r_doc.html#LiDARcoord',1,'Coordinates and scan pattern']]], + ['coordinates_5fcartesian_165',['COORDINATES_CARTESIAN',['../class_visualizer.html#a084713b3d4d0720dcc1ee44d270b42e3a83efc5e87fcf84a8c3d646e77adf53d4',1,'Visualizer']]], + ['coordinates_5fwindow_5fnormalized_166',['COORDINATES_WINDOW_NORMALIZED',['../class_visualizer.html#a084713b3d4d0720dcc1ee44d270b42e3a9392af82f887f2fc1982a8315bcc95f5',1,'Visualizer']]], + ['coordinateshift_167',['coordinateShift',['../class_li_d_a_rcloud.html#a72bc752975f8783ad8b1710cefa1d2a9',1,'LiDARcloud::coordinateShift(const helios::vec3 &shift)'],['../class_li_d_a_rcloud.html#ab37566564d8e421a123c8b1b8cdb2347',1,'LiDARcloud::coordinateShift(uint scanID, const helios::vec3 &shift)']]], + ['coordinatesystem_168',['CoordinateSystem',['../class_visualizer.html#a084713b3d4d0720dcc1ee44d270b42e3',1,'Visualizer']]], + ['copyobject_169',['copyObject',['../classhelios_1_1_context.html#a14f83860167c061e537f29f7754c12c3',1,'helios::Context::copyObject(uint ObjID)'],['../classhelios_1_1_context.html#a293850533a36a27b1403bbf1ae0da67d',1,'helios::Context::copyObject(const std::vector< uint > &ObjIDs)']]], + ['copyobjectdata_170',['copyObjectData',['../classhelios_1_1_context.html#ae36135cf1bcbbe48d170012e47818752',1,'helios::Context']]], + ['copyprimitive_171',['copyPrimitive',['../classhelios_1_1_context.html#a7eb6409748de787c4a8f2cc10c290144',1,'helios::Context::copyPrimitive(uint UUID)'],['../classhelios_1_1_context.html#a33af572acef6f81e93fe723cdc4eb501',1,'helios::Context::copyPrimitive(const std::vector< uint > &UUIDs)']]], + ['copyprimitivedata_172',['copyPrimitiveData',['../classhelios_1_1_context.html#a001b487c911a93940aa4d4621eda0053',1,'helios::Context']]], + ['copyradiationband_173',['copyRadiationBand',['../class_radiation_model.html#a516dafe4d898ad38af6f5bc23bdfb4d8',1,'RadiationModel::copyRadiationBand(const std::string &old_label, const std::string &new_label)'],['../class_radiation_model.html#ab0e729819054765ad2c40d30fd56c7a6',1,'RadiationModel::copyRadiationBand(const std::string &old_label, const std::string &new_label, float wavelength_min, float wavelength_max)']]], + ['cordon_5fheight_174',['cordon_height',['../struct_base_grape_vine_parameters.html#ae0039b667a66a05e79bc4391c33fea85',1,'BaseGrapeVineParameters']]], + ['cordon_5fheight_5fspread_175',['cordon_height_spread',['../struct_base_grape_vine_parameters.html#a7987cea6f3fa47a7bd6c3e26985f27f9',1,'BaseGrapeVineParameters']]], + ['cordon_5flength_176',['cordon_length',['../struct_base_grape_vine_parameters.html#ac1b85687c9d616cecbcd5669cc306f6f',1,'BaseGrapeVineParameters']]], + ['cordon_5flength_5fspread_177',['cordon_length_spread',['../struct_base_grape_vine_parameters.html#aff36939081dff4eb93a98a06d3453fde',1,'BaseGrapeVineParameters']]], + ['cordon_5fradius_178',['cordon_radius',['../struct_base_grape_vine_parameters.html#a6d1ddbd96a217d8d744058cd4edca266',1,'BaseGrapeVineParameters']]], + ['cordon_5fradius_5fspread_179',['cordon_radius_spread',['../struct_base_grape_vine_parameters.html#ac9906e333606068b757f6a5bf0b529ad',1,'BaseGrapeVineParameters']]], + ['cordon_5fspacing_180',['cordon_spacing',['../struct_split_grapevine_parameters.html#a6d65cd7d6a101ce083020c08f7237dcb',1,'SplitGrapevineParameters']]], + ['cordon_5fspacing_5fspread_181',['cordon_spacing_spread',['../struct_split_grapevine_parameters.html#abe4c3510d79f5543ea86ec9d4c5baf81',1,'SplitGrapevineParameters']]], + ['cover_20fraction_182',['2D raster ground cover fraction',['../_aerial_li_d_a_r_doc.html#AerialGroundCover',1,'']]], + ['cpp_20files_183',['Main and auxiliary .cpp files',['../_a_p_i.html#Source',1,'']]], + ['createelementlabels_184',['createElementLabels',['../class_canopy_generator.html#ade5c366887c712553b134ef23509f255',1,'CanopyGenerator']]], + ['creating_20custom_20xml_20files_185',['Creating Custom XML Files',['../_weber_penn_doc.html#WPTreeXML',1,'']]], + ['creating_20global_20data_20arrays_186',['Creating Global Data (Arrays)',['../context_globaldata.html#context_globaldata_arrays',1,'']]], + ['creating_20global_20data_20scalars_187',['Creating Global Data (Scalars)',['../context_globaldata.html#context_globaldata_scalar',1,'']]], + ['creating_20plant_20organ_20prototypes_188',['Creating Plant Organ Prototypes',['../_plant_architecture_doc.html#PlantArchOrgans',1,'']]], + ['creating_20primitive_20data_20arrays_189',['Creating Primitive Data (Arrays)',['../context_primdata.html#context_primdata_arrays',1,'']]], + ['creating_20primitive_20data_20scalars_190',['Creating Primitive Data (Scalars)',['../context_primdata.html#context_primdata_scalar',1,'']]], + ['creation_191',['creation',['../radiation_basics.html#Tutorial10_geom',1,'1. Model geometry creation'],['../radiation__beers_law.html#tutorial11_geom',1,'1. Model geometry creation']]], + ['cropbeamstogridanglerange_192',['cropBeamsToGridAngleRange',['../class_li_d_a_rcloud.html#a85e1a7d8dc2df6eba9b798bb2a456473',1,'LiDARcloud']]], + ['cropdomain_193',['cropDomain',['../classhelios_1_1_context.html#aea4ea9dfed93b6e75cdc49ab3a94b023',1,'helios::Context::cropDomain(std::vector< uint > &UUIDs, const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)'],['../classhelios_1_1_context.html#a646610820710e8012084aeb0fe0ec0f1',1,'helios::Context::cropDomain(const vec2 &xbounds, const vec2 &ybounds, const vec2 &zbounds)']]], + ['cropdomainx_194',['cropDomainX',['../classhelios_1_1_context.html#a5a9ae91eb630bf727ce994e7d1c0fb40',1,'helios::Context']]], + ['cropdomainy_195',['cropDomainY',['../classhelios_1_1_context.html#a743a39dcf2a6688cc8aeabf79f6bc0b6',1,'helios::Context']]], + ['cropdomainz_196',['cropDomainZ',['../classhelios_1_1_context.html#a574cfb5f54a48a49d3a9f2b292f65786',1,'helios::Context']]], + ['cropping_20optional_197',['2. Rotating and cropping (OPTIONAL)',['../_making_masks.html#Two',1,'']]], + ['cropping_20primitives_20on_20the_20boundaries_198',['2. Slicing and cropping primitives on the boundaries',['../radiation__beers_law.html#tutorial11_slice',1,'']]], + ['cross_199',['cross',['../helios__vector__types_8h.html#aa4e7459e7404915c12903a5c08588f5b',1,'helios']]], + ['crown_5fheight_200',['crown_height',['../struct_conical_crowns_canopy_parameters.html#a40b24b7e99ad96e967bc4d3d9af277e2',1,'ConicalCrownsCanopyParameters']]], + ['crown_5fradius_201',['crown_radius',['../struct_spherical_crowns_canopy_parameters.html#a1695b7794ffb1c8ab8618ebb701fbb6d',1,'SphericalCrownsCanopyParameters::crown_radius'],['../struct_conical_crowns_canopy_parameters.html#ab8ad6dd9a6bdb0ccfbccb268a58e3275',1,'ConicalCrownsCanopyParameters::crown_radius'],['../struct_white_spruce_canopy_parameters.html#a97c71fefdb2f53e1e058f0be363ee592',1,'WhiteSpruceCanopyParameters::crown_radius']]], + ['crowns_202',['Crowns',['../_canopy_generator_doc.html#CGenCone',1,'Canopy of Conical Crowns'],['../_canopy_generator_doc.html#CGenSphere',1,'Canopy of Spherical Crowns']]], + ['ctable_203',['Ctable',['../class_visualizer.html#a0af839aae42fd7086643608a6cbd194b',1,'Visualizer']]], + ['cuda_204',['CUDA',['../_dependent_software.html#SetupPCCUDA',1,'Setting up NVIDIA CUDA'],['../_dependent_software.html#SetupLinuxCUDA',1,'Setting up NVIDIA CUDA']]], + ['cuda_20and_20optix_20version_205',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['cuda_20version_206',['CUDA Version',['../_choosing_c_u_d_a.html#chooseCUDA',1,'']]], + ['cursorcallback_207',['cursorCallback',['../_visualizer_8h.html#a4a3702f5fdcf4f8328bab6638ece5a37',1,'cursorCallback(GLFWwindow *window, double x, double y): Visualizer.cpp'],['../_visualizer_8cpp.html#a130a46ee7099395ef26b4c5e504bf14b',1,'cursorCallback(GLFWwindow *window, double xpos, double ypos): Visualizer.cpp']]], + ['custom_20tree_20library_20files_208',['Custom Tree Library Files',['../_weber_penn_doc.html#WPTCustom',1,'']]], + ['custom_20xml_20files_209',['Creating Custom XML Files',['../_weber_penn_doc.html#WPTreeXML',1,'']]] ]; diff --git a/doc/html/search/all_c.js b/doc/html/search/all_c.js index 8349c4157..ca2c7b80e 100644 --- a/doc/html/search/all_c.js +++ b/doc/html/search/all_c.js @@ -1,38 +1,113 @@ var searchData= [ - ['magnitude_0',['magnitude',['../structhelios_1_1vec2.html#a1931ec5c78112202c14634634f429073',1,'helios::vec2::magnitude()'],['../structhelios_1_1vec3.html#adb96b24e6544d106a19e029c2594fee4',1,'helios::vec3::magnitude()'],['../structhelios_1_1vec4.html#a416f39c133309add363f43fd5f1e340c',1,'helios::vec4::magnitude()']]], - ['make_5fdate_1',['make_Date',['../group__vectors.html#ga5199de860b171749c8e153e94a2984b2',1,'helios::make_Date(int JulianDay, int year)'],['../group__vectors.html#gad4c811a7a39319de43f58c93e14ecda6',1,'helios::make_Date(int day, int month, int year)']]], - ['make_5fint2_2',['make_int2',['../group__vectors.html#ga39457188bb8c3aba1fdc9217ecc16f74',1,'helios::make_int2(int x, int y)'],['../group__vectors.html#ga61cbe7ba7a687fde1273f9883e54c2ac',1,'helios::make_int2(int X[2])']]], - ['make_5fint3_3',['make_int3',['../helios__vector__types_8h.html#a7003de16002f0da5916c10bb566ad0eb',1,'helios::make_int3(int X[3])'],['../helios__vector__types_8h.html#a88347513c8d7e764d5c820b61e5905e2',1,'helios::make_int3(int X, int Y, int Z)']]], - ['make_5fint4_4',['make_int4',['../helios__vector__types_8h.html#ad1dc8d4f618d34d2f7ada3eb0ca7e4db',1,'helios::make_int4(const int X[4])'],['../helios__vector__types_8h.html#acdfd23cf323df4bdd409c8e4e2bcdfdc',1,'helios::make_int4(int x, int y, int z, int w)']]], - ['make_5flocation_5',['make_Location',['../group__vectors.html#gaa720b1e8afc6a431dda4e3ecb97df112',1,'helios']]], - ['make_5frgbacolor_6',['make_RGBAcolor',['../group__vectors.html#ga55bc372b981da2d30826fcb5f9254888',1,'helios::make_RGBAcolor(RGBcolor color, float a)'],['../group__vectors.html#gacc4916e29a0757214b7c558c6e5f7cd3',1,'helios::make_RGBAcolor(float r, float g, float b, float a)']]], - ['make_5frgbcolor_7',['make_RGBcolor',['../group__vectors.html#gae5b981fa224fe6f30b850467ec655c0b',1,'helios']]], - ['make_5fsphericalcoord_8',['make_SphericalCoord',['../helios__vector__types_8h.html#ad89212892cf1bdc45eeae189e6d490a1',1,'helios::make_SphericalCoord(float elevation_radians, float azimuth_radians)'],['../helios__vector__types_8h.html#a6e6a11dede0cfd0c725e11224f48d2b7',1,'helios::make_SphericalCoord(float radius, float elevation_radians, float azimuth_radians)']]], - ['make_5ftime_9',['make_Time',['../group__vectors.html#ga7a29e9916b97d9f7533e87e7125e5b66',1,'helios::make_Time(int hour, int minute)'],['../group__vectors.html#ga57bfa5a4e5595e2e385d03883733f978',1,'helios::make_Time(int hour, int minute, int second)']]], - ['make_5fvec2_10',['make_vec2',['../group__vectors.html#ga7e3752eb5ff9909862380d188d2b3f24',1,'helios']]], - ['make_5fvec3_11',['make_vec3',['../helios__vector__types_8h.html#a7a7e3dfbb0f3b50e9a5992a25a913566',1,'helios::make_vec3(float X[3])'],['../helios__vector__types_8h.html#aa19986ef06f067d450534135735bc36b',1,'helios::make_vec3(float x, float y, float z)']]], - ['make_5fvec4_12',['make_vec4',['../helios__vector__types_8h.html#ab232dd96cf103ad9ac02b6f5c264ced0',1,'helios::make_vec4(float x, float y, float z, float w)'],['../helios__vector__types_8h.html#a797d2ee9d38d23a6a7a3fa2b826b053b',1,'helios::make_vec4(float X[4])']]], - ['makeidentitymatrix_13',['makeIdentityMatrix',['../global_8h.html#ab044c22f6798031f34744e63d95ca614',1,'helios']]], - ['makerotationmatrix_14',['makeRotationMatrix',['../group__functions.html#ga42c109f6c1a5b59ffcefc262ee78d291',1,'helios::makeRotationMatrix(float rotation, const char *axis, float(&transform)[16])'],['../group__functions.html#gaae1a72fb7a970c9bf65e10b26ab6fb51',1,'helios::makeRotationMatrix(float rotation, const helios::vec3 &axis, float(&transform)[16])'],['../group__functions.html#ga55a4cd9377af44ec86d945ffd72e1dc5',1,'helios::makeRotationMatrix(float rotation, const helios::vec3 &origin, const helios::vec3 &axis, float(&transform)[16])']]], - ['makescalematrix_15',['makeScaleMatrix',['../group__functions.html#ga9af58af4f070bf9f81a45141569e9c72',1,'helios::makeScaleMatrix(const helios::vec3 &scale, float(&T)[16])'],['../group__functions.html#gaf092b1b3100fcbc2f9d106a4b560efcd',1,'helios::makeScaleMatrix(const helios::vec3 &scale, const helios::vec3 &point, float(&T)[16])']]], - ['maketranslationmatrix_16',['makeTranslationMatrix',['../group__functions.html#ga6c071a3206c9d7a7d8694275b46b8d42',1,'helios']]], - ['maketubefromcones_17',['makeTubeFromCones',['../_plant_architecture_8h.html#a90314e1f16ad76c838da858b9bf0ae86',1,'PlantArchitecture.h']]], - ['making_20texture_20mask_20files_20with_20transparency_20using_20gimp_18',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], - ['markgeometryclean_19',['markGeometryClean',['../classhelios_1_1_context.html#a368852580048c62c2b16ebec000b35ed',1,'helios::Context']]], - ['markgeometrydirty_20',['markGeometryDirty',['../classhelios_1_1_context.html#aba4b1c6f469953791017770fd8c18fa1',1,'helios::Context']]], - ['matmult_21',['matmult',['../global_8h.html#a2404c4bfe8b03cdbde4421a2e0be2b19',1,'helios']]], - ['max_22',['max',['../group__functions.html#ga828d302d1bb6e0aee3e2bf5efd670f86',1,'helios::max(const std::vector< float > &vect)'],['../group__functions.html#ga812947a11191483677a73636e0b7ed06',1,'helios::max(const std::vector< int > &vect)'],['../group__functions.html#gaa3b7bf55e065bf2ab8a9d975963ce7ca',1,'helios::max(const std::vector< vec3 > &vect)']]], - ['maxpulsefilter_23',['maxPulseFilter',['../class_li_d_a_rcloud.html#aa5c2bd82b67b3e84069090d75ed2973d',1,'LiDARcloud']]], - ['mean_24',['mean',['../group__functions.html#gadfcde1fcf4db2a62012ed5ddf43c943d',1,'helios']]], - ['median_25',['median',['../group__functions.html#ga461699c384fe606656ce1cc59618e727',1,'helios']]], - ['midrib_5ffold_5ffraction_26',['midrib_fold_fraction',['../struct_leaf_prototype.html#ab6a5584fbf19ee9c61f979e020eeb834',1,'LeafPrototype']]], - ['min_27',['min',['../group__functions.html#ga522f5d4232ccb2c899ff620eafc744b5',1,'helios::min(const std::vector< float > &vect)'],['../group__functions.html#gabdeaa8440597bcdcf1f43cd3a8f2383f',1,'helios::min(const std::vector< int > &vect)'],['../group__functions.html#ga656494728a1221b22464a693936d41f5',1,'helios::min(const std::vector< vec3 > &vect)']]], - ['minpulsefilter_28',['minPulseFilter',['../class_li_d_a_rcloud.html#a530582b532eb13ca938d5e843d902327',1,'LiDARcloud']]], - ['minscatterenergy_29',['minScatterEnergy',['../struct_radiation_band.html#a2f54d84dc4a82db6bdd50ba3648cae59',1,'RadiationBand']]], - ['minute_30',['minute',['../structhelios_1_1_time.html#a744b90da076192b90a3ee4ce2ff3743a',1,'helios::Time']]], - ['missing_5fplant_5fprobability_31',['missing_plant_probability',['../struct_base_grape_vine_parameters.html#a1d9460b443217dccd867a587c5bf57f7',1,'BaseGrapeVineParameters']]], - ['month_32',['month',['../structhelios_1_1_date.html#a5d75f8c8616d778e470a59e0b3e890a3',1,'helios::Date']]], - ['moptcoefficients_33',['MOPTcoefficients',['../struct_m_o_p_tcoefficients.html',1,'']]], - ['my_5ferror_5fmgr_34',['my_error_mgr',['../structmy__error__mgr.html',1,'']]] + ['d_5fcalculateprimitivearea_0',['d_calculatePrimitiveArea',['../_ray_tracing_8cu_8h.html#a216a63a21845766a5ad1fe4b8002e983',1,'RayTracing.cu.h']]], + ['d_5fmagnitude_1',['d_magnitude',['../_ray_tracing_8cu_8h.html#a59b52bcf03b8801f444e081e943f7138',1,'RayTracing.cu.h']]], + ['d_5frotatepoint_2',['d_rotatePoint',['../_ray_tracing_8cu_8h.html#af48d117e18e1319cd61b4af9ef999b01',1,'RayTracing.cu.h']]], + ['d_5ftransformpoint_3',['d_transformPoint',['../_ray_tracing_8cu_8h.html#a515aa9bdd11a5648143611f9c9d76500',1,'RayTracing.cu.h']]], + ['data_4',['Data',['../_i_o.html#TimeXML',1,'Adding Timeseries Data'],['../_b_l_conductance_doc.html#BLOutputData',1,'Default Output Primitive Data'],['../_energy_balance_doc.html#EBOutputData',1,'Default Output Primitive Data'],['../_photosynthesis_doc.html#PhotoOutputData',1,'Default Output Primitive Data'],['../_li_d_a_r_doc.html#LiDARsynthetic',1,'Generating Synthetic (Simulated) LiDAR Data'],['../_a_p_i.html#GlobalData',1,'Global Data'],['../_b_l_conductance_doc.html#BLCInputData',1,'Input Primitive Data'],['../_energy_balance_doc.html#EBInputData',1,'Input Primitive Data'],['../_li_d_a_r_doc.html#LiDARInputData',1,'Input Primitive Data'],['../_photosynthesis_doc.html#PhotoInputData',1,'Input Primitive Data'],['../_radiation_doc.html#RadInputData',1,'Input Primitive Data'],['../_stomatal_doc.html#StomatalInputData',1,'Input Primitive Data'],['../_radiation_doc.html#InputSpectra',1,'Input Spectral Data'],['../_b_l_conductance_doc.html#BLCData',1,'Input/Output Primitive Data'],['../_energy_balance_doc.html#EBData',1,'Input/Output Primitive Data'],['../_radiation_doc.html#RadVarsAndProps',1,'Input/Output Primitive Data'],['../context_globaldata.html#context_globaldata_intro',1,'Introduction to Global Data'],['../context_primdata.html#context_primdata_intro',1,'Introduction to Primitive Data'],['../_overview.html#ModelGeom',1,'Model Geometry and Data'],['../_plant_architecture_doc.html#PlantArchOutputData',1,'Optional Output Object Data'],['../_energy_balance_doc.html#EBOptionalOutputData',1,'Optional Output Primitive Data'],['../_photosynthesis_doc.html#PhotoOptionalOutputData',1,'Optional Output Primitive Data'],['../_radiation_doc.html#RadOutputData',1,'Output Primitive Data'],['../_stomatal_doc.html#StomatalOutputData',1,'Output Primitive Data'],['../_voxel_intersection_doc.html#VoxelIntersectionOutputData',1,'Output Primitive Data'],['../_a_p_i.html#PrimData',1,'Primitive Data'],['../_photosynthesis_doc.html#PhotoVarsAndProps',1,'Primitive Data'],['../_plant_architecture_doc.html#PlantArchVarsAndProps',1,'Primitive Data'],['../_stomatal_doc.html#VarsAndProps',1,'Primitive Data'],['../context_primdata.html',1,'Tutorial 5: Primitive Data'],['../context_globaldata.html',1,'Tutorial 6: Global Data'],['../_voxel_intersection_doc.html#VoxVarsAndProps',1,'Variables and Primitive Data'],['../_tutorials.html#PrimDataTut',1,'Working with Context Data']]], + ['data_5',['data',['../_solar_position_doc.html#SolarFluxTurb',1,'Calibrating the turbidity using weather station (radiometer) data'],['../_aerial_li_d_a_r_doc.html#AerialLiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#LiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#AddHits',1,'Hit point data'],['../_aerial_li_d_a_r_doc.html#AerialLiDARprocess',1,'Processing LiDAR data'],['../_li_d_a_r_doc.html#LiDARprocess',1,'Processing LiDAR data'],['../_li_d_a_r_doc.html#LiDARsynthdiscrete',1,'Synthetic discrete-return data'],['../_li_d_a_r_doc.html#LiDARsynthwaveform',1,'Synthetic waveform data']]], + ['data_20arrays_6',['Data Arrays',['../context_globaldata.html#context_globaldata_arrays',1,'Creating Global Data (Arrays)'],['../context_primdata.html#context_primdata_arrays',1,'Creating Primitive Data (Arrays)']]], + ['data_20from_20file_7',['data from file',['../_aerial_li_d_a_r_doc.html#AerialScanIO',1,'Loading scan data from file'],['../_li_d_a_r_doc.html#ScanIO',1,'Loading scan data from file']]], + ['data_20from_20tabular_20text_20files_8',['Adding Timeseries (Weather) Data from Tabular Text Files',['../_i_o.html#ASCIItimeseries',1,'']]], + ['data_20processing_20setup_9',['Data processing setup',['../_aerial_li_d_a_r_doc.html#AerialSetup',1,'']]], + ['data_20query_20functions_10',['Primitive Data Query Functions',['../_a_p_i.html#PrimDataHelpers',1,'']]], + ['data_20scalars_11',['Data Scalars',['../context_globaldata.html#context_globaldata_scalar',1,'Creating Global Data (Scalars)'],['../context_primdata.html#context_primdata_scalar',1,'Creating Primitive Data (Scalars)']]], + ['data_20structures_12',['Data Structures',['../_a_p_i.html#Data',1,'']]], + ['data_20timeseries_20weather_20inputs_13',['Data Timeseries (Weather Inputs)',['../_a_p_i.html#DataTimeseries',1,'']]], + ['data_20to_20text_20file_14',['Exporting Primitive Data to Text File',['../_i_o.html#ExportASCII',1,'']]], + ['data_20values_15',['Data Values',['../_a_p_i.html#GetPrimData',1,'Getting Primitive Data Values'],['../_a_p_i.html#SetPrimData',1,'Setting Primitive Data Values']]], + ['data_20values_16',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], + ['data_5ffile_17',['data_file',['../struct_scan_metadata.html#a9314565da4824fbee86ced28382cc1dc',1,'ScanMetadata']]], + ['date_18',['Date',['../structhelios_1_1_date.html',1,'helios::Date'],['../structhelios_1_1_date.html#a0cf0a25b63afde0c55203451e827b56a',1,'helios::Date::Date()'],['../structhelios_1_1_date.html#ab6a3fd0b6aa30e71a995f71c24c68d1b',1,'helios::Date::Date(int day, int month, int year)']]], + ['date_20vector_19',['Date Vector',['../context_vectors.html#Datetut',1,'']]], + ['day_20',['day',['../structhelios_1_1_date.html#a876b0513daf0bcf0ab305029be3377d8',1,'helios::Date']]], + ['dead_5fprobability_21',['dead_probability',['../struct_base_grape_vine_parameters.html#a23c655ac5643e9d9d4a0ad1e4d989e8e',1,'BaseGrapeVineParameters']]], + ['deblank_22',['deblank',['../group__functions.html#gad5aa3cd5124a2e1e526d6070e53c2bc8',1,'helios::deblank(const char *input)'],['../group__functions.html#gaaf03682753b330b32f6c5d117df90db7',1,'helios::deblank(const std::string &input)']]], + ['debugging_20code_20errors_23',['Debugging code errors',['../_c_lion_i_d_e.html#CLionDebug',1,'']]], + ['declare_20and_20initialize_20the_20visualizer_20class_24',['Step 1. Declare and initialize the Visualizer class',['../visualizer_basics.html#vis_step1',1,'']]], + ['default_20output_20primitive_20data_25',['Default Output Primitive Data',['../_b_l_conductance_doc.html#BLOutputData',1,'Default Output Primitive Data'],['../_energy_balance_doc.html#EBOutputData',1,'Default Output Primitive Data'],['../_photosynthesis_doc.html#PhotoOutputData',1,'Default Output Primitive Data']]], + ['default_20parameters_26',['Loading a Plant from the Library with Default Parameters',['../_plant_architecture_doc.html#PlantArchBuild_default',1,'']]], + ['default_20values_27',['Modifying Geometric Parameters from Default Values',['../_canopy_generator_doc.html#CGenParameterMod',1,'']]], + ['defined_20leaf_20angle_20distribution_20functions_28',['User-Defined Leaf Angle Distribution Functions',['../_weber_penn_doc.html#WPTgL',1,'']]], + ['defineshoottype_29',['defineShootType',['../class_plant_architecture.html#a9700f223b8f60bf37852ad87d30e7fc0',1,'PlantArchitecture']]], + ['defining_20shoots_20and_20their_20parameters_30',['Defining Shoots and their Parameters',['../_plant_architecture_doc.html#PlantArchShoot',1,'']]], + ['defining_20the_20phytomer_20and_20its_20parameters_31',['Defining the Phytomer and its Parameters',['../_plant_architecture_doc.html#PlantArchPhytomerParams',1,'']]], + ['defining_20wavelength_20bands_32',['Defining Wavelength Bands',['../_radiation_doc.html#RadBands',1,'']]], + ['deg2rad_33',['deg2rad',['../group__functions.html#ga60f429b247883516de80687774f4155c',1,'helios']]], + ['delay_34',['Increasing Timout Detection (TDR) Delay',['../_dependent_software.html#TdrDelay',1,'']]], + ['deletechildprimitive_35',['deleteChildPrimitive',['../classhelios_1_1_compound_object.html#a5448b4bd356d7f772b8a0c7a848cfb89',1,'helios::CompoundObject::deleteChildPrimitive(uint UUID)'],['../classhelios_1_1_compound_object.html#a4b8f242ec7d96ef82bd9d49658fb605f',1,'helios::CompoundObject::deleteChildPrimitive(const std::vector< uint > &UUIDs)']]], + ['deletehitpoint_36',['deleteHitPoint',['../class_aerial_li_d_a_rcloud.html#a9d374100b86e8becf578b65b81f99b67',1,'AerialLiDARcloud::deleteHitPoint()'],['../class_li_d_a_rcloud.html#accf5ec6015b0b68c89716ffff1a016bb',1,'LiDARcloud::deleteHitPoint()']]], + ['deleteobject_37',['deleteObject',['../classhelios_1_1_context.html#aaae58688c97d14257223911be4bb13e6',1,'helios::Context::deleteObject(uint ObjID)'],['../classhelios_1_1_context.html#a690553ff4b945d117782addb96c5add0',1,'helios::Context::deleteObject(const std::vector< uint > &ObjIDs)']]], + ['deleteplantinstance_38',['deletePlantInstance',['../class_plant_architecture.html#a892ccc80c958b43d7528fa07006117e7',1,'PlantArchitecture::deletePlantInstance(uint plantID)'],['../class_plant_architecture.html#afda177f49619fda164fd0ad6cfe512e9',1,'PlantArchitecture::deletePlantInstance(const std::vector< uint > &plantIDs)']]], + ['deleteprimitive_39',['deletePrimitive',['../classhelios_1_1_context.html#a24324ccb5318cb103846a71d44dda23e',1,'helios::Context::deletePrimitive(uint UUID)'],['../classhelios_1_1_context.html#a06b7dc6a572fcf33f499f249ea44db5a',1,'helios::Context::deletePrimitive(const std::vector< uint > &UUIDs)']]], + ['deleteradiationsource_40',['deleteRadiationSource',['../class_radiation_model.html#a1078def47ddf309e01c908a775c1ecd4',1,'RadiationModel']]], + ['dependencies_41',['Dependencies',['../_aerial_li_d_a_r_doc.html#AerialLiDARdepends',1,'Dependencies'],['../_dummy.html#DummyDepends',1,'Dependencies'],['../_energy_balance_doc.html#EBDepends',1,'Dependencies'],['../_li_d_a_r_doc.html#LiDARdepends',1,'Dependencies'],['../_radiation_doc.html#RadDepends',1,'Dependencies'],['../_visualizer_doc.html#VisDepends',1,'Dependencies'],['../_voxel_intersection_doc.html#VoxelIntersectionDepends',1,'Dependencies'],['../_dependent_software.html#Automatically',1,'Installing Helios Dependencies']]], + ['dependencies_20of_20the_20visualizer_20plug_20in_42',['Dependencies of the Visualizer Plug-in',['../_dependent_software.html#SetupLinuxVis',1,'']]], + ['deprecated_43',['DEPRECATED',['../class_visualizer.html#a66b16cf0e4d56836fad694658ccb7931',1,'Visualizer']]], + ['description_44',['Description',['../_photosynthesis_doc.html#EmpiricalDescription',1,'Empirical Model Description'],['../_photosynthesis_doc.html#FarquharDescription',1,'Farquhar, von Caemmerer, Berry Model Description']]], + ['detection_45',['Ground Collision Detection',['../_plant_architecture_doc.html#PlantArchCollision',1,'']]], + ['detection_20tdr_20delay_46',['Increasing Timout Detection (TDR) Delay',['../_dependent_software.html#TdrDelay',1,'']]], + ['difference_20between_20discrete_20return_20and_20full_20waveform_20lidar_20data_47',['Difference between discrete return and full waveform LiDAR data',['../_aerial_li_d_a_r_doc.html#AerialLiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#LiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data']]], + ['diffuse_20ambient_20sources_48',['Adding Diffuse/Ambient Sources',['../_radiation_doc.html#AmbSource',1,'']]], + ['diffuse_20solar_20flux_49',['Direct and Diffuse Solar Flux',['../_solar_position_doc.html#SolarFluxTheory',1,'']]], + ['diffuse_5fspectrum_50',['diffuse_spectrum',['../struct_radiation_band.html#a24a0753d9bc91d02db11046a7278220b',1,'RadiationBand']]], + ['diffusedistnorm_51',['diffuseDistNorm',['../struct_radiation_band.html#a774ee8eb75fc96a086688fe4c643cdec',1,'RadiationBand']]], + ['diffuseextinction_52',['diffuseExtinction',['../struct_radiation_band.html#a8d765b32b7feb274d2e4b19c46256454',1,'RadiationBand']]], + ['diffuseflux_53',['diffuseFlux',['../struct_radiation_band.html#a8eab113387b2e1435640b0e5eb7cc0ce',1,'RadiationBand']]], + ['diffusepeakdir_54',['diffusePeakDir',['../struct_radiation_band.html#a640846a7f7b0b525ff33ea0d8143e866',1,'RadiationBand']]], + ['diffuseraycount_55',['diffuseRayCount',['../struct_radiation_band.html#ad96ca3a5bd5aa77844ac2c9fe16e042d',1,'RadiationBand']]], + ['direct_20and_20diffuse_20solar_20flux_56',['Direct and Diffuse Solar Flux',['../_solar_position_doc.html#SolarFluxTheory',1,'']]], + ['direction_20of_20the_20sun_57',['Getting the Direction of the Sun',['../_solar_position_doc.html#SolarPos',1,'']]], + ['direction2rc_58',['direction2rc',['../struct_scan_metadata.html#aab2db5e4c22f1eb7979294a7f8993611',1,'ScanMetadata']]], + ['directories_59',['Include Directories',['../_plugins.html#include',1,'']]], + ['directory_60',['Build Directory',['../_a_p_i.html#BuildDir',1,'']]], + ['directory_20structure_61',['Basic Directory Structure',['../_a_p_i.html#DirStruct',1,'']]], + ['directraycount_62',['directRayCount',['../struct_radiation_band.html#aff62997df11af06fad82b946b298ee90',1,'RadiationBand']]], + ['disablecameramodelvisualization_63',['disableCameraModelVisualization',['../class_radiation_model.html#a697a43f3706fe60094dab0e525b370f8',1,'RadiationModel']]], + ['disablecloudcalibration_64',['disableCloudCalibration',['../class_solar_position.html#a282ed51f351684b847255212dcd53869',1,'SolarPosition']]], + ['disablecolorbar_65',['disableColorbar',['../class_visualizer.html#a3580188fe9f0daf71e1c434fe7f14103',1,'Visualizer']]], + ['disableelementlabels_66',['disableElementLabels',['../class_canopy_generator.html#a96b61b2224ca9adb3ccef157447d07c1',1,'CanopyGenerator']]], + ['disableemission_67',['disableEmission',['../class_radiation_model.html#a764f6cfd8e79569cc7a110fccd36857b',1,'RadiationModel']]], + ['disableinstancesegmentation_68',['disableInstanceSegmentation',['../class_synthetic_annotation.html#a04117857ddc185b3b3595fcc2cfa97ae',1,'SyntheticAnnotation']]], + ['disableinternodecontextbuild_69',['disableInternodeContextBuild',['../class_plant_architecture.html#af66af0968daf0fef4135b4434c61dc60',1,'PlantArchitecture']]], + ['disablelightmodelvisualization_70',['disableLightModelVisualization',['../class_radiation_model.html#abe728e1b9804571c0125ad92659d6a9e',1,'RadiationModel']]], + ['disablemessages_71',['disableMessages',['../class_aerial_li_d_a_rcloud.html#aae637046290c1276c8f816d975489b86',1,'AerialLiDARcloud::disableMessages()'],['../class_b_l_conductance_model.html#a11bd8193606442d8393bf22131fa0720',1,'BLConductanceModel::disableMessages()'],['../class_canopy_generator.html#aae25f707aa8f8f0409e497faa127d599',1,'CanopyGenerator::disableMessages()'],['../class_energy_balance_model.html#aaee48ad61d28ce32bdc8fb3650471b5b',1,'EnergyBalanceModel::disableMessages()'],['../class_leaf_optics.html#acc78ee64bd0569888dbaab2b29b4e7d5',1,'LeafOptics::disableMessages()'],['../class_li_d_a_rcloud.html#af5d0590b160e7069826c52eeeb4e0129',1,'LiDARcloud::disableMessages()'],['../class_photosynthesis_model.html#a53e70a6e8e335d605154d565e283aec1',1,'PhotosynthesisModel::disableMessages()'],['../class_radiation_model.html#a173a9cb77b4dfda7a008267d6331b7b7',1,'RadiationModel::disableMessages()'],['../class_stomatal_conductance_model.html#a1ec3059345b100a8d9df83b36e1c821d',1,'StomatalConductanceModel::disableMessages()'],['../class_visualizer.html#ab095acf8151f5825077b2ff36846c7df',1,'Visualizer::disableMessages()'],['../class_voxel_intersection.html#a899b91a48fbd227ff96b233c90709e74',1,'VoxelIntersection::disableMessages()']]], + ['disableobjectdetection_72',['disableObjectDetection',['../class_synthetic_annotation.html#a482f3217d844ba462f3640c07902ea58',1,'SyntheticAnnotation']]], + ['disablepedunclecontextbuild_73',['disablePeduncleContextBuild',['../class_plant_architecture.html#a71918ef58e5257e4a8a338dba4f9b328',1,'PlantArchitecture']]], + ['disablepetiolecontextbuild_74',['disablePetioleContextBuild',['../class_plant_architecture.html#ab4ae495e7aebc365826f2a2f02a24338',1,'PlantArchitecture']]], + ['disablesemanticsegmentation_75',['disableSemanticSegmentation',['../class_synthetic_annotation.html#aaacbec2f1a8da152494b802d98f54cde',1,'SyntheticAnnotation']]], + ['disabletextures_76',['disableTextures',['../struct_shader.html#a487913973657c8817a5aa03422c43be5',1,'Shader']]], + ['discrete_20return_20and_20full_20waveform_20lidar_20data_77',['discrete return and full waveform LiDAR data',['../_aerial_li_d_a_r_doc.html#AerialLiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#LiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data']]], + ['discrete_20return_20data_78',['Synthetic discrete-return data',['../_li_d_a_r_doc.html#LiDARsynthdiscrete',1,'']]], + ['disk_79',['Disk',['../classhelios_1_1_disk.html',1,'helios::Disk'],['../classhelios_1_1_disk.html#aedc5a15466aa7b07a76605473a00ba15',1,'helios::Disk::Disk()']]], + ['disk_20radiation_20sources_80',['Adding Disk Radiation Sources',['../_radiation_doc.html#DiskSource',1,'']]], + ['disk_5fbounds_81',['disk_bounds',['../primitive_intersection_8cu.html#aab2e16ff4d5a4bca2d90c49f777500e9',1,'primitiveIntersection.cu']]], + ['disk_5fintersect_82',['disk_intersect',['../primitive_intersection_8cu.html#a45dc4da4927abe579fd24be608e4cd75',1,'primitiveIntersection.cu']]], + ['distancefilter_83',['distanceFilter',['../class_aerial_li_d_a_rcloud.html#acc26240eea9ec98c6b354041cd9b9efc',1,'AerialLiDARcloud::distanceFilter()'],['../class_li_d_a_rcloud.html#af21b843806f22fb9bc80e7ef370aee1d',1,'LiDARcloud::distanceFilter()']]], + ['distortimage_84',['distortImage',['../struct_camera_calibration.html#a75a0688aa37a6d7706cef4ee4b92dd7f',1,'CameraCalibration']]], + ['distribution_20and_20normalization_85',['Setting the Radiation Source Spectral Distribution and Normalization',['../_radiation_doc.html#SourceDist',1,'']]], + ['distribution_20functions_86',['User-Defined Leaf Angle Distribution Functions',['../_weber_penn_doc.html#WPTgL',1,'']]], + ['documentation_87',['Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_b_l_conductance_doc.html',1,'Boundary-Layer Conductance Model Plugin Documentation'],['../_canopy_generator_doc.html',1,'Canopy Generator Plugin Documentation'],['../_dummy.html',1,'Dummy Model Plugin Documentation'],['../_energy_balance_doc.html',1,'Energy Balance Model Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation'],['../_photosynthesis_doc.html',1,'Photosynthesis Model Plugin Documentation'],['../_plant_architecture_doc.html',1,'Plant Architecture Model Plugin Documentation'],['../_radiation_doc.html',1,'Radiation Model Plugin Documentation'],['../_solar_position_doc.html',1,'Solar Position Plugin Documentation'],['../_stomatal_doc.html',1,'Stomatal Conductance Model Plugin Documentation'],['../_overview.html#DocOverview',1,'Using the Documentation'],['../_visualizer_doc.html',1,'Visualizer Plugin Documentation'],['../_voxel_intersection_doc.html',1,'Voxel Intersection Plugin Documentation'],['../_weber_penn_doc.html',1,'Weber-Penn Tree Plugin Documentation'],['../_plugins.html#PluginWriting',1,'Writing Documentation']]], + ['documentation_20v1_203_2026_88',['Helios Documentation v1.3.26',['../index.html',1,'']]], + ['doesbandexist_89',['doesBandExist',['../class_radiation_model.html#a966780925811e3a710a6d91f4ac852fb',1,'RadiationModel']]], + ['doesglobaldataexist_90',['doesGlobalDataExist',['../classhelios_1_1_context.html#a65ad9cb057b0cb2be3ef2734847608cc',1,'helios::Context']]], + ['doeshitdataexist_91',['doesHitDataExist',['../class_aerial_li_d_a_rcloud.html#a9b5aa652c94d4dee19a4f956a62f2ab1',1,'AerialLiDARcloud::doesHitDataExist()'],['../class_li_d_a_rcloud.html#aabb8d404b7f3fa00d8281cb6b74f90c0',1,'LiDARcloud::doesHitDataExist()']]], + ['doesobjectcontainprimitive_92',['doesObjectContainPrimitive',['../classhelios_1_1_compound_object.html#ae06ed1275c9ba5ed5ed59b08bdfd1216',1,'helios::CompoundObject::doesObjectContainPrimitive()'],['../classhelios_1_1_context.html#a60b571dd1cfd525caedcfd725162721e',1,'helios::Context::doesObjectContainPrimitive()']]], + ['doesobjectdataexist_93',['doesObjectDataExist',['../classhelios_1_1_compound_object.html#aac66c9dbdba0e7418051a9eb9c688618',1,'helios::CompoundObject::doesObjectDataExist()'],['../classhelios_1_1_context.html#a2834b9a6eee49d644f201f696ae5a4d5',1,'helios::Context::doesObjectDataExist(uint objID, const char *label) const']]], + ['doesobjectexist_94',['doesObjectExist',['../classhelios_1_1_context.html#a9b410e55075482b8cbc549f9bf571541',1,'helios::Context']]], + ['doesprimitivedataexist_95',['doesPrimitiveDataExist',['../classhelios_1_1_context.html#a780d83edd66f25cd38b5059359b48a7b',1,'helios::Context']]], + ['doesprimitiveexist_96',['doesPrimitiveExist',['../classhelios_1_1_context.html#acf4a7fa9ba97f03d0a9218e5c4b7bc66',1,'helios::Context::doesPrimitiveExist(uint UUID) const'],['../classhelios_1_1_context.html#a0c478e8ce47bfad4db16829f76305946',1,'helios::Context::doesPrimitiveExist(const std::vector< uint > &UUIDs) const']]], + ['doestimeseriesvariableexist_97',['doesTimeseriesVariableExist',['../group__timeseries.html#ga8beaa8454ad248064b74698f7f0534a2',1,'helios::Context']]], + ['doxygen_98',['Doxygen',['../_c_lion_i_d_e.html#CLionDox',1,'']]], + ['driver_20timeout_99',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], + ['dummy_20model_20plugin_20documentation_100',['Dummy Model Plugin Documentation',['../_dummy.html',1,'']]], + ['dummymodel_101',['DummyModel',['../class_dummy_model.html',1,'DummyModel'],['../class_dummy_model.html#ae48cd297d1bf8b94c296218e767b9f70',1,'DummyModel::DummyModel()']]], + ['dummymodel_2ecpp_102',['DummyModel.cpp',['../_dummy_model_8cpp.html',1,'']]], + ['dummymodel_2eh_103',['DummyModel.h',['../_dummy_model_8h.html',1,'']]], + ['dupex_104',['Dupex',['../struct_dupex.html',1,'']]], + ['duplicateglobaldata_105',['duplicateGlobalData',['../classhelios_1_1_context.html#ae89abaa03d7585e7f3abc6c5f16a0223',1,'helios::Context']]], + ['duplicateobjectdata_106',['duplicateObjectData',['../classhelios_1_1_context.html#a613366ab9fdbfd69428535d5c1867b73',1,'helios::Context']]], + ['duplicateplantinstance_107',['duplicatePlantInstance',['../class_plant_architecture.html#acd6de0d13dbc534992b94a203a16b76d',1,'PlantArchitecture']]], + ['duplicateprimitivedata_108',['duplicatePrimitiveData',['../classhelios_1_1_context.html#a86be37149a98b13141175da5793d053e',1,'helios::Context::duplicatePrimitiveData(uint UUID, const char *old_label, const char *new_label)'],['../classhelios_1_1_context.html#a3796eae362aec38408e40a3a83b3d8a4',1,'helios::Context::duplicatePrimitiveData(const char *existing_data_label, const char *copy_data_label)']]], + ['dynamic_20mode_109',['Running the Model in Dynamic Mode',['../_stomatal_doc.html#StomatalRunDyn',1,'']]] ]; diff --git a/doc/html/search/all_d.js b/doc/html/search/all_d.js index b934f4e41..b5e6fe814 100644 --- a/doc/html/search/all_d.js +++ b/doc/html/search/all_d.js @@ -1,13 +1,55 @@ var searchData= [ - ['needle_5fcolor_0',['needle_color',['../struct_white_spruce_canopy_parameters.html#ab3687772981118c2b4aaeb4ff544289a',1,'WhiteSpruceCanopyParameters']]], - ['needle_5flength_1',['needle_length',['../struct_white_spruce_canopy_parameters.html#a41a653b953bd7a5f9c6cecfb07f1bfb4',1,'WhiteSpruceCanopyParameters']]], - ['needle_5fsubdivisions_2',['needle_subdivisions',['../struct_white_spruce_canopy_parameters.html#a28eb26d944a0e67a41b1b06343090fc0',1,'WhiteSpruceCanopyParameters']]], - ['needle_5fwidth_3',['needle_width',['../struct_white_spruce_canopy_parameters.html#a11cc85d4a6176b908aff31b408d70cf3',1,'WhiteSpruceCanopyParameters']]], - ['normalize_4',['normalize',['../structhelios_1_1vec2.html#a04c00c49095d3bbc0a19d5da3d61493f',1,'helios::vec2::normalize()'],['../structhelios_1_1vec3.html#a7a6826239394edc32ce6ae58b4622524',1,'helios::vec3::normalize()'],['../structhelios_1_1vec4.html#a6bb8bb78aaea6e5703fd1d40dbd39865',1,'helios::vec4::normalize()']]], - ['nphi_5',['Nphi',['../struct_scan_metadata.html#a8d9273e0fccbfc20916c284ab6c573ac',1,'ScanMetadata']]], - ['nrays_6',['Nrays',['../struct_aerial_scan_metadata.html#a14b34575b0c5f8de6e1e203667a1d8a6',1,'AerialScanMetadata']]], - ['ntheta_7',['Ntheta',['../struct_scan_metadata.html#a8432ab0ab545a0027bb47ce84f0a6704',1,'ScanMetadata']]], - ['nullorigin_8',['nullorigin',['../global_8h.html#a876dc18d1da8ace50c131f428f8883be',1,'helios']]], - ['nullrotation_9',['nullrotation',['../global_8h.html#adcd5a98ec7c45292736ec8e19ce9de51',1,'helios']]] + ['each_20grid_20cell_0',['Calculating leaf area for each grid cell',['../_li_d_a_r_doc.html#LiDARleafarea',1,'']]], + ['effects_20of_20clouds_1',['Incorporating the effects of clouds',['../_solar_position_doc.html#SolarFluxClouds',1,'']]], + ['elevation_2',['elevation',['../structhelios_1_1_spherical_coord.html#abaa336d9a00b67f486ab1ff040420a73',1,'helios::SphericalCoord']]], + ['elongation_5frate_3',['elongation_rate',['../_plant_architecture_doc.html#ShootParam_elongation_rate',1,'']]], + ['emission_4',['Radiative Emission',['../_radiation_doc.html#RadEmission',1,'']]], + ['emissionflag_5',['emissionFlag',['../struct_radiation_band.html#ace749bf8f3e89cf3ea93fb58d3e28e1b',1,'RadiationBand']]], + ['empirical_20model_20calibration_20procedure_6',['Empirical Model Calibration Procedure',['../_photosynthesis_doc.html#PhotoCalib',1,'']]], + ['empirical_20model_20description_7',['Empirical Model Description',['../_photosynthesis_doc.html#EmpiricalDescription',1,'']]], + ['empirical_20model_20independent_20variables_8',['Summary of Empirical Model Independent Variables',['../_photosynthesis_doc.html#PhotoVars',1,'']]], + ['empirical_20model_20parameters_9',['Summary of Empirical Model Parameters',['../_photosynthesis_doc.html#PhotoParams',1,'']]], + ['empiricalmodelcoefficients_10',['EmpiricalModelCoefficients',['../struct_empirical_model_coefficients.html',1,'']]], + ['enablecameramodelvisualization_11',['enableCameraModelVisualization',['../class_radiation_model.html#ad4236469b34bcb4b216a78c96872b760',1,'RadiationModel']]], + ['enablecloudcalibration_12',['enableCloudCalibration',['../class_solar_position.html#abee2003c22cbbffb671e8e6a9305b66f',1,'SolarPosition']]], + ['enablecolorbar_13',['enableColorbar',['../class_visualizer.html#a050807f8462ca95bde2fd737b26830c4',1,'Visualizer']]], + ['enableemission_14',['enableEmission',['../class_radiation_model.html#a7ac4bd9e9cf3ff4252818d984b782e79',1,'RadiationModel']]], + ['enableepicormicchildshoots_15',['enableEpicormicChildShoots',['../class_plant_architecture.html#a8fc29c4a5b44430a34fc780180a01e8b',1,'PlantArchitecture']]], + ['enablegroundclipping_16',['enableGroundClipping',['../class_plant_architecture.html#a27dd2c46b6bb9f5c922d18acb6d9ba69',1,'PlantArchitecture']]], + ['enableinstancesegmentation_17',['enableInstanceSegmentation',['../class_synthetic_annotation.html#af2bc966a2a1074b763c8bbd5d81eda37',1,'SyntheticAnnotation']]], + ['enablelightmodelvisualization_18',['enableLightModelVisualization',['../class_radiation_model.html#a5a4c7643cb05be9f7f893d65dee33dc2',1,'RadiationModel']]], + ['enablemessages_19',['enableMessages',['../class_aerial_li_d_a_rcloud.html#af5a5942d197f59c6f61cde76bb06a1ca',1,'AerialLiDARcloud::enableMessages()'],['../class_b_l_conductance_model.html#afd2d53808eb3ab1d3b104229c7bf3817',1,'BLConductanceModel::enableMessages()'],['../class_canopy_generator.html#a42eb441c5fb1f49d5ce758785f1e1700',1,'CanopyGenerator::enableMessages()'],['../class_energy_balance_model.html#a261480763ea918e133bb594ce9f3e14c',1,'EnergyBalanceModel::enableMessages()'],['../class_leaf_optics.html#abf74f6bab17e5ef1465efca7803be71a',1,'LeafOptics::enableMessages()'],['../class_li_d_a_rcloud.html#a2e87dc18538155b35368ff27ed6a1504',1,'LiDARcloud::enableMessages()'],['../class_photosynthesis_model.html#ade42037f5602cd241150133f496fc1a9',1,'PhotosynthesisModel::enableMessages()'],['../class_radiation_model.html#abd5d02245b9dbd9401e2a7a65b37c95c',1,'RadiationModel::enableMessages()'],['../class_stomatal_conductance_model.html#a8cb0e8867b0c74c2777fd6c5f0b0b200',1,'StomatalConductanceModel::enableMessages()'],['../class_visualizer.html#aaf6a79caee464bfe52cb4fd34d3882d2',1,'Visualizer::enableMessages()'],['../class_voxel_intersection.html#a203e5402eba704b3e403ba7974cceaf3',1,'VoxelIntersection::enableMessages()']]], + ['enableobjectdetection_20',['enableObjectDetection',['../class_synthetic_annotation.html#a999f1f8f6e0135c20af979044668abb2',1,'SyntheticAnnotation']]], + ['enablesemanticsegmentation_21',['enableSemanticSegmentation',['../class_synthetic_annotation.html#abd40e35ef90be948265ef8b0d08206e1',1,'SyntheticAnnotation']]], + ['enabletexturemaps_22',['enableTextureMaps',['../struct_shader.html#a7a7ec6989dd0c90dcf290b07fab781a7',1,'Shader']]], + ['enabletexturemasks_23',['enableTextureMasks',['../struct_shader.html#a1da903f6c4f0aabd7df4e1cbcb67137c',1,'Shader']]], + ['energy_20balance_20model_20plug_20in_24',['Using the Energy Balance Model Plug-in',['../_energy_balance_doc.html#EBUse',1,'']]], + ['energy_20balance_20model_20plugin_20documentation_25',['Energy Balance Model Plugin Documentation',['../_energy_balance_doc.html',1,'PlugIns']]], + ['energybalancemodel_26',['EnergyBalanceModel',['../class_energy_balance_model.html',1,'EnergyBalanceModel'],['../class_energy_balance_model.html#ad6c6f535390c7fcb4957a33cfc13b140',1,'EnergyBalanceModel::EnergyBalanceModel()']]], + ['energybalancemodel_20class_20constructor_27',['EnergyBalanceModel Class Constructor',['../_energy_balance_doc.html#EBConstructor',1,'']]], + ['energybalancemodel_2ecpp_28',['EnergyBalanceModel.cpp',['../_energy_balance_model_8cpp.html',1,'']]], + ['energybalancemodel_2ecu_29',['EnergyBalanceModel.cu',['../_energy_balance_model_8cu.html',1,'']]], + ['energybalancemodel_2eh_30',['EnergyBalanceModel.h',['../_energy_balance_model_8h.html',1,'']]], + ['enforceperiodicboundary_31',['enforcePeriodicBoundary',['../class_radiation_model.html#a46c60b11342d10feed8f3a431df415bd',1,'RadiationModel']]], + ['equation_20laminar_20flat_20plate_20forced_20convection_32',['1. The Polhausen Equation (Laminar Flat Plate, Forced Convection)',['../_b_l_conductance_doc.html#BLC1',1,'']]], + ['errors_33',['Debugging code errors',['../_c_lion_i_d_e.html#CLionDebug',1,'']]], + ['establishing_20grid_20cells_34',['Establishing grid cells',['../_aerial_li_d_a_r_doc.html#AerialLiDARgrid',1,'Establishing grid cells'],['../_li_d_a_r_doc.html#LiDARgrid',1,'Establishing grid cells']]], + ['et_20al_202011_20optimality_20based_20model_35',['Medlyn et al. (2011) Optimality-Based Model',['../_stomatal_doc.html#MoptTheory',1,'']]], + ['evaluatecdfresid_36',['evaluateCDFresid',['../_canopy_generator_8h.html#a22e592a9de7a15c01e7c87d077fdde2a',1,'evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#a22e592a9de7a15c01e7c87d077fdde2a',1,'evaluateCDFresid(float thetaL, std::vector< float > &ru_v, const void *a_distribution): CanopyGenerator.cpp']]], + ['existing_20plant_20library_37',['Existing Plant Library',['../_plant_architecture_doc.html#PlantArchBuild',1,'Existing Plant Library'],['../_plant_architecture_doc.html#PlantArchGettingStarted',1,'Getting Started with the Existing Plant Library']]], + ['exitdiameter_38',['exitDiameter',['../struct_aerial_scan_metadata.html#aa42ea7d97c0d88bedea8ebeab10c4c84',1,'AerialScanMetadata::exitDiameter'],['../struct_scan_metadata.html#a86d36162498a4de96a04ce83976c8e22',1,'ScanMetadata::exitDiameter']]], + ['exportgtheta_39',['exportGtheta',['../class_li_d_a_rcloud.html#af680cbb9eb0c1ebf49f71f0062d18c0c',1,'LiDARcloud']]], + ['exporting_20primitive_20data_20to_20text_20file_40',['Exporting Primitive Data to Text File',['../_i_o.html#ExportASCII',1,'']]], + ['exporting_20project_20to_20xml_20file_20format_41',['Exporting Project to XML File Format',['../_i_o.html#Export',1,'']]], + ['exporting_20to_20png_20format_42',['4. Exporting to .png format',['../_making_masks.html#Four',1,'']]], + ['exportleafareadensities_43',['exportLeafAreaDensities',['../class_li_d_a_rcloud.html#a6e438fd60af7f54f4d1c09ac64fd7338',1,'LiDARcloud']]], + ['exportleafareas_44',['exportLeafAreas',['../class_li_d_a_rcloud.html#a8e8bd43bf3b2c107994fee402c41240f',1,'LiDARcloud']]], + ['exportpointcloud_45',['exportPointCloud',['../class_aerial_li_d_a_rcloud.html#a7f0992570b8535f687fd7067eb9f3593',1,'AerialLiDARcloud::exportPointCloud()'],['../class_li_d_a_rcloud.html#a2d0c11c6d8001171269232ff5d7f6322',1,'LiDARcloud::exportPointCloud(const char *filename)'],['../class_li_d_a_rcloud.html#ae9910fa1aae6b8b077d57417c130e753',1,'LiDARcloud::exportPointCloud(const char *filename, uint scanID)']]], + ['exportpointcloudptx_46',['exportPointCloudPTX',['../class_li_d_a_rcloud.html#ac48fe9018f26664dd9abd8c100fccaa6',1,'LiDARcloud']]], + ['exporttriangleareas_47',['exportTriangleAreas',['../class_li_d_a_rcloud.html#a416638f486c4fd2572a9589b69605fe7',1,'LiDARcloud::exportTriangleAreas(const char *filename)'],['../class_li_d_a_rcloud.html#adb93e3a16abc8100b2e5dac956c6cc3e',1,'LiDARcloud::exportTriangleAreas(const char *filename, int gridcell)']]], + ['exporttriangleinclinationdistribution_48',['exportTriangleInclinationDistribution',['../class_li_d_a_rcloud.html#aadeb8297b74a75fd003f6c96fe378043',1,'LiDARcloud']]], + ['exporttrianglenormals_49',['exportTriangleNormals',['../class_li_d_a_rcloud.html#ad030fdddcfa669d6af513eb66a9cbd1a',1,'LiDARcloud::exportTriangleNormals(const char *filename)'],['../class_li_d_a_rcloud.html#aa8376ce652d2e95e886d4d60d321c274',1,'LiDARcloud::exportTriangleNormals(const char *filename, int gridcell)']]], + ['extent_50',['extent',['../struct_aerial_scan_metadata.html#a5c51ed2d651b82502f0921bb52d80095',1,'AerialScanMetadata']]], + ['external_20radiation_20sources_51',['External Radiation Sources',['../_radiation_doc.html#RadSources',1,'']]] ]; diff --git a/doc/html/search/all_e.js b/doc/html/search/all_e.js index 981747ea6..38f6c865e 100644 --- a/doc/html/search/all_e.js +++ b/doc/html/search/all_e.js @@ -1,31 +1,71 @@ var searchData= [ - ['obj_5fmodel_5ffile_0',['OBJ_model_file',['../struct_leaf_prototype.html#abf799f4b6c6a0eb64ddccb0e310c6259',1,'LeafPrototype']]], - ['object_5ftype_5fbox_1',['OBJECT_TYPE_BOX',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a2f065407387865d0564746c763c78d66',1,'helios']]], - ['object_5ftype_5fcone_2',['OBJECT_TYPE_CONE',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a6bcd175267f2f6d4f4a75b8e1e520def',1,'helios']]], - ['object_5ftype_5fdisk_3',['OBJECT_TYPE_DISK',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a7d26aca591c366d41bca9d184a07ee51',1,'helios']]], - ['object_5ftype_5fpolymesh_4',['OBJECT_TYPE_POLYMESH',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a40bb0200100d500b738a6c3efc70df38',1,'helios']]], - ['object_5ftype_5fsphere_5',['OBJECT_TYPE_SPHERE',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682af4e336a18e47e54ca6e9a7f57e665175',1,'helios']]], - ['object_5ftype_5ftile_6',['OBJECT_TYPE_TILE',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682aed347b5fb08bc5551b61310a964f0bde',1,'helios']]], - ['object_5ftype_5ftube_7',['OBJECT_TYPE_TUBE',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682a4c8545d7bc5d79cd8d150eca0624b623',1,'helios']]], - ['objecthastexture_8',['objectHasTexture',['../classhelios_1_1_context.html#afbdf67c60f6a4efc93cd9526151d5d89',1,'helios::Context']]], - ['objecttype_9',['ObjectType',['../_context_8h.html#ad0894682f41916c84c2026b3cb8ac682',1,'helios']]], - ['operator_21_3d_10',['operator!=',['../structhelios_1_1int2.html#aa56785402e6db8119c1ed30a49948218',1,'helios::int2::operator!=()'],['../structhelios_1_1int3.html#a71f26f049c1fb4f1cdd066c13ce77f62',1,'helios::int3::operator!=()'],['../structhelios_1_1int4.html#affc0813de0395a8aad56f4be7d0b04ca',1,'helios::int4::operator!=()'],['../structhelios_1_1vec2.html#a17f3c1246cb0d3ac6c3f7e88d925fc8c',1,'helios::vec2::operator!=()'],['../structhelios_1_1vec3.html#ada103df1691b54465c2b1b529e0c5832',1,'helios::vec3::operator!=()'],['../structhelios_1_1vec4.html#a628c2b9a02267a04a7a0cea2f81751ea',1,'helios::vec4::operator!=()'],['../structhelios_1_1_r_g_bcolor.html#ac0fa9361ccd323b9f6be61c51523a3ce',1,'helios::RGBcolor::operator!=()'],['../structhelios_1_1_r_g_b_acolor.html#a8adb7872a82b7d73660cca8d8e597f98',1,'helios::RGBAcolor::operator!=()'],['../structhelios_1_1_date.html#aa22bf3af71b348a4d5ffda2ec0f711d1',1,'helios::Date::operator!=()'],['../structhelios_1_1_time.html#a9e2b7c5426528477fb14973543bd55be',1,'helios::Time::operator!=()'],['../structhelios_1_1_location.html#af4aa7f58f7b88f7cff711d77f018bccd',1,'helios::Location::operator!=()'],['../structhelios_1_1_spherical_coord.html#a145cb6d467be654bc647c15e4fd9646a',1,'helios::SphericalCoord::operator!=()']]], - ['operator_2a_11',['operator*',['../structhelios_1_1vec2.html#aff56c21393bd165f0f7a716535caa9e0',1,'helios::vec2::operator*(const vec2 &a) const'],['../structhelios_1_1vec2.html#ad8557c2528c67f4736853e0eb2da84ad',1,'helios::vec2::operator*(float a) const'],['../structhelios_1_1vec3.html#af73b1a2553239424ec86cdb0c8c40396',1,'helios::vec3::operator*(const vec3 &a) const'],['../structhelios_1_1vec3.html#add5a63009e9808b16ba05b6f13a247c9',1,'helios::vec3::operator*(float a) const'],['../structhelios_1_1vec4.html#ac2e0c4e83c5996aaae993fc465793c46',1,'helios::vec4::operator*(const vec4 &a) const'],['../structhelios_1_1vec4.html#af4405b9a3827567189c0386ce937ed1b',1,'helios::vec4::operator*(float a) const'],['../helios__vector__types_8h.html#a9a2cbdb93bb7a6f7460ea0a8ffcc62c6',1,'helios::operator*(float a, const vec4 &v)'],['../helios__vector__types_8h.html#a5b21978f962a37f7edd5837241d17821',1,'helios::operator*(float a, const vec3 &v)'],['../helios__vector__types_8h.html#a36a0796c19320ea5804ade9835341060',1,'helios::operator*(float a, const vec2 &v)']]], - ['operator_2b_12',['operator+',['../structhelios_1_1vec3.html#a3c9cee7dfe117cf1e89c79308562df2c',1,'helios::vec3::operator+()'],['../structhelios_1_1vec4.html#a766b22dfe3aa73999248fa60fd753960',1,'helios::vec4::operator+(float a) const'],['../structhelios_1_1vec4.html#a12ed9a7a675ba5a734326d90d82d4ffc',1,'helios::vec4::operator+(const vec4 &a) const'],['../structhelios_1_1vec3.html#a4d847b9be59bfb23ea7ea5a5a8f21cb7',1,'helios::vec3::operator+()'],['../structhelios_1_1vec2.html#a6e0dfda32de091ffaead085c42e9da6c',1,'helios::vec2::operator+(float a) const'],['../structhelios_1_1vec2.html#ab10677029f53c641eb7a16f2b05a5b77',1,'helios::vec2::operator+(const vec2 &a) const'],['../structhelios_1_1int4.html#a6b3eb9a070e397d5a0e7c60e0b4696b1',1,'helios::int4::operator+()'],['../structhelios_1_1int3.html#ac05dad4f6ff3f71fcd5dd3549d00fc3d',1,'helios::int3::operator+()'],['../structhelios_1_1int2.html#a14302add4995370f272dd321216a64ec',1,'helios::int2::operator+()'],['../helios__vector__types_8h.html#a8dfabc1a2f089ccb3b49eef4813dbb88',1,'helios::operator+(float a, const vec2 &v)'],['../helios__vector__types_8h.html#aba7a658887aa3d4fdf041fea304a6c35',1,'helios::operator+(float a, const vec3 &v)'],['../helios__vector__types_8h.html#a145447708e8a06709ff6904b22087d1b',1,'helios::operator+(float a, const vec4 &v)']]], - ['operator_2b_3d_13',['operator+=',['../structhelios_1_1vec2.html#a04b63f7eea6d70bb1d05a1d3f5cae24c',1,'helios::vec2::operator+=()'],['../structhelios_1_1vec3.html#abd94e98635de454f86ad00ce77e6e2ad',1,'helios::vec3::operator+=()'],['../structhelios_1_1vec4.html#a795da5aba8f107010589dffda7f11d4d',1,'helios::vec4::operator+=()'],['../structhelios_1_1int3.html#a5569b625b5206c5c6074d2498dbc2295',1,'helios::int3::operator+=()'],['../structhelios_1_1int2.html#aa09f5fff701bf0847ba3d90ae9ea8583',1,'helios::int2::operator+=()'],['../structhelios_1_1int4.html#ab7ec3cec60a44e6ac8fc4dc6d422fde1',1,'helios::int4::operator+=()']]], - ['operator_2d_14',['operator-',['../structhelios_1_1vec4.html#a64f1627b4f2c6487231f315527afbf15',1,'helios::vec4::operator-()'],['../helios__vector__types_8h.html#a2ac8eb255c768eba03401b9d7f58df50',1,'helios::operator-(float a, const vec4 &v)'],['../helios__vector__types_8h.html#a434fe3718d57c13e067aa06818652be3',1,'helios::operator-(float a, const vec3 &v)'],['../helios__vector__types_8h.html#a7436b011b35d256deae673fe5c35cf75',1,'helios::operator-(float a, const vec2 &v)'],['../structhelios_1_1vec4.html#afd6f6b82dd6d3512cc8e1560e218bab2',1,'helios::vec4::operator-(float a) const'],['../structhelios_1_1vec4.html#a98039082899cd4872d383e039cc0b812',1,'helios::vec4::operator-(const vec4 &a) const'],['../structhelios_1_1vec3.html#a5a0176fe2d334f8a30ab00a975c2bdb1',1,'helios::vec3::operator-() const'],['../structhelios_1_1vec3.html#ad5557e6f3320abb0cab521a0aa87532f',1,'helios::vec3::operator-(float a) const'],['../structhelios_1_1vec3.html#ab6d099de4a986d24b7414114700bb66a',1,'helios::vec3::operator-(const vec3 &a) const'],['../structhelios_1_1vec2.html#ad37fb5771915e31225d39d3df8c669ed',1,'helios::vec2::operator-() const'],['../structhelios_1_1vec2.html#a919b93ba0bf660ae2b7e65500982e3d7',1,'helios::vec2::operator-(float a) const'],['../structhelios_1_1vec2.html#a91e810accf20886a20afc9ed0c3d5f07',1,'helios::vec2::operator-(const vec2 &a) const'],['../structhelios_1_1int4.html#a4d7a1b7d29e0d436fe35f927d645b7c7',1,'helios::int4::operator-() const'],['../structhelios_1_1int4.html#a67b8bf23d9a9377fb295d4dad92ead6a',1,'helios::int4::operator-(const int4 &a) const'],['../structhelios_1_1int3.html#adbe1fd230ee2591e64fdc15d71204848',1,'helios::int3::operator-()'],['../structhelios_1_1int2.html#a39dfd15acdd548f1c93be6e7b8a1a475',1,'helios::int2::operator-() const'],['../structhelios_1_1int2.html#acfb7317221012445f653b395c28f774f',1,'helios::int2::operator-(const int2 &a) const'],['../structhelios_1_1int3.html#ade3be6bb42b51bd8875e485ca9e6274b',1,'helios::int3::operator-()']]], - ['operator_2d_3d_15',['operator-=',['../structhelios_1_1int2.html#a5838914611d1837e927638c83f4a1bf9',1,'helios::int2::operator-=()'],['../structhelios_1_1int3.html#a383f2cb4438661dd93bef01cfb52d646',1,'helios::int3::operator-=()'],['../structhelios_1_1int4.html#a3726af5576f9ed3ed3cf5d7c97a8159d',1,'helios::int4::operator-=()'],['../structhelios_1_1vec2.html#a575d6107bcec4582c106b711142a17c2',1,'helios::vec2::operator-=()'],['../structhelios_1_1vec3.html#a47a2080f5ba1e3690956ad8dd9160780',1,'helios::vec3::operator-=()'],['../structhelios_1_1vec4.html#a5cff99d238392c388015d1a0ac4456ae',1,'helios::vec4::operator-=()']]], - ['operator_2f_16',['operator/',['../structhelios_1_1vec2.html#a910c611bcf9c2ea1cd3ff38f0bd375e8',1,'helios::vec2::operator/()'],['../structhelios_1_1vec3.html#a09c648b26b7333d2726b7fbceab85be7',1,'helios::vec3::operator/()'],['../structhelios_1_1vec4.html#aa86d6caee3381dd0a14a74ea5e743604',1,'helios::vec4::operator/()']]], - ['operator_3c_3c_17',['operator<<',['../structhelios_1_1int2.html#aa70779f707686be8b004587a4220a153',1,'helios::int2::operator<<()'],['../structhelios_1_1vec2.html#a5e585083b0cf16b2e73958747390e152',1,'helios::vec2::operator<<()'],['../structhelios_1_1vec3.html#a87277dd90e0869e2e8e7ce376dfc7033',1,'helios::vec3::operator<<()'],['../structhelios_1_1vec4.html#a32f014dbb41084ece2ad85f19c540874',1,'helios::vec4::operator<<()'],['../structhelios_1_1_r_g_bcolor.html#a47b1d94ed5f6fa0c8ae897e02a06435c',1,'helios::RGBcolor::operator<<()'],['../structhelios_1_1_r_g_b_acolor.html#aaa76985ee048b321703f78175e2b87b7',1,'helios::RGBAcolor::operator<<()'],['../structhelios_1_1_date.html#a189b8537a2e0696e2f38da34e0f13eec',1,'helios::Date::operator<<()'],['../structhelios_1_1_time.html#a5d53ebf9a42b3aa2d959a3cd5023c71a',1,'helios::Time::operator<<()'],['../structhelios_1_1_location.html#a60375cac034fe50880b47569df6e8f69',1,'helios::Location::operator<<()'],['../structhelios_1_1_spherical_coord.html#ad9381fdcb8448d8834b4ce43465b5335',1,'helios::SphericalCoord::operator<<()'],['../structhelios_1_1int4.html#ac6b32d39d92de0b8585c64048040f0f9',1,'helios::int4::operator<<()'],['../structhelios_1_1int3.html#a6f576c885af0d781aadda850a2ca77af',1,'helios::int3::operator<<()']]], - ['operator_3d_18',['operator=',['../classhelios_1_1_context.html#aef8acffd049cf98f2544143188c164e2',1,'helios::Context::operator=()'],['../structhelios_1_1_spherical_coord.html#afe4ef2437aad9bca5863eeb387b1eee5',1,'helios::SphericalCoord::operator=()'],['../struct_leaf_prototype.html#a2dc8e0e35313b52c69cb7076d0392c2a',1,'LeafPrototype::operator=()']]], - ['operator_3d_3d_19',['operator==',['../structhelios_1_1vec2.html#ab0c78672d242efe3aede0a4bd03eaeea',1,'helios::vec2::operator==()'],['../structhelios_1_1int4.html#a779368fbba5e30ad5bba83072c9fdf83',1,'helios::int4::operator==()'],['../structhelios_1_1int3.html#aced326938393fe95e1725e55b9bd4dd8',1,'helios::int3::operator==()'],['../structhelios_1_1int2.html#a6f1ec1cd4223e5f0bbfaa16e636af533',1,'helios::int2::operator==()'],['../structhelios_1_1_spherical_coord.html#afa6791361ed489019d0689a52cac5621',1,'helios::SphericalCoord::operator==()'],['../structhelios_1_1_location.html#a2d451323ab20191a7f123849da04e269',1,'helios::Location::operator==()'],['../structhelios_1_1_time.html#a8a0bab271dcb31616ba52c4fd5f754cd',1,'helios::Time::operator==()'],['../structhelios_1_1_date.html#a097ff893e7fc52d101fdcb4ced84354b',1,'helios::Date::operator==()'],['../structhelios_1_1_r_g_b_acolor.html#abed23df133a671e295dcbf559c8a3ff5',1,'helios::RGBAcolor::operator==()'],['../structhelios_1_1_r_g_bcolor.html#a3cfc4c0f132c841f3a18ff9bdae21e22',1,'helios::RGBcolor::operator==()'],['../structhelios_1_1vec4.html#aa8f6ace5ba502b2b958b64b1d032d1c3',1,'helios::vec4::operator==()'],['../structhelios_1_1vec3.html#a00f6165fb3f01c65d7046111b6143fd4',1,'helios::vec3::operator==()']]], - ['optionaloutputobjectdata_20',['optionalOutputObjectData',['../class_plant_architecture.html#a435b4a07a5ce3ed4e0de58b286c5b883',1,'PlantArchitecture::optionalOutputObjectData(const std::vector< std::string > &object_data_labels)'],['../class_plant_architecture.html#acc53c4a5dd259f25b2b4a26907f8b749',1,'PlantArchitecture::optionalOutputObjectData(const std::string &object_data_label)']]], - ['optionaloutputprimitivedata_21',['optionalOutputPrimitiveData',['../class_weber_penn_tree.html#adb6095aad4b1dd1da8adc15fbd295775',1,'WeberPennTree::optionalOutputPrimitiveData()'],['../class_stomatal_conductance_model.html#a9618e00c9b4649c289debff2a4a1cfd4',1,'StomatalConductanceModel::optionalOutputPrimitiveData()'],['../class_radiation_model.html#ac42245154cfb4f125cfe1ef4671ca19f',1,'RadiationModel::optionalOutputPrimitiveData()'],['../class_photosynthesis_model.html#a9ec83db517f4c7d0eb09c20a9f61ef20',1,'PhotosynthesisModel::optionalOutputPrimitiveData()'],['../class_energy_balance_model.html#a8fd349c962047a29384e3f8099f1a054',1,'EnergyBalanceModel::optionalOutputPrimitiveData()']]], - ['origin_22',['origin',['../struct_scan_metadata.html#a200bf65b728866855ace6456365d66a3',1,'ScanMetadata']]], - ['origin_5fuuid_23',['origin_UUID',['../struct_per_ray_data.html#a6eb01aac11b5c8d4cfe02f15330dd868',1,'PerRayData']]], - ['overrideobjecttexturecolor_24',['overrideObjectTextureColor',['../classhelios_1_1_context.html#afe34537e4079b477f2eaf2b0e2e0d8a9',1,'helios::Context::overrideObjectTextureColor(const std::vector< uint > &ObjIDs)'],['../classhelios_1_1_context.html#a17e6824df31545c92187c6529122aada',1,'helios::Context::overrideObjectTextureColor(uint ObjID)']]], - ['overrideprimitivetexturecolor_25',['overridePrimitiveTextureColor',['../classhelios_1_1_context.html#a90df70161f5ded2f8a79e995464598e0',1,'helios::Context::overridePrimitiveTextureColor(uint UUID)'],['../classhelios_1_1_context.html#a7173c1deabbe8dd57791ff94bcdf0621',1,'helios::Context::overridePrimitiveTextureColor(const std::vector< uint > &UUIDs)']]], - ['overridetexturecolor_26',['overrideTextureColor',['../classhelios_1_1_compound_object.html#a247e9f55e89ce5bb4621cc395069a20d',1,'helios::CompoundObject']]], - ['overview_27',['Overview',['../_overview.html',1,'']]] + ['face_0',['face',['../struct_per_ray_data.html#afc61137cf7b0e132eeb05b908b899790',1,'PerRayData']]], + ['farquhar_202003_20model_20simplified_20version_20given_20in_20buckley_20turnbull_20and_20adams_202012_1',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['farquhar_20von_20caemmerer_20berry_20model_20description_2',['Farquhar, von Caemmerer, Berry Model Description',['../_photosynthesis_doc.html#FarquharDescription',1,'']]], + ['farquharmodelcoefficients_3',['FarquharModelCoefficients',['../struct_farquhar_model_coefficients.html',1,'']]], + ['file_4',['File',['../_a_p_i.html#CMake',1,'CMakeLists.txt File'],['../_i_o.html#ExportASCII',1,'Exporting Primitive Data to Text File'],['../_weber_penn_doc.html#WPTLibrary',1,'The XML Tree Library File'],['../_radiation_doc.html#RadCamOut',1,'Writing Camera Images to File']]], + ['file_5',['file',['../_plugins.html#cmake',1,'CMakeLists.txt file'],['../_aerial_li_d_a_r_doc.html#AerialScanIO',1,'Loading scan data from file'],['../_li_d_a_r_doc.html#ScanIO',1,'Loading scan data from file'],['../_li_d_a_r_doc.html#LiDARoutput',1,'Writing results to file'],['../_li_d_a_r_doc.html#LiDARsynthxml',1,'XML parameter file']]], + ['file_20format_6',['Exporting Project to XML File Format',['../_i_o.html#Export',1,'']]], + ['file_20formats_7',['Reading Standard Polygon File Formats',['../_i_o.html#Poly',1,'']]], + ['file_20formats_20to_20ply_20using_20blender_8',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['file_20input_20output_9',['File Input/Output',['../_i_o.html',1,'']]], + ['file_20structure_10',['XML File Structure',['../_i_o.html#XMLstructure',1,'']]], + ['fileio_2ecpp_11',['fileIO.cpp',['../aeriallidar_2src_2file_i_o_8cpp.html',1,'(Global Namespace)'],['../lidar_2src_2file_i_o_8cpp.html',1,'(Global Namespace)']]], + ['files_12',['Files',['../_i_o.html#ASCIItimeseries',1,'Adding Timeseries (Weather) Data from Tabular Text Files'],['../_a_p_i.html#GlobalInclude',1,'C++ Standard Library Include Files'],['../_weber_penn_doc.html#WPTreeXML',1,'Creating Custom XML Files'],['../_weber_penn_doc.html#WPTCustom',1,'Custom Tree Library Files'],['../_i_o.html#OBJread',1,'Reading OBJ (Wavefront) Files'],['../_i_o.html#PLYread',1,'Reading PLY (Stanford Polygon) Files'],['../_i_o.html#XMLread',1,'Reading XML Files'],['../_i_o.html#OBJwrite',1,'Writing OBJ (Wavefront) Files'],['../_i_o.html#PLYwrite',1,'Writing PLY (Stanford Polygon) Files']]], + ['files_13',['Main and auxiliary .cpp files',['../_a_p_i.html#Source',1,'']]], + ['files_20with_20transparency_20using_20gimp_14',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['filterobjectsbydata_15',['filterObjectsByData',['../classhelios_1_1_context.html#a6263c6f3b15c1e66f7bd902f1da6d8a8',1,'helios::Context::filterObjectsByData(const std::vector< uint > &ObjIDs, const char *object_data, float threshold, const char *comparator) const'],['../classhelios_1_1_context.html#a6c14f758352ebe13c74ec4ebcb1d29a9',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, float filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#aaf93fbdf1f58127a5af34cc166247649',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, double filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#ac677208cd4aca4855e6681bff3a430b8',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, int filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#af5740b7d57d1b7fe2c7e699b498c66f0',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, uint filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#a05ee48c5e13900f8c9815954bb4c7b06',1,'helios::Context::filterObjectsByData(const std::vector< uint > &objIDs, const std::string &object_data_label, const std::string &filter_value)']]], + ['filterprimitivesbydata_16',['filterPrimitivesByData',['../classhelios_1_1_context.html#a416b75bbf3ddf4ca0184df35651f41b7',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, float filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#a93513af810192e6802d20a7e5579b005',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, double filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#a271237c1395c7460e89fcd25452d6d68',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, int filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#ad37d63ef2955fcef29ddcc6908055c1b',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, uint filter_value, const std::string &comparator)'],['../classhelios_1_1_context.html#a622fabc835cfed565c78fa6db6a34535',1,'helios::Context::filterPrimitivesByData(const std::vector< uint > &UUIDs, const std::string &primitive_data_label, const std::string &filter_value)']]], + ['firsthitfilter_17',['firstHitFilter',['../class_li_d_a_rcloud.html#a869540860f4cace62dbd2fb54353bd33',1,'LiDARcloud']]], + ['flat_20plate_20forced_20convection_18',['1. The Polhausen Equation (Laminar Flat Plate, Forced Convection)',['../_b_l_conductance_doc.html#BLC1',1,'']]], + ['flatten_19',['flatten',['../group__functions.html#ga121757e2774279472d1ffa068313dbfc',1,'helios::flatten(const std::vector< std::vector< int > > &vec)'],['../group__functions.html#gabbee61759ee5dbc76a83f1356bc4e427',1,'helios::flatten(const std::vector< std::vector< uint > > &vec)'],['../group__functions.html#gacce06754824eb0f9ec29d043c8970fdd',1,'helios::flatten(const std::vector< std::vector< float > > &vec)'],['../group__functions.html#ga8148b3dd86a772edcee01ed3e788c344',1,'helios::flatten(const std::vector< std::vector< double > > &vec)'],['../group__functions.html#gaa82d824f02499ea89a35f49837c73c16',1,'helios::flatten(const std::vector< std::vector< helios::vec2 > > &vec)'],['../group__functions.html#ga1d91aa279bfa52924ce4ad1ff25e73fa',1,'helios::flatten(const std::vector< std::vector< helios::vec3 > > &vec)'],['../group__functions.html#gab81afa45742b33913932e93d18027bb9',1,'helios::flatten(const std::vector< std::vector< helios::vec4 > > &vec)'],['../group__functions.html#ga7d6b41f67d574ad1eda29386f7602fd3',1,'helios::flatten(const std::vector< std::vector< helios::int2 > > &vec)'],['../group__functions.html#gaacf3de9501039033bbf3ce1192a5b980',1,'helios::flatten(const std::vector< std::vector< helios::int3 > > &vec)'],['../group__functions.html#gaba0182e0dee319764079263d3c6515cb',1,'helios::flatten(const std::vector< std::vector< helios::int4 > > &vec)'],['../group__functions.html#gacba6e64852b80969f8529e7e4ca9cd0c',1,'helios::flatten(const std::vector< std::vector< std::string > > &vec)'],['../group__functions.html#ga9b7c03082c314d9f694fb939c0ea1550',1,'helios::flatten(const std::vector< std::vector< std::vector< int > > > &vec)'],['../group__functions.html#ga46b186805c705dc05ded72b791ed90a4',1,'helios::flatten(const std::vector< std::vector< std::vector< uint > > > &vec)'],['../group__functions.html#ga4837a536a7387f8721f7b9d8cad201e8',1,'helios::flatten(const std::vector< std::vector< std::vector< float > > > &vec)'],['../group__functions.html#ga480225bd53c0fbc332edca0a0d9a9ebf',1,'helios::flatten(const std::vector< std::vector< std::vector< double > > > &vec)'],['../group__functions.html#ga69b9012c4d9aa9c34bba25cca4e53119',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::vec2 > > > &vec)'],['../group__functions.html#ga31baa6f6552d52b2cc79561fc3457a88',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::vec3 > > > &vec)'],['../group__functions.html#ga82feb62a40fb10cba137a8d38eacf003',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::vec4 > > > &vec)'],['../group__functions.html#ga96b392b637a3fcc21a7944000323e57e',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::int2 > > > &vec)'],['../group__functions.html#gadc8836b0f49c4a8b5bc5bcab058a63ad',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::int3 > > > &vec)'],['../group__functions.html#ga4e10f3b2de7e94bf1d7e6c7c4e5f2573',1,'helios::flatten(const std::vector< std::vector< std::vector< helios::int4 > > > &vec)'],['../group__functions.html#ga0da91aa5e844a63b491026a1b772cea9',1,'helios::flatten(const std::vector< std::vector< std::vector< std::string > > > &vec)'],['../group__functions.html#ga3499b80c2201907203b3457f1fb62c80',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< int > > > > &vec)'],['../group__functions.html#ga024396adf0d734eb2a5dab7150455412',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< uint > > > > &vec)'],['../group__functions.html#gac265cf2f4fcc89d40729f11cccdcd334',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< float > > > > &vec)'],['../group__functions.html#ga1872f5844481b4cd876848cb7282a76a',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< double > > > > &vec)'],['../group__functions.html#ga17ade4062b75a329ec1b59f28d854614',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::vec2 > > > > &vec)'],['../group__functions.html#gad0ba764dc082b4fe92c2edf2b691df06',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::vec3 > > > > &vec)'],['../group__functions.html#ga4bcec227cba69446f0c211a8efa79fa7',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::vec4 > > > > &vec)'],['../group__functions.html#ga228d0ed0a34866dd6ae4be83ec7d3246',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::int2 > > > > &vec)'],['../group__functions.html#gac15b07838d4cd90b7b7f863821d34665',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::int3 > > > > &vec)'],['../group__functions.html#gac6c182edd6f37635bbce1abbb5306a20',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< helios::int4 > > > > &vec)'],['../group__functions.html#ga14adccb0f309850b9d5aa740588b8624',1,'helios::flatten(const std::vector< std::vector< std::vector< std::vector< std::string > > > > &vec)']]], + ['floats_20',['Vector of Floats',['../context_vectors.html#vec3tut',1,'']]], + ['floralbud_21',['FloralBud',['../struct_floral_bud.html',1,'']]], + ['flow_20around_20a_20sphere_22',['3. Laminar flow around a sphere',['../_b_l_conductance_doc.html#BLC3',1,'']]], + ['flow_20over_20bare_20ground_23',['4. Flow over bare ground',['../_b_l_conductance_doc.html#BLC4',1,'']]], + ['flower_20prototypes_24',['Flower Prototypes',['../_plant_architecture_doc.html#FlowerPrototypes',1,'']]], + ['flux_25',['Flux',['../_solar_position_doc.html#LWTheory',1,'Ambient Longwave Flux'],['../_solar_position_doc.html#SolarFluxTheory',1,'Direct and Diffuse Solar Flux'],['../_solar_position_doc.html#LWFlux',1,'Getting the Sky Longwave Flux'],['../_solar_position_doc.html#SolarFlux',1,'Getting the Solar Flux']]], + ['flux_20absorbed_20by_20the_20canopy_20on_20a_20ground_20area_20basis_26',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['flux_20using_20beer_20s_20law_27',['4c. Calculate the theoretical absorbed PAR flux using Beer's law',['../radiation__beers_law.html#tutorial11_absBeer',1,'']]], + ['fluxes_28',['Fluxes',['../_radiation_doc.html#RadTwoSided',1,'Area Basis for Calculating Fluxes'],['../_radiation_doc.html#RadDataInt',1,'Integrating Fluxes']]], + ['focal_5fplane_5fdistance_29',['focal_plane_distance',['../struct_camera_properties.html#a7eae760b6f6729b2e391d0b96d07b209',1,'CameraProperties']]], + ['for_20a_20homogeneous_20canopy_30',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['for_20calculating_20fluxes_31',['Area Basis for Calculating Fluxes',['../_radiation_doc.html#RadTwoSided',1,'']]], + ['for_20each_20grid_20cell_32',['Calculating leaf area for each grid cell',['../_li_d_a_r_doc.html#LiDARleafarea',1,'']]], + ['for_20helios_20programming_33',['Which platform to use for Helios programming?',['../_dependent_software.html#WhichPlatform',1,'']]], + ['for_20linux_20wsl_34',['Manually installing OptiX if using Windows Subsystem for Linux (WSL)',['../_dependent_software.html#OptiXWSL',1,'']]], + ['for_20organ_20sub_20components_35',['Getting Primitive UUIDs for Organ Sub-Components',['../_plant_architecture_doc.html#PlantArchQueryUUIDs',1,'']]], + ['for_20primitives_36',['Retrieving UUIDs for Primitives',['../_canopy_generator_doc.html#CGenUUIDs',1,'']]], + ['forced_20convection_37',['Forced Convection',['../_b_l_conductance_doc.html#BLC1',1,'1. The Polhausen Equation (Laminar Flat Plate, Forced Convection)'],['../_b_l_conductance_doc.html#BLC2',1,'2. Laminar Inclined Plate, Mixed Free-Forced Convection']]], + ['format_38',['Exporting Project to XML File Format',['../_i_o.html#Export',1,'']]], + ['format_39',['4. Exporting to .png format',['../_making_masks.html#Four',1,'']]], + ['formats_40',['Reading Standard Polygon File Formats',['../_i_o.html#Poly',1,'']]], + ['formats_20to_20ply_20using_20blender_41',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['fov_5faspect_5fratio_42',['FOV_aspect_ratio',['../struct_camera_properties.html#ae1e4df4d4612fd652ccd1e57fc71d104',1,'CameraProperties']]], + ['fraction_43',['fraction',['../_aerial_li_d_a_r_doc.html#AerialGroundCover',1,'2D raster ground cover fraction'],['../radiation__beers_law.html#tutorial11_fsunBeer',1,'4e. Calculate the theoretical sunlit area fraction']]], + ['fraction_20from_20the_20simulation_44',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_45',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['free_20forced_20convection_46',['2. Laminar Inclined Plate, Mixed Free-Forced Convection',['../_b_l_conductance_doc.html#BLC2',1,'']]], + ['from_20default_20values_47',['Modifying Geometric Parameters from Default Values',['../_canopy_generator_doc.html#CGenParameterMod',1,'']]], + ['from_20file_48',['from file',['../_aerial_li_d_a_r_doc.html#AerialScanIO',1,'Loading scan data from file'],['../_li_d_a_r_doc.html#ScanIO',1,'Loading scan data from file']]], + ['from_20tabular_20text_20files_49',['Adding Timeseries (Weather) Data from Tabular Text Files',['../_i_o.html#ASCIItimeseries',1,'']]], + ['from_20the_20library_50',['Modifying Parameters of a Plant from the Library',['../_plant_architecture_doc.html#PlantArchBuild_custom',1,'']]], + ['from_20the_20library_20with_20default_20parameters_51',['Loading a Plant from the Library with Default Parameters',['../_plant_architecture_doc.html#PlantArchBuild_default',1,'']]], + ['from_20the_20model_52',['Retrieving Information from the Model',['../_plant_architecture_doc.html#PlantArchQuery',1,'']]], + ['from_20the_20simulation_53',['4d. Calculate the sunlit leaf area fraction from the simulation',['../radiation__beers_law.html#tutorial11_fsun',1,'']]], + ['from_20the_20tree_20library_54',['Adding Trees from the Tree Library',['../_weber_penn_doc.html#WPTadd',1,'']]], + ['fruit_20prototypes_55',['Fruit Prototypes',['../_plant_architecture_doc.html#FruitPrototypes',1,'']]], + ['fruit_5fcolor_56',['fruit_color',['../struct_tomato_parameters.html#a279c4b778fee52501f8daedd4133f469',1,'TomatoParameters']]], + ['fruit_5fradius_57',['fruit_radius',['../struct_tomato_parameters.html#ae1c9e01c2ec65614c5302c8287ecd80a',1,'TomatoParameters::fruit_radius'],['../struct_strawberry_parameters.html#a4dd66f8aa042b1815999674beb9015e6',1,'StrawberryParameters::fruit_radius'],['../struct_walnut_canopy_parameters.html#a620fceb81c9e7cdc0d350f51183f9b8e',1,'WalnutCanopyParameters::fruit_radius']]], + ['fruit_5fsubdivisions_58',['fruit_subdivisions',['../struct_tomato_parameters.html#a42340b46c2de4ed21b1520cbfe7897db',1,'TomatoParameters::fruit_subdivisions'],['../struct_strawberry_parameters.html#a5834190bacb193cf1fba6a1c68aa4116',1,'StrawberryParameters::fruit_subdivisions'],['../struct_walnut_canopy_parameters.html#a4c3ac117f2b32ee15b22ff2e0ec4c325',1,'WalnutCanopyParameters::fruit_subdivisions']]], + ['fruit_5ftexture_5ffile_59',['fruit_texture_file',['../struct_strawberry_parameters.html#aa15e29acb98b00a55cada2dfaca847ac',1,'StrawberryParameters::fruit_texture_file'],['../struct_walnut_canopy_parameters.html#a43de7836434a46b15520a96a80036d89',1,'WalnutCanopyParameters::fruit_texture_file']]], + ['full_20waveform_20lidar_20data_60',['full waveform LiDAR data',['../_aerial_li_d_a_r_doc.html#AerialLiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data'],['../_li_d_a_r_doc.html#LiDARreturn',1,'Difference between discrete-return and full-waveform LiDAR data']]], + ['function_61',['Function',['../_photosynthesis_doc.html#CO2Response',1,'CO2 Response Function'],['../_photosynthesis_doc.html#LightResponse',1,'Light Response Function']]], + ['functionality_62',['functionality',['../_dependent_software.html#SetupPCCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupLinuxCLion',1,'Setting up basic build functionality'],['../_dependent_software.html#SetupMacCLion',1,'Setting up basic build functionality']]], + ['functions_63',['Functions',['../_a_p_i.html#PrimDataHelpers',1,'Primitive Data Query Functions'],['../_weber_penn_doc.html#WPTgL',1,'User-Defined Leaf Angle Distribution Functions']]], + ['functions_64',['Utility functions',['../group__functions.html',1,'']]], + ['fvcb_20model_20independent_20variables_65',['Summary of FvCB Model Independent Variables',['../_photosynthesis_doc.html#FvCBPhotoVars',1,'']]], + ['fvcb_20model_20parameters_66',['FvCB Model Parameters',['../_photosynthesis_doc.html#FvCBSettingPhotoParams',1,'Setting FvCB Model Parameters'],['../_photosynthesis_doc.html#FvCBPhotoParams',1,'Summary of FvCB Model Parameters']]], + ['fzero_67',['fzero',['../global_8h.html#a464923f1888b6ba4dc1a3b6881fa9e80',1,'helios']]] ]; diff --git a/doc/html/search/all_f.js b/doc/html/search/all_f.js index 84c24cfb0..71af03b8b 100644 --- a/doc/html/search/all_f.js +++ b/doc/html/search/all_f.js @@ -1,87 +1,302 @@ var searchData= [ - ['parse_5fdata_5fdouble_0',['parse_data_double',['../classhelios_1_1_x_m_lparser.html#aac51870b44d9e154437bac6e7dc42b8e',1,'helios::XMLparser']]], - ['parse_5fdata_5ffloat_1',['parse_data_float',['../classhelios_1_1_x_m_lparser.html#a3afb5eec57e5843b001767937f36b9c2',1,'helios::XMLparser']]], - ['parse_5fdata_5fint_2',['parse_data_int',['../classhelios_1_1_x_m_lparser.html#a88315be708bb812d033bdbadb9350b5d',1,'helios::XMLparser']]], - ['parse_5fdata_5fint2_3',['parse_data_int2',['../classhelios_1_1_x_m_lparser.html#a0c352c0d3d26a7f29b9a9b3a76dfc8a0',1,'helios::XMLparser']]], - ['parse_5fdata_5fint3_4',['parse_data_int3',['../classhelios_1_1_x_m_lparser.html#a7f7e5d85e2a974300ddb3d843b280e1a',1,'helios::XMLparser']]], - ['parse_5fdata_5fint4_5',['parse_data_int4',['../classhelios_1_1_x_m_lparser.html#af2bcebc1922c7bb9624db407ea7892e9',1,'helios::XMLparser']]], - ['parse_5fdata_5fstring_6',['parse_data_string',['../classhelios_1_1_x_m_lparser.html#a80da32f5fa8a60c77d2414f917469ac6',1,'helios::XMLparser']]], - ['parse_5fdata_5fuint_7',['parse_data_uint',['../classhelios_1_1_x_m_lparser.html#a49b26b22ae7a92decd6de9339140c7ae',1,'helios::XMLparser']]], - ['parse_5fdata_5fvec2_8',['parse_data_vec2',['../classhelios_1_1_x_m_lparser.html#aa64e4581e6f68b40020055691b50b5ad',1,'helios::XMLparser']]], - ['parse_5fdata_5fvec3_9',['parse_data_vec3',['../classhelios_1_1_x_m_lparser.html#a0448bf0bdc7c001f6ac0db02346d1476',1,'helios::XMLparser']]], - ['parse_5fdata_5fvec4_10',['parse_data_vec4',['../classhelios_1_1_x_m_lparser.html#a6bc81fd82cba23fbf7e1d1e5ae472860',1,'helios::XMLparser']]], - ['parse_5fdouble_11',['parse_double',['../global_8h.html#a0209e53a2bdd31c9977de93b27e968b6',1,'helios']]], - ['parse_5ffloat_12',['parse_float',['../global_8h.html#a162c3d8c139c75bac9607b512768b937',1,'helios']]], - ['parse_5fint_13',['parse_int',['../global_8h.html#a6b9de37fd00d939cb9e049a9002e8db0',1,'helios']]], - ['parse_5fint2_14',['parse_int2',['../global_8h.html#a142375b255b9dcb456764558725becc1',1,'helios']]], - ['parse_5fint3_15',['parse_int3',['../global_8h.html#a88766e5973accffb6a548fb321c288df',1,'helios']]], - ['parse_5fnodes_16',['parse_nodes',['../classhelios_1_1_x_m_lparser.html#af00467ad05df3f28bf13814689732696',1,'helios::XMLparser']]], - ['parse_5fobjid_17',['parse_objID',['../classhelios_1_1_x_m_lparser.html#ab66f7f38b4cc8a78eeddf41dfa255898',1,'helios::XMLparser']]], - ['parse_5fradius_18',['parse_radius',['../classhelios_1_1_x_m_lparser.html#a39805884a1c0b15145c73ec57f14b5cd',1,'helios::XMLparser']]], - ['parse_5frgbcolor_19',['parse_RGBcolor',['../global_8h.html#a786c694c21d9115a7c3e18deba6a8732',1,'helios']]], - ['parse_5fsolid_5ffraction_20',['parse_solid_fraction',['../classhelios_1_1_x_m_lparser.html#ab0c6e4fa5a7873ac0e5b085118ea1153',1,'helios::XMLparser']]], - ['parse_5fsubdivisions_21',['parse_subdivisions',['../classhelios_1_1_x_m_lparser.html#a4fedde5cb50beb8206cb16abd31a68f3',1,'helios::XMLparser::parse_subdivisions(const pugi::xml_node &node_data, uint &subdivisions)'],['../classhelios_1_1_x_m_lparser.html#af120c45679d45a3d9be6f78cf571ed29',1,'helios::XMLparser::parse_subdivisions(const pugi::xml_node &node_data, int2 &subdivisions)'],['../classhelios_1_1_x_m_lparser.html#aa7beca055af1ef613195bc87f45cb525',1,'helios::XMLparser::parse_subdivisions(const pugi::xml_node &node_data, int3 &subdivisions)']]], - ['parse_5ftexture_22',['parse_texture',['../classhelios_1_1_x_m_lparser.html#a9c3d37073f119d28de29ff6c83928c35',1,'helios::XMLparser']]], - ['parse_5ftextureuv_23',['parse_textureUV',['../classhelios_1_1_x_m_lparser.html#ae6565b20e7f842b16a3662d5c8c4f00e',1,'helios::XMLparser']]], - ['parse_5ftransform_24',['parse_transform',['../classhelios_1_1_x_m_lparser.html#a4745083d40dd356ec11d4ddf0395947b',1,'helios::XMLparser']]], - ['parse_5fuint_25',['parse_uint',['../global_8h.html#a51430e9e359c2aad9d22d41650b2221a',1,'helios']]], - ['parse_5fvec2_26',['parse_vec2',['../global_8h.html#a3e1e35a11454f9616bad5639ccb49ff3',1,'helios']]], - ['parse_5fvec3_27',['parse_vec3',['../global_8h.html#a2e62477aa096b070d49a68b88427f7a5',1,'helios']]], - ['parse_5fvertices_28',['parse_vertices',['../classhelios_1_1_x_m_lparser.html#afc81fac144aa1b0a3eee3000ee874639',1,'helios::XMLparser']]], - ['parse_5fxml_5ftag_5ffloat_29',['parse_xml_tag_float',['../global_8h.html#a0627913352046dda81c72c9ce234a7e7',1,'helios']]], - ['parse_5fxml_5ftag_5fint_30',['parse_xml_tag_int',['../global_8h.html#afcb3f2f96f4679210db6f68845c87a51',1,'helios']]], - ['parse_5fxml_5ftag_5fstring_31',['parse_xml_tag_string',['../global_8h.html#a8a48786337175ba01ad180ef493f460b',1,'helios']]], - ['parse_5fxml_5ftag_5fvec2_32',['parse_xml_tag_vec2',['../global_8h.html#a6d4fc938af8d1e0db7836a610b7feda0',1,'helios']]], - ['parse_5fxml_5ftag_5fvec3_33',['parse_xml_tag_vec3',['../global_8h.html#a1b7e887e4b92085bc9f52a00227ca1d0',1,'helios']]], - ['peakfinder_34',['peakFinder',['../class_li_d_a_rcloud.html#acffd90677f0584b05b73183747be4e0c',1,'LiDARcloud']]], - ['periodic_5fdepth_35',['periodic_depth',['../struct_per_ray_data.html#ad10350ee3268a1f18cca466d764247a5',1,'PerRayData']]], - ['perraydata_36',['PerRayData',['../struct_per_ray_data.html',1,'']]], - ['petiole_5froll_37',['petiole_roll',['../struct_leaf_prototype.html#a8719e0541fc2360c8f9d889df70642a9',1,'LeafPrototype']]], - ['petiole_5fvertices_38',['petiole_vertices',['../struct_phytomer.html#a63c1deff7ef09e41bddc155cb4e22861',1,'Phytomer']]], - ['phimax_39',['phiMax',['../struct_scan_metadata.html#a29f41bdfbec57a32c60755944b4c0a7f',1,'ScanMetadata']]], - ['phimin_40',['phiMin',['../struct_scan_metadata.html#a019acfcaf7a3ba3fe062af1a59c24513',1,'ScanMetadata']]], - ['photosynthesis_20model_20plugin_20documentation_41',['Photosynthesis Model Plugin Documentation',['../_photosynthesis_doc.html',1,'PlugIns']]], - ['photosynthesismodel_42',['PhotosynthesisModel',['../class_photosynthesis_model.html#a2cfdf33f994c6b6cb84432dcb7e57b3b',1,'PhotosynthesisModel::PhotosynthesisModel()'],['../class_photosynthesis_model.html',1,'PhotosynthesisModel']]], - ['photosynthesismodel_2ecpp_43',['PhotosynthesisModel.cpp',['../_photosynthesis_model_8cpp.html',1,'']]], - ['photosynthesismodel_2eh_44',['PhotosynthesisModel.h',['../_photosynthesis_model_8h.html',1,'']]], - ['photosynthetictemperatureresponseparameters_45',['PhotosyntheticTemperatureResponseParameters',['../struct_photosynthetic_temperature_response_parameters.html',1,'']]], - ['phytomer_46',['Phytomer',['../struct_phytomer.html',1,'']]], - ['phytomer_5fcallback_5ffunction_47',['phytomer_callback_function',['../struct_phytomer_parameters.html#a4460d1a8a04f27ad90908a4752c33cfb',1,'PhytomerParameters']]], - ['phytomer_5fcreation_5ffunction_48',['phytomer_creation_function',['../struct_phytomer_parameters.html#ab97ce4b897b2ec905235ca2efbf8545d',1,'PhytomerParameters']]], - ['phytomerparameters_49',['PhytomerParameters',['../struct_phytomer_parameters.html#a00985415187962da3e18fbc024595277',1,'PhytomerParameters::PhytomerParameters()'],['../struct_phytomer_parameters.html#a23034eb00d8036aad3177e752cf4d8e7',1,'PhytomerParameters::PhytomerParameters(std::minstd_rand0 *generator)'],['../struct_phytomer_parameters.html',1,'PhytomerParameters']]], - ['plant_20architecture_20model_20plugin_20documentation_50',['Plant Architecture Model Plugin Documentation',['../_plant_architecture_doc.html',1,'PlugIns']]], - ['plant_5fcount_51',['plant_count',['../struct_spherical_crowns_canopy_parameters.html#a8ac3d5fbeee86db6289693aa5e14a76f',1,'SphericalCrownsCanopyParameters::plant_count()'],['../struct_bean_parameters.html#af11292adc0e3c6835e6de7f79bf9f58f',1,'BeanParameters::plant_count()'],['../struct_conical_crowns_canopy_parameters.html#a001d43bc659ec5ee0ca8204a7b0d07e3',1,'ConicalCrownsCanopyParameters::plant_count()'],['../struct_base_grape_vine_parameters.html#ad8aa5493feef5a08a5d2ff1b9ce9f513',1,'BaseGrapeVineParameters::plant_count()'],['../struct_white_spruce_canopy_parameters.html#a6df2f849f402259e099b1dafdabc0a2c',1,'WhiteSpruceCanopyParameters::plant_count()'],['../struct_tomato_parameters.html#a3e32aed174650e40d708fb75fc7d6a41',1,'TomatoParameters::plant_count()'],['../struct_strawberry_parameters.html#a5c4fc3e9da6d07f98bc4116f56be8916',1,'StrawberryParameters::plant_count()'],['../struct_walnut_canopy_parameters.html#a0a8fd703c9e0f1beedf990d85038d173',1,'WalnutCanopyParameters::plant_count()'],['../struct_sorghum_canopy_parameters.html#a66cb3200529a5b83416a43267ade724e',1,'SorghumCanopyParameters::plant_count()']]], - ['plant_5fheight_52',['plant_height',['../struct_strawberry_parameters.html#a612148d98514861b02a4def15489206d',1,'StrawberryParameters::plant_height()'],['../struct_tomato_parameters.html#adf398ca857bb113ffa65f3ded195ab23',1,'TomatoParameters::plant_height()']]], - ['plant_5fspacing_53',['plant_spacing',['../struct_bean_parameters.html#a0b814b2a7af5e252859183bdb951d95c',1,'BeanParameters::plant_spacing()'],['../struct_spherical_crowns_canopy_parameters.html#a9be21b26afb7d32b61a236bbe5372acd',1,'SphericalCrownsCanopyParameters::plant_spacing()'],['../struct_conical_crowns_canopy_parameters.html#a605e547c57f08fc248fa39a42cb64877',1,'ConicalCrownsCanopyParameters::plant_spacing()'],['../struct_base_grape_vine_parameters.html#a0904dc05cf1becdeaaa46d9361893506',1,'BaseGrapeVineParameters::plant_spacing()'],['../struct_white_spruce_canopy_parameters.html#a3a46d591c89d1436a2892b76c4703e34',1,'WhiteSpruceCanopyParameters::plant_spacing()'],['../struct_tomato_parameters.html#a979927066ea306b2f5d3897ba0d5b09c',1,'TomatoParameters::plant_spacing()'],['../struct_strawberry_parameters.html#a4df2a5b0e030df75e54f2d519a7b87bf',1,'StrawberryParameters::plant_spacing()'],['../struct_walnut_canopy_parameters.html#a250d9f9ed73cd73c39f9dd6033771fe3',1,'WalnutCanopyParameters::plant_spacing()'],['../struct_sorghum_canopy_parameters.html#a4d2e359bc3e33b9e04019575e8e4e30f',1,'SorghumCanopyParameters::plant_spacing()']]], - ['plant_5fspacing_5fspread_54',['plant_spacing_spread',['../struct_base_grape_vine_parameters.html#a53486547ca872fbad9335c7c612a6c28',1,'BaseGrapeVineParameters']]], - ['plantarchitecture_55',['PlantArchitecture',['../class_plant_architecture.html#ab55c86604c49abcedde90adb395074e9',1,'PlantArchitecture::PlantArchitecture()'],['../class_plant_architecture.html',1,'PlantArchitecture']]], - ['plantarchitecture_2ecpp_56',['PlantArchitecture.cpp',['../_plant_architecture_8cpp.html',1,'']]], - ['plantarchitecture_2eh_57',['PlantArchitecture.h',['../_plant_architecture_8h.html',1,'']]], - ['plantinstance_58',['PlantInstance',['../struct_plant_instance.html',1,'']]], - ['plantlibrary_2ecpp_59',['PlantLibrary.cpp',['../_plant_library_8cpp.html',1,'']]], - ['plotdepthmap_60',['plotDepthMap',['../class_visualizer.html#a133187767033ad1f89c312a2d6f4a533',1,'Visualizer']]], - ['plotinteractive_61',['plotInteractive',['../class_visualizer.html#ab4858ed12fa78fe451569f4bbc27cd7c',1,'Visualizer']]], - ['plotupdate_62',['plotUpdate',['../class_visualizer.html#aa87c684dd84db8d1ae0d12872b1dda22',1,'Visualizer::plotUpdate()'],['../class_visualizer.html#a0c0af4bbebf814a6220f8876f5b13fc3',1,'Visualizer::plotUpdate(bool hide_window)']]], - ['plug_2dins_63',['Plug-ins',['../_plug_ins.html',1,'']]], - ['pnghasalpha_64',['PNGHasAlpha',['../global_8h.html#a07b0dda8b9aee4100e9f6332dbfe7f64',1,'helios']]], - ['pod_5fcolor_65',['pod_color',['../struct_bean_parameters.html#a3b485cb8999c93db10fb30b21826b5be',1,'BeanParameters']]], - ['pod_5flength_66',['pod_length',['../struct_bean_parameters.html#a143874bf6130c1e02315f745dfac5f13',1,'BeanParameters']]], - ['pod_5fsubdivisions_67',['pod_subdivisions',['../struct_bean_parameters.html#a7f447a601152e1428ad752b6f3417fc9',1,'BeanParameters']]], - ['point_5fdistance_68',['point_distance',['../global_8h.html#a4d55bb8abc86cb7dabab1d4e6201a754',1,'helios']]], - ['pointinpolygon_69',['pointInPolygon',['../group__functions.html#gaaa7da223bd02271d4f037b9e5305c023',1,'helios']]], - ['polymesh_70',['Polymesh',['../classhelios_1_1_polymesh.html',1,'helios::Polymesh'],['../classhelios_1_1_polymesh.html#a4a3c02f97dac295f584090ccd622cb94',1,'helios::Polymesh::Polymesh()']]], - ['preprocessspectra_71',['preprocessSpectra',['../struct_camera_calibration.html#a7f11687ea932b11dd32efb4a5a2d79e8',1,'CameraCalibration']]], - ['primitive_5ftype_5fpatch_72',['PRIMITIVE_TYPE_PATCH',['../_context_8h.html#aa2778fcacd9c556a5ce0d9de2ffc1601a6fcd29f0c812849b3eb5bedec52cd744',1,'helios']]], - ['primitive_5ftype_5ftriangle_73',['PRIMITIVE_TYPE_TRIANGLE',['../_context_8h.html#aa2778fcacd9c556a5ce0d9de2ffc1601aeed8005c1692d92beefcbafe8147207c',1,'helios']]], - ['primitive_5ftype_5fvoxel_74',['PRIMITIVE_TYPE_VOXEL',['../_context_8h.html#aa2778fcacd9c556a5ce0d9de2ffc1601a963e2e943d9bd4d5c4648473802cf78c',1,'helios']]], - ['primitiveintersection_2ecu_75',['primitiveIntersection.cu',['../primitive_intersection_8cu.html',1,'']]], - ['primitivetexturehastransparencychannel_76',['primitiveTextureHasTransparencyChannel',['../classhelios_1_1_context.html#a5e10a8afe134f4a55f65c81a9398c69c',1,'helios::Context']]], - ['primitivetype_77',['PrimitiveType',['../_context_8h.html#aa2778fcacd9c556a5ce0d9de2ffc1601',1,'helios']]], - ['printdefaultvaluereport_78',['printDefaultValueReport',['../class_stomatal_conductance_model.html#a28c60dbd86a0aa2c3b8a90704205abde',1,'StomatalConductanceModel::printDefaultValueReport(const std::vector< uint > &UUIDs) const'],['../class_stomatal_conductance_model.html#a66e680118d189c0ed79ca45636262a35',1,'StomatalConductanceModel::printDefaultValueReport() const'],['../class_photosynthesis_model.html#a5de185fd3e46ef009c362b116e3d7771',1,'PhotosynthesisModel::printDefaultValueReport(const std::vector< uint > &UUIDs) const'],['../class_photosynthesis_model.html#ab4ed6afbb715d143cedf136ff355c1b3',1,'PhotosynthesisModel::printDefaultValueReport() const'],['../class_energy_balance_model.html#aa8f66c144733765289f7748dee193d5e',1,'EnergyBalanceModel::printDefaultValueReport(const std::vector< uint > &UUIDs) const'],['../class_energy_balance_model.html#a058d24583430bffdf78b53a8f9a5a851',1,'EnergyBalanceModel::printDefaultValueReport() const']]], - ['printobjectinfo_79',['printObjectInfo',['../classhelios_1_1_context.html#a963fbdd1d4c3d270d2eb8f49a22b274a',1,'helios::Context']]], - ['printprimitiveinfo_80',['printPrimitiveInfo',['../classhelios_1_1_context.html#a355617da1f3faa4d01ca4d95425e9c0b',1,'helios::Context']]], - ['printwindow_81',['printWindow',['../class_visualizer.html#a1840b4285caa645e6b8b28144478cfe1',1,'Visualizer::printWindow(const char *outfile)'],['../class_visualizer.html#a2db00c518bf610fdcb70e0ec5a5a0e32',1,'Visualizer::printWindow()']]], - ['prospect_82',['PROSPECT',['../class_leaf_optics.html#a8af86e8cce4d721230ddc746580b7dcf',1,'LeafOptics']]], - ['prototype_5ffunction_83',['prototype_function',['../struct_leaf_prototype.html#ab709ab7749bf4ad562946441bc7a937e',1,'LeafPrototype']]] + ['g_0',['g',['../structhelios_1_1_r_g_bcolor.html#ae002d220d8695538760eee2a6c4e9023',1,'helios::RGBcolor::g'],['../structhelios_1_1_r_g_b_acolor.html#ac018f8ed01b4d4128a68ebe42e1e6a00',1,'helios::RGBAcolor::g']]], + ['g_20b_20a_20color_20vectors_1',['R-G-B(-A) color vectors',['../_a_p_i.html#RGB',1,'']]], + ['g_20b_20code_2',['Coloring by r-g-b code',['../_visualizer_doc.html#ColoringRGB',1,'']]], + ['g_20theta_3',['4a. Calculate G(theta)',['../radiation__beers_law.html#tutorial11_G',1,'']]], + ['gapfillmisses_4',['gapfillMisses',['../class_li_d_a_rcloud.html#a53b80def6bff07231b8d2b10eb3e0330',1,'LiDARcloud::gapfillMisses()'],['../class_li_d_a_rcloud.html#a544384a19e7d060c85eb5a8daa1aeef4',1,'LiDARcloud::gapfillMisses(uint scanID)'],['../class_li_d_a_rcloud.html#aa70d9c9fb6ca8c20a818c2bc68d39077',1,'LiDARcloud::gapfillMisses(uint scanID, const bool gapfill_grid_only, const bool add_flags)']]], + ['general_20overview_5',['General Overview',['../_weber_penn_doc.html#WPTOverview',1,'']]], + ['general_20tree_20shape_6',['Trunk and general tree shape',['../_weber_penn_doc.html#WPTreeShape',1,'']]], + ['generateheightmodel_7',['generateHeightModel',['../class_aerial_li_d_a_rcloud.html#afc44503e2a6eb986fa79b5af56069468',1,'AerialLiDARcloud']]], + ['generating_20synthetic_20simulated_20lidar_20data_8',['Generating Synthetic (Simulated) LiDAR Data',['../_li_d_a_r_doc.html#LiDARsynthetic',1,'']]], + ['generator_9',['Seeding the Random Number Generator',['../_canopy_generator_doc.html#CGenSeed',1,'']]], + ['generator_20plugin_20documentation_10',['Canopy Generator Plugin Documentation',['../_canopy_generator_doc.html',1,'PlugIns']]], + ['geometric_20parameters_20from_20default_20values_11',['Modifying Geometric Parameters from Default Values',['../_canopy_generator_doc.html#CGenParameterMod',1,'']]], + ['geometric_20parameters_20of_20the_20shoot_12',['Geometric Parameters of the Shoot',['../_plant_architecture_doc.html#ShootParametersGeom',1,'']]], + ['geometric_20primitives_13',['Geometric Primitives',['../group__primitives.html',1,'']]], + ['geometries_20and_20parameters_14',['Available Geometries and Parameters',['../_canopy_generator_doc.html#CGenGeometries',1,'']]], + ['geometry_15',['Geometry',['../_visualizer_doc.html#AddGeom',1,'Adding Geometry'],['../_a_p_i.html#Compound',1,'Compound Geometry'],['../_a_p_i.html#Geom',1,'Geometry'],['../_plant_architecture_doc.html#PlantArchQueryobjIDs',1,'Getting Object IDs and Primitive UUIDs of Model Geometry'],['../_visualizer_doc.html#PlotWindow',1,'Plotting Geometry'],['../context_primitives.html',1,'Tutorial 2: Working with Context Geometry']]], + ['geometry_16',['geometry',['../_visualizer_doc.html#ContextGeom',1,'Automatically importing Context geometry'],['../visualizer_pdata.html#Tutorial8_geom',1,'Model geometry']]], + ['geometry_20and_20data_17',['Model Geometry and Data',['../_overview.html#ModelGeom',1,'']]], + ['geometry_20creation_18',['geometry creation',['../radiation_basics.html#Tutorial10_geom',1,'1. Model geometry creation'],['../radiation__beers_law.html#tutorial11_geom',1,'1. Model geometry creation']]], + ['geometry_20to_20the_20visualizer_19',['Step 2. Add geometry to the Visualizer',['../visualizer_basics.html#vis_step2',1,'']]], + ['germination_5fprobability_20',['germination_probability',['../struct_bean_parameters.html#a9bec1a611d5100e6e7417b70a47cbe06',1,'BeanParameters']]], + ['getallcameralabels_21',['getAllCameraLabels',['../class_radiation_model.html#a4719caf3bacb35b9d58dc853b56d6a0b',1,'RadiationModel']]], + ['getallfloweruuids_22',['getAllFlowerUUIDs',['../class_plant_architecture.html#a056eb82b161cc72288da7844d35f44f5',1,'PlantArchitecture']]], + ['getallfruituuids_23',['getAllFruitUUIDs',['../class_plant_architecture.html#aa4da1e4c28959b7f5540aa5ff160b2d1',1,'PlantArchitecture']]], + ['getallinternodeuuids_24',['getAllInternodeUUIDs',['../class_plant_architecture.html#a70553116dc967d84f17063dd9d734db9',1,'PlantArchitecture']]], + ['getallleafuuids_25',['getAllLeafUUIDs',['../class_plant_architecture.html#a5431bd0712f4def9fd27cad03065d755',1,'PlantArchitecture']]], + ['getallobjectids_26',['getAllObjectIDs',['../classhelios_1_1_context.html#a2ef355a3298b21313700acec64232e22',1,'helios::Context::getAllObjectIDs()'],['../class_plant_architecture.html#a9069b1d637752f0a74ded148ae1706b0',1,'PlantArchitecture::getAllObjectIDs() const']]], + ['getallpeduncleuuids_27',['getAllPeduncleUUIDs',['../class_plant_architecture.html#ad46693fc275721338c8f24cb764b2bf1',1,'PlantArchitecture']]], + ['getallpetioleuuids_28',['getAllPetioleUUIDs',['../class_plant_architecture.html#afd1c00e6b5b6aa45e212aeb6b68cb825',1,'PlantArchitecture']]], + ['getallplantobjectids_29',['getAllPlantObjectIDs',['../class_plant_architecture.html#acf9855048c790d30d8d4de7fa1dc3550',1,'PlantArchitecture']]], + ['getallplantuuids_30',['getAllPlantUUIDs',['../class_plant_architecture.html#a3bdffb4e53fe0da836a40de80946d31f',1,'PlantArchitecture']]], + ['getalluuids_31',['getAllUUIDs',['../classhelios_1_1_context.html#a98516632daccf958cca6b5b6582310bb',1,'helios::Context::getAllUUIDs()'],['../class_canopy_generator.html#a8e395619077d656e206f4159f0bf8d34',1,'CanopyGenerator::getAllUUIDs()'],['../class_plant_architecture.html#afec06c56ae296984727c90413511cf6a',1,'PlantArchitecture::getAllUUIDs()'],['../class_weber_penn_tree.html#a19e16f9a51493680afebc38f3c434400',1,'WeberPennTree::getAllUUIDs()']]], + ['getambientlongwaveflux_32',['getAmbientLongwaveFlux',['../class_solar_position.html#a30ee555eedece8b7e19855877a74da71',1,'SolarPosition']]], + ['getarea_33',['getArea',['../classhelios_1_1_compound_object.html#a8bb518f6166e2a2831a68a7626787ac1',1,'helios::CompoundObject']]], + ['getaxisunitvector_34',['getAxisUnitVector',['../classhelios_1_1_cone.html#a60fc92fbb15149017956449123c0e4d0',1,'helios::Cone']]], + ['getbmfcoefficientsfromlibrary_35',['getBMFCoefficientsFromLibrary',['../class_stomatal_conductance_model.html#ada09940a1cc67dbfc0192f6e0a50c967',1,'StomatalConductanceModel']]], + ['getboxobjectcenter_36',['getBoxObjectCenter',['../classhelios_1_1_context.html#af73c44dace71ec805136b7d6ad6095a9',1,'helios::Context']]], + ['getboxobjectpointer_37',['getBoxObjectPointer',['../classhelios_1_1_context.html#a1ecbb5a8cfa6764bade6e0650d2f6990',1,'helios::Context']]], + ['getboxobjectsize_38',['getBoxObjectSize',['../classhelios_1_1_context.html#a4e5799ba4b6a0a889f446bef9e4d3dc0',1,'helios::Context']]], + ['getboxobjectsubdivisioncount_39',['getBoxObjectSubdivisionCount',['../classhelios_1_1_context.html#a258f524d38cdeb5f6c83a7f387608490',1,'helios::Context']]], + ['getboxobjectvolume_40',['getBoxObjectVolume',['../classhelios_1_1_context.html#ae31cc8855aacb6380a288a4b7fa8db82',1,'helios::Context']]], + ['getbranchuuids_41',['getBranchUUIDs',['../class_canopy_generator.html#ab7115aaa287346b9c8e7854bd66f8b5f',1,'CanopyGenerator::getBranchUUIDs(uint PlantID)'],['../class_canopy_generator.html#a7db6f05ab623b77de4e8a81dc132e914',1,'CanopyGenerator::getBranchUUIDs()'],['../class_weber_penn_tree.html#a813cb8959272b535050dc97aa49d3ed3',1,'WeberPennTree::getBranchUUIDs()']]], + ['getcameralookat_42',['getCameraLookat',['../class_radiation_model.html#a68c8736e58c7daf440ff9c93bb00522d',1,'RadiationModel']]], + ['getcameraorientation_43',['getCameraOrientation',['../class_radiation_model.html#a0b67b056aa1f2b5e6c42a06e358f4eb8',1,'RadiationModel']]], + ['getcameraposition_44',['getCameraPosition',['../class_radiation_model.html#a6785deae272a9464920030fc3f124bc3',1,'RadiationModel']]], + ['getcameraresponsescale_45',['getCameraResponseScale',['../struct_camera_calibration.html#a18eff4a7ecab1038f27b68c3963a5513',1,'CameraCalibration::getCameraResponseScale()'],['../class_radiation_model.html#adb5a74547d51a18018d3daeba0ec5f3c',1,'RadiationModel::getCameraResponseScale()']]], + ['getcellcenter_46',['getCellCenter',['../class_aerial_li_d_a_rcloud.html#a6e83c157d63d12253af3b81b995e1a33',1,'AerialLiDARcloud::getCellCenter()'],['../class_li_d_a_rcloud.html#a6e2ce01abb33cc0f80b2aa653ac6a445',1,'LiDARcloud::getCellCenter()']]], + ['getcellcoverfraction_47',['getCellCoverFraction',['../class_aerial_li_d_a_rcloud.html#ac714e2231b63d1455237662661590b16',1,'AerialLiDARcloud']]], + ['getcellglobalanchor_48',['getCellGlobalAnchor',['../class_li_d_a_rcloud.html#ad1ad4f851b5b7fcbf5b088b161aed83e',1,'LiDARcloud']]], + ['getcellgroundheight_49',['getCellGroundHeight',['../class_aerial_li_d_a_rcloud.html#a3b9d9ac013a041c30d58e68e5dc92bee',1,'AerialLiDARcloud']]], + ['getcellgtheta_50',['getCellGtheta',['../class_li_d_a_rcloud.html#a54351e18e3f4155e9d55eb02bd63c722',1,'LiDARcloud']]], + ['getcellleafarea_51',['getCellLeafArea',['../class_aerial_li_d_a_rcloud.html#a9f90891b20b8996e983e66640684b6cc',1,'AerialLiDARcloud::getCellLeafArea()'],['../class_li_d_a_rcloud.html#ac9d20a35bdb7ee2d45490ac1cd520117',1,'LiDARcloud::getCellLeafArea()']]], + ['getcellleafareadensity_52',['getCellLeafAreaDensity',['../class_aerial_li_d_a_rcloud.html#a4ca0903b642daffdff27e69a172c96b5',1,'AerialLiDARcloud::getCellLeafAreaDensity()'],['../class_li_d_a_rcloud.html#a3c1744984481f9629dc1371291fa397e',1,'LiDARcloud::getCellLeafAreaDensity()']]], + ['getcellmaximumhitheight_53',['getCellMaximumHitHeight',['../class_aerial_li_d_a_rcloud.html#a00f6479153ac2025031b70bd5637b65b',1,'AerialLiDARcloud']]], + ['getcellprimitives_54',['getCellPrimitives',['../class_voxel_intersection.html#a7d50123db71cf5cd7c7cc4582abd5cb2',1,'VoxelIntersection']]], + ['getcellrbar_55',['getCellRbar',['../class_aerial_li_d_a_rcloud.html#ae35261c7fc1553cb15fb318a2b14a3b2',1,'AerialLiDARcloud']]], + ['getcellrotation_56',['getCellRotation',['../class_li_d_a_rcloud.html#aa2cba1d0bcd9a2ae35d9a5be03832efc',1,'LiDARcloud']]], + ['getcellsize_57',['getCellSize',['../class_aerial_li_d_a_rcloud.html#a5bf5379ee229ebb51fdc8195af8cf3e7',1,'AerialLiDARcloud::getCellSize()'],['../class_li_d_a_rcloud.html#a6662330b95ee7ee77ea6647871695c55',1,'LiDARcloud::getCellSize()']]], + ['getcelltransmissionprobability_58',['getCellTransmissionProbability',['../class_aerial_li_d_a_rcloud.html#a98770b70c510e7611fb171d3fe920554',1,'AerialLiDARcloud']]], + ['getcellvegetationheight_59',['getCellVegetationHeight',['../class_aerial_li_d_a_rcloud.html#a12fe426a267cbef9982138537198558a',1,'AerialLiDARcloud']]], + ['getcenter_60',['getCenter',['../classhelios_1_1_tile.html#a18178d0280f8ecc1149663558947ca06',1,'helios::Tile::getCenter()'],['../classhelios_1_1_sphere.html#a48eada17c3dab899a91158f1424518d6',1,'helios::Sphere::getCenter()'],['../classhelios_1_1_box.html#a96e72a40ff113d6a6b463fe8c60b672a',1,'helios::Box::getCenter()'],['../classhelios_1_1_disk.html#ae8ed884a95cbfa2440e3bd9f8e3e4057',1,'helios::Disk::getCenter()']]], + ['getconeobjectaxisunitvector_61',['getConeObjectAxisUnitVector',['../classhelios_1_1_context.html#acaa3fb162b17cb7f912162f5d4be894e',1,'helios::Context']]], + ['getconeobjectlength_62',['getConeObjectLength',['../classhelios_1_1_context.html#ad2b045f361aa8e8596bcf325c1707a25',1,'helios::Context']]], + ['getconeobjectnode_63',['getConeObjectNode',['../classhelios_1_1_context.html#a54e9f0b7c5014a37cd9d5bf74e7d5935',1,'helios::Context']]], + ['getconeobjectnoderadii_64',['getConeObjectNodeRadii',['../classhelios_1_1_context.html#ade2608274b311c809d46bb13943b9e4e',1,'helios::Context']]], + ['getconeobjectnoderadius_65',['getConeObjectNodeRadius',['../classhelios_1_1_context.html#af5acc5647e6bf9cd1649da1dec677110',1,'helios::Context']]], + ['getconeobjectnodes_66',['getConeObjectNodes',['../classhelios_1_1_context.html#a8c4ec2d90ccd3d44a97597ecd80d78b6',1,'helios::Context']]], + ['getconeobjectpointer_67',['getConeObjectPointer',['../classhelios_1_1_context.html#a3221051ea9c1025e8fb00d9dec01839f',1,'helios::Context']]], + ['getconeobjectsubdivisioncount_68',['getConeObjectSubdivisionCount',['../classhelios_1_1_context.html#a1ff97eb95d5896e096156320f5bd5ff0',1,'helios::Context']]], + ['getconeobjectvolume_69',['getConeObjectVolume',['../classhelios_1_1_context.html#af6c1c571171be2604822a8df44d2349c',1,'helios::Context']]], + ['getcurrentcolormap_70',['getCurrentColormap',['../class_visualizer.html#ae2bba6102a283a31ec4f5780817a15da',1,'Visualizer']]], + ['getcurrentphytomerparameters_71',['getCurrentPhytomerParameters',['../class_plant_architecture.html#aaba5ecb6c069be56b3706a4060f5ff49',1,'PlantArchitecture']]], + ['getcurrentshootparameters_72',['getCurrentShootParameters',['../class_plant_architecture.html#aa696281e805e8879a78dacdf4354ff38',1,'PlantArchitecture::getCurrentShootParameters(const std::string &shoot_type_label)'],['../class_plant_architecture.html#a190d91f02c5cfcfad036879460b2e495',1,'PlantArchitecture::getCurrentShootParameters()']]], + ['getdate_73',['getDate',['../classhelios_1_1_context.html#a95dd5bc221cd8bcb4efabd0122d59b4f',1,'helios::Context']]], + ['getdepthmap_74',['getDepthMap',['../class_visualizer.html#a7c6362d7dc0f0bd4bba53195ce92b84e',1,'Visualizer']]], + ['getdiffuseflux_75',['getDiffuseFlux',['../class_radiation_model.html#af8450f2308aee38272b4aef87f0c547b',1,'RadiationModel']]], + ['getdiffusefraction_76',['getDiffuseFraction',['../class_solar_position.html#af8dbd15453ce775dab5b2c5a49b1c93b',1,'SolarPosition']]], + ['getdiskobjectcenter_77',['getDiskObjectCenter',['../classhelios_1_1_context.html#a213aea1539e0bb38965cf2953b1831df',1,'helios::Context']]], + ['getdiskobjectpointer_78',['getDiskObjectPointer',['../classhelios_1_1_context.html#a17c1256a1f57fbae1f34e04b66b76ca8',1,'helios::Context']]], + ['getdiskobjectsize_79',['getDiskObjectSize',['../classhelios_1_1_context.html#acee51918d3ee1d9892e5a51106a625d9',1,'helios::Context']]], + ['getdiskobjectsubdivisioncount_80',['getDiskObjectSubdivisionCount',['../classhelios_1_1_context.html#a86ffc9a6cdcd3851231c64dcc152123c',1,'helios::Context']]], + ['getdomainboundingbox_81',['getDomainBoundingBox',['../classhelios_1_1_context.html#a8690412a63d1eff69e679e48d03c9838',1,'helios::Context::getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const'],['../classhelios_1_1_context.html#ad4ac166bb01547d1cefb1ace7a9b966d',1,'helios::Context::getDomainBoundingBox(const std::vector< uint > &UUIDs, helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const'],['../class_visualizer.html#ae9c98dee278e9bcd5f85b871ff8ddfe5',1,'Visualizer::getDomainBoundingBox(helios::vec2 &xbounds, helios::vec2 &ybounds, helios::vec2 &zbounds) const']]], + ['getdomainboundingradius_82',['getDomainBoundingRadius',['../class_visualizer.html#a783739e072baeafc943a077dcb1cc3d5',1,'Visualizer']]], + ['getdomainboundingsphere_83',['getDomainBoundingSphere',['../classhelios_1_1_context.html#a3a6b0d25c5d9febb17787982c9f09d63',1,'helios::Context::getDomainBoundingSphere(helios::vec3 &center, float &radius) const'],['../classhelios_1_1_context.html#af3e048e969f06e3a0cf36ed3d76766ca',1,'helios::Context::getDomainBoundingSphere(const std::vector< uint > &UUIDs, helios::vec3 &center, float &radius) const']]], + ['getempiricalmodelcoefficients_84',['getEmpiricalModelCoefficients',['../class_photosynthesis_model.html#a86094d579852c2dc846acc2a97e6ac44',1,'PhotosynthesisModel']]], + ['getfarquharcoefficientsfromlibrary_85',['getFarquharCoefficientsFromLibrary',['../class_photosynthesis_model.html#ae40570ef642d5d4dc070dce9ba093f16',1,'PhotosynthesisModel']]], + ['getfarquharmodelcoefficients_86',['getFarquharModelCoefficients',['../class_photosynthesis_model.html#aeab92cd73298c5f89626b30ce8c41cf9',1,'PhotosynthesisModel']]], + ['getfileextension_87',['getFileExtension',['../global_8h.html#a58e660bb08e1ce13466825ae666467ef',1,'helios']]], + ['getfilename_88',['getFileName',['../global_8h.html#a63bd49091fdab0e262b051f61fb9a902',1,'helios']]], + ['getfilepath_89',['getFilePath',['../global_8h.html#ad76f15d03b511d1bf5123d64d804d6e8',1,'helios']]], + ['getfilestem_90',['getFileStem',['../global_8h.html#a9fff8cb6c3474de479f81c12f173d3ed',1,'helios']]], + ['getframebuffersize_91',['getFramebufferSize',['../class_visualizer.html#ab3b0261a21e7f552d55e4d2fda55f94f',1,'Visualizer']]], + ['getfruituuids_92',['getFruitUUIDs',['../class_canopy_generator.html#a8ab509f22c4bdffd57b44f67f43ce728',1,'CanopyGenerator::getFruitUUIDs(uint PlantID)'],['../class_canopy_generator.html#abdcc431929f98e57db4b9ed2dc26a616',1,'CanopyGenerator::getFruitUUIDs()']]], + ['getglobaldata_93',['getGlobalData',['../classhelios_1_1_context.html#a972fa4a45b2775f6047d41b88dc69d03',1,'helios::Context::getGlobalData(const char *label, int &data) const'],['../classhelios_1_1_context.html#a175d9a1955f428b0f2d6b11ab3b17659',1,'helios::Context::getGlobalData(const char *label, std::vector< int > &data) const'],['../classhelios_1_1_context.html#a98cbb0d37dc9fafaad14184cb889534f',1,'helios::Context::getGlobalData(const char *label, uint &data) const'],['../classhelios_1_1_context.html#a931a92ba7e9916c64d164bc1f29ff754',1,'helios::Context::getGlobalData(const char *label, std::vector< uint > &data) const'],['../classhelios_1_1_context.html#ac1f5f6c3f24577cd5c4657c441483425',1,'helios::Context::getGlobalData(const char *label, float &data) const'],['../classhelios_1_1_context.html#a863264ab1339ba35c3754bfbf4c69eec',1,'helios::Context::getGlobalData(const char *label, std::vector< float > &data) const'],['../classhelios_1_1_context.html#a8ec49c820f10831b4b27059d4d1749d6',1,'helios::Context::getGlobalData(const char *label, double &data) const'],['../classhelios_1_1_context.html#a66e7d689b62d9ad47fb85ad45664c97f',1,'helios::Context::getGlobalData(const char *label, std::vector< double > &data) const'],['../classhelios_1_1_context.html#a6f4d6971c05d78aff30b92d277014b9f',1,'helios::Context::getGlobalData(const char *label, helios::vec2 &data) const'],['../classhelios_1_1_context.html#afc90a3d0143273e436541fc3bc9c5554',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::vec2 > &data) const'],['../classhelios_1_1_context.html#a990fdccf51979e235a1acba08e54583b',1,'helios::Context::getGlobalData(const char *label, helios::vec3 &data) const'],['../classhelios_1_1_context.html#a0376e2dc456e481bd055d5a84b7785f2',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::vec3 > &data) const'],['../classhelios_1_1_context.html#a3f621b536c3585d7f808698e2f0cd826',1,'helios::Context::getGlobalData(const char *label, helios::vec4 &data) const'],['../classhelios_1_1_context.html#ab0f329c8584b002dda2d77719073bf5d',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::vec4 > &data) const'],['../classhelios_1_1_context.html#aea16d4845e23fe44ae1da4c032ea57e3',1,'helios::Context::getGlobalData(const char *label, helios::int2 &data) const'],['../classhelios_1_1_context.html#a609563835616233b15fd263bb2e8857d',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::int2 > &data) const'],['../classhelios_1_1_context.html#aba7c4fe63193509f40ca6682cddfa9a3',1,'helios::Context::getGlobalData(const char *label, helios::int3 &data) const'],['../classhelios_1_1_context.html#abbc6d463f6d722fca56ad219c8278c16',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::int3 > &data) const'],['../classhelios_1_1_context.html#a2b2f0570e50711f34bb24dc01c8a7b43',1,'helios::Context::getGlobalData(const char *label, helios::int4 &data) const'],['../classhelios_1_1_context.html#ad08d9d2bea2c93b14ae2b3678aea2e29',1,'helios::Context::getGlobalData(const char *label, std::vector< helios::int4 > &data) const'],['../classhelios_1_1_context.html#a890583b0897bfcd730d137838fa7e155',1,'helios::Context::getGlobalData(const char *label, std::string &data) const'],['../classhelios_1_1_context.html#a0572c1557ec60ae7389072e8ab3c2113',1,'helios::Context::getGlobalData(const char *label, std::vector< std::string > &data) const']]], + ['getglobaldatasize_94',['getGlobalDataSize',['../classhelios_1_1_context.html#a96d1060d1329dc467380ce2e5eafd559',1,'helios::Context']]], + ['getglobaldatatype_95',['getGlobalDataType',['../classhelios_1_1_context.html#a94bf0b919e5e6034fa45fbae2f575947',1,'helios::Context']]], + ['getgridboundingbox_96',['getGridBoundingBox',['../class_li_d_a_rcloud.html#a041ac4ba388c407a35b7f895029038e6',1,'LiDARcloud']]], + ['getgridcellcount_97',['getGridCellCount',['../class_li_d_a_rcloud.html#a28297a71becd69b30820d69b110fcc90',1,'LiDARcloud']]], + ['getgridcenter_98',['getGridCenter',['../class_aerial_li_d_a_rcloud.html#ad639b0d2337b74b1bd4949cc2aba88e0',1,'AerialLiDARcloud']]], + ['getgridextent_99',['getGridExtent',['../class_aerial_li_d_a_rcloud.html#a85ea1ea67ed12f2bbcfc28ef9a78dd77',1,'AerialLiDARcloud']]], + ['getgridresolution_100',['getGridResolution',['../class_aerial_li_d_a_rcloud.html#ae750e548d565d6305e600c5af8360fdb',1,'AerialLiDARcloud']]], + ['getgridrotation_101',['getGridRotation',['../class_aerial_li_d_a_rcloud.html#aace3b3baae4a75be461eb31f617ee695',1,'AerialLiDARcloud']]], + ['getgrounduuids_102',['getGroundUUIDs',['../class_canopy_generator.html#a6f0003d6ca29cbb56657442c7a48ad14',1,'CanopyGenerator']]], + ['gethitboundingbox_103',['getHitBoundingBox',['../class_aerial_li_d_a_rcloud.html#a74b0e833ecb6ee1b3ce3010f3d38d74d',1,'AerialLiDARcloud::getHitBoundingBox()'],['../class_li_d_a_rcloud.html#a45bc37a4d26eb74a944c594a7f3cb54b',1,'LiDARcloud::getHitBoundingBox()']]], + ['gethitcolor_104',['getHitColor',['../class_aerial_li_d_a_rcloud.html#af8f49444eb1d166837c322d03ea1cbfa',1,'AerialLiDARcloud::getHitColor()'],['../class_li_d_a_rcloud.html#aafafed9102966992d3cfb3772fa2ada1',1,'LiDARcloud::getHitColor()']]], + ['gethitcount_105',['getHitCount',['../class_aerial_li_d_a_rcloud.html#aaf287ef121543f10e9e73579bf77281a',1,'AerialLiDARcloud::getHitCount()'],['../class_li_d_a_rcloud.html#a691fd3bbd1262d80e10a674c82c6f568',1,'LiDARcloud::getHitCount()']]], + ['gethitdata_106',['getHitData',['../class_aerial_li_d_a_rcloud.html#a240af79b825bc886e886ff7ff0e0476c',1,'AerialLiDARcloud::getHitData()'],['../class_li_d_a_rcloud.html#a274ef68850afa3f288bb648d9fd6a59a',1,'LiDARcloud::getHitData()']]], + ['gethitgridcell_107',['getHitGridCell',['../class_aerial_li_d_a_rcloud.html#a26bc32e67d3195222f11fb72fb7d63da',1,'AerialLiDARcloud::getHitGridCell()'],['../class_li_d_a_rcloud.html#a251c4f3bbefdd07212cd8fe1037dc0d7',1,'LiDARcloud::getHitGridCell(uint index) const']]], + ['gethitindex_108',['getHitIndex',['../class_li_d_a_rcloud.html#a34eee980f365fdd5469a0cc6ee3a36f5',1,'LiDARcloud']]], + ['gethitraydir_109',['getHitRaydir',['../class_aerial_li_d_a_rcloud.html#ac0f8ba05e24d146d01ee2af0fb9ece7d',1,'AerialLiDARcloud::getHitRaydir()'],['../class_li_d_a_rcloud.html#aa91258bd97d6fcacd3313d8b55cceed4',1,'LiDARcloud::getHitRaydir()']]], + ['gethitscanid_110',['getHitScanID',['../class_aerial_li_d_a_rcloud.html#aaa2bbd15dad66355175fb733630456a4',1,'AerialLiDARcloud::getHitScanID()'],['../class_li_d_a_rcloud.html#a5510b2a0d0a878930e9f11331494bf41',1,'LiDARcloud::getHitScanID()']]], + ['gethitxyz_111',['getHitXYZ',['../class_aerial_li_d_a_rcloud.html#a3363ac3ffff1bbdd164b6074010d75ba',1,'AerialLiDARcloud::getHitXYZ()'],['../class_li_d_a_rcloud.html#ac5f234b6200419f10fe82c9abe409cbd',1,'LiDARcloud::getHitXYZ()']]], + ['getimageresolution_112',['getImageResolution',['../classhelios_1_1_texture.html#a4e106c0c80f0c4c065e5ff71193aaeab',1,'helios::Texture']]], + ['getimageresolutionjpeg_113',['getImageResolutionJPEG',['../global_8h.html#a94c80cbffdccaea7991b439acf8e9eb4',1,'helios']]], + ['getjuliandate_114',['getJulianDate',['../classhelios_1_1_context.html#a23f2611ed71eeefe8cf772cab98de4d4',1,'helios::Context']]], + ['getleafspectra_115',['getLeafSpectra',['../class_leaf_optics.html#a6b9fa9b6fb34fe7738e425b19118005a',1,'LeafOptics']]], + ['getleafuuids_116',['getLeafUUIDs',['../class_canopy_generator.html#a3509012720b5fd256a14bc2924a3b164',1,'CanopyGenerator::getLeafUUIDs(uint PlantID)'],['../class_canopy_generator.html#a73680976a2826f0b5dbf567551fd5593',1,'CanopyGenerator::getLeafUUIDs()'],['../class_weber_penn_tree.html#af4368c1f900503f6d72f0c0e569fe8e5',1,'WeberPennTree::getLeafUUIDs()']]], + ['getlength_117',['getLength',['../classhelios_1_1_tube.html#ad3c194a0f9977e212ac425aefe4032bf',1,'helios::Tube::getLength()'],['../classhelios_1_1_cone.html#ada36b3fe4850f16c4dfa58c38a8da80c',1,'helios::Cone::getLength()']]], + ['getloadedxmlfiles_118',['getLoadedXMLFiles',['../classhelios_1_1_context.html#a48a8a843b99c36ad357dba13ee6f1774',1,'helios::Context']]], + ['getlocation_119',['getLocation',['../classhelios_1_1_context.html#af4b1fa52419259a0c8a2faeb7484a439',1,'helios::Context']]], + ['getmonthstring_120',['getMonthString',['../classhelios_1_1_context.html#a6189f6ab35669f4fefde571ec362247c',1,'helios::Context']]], + ['getnodecolors_121',['getNodeColors',['../classhelios_1_1_tube.html#aae753418cb304e97c296240dc9919388',1,'helios::Tube']]], + ['getnodecoordinate_122',['getNodeCoordinate',['../classhelios_1_1_cone.html#a4f6ddd7fd23d61528ada9df1e333ad17',1,'helios::Cone']]], + ['getnodecoordinates_123',['getNodeCoordinates',['../classhelios_1_1_cone.html#a9eaab4331e325c85ce9f4c101135c966',1,'helios::Cone']]], + ['getnoderadii_124',['getNodeRadii',['../classhelios_1_1_tube.html#a29823b956371d22b35add97fc6831cab',1,'helios::Tube::getNodeRadii()'],['../classhelios_1_1_cone.html#adc5370734810e4b526bf0d42e143ecf8',1,'helios::Cone::getNodeRadii() const']]], + ['getnoderadius_125',['getNodeRadius',['../classhelios_1_1_cone.html#a2334ca87f6bb556b411c8a51476b523c',1,'helios::Cone']]], + ['getnodes_126',['getNodes',['../classhelios_1_1_tube.html#ab55e8f7d7a948941027f169d714e365b',1,'helios::Tube']]], + ['getnormal_127',['getNormal',['../classhelios_1_1_tile.html#ab8c70daf8c14bc60caf499b5adce301c',1,'helios::Tile']]], + ['getobjectarea_128',['getObjectArea',['../classhelios_1_1_context.html#aac46a608ec7719e4702cd861667925f1',1,'helios::Context']]], + ['getobjectboundingbox_129',['getObjectBoundingBox',['../classhelios_1_1_context.html#a1b9871bf670404adc1d952e59429ec38',1,'helios::Context::getObjectBoundingBox(uint ObjID, vec3 &min_corner, vec3 &max_corner) const'],['../classhelios_1_1_context.html#ab5aef932bd4b64b1cee932423172ab6f',1,'helios::Context::getObjectBoundingBox(const std::vector< uint > &ObjID, vec3 &min_corner, vec3 &max_corner) const']]], + ['getobjectcenter_130',['getObjectCenter',['../classhelios_1_1_compound_object.html#aff66ca85a22d7f8a2501039e2e7183a7',1,'helios::CompoundObject::getObjectCenter()'],['../classhelios_1_1_context.html#a4fe8ddd10f0d34bfe0b2a4aea648442a',1,'helios::Context::getObjectCenter(uint ObjID) const']]], + ['getobjectcount_131',['getObjectCount',['../classhelios_1_1_context.html#a54b9c5503ad33d1dcc8f6a5c74f7ea76',1,'helios::Context']]], + ['getobjectdata_132',['getObjectData',['../classhelios_1_1_compound_object.html#ac91c73ac495bc4a93cc9a89d0eb58f47',1,'helios::CompoundObject::getObjectData(const char *label, int &data) const'],['../classhelios_1_1_compound_object.html#aed77927b3d3fe0ea7ea674b20a8acce1',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< int > &data) const'],['../classhelios_1_1_compound_object.html#ac91bb0e57aa261b003de76b3e008a762',1,'helios::CompoundObject::getObjectData(const char *label, uint &data) const'],['../classhelios_1_1_compound_object.html#a7be991a83ada928f25c23cf7ca3b1822',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< uint > &data) const'],['../classhelios_1_1_compound_object.html#ac222719662ca008014cdd045bedd3d96',1,'helios::CompoundObject::getObjectData(const char *label, float &data) const'],['../classhelios_1_1_compound_object.html#ac128057ff1d7cabb9dfbfb33216cb0c5',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< float > &data) const'],['../classhelios_1_1_compound_object.html#a6d99ef1cacec7471bb79b57601a7a6ee',1,'helios::CompoundObject::getObjectData(const char *label, double &data) const'],['../classhelios_1_1_compound_object.html#ac7af8838d7132683dd9fdbffd1288579',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< double > &data) const'],['../classhelios_1_1_compound_object.html#aef1aadca9de0e9a66500ca5879ab3755',1,'helios::CompoundObject::getObjectData(const char *label, vec2 &data) const'],['../classhelios_1_1_compound_object.html#af7574c29395681941d4d875e304b93de',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< vec2 > &data) const'],['../classhelios_1_1_compound_object.html#acea74a2c138c1e5d832df864a231e486',1,'helios::CompoundObject::getObjectData(const char *label, vec3 &data) const'],['../classhelios_1_1_compound_object.html#a797a5fd8f08ff7220b15ae1d5accb6cd',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< vec3 > &data) const'],['../classhelios_1_1_compound_object.html#a52661efba4b57415b073fcf839069623',1,'helios::CompoundObject::getObjectData(const char *label, vec4 &data) const'],['../classhelios_1_1_compound_object.html#a15ef0fda0196b4de933e4379d5f8234f',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< vec4 > &data) const'],['../classhelios_1_1_compound_object.html#a768a439ecb0d6e8449b31cd137317168',1,'helios::CompoundObject::getObjectData(const char *label, int2 &data) const'],['../classhelios_1_1_compound_object.html#af4d1accb01b8dd2f968296c43dfb6d97',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< int2 > &data) const'],['../classhelios_1_1_compound_object.html#a95f20aead49e80032b0673273de436f2',1,'helios::CompoundObject::getObjectData(const char *label, int3 &data) const'],['../classhelios_1_1_compound_object.html#a6cb032fa5f5b6de86f234eb237980586',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< int3 > &data) const'],['../classhelios_1_1_compound_object.html#a2c0dcefe9e05ec04b001ad94f475f34c',1,'helios::CompoundObject::getObjectData(const char *label, int4 &data) const'],['../classhelios_1_1_compound_object.html#aba75ef4dd5b01b02fc99f9a1d957d70b',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< int4 > &data) const'],['../classhelios_1_1_compound_object.html#afa77a9712c207752cd56522f2dbca52b',1,'helios::CompoundObject::getObjectData(const char *label, std::string &data) const'],['../classhelios_1_1_compound_object.html#adfd1f35dc8785f223c02cc940360e6a5',1,'helios::CompoundObject::getObjectData(const char *label, std::vector< std::string > &data) const'],['../classhelios_1_1_context.html#a3511ff568337b501ca878c99d97c9b52',1,'helios::Context::getObjectData(uint objID, const char *label, int &data) const'],['../classhelios_1_1_context.html#ae75ddc9a945ec876533211f52b8cd22e',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< int > &data) const'],['../classhelios_1_1_context.html#abbd59cc4e7bcad35b43ea7240c4d5558',1,'helios::Context::getObjectData(uint objID, const char *label, uint &data) const'],['../classhelios_1_1_context.html#a22d510fad177ca319bdac0a94ee8f069',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< uint > &data) const'],['../classhelios_1_1_context.html#a8935a9cdf6e34e72bcb636a97043a474',1,'helios::Context::getObjectData(uint objID, const char *label, float &data) const'],['../classhelios_1_1_context.html#a293d899bb22cae1db8cf6c2cc813055d',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< float > &data) const'],['../classhelios_1_1_context.html#ae222f3351535f3aea35e76cbe2ca2d67',1,'helios::Context::getObjectData(uint objID, const char *label, double &data) const'],['../classhelios_1_1_context.html#acda7f75e833791bcbd74ca8b37272a8b',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< double > &data) const'],['../classhelios_1_1_context.html#af8fa05c716517966f7abcc2f4019c709',1,'helios::Context::getObjectData(uint objID, const char *label, vec2 &data) const'],['../classhelios_1_1_context.html#a2e691b7f0b630792f50b5423e23ebab1',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< vec2 > &data) const'],['../classhelios_1_1_context.html#a628cf051625e33549044cd20656519ac',1,'helios::Context::getObjectData(uint objID, const char *label, vec3 &data) const'],['../classhelios_1_1_context.html#a6606603899859e211de9f56cd49bf92d',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< vec3 > &data) const'],['../classhelios_1_1_context.html#ac2b7e667ec37c88868ba0752919da1c9',1,'helios::Context::getObjectData(uint objID, const char *label, vec4 &data) const'],['../classhelios_1_1_context.html#ace5025b962226a75c4984ee6ecc21356',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< vec4 > &data) const'],['../classhelios_1_1_context.html#ae56639e95fae8796545efde94fa84bcc',1,'helios::Context::getObjectData(uint objID, const char *label, int2 &data) const'],['../classhelios_1_1_context.html#a39b169b41cf94516afd863f580c2b772',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< int2 > &data) const'],['../classhelios_1_1_context.html#ac58fc8f10c12dc54265491576650a0c6',1,'helios::Context::getObjectData(uint objID, const char *label, int3 &data) const'],['../classhelios_1_1_context.html#ac097e42620523f2d57d28eecd02954a4',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< int3 > &data) const'],['../classhelios_1_1_context.html#aa393d7b0f24855b2e54480be71c09ad2',1,'helios::Context::getObjectData(uint objID, const char *label, int4 &data) const'],['../classhelios_1_1_context.html#a7ca032799776268d30fe185a76100e0e',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< int4 > &data) const'],['../classhelios_1_1_context.html#a1eae737b91ec70ae6490a8c403936975',1,'helios::Context::getObjectData(uint objID, const char *label, std::string &data) const'],['../classhelios_1_1_context.html#a158215e07c921d11e495b3805823b725',1,'helios::Context::getObjectData(uint objID, const char *label, std::vector< std::string > &data) const']]], + ['getobjectdatasize_133',['getObjectDataSize',['../classhelios_1_1_compound_object.html#a03b2516f8e7e8ae921ea61e4f571eb1d',1,'helios::CompoundObject::getObjectDataSize()'],['../classhelios_1_1_context.html#ac251e9be64f3a35b6d2e6441c2a46f40',1,'helios::Context::getObjectDataSize()']]], + ['getobjectdatatype_134',['getObjectDataType',['../classhelios_1_1_compound_object.html#abbcfd5c545991ee59cf3f77acf300b1e',1,'helios::CompoundObject::getObjectDataType()'],['../classhelios_1_1_context.html#af77ff3ea4a7668d2b5cb03bc6fc5f5b6',1,'helios::Context::getObjectDataType()']]], + ['getobjectid_135',['getObjectID',['../classhelios_1_1_compound_object.html#a28c85b0cf4dee51dd7997b7b78e4f442',1,'helios::CompoundObject']]], + ['getobjectpointer_136',['getObjectPointer',['../classhelios_1_1_context.html#a3d9493949db2c5d8ddeef30afd2a9a0a',1,'helios::Context']]], + ['getobjectprimitivecount_137',['getObjectPrimitiveCount',['../classhelios_1_1_context.html#a457ccd0bcf9870aef138b22c4a160aeb',1,'helios::Context']]], + ['getobjectprimitiveuuids_138',['getObjectPrimitiveUUIDs',['../classhelios_1_1_context.html#a7d0b3a6ca36b02702b06208a735a3b03',1,'helios::Context::getObjectPrimitiveUUIDs(uint ObjID) const'],['../classhelios_1_1_context.html#a09e60fbbd3c4be1f8345a9de3695ccdd',1,'helios::Context::getObjectPrimitiveUUIDs(const std::vector< uint > &ObjIDs) const'],['../classhelios_1_1_context.html#a266fba7ca4a0a1536c49f1e3ce918b1e',1,'helios::Context::getObjectPrimitiveUUIDs(const std::vector< std::vector< uint > > &ObjIDs) const']]], + ['getobjecttexturefile_139',['getObjectTextureFile',['../classhelios_1_1_context.html#aacd4cff3b170281516dcafb3fa83b84a',1,'helios::Context']]], + ['getobjecttransformationmatrix_140',['getObjectTransformationMatrix',['../classhelios_1_1_context.html#af9e972c138b0626cece9eea5f018b418',1,'helios::Context']]], + ['getobjecttype_141',['getObjectType',['../classhelios_1_1_compound_object.html#ab07473392ca1e4c439c909c83cc9730b',1,'helios::CompoundObject::getObjectType()'],['../classhelios_1_1_context.html#a75ae3ee4580c4420059fe95755dc22d2',1,'helios::Context::getObjectType(uint ObjID) const']]], + ['getpatchcenter_142',['getPatchCenter',['../classhelios_1_1_context.html#a4165df43e5ab752e81bc2b7d7caf19d5',1,'helios::Context']]], + ['getpatchsize_143',['getPatchSize',['../classhelios_1_1_context.html#ab3f802aca8dd1930127d9f76358e71cf',1,'helios::Context']]], + ['getplantcount_144',['getPlantCount',['../class_canopy_generator.html#aba9e186286ade3cd2ced0be80b3b8b89',1,'CanopyGenerator']]], + ['getplantflowerobjectids_145',['getPlantFlowerObjectIDs',['../class_plant_architecture.html#a1cb3e4ba93c7a94558c3c07496e550c2',1,'PlantArchitecture']]], + ['getplantfruitobjectids_146',['getPlantFruitObjectIDs',['../class_plant_architecture.html#aac602c603ac136c3aaffad052bd844d4',1,'PlantArchitecture']]], + ['getplantinternodeobjectids_147',['getPlantInternodeObjectIDs',['../class_plant_architecture.html#a53967340a1c9b88f4b804522f081ce62',1,'PlantArchitecture']]], + ['getplantleafobjectids_148',['getPlantLeafObjectIDs',['../class_plant_architecture.html#afcdea7f14c6ca722d39d94ff19ba87b4',1,'PlantArchitecture']]], + ['getplantpeduncleobjectids_149',['getPlantPeduncleObjectIDs',['../class_plant_architecture.html#af8a9f26212baf6695d71d44b982e6adf',1,'PlantArchitecture']]], + ['getplantpetioleobjectids_150',['getPlantPetioleObjectIDs',['../class_plant_architecture.html#aee2486b87dca29982dd1b380aa3510fb',1,'PlantArchitecture']]], + ['getpolymeshobjectpointer_151',['getPolymeshObjectPointer',['../classhelios_1_1_context.html#a5a10781f6c1e24b226a32b1e1369f5c1',1,'helios::Context']]], + ['getpolymeshobjectvolume_152',['getPolymeshObjectVolume',['../classhelios_1_1_context.html#aad71b3e493ab0e47c6d4496d14e89803',1,'helios::Context']]], + ['getprimitivearea_153',['getPrimitiveArea',['../classhelios_1_1_context.html#a1dafe58b3251d2ef9d09112258b2e85d',1,'helios::Context']]], + ['getprimitiveboundingbox_154',['getPrimitiveBoundingBox',['../classhelios_1_1_context.html#abf2e26ac2b32556878be6626a8876569',1,'helios::Context::getPrimitiveBoundingBox(uint UUID, vec3 &min_corner, vec3 &max_corner) const'],['../classhelios_1_1_context.html#a808527f76dec2683cbc168250c4f69be',1,'helios::Context::getPrimitiveBoundingBox(const std::vector< uint > &UUID, vec3 &min_corner, vec3 &max_corner) const']]], + ['getprimitivecolor_155',['getPrimitiveColor',['../classhelios_1_1_context.html#a1223205f1080b0b7024b8f97950779b8',1,'helios::Context']]], + ['getprimitivecolorrgb_156',['getPrimitiveColorRGB',['../classhelios_1_1_context.html#a8550633570ee91e4f09ec1464810bd7b',1,'helios::Context']]], + ['getprimitivecolorrgba_157',['getPrimitiveColorRGBA',['../classhelios_1_1_context.html#a4e29adcb908d55172efd239f294b49e5',1,'helios::Context']]], + ['getprimitivecount_158',['getPrimitiveCount',['../classhelios_1_1_compound_object.html#a0eb06d37710a7dc9f5b915fc33f191a0',1,'helios::CompoundObject::getPrimitiveCount()'],['../group__primitives.html#ga4d3447fb04c25e685bcc82599e2b173d',1,'helios::Context::getPrimitiveCount() const']]], + ['getprimitivedata_159',['getPrimitiveData',['../classhelios_1_1_context.html#a2144eea981e4030c973287ce2c38315e',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, int &data) const'],['../classhelios_1_1_context.html#ad1f6453da61e8e64ba91f589b7cc4eb0',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< int > &data) const'],['../classhelios_1_1_context.html#a420487af4a23ed5b527069c6471efd93',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, uint &data) const'],['../classhelios_1_1_context.html#add62ecdb7cc13510670c9c45bc8725a3',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< uint > &data) const'],['../classhelios_1_1_context.html#aa54fb6e8a942845010ae669505adc2e8',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, float &data) const'],['../classhelios_1_1_context.html#a466dea76918a4bd02e4a355ab70f161b',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< float > &data) const'],['../classhelios_1_1_context.html#a802b10b84762052e52b9ff1861604c58',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, double &data) const'],['../classhelios_1_1_context.html#a65d1918df796575a5e5bc8c470ff3201',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< double > &data) const'],['../classhelios_1_1_context.html#a2ac5198c45a57b7926f4dbd9129fcad5',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, vec2 &data) const'],['../classhelios_1_1_context.html#ab0fb70ff8b6e81901df14efe07ae7ff4',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< vec2 > &data) const'],['../classhelios_1_1_context.html#abbe503b705cfdeb903becdb7fb082dae',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, vec3 &data) const'],['../classhelios_1_1_context.html#a83619185959d1dae4570674a3855f808',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< vec3 > &data) const'],['../classhelios_1_1_context.html#a0e62c9bb97e4cbbcd56518b060e9cae5',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, vec4 &data) const'],['../classhelios_1_1_context.html#a29fed63e84bf5b5111b0e98f499da56e',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< vec4 > &data) const'],['../classhelios_1_1_context.html#a72ee49f503ff0c4937d9aa81b72689ed',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, int2 &data) const'],['../classhelios_1_1_context.html#ae76119a1083016c2cffed9eb443aaa62',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< int2 > &data) const'],['../classhelios_1_1_context.html#a18f0ede968126842068551834391e3ad',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, int3 &data) const'],['../classhelios_1_1_context.html#a5c37491d4bc0a1d69ffcaf214e6c2fe7',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< int3 > &data) const'],['../classhelios_1_1_context.html#afe292fdf1d3c7983427c699e4a2eca3a',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, int4 &data) const'],['../classhelios_1_1_context.html#a8ebaded3f143fc9c673765ab3fda5366',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< int4 > &data) const'],['../classhelios_1_1_context.html#ad1a2ca668fb5f5043f23f7a50c22483f',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::string &data) const'],['../classhelios_1_1_context.html#a1d8cd543d68c2bc3b7ef876421284f15',1,'helios::Context::getPrimitiveData(uint UUID, const char *label, std::vector< std::string > &data) const']]], + ['getprimitivedatasize_160',['getPrimitiveDataSize',['../classhelios_1_1_context.html#a4b64585d356463ac759472f099660eca',1,'helios::Context']]], + ['getprimitivedatatype_161',['getPrimitiveDataType',['../classhelios_1_1_context.html#a9c894ecd12e0d893c53ffcfa9e90c0b6',1,'helios::Context']]], + ['getprimitivenormal_162',['getPrimitiveNormal',['../classhelios_1_1_context.html#abfeadf8e6a35eb97da1439abc21c434e',1,'helios::Context']]], + ['getprimitiveparentobjectid_163',['getPrimitiveParentObjectID',['../classhelios_1_1_context.html#a2d3e254d04f913e590a645b54886436e',1,'helios::Context']]], + ['getprimitivesolidfraction_164',['getPrimitiveSolidFraction',['../classhelios_1_1_context.html#a6e8a5e2044331158d69d6f9bd88fc0f7',1,'helios::Context']]], + ['getprimitivetexturefile_165',['getPrimitiveTextureFile',['../classhelios_1_1_context.html#a4fffad72d1ebb517d9c41837e448d4f5',1,'helios::Context']]], + ['getprimitivetexturesize_166',['getPrimitiveTextureSize',['../classhelios_1_1_context.html#a7fec62cbf2c2d56603b2750cbb4a4d9f',1,'helios::Context']]], + ['getprimitivetexturetransparencydata_167',['getPrimitiveTextureTransparencyData',['../classhelios_1_1_context.html#a98ad773979fff9efda47b44d71ac8e06',1,'helios::Context']]], + ['getprimitivetextureuv_168',['getPrimitiveTextureUV',['../classhelios_1_1_context.html#a5702f94aaba15bf6757aeb4d72d7774d',1,'helios::Context']]], + ['getprimitivetransformationmatrix_169',['getPrimitiveTransformationMatrix',['../classhelios_1_1_context.html#a046e855d15fa88088be01adea38a67fd',1,'helios::Context']]], + ['getprimitivetype_170',['getPrimitiveType',['../classhelios_1_1_context.html#a67bfd66f0a445f6485f1099f9eadc949',1,'helios::Context']]], + ['getprimitiveuuids_171',['getPrimitiveUUIDs',['../classhelios_1_1_compound_object.html#ab3973a7c8ccb1aa0ce3f21ffe461ef7b',1,'helios::CompoundObject']]], + ['getprimitivevertices_172',['getPrimitiveVertices',['../classhelios_1_1_context.html#ae8542fd1452150d3302675a0a3d991ed',1,'helios::Context']]], + ['getradius_173',['getRadius',['../classhelios_1_1_sphere.html#a38cf8b6959d22577a1a2f9a6c675bc8b',1,'helios::Sphere']]], + ['getrandomgenerator_174',['getRandomGenerator',['../classhelios_1_1_context.html#a96a928fa28d3d771ba310f798b56bd63',1,'helios::Context']]], + ['getscanbeamdivergence_175',['getScanBeamDivergence',['../class_aerial_li_d_a_rcloud.html#a4097c1d3994f57e0f0e2e602c7ca5c04',1,'AerialLiDARcloud::getScanBeamDivergence()'],['../class_li_d_a_rcloud.html#a9d93e6cd9decccf271fbf3fbd5c74a5a',1,'LiDARcloud::getScanBeamDivergence()']]], + ['getscanbeamexitdiameter_176',['getScanBeamExitDiameter',['../class_aerial_li_d_a_rcloud.html#ae6cbd6375be39129231233d66061afca',1,'AerialLiDARcloud::getScanBeamExitDiameter()'],['../class_li_d_a_rcloud.html#abab6b81a3d96226a766cc2450993407f',1,'LiDARcloud::getScanBeamExitDiameter()']]], + ['getscancenter_177',['getScanCenter',['../class_aerial_li_d_a_rcloud.html#a1ce1efbe6af71f54dcccd3743918aa72',1,'AerialLiDARcloud']]], + ['getscancolumnformat_178',['getScanColumnFormat',['../class_li_d_a_rcloud.html#abbe892f01508dc69bcc5b28bea5472bf',1,'LiDARcloud']]], + ['getscanconeangle_179',['getScanConeAngle',['../class_aerial_li_d_a_rcloud.html#a0dbf5535304d6d87d67a0d41c5d2310f',1,'AerialLiDARcloud']]], + ['getscancount_180',['getScanCount',['../class_aerial_li_d_a_rcloud.html#ab363717911dada3af4fdafa914532a6a',1,'AerialLiDARcloud::getScanCount()'],['../class_li_d_a_rcloud.html#aaa463ea1aaebb03abd8c3ec87091291a',1,'LiDARcloud::getScanCount()']]], + ['getscandensity_181',['getScanDensity',['../class_aerial_li_d_a_rcloud.html#a0c4627b15014ebe8c79053ed75f6cfb4',1,'AerialLiDARcloud']]], + ['getscanextent_182',['getScanExtent',['../class_aerial_li_d_a_rcloud.html#ad5bd68f06fef597d8c1f1aac3142acc6',1,'AerialLiDARcloud']]], + ['getscanorigin_183',['getScanOrigin',['../class_li_d_a_rcloud.html#aa657ed32a8831ebf4f2e4a9203b683ef',1,'LiDARcloud']]], + ['getscanrangephi_184',['getScanRangePhi',['../class_li_d_a_rcloud.html#ab314aac88834eb3938fc2f37e34807e3',1,'LiDARcloud']]], + ['getscanrangetheta_185',['getScanRangeTheta',['../class_li_d_a_rcloud.html#a7f0237a83da6997e973fde9939440979',1,'LiDARcloud']]], + ['getscansizephi_186',['getScanSizePhi',['../class_li_d_a_rcloud.html#aaf04cd04c2b1bc162106a0e47cff6d29',1,'LiDARcloud']]], + ['getscansizetheta_187',['getScanSizeTheta',['../class_li_d_a_rcloud.html#a40809c7a709a6c9ccb4beddca21f8ac9',1,'LiDARcloud']]], + ['getsegmentvolume_188',['getSegmentVolume',['../classhelios_1_1_tube.html#a2966ff764897904282082f23a76756b8',1,'helios::Tube']]], + ['getsize_189',['getSize',['../classhelios_1_1_tile.html#aa8daadd99bd57f647837e26890fcfeac',1,'helios::Tile::getSize()'],['../classhelios_1_1_box.html#afd79ee17402ab6367896fe8278800f34',1,'helios::Box::getSize()'],['../classhelios_1_1_disk.html#a23c03df1f2e351659a08420a41a74eb5',1,'helios::Disk::getSize()']]], + ['getskyenergy_190',['getSkyEnergy',['../class_radiation_model.html#a9c9a5f6cb6b0ba6e3780aba8a4da8a0d',1,'RadiationModel']]], + ['getsolarflux_191',['getSolarFlux',['../class_solar_position.html#a9701cb29a0336a11c445d285405b6956',1,'SolarPosition']]], + ['getsolarfluxnir_192',['getSolarFluxNIR',['../class_solar_position.html#a611461f700df9efa7c56b6f4ee7712b7',1,'SolarPosition']]], + ['getsolarfluxpar_193',['getSolarFluxPAR',['../class_solar_position.html#a5c6635160944b5b8202ea9965da6de9d',1,'SolarPosition']]], + ['getsolidfraction_194',['getSolidFraction',['../classhelios_1_1_texture.html#a685024e8394b49433f26a0dcd6665d86',1,'helios::Texture']]], + ['getsourceflux_195',['getSourceFlux',['../class_radiation_model.html#a9d4ea3e08514b90e617695ab2ee2fbf8',1,'RadiationModel']]], + ['getsourceposition_196',['getSourcePosition',['../class_radiation_model.html#ab8ec35514a0e4b53ce8a64d3f390427c',1,'RadiationModel']]], + ['getsphereobjectcenter_197',['getSphereObjectCenter',['../classhelios_1_1_context.html#a4f75af0785498d14eb3f5a3539cb16b1',1,'helios::Context']]], + ['getsphereobjectpointer_198',['getSphereObjectPointer',['../classhelios_1_1_context.html#a8ed7580efa323c0f5e53e97d00e16c85',1,'helios::Context']]], + ['getsphereobjectradius_199',['getSphereObjectRadius',['../classhelios_1_1_context.html#a5afb4fd92e9a726fb396779d1f2ae92b',1,'helios::Context']]], + ['getsphereobjectsubdivisioncount_200',['getSphereObjectSubdivisionCount',['../classhelios_1_1_context.html#adadbc5a5378a874cd6705ed681fb9e6a',1,'helios::Context']]], + ['getsphereobjectvolume_201',['getSphereObjectVolume',['../classhelios_1_1_context.html#ae92df5975ec7fa257e7633d6551e2a87',1,'helios::Context']]], + ['getsubdivisioncount_202',['getSubdivisionCount',['../classhelios_1_1_tile.html#a4f4198becfe3cafd989b5aa6cd21d5cf',1,'helios::Tile::getSubdivisionCount()'],['../classhelios_1_1_sphere.html#a152107e463d6765ba27ff8f3ab737711',1,'helios::Sphere::getSubdivisionCount()'],['../classhelios_1_1_tube.html#abf9bb1153b3607a5d616aafeee06e43e',1,'helios::Tube::getSubdivisionCount()'],['../classhelios_1_1_box.html#a6f25b211d8740257329f841cda737a4f',1,'helios::Box::getSubdivisionCount()'],['../classhelios_1_1_disk.html#a8dc2a195735ee3321b274274e7e0352e',1,'helios::Disk::getSubdivisionCount()'],['../classhelios_1_1_cone.html#a051a2c5760d53a6c0b95f66cab9cbf73',1,'helios::Cone::getSubdivisionCount()']]], + ['getsunazimuth_203',['getSunAzimuth',['../class_solar_position.html#a2b736578f75ecb8532556931b8263dc4',1,'SolarPosition']]], + ['getsundirectionspherical_204',['getSunDirectionSpherical',['../class_solar_position.html#adad5310db742ef9f2754e75095aeea92',1,'SolarPosition']]], + ['getsundirectionvector_205',['getSunDirectionVector',['../class_solar_position.html#af889756d5b3d7d3c366887fae1fb86ab',1,'SolarPosition']]], + ['getsunelevation_206',['getSunElevation',['../class_solar_position.html#a307e963d840abb9ee7867579fec69fa2',1,'SolarPosition']]], + ['getsunrisetime_207',['getSunriseTime',['../class_solar_position.html#a2d15fe2ca0d29adf33971916b1d8cd83',1,'SolarPosition']]], + ['getsunsettime_208',['getSunsetTime',['../class_solar_position.html#a4c58aa642b4fc2300d1c1447388bc0d8',1,'SolarPosition']]], + ['getsunzenith_209',['getSunZenith',['../class_solar_position.html#a4c4ba4931d13c6cc2ad69e8eab90ac14',1,'SolarPosition']]], + ['gettexturefile_210',['getTextureFile',['../classhelios_1_1_texture.html#a0371473a81deb9bb19b8274109b75ef8',1,'helios::Texture::getTextureFile()'],['../classhelios_1_1_compound_object.html#a3e43ebd386e7a6663fa877613b9d27fa',1,'helios::CompoundObject::getTextureFile()']]], + ['gettextureuv_211',['getTextureUV',['../classhelios_1_1_tile.html#a94deb25ac31abc1eb02dfe6913b4546f',1,'helios::Tile']]], + ['gettileobjectarearatio_212',['getTileObjectAreaRatio',['../classhelios_1_1_context.html#a9943834b21ccfb9ac1c519e47f959c92',1,'helios::Context::getTileObjectAreaRatio(uint ObjectID) const'],['../classhelios_1_1_context.html#afdebad3fd25bb8b9fa228020c3b11329',1,'helios::Context::getTileObjectAreaRatio(const std::vector< uint > &ObjectID) const']]], + ['gettileobjectcenter_213',['getTileObjectCenter',['../classhelios_1_1_context.html#aa60f87c9bc771e613f60db73188a149d',1,'helios::Context']]], + ['gettileobjectnormal_214',['getTileObjectNormal',['../classhelios_1_1_context.html#a64f4bcadff461357aa390d7f5dad2ba7',1,'helios::Context']]], + ['gettileobjectpointer_215',['getTileObjectPointer',['../classhelios_1_1_context.html#ad2b762dd7b31126150c6e6dc350a3914',1,'helios::Context']]], + ['gettileobjectsize_216',['getTileObjectSize',['../classhelios_1_1_context.html#a457654b4a1f96a4979f83299dd9752df',1,'helios::Context']]], + ['gettileobjectsubdivisioncount_217',['getTileObjectSubdivisionCount',['../classhelios_1_1_context.html#a9320e4577eb131e7efe05677d30591b3',1,'helios::Context']]], + ['gettileobjecttextureuv_218',['getTileObjectTextureUV',['../classhelios_1_1_context.html#a00718598a9c308dabe8fc24f85683210',1,'helios::Context']]], + ['gettileobjectvertices_219',['getTileObjectVertices',['../classhelios_1_1_context.html#ab77b708ac6b39c1c5e8ecaa4988403b0',1,'helios::Context']]], + ['gettime_220',['getTime',['../classhelios_1_1_context.html#a847ecbb2297e60220a23b67c39b0f6e2',1,'helios::Context']]], + ['gettimeserieslength_221',['getTimeseriesLength',['../group__timeseries.html#ga56d13f8c949e68137581a3c974790892',1,'helios::Context']]], + ['getting_20object_20ids_20and_20primitive_20uuids_20of_20model_20geometry_222',['Getting Object IDs and Primitive UUIDs of Model Geometry',['../_plant_architecture_doc.html#PlantArchQueryobjIDs',1,'']]], + ['getting_20primitive_20data_20values_223',['Getting Primitive Data Values',['../_a_p_i.html#GetPrimData',1,'']]], + ['getting_20primitive_20uuids_20for_20organ_20sub_20components_224',['Getting Primitive UUIDs for Organ Sub-Components',['../_plant_architecture_doc.html#PlantArchQueryUUIDs',1,'']]], + ['getting_20started_20with_20the_20existing_20plant_20library_225',['Getting Started with the Existing Plant Library',['../_plant_architecture_doc.html#PlantArchGettingStarted',1,'']]], + ['getting_20the_20direction_20of_20the_20sun_226',['Getting the Direction of the Sun',['../_solar_position_doc.html#SolarPos',1,'']]], + ['getting_20the_20sky_20longwave_20flux_227',['Getting the Sky Longwave Flux',['../_solar_position_doc.html#LWFlux',1,'']]], + ['getting_20the_20solar_20flux_228',['Getting the Solar Flux',['../_solar_position_doc.html#SolarFlux',1,'']]], + ['gettotalabsorbedflux_229',['getTotalAbsorbedFlux',['../class_radiation_model.html#a5e95e775550a2000798a97b00857bdd2',1,'RadiationModel']]], + ['gettransformationmatrix_230',['getTransformationMatrix',['../classhelios_1_1_compound_object.html#ac1e98d4f8098dadda345f9dc6dae73ca',1,'helios::CompoundObject']]], + ['gettransparencydata_231',['getTransparencyData',['../classhelios_1_1_texture.html#a798c3a24b21fc853db299d1f1f84a61c',1,'helios::Texture']]], + ['gettreeparameters_232',['getTreeParameters',['../class_weber_penn_tree.html#aac5619ac480517f8f01cb465d0dc4a6f',1,'WeberPennTree']]], + ['gettriangle_233',['getTriangle',['../class_li_d_a_rcloud.html#aa1a1af5eea22185e59c267c8e4d94c9e',1,'LiDARcloud']]], + ['gettrianglecount_234',['getTriangleCount',['../class_li_d_a_rcloud.html#abcdbf834959379a189a60efed41f3e52',1,'LiDARcloud']]], + ['gettrianglevertex_235',['getTriangleVertex',['../classhelios_1_1_context.html#a846f93175f8b45f44237e88155af8fde',1,'helios::Context']]], + ['gettrianglevertices_236',['getTriangleVertices',['../classhelios_1_1_tube.html#a6aedd14e533981bd79497ba13b33f2c9',1,'helios::Tube']]], + ['gettrunkuuids_237',['getTrunkUUIDs',['../class_canopy_generator.html#aa8e95a610c03588592acebbbba5d638e',1,'CanopyGenerator::getTrunkUUIDs(uint PlantID)'],['../class_canopy_generator.html#a44b2d0846bb08d331281a822df41daa6',1,'CanopyGenerator::getTrunkUUIDs()'],['../class_weber_penn_tree.html#ab247d9368368263dfdded18a43917f98',1,'WeberPennTree::getTrunkUUIDs()']]], + ['gettubeobjectnodecolors_238',['getTubeObjectNodeColors',['../classhelios_1_1_context.html#a7ad271dabb4291067f9a39d4c92e6ffd',1,'helios::Context']]], + ['gettubeobjectnoderadii_239',['getTubeObjectNodeRadii',['../classhelios_1_1_context.html#a6a58d8f1a8446a213d9a21e67ae8ed97',1,'helios::Context']]], + ['gettubeobjectnodes_240',['getTubeObjectNodes',['../classhelios_1_1_context.html#aa4650e7a0a16be12615870ff9a567ae3',1,'helios::Context']]], + ['gettubeobjectpointer_241',['getTubeObjectPointer',['../classhelios_1_1_context.html#ab26f963c75aa99d797a43860479910b0',1,'helios::Context']]], + ['gettubeobjectsegmentvolume_242',['getTubeObjectSegmentVolume',['../classhelios_1_1_context.html#a10928031db222e77e93ac8088f4b001d',1,'helios::Context']]], + ['gettubeobjectsubdivisioncount_243',['getTubeObjectSubdivisionCount',['../classhelios_1_1_context.html#a272ba030971b86c7d3da57ff90784e0f',1,'helios::Context']]], + ['gettubeobjectvolume_244',['getTubeObjectVolume',['../classhelios_1_1_context.html#a56b82c3f009084451225003b2b461b6f',1,'helios::Context']]], + ['getuniqueprimitiveparentobjectids_245',['getUniquePrimitiveParentObjectIDs',['../classhelios_1_1_context.html#a18a276db8d3c1d754bbd1ca475deec82',1,'helios::Context::getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs) const'],['../classhelios_1_1_context.html#a1f50af8c859a5b2ee0973c9ed5c10284',1,'helios::Context::getUniquePrimitiveParentObjectIDs(const std::vector< uint > &UUIDs, bool include_ObjID_zero) const']]], + ['getvariation_246',['getVariation',['../_canopy_generator_8h.html#accfb46da54c7b0e83878a1331bbc94d1',1,'getVariation(float V, std::minstd_rand0 &generator, bool positive=false): CanopyGenerator.cpp'],['../_canopy_generator_8h.html#aa3a6e1a26b799f4a2006703314499fed',1,'getVariation(int V, std::minstd_rand0 &generator, bool positive=false): CanopyGenerator.cpp'],['../_canopy_generator_8h.html#a6cdee9cb4984f78c818e46eb2a5b62e6',1,'getVariation(uint V, std::minstd_rand0 &generator): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#aa0b21a2d6b9506b33d05047716d671e0',1,'getVariation(float V, std::minstd_rand0 &generator, bool positive): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#a9f90ba8fe8a074a822424ff748579f25',1,'getVariation(int V, std::minstd_rand0 &generator, bool positive): CanopyGenerator.cpp'],['../_canopy_generator_8cpp.html#a6cdee9cb4984f78c818e46eb2a5b62e6',1,'getVariation(uint V, std::minstd_rand0 &generator): CanopyGenerator.cpp']]], + ['getvertices_247',['getVertices',['../classhelios_1_1_tile.html#aaea21403039646db33792c95be929afd',1,'helios::Tile']]], + ['getvolume_248',['getVolume',['../classhelios_1_1_sphere.html#a3d6a8e9f8c0daee1e093593d6006c906',1,'helios::Sphere::getVolume()'],['../classhelios_1_1_tube.html#aaa11cc27d6f704a989c3e5b0fe1b8055',1,'helios::Tube::getVolume()'],['../classhelios_1_1_box.html#a3d3d0b20e22aff306fde02bd7e2a4f84',1,'helios::Box::getVolume()'],['../classhelios_1_1_polymesh.html#ad901c4de0e202f44c16fc9af29481538',1,'helios::Polymesh::getVolume()'],['../classhelios_1_1_cone.html#aff2cb2fc89c68b75a038a9604ce73cd0',1,'helios::Cone::getVolume()']]], + ['getvoxelcenter_249',['getVoxelCenter',['../classhelios_1_1_context.html#acadf5206cbfed7b8eaa2835702349cd9',1,'helios::Context']]], + ['getvoxelsize_250',['getVoxelSize',['../classhelios_1_1_context.html#a6a3f85d4f29f8f7432b6ef605172a1cb',1,'helios::Context']]], + ['getwindowpixelsrgb_251',['getWindowPixelsRGB',['../class_visualizer.html#a15828ea9966b9729b56c9ddfccd4c117',1,'Visualizer']]], + ['getwindowsize_252',['getWindowSize',['../class_visualizer.html#ae6b83402c798f56334851f77b898de52',1,'Visualizer']]], + ['gimp_253',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['girth_5farea_5ffactor_254',['girth_area_factor',['../_plant_architecture_doc.html#ShootParam_girth_area_factor',1,'']]], + ['git_20github_20integration_255',['Git/GitHub integration',['../_c_lion_i_d_e.html#CLionGit',1,'']]], + ['github_20integration_256',['Git/GitHub integration',['../_c_lion_i_d_e.html#CLionGit',1,'']]], + ['given_20in_20buckley_20turnbull_20and_20adams_202012_257',['Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)',['../_stomatal_doc.html#BMFTheory',1,'']]], + ['global_20data_258',['Global Data',['../_a_p_i.html#GlobalData',1,'Global Data'],['../context_globaldata.html#context_globaldata_intro',1,'Introduction to Global Data'],['../context_globaldata.html',1,'Tutorial 6: Global Data']]], + ['global_20data_20arrays_259',['Creating Global Data (Arrays)',['../context_globaldata.html#context_globaldata_arrays',1,'']]], + ['global_20data_20scalars_260',['Creating Global Data (Scalars)',['../context_globaldata.html#context_globaldata_scalar',1,'']]], + ['global_2ecpp_261',['global.cpp',['../global_8cpp.html',1,'']]], + ['global_2eh_262',['global.h',['../global_8h.html',1,'']]], + ['globaldata_263',['GlobalData',['../structhelios_1_1_global_data.html',1,'helios']]], + ['glyph_264',['Glyph',['../class_glyph.html',1,'']]], + ['goblet_20trellis_265',['Grapevine Canopy with a Goblet Trellis',['../_canopy_generator_doc.html#CGenGoblet',1,'']]], + ['gobletgrapevineparameters_266',['GobletGrapevineParameters',['../struct_goblet_grapevine_parameters.html',1,'GobletGrapevineParameters'],['../struct_goblet_grapevine_parameters.html#a0274d6f6b1f13bbf7a383de5c2bc8726',1,'GobletGrapevineParameters::GobletGrapevineParameters()'],['../struct_goblet_grapevine_parameters.html#a498ce7f62d575b0bc914e9d48d94fbb2',1,'GobletGrapevineParameters::GobletGrapevineParameters(const pugi::xml_node canopy_node)']]], + ['gradientdescent_267',['GradientDescent',['../struct_camera_calibration.html#a5bfbb206b8271b406cda85eb5ae23a1b',1,'CameraCalibration']]], + ['gradientdescentparameters_268',['GradientDescentParameters',['../struct_camera_calibration_1_1_gradient_descent_parameters.html',1,'CameraCalibration']]], + ['grape_5fcolor_269',['grape_color',['../struct_base_grape_vine_parameters.html#ac90904eec34fa3e0dea393dd1c12faf6',1,'BaseGrapeVineParameters']]], + ['grape_5fradius_270',['grape_radius',['../struct_base_grape_vine_parameters.html#afa20674518acbb9fdfaafc893f362e01',1,'BaseGrapeVineParameters']]], + ['grape_5fradius_5fspread_271',['grape_radius_spread',['../struct_base_grape_vine_parameters.html#ace081969ad453ba66d60e394554d50b9',1,'BaseGrapeVineParameters']]], + ['grape_5fsubdivisions_272',['grape_subdivisions',['../struct_base_grape_vine_parameters.html#a510a2a5876fe8b3fb8ec70701c32df48',1,'BaseGrapeVineParameters']]], + ['grape_5fsubdivisions_5fspread_273',['grape_subdivisions_spread',['../struct_base_grape_vine_parameters.html#aa27b9934f658e9047462703e7d059d74',1,'BaseGrapeVineParameters']]], + ['grapevine_20canopy_20with_20a_20goblet_20trellis_274',['Grapevine Canopy with a Goblet Trellis',['../_canopy_generator_doc.html#CGenGoblet',1,'']]], + ['grapevine_20canopy_20with_20a_20split_20trellis_275',['Grapevine Canopy with a Split Trellis',['../_canopy_generator_doc.html#CGenSplit',1,'']]], + ['grapevine_20canopy_20with_20a_20unilateral_20vsp_20trellis_276',['Grapevine Canopy with a Unilateral VSP Trellis',['../_canopy_generator_doc.html#CGenUnilateral',1,'']]], + ['grapevine_20canopy_20with_20vsp_20trellis_277',['Grapevine Canopy with VSP Trellis',['../_canopy_generator_doc.html#CGenVSP',1,'']]], + ['grapevine_2ecpp_278',['grapevine.cpp',['../grapevine_8cpp.html',1,'']]], + ['grapevinegoblet_279',['grapevineGoblet',['../class_canopy_generator.html#a8f2d498637c464ee852109e6085cde8a',1,'CanopyGenerator']]], + ['grapevinesplit_280',['grapevineSplit',['../class_canopy_generator.html#a8747bad1af97214059c38043241f0b47',1,'CanopyGenerator']]], + ['grapevineunilateral_281',['grapevineUnilateral',['../class_canopy_generator.html#aac9104d7c6565e860737310de06981f8',1,'CanopyGenerator']]], + ['grapevinevsp_282',['grapevineVSP',['../class_canopy_generator.html#aaffe5cdb82a779785bc6d5e35e622812',1,'CanopyGenerator']]], + ['graphics_20driver_20timeout_283',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], + ['gravitropic_5fcurvature_284',['gravitropic_curvature',['../_plant_architecture_doc.html#ShootParam_gravitropic',1,'']]], + ['grid_20cell_285',['Calculating leaf area for each grid cell',['../_li_d_a_r_doc.html#LiDARleafarea',1,'']]], + ['grid_20cells_286',['grid cells',['../_aerial_li_d_a_r_doc.html#AerialLiDARgrid',1,'Establishing grid cells'],['../_li_d_a_r_doc.html#LiDARgrid',1,'Establishing grid cells']]], + ['gridcell_287',['GridCell',['../struct_grid_cell.html',1,'']]], + ['gridijk2index_288',['gridijk2index',['../class_aerial_li_d_a_rcloud.html#a35c81e8cda423b84c94fc33ee4163d47',1,'AerialLiDARcloud']]], + ['gridindex2ijk_289',['gridindex2ijk',['../class_aerial_li_d_a_rcloud.html#add78af9b69161c5c532a23c8df009d2e',1,'AerialLiDARcloud']]], + ['ground_290',['Building the Ground',['../_canopy_generator_doc.html#CGenBuildGround',1,'']]], + ['ground_291',['4. Flow over bare ground',['../_b_l_conductance_doc.html#BLC4',1,'']]], + ['ground_20area_20basis_292',['4b. Calculate radiation flux absorbed by the canopy on a ground area basis',['../radiation__beers_law.html#tutorial11_abs',1,'']]], + ['ground_20collision_20detection_293',['Ground Collision Detection',['../_plant_architecture_doc.html#PlantArchCollision',1,'']]], + ['ground_20cover_20fraction_294',['2D raster ground cover fraction',['../_aerial_li_d_a_r_doc.html#AerialGroundCover',1,'']]], + ['growing_20the_20model_20over_20time_295',['Growing the Model over Time',['../_plant_architecture_doc.html#PlantArchGrowth',1,'']]], + ['growth_20parameters_20of_20the_20shoot_296',['Growth Parameters of the Shoot',['../_plant_architecture_doc.html#ShootParametersGrowth',1,'']]], + ['growth_20phenology_297',['Growth Phenology',['../_plant_architecture_doc.html#PlantArchPheno',1,'']]], + ['guide_298',['User/API Guide',['../_a_p_i.html',1,'']]] ]; diff --git a/doc/html/search/close.svg b/doc/html/search/close.svg index a933eea1a..337d6cc13 100644 --- a/doc/html/search/close.svg +++ b/doc/html/search/close.svg @@ -1,27 +1,14 @@ + - - - - image/svg+xml - - - - - + - - - - image/svg+xml - - - - - + - - - - image/svg+xml - - - - - - + - - - - image/svg+xml - - - - - + > - + /> + /> diff --git a/doc/html/search/mag_seld.svg b/doc/html/search/mag_seld.svg index 6e720dcc9..c906f84c8 100644 --- a/doc/html/search/mag_seld.svg +++ b/doc/html/search/mag_seld.svg @@ -1,74 +1,31 @@ - + - - - - image/svg+xml - - - - - + > - + /> + /> diff --git a/doc/html/search/pages_0.js b/doc/html/search/pages_0.js index 5dd1fd1aa..2a6a4c26e 100644 --- a/doc/html/search/pages_0.js +++ b/doc/html/search/pages_0.js @@ -1,5 +1,4 @@ var searchData= [ - ['_25lidar_20point_20cloud_20plugin_20documentation_0',['%LiDAR Point Cloud Plugin Documentation',['../_li_d_a_r_doc.html',1,'PlugIns']]], - ['_25visualizer_20plugin_20documentation_1',['%Visualizer Plugin Documentation',['../_visualizer_doc.html',1,'PlugIns']]] + ['0_3a_20context_20self_20test_20tutorial_0',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_1.js b/doc/html/search/pages_1.js index 0aeefc8ec..00d9296e5 100644 --- a/doc/html/search/pages_1.js +++ b/doc/html/search/pages_1.js @@ -1,4 +1,6 @@ var searchData= [ - ['aerial_20_25lidar_20point_20cloud_20plugin_20documentation_0',['Aerial %LiDAR Point Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'PlugIns']]] + ['10_3a_20radiation_20model_20basics_20tree_20light_20interception_0',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['11_3a_20light_20interception_20and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_1',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['1_3a_20helios_20vector_20types_20tutorial_2',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_10.js b/doc/html/search/pages_10.js index 679ce9f22..370548609 100644 --- a/doc/html/search/pages_10.js +++ b/doc/html/search/pages_10.js @@ -1,4 +1,11 @@ var searchData= [ - ['voxel_20intersection_20plugin_20documentation_0',['Voxel Intersection Plugin Documentation',['../_voxel_intersection_doc.html',1,'PlugIns']]] + ['ide_20with_20helios_0',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['increasing_20graphics_20driver_20timeout_1',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], + ['input_20output_2',['File Input/Output',['../_i_o.html',1,'']]], + ['ins_3',['Plug-ins',['../_plug_ins.html',1,'']]], + ['install_20and_20set_20up_4',['Install and Set-up',['../_dependent_software.html',1,'']]], + ['interception_5',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['interception_20and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_6',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['intersection_20plugin_20documentation_7',['Voxel Intersection Plugin Documentation',['../_voxel_intersection_doc.html',1,'PlugIns']]] ]; diff --git a/doc/html/search/pages_11.js b/doc/html/search/pages_11.js index 9fd0b69b9..e0395a9c1 100644 --- a/doc/html/search/pages_11.js +++ b/doc/html/search/pages_11.js @@ -1,5 +1,8 @@ var searchData= [ - ['weber_2dpenn_20tree_20plugin_20documentation_0',['Weber-Penn Tree Plugin Documentation',['../_weber_penn_doc.html',1,'PlugIns']]], - ['writing_20plugins_1',['Writing Plugins',['../_plugins.html',1,'']]] + ['layer_20conductance_20model_20plugin_20documentation_0',['Boundary-Layer Conductance Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'PlugIns']]], + ['leaf_20area_20for_20a_20homogeneous_20canopy_1',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['lidar_20point_20cloud_20plugin_20documentation_2',['LiDAR Point Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation']]], + ['light_20interception_3',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['light_20interception_20and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_4',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_12.js b/doc/html/search/pages_12.js new file mode 100644 index 000000000..48220f176 --- /dev/null +++ b/doc/html/search/pages_12.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['making_20texture_20mask_20files_20with_20transparency_20using_20gimp_0',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['mask_20files_20with_20transparency_20using_20gimp_1',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['model_20basics_20tree_20light_20interception_2',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['model_20plugin_20documentation_3',['Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'Boundary-Layer Conductance Model Plugin Documentation'],['../_dummy.html',1,'Dummy Model Plugin Documentation'],['../_energy_balance_doc.html',1,'Energy Balance Model Plugin Documentation'],['../_photosynthesis_doc.html',1,'Photosynthesis Model Plugin Documentation'],['../_plant_architecture_doc.html',1,'Plant Architecture Model Plugin Documentation'],['../_radiation_doc.html',1,'Radiation Model Plugin Documentation'],['../_stomatal_doc.html',1,'Stomatal Conductance Model Plugin Documentation']]] +]; diff --git a/doc/html/search/pages_13.js b/doc/html/search/pages_13.js new file mode 100644 index 000000000..d1d10c0a6 --- /dev/null +++ b/doc/html/search/pages_13.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_0',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['optix_20version_1',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['output_2',['File Input/Output',['../_i_o.html',1,'']]], + ['overview_3',['Overview',['../_overview.html',1,'']]] +]; diff --git a/doc/html/search/pages_14.js b/doc/html/search/pages_14.js new file mode 100644 index 000000000..19c025143 --- /dev/null +++ b/doc/html/search/pages_14.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['penn_20tree_20plugin_20documentation_0',['Weber-Penn Tree Plugin Documentation',['../_weber_penn_doc.html',1,'PlugIns']]], + ['photosynthesis_20model_20plugin_20documentation_1',['Photosynthesis Model Plugin Documentation',['../_photosynthesis_doc.html',1,'PlugIns']]], + ['plant_20architecture_20model_20plugin_20documentation_2',['Plant Architecture Model Plugin Documentation',['../_plant_architecture_doc.html',1,'PlugIns']]], + ['plug_20ins_3',['Plug-ins',['../_plug_ins.html',1,'']]], + ['plugin_20documentation_4',['Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_b_l_conductance_doc.html',1,'Boundary-Layer Conductance Model Plugin Documentation'],['../_canopy_generator_doc.html',1,'Canopy Generator Plugin Documentation'],['../_dummy.html',1,'Dummy Model Plugin Documentation'],['../_energy_balance_doc.html',1,'Energy Balance Model Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation'],['../_photosynthesis_doc.html',1,'Photosynthesis Model Plugin Documentation'],['../_plant_architecture_doc.html',1,'Plant Architecture Model Plugin Documentation'],['../_radiation_doc.html',1,'Radiation Model Plugin Documentation'],['../_solar_position_doc.html',1,'Solar Position Plugin Documentation'],['../_stomatal_doc.html',1,'Stomatal Conductance Model Plugin Documentation'],['../_visualizer_doc.html',1,'Visualizer Plugin Documentation'],['../_voxel_intersection_doc.html',1,'Voxel Intersection Plugin Documentation'],['../_weber_penn_doc.html',1,'Weber-Penn Tree Plugin Documentation']]], + ['plugins_5',['Writing Plugins',['../_plugins.html',1,'']]], + ['ply_20using_20blender_6',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['point_20cloud_20plugin_20documentation_7',['Point Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation']]], + ['polygon_20file_20formats_20to_20ply_20using_20blender_8',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['position_20plugin_20documentation_9',['Solar Position Plugin Documentation',['../_solar_position_doc.html',1,'PlugIns']]], + ['primitive_20data_10',['Tutorial 5: Primitive Data',['../context_primdata.html',1,'Tutorials']]], + ['primitive_20data_20values_11',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]] +]; diff --git a/doc/html/search/pages_15.js b/doc/html/search/pages_15.js new file mode 100644 index 000000000..7db5e9b1d --- /dev/null +++ b/doc/html/search/pages_15.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['radiation_20model_20basics_20tree_20light_20interception_0',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['radiation_20model_20plugin_20documentation_1',['Radiation Model Plugin Documentation',['../_radiation_doc.html',1,'PlugIns']]], + ['right_20cuda_20and_20optix_20version_2',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]] +]; diff --git a/doc/html/search/pages_16.js b/doc/html/search/pages_16.js new file mode 100644 index 000000000..cc7611ea1 --- /dev/null +++ b/doc/html/search/pages_16.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['self_20test_20tutorial_0',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], + ['set_20up_1',['Install and Set-up',['../_dependent_software.html',1,'']]], + ['shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_2',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['solar_20position_20plugin_20documentation_3',['Solar Position Plugin Documentation',['../_solar_position_doc.html',1,'PlugIns']]], + ['stomatal_20conductance_20model_20plugin_20documentation_4',['Stomatal Conductance Model Plugin Documentation',['../_stomatal_doc.html',1,'PlugIns']]], + ['sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_5',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]] +]; diff --git a/doc/html/search/pages_17.js b/doc/html/search/pages_17.js new file mode 100644 index 000000000..941cc70be --- /dev/null +++ b/doc/html/search/pages_17.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['test_20tutorial_0',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], + ['texture_20mask_20files_20with_20transparency_20using_20gimp_1',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['the_20clion_20ide_20with_20helios_2',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['the_20right_20cuda_20and_20optix_20version_3',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['timeout_4',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], + ['to_20ply_20using_20blender_5',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['transparency_20using_20gimp_6',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['tree_20light_20interception_7',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['tree_20plugin_20documentation_8',['Weber-Penn Tree Plugin Documentation',['../_weber_penn_doc.html',1,'PlugIns']]], + ['tutorial_9',['Tutorial',['../context_selftest.html',1,'Tutorial 0: Context Self-Test Tutorial'],['../context_vectors.html',1,'Tutorial 1: Helios Vector Types Tutorial']]], + ['tutorial_200_3a_20context_20self_20test_20tutorial_10',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], + ['tutorial_2010_3a_20radiation_20model_20basics_20tree_20light_20interception_11',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['tutorial_2011_3a_20light_20interception_20and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_12',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['tutorial_201_3a_20helios_20vector_20types_20tutorial_13',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]], + ['tutorial_202_3a_20working_20with_20context_20geometry_14',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['tutorial_205_3a_20primitive_20data_15',['Tutorial 5: Primitive Data',['../context_primdata.html',1,'Tutorials']]], + ['tutorial_206_3a_20global_20data_16',['Tutorial 6: Global Data',['../context_globaldata.html',1,'Tutorials']]], + ['tutorial_207_3a_20visualizer_20basics_17',['Tutorial 7: Visualizer Basics',['../visualizer_basics.html',1,'Tutorials']]], + ['tutorial_208_3a_20visualizing_20primitive_20data_20values_18',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], + ['tutorials_19',['Tutorials',['../_tutorials.html',1,'']]], + ['types_20tutorial_20',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]] +]; diff --git a/doc/html/search/pages_18.js b/doc/html/search/pages_18.js new file mode 100644 index 000000000..683011bc6 --- /dev/null +++ b/doc/html/search/pages_18.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['up_0',['Install and Set-up',['../_dependent_software.html',1,'']]], + ['user_20api_20guide_1',['User/API Guide',['../_a_p_i.html',1,'']]], + ['using_20blender_2',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['using_20gimp_3',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['using_20the_20clion_20ide_20with_20helios_4',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]] +]; diff --git a/doc/html/search/pages_19.js b/doc/html/search/pages_19.js new file mode 100644 index 000000000..37d584909 --- /dev/null +++ b/doc/html/search/pages_19.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['v1_203_2026_0',['Helios Documentation v1.3.26',['../index.html',1,'']]], + ['values_1',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], + ['vector_20types_20tutorial_2',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]], + ['version_3',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['visualizer_20basics_4',['Tutorial 7: Visualizer Basics',['../visualizer_basics.html',1,'Tutorials']]], + ['visualizer_20plugin_20documentation_5',['Visualizer Plugin Documentation',['../_visualizer_doc.html',1,'PlugIns']]], + ['visualizing_20primitive_20data_20values_6',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], + ['voxel_20intersection_20plugin_20documentation_7',['Voxel Intersection Plugin Documentation',['../_voxel_intersection_doc.html',1,'PlugIns']]] +]; diff --git a/doc/html/search/pages_1a.js b/doc/html/search/pages_1a.js new file mode 100644 index 000000000..2d37f211e --- /dev/null +++ b/doc/html/search/pages_1a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['weber_20penn_20tree_20plugin_20documentation_0',['Weber-Penn Tree Plugin Documentation',['../_weber_penn_doc.html',1,'PlugIns']]], + ['with_20context_20geometry_1',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['with_20helios_2',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['with_20transparency_20using_20gimp_3',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['working_20with_20context_20geometry_4',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['writing_20plugins_5',['Writing Plugins',['../_plugins.html',1,'']]] +]; diff --git a/doc/html/search/pages_2.js b/doc/html/search/pages_2.js index 745f7ca25..b89682b8d 100644 --- a/doc/html/search/pages_2.js +++ b/doc/html/search/pages_2.js @@ -1,4 +1,5 @@ var searchData= [ - ['boundary_2dlayer_20conductance_20model_20plugin_20documentation_0',['Boundary-Layer Conductance Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'PlugIns']]] + ['26_0',['Helios Documentation v1.3.26',['../index.html',1,'']]], + ['2_3a_20working_20with_20context_20geometry_1',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_3.js b/doc/html/search/pages_3.js index 452fcde54..c16a1d4fd 100644 --- a/doc/html/search/pages_3.js +++ b/doc/html/search/pages_3.js @@ -1,6 +1,4 @@ var searchData= [ - ['canopy_20generator_20plugin_20documentation_0',['Canopy Generator Plugin Documentation',['../_canopy_generator_doc.html',1,'PlugIns']]], - ['choosing_20the_20right_20cuda_20and_20optix_20version_1',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], - ['converting_20polygon_20file_20formats_20to_20_2eply_20using_20blender_2',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]] + ['3_2026_0',['Helios Documentation v1.3.26',['../index.html',1,'']]] ]; diff --git a/doc/html/search/pages_4.js b/doc/html/search/pages_4.js index d8fea619e..a4833130f 100644 --- a/doc/html/search/pages_4.js +++ b/doc/html/search/pages_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['dummy_20model_20plugin_20documentation_0',['Dummy Model Plugin Documentation',['../_dummy.html',1,'']]] + ['5_3a_20primitive_20data_0',['Tutorial 5: Primitive Data',['../context_primdata.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_5.js b/doc/html/search/pages_5.js index 80b36297d..24ffab6ff 100644 --- a/doc/html/search/pages_5.js +++ b/doc/html/search/pages_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['energy_20balance_20model_20plugin_20documentation_0',['Energy Balance Model Plugin Documentation',['../_energy_balance_doc.html',1,'PlugIns']]] + ['6_3a_20global_20data_0',['Tutorial 6: Global Data',['../context_globaldata.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_6.js b/doc/html/search/pages_6.js index b53061679..5a8ca5087 100644 --- a/doc/html/search/pages_6.js +++ b/doc/html/search/pages_6.js @@ -1,4 +1,4 @@ var searchData= [ - ['file_20input_2foutput_0',['File Input/Output',['../_i_o.html',1,'']]] + ['7_3a_20visualizer_20basics_0',['Tutorial 7: Visualizer Basics',['../visualizer_basics.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_7.js b/doc/html/search/pages_7.js index ae48419f5..2c7084b8a 100644 --- a/doc/html/search/pages_7.js +++ b/doc/html/search/pages_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['helios_20documentation_20v1_2e3_2e25_0',['Helios Documentation v1.3.25',['../index.html',1,'']]] + ['8_3a_20visualizing_20primitive_20data_20values_0',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_8.js b/doc/html/search/pages_8.js index a4e61e100..ac3d26691 100644 --- a/doc/html/search/pages_8.js +++ b/doc/html/search/pages_8.js @@ -1,5 +1,11 @@ var searchData= [ - ['increasing_20graphics_20driver_20timeout_0',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], - ['install_20and_20set_2dup_1',['Install and Set-up',['../_dependent_software.html',1,'']]] + ['a_20homogeneous_20canopy_0',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['aerial_20lidar_20point_20cloud_20plugin_20documentation_1',['Aerial LiDAR Point Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'PlugIns']]], + ['and_20fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_2',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['and_20optix_20version_3',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['and_20set_20up_4',['Install and Set-up',['../_dependent_software.html',1,'']]], + ['api_20guide_5',['User/API Guide',['../_a_p_i.html',1,'']]], + ['architecture_20model_20plugin_20documentation_6',['Plant Architecture Model Plugin Documentation',['../_plant_architecture_doc.html',1,'PlugIns']]], + ['area_20for_20a_20homogeneous_20canopy_7',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_9.js b/doc/html/search/pages_9.js index 2b8ab0302..8094fdf2a 100644 --- a/doc/html/search/pages_9.js +++ b/doc/html/search/pages_9.js @@ -1,4 +1,8 @@ var searchData= [ - ['making_20texture_20mask_20files_20with_20transparency_20using_20gimp_0',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]] + ['balance_20model_20plugin_20documentation_0',['Energy Balance Model Plugin Documentation',['../_energy_balance_doc.html',1,'PlugIns']]], + ['basics_1',['Tutorial 7: Visualizer Basics',['../visualizer_basics.html',1,'Tutorials']]], + ['basics_20tree_20light_20interception_2',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], + ['blender_3',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['boundary_20layer_20conductance_20model_20plugin_20documentation_4',['Boundary-Layer Conductance Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'PlugIns']]] ]; diff --git a/doc/html/search/pages_a.js b/doc/html/search/pages_a.js index 37f1bf26b..de06516d9 100644 --- a/doc/html/search/pages_a.js +++ b/doc/html/search/pages_a.js @@ -1,4 +1,13 @@ var searchData= [ - ['overview_0',['Overview',['../_overview.html',1,'']]] + ['canopy_0',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['canopy_20generator_20plugin_20documentation_1',['Canopy Generator Plugin Documentation',['../_canopy_generator_doc.html',1,'PlugIns']]], + ['choosing_20the_20right_20cuda_20and_20optix_20version_2',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]], + ['clion_20ide_20with_20helios_3',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['cloud_20plugin_20documentation_4',['Cloud Plugin Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation']]], + ['conductance_20model_20plugin_20documentation_5',['Conductance Model Plugin Documentation',['../_b_l_conductance_doc.html',1,'Boundary-Layer Conductance Model Plugin Documentation'],['../_stomatal_doc.html',1,'Stomatal Conductance Model Plugin Documentation']]], + ['context_20geometry_6',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['context_20self_20test_20tutorial_7',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], + ['converting_20polygon_20file_20formats_20to_20ply_20using_20blender_8',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['cuda_20and_20optix_20version_9',['Choosing the right CUDA and OptiX version',['../_choosing_c_u_d_a.html',1,'']]] ]; diff --git a/doc/html/search/pages_b.js b/doc/html/search/pages_b.js index be4b1499b..a36505f2a 100644 --- a/doc/html/search/pages_b.js +++ b/doc/html/search/pages_b.js @@ -1,6 +1,9 @@ var searchData= [ - ['photosynthesis_20model_20plugin_20documentation_0',['Photosynthesis Model Plugin Documentation',['../_photosynthesis_doc.html',1,'PlugIns']]], - ['plant_20architecture_20model_20plugin_20documentation_1',['Plant Architecture Model Plugin Documentation',['../_plant_architecture_doc.html',1,'PlugIns']]], - ['plug_2dins_2',['Plug-ins',['../_plug_ins.html',1,'']]] + ['data_0',['Data',['../context_primdata.html',1,'Tutorial 5: Primitive Data'],['../context_globaldata.html',1,'Tutorial 6: Global Data']]], + ['data_20values_1',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], + ['documentation_2',['Documentation',['../_aerial_li_d_a_r_doc.html',1,'Aerial LiDAR Point Cloud Plugin Documentation'],['../_b_l_conductance_doc.html',1,'Boundary-Layer Conductance Model Plugin Documentation'],['../_canopy_generator_doc.html',1,'Canopy Generator Plugin Documentation'],['../_dummy.html',1,'Dummy Model Plugin Documentation'],['../_energy_balance_doc.html',1,'Energy Balance Model Plugin Documentation'],['../_li_d_a_r_doc.html',1,'LiDAR Point Cloud Plugin Documentation'],['../_photosynthesis_doc.html',1,'Photosynthesis Model Plugin Documentation'],['../_plant_architecture_doc.html',1,'Plant Architecture Model Plugin Documentation'],['../_radiation_doc.html',1,'Radiation Model Plugin Documentation'],['../_solar_position_doc.html',1,'Solar Position Plugin Documentation'],['../_stomatal_doc.html',1,'Stomatal Conductance Model Plugin Documentation'],['../_visualizer_doc.html',1,'Visualizer Plugin Documentation'],['../_voxel_intersection_doc.html',1,'Voxel Intersection Plugin Documentation'],['../_weber_penn_doc.html',1,'Weber-Penn Tree Plugin Documentation']]], + ['documentation_20v1_203_2026_3',['Helios Documentation v1.3.26',['../index.html',1,'']]], + ['driver_20timeout_4',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], + ['dummy_20model_20plugin_20documentation_5',['Dummy Model Plugin Documentation',['../_dummy.html',1,'']]] ]; diff --git a/doc/html/search/pages_c.js b/doc/html/search/pages_c.js index c057f3423..80b36297d 100644 --- a/doc/html/search/pages_c.js +++ b/doc/html/search/pages_c.js @@ -1,4 +1,4 @@ var searchData= [ - ['radiation_20model_20plugin_20documentation_0',['Radiation Model Plugin Documentation',['../_radiation_doc.html',1,'PlugIns']]] + ['energy_20balance_20model_20plugin_20documentation_0',['Energy Balance Model Plugin Documentation',['../_energy_balance_doc.html',1,'PlugIns']]] ]; diff --git a/doc/html/search/pages_d.js b/doc/html/search/pages_d.js index db0a3f6b8..c63717ad6 100644 --- a/doc/html/search/pages_d.js +++ b/doc/html/search/pages_d.js @@ -1,5 +1,9 @@ var searchData= [ - ['solar_20position_20plugin_20documentation_0',['Solar Position Plugin Documentation',['../_solar_position_doc.html',1,'PlugIns']]], - ['stomatal_20conductance_20model_20plugin_20documentation_1',['Stomatal Conductance Model Plugin Documentation',['../_stomatal_doc.html',1,'PlugIns']]] + ['file_20formats_20to_20ply_20using_20blender_0',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['file_20input_20output_1',['File Input/Output',['../_i_o.html',1,'']]], + ['files_20with_20transparency_20using_20gimp_2',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['for_20a_20homogeneous_20canopy_3',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], + ['formats_20to_20ply_20using_20blender_4',['Converting polygon file formats to .ply using Blender',['../_convert_p_l_y.html',1,'']]], + ['fraction_20of_20sunlit_20shaded_20leaf_20area_20for_20a_20homogeneous_20canopy_5',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/pages_e.js b/doc/html/search/pages_e.js index b5336828e..9e100670f 100644 --- a/doc/html/search/pages_e.js +++ b/doc/html/search/pages_e.js @@ -1,13 +1,9 @@ var searchData= [ - ['tutorial_200_3a_20context_20self_2dtest_20tutorial_0',['Tutorial 0: Context Self-Test Tutorial',['../context_selftest.html',1,'Tutorials']]], - ['tutorial_2010_3a_20radiation_20model_20basics_20_2d_20tree_20light_20interception_1',['Tutorial 10: Radiation model basics - tree light interception',['../radiation_basics.html',1,'Tutorials']]], - ['tutorial_2011_3a_20light_20interception_20and_20fraction_20of_20sunlit_2fshaded_20leaf_20area_20for_20a_20homogeneous_20canopy_2',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]], - ['tutorial_201_3a_20helios_20vector_20types_20tutorial_3',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]], - ['tutorial_202_3a_20working_20with_20context_20geometry_4',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], - ['tutorial_205_3a_20primitive_20data_5',['Tutorial 5: Primitive Data',['../context_primdata.html',1,'Tutorials']]], - ['tutorial_206_3a_20global_20data_6',['Tutorial 6: Global Data',['../context_globaldata.html',1,'Tutorials']]], - ['tutorial_207_3a_20_25visualizer_20basics_7',['Tutorial 7: %Visualizer Basics',['../visualizer_basics.html',1,'Tutorials']]], - ['tutorial_208_3a_20visualizing_20primitive_20data_20values_8',['Tutorial 8: Visualizing primitive data values',['../visualizer_pdata.html',1,'Tutorials']]], - ['tutorials_9',['Tutorials',['../_tutorials.html',1,'']]] + ['generator_20plugin_20documentation_0',['Canopy Generator Plugin Documentation',['../_canopy_generator_doc.html',1,'PlugIns']]], + ['geometry_1',['Tutorial 2: Working with Context Geometry',['../context_primitives.html',1,'Tutorials']]], + ['gimp_2',['Making texture mask files with transparency using GIMP',['../_making_masks.html',1,'']]], + ['global_20data_3',['Tutorial 6: Global Data',['../context_globaldata.html',1,'Tutorials']]], + ['graphics_20driver_20timeout_4',['Increasing graphics driver timeout',['../_p_c_g_p_u_timeout.html',1,'']]], + ['guide_5',['User/API Guide',['../_a_p_i.html',1,'']]] ]; diff --git a/doc/html/search/pages_f.js b/doc/html/search/pages_f.js index f98dc7378..3b631c953 100644 --- a/doc/html/search/pages_f.js +++ b/doc/html/search/pages_f.js @@ -1,5 +1,7 @@ var searchData= [ - ['user_2fapi_20guide_0',['User/API Guide',['../_a_p_i.html',1,'']]], - ['using_20the_20clion_20ide_20with_20helios_1',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]] + ['helios_0',['Using the CLion IDE with Helios',['../_c_lion_i_d_e.html',1,'']]], + ['helios_20documentation_20v1_203_2026_1',['Helios Documentation v1.3.26',['../index.html',1,'']]], + ['helios_20vector_20types_20tutorial_2',['Tutorial 1: Helios Vector Types Tutorial',['../context_vectors.html',1,'Tutorials']]], + ['homogeneous_20canopy_3',['Tutorial 11: Light interception and fraction of sunlit/shaded leaf area for a homogeneous canopy',['../radiation__beers_law.html',1,'Tutorials']]] ]; diff --git a/doc/html/search/related_0.js b/doc/html/search/related_0.js index a1f73e50e..228621233 100644 --- a/doc/html/search/related_0.js +++ b/doc/html/search/related_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['operator_3c_3c_0',['operator<<',['../structhelios_1_1int2.html#aa70779f707686be8b004587a4220a153',1,'helios::int2::operator<<()'],['../structhelios_1_1int3.html#a6f576c885af0d781aadda850a2ca77af',1,'helios::int3::operator<<()'],['../structhelios_1_1int4.html#ac6b32d39d92de0b8585c64048040f0f9',1,'helios::int4::operator<<()'],['../structhelios_1_1vec2.html#a5e585083b0cf16b2e73958747390e152',1,'helios::vec2::operator<<()'],['../structhelios_1_1vec3.html#a87277dd90e0869e2e8e7ce376dfc7033',1,'helios::vec3::operator<<()'],['../structhelios_1_1vec4.html#a32f014dbb41084ece2ad85f19c540874',1,'helios::vec4::operator<<()'],['../structhelios_1_1_r_g_bcolor.html#a47b1d94ed5f6fa0c8ae897e02a06435c',1,'helios::RGBcolor::operator<<()'],['../structhelios_1_1_r_g_b_acolor.html#aaa76985ee048b321703f78175e2b87b7',1,'helios::RGBAcolor::operator<<()'],['../structhelios_1_1_date.html#a189b8537a2e0696e2f38da34e0f13eec',1,'helios::Date::operator<<()'],['../structhelios_1_1_time.html#a5d53ebf9a42b3aa2d959a3cd5023c71a',1,'helios::Time::operator<<()'],['../structhelios_1_1_location.html#a60375cac034fe50880b47569df6e8f69',1,'helios::Location::operator<<()'],['../structhelios_1_1_spherical_coord.html#ad9381fdcb8448d8834b4ce43465b5335',1,'helios::SphericalCoord::operator<<()']]] + ['operator_3c_3c_0',['operator<<',['../structhelios_1_1int2.html#aa70779f707686be8b004587a4220a153',1,'helios::int2::operator<<'],['../structhelios_1_1int3.html#a6f576c885af0d781aadda850a2ca77af',1,'helios::int3::operator<<'],['../structhelios_1_1int4.html#ac6b32d39d92de0b8585c64048040f0f9',1,'helios::int4::operator<<'],['../structhelios_1_1vec2.html#a5e585083b0cf16b2e73958747390e152',1,'helios::vec2::operator<<'],['../structhelios_1_1vec3.html#a87277dd90e0869e2e8e7ce376dfc7033',1,'helios::vec3::operator<<'],['../structhelios_1_1vec4.html#a32f014dbb41084ece2ad85f19c540874',1,'helios::vec4::operator<<'],['../structhelios_1_1_r_g_bcolor.html#a47b1d94ed5f6fa0c8ae897e02a06435c',1,'helios::RGBcolor::operator<<'],['../structhelios_1_1_r_g_b_acolor.html#aaa76985ee048b321703f78175e2b87b7',1,'helios::RGBAcolor::operator<<'],['../structhelios_1_1_date.html#a189b8537a2e0696e2f38da34e0f13eec',1,'helios::Date::operator<<'],['../structhelios_1_1_time.html#a5d53ebf9a42b3aa2d959a3cd5023c71a',1,'helios::Time::operator<<'],['../structhelios_1_1_location.html#a60375cac034fe50880b47569df6e8f69',1,'helios::Location::operator<<'],['../structhelios_1_1_spherical_coord.html#ad9381fdcb8448d8834b4ce43465b5335',1,'helios::SphericalCoord::operator<<']]] ]; diff --git a/doc/html/search/search.css b/doc/html/search/search.css index 9d7629134..d7b0f90b7 100644 --- a/doc/html/search/search.css +++ b/doc/html/search/search.css @@ -139,7 +139,7 @@ dark-mode-toggle { span.SelectionMark { margin-right: 4px; - font-family: monospace,fixed; + font-family: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; outline-style: none; text-decoration: none; } diff --git a/doc/html/search/search.js b/doc/html/search/search.js index e103a2621..666af01e5 100644 --- a/doc/html/search/search.js +++ b/doc/html/search/search.js @@ -22,58 +22,9 @@ @licend The above is the entire license notice for the JavaScript code in this file */ -function convertToId(search) -{ - var result = ''; - for (i=0;i document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); // ------------ Event Handlers // Called when focus is added or removed from the search field. - this.OnSearchFieldFocus = function(isActive) - { + this.OnSearchFieldFocus = function(isActive) { this.Activate(isActive); } - this.OnSearchSelectShow = function() - { - var searchSelectWindow = this.DOMSearchSelectWindow(); - var searchField = this.DOMSearchSelect(); + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); - var left = getXPos(searchField); - var top = getYPos(searchField); - top += searchField.offsetHeight; + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; // show search selection popup searchSelectWindow.style.display='block'; @@ -146,55 +102,44 @@ function SearchBox(name, resultsPath, extension) searchSelectWindow.style.top = top + 'px'; // stop selection hide timer - if (this.hideTimeout) - { + if (this.hideTimeout) { clearTimeout(this.hideTimeout); this.hideTimeout=0; } return false; // to avoid "image drag" default event } - this.OnSearchSelectHide = function() - { - this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()", + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), this.closeSelectionTimeout); } // Called when the content of the search field is changed. - this.OnSearchFieldChange = function(evt) - { - if (this.keyTimeout) // kill running timer - { + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer clearTimeout(this.keyTimeout); this.keyTimeout = 0; } - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 || e.keyCode==13) - { - if (e.shiftKey==1) - { + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { this.OnSearchSelectShow(); - var win=this.DOMSearchSelectWindow(); - for (i=0;i do a search - { + const searchValue = this.DOMSearchField().value.replace(/ +/g, ""); + if (searchValue!="" && this.searchActive) { // something was found -> do a search this.Search(); } } - this.OnSearchSelectKey = function(evt) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) // Up - { + } else if (e.keyCode==38 && this.searchIndex>0) { // Up this.searchIndex--; this.OnSelectItem(this.searchIndex); - } - else if (e.keyCode==13 || e.keyCode==27) - { + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); this.OnSelectItem(this.searchIndex); this.CloseSelectionWindow(); this.DOMSearchField().focus(); @@ -299,78 +239,75 @@ function SearchBox(name, resultsPath, extension) // --------- Actions // Closes the results window. - this.CloseResultsWindow = function() - { + this.CloseResultsWindow = function() { this.DOMPopupSearchResultsWindow().style.display = 'none'; this.DOMSearchClose().style.display = 'none'; this.Activate(false); } - this.CloseSelectionWindow = function() - { + this.CloseSelectionWindow = function() { this.DOMSearchSelectWindow().style.display = 'none'; } // Performs a search. - this.Search = function() - { + this.Search = function() { this.keyTimeout = 0; // strip leading whitespace - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - var code = searchValue.toLowerCase().charCodeAt(0); - var idxChar = searchValue.substr(0, 1).toLowerCase(); - if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair - { + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair idxChar = searchValue.substr(0, 2); } - var jsFile; - - var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); - if (idx!=-1) - { - var hexCode=idx.toString(16); - jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; } - var loadJS = function(url, impl, loc){ - var scriptTag = document.createElement('script'); + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); scriptTag.src = url; scriptTag.onload = impl; scriptTag.onreadystatechange = impl; loc.appendChild(scriptTag); } - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - var domSearchBox = this.DOMSearchBox(); - var domPopupSearchResults = this.DOMPopupSearchResults(); - var domSearchClose = this.DOMSearchClose(); - var resultsPath = this.resultsPath; + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; - var handleResults = function() { + const handleResults = function() { document.getElementById("Loading").style.display="none"; if (typeof searchData !== 'undefined') { createResults(resultsPath); document.getElementById("NoMatches").style.display="none"; } - - searchResults.Search(searchValue); - if (domPopupSearchResultsWindow.style.display!='block') - { + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { domSearchClose.style.display = 'inline-block'; - var left = getXPos(domSearchBox) + 150; - var top = getYPos(domSearchBox) + 20; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; domPopupSearchResultsWindow.style.display = 'block'; left -= domPopupSearchResults.offsetWidth; - var maxWidth = document.body.clientWidth; - var maxHeight = document.body.clientHeight; - var width = 300; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; if (left<10) left=10; if (width+left+8>maxWidth) width=maxWidth-left-8; - var height = 400; + let height = 400; if (height+top+8>maxHeight) height=maxHeight-top-8; domPopupSearchResultsWindow.style.top = top + 'px'; domPopupSearchResultsWindow.style.left = left + 'px'; @@ -392,17 +329,13 @@ function SearchBox(name, resultsPath, extension) // Activates or deactivates the search panel, resetting things to // their default values if necessary. - this.Activate = function(isActive) - { + this.Activate = function(isActive) { if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) - { + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { this.DOMSearchBox().className = 'MSearchBoxActive'; this.searchActive = true; - } - else if (!isActive) // directly remove the panel - { + } else if (!isActive) { // directly remove the panel this.DOMSearchBox().className = 'MSearchBoxInactive'; this.searchActive = false; this.lastSearchValue = '' @@ -415,402 +348,347 @@ function SearchBox(name, resultsPath, extension) // ----------------------------------------------------------------------- // The class that handles everything on the search results page. -function SearchResults(name) -{ - // The number of matches from the last run of . - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) - { - var parentElement = document.getElementById(id); - var element = parentElement.firstChild; - - while (element && element!=parentElement) - { - if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') - { - return element; - } +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; - if (element && element!=parentElement) - { - element = element.nextSibling; - } - } + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; } - } - this.Toggle = function(id) - { - var element = this.FindChildElement(id); - if (element) - { - if (element.style.display == 'block') - { - element.style.display = 'none'; + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; } - else - { - element.style.display = 'block'; + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; } } } + } - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) - { - if (!search) // get search word from URL - { - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) - { - row.style.display = 'block'; - matches++; - } - else - { - row.style.display = 'none'; - } - } - i++; + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; } - document.getElementById("Searching").style.display='none'; - if (matches == 0) // no results - { - document.getElementById("NoMatches").style.display='block'; - } - else // at least one result - { - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; } + } - // return the first item with index index or higher that is visible - this.NavNext = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; } - focusItem=null; - index++; } - return focusItem; + i++; } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } - this.NavPrev = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index--; + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; } - return focusItem; + focusItem=null; + index--; } + return focusItem; + } - this.ProcessKeys = function(e) - { - if (e.type == "keydown") - { - this.repeatOn = false; - this.lastKey = e.keyCode; - } - else if (e.type == "keypress") - { - if (!this.repeatOn) - { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown } - else if (e.type == "keyup") - { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; } + return this.lastKey!=0; + } - this.Nav = function(evt,itemIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - var newIndex = itemIndex-1; - var focusItem = this.NavPrev(newIndex); - if (focusItem) - { - var child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') // children visible - { - var n=0; - var tmpElem; - while (1) // search for last child - { - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) - { - focusItem = tmpElem; - } - else // found it! - { - break; - } - n++; + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; } + n++; } } - if (focusItem) - { - focusItem.focus(); - } - else // return focus to search field - { - document.getElementById("MSearchField").focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = itemIndex+1; - var focusItem; - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') // children visible - { - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); } - else if (this.lastKey==39) // Right - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } - else if (this.lastKey==37) // Left - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } - else if (this.lastKey==27) // Escape - { - searchBox.CloseResultsWindow(); + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field document.getElementById("MSearchField").focus(); } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; } + return false; + } - this.NavChild = function(evt,itemIndex,childIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - if (childIndex>0) - { - var newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } - else // already at first child, jump to parent - { - document.getElementById('Item'+itemIndex).focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = childIndex+1; - var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) // last child, jump to parent next parent - { - elem = this.NavNext(itemIndex+1); - } - if (elem) - { - elem.focus(); - } - } - else if (this.lastKey==27) // Escape - { - searchBox.CloseResultsWindow(); - document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; } + return false; + } } -function setKeyActions(elem,action) -{ - elem.setAttribute('onkeydown',action); - elem.setAttribute('onkeypress',action); - elem.setAttribute('onkeyup',action); -} +function createResults(resultsPath) { -function setClassAttr(elem,attr) -{ - elem.setAttribute('class',attr); - elem.setAttribute('className',attr); -} + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } -function createResults(resultsPath) -{ - var results = document.getElementById("SRResults"); + const results = document.getElementById("SRResults"); results.innerHTML = ''; - for (var e=0; e { + const id = elem[0]; + const srResult = document.createElement('div'); srResult.setAttribute('id','SR_'+id); setClassAttr(srResult,'SRResult'); - var srEntry = document.createElement('div'); + const srEntry = document.createElement('div'); setClassAttr(srEntry,'SREntry'); - var srLink = document.createElement('a'); - srLink.setAttribute('id','Item'+e); - setKeyActions(srLink,'return searchResults.Nav(event,'+e+')'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); setClassAttr(srLink,'SRSymbol'); - srLink.innerHTML = searchData[e][1][0]; + srLink.innerHTML = elem[1][0]; srEntry.appendChild(srLink); - if (searchData[e][1].length==2) // single result - { - srLink.setAttribute('href',resultsPath+searchData[e][1][1][0]); + if (elem[1].length==2) { // single result + srLink.setAttribute('href',resultsPath+elem[1][1][0]); srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); - if (searchData[e][1][1][1]) - { + if (elem[1][1][1]) { srLink.setAttribute('target','_parent'); - } - else - { + } else { srLink.setAttribute('target','_blank'); } - var srScope = document.createElement('span'); + const srScope = document.createElement('span'); setClassAttr(srScope,'SRScope'); - srScope.innerHTML = searchData[e][1][1][2]; + srScope.innerHTML = elem[1][1][2]; srEntry.appendChild(srScope); - } - else // multiple results - { + } else { // multiple results srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); - var srChildren = document.createElement('div'); + const srChildren = document.createElement('div'); setClassAttr(srChildren,'SRChildren'); - for (var c=0; c Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    sorghum.cpp
    @@ -99,6 +111,7 @@
    5
    6
    7// SORGHUM PLANT
    +
    8uint CanopyGenerator::sorghum( const SorghumCanopyParameters &params, const vec3 &origin ) {
    9 // STAGE 1
    10 if (params.sorghum_stage ==1){
    @@ -534,7 +547,7 @@
    440
    441 int nodes_no = params.s3_number_of_leaves;
    442
    -
    443 float rotation_x1 = (context->randu(0, 360) * PI_F) / float(180);// inclination rotation, different for each plant
    +
    443 float rotation_x1 = (context->randu(0, 360) * PI_F) / float(180);// inclination rotation, different for each plant
    444 std::vector<std::vector<uint> > s3_UUID_leaf_plant;
    445
    446 for (int i = 1; i < (nodes_no + 1); i++) {
    @@ -653,12 +666,12 @@
    559 frac = 1;
    560 } else {
    561
    -
    562 frac = 1 - ((i - (context->randu() / float(2))) / float((nodes_no + 1)));
    +
    562 frac = 1 - ((i - (context->randu() / float(2))) / float((nodes_no + 1)));
    563 }
    564
    565 vec3 base = interpolateTube(node_stem, frac);
    -
    566 float rotation_1 = - (params.s3_mean_leaf_angle * PI_F / float(180)) - (context->randu(0, 5) * PI_F) / float(180);
    -
    567 float rotation_x2 = (context->randu(0, 45) * PI_F) / float(180);
    +
    566 float rotation_1 = - (params.s3_mean_leaf_angle * PI_F / float(180)) - (context->randu(0, 5) * PI_F) / float(180);
    +
    567 float rotation_x2 = (context->randu(0, 45) * PI_F) / float(180);
    568 float rotation_2 = rotation_x1 + rotation_x2;
    569 float rotation_3 = rotation_2 + PI_F; //
    570 vec3 translation(-params.s3_stem_radius * 2.8, -0.9 / (2 / float(params.s3_leaf_size.y)), 0); // adjustment
    @@ -814,7 +827,7 @@
    720
    721 int nodes_no = params.s4_number_of_leaves;
    722
    -
    723 float rotation_x1 = (context->randu(0, 360) * PI_F) / float(180);// inclination rotation, different for each plant
    +
    723 float rotation_x1 = (context->randu(0, 360) * PI_F) / float(180);// inclination rotation, different for each plant
    724 std::vector<std::vector<uint> > s4_UUID_leaf_plant;
    725
    726 for (int i = 1; i < (nodes_no + 1); i++) {
    @@ -933,12 +946,12 @@
    839 if (i == 1) {
    840 frac = 0.9;
    841 } else {
    -
    842 frac = (1 - ((i - (context->randu() / float(2))) / float((nodes_no + 1)*1.2))) - 0.15;
    +
    842 frac = (1 - ((i - (context->randu() / float(2))) / float((nodes_no + 1)*1.2))) - 0.15;
    843 }
    844
    845 vec3 base = interpolateTube(node_stem, frac);
    -
    846 float rotation_1 = - (params.s4_mean_leaf_angle * PI_F / float(180)) - (context->randu(0, 5) * PI_F) / float(180);
    -
    847 float rotation_x2 = (context->randu(0, 45) * PI_F) / float(180);
    +
    846 float rotation_1 = - (params.s4_mean_leaf_angle * PI_F / float(180)) - (context->randu(0, 5) * PI_F) / float(180);
    +
    847 float rotation_x2 = (context->randu(0, 45) * PI_F) / float(180);
    848 float rotation_2 = rotation_x1 + rotation_x2;
    849 float rotation_3 = rotation_2 + PI_F; //
    850 vec3 translation(-params.s4_stem_radius * 2, -0.9 / (2 / float(params.s4_leaf_size.y)), 0); // adjustment
    @@ -981,7 +994,7 @@
    887 float mid_height = params.s5_stem_length * 0.5;
    888 float nx = n * dx;
    889 float i = nx * (180 / float(params.s5_stem_length)) * PI_F / float(180);
    -
    890 float i_mid = (mid_height) * (180 / float(params.s5_stem_length)) * PI_F / float(180);
    +
    890 float i_mid = (mid_height) * (180 / float(params.s5_stem_length)) * PI_F / float(180);
    891 float x_mid = -params.s5_stem_bend * sin(i_mid);
    892 float x1, x;
    893 if (nx <= mid_height) {
    @@ -1126,7 +1139,7 @@
    1032 int nodes_no = params.s5_number_of_leaves;
    1033
    1034
    -
    1035 float rotation_x1 = (context->randu(0, 360) * PI_F) / float(180);// inclination rotation, different for each plant
    +
    1035 float rotation_x1 = (context->randu(0, 360) * PI_F) / float(180);// inclination rotation, different for each plant
    1036 std::vector<std::vector<uint> > s5_UUID_leaf_plant;
    1037
    1038 for (int i = 1; i < (nodes_no + 1); i++) {
    @@ -1229,12 +1242,12 @@
    1135 frac = 0.9;
    1136 } else {
    1137
    -
    1138 frac = (1 - ((i - (context->randu() / float(2))) / float((nodes_no + 1)*1.2))) - 0.15;
    +
    1138 frac = (1 - ((i - (context->randu() / float(2))) / float((nodes_no + 1)*1.2))) - 0.15;
    1139 }
    1140
    1141 vec3 base = interpolateTube(nodes_stem, frac);
    -
    1142 float rotation_1 = - (params.s5_mean_leaf_angle * PI_F / float(180)) - (context->randu(0, 10) * PI_F) / float(180);
    -
    1143 float rotation_x2 = (context->randu(0, 45) * PI_F) / float(180);
    +
    1142 float rotation_1 = - (params.s5_mean_leaf_angle * PI_F / float(180)) - (context->randu(0, 10) * PI_F) / float(180);
    +
    1143 float rotation_x2 = (context->randu(0, 45) * PI_F) / float(180);
    1144 float rotation_2 = rotation_x1 + rotation_x2;
    1145 float rotation_3 = rotation_2 + PI_F; //
    1146 vec3 translation(0, -0.9 / (2 / float(params.s5_leaf_size.y)), 0); // adjustment
    @@ -1254,7 +1267,7 @@
    1160
    1161 }
    1162
    -
    1163 float plant_rotation = (context->randu(0, 360) * PI_F) / float(180);
    +
    1163 float plant_rotation = (context->randu(0, 360) * PI_F) / float(180);
    1164
    1165 context->rotatePrimitive( s5_UUID_stem_plant,plant_rotation,origin, make_vec3(0,0,1));
    1166 context->rotatePrimitive( flatten(s5_UUID_panicle_plant),plant_rotation,origin, make_vec3(0,0,1));
    @@ -1272,91 +1285,93 @@
    1178 return UUID_leaf.size()-1;
    1179
    1180};
    +
    1181
    1182
    1183
    -
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    -
    uint sorghum(const SorghumCanopyParameters &params, const helios::vec3 &origin)
    Function to add an individual sorghum plant.
    Definition: sorghum.cpp:8
    -
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition: Context.cpp:1406
    -
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition: Context.cpp:1536
    -
    float randu()
    Draw a random number from a uniform distribution between 0 and 1.
    Definition: Context.cpp:1178
    -
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition: Context.cpp:1420
    -
    uint copyPrimitive(uint UUID)
    Make a copy of a primitive from the context.
    Definition: Context.cpp:1578
    -
    std::vector< uint > addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
    Add new Disk geometric primitive to the Context given its center, and size.
    Definition: Context.cpp:6356
    -
    std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition: Context.cpp:5930
    -
    std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
    Function to flatten a 2D int vector into a 1D vector.
    Definition: global.cpp:1943
    -
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition: global.cpp:610
    -
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition: Context.cpp:1328
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    RGBcolor make_RGBcolor(float r, float g, float b)
    Make an RGBcolor vector.
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    -
    Parameters defining Sorghum plant canopy.
    -
    int s5_stem_subdivisions
    Number of stem radial subdivisions for stage 5.
    -
    float s1_leaf1_angle
    Leaf1 vertical angle of rotation for stage 1.
    -
    float s5_stem_length
    Length of the sorghum stem for stage 5.
    -
    std::string s4_seed_texture_file
    Texture map of the panicle for stage 4.
    -
    int s5_number_of_leaves
    Number of leaves for the sorghum plant, stage 5.
    -
    float s5_mean_leaf_angle
    Mean vertical angle of rotation of leaf for stage 5 in degrees; Standard deviation for the angle is 1...
    -
    float s4_stem_length
    Length of the sorghum stem for stage 4.
    -
    helios::int2 s3_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 3.
    -
    std::string s1_leaf_texture_file
    Texture map for sorghum leaf1 for stage 1.
    -
    helios::vec2 s1_leaf_size2
    Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
    -
    float s4_stem_radius
    Radius of the sorghum stem for stage 4.
    -
    float s3_mean_leaf_angle
    Mean vertical angle of rotation of leaf for stage 3 in degrees; Standard deviation for the leaves is ...
    -
    float s4_stem_subdivisions
    Number of stem radial subdivisions for stage 4.
    -
    std::string s2_leaf_texture_file
    Texture map for sorghum leaf for stage 2.
    -
    int s5_panicle_subdivisions
    Number of panicle subdivisions for each grain sphere within a panicle, stage 5.
    -
    float s4_mean_leaf_angle
    Mean vertical angle of rotation of leaf for stage 4 in degrees; Standard deviation for the angle is 5...
    -
    helios::int2 s2_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 2.
    -
    helios::vec2 s4_leaf_size
    Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 4.
    -
    helios::int2 s4_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 4.
    -
    float s2_stem_radius
    Radius of the sorghum stem for stage 2.
    -
    float s5_stem_bend
    Bend of the stem from mid-section for stage 5. The distance from the mid-section of the stem to the i...
    -
    helios::vec2 s1_leaf_size1
    Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
    -
    float s5_stem_radius
    Radius of the sorghum stem for stage 5.
    -
    float s3_stem_radius
    Radius of the sorghum stem for stage 3.
    -
    std::string s5_leaf_texture_file
    Texture map for sorghum leaf, stage 5.
    -
    helios::int2 s5_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 5.
    -
    helios::vec2 s1_leaf_size3
    Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
    -
    int s4_number_of_leaves
    Number of leaves for the sorghum plant, stage 4.
    -
    int s4_panicle_subdivisions
    Number of panicle subdivisions for each grain sphere within a panicle, stage 4.
    -
    float s3_stem_length
    Length of the sorghum stem for stage 3.
    -
    std::string s3_leaf_texture_file
    Texture map for sorghum leaf for stage 3.
    -
    helios::vec2 s2_leaf_size3
    Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    -
    float s1_stem_radius
    Radius of the sorghum stem for stage 1.
    -
    helios::vec2 s5_panicle_size
    Size of panicle in x- and y- directions for stage 5.
    -
    int s3_number_of_leaves
    Number of leaves along the stem for stage 3.
    -
    helios::vec2 s2_leaf_size5
    Length of leaf5 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    -
    helios::vec2 s5_leaf_size
    Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 5.
    -
    float s1_stem_subdivisions
    Number of stem radial subdivisions for stage 1.
    -
    helios::vec2 s2_leaf_size4
    Length of leaf4 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    -
    helios::int2 s1_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 1.
    -
    std::string s4_leaf_texture_file
    Texture map for sorghum leaf, stage 4.
    -
    helios::vec2 s2_leaf_size2
    Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    -
    helios::vec2 s3_leaf_size
    Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 3.
    -
    float s2_stem_length
    Length of the sorghum stem for stage 2.
    -
    float s1_leaf2_angle
    Leaf2 vertical angle of rotation for stage 1.
    -
    float s3_stem_subdivisions
    Number of stem radial subdivisions for stage 3.
    -
    float s1_stem_length
    Length of the sorghum stem for stage 1.
    -
    int sorghum_stage
    Sorghum categorized into 5 stages; 1 - Three leaf stage, 2 - Five leaf stage, 3 - Panicle initiation ...
    -
    float s1_leaf3_angle
    Leaf3 vertical angle of rotation for stage 1.
    -
    helios::vec2 s2_leaf_size1
    Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    -
    std::string s5_seed_texture_file
    Texture map of the panicle for stage 5.
    -
    helios::vec2 s4_panicle_size
    Size of panicle in x- and y- directions for stage 4.
    -
    R-G-B color vector.
    -
    const float & zenith
    Zenithal angle (radians)
    -
    int y
    Second element in vector.
    -
    int x
    First element in vector.
    -
    Vector of two elements of type 'float'.
    -
    float x
    First element in vector.
    -
    float y
    Second element in vector.
    -
    Vector of three elements of type 'float'.
    +
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    +
    uint sorghum(const SorghumCanopyParameters &params, const helios::vec3 &origin)
    Function to add an individual sorghum plant.
    Definition sorghum.cpp:8
    +
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition Context.cpp:1406
    +
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition Context.cpp:1536
    +
    float randu()
    Draw a random number from a uniform distribution between 0 and 1.
    Definition Context.cpp:1178
    +
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition Context.cpp:1420
    +
    uint copyPrimitive(uint UUID)
    Make a copy of a primitive from the context.
    Definition Context.cpp:1578
    +
    std::vector< uint > addDisk(uint Ndivs, const helios::vec3 &center, const helios::vec2 &size)
    Add new Disk geometric primitive to the Context given its center, and size.
    Definition Context.cpp:6356
    +
    std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition Context.cpp:5930
    +
    std::vector< int > flatten(const std::vector< std::vector< int > > &vec)
    Function to flatten a 2D int vector into a 1D vector.
    Definition global.cpp:1943
    +
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition global.cpp:610
    +
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition Context.cpp:1328
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    RGBcolor make_RGBcolor(float r, float g, float b)
    Make an RGBcolor vector.
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    +
    Parameters defining Sorghum plant canopy.
    +
    int s5_stem_subdivisions
    Number of stem radial subdivisions for stage 5.
    +
    float s1_leaf1_angle
    Leaf1 vertical angle of rotation for stage 1.
    +
    float s5_stem_length
    Length of the sorghum stem for stage 5.
    +
    std::string s4_seed_texture_file
    Texture map of the panicle for stage 4.
    +
    int s5_number_of_leaves
    Number of leaves for the sorghum plant, stage 5.
    +
    float s5_mean_leaf_angle
    Mean vertical angle of rotation of leaf for stage 5 in degrees; Standard deviation for the angle is 1...
    +
    float s4_stem_length
    Length of the sorghum stem for stage 4.
    +
    helios::int2 s3_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 3.
    +
    std::string s1_leaf_texture_file
    Texture map for sorghum leaf1 for stage 1.
    +
    helios::vec2 s1_leaf_size2
    Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
    +
    float s4_stem_radius
    Radius of the sorghum stem for stage 4.
    +
    float s3_mean_leaf_angle
    Mean vertical angle of rotation of leaf for stage 3 in degrees; Standard deviation for the leaves is ...
    +
    float s4_stem_subdivisions
    Number of stem radial subdivisions for stage 4.
    +
    std::string s2_leaf_texture_file
    Texture map for sorghum leaf for stage 2.
    +
    int s5_panicle_subdivisions
    Number of panicle subdivisions for each grain sphere within a panicle, stage 5.
    +
    float s4_mean_leaf_angle
    Mean vertical angle of rotation of leaf for stage 4 in degrees; Standard deviation for the angle is 5...
    +
    helios::int2 s2_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 2.
    +
    helios::vec2 s4_leaf_size
    Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 4.
    +
    helios::int2 s4_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 4.
    +
    float s2_stem_radius
    Radius of the sorghum stem for stage 2.
    +
    float s5_stem_bend
    Bend of the stem from mid-section for stage 5. The distance from the mid-section of the stem to the i...
    +
    helios::vec2 s1_leaf_size1
    Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
    +
    float s5_stem_radius
    Radius of the sorghum stem for stage 5.
    +
    float s3_stem_radius
    Radius of the sorghum stem for stage 3.
    +
    std::string s5_leaf_texture_file
    Texture map for sorghum leaf, stage 5.
    +
    helios::int2 s5_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 5.
    +
    helios::vec2 s1_leaf_size3
    Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
    +
    int s4_number_of_leaves
    Number of leaves for the sorghum plant, stage 4.
    +
    int s4_panicle_subdivisions
    Number of panicle subdivisions for each grain sphere within a panicle, stage 4.
    +
    float s3_stem_length
    Length of the sorghum stem for stage 3.
    +
    std::string s3_leaf_texture_file
    Texture map for sorghum leaf for stage 3.
    +
    helios::vec2 s2_leaf_size3
    Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    +
    float s1_stem_radius
    Radius of the sorghum stem for stage 1.
    +
    helios::vec2 s5_panicle_size
    Size of panicle in x- and y- directions for stage 5.
    +
    int s3_number_of_leaves
    Number of leaves along the stem for stage 3.
    +
    helios::vec2 s2_leaf_size5
    Length of leaf5 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    +
    helios::vec2 s5_leaf_size
    Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 5.
    +
    float s1_stem_subdivisions
    Number of stem radial subdivisions for stage 1.
    +
    helios::vec2 s2_leaf_size4
    Length of leaf4 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    +
    helios::int2 s1_leaf_subdivisions
    Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 1.
    +
    std::string s4_leaf_texture_file
    Texture map for sorghum leaf, stage 4.
    +
    helios::vec2 s2_leaf_size2
    Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    +
    helios::vec2 s3_leaf_size
    Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 3.
    +
    float s2_stem_length
    Length of the sorghum stem for stage 2.
    +
    float s1_leaf2_angle
    Leaf2 vertical angle of rotation for stage 1.
    +
    float s3_stem_subdivisions
    Number of stem radial subdivisions for stage 3.
    +
    float s1_stem_length
    Length of the sorghum stem for stage 1.
    +
    int sorghum_stage
    Sorghum categorized into 5 stages; 1 - Three leaf stage, 2 - Five leaf stage, 3 - Panicle initiation ...
    +
    float s1_leaf3_angle
    Leaf3 vertical angle of rotation for stage 1.
    +
    helios::vec2 s2_leaf_size1
    Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
    +
    std::string s5_seed_texture_file
    Texture map of the panicle for stage 5.
    +
    helios::vec2 s4_panicle_size
    Size of panicle in x- and y- directions for stage 4.
    +
    R-G-B color vector.
    +
    const float & zenith
    Zenithal angle (radians)
    +
    int y
    Second element in vector.
    +
    int x
    First element in vector.
    +
    Vector of two elements of type 'float'.
    +
    float x
    First element in vector.
    +
    float y
    Second element in vector.
    +
    Vector of three elements of type 'float'.
    + diff --git a/doc/html/strawberry_8cpp_source.html b/doc/html/strawberry_8cpp_source.html index b5bea5d88..47469c79f 100644 --- a/doc/html/strawberry_8cpp_source.html +++ b/doc/html/strawberry_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + + +
    strawberry.cpp
    @@ -306,6 +318,7 @@
    212
    213}
    214
    +
    215uint CanopyGenerator::strawberry(const StrawberryParameters &params, const vec3 &origin ){
    216
    217 std::vector<std::vector<uint> > leaf_UUIDs;
    @@ -337,48 +350,50 @@
    243 return UUID_leaf.size()-1;
    244
    245}
    +
    -
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    -
    uint strawberry(const StrawberryParameters &params, const helios::vec3 &origin)
    Function to add an individual strawberry plant.
    Definition: strawberry.cpp:215
    -
    Stores the state associated with simulation.
    Definition: Context.h:1882
    -
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition: Context.cpp:1406
    -
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition: Context.cpp:1536
    -
    float randu()
    Draw a random number from a uniform distribution between 0 and 1.
    Definition: Context.cpp:1178
    -
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition: Context.cpp:1420
    -
    uint copyPrimitive(uint UUID)
    Make a copy of a primitive from the context.
    Definition: Context.cpp:1578
    -
    void scalePrimitive(uint UUID, const helios::vec3 &S)
    Scale a primitive using its UUID relative to the origin (0,0,0)
    Definition: Context.cpp:1491
    -
    std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition: Context.cpp:5930
    -
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition: global.cpp:610
    -
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition: global.cpp:617
    -
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition: Context.cpp:1328
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    -
    Parameters defining the strawberry plant canopy.
    -
    int stem_subdivisions
    Number of radial subdivisions for stem tubes.
    -
    int stems_per_plant
    Number of stems per plant.
    -
    float fruit_radius
    Radius of strawberry fruit.
    -
    uint fruit_subdivisions
    Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
    -
    float plant_height
    Height of the plant.
    -
    helios::int2 leaf_subdivisions
    Number of sub-division segments per leaf.
    -
    std::string fruit_texture_file
    Texture map for strawberry fruit.
    -
    float clusters_per_stem
    Number of strawberry clusters per plant stem. Clusters randomly have 1, 2, or 3 berries.
    -
    float stem_radius
    Radius of stems.
    -
    std::string leaf_texture_file
    Path to texture map file for leaves.
    -
    helios::RGBcolor stem_color
    Color of stems.
    -
    float leaf_length
    Maximum width of leaves.
    -
    Vector of spherical coordinates (elevation,azimuth)
    -
    const float & elevation
    Elevation angle (radians)
    -
    float azimuth
    Azimuthal angle (radians)
    -
    int y
    Second element in vector.
    -
    int x
    First element in vector.
    -
    Vector of two elements of type 'float'.
    -
    Vector of three elements of type 'float'.
    -
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    +
    uint strawberry(const StrawberryParameters &params, const helios::vec3 &origin)
    Function to add an individual strawberry plant.
    +
    Stores the state associated with simulation.
    Definition Context.h:1882
    +
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition Context.cpp:1406
    +
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition Context.cpp:1536
    +
    float randu()
    Draw a random number from a uniform distribution between 0 and 1.
    Definition Context.cpp:1178
    +
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition Context.cpp:1420
    +
    uint copyPrimitive(uint UUID)
    Make a copy of a primitive from the context.
    Definition Context.cpp:1578
    +
    void scalePrimitive(uint UUID, const helios::vec3 &S)
    Scale a primitive using its UUID relative to the origin (0,0,0)
    Definition Context.cpp:1491
    +
    std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition Context.cpp:5930
    +
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition global.cpp:610
    +
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition global.cpp:617
    +
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition Context.cpp:1328
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    +
    Parameters defining the strawberry plant canopy.
    +
    int stem_subdivisions
    Number of radial subdivisions for stem tubes.
    +
    int stems_per_plant
    Number of stems per plant.
    +
    float fruit_radius
    Radius of strawberry fruit.
    +
    uint fruit_subdivisions
    Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
    +
    float plant_height
    Height of the plant.
    +
    helios::int2 leaf_subdivisions
    Number of sub-division segments per leaf.
    +
    std::string fruit_texture_file
    Texture map for strawberry fruit.
    +
    float clusters_per_stem
    Number of strawberry clusters per plant stem. Clusters randomly have 1, 2, or 3 berries.
    +
    float stem_radius
    Radius of stems.
    +
    std::string leaf_texture_file
    Path to texture map file for leaves.
    +
    helios::RGBcolor stem_color
    Color of stems.
    +
    float leaf_length
    Maximum width of leaves.
    +
    Vector of spherical coordinates (elevation,azimuth)
    +
    const float & elevation
    Elevation angle (radians)
    +
    float azimuth
    Azimuthal angle (radians)
    +
    int y
    Second element in vector.
    +
    int x
    First element in vector.
    +
    Vector of two elements of type 'float'.
    +
    Vector of three elements of type 'float'.
    +
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    + diff --git a/doc/html/struct_aerial_hit_point.html b/doc/html/struct_aerial_hit_point.html index b4eb7f9e9..cbc1f3712 100644 --- a/doc/html/struct_aerial_hit_point.html +++ b/doc/html/struct_aerial_hit_point.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,28 +105,28 @@

    Structure containing metadata for an aerial hit point. - More...

    + More...

    #include <AerialLiDAR.h>

    - +

    Public Member Functions

     AerialHitPoint (int __scanID, helios::vec3 __position, helios::SphericalCoord __direction, helios::int2 __row_column, helios::RGBcolor __color, std::map< std::string, float > __data)
     AerialHitPoint (int __scanID, helios::vec3 __position, helios::SphericalCoord __direction, helios::int2 __row_column, helios::RGBcolor __color, std::map< std::string, float > __data)
     
    - + - + - + - + - + - +

    Data Fields

    helios::vec3 position
    helios::vec3 position
     
    helios::SphericalCoord direction
    helios::SphericalCoord direction
     
    helios::RGBcolor color
    helios::RGBcolor color
     
    std::map< std::string, float > data
    std::map< std::string, float > data
     
    helios::int3 gridcell
    helios::int3 gridcell
     
    int scanID
    int scanID
     

    Detailed Description

    @@ -134,8 +146,7 @@

    AerialHitPoint::AerialHitPoint ( - void  - ) + void ) @@ -162,43 +173,32 @@

    AerialHitPoint::AerialHitPoint ( - int  - __scanID, + int __scanID, - helios::vec3  - __position, + helios::vec3 __position, - helios::SphericalCoord  - __direction, + helios::SphericalCoord __direction, - helios::int2  - __row_column, + helios::int2 __row_column, - helios::RGBcolor  - __color, + helios::RGBcolor __color, - std::map< std::string, float >  - __data  - - - - ) - + std::map< std::string, float > __data ) @@ -315,7 +315,8 @@

    +

    diff --git a/doc/html/struct_aerial_scan_metadata.html b/doc/html/struct_aerial_scan_metadata.html index 872532bde..0be530d0e 100644 --- a/doc/html/struct_aerial_scan_metadata.html +++ b/doc/html/struct_aerial_scan_metadata.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,37 +105,37 @@

    Structure containing metadata for an aerial scan. - More...

    + More...

    #include <AerialLiDAR.h>

    - +

    Public Member Functions

     AerialScanMetadata (const helios::vec3 __center, const helios::vec2 __extent, const float __coneangle, const float __scandensity, const float __exitDiameter, const float __beamDivergence)
     AerialScanMetadata (const helios::vec3 __center, const helios::vec2 __extent, const float __coneangle, const float __scandensity, const float __exitDiameter, const float __beamDivergence)
     Create an aerial LiDAR scan data structure.
     
    - + - + - + - + - + - + - +

    Data Fields

    std::size_t Nrays
    std::size_t Nrays
     Number of laser pulses in scan.
     
    helios::vec3 center
    helios::vec3 center
     (x,y,z) position of scan surface center
     
    helios::vec2 extent
    helios::vec2 extent
     (x,y) size/extent of scan surface
     
    float coneangle
    float coneangle
     Width of scan cone in degrees.
     
    float scandensity
    float scandensity
     Scan density in points/m^2.
     
    float exitDiameter
    float exitDiameter
     Diameter of laser pulse at exit from the scanner.
     
    float beamDivergence
    float beamDivergence
     Divergence angle of the laser beam in radians.
     
    @@ -142,43 +154,32 @@

    AerialScanMetadata::AerialScanMetadata ( - const helios::vec3  - __center, + const helios::vec3 __center, - const helios::vec2  - __extent, + const helios::vec2 __extent, - const float  - __coneangle, + const float __coneangle, - const float  - __scandensity, + const float __scandensity, - const float  - __exitDiameter, + const float __exitDiameter, - const float  - __beamDivergence  - - - - ) - + const float __beamDivergence )

    @@ -333,7 +334,8 @@

    +

    diff --git a/doc/html/struct_axis_rotation.html b/doc/html/struct_axis_rotation.html index d9f5aeb2a..bf4f03d02 100644 --- a/doc/html/struct_axis_rotation.html +++ b/doc/html/struct_axis_rotation.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -95,25 +107,25 @@ - + - + - +

    Public Member Functions

     AxisRotation (float a_pitch, float a_yaw, float a_roll)
     AxisRotation (float a_pitch, float a_yaw, float a_roll)
     
    AxisRotation operator+ (const AxisRotation &a) const
    AxisRotation operator+ (const AxisRotation &a) const
     
    AxisRotation operator- (const AxisRotation &a) const
    AxisRotation operator- (const AxisRotation &a) const
     
    - + - + - +

    Data Fields

    float pitch
    float pitch
     
    float yaw
    float yaw
     
    float roll
    float roll
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, const AxisRotation &rot)
    std::ostream & operator<< (std::ostream &os, const AxisRotation &rot)
     

    Detailed Description

    @@ -132,7 +144,7 @@

    AxisRotation::AxisRotation ( - ) + ) @@ -159,25 +171,17 @@

    AxisRotation::AxisRotation ( - float  - a_pitch, + float a_pitch, - float  - a_yaw, + float a_yaw, - float  - a_roll  - - - - ) - + float a_roll ) @@ -204,8 +208,7 @@

    AxisRotation AxisRotation::operator+ ( - const AxisRotation &  - a) + const AxisRotation & a) const @@ -232,8 +235,7 @@

    AxisRotation AxisRotation::operator- ( - const AxisRotation &  - a) + const AxisRotation & a) const @@ -248,7 +250,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -261,19 +263,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - const AxisRotation &  - rot  - - - - ) - + const AxisRotation & rot ) @@ -342,7 +337,8 @@

    +

    diff --git a/doc/html/struct_b_b_lcoefficients.html b/doc/html/struct_b_b_lcoefficients.html index 1e7ecf2e0..759fa9b3b 100644 --- a/doc/html/struct_b_b_lcoefficients.html +++ b/doc/html/struct_b_b_lcoefficients.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -92,17 +104,17 @@

    Coefficients for Ball, Berry, Leuning (Leuning 1990, 1995) stomatal conductance model. - More...

    + More...

    #include <StomatalConductanceModel.h>

    - + - + - +

    Data Fields

    float gs0
    float gs0
     
    float a1
    float a1
     
    float D0
    float D0
     

    Detailed Description

    @@ -122,7 +134,7 @@

    BBLcoefficients::BBLcoefficients ( - ) + ) @@ -192,7 +204,8 @@

    +

    diff --git a/doc/html/struct_b_bcoefficients.html b/doc/html/struct_b_bcoefficients.html index 9ad60fa2b..dc2152c3c 100644 --- a/doc/html/struct_b_bcoefficients.html +++ b/doc/html/struct_b_bcoefficients.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -92,21 +104,21 @@

    Coefficients for simplified Bailey stomatal conductance model. - More...

    + More...

    #include <StomatalConductanceModel.h>

    - + - + - + - + - +

    Data Fields

    float pi_0
    float pi_0
     
    float pi_m
    float pi_m
     
    float theta
    float theta
     
    float sigma
    float sigma
     
    float chi
    float chi
     

    Detailed Description

    @@ -126,7 +138,7 @@

    BBcoefficients::BBcoefficients ( - ) + ) @@ -228,7 +240,8 @@

    +

    diff --git a/doc/html/struct_b_m_fcoefficients.html b/doc/html/struct_b_m_fcoefficients.html index ff14ba069..ed4eec88d 100644 --- a/doc/html/struct_b_m_fcoefficients.html +++ b/doc/html/struct_b_m_fcoefficients.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -92,19 +104,19 @@

    Coefficients for simplified Buckley, Mott, & Farquhar stomatal conductance model. - More...

    + More...

    #include <StomatalConductanceModel.h>

    - + - + - + - +

    Data Fields

    float Em
    float Em
     
    float i0
    float i0
     
    float k
    float k
     
    float b
    float b
     

    Detailed Description

    @@ -124,7 +136,7 @@

    BMFcoefficients::BMFcoefficients ( - ) + ) @@ -210,7 +222,8 @@

    +

    diff --git a/doc/html/struct_b_w_bcoefficients.html b/doc/html/struct_b_w_bcoefficients.html index c7e5b6726..043804d7e 100644 --- a/doc/html/struct_b_w_bcoefficients.html +++ b/doc/html/struct_b_w_bcoefficients.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -92,15 +104,15 @@

    Coefficients for original Ball, Woodrow, Berry (1987) stomatal conductance model. - More...

    + More...

    #include <StomatalConductanceModel.h>

    - + - +

    Data Fields

    float gs0
    float gs0
     
    float a1
    float a1
     

    Detailed Description

    @@ -120,7 +132,7 @@

    BWBcoefficients::BWBcoefficients ( - ) + ) @@ -174,7 +186,8 @@

    +

    diff --git a/doc/html/struct_base_canopy_parameters.html b/doc/html/struct_base_canopy_parameters.html index 38e491011..e608f2cfe 100644 --- a/doc/html/struct_base_canopy_parameters.html +++ b/doc/html/struct_base_canopy_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Base struct class for Canopy parameters. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -117,27 +129,27 @@ - + - + - + - + - +

    Public Member Functions

     BaseCanopyParameters ()
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - +

    Data Fields

    helios::vec3 canopy_origin
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -155,7 +167,7 @@

    BaseCanopyParameters::BaseCanopyParameters ( - ) + ) @@ -176,8 +188,7 @@

    BaseCanopyParameters::BaseCanopyParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -206,8 +217,7 @@

    virtual void BaseCanopyParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -220,7 +230,7 @@

    HomogeneousCanopyParameters, SphericalCrownsCanopyParameters, ConicalCrownsCanopyParameters, BaseGrapeVineParameters, VSPGrapevineParameters, SplitGrapevineParameters, UnilateralGrapevineParameters, GobletGrapevineParameters, WhiteSpruceCanopyParameters, TomatoParameters, StrawberryParameters, WalnutCanopyParameters, SorghumCanopyParameters, and BeanParameters.

    +

    Implemented in BaseGrapeVineParameters, BeanParameters, ConicalCrownsCanopyParameters, GobletGrapevineParameters, HomogeneousCanopyParameters, SorghumCanopyParameters, SphericalCrownsCanopyParameters, SplitGrapevineParameters, StrawberryParameters, TomatoParameters, UnilateralGrapevineParameters, VSPGrapevineParameters, WalnutCanopyParameters, and WhiteSpruceCanopyParameters.

    @@ -236,19 +246,12 @@

    virtual void BaseCanopyParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -260,7 +263,7 @@

    HomogeneousCanopyParameters, SphericalCrownsCanopyParameters, ConicalCrownsCanopyParameters, BaseGrapeVineParameters, VSPGrapevineParameters, SplitGrapevineParameters, UnilateralGrapevineParameters, GobletGrapevineParameters, WhiteSpruceCanopyParameters, TomatoParameters, StrawberryParameters, WalnutCanopyParameters, SorghumCanopyParameters, and BeanParameters.

    +

    Implemented in BaseGrapeVineParameters, BeanParameters, ConicalCrownsCanopyParameters, GobletGrapevineParameters, HomogeneousCanopyParameters, SorghumCanopyParameters, SphericalCrownsCanopyParameters, SplitGrapevineParameters, StrawberryParameters, TomatoParameters, UnilateralGrapevineParameters, VSPGrapevineParameters, WalnutCanopyParameters, and WhiteSpruceCanopyParameters.

    @@ -273,8 +276,7 @@

    void BaseCanopyParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -336,7 +338,8 @@

    +

    diff --git a/doc/html/struct_base_canopy_parameters.png b/doc/html/struct_base_canopy_parameters.png index 7bda8ecd5c3b1a1ac71f10ef0805400b4c5ad6db..686fe937ebc7fdbc2884a223258bf21a8f5a1e39 100644 GIT binary patch delta 21 dcmeCs?9iNG$MxXBga7~ko1P6@veCmq1OR#-3n2gi delta 21 dcmeCs?9iNG$93Sqf&c&i2T!`ZVxxzH2mp7J3nc&m diff --git a/doc/html/struct_base_grape_vine_parameters.html b/doc/html/struct_base_grape_vine_parameters.html index 37f14fcdc..949fe0ff0 100644 --- a/doc/html/struct_base_grape_vine_parameters.html +++ b/doc/html/struct_base_grape_vine_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -107,171 +119,165 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     BaseGrapeVineParameters ()
     BaseGrapeVineParameters ()
     Default constructor.
     
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    float leaf_width
    float leaf_width
     Maximum width of leaves. Leaf width increases logarithmically from the shoot tip, so leaf_width is the width at the base of the shoot.
     
    float leaf_width_spread
    float leaf_width_spread
     Spread value for the maximum leaf width. With any new canopy or plant generation, the maximum leaf width would be between leaf_width - leaf_width_spread and leaf_width + leaf_width_spread.
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves.
     
    std::string wood_texture_file
    std::string wood_texture_file
     Path to texture map file for trunks/branches.
     
    int wood_subdivisions
    int wood_subdivisions
     Number of radial subdivisions for trunk/cordon/shoot tubes.
     
    int wood_subdivisions_spread
    int wood_subdivisions_spread
     Spread value for the number of wood subdivisions. With any new canopy or plant generation, the maximum number of wood subdivisions would be between wood_subdivisions - wood_subdivisions_spread and wood_subdivisions + wood_subdivisions_spread.
     
    float dead_probability
    float dead_probability
     Probability for a plant to be dead, i.e. without any leaves or grapes.
     
    float missing_plant_probability
    float missing_plant_probability
     Probability for a plant to be missing.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float plant_spacing_spread
    float plant_spacing_spread
     Spread value for the plant spacing. The spacing between adjacent plants along a row would vary between plant_spacing - plant_spacing_spread and plant_spacing + plant_spacing_spread.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    float row_spacing_spread
    float row_spacing_spread
     Spread value for the row spacing. This allows to vary the alignment of plants along a row. The spacing between two plants of adjacent rows would be between row_spacing - row_spacing_spread and row_spacing + row_spacing_spread.
     
    float trunk_height
    float trunk_height
     Distance between the ground and top of trunks.
     
    float trunk_height_spread
    float trunk_height_spread
     Spread value for the trunk height. With any new canopy or plant generation, the trunk height would be between trunk_height - trunk_height_spread and trunk_height + trunk_height_spread.
     
    float trunk_radius
    float trunk_radius
     Radius of the trunk at the widest point.
     
    float trunk_radius_spread
    float trunk_radius_spread
     Spread value for the trunk radius. With any new canopy or plant generation, the trunk radius would be between trunk_radius - trunk_radius_spread and trunk_radius + trunk_radius_spread.
     
    float cordon_length
    float cordon_length
     Length of the cordons. By default, half the plant spacing.
     
    float cordon_length_spread
    float cordon_length_spread
     Spread value for the cordon length. With any new canopy or plant generation, the cordon length would be between cordon_length - cordon_length_spread and cordon_length + cordon_length_spread.
     
    float cordon_height
    float cordon_height
     Distance between the ground and cordon. Note - must be greater than or equal to the trunk height.
     
    float cordon_height_spread
    float cordon_height_spread
     Spread value for the cordon height. With any new canopy or plant generation, the cordon height would be between cordon_height - cordon_height_spread and cordon_height + cordon_height_spread.
     
    float cordon_radius
    float cordon_radius
     Radius of cordon branches.
     
    float cordon_radius_spread
    float cordon_radius_spread
     Spread value for the cordon radius. With any new canopy or plant generation, the cordon radius would be between cordon_radius - cordon_radius_spread and cordon_radius + cordon_radius_spread.
     
    float shoot_length
    float shoot_length
     Length of shoots.
     
    float shoot_length_spread
    float shoot_length_spread
     Spread value for the shoot length. With any new canopy or plant generation, the shoot length would be between shoot_length - shoot_length_spread and shoot_length + shoot_length_spread.
     
    float shoot_radius
    float shoot_radius
     Radius of shoot branches.
     
    float shoot_radius_spread
    float shoot_radius_spread
     Spread value for the shoot radius. With any new canopy or plant generation, the shoot radius would be between shoot_radius - shoot_radius_spread and shoot_radius + shoot_radius_spread.
     
    uint shoots_per_cordon
    uint shoots_per_cordon
     Number of shoots on each cordon.
     
    uint shoots_per_cordon_spread
    uint shoots_per_cordon_spread
     Spread value for the number of shoots per cordon. With any new canopy or plant generation, the number of shoots per cordon would be between shoots_per_cordon - shoots_per_cordon_spread and shoots_per_cordon + shoots_per_cordon_spread.
     
    float leaf_spacing_fraction
    float leaf_spacing_fraction
     Spacing between adjacent leaves as a fraction of the local leaf width. E.g., leaf_spacing_fraction = 1 would give a leaf spacing equal to the leaf width.
     
    float leaf_spacing_fraction_spread
    float leaf_spacing_fraction_spread
     Spread value for the leaf spacing fraction. With any new canopy or plant generation, the leaf spacing fraction would be between leaf_spacing_fraction - leaf_spacing_fraction_spread and leaf_spacing_fraction + leaf_spacing_fraction_spread.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    float grape_radius
    float grape_radius
     Radius of grape berries.
     
    float grape_radius_spread
    float grape_radius_spread
     Spread value for the grape radius. With any new canopy or plant generation, the grape radius would be between grape_radius - grape_radius_spread and grape_radius + grape_radius_spread.
     
    float cluster_radius
    float cluster_radius
     Maximum horizontal radius of grape clusters.
     
    float cluster_radius_spread
    float cluster_radius_spread
     Spread value for the cluster radius. With any new canopy or plant generation, the cluster radius would be between cluster_radius - cluster_radius_spread and cluster_radius + cluster_radius_spread.
     
    float cluster_height_max
    float cluster_height_max
     Maximum height of grape clusters along the shoot as a fraction of the total shoot length.
     
    float cluster_height_max_spread
    float cluster_height_max_spread
     Spread value for the cluster height. With any new canopy or plant generation, the cluster height would be between cluster_height - cluster_height_spread and cluster_height + cluster_height_spread.
     
    helios::RGBcolor grape_color
    helios::RGBcolor grape_color
     Color of grapes.
     
    uint grape_subdivisions
    uint grape_subdivisions
     Number of azimuthal and zenithal subdivisions making up berries (will result in roughly 2*(grape_subdivisions)^2 triangles per grape berry)
     
    uint grape_subdivisions_spread
    uint grape_subdivisions_spread
     Spread value for the number of grape subdivisions. With any new canopy or plant generation, the number of grape subdivisions would be between grape_subdivisions - grape_subdivisions_spread and grape_subdivisions + grape_subdivisions_spread.
     
    std::vector< float > leaf_angle_PDF
    std::vector< float > leaf_angle_PDF
     
    float canopy_rotation_spread
    float canopy_rotation_spread
     Spread value for the canopy rotation. With any new canopy or plant generation, the canopy/plant rotation would be between canopy_rotation - canopy_rotation_spread and canopy_rotation + canopy_rotation_spread.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -288,7 +294,7 @@

    BaseGrapeVineParameters::BaseGrapeVineParameters ( - ) + ) @@ -309,8 +315,7 @@

    BaseGrapeVineParameters::BaseGrapeVineParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -339,8 +344,7 @@

    void BaseGrapeVineParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -355,7 +359,7 @@

    BaseCanopyParameters.

    -

    Reimplemented in VSPGrapevineParameters, SplitGrapevineParameters, UnilateralGrapevineParameters, and GobletGrapevineParameters.

    +

    Reimplemented in GobletGrapevineParameters, SplitGrapevineParameters, UnilateralGrapevineParameters, and VSPGrapevineParameters.

    Definition at line 616 of file CanopyGenerator.cpp.

    @@ -373,19 +377,12 @@

    void BaseGrapeVineParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -399,7 +396,7 @@

    BaseCanopyParameters.

    -

    Reimplemented in VSPGrapevineParameters, SplitGrapevineParameters, UnilateralGrapevineParameters, and GobletGrapevineParameters.

    +

    Reimplemented in GobletGrapevineParameters, SplitGrapevineParameters, UnilateralGrapevineParameters, and VSPGrapevineParameters.

    Definition at line 612 of file CanopyGenerator.cpp.

    @@ -414,8 +411,7 @@

    void BaseGrapeVineParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -1214,7 +1210,8 @@

    +

    diff --git a/doc/html/struct_base_grape_vine_parameters.png b/doc/html/struct_base_grape_vine_parameters.png index da9eeb75595d4de6de3c2744ed7a44436f075ff4..0da0a298e2b87bfa2d7b53313dcc4f3a8ba067c4 100644 GIT binary patch delta 21 dcmZ1|uux!v9oK^g5B~rEZ+bRt$wrTx>;QXp3#|YE delta 21 dcmZ1|uux!v9oK;a2mb&6A3W*uij5vO*#UU!3$XwI diff --git a/doc/html/struct_bean_parameters.html b/doc/html/struct_bean_parameters.html index 81a59f79c..2792da552 100644 --- a/doc/html/struct_bean_parameters.html +++ b/doc/html/struct_bean_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining the bean plant canopy. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,88 +120,82 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     BeanParameters ()
     BeanParameters ()
     Default constructor.
     
     BeanParameters (const pugi::xml_node canopy_node)
     BeanParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    float leaf_length
    float leaf_length
     Maximum width of leaves.
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves.
     
    helios::RGBcolor shoot_color
    helios::RGBcolor shoot_color
     Color of shoots.
     
    int shoot_subdivisions
    int shoot_subdivisions
     Number of radial subdivisions for shoot tubes.
     
    float stem_radius
    float stem_radius
     Radius of main stem at base.
     
    float stem_length
    float stem_length
     Length of stems before splitting to leaflets.
     
    float leaflet_length
    float leaflet_length
     Length of the leaflet from base to tip leaf.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    float germination_probability
    float germination_probability
     Probability that a plant in the canopy germinated.
     
    float pod_length
    float pod_length
     Length of bean pods.
     
    helios::RGBcolor pod_color
    helios::RGBcolor pod_color
     Color of bean pods.
     
    uint pod_subdivisions
    uint pod_subdivisions
     Number of lengthwise subdivisions making up pods.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -207,7 +213,7 @@

    BeanParameters::BeanParameters ( - ) + ) @@ -228,8 +234,7 @@

    BeanParameters::BeanParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -258,8 +263,7 @@

    void BeanParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -290,19 +294,12 @@

    void BeanParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -329,8 +326,7 @@

    void BeanParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -626,7 +622,8 @@

    +

    diff --git a/doc/html/struct_bean_parameters.png b/doc/html/struct_bean_parameters.png index 157662f4f5e0b668aa7151894c1f73d90f1615bd..8fbf13c2b263f14f2d878d3121547d64c843b742 100644 GIT binary patch delta 21 dcmeBW?PZ-{$MxXBga7~ko1P6@veCnp2>^A53f2Gs delta 21 dcmeBW?PZ-{$93Sqf&c&i2T!`ZVxxyE6997i3fcew diff --git a/doc/html/struct_camera_calibration.html b/doc/html/struct_camera_calibration.html index 78d561b64..fc12b056e 100644 --- a/doc/html/struct_camera_calibration.html +++ b/doc/html/struct_camera_calibration.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Data Structures | @@ -94,7 +106,7 @@

    Camera calibration structure used for camera calibration tasks. - More...

    + More...

    #include <CameraCalibration.h>

    @@ -106,55 +118,55 @@
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

     CameraCalibration (helios::Context *context)
     CameraCalibration (helios::Context *context)
     
    std::vector< uint > addCheckerboard (const helios::int2 &boardsidesize, const float &patchsize, const helios::vec3 &centrelocation, const helios::vec3 &rotationrad, bool firstblack=true)
    std::vector< uint > addCheckerboard (const helios::int2 &boardsidesize, const float &patchsize, const helios::vec3 &centrelocation, const helios::vec3 &rotationrad, bool firstblack=true)
     Add checker board geometry into context.
     
    std::vector< uint > addDefaultCheckerboard (const helios::vec3 &centrelocation, const helios::vec3 &rotationrad)
    std::vector< uint > addDefaultCheckerboard (const helios::vec3 &centrelocation, const helios::vec3 &rotationrad)
     Add default checker board geometry into context.
     
    std::vector< uint > addColorboard (const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad, const std::vector< std::vector< helios::RGBcolor > > &colorassignment={}, const std::vector< std::vector< std::string > > &spectrumassignment={})
    std::vector< uint > addColorboard (const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad, const std::vector< std::vector< helios::RGBcolor > > &colorassignment={}, const std::vector< std::vector< std::string > > &spectrumassignment={})
     Add color board geometry into context.
     
    std::vector< uint > addDefaultColorboard (const helios::vec3 &centrelocation, float patchsize=0.5, const helios::vec3 &rotationrad=helios::make_vec3(0, 0, 0))
    std::vector< uint > addDefaultColorboard (const helios::vec3 &centrelocation, float patchsize=0.5, const helios::vec3 &rotationrad=helios::make_vec3(0, 0, 0))
     Set reflectivity for a specific UUID.
     
    std::vector< uint > getColorBoardUUIDs ()
    std::vector< uint > getColorBoardUUIDs ()
     
    bool writeSpectralXMLfile (const std::string &filename, const std::string &note, const std::string &label, std::vector< helios::vec2 > *spectrum)
    bool writeSpectralXMLfile (const std::string &filename, const std::string &note, const std::string &label, std::vector< helios::vec2 > *spectrum)
     Write XML file from spectral vectors containing both wavelengths and spectral values.
     
    bool loadXMLlabeldata (const std::string &filename, const std::string &labelname, std::vector< helios::vec2 > &spectraldata)
    bool loadXMLlabeldata (const std::string &filename, const std::string &labelname, std::vector< helios::vec2 > &spectraldata)
     Load XML file and save data in spectral vectors containing both wavelengths and spectral values.
     
    float GradientDescent (std::vector< std::vector< float > > *expandedcameraspectra, const std::vector< std::vector< float > > &expandedconstinput, const float &learningrate, const std::vector< std::vector< float > > &truevalues)
    float GradientDescent (std::vector< std::vector< float > > *expandedcameraspectra, const std::vector< std::vector< float > > &expandedconstinput, const float &learningrate, const std::vector< std::vector< float > > &truevalues)
     Reduce calibration error based on gradient descent.
     
    std::vector< float > updateCameraResponseSpectra (const std::vector< std::string > &camerareponselabels, const std::string &label, const std::map< uint, std::vector< helios::vec2 > > &simulatedinputspectra, const std::vector< std::vector< float > > &truevalues)
    std::vector< float > updateCameraResponseSpectra (const std::vector< std::string > &camerareponselabels, const std::string &label, const std::map< uint, std::vector< helios::vec2 > > &simulatedinputspectra, const std::vector< std::vector< float > > &truevalues)
     Update camera response spectra.
     
    void preprocessSpectra (const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameralabels, std::vector< std::string > &objectlabels, helios::vec2 &wavelengthrange, const std::string &targetlabel="")
    void preprocessSpectra (const std::vector< std::string > &sourcelabels, const std::vector< std::string > &cameralabels, std::vector< std::string > &objectlabels, helios::vec2 &wavelengthrange, const std::string &targetlabel="")
     Preprocess all spectra for modelling.
     
    void distortImage (const std::string &cameralabel, const std::vector< std::string > &bandlabels, const helios::vec2 &focalxy, std::vector< double > &distCoeffs, helios::int2 camerareoslution)
    void distortImage (const std::string &cameralabel, const std::vector< std::string > &bandlabels, const helios::vec2 &focalxy, std::vector< double > &distCoeffs, helios::int2 camerareoslution)
     Get distorted image.
     
    float getCameraResponseScale (const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector< std::string > &bandlabels, const std::vector< std::vector< float > > &truevalues)
    float getCameraResponseScale (const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector< std::string > &bandlabels, const std::vector< std::vector< float > > &truevalues)
     Get camera spectral response scale.
     
    std::vector< uint > readROMCCanopy ()
    std::vector< uint > readROMCCanopy ()
     Read ROMC canopy file (Used for self test).
     
    void writeCalibratedCameraResponses (const std::vector< std::string > &camerareponselabels, const std::string &calibratemark, float scale)
    void writeCalibratedCameraResponses (const std::vector< std::string > &camerareponselabels, const std::string &calibratemark, float scale)
     Write calibrated camera response spectra.
     
    - + - +

    Data Fields

    GradientDescentParameters responseupdateparameters
    GradientDescentParameters responseupdateparameters
     
    std::map< std::string, std::map< std::string, std::vector< helios::vec2 > > > processedspectra
    std::map< std::string, std::map< std::string, std::vector< helios::vec2 > > > processedspectra
     

    Detailed Description

    @@ -174,8 +186,7 @@

    CameraCalibration::CameraCalibration ( - helios::Context *  - context) + helios::Context * context) @@ -200,37 +211,27 @@

    std::vector< uint > CameraCalibration::addCheckerboard ( - const helios::int2 &  - boardsidesize, + const helios::int2 & boardsidesize, - const float &  - patchsize, + const float & patchsize, - const helios::vec3 &  - centrelocation, + const helios::vec3 & centrelocation, - const helios::vec3 &  - rotationrad, + const helios::vec3 & rotationrad, - bool  - firstblack = true  - - - - ) - + bool firstblack = true )

    @@ -260,37 +261,27 @@

    std::vector< uint > CameraCalibration::addColorboard ( - const helios::vec3 &  - centrelocation, + const helios::vec3 & centrelocation, - float  - patchsize, + float patchsize, - const helios::vec3 &  - rotationrad, + const helios::vec3 & rotationrad, - const std::vector< std::vector< helios::RGBcolor > > &  - colorassignment = {}, + const std::vector< std::vector< helios::RGBcolor > > & colorassignment = {}, - const std::vector< std::vector< std::string > > &  - spectrumassignment = {}  - - - - ) - + const std::vector< std::vector< std::string > > & spectrumassignment = {} )

    @@ -320,19 +311,12 @@

    std::vector< uint > CameraCalibration::addDefaultCheckerboard ( - const helios::vec3 &  - centrelocation, + const helios::vec3 & centrelocation, - const helios::vec3 &  - rotationrad  - - - - ) - + const helios::vec3 & rotationrad )

    @@ -359,25 +343,17 @@

    std::vector< uint > CameraCalibration::addDefaultColorboard ( - const helios::vec3 &  - centrelocation, + const helios::vec3 & centrelocation, - float  - patchsize = 0.5, + float patchsize = 0.5, - const helios::vec3 &  - rotationrad = helios::make_vec3(0,0,0)  - - - - ) - + const helios::vec3 & rotationrad = helios::make_vec3(0,0,0) )

    @@ -409,37 +385,27 @@

    void CameraCalibration::distortImage ( - const std::string &  - cameralabel, + const std::string & cameralabel, - const std::vector< std::string > &  - bandlabels, + const std::vector< std::string > & bandlabels, - const helios::vec2 &  - focalxy, + const helios::vec2 & focalxy, - std::vector< double > &  - distCoeffs, + std::vector< double > & distCoeffs, - helios::int2  - camerareoslution  - - - - ) - + helios::int2 camerareoslution )

    @@ -470,31 +436,22 @@

    float CameraCalibration::getCameraResponseScale ( - const std::string &  - cameralabel, + const std::string & cameralabel, - const helios::int2  - cameraresolution, + const helios::int2 cameraresolution, - const std::vector< std::string > &  - bandlabels, + const std::vector< std::string > & bandlabels, - const std::vector< std::vector< float > > &  - truevalues  - - - - ) - + const std::vector< std::vector< float > > & truevalues )

    @@ -911,7 +815,8 @@

    +

    diff --git a/doc/html/struct_camera_calibration_1_1_gradient_descent_parameters.html b/doc/html/struct_camera_calibration_1_1_gradient_descent_parameters.html index e1f2c6d58..64493ba6c 100644 --- a/doc/html/struct_camera_calibration_1_1_gradient_descent_parameters.html +++ b/doc/html/struct_camera_calibration_1_1_gradient_descent_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -96,19 +108,19 @@

    Parameter struct for gradient descent. - More...

    + More...

    #include <CameraCalibration.h>

    - + - + - + - +

    Data Fields

    float learningrate =0.000001
    float learningrate =0.000001
     
    int maxiteration = 500
    int maxiteration = 500
     
    float minloss = 0.01
    float minloss = 0.01
     
    std::vector< float > camerarescales = {1,1,1}
    std::vector< float > camerarescales = {1,1,1}
     

    Detailed Description

    @@ -186,7 +198,8 @@

    +

    diff --git a/doc/html/struct_camera_properties.html b/doc/html/struct_camera_properties.html index d67cb3044..b611c9273 100644 --- a/doc/html/struct_camera_properties.html +++ b/doc/html/struct_camera_properties.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,32 +105,32 @@

    Properties defining a radiation camera. - More...

    + More...

    #include <RadiationModel.h>

    - + - +

    Public Member Functions

    bool operator!= (const CameraProperties &rhs) const
    bool operator!= (const CameraProperties &rhs) const
     
    bool operator== (const CameraProperties &rhs) const
    bool operator== (const CameraProperties &rhs) const
     
    - + - + - + - + - +

    Data Fields

    helios::int2 camera_resolution
    helios::int2 camera_resolution
     Camera sensor resolution (number of pixels) in the horizontal (.x) and vertical (.y) directions.
     
    float focal_plane_distance
    float focal_plane_distance
     Distance from the viewing plane to the focal plane.
     
    float lens_diameter = 0.05
    float lens_diameter = 0.05
     Diameter of the camera lens (lens_diameter = 0 gives a 'pinhole' camera with everything in focus)
     
    float HFOV = 20.f
    float HFOV = 20.f
     Camera horizontal field of view in degrees.
     
    float FOV_aspect_ratio = 1.f
    float FOV_aspect_ratio = 1.f
     Physical dimensions of the pixel array sensor in the horizontal (.x) and vertical (.y) directions.
     
    @@ -139,7 +151,7 @@

    CameraProperties::CameraProperties ( - ) + ) @@ -167,8 +179,7 @@

    bool CameraProperties::operator!= ( - const CameraProperties &  - rhs) + const CameraProperties & rhs) const @@ -195,8 +206,7 @@

    bool CameraProperties::operator== ( - const CameraProperties &  - rhs) + const CameraProperties & rhs) const @@ -308,7 +318,8 @@

    +

    diff --git a/doc/html/struct_colormap.html b/doc/html/struct_colormap.html index b9fed4163..6f6d26a7e 100644 --- a/doc/html/struct_colormap.html +++ b/doc/html/struct_colormap.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -92,31 +104,31 @@

    RGB color map. - More...

    + More...

    #include <Visualizer.h>

    - + - + - + - + - + - + - +

    Public Member Functions

     Colormap (const std::vector< helios::RGBcolor > &ctable, const std::vector< float > &clocs, int size, float minval_, float maxval_)
     Colormap (const std::vector< helios::RGBcolor > &ctable, const std::vector< float > &clocs, int size, float minval_, float maxval_)
     
    void set (const std::vector< helios::RGBcolor > &ctable, const std::vector< float > &clocs, int size, float minval_, float maxval_)
    void set (const std::vector< helios::RGBcolor > &ctable, const std::vector< float > &clocs, int size, float minval_, float maxval_)
     
    helios::RGBcolor query (float x) const
    helios::RGBcolor query (float x) const
     
    void setRange (float min, float max)
    void setRange (float min, float max)
     
    helios::vec2 getRange () const
    helios::vec2 getRange () const
     
    float getLowerLimit () const
    float getLowerLimit () const
     
    float getUpperLimit () const
    float getUpperLimit () const
     

    Detailed Description

    RGB color map.

    -

    Definition at line 165 of file Visualizer.h.

    +

    Definition at line 175 of file Visualizer.h.

    Constructor & Destructor Documentation

    ◆ Colormap() [1/2]

    @@ -130,7 +142,7 @@

    Colormap::Colormap ( - ) + ) @@ -141,7 +153,7 @@

    -

    Definition at line 168 of file Visualizer.h.

    +

    Definition at line 178 of file Visualizer.h.

    @@ -157,37 +169,27 @@

    Colormap::Colormap ( - const std::vector< helios::RGBcolor > &  - ctable, + const std::vector< helios::RGBcolor > & ctable, - const std::vector< float > &  - clocs, + const std::vector< float > & clocs, - int  - size, + int size, - float  - minval_, + float minval_, - float  - maxval_  - - - - ) - + float maxval_ ) @@ -197,7 +199,7 @@

    -

    Definition at line 170 of file Visualizer.h.

    +

    Definition at line 180 of file Visualizer.h.

    @@ -214,7 +216,7 @@

    float Colormap::getLowerLimit ( - ) + ) const @@ -225,7 +227,7 @@

    -

    Definition at line 248 of file Visualizer.h.

    +

    Definition at line 258 of file Visualizer.h.

    @@ -241,7 +243,7 @@

    helios::vec2 Colormap::getRange ( - ) + ) const @@ -252,7 +254,7 @@

    -

    Definition at line 244 of file Visualizer.h.

    +

    Definition at line 254 of file Visualizer.h.

    @@ -268,7 +270,7 @@

    float Colormap::getUpperLimit ( - ) + ) const @@ -279,7 +281,7 @@

    -

    Definition at line 252 of file Visualizer.h.

    +

    Definition at line 262 of file Visualizer.h.

    @@ -295,8 +297,7 @@

    helios::RGBcolor Colormap::query ( - float  - x) + float x) const @@ -307,7 +308,7 @@

    -

    Definition at line 216 of file Visualizer.h.

    +

    Definition at line 226 of file Visualizer.h.

    @@ -323,37 +324,27 @@

    void Colormap::set ( - const std::vector< helios::RGBcolor > &  - ctable, + const std::vector< helios::RGBcolor > & ctable, - const std::vector< float > &  - clocs, + const std::vector< float > & clocs, - int  - size, + int size, - float  - minval_, + float minval_, - float  - maxval_  - - - - ) - + float maxval_ ) @@ -363,7 +354,7 @@

    -

    Definition at line 176 of file Visualizer.h.

    +

    Definition at line 186 of file Visualizer.h.

    @@ -379,19 +370,12 @@

    void Colormap::setRange ( - float  - min, + float min, - float  - max  - - - - ) - + float max ) @@ -401,7 +385,7 @@

    -

    Definition at line 239 of file Visualizer.h.

    +

    Definition at line 249 of file Visualizer.h.

    @@ -411,7 +395,8 @@

    +

    diff --git a/doc/html/struct_conical_crowns_canopy_parameters.html b/doc/html/struct_conical_crowns_canopy_parameters.html index 14143643a..0ec43ec06 100644 --- a/doc/html/struct_conical_crowns_canopy_parameters.html +++ b/doc/html/struct_conical_crowns_canopy_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining the canopy with conical crowns. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,78 +120,72 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     ConicalCrownsCanopyParameters ()
     ConicalCrownsCanopyParameters ()
     Default constructor.
     
     ConicalCrownsCanopyParameters (const pugi::xml_node canopy_node)
     ConicalCrownsCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    helios::vec2 leaf_size
    helios::vec2 leaf_size
     Length of leaf in x- and y- directions (prior to rotation)
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves. If left empty, no texture will be used.
     
    helios::RGBcolor leaf_color
    helios::RGBcolor leaf_color
     Leaf color if no texture map file is provided.
     
    std::string leaf_angle_distribution
    std::string leaf_angle_distribution
     Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile", "plagiophile", "extremophile".
     
    float leaf_area_density
    float leaf_area_density
     One-sided leaf area density within spherical crowns.
     
    float crown_radius
    float crown_radius
     Radius of the conical crowns at the base.
     
    float crown_height
    float crown_height
     Height of the conical crowns.
     
    std::string canopy_configuration
    std::string canopy_configuration
     Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arranged canopy with non-overlapping crowns (canopy_configuration="random").
     
    helios::vec2 plant_spacing
    helios::vec2 plant_spacing
     Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random' this is the average spacing.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    std::vector< float > leaf_angle_PDF
    std::vector< float > leaf_angle_PDF
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -197,7 +203,7 @@

    ConicalCrownsCanopyParameters::ConicalCrownsCanopyParameters ( - ) + ) @@ -218,8 +224,7 @@

    ConicalCrownsCanopyParameters::ConicalCrownsCanopyParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -248,8 +253,7 @@

    void ConicalCrownsCanopyParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -280,19 +284,12 @@

    void ConicalCrownsCanopyParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -319,8 +316,7 @@

    void ConicalCrownsCanopyParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -560,7 +556,8 @@

    +

    diff --git a/doc/html/struct_conical_crowns_canopy_parameters.png b/doc/html/struct_conical_crowns_canopy_parameters.png index 02441dca1eeaf965eaf54a2b26d4f531401d67be..c35fb6b5527a259bfc7f3565a11fe495d18b2940 100644 GIT binary patch delta 21 dcmZ3&wuEhh9oK^g5B~rEZ+bRt$wrSmOaOXv3!MM} delta 21 dcmZ3&wuEhh9oK;a2mb&6A3W*uij5w3m;iU@3!wl2 diff --git a/doc/html/struct_dupex.html b/doc/html/struct_dupex.html index aaa5e81e1..675d20de4 100644 --- a/doc/html/struct_dupex.html +++ b/doc/html/struct_dupex.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,22 +106,22 @@ - + - + - + - +

    Public Member Functions

     Dupex (float a, float b)
     Dupex (float a, float b)
     
     Dupex (float a, float b, int x)
     Dupex (float a, float b, int x)
     
     Dupex (const Dupex &p)
     Dupex (const Dupex &p)
     
    Dupexoperator= (const Dupex &p)
    Dupexoperator= (const Dupex &p)
     
    - + - + - +

    Data Fields

    int id
    int id
     
    float r
    float r
     
    float c
    float c
     

    Detailed Description

    @@ -128,7 +140,7 @@

    Dupex::Dupex ( - ) + ) @@ -155,19 +167,12 @@

    Dupex::Dupex ( - float  - a, + float a, - float  - b  - - - - ) - + float b ) @@ -193,25 +198,17 @@

    Dupex::Dupex ( - float  - a, + float a, - float  - b, + float b, - int  - x  - - - - ) - + int x ) @@ -237,8 +234,7 @@

    Dupex::Dupex ( - const Dupex &  - p) + const Dupex & p) @@ -266,8 +262,7 @@

    Dupex & Dupex::operator= ( - const Dupex &  - p) + const Dupex & p) @@ -337,7 +332,8 @@

    +

    diff --git a/doc/html/struct_empirical_model_coefficients.html b/doc/html/struct_empirical_model_coefficients.html index 9547c9de8..109ff3316 100644 --- a/doc/html/struct_empirical_model_coefficients.html +++ b/doc/html/struct_empirical_model_coefficients.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -93,25 +105,25 @@ - + - + - + - + - + - + - + - + - + - +

    Data Fields

    float Tref
    float Tref
     
    float Ci_ref
    float Ci_ref
     
    float Asat
    float Asat
     
    float theta
    float theta
     
    float Tmin
    float Tmin
     
    float Topt
    float Topt
     
    float q
    float q
     
    float R
    float R
     
    float ER
    float ER
     
    float kC
    float kC
     

    Detailed Description

    @@ -130,7 +142,7 @@

    EmpiricalModelCoefficients::EmpiricalModelCoefficients ( - ) + ) @@ -312,7 +324,8 @@

    +

    diff --git a/doc/html/struct_farquhar_model_coefficients.html b/doc/html/struct_farquhar_model_coefficients.html index 7cd46cd2c..b4ebd8b8a 100644 --- a/doc/html/struct_farquhar_model_coefficients.html +++ b/doc/html/struct_farquhar_model_coefficients.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -95,73 +107,73 @@ - + - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

    void setVcmax (float Vcmax_25C, float rate_of_increase_dHa=65.33f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
    void setVcmax (float Vcmax_25C, float rate_of_increase_dHa=65.33f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
     
    void setJmax (float Jmax_25C, float rate_of_increase_dHa=46.36f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
    void setJmax (float Jmax_25C, float rate_of_increase_dHa=46.36f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
     
    void setTPU (float TPU_25C, float rate_of_increase_dHa=46.0f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
    void setTPU (float TPU_25C, float rate_of_increase_dHa=46.0f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
     
    void setRd (float Rd_25C, float rate_of_increase_dHa=46.39f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
    void setRd (float Rd_25C, float rate_of_increase_dHa=46.39f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
     
    void setQuantumEfficiency_alpha (float alpha_25C, float rate_of_increase_dHa=0.f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
    void setQuantumEfficiency_alpha (float alpha_25C, float rate_of_increase_dHa=0.f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
     
    void setLightResponseCurvature_theta (float theta_25C, float rate_of_increase_dHa=0.f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
    void setLightResponseCurvature_theta (float theta_25C, float rate_of_increase_dHa=0.f, float optimum_temperature_in_C=10000.f, float rate_of_decrease_dHd=1000.f)
     
    PhotosyntheticTemperatureResponseParameters getVcmaxTempResponse ()
    PhotosyntheticTemperatureResponseParameters getVcmaxTempResponse ()
     
    PhotosyntheticTemperatureResponseParameters getJmaxTempResponse ()
    PhotosyntheticTemperatureResponseParameters getJmaxTempResponse ()
     
    PhotosyntheticTemperatureResponseParameters getTPUTempResponse ()
    PhotosyntheticTemperatureResponseParameters getTPUTempResponse ()
     
    PhotosyntheticTemperatureResponseParameters getRdTempResponse ()
    PhotosyntheticTemperatureResponseParameters getRdTempResponse ()
     
    PhotosyntheticTemperatureResponseParameters getQuantumEfficiencyTempResponse ()
    PhotosyntheticTemperatureResponseParameters getQuantumEfficiencyTempResponse ()
     
    PhotosyntheticTemperatureResponseParameters getLightResponseCurvatureTempResponse ()
    PhotosyntheticTemperatureResponseParameters getLightResponseCurvatureTempResponse ()
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    int TPU_flag
    int TPU_flag
     
    float Vcmax
    float Vcmax
     
    float Jmax
    float Jmax
     
    float Rd
    float Rd
     
    float alpha
    float alpha
     
    float O
    float O
     
    float c_Rd
    float c_Rd
     
    float c_Vcmax
    float c_Vcmax
     
    float c_Jmax
    float c_Jmax
     
    float c_Gamma
    float c_Gamma
     
    float c_Kc
    float c_Kc
     
    float c_Ko
    float c_Ko
     
    float dH_Rd
    float dH_Rd
     
    float dH_Vcmax
    float dH_Vcmax
     
    float dH_Jmax
    float dH_Jmax
     
    float dH_Gamma
    float dH_Gamma
     
    float dH_Kc
    float dH_Kc
     
    float dH_Ko
    float dH_Ko
     
    - +

    Friends

    class PhotosynthesisModel
    class PhotosynthesisModel
     

    Detailed Description

    @@ -180,7 +192,7 @@

    FarquharModelCoefficients::FarquharModelCoefficients ( - ) + ) @@ -208,7 +220,7 @@

    PhotosyntheticTemperatureResponseParameters FarquharModelCoefficients::getJmaxTempResponse ( - ) + ) @@ -235,7 +247,7 @@

    PhotosyntheticTemperatureResponseParameters FarquharModelCoefficients::getLightResponseCurvatureTempResponse ( - ) + ) @@ -262,7 +274,7 @@

    PhotosyntheticTemperatureResponseParameters FarquharModelCoefficients::getQuantumEfficiencyTempResponse ( - ) + ) @@ -289,7 +301,7 @@

    PhotosyntheticTemperatureResponseParameters FarquharModelCoefficients::getRdTempResponse ( - ) + ) @@ -316,7 +328,7 @@

    PhotosyntheticTemperatureResponseParameters FarquharModelCoefficients::getTPUTempResponse ( - ) + ) @@ -343,7 +355,7 @@

    PhotosyntheticTemperatureResponseParameters FarquharModelCoefficients::getVcmaxTempResponse ( - ) + ) @@ -370,31 +382,22 @@

    void FarquharModelCoefficients::setJmax ( - float  - Jmax_25C, + float Jmax_25C, - float  - rate_of_increase_dHa = 46.36f, + float rate_of_increase_dHa = 46.36f, - float  - optimum_temperature_in_C = 10000.f, + float optimum_temperature_in_C = 10000.f, - float  - rate_of_decrease_dHd = 1000.f  - - - - ) - + float rate_of_decrease_dHd = 1000.f ) @@ -420,31 +423,22 @@

    void FarquharModelCoefficients::setLightResponseCurvature_theta ( - float  - theta_25C, + float theta_25C, - float  - rate_of_increase_dHa = 0.f, + float rate_of_increase_dHa = 0.f, - float  - optimum_temperature_in_C = 10000.f, + float optimum_temperature_in_C = 10000.f, - float  - rate_of_decrease_dHd = 1000.f  - - - - ) - + float rate_of_decrease_dHd = 1000.f ) @@ -470,31 +464,22 @@

    void FarquharModelCoefficients::setQuantumEfficiency_alpha ( - float  - alpha_25C, + float alpha_25C, - float  - rate_of_increase_dHa = 0.f, + float rate_of_increase_dHa = 0.f, - float  - optimum_temperature_in_C = 10000.f, + float optimum_temperature_in_C = 10000.f, - float  - rate_of_decrease_dHd = 1000.f  - - - - ) - + float rate_of_decrease_dHd = 1000.f ) @@ -520,31 +505,22 @@

    void FarquharModelCoefficients::setRd ( - float  - Rd_25C, + float Rd_25C, - float  - rate_of_increase_dHa = 46.39f, + float rate_of_increase_dHa = 46.39f, - float  - optimum_temperature_in_C = 10000.f, + float optimum_temperature_in_C = 10000.f, - float  - rate_of_decrease_dHd = 1000.f  - - - - ) - + float rate_of_decrease_dHd = 1000.f ) @@ -570,31 +546,22 @@

    void FarquharModelCoefficients::setTPU ( - float  - TPU_25C, + float TPU_25C, - float  - rate_of_increase_dHa = 46.0f, + float rate_of_increase_dHa = 46.0f, - float  - optimum_temperature_in_C = 10000.f, + float optimum_temperature_in_C = 10000.f, - float  - rate_of_decrease_dHd = 1000.f  - - - - ) - + float rate_of_decrease_dHd = 1000.f ) @@ -620,31 +587,22 @@

    void FarquharModelCoefficients::setVcmax ( - float  - Vcmax_25C, + float Vcmax_25C, - float  - rate_of_increase_dHa = 65.33f, + float rate_of_increase_dHa = 65.33f, - float  - optimum_temperature_in_C = 10000.f, + float optimum_temperature_in_C = 10000.f, - float  - rate_of_decrease_dHd = 1000.f  - - - - ) - + float rate_of_decrease_dHd = 1000.f ) @@ -658,7 +616,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ PhotosynthesisModel

    @@ -978,7 +936,8 @@

    +

    diff --git a/doc/html/struct_floral_bud.html b/doc/html/struct_floral_bud.html index 044f12ee3..4ba038b25 100644 --- a/doc/html/struct_floral_bud.html +++ b/doc/html/struct_floral_bud.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -93,31 +105,31 @@ - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    BudState state = BUD_DORMANT
    BudState state = BUD_DORMANT
     
    float time_counter = 0
    float time_counter = 0
     
    bool isterminal = false
    bool isterminal = false
     
    uint parent_index = 0
    uint parent_index = 0
     
    uint bud_index = 0
    uint bud_index = 0
     
    float current_fruit_scale_factor = 1
    float current_fruit_scale_factor = 1
     
    float previous_fruit_scale_factor = 0
    float previous_fruit_scale_factor = 0
     
    helios::vec3 base_position
    helios::vec3 base_position
     
    AxisRotation base_rotation
    AxisRotation base_rotation
     
    helios::vec3 bending_axis
    helios::vec3 bending_axis
     
    std::vector< helios::vec3inflorescence_bases
    std::vector< helios::vec3inflorescence_bases
     
    std::vector< uint > peduncle_objIDs
    std::vector< uint > peduncle_objIDs
     
    std::vector< uint > inflorescence_objIDs
    std::vector< uint > inflorescence_objIDs
     

    Detailed Description

    @@ -338,7 +350,8 @@

    +

    diff --git a/doc/html/struct_goblet_grapevine_parameters.html b/doc/html/struct_goblet_grapevine_parameters.html index 8a4418bf3..cd45837c9 100644 --- a/doc/html/struct_goblet_grapevine_parameters.html +++ b/doc/html/struct_goblet_grapevine_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -92,7 +104,7 @@

    Parameters defining the grapevine canopy with goblet (vent a taille) trellis. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,187 +120,175 @@ - + - + - + - + - + - - + + - + - + - - - - - - - - + + - + - + - - - - - -

    Public Member Functions

     GobletGrapevineParameters ()
     GobletGrapevineParameters ()
     Default constructor.
     
     GobletGrapevineParameters (const pugi::xml_node canopy_node)
     GobletGrapevineParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseGrapeVineParameters
     BaseGrapeVineParameters ()
    - Public Member Functions inherited from BaseGrapeVineParameters
     BaseGrapeVineParameters ()
     Default constructor.
     
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Additional Inherited Members

    - Data Fields inherited from BaseGrapeVineParameters
    float leaf_width
    - Data Fields inherited from BaseGrapeVineParameters
    float leaf_width
     Maximum width of leaves. Leaf width increases logarithmically from the shoot tip, so leaf_width is the width at the base of the shoot.
     
    float leaf_width_spread
    float leaf_width_spread
     Spread value for the maximum leaf width. With any new canopy or plant generation, the maximum leaf width would be between leaf_width - leaf_width_spread and leaf_width + leaf_width_spread.
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves.
     
    std::string wood_texture_file
    std::string wood_texture_file
     Path to texture map file for trunks/branches.
     
    int wood_subdivisions
    int wood_subdivisions
     Number of radial subdivisions for trunk/cordon/shoot tubes.
     
    int wood_subdivisions_spread
    int wood_subdivisions_spread
     Spread value for the number of wood subdivisions. With any new canopy or plant generation, the maximum number of wood subdivisions would be between wood_subdivisions - wood_subdivisions_spread and wood_subdivisions + wood_subdivisions_spread.
     
    float dead_probability
    float dead_probability
     Probability for a plant to be dead, i.e. without any leaves or grapes.
     
    float missing_plant_probability
    float missing_plant_probability
     Probability for a plant to be missing.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float plant_spacing_spread
    float plant_spacing_spread
     Spread value for the plant spacing. The spacing between adjacent plants along a row would vary between plant_spacing - plant_spacing_spread and plant_spacing + plant_spacing_spread.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    float row_spacing_spread
    float row_spacing_spread
     Spread value for the row spacing. This allows to vary the alignment of plants along a row. The spacing between two plants of adjacent rows would be between row_spacing - row_spacing_spread and row_spacing + row_spacing_spread.
     
    float trunk_height
    float trunk_height
     Distance between the ground and top of trunks.
     
    float trunk_height_spread
    float trunk_height_spread
     Spread value for the trunk height. With any new canopy or plant generation, the trunk height would be between trunk_height - trunk_height_spread and trunk_height + trunk_height_spread.
     
    float trunk_radius
    float trunk_radius
     Radius of the trunk at the widest point.
     
    float trunk_radius_spread
    float trunk_radius_spread
     Spread value for the trunk radius. With any new canopy or plant generation, the trunk radius would be between trunk_radius - trunk_radius_spread and trunk_radius + trunk_radius_spread.
     
    float cordon_length
    float cordon_length
     Length of the cordons. By default, half the plant spacing.
     
    float cordon_length_spread
    float cordon_length_spread
     Spread value for the cordon length. With any new canopy or plant generation, the cordon length would be between cordon_length - cordon_length_spread and cordon_length + cordon_length_spread.
     
    float cordon_height
    float cordon_height
     Distance between the ground and cordon. Note - must be greater than or equal to the trunk height.
     
    float cordon_height_spread
    float cordon_height_spread
     Spread value for the cordon height. With any new canopy or plant generation, the cordon height would be between cordon_height - cordon_height_spread and cordon_height + cordon_height_spread.
     
    float cordon_radius
    float cordon_radius
     Radius of cordon branches.
     
    float cordon_radius_spread
    float cordon_radius_spread
     Spread value for the cordon radius. With any new canopy or plant generation, the cordon radius would be between cordon_radius - cordon_radius_spread and cordon_radius + cordon_radius_spread.
     
    float shoot_length
    float shoot_length
     Length of shoots.
     
    float shoot_length_spread
    float shoot_length_spread
     Spread value for the shoot length. With any new canopy or plant generation, the shoot length would be between shoot_length - shoot_length_spread and shoot_length + shoot_length_spread.
     
    float shoot_radius
    float shoot_radius
     Radius of shoot branches.
     
    float shoot_radius_spread
    float shoot_radius_spread
     Spread value for the shoot radius. With any new canopy or plant generation, the shoot radius would be between shoot_radius - shoot_radius_spread and shoot_radius + shoot_radius_spread.
     
    uint shoots_per_cordon
    uint shoots_per_cordon
     Number of shoots on each cordon.
     
    uint shoots_per_cordon_spread
    uint shoots_per_cordon_spread
     Spread value for the number of shoots per cordon. With any new canopy or plant generation, the number of shoots per cordon would be between shoots_per_cordon - shoots_per_cordon_spread and shoots_per_cordon + shoots_per_cordon_spread.
     
    float leaf_spacing_fraction
    float leaf_spacing_fraction
     Spacing between adjacent leaves as a fraction of the local leaf width. E.g., leaf_spacing_fraction = 1 would give a leaf spacing equal to the leaf width.
     
    float leaf_spacing_fraction_spread
    float leaf_spacing_fraction_spread
     Spread value for the leaf spacing fraction. With any new canopy or plant generation, the leaf spacing fraction would be between leaf_spacing_fraction - leaf_spacing_fraction_spread and leaf_spacing_fraction + leaf_spacing_fraction_spread.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    float grape_radius
    float grape_radius
     Radius of grape berries.
     
    float grape_radius_spread
    float grape_radius_spread
     Spread value for the grape radius. With any new canopy or plant generation, the grape radius would be between grape_radius - grape_radius_spread and grape_radius + grape_radius_spread.
     
    float cluster_radius
    float cluster_radius
     Maximum horizontal radius of grape clusters.
     
    float cluster_radius_spread
    float cluster_radius_spread
     Spread value for the cluster radius. With any new canopy or plant generation, the cluster radius would be between cluster_radius - cluster_radius_spread and cluster_radius + cluster_radius_spread.
     
    float cluster_height_max
    float cluster_height_max
     Maximum height of grape clusters along the shoot as a fraction of the total shoot length.
     
    float cluster_height_max_spread
    float cluster_height_max_spread
     Spread value for the cluster height. With any new canopy or plant generation, the cluster height would be between cluster_height - cluster_height_spread and cluster_height + cluster_height_spread.
     
    helios::RGBcolor grape_color
    helios::RGBcolor grape_color
     Color of grapes.
     
    uint grape_subdivisions
    uint grape_subdivisions
     Number of azimuthal and zenithal subdivisions making up berries (will result in roughly 2*(grape_subdivisions)^2 triangles per grape berry)
     
    uint grape_subdivisions_spread
    uint grape_subdivisions_spread
     Spread value for the number of grape subdivisions. With any new canopy or plant generation, the number of grape subdivisions would be between grape_subdivisions - grape_subdivisions_spread and grape_subdivisions + grape_subdivisions_spread.
     
    std::vector< float > leaf_angle_PDF
    std::vector< float > leaf_angle_PDF
     
    float canopy_rotation_spread
    float canopy_rotation_spread
     Spread value for the canopy rotation. With any new canopy or plant generation, the canopy/plant rotation would be between canopy_rotation - canopy_rotation_spread and canopy_rotation + canopy_rotation_spread.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -306,7 +306,7 @@

    GobletGrapevineParameters::GobletGrapevineParameters ( - ) + ) @@ -327,8 +327,7 @@

    GobletGrapevineParameters::GobletGrapevineParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -357,8 +356,7 @@

    void GobletGrapevineParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -389,19 +387,12 @@

    void GobletGrapevineParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -428,8 +419,7 @@

    void GobletGrapevineParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -454,7 +444,8 @@

    +

    diff --git a/doc/html/struct_goblet_grapevine_parameters.png b/doc/html/struct_goblet_grapevine_parameters.png index d2f36441950f31c3814c8c9844a94d655a32013b..dc74d88278df82db11bbfde4e8280c592ccb221f 100644 GIT binary patch delta 21 dcmdnav7KXr9oK^g5B~rEZ+bRt$wrU&%m97e3)=ty delta 21 dcmdnav7KXr9oK;a2mb&6A3W*uij5xcnE`uJ3*P_$ diff --git a/doc/html/struct_grid_cell.html b/doc/html/struct_grid_cell.html index 01692c386..fcb760359 100644 --- a/doc/html/struct_grid_cell.html +++ b/doc/html/struct_grid_cell.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,34 +106,34 @@ - +

    Public Member Functions

     GridCell (helios::vec3 __center, helios::vec3 __global_anchor, helios::vec3 __size, helios::vec3 __global_size, float __azimuthal_rotation, helios::int3 __global_ijk, helios::int3 __global_count)
     GridCell (helios::vec3 __center, helios::vec3 __global_anchor, helios::vec3 __size, helios::vec3 __global_size, float __azimuthal_rotation, helios::int3 __global_ijk, helios::int3 __global_count)
     
    - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    helios::vec3 center
    helios::vec3 center
     
    helios::vec3 global_anchor
    helios::vec3 global_anchor
     
    helios::vec3 size
    helios::vec3 size
     
    helios::vec3 global_size
    helios::vec3 global_size
     
    helios::int3 global_ijk
    helios::int3 global_ijk
     
    helios::int3 global_count
    helios::int3 global_count
     
    float azimuthal_rotation
    float azimuthal_rotation
     
    float leaf_area
    float leaf_area
     
    float Gtheta
    float Gtheta
     
    float ground_height
    float ground_height
     
    float vegetation_height
    float vegetation_height
     
    float maximum_height
    float maximum_height
     

    Detailed Description

    @@ -140,49 +152,37 @@

    GridCell::GridCell ( - helios::vec3  - __center, + helios::vec3 __center, - helios::vec3  - __global_anchor, + helios::vec3 __global_anchor, - helios::vec3  - __size, + helios::vec3 __size, - helios::vec3  - __global_size, + helios::vec3 __global_size, - float  - __azimuthal_rotation, + float __azimuthal_rotation, - helios::int3  - __global_ijk, + helios::int3 __global_ijk, - helios::int3  - __global_count  - - - - ) - + helios::int3 __global_count ) @@ -395,7 +395,8 @@

    +

    diff --git a/doc/html/struct_hit_point.html b/doc/html/struct_hit_point.html index a2df29a84..bc5e741be 100644 --- a/doc/html/struct_hit_point.html +++ b/doc/html/struct_hit_point.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,24 +106,24 @@ - +

    Public Member Functions

     HitPoint (int __scanID, helios::vec3 __position, helios::SphericalCoord __direction, helios::int2 __row_column, helios::RGBcolor __color, std::map< std::string, double > __data)
     HitPoint (int __scanID, helios::vec3 __position, helios::SphericalCoord __direction, helios::int2 __row_column, helios::RGBcolor __color, std::map< std::string, double > __data)
     
    - + - + - + - + - + - + - +

    Data Fields

    helios::vec3 position
    helios::vec3 position
     
    helios::SphericalCoord direction
    helios::SphericalCoord direction
     
    helios::int2 row_column
    helios::int2 row_column
     
    helios::RGBcolor color
    helios::RGBcolor color
     
    std::map< std::string, double > data
    std::map< std::string, double > data
     
    int gridcell
    int gridcell
     
    int scanID
    int scanID
     

    Detailed Description

    @@ -130,8 +142,7 @@

    HitPoint::HitPoint ( - void  - ) + void ) @@ -158,43 +169,32 @@

    HitPoint::HitPoint ( - int  - __scanID, + int __scanID, - helios::vec3  - __position, + helios::vec3 __position, - helios::SphericalCoord  - __direction, + helios::SphericalCoord __direction, - helios::int2  - __row_column, + helios::int2 __row_column, - helios::RGBcolor  - __color, + helios::RGBcolor __color, - std::map< std::string, double >  - __data  - - - - ) - + std::map< std::string, double > __data ) @@ -327,7 +327,8 @@

    +

    diff --git a/doc/html/struct_homogeneous_canopy_parameters.html b/doc/html/struct_homogeneous_canopy_parameters.html index 25445be3a..010c885d6 100644 --- a/doc/html/struct_homogeneous_canopy_parameters.html +++ b/doc/html/struct_homogeneous_canopy_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining the homogeneous canopy. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,72 +120,66 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     HomogeneousCanopyParameters ()
     HomogeneousCanopyParameters ()
     Default constructor.
     
     HomogeneousCanopyParameters (const pugi::xml_node canopy_node)
     HomogeneousCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    helios::vec2 leaf_size
    helios::vec2 leaf_size
     Length of leaf in x- and y- directions (prior to rotation)
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves. If left empty, no texture will be used.
     
    helios::RGBcolor leaf_color
    helios::RGBcolor leaf_color
     Leaf color if no texture map file is provided.
     
    std::string leaf_angle_distribution
    std::string leaf_angle_distribution
     Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile", "plagiophile", "extremophile".
     
    float leaf_area_index
    float leaf_area_index
     One-sided leaf area index of the canopy.
     
    float canopy_height
    float canopy_height
     Height of the canopy.
     
    helios::vec2 canopy_extent
    helios::vec2 canopy_extent
     Horizontal extent of the canopy in the x- and y-directions.
     
    std::vector< float > leaf_angle_PDF
    std::vector< float > leaf_angle_PDF
     
    std::string buffer
    std::string buffer
     String specifying whether leaves should be placed so that leaf edges do not fall outside the specified canopy dimensions ("z", "xyz", or "none")
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -191,7 +197,7 @@

    HomogeneousCanopyParameters::HomogeneousCanopyParameters ( - ) + ) @@ -212,8 +218,7 @@

    HomogeneousCanopyParameters::HomogeneousCanopyParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -242,8 +247,7 @@

    void HomogeneousCanopyParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -274,19 +278,12 @@

    void HomogeneousCanopyParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -313,8 +310,7 @@

    void HomogeneousCanopyParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -518,7 +514,8 @@

    +

    diff --git a/doc/html/struct_homogeneous_canopy_parameters.png b/doc/html/struct_homogeneous_canopy_parameters.png index 86efbaf0ef6026faf394eb47559df63f5502911f..bb1b9e67f0e0069345cf72d56f843f60c04bc988 100644 GIT binary patch delta 21 dcmbQnHjQn99oK^g5B~rEZ+bRt$wrTJOaOQ$3v&Pf delta 21 dcmbQnHjQn99oK;a2mb&6A3W*uij5xUm;iN~3wHnj diff --git a/doc/html/struct_leaf_optics_properties.html b/doc/html/struct_leaf_optics_properties.html index c796a44ea..a43088466 100644 --- a/doc/html/struct_leaf_optics_properties.html +++ b/doc/html/struct_leaf_optics_properties.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,34 +105,34 @@

    LeafOptics model class. - More...

    + More...

    #include <LeafOptics.h>

    - +

    Public Member Functions

     LeafOpticsProperties (float chlorophyllcontent, float carotenoidcontent, float anthocyancontent, float watermass, float drymass, float protein, float carbonconstituents)
     LeafOpticsProperties (float chlorophyllcontent, float carotenoidcontent, float anthocyancontent, float watermass, float drymass, float protein, float carbonconstituents)
     
    - + - + - + - + - + - + - + - + - +

    Data Fields

    float numberlayers = 1.5
    float numberlayers = 1.5
     
    float brownpigments = 0.f
    float brownpigments = 0.f
     
    float chlorophyllcontent = 30.f
    float chlorophyllcontent = 30.f
     
    float carotenoidcontent = 7.f
    float carotenoidcontent = 7.f
     
    float anthocyancontent = 1
    float anthocyancontent = 1
     
    float watermass = 0.015f
    float watermass = 0.015f
     
    float drymass = 0.09f
    float drymass = 0.09f
     
    float protein = 0.f
    float protein = 0.f
     
    float carbonconstituents = 0.f
    float carbonconstituents = 0.f
     

    Detailed Description

    @@ -141,7 +153,7 @@

    LeafOpticsProperties::LeafOpticsProperties ( - ) + ) @@ -168,49 +180,37 @@

    LeafOpticsProperties::LeafOpticsProperties ( - float  - chlorophyllcontent, + float chlorophyllcontent, - float  - carotenoidcontent, + float carotenoidcontent, - float  - anthocyancontent, + float anthocyancontent, - float  - watermass, + float watermass, - float  - drymass, + float drymass, - float  - protein, + float protein, - float  - carbonconstituents  - - - - ) - + float carbonconstituents ) @@ -375,7 +375,8 @@

    +

    diff --git a/doc/html/struct_leaf_prototype.html b/doc/html/struct_leaf_prototype.html index 1dfe07007..102c80382 100644 --- a/doc/html/struct_leaf_prototype.html +++ b/doc/html/struct_leaf_prototype.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,70 +106,70 @@ - + - + - + - + - +

    Public Member Functions

     LeafPrototype (std::minstd_rand0 *generator)
     LeafPrototype (std::minstd_rand0 *generator)
     Constructor - sets random number generator.
     
     LeafPrototype ()
     LeafPrototype ()
     Constructor - does not set random number generator.
     
    void duplicate (const LeafPrototype &a)
    void duplicate (const LeafPrototype &a)
     
    LeafPrototypeoperator= (const LeafPrototype &a)
    LeafPrototypeoperator= (const LeafPrototype &a)
     Assignment operator.
     
    void sampleIdentifier ()
    void sampleIdentifier ()
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    uint(* prototype_function )(helios::Context *, LeafPrototype *prototype_parameters, int compound_leaf_index) = nullptr
    uint(* prototype_function )(helios::Context *, LeafPrototype *prototype_parameters, int compound_leaf_index) = nullptr
     Custom prototype function for creating leaf prototypes.
     
    std::string OBJ_model_file
    std::string OBJ_model_file
     OBJ model file to load for the leaf.
     
    std::map< int, std::string > leaf_texture_file
    std::map< int, std::string > leaf_texture_file
     Image texture file for the leaf.
     
    RandomParameter_float leaf_aspect_ratio
    RandomParameter_float leaf_aspect_ratio
     
    RandomParameter_float midrib_fold_fraction
    RandomParameter_float midrib_fold_fraction
     Fraction of folding along the leaf midrib. =0 means leaf is flat, =1 means leaf is completely folded in half along midrib.
     
    RandomParameter_float longitudinal_curvature
    RandomParameter_float longitudinal_curvature
     Leaf curvature factor along the longitudinal/length (x-direction). (+curves upward, -curved downward)
     
    RandomParameter_float lateral_curvature
    RandomParameter_float lateral_curvature
     Leaf curvature factor along the lateral/width (y-direction). (+curves upward, -curved downward)
     
    RandomParameter_float petiole_roll
    RandomParameter_float petiole_roll
     Creates a rolling at the leaf where the petiole attaches to the leaf blade.
     
    RandomParameter_float wave_period
    RandomParameter_float wave_period
     Period factor of leaf waves (sets how many waves there are along the leaf length)
     
    RandomParameter_float wave_amplitude
    RandomParameter_float wave_amplitude
     Amplitude of leaf waves (sets the height of leaf waves)
     
    RandomParameter_float leaf_buckle_length
    RandomParameter_float leaf_buckle_length
     Fraction of the leaf length where the leaf buckles under its weight.
     
    RandomParameter_float leaf_buckle_angle
    RandomParameter_float leaf_buckle_angle
     Angle of the leaf buckle (degrees)
     
    helios::vec3 leaf_offset
    helios::vec3 leaf_offset
     Amount to shift the leaf.
     
    uint subdivisions
    uint subdivisions
     Leaf subdivision count in each direction.
     
    uint unique_prototypes
    uint unique_prototypes
     Number of unique prototypes to generate.
     
    bool build_petiolule
    bool build_petiolule
     Add a petiolule to the base of the leaflet.
     
    uint unique_prototype_identifier = 0
    uint unique_prototype_identifier = 0
     

    Detailed Description

    @@ -176,8 +188,7 @@

    LeafPrototype::LeafPrototype ( - std::minstd_rand0 *  - generator) + std::minstd_rand0 * generator) @@ -206,7 +217,7 @@

    LeafPrototype::LeafPrototype ( - ) + ) @@ -236,8 +247,7 @@

    void LeafPrototype::duplicate ( - const LeafPrototype &  - a) + const LeafPrototype & a) @@ -264,8 +274,7 @@

    LeafPrototype & LeafPrototype::operator= ( - const LeafPrototype &  - a) + const LeafPrototype & a) @@ -294,7 +303,7 @@

    void LeafPrototype::sampleIdentifier ( - ) + ) @@ -621,7 +630,8 @@

    +

    diff --git a/doc/html/struct_m_o_p_tcoefficients.html b/doc/html/struct_m_o_p_tcoefficients.html index 003425df7..ed85c6950 100644 --- a/doc/html/struct_m_o_p_tcoefficients.html +++ b/doc/html/struct_m_o_p_tcoefficients.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -92,15 +104,15 @@

    Coefficients for optimality-based Medlyn et al. (2011) stomatal conductance model. - More...

    + More...

    #include <StomatalConductanceModel.h>

    - + - +

    Data Fields

    float gs0
    float gs0
     
    float g1
    float g1
     

    Detailed Description

    @@ -120,7 +132,7 @@

    MOPTcoefficients::MOPTcoefficients ( - ) + ) @@ -174,7 +186,8 @@

    +

    diff --git a/doc/html/struct_per_ray_data.html b/doc/html/struct_per_ray_data.html index b74df49c4..cadeba755 100644 --- a/doc/html/struct_per_ray_data.html +++ b/doc/html/struct_per_ray_data.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -95,25 +107,25 @@ - + - + - + - + - + - + - +

    Data Fields

    double strength
    double strength
     "strength" or amount of energy associated with the ray.
     
    uint origin_UUID
    uint origin_UUID
     UUID of primitive from which ray originated.
     
    bool face
    bool face
     Face of primitive from which ray was launched (true=top, false=bottom)
     
    float area
    float area
     Area of primitive (note for voxels, this is area density)
     
    uint seed
    uint seed
     Seed for curand random number generator.
     
    unsigned char periodic_depth
    unsigned char periodic_depth
     Number of periodic boundary intersections for ray.
     
    unsigned char source_ID
    unsigned char source_ID
     Numerical identifier for radiation source corresponding to each ray.
     
    @@ -255,7 +267,8 @@

    +

    diff --git a/doc/html/struct_photosynthetic_temperature_response_parameters.html b/doc/html/struct_photosynthetic_temperature_response_parameters.html index 91f7041e7..d4c2588bb 100644 --- a/doc/html/struct_photosynthetic_temperature_response_parameters.html +++ b/doc/html/struct_photosynthetic_temperature_response_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,24 +106,24 @@ - + - + - + - +

    Public Member Functions

     PhotosyntheticTemperatureResponseParameters (float value_at_25C)
     PhotosyntheticTemperatureResponseParameters (float value_at_25C)
     
     PhotosyntheticTemperatureResponseParameters (float value_at_25C, float rate_of_increase_dHa)
     PhotosyntheticTemperatureResponseParameters (float value_at_25C, float rate_of_increase_dHa)
     
     PhotosyntheticTemperatureResponseParameters (float value_at_25C, float rate_of_increase_dHa, float optimum_temperature_in_C)
     PhotosyntheticTemperatureResponseParameters (float value_at_25C, float rate_of_increase_dHa, float optimum_temperature_in_C)
     
     PhotosyntheticTemperatureResponseParameters (float value_at_25C, float rate_of_increase_dHa, float optimum_temperature_in_C, float rate_of_decrease_dHd)
     PhotosyntheticTemperatureResponseParameters (float value_at_25C, float rate_of_increase_dHa, float optimum_temperature_in_C, float rate_of_decrease_dHd)
     
    - + - + - + - +

    Data Fields

    float value_at_25C
    float value_at_25C
     
    float dHa
    float dHa
     
    float dHd
    float dHd
     
    float Topt
    float Topt
     

    Detailed Description

    @@ -130,7 +142,7 @@

    PhotosyntheticTemperatureResponseParameters::PhotosyntheticTemperatureResponseParameters ( - ) + ) @@ -157,8 +169,7 @@

    PhotosyntheticTemperatureResponseParameters::PhotosyntheticTemperatureResponseParameters ( - float  - value_at_25C) + float value_at_25C) @@ -185,19 +196,12 @@

    PhotosyntheticTemperatureResponseParameters::PhotosyntheticTemperatureResponseParameters ( - float  - value_at_25C, + float value_at_25C, - float  - rate_of_increase_dHa  - - - - ) - + float rate_of_increase_dHa ) @@ -223,25 +227,17 @@

    PhotosyntheticTemperatureResponseParameters::PhotosyntheticTemperatureResponseParameters ( - float  - value_at_25C, + float value_at_25C, - float  - rate_of_increase_dHa, + float rate_of_increase_dHa, - float  - optimum_temperature_in_C  - - - - ) - + float optimum_temperature_in_C ) @@ -267,31 +263,22 @@

    PhotosyntheticTemperatureResponseParameters::PhotosyntheticTemperatureResponseParameters ( - float  - value_at_25C, + float value_at_25C, - float  - rate_of_increase_dHa, + float rate_of_increase_dHa, - float  - optimum_temperature_in_C, + float optimum_temperature_in_C, - float  - rate_of_decrease_dHd  - - - - ) - + float rate_of_decrease_dHd ) @@ -376,7 +363,8 @@

    +

    diff --git a/doc/html/struct_phytomer.html b/doc/html/struct_phytomer.html index 25d85b6b7..ce703013d 100644 --- a/doc/html/struct_phytomer.html +++ b/doc/html/struct_phytomer.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -96,154 +108,154 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

     Phytomer (const PhytomerParameters &params, Shoot *parent_shoot, uint phytomer_index, const helios::vec3 &parent_internode_axis, const helios::vec3 &parent_petiole_axis, helios::vec3 internode_base_origin, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, uint rank, PlantArchitecture *plantarchitecture_ptr, helios::Context *context_ptr)
     Phytomer (const PhytomerParameters &params, Shoot *parent_shoot, uint phytomer_index, const helios::vec3 &parent_internode_axis, const helios::vec3 &parent_petiole_axis, helios::vec3 internode_base_origin, const AxisRotation &shoot_base_rotation, float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, uint rank, PlantArchitecture *plantarchitecture_ptr, helios::Context *context_ptr)
     
    std::vector< helios::vec3getInternodeNodePositions () const
    std::vector< helios::vec3getInternodeNodePositions () const
     
    std::vector< float > getInternodeNodeRadii () const
    std::vector< float > getInternodeNodeRadii () const
     
    helios::vec3 getInternodeAxisVector (float stem_fraction) const
    helios::vec3 getInternodeAxisVector (float stem_fraction) const
     
    helios::vec3 getPetioleAxisVector (float stem_fraction, uint petiole_index) const
    helios::vec3 getPetioleAxisVector (float stem_fraction, uint petiole_index) const
     
    float getInternodeLength () const
    float getInternodeLength () const
     
    float getInternodeRadius () const
    float getInternodeRadius () const
     
    float getPetioleLength () const
    float getPetioleLength () const
     
    float getInternodeRadius (float stem_fraction) const
    float getInternodeRadius (float stem_fraction) const
     
    float getLeafArea () const
    float getLeafArea () const
     
    bool hasLeaf () const
    bool hasLeaf () const
     
    float calculateDownstreamLeafArea () const
    float calculateDownstreamLeafArea () const
     
    void setInternodeLengthScaleFraction (float internode_scale_factor_fraction, bool update_context_geometry)
    void setInternodeLengthScaleFraction (float internode_scale_factor_fraction, bool update_context_geometry)
     
    void scaleInternodeMaxLength (float scale_factor)
    void scaleInternodeMaxLength (float scale_factor)
     Scale the fully-elongated (maximum) internode length as a fraction of its current fully-elongated length.
     
    void setInternodeMaxLength (float internode_length_max_new)
    void setInternodeMaxLength (float internode_length_max_new)
     Set the fully-elongated (maximum) internode length.
     
    void setInternodeMaxRadius (float internode_radius_max_new)
    void setInternodeMaxRadius (float internode_radius_max_new)
     Set the maximum radius of the internode.
     
    void setLeafScaleFraction (float leaf_scale_factor_fraction)
    void setLeafScaleFraction (float leaf_scale_factor_fraction)
     Set the leaf scale as a fraction of its total fully-elongated scale factor. Value is uniformly applied for all leaves/leaflets and petioles in the phytomer.
     
    void setLeafPrototypeScale (float leaf_prototype_scale)
    void setLeafPrototypeScale (float leaf_prototype_scale)
     Set the fully-elongated (maximum) leaf prototype scale. Value is uniformly applied for all leaves/leaflets in the phytomer.
     
    void scaleLeafPrototypeScale (float scale_factor)
    void scaleLeafPrototypeScale (float scale_factor)
     
    void setInflorescenceScaleFraction (FloralBud &fbud, float inflorescence_scale_factor_fraction)
    void setInflorescenceScaleFraction (FloralBud &fbud, float inflorescence_scale_factor_fraction)
     
    void setPetioleBase (const helios::vec3 &base_position)
    void setPetioleBase (const helios::vec3 &base_position)
     
    void rotateLeaf (uint petiole_index, uint leaf_index, const AxisRotation &rotation)
    void rotateLeaf (uint petiole_index, uint leaf_index, const AxisRotation &rotation)
     
    void setVegetativeBudState (BudState state)
    void setVegetativeBudState (BudState state)
     
    void setVegetativeBudState (BudState state, uint petiole_index, uint bud_index)
    void setVegetativeBudState (BudState state, uint petiole_index, uint bud_index)
     
    void setVegetativeBudState (BudState state, VegetativeBud &vbud)
    void setVegetativeBudState (BudState state, VegetativeBud &vbud)
     
    void setFloralBudState (BudState state)
    void setFloralBudState (BudState state)
     
    void setFloralBudState (BudState state, uint petiole_index, uint bud_index)
    void setFloralBudState (BudState state, uint petiole_index, uint bud_index)
     
    void setFloralBudState (BudState state, FloralBud &fbud)
    void setFloralBudState (BudState state, FloralBud &fbud)
     
    float calculateFruitConstructionCosts (const FloralBud &fbud)
    float calculateFruitConstructionCosts (const FloralBud &fbud)
     
    void removeLeaf ()
    void removeLeaf ()
     
    - +

    Static Public Member Functions

    static helios::vec3 getAxisVector (float stem_fraction, const std::vector< helios::vec3 > &axis_vertices)
    static helios::vec3 getAxisVector (float stem_fraction, const std::vector< helios::vec3 > &axis_vertices)
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    float phytomer_carbohydrate_cost_molC = 0
    float phytomer_carbohydrate_cost_molC = 0
     
    std::vector< std::vector< helios::vec3 > > petiole_vertices
    std::vector< std::vector< helios::vec3 > > petiole_vertices
     Coordinates of internode tube segments. Index is tube segment within internode.
     
    std::vector< std::vector< helios::vec3 > > leaf_bases
    std::vector< std::vector< helios::vec3 > > leaf_bases
     
    float internode_pitch
    float internode_pitch
     
    float internode_phyllotactic_angle
    float internode_phyllotactic_angle
     
    std::vector< std::vector< float > > petiole_radii
    std::vector< std::vector< float > > petiole_radii
     
    std::vector< float > petiole_length
    std::vector< float > petiole_length
     
    float petiole_pitch
    float petiole_pitch
     
    float petiole_curvature
    float petiole_curvature
     
    std::vector< std::vector< float > > leaf_size_max
    std::vector< std::vector< float > > leaf_size_max
     
    std::vector< std::vector< AxisRotation > > leaf_rotation
    std::vector< std::vector< AxisRotation > > leaf_rotation
     
    std::vector< helios::RGBcolorinternode_colors
    std::vector< helios::RGBcolorinternode_colors
     
    std::vector< helios::RGBcolorpetiole_colors
    std::vector< helios::RGBcolorpetiole_colors
     
    std::vector< std::vector< uint > > petiole_objIDs
    std::vector< std::vector< uint > > petiole_objIDs
     
    std::vector< std::vector< uint > > leaf_objIDs
    std::vector< std::vector< uint > > leaf_objIDs
     
    PhytomerParameters phytomer_parameters
    PhytomerParameters phytomer_parameters
     
    uint rank
    uint rank
     
    helios::int3 shoot_index
    helios::int3 shoot_index
     .x = index of phytomer along shoot, .y = current number of phytomers on parent shoot, .z = maximum number of phytomers on parent shoot
     
    uint plantID
    uint plantID
     
    uint parent_shoot_ID
    uint parent_shoot_ID
     
    Shootparent_shoot_ptr
    Shootparent_shoot_ptr
     
    float age = 0
    float age = 0
     Time since the phytomer was created.
     
    bool isdormant = false
    bool isdormant = false
     
    float current_internode_scale_factor = 1
    float current_internode_scale_factor = 1
     
    float current_leaf_scale_factor = 1
    float current_leaf_scale_factor = 1
     
    float downstream_leaf_area = 0
    float downstream_leaf_area = 0
     
    std::vector< std::vector< VegetativeBud > > axillary_vegetative_buds
    std::vector< std::vector< VegetativeBud > > axillary_vegetative_buds
     
    std::vector< std::vector< FloralBud > > floral_buds
    std::vector< std::vector< FloralBud > > floral_buds
     
    float internode_radius_initial
    float internode_radius_initial
     
    float internode_radius_max
    float internode_radius_max
     
    float internode_length_max
    float internode_length_max
     
    bool build_context_geometry_petiole = true
    bool build_context_geometry_petiole = true
     
    bool build_context_geometry_peduncle = true
    bool build_context_geometry_peduncle = true
     
    - + - +

    Friends

    struct Shoot
    struct Shoot
     
    class PlantArchitecture
    class PlantArchitecture
     

    Detailed Description

    @@ -259,91 +271,72 @@

    Phytomer::Phytomer ( - const PhytomerParameters &  - params, + const PhytomerParameters & params, - Shoot *  - parent_shoot, + Shoot * parent_shoot, - uint  - phytomer_index, + uint phytomer_index, - const helios::vec3 &  - parent_internode_axis, + const helios::vec3 & parent_internode_axis, - const helios::vec3 &  - parent_petiole_axis, + const helios::vec3 & parent_petiole_axis, - helios::vec3  - internode_base_origin, + helios::vec3 internode_base_origin, - const AxisRotation &  - shoot_base_rotation, + const AxisRotation & shoot_base_rotation, - float  - internode_radius, + float internode_radius, - float  - internode_length_max, + float internode_length_max, - float  - internode_length_scale_factor_fraction, + float internode_length_scale_factor_fraction, - float  - leaf_scale_factor_fraction, + float leaf_scale_factor_fraction, - uint  - rank, + uint rank, - PlantArchitecture *  - plantarchitecture_ptr, + PlantArchitecture * plantarchitecture_ptr, - helios::Context *  - context_ptr  - - - - ) - + helios::Context * context_ptr )

    @@ -362,7 +355,7 @@

    float Phytomer::calculateDownstreamLeafArea ( - ) + ) const @@ -381,8 +374,7 @@

    float Phytomer::calculateFruitConstructionCosts ( - const FloralBud &  - fbud) + const FloralBud & fbud) @@ -404,19 +396,12 @@

    helios::vec3 Phytomer::getAxisVector ( - float  - stem_fraction, + float stem_fraction, - const std::vector< helios::vec3 > &  - axis_vertices  - - - - ) - + const std::vector< helios::vec3 > & axis_vertices ) @@ -439,8 +424,7 @@

    helios::vec3 Phytomer::getInternodeAxisVector ( - float  - stem_fraction) + float stem_fraction) const @@ -459,7 +443,7 @@

    float Phytomer::getInternodeLength ( - ) + ) const @@ -478,7 +462,7 @@

    std::vector< helios::vec3 > Phytomer::getInternodeNodePositions ( - ) + ) const @@ -497,7 +481,7 @@

    std::vector< float > Phytomer::getInternodeNodeRadii ( - ) + ) const @@ -516,7 +500,7 @@

    float Phytomer::getInternodeRadius ( - ) + ) const @@ -535,8 +519,7 @@

    float Phytomer::getInternodeRadius ( - float  - stem_fraction) + float stem_fraction) const @@ -555,7 +538,7 @@

    float Phytomer::getLeafArea ( - ) + ) const @@ -574,19 +557,12 @@

    helios::vec3 Phytomer::getPetioleAxisVector ( - float  - stem_fraction, + float stem_fraction, - uint  - petiole_index  - - - - ) - const + uint petiole_index ) const

    @@ -831,19 +781,12 @@

    void Phytomer::setInflorescenceScaleFraction ( - FloralBud &  - fbud, + FloralBud & fbud, - float  - inflorescence_scale_factor_fraction  - - - - ) - + float inflorescence_scale_factor_fraction )

    @@ -1100,7 +1015,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ PlantArchitecture

    @@ -1692,7 +1607,8 @@

    +

    diff --git a/doc/html/struct_phytomer_parameters.html b/doc/html/struct_phytomer_parameters.html index 3055f3c15..2e693218f 100644 --- a/doc/html/struct_phytomer_parameters.html +++ b/doc/html/struct_phytomer_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -96,37 +107,37 @@ - + - +

    Public Member Functions

     PhytomerParameters ()
     PhytomerParameters ()
     Default constructor - does not set random number generator.
     
     PhytomerParameters (std::minstd_rand0 *generator)
     PhytomerParameters (std::minstd_rand0 *generator)
     Constructor - sets random number generator.
     
    - + - + - + - + - + - + - +

    Data Fields

    InternodeParameters internode
    InternodeParameters internode
     
    PetioleParameters petiole
    PetioleParameters petiole
     
    LeafParameters leaf
    LeafParameters leaf
     
    PeduncleParameters peduncle
    PeduncleParameters peduncle
     
    InflorescenceParameters inflorescence
    InflorescenceParameters inflorescence
     
    void(* phytomer_creation_function )(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age) = nullptr
    void(* phytomer_creation_function )(std::shared_ptr< Phytomer > phytomer_ptr, uint shoot_node_index, uint parent_shoot_node_index, uint shoot_max_nodes, float plant_age) = nullptr
     
    void(* phytomer_callback_function )(std::shared_ptr< Phytomer > phytomer_ptr) = nullptr
    void(* phytomer_callback_function )(std::shared_ptr< Phytomer > phytomer_ptr) = nullptr
     
    - + - + - +

    Friends

    class PlantArchitecture
    class PlantArchitecture
     
    struct Phytomer
    struct Phytomer
     
    struct Shoot
    struct Shoot
     

    Detailed Description

    @@ -142,7 +153,7 @@

    PhytomerParameters::PhytomerParameters ( - ) + ) @@ -166,8 +177,7 @@

    PhytomerParameters::PhytomerParameters ( - std::minstd_rand0 *  - generator) + std::minstd_rand0 * generator) @@ -184,7 +194,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ Phytomer

    @@ -393,7 +403,8 @@

    +

    diff --git a/doc/html/struct_plant_instance.html b/doc/html/struct_plant_instance.html index 13d1df08a..cac30c78d 100644 --- a/doc/html/struct_plant_instance.html +++ b/doc/html/struct_plant_instance.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,40 +106,40 @@ - +

    Public Member Functions

     PlantInstance (const helios::vec3 &a_base_position, float a_current_age, helios::Context *a_context_ptr)
     PlantInstance (const helios::vec3 &a_base_position, float a_current_age, helios::Context *a_context_ptr)
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    std::vector< std::shared_ptr< Shoot > > shoot_tree
    std::vector< std::shared_ptr< Shoot > > shoot_tree
     
    helios::vec3 base_position
    helios::vec3 base_position
     
    float current_age
    float current_age
     
    float time_since_dormancy = 0
    float time_since_dormancy = 0
     
    helios::Contextcontext_ptr
    helios::Contextcontext_ptr
     
    std::pair< std::string, float > epicormic_shoot_probability_perlength_per_day
    std::pair< std::string, float > epicormic_shoot_probability_perlength_per_day
     
    float dd_to_dormancy_break = 0
    float dd_to_dormancy_break = 0
     
    float dd_to_flower_initiation = 0
    float dd_to_flower_initiation = 0
     
    float dd_to_flower_opening = 0
    float dd_to_flower_opening = 0
     
    float dd_to_fruit_set = 0
    float dd_to_fruit_set = 0
     
    float dd_to_fruit_maturity = 0
    float dd_to_fruit_maturity = 0
     
    float dd_to_dormancy = 0
    float dd_to_dormancy = 0
     
    float max_leaf_lifespan = 1e6
    float max_leaf_lifespan = 1e6
     
    bool is_evergreen = false
    bool is_evergreen = false
     
    float max_age = 999
    float max_age = 999
     

    Detailed Description

    @@ -146,25 +158,17 @@

    PlantInstance::PlantInstance ( - const helios::vec3 &  - a_base_position, + const helios::vec3 & a_base_position, - float  - a_current_age, + float a_current_age, - helios::Context *  - a_context_ptr  - - - - ) - + helios::Context * a_context_ptr ) @@ -425,7 +429,8 @@

    +

    diff --git a/doc/html/struct_radiation_band.html b/doc/html/struct_radiation_band.html index 511547130..66c5aab5f 100644 --- a/doc/html/struct_radiation_band.html +++ b/doc/html/struct_radiation_band.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,55 +105,55 @@

    Properties defining a radiation band. - More...

    + More...

    #include <RadiationModel.h>

    - +

    Public Member Functions

     RadiationBand (std::string a_label, size_t directRayCount_default, size_t diffuseRayCount_default, float diffuseFlux_default, uint scatteringDepth_default, float minScatterEnergy_default)
     RadiationBand (std::string a_label, size_t directRayCount_default, size_t diffuseRayCount_default, float diffuseFlux_default, uint scatteringDepth_default, float minScatterEnergy_default)
     Constructor.
     
    - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    std::string label
    std::string label
     Label for band.
     
    size_t directRayCount
    size_t directRayCount
     Number of direct rays launched per element.
     
    size_t diffuseRayCount
    size_t diffuseRayCount
     Number of diffuse rays launched per element.
     
    float diffuseFlux
    float diffuseFlux
     Diffuse component of radiation flux integrated over wave band.
     
    float diffuseExtinction
    float diffuseExtinction
     Distribution coefficient of ambient diffuse radiation for wave band.
     
    helios::vec3 diffusePeakDir
    helios::vec3 diffusePeakDir
     Direction of peak in ambient diffuse radiation.
     
    float diffuseDistNorm
    float diffuseDistNorm
     Diffuse distribution normalization factor.
     
    std::vector< helios::vec2diffuse_spectrum
    std::vector< helios::vec2diffuse_spectrum
     Spectral distribution of diffuse radiation flux for wave band.
     
    uint scatteringDepth
    uint scatteringDepth
     Scattering depth for wave band.
     
    float minScatterEnergy
    float minScatterEnergy
     Minimum energy for scattering for wave band.
     
    bool emissionFlag
    bool emissionFlag
     Flag that determines if emission calculations are performed for wave band.
     
    helios::vec2 wavebandBounds
    helios::vec2 wavebandBounds
     Waveband range of band.
     
    bool radiativepropertiesinitialized
    bool radiativepropertiesinitialized
     Flag to indicate whether radiative bands have been initialized for this band.
     
    @@ -162,43 +174,32 @@

    RadiationBand::RadiationBand ( - std::string  - a_label, + std::string a_label, - size_t  - directRayCount_default, + size_t directRayCount_default, - size_t  - diffuseRayCount_default, + size_t diffuseRayCount_default, - float  - diffuseFlux_default, + float diffuseFlux_default, - uint  - scatteringDepth_default, + uint scatteringDepth_default, - float  - minScatterEnergy_default  - - - - ) - + float minScatterEnergy_default ) @@ -455,7 +456,8 @@

    +

    diff --git a/doc/html/struct_radiation_camera.html b/doc/html/struct_radiation_camera.html index 2eb4f3564..b0849bcc6 100644 --- a/doc/html/struct_radiation_camera.html +++ b/doc/html/struct_radiation_camera.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,44 +105,44 @@

    Data object for a radiation camera. - More...

    + More...

    #include <RadiationModel.h>

    - +

    Public Member Functions

     RadiationCamera (std::string initlabel, const std::vector< std::string > &band_label, const helios::vec3 &initposition, const helios::vec3 &initlookat, const helios::int2 &initresolution, float initlens_diameter, float initfocal_length, float intitHFOV_degrees, float initFOV_aspect_ratio, uint initantialiasing_samples)
     RadiationCamera (std::string initlabel, const std::vector< std::string > &band_label, const helios::vec3 &initposition, const helios::vec3 &initlookat, const helios::int2 &initresolution, float initlens_diameter, float initfocal_length, float intitHFOV_degrees, float initFOV_aspect_ratio, uint initantialiasing_samples)
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    std::string label
    std::string label
     
    helios::vec3 position
    helios::vec3 position
     
    helios::vec3 lookat
    helios::vec3 lookat
     
    float lens_diameter
    float lens_diameter
     
    helios::int2 resolution
    helios::int2 resolution
     
    float focal_length
    float focal_length
     
    float HFOV_degrees
    float HFOV_degrees
     
    float FOV_aspect_ratio
    float FOV_aspect_ratio
     
    uint antialiasing_samples
    uint antialiasing_samples
     
    std::vector< std::string > band_labels
    std::vector< std::string > band_labels
     
    std::map< std::string, std::string > band_spectral_response
    std::map< std::string, std::string > band_spectral_response
     
    std::map< std::string, std::vector< float > > pixel_data
    std::map< std::string, std::vector< float > > pixel_data
     
    std::vector< uint > pixel_label_UUID
    std::vector< uint > pixel_label_UUID
     
    std::vector< float > pixel_depth
    std::vector< float > pixel_depth
     

    Detailed Description

    @@ -150,67 +162,52 @@

    RadiationCamera::RadiationCamera ( - std::string  - initlabel, + std::string initlabel, - const std::vector< std::string > &  - band_label, + const std::vector< std::string > & band_label, - const helios::vec3 &  - initposition, + const helios::vec3 & initposition, - const helios::vec3 &  - initlookat, + const helios::vec3 & initlookat, - const helios::int2 &  - initresolution, + const helios::int2 & initresolution, - float  - initlens_diameter, + float initlens_diameter, - float  - initfocal_length, + float initfocal_length, - float  - intitHFOV_degrees, + float intitHFOV_degrees, - float  - initFOV_aspect_ratio, + float initFOV_aspect_ratio, - uint  - initantialiasing_samples  - - - - ) - + uint initantialiasing_samples ) @@ -455,7 +452,8 @@

    +

    diff --git a/doc/html/struct_radiation_source.html b/doc/html/struct_radiation_source.html index ed2e0ab21..1c430e480 100644 --- a/doc/html/struct_radiation_source.html +++ b/doc/html/struct_radiation_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,54 +105,54 @@

    Radiation source data object. - More...

    + More...

    #include <RadiationModel.h>

    - + - + - + - + - +

    Public Member Functions

     RadiationSource (const helios::vec3 &position)
     RadiationSource (const helios::vec3 &position)
     Constructor for collimated radiation source.
     
     RadiationSource (const helios::vec3 &position, float width)
     RadiationSource (const helios::vec3 &position, float width)
     Constructor for spherical radiation source.
     
     RadiationSource (const helios::vec3 &position, float position_scaling_factor, float width, float flux_scaling_factor)
     RadiationSource (const helios::vec3 &position, float position_scaling_factor, float width, float flux_scaling_factor)
     Constructor for sun sphere radiation source.
     
     RadiationSource (const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
     RadiationSource (const helios::vec3 &position, const helios::vec2 &size, const helios::vec3 &rotation)
     Constructor for rectangular radiation source.
     
     RadiationSource (const helios::vec3 &position, float width, const helios::vec3 &rotation)
     RadiationSource (const helios::vec3 &position, float width, const helios::vec3 &rotation)
     Constructor for disk radiation source.
     
    - + - + - + - + - + - + - + - + - +

    Data Fields

    helios::vec3 source_position
    helios::vec3 source_position
     Positions of radiation source.
     
    float source_position_scaling_factor
    float source_position_scaling_factor
     Source position factors used to scale position in case of a sun sphere source.
     
    std::vector< helios::vec2source_spectrum
    std::vector< helios::vec2source_spectrum
     Spectral distribution of radiation source. Each element of the vector is a wavelength band, where .x is the wavelength in nm and .y is the spectral flux in W/m^2/nm.
     
    std::string source_spectrum_label = "none"
    std::string source_spectrum_label = "none"
     
    helios::vec2 source_width
    helios::vec2 source_width
     Widths for each radiation source (N/A for collimated sources)
     
    helios::vec3 source_rotation
    helios::vec3 source_rotation
     Rotation (rx,ry,rz) for radiation source (area sources only)
     
    float source_flux_scaling_factor
    float source_flux_scaling_factor
     Source flux factors used to scale flux in case of a sun sphere source.
     
    RadiationSourceType source_type
    RadiationSourceType source_type
     Types of all radiation sources.
     
    std::map< std::string, float > source_fluxes
    std::map< std::string, float > source_fluxes
     Fluxes of radiation source for all bands.
     
    @@ -161,8 +173,7 @@

    RadiationSource::RadiationSource ( - const helios::vec3 &  - position) + const helios::vec3 & position) @@ -191,19 +202,12 @@

    RadiationSource::RadiationSource ( - const helios::vec3 &  - position, + const helios::vec3 & position, - float  - width  - - - - ) - + float width ) @@ -231,31 +235,22 @@

    RadiationSource::RadiationSource ( - const helios::vec3 &  - position, + const helios::vec3 & position, - float  - position_scaling_factor, + float position_scaling_factor, - float  - width, + float width, - float  - flux_scaling_factor  - - - - ) - + float flux_scaling_factor ) @@ -283,25 +278,17 @@

    RadiationSource::RadiationSource ( - const helios::vec3 &  - position, + const helios::vec3 & position, - const helios::vec2 &  - size, + const helios::vec2 & size, - const helios::vec3 &  - rotation  - - - - ) - + const helios::vec3 & rotation ) @@ -329,25 +316,17 @@

    RadiationSource::RadiationSource ( - const helios::vec3 &  - position, + const helios::vec3 & position, - float  - width, + float width, - const helios::vec3 &  - rotation  - - - - ) - + const helios::vec3 & rotation ) @@ -530,7 +509,8 @@

    +

    diff --git a/doc/html/struct_random_parameter__float.html b/doc/html/struct_random_parameter__float.html index 6cc1d78fe..27addcb28 100644 --- a/doc/html/struct_random_parameter__float.html +++ b/doc/html/struct_random_parameter__float.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,37 +106,37 @@ - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

     RandomParameter_float ()
     RandomParameter_float ()
     Constructor initializing to a constant default value of 0.
     
     RandomParameter_float (float val)
     RandomParameter_float (float val)
     Constructor initializing to a constant value.
     
     RandomParameter_float (std::minstd_rand0 *rand_generator)
     RandomParameter_float (std::minstd_rand0 *rand_generator)
     Constructor initializing the random number generator.
     
    void initialize (float a_val, std::minstd_rand0 *rand_generator)
    void initialize (float a_val, std::minstd_rand0 *rand_generator)
     
    void initialize (std::minstd_rand0 *rand_generator)
    void initialize (std::minstd_rand0 *rand_generator)
     
    RandomParameter_floatoperator= (float a)
    RandomParameter_floatoperator= (float a)
     
    void uniformDistribution (float minval, float maxval)
    void uniformDistribution (float minval, float maxval)
     
    void normalDistribution (float mean, float std_dev)
    void normalDistribution (float mean, float std_dev)
     
    void weibullDistribution (float shape, float scale)
    void weibullDistribution (float shape, float scale)
     
    float val ()
    float val ()
     
    float resample ()
    float resample ()
     
    - + - +

    Data Fields

    std::string distribution
    std::string distribution
     
    std::vector< float > distribution_parameters
    std::vector< float > distribution_parameters
     

    Detailed Description

    @@ -143,7 +155,7 @@

    RandomParameter_float::RandomParameter_float ( - ) + ) @@ -173,8 +185,7 @@

    RandomParameter_float::RandomParameter_float ( - float  - val) + float val) @@ -204,8 +215,7 @@

    RandomParameter_float::RandomParameter_float ( - std::minstd_rand0 *  - rand_generator) + std::minstd_rand0 * rand_generator) @@ -241,19 +251,12 @@

    void RandomParameter_float::initialize ( - float  - a_val, + float a_val, - std::minstd_rand0 *  - rand_generator  - - - - ) - + std::minstd_rand0 * rand_generator ) @@ -279,8 +282,7 @@

    void RandomParameter_float::initialize ( - std::minstd_rand0 *  - rand_generator) + std::minstd_rand0 * rand_generator) @@ -307,19 +309,12 @@

    void RandomParameter_float::normalDistribution ( - float  - mean, + float mean, - float  - std_dev  - - - - ) - + float std_dev ) @@ -345,8 +340,7 @@

    RandomParameter_float & RandomParameter_float::operator= ( - float  - a) + float a) @@ -373,7 +367,7 @@

    float RandomParameter_float::resample ( - ) + ) @@ -400,19 +394,12 @@

    void RandomParameter_float::uniformDistribution ( - float  - minval, + float minval, - float  - maxval  - - - - ) - + float maxval ) @@ -438,7 +425,7 @@

    float RandomParameter_float::val ( - ) + ) @@ -465,19 +452,12 @@

    void RandomParameter_float::weibullDistribution ( - float  - shape, + float shape, - float  - scale  - - - - ) - + float scale ) @@ -530,7 +510,8 @@

    +

    diff --git a/doc/html/struct_random_parameter__int.html b/doc/html/struct_random_parameter__int.html index c592d8f08..a0a502f17 100644 --- a/doc/html/struct_random_parameter__int.html +++ b/doc/html/struct_random_parameter__int.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -93,19 +105,19 @@ - + - + - + - + - + - + - +

    Public Member Functions

    void initialize (int a_val, std::minstd_rand0 *rand_generator)
    void initialize (int a_val, std::minstd_rand0 *rand_generator)
     
    void initialize (std::minstd_rand0 *rand_generator)
    void initialize (std::minstd_rand0 *rand_generator)
     
    RandomParameter_intoperator= (int a)
    RandomParameter_intoperator= (int a)
     
    void uniformDistribution (int minval, int maxval)
    void uniformDistribution (int minval, int maxval)
     
    void discreteValues (const std::vector< int > &values)
    void discreteValues (const std::vector< int > &values)
     
    int val ()
    int val ()
     
    int resample ()
    int resample ()
     

    Detailed Description

    @@ -124,7 +136,7 @@

    RandomParameter_int::RandomParameter_int ( - ) + ) @@ -152,8 +164,7 @@

    void RandomParameter_int::discreteValues ( - const std::vector< int > &  - values) + const std::vector< int > & values) @@ -180,19 +191,12 @@

    void RandomParameter_int::initialize ( - int  - a_val, + int a_val, - std::minstd_rand0 *  - rand_generator  - - - - ) - + std::minstd_rand0 * rand_generator ) @@ -218,8 +222,7 @@

    void RandomParameter_int::initialize ( - std::minstd_rand0 *  - rand_generator) + std::minstd_rand0 * rand_generator) @@ -246,8 +249,7 @@

    RandomParameter_int & RandomParameter_int::operator= ( - int  - a) + int a) @@ -274,7 +276,7 @@

    int RandomParameter_int::resample ( - ) + ) @@ -301,19 +303,12 @@

    void RandomParameter_int::uniformDistribution ( - int  - minval, + int minval, - int  - maxval  - - - - ) - + int maxval ) @@ -339,7 +334,7 @@

    int RandomParameter_int::val ( - ) + ) @@ -360,7 +355,8 @@

    +

    diff --git a/doc/html/struct_scan_metadata.html b/doc/html/struct_scan_metadata.html index 6b47a4751..a2fa744b2 100644 --- a/doc/html/struct_scan_metadata.html +++ b/doc/html/struct_scan_metadata.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,65 +105,65 @@

    Structure containing metadata for a terrestrial scan. - More...

    + More...

    #include <LiDAR.h>

    - + - + - + - +

    Public Member Functions

     ScanMetadata ()
     ScanMetadata ()
     Default LiDAR scan data structure.
     
     ScanMetadata (const helios::vec3 &a_origin, uint a_Ntheta, float a_thetaMin, float a_thetaMax, uint a_Nphi, float a_phiMin, float a_phiMax, float a_exitDiameter, float a_beamDivergence, const std::vector< std::string > &a_columnFormat)
     ScanMetadata (const helios::vec3 &a_origin, uint a_Ntheta, float a_thetaMin, float a_thetaMax, uint a_Nphi, float a_phiMin, float a_phiMax, float a_exitDiameter, float a_beamDivergence, const std::vector< std::string > &a_columnFormat)
     Create a LiDAR scan data structure.
     
    helios::SphericalCoord rc2direction (uint row, uint column) const
    helios::SphericalCoord rc2direction (uint row, uint column) const
     Convert the (row,column) of hit point in a scan to a direction vector.
     
    helios::int2 direction2rc (const helios::SphericalCoord &direction) const
    helios::int2 direction2rc (const helios::SphericalCoord &direction) const
     Convert the scan ray direction into (row,column) table index.
     
    - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    std::string data_file
    std::string data_file
     File containing hit point data.
     
    uint Ntheta
    uint Ntheta
     Number of zenithal angles in scan (rows)
     
    float thetaMin
    float thetaMin
     Minimum zenithal angle of scan in radians

     
    float thetaMax
    float thetaMax
     Maximum zenithal angle of scan in radians.
     
    uint Nphi
    uint Nphi
     Number of azimuthal angles in scan (columns)
     
    float phiMin
    float phiMin
     Minimum azimuthal angle of scan in radians.
     
    float phiMax
    float phiMax
     Maximum azimuthal angle of scan in radians.
     
    helios::vec3 origin
    helios::vec3 origin
     (x,y,z) coordinate of scanner location
     
    float exitDiameter
    float exitDiameter
     Diameter of laser pulse at exit from the scanner.
     
    float beamDivergence
    float beamDivergence
     Divergence angle of the laser beam in radians.
     
    std::vector< std::string > columnFormat
    std::vector< std::string > columnFormat
     Vector of strings specifying the columns of the scan ASCII file for input/output.
     

    Detailed Description

    Structure containing metadata for a terrestrial scan.

    -

    A scan is initialized by providing 1) the origin of the scan (see origin), 2) the number of zenithal scan directions (see Ntheta), 3) the range of zenithal scan angles (see thetaMin, thetaMax), 4) the number of azimuthal scan directions (see Nphi), 5) the range of azimuthal scan angles (see phiMin, phiMax). This creates a grid of Ntheta x Nphi scan points which are all initialized as misses. Points are set as hits using the addHitPoint() function. There are various functions to query the scan data.

    +

    A scan is initialized by providing 1) the origin of the scan (see origin), 2) the number of zenithal scan directions (see Ntheta), 3) the range of zenithal scan angles (see thetaMin, thetaMax), 4) the number of azimuthal scan directions (see Nphi), 5) the range of azimuthal scan angles (see phiMin, phiMax). This creates a grid of Ntheta x Nphi scan points which are all initialized as misses. Points are set as hits using the addHitPoint() function. There are various functions to query the scan data.

    Definition at line 188 of file LiDAR.h.

    Constructor & Destructor Documentation

    @@ -164,7 +176,7 @@

    ScanMetadata::ScanMetadata ( - ) + ) @@ -185,67 +197,52 @@

    ScanMetadata::ScanMetadata ( - const helios::vec3 &  - a_origin, + const helios::vec3 & a_origin, - uint  - a_Ntheta, + uint a_Ntheta, - float  - a_thetaMin, + float a_thetaMin, - float  - a_thetaMax, + float a_thetaMax, - uint  - a_Nphi, + uint a_Nphi, - float  - a_phiMin, + float a_phiMin, - float  - a_phiMax, + float a_phiMax, - float  - a_exitDiameter, + float a_exitDiameter, - float  - a_beamDivergence, + float a_beamDivergence, - const std::vector< std::string > &  - a_columnFormat  - - - - ) - + const std::vector< std::string > & a_columnFormat )

    @@ -276,8 +273,7 @@

    helios::int2 ScanMetadata::direction2rc ( - const helios::SphericalCoord &  - direction) + const helios::SphericalCoord & direction) const @@ -305,19 +301,12 @@

    helios::SphericalCoord ScanMetadata::rc2direction ( - uint  - row, + uint row, - uint  - column  - - - - ) - const + uint column ) const

    @@ -549,7 +538,8 @@

    +

    diff --git a/doc/html/struct_shader.html b/doc/html/struct_shader.html index 9355d5b37..aa711c6f6 100644 --- a/doc/html/struct_shader.html +++ b/doc/html/struct_shader.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,79 +105,79 @@

    OpenGL Shader data structure. - More...

    + More...

    #include <Visualizer.h>

    - + - + - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

    void disableTextures () const
    void disableTextures () const
     Disable texture maps and color fragments by interpolating vertex colors.
     
    void setTextureMap (const char *texture_file, uint &textureID, helios::int2 &texture_size)
    void setTextureMap (const char *texture_file, uint &textureID, helios::int2 &texture_size)
     Color fragments using an RGB texture map.
     
    void enableTextureMaps () const
    void enableTextureMaps () const
     Enable texture maps and color fragments using an RGB texture map.
     
    void setTextureMask (const Glyph *glyph, uint &textureID)
    void setTextureMask (const Glyph *glyph, uint &textureID)
     Set fragment opacity using a Glyph (red channel)
     
    void setTextureMask (const char *texture_file, uint &textureID, helios::int2 &texture_size)
    void setTextureMask (const char *texture_file, uint &textureID, helios::int2 &texture_size)
     Set fragment opacity using a texture map file (red channel)
     
    void enableTextureMasks () const
    void enableTextureMasks () const
     Enable texture masks and color fragments by interpolating vertex colors.
     
    void setTransformationMatrix (const glm::mat4 &matrix) const
    void setTransformationMatrix (const glm::mat4 &matrix) const
     Set the shader transformation matrix, i.e., the Affine transformation applied to all vertices.
     
    void setDepthBiasMatrix (const glm::mat4 &matrix) const
    void setDepthBiasMatrix (const glm::mat4 &matrix) const
     Set the depth bias matrix for shadows.
     
    void setLightDirection (const helios::vec3 &direction) const
    void setLightDirection (const helios::vec3 &direction) const
     Set the direction of the light (sun)
     
    void setLightingModel (uint lightingmodel) const
    void setLightingModel (uint lightingmodel) const
     Set the lighting model.
     
    void setLightIntensity (float lightintensity) const
    void setLightIntensity (float lightintensity) const
     Set the intensity of the light source.
     
    void useShader () const
    void useShader () const
     Set shader as current.
     
    void initialize (const char *vertex_shader_file, const char *fragment_shader_file)
    void initialize (const char *vertex_shader_file, const char *fragment_shader_file)
     Initialize the shader.
     
    - + - + - + - + - + - + - + - + - + - +

    Data Fields

    uint shaderID
    uint shaderID
     
    uint textureUniform
    uint textureUniform
     
    uint shadowmapUniform
    uint shadowmapUniform
     
    uint transformMatrixUniform
    uint transformMatrixUniform
     
    uint depthBiasUniform
    uint depthBiasUniform
     
    uint lightDirectionUniform
    uint lightDirectionUniform
     
    uint lightingModelUniform
    uint lightingModelUniform
     
    uint RboundUniform
    uint RboundUniform
     
    float lightIntensityUniform
    float lightIntensityUniform
     
    uint VertexArrayID
    uint VertexArrayID
     

    Detailed Description

    OpenGL Shader data structure.

    -

    Definition at line 80 of file Visualizer.h.

    +

    Definition at line 90 of file Visualizer.h.

    Constructor & Destructor Documentation

    ◆ ~Shader()

    @@ -176,14 +188,13 @@

    Shader::~Shader ( - void  - ) + void )

    -

    Definition at line 4071 of file Visualizer.cpp.

    +

    Definition at line 4082 of file Visualizer.cpp.

    @@ -197,7 +208,7 @@

    void Shader::disableTextures ( - ) + ) const @@ -205,7 +216,7 @@

    Definition at line 4076 of file Visualizer.cpp.

    +

    Definition at line 4087 of file Visualizer.cpp.

    @@ -218,7 +229,7 @@

    void Shader::enableTextureMaps ( - ) + ) const @@ -226,7 +237,7 @@

    Definition at line 4160 of file Visualizer.cpp.

    +

    Definition at line 4171 of file Visualizer.cpp.

    @@ -239,7 +250,7 @@

    void Shader::enableTextureMasks ( - ) + ) const @@ -247,7 +258,7 @@

    Definition at line 4280 of file Visualizer.cpp.

    +

    Definition at line 4291 of file Visualizer.cpp.

    @@ -260,19 +271,12 @@

    void Shader::initialize ( - const char *  - vertex_shader_file, + const char * vertex_shader_file, - const char *  - fragment_shader_file  - - - - ) - + const char * fragment_shader_file )

    @@ -299,8 +303,7 @@

    void Shader::setDepthBiasMatrix ( - const glm::mat4 &  - matrix) + const glm::mat4 & matrix) const @@ -308,7 +311,7 @@

    Definition at line 4299 of file Visualizer.cpp.

    +

    Definition at line 4310 of file Visualizer.cpp.

    @@ -321,8 +324,7 @@

    void Shader::setLightDirection ( - const helios::vec3 &  - direction) + const helios::vec3 & direction) const @@ -330,7 +332,7 @@

    Definition at line 4303 of file Visualizer.cpp.

    +

    Definition at line 4314 of file Visualizer.cpp.

    @@ -343,8 +345,7 @@

    void Shader::setLightingModel ( - uint  - lightingmodel) + uint lightingmodel) const @@ -352,7 +353,7 @@

    Definition at line 4307 of file Visualizer.cpp.

    +

    Definition at line 4318 of file Visualizer.cpp.

    @@ -365,8 +366,7 @@

    void Shader::setLightIntensity ( - float  - lightintensity) + float lightintensity) const @@ -374,7 +374,7 @@

    Definition at line 4311 of file Visualizer.cpp.

    +

    Definition at line 4322 of file Visualizer.cpp.

    @@ -387,25 +387,17 @@

    void Shader::setTextureMap ( - const char *  - texture_file, + const char * texture_file, - uint &  - textureID, + uint & textureID, - helios::int2 &  - texture_size  - - - - ) - + helios::int2 & texture_size )

    @@ -420,7 +412,7 @@

    Definition at line 4081 of file Visualizer.cpp.

    +

    Definition at line 4092 of file Visualizer.cpp.

    @@ -433,25 +425,17 @@

    void Shader::setTextureMask ( - const char *  - texture_file, + const char * texture_file, - uint &  - textureID, + uint & textureID, - helios::int2 &  - texture_size  - - - - ) - + helios::int2 & texture_size )

    @@ -466,7 +450,7 @@

    Definition at line 4220 of file Visualizer.cpp.

    +

    Definition at line 4231 of file Visualizer.cpp.

    @@ -479,19 +463,12 @@

    void Shader::setTextureMask ( - const Glyph *  - glyph, + const Glyph * glyph, - uint &  - textureID  - - - - ) - + uint & textureID )

    @@ -505,7 +482,7 @@

    Definition at line 4176 of file Visualizer.cpp.

    +

    Definition at line 4187 of file Visualizer.cpp.

    @@ -518,8 +495,7 @@

    void Shader::setTransformationMatrix ( - const glm::mat4 &  - matrix) + const glm::mat4 & matrix) const @@ -527,7 +503,7 @@

    Definition at line 4295 of file Visualizer.cpp.

    +

    Definition at line 4306 of file Visualizer.cpp.

    @@ -540,7 +516,7 @@

    void Shader::useShader ( - ) + ) const @@ -548,7 +524,7 @@

    Definition at line 4315 of file Visualizer.cpp.

    +

    Definition at line 4326 of file Visualizer.cpp.

    @@ -565,7 +541,7 @@

    -

    Definition at line 147 of file Visualizer.h.

    +

    Definition at line 157 of file Visualizer.h.

    @@ -581,7 +557,7 @@

    -

    Definition at line 148 of file Visualizer.h.

    +

    Definition at line 158 of file Visualizer.h.

    @@ -597,7 +573,7 @@

    -

    Definition at line 149 of file Visualizer.h.

    +

    Definition at line 159 of file Visualizer.h.

    @@ -613,7 +589,7 @@

    -

    Definition at line 151 of file Visualizer.h.

    +

    Definition at line 161 of file Visualizer.h.

    @@ -629,7 +605,7 @@

    -

    Definition at line 150 of file Visualizer.h.

    +

    Definition at line 160 of file Visualizer.h.

    @@ -645,7 +621,7 @@

    -

    Definition at line 143 of file Visualizer.h.

    +

    Definition at line 153 of file Visualizer.h.

    @@ -661,7 +637,7 @@

    -

    Definition at line 145 of file Visualizer.h.

    +

    Definition at line 155 of file Visualizer.h.

    @@ -677,7 +653,7 @@

    -

    Definition at line 144 of file Visualizer.h.

    +

    Definition at line 154 of file Visualizer.h.

    @@ -693,7 +669,7 @@

    -

    Definition at line 146 of file Visualizer.h.

    +

    Definition at line 156 of file Visualizer.h.

    @@ -709,7 +685,7 @@

    -

    Definition at line 152 of file Visualizer.h.

    +

    Definition at line 162 of file Visualizer.h.

    @@ -720,7 +696,8 @@

    +

    diff --git a/doc/html/struct_shoot.html b/doc/html/struct_shoot.html index a7610b8b2..df8ed3cdc 100644 --- a/doc/html/struct_shoot.html +++ b/doc/html/struct_shoot.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,111 +106,111 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

     Shoot (uint plant_ID, int shoot_ID, int parent_shoot_ID, uint parent_node, uint parent_petiole_index, uint rank, const helios::vec3 &shoot_base_position, const AxisRotation &shoot_base_rotation, uint current_node_number, float internode_length_shoot_initial, ShootParameters &shoot_params, std::string shoot_type_label, PlantArchitecture *plant_architecture_ptr)
     Shoot (uint plant_ID, int shoot_ID, int parent_shoot_ID, uint parent_node, uint parent_petiole_index, uint rank, const helios::vec3 &shoot_base_position, const AxisRotation &shoot_base_rotation, uint current_node_number, float internode_length_shoot_initial, ShootParameters &shoot_params, std::string shoot_type_label, PlantArchitecture *plant_architecture_ptr)
     
    void buildShootPhytomers (float internode_radius, float internode_length, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper)
    void buildShootPhytomers (float internode_radius, float internode_length, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, float radius_taper)
     
    int appendPhytomer (float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, const PhytomerParameters &phytomer_parameters)
    int appendPhytomer (float internode_radius, float internode_length_max, float internode_length_scale_factor_fraction, float leaf_scale_factor_fraction, const PhytomerParameters &phytomer_parameters)
     Append a phytomer at the shoot apex.
     
    std::string sampleChildShootType () const
    std::string sampleChildShootType () const
     Randomly sample the type of a child shoot based on the probabilities defined in the shoot parameters.
     
    bool sampleVegetativeBudBreak (uint node_index) const
    bool sampleVegetativeBudBreak (uint node_index) const
     Randomly sample whether a vegetative bud should break into a new shoot.
     
    uint sampleEpicormicShoot (float dt, std::vector< float > &epicormic_positions_fraction)
    uint sampleEpicormicShoot (float dt, std::vector< float > &epicormic_positions_fraction)
     Randomly sample whether the shoot should produce an epicormic shoot (water sprout) over timestep.
     
    void terminateApicalBud ()
    void terminateApicalBud ()
     
    void terminateAxillaryVegetativeBuds ()
    void terminateAxillaryVegetativeBuds ()
     
    void addTerminalFloralBud ()
    void addTerminalFloralBud ()
     
    float calculateShootInternodeVolume () const
    float calculateShootInternodeVolume () const
     
    float calculateShootLength () const
    float calculateShootLength () const
     
    void updateShootNodes (bool update_context_geometry=true)
    void updateShootNodes (bool update_context_geometry=true)
     Recalculate and apply the shoot's origin position and shift all downstream shoots.
     
    helios::vec3 getShootAxisVector (float shoot_fraction) const
    helios::vec3 getShootAxisVector (float shoot_fraction) const
     
    float sumShootLeafArea (uint start_node_index=0) const
    float sumShootLeafArea (uint start_node_index=0) const
     
    void propagateDownstreamLeafArea (Shoot *shoot, uint node_index, float leaf_area)
    void propagateDownstreamLeafArea (Shoot *shoot, uint node_index, float leaf_area)
     
    void breakDormancy ()
    void breakDormancy ()
     
    void makeDormant ()
    void makeDormant ()
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    uint current_node_number = 0
    uint current_node_number = 0
     
    uint nodes_this_season = 0
    uint nodes_this_season = 0
     
    helios::vec3 base_position
    helios::vec3 base_position
     
    AxisRotation base_rotation
    AxisRotation base_rotation
     
    helios::vec3 radial_outward_axis
    helios::vec3 radial_outward_axis
     
    const int ID
    const int ID
     
    const int parent_shoot_ID
    const int parent_shoot_ID
     
    const uint plantID
    const uint plantID
     
    const uint parent_node_index
    const uint parent_node_index
     
    const uint rank
    const uint rank
     
    const uint parent_petiole_index
    const uint parent_petiole_index
     
    float carbohydrate_pool_molC = 0.01
    float carbohydrate_pool_molC = 0.01
     
    float old_shoot_volume = 0
    float old_shoot_volume = 0
     
    uint days_with_negative_carbon_balance = 0
    uint days_with_negative_carbon_balance = 0
     
    bool isdormant
    bool isdormant
     
    uint dormancy_cycles = 0
    uint dormancy_cycles = 0
     
    bool meristem_is_alive = true
    bool meristem_is_alive = true
     
    float phyllochron_counter = 0
    float phyllochron_counter = 0
     
    float curvature_perturbation = 0
    float curvature_perturbation = 0
     
    float yaw_perturbation = 0
    float yaw_perturbation = 0
     
    float gravitropic_curvature = 0
    float gravitropic_curvature = 0
     
    const float internode_length_max_shoot_initial
    const float internode_length_max_shoot_initial
     
    uint internode_tube_objID = 4294967294
    uint internode_tube_objID = 4294967294
     
    std::vector< std::vector< helios::vec3 > > shoot_internode_vertices
    std::vector< std::vector< helios::vec3 > > shoot_internode_vertices
     
    std::vector< std::vector< float > > shoot_internode_radii
    std::vector< std::vector< float > > shoot_internode_radii
     
    bool build_context_geometry_internode = true
    bool build_context_geometry_internode = true
     
    std::map< int, std::vector< int > > childIDs
    std::map< int, std::vector< int > > childIDs
     
    ShootParameters shoot_parameters
    ShootParameters shoot_parameters
     
    std::string shoot_type_label
    std::string shoot_type_label
     
    std::vector< std::shared_ptr< Phytomer > > phytomers
    std::vector< std::shared_ptr< Phytomer > > phytomers
     
    PlantArchitectureplantarchitecture_ptr
    PlantArchitectureplantarchitecture_ptr
     
    helios::Contextcontext_ptr
    helios::Contextcontext_ptr
     

    Detailed Description

    @@ -214,85 +226,67 @@

    Shoot::Shoot ( - uint  - plant_ID, + uint plant_ID, - int  - shoot_ID, + int shoot_ID, - int  - parent_shoot_ID, + int parent_shoot_ID, - uint  - parent_node, + uint parent_node, - uint  - parent_petiole_index, + uint parent_petiole_index, - uint  - rank, + uint rank, - const helios::vec3 &  - shoot_base_position, + const helios::vec3 & shoot_base_position, - const AxisRotation &  - shoot_base_rotation, + const AxisRotation & shoot_base_rotation, - uint  - current_node_number, + uint current_node_number, - float  - internode_length_shoot_initial, + float internode_length_shoot_initial, - ShootParameters &  - shoot_params, + ShootParameters & shoot_params, - std::string  - shoot_type_label, + std::string shoot_type_label, - PlantArchitecture *  - plant_architecture_ptr  - - - - ) - + PlantArchitecture * plant_architecture_ptr )

    @@ -457,7 +431,7 @@

    float Shoot::calculateShootInternodeVolume ( - ) + ) const @@ -476,7 +450,7 @@

    float Shoot::calculateShootLength ( - ) + ) const @@ -495,8 +469,7 @@

    helios::vec3 Shoot::getShootAxisVector ( - float  - shoot_fraction) + float shoot_fraction) const @@ -515,7 +488,7 @@

    void Shoot::makeDormant ( - ) + ) @@ -534,25 +507,17 @@

    void Shoot::propagateDownstreamLeafArea ( - Shoot *  - shoot, + Shoot * shoot, - uint  - node_index, + uint node_index, - float  - leaf_area  - - - - ) - + float leaf_area )

    diff --git a/doc/html/struct_shoot_parameters.html b/doc/html/struct_shoot_parameters.html index bc5240c90..b0bf6b815 100644 --- a/doc/html/struct_shoot_parameters.html +++ b/doc/html/struct_shoot_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -95,73 +107,73 @@ - + - + - + - +

    Public Member Functions

     ShootParameters ()
     ShootParameters ()
     Default constructor - does not set random number generator.
     
     ShootParameters (std::minstd_rand0 *generator)
     ShootParameters (std::minstd_rand0 *generator)
     Constructor - sets random number generator.
     
    void defineChildShootTypes (const std::vector< std::string > &child_shoot_type_labels, const std::vector< float > &child_shoot_type_probabilities)
    void defineChildShootTypes (const std::vector< std::string > &child_shoot_type_labels, const std::vector< float > &child_shoot_type_probabilities)
     
    ShootParametersoperator= (const ShootParameters &a)
    ShootParametersoperator= (const ShootParameters &a)
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    PhytomerParameters phytomer_parameters
    PhytomerParameters phytomer_parameters
     
    RandomParameter_int max_nodes
    RandomParameter_int max_nodes
     
    RandomParameter_int max_nodes_per_season
    RandomParameter_int max_nodes_per_season
     
    RandomParameter_float girth_area_factor
    RandomParameter_float girth_area_factor
     
    RandomParameter_float insertion_angle_tip
    RandomParameter_float insertion_angle_tip
     
    RandomParameter_float insertion_angle_decay_rate
    RandomParameter_float insertion_angle_decay_rate
     
    RandomParameter_float internode_length_max
    RandomParameter_float internode_length_max
     
    RandomParameter_float internode_length_min
    RandomParameter_float internode_length_min
     
    RandomParameter_float internode_length_decay_rate
    RandomParameter_float internode_length_decay_rate
     
    RandomParameter_float base_roll
    RandomParameter_float base_roll
     
    RandomParameter_float base_yaw
    RandomParameter_float base_yaw
     
    RandomParameter_float gravitropic_curvature
    RandomParameter_float gravitropic_curvature
     
    RandomParameter_float tortuosity
    RandomParameter_float tortuosity
     
    RandomParameter_float phyllochron_min
    RandomParameter_float phyllochron_min
     
    RandomParameter_float elongation_rate
    RandomParameter_float elongation_rate
     
    RandomParameter_float vegetative_bud_break_probability_min
    RandomParameter_float vegetative_bud_break_probability_min
     
    RandomParameter_float vegetative_bud_break_probability_decay_rate
    RandomParameter_float vegetative_bud_break_probability_decay_rate
     
    RandomParameter_int max_terminal_floral_buds
    RandomParameter_int max_terminal_floral_buds
     
    RandomParameter_float flower_bud_break_probability
    RandomParameter_float flower_bud_break_probability
     
    RandomParameter_float fruit_set_probability
    RandomParameter_float fruit_set_probability
     
    RandomParameter_float vegetative_bud_break_time
    RandomParameter_float vegetative_bud_break_time
     
    bool flowers_require_dormancy
    bool flowers_require_dormancy
     
    bool growth_requires_dormancy
    bool growth_requires_dormancy
     
    bool determinate_shoot_growth
    bool determinate_shoot_growth
     
    - + - +

    Friends

    class PlantArchitecture
    class PlantArchitecture
     
    struct Shoot
    struct Shoot
     

    Detailed Description

    @@ -177,7 +189,7 @@

    ShootParameters::ShootParameters ( - ) + ) @@ -201,8 +213,7 @@

    ShootParameters::ShootParameters ( - std::minstd_rand0 *  - generator) + std::minstd_rand0 * generator) @@ -229,19 +240,12 @@

    void ShootParameters::defineChildShootTypes ( - const std::vector< std::string > &  - child_shoot_type_labels, + const std::vector< std::string > & child_shoot_type_labels, - const std::vector< float > &  - child_shoot_type_probabilities  - - - - ) - + const std::vector< float > & child_shoot_type_probabilities )

    @@ -262,8 +266,7 @@

    ShootParameters & ShootParameters::operator= ( - const ShootParameters &  - a) + const ShootParameters & a) @@ -278,7 +281,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ PlantArchitecture

    @@ -720,7 +723,8 @@

    +

    diff --git a/doc/html/struct_shx.html b/doc/html/struct_shx.html index 117752e16..7de360608 100644 --- a/doc/html/struct_shx.html +++ b/doc/html/struct_shx.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,30 +106,30 @@ - + - + - + - +

    Public Member Functions

     Shx (float a, float b)
     Shx (float a, float b)
     
     Shx (float a, float b, float x)
     Shx (float a, float b, float x)
     
     Shx (const Shx &p)
     Shx (const Shx &p)
     
    Shxoperator= (const Shx &p)
    Shxoperator= (const Shx &p)
     
    - + - + - + - + - + - + - +

    Data Fields

    int id
    int id
     
    int trid
    int trid
     
    float r
    float r
     
    float c
    float c
     
    float tr
    float tr
     
    float tc
    float tc
     
    float ro
    float ro
     

    Detailed Description

    @@ -136,7 +148,7 @@

    Shx::Shx ( - ) + ) @@ -163,19 +175,12 @@

    Shx::Shx ( - float  - a, + float a, - float  - b  - - - - ) - + float b ) @@ -201,25 +206,17 @@

    Shx::Shx ( - float  - a, + float a, - float  - b, + float b, - float  - x  - - - - ) - + float x ) @@ -245,8 +242,7 @@

    Shx::Shx ( - const Shx &  - p) + const Shx & p) @@ -274,8 +270,7 @@

    Shx & Shx::operator= ( - const Shx &  - p) + const Shx & p) @@ -409,7 +404,8 @@

    +

    diff --git a/doc/html/struct_sorghum_canopy_parameters.html b/doc/html/struct_sorghum_canopy_parameters.html index 9e2e02eff..248168a52 100644 --- a/doc/html/struct_sorghum_canopy_parameters.html +++ b/doc/html/struct_sorghum_canopy_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining Sorghum plant canopy. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,226 +120,220 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     SorghumCanopyParameters ()
     SorghumCanopyParameters ()
     Default constructor.
     
     SorghumCanopyParameters (const pugi::xml_node canopy_node)
     SorghumCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    int sorghum_stage
    int sorghum_stage
     Sorghum categorized into 5 stages; 1 - Three leaf stage, 2 - Five leaf stage, 3 - Panicle initiation and flag leaf emergency, 4 - Booting, and flowering, 5 - Maturity; Input of a value other than 1-5 will output stage 5.
     
    float s1_stem_length
    float s1_stem_length
     Length of the sorghum stem for stage 1.
     
    float s1_stem_radius
    float s1_stem_radius
     Radius of the sorghum stem for stage 1.
     
    float s1_stem_subdivisions
    float s1_stem_subdivisions
     Number of stem radial subdivisions for stage 1.
     
    helios::vec2 s1_leaf_size1
    helios::vec2 s1_leaf_size1
     Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
     
    helios::vec2 s1_leaf_size2
    helios::vec2 s1_leaf_size2
     Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
     
    helios::vec2 s1_leaf_size3
    helios::vec2 s1_leaf_size3
     Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 1.
     
    float s1_leaf1_angle
    float s1_leaf1_angle
     Leaf1 vertical angle of rotation for stage 1.
     
    float s1_leaf2_angle
    float s1_leaf2_angle
     Leaf2 vertical angle of rotation for stage 1.
     
    float s1_leaf3_angle
    float s1_leaf3_angle
     Leaf3 vertical angle of rotation for stage 1.
     
    helios::int2 s1_leaf_subdivisions
    helios::int2 s1_leaf_subdivisions
     Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 1.
     
    std::string s1_leaf_texture_file
    std::string s1_leaf_texture_file
     Texture map for sorghum leaf1 for stage 1.
     
    float s2_stem_length
    float s2_stem_length
     Length of the sorghum stem for stage 2.
     
    float s2_stem_radius
    float s2_stem_radius
     Radius of the sorghum stem for stage 2.
     
    float s2_stem_subdivisions
    float s2_stem_subdivisions
     Number of stem radial subdivisions for stage 2.
     
    helios::vec2 s2_leaf_size1
    helios::vec2 s2_leaf_size1
     Length of leaf1 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
     
    helios::vec2 s2_leaf_size2
    helios::vec2 s2_leaf_size2
     Length of leaf2 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
     
    helios::vec2 s2_leaf_size3
    helios::vec2 s2_leaf_size3
     Length of leaf3 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
     
    helios::vec2 s2_leaf_size4
    helios::vec2 s2_leaf_size4
     Length of leaf4 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
     
    helios::vec2 s2_leaf_size5
    helios::vec2 s2_leaf_size5
     Length of leaf5 in x- (length) and y- (width) directions (prior to rotation) for stage 2.
     
    float s2_leaf1_angle
    float s2_leaf1_angle
     Leaf1 vertical angle of rotation for stage 2.
     
    float s2_leaf2_angle
    float s2_leaf2_angle
     Leaf2 vertical angle of rotation for stage 2.
     
    float s2_leaf3_angle
    float s2_leaf3_angle
     Leaf3 vertical angle of rotation for stage 2.
     
    float s2_leaf4_angle
    float s2_leaf4_angle
     Leaf4 vertical angle of rotation for stage 2.
     
    float s2_leaf5_angle
    float s2_leaf5_angle
     Leaf5 vertical angle of rotation for stage 2.
     
    helios::int2 s2_leaf_subdivisions
    helios::int2 s2_leaf_subdivisions
     Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 2.
     
    std::string s2_leaf_texture_file
    std::string s2_leaf_texture_file
     Texture map for sorghum leaf for stage 2.
     
    float s3_stem_length
    float s3_stem_length
     Length of the sorghum stem for stage 3.
     
    float s3_stem_radius
    float s3_stem_radius
     Radius of the sorghum stem for stage 3.
     
    float s3_stem_subdivisions
    float s3_stem_subdivisions
     Number of stem radial subdivisions for stage 3.
     
    helios::vec2 s3_leaf_size
    helios::vec2 s3_leaf_size
     Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 3.
     
    helios::int2 s3_leaf_subdivisions
    helios::int2 s3_leaf_subdivisions
     Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 3.
     
    int s3_number_of_leaves
    int s3_number_of_leaves
     Number of leaves along the stem for stage 3.
     
    float s3_mean_leaf_angle
    float s3_mean_leaf_angle
     Mean vertical angle of rotation of leaf for stage 3 in degrees; Standard deviation for the leaves is 5 degrees.
     
    std::string s3_leaf_texture_file
    std::string s3_leaf_texture_file
     Texture map for sorghum leaf for stage 3.
     
    float s4_stem_length
    float s4_stem_length
     Length of the sorghum stem for stage 4.
     
    float s4_stem_radius
    float s4_stem_radius
     Radius of the sorghum stem for stage 4.
     
    float s4_stem_subdivisions
    float s4_stem_subdivisions
     Number of stem radial subdivisions for stage 4.
     
    helios::vec2 s4_panicle_size
    helios::vec2 s4_panicle_size
     Size of panicle in x- and y- directions for stage 4.
     
    int s4_panicle_subdivisions
    int s4_panicle_subdivisions
     Number of panicle subdivisions for each grain sphere within a panicle, stage 4.
     
    std::string s4_seed_texture_file
    std::string s4_seed_texture_file
     Texture map of the panicle for stage 4.
     
    helios::vec2 s4_leaf_size
    helios::vec2 s4_leaf_size
     Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 4.
     
    helios::int2 s4_leaf_subdivisions
    helios::int2 s4_leaf_subdivisions
     Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 4.
     
    int s4_number_of_leaves
    int s4_number_of_leaves
     Number of leaves for the sorghum plant, stage 4.
     
    float s4_mean_leaf_angle
    float s4_mean_leaf_angle
     Mean vertical angle of rotation of leaf for stage 4 in degrees; Standard deviation for the angle is 5 degrees.
     
    std::string s4_leaf_texture_file
    std::string s4_leaf_texture_file
     Texture map for sorghum leaf, stage 4.
     
    float s5_stem_length
    float s5_stem_length
     Length of the sorghum stem for stage 5.
     
    float s5_stem_radius
    float s5_stem_radius
     Radius of the sorghum stem for stage 5.
     
    float s5_stem_bend
    float s5_stem_bend
     Bend of the stem from mid-section for stage 5. The distance from the mid-section of the stem to the imaginary perpendicular along the origin. i.e stem bend = 0 outputs a straight stem.
     
    int s5_stem_subdivisions
    int s5_stem_subdivisions
     Number of stem radial subdivisions for stage 5.
     
    helios::vec2 s5_panicle_size
    helios::vec2 s5_panicle_size
     Size of panicle in x- and y- directions for stage 5.
     
    int s5_panicle_subdivisions
    int s5_panicle_subdivisions
     Number of panicle subdivisions for each grain sphere within a panicle, stage 5.
     
    std::string s5_seed_texture_file
    std::string s5_seed_texture_file
     Texture map of the panicle for stage 5.
     
    helios::vec2 s5_leaf_size
    helios::vec2 s5_leaf_size
     Length of leaf in x- (length) and y- (width) directions (prior to rotation) for stage 5.
     
    helios::int2 s5_leaf_subdivisions
    helios::int2 s5_leaf_subdivisions
     Number of sub-division segments of leaf in the x- (length) and y- (width) direction for stage 5.
     
    int s5_number_of_leaves
    int s5_number_of_leaves
     Number of leaves for the sorghum plant, stage 5.
     
    float s5_mean_leaf_angle
    float s5_mean_leaf_angle
     Mean vertical angle of rotation of leaf for stage 5 in degrees; Standard deviation for the angle is 10 degrees.
     
    std::string s5_leaf_texture_file
    std::string s5_leaf_texture_file
     Texture map for sorghum leaf, stage 5.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -345,7 +351,7 @@

    SorghumCanopyParameters::SorghumCanopyParameters ( - ) + ) @@ -366,8 +372,7 @@

    SorghumCanopyParameters::SorghumCanopyParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -396,8 +401,7 @@

    void SorghumCanopyParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -428,19 +432,12 @@

    void SorghumCanopyParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -467,8 +464,7 @@

    void SorghumCanopyParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -1592,7 +1588,8 @@

    +

    diff --git a/doc/html/struct_sorghum_canopy_parameters.png b/doc/html/struct_sorghum_canopy_parameters.png index 9df781c67952f1d49ad93047c2e4278e88aefb69..295e6f9816b5c17a2276d711d9edcf8f2e424126 100644 GIT binary patch delta 21 dcmeBT>tdT=$MxXBga7~ko1P6@veDxZ699HD3r_$5 delta 21 dcmeBT>tdT=$93Sqf&c&i2T!`ZVxz|)CIEAz3sV39 diff --git a/doc/html/struct_spherical_crowns_canopy_parameters.html b/doc/html/struct_spherical_crowns_canopy_parameters.html index 322fd8825..399b05b8f 100644 --- a/doc/html/struct_spherical_crowns_canopy_parameters.html +++ b/doc/html/struct_spherical_crowns_canopy_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining the canopy with spherical crowns. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,75 +120,69 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     SphericalCrownsCanopyParameters ()
     SphericalCrownsCanopyParameters ()
     Default constructor.
     
     SphericalCrownsCanopyParameters (const pugi::xml_node canopy_node)
     SphericalCrownsCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    helios::vec2 leaf_size
    helios::vec2 leaf_size
     Length of leaf in x- and y- directions (prior to rotation)
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves. If left empty, no texture will be used.
     
    helios::RGBcolor leaf_color
    helios::RGBcolor leaf_color
     Leaf color if no texture map file is provided.
     
    std::string leaf_angle_distribution
    std::string leaf_angle_distribution
     Leaf angle distribution - one of "spherical", "uniform", "erectophile", "planophile", "plagiophile", "extremophile".
     
    float leaf_area_density
    float leaf_area_density
     One-sided leaf area density within spherical crowns.
     
    helios::vec3 crown_radius
    helios::vec3 crown_radius
     Radius of the spherical crowns.
     
    std::string canopy_configuration
    std::string canopy_configuration
     Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arranged canopy with non-overlapping crowns (canopy_configuration="random").
     
    helios::vec2 plant_spacing
    helios::vec2 plant_spacing
     Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random' this is the average spacing.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    std::vector< float > leaf_angle_PDF
    std::vector< float > leaf_angle_PDF
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -194,7 +200,7 @@

    SphericalCrownsCanopyParameters::SphericalCrownsCanopyParameters ( - ) + ) @@ -215,8 +221,7 @@

    SphericalCrownsCanopyParameters::SphericalCrownsCanopyParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -245,8 +250,7 @@

    void SphericalCrownsCanopyParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -277,19 +281,12 @@

    void SphericalCrownsCanopyParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -316,8 +313,7 @@

    void SphericalCrownsCanopyParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -539,7 +535,8 @@

    +

    diff --git a/doc/html/struct_spherical_crowns_canopy_parameters.png b/doc/html/struct_spherical_crowns_canopy_parameters.png index ffa7153495cb659b40ae5ec31acafbcc66485bb0..65a3ea3bf3fed89559cf17d2c4c5aa1c730656ed 100644 GIT binary patch delta 21 dcmdnTwvTOs9oK^g5B~rEZ+bRt$wrTFOaOki3+n&? delta 21 dcmdnTwvTOs9oK;a2mb&6A3W*uij5xMm;ih$3-15` diff --git a/doc/html/struct_split_grapevine_parameters.html b/doc/html/struct_split_grapevine_parameters.html index 9edf1e234..672d1376d 100644 --- a/doc/html/struct_split_grapevine_parameters.html +++ b/doc/html/struct_split_grapevine_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining the grapevine canopy with a split (quad) trellis. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -109,205 +121,193 @@ - + - + - + - + - + - - + + - + - + - - - - - - - - + + - + - + - - - - - -

    Public Member Functions

     SplitGrapevineParameters ()
     SplitGrapevineParameters ()
     Default constructor.
     
     SplitGrapevineParameters (const pugi::xml_node canopy_node)
     SplitGrapevineParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseGrapeVineParameters
     BaseGrapeVineParameters ()
    - Public Member Functions inherited from BaseGrapeVineParameters
     BaseGrapeVineParameters ()
     Default constructor.
     
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    float cordon_spacing
    float cordon_spacing
     Spacing between two opposite cordons.
     
    float cordon_spacing_spread
    float cordon_spacing_spread
     Spread value for the cordon spacing. With any new canopy or plant generation, the cordon spacing would be between cordon_spacing - cordon_spacing_spread and cordon_spacing + cordon_spacing_spread.
     
    float shoot_angle_base
    float shoot_angle_base
     Average angle of the shoot at the base (shoot_angle_base=0 points shoots upward; shoot_angle_base=M_PI points shoots downward and makes a Geneva Double Curtain)
     
    float shoot_angle_base_spread
    float shoot_angle_base_spread
     Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle would be between shoot_angle_base - shoot_angle_base_spread and shoot_angle_base + shoot_angle_base_spread.
     
    float shoot_angle_tip
    float shoot_angle_tip
     Average angle of the shoot at the tip (shoot_angle=0 is a completely vertical shoot; shoot_angle=M_PI is a downward-pointing shoot)
     
    float shoot_angle_tip_spread
    float shoot_angle_tip_spread
     Spread value for the base shoot angle. With any new canopy or plant generation, the base shoot angle would be between shoot_angle_tip - shoot_angle_tip_spread and shoot_angle_tip + shoot_angle_tip_spread.
     
    - Data Fields inherited from BaseGrapeVineParameters
    float leaf_width
    - Data Fields inherited from BaseGrapeVineParameters
    float leaf_width
     Maximum width of leaves. Leaf width increases logarithmically from the shoot tip, so leaf_width is the width at the base of the shoot.
     
    float leaf_width_spread
    float leaf_width_spread
     Spread value for the maximum leaf width. With any new canopy or plant generation, the maximum leaf width would be between leaf_width - leaf_width_spread and leaf_width + leaf_width_spread.
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves.
     
    std::string wood_texture_file
    std::string wood_texture_file
     Path to texture map file for trunks/branches.
     
    int wood_subdivisions
    int wood_subdivisions
     Number of radial subdivisions for trunk/cordon/shoot tubes.
     
    int wood_subdivisions_spread
    int wood_subdivisions_spread
     Spread value for the number of wood subdivisions. With any new canopy or plant generation, the maximum number of wood subdivisions would be between wood_subdivisions - wood_subdivisions_spread and wood_subdivisions + wood_subdivisions_spread.
     
    float dead_probability
    float dead_probability
     Probability for a plant to be dead, i.e. without any leaves or grapes.
     
    float missing_plant_probability
    float missing_plant_probability
     Probability for a plant to be missing.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float plant_spacing_spread
    float plant_spacing_spread
     Spread value for the plant spacing. The spacing between adjacent plants along a row would vary between plant_spacing - plant_spacing_spread and plant_spacing + plant_spacing_spread.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    float row_spacing_spread
    float row_spacing_spread
     Spread value for the row spacing. This allows to vary the alignment of plants along a row. The spacing between two plants of adjacent rows would be between row_spacing - row_spacing_spread and row_spacing + row_spacing_spread.
     
    float trunk_height
    float trunk_height
     Distance between the ground and top of trunks.
     
    float trunk_height_spread
    float trunk_height_spread
     Spread value for the trunk height. With any new canopy or plant generation, the trunk height would be between trunk_height - trunk_height_spread and trunk_height + trunk_height_spread.
     
    float trunk_radius
    float trunk_radius
     Radius of the trunk at the widest point.
     
    float trunk_radius_spread
    float trunk_radius_spread
     Spread value for the trunk radius. With any new canopy or plant generation, the trunk radius would be between trunk_radius - trunk_radius_spread and trunk_radius + trunk_radius_spread.
     
    float cordon_length
    float cordon_length
     Length of the cordons. By default, half the plant spacing.
     
    float cordon_length_spread
    float cordon_length_spread
     Spread value for the cordon length. With any new canopy or plant generation, the cordon length would be between cordon_length - cordon_length_spread and cordon_length + cordon_length_spread.
     
    float cordon_height
    float cordon_height
     Distance between the ground and cordon. Note - must be greater than or equal to the trunk height.
     
    float cordon_height_spread
    float cordon_height_spread
     Spread value for the cordon height. With any new canopy or plant generation, the cordon height would be between cordon_height - cordon_height_spread and cordon_height + cordon_height_spread.
     
    float cordon_radius
    float cordon_radius
     Radius of cordon branches.
     
    float cordon_radius_spread
    float cordon_radius_spread
     Spread value for the cordon radius. With any new canopy or plant generation, the cordon radius would be between cordon_radius - cordon_radius_spread and cordon_radius + cordon_radius_spread.
     
    float shoot_length
    float shoot_length
     Length of shoots.
     
    float shoot_length_spread
    float shoot_length_spread
     Spread value for the shoot length. With any new canopy or plant generation, the shoot length would be between shoot_length - shoot_length_spread and shoot_length + shoot_length_spread.
     
    float shoot_radius
    float shoot_radius
     Radius of shoot branches.
     
    float shoot_radius_spread
    float shoot_radius_spread
     Spread value for the shoot radius. With any new canopy or plant generation, the shoot radius would be between shoot_radius - shoot_radius_spread and shoot_radius + shoot_radius_spread.
     
    uint shoots_per_cordon
    uint shoots_per_cordon
     Number of shoots on each cordon.
     
    uint shoots_per_cordon_spread
    uint shoots_per_cordon_spread
     Spread value for the number of shoots per cordon. With any new canopy or plant generation, the number of shoots per cordon would be between shoots_per_cordon - shoots_per_cordon_spread and shoots_per_cordon + shoots_per_cordon_spread.
     
    float leaf_spacing_fraction
    float leaf_spacing_fraction
     Spacing between adjacent leaves as a fraction of the local leaf width. E.g., leaf_spacing_fraction = 1 would give a leaf spacing equal to the leaf width.
     
    float leaf_spacing_fraction_spread
    float leaf_spacing_fraction_spread
     Spread value for the leaf spacing fraction. With any new canopy or plant generation, the leaf spacing fraction would be between leaf_spacing_fraction - leaf_spacing_fraction_spread and leaf_spacing_fraction + leaf_spacing_fraction_spread.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    float grape_radius
    float grape_radius
     Radius of grape berries.
     
    float grape_radius_spread
    float grape_radius_spread
     Spread value for the grape radius. With any new canopy or plant generation, the grape radius would be between grape_radius - grape_radius_spread and grape_radius + grape_radius_spread.
     
    float cluster_radius
    float cluster_radius
     Maximum horizontal radius of grape clusters.
     
    float cluster_radius_spread
    float cluster_radius_spread
     Spread value for the cluster radius. With any new canopy or plant generation, the cluster radius would be between cluster_radius - cluster_radius_spread and cluster_radius + cluster_radius_spread.
     
    float cluster_height_max
    float cluster_height_max
     Maximum height of grape clusters along the shoot as a fraction of the total shoot length.
     
    float cluster_height_max_spread
    float cluster_height_max_spread
     Spread value for the cluster height. With any new canopy or plant generation, the cluster height would be between cluster_height - cluster_height_spread and cluster_height + cluster_height_spread.
     
    helios::RGBcolor grape_color
    helios::RGBcolor grape_color
     Color of grapes.
     
    uint grape_subdivisions
    uint grape_subdivisions
     Number of azimuthal and zenithal subdivisions making up berries (will result in roughly 2*(grape_subdivisions)^2 triangles per grape berry)
     
    uint grape_subdivisions_spread
    uint grape_subdivisions_spread
     Spread value for the number of grape subdivisions. With any new canopy or plant generation, the number of grape subdivisions would be between grape_subdivisions - grape_subdivisions_spread and grape_subdivisions + grape_subdivisions_spread.
     
    std::vector< float > leaf_angle_PDF
    std::vector< float > leaf_angle_PDF
     
    float canopy_rotation_spread
    float canopy_rotation_spread
     Spread value for the canopy rotation. With any new canopy or plant generation, the canopy/plant rotation would be between canopy_rotation - canopy_rotation_spread and canopy_rotation + canopy_rotation_spread.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -325,7 +325,7 @@

    SplitGrapevineParameters::SplitGrapevineParameters ( - ) + ) @@ -346,8 +346,7 @@

    SplitGrapevineParameters::SplitGrapevineParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -376,8 +375,7 @@

    void SplitGrapevineParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -408,19 +406,12 @@

    void SplitGrapevineParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -447,8 +438,7 @@

    void SplitGrapevineParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -582,7 +572,8 @@

    +

    diff --git a/doc/html/struct_split_grapevine_parameters.png b/doc/html/struct_split_grapevine_parameters.png index f4ee5ed557a3af35dd3e8c8238f54139e2e72603..7320ac96ba6e8371cd380b2018d3f2611f46f9dd 100644 GIT binary patch delta 21 dcmdnSv5jMb9oK^g5B~rEZ+bRt$wrTN%m96}3)lbv delta 21 dcmdnSv5jMb9oK;a2mb&6A3W*uij5xcm;rkz3)}zz diff --git a/doc/html/struct_strawberry_parameters.html b/doc/html/struct_strawberry_parameters.html index a1473586f..83eb3fc4c 100644 --- a/doc/html/struct_strawberry_parameters.html +++ b/doc/html/struct_strawberry_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining the strawberry plant canopy. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,88 +120,82 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     StrawberryParameters ()
     StrawberryParameters ()
     Default constructor.
     
     StrawberryParameters (const pugi::xml_node canopy_node)
     StrawberryParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    float leaf_length
    float leaf_length
     Maximum width of leaves.
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves.
     
    helios::RGBcolor stem_color
    helios::RGBcolor stem_color
     Color of stems.
     
    int stem_subdivisions
    int stem_subdivisions
     Number of radial subdivisions for stem tubes.
     
    int stems_per_plant
    int stems_per_plant
     Number of stems per plant.
     
    float stem_radius
    float stem_radius
     Radius of stems.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    float plant_height
    float plant_height
     Height of the plant.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    float fruit_radius
    float fruit_radius
     Radius of strawberry fruit.
     
    std::string fruit_texture_file
    std::string fruit_texture_file
     Texture map for strawberry fruit.
     
    uint fruit_subdivisions
    uint fruit_subdivisions
     Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisions^2 triangles per fruit)
     
    float clusters_per_stem
    float clusters_per_stem
     Number of strawberry clusters per plant stem. Clusters randomly have 1, 2, or 3 berries.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -207,7 +213,7 @@

    StrawberryParameters::StrawberryParameters ( - ) + ) @@ -228,8 +234,7 @@

    StrawberryParameters::StrawberryParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -258,8 +263,7 @@

    void StrawberryParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -290,19 +294,12 @@

    void StrawberryParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -329,8 +326,7 @@

    void StrawberryParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -626,7 +622,8 @@

    +

    diff --git a/doc/html/struct_strawberry_parameters.png b/doc/html/struct_strawberry_parameters.png index 66c5347f71af24bf5c088b39e2ddb52f0926ab63..fac0f6d55c9c9e5d191b70a724f2a18e04439e91 100644 GIT binary patch delta 21 dcmX@YdW3a?9oK^g5B~rEZ+bRt$wrSFCIEhn3wr Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining the tomato plant canopy. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,79 +120,73 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     TomatoParameters ()
     TomatoParameters ()
     Default constructor.
     
     TomatoParameters (const pugi::xml_node canopy_node)
     TomatoParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    float leaf_length
    float leaf_length
     Maximum width of leaves.
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves.
     
    helios::RGBcolor shoot_color
    helios::RGBcolor shoot_color
     Color of shoots.
     
    int shoot_subdivisions
    int shoot_subdivisions
     Number of radial subdivisions for shoot tubes.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    float plant_height
    float plant_height
     Height of the plant.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    float fruit_radius
    float fruit_radius
     Radius of tomato fruit.
     
    helios::RGBcolor fruit_color
    helios::RGBcolor fruit_color
     Color of tomato fruit.
     
    uint fruit_subdivisions
    uint fruit_subdivisions
     Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisions^2 triangles per fruit)
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -198,7 +204,7 @@

    TomatoParameters::TomatoParameters ( - ) + ) @@ -219,8 +225,7 @@

    TomatoParameters::TomatoParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -249,8 +254,7 @@

    void TomatoParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -281,19 +285,12 @@

    void TomatoParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -320,8 +317,7 @@

    void TomatoParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -563,7 +559,8 @@

    +

    diff --git a/doc/html/struct_tomato_parameters.png b/doc/html/struct_tomato_parameters.png index 290d9fccdf937d96030c8e98bd5ec97e71050d1b..633a1884afc4bbe76c01b3d2839672ae51090536 100644 GIT binary patch delta 21 dcmeBY?Pr}}$MxXBga7~ko1P6@veCnx2>^B43fuqy delta 21 dcmeBY?Pr}}$93Sqf&c&i2T!`ZVxxyU6998h3g7?$ diff --git a/doc/html/struct_triad.html b/doc/html/struct_triad.html index e5f6f6d38..8b2a70630 100644 --- a/doc/html/struct_triad.html +++ b/doc/html/struct_triad.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,34 +106,34 @@ - + - + - + - +

    Public Member Functions

     Triad (int x, int y)
     Triad (int x, int y)
     
     Triad (int x, int y, int z)
     Triad (int x, int y, int z)
     
     Triad (const Triad &p)
     Triad (const Triad &p)
     
    Triadoperator= (const Triad &p)
    Triadoperator= (const Triad &p)
     
    - + - + - + - + - + - + - + - + - +

    Data Fields

    int a
    int a
     
    int b
    int b
     
    int c
    int c
     
    int ab
    int ab
     
    int bc
    int bc
     
    int ac
    int ac
     
    float ro
    float ro
     
    float R
    float R
     
    float C
    float C
     

    Detailed Description

    @@ -140,7 +152,7 @@

    Triad::Triad ( - ) + ) @@ -167,19 +179,12 @@

    Triad::Triad ( - int  - x, + int x, - int  - y  - - - - ) - + int y ) @@ -205,25 +210,17 @@

    Triad::Triad ( - int  - x, + int x, - int  - y, + int y, - int  - z  - - - - ) - + int z ) @@ -249,8 +246,7 @@

    Triad::Triad ( - const Triad &  - p) + const Triad & p) @@ -278,8 +274,7 @@

    Triad & Triad::operator= ( - const Triad &  - p) + const Triad & p) @@ -375,35 +370,35 @@

    -

    ◆ c

    + +

    ◆ C

    - +
    int Triad::cfloat Triad::C
    -

    Definition at line 35 of file s_hull_pro.h.

    +

    Definition at line 37 of file s_hull_pro.h.

    - -

    ◆ C

    + +

    ◆ c

    - +
    float Triad::Cint Triad::c
    -

    Definition at line 37 of file s_hull_pro.h.

    +

    Definition at line 35 of file s_hull_pro.h.

    @@ -445,7 +440,8 @@

    +

    diff --git a/doc/html/struct_triangulation.html b/doc/html/struct_triangulation.html index d5f453f9f..f8db1d90e 100644 --- a/doc/html/struct_triangulation.html +++ b/doc/html/struct_triangulation.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -94,30 +106,30 @@ - +

    Public Member Functions

     Triangulation (int __scanID, helios::vec3 __vertex0, helios::vec3 __vertex1, helios::vec3 __vertex2, int __ID0, int __ID1, int __ID2, helios::RGBcolor __color, int __gridcell)
     Triangulation (int __scanID, helios::vec3 __vertex0, helios::vec3 __vertex1, helios::vec3 __vertex2, int __ID0, int __ID1, int __ID2, helios::RGBcolor __color, int __gridcell)
     
    - + - + - + - + - + - + - + - + - + - +

    Data Fields

    helios::vec3 vertex0
    helios::vec3 vertex0
     
    helios::vec3 vertex1
    helios::vec3 vertex1
     
    helios::vec3 vertex2
    helios::vec3 vertex2
     
    int ID0
    int ID0
     
    int ID1
    int ID1
     
    int ID2
    int ID2
     
    int scanID
    int scanID
     
    int gridcell
    int gridcell
     
    helios::RGBcolor color
    helios::RGBcolor color
     
    float area
    float area
     

    Detailed Description

    @@ -136,8 +148,7 @@

    Triangulation::Triangulation ( - void  - ) + void ) @@ -164,61 +175,47 @@

    Triangulation::Triangulation ( - int  - __scanID, + int __scanID, - helios::vec3  - __vertex0, + helios::vec3 __vertex0, - helios::vec3  - __vertex1, + helios::vec3 __vertex1, - helios::vec3  - __vertex2, + helios::vec3 __vertex2, - int  - __ID0, + int __ID0, - int  - __ID1, + int __ID1, - int  - __ID2, + int __ID2, - helios::RGBcolor  - __color, + helios::RGBcolor __color, - int  - __gridcell  - - - - ) - + int __gridcell ) @@ -399,7 +396,8 @@

    +

    diff --git a/doc/html/struct_unilateral_grapevine_parameters.html b/doc/html/struct_unilateral_grapevine_parameters.html index 8cdcf0942..8b994ff5c 100644 --- a/doc/html/struct_unilateral_grapevine_parameters.html +++ b/doc/html/struct_unilateral_grapevine_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -92,7 +104,7 @@

    Parameters defining the grapevine canopy with unilateral trellis. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,187 +120,175 @@ - + - + - + - + - + - - + + - + - + - - - - - - - - + + - + - + - - - - - -

    Public Member Functions

     UnilateralGrapevineParameters ()
     UnilateralGrapevineParameters ()
     Default constructor.
     
     UnilateralGrapevineParameters (const pugi::xml_node canopy_node)
     UnilateralGrapevineParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseGrapeVineParameters
     BaseGrapeVineParameters ()
    - Public Member Functions inherited from BaseGrapeVineParameters
     BaseGrapeVineParameters ()
     Default constructor.
     
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Additional Inherited Members

    - Data Fields inherited from BaseGrapeVineParameters
    float leaf_width
    - Data Fields inherited from BaseGrapeVineParameters
    float leaf_width
     Maximum width of leaves. Leaf width increases logarithmically from the shoot tip, so leaf_width is the width at the base of the shoot.
     
    float leaf_width_spread
    float leaf_width_spread
     Spread value for the maximum leaf width. With any new canopy or plant generation, the maximum leaf width would be between leaf_width - leaf_width_spread and leaf_width + leaf_width_spread.
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves.
     
    std::string wood_texture_file
    std::string wood_texture_file
     Path to texture map file for trunks/branches.
     
    int wood_subdivisions
    int wood_subdivisions
     Number of radial subdivisions for trunk/cordon/shoot tubes.
     
    int wood_subdivisions_spread
    int wood_subdivisions_spread
     Spread value for the number of wood subdivisions. With any new canopy or plant generation, the maximum number of wood subdivisions would be between wood_subdivisions - wood_subdivisions_spread and wood_subdivisions + wood_subdivisions_spread.
     
    float dead_probability
    float dead_probability
     Probability for a plant to be dead, i.e. without any leaves or grapes.
     
    float missing_plant_probability
    float missing_plant_probability
     Probability for a plant to be missing.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float plant_spacing_spread
    float plant_spacing_spread
     Spread value for the plant spacing. The spacing between adjacent plants along a row would vary between plant_spacing - plant_spacing_spread and plant_spacing + plant_spacing_spread.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    float row_spacing_spread
    float row_spacing_spread
     Spread value for the row spacing. This allows to vary the alignment of plants along a row. The spacing between two plants of adjacent rows would be between row_spacing - row_spacing_spread and row_spacing + row_spacing_spread.
     
    float trunk_height
    float trunk_height
     Distance between the ground and top of trunks.
     
    float trunk_height_spread
    float trunk_height_spread
     Spread value for the trunk height. With any new canopy or plant generation, the trunk height would be between trunk_height - trunk_height_spread and trunk_height + trunk_height_spread.
     
    float trunk_radius
    float trunk_radius
     Radius of the trunk at the widest point.
     
    float trunk_radius_spread
    float trunk_radius_spread
     Spread value for the trunk radius. With any new canopy or plant generation, the trunk radius would be between trunk_radius - trunk_radius_spread and trunk_radius + trunk_radius_spread.
     
    float cordon_length
    float cordon_length
     Length of the cordons. By default, half the plant spacing.
     
    float cordon_length_spread
    float cordon_length_spread
     Spread value for the cordon length. With any new canopy or plant generation, the cordon length would be between cordon_length - cordon_length_spread and cordon_length + cordon_length_spread.
     
    float cordon_height
    float cordon_height
     Distance between the ground and cordon. Note - must be greater than or equal to the trunk height.
     
    float cordon_height_spread
    float cordon_height_spread
     Spread value for the cordon height. With any new canopy or plant generation, the cordon height would be between cordon_height - cordon_height_spread and cordon_height + cordon_height_spread.
     
    float cordon_radius
    float cordon_radius
     Radius of cordon branches.
     
    float cordon_radius_spread
    float cordon_radius_spread
     Spread value for the cordon radius. With any new canopy or plant generation, the cordon radius would be between cordon_radius - cordon_radius_spread and cordon_radius + cordon_radius_spread.
     
    float shoot_length
    float shoot_length
     Length of shoots.
     
    float shoot_length_spread
    float shoot_length_spread
     Spread value for the shoot length. With any new canopy or plant generation, the shoot length would be between shoot_length - shoot_length_spread and shoot_length + shoot_length_spread.
     
    float shoot_radius
    float shoot_radius
     Radius of shoot branches.
     
    float shoot_radius_spread
    float shoot_radius_spread
     Spread value for the shoot radius. With any new canopy or plant generation, the shoot radius would be between shoot_radius - shoot_radius_spread and shoot_radius + shoot_radius_spread.
     
    uint shoots_per_cordon
    uint shoots_per_cordon
     Number of shoots on each cordon.
     
    uint shoots_per_cordon_spread
    uint shoots_per_cordon_spread
     Spread value for the number of shoots per cordon. With any new canopy or plant generation, the number of shoots per cordon would be between shoots_per_cordon - shoots_per_cordon_spread and shoots_per_cordon + shoots_per_cordon_spread.
     
    float leaf_spacing_fraction
    float leaf_spacing_fraction
     Spacing between adjacent leaves as a fraction of the local leaf width. E.g., leaf_spacing_fraction = 1 would give a leaf spacing equal to the leaf width.
     
    float leaf_spacing_fraction_spread
    float leaf_spacing_fraction_spread
     Spread value for the leaf spacing fraction. With any new canopy or plant generation, the leaf spacing fraction would be between leaf_spacing_fraction - leaf_spacing_fraction_spread and leaf_spacing_fraction + leaf_spacing_fraction_spread.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    float grape_radius
    float grape_radius
     Radius of grape berries.
     
    float grape_radius_spread
    float grape_radius_spread
     Spread value for the grape radius. With any new canopy or plant generation, the grape radius would be between grape_radius - grape_radius_spread and grape_radius + grape_radius_spread.
     
    float cluster_radius
    float cluster_radius
     Maximum horizontal radius of grape clusters.
     
    float cluster_radius_spread
    float cluster_radius_spread
     Spread value for the cluster radius. With any new canopy or plant generation, the cluster radius would be between cluster_radius - cluster_radius_spread and cluster_radius + cluster_radius_spread.
     
    float cluster_height_max
    float cluster_height_max
     Maximum height of grape clusters along the shoot as a fraction of the total shoot length.
     
    float cluster_height_max_spread
    float cluster_height_max_spread
     Spread value for the cluster height. With any new canopy or plant generation, the cluster height would be between cluster_height - cluster_height_spread and cluster_height + cluster_height_spread.
     
    helios::RGBcolor grape_color
    helios::RGBcolor grape_color
     Color of grapes.
     
    uint grape_subdivisions
    uint grape_subdivisions
     Number of azimuthal and zenithal subdivisions making up berries (will result in roughly 2*(grape_subdivisions)^2 triangles per grape berry)
     
    uint grape_subdivisions_spread
    uint grape_subdivisions_spread
     Spread value for the number of grape subdivisions. With any new canopy or plant generation, the number of grape subdivisions would be between grape_subdivisions - grape_subdivisions_spread and grape_subdivisions + grape_subdivisions_spread.
     
    std::vector< float > leaf_angle_PDF
    std::vector< float > leaf_angle_PDF
     
    float canopy_rotation_spread
    float canopy_rotation_spread
     Spread value for the canopy rotation. With any new canopy or plant generation, the canopy/plant rotation would be between canopy_rotation - canopy_rotation_spread and canopy_rotation + canopy_rotation_spread.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -306,7 +306,7 @@

    UnilateralGrapevineParameters::UnilateralGrapevineParameters ( - ) + ) @@ -327,8 +327,7 @@

    UnilateralGrapevineParameters::UnilateralGrapevineParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -357,8 +356,7 @@

    void UnilateralGrapevineParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -389,19 +387,12 @@

    void UnilateralGrapevineParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -428,8 +419,7 @@

    void UnilateralGrapevineParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -454,7 +444,8 @@

    +

    diff --git a/doc/html/struct_unilateral_grapevine_parameters.png b/doc/html/struct_unilateral_grapevine_parameters.png index 11b01f8d8af8af3b5c294cd19ad3edf4b7402d89..ae7ea8379ee322cba418e47f1c4a0849ca95b6ba 100644 GIT binary patch delta 21 dcmX@dagJkx9oK^g5B~rEZ+bRt$wm)0765;w3n2gi delta 21 dcmX@dagJkx9oK;a2mb&6A3W*uij5v@EC78O3nc&m diff --git a/doc/html/struct_v_s_p_grapevine_parameters.html b/doc/html/struct_v_s_p_grapevine_parameters.html index e32f5ca5e..144be6f2c 100644 --- a/doc/html/struct_v_s_p_grapevine_parameters.html +++ b/doc/html/struct_v_s_p_grapevine_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -92,7 +104,7 @@

    Parameters defining the grapevine canopy with vertical shoot positioned (VSP) trellis. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,187 +120,175 @@ - + - + - + - + - + - - + + - + - + - - - - - - - - + + - + - + - - - - - -

    Public Member Functions

     VSPGrapevineParameters ()
     VSPGrapevineParameters ()
     Default constructor.
     
     VSPGrapevineParameters (const pugi::xml_node canopy_node)
     VSPGrapevineParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseGrapeVineParameters
     BaseGrapeVineParameters ()
    - Public Member Functions inherited from BaseGrapeVineParameters
     BaseGrapeVineParameters ()
     Default constructor.
     
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     BaseGrapeVineParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Additional Inherited Members

    - Data Fields inherited from BaseGrapeVineParameters
    float leaf_width
    - Data Fields inherited from BaseGrapeVineParameters
    float leaf_width
     Maximum width of leaves. Leaf width increases logarithmically from the shoot tip, so leaf_width is the width at the base of the shoot.
     
    float leaf_width_spread
    float leaf_width_spread
     Spread value for the maximum leaf width. With any new canopy or plant generation, the maximum leaf width would be between leaf_width - leaf_width_spread and leaf_width + leaf_width_spread.
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves.
     
    std::string wood_texture_file
    std::string wood_texture_file
     Path to texture map file for trunks/branches.
     
    int wood_subdivisions
    int wood_subdivisions
     Number of radial subdivisions for trunk/cordon/shoot tubes.
     
    int wood_subdivisions_spread
    int wood_subdivisions_spread
     Spread value for the number of wood subdivisions. With any new canopy or plant generation, the maximum number of wood subdivisions would be between wood_subdivisions - wood_subdivisions_spread and wood_subdivisions + wood_subdivisions_spread.
     
    float dead_probability
    float dead_probability
     Probability for a plant to be dead, i.e. without any leaves or grapes.
     
    float missing_plant_probability
    float missing_plant_probability
     Probability for a plant to be missing.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float plant_spacing_spread
    float plant_spacing_spread
     Spread value for the plant spacing. The spacing between adjacent plants along a row would vary between plant_spacing - plant_spacing_spread and plant_spacing + plant_spacing_spread.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    float row_spacing_spread
    float row_spacing_spread
     Spread value for the row spacing. This allows to vary the alignment of plants along a row. The spacing between two plants of adjacent rows would be between row_spacing - row_spacing_spread and row_spacing + row_spacing_spread.
     
    float trunk_height
    float trunk_height
     Distance between the ground and top of trunks.
     
    float trunk_height_spread
    float trunk_height_spread
     Spread value for the trunk height. With any new canopy or plant generation, the trunk height would be between trunk_height - trunk_height_spread and trunk_height + trunk_height_spread.
     
    float trunk_radius
    float trunk_radius
     Radius of the trunk at the widest point.
     
    float trunk_radius_spread
    float trunk_radius_spread
     Spread value for the trunk radius. With any new canopy or plant generation, the trunk radius would be between trunk_radius - trunk_radius_spread and trunk_radius + trunk_radius_spread.
     
    float cordon_length
    float cordon_length
     Length of the cordons. By default, half the plant spacing.
     
    float cordon_length_spread
    float cordon_length_spread
     Spread value for the cordon length. With any new canopy or plant generation, the cordon length would be between cordon_length - cordon_length_spread and cordon_length + cordon_length_spread.
     
    float cordon_height
    float cordon_height
     Distance between the ground and cordon. Note - must be greater than or equal to the trunk height.
     
    float cordon_height_spread
    float cordon_height_spread
     Spread value for the cordon height. With any new canopy or plant generation, the cordon height would be between cordon_height - cordon_height_spread and cordon_height + cordon_height_spread.
     
    float cordon_radius
    float cordon_radius
     Radius of cordon branches.
     
    float cordon_radius_spread
    float cordon_radius_spread
     Spread value for the cordon radius. With any new canopy or plant generation, the cordon radius would be between cordon_radius - cordon_radius_spread and cordon_radius + cordon_radius_spread.
     
    float shoot_length
    float shoot_length
     Length of shoots.
     
    float shoot_length_spread
    float shoot_length_spread
     Spread value for the shoot length. With any new canopy or plant generation, the shoot length would be between shoot_length - shoot_length_spread and shoot_length + shoot_length_spread.
     
    float shoot_radius
    float shoot_radius
     Radius of shoot branches.
     
    float shoot_radius_spread
    float shoot_radius_spread
     Spread value for the shoot radius. With any new canopy or plant generation, the shoot radius would be between shoot_radius - shoot_radius_spread and shoot_radius + shoot_radius_spread.
     
    uint shoots_per_cordon
    uint shoots_per_cordon
     Number of shoots on each cordon.
     
    uint shoots_per_cordon_spread
    uint shoots_per_cordon_spread
     Spread value for the number of shoots per cordon. With any new canopy or plant generation, the number of shoots per cordon would be between shoots_per_cordon - shoots_per_cordon_spread and shoots_per_cordon + shoots_per_cordon_spread.
     
    float leaf_spacing_fraction
    float leaf_spacing_fraction
     Spacing between adjacent leaves as a fraction of the local leaf width. E.g., leaf_spacing_fraction = 1 would give a leaf spacing equal to the leaf width.
     
    float leaf_spacing_fraction_spread
    float leaf_spacing_fraction_spread
     Spread value for the leaf spacing fraction. With any new canopy or plant generation, the leaf spacing fraction would be between leaf_spacing_fraction - leaf_spacing_fraction_spread and leaf_spacing_fraction + leaf_spacing_fraction_spread.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    float grape_radius
    float grape_radius
     Radius of grape berries.
     
    float grape_radius_spread
    float grape_radius_spread
     Spread value for the grape radius. With any new canopy or plant generation, the grape radius would be between grape_radius - grape_radius_spread and grape_radius + grape_radius_spread.
     
    float cluster_radius
    float cluster_radius
     Maximum horizontal radius of grape clusters.
     
    float cluster_radius_spread
    float cluster_radius_spread
     Spread value for the cluster radius. With any new canopy or plant generation, the cluster radius would be between cluster_radius - cluster_radius_spread and cluster_radius + cluster_radius_spread.
     
    float cluster_height_max
    float cluster_height_max
     Maximum height of grape clusters along the shoot as a fraction of the total shoot length.
     
    float cluster_height_max_spread
    float cluster_height_max_spread
     Spread value for the cluster height. With any new canopy or plant generation, the cluster height would be between cluster_height - cluster_height_spread and cluster_height + cluster_height_spread.
     
    helios::RGBcolor grape_color
    helios::RGBcolor grape_color
     Color of grapes.
     
    uint grape_subdivisions
    uint grape_subdivisions
     Number of azimuthal and zenithal subdivisions making up berries (will result in roughly 2*(grape_subdivisions)^2 triangles per grape berry)
     
    uint grape_subdivisions_spread
    uint grape_subdivisions_spread
     Spread value for the number of grape subdivisions. With any new canopy or plant generation, the number of grape subdivisions would be between grape_subdivisions - grape_subdivisions_spread and grape_subdivisions + grape_subdivisions_spread.
     
    std::vector< float > leaf_angle_PDF
    std::vector< float > leaf_angle_PDF
     
    float canopy_rotation_spread
    float canopy_rotation_spread
     Spread value for the canopy rotation. With any new canopy or plant generation, the canopy/plant rotation would be between canopy_rotation - canopy_rotation_spread and canopy_rotation + canopy_rotation_spread.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -306,7 +306,7 @@

    VSPGrapevineParameters::VSPGrapevineParameters ( - ) + ) @@ -327,8 +327,7 @@

    VSPGrapevineParameters::VSPGrapevineParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -357,8 +356,7 @@

    void VSPGrapevineParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -389,19 +387,12 @@

    void VSPGrapevineParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -428,8 +419,7 @@

    void VSPGrapevineParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -454,7 +444,8 @@

    +

    diff --git a/doc/html/struct_v_s_p_grapevine_parameters.png b/doc/html/struct_v_s_p_grapevine_parameters.png index f4a46823536a08f2373c2fe6edda5c9add3189ca..f7b0f0c85163011b988bb28659c4fd0b323b2ad2 100644 GIT binary patch delta 21 dcmdnav7KXr9oK^g5B~rEZ+bRt$wrU&%m97e3)=ty delta 21 dcmdnav7KXr9oK;a2mb&6A3W*uij5xcnE`uJ3*P_$ diff --git a/doc/html/struct_vegetative_bud.html b/doc/html/struct_vegetative_bud.html index 8df439972..f7495a8db 100644 --- a/doc/html/struct_vegetative_bud.html +++ b/doc/html/struct_vegetative_bud.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -93,11 +105,11 @@ - + - + - +

    Data Fields

    BudState state = BUD_DORMANT
    BudState state = BUD_DORMANT
     
    std::string shoot_type_label
    std::string shoot_type_label
     
    uint shoot_ID = -1
    uint shoot_ID = -1
     

    Detailed Description

    @@ -158,7 +170,8 @@

    +

    diff --git a/doc/html/struct_walnut_canopy_parameters.html b/doc/html/struct_walnut_canopy_parameters.html index 88fa4ae5d..643faf11d 100644 --- a/doc/html/struct_walnut_canopy_parameters.html +++ b/doc/html/struct_walnut_canopy_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining the walnut tree canopy. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,85 +120,79 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     WalnutCanopyParameters ()
     WalnutCanopyParameters ()
     Default constructor.
     
     WalnutCanopyParameters (const pugi::xml_node canopy_node)
     WalnutCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    float leaf_length
    float leaf_length
     Maximum length of leaves along midrib.
     
    helios::int2 leaf_subdivisions
    helios::int2 leaf_subdivisions
     Number of sub-division segments per leaf.
     
    std::string leaf_texture_file
    std::string leaf_texture_file
     Path to texture map file for leaves.
     
    std::string wood_texture_file
    std::string wood_texture_file
     Path to texture map file for wood/branches.
     
    int wood_subdivisions
    int wood_subdivisions
     Number of radial subdivisions for branch tubes.
     
    float trunk_radius
    float trunk_radius
     Radius of trunk.
     
    float trunk_height
    float trunk_height
     Height of the trunk.
     
    helios::vec3 branch_length
    helios::vec3 branch_length
     Average length of branches in each recursive branch level. For example, the first (.x) value is the length of branches emanating from the trunk, the second (.y) is the the length of branches emanating from the first branching level.
     
    float plant_spacing
    float plant_spacing
     Spacing between adjacent plants along the row direction.
     
    float row_spacing
    float row_spacing
     Spacing between plant rows.
     
    float fruit_radius
    float fruit_radius
     Radius of walnuts.
     
    std::string fruit_texture_file
    std::string fruit_texture_file
     Texture map for walnut fruit.
     
    uint fruit_subdivisions
    uint fruit_subdivisions
     Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisions^2 triangles per fruit)
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -204,7 +210,7 @@

    WalnutCanopyParameters::WalnutCanopyParameters ( - ) + ) @@ -225,8 +231,7 @@

    WalnutCanopyParameters::WalnutCanopyParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -255,8 +260,7 @@

    void WalnutCanopyParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -287,19 +291,12 @@

    void WalnutCanopyParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -326,8 +323,7 @@

    void WalnutCanopyParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -605,7 +601,8 @@

    +

    diff --git a/doc/html/struct_walnut_canopy_parameters.png b/doc/html/struct_walnut_canopy_parameters.png index 3961a131c398d82aa9085a822d68b992d7de5af5..edcd088f86d722f42489d7d9c785a75290a9fcb3 100644 GIT binary patch delta 21 dcmcb?dV_U>9oK^g5B~rEZ+bRt$wrR}OaOt@3%39O delta 21 dcmcb?dV_U>9oK;a2mb&6A3W*uij5u Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -93,87 +105,87 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    std::string label
    std::string label
     
    int Shape
    int Shape
     
    float BaseSize
    float BaseSize
     
    float BaseSizeV
    float BaseSizeV
     
    uint BaseSplits
    uint BaseSplits
     
    uint BaseSplitsV
    uint BaseSplitsV
     
    float BaseSplitSize
    float BaseSplitSize
     
    float BaseSplitSizeV
    float BaseSplitSizeV
     
    float Scale
    float Scale
     
    float ScaleV
    float ScaleV
     
    float ZScale
    float ZScale
     
    float ZScaleV
    float ZScaleV
     
    float Ratio
    float Ratio
     
    float RatioPower
    float RatioPower
     
    int Lobes
    int Lobes
     
    float LobeDepth
    float LobeDepth
     
    float Flare
    float Flare
     
    int Levels
    int Levels
     
    std::vector< float > nSegSplits
    std::vector< float > nSegSplits
     
    std::vector< float > nSplitAngle
    std::vector< float > nSplitAngle
     
    std::vector< float > nSplitAngleV
    std::vector< float > nSplitAngleV
     
    std::vector< int > nCurveRes
    std::vector< int > nCurveRes
     
    std::vector< float > nCurve
    std::vector< float > nCurve
     
    std::vector< float > nCurveV
    std::vector< float > nCurveV
     
    std::vector< float > nCurveBack
    std::vector< float > nCurveBack
     
    std::vector< float > nLength
    std::vector< float > nLength
     
    std::vector< float > nLengthV
    std::vector< float > nLengthV
     
    std::vector< float > nTaper
    std::vector< float > nTaper
     
    std::vector< float > nDownAngle
    std::vector< float > nDownAngle
     
    std::vector< float > nDownAngleV
    std::vector< float > nDownAngleV
     
    std::vector< float > nRotate
    std::vector< float > nRotate
     
    std::vector< float > nRotateV
    std::vector< float > nRotateV
     
    std::vector< int > nBranches
    std::vector< int > nBranches
     
    std::string LeafFile
    std::string LeafFile
     
    int Leaves
    int Leaves
     
    int LeafShape
    int LeafShape
     
    float LeafScale
    float LeafScale
     
    float LeafScaleX
    float LeafScaleX
     
    helios::RGBcolor WoodColor
    helios::RGBcolor WoodColor
     
    std::string WoodFile
    std::string WoodFile
     
    std::vector< float > leafAngleCDF
    std::vector< float > leafAngleCDF
     

    Detailed Description

    @@ -842,7 +854,8 @@

    +

    diff --git a/doc/html/struct_white_spruce_canopy_parameters.html b/doc/html/struct_white_spruce_canopy_parameters.html index aed886fe0..c7e410165 100644 --- a/doc/html/struct_white_spruce_canopy_parameters.html +++ b/doc/html/struct_white_spruce_canopy_parameters.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -93,7 +105,7 @@

    Parameters defining the white spruce. - More...

    + More...

    #include <CanopyGenerator.h>

    @@ -108,94 +120,88 @@ - + - + - + - + - + - - + + - + - + - - - - - -

    Public Member Functions

     WhiteSpruceCanopyParameters ()
     WhiteSpruceCanopyParameters ()
     Default constructor.
     
     WhiteSpruceCanopyParameters (const pugi::xml_node canopy_node)
     WhiteSpruceCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
    void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin) override
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    void buildCanopy (CanopyGenerator &canopy_generator) override
    void buildCanopy (CanopyGenerator &canopy_generator) override
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
    - Public Member Functions inherited from BaseCanopyParameters
     BaseCanopyParameters ()
     Default constructor.
     
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     BaseCanopyParameters (const pugi::xml_node canopy_node)
     
    void readParametersFromXML (const pugi::xml_node canopy_node)
    void readParametersFromXML (const pugi::xml_node canopy_node)
     Sets canopy parameters from the given XML node.
     
    virtual void buildPlant (CanopyGenerator &canopy_generator, helios::vec3 origin)=0
     Makes the given Canopy generator build a single plant of our canopy type with our parameters at the given position.
     
    virtual void buildCanopy (CanopyGenerator &canopy_generator)=0
     Makes the given Canopy generator build a canopy of our type with our parameters.
     
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - +

    Data Fields

    float needle_width
    float needle_width
     Width of needles.
     
    float needle_length
    float needle_length
     Length of needles.
     
    helios::int2 needle_subdivisions
    helios::int2 needle_subdivisions
     Number of sub-division segments per needle.
     
    helios::RGBcolor needle_color
    helios::RGBcolor needle_color
     Color of needles.
     
    std::string wood_texture_file
    std::string wood_texture_file
     Path to texture map file for trunks/branches.
     
    int wood_subdivisions
    int wood_subdivisions
     Number of radial subdivisions for trunk/cordon/shoot tubes.
     
    float trunk_height
    float trunk_height
     Distance between the ground and top of trunks.
     
    float trunk_radius
    float trunk_radius
     Radius of the trunk at the base.
     
    float base_height
    float base_height
     Height at which branches start.
     
    float crown_radius
    float crown_radius
     Radius of the crown at the base.
     
    float shoot_radius
    float shoot_radius
     Radius of shoot branches.
     
    float level_spacing
    float level_spacing
     Vertical spacing between branching levels.
     
    int branches_per_level
    int branches_per_level
     Number of primary branches on the bottom level.
     
    float shoot_angle
    float shoot_angle
     Maximum shoot angle.
     
    std::string canopy_configuration
    std::string canopy_configuration
     Specifies whether to use a uniformly spaced canopy (canopy_configuration="uniform") or a randomly arranged canopy with non-overlapping crowns (canopy_configuration="random").
     
    helios::vec2 plant_spacing
    helios::vec2 plant_spacing
     Spacing between adjacent crowns in the x- and y-directions. Note that if canopy_configuration='random' this is the average spacing.
     
    helios::int2 plant_count
    helios::int2 plant_count
     Number of crowns/plants in the x- and y-directions.
     
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
    - Data Fields inherited from BaseCanopyParameters
    helios::vec3 canopy_origin
     Cartesian (x,y,z) coordinate of the bottom center point of the canopy (i.e., specifying z=0 places the bottom surface of the canopy at z=0).
     
    float canopy_rotation
    float canopy_rotation
     Azimuthal rotation of the canopy about the canopy origin. Note that if canopy_rotation is not equal to zero, the plant_spacing and plant_count parameters are defined in the x- and y-directions before rotation.
     
    @@ -213,7 +219,7 @@

    WhiteSpruceCanopyParameters::WhiteSpruceCanopyParameters ( - ) + ) @@ -234,8 +240,7 @@

    WhiteSpruceCanopyParameters::WhiteSpruceCanopyParameters ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -264,8 +269,7 @@

    void WhiteSpruceCanopyParameters::buildCanopy ( - CanopyGenerator &  - canopy_generator) + CanopyGenerator & canopy_generator) @@ -296,19 +300,12 @@

    void WhiteSpruceCanopyParameters::buildPlant ( - CanopyGenerator &  - canopy_generator, + CanopyGenerator & canopy_generator, - helios::vec3  - origin  - - - - ) - + helios::vec3 origin ) @@ -335,8 +332,7 @@

    void WhiteSpruceCanopyParameters::readParametersFromXML ( - const pugi::xml_node  - canopy_node) + const pugi::xml_node canopy_node) @@ -668,7 +664,8 @@

    +

    diff --git a/doc/html/struct_white_spruce_canopy_parameters.png b/doc/html/struct_white_spruce_canopy_parameters.png index c671a48f49bc665844a5906664e774d15c6a9d38..dc2ee3ddf37261ccde6e14e41da239fb1d647e3e 100644 GIT binary patch delta 21 dcmbQqHj{0F9oK^g5B~rEZ+bRt$wrThOaOSK3w!_o delta 21 dcmbQqHj{0F9oK;a2mb&6A3W*uij5u@nE-Yf3xEIs diff --git a/doc/html/structhelios_1_1_date.html b/doc/html/structhelios_1_1_date.html index 540af1e45..871b3748c 100644 --- a/doc/html/structhelios_1_1_date.html +++ b/doc/html/structhelios_1_1_date.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,49 +110,49 @@

    Date vector. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - + - +

    Public Member Functions

     Date ()
     Date ()
     Default constructor.
     
     Date (int day, int month, int year)
     Date (int day, int month, int year)
     Day/Month/Year constructor.
     
    int JulianDay () const
    int JulianDay () const
     Convert to Julian day.
     
    void incrementDay ()
    void incrementDay ()
     Increment Date vector by one day.
     
    bool isLeapYear () const
    bool isLeapYear () const
     Check whether it is a leap year.
     
    bool operator== (const helios::Date &c) const
    bool operator== (const helios::Date &c) const
     check for equality of two dates
     
    bool operator!= (const helios::Date &c) const
    bool operator!= (const helios::Date &c) const
     check for inequality of two Dates
     
    - + - + - +

    Data Fields

    int day
    int day
     Day of month.
     
    int month
    int month
     Month of year.
     
    int year
    int year
     Year in YYYY format.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, helios::Date const &d)
    std::ostream & operator<< (std::ostream &os, helios::Date const &d)
     Write Date to output stream.
     
    @@ -162,7 +174,7 @@

    helios::Date::Date ( - ) + ) @@ -191,25 +203,17 @@

    helios::Date::Date ( - int  - day, + int day, - int  - month, + int month, - int  - year  - - - - ) - + int year ) @@ -243,7 +247,7 @@

    void helios::Date::incrementDay ( - ) + ) @@ -260,14 +264,22 @@

    + + + + + +
    - +
    bool helios::Date::isLeapYear ()) const
    +
    +nodiscard

    Check whether it is a leap year.

    @@ -282,14 +294,22 @@

    + + + + + +
    - +
    int helios::Date::JulianDay ()) const
    +
    +nodiscard
    diff --git a/doc/html/structhelios_1_1_global_data.html b/doc/html/structhelios_1_1_global_data.html index 43ca59a73..c98e9623f 100644 --- a/doc/html/structhelios_1_1_global_data.html +++ b/doc/html/structhelios_1_1_global_data.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +

    +
    @@ -96,39 +108,39 @@

    Structure for Global Data Entities. - More...

    + More...

    #include <Context.h>

    - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Data Fields

    std::vector< int > global_data_int
    std::vector< int > global_data_int
     
    std::vector< uint > global_data_uint
    std::vector< uint > global_data_uint
     
    std::vector< float > global_data_float
    std::vector< float > global_data_float
     
    std::vector< double > global_data_double
    std::vector< double > global_data_double
     
    std::vector< vec2global_data_vec2
    std::vector< vec2global_data_vec2
     
    std::vector< vec3global_data_vec3
    std::vector< vec3global_data_vec3
     
    std::vector< vec4global_data_vec4
    std::vector< vec4global_data_vec4
     
    std::vector< int2global_data_int2
    std::vector< int2global_data_int2
     
    std::vector< int3global_data_int3
    std::vector< int3global_data_int3
     
    std::vector< int4global_data_int4
    std::vector< int4global_data_int4
     
    std::vector< std::string > global_data_string
    std::vector< std::string > global_data_string
     
    std::vector< bool > global_data_bool
    std::vector< bool > global_data_bool
     
    size_t size
    size_t size
     
    HeliosDataType type
    HeliosDataType type
     

    Detailed Description

    @@ -366,7 +378,8 @@

    +

    diff --git a/doc/html/structhelios_1_1_location.html b/doc/html/structhelios_1_1_location.html index 58fadc062..51e3ee6b2 100644 --- a/doc/html/structhelios_1_1_location.html +++ b/doc/html/structhelios_1_1_location.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,40 +110,40 @@

    Location vector. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - +

    Public Member Functions

     Location ()
     Location ()
     Default constructor.
     
     Location (float latitude_deg, float longitude_deg, float UTC_offset)
     Location (float latitude_deg, float longitude_deg, float UTC_offset)
     latitude/longitude/UTC constructor
     
    bool operator== (const helios::Location &c) const
    bool operator== (const helios::Location &c) const
     check for equality of two locations
     
    bool operator!= (const helios::Location &c) const
    bool operator!= (const helios::Location &c) const
     check for inequality of two locations
     
    - + - + - +

    Data Fields

    float latitude_deg
    float latitude_deg
     Latitude in degrees (+northern hemisphere, -southern hemisphere)
     
    float longitude_deg
    float longitude_deg
     Longitude in degrees (+western hemisphere, -eastern hemisphere)
     
    float UTC_offset
    float UTC_offset
     Offset from UTC in hours (+moving West)
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, helios::Location const &t)
    std::ostream & operator<< (std::ostream &os, helios::Location const &t)
     Write Location to output stream.
     
    @@ -152,7 +164,7 @@

    helios::Location::Location ( - ) + ) @@ -181,25 +193,17 @@

    helios::Location::Location ( - float  - latitude_deg, + float latitude_deg, - float  - longitude_deg, + float longitude_deg, - float  - UTC_offset  - - - - ) - + float UTC_offset ) @@ -235,8 +239,7 @@

    bool helios::Location::operator!= ( - const helios::Location &  - c) + const helios::Location & c) const @@ -265,8 +268,7 @@

    bool helios::Location::operator== ( - const helios::Location &  - c) + const helios::Location & c) const @@ -283,7 +285,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -296,19 +298,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - helios::Location const &  - t  - - - - ) - + helios::Location const & t ) @@ -385,7 +380,8 @@

    +

    diff --git a/doc/html/structhelios_1_1_r_g_b_acolor.html b/doc/html/structhelios_1_1_r_g_b_acolor.html index fe75de278..905c558c9 100644 --- a/doc/html/structhelios_1_1_r_g_b_acolor.html +++ b/doc/html/structhelios_1_1_r_g_b_acolor.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,53 +110,53 @@

    R-G-B-A color vector. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - + - +

    Public Member Functions

     RGBAcolor ()
     RGBAcolor ()
     Default constructor - initializes color to black.
     
     RGBAcolor (float r, float g, float b, float a)
     RGBAcolor (float r, float g, float b, float a)
     Constructor given three floats denoting R-G-B components.
     
     RGBAcolor (const float C[4])
     RGBAcolor (const float C[4])
     Constructor given an array of three floats denoting R-G-B-A components.
     
     RGBAcolor (const std::vector< float > &C)
     RGBAcolor (const std::vector< float > &C)
     Constructor given a vector of three floats denoting R-G-B-A components.
     
    void scale (float scale_factor)
    void scale (float scale_factor)
     Scale RGBAcolor by some factor.
     
    bool operator== (const helios::RGBAcolor &c) const
    bool operator== (const helios::RGBAcolor &c) const
     check for equality of two RGBA colors
     
    bool operator!= (const helios::RGBAcolor &c) const
    bool operator!= (const helios::RGBAcolor &c) const
     check for inequality of two RGBA colors
     
    - + - + - + - +

    Data Fields

    float r
    float r
     Red color component.
     
    float g
    float g
     Green color component.

     
    float b
    float b
     Blue color component.
     
    float a
    float a
     Alpha (transparency) component.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, const helios::RGBAcolor &c)
    std::ostream & operator<< (std::ostream &os, const helios::RGBAcolor &c)
     write RGBAcolor to output stream
     
    @@ -165,7 +177,7 @@

    helios::RGBAcolor::RGBAcolor ( - ) + ) @@ -194,31 +206,22 @@

    helios::RGBAcolor::RGBAcolor ( - float  - r, + float r, - float  - g, + float g, - float  - b, + float b, - float  - a  - - - - ) - + float a ) @@ -256,8 +259,7 @@

    helios::RGBAcolor::RGBAcolor ( - const float  - C[4]) + const float C[4]) @@ -293,8 +295,7 @@

    helios::RGBAcolor::RGBAcolor ( - const std::vector< float > &  - C) + const std::vector< float > & C) @@ -331,8 +332,7 @@

    bool helios::RGBAcolor::operator!= ( - const helios::RGBAcolor &  - c) + const helios::RGBAcolor & c) const @@ -361,8 +361,7 @@

    bool helios::RGBAcolor::operator== ( - const helios::RGBAcolor &  - c) + const helios::RGBAcolor & c) const @@ -391,8 +390,7 @@

    void helios::RGBAcolor::scale ( - float  - scale_factor) + float scale_factor) @@ -415,7 +413,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -428,19 +426,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - const helios::RGBAcolor &  - c  - - - - ) - + const helios::RGBAcolor & c ) @@ -540,7 +531,8 @@

    +

    diff --git a/doc/html/structhelios_1_1_r_g_bcolor.html b/doc/html/structhelios_1_1_r_g_bcolor.html index e38b1e4c7..26738cdc5 100644 --- a/doc/html/structhelios_1_1_r_g_bcolor.html +++ b/doc/html/structhelios_1_1_r_g_bcolor.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,53 +110,53 @@

    R-G-B color vector. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - + - + - +

    Public Member Functions

     RGBcolor ()
     RGBcolor ()
     Default constructor - initializes color to black.
     
     RGBcolor (float r, float g, float b)
     RGBcolor (float r, float g, float b)
     Constructor given three floats denoting R-G-B components.
     
     RGBcolor (const float C[3])
     RGBcolor (const float C[3])
     Constructor given an array of three floats denoting R-G-B components.
     
     RGBcolor (const std::vector< float > &C)
     RGBcolor (const std::vector< float > &C)
     Constructor given a vector of three floats denoting R-G-B components.
     
     RGBcolor (const vec3 &C)
     RGBcolor (const vec3 &C)
     Constructor given a vec3 denoting R-G-B components.
     
    void scale (float scale_factor)
    void scale (float scale_factor)
     Scale RGBcolor by some factor.
     
    bool operator== (const RGBcolor &c) const
    bool operator== (const RGBcolor &c) const
     check for equality of two RGB colors
     
    bool operator!= (const RGBcolor &c) const
    bool operator!= (const RGBcolor &c) const
     check for inequality of two RGB colors
     
    - + - + - +

    Data Fields

    float r
    float r
     Red color component.
     
    float g
    float g
     Green color component.

     
    float b
    float b
     Blue color component.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, const helios::RGBcolor &c)
    std::ostream & operator<< (std::ostream &os, const helios::RGBcolor &c)
     write RGBcolor to output stream
     
    @@ -165,7 +177,7 @@

    helios::RGBcolor::RGBcolor ( - ) + ) @@ -194,25 +206,17 @@

    helios::RGBcolor::RGBcolor ( - float  - r, + float r, - float  - g, + float g, - float  - b  - - - - ) - + float b ) @@ -249,8 +253,7 @@

    helios::RGBcolor::RGBcolor ( - const float  - C[3]) + const float C[3]) @@ -286,8 +289,7 @@

    helios::RGBcolor::RGBcolor ( - const std::vector< float > &  - C) + const std::vector< float > & C) @@ -323,8 +325,7 @@

    helios::RGBcolor::RGBcolor ( - const vec3 &  - C) + const vec3 & C) @@ -361,8 +362,7 @@

    bool helios::RGBcolor::operator!= ( - const RGBcolor &  - c) + const RGBcolor & c) const @@ -391,8 +391,7 @@

    bool helios::RGBcolor::operator== ( - const RGBcolor &  - c) + const RGBcolor & c) const @@ -421,8 +420,7 @@

    void helios::RGBcolor::scale ( - float  - scale_factor) + float scale_factor) @@ -445,7 +443,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -458,19 +456,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - const helios::RGBcolor &  - c  - - - - ) - + const helios::RGBcolor & c ) @@ -551,7 +542,8 @@

    +

    diff --git a/doc/html/structhelios_1_1_spherical_coord.html b/doc/html/structhelios_1_1_spherical_coord.html index 0152c4dd0..00a92ed5f 100644 --- a/doc/html/structhelios_1_1_spherical_coord.html +++ b/doc/html/structhelios_1_1_spherical_coord.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,49 +110,49 @@

    Vector of spherical coordinates (elevation,azimuth) - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - +

    Public Member Functions

     SphericalCoord ()
     SphericalCoord ()
     Default constructor.
     
     SphericalCoord (float radius, float elevation_radians, float azimuth_radians)
     SphericalCoord (float radius, float elevation_radians, float azimuth_radians)
     Initialize SphericalCoord by specifying radius, elevation, and azimuth.
     
     SphericalCoord (const SphericalCoord &c)
     SphericalCoord (const SphericalCoord &c)
     Copy constructor.
     
    SphericalCoordoperator= (const SphericalCoord &c)
    SphericalCoordoperator= (const SphericalCoord &c)
     Assignment operator.
     
    bool operator== (const helios::SphericalCoord &c) const
    bool operator== (const helios::SphericalCoord &c) const
     check for equality of two spherical coordinates
     
    bool operator!= (const helios::SphericalCoord &c) const
    bool operator!= (const helios::SphericalCoord &c) const
     check for inequality of two spherical coordinates
     
    - + - + - + - +

    Data Fields

    float radius
    float radius
     Radius.
     
    const float & elevation
    const float & elevation
     Elevation angle (radians)
     
    const float & zenith
    const float & zenith
     Zenithal angle (radians)
     
    float azimuth
    float azimuth
     Azimuthal angle (radians)
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, helios::SphericalCoord const &coord)
    std::ostream & operator<< (std::ostream &os, helios::SphericalCoord const &coord)
     Write SphericalCoord to output stream.
     
    @@ -161,7 +173,7 @@

    helios::SphericalCoord::SphericalCoord ( - ) + ) @@ -191,25 +203,17 @@

    helios::SphericalCoord::SphericalCoord ( - float  - radius, + float radius, - float  - elevation_radians, + float elevation_radians, - float  - azimuth_radians  - - - - ) - + float azimuth_radians ) @@ -245,8 +249,7 @@

    helios::SphericalCoord::SphericalCoord ( - const SphericalCoord &  - c) + const SphericalCoord & c) @@ -276,8 +279,7 @@

    bool helios::SphericalCoord::operator!= ( - const helios::SphericalCoord &  - c) + const helios::SphericalCoord & c) const @@ -306,8 +308,7 @@

    SphericalCoord & helios::SphericalCoord::operator= ( - const SphericalCoord &  - c) + const SphericalCoord & c) @@ -336,8 +337,7 @@

    bool helios::SphericalCoord::operator== ( - const helios::SphericalCoord &  - c) + const helios::SphericalCoord & c) const @@ -354,7 +354,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -367,19 +367,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - helios::SphericalCoord const &  - coord  - - - - ) - + helios::SphericalCoord const & coord ) @@ -474,7 +467,8 @@

    +

    diff --git a/doc/html/structhelios_1_1_time.html b/doc/html/structhelios_1_1_time.html index 1c2858260..9f009a14c 100644 --- a/doc/html/structhelios_1_1_time.html +++ b/doc/html/structhelios_1_1_time.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,43 +110,43 @@

    Time vector. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - +

    Public Member Functions

     Time ()
     Time ()
     Default constructor.
     
     Time (int hour, int minute)
     Time (int hour, int minute)
     second/minute/hour constructor
     
     Time (int hour, int minute, int second)
     Time (int hour, int minute, int second)
     minute/hour constructor
     
    bool operator== (const helios::Time &c) const
    bool operator== (const helios::Time &c) const
     check for equality of two times
     
    bool operator!= (const helios::Time &c) const
    bool operator!= (const helios::Time &c) const
     check for inequality of two times
     
    - + - + - +

    Data Fields

    int second
    int second
     Second of minute.
     
    int minute
    int minute
     Minute of hour.
     
    int hour
    int hour
     Hour of day.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, helios::Time const &t)
    std::ostream & operator<< (std::ostream &os, helios::Time const &t)
     Write Time to output stream.
     
    @@ -156,7 +168,7 @@

    helios::Time::Time ( - ) + ) @@ -185,19 +197,12 @@

    helios::Time::Time ( - int  - hour, + int hour, - int  - minute  - - - - ) - + int minute ) @@ -232,25 +237,17 @@

    helios::Time::Time ( - int  - hour, + int hour, - int  - minute, + int minute, - int  - second  - - - - ) - + int second ) @@ -287,8 +284,7 @@

    bool helios::Time::operator!= ( - const helios::Time &  - c) + const helios::Time & c) const @@ -317,8 +313,7 @@

    bool helios::Time::operator== ( - const helios::Time &  - c) + const helios::Time & c) const @@ -335,7 +330,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -348,19 +343,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - helios::Time const &  - t  - - - - ) - + helios::Time const & t ) @@ -437,7 +425,8 @@

    +

    diff --git a/doc/html/structhelios_1_1_timer.html b/doc/html/structhelios_1_1_timer.html index 3c96503c7..6c63dcc57 100644 --- a/doc/html/structhelios_1_1_timer.html +++ b/doc/html/structhelios_1_1_timer.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -95,25 +107,25 @@
    -

    MATLAB-style timer. Call tic() to start timer, call toc() to stop timer and print duration. - More...

    +

    MATLAB-style timer. Call tic() to start timer, call toc() to stop timer and print duration. + More...

    #include <global.h>

    - + - + - +

    Public Member Functions

    void tic ()
    void tic ()
     Start timer.
     
    double toc () const
    double toc () const
     Stop timer and print elapsed time.
     
    double toc (const char *message) const
    double toc (const char *message) const
     Stop timer and print elapsed time and a user-defined message.
     

    Detailed Description

    -

    MATLAB-style timer. Call tic() to start timer, call toc() to stop timer and print duration.

    +

    MATLAB-style timer. Call tic() to start timer, call toc() to stop timer and print duration.

    Definition at line 619 of file global.h.

    Constructor & Destructor Documentation

    @@ -129,7 +141,7 @@

    helios::Timer::Timer ( - ) + ) @@ -157,7 +169,7 @@

    void helios::Timer::tic ( - ) + ) @@ -186,7 +198,7 @@

    double helios::Timer::toc ( - ) + ) const @@ -215,8 +227,7 @@

    double helios::Timer::toc ( - const char *  - message) + const char * message) const @@ -240,7 +251,8 @@

    +

    diff --git a/doc/html/structhelios_1_1int2.html b/doc/html/structhelios_1_1int2.html index 08b622e12..bd91e0019 100644 --- a/doc/html/structhelios_1_1int2.html +++ b/doc/html/structhelios_1_1int2.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,58 +110,58 @@

    Vector of two elements of type 'int'. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

     int2 ()
     int2 ()
     Default constructor.
     
     int2 (const std::vector< int > &v)
     int2 (const std::vector< int > &v)
     Construct int2 from a vector of ints.
     
     int2 (const int v[2])
     int2 (const int v[2])
     Construct int2 from an array of ints.
     
     int2 (int v0, int v1)
     int2 (int v0, int v1)
     Construct int2 from two ints.
     
    int2 operator+ (const int2 &a) const
    int2 operator+ (const int2 &a) const
     Add two int2 vectors.
     
    int2operator+= (const int2 &a)
    int2operator+= (const int2 &a)
     Increment int2 vector.
     
    int2operator-= (const int2 &a)
    int2operator-= (const int2 &a)
     Deccrement int2 vector.
     
    int2 operator- (const int2 &a) const
    int2 operator- (const int2 &a) const
     Subtract two int2 vectors.
     
    bool operator== (const int2 &a) const
    bool operator== (const int2 &a) const
     Equality for all elements.
     
    bool operator!= (const int2 &a) const
    bool operator!= (const int2 &a) const
     Inequality for all elements.
     
    int2 operator- () const
    int2 operator- () const
     Multiply each element by -1.
     
    - + - +

    Data Fields

    int x
    int x
     First element in vector.
     
    int y
    int y
     Second element in vector.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, const helios::int2 &vec)
    std::ostream & operator<< (std::ostream &os, const helios::int2 &vec)
     Write int2 to output stream.
     
    @@ -170,7 +182,7 @@

    helios::int2::int2 ( - ) + ) @@ -199,8 +211,7 @@

    helios::int2::int2 ( - const std::vector< int > &  - v) + const std::vector< int > & v) @@ -229,8 +240,7 @@

    helios::int2::int2 ( - const int  - v[2]) + const int v[2]) @@ -259,19 +269,12 @@

    helios::int2::int2 ( - int  - v0, + int v0, - int  - v1  - - - - ) - + int v1 ) @@ -300,8 +303,7 @@

    bool helios::int2::operator!= ( - const int2 &  - a) + const int2 & a) const @@ -330,8 +332,7 @@

    int2 helios::int2::operator+ ( - const int2 &  - a) + const int2 & a) const @@ -360,8 +361,7 @@

    int2 & helios::int2::operator+= ( - const int2 &  - a) + const int2 & a) @@ -390,7 +390,7 @@

    int2 helios::int2::operator- ( - ) + ) const @@ -419,8 +419,7 @@

    int2 helios::int2::operator- ( - const int2 &  - a) + const int2 & a) const @@ -449,8 +448,7 @@

    int2 & helios::int2::operator-= ( - const int2 &  - a) + const int2 & a) @@ -479,8 +477,7 @@

    bool helios::int2::operator== ( - const int2 &  - a) + const int2 & a) const @@ -497,7 +494,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -510,19 +507,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - const helios::int2 &  - vec  - - - - ) - + const helios::int2 & vec ) @@ -581,7 +571,8 @@

    +

    diff --git a/doc/html/structhelios_1_1int3.html b/doc/html/structhelios_1_1int3.html index 97e20b230..16185faf2 100644 --- a/doc/html/structhelios_1_1int3.html +++ b/doc/html/structhelios_1_1int3.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,61 +110,61 @@

    Vector of three elements of type 'int'. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

     int3 ()
     int3 ()
     Default constructor.
     
     int3 (const std::vector< int > &v)
     int3 (const std::vector< int > &v)
     Construct int3 from a vector of ints.
     
     int3 (const int v[3])
     int3 (const int v[3])
     Construct int3 from an array of ints.
     
     int3 (int v0, int v1, int v2)
     int3 (int v0, int v1, int v2)
     Construct int3 from three ints.
     
    int3 operator+ (const int3 &a) const
    int3 operator+ (const int3 &a) const
     Add two int3 vectors.
     
    int3operator+= (const int3 &a)
    int3operator+= (const int3 &a)
     Increment int3 vector.
     
    int3operator-= (const int3 &a)
    int3operator-= (const int3 &a)
     Decrement int3 vector.
     
    int3 operator- (const int3 &a) const
    int3 operator- (const int3 &a) const
     Subtract two int3 vectors.
     
    bool operator== (const int3 &a) const
    bool operator== (const int3 &a) const
     Equality for all elements.
     
    bool operator!= (const int3 &a) const
    bool operator!= (const int3 &a) const
     Inequality for all elements.
     
    int3 operator- () const
    int3 operator- () const
     Multiply each element by -1.
     
    - + - + - +

    Data Fields

    int x
    int x
     First element in vector.
     
    int y
    int y
     Second element in vector.
     
    int z
    int z
     Third element in vector.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, const helios::int3 &vec)
    std::ostream & operator<< (std::ostream &os, const helios::int3 &vec)
     Write int3 to output stream.
     
    @@ -173,7 +185,7 @@

    helios::int3::int3 ( - ) + ) @@ -202,8 +214,7 @@

    helios::int3::int3 ( - const std::vector< int > &  - v) + const std::vector< int > & v) @@ -232,8 +243,7 @@

    helios::int3::int3 ( - const int  - v[3]) + const int v[3]) @@ -262,25 +272,17 @@

    helios::int3::int3 ( - int  - v0, + int v0, - int  - v1, + int v1, - int  - v2  - - - - ) - + int v2 ) @@ -309,8 +311,7 @@

    bool helios::int3::operator!= ( - const int3 &  - a) + const int3 & a) const @@ -339,8 +340,7 @@

    int3 helios::int3::operator+ ( - const int3 &  - a) + const int3 & a) const @@ -369,8 +369,7 @@

    int3 & helios::int3::operator+= ( - const int3 &  - a) + const int3 & a) @@ -399,7 +398,7 @@

    int3 helios::int3::operator- ( - ) + ) const @@ -428,8 +427,7 @@

    int3 helios::int3::operator- ( - const int3 &  - a) + const int3 & a) const @@ -458,8 +456,7 @@

    int3 & helios::int3::operator-= ( - const int3 &  - a) + const int3 & a) @@ -488,8 +485,7 @@

    bool helios::int3::operator== ( - const int3 &  - a) + const int3 & a) const @@ -506,7 +502,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -519,19 +515,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - const helios::int3 &  - vec  - - - - ) - + const helios::int3 & vec ) @@ -608,7 +597,8 @@

    +

    diff --git a/doc/html/structhelios_1_1int4.html b/doc/html/structhelios_1_1int4.html index fe322e8df..26e2763da 100644 --- a/doc/html/structhelios_1_1int4.html +++ b/doc/html/structhelios_1_1int4.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,64 +110,64 @@

    Vector of four elements of type 'int'. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

     int4 ()
     int4 ()
     Default constructor.
     
     int4 (const std::vector< int > &v)
     int4 (const std::vector< int > &v)
     Construct int3 from a vector of ints.
     
     int4 (const int v[3])
     int4 (const int v[3])
     Construct int4 from an array of ints.
     
     int4 (int v0, int v1, int v2, int v3)
     int4 (int v0, int v1, int v2, int v3)
     Construct int4 from four ints.
     
    int4 operator+ (const int4 &a) const
    int4 operator+ (const int4 &a) const
     Add two int4 vectors.
     
    int4operator+= (const int4 &a)
    int4operator+= (const int4 &a)
     Increment int4 vector.
     
    int4operator-= (const int4 &a)
    int4operator-= (const int4 &a)
     Decrement int4 vector.
     
    int4 operator- (const int4 &a) const
    int4 operator- (const int4 &a) const
     Subtract two int4 vectors.
     
    bool operator== (const int4 &a) const
    bool operator== (const int4 &a) const
     Equality for all elements.
     
    bool operator!= (const int4 &a) const
    bool operator!= (const int4 &a) const
     Inequality for all elements.
     
    int4 operator- () const
    int4 operator- () const
     Multiply each element by -1.
     
    - + - + - + - +

    Data Fields

    int x
    int x
     First element in vector.
     
    int y
    int y
     Second element in vector.
     
    int z
    int z
     Third element in vector.
     
    int w
    int w
     Fourth element in vector.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, const helios::int4 &vec)
    std::ostream & operator<< (std::ostream &os, const helios::int4 &vec)
     Write int4 to output stream.
     
    @@ -176,7 +188,7 @@

    helios::int4::int4 ( - ) + ) @@ -205,8 +217,7 @@

    helios::int4::int4 ( - const std::vector< int > &  - v) + const std::vector< int > & v) @@ -235,8 +246,7 @@

    helios::int4::int4 ( - const int  - v[3]) + const int v[3]) @@ -265,31 +275,22 @@

    helios::int4::int4 ( - int  - v0, + int v0, - int  - v1, + int v1, - int  - v2, + int v2, - int  - v3  - - - - ) - + int v3 ) @@ -318,8 +319,7 @@

    bool helios::int4::operator!= ( - const int4 &  - a) + const int4 & a) const @@ -348,8 +348,7 @@

    int4 helios::int4::operator+ ( - const int4 &  - a) + const int4 & a) const @@ -378,8 +377,7 @@

    int4 & helios::int4::operator+= ( - const int4 &  - a) + const int4 & a) @@ -408,7 +406,7 @@

    int4 helios::int4::operator- ( - ) + ) const @@ -437,8 +435,7 @@

    int4 helios::int4::operator- ( - const int4 &  - a) + const int4 & a) const @@ -467,8 +464,7 @@

    int4 & helios::int4::operator-= ( - const int4 &  - a) + const int4 & a) @@ -497,8 +493,7 @@

    bool helios::int4::operator== ( - const int4 &  - a) + const int4 & a) const @@ -515,7 +510,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -528,19 +523,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - const helios::int4 &  - vec  - - - - ) - + const helios::int4 & vec ) @@ -635,7 +623,8 @@

    +

    diff --git a/doc/html/structhelios_1_1vec2.html b/doc/html/structhelios_1_1vec2.html index e68c7c282..6029ffebc 100644 --- a/doc/html/structhelios_1_1vec2.html +++ b/doc/html/structhelios_1_1vec2.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,79 +110,79 @@

    Vector of two elements of type 'float'. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

    vec2 normalize ()
    vec2 normalize ()
     Normalize vector components such that the magnitude is unity.
     
    float magnitude () const
    float magnitude () const
     Compute the vector magnitude.
     
     vec2 ()
     vec2 ()
     Default constructor.
     
     vec2 (const std::vector< float > &v)
     vec2 (const std::vector< float > &v)
     Initialize vec2 using a vector of floats.
     
     vec2 (const float v[2])
     vec2 (const float v[2])
     Initialize vec2 using an array of floats.
     
     vec2 (float v0, float v1)
     vec2 (float v0, float v1)
     Initialize vec2 using two floats.
     
    float operator* (const vec2 &a) const
    float operator* (const vec2 &a) const
     Dot (scalar) product of two vec2 vectors.
     
    vec2 operator+ (const vec2 &a) const
    vec2 operator+ (const vec2 &a) const
     Sum of two vec2 vectors.
     
    vec2operator+= (const vec2 &a)
    vec2operator+= (const vec2 &a)
     Increment vec2 vector.
     
    vec2operator-= (const vec2 &a)
    vec2operator-= (const vec2 &a)
     Decrement vec2 vector.
     
    vec2 operator- (const vec2 &a) const
    vec2 operator- (const vec2 &a) const
     Difference of two vec2 vectors.
     
    vec2 operator* (float a) const
    vec2 operator* (float a) const
     Multiply each element by scalar (scalar is multiplied on right: vec2*a)
     
    vec2 operator/ (float a) const
    vec2 operator/ (float a) const
     Divide each element by scalar (scalar is divided on right: vec2/a)
     
    vec2 operator+ (float a) const
    vec2 operator+ (float a) const
     Add a scalar to each element (scalar is added on right: vec2+a)
     
    vec2 operator- (float a) const
    vec2 operator- (float a) const
     Subtract a scalar from each element (scalar is subtracted on right: vec2-a)
     
    bool operator== (const vec2 &a) const
    bool operator== (const vec2 &a) const
     check for equality of two vec2 vectors
     
    bool operator!= (const vec2 &a) const
    bool operator!= (const vec2 &a) const
     check for inequality of two vec2 vectors
     
    vec2 operator- () const
    vec2 operator- () const
     Multiply each element by -1.
     
    - + - +

    Data Fields

    float x
    float x
     First element in vector.
     
    float y
    float y
     Second element in vector.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, const helios::vec2 &vec)
    std::ostream & operator<< (std::ostream &os, const helios::vec2 &vec)
     Write vec2 to output stream.
     
    @@ -191,7 +203,7 @@

    helios::vec2::vec2 ( - ) + ) @@ -221,8 +233,7 @@

    helios::vec2::vec2 ( - const std::vector< float > &  - v) + const std::vector< float > & v) @@ -251,8 +262,7 @@

    helios::vec2::vec2 ( - const float  - v[2]) + const float v[2]) @@ -281,19 +291,12 @@

    helios::vec2::vec2 ( - float  - v0, + float v0, - float  - v1  - - - - ) - + float v1 ) @@ -322,13 +325,13 @@

    float helios::vec2::magnitude ( - ) + ) const -inline +inlinenodiscard

    @@ -352,7 +355,7 @@

    vec2 helios::vec2::normalize ( - ) + ) @@ -381,8 +384,7 @@

    bool helios::vec2::operator!= ( - const vec2 &  - a) + const vec2 & a) const @@ -411,8 +413,7 @@

    float helios::vec2::operator* ( - const vec2 &  - a) + const vec2 & a) const @@ -441,8 +442,7 @@

    vec2 helios::vec2::operator* ( - float  - a) + float a) const @@ -471,8 +471,7 @@

    vec2 helios::vec2::operator+ ( - const vec2 &  - a) + const vec2 & a) const @@ -501,8 +500,7 @@

    vec2 helios::vec2::operator+ ( - float  - a) + float a) const @@ -531,8 +529,7 @@

    vec2 & helios::vec2::operator+= ( - const vec2 &  - a) + const vec2 & a) @@ -561,7 +558,7 @@

    vec2 helios::vec2::operator- ( - ) + ) const @@ -590,8 +587,7 @@

    vec2 helios::vec2::operator- ( - const vec2 &  - a) + const vec2 & a) const @@ -620,8 +616,7 @@

    vec2 helios::vec2::operator- ( - float  - a) + float a) const @@ -650,8 +645,7 @@

    vec2 & helios::vec2::operator-= ( - const vec2 &  - a) + const vec2 & a) @@ -680,8 +674,7 @@

    vec2 helios::vec2::operator/ ( - float  - a) + float a) const @@ -710,8 +703,7 @@

    bool helios::vec2::operator== ( - const vec2 &  - a) + const vec2 & a) const @@ -728,7 +720,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -741,19 +733,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - const helios::vec2 &  - vec  - - - - ) - + const helios::vec2 & vec ) @@ -812,7 +797,8 @@

    +

    diff --git a/doc/html/structhelios_1_1vec3.html b/doc/html/structhelios_1_1vec3.html index 9591964dc..53ffff7f1 100644 --- a/doc/html/structhelios_1_1vec3.html +++ b/doc/html/structhelios_1_1vec3.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,82 +110,82 @@

    Vector of three elements of type 'float'. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

    vec3 normalize ()
    vec3 normalize ()
     Normalize vector components such that the magnitude is unity.
     
    float magnitude () const
    float magnitude () const
     Compute the vector magnitude.
     
     vec3 ()
     vec3 ()
     Default constructor.
     
     vec3 (const std::vector< float > &v)
     vec3 (const std::vector< float > &v)
     Initialize vec3 using a vector of floats.
     
     vec3 (const float v[3])
     vec3 (const float v[3])
     Initialize vec3 using an array of floats.
     
     vec3 (float v0, float v1, float v2)
     vec3 (float v0, float v1, float v2)
     Initialize vec3 using three floats.
     
    float operator* (const vec3 &a) const
    float operator* (const vec3 &a) const
     Dot (scalar) product of two vec3 vectors.
     
    vec3 operator+ (const vec3 &a) const
    vec3 operator+ (const vec3 &a) const
     Sum of two vec3 vectors.
     
    vec3operator+= (const vec3 &a)
    vec3operator+= (const vec3 &a)
     Increment vec3 vector.
     
    vec3operator-= (const vec3 &a)
    vec3operator-= (const vec3 &a)
     Decrement vec3 vector.
     
    vec3 operator- (const vec3 &a) const
    vec3 operator- (const vec3 &a) const
     Difference of two vec3 vectors.
     
    vec3 operator* (float a) const
    vec3 operator* (float a) const
     Multiply each element by scalar (scalar is multiplied on right: vec3*a)
     
    vec3 operator/ (float a) const
    vec3 operator/ (float a) const
     Divide each element by scalar (scalar is divided on right: vec3/a)
     
    vec3 operator+ (float a) const
    vec3 operator+ (float a) const
     Add a scalar to each element (scalar is added on right: vec3+a)
     
    vec3 operator- (float a) const
    vec3 operator- (float a) const
     Subtract a scalar from each element (scalar is subtracted on right: vec3-a)
     
    bool operator== (const vec3 &a) const
    bool operator== (const vec3 &a) const
     check for equality of two vec3 vectors
     
    bool operator!= (const vec3 &a) const
    bool operator!= (const vec3 &a) const
     check for inequality of two vec3 vectors
     
    vec3 operator- () const
    vec3 operator- () const
     Multiply vector by -1.
     
    - + - + - +

    Data Fields

    float x
    float x
     First element in vector.
     
    float y
    float y
     Second element in vector.
     
    float z
    float z
     Third element in vector.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, const helios::vec3 &vec)
    std::ostream & operator<< (std::ostream &os, const helios::vec3 &vec)
     Write vec3 to output stream.
     
    @@ -194,7 +206,7 @@

    helios::vec3::vec3 ( - ) + ) @@ -224,8 +236,7 @@

    helios::vec3::vec3 ( - const std::vector< float > &  - v) + const std::vector< float > & v) @@ -254,8 +265,7 @@

    helios::vec3::vec3 ( - const float  - v[3]) + const float v[3]) @@ -284,25 +294,17 @@

    helios::vec3::vec3 ( - float  - v0, + float v0, - float  - v1, + float v1, - float  - v2  - - - - ) - + float v2 ) @@ -331,13 +333,13 @@

    float helios::vec3::magnitude ( - ) + ) const -inline +inlinenodiscard

    @@ -361,7 +363,7 @@

    vec3 helios::vec3::normalize ( - ) + ) @@ -390,8 +392,7 @@

    bool helios::vec3::operator!= ( - const vec3 &  - a) + const vec3 & a) const @@ -420,8 +421,7 @@

    float helios::vec3::operator* ( - const vec3 &  - a) + const vec3 & a) const @@ -450,8 +450,7 @@

    vec3 helios::vec3::operator* ( - float  - a) + float a) const @@ -480,8 +479,7 @@

    vec3 helios::vec3::operator+ ( - const vec3 &  - a) + const vec3 & a) const @@ -510,8 +508,7 @@

    vec3 helios::vec3::operator+ ( - float  - a) + float a) const @@ -540,8 +537,7 @@

    vec3 & helios::vec3::operator+= ( - const vec3 &  - a) + const vec3 & a) @@ -570,7 +566,7 @@

    vec3 helios::vec3::operator- ( - ) + ) const @@ -599,8 +595,7 @@

    vec3 helios::vec3::operator- ( - const vec3 &  - a) + const vec3 & a) const @@ -629,8 +624,7 @@

    vec3 helios::vec3::operator- ( - float  - a) + float a) const @@ -659,8 +653,7 @@

    vec3 & helios::vec3::operator-= ( - const vec3 &  - a) + const vec3 & a) @@ -689,8 +682,7 @@

    vec3 helios::vec3::operator/ ( - float  - a) + float a) const @@ -719,8 +711,7 @@

    bool helios::vec3::operator== ( - const vec3 &  - a) + const vec3 & a) const @@ -737,7 +728,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -750,19 +741,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - const helios::vec3 &  - vec  - - - - ) - + const helios::vec3 & vec ) @@ -839,7 +823,8 @@

    +

    diff --git a/doc/html/structhelios_1_1vec4.html b/doc/html/structhelios_1_1vec4.html index e79ffffa2..7e2301ddf 100644 --- a/doc/html/structhelios_1_1vec4.html +++ b/doc/html/structhelios_1_1vec4.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    Public Member Functions | @@ -98,85 +110,85 @@

    Vector of four elements of type 'float'. - More...

    + More...

    #include <helios_vector_types.h>

    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

    Public Member Functions

    vec4 normalize ()
    vec4 normalize ()
     Normalize vector components such that the magnitude is unity.
     
    float magnitude () const
    float magnitude () const
     Compute the vector magnitude.
     
     vec4 ()
     vec4 ()
     Default constructor.
     
     vec4 (const std::vector< float > &v)
     vec4 (const std::vector< float > &v)
     Initialize vec4 using a vector of floats.
     
     vec4 (const float v[4])
     vec4 (const float v[4])
     Initialize vec3 using an array of floats.
     
     vec4 (float v0, float v1, float v2, float v3)
     vec4 (float v0, float v1, float v2, float v3)
     Initialize vec4 using four floats.
     
    float operator* (const vec4 &a) const
    float operator* (const vec4 &a) const
     Dot (scalar) product of two vec4 vectors.
     
    vec4 operator+ (const vec4 &a) const
    vec4 operator+ (const vec4 &a) const
     Sum of two vec4 vectors.
     
    vec4operator+= (const vec4 &a)
    vec4operator+= (const vec4 &a)
     Increment vec4 vector.
     
    vec4operator-= (const vec4 &a)
    vec4operator-= (const vec4 &a)
     Decrement vec4 vector.
     
    vec4 operator- (const vec4 &a) const
    vec4 operator- (const vec4 &a) const
     Difference of two vec4 vectors.
     
    vec4 operator* (float a) const
    vec4 operator* (float a) const
     Multiply each element by scalar (scalar is multiplied on right: vec4*a)
     
    vec4 operator/ (float a) const
    vec4 operator/ (float a) const
     Divide each element by scalar (scalar is divided on right: vec4/a)
     
    vec4 operator+ (float a) const
    vec4 operator+ (float a) const
     Add a scalar to each element (scalar is added on right: vec4+a)
     
    vec4 operator- (float a) const
    vec4 operator- (float a) const
     Subtract a scalar from each element (scalar is subtracted on right: vec4-a)
     
    bool operator== (const vec4 &a) const
    bool operator== (const vec4 &a) const
     check for equality of two vec4 vectors
     
    bool operator!= (const vec4 &a) const
    bool operator!= (const vec4 &a) const
     check for equality of two vec4 vectors
     
    vec4 operator- () const
    vec4 operator- () const
     Multiply each element by -1.
     
    - + - + - + - +

    Data Fields

    float x
    float x
     First element in vector.
     
    float y
    float y
     Second element in vector.
     
    float z
    float z
     Third element in vector.
     
    float w
    float w
     Fourth element in vector.
     
    - +

    Friends

    std::ostream & operator<< (std::ostream &os, const helios::vec4 &vec)
    std::ostream & operator<< (std::ostream &os, const helios::vec4 &vec)
     Write vec4 to output stream.
     
    @@ -197,7 +209,7 @@

    helios::vec4::vec4 ( - ) + ) @@ -227,8 +239,7 @@

    helios::vec4::vec4 ( - const std::vector< float > &  - v) + const std::vector< float > & v) @@ -257,8 +268,7 @@

    helios::vec4::vec4 ( - const float  - v[4]) + const float v[4]) @@ -287,31 +297,22 @@

    helios::vec4::vec4 ( - float  - v0, + float v0, - float  - v1, + float v1, - float  - v2, + float v2, - float  - v3  - - - - ) - + float v3 ) @@ -340,13 +341,13 @@

    float helios::vec4::magnitude ( - ) + ) const -inline +inlinenodiscard

    @@ -370,7 +371,7 @@

    vec4 helios::vec4::normalize ( - ) + ) @@ -399,8 +400,7 @@

    bool helios::vec4::operator!= ( - const vec4 &  - a) + const vec4 & a) const @@ -429,8 +429,7 @@

    float helios::vec4::operator* ( - const vec4 &  - a) + const vec4 & a) const @@ -459,8 +458,7 @@

    vec4 helios::vec4::operator* ( - float  - a) + float a) const @@ -489,8 +487,7 @@

    vec4 helios::vec4::operator+ ( - const vec4 &  - a) + const vec4 & a) const @@ -519,8 +516,7 @@

    vec4 helios::vec4::operator+ ( - float  - a) + float a) const @@ -549,8 +545,7 @@

    vec4 & helios::vec4::operator+= ( - const vec4 &  - a) + const vec4 & a) @@ -579,7 +574,7 @@

    vec4 helios::vec4::operator- ( - ) + ) const @@ -608,8 +603,7 @@

    vec4 helios::vec4::operator- ( - const vec4 &  - a) + const vec4 & a) const @@ -638,8 +632,7 @@

    vec4 helios::vec4::operator- ( - float  - a) + float a) const @@ -668,8 +661,7 @@

    vec4 & helios::vec4::operator-= ( - const vec4 &  - a) + const vec4 & a) @@ -698,8 +690,7 @@

    vec4 helios::vec4::operator/ ( - float  - a) + float a) const @@ -728,8 +719,7 @@

    bool helios::vec4::operator== ( - const vec4 &  - a) + const vec4 & a) const @@ -746,7 +736,7 @@

    Friends And Related Function Documentation

    +

    Friends And Related Symbol Documentation

    ◆ operator<<

    @@ -759,19 +749,12 @@

    std::ostream & operator<< ( - std::ostream &  - os, + std::ostream & os, - const helios::vec4 &  - vec  - - - - ) - + const helios::vec4 & vec ) @@ -866,7 +849,8 @@

    +

    diff --git a/doc/html/structjpg__error__mgr.html b/doc/html/structjpg__error__mgr.html index 39a82dcb4..eda44a86c 100644 --- a/doc/html/structjpg__error__mgr.html +++ b/doc/html/structjpg__error__mgr.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -93,9 +105,9 @@ - + - +

    Data Fields

    struct jpeg_error_mgr pub
    struct jpeg_error_mgr pub
     
    jmp_buf setjmp_buffer
    jmp_buf setjmp_buffer
     

    Detailed Description

    @@ -140,7 +152,8 @@

    +

    diff --git a/doc/html/structmy__error__mgr.html b/doc/html/structmy__error__mgr.html index 2ce3cd8ed..565f50583 100644 --- a/doc/html/structmy__error__mgr.html +++ b/doc/html/structmy__error__mgr.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    @@ -93,9 +105,9 @@ - + - +

    Data Fields

    struct jpeg_error_mgr pub
    struct jpeg_error_mgr pub
     
    jmp_buf setjmp_buffer
    jmp_buf setjmp_buffer
     

    Detailed Description

    @@ -140,7 +152,8 @@

    +

    diff --git a/doc/html/tabs.css b/doc/html/tabs.css index 89201170c..edbb42414 100644 --- a/doc/html/tabs.css +++ b/doc/html/tabs.css @@ -1 +1 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#364D7C;-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:url('tab_b.png')}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255, 255, 255, 0.9);color:#283A5D;outline:0}.sm-dox a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255, 255, 255, 0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:white}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url('tab_b.png');line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url('tab_s.png');background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent white transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:white;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555555;background-image:none;border:0 !important;color:#555555;background-image:none}.sm-dox ul a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:white;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url('tab_b.png')}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:white}} \ No newline at end of file +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#364D7C;-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:url('tab_b.png')}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255, 255, 255, 0.9);color:#283A5D;outline:0}.sm-dox a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255, 255, 255, 0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:white}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url('tab_b.png');line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url('tab_s.png');background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent white transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:white;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555555;background-image:none;border:0 !important}.sm-dox ul a:hover{background-image:url('tab_a.png');background-repeat:repeat-x;color:white;text-shadow:0px 1px 1px rgba(0, 0, 0, 1.0)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:white;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url('tab_b.png')}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:white}} diff --git a/doc/html/tomato_8cpp_source.html b/doc/html/tomato_8cpp_source.html index e516d7f44..f11efd07e 100644 --- a/doc/html/tomato_8cpp_source.html +++ b/doc/html/tomato_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    tomato.cpp
    @@ -230,6 +242,7 @@
    136
    137}
    138
    +
    139uint CanopyGenerator::tomato(const TomatoParameters &params, const vec3 &origin ){
    140
    141 std::vector<std::vector<uint> > leaf_UUIDs;
    @@ -302,40 +315,42 @@
    208 return UUID_leaf.size()-1;
    209
    210}
    +
    -
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    -
    uint tomato(const TomatoParameters &params, const helios::vec3 &origin)
    Function to add an individual tomato plant.
    Definition: tomato.cpp:139
    -
    Stores the state associated with simulation.
    Definition: Context.h:1882
    -
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition: Context.cpp:1406
    -
    float randu()
    Draw a random number from a uniform distribution between 0 and 1.
    Definition: Context.cpp:1178
    -
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition: Context.cpp:1420
    -
    std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
    Add a spherical compound object to the Context.
    Definition: Context.cpp:5646
    -
    std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition: Context.cpp:5930
    -
    std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition: Context.cpp:5809
    -
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition: global.cpp:610
    -
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition: global.cpp:617
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    -
    Parameters defining the tomato plant canopy.
    -
    int shoot_subdivisions
    Number of radial subdivisions for shoot tubes.
    -
    float leaf_length
    Maximum width of leaves.
    -
    helios::RGBcolor fruit_color
    Color of tomato fruit.
    -
    helios::int2 leaf_subdivisions
    Number of sub-division segments per leaf.
    -
    uint fruit_subdivisions
    Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
    -
    helios::RGBcolor shoot_color
    Color of shoots.
    -
    std::string leaf_texture_file
    Path to texture map file for leaves.
    -
    float plant_height
    Height of the plant.
    -
    float fruit_radius
    Radius of tomato fruit.
    -
    Vector of spherical coordinates (elevation,azimuth)
    -
    const float & elevation
    Elevation angle (radians)
    -
    float azimuth
    Azimuthal angle (radians)
    -
    Vector of three elements of type 'float'.
    -
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    +
    uint tomato(const TomatoParameters &params, const helios::vec3 &origin)
    Function to add an individual tomato plant.
    Definition tomato.cpp:139
    +
    Stores the state associated with simulation.
    Definition Context.h:1882
    +
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition Context.cpp:1406
    +
    float randu()
    Draw a random number from a uniform distribution between 0 and 1.
    Definition Context.cpp:1178
    +
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition Context.cpp:1420
    +
    std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
    Add a spherical compound object to the Context.
    Definition Context.cpp:5646
    +
    std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition Context.cpp:5930
    +
    std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition Context.cpp:5809
    +
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition global.cpp:610
    +
    vec3 sphere2cart(const SphericalCoord &Spherical)
    Convert Spherical coordinates to Cartesian coordinates.
    Definition global.cpp:617
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    +
    Parameters defining the tomato plant canopy.
    +
    int shoot_subdivisions
    Number of radial subdivisions for shoot tubes.
    +
    float leaf_length
    Maximum width of leaves.
    +
    helios::RGBcolor fruit_color
    Color of tomato fruit.
    +
    helios::int2 leaf_subdivisions
    Number of sub-division segments per leaf.
    +
    uint fruit_subdivisions
    Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
    +
    helios::RGBcolor shoot_color
    Color of shoots.
    +
    std::string leaf_texture_file
    Path to texture map file for leaves.
    +
    float plant_height
    Height of the plant.
    +
    float fruit_radius
    Radius of tomato fruit.
    +
    Vector of spherical coordinates (elevation,azimuth)
    +
    const float & elevation
    Elevation angle (radians)
    +
    float azimuth
    Azimuthal angle (radians)
    +
    Vector of three elements of type 'float'.
    +
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    diff --git a/doc/html/usergroup0.html b/doc/html/usergroup0.html index cc9b87b51..b77bdceb2 100644 --- a/doc/html/usergroup0.html +++ b/doc/html/usergroup0.html @@ -38,31 +38,43 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + +
    +
    +
    +
    diff --git a/doc/html/visualizer_basics.html b/doc/html/visualizer_basics.html index 9abb6e3ce..e75deb631 100644 --- a/doc/html/visualizer_basics.html +++ b/doc/html/visualizer_basics.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    -
    Tutorial 7: Visualizer Basics
    +
    Tutorial 7: Visualizer Basics

    In this tutorial, we will explain in more depth the use of the Visualizer plug-in functions that were shown in previous tutorials. Users are strongly encouraged to read through the detailed Visualizer Plugin Documentation.

    @@ -172,7 +184,8 @@

    +
    diff --git a/doc/html/visualizer_pdata.html b/doc/html/visualizer_pdata.html index 5c6fd26e6..b6e9ae0fb 100644 --- a/doc/html/visualizer_pdata.html +++ b/doc/html/visualizer_pdata.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    -
    Tutorial 8: Visualizing primitive data values
    +
    Tutorial 8: Visualizing primitive data values

    This tutorial will illustrate how to use the Helios visualizer to visualize primitive data based on a pseudocolor mapping. The code below gives a main.cpp file that loads in a 3D model, sets primitive data for each primitive in the model, and creates a pseudocolor mapping to visualize the primitive data distribution.

    @@ -143,7 +155,8 @@

    +
    diff --git a/doc/html/walnut_8cpp_source.html b/doc/html/walnut_8cpp_source.html index 3c665aba9..acddc98dc 100644 --- a/doc/html/walnut_8cpp_source.html +++ b/doc/html/walnut_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    walnut.cpp
    @@ -424,6 +436,7 @@
    330
    331
    332
    +
    333uint CanopyGenerator::walnut(const WalnutCanopyParameters &params, const vec3 &origin ){
    334
    335 std::vector<uint> leaf_prototype = leafPrototype( params, generator, context );
    @@ -460,55 +473,57 @@
    366 return UUID_leaf.size()-1;
    367
    368}
    +
    -
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    -
    float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
    Draw a random number (float) from a uniform distribution between -V and V.
    -
    uint walnut(const WalnutCanopyParameters &params, const helios::vec3 &origin)
    Function to add an individual walnut tree.
    Definition: walnut.cpp:333
    -
    std::vector< uint > getPrimitiveUUIDs() const
    Get the UUIDs for all primitives contained in the object.
    Definition: Context.cpp:2256
    -
    Stores the state associated with simulation.
    Definition: Context.h:1882
    -
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition: Context.cpp:1406
    -
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition: Context.cpp:1536
    -
    CompoundObject * getObjectPointer(uint ObjID) const
    Get a pointer to a Compound Object.
    Definition: Context.cpp:2574
    -
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition: Context.cpp:1420
    -
    uint copyPrimitive(uint UUID)
    Make a copy of a primitive from the context.
    Definition: Context.cpp:1578
    -
    void scalePrimitive(uint UUID, const helios::vec3 &S)
    Scale a primitive using its UUID relative to the origin (0,0,0)
    Definition: Context.cpp:1491
    -
    Tube * getTubeObjectPointer(uint ObjID) const
    Get a pointer to a Tube Compound Object.
    Definition: Context.cpp:3486
    -
    std::vector< float > getNodeRadii() const
    Get the radius at each of the tube object nodes.
    Definition: Context.cpp:3508
    -
    std::vector< helios::vec3 > getNodes() const
    Get the Cartesian coordinates of each of the tube object nodes.
    Definition: Context.cpp:3493
    -
    vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
    Rotate a 3D vector about an arbitrary line.
    Definition: global.cpp:140
    -
    uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition: Context.cpp:4728
    -
    std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
    Add a spherical compound object to the Context.
    Definition: Context.cpp:5646
    -
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition: global.cpp:610
    -
    helios::vec3 spline_interp3(float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
    Function to perform cubic Hermite spline interpolation.
    Definition: global.cpp:2768
    -
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition: Context.cpp:1328
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    -
    Parameters defining the walnut tree canopy.
    -
    int wood_subdivisions
    Number of radial subdivisions for branch tubes.
    -
    std::string fruit_texture_file
    Texture map for walnut fruit.
    -
    helios::int2 leaf_subdivisions
    Number of sub-division segments per leaf.
    -
    uint fruit_subdivisions
    Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
    -
    float trunk_radius
    Radius of trunk.
    -
    float fruit_radius
    Radius of walnuts.
    -
    std::string leaf_texture_file
    Path to texture map file for leaves.
    -
    float leaf_length
    Maximum length of leaves along midrib.
    -
    std::string wood_texture_file
    Path to texture map file for wood/branches.
    -
    helios::vec3 branch_length
    Average length of branches in each recursive branch level. For example, the first (....
    -
    float trunk_height
    Height of the trunk.
    -
    float azimuth
    Azimuthal angle (radians)
    -
    int y
    Second element in vector.
    -
    int x
    First element in vector.
    -
    Vector of two elements of type 'float'.
    -
    Vector of three elements of type 'float'.
    -
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    -
    float x
    First element in vector.
    -
    float z
    Third element in vector.
    -
    float y
    Second element in vector.
    +
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    +
    float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
    Draw a random number (float) from a uniform distribution between -V and V.
    +
    uint walnut(const WalnutCanopyParameters &params, const helios::vec3 &origin)
    Function to add an individual walnut tree.
    Definition walnut.cpp:333
    +
    std::vector< uint > getPrimitiveUUIDs() const
    Get the UUIDs for all primitives contained in the object.
    Definition Context.cpp:2256
    +
    Stores the state associated with simulation.
    Definition Context.h:1882
    +
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition Context.cpp:1406
    +
    void deletePrimitive(uint UUID)
    Delete a single primitive from the context.
    Definition Context.cpp:1536
    +
    CompoundObject * getObjectPointer(uint ObjID) const
    Get a pointer to a Compound Object.
    Definition Context.cpp:2574
    +
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition Context.cpp:1420
    +
    uint copyPrimitive(uint UUID)
    Make a copy of a primitive from the context.
    Definition Context.cpp:1578
    +
    void scalePrimitive(uint UUID, const helios::vec3 &S)
    Scale a primitive using its UUID relative to the origin (0,0,0)
    Definition Context.cpp:1491
    +
    Tube * getTubeObjectPointer(uint ObjID) const
    Get a pointer to a Tube Compound Object.
    Definition Context.cpp:3486
    +
    std::vector< float > getNodeRadii() const
    Get the radius at each of the tube object nodes.
    Definition Context.cpp:3508
    +
    std::vector< helios::vec3 > getNodes() const
    Get the Cartesian coordinates of each of the tube object nodes.
    Definition Context.cpp:3493
    +
    vec3 rotatePointAboutLine(const vec3 &point, const vec3 &line_base, const vec3 &line_direction, float theta)
    Rotate a 3D vector about an arbitrary line.
    Definition global.cpp:140
    +
    uint addTubeObject(uint radial_subdivisions, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition Context.cpp:4728
    +
    std::vector< uint > addSphere(uint Ndivs, const vec3 &center, float radius)
    Add a spherical compound object to the Context.
    Definition Context.cpp:5646
    +
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition global.cpp:610
    +
    helios::vec3 spline_interp3(float u, const vec3 &x_start, const vec3 &tan_start, const vec3 &x_end, const vec3 &tan_end)
    Function to perform cubic Hermite spline interpolation.
    Definition global.cpp:2768
    +
    uint addTriangle(const helios::vec3 &vertex0, const helios::vec3 &vertex1, const helios::vec3 &vertex2)
    Add new Triangle geometric primitive.
    Definition Context.cpp:1328
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    vec3 cross(const vec3 &a, const vec3 &b)
    Cross product of two vec3 vectors.
    +
    Parameters defining the walnut tree canopy.
    +
    int wood_subdivisions
    Number of radial subdivisions for branch tubes.
    +
    std::string fruit_texture_file
    Texture map for walnut fruit.
    +
    helios::int2 leaf_subdivisions
    Number of sub-division segments per leaf.
    +
    uint fruit_subdivisions
    Number of azimuthal and zenithal subdivisions making up fruit (will result in roughly fruit_subdivisi...
    +
    float trunk_radius
    Radius of trunk.
    +
    float fruit_radius
    Radius of walnuts.
    +
    std::string leaf_texture_file
    Path to texture map file for leaves.
    +
    float leaf_length
    Maximum length of leaves along midrib.
    +
    std::string wood_texture_file
    Path to texture map file for wood/branches.
    +
    helios::vec3 branch_length
    Average length of branches in each recursive branch level. For example, the first (....
    +
    float trunk_height
    Height of the trunk.
    +
    float azimuth
    Azimuthal angle (radians)
    +
    int y
    Second element in vector.
    +
    int x
    First element in vector.
    +
    Vector of two elements of type 'float'.
    +
    Vector of three elements of type 'float'.
    +
    vec3 normalize()
    Normalize vector components such that the magnitude is unity.
    +
    float x
    First element in vector.
    +
    float z
    Third element in vector.
    +
    float y
    Second element in vector.
    +
    diff --git a/doc/html/whitespruce_8cpp_source.html b/doc/html/whitespruce_8cpp_source.html index 74ba2bc76..5b3813983 100644 --- a/doc/html/whitespruce_8cpp_source.html +++ b/doc/html/whitespruce_8cpp_source.html @@ -38,30 +38,41 @@ Logo -
     v1.3.25 +
     v1.3.26
    - + + + +
    +
    whitespruce.cpp
    @@ -97,6 +109,7 @@
    3using namespace helios;
    4using namespace std;
    5
    +
    7
    8 vector<uint> U;
    @@ -243,39 +256,41 @@
    149 return UUID_leaf.size()-1;
    150
    151}
    +
    -
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    -
    float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
    Draw a random number (float) from a uniform distribution between -V and V.
    -
    uint whitespruce(const WhiteSpruceCanopyParameters &params, const helios::vec3 &origin)
    Function to add an individual white spruce tree.
    Definition: whitespruce.cpp:6
    -
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition: Context.cpp:1406
    -
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition: Context.cpp:1420
    -
    std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition: Context.cpp:5930
    -
    std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition: Context.cpp:5809
    -
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition: global.cpp:610
    -
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    -
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    -
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    -
    Parameters defining the white spruce.
    -
    helios::int2 needle_subdivisions
    Number of sub-division segments per needle.
    -
    std::string wood_texture_file
    Path to texture map file for trunks/branches.
    -
    float needle_length
    Length of needles.
    -
    float trunk_height
    Distance between the ground and top of trunks.
    -
    float level_spacing
    Vertical spacing between branching levels.
    -
    float shoot_radius
    Radius of shoot branches.
    -
    int wood_subdivisions
    Number of radial subdivisions for trunk/cordon/shoot tubes.
    -
    float base_height
    Height at which branches start.
    -
    float crown_radius
    Radius of the crown at the base.
    -
    helios::RGBcolor needle_color
    Color of needles.
    -
    float trunk_radius
    Radius of the trunk at the base.
    -
    int branches_per_level
    Number of primary branches on the bottom level.
    -
    Vector of spherical coordinates (elevation,azimuth)
    -
    const float & elevation
    Elevation angle (radians)
    -
    float azimuth
    Azimuthal angle (radians)
    -
    Vector of three elements of type 'float'.
    +
    helios::vec3 interpolateTube(const std::vector< helios::vec3 > &P, float frac)
    Interpolate the position of a point along a tube.
    +
    float getVariation(float V, std::minstd_rand0 &generator, bool positive=false)
    Draw a random number (float) from a uniform distribution between -V and V.
    +
    uint whitespruce(const WhiteSpruceCanopyParameters &params, const helios::vec3 &origin)
    Function to add an individual white spruce tree.
    +
    void translatePrimitive(uint UUID, const vec3 &shift)
    Translate a primitive using its UUID.
    Definition Context.cpp:1406
    +
    void rotatePrimitive(uint UUID, float rot, const char *axis)
    Rotate a primitive about the x, y, or z axis using its UUID.
    Definition Context.cpp:1420
    +
    std::vector< uint > addTube(uint Ndivs, const std::vector< vec3 > &nodes, const std::vector< float > &radius)
    Add a 3D tube compound object to the Context.
    Definition Context.cpp:5930
    +
    std::vector< uint > addTile(const vec3 &center, const vec2 &size, const SphericalCoord &rotation, const int2 &subdiv)
    Add a patch that is subdivided into a regular grid of sub-patches (tiled)
    Definition Context.cpp:5809
    +
    SphericalCoord cart2sphere(const vec3 &Cartesian)
    Convert Cartesian coordinates to spherical coordinates.
    Definition global.cpp:610
    +
    vec2 make_vec2(float x, float y)
    Make a vec2 from two floats.
    +
    vec3 make_vec3(float x, float y, float z)
    Make a vec3 from three floats.
    +
    SphericalCoord make_SphericalCoord(float elevation_radians, float azimuth_radians)
    Make a SphericalCoord by specifying elevation and azimuth.
    +
    Parameters defining the white spruce.
    +
    helios::int2 needle_subdivisions
    Number of sub-division segments per needle.
    +
    std::string wood_texture_file
    Path to texture map file for trunks/branches.
    +
    float needle_length
    Length of needles.
    +
    float trunk_height
    Distance between the ground and top of trunks.
    +
    float level_spacing
    Vertical spacing between branching levels.
    +
    float shoot_radius
    Radius of shoot branches.
    +
    int wood_subdivisions
    Number of radial subdivisions for trunk/cordon/shoot tubes.
    +
    float base_height
    Height at which branches start.
    +
    float crown_radius
    Radius of the crown at the base.
    +
    helios::RGBcolor needle_color
    Color of needles.
    +
    float trunk_radius
    Radius of the trunk at the base.
    +
    int branches_per_level
    Number of primary branches on the bottom level.
    +
    Vector of spherical coordinates (elevation,azimuth)
    +
    const float & elevation
    Elevation angle (radians)
    +
    float azimuth
    Azimuthal angle (radians)
    +
    Vector of three elements of type 'float'.
    +
    diff --git a/plugins/plantarchitecture/doc/PlantArchitecture.dox b/plugins/plantarchitecture/doc/PlantArchitecture.dox index a4f00ac80..9155a8f48 100755 --- a/plugins/plantarchitecture/doc/PlantArchitecture.dox +++ b/plugins/plantarchitecture/doc/PlantArchitecture.dox @@ -303,7 +303,7 @@ The table below lists the parameters that define the geometry of the phytomer, a | --- **internode** --- |||| | pitch | RandomParameter_float | degrees | Angle of the phytomer internode with respect to the previous phytomer along the shoot. Setting this >0 creates a zig-zag shoot. | | phyllotactic_angle | RandomParameter_float | degrees | Angle between the petioles/buds of two successive phytomers along the shoot. See this page for more information on phyllotaxis. | -| radius_initial | RandomParameter_float | 0.001 | meters | Initial radius of the internode when it is created. | +| radius_initial | RandomParameter_float | meters | Initial radius of the internode when it is created. | | max_vegetative_buds_per_petiole | RandomParameter_int | - | Maximum number of possible vegetative nodes per petiole. Some of these buds may not break depending on the vegetative bud break probability. | | max_floral_buds_per_petiole | RandomParameter_int | - | Maximum number of possible floral nodes per petiole. Some of these buds may not break depending on the flower bud break probability. | | color | helios::RGBcolor | - | Diffuse color of the internode tube. | diff --git a/plugins/plantarchitecture/include/PlantArchitecture.h b/plugins/plantarchitecture/include/PlantArchitecture.h index 85fc82d14..cabadd5db 100644 --- a/plugins/plantarchitecture/include/PlantArchitecture.h +++ b/plugins/plantarchitecture/include/PlantArchitecture.h @@ -1409,6 +1409,43 @@ class PlantArchitecture{ */ float sumPlantLeafArea(uint plantID) const; + //! Calculate the height of the last internode on the base stem/shoot + /** + * \param[in] plantID ID of the plant instance. + * \return Height of the last internode on the base stem/shoot. + */ + float getPlantStemHeight(uint plantID) const; + + //! Calculate the height of the highest element in the plant + /** + * \param[in] plantID ID of the plant instance. + * \return Height of the highest element in the plant. + */ + float getPlantHeight(uint plantID) const; + + //! Calculate the leaf angle distribution of all leaves in the plant. + /** + * \param[in] plantID ID of the plant instance. + * \param[in] Nbins Number of bins for the histogram. + * \param[in] normalize [OPTIONAL] Normalize the histogram to integrate to 1. + * \return Histogram of leaf inclination angles. Bins are evenly spaced between 0 and 90 degrees. + */ + std::vector getPlantLeafInclinationAngleDistribution(uint plantID, uint Nbins, bool normalize=false) const; + + //! Get the total number of leaves on the plant + /** + * \param[in] plantID ID of the plant instance. + * \return Total number of leaves on the plant. + */ + uint getPlantLeafCount(uint plantID) const; + + //! Write all vertices in the plant to a file for external processing (e.g., bounding volume, convex hull) + /** + * \param[in] plantID ID of the plant instance. + * \param[in] filename Name/path of the output file. + */ + void writePlantMeshVertices(uint plantID, const std::string &filename) const; + //! Get object IDs for all organs objects for a given plant /** * \param[in] plantID ID of the plant instance. diff --git a/plugins/plantarchitecture/src/PlantArchitecture.cpp b/plugins/plantarchitecture/src/PlantArchitecture.cpp index e610c0bdc..35b109a5d 100644 --- a/plugins/plantarchitecture/src/PlantArchitecture.cpp +++ b/plugins/plantarchitecture/src/PlantArchitecture.cpp @@ -2237,7 +2237,7 @@ helios::vec3 PlantArchitecture::getPlantBasePosition(uint plantID) const{ float PlantArchitecture::sumPlantLeafArea(uint plantID) const{ - if( plantID>=plant_instances.size() ){ + if( plant_instances.find(plantID) == plant_instances.end() ){ helios_runtime_error("ERROR (PlantArchitecture::sumPlantLeafArea): Plant with ID of " + std::to_string(plantID) + " does not exist."); } @@ -2251,6 +2251,123 @@ float PlantArchitecture::sumPlantLeafArea(uint plantID) const{ return area; } +float PlantArchitecture::getPlantStemHeight(uint plantID) const { + + if( plant_instances.find(plantID) == plant_instances.end() ){ + helios_runtime_error("ERROR (PlantArchitecture::getPlantStemHeight): Plant with ID of " + std::to_string(plantID) + " does not exist."); + } + + auto base_shoot_ptr = plant_instances.at(plantID).shoot_tree.front(); + + std::vector stem_objID{base_shoot_ptr->internode_tube_objID}; + + if( !context_ptr->doesObjectExist(stem_objID.front()) ){ + helios_runtime_error("ERROR (PlantArchitecture::getPlantStemHeight): The plant does not contain any geometry."); + } + + //check if there was an appended shoot on this same shoot + if ( base_shoot_ptr->childIDs.find(base_shoot_ptr->current_node_number-1) != base_shoot_ptr->childIDs.end() ) { + auto terminal_children = base_shoot_ptr->childIDs.at(base_shoot_ptr->current_node_number-1); + for ( uint childID : terminal_children ) { + auto child_shoot_ptr = plant_instances.at(plantID).shoot_tree.at(childID); + if ( child_shoot_ptr->rank == base_shoot_ptr->rank ) { + if ( context_ptr->doesObjectExist(child_shoot_ptr->internode_tube_objID)) { + stem_objID.push_back(child_shoot_ptr->internode_tube_objID); + } + } + } + + } + + vec3 min_box; + vec3 max_box; + context_ptr->getObjectBoundingBox( stem_objID, min_box, max_box); + + return max_box.z - min_box.z; + +} + + +float PlantArchitecture::getPlantHeight(uint plantID) const{ + + if( plant_instances.find(plantID) == plant_instances.end() ) { + helios_runtime_error("ERROR (PlantArchitecture::getPlantHeight): Plant with ID of " + std::to_string(plantID) + " does not exist."); + } + + vec3 min_box; + vec3 max_box; + context_ptr->getObjectBoundingBox(getAllPlantObjectIDs(plantID), min_box, max_box); + + return max_box.z - min_box.z; + +} + +std::vector PlantArchitecture::getPlantLeafInclinationAngleDistribution(uint plantID, uint Nbins, bool normalize) const { + + if( plant_instances.find(plantID) == plant_instances.end() ){ + helios_runtime_error("ERROR (PlantArchitecture::getPlantLeafInclinationAngleDistribution): Plant with ID of " + std::to_string(plantID) + " does not exist."); + } + + std::vector leaf_objIDs = getPlantLeafObjectIDs(plantID); + std::vector leaf_UUIDs = context_ptr->getObjectPrimitiveUUIDs(leaf_objIDs); + + std::vector leaf_inclination_angles(Nbins); + float dtheta = 0.5f * PI_F / float(Nbins); + for( uint UUID : leaf_UUIDs ){ + vec3 normal = context_ptr->getPrimitiveNormal(UUID); + float theta = acos_safe(fabs(normal.z)); + uint bin = uint( std::floor(theta / dtheta) ); + leaf_inclination_angles.at(bin)++; + } + + if( normalize ){ + float sum = helios::sum(leaf_inclination_angles); + for( float &angle : leaf_inclination_angles ){ + angle /= sum; + } + } + + return leaf_inclination_angles; + +} + + +uint PlantArchitecture::getPlantLeafCount(uint plantID) const { + + if( plant_instances.find(plantID) == plant_instances.end() ){ + helios_runtime_error("ERROR (PlantArchitecture::getPlantLeafCount): Plant with ID of " + std::to_string(plantID) + " does not exist."); + } + + return getPlantLeafObjectIDs(plantID).size(); + +} + +void PlantArchitecture::writePlantMeshVertices(uint plantID, const std::string &filename) const{ + + if( plant_instances.find(plantID) == plant_instances.end() ){ + helios_runtime_error("ERROR (PlantArchitecture::writePlantMeshVertices): Plant with ID of " + std::to_string(plantID) + " does not exist."); + } + + std::vector plant_UUIDs = getAllPlantUUIDs(plantID); + + std::ofstream file; + file.open(filename); + + if( !file.is_open() ){ + helios_runtime_error("ERROR (PlantArchitecture::writePlantMeshVertices): Could not open file " + filename + " for writing."); + } + + for( uint UUID : plant_UUIDs ){ + std::vector vertex = context_ptr->getPrimitiveVertices(UUID); + for( vec3 &v : vertex ){ + file << v.x << " " << v.y << " " << v.z << std::endl; + } + } + + file.close(); + +} + void PlantArchitecture::setPlantAge(uint plantID, float a_current_age) { //\todo // this->current_age = current_age; diff --git a/plugins/radiation/doc/Radiation.dox b/plugins/radiation/doc/Radiation.dox index bb4153177..bae827a71 100755 --- a/plugins/radiation/doc/Radiation.dox +++ b/plugins/radiation/doc/Radiation.dox @@ -273,7 +273,7 @@ If you are using a PC, it is likely you will need to increase the GPU timeout in context.setPrimitiveData( UUID, "transmissivity_spectrum", "grape_leaf_transmissivity_0000" ); // Declare the radiation model - %RadiationModel radiationmodel(&context); + RadiationModel radiationmodel(&context); // Add a band with explicit wavelength bounds (400-700nm) radiationmodel.addRadiationBand( "PAR", 400, 700 ); diff --git a/plugins/visualizer/doc/Visualizer.dox b/plugins/visualizer/doc/Visualizer.dox index 24773113b..6fe359dd6 100755 --- a/plugins/visualizer/doc/Visualizer.dox +++ b/plugins/visualizer/doc/Visualizer.dox @@ -65,13 +65,13 @@ The class associated with the visualization is called Visualizer. The class constructor takes one or two arguments that specifies the size of the graphics window. If only one argument is provided (see \ref Visualizer( uint Wdisplay )), the argument is an integer that specifies the width of the diplay window in pixels, with the hight of the window specified according to the default aspect ratio. If two arguments are provided (see \ref Visualizer( uint Wdisplay, uint Hdisplay )), the two arguments correspond respectively to the width and height of the display window in pixels. Below is an example program: -
    -
     #include "Visualizer.h"
    +  ~~~~~~{.cpp}
    +  #include "Visualizer.h"
     	
    -  int main( void ){
    -      %Visualizer vis( 1200 ); //Opens a graphics window of width 1200 pixels with default aspect ratio
    -  }
    -
    + int main(){ + Visualizer vis( 1200 ); //Opens a graphics window of width 1200 pixels with default aspect ratio + } + ~~~~~~ \section UseVis Using the Visualizer Plug-in @@ -99,16 +99,16 @@ Below is an example of opening a window (blank), exporting its contents to file, then closing the window: -
    -
     #include "Visualizer.h"
    +  ~~~~~~{.cpp}
    +   #include "Visualizer.h"
     	
    -   int main( void ){
    -      %Visualizer vis( 1200 );
    +   int main(){
    +      Visualizer vis( 1200 );
           vis.plotUpdate(); //we have not added geometry, so window is blank
           vis.printWindow("blank_window.jpg");
           vis.closeWindow();
    -    }
    -
    + } + ~~~~~~