18using namespace helios;
20void Context::incrementPrimitiveDataLabelCounter(
const std::string &primitive_data_label) {
21 primitive_data_label_counts[primitive_data_label]++;
24void Context::decrementPrimitiveDataLabelCounter(
const std::string &primitive_data_label) {
25 auto it = primitive_data_label_counts.find(primitive_data_label);
26 if (it != primitive_data_label_counts.end() && it->second > 0) {
28 if (it->second == 0) {
29 primitive_data_label_counts.erase(it);
32 primitive_data_type_registry.erase(primitive_data_label);
40 cached_primitive_data_labels.insert(label);
44 cached_primitive_data_labels.erase(label);
46 primitive_string_value_registry.erase(label);
47 primitive_int_value_registry.erase(label);
48 primitive_uint_value_registry.erase(label);
52 return cached_primitive_data_labels.find(label) != cached_primitive_data_labels.end();
56 cached_object_data_labels.insert(label);
60 cached_object_data_labels.erase(label);
62 object_string_value_registry.erase(label);
63 object_int_value_registry.erase(label);
64 object_uint_value_registry.erase(label);
68 return cached_object_data_labels.find(label) != cached_object_data_labels.end();
72void Context::incrementObjectDataLabelCounter(
const std::string &object_data_label) {
73 object_data_label_counts[object_data_label]++;
76void Context::decrementObjectDataLabelCounter(
const std::string &object_data_label) {
77 auto it = object_data_label_counts.find(object_data_label);
78 if (it != object_data_label_counts.end() && it->second > 0) {
80 if (it->second == 0) {
81 object_data_label_counts.erase(it);
84 object_data_type_registry.erase(object_data_label);
91HeliosDataType Primitive::getPrimitiveDataType(
const char *label)
const {
94 if (!doesPrimitiveDataExist(label)) {
95 helios_runtime_error(
"ERROR (Primitive::getPrimitiveDataType): Primitive data " + std::string(label) +
" does not exist for primitive " + std::to_string(UUID));
99 return primitive_data_types.at(label);
103 const auto it = primitive_data_type_registry.find(label);
104 if (it != primitive_data_type_registry.end()) {
107 helios_runtime_error(
"ERROR (Context::getPrimitiveDataType): Primitive data " + std::string(label) +
" does not exist.");
111uint Primitive::getPrimitiveDataSize(
const char *label)
const {
114 if (!doesPrimitiveDataExist(label)) {
115 helios_runtime_error(
"ERROR (Primitive::getPrimitiveDataSize): Primitive data " + std::string(label) +
" does not exist for primitive " + std::to_string(UUID));
121 if (type == HELIOS_TYPE_INT) {
122 return primitive_data_int.at(label).size();
123 }
else if (type == HELIOS_TYPE_UINT) {
124 return primitive_data_uint.at(label).size();
125 }
else if (type == HELIOS_TYPE_FLOAT) {
126 return primitive_data_float.at(label).size();
127 }
else if (type == HELIOS_TYPE_DOUBLE) {
128 return primitive_data_double.at(label).size();
129 }
else if (type == HELIOS_TYPE_VEC2) {
130 return primitive_data_vec2.at(label).size();
131 }
else if (type == HELIOS_TYPE_VEC3) {
132 return primitive_data_vec3.at(label).size();
133 }
else if (type == HELIOS_TYPE_VEC4) {
134 return primitive_data_vec4.at(label).size();
135 }
else if (type == HELIOS_TYPE_INT2) {
136 return primitive_data_int2.at(label).size();
137 }
else if (type == HELIOS_TYPE_INT3) {
138 return primitive_data_int3.at(label).size();
139 }
else if (type == HELIOS_TYPE_INT4) {
140 return primitive_data_int4.at(label).size();
141 }
else if (type == HELIOS_TYPE_STRING) {
142 return primitive_data_string.at(label).size();
150void Primitive::clearPrimitiveData(
const char *label) {
152 if (!doesPrimitiveDataExist(label)) {
158 if (type == HELIOS_TYPE_INT) {
159 primitive_data_int.erase(label);
160 primitive_data_types.erase(label);
161 }
else if (type == HELIOS_TYPE_UINT) {
162 primitive_data_uint.erase(label);
163 primitive_data_types.erase(label);
164 }
else if (type == HELIOS_TYPE_FLOAT) {
165 primitive_data_float.erase(label);
166 primitive_data_types.erase(label);
167 }
else if (type == HELIOS_TYPE_DOUBLE) {
168 primitive_data_double.erase(label);
169 primitive_data_types.erase(label);
170 }
else if (type == HELIOS_TYPE_VEC2) {
171 primitive_data_vec2.erase(label);
172 primitive_data_types.erase(label);
173 }
else if (type == HELIOS_TYPE_VEC3) {
174 primitive_data_vec3.erase(label);
175 primitive_data_types.erase(label);
176 }
else if (type == HELIOS_TYPE_VEC4) {
177 primitive_data_vec4.erase(label);
178 primitive_data_types.erase(label);
179 }
else if (type == HELIOS_TYPE_INT2) {
180 primitive_data_int2.erase(label);
181 primitive_data_types.erase(label);
182 }
else if (type == HELIOS_TYPE_INT3) {
183 primitive_data_int3.erase(label);
184 primitive_data_types.erase(label);
185 }
else if (type == HELIOS_TYPE_INT4) {
186 primitive_data_int4.erase(label);
187 primitive_data_types.erase(label);
188 }
else if (type == HELIOS_TYPE_STRING) {
189 primitive_data_string.erase(label);
190 primitive_data_types.erase(label);
197bool Primitive::doesPrimitiveDataExist(
const char *label)
const {
198 if (primitive_data_types.find(std::string(label)) == primitive_data_types.end()) {
204std::vector<std::string> Primitive::listPrimitiveData()
const {
206 std::vector<std::string> labels;
207 labels.reserve(primitive_data_types.size());
209 for (
const auto &[label, type]: primitive_data_types) {
210 labels.push_back(label);
218 if (primitives.find(UUID) == primitives.end()) {
219 helios_runtime_error(
"ERROR (Context::getPrimitiveDataType): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
222 return primitives.at(UUID)->getPrimitiveDataType(label);
227 if (primitives.find(UUID) == primitives.end()) {
228 helios_runtime_error(
"ERROR (Context::getPrimitiveDataSize): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
231 return primitives.at(UUID)->getPrimitiveDataSize(label);
236 if (primitives.find(UUID) == primitives.end()) {
237 helios_runtime_error(
"ERROR (Context::doesPrimitiveDataExist): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
240 return primitives.at(UUID)->doesPrimitiveDataExist(label);
245 if (primitives.find(UUID) == primitives.end()) {
246 helios_runtime_error(
"ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
250 std::string label_str = std::string(label);
252 HeliosDataType data_type = primitives.at(UUID)->getPrimitiveDataType(label);
254 std::string cached_value;
255 primitives.at(UUID)->getPrimitiveData(label, cached_value);
259 primitives.at(UUID)->getPrimitiveData(label, cached_value);
263 primitives.at(UUID)->getPrimitiveData(label, cached_value);
268 if (primitives.at(UUID)->doesPrimitiveDataExist(label)) {
269 decrementPrimitiveDataLabelCounter(label);
271 primitives.at(UUID)->clearPrimitiveData(label);
275 for (
unsigned int UUID: UUIDs) {
277 if (primitives.find(UUID) == primitives.end()) {
278 helios_runtime_error(
"ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
282 std::string label_str = std::string(label);
284 HeliosDataType data_type = primitives.at(UUID)->getPrimitiveDataType(label);
286 std::string cached_value;
287 primitives.at(UUID)->getPrimitiveData(label, cached_value);
291 primitives.at(UUID)->getPrimitiveData(label, cached_value);
295 primitives.at(UUID)->getPrimitiveData(label, cached_value);
300 if (primitives.at(UUID)->doesPrimitiveDataExist(label)) {
301 decrementPrimitiveDataLabelCounter(label);
303 primitives.at(UUID)->clearPrimitiveData(label);
310 std::string label_str(label);
312 for (
const auto &[UUID, primitive]: primitives) {
313 if (!primitive->doesPrimitiveDataExist(label)) {
316 if (caching_enabled) {
317 HeliosDataType data_type = primitive->getPrimitiveDataType(label);
319 std::string cached_value;
320 primitive->getPrimitiveData(label, cached_value);
324 primitive->getPrimitiveData(label, cached_value);
328 primitive->getPrimitiveData(label, cached_value);
332 decrementPrimitiveDataLabelCounter(label);
333 primitive->clearPrimitiveData(label);
337 primitive_data_label_counts.erase(label_str);
338 primitive_data_type_registry.erase(label_str);
344 if (primitives.find(sourceUUID) == primitives.end()) {
345 helios_runtime_error(
"ERROR (Context::copyPrimitiveData): Source UUID of " + std::to_string(sourceUUID) +
" does not exist in the Context.");
346 }
else if (primitives.find(destinationUUID) == primitives.end()) {
347 helios_runtime_error(
"ERROR (Context::copyPrimitiveData): Destination UUID of " + std::to_string(destinationUUID) +
" does not exist in the Context.");
351 const auto &dest_labels = primitives.at(destinationUUID)->primitive_data_types;
352 for (
const auto &[label, type]: dest_labels) {
353 decrementPrimitiveDataLabelCounter(label);
356 primitives.at(destinationUUID)->primitive_data_types = primitives.at(sourceUUID)->primitive_data_types;
358 primitives.at(destinationUUID)->primitive_data_int = primitives.at(sourceUUID)->primitive_data_int;
359 primitives.at(destinationUUID)->primitive_data_uint = primitives.at(sourceUUID)->primitive_data_uint;
360 primitives.at(destinationUUID)->primitive_data_float = primitives.at(sourceUUID)->primitive_data_float;
361 primitives.at(destinationUUID)->primitive_data_double = primitives.at(sourceUUID)->primitive_data_double;
362 primitives.at(destinationUUID)->primitive_data_vec2 = primitives.at(sourceUUID)->primitive_data_vec2;
363 primitives.at(destinationUUID)->primitive_data_vec3 = primitives.at(sourceUUID)->primitive_data_vec3;
364 primitives.at(destinationUUID)->primitive_data_vec4 = primitives.at(sourceUUID)->primitive_data_vec4;
365 primitives.at(destinationUUID)->primitive_data_int2 = primitives.at(sourceUUID)->primitive_data_int2;
366 primitives.at(destinationUUID)->primitive_data_int3 = primitives.at(sourceUUID)->primitive_data_int3;
367 primitives.at(destinationUUID)->primitive_data_int4 = primitives.at(sourceUUID)->primitive_data_int4;
368 primitives.at(destinationUUID)->primitive_data_string = primitives.at(sourceUUID)->primitive_data_string;
370 for (
const auto &[label, type]: primitives.at(destinationUUID)->primitive_data_types) {
371 incrementPrimitiveDataLabelCounter(label);
374 primitives.at(destinationUUID)->dirty_flag =
true;
380 if (primitives.find(UUID) == primitives.end()) {
381 helios_runtime_error(
"ERROR (Context::renamePrimitiveData): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
382 }
else if (!primitives.at(UUID)->doesPrimitiveDataExist(old_label)) {
383 helios_runtime_error(
"ERROR (Context::renamePrimitiveData): Primitive data of " + std::string(old_label) +
" does not exist for primitive " + std::to_string(UUID) +
".");
389 primitives.at(UUID)->dirty_flag =
true;
395 if (primitives.find(UUID) == primitives.end()) {
396 helios_runtime_error(
"ERROR (Context::duplicatePrimitiveData): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
397 }
else if (!primitives.at(UUID)->doesPrimitiveDataExist(old_label)) {
398 helios_runtime_error(
"ERROR (Context::duplicatePrimitiveData): Primitive data of " + std::string(old_label) +
" does not exist for primitive " + std::to_string(UUID) +
".");
404 if (!primitives.at(UUID)->doesPrimitiveDataExist(new_label)) {
405 incrementPrimitiveDataLabelCounter(new_label);
407 primitives.at(UUID)->primitive_data_types[new_label] = type;
409 primitives.at(UUID)->primitive_data_int[new_label] = primitives.at(UUID)->primitive_data_int.at(old_label);
411 primitives.at(UUID)->primitive_data_uint[new_label] = primitives.at(UUID)->primitive_data_uint.at(old_label);
413 primitives.at(UUID)->primitive_data_float[new_label] = primitives.at(UUID)->primitive_data_float.at(old_label);
415 primitives.at(UUID)->primitive_data_double[new_label] = primitives.at(UUID)->primitive_data_double.at(old_label);
417 primitives.at(UUID)->primitive_data_vec2[new_label] = primitives.at(UUID)->primitive_data_vec2.at(old_label);
419 primitives.at(UUID)->primitive_data_vec3[new_label] = primitives.at(UUID)->primitive_data_vec3.at(old_label);
421 primitives.at(UUID)->primitive_data_vec4[new_label] = primitives.at(UUID)->primitive_data_vec4.at(old_label);
423 primitives.at(UUID)->primitive_data_int2[new_label] = primitives.at(UUID)->primitive_data_int2.at(old_label);
425 primitives.at(UUID)->primitive_data_int3[new_label] = primitives.at(UUID)->primitive_data_int3.at(old_label);
427 primitives.at(UUID)->primitive_data_int4[new_label] = primitives.at(UUID)->primitive_data_int4.at(old_label);
429 primitives.at(UUID)->primitive_data_string[new_label] = primitives.at(UUID)->primitive_data_string.at(old_label);
434 primitives.at(UUID)->dirty_flag =
true;
438 return getPrimitivePointer_private(UUID)->listPrimitiveData();
442 for (
auto &[UUID, primitive]: primitives) {
443 if (primitive->doesPrimitiveDataExist(existing_data_label)) {
444 const HeliosDataType type = primitive->getPrimitiveDataType(existing_data_label);
445 if (!primitive->doesPrimitiveDataExist(copy_data_label)) {
446 incrementPrimitiveDataLabelCounter(copy_data_label);
448 primitive->primitive_data_types[copy_data_label] = type;
450 primitive->primitive_data_float[copy_data_label] = primitive->primitive_data_float.at(existing_data_label);
452 primitive->primitive_data_double[copy_data_label] = primitive->primitive_data_double.at(existing_data_label);
454 primitive->primitive_data_int[copy_data_label] = primitive->primitive_data_int.at(existing_data_label);
456 primitive->primitive_data_uint[copy_data_label] = primitive->primitive_data_uint.at(existing_data_label);
458 primitive->primitive_data_vec2[copy_data_label] = primitive->primitive_data_vec2.at(existing_data_label);
460 primitive->primitive_data_vec3[copy_data_label] = primitive->primitive_data_vec3.at(existing_data_label);
462 primitive->primitive_data_vec4[copy_data_label] = primitive->primitive_data_vec4.at(existing_data_label);
464 primitive->primitive_data_int2[copy_data_label] = primitive->primitive_data_int2.at(existing_data_label);
466 primitive->primitive_data_int3[copy_data_label] = primitive->primitive_data_int3.at(existing_data_label);
468 primitive->primitive_data_string[copy_data_label] = primitive->primitive_data_string.at(existing_data_label);
470 primitive->dirty_flag =
true;
479 for (
uint UUID: UUIDs) {
489 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
500 for (
uint UUID: UUIDs) {
510 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
521 for (
uint UUID: UUIDs) {
531 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
542 for (
uint UUID: UUIDs) {
552 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
563 for (
uint UUID: UUIDs) {
573 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
583 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): Object ID of " + std::to_string(objID) +
" does not exist in the Context.");
591 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): Object ID " + std::to_string(objID) +
" has no primitive children.");
596 for (
uint UUID: UUIDs) {
604 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): Primitive data '" + label +
"' does not exist for any primitives in object " + std::to_string(objID) +
".");
609 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): Cannot calculate mean for primitive data type. Only float, double, vec2, vec3, and vec4 are supported.");
617 for (
uint UUID: UUIDs) {
625 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
627 float mean =
sum / float(count);
634 for (
uint UUID: UUIDs) {
642 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
644 double mean =
sum / double(count);
651 for (
uint UUID: UUIDs) {
659 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
668 for (
uint UUID: UUIDs) {
676 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
685 for (
uint UUID: UUIDs) {
693 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
704 bool nan_warning =
false;
705 for (
uint UUID: UUIDs) {
719 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
721 }
else if (nan_warning) {
722 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
724 awt_mean =
sum / area;
733 bool nan_warning =
false;
734 for (
uint UUID: UUIDs) {
742 sum += value * double(A);
748 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
750 }
else if (nan_warning) {
751 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
753 awt_mean =
sum / area;
761 bool nan_warning =
false;
762 for (
uint UUID: UUIDs) {
776 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
778 }
else if (nan_warning) {
779 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
781 awt_mean =
sum / area;
789 bool nan_warning =
false;
790 for (
uint UUID: UUIDs) {
804 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
806 }
else if (nan_warning) {
807 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
809 awt_mean =
sum / area;
817 bool nan_warning =
false;
818 for (
uint UUID: UUIDs) {
832 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
834 }
else if (nan_warning) {
835 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
837 awt_mean =
sum / area;
845 bool added_to_sum =
false;
846 for (
uint UUID: UUIDs) {
856 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
864 bool added_to_sum =
false;
865 for (
uint UUID: UUIDs) {
875 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
883 bool added_to_sum =
false;
884 for (
uint UUID: UUIDs) {
894 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
902 bool added_to_sum =
false;
903 for (
uint UUID: UUIDs) {
913 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
921 bool added_to_sum =
false;
922 for (
uint UUID: UUIDs) {
932 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
940 bool added_to_sum =
false;
941 bool nan_warning =
false;
942 for (
uint UUID: UUIDs) {
946 if (std::isnan(area)) {
951 awt_sum += value * area;
957 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
958 }
else if (nan_warning) {
959 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
967 bool added_to_sum =
false;
968 bool nan_warning =
false;
969 for (
uint UUID: UUIDs) {
973 if (std::isnan(area)) {
978 awt_sum += value * area;
984 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
985 }
else if (nan_warning) {
986 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
994 bool added_to_sum =
false;
995 bool nan_warning =
false;
996 for (
uint UUID: UUIDs) {
1000 if (std::isnan(area)) {
1005 awt_sum = awt_sum + value * area;
1006 added_to_sum =
true;
1010 if (!added_to_sum) {
1011 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
1012 }
else if (nan_warning) {
1013 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
1021 bool added_to_sum =
false;
1022 bool nan_warning =
false;
1023 for (
uint UUID: UUIDs) {
1027 if (std::isnan(area)) {
1032 awt_sum = awt_sum + value * area;
1033 added_to_sum =
true;
1037 if (!added_to_sum) {
1038 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
1039 }
else if (nan_warning) {
1040 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
1047 awt_sum =
make_vec4(0.f, 0.f, 0.f, 0.F);
1048 bool added_to_sum =
false;
1049 bool nan_warning =
false;
1050 for (
uint UUID: UUIDs) {
1054 if (std::isnan(area)) {
1059 awt_sum = awt_sum + value * area;
1060 added_to_sum =
true;
1064 if (!added_to_sum) {
1065 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
1066 }
else if (nan_warning) {
1067 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
1073 uint primitives_not_exist = 0;
1074 uint primitive_data_not_exist = 0;
1075 for (
uint UUID: UUIDs) {
1077 primitives_not_exist++;
1081 primitive_data_not_exist++;
1086 for (
float &data: primitives.at(UUID)->primitive_data_float[label]) {
1087 data *= scaling_factor;
1090 for (
double &data: primitives.at(UUID)->primitive_data_double[label]) {
1091 data *= scaling_factor;
1094 for (
auto &data: primitives.at(UUID)->primitive_data_vec2[label]) {
1095 data.x *= scaling_factor;
1096 data.y *= scaling_factor;
1099 for (
auto &data: primitives.at(UUID)->primitive_data_vec3[label]) {
1100 data.x *= scaling_factor;
1101 data.y *= scaling_factor;
1102 data.z *= scaling_factor;
1105 for (
auto &data: primitives.at(UUID)->primitive_data_vec4[label]) {
1106 data.x *= scaling_factor;
1107 data.y *= scaling_factor;
1108 data.z *= scaling_factor;
1109 data.w *= scaling_factor;
1112 helios_runtime_error(
"ERROR (Context::scalePrimitiveData): This operation only supports primitive data of type float, double, vec2, vec3, and vec4.");
1114 primitives.at(UUID)->dirty_flag =
true;
1117 if (primitives_not_exist > 0) {
1118 std::cerr <<
"WARNING (Context::scalePrimitiveData): " << primitives_not_exist <<
" of " << UUIDs.size() <<
" from the input UUID vector did not exist." << std::endl;
1120 if (primitive_data_not_exist > 0) {
1121 std::cerr <<
"WARNING (Context::scalePrimitiveData): Primitive data did not exist for " << primitive_data_not_exist <<
" primitives, and thus no scaling was applied." << std::endl;
1133 for (
uint UUID: UUIDs) {
1136 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1141 if (primitives.at(UUID)->primitive_data_types.at(label) ==
HELIOS_TYPE_INT) {
1142 for (
uint i = 0; i < size; i++) {
1143 primitives.at(UUID)->primitive_data_int.at(label).at(i) += increment;
1145 primitives.at(UUID)->dirty_flag =
true;
1147 warnings.
addWarning(
"increment_type_mismatch",
"Attempted to increment primitive data for type int, but data '" + std::string(label) +
"' does not have type int.");
1151 warnings.
report(std::cerr);
1158 for (
uint UUID: UUIDs) {
1161 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1166 if (primitives.at(UUID)->primitive_data_types.at(label) ==
HELIOS_TYPE_UINT) {
1167 for (
uint i = 0; i < size; i++) {
1168 primitives.at(UUID)->primitive_data_uint.at(label).at(i) += increment;
1170 primitives.at(UUID)->dirty_flag =
true;
1172 warnings.
addWarning(
"increment_type_mismatch",
"Attempted to increment Primitive data for type uint, but data '" + std::string(label) +
"' does not have type uint.");
1176 warnings.
report(std::cerr);
1183 for (
uint UUID: UUIDs) {
1186 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1192 for (
uint i = 0; i < size; i++) {
1193 primitives.at(UUID)->primitive_data_float.at(label).at(i) += increment;
1195 primitives.at(UUID)->dirty_flag =
true;
1197 warnings.
addWarning(
"increment_type_mismatch",
"Attempted to increment Primitive data for type float, but data '" + std::string(label) +
"' does not have type float.");
1201 warnings.
report(std::cerr);
1208 for (
uint UUID: UUIDs) {
1211 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1217 for (
uint i = 0; i < size; i++) {
1218 primitives.at(UUID)->primitive_data_double.at(label).at(i) += increment;
1220 primitives.at(UUID)->dirty_flag =
true;
1222 warnings.
addWarning(
"increment_type_mismatch",
"Attempted to increment Primitive data for type double, but data '" + std::string(label) +
"' does not have type double.");
1226 warnings.
report(std::cerr);
1231 uint primitives_not_exist = 0;
1232 uint primitive_data_not_exist = 0;
1234 float data_float = 0;
1235 double data_double = 0;
1245 for (
uint UUID: UUIDs) {
1247 primitives_not_exist++;
1253 bool init_type =
false;
1254 for (
const auto &label: primitive_data_labels) {
1262 data_type = data_type_current;
1265 if (data_type != data_type_current) {
1266 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataSum): Primitive data types are not consistent for UUID " + std::to_string(UUID));
1272 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1276 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1277 data_double += data;
1280 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1281 data_vec2 = data_vec2 + data;
1284 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1285 data_vec3 = data_vec3 + data;
1288 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1289 data_vec4 = data_vec4 + data;
1292 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1293 data_int = data_int + data;
1296 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1297 data_uint = data_uint + data;
1300 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1301 data_int2 = data_int2 + data;
1304 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1305 data_int3 = data_int3 + data;
1308 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1309 data_int4 = data_int4 + data;
1311 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataSum): This operation is not supported for string primitive data types.");
1316 primitive_data_not_exist++;
1351 if (primitives_not_exist > 0) {
1352 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataSum): " << primitives_not_exist <<
" of " << UUIDs.size() <<
" from the input UUID vector did not exist." << std::endl;
1354 if (primitive_data_not_exist > 0) {
1355 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataSum): Primitive data did not exist for " << primitive_data_not_exist
1356 <<
" primitives, and thus no scaling summation was performed and new primitive data was not created for this primitive." << std::endl;
1362 uint primitives_not_exist = 0;
1363 uint primitive_data_not_exist = 0;
1365 float data_float = 0;
1366 double data_double = 0;
1376 for (
uint UUID: UUIDs) {
1378 primitives_not_exist++;
1384 bool init_type =
false;
1386 for (
const auto &label: primitive_data_labels) {
1394 data_type = data_type_current;
1397 if (data_type != data_type_current) {
1398 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataProduct): Primitive data types are not consistent for UUID " + std::to_string(UUID));
1404 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1412 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1414 data_double *= data;
1420 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1422 data_vec2.
x *= data.x;
1423 data_vec2.
y *= data.y;
1429 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1431 data_vec3.
x *= data.x;
1432 data_vec3.
y *= data.y;
1433 data_vec3.
z *= data.z;
1439 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1441 data_vec4.
x *= data.x;
1442 data_vec4.
y *= data.y;
1443 data_vec4.
z *= data.z;
1444 data_vec4.
w *= data.w;
1450 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1452 data_int = data_int * data;
1458 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1460 data_uint = data_uint * data;
1466 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1468 data_int2.
x *= data.x;
1469 data_int2.
y *= data.y;
1475 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1477 data_int3.
x *= data.x;
1478 data_int3.
y *= data.y;
1479 data_int3.
z *= data.z;
1485 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1487 data_int4.
x *= data.x;
1488 data_int4.
y *= data.y;
1489 data_int4.
z *= data.z;
1490 data_int4.
w *= data.w;
1495 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataProduct): This operation is not supported for string primitive data types.");
1501 primitive_data_not_exist++;
1526 if (primitives_not_exist > 0) {
1527 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataProduct): " << primitives_not_exist <<
" of " << UUIDs.size() <<
" from the input UUID vector did not exist." << std::endl;
1529 if (primitive_data_not_exist > 0) {
1530 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataProduct): Primitive data did not exist for " << primitive_data_not_exist
1531 <<
" primitives, and thus no multiplication was performed and new primitive data was not created for this primitive." << std::endl;
1538 bool primitive_warning =
false;
1539 bool nan_warning =
false;
1541 for (
uint UUID: UUIDs) {
1545 if (std::isnan(A)) {
1553 primitive_warning =
true;
1557 if (primitive_warning) {
1558 std::cerr <<
"WARNING (Context::sumPrimitiveSurfaceArea): One or more primitives reference in the UUID vector did not exist." << std::endl;
1559 }
else if (nan_warning) {
1560 std::cerr <<
"WARNING (Context::sumPrimitiveSurfaceArea): One or more primitives had an area of NaN." << std::endl;
1566std::vector<uint>
Context::filterPrimitivesByData(
const std::vector<uint> &UUIDs,
const std::string &primitive_data_label,
float filter_value,
const std::string &comparator)
const {
1568 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1569 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1572 std::vector<uint> UUIDs_out = UUIDs;
1573 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1574 uint UUID = UUIDs_out.at(p);
1578 if (comparator ==
"==" && data == filter_value) {
1581 if (comparator ==
">" && data > filter_value) {
1584 if (comparator ==
"<" && data < filter_value) {
1587 if (comparator ==
">=" && data >= filter_value) {
1590 if (comparator ==
"<=" && data <= filter_value) {
1594 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1595 UUIDs_out.pop_back();
1597 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1598 UUIDs_out.pop_back();
1605std::vector<uint>
Context::filterPrimitivesByData(
const std::vector<uint> &UUIDs,
const std::string &primitive_data_label,
double filter_value,
const std::string &comparator)
const {
1607 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1608 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1611 std::vector<uint> UUIDs_out = UUIDs;
1612 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1613 uint UUID = UUIDs_out.at(p);
1617 if (comparator ==
"==" && data == filter_value) {
1620 if (comparator ==
">" && data > filter_value) {
1623 if (comparator ==
"<" && data < filter_value) {
1626 if (comparator ==
">=" && data >= filter_value) {
1629 if (comparator ==
"<=" && data <= filter_value) {
1633 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1634 UUIDs_out.pop_back();
1636 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1637 UUIDs_out.pop_back();
1644std::vector<uint>
Context::filterPrimitivesByData(
const std::vector<uint> &UUIDs,
const std::string &primitive_data_label,
int filter_value,
const std::string &comparator)
const {
1646 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1647 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1650 std::vector<uint> UUIDs_out = UUIDs;
1651 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1652 uint UUID = UUIDs_out.at(p);
1656 if (comparator ==
"==" && data == filter_value) {
1659 if (comparator ==
">" && data > filter_value) {
1662 if (comparator ==
"<" && data < filter_value) {
1665 if (comparator ==
">=" && data >= filter_value) {
1668 if (comparator ==
"<=" && data <= filter_value) {
1672 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1673 UUIDs_out.pop_back();
1675 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1676 UUIDs_out.pop_back();
1685 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1686 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1689 std::vector<uint> UUIDs_out = UUIDs;
1690 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1691 uint UUID = UUIDs_out.at(p);
1695 if (comparator ==
"==" && data == filter_value) {
1698 if (comparator ==
">" && data > filter_value) {
1701 if (comparator ==
"<" && data < filter_value) {
1704 if (comparator ==
">=" && data >= filter_value) {
1707 if (comparator ==
"<=" && data <= filter_value) {
1711 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1712 UUIDs_out.pop_back();
1714 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1715 UUIDs_out.pop_back();
1724 std::vector<uint> UUIDs_out = UUIDs;
1725 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1726 uint UUID = UUIDs_out.at(p);
1730 if (data != filter_value) {
1731 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1732 UUIDs_out.pop_back();
1735 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1736 UUIDs_out.pop_back();
1747 if (objects.find(objID) == objects.end()) {
1748 helios_runtime_error(
"ERROR (Context::getObjectDataType): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1751 return objects.at(objID)->getObjectDataType(label);
1755 const auto it = object_data_type_registry.find(label);
1756 if (it != object_data_type_registry.end()) {
1759 helios_runtime_error(
"ERROR (Context::getObjectDataType): Object data " + std::string(label) +
" does not exist.");
1765 if (objects.find(objID) == objects.end()) {
1766 helios_runtime_error(
"ERROR (Context::getObjectDataSize): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1769 return objects.at(objID)->getObjectDataSize(label);
1774 if (objects.find(objID) == objects.end()) {
1775 helios_runtime_error(
"ERROR (Context::doesObjectDataExist): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1778 return objects.at(objID)->doesObjectDataExist(label);
1784 if (objects.find(source_objID) == objects.end()) {
1785 helios_runtime_error(
"ERROR (Context::copyObjectData): Source object ID of " + std::to_string(source_objID) +
" does not exist in the Context.");
1786 }
else if (objects.find(destination_objID) == objects.end()) {
1787 helios_runtime_error(
"ERROR (Context::copyObjectData): Destination object ID of " + std::to_string(destination_objID) +
" does not exist in the Context.");
1791 const auto &dest_labels = objects.at(destination_objID)->object_data_types;
1792 for (
const auto &[label, type]: dest_labels) {
1793 decrementObjectDataLabelCounter(label);
1796 objects.at(destination_objID)->object_data_types = objects.at(source_objID)->object_data_types;
1798 objects.at(destination_objID)->object_data_int = objects.at(source_objID)->object_data_int;
1799 objects.at(destination_objID)->object_data_uint = objects.at(source_objID)->object_data_uint;
1800 objects.at(destination_objID)->object_data_float = objects.at(source_objID)->object_data_float;
1801 objects.at(destination_objID)->object_data_double = objects.at(source_objID)->object_data_double;
1802 objects.at(destination_objID)->object_data_vec2 = objects.at(source_objID)->object_data_vec2;
1803 objects.at(destination_objID)->object_data_vec3 = objects.at(source_objID)->object_data_vec3;
1804 objects.at(destination_objID)->object_data_vec4 = objects.at(source_objID)->object_data_vec4;
1805 objects.at(destination_objID)->object_data_int2 = objects.at(source_objID)->object_data_int2;
1806 objects.at(destination_objID)->object_data_int3 = objects.at(source_objID)->object_data_int3;
1807 objects.at(destination_objID)->object_data_int4 = objects.at(source_objID)->object_data_int4;
1808 objects.at(destination_objID)->object_data_string = objects.at(source_objID)->object_data_string;
1810 for (
const auto &[lbl, type]: objects.at(destination_objID)->object_data_types) {
1811 incrementObjectDataLabelCounter(lbl);
1818 if (objects.find(objID) == objects.end()) {
1819 helios_runtime_error(
"ERROR (Context::duplicateObjectData): Object ID of " + std::to_string(objID) +
" does not exist in the Context.");
1821 helios_runtime_error(
"ERROR (Context::duplicateObjectData): Object ID of " + std::to_string(objID) +
" does not have data with label " + std::string(old_label) +
".");
1827 if (!objects.at(objID)->doesObjectDataExist(new_label)) {
1828 incrementObjectDataLabelCounter(new_label);
1830 objects.at(objID)->object_data_types[new_label] = type;
1832 objects.at(objID)->object_data_int[new_label] = objects.at(objID)->object_data_int.at(old_label);
1834 objects.at(objID)->object_data_uint[new_label] = objects.at(objID)->object_data_uint.at(old_label);
1836 objects.at(objID)->object_data_float[new_label] = objects.at(objID)->object_data_float.at(old_label);
1838 objects.at(objID)->object_data_double[new_label] = objects.at(objID)->object_data_double.at(old_label);
1840 objects.at(objID)->object_data_vec2[new_label] = objects.at(objID)->object_data_vec2.at(old_label);
1842 objects.at(objID)->object_data_vec3[new_label] = objects.at(objID)->object_data_vec3.at(old_label);
1844 objects.at(objID)->object_data_vec4[new_label] = objects.at(objID)->object_data_vec4.at(old_label);
1846 objects.at(objID)->object_data_int2[new_label] = objects.at(objID)->object_data_int2.at(old_label);
1848 objects.at(objID)->object_data_int3[new_label] = objects.at(objID)->object_data_int3.at(old_label);
1850 objects.at(objID)->object_data_int4[new_label] = objects.at(objID)->object_data_int4.at(old_label);
1852 objects.at(objID)->object_data_string[new_label] = objects.at(objID)->object_data_string.at(old_label);
1862 if (objects.find(objID) == objects.end()) {
1863 helios_runtime_error(
"ERROR (Context::renameObjectData): Object ID of " + std::to_string(objID) +
" does not exist in the Context.");
1865 helios_runtime_error(
"ERROR (Context::renameObjectData): Object ID of " + std::to_string(objID) +
" does not have data with label " + std::string(old_label) +
".");
1875 if (objects.find(objID) == objects.end()) {
1876 helios_runtime_error(
"ERROR (Context::clearObjectData): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1880 std::string label_str = std::string(label);
1882 HeliosDataType data_type = objects.at(objID)->getObjectDataType(label);
1884 std::string cached_value;
1885 objects.at(objID)->getObjectData(label, cached_value);
1889 objects.at(objID)->getObjectData(label, cached_value);
1893 objects.at(objID)->getObjectData(label, cached_value);
1898 if (objects.at(objID)->doesObjectDataExist(label)) {
1899 decrementObjectDataLabelCounter(label);
1901 objects.at(objID)->clearObjectData(label);
1905 std::string label_str = std::string(label);
1906 for (
uint objID: objIDs) {
1908 if (objects.find(objID) == objects.end()) {
1909 helios_runtime_error(
"ERROR (Context::clearObjectData): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1914 HeliosDataType data_type = objects.at(objID)->getObjectDataType(label);
1916 std::string cached_value;
1917 objects.at(objID)->getObjectData(label, cached_value);
1921 objects.at(objID)->getObjectData(label, cached_value);
1925 objects.at(objID)->getObjectData(label, cached_value);
1930 if (objects.at(objID)->doesObjectDataExist(label)) {
1931 decrementObjectDataLabelCounter(label);
1933 objects.at(objID)->clearObjectData(label);
1940 std::string label_str(label);
1942 for (
const auto &[objID,
object]: objects) {
1943 if (!
object->doesObjectDataExist(label)) {
1946 if (caching_enabled) {
1949 std::string cached_value;
1950 object->getObjectData(label, cached_value);
1954 object->getObjectData(label, cached_value);
1958 object->getObjectData(label, cached_value);
1962 decrementObjectDataLabelCounter(label);
1963 object->clearObjectData(label);
1965 object_data_label_counts.erase(label_str);
1966 object_data_type_registry.erase(label_str);
1977 helios_runtime_error(
"ERROR (CompoundObject::getObjectDataType): Object data " + std::string(label) +
" does not exist for object " + std::to_string(OID));
1981 return object_data_types.at(label);
1988 helios_runtime_error(
"ERROR (CompoundObject::getObjectDataSize): Object data " + std::string(label) +
" does not exist for object " + std::to_string(OID));
1995 return object_data_int.at(label).size();
1997 return object_data_uint.at(label).size();
1999 return object_data_float.at(label).size();
2001 return object_data_double.at(label).size();
2003 return object_data_vec2.at(label).size();
2005 return object_data_vec3.at(label).size();
2007 return object_data_vec4.at(label).size();
2009 return object_data_int2.at(label).size();
2011 return object_data_int3.at(label).size();
2013 return object_data_int4.at(label).size();
2015 return object_data_string.at(label).size();
2032 object_data_int.erase(label);
2033 object_data_types.erase(label);
2035 object_data_uint.erase(label);
2036 object_data_types.erase(label);
2038 object_data_float.erase(label);
2039 object_data_types.erase(label);
2041 object_data_double.erase(label);
2042 object_data_types.erase(label);
2044 object_data_vec2.erase(label);
2045 object_data_types.erase(label);
2047 object_data_vec3.erase(label);
2048 object_data_types.erase(label);
2050 object_data_vec4.erase(label);
2051 object_data_types.erase(label);
2053 object_data_int2.erase(label);
2054 object_data_types.erase(label);
2056 object_data_int3.erase(label);
2057 object_data_types.erase(label);
2059 object_data_int4.erase(label);
2060 object_data_types.erase(label);
2062 object_data_string.erase(label);
2063 object_data_types.erase(label);
2071 if (object_data_types.find(std::string(label)) == object_data_types.end()) {
2080 std::vector<std::string> labels;
2081 labels.reserve(object_data_types.size());
2083 for (
const auto &[label, type]: object_data_types) {
2084 labels.push_back(label);
2090std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
float filter_value,
const std::string &comparator)
const {
2092 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
2093 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
2096 std::vector<uint> objIDs_out = objIDs;
2097 for (std::size_t p = objIDs.size(); p-- > 0;) {
2098 uint objID = objIDs_out.at(p);
2102 if (comparator ==
"==" && data == filter_value) {
2104 }
else if (comparator ==
">" && data > filter_value) {
2106 }
else if (comparator ==
"<" && data < filter_value) {
2108 }
else if (comparator ==
">=" && data >= filter_value) {
2110 }
else if (comparator ==
"<=" && data <= filter_value) {
2114 std::swap(objIDs_out.at(p), objIDs_out.back());
2115 objIDs_out.pop_back();
2117 std::swap(objIDs_out.at(p), objIDs_out.back());
2118 objIDs_out.pop_back();
2125std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
double filter_value,
const std::string &comparator)
const {
2127 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
2128 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
2131 std::vector<uint> objIDs_out = objIDs;
2132 for (std::size_t p = objIDs.size(); p-- > 0;) {
2133 uint objID = objIDs_out.at(p);
2137 if (comparator ==
"==" && data == filter_value) {
2139 }
else if (comparator ==
">" && data > filter_value) {
2141 }
else if (comparator ==
"<" && data < filter_value) {
2143 }
else if (comparator ==
">=" && data >= filter_value) {
2145 }
else if (comparator ==
"<=" && data <= filter_value) {
2149 std::swap(objIDs_out.at(p), objIDs_out.back());
2150 objIDs_out.pop_back();
2152 std::swap(objIDs_out.at(p), objIDs_out.back());
2153 objIDs_out.pop_back();
2160std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
int filter_value,
const std::string &comparator)
const {
2162 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
2163 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
2166 std::vector<uint> objIDs_out = objIDs;
2167 for (std::size_t p = objIDs.size(); p-- > 0;) {
2168 uint objID = objIDs_out.at(p);
2172 if (comparator ==
"==" && data == filter_value) {
2174 }
else if (comparator ==
">" && data > filter_value) {
2176 }
else if (comparator ==
"<" && data < filter_value) {
2178 }
else if (comparator ==
">=" && data >= filter_value) {
2180 }
else if (comparator ==
"<=" && data <= filter_value) {
2184 std::swap(objIDs_out.at(p), objIDs_out.back());
2185 objIDs_out.pop_back();
2187 std::swap(objIDs_out.at(p), objIDs_out.back());
2188 objIDs_out.pop_back();
2197 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
2198 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
2201 std::vector<uint> objIDs_out = objIDs;
2202 for (std::size_t p = objIDs.size(); p-- > 0;) {
2203 uint objID = objIDs_out.at(p);
2207 if (comparator ==
"==" && data == filter_value) {
2209 }
else if (comparator ==
">" && data > filter_value) {
2211 }
else if (comparator ==
"<" && data < filter_value) {
2213 }
else if (comparator ==
">=" && data >= filter_value) {
2215 }
else if (comparator ==
"<=" && data <= filter_value) {
2219 std::swap(objIDs_out.at(p), objIDs_out.back());
2220 objIDs_out.pop_back();
2222 std::swap(objIDs_out.at(p), objIDs_out.back());
2223 objIDs_out.pop_back();
2230std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
const std::string &filter_value)
const {
2232 std::vector<uint> objIDs_out = objIDs;
2233 for (std::size_t p = objIDs.size(); p-- > 0;) {
2234 uint objID = objIDs_out.at(p);
2238 if (data != filter_value) {
2239 std::swap(objIDs_out.at(p), objIDs_out.back());
2240 objIDs_out.pop_back();
2243 std::swap(objIDs_out.at(p), objIDs_out.back());
2244 objIDs_out.pop_back();
2256 helios_runtime_error(
"ERROR (Context::duplicateGlobalData): Global data " + std::string(old_label) +
" does not exist in the Context.");
2266 helios_runtime_error(
"ERROR (Context::duplicateGlobalData): Global data " + std::string(old_label) +
" does not exist in the Context.");
2272 std::vector<int> gdata;
2276 std::vector<uint> gdata;
2280 std::vector<float> gdata;
2284 std::vector<double> gdata;
2288 std::vector<vec2> gdata;
2292 std::vector<vec3> gdata;
2296 std::vector<vec4> gdata;
2300 std::vector<int2> gdata;
2304 std::vector<int3> gdata;
2308 std::vector<int4> gdata;
2312 std::vector<std::string> gdata;
2323 globaldata.erase(label);
2330 helios_runtime_error(
"ERROR (Context::getGlobalDataType): Global data " + std::string(label) +
" does not exist in the Context.");
2333 return globaldata.at(label).type;
2339 helios_runtime_error(
"ERROR (Context::getGlobalDataSize): Global data " + std::string(label) +
" does not exist in the Context.");
2342 return globaldata.at(label).size;
2351 return globaldata.at(label).version;
2356 std::vector<std::string> labels;
2357 labels.reserve(globaldata.size());
2358 for (
const auto &[label, data]: globaldata) {
2359 labels.push_back(label);
2366 std::vector<std::string> labels;
2367 labels.reserve(primitive_data_label_counts.size());
2368 for (
const auto &[label, count]: primitive_data_label_counts) {
2370 labels.push_back(label);
2378 std::vector<std::string> labels;
2379 labels.reserve(object_data_label_counts.size());
2380 for (
const auto &[label, count]: object_data_label_counts) {
2382 labels.push_back(label);
2389 return globaldata.find(std::string(label)) != globaldata.end();
2395 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2401 for (
uint i = 0; i < size; i++) {
2402 globaldata.at(label).global_data_int.at(i) += increment;
2405 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type int, but data '" << label <<
"' does not have type int." << std::endl;
2412 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2418 for (
uint i = 0; i < size; i++) {
2419 globaldata.at(label).global_data_uint.at(i) += increment;
2422 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type uint, but data '" << label <<
"' does not have type uint." << std::endl;
2429 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2435 for (
uint i = 0; i < size; i++) {
2436 globaldata.at(label).global_data_float.at(i) += increment;
2439 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type float, but data '" << label <<
"' does not have type float." << std::endl;
2446 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2452 for (
uint i = 0; i < size; i++) {
2453 globaldata.at(label).global_data_double.at(i) += increment;
2456 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type double, but data '" << label <<
"' does not have type double." << std::endl;
2460std::string Context::dataTypeToString(
HeliosDataType type)
const {
2497 return (numeric_types.count(from_type) > 0 && numeric_types.count(to_type) > 0);