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);
37 cached_primitive_data_labels.insert(label);
41 cached_primitive_data_labels.erase(label);
43 primitive_string_value_registry.erase(label);
44 primitive_int_value_registry.erase(label);
45 primitive_uint_value_registry.erase(label);
49 return cached_primitive_data_labels.find(label) != cached_primitive_data_labels.end();
53 cached_object_data_labels.insert(label);
57 cached_object_data_labels.erase(label);
59 object_string_value_registry.erase(label);
60 object_int_value_registry.erase(label);
61 object_uint_value_registry.erase(label);
65 return cached_object_data_labels.find(label) != cached_object_data_labels.end();
69void Context::incrementObjectDataLabelCounter(
const std::string &object_data_label) {
70 object_data_label_counts[object_data_label]++;
73void Context::decrementObjectDataLabelCounter(
const std::string &object_data_label) {
74 auto it = object_data_label_counts.find(object_data_label);
75 if (it != object_data_label_counts.end() && it->second > 0) {
77 if (it->second == 0) {
78 object_data_label_counts.erase(it);
85HeliosDataType Primitive::getPrimitiveDataType(
const char *label)
const {
88 if (!doesPrimitiveDataExist(label)) {
89 helios_runtime_error(
"ERROR (Primitive::getPrimitiveDataType): Primitive data " + std::string(label) +
" does not exist for primitive " + std::to_string(UUID));
93 return primitive_data_types.at(label);
97 const auto it = primitive_data_type_registry.find(label);
98 if (it != primitive_data_type_registry.end()) {
101 helios_runtime_error(
"ERROR (Context::getPrimitiveDataType): Primitive data " + std::string(label) +
" does not exist.");
105uint Primitive::getPrimitiveDataSize(
const char *label)
const {
108 if (!doesPrimitiveDataExist(label)) {
109 helios_runtime_error(
"ERROR (Primitive::getPrimitiveDataSize): Primitive data " + std::string(label) +
" does not exist for primitive " + std::to_string(UUID));
115 if (type == HELIOS_TYPE_INT) {
116 return primitive_data_int.at(label).size();
117 }
else if (type == HELIOS_TYPE_UINT) {
118 return primitive_data_uint.at(label).size();
119 }
else if (type == HELIOS_TYPE_FLOAT) {
120 return primitive_data_float.at(label).size();
121 }
else if (type == HELIOS_TYPE_DOUBLE) {
122 return primitive_data_double.at(label).size();
123 }
else if (type == HELIOS_TYPE_VEC2) {
124 return primitive_data_vec2.at(label).size();
125 }
else if (type == HELIOS_TYPE_VEC3) {
126 return primitive_data_vec3.at(label).size();
127 }
else if (type == HELIOS_TYPE_VEC4) {
128 return primitive_data_vec4.at(label).size();
129 }
else if (type == HELIOS_TYPE_INT2) {
130 return primitive_data_int2.at(label).size();
131 }
else if (type == HELIOS_TYPE_INT3) {
132 return primitive_data_int3.at(label).size();
133 }
else if (type == HELIOS_TYPE_INT4) {
134 return primitive_data_int4.at(label).size();
135 }
else if (type == HELIOS_TYPE_STRING) {
136 return primitive_data_string.at(label).size();
144void Primitive::clearPrimitiveData(
const char *label) {
146 if (!doesPrimitiveDataExist(label)) {
152 if (type == HELIOS_TYPE_INT) {
153 primitive_data_int.erase(label);
154 primitive_data_types.erase(label);
155 }
else if (type == HELIOS_TYPE_UINT) {
156 primitive_data_uint.erase(label);
157 primitive_data_types.erase(label);
158 }
else if (type == HELIOS_TYPE_FLOAT) {
159 primitive_data_float.erase(label);
160 primitive_data_types.erase(label);
161 }
else if (type == HELIOS_TYPE_DOUBLE) {
162 primitive_data_double.erase(label);
163 primitive_data_types.erase(label);
164 }
else if (type == HELIOS_TYPE_VEC2) {
165 primitive_data_vec2.erase(label);
166 primitive_data_types.erase(label);
167 }
else if (type == HELIOS_TYPE_VEC3) {
168 primitive_data_vec3.erase(label);
169 primitive_data_types.erase(label);
170 }
else if (type == HELIOS_TYPE_VEC4) {
171 primitive_data_vec4.erase(label);
172 primitive_data_types.erase(label);
173 }
else if (type == HELIOS_TYPE_INT2) {
174 primitive_data_int2.erase(label);
175 primitive_data_types.erase(label);
176 }
else if (type == HELIOS_TYPE_INT3) {
177 primitive_data_int3.erase(label);
178 primitive_data_types.erase(label);
179 }
else if (type == HELIOS_TYPE_INT4) {
180 primitive_data_int4.erase(label);
181 primitive_data_types.erase(label);
182 }
else if (type == HELIOS_TYPE_STRING) {
183 primitive_data_string.erase(label);
184 primitive_data_types.erase(label);
191bool Primitive::doesPrimitiveDataExist(
const char *label)
const {
192 if (primitive_data_types.find(std::string(label)) == primitive_data_types.end()) {
198std::vector<std::string> Primitive::listPrimitiveData()
const {
200 std::vector<std::string> labels;
201 labels.reserve(primitive_data_types.size());
203 for (
const auto &[label, type]: primitive_data_types) {
204 labels.push_back(label);
212 if (primitives.find(UUID) == primitives.end()) {
213 helios_runtime_error(
"ERROR (Context::getPrimitiveDataType): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
216 return primitives.at(UUID)->getPrimitiveDataType(label);
221 if (primitives.find(UUID) == primitives.end()) {
222 helios_runtime_error(
"ERROR (Context::getPrimitiveDataSize): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
225 return primitives.at(UUID)->getPrimitiveDataSize(label);
230 if (primitives.find(UUID) == primitives.end()) {
231 helios_runtime_error(
"ERROR (Context::doesPrimitiveDataExist): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
234 return primitives.at(UUID)->doesPrimitiveDataExist(label);
239 if (primitives.find(UUID) == primitives.end()) {
240 helios_runtime_error(
"ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
244 std::string label_str = std::string(label);
246 HeliosDataType data_type = primitives.at(UUID)->getPrimitiveDataType(label);
248 std::string cached_value;
249 primitives.at(UUID)->getPrimitiveData(label, cached_value);
253 primitives.at(UUID)->getPrimitiveData(label, cached_value);
257 primitives.at(UUID)->getPrimitiveData(label, cached_value);
262 if (primitives.at(UUID)->doesPrimitiveDataExist(label)) {
263 decrementPrimitiveDataLabelCounter(label);
265 primitives.at(UUID)->clearPrimitiveData(label);
269 for (
unsigned int UUID: UUIDs) {
271 if (primitives.find(UUID) == primitives.end()) {
272 helios_runtime_error(
"ERROR (Context::getPrimitiveData): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
276 std::string label_str = std::string(label);
278 HeliosDataType data_type = primitives.at(UUID)->getPrimitiveDataType(label);
280 std::string cached_value;
281 primitives.at(UUID)->getPrimitiveData(label, cached_value);
285 primitives.at(UUID)->getPrimitiveData(label, cached_value);
289 primitives.at(UUID)->getPrimitiveData(label, cached_value);
294 if (primitives.at(UUID)->doesPrimitiveDataExist(label)) {
295 decrementPrimitiveDataLabelCounter(label);
297 primitives.at(UUID)->clearPrimitiveData(label);
304 if (primitives.find(sourceUUID) == primitives.end()) {
305 helios_runtime_error(
"ERROR (Context::copyPrimitiveData): Source UUID of " + std::to_string(sourceUUID) +
" does not exist in the Context.");
306 }
else if (primitives.find(destinationUUID) == primitives.end()) {
307 helios_runtime_error(
"ERROR (Context::copyPrimitiveData): Destination UUID of " + std::to_string(destinationUUID) +
" does not exist in the Context.");
311 const auto &dest_labels = primitives.at(destinationUUID)->primitive_data_types;
312 for (
const auto &[label, type]: dest_labels) {
313 decrementPrimitiveDataLabelCounter(label);
316 primitives.at(destinationUUID)->primitive_data_types = primitives.at(sourceUUID)->primitive_data_types;
318 primitives.at(destinationUUID)->primitive_data_int = primitives.at(sourceUUID)->primitive_data_int;
319 primitives.at(destinationUUID)->primitive_data_uint = primitives.at(sourceUUID)->primitive_data_uint;
320 primitives.at(destinationUUID)->primitive_data_float = primitives.at(sourceUUID)->primitive_data_float;
321 primitives.at(destinationUUID)->primitive_data_double = primitives.at(sourceUUID)->primitive_data_double;
322 primitives.at(destinationUUID)->primitive_data_vec2 = primitives.at(sourceUUID)->primitive_data_vec2;
323 primitives.at(destinationUUID)->primitive_data_vec3 = primitives.at(sourceUUID)->primitive_data_vec3;
324 primitives.at(destinationUUID)->primitive_data_vec4 = primitives.at(sourceUUID)->primitive_data_vec4;
325 primitives.at(destinationUUID)->primitive_data_int2 = primitives.at(sourceUUID)->primitive_data_int2;
326 primitives.at(destinationUUID)->primitive_data_int3 = primitives.at(sourceUUID)->primitive_data_int3;
327 primitives.at(destinationUUID)->primitive_data_int4 = primitives.at(sourceUUID)->primitive_data_int4;
328 primitives.at(destinationUUID)->primitive_data_string = primitives.at(sourceUUID)->primitive_data_string;
330 for (
const auto &[label, type]: primitives.at(destinationUUID)->primitive_data_types) {
331 incrementPrimitiveDataLabelCounter(label);
334 primitives.at(destinationUUID)->dirty_flag =
true;
340 if (primitives.find(UUID) == primitives.end()) {
341 helios_runtime_error(
"ERROR (Context::renamePrimitiveData): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
342 }
else if (!primitives.at(UUID)->doesPrimitiveDataExist(old_label)) {
343 helios_runtime_error(
"ERROR (Context::renamePrimitiveData): Primitive data of " + std::string(old_label) +
" does not exist for primitive " + std::to_string(UUID) +
".");
349 primitives.at(UUID)->dirty_flag =
true;
355 if (primitives.find(UUID) == primitives.end()) {
356 helios_runtime_error(
"ERROR (Context::duplicatePrimitiveData): UUID of " + std::to_string(UUID) +
" does not exist in the Context.");
357 }
else if (!primitives.at(UUID)->doesPrimitiveDataExist(old_label)) {
358 helios_runtime_error(
"ERROR (Context::duplicatePrimitiveData): Primitive data of " + std::string(old_label) +
" does not exist for primitive " + std::to_string(UUID) +
".");
364 if (!primitives.at(UUID)->doesPrimitiveDataExist(new_label)) {
365 incrementPrimitiveDataLabelCounter(new_label);
367 primitives.at(UUID)->primitive_data_types[new_label] = type;
369 primitives.at(UUID)->primitive_data_int[new_label] = primitives.at(UUID)->primitive_data_int.at(old_label);
371 primitives.at(UUID)->primitive_data_uint[new_label] = primitives.at(UUID)->primitive_data_uint.at(old_label);
373 primitives.at(UUID)->primitive_data_float[new_label] = primitives.at(UUID)->primitive_data_float.at(old_label);
375 primitives.at(UUID)->primitive_data_double[new_label] = primitives.at(UUID)->primitive_data_double.at(old_label);
377 primitives.at(UUID)->primitive_data_vec2[new_label] = primitives.at(UUID)->primitive_data_vec2.at(old_label);
379 primitives.at(UUID)->primitive_data_vec3[new_label] = primitives.at(UUID)->primitive_data_vec3.at(old_label);
381 primitives.at(UUID)->primitive_data_vec4[new_label] = primitives.at(UUID)->primitive_data_vec4.at(old_label);
383 primitives.at(UUID)->primitive_data_int2[new_label] = primitives.at(UUID)->primitive_data_int2.at(old_label);
385 primitives.at(UUID)->primitive_data_int3[new_label] = primitives.at(UUID)->primitive_data_int3.at(old_label);
387 primitives.at(UUID)->primitive_data_int4[new_label] = primitives.at(UUID)->primitive_data_int4.at(old_label);
389 primitives.at(UUID)->primitive_data_string[new_label] = primitives.at(UUID)->primitive_data_string.at(old_label);
394 primitives.at(UUID)->dirty_flag =
true;
398 return getPrimitivePointer_private(UUID)->listPrimitiveData();
402 for (
auto &[UUID, primitive]: primitives) {
403 if (primitive->doesPrimitiveDataExist(existing_data_label)) {
404 const HeliosDataType type = primitive->getPrimitiveDataType(existing_data_label);
405 if (!primitive->doesPrimitiveDataExist(copy_data_label)) {
406 incrementPrimitiveDataLabelCounter(copy_data_label);
408 primitive->primitive_data_types[copy_data_label] = type;
410 primitive->primitive_data_float[copy_data_label] = primitive->primitive_data_float.at(existing_data_label);
412 primitive->primitive_data_double[copy_data_label] = primitive->primitive_data_double.at(existing_data_label);
414 primitive->primitive_data_int[copy_data_label] = primitive->primitive_data_int.at(existing_data_label);
416 primitive->primitive_data_uint[copy_data_label] = primitive->primitive_data_uint.at(existing_data_label);
418 primitive->primitive_data_vec2[copy_data_label] = primitive->primitive_data_vec2.at(existing_data_label);
420 primitive->primitive_data_vec3[copy_data_label] = primitive->primitive_data_vec3.at(existing_data_label);
422 primitive->primitive_data_vec4[copy_data_label] = primitive->primitive_data_vec4.at(existing_data_label);
424 primitive->primitive_data_int2[copy_data_label] = primitive->primitive_data_int2.at(existing_data_label);
426 primitive->primitive_data_int3[copy_data_label] = primitive->primitive_data_int3.at(existing_data_label);
428 primitive->primitive_data_string[copy_data_label] = primitive->primitive_data_string.at(existing_data_label);
430 primitive->dirty_flag =
true;
439 for (
uint UUID: UUIDs) {
449 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
460 for (
uint UUID: UUIDs) {
470 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
481 for (
uint UUID: UUIDs) {
491 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
502 for (
uint UUID: UUIDs) {
512 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
523 for (
uint UUID: UUIDs) {
533 std::cerr <<
"WARNING (Context::calculatePrimitiveDataMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
543 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): Object ID of " + std::to_string(objID) +
" does not exist in the Context.");
551 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): Object ID " + std::to_string(objID) +
" has no primitive children.");
556 for (
uint UUID: UUIDs) {
564 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): Primitive data '" + label +
"' does not exist for any primitives in object " + std::to_string(objID) +
".");
569 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): Cannot calculate mean for primitive data type. Only float, double, vec2, vec3, and vec4 are supported.");
577 for (
uint UUID: UUIDs) {
585 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
587 float mean =
sum / float(count);
594 for (
uint UUID: UUIDs) {
602 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
604 double mean =
sum / double(count);
611 for (
uint UUID: UUIDs) {
619 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
628 for (
uint UUID: UUIDs) {
636 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
645 for (
uint UUID: UUIDs) {
653 helios_runtime_error(
"ERROR (Context::setObjectDataFromPrimitiveDataMean): No primitives in object " + std::to_string(objID) +
" have primitive data '" + label +
"'.");
664 bool nan_warning =
false;
665 for (
uint UUID: UUIDs) {
679 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
681 }
else if (nan_warning) {
682 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
684 awt_mean =
sum / area;
693 bool nan_warning =
false;
694 for (
uint UUID: UUIDs) {
702 sum += value * double(A);
708 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
710 }
else if (nan_warning) {
711 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
713 awt_mean =
sum / area;
721 bool nan_warning =
false;
722 for (
uint UUID: UUIDs) {
736 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
738 }
else if (nan_warning) {
739 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
741 awt_mean =
sum / area;
749 bool nan_warning =
false;
750 for (
uint UUID: UUIDs) {
764 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
766 }
else if (nan_warning) {
767 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
769 awt_mean =
sum / area;
777 bool nan_warning =
false;
778 for (
uint UUID: UUIDs) {
792 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
794 }
else if (nan_warning) {
795 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
797 awt_mean =
sum / area;
805 bool added_to_sum =
false;
806 for (
uint UUID: UUIDs) {
816 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
824 bool added_to_sum =
false;
825 for (
uint UUID: UUIDs) {
835 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
843 bool added_to_sum =
false;
844 for (
uint UUID: UUIDs) {
854 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
862 bool added_to_sum =
false;
863 for (
uint UUID: UUIDs) {
873 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
881 bool added_to_sum =
false;
882 for (
uint UUID: UUIDs) {
892 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
900 bool added_to_sum =
false;
901 bool nan_warning =
false;
902 for (
uint UUID: UUIDs) {
906 if (std::isnan(area)) {
911 awt_sum += value * area;
917 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
918 }
else if (nan_warning) {
919 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
927 bool added_to_sum =
false;
928 bool nan_warning =
false;
929 for (
uint UUID: UUIDs) {
933 if (std::isnan(area)) {
938 awt_sum += value * area;
944 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
945 }
else if (nan_warning) {
946 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
954 bool added_to_sum =
false;
955 bool nan_warning =
false;
956 for (
uint UUID: UUIDs) {
960 if (std::isnan(area)) {
965 awt_sum = awt_sum + value * area;
971 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
972 }
else if (nan_warning) {
973 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
981 bool added_to_sum =
false;
982 bool nan_warning =
false;
983 for (
uint UUID: UUIDs) {
987 if (std::isnan(area)) {
992 awt_sum = awt_sum + value * area;
998 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
999 }
else if (nan_warning) {
1000 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
1007 awt_sum =
make_vec4(0.f, 0.f, 0.f, 0.F);
1008 bool added_to_sum =
false;
1009 bool nan_warning =
false;
1010 for (
uint UUID: UUIDs) {
1014 if (std::isnan(area)) {
1019 awt_sum = awt_sum + value * area;
1020 added_to_sum =
true;
1024 if (!added_to_sum) {
1025 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
1026 }
else if (nan_warning) {
1027 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
1033 uint primitives_not_exist = 0;
1034 uint primitive_data_not_exist = 0;
1035 for (
uint UUID: UUIDs) {
1037 primitives_not_exist++;
1041 primitive_data_not_exist++;
1046 for (
float &data: primitives.at(UUID)->primitive_data_float[label]) {
1047 data *= scaling_factor;
1050 for (
double &data: primitives.at(UUID)->primitive_data_double[label]) {
1051 data *= scaling_factor;
1054 for (
auto &data: primitives.at(UUID)->primitive_data_vec2[label]) {
1055 data.x *= scaling_factor;
1056 data.y *= scaling_factor;
1059 for (
auto &data: primitives.at(UUID)->primitive_data_vec3[label]) {
1060 data.x *= scaling_factor;
1061 data.y *= scaling_factor;
1062 data.z *= scaling_factor;
1065 for (
auto &data: primitives.at(UUID)->primitive_data_vec4[label]) {
1066 data.x *= scaling_factor;
1067 data.y *= scaling_factor;
1068 data.z *= scaling_factor;
1069 data.w *= scaling_factor;
1072 helios_runtime_error(
"ERROR (Context::scalePrimitiveData): This operation only supports primitive data of type float, double, vec2, vec3, and vec4.");
1074 primitives.at(UUID)->dirty_flag =
true;
1077 if (primitives_not_exist > 0) {
1078 std::cerr <<
"WARNING (Context::scalePrimitiveData): " << primitives_not_exist <<
" of " << UUIDs.size() <<
" from the input UUID vector did not exist." << std::endl;
1080 if (primitive_data_not_exist > 0) {
1081 std::cerr <<
"WARNING (Context::scalePrimitiveData): Primitive data did not exist for " << primitive_data_not_exist <<
" primitives, and thus no scaling was applied." << std::endl;
1093 for (
uint UUID: UUIDs) {
1096 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1101 if (primitives.at(UUID)->primitive_data_types.at(label) ==
HELIOS_TYPE_INT) {
1102 for (
uint i = 0; i < size; i++) {
1103 primitives.at(UUID)->primitive_data_int.at(label).at(i) += increment;
1105 primitives.at(UUID)->dirty_flag =
true;
1107 warnings.
addWarning(
"increment_type_mismatch",
"Attempted to increment primitive data for type int, but data '" + std::string(label) +
"' does not have type int.");
1111 warnings.
report(std::cerr);
1118 for (
uint UUID: UUIDs) {
1121 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1126 if (primitives.at(UUID)->primitive_data_types.at(label) ==
HELIOS_TYPE_UINT) {
1127 for (
uint i = 0; i < size; i++) {
1128 primitives.at(UUID)->primitive_data_uint.at(label).at(i) += increment;
1130 primitives.at(UUID)->dirty_flag =
true;
1132 warnings.
addWarning(
"increment_type_mismatch",
"Attempted to increment Primitive data for type uint, but data '" + std::string(label) +
"' does not have type uint.");
1136 warnings.
report(std::cerr);
1143 for (
uint UUID: UUIDs) {
1146 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1152 for (
uint i = 0; i < size; i++) {
1153 primitives.at(UUID)->primitive_data_float.at(label).at(i) += increment;
1155 primitives.at(UUID)->dirty_flag =
true;
1157 warnings.
addWarning(
"increment_type_mismatch",
"Attempted to increment Primitive data for type float, but data '" + std::string(label) +
"' does not have type float.");
1161 warnings.
report(std::cerr);
1168 for (
uint UUID: UUIDs) {
1171 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1177 for (
uint i = 0; i < size; i++) {
1178 primitives.at(UUID)->primitive_data_double.at(label).at(i) += increment;
1180 primitives.at(UUID)->dirty_flag =
true;
1182 warnings.
addWarning(
"increment_type_mismatch",
"Attempted to increment Primitive data for type double, but data '" + std::string(label) +
"' does not have type double.");
1186 warnings.
report(std::cerr);
1191 uint primitives_not_exist = 0;
1192 uint primitive_data_not_exist = 0;
1194 float data_float = 0;
1195 double data_double = 0;
1205 for (
uint UUID: UUIDs) {
1207 primitives_not_exist++;
1213 bool init_type =
false;
1214 for (
const auto &label: primitive_data_labels) {
1222 data_type = data_type_current;
1225 if (data_type != data_type_current) {
1226 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataSum): Primitive data types are not consistent for UUID " + std::to_string(UUID));
1232 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1236 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1237 data_double += data;
1240 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1241 data_vec2 = data_vec2 + data;
1244 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1245 data_vec3 = data_vec3 + data;
1248 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1249 data_vec4 = data_vec4 + data;
1252 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1253 data_int = data_int + data;
1256 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1257 data_uint = data_uint + data;
1260 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1261 data_int2 = data_int2 + data;
1264 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1265 data_int3 = data_int3 + data;
1268 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1269 data_int4 = data_int4 + data;
1271 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataSum): This operation is not supported for string primitive data types.");
1276 primitive_data_not_exist++;
1311 if (primitives_not_exist > 0) {
1312 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataSum): " << primitives_not_exist <<
" of " << UUIDs.size() <<
" from the input UUID vector did not exist." << std::endl;
1314 if (primitive_data_not_exist > 0) {
1315 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataSum): Primitive data did not exist for " << primitive_data_not_exist
1316 <<
" primitives, and thus no scaling summation was performed and new primitive data was not created for this primitive." << std::endl;
1322 uint primitives_not_exist = 0;
1323 uint primitive_data_not_exist = 0;
1325 float data_float = 0;
1326 double data_double = 0;
1336 for (
uint UUID: UUIDs) {
1338 primitives_not_exist++;
1344 bool init_type =
false;
1346 for (
const auto &label: primitive_data_labels) {
1354 data_type = data_type_current;
1357 if (data_type != data_type_current) {
1358 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataProduct): Primitive data types are not consistent for UUID " + std::to_string(UUID));
1364 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1372 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1374 data_double *= data;
1380 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1382 data_vec2.
x *= data.
x;
1383 data_vec2.
y *= data.
y;
1389 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1391 data_vec3.
x *= data.
x;
1392 data_vec3.
y *= data.
y;
1393 data_vec3.
z *= data.
z;
1399 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1401 data_vec4.
x *= data.
x;
1402 data_vec4.
y *= data.
y;
1403 data_vec4.
z *= data.
z;
1404 data_vec4.
w *= data.
w;
1410 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1412 data_int = data_int * data;
1418 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1420 data_uint = data_uint * data;
1426 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1428 data_int2.
x *= data.
x;
1429 data_int2.
y *= data.
y;
1435 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1437 data_int3.
x *= data.
x;
1438 data_int3.
y *= data.
y;
1439 data_int3.
z *= data.
z;
1445 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1447 data_int4.
x *= data.
x;
1448 data_int4.
y *= data.
y;
1449 data_int4.
z *= data.
z;
1450 data_int4.
w *= data.
w;
1455 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataProduct): This operation is not supported for string primitive data types.");
1461 primitive_data_not_exist++;
1486 if (primitives_not_exist > 0) {
1487 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataProduct): " << primitives_not_exist <<
" of " << UUIDs.size() <<
" from the input UUID vector did not exist." << std::endl;
1489 if (primitive_data_not_exist > 0) {
1490 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataProduct): Primitive data did not exist for " << primitive_data_not_exist
1491 <<
" primitives, and thus no multiplication was performed and new primitive data was not created for this primitive." << std::endl;
1498 bool primitive_warning =
false;
1499 bool nan_warning =
false;
1501 for (
uint UUID: UUIDs) {
1505 if (std::isnan(A)) {
1513 primitive_warning =
true;
1517 if (primitive_warning) {
1518 std::cerr <<
"WARNING (Context::sumPrimitiveSurfaceArea): One or more primitives reference in the UUID vector did not exist." << std::endl;
1519 }
else if (nan_warning) {
1520 std::cerr <<
"WARNING (Context::sumPrimitiveSurfaceArea): One or more primitives had an area of NaN." << std::endl;
1526std::vector<uint>
Context::filterPrimitivesByData(
const std::vector<uint> &UUIDs,
const std::string &primitive_data_label,
float filter_value,
const std::string &comparator)
const {
1528 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1529 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1532 std::vector<uint> UUIDs_out = UUIDs;
1533 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1534 uint UUID = UUIDs_out.at(p);
1538 if (comparator ==
"==" && data == filter_value) {
1541 if (comparator ==
">" && data > filter_value) {
1544 if (comparator ==
"<" && data < filter_value) {
1547 if (comparator ==
">=" && data >= filter_value) {
1550 if (comparator ==
"<=" && data <= filter_value) {
1554 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1555 UUIDs_out.pop_back();
1557 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1558 UUIDs_out.pop_back();
1565std::vector<uint>
Context::filterPrimitivesByData(
const std::vector<uint> &UUIDs,
const std::string &primitive_data_label,
double filter_value,
const std::string &comparator)
const {
1567 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1568 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1571 std::vector<uint> UUIDs_out = UUIDs;
1572 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1573 uint UUID = UUIDs_out.at(p);
1577 if (comparator ==
"==" && data == filter_value) {
1580 if (comparator ==
">" && data > filter_value) {
1583 if (comparator ==
"<" && data < filter_value) {
1586 if (comparator ==
">=" && data >= filter_value) {
1589 if (comparator ==
"<=" && data <= filter_value) {
1593 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1594 UUIDs_out.pop_back();
1596 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1597 UUIDs_out.pop_back();
1604std::vector<uint>
Context::filterPrimitivesByData(
const std::vector<uint> &UUIDs,
const std::string &primitive_data_label,
int filter_value,
const std::string &comparator)
const {
1606 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1607 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1610 std::vector<uint> UUIDs_out = UUIDs;
1611 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1612 uint UUID = UUIDs_out.at(p);
1616 if (comparator ==
"==" && data == filter_value) {
1619 if (comparator ==
">" && data > filter_value) {
1622 if (comparator ==
"<" && data < filter_value) {
1625 if (comparator ==
">=" && data >= filter_value) {
1628 if (comparator ==
"<=" && data <= filter_value) {
1632 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1633 UUIDs_out.pop_back();
1635 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1636 UUIDs_out.pop_back();
1645 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1646 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1649 std::vector<uint> UUIDs_out = UUIDs;
1650 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1651 uint UUID = UUIDs_out.at(p);
1655 if (comparator ==
"==" && data == filter_value) {
1658 if (comparator ==
">" && data > filter_value) {
1661 if (comparator ==
"<" && data < filter_value) {
1664 if (comparator ==
">=" && data >= filter_value) {
1667 if (comparator ==
"<=" && data <= filter_value) {
1671 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1672 UUIDs_out.pop_back();
1674 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1675 UUIDs_out.pop_back();
1684 std::vector<uint> UUIDs_out = UUIDs;
1685 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1686 uint UUID = UUIDs_out.at(p);
1690 if (data != filter_value) {
1691 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1692 UUIDs_out.pop_back();
1695 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1696 UUIDs_out.pop_back();
1707 if (objects.find(objID) == objects.end()) {
1708 helios_runtime_error(
"ERROR (Context::getObjectDataType): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1711 return objects.at(objID)->getObjectDataType(label);
1715 const auto it = object_data_type_registry.find(label);
1716 if (it != object_data_type_registry.end()) {
1719 helios_runtime_error(
"ERROR (Context::getObjectDataType): Object data " + std::string(label) +
" does not exist.");
1725 if (objects.find(objID) == objects.end()) {
1726 helios_runtime_error(
"ERROR (Context::getObjectDataSize): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1729 return objects.at(objID)->getObjectDataSize(label);
1734 if (objects.find(objID) == objects.end()) {
1735 helios_runtime_error(
"ERROR (Context::doesObjectDataExist): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1738 return objects.at(objID)->doesObjectDataExist(label);
1744 if (objects.find(source_objID) == objects.end()) {
1745 helios_runtime_error(
"ERROR (Context::copyObjectData): Source object ID of " + std::to_string(source_objID) +
" does not exist in the Context.");
1746 }
else if (objects.find(destination_objID) == objects.end()) {
1747 helios_runtime_error(
"ERROR (Context::copyObjectData): Destination object ID of " + std::to_string(destination_objID) +
" does not exist in the Context.");
1751 const auto &dest_labels = objects.at(destination_objID)->object_data_types;
1752 for (
const auto &[label, type]: dest_labels) {
1753 decrementObjectDataLabelCounter(label);
1756 objects.at(destination_objID)->object_data_types = objects.at(source_objID)->object_data_types;
1758 objects.at(destination_objID)->object_data_int = objects.at(source_objID)->object_data_int;
1759 objects.at(destination_objID)->object_data_uint = objects.at(source_objID)->object_data_uint;
1760 objects.at(destination_objID)->object_data_float = objects.at(source_objID)->object_data_float;
1761 objects.at(destination_objID)->object_data_double = objects.at(source_objID)->object_data_double;
1762 objects.at(destination_objID)->object_data_vec2 = objects.at(source_objID)->object_data_vec2;
1763 objects.at(destination_objID)->object_data_vec3 = objects.at(source_objID)->object_data_vec3;
1764 objects.at(destination_objID)->object_data_vec4 = objects.at(source_objID)->object_data_vec4;
1765 objects.at(destination_objID)->object_data_int2 = objects.at(source_objID)->object_data_int2;
1766 objects.at(destination_objID)->object_data_int3 = objects.at(source_objID)->object_data_int3;
1767 objects.at(destination_objID)->object_data_int4 = objects.at(source_objID)->object_data_int4;
1768 objects.at(destination_objID)->object_data_string = objects.at(source_objID)->object_data_string;
1770 for (
const auto &[lbl, type]: objects.at(destination_objID)->object_data_types) {
1771 incrementObjectDataLabelCounter(lbl);
1778 if (objects.find(objID) == objects.end()) {
1779 helios_runtime_error(
"ERROR (Context::duplicateObjectData): Object ID of " + std::to_string(objID) +
" does not exist in the Context.");
1781 helios_runtime_error(
"ERROR (Context::duplicateObjectData): Object ID of " + std::to_string(objID) +
" does not have data with label " + std::string(old_label) +
".");
1787 if (!objects.at(objID)->doesObjectDataExist(new_label)) {
1788 incrementObjectDataLabelCounter(new_label);
1790 objects.at(objID)->object_data_types[new_label] = type;
1792 objects.at(objID)->object_data_int[new_label] = objects.at(objID)->object_data_int.at(old_label);
1794 objects.at(objID)->object_data_uint[new_label] = objects.at(objID)->object_data_uint.at(old_label);
1796 objects.at(objID)->object_data_float[new_label] = objects.at(objID)->object_data_float.at(old_label);
1798 objects.at(objID)->object_data_double[new_label] = objects.at(objID)->object_data_double.at(old_label);
1800 objects.at(objID)->object_data_vec2[new_label] = objects.at(objID)->object_data_vec2.at(old_label);
1802 objects.at(objID)->object_data_vec3[new_label] = objects.at(objID)->object_data_vec3.at(old_label);
1804 objects.at(objID)->object_data_vec4[new_label] = objects.at(objID)->object_data_vec4.at(old_label);
1806 objects.at(objID)->object_data_int2[new_label] = objects.at(objID)->object_data_int2.at(old_label);
1808 objects.at(objID)->object_data_int3[new_label] = objects.at(objID)->object_data_int3.at(old_label);
1810 objects.at(objID)->object_data_int4[new_label] = objects.at(objID)->object_data_int4.at(old_label);
1812 objects.at(objID)->object_data_string[new_label] = objects.at(objID)->object_data_string.at(old_label);
1822 if (objects.find(objID) == objects.end()) {
1823 helios_runtime_error(
"ERROR (Context::renameObjectData): Object ID of " + std::to_string(objID) +
" does not exist in the Context.");
1825 helios_runtime_error(
"ERROR (Context::renameObjectData): Object ID of " + std::to_string(objID) +
" does not have data with label " + std::string(old_label) +
".");
1835 if (objects.find(objID) == objects.end()) {
1836 helios_runtime_error(
"ERROR (Context::clearObjectData): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1840 std::string label_str = std::string(label);
1842 HeliosDataType data_type = objects.at(objID)->getObjectDataType(label);
1844 std::string cached_value;
1845 objects.at(objID)->getObjectData(label, cached_value);
1849 objects.at(objID)->getObjectData(label, cached_value);
1853 objects.at(objID)->getObjectData(label, cached_value);
1858 if (objects.at(objID)->doesObjectDataExist(label)) {
1859 decrementObjectDataLabelCounter(label);
1861 objects.at(objID)->clearObjectData(label);
1865 std::string label_str = std::string(label);
1866 for (
uint objID: objIDs) {
1868 if (objects.find(objID) == objects.end()) {
1869 helios_runtime_error(
"ERROR (Context::clearObjectData): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1874 HeliosDataType data_type = objects.at(objID)->getObjectDataType(label);
1876 std::string cached_value;
1877 objects.at(objID)->getObjectData(label, cached_value);
1881 objects.at(objID)->getObjectData(label, cached_value);
1885 objects.at(objID)->getObjectData(label, cached_value);
1890 if (objects.at(objID)->doesObjectDataExist(label)) {
1891 decrementObjectDataLabelCounter(label);
1893 objects.at(objID)->clearObjectData(label);
1905 helios_runtime_error(
"ERROR (CompoundObject::getObjectDataType): Object data " + std::string(label) +
" does not exist for object " + std::to_string(OID));
1909 return object_data_types.at(label);
1916 helios_runtime_error(
"ERROR (CompoundObject::getObjectDataSize): Object data " + std::string(label) +
" does not exist for object " + std::to_string(OID));
1923 return object_data_int.at(label).size();
1925 return object_data_uint.at(label).size();
1927 return object_data_float.at(label).size();
1929 return object_data_double.at(label).size();
1931 return object_data_vec2.at(label).size();
1933 return object_data_vec3.at(label).size();
1935 return object_data_vec4.at(label).size();
1937 return object_data_int2.at(label).size();
1939 return object_data_int3.at(label).size();
1941 return object_data_int4.at(label).size();
1943 return object_data_string.at(label).size();
1960 object_data_int.erase(label);
1961 object_data_types.erase(label);
1963 object_data_uint.erase(label);
1964 object_data_types.erase(label);
1966 object_data_float.erase(label);
1967 object_data_types.erase(label);
1969 object_data_double.erase(label);
1970 object_data_types.erase(label);
1972 object_data_vec2.erase(label);
1973 object_data_types.erase(label);
1975 object_data_vec3.erase(label);
1976 object_data_types.erase(label);
1978 object_data_vec4.erase(label);
1979 object_data_types.erase(label);
1981 object_data_int2.erase(label);
1982 object_data_types.erase(label);
1984 object_data_int3.erase(label);
1985 object_data_types.erase(label);
1987 object_data_int4.erase(label);
1988 object_data_types.erase(label);
1990 object_data_string.erase(label);
1991 object_data_types.erase(label);
1999 if (object_data_types.find(std::string(label)) == object_data_types.end()) {
2008 std::vector<std::string> labels;
2009 labels.reserve(object_data_types.size());
2011 for (
const auto &[label, type]: object_data_types) {
2012 labels.push_back(label);
2018std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
float filter_value,
const std::string &comparator)
const {
2020 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
2021 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
2024 std::vector<uint> objIDs_out = objIDs;
2025 for (std::size_t p = objIDs.size(); p-- > 0;) {
2026 uint objID = objIDs_out.at(p);
2030 if (comparator ==
"==" && data == filter_value) {
2032 }
else if (comparator ==
">" && data > filter_value) {
2034 }
else if (comparator ==
"<" && data < filter_value) {
2036 }
else if (comparator ==
">=" && data >= filter_value) {
2038 }
else if (comparator ==
"<=" && data <= filter_value) {
2042 std::swap(objIDs_out.at(p), objIDs_out.back());
2043 objIDs_out.pop_back();
2045 std::swap(objIDs_out.at(p), objIDs_out.back());
2046 objIDs_out.pop_back();
2053std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
double filter_value,
const std::string &comparator)
const {
2055 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
2056 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
2059 std::vector<uint> objIDs_out = objIDs;
2060 for (std::size_t p = objIDs.size(); p-- > 0;) {
2061 uint objID = objIDs_out.at(p);
2065 if (comparator ==
"==" && data == filter_value) {
2067 }
else if (comparator ==
">" && data > filter_value) {
2069 }
else if (comparator ==
"<" && data < filter_value) {
2071 }
else if (comparator ==
">=" && data >= filter_value) {
2073 }
else if (comparator ==
"<=" && data <= filter_value) {
2077 std::swap(objIDs_out.at(p), objIDs_out.back());
2078 objIDs_out.pop_back();
2080 std::swap(objIDs_out.at(p), objIDs_out.back());
2081 objIDs_out.pop_back();
2088std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
int filter_value,
const std::string &comparator)
const {
2090 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
2091 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
2094 std::vector<uint> objIDs_out = objIDs;
2095 for (std::size_t p = objIDs.size(); p-- > 0;) {
2096 uint objID = objIDs_out.at(p);
2100 if (comparator ==
"==" && data == filter_value) {
2102 }
else 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) {
2112 std::swap(objIDs_out.at(p), objIDs_out.back());
2113 objIDs_out.pop_back();
2115 std::swap(objIDs_out.at(p), objIDs_out.back());
2116 objIDs_out.pop_back();
2125 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
2126 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
2129 std::vector<uint> objIDs_out = objIDs;
2130 for (std::size_t p = objIDs.size(); p-- > 0;) {
2131 uint objID = objIDs_out.at(p);
2135 if (comparator ==
"==" && data == filter_value) {
2137 }
else 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) {
2147 std::swap(objIDs_out.at(p), objIDs_out.back());
2148 objIDs_out.pop_back();
2150 std::swap(objIDs_out.at(p), objIDs_out.back());
2151 objIDs_out.pop_back();
2158std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
const std::string &filter_value)
const {
2160 std::vector<uint> objIDs_out = objIDs;
2161 for (std::size_t p = objIDs.size(); p-- > 0;) {
2162 uint objID = objIDs_out.at(p);
2166 if (data != filter_value) {
2167 std::swap(objIDs_out.at(p), objIDs_out.back());
2168 objIDs_out.pop_back();
2171 std::swap(objIDs_out.at(p), objIDs_out.back());
2172 objIDs_out.pop_back();
2184 helios_runtime_error(
"ERROR (Context::duplicateGlobalData): Global data " + std::string(old_label) +
" does not exist in the Context.");
2194 helios_runtime_error(
"ERROR (Context::duplicateGlobalData): Global data " + std::string(old_label) +
" does not exist in the Context.");
2200 std::vector<int> gdata;
2204 std::vector<uint> gdata;
2208 std::vector<float> gdata;
2212 std::vector<double> gdata;
2216 std::vector<vec2> gdata;
2220 std::vector<vec3> gdata;
2224 std::vector<vec4> gdata;
2228 std::vector<int2> gdata;
2232 std::vector<int3> gdata;
2236 std::vector<int4> gdata;
2240 std::vector<std::string> gdata;
2251 globaldata.erase(label);
2258 helios_runtime_error(
"ERROR (Context::getGlobalDataType): Global data " + std::string(label) +
" does not exist in the Context.");
2261 return globaldata.at(label).type;
2267 helios_runtime_error(
"ERROR (Context::getGlobalDataSize): Global data " + std::string(label) +
" does not exist in the Context.");
2270 return globaldata.at(label).size;
2279 return globaldata.at(label).version;
2284 std::vector<std::string> labels;
2285 labels.reserve(globaldata.size());
2286 for (
const auto &[label, data]: globaldata) {
2287 labels.push_back(label);
2294 std::vector<std::string> labels;
2295 labels.reserve(primitive_data_label_counts.size());
2296 for (
const auto &[label, count]: primitive_data_label_counts) {
2298 labels.push_back(label);
2306 std::vector<std::string> labels;
2307 labels.reserve(object_data_label_counts.size());
2308 for (
const auto &[label, count]: object_data_label_counts) {
2310 labels.push_back(label);
2317 return globaldata.find(std::string(label)) != globaldata.end();
2323 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2329 for (
uint i = 0; i < size; i++) {
2330 globaldata.at(label).global_data_int.at(i) += increment;
2333 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type int, but data '" << label <<
"' does not have type int." << std::endl;
2340 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2346 for (
uint i = 0; i < size; i++) {
2347 globaldata.at(label).global_data_uint.at(i) += increment;
2350 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type uint, but data '" << label <<
"' does not have type uint." << std::endl;
2357 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2363 for (
uint i = 0; i < size; i++) {
2364 globaldata.at(label).global_data_float.at(i) += increment;
2367 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type float, but data '" << label <<
"' does not have type float." << std::endl;
2374 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2380 for (
uint i = 0; i < size; i++) {
2381 globaldata.at(label).global_data_double.at(i) += increment;
2384 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type double, but data '" << label <<
"' does not have type double." << std::endl;
2388std::string Context::dataTypeToString(
HeliosDataType type)
const {
2425 return (numeric_types.count(from_type) > 0 && numeric_types.count(to_type) > 0);