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;
544 bool nan_warning =
false;
545 for (
uint UUID: UUIDs) {
559 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
561 }
else if (nan_warning) {
562 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
564 awt_mean =
sum / area;
573 bool nan_warning =
false;
574 for (
uint UUID: UUIDs) {
582 sum += value * double(A);
588 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
590 }
else if (nan_warning) {
591 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
593 awt_mean =
sum / area;
601 bool nan_warning =
false;
602 for (
uint UUID: UUIDs) {
616 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
618 }
else if (nan_warning) {
619 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
621 awt_mean =
sum / area;
629 bool nan_warning =
false;
630 for (
uint UUID: UUIDs) {
644 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
646 }
else if (nan_warning) {
647 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
649 awt_mean =
sum / area;
657 bool nan_warning =
false;
658 for (
uint UUID: UUIDs) {
672 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
674 }
else if (nan_warning) {
675 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedMean): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
677 awt_mean =
sum / area;
685 bool added_to_sum =
false;
686 for (
uint UUID: UUIDs) {
696 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
704 bool added_to_sum =
false;
705 for (
uint UUID: UUIDs) {
715 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
723 bool added_to_sum =
false;
724 for (
uint UUID: UUIDs) {
734 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
742 bool added_to_sum =
false;
743 for (
uint UUID: UUIDs) {
753 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
761 bool added_to_sum =
false;
762 for (
uint UUID: UUIDs) {
772 std::cerr <<
"WARNING (Context::calculatePrimitiveDataSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
780 bool added_to_sum =
false;
781 bool nan_warning =
false;
782 for (
uint UUID: UUIDs) {
786 if (std::isnan(area)) {
791 awt_sum += value * area;
797 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
798 }
else if (nan_warning) {
799 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
807 bool added_to_sum =
false;
808 bool nan_warning =
false;
809 for (
uint UUID: UUIDs) {
813 if (std::isnan(area)) {
818 awt_sum += value * area;
824 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
825 }
else if (nan_warning) {
826 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
834 bool added_to_sum =
false;
835 bool nan_warning =
false;
836 for (
uint UUID: UUIDs) {
840 if (std::isnan(area)) {
845 awt_sum = awt_sum + value * area;
851 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
852 }
else if (nan_warning) {
853 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
861 bool added_to_sum =
false;
862 bool nan_warning =
false;
863 for (
uint UUID: UUIDs) {
867 if (std::isnan(area)) {
872 awt_sum = awt_sum + value * area;
878 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
879 }
else if (nan_warning) {
880 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
888 bool added_to_sum =
false;
889 bool nan_warning =
false;
890 for (
uint UUID: UUIDs) {
894 if (std::isnan(area)) {
899 awt_sum = awt_sum + value * area;
905 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): No primitives found with primitive data of '" << label <<
"'. Returning a value of 0." << std::endl;
906 }
else if (nan_warning) {
907 std::cerr <<
"WARNING (Context::calculatePrimitiveDataAreaWeightedSum): At least one primitive has an area of NaN and was excluded from calculations" << std::endl;
913 uint primitives_not_exist = 0;
914 uint primitive_data_not_exist = 0;
915 for (
uint UUID: UUIDs) {
917 primitives_not_exist++;
921 primitive_data_not_exist++;
926 for (
float &data: primitives.at(UUID)->primitive_data_float[label]) {
927 data *= scaling_factor;
930 for (
double &data: primitives.at(UUID)->primitive_data_double[label]) {
931 data *= scaling_factor;
934 for (
auto &data: primitives.at(UUID)->primitive_data_vec2[label]) {
935 data.x *= scaling_factor;
936 data.y *= scaling_factor;
939 for (
auto &data: primitives.at(UUID)->primitive_data_vec3[label]) {
940 data.x *= scaling_factor;
941 data.y *= scaling_factor;
942 data.z *= scaling_factor;
945 for (
auto &data: primitives.at(UUID)->primitive_data_vec4[label]) {
946 data.x *= scaling_factor;
947 data.y *= scaling_factor;
948 data.z *= scaling_factor;
949 data.w *= scaling_factor;
952 helios_runtime_error(
"ERROR (Context::scalePrimitiveData): This operation only supports primitive data of type float, double, vec2, vec3, and vec4.");
954 primitives.at(UUID)->dirty_flag =
true;
957 if (primitives_not_exist > 0) {
958 std::cerr <<
"WARNING (Context::scalePrimitiveData): " << primitives_not_exist <<
" of " << UUIDs.size() <<
" from the input UUID vector did not exist." << std::endl;
960 if (primitive_data_not_exist > 0) {
961 std::cerr <<
"WARNING (Context::scalePrimitiveData): Primitive data did not exist for " << primitive_data_not_exist <<
" primitives, and thus no scaling was applied." << std::endl;
971 for (
uint UUID: UUIDs) {
974 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
979 if (primitives.at(UUID)->primitive_data_types.at(label) ==
HELIOS_TYPE_INT) {
980 for (
uint i = 0; i < size; i++) {
981 primitives.at(UUID)->primitive_data_int.at(label).at(i) += increment;
983 primitives.at(UUID)->dirty_flag =
true;
985 std::cerr <<
"WARNING (Context::incrementPrimitiveData): Attempted to increment primitive data for type int, but data '" << label <<
"' does not have type int." << std::endl;
992 for (
uint UUID: UUIDs) {
995 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1000 if (primitives.at(UUID)->primitive_data_types.at(label) ==
HELIOS_TYPE_UINT) {
1001 for (
uint i = 0; i < size; i++) {
1002 primitives.at(UUID)->primitive_data_uint.at(label).at(i) += increment;
1004 primitives.at(UUID)->dirty_flag =
true;
1006 std::cerr <<
"WARNING (Context::incrementPrimitiveData): Attempted to increment Primitive data for type uint, but data '" << label <<
"' does not have type uint." << std::endl;
1013 for (
uint UUID: UUIDs) {
1016 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1022 for (
uint i = 0; i < size; i++) {
1023 primitives.at(UUID)->primitive_data_float.at(label).at(i) += increment;
1025 primitives.at(UUID)->dirty_flag =
true;
1027 std::cerr <<
"WARNING (Context::incrementPrimitiveData): Attempted to increment Primitive data for type float, but data '" << label <<
"' does not have type float." << std::endl;
1034 for (
uint UUID: UUIDs) {
1037 helios_runtime_error(
"ERROR (Context::incrementPrimitiveData): Primitive data " + std::string(label) +
" does not exist in the Context for primitive " + std::to_string(UUID) +
".");
1043 for (
uint i = 0; i < size; i++) {
1044 primitives.at(UUID)->primitive_data_double.at(label).at(i) += increment;
1046 primitives.at(UUID)->dirty_flag =
true;
1048 std::cerr <<
"WARNING (Context::incrementPrimitiveData): Attempted to increment Primitive data for type double, but data '" << label <<
"' does not have type double." << std::endl;
1055 uint primitives_not_exist = 0;
1056 uint primitive_data_not_exist = 0;
1058 float data_float = 0;
1059 double data_double = 0;
1069 for (
uint UUID: UUIDs) {
1071 primitives_not_exist++;
1077 bool init_type =
false;
1078 for (
const auto &label: primitive_data_labels) {
1086 data_type = data_type_current;
1089 if (data_type != data_type_current) {
1090 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataSum): Primitive data types are not consistent for UUID " + std::to_string(UUID));
1096 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1100 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1101 data_double += data;
1104 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1105 data_vec2 = data_vec2 + data;
1108 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1109 data_vec3 = data_vec3 + data;
1112 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1113 data_vec4 = data_vec4 + data;
1116 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1117 data_int = data_int + data;
1120 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1121 data_uint = data_uint + data;
1124 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1125 data_int2 = data_int2 + data;
1128 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1129 data_int3 = data_int3 + data;
1132 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1133 data_int4 = data_int4 + data;
1135 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataSum): This operation is not supported for string primitive data types.");
1140 primitive_data_not_exist++;
1175 if (primitives_not_exist > 0) {
1176 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataSum): " << primitives_not_exist <<
" of " << UUIDs.size() <<
" from the input UUID vector did not exist." << std::endl;
1178 if (primitive_data_not_exist > 0) {
1179 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataSum): Primitive data did not exist for " << primitive_data_not_exist
1180 <<
" primitives, and thus no scaling summation was performed and new primitive data was not created for this primitive." << std::endl;
1186 uint primitives_not_exist = 0;
1187 uint primitive_data_not_exist = 0;
1189 float data_float = 0;
1190 double data_double = 0;
1200 for (
uint UUID: UUIDs) {
1202 primitives_not_exist++;
1208 bool init_type =
false;
1210 for (
const auto &label: primitive_data_labels) {
1218 data_type = data_type_current;
1221 if (data_type != data_type_current) {
1222 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataProduct): Primitive data types are not consistent for UUID " + std::to_string(UUID));
1228 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1236 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1238 data_double *= data;
1244 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1246 data_vec2.
x *= data.
x;
1247 data_vec2.
y *= data.
y;
1253 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1255 data_vec3.
x *= data.
x;
1256 data_vec3.
y *= data.
y;
1257 data_vec3.
z *= data.
z;
1263 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1265 data_vec4.
x *= data.
x;
1266 data_vec4.
y *= data.
y;
1267 data_vec4.
z *= data.
z;
1268 data_vec4.
w *= data.
w;
1274 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1276 data_int = data_int * data;
1282 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1284 data_uint = data_uint * data;
1290 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1292 data_int2.
x *= data.
x;
1293 data_int2.
y *= data.
y;
1299 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1301 data_int3.
x *= data.
x;
1302 data_int3.
y *= data.
y;
1303 data_int3.
z *= data.
z;
1309 primitives.at(UUID)->getPrimitiveData(label.c_str(), data);
1311 data_int4.
x *= data.
x;
1312 data_int4.
y *= data.
y;
1313 data_int4.
z *= data.
z;
1314 data_int4.
w *= data.
w;
1319 helios_runtime_error(
"ERROR (Context::aggregatePrimitiveDataProduct): This operation is not supported for string primitive data types.");
1325 primitive_data_not_exist++;
1350 if (primitives_not_exist > 0) {
1351 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataProduct): " << primitives_not_exist <<
" of " << UUIDs.size() <<
" from the input UUID vector did not exist." << std::endl;
1353 if (primitive_data_not_exist > 0) {
1354 std::cerr <<
"WARNING (Context::aggregatePrimitiveDataProduct): Primitive data did not exist for " << primitive_data_not_exist
1355 <<
" primitives, and thus no multiplication was performed and new primitive data was not created for this primitive." << std::endl;
1362 bool primitive_warning =
false;
1363 bool nan_warning =
false;
1365 for (
uint UUID: UUIDs) {
1369 if (std::isnan(A)) {
1377 primitive_warning =
true;
1381 if (primitive_warning) {
1382 std::cerr <<
"WARNING (Context::sumPrimitiveSurfaceArea): One or more primitives reference in the UUID vector did not exist." << std::endl;
1383 }
else if (nan_warning) {
1384 std::cerr <<
"WARNING (Context::sumPrimitiveSurfaceArea): One or more primitives had an area of NaN." << std::endl;
1390std::vector<uint>
Context::filterPrimitivesByData(
const std::vector<uint> &UUIDs,
const std::string &primitive_data_label,
float filter_value,
const std::string &comparator)
const {
1392 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1393 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1396 std::vector<uint> UUIDs_out = UUIDs;
1397 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1398 uint UUID = UUIDs_out.at(p);
1402 if (comparator ==
"==" && data == filter_value) {
1405 if (comparator ==
">" && data > filter_value) {
1408 if (comparator ==
"<" && data < filter_value) {
1411 if (comparator ==
">=" && data >= filter_value) {
1414 if (comparator ==
"<=" && data <= filter_value) {
1418 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1419 UUIDs_out.pop_back();
1421 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1422 UUIDs_out.pop_back();
1429std::vector<uint>
Context::filterPrimitivesByData(
const std::vector<uint> &UUIDs,
const std::string &primitive_data_label,
double filter_value,
const std::string &comparator)
const {
1431 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1432 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1435 std::vector<uint> UUIDs_out = UUIDs;
1436 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1437 uint UUID = UUIDs_out.at(p);
1441 if (comparator ==
"==" && data == filter_value) {
1444 if (comparator ==
">" && data > filter_value) {
1447 if (comparator ==
"<" && data < filter_value) {
1450 if (comparator ==
">=" && data >= filter_value) {
1453 if (comparator ==
"<=" && data <= filter_value) {
1457 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1458 UUIDs_out.pop_back();
1460 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1461 UUIDs_out.pop_back();
1468std::vector<uint>
Context::filterPrimitivesByData(
const std::vector<uint> &UUIDs,
const std::string &primitive_data_label,
int filter_value,
const std::string &comparator)
const {
1470 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1471 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1474 std::vector<uint> UUIDs_out = UUIDs;
1475 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1476 uint UUID = UUIDs_out.at(p);
1480 if (comparator ==
"==" && data == filter_value) {
1483 if (comparator ==
">" && data > filter_value) {
1486 if (comparator ==
"<" && data < filter_value) {
1489 if (comparator ==
">=" && data >= filter_value) {
1492 if (comparator ==
"<=" && data <= filter_value) {
1496 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1497 UUIDs_out.pop_back();
1499 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1500 UUIDs_out.pop_back();
1509 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1510 helios_runtime_error(
"ERROR (Context::filterPrimitivesByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1513 std::vector<uint> UUIDs_out = UUIDs;
1514 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1515 uint UUID = UUIDs_out.at(p);
1519 if (comparator ==
"==" && data == filter_value) {
1522 if (comparator ==
">" && data > filter_value) {
1525 if (comparator ==
"<" && data < filter_value) {
1528 if (comparator ==
">=" && data >= filter_value) {
1531 if (comparator ==
"<=" && data <= filter_value) {
1535 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1536 UUIDs_out.pop_back();
1538 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1539 UUIDs_out.pop_back();
1548 std::vector<uint> UUIDs_out = UUIDs;
1549 for (std::size_t p = UUIDs.size(); p-- > 0;) {
1550 uint UUID = UUIDs_out.at(p);
1554 if (data != filter_value) {
1555 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1556 UUIDs_out.pop_back();
1559 std::swap(UUIDs_out.at(p), UUIDs_out.back());
1560 UUIDs_out.pop_back();
1571 if (objects.find(objID) == objects.end()) {
1572 helios_runtime_error(
"ERROR (Context::getObjectDataType): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1575 return objects.at(objID)->getObjectDataType(label);
1579 const auto it = object_data_type_registry.find(label);
1580 if (it != object_data_type_registry.end()) {
1583 helios_runtime_error(
"ERROR (Context::getObjectDataType): Object data " + std::string(label) +
" does not exist.");
1589 if (objects.find(objID) == objects.end()) {
1590 helios_runtime_error(
"ERROR (Context::getObjectDataSize): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1593 return objects.at(objID)->getObjectDataSize(label);
1598 if (objects.find(objID) == objects.end()) {
1599 helios_runtime_error(
"ERROR (Context::doesObjectDataExist): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1602 return objects.at(objID)->doesObjectDataExist(label);
1608 if (objects.find(source_objID) == objects.end()) {
1609 helios_runtime_error(
"ERROR (Context::copyObjectData): Source object ID of " + std::to_string(source_objID) +
" does not exist in the Context.");
1610 }
else if (objects.find(destination_objID) == objects.end()) {
1611 helios_runtime_error(
"ERROR (Context::copyObjectData): Destination object ID of " + std::to_string(destination_objID) +
" does not exist in the Context.");
1615 const auto &dest_labels = objects.at(destination_objID)->object_data_types;
1616 for (
const auto &[label, type]: dest_labels) {
1617 decrementObjectDataLabelCounter(label);
1620 objects.at(destination_objID)->object_data_types = objects.at(source_objID)->object_data_types;
1622 objects.at(destination_objID)->object_data_int = objects.at(source_objID)->object_data_int;
1623 objects.at(destination_objID)->object_data_uint = objects.at(source_objID)->object_data_uint;
1624 objects.at(destination_objID)->object_data_float = objects.at(source_objID)->object_data_float;
1625 objects.at(destination_objID)->object_data_double = objects.at(source_objID)->object_data_double;
1626 objects.at(destination_objID)->object_data_vec2 = objects.at(source_objID)->object_data_vec2;
1627 objects.at(destination_objID)->object_data_vec3 = objects.at(source_objID)->object_data_vec3;
1628 objects.at(destination_objID)->object_data_vec4 = objects.at(source_objID)->object_data_vec4;
1629 objects.at(destination_objID)->object_data_int2 = objects.at(source_objID)->object_data_int2;
1630 objects.at(destination_objID)->object_data_int3 = objects.at(source_objID)->object_data_int3;
1631 objects.at(destination_objID)->object_data_int4 = objects.at(source_objID)->object_data_int4;
1632 objects.at(destination_objID)->object_data_string = objects.at(source_objID)->object_data_string;
1634 for (
const auto &[lbl, type]: objects.at(destination_objID)->object_data_types) {
1635 incrementObjectDataLabelCounter(lbl);
1642 if (objects.find(objID) == objects.end()) {
1643 helios_runtime_error(
"ERROR (Context::duplicateObjectData): Object ID of " + std::to_string(objID) +
" does not exist in the Context.");
1645 helios_runtime_error(
"ERROR (Context::duplicateObjectData): Object ID of " + std::to_string(objID) +
" does not have data with label " + std::string(old_label) +
".");
1651 if (!objects.at(objID)->doesObjectDataExist(new_label)) {
1652 incrementObjectDataLabelCounter(new_label);
1654 objects.at(objID)->object_data_types[new_label] = type;
1656 objects.at(objID)->object_data_int[new_label] = objects.at(objID)->object_data_int.at(old_label);
1658 objects.at(objID)->object_data_uint[new_label] = objects.at(objID)->object_data_uint.at(old_label);
1660 objects.at(objID)->object_data_float[new_label] = objects.at(objID)->object_data_float.at(old_label);
1662 objects.at(objID)->object_data_double[new_label] = objects.at(objID)->object_data_double.at(old_label);
1664 objects.at(objID)->object_data_vec2[new_label] = objects.at(objID)->object_data_vec2.at(old_label);
1666 objects.at(objID)->object_data_vec3[new_label] = objects.at(objID)->object_data_vec3.at(old_label);
1668 objects.at(objID)->object_data_vec4[new_label] = objects.at(objID)->object_data_vec4.at(old_label);
1670 objects.at(objID)->object_data_int2[new_label] = objects.at(objID)->object_data_int2.at(old_label);
1672 objects.at(objID)->object_data_int3[new_label] = objects.at(objID)->object_data_int3.at(old_label);
1674 objects.at(objID)->object_data_int4[new_label] = objects.at(objID)->object_data_int4.at(old_label);
1676 objects.at(objID)->object_data_string[new_label] = objects.at(objID)->object_data_string.at(old_label);
1686 if (objects.find(objID) == objects.end()) {
1687 helios_runtime_error(
"ERROR (Context::renameObjectData): Object ID of " + std::to_string(objID) +
" does not exist in the Context.");
1689 helios_runtime_error(
"ERROR (Context::renameObjectData): Object ID of " + std::to_string(objID) +
" does not have data with label " + std::string(old_label) +
".");
1699 if (objects.find(objID) == objects.end()) {
1700 helios_runtime_error(
"ERROR (Context::clearObjectData): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1704 std::string label_str = std::string(label);
1706 HeliosDataType data_type = objects.at(objID)->getObjectDataType(label);
1708 std::string cached_value;
1709 objects.at(objID)->getObjectData(label, cached_value);
1713 objects.at(objID)->getObjectData(label, cached_value);
1717 objects.at(objID)->getObjectData(label, cached_value);
1722 if (objects.at(objID)->doesObjectDataExist(label)) {
1723 decrementObjectDataLabelCounter(label);
1725 objects.at(objID)->clearObjectData(label);
1729 std::string label_str = std::string(label);
1730 for (
uint objID: objIDs) {
1732 if (objects.find(objID) == objects.end()) {
1733 helios_runtime_error(
"ERROR (Context::clearObjectData): objID of " + std::to_string(objID) +
" does not exist in the Context.");
1738 HeliosDataType data_type = objects.at(objID)->getObjectDataType(label);
1740 std::string cached_value;
1741 objects.at(objID)->getObjectData(label, cached_value);
1745 objects.at(objID)->getObjectData(label, cached_value);
1749 objects.at(objID)->getObjectData(label, cached_value);
1754 if (objects.at(objID)->doesObjectDataExist(label)) {
1755 decrementObjectDataLabelCounter(label);
1757 objects.at(objID)->clearObjectData(label);
1769 helios_runtime_error(
"ERROR (CompoundObject::getObjectDataType): Object data " + std::string(label) +
" does not exist for object " + std::to_string(OID));
1773 return object_data_types.at(label);
1780 helios_runtime_error(
"ERROR (CompoundObject::getObjectDataSize): Object data " + std::string(label) +
" does not exist for object " + std::to_string(OID));
1787 return object_data_int.at(label).size();
1789 return object_data_uint.at(label).size();
1791 return object_data_float.at(label).size();
1793 return object_data_double.at(label).size();
1795 return object_data_vec2.at(label).size();
1797 return object_data_vec3.at(label).size();
1799 return object_data_vec4.at(label).size();
1801 return object_data_int2.at(label).size();
1803 return object_data_int3.at(label).size();
1805 return object_data_int4.at(label).size();
1807 return object_data_string.at(label).size();
1824 object_data_int.erase(label);
1825 object_data_types.erase(label);
1827 object_data_uint.erase(label);
1828 object_data_types.erase(label);
1830 object_data_float.erase(label);
1831 object_data_types.erase(label);
1833 object_data_double.erase(label);
1834 object_data_types.erase(label);
1836 object_data_vec2.erase(label);
1837 object_data_types.erase(label);
1839 object_data_vec3.erase(label);
1840 object_data_types.erase(label);
1842 object_data_vec4.erase(label);
1843 object_data_types.erase(label);
1845 object_data_int2.erase(label);
1846 object_data_types.erase(label);
1848 object_data_int3.erase(label);
1849 object_data_types.erase(label);
1851 object_data_int4.erase(label);
1852 object_data_types.erase(label);
1854 object_data_string.erase(label);
1855 object_data_types.erase(label);
1863 if (object_data_types.find(std::string(label)) == object_data_types.end()) {
1872 std::vector<std::string> labels;
1873 labels.reserve(object_data_types.size());
1875 for (
const auto &[label, type]: object_data_types) {
1876 labels.push_back(label);
1882std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
float filter_value,
const std::string &comparator)
const {
1884 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1885 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1888 std::vector<uint> objIDs_out = objIDs;
1889 for (std::size_t p = objIDs.size(); p-- > 0;) {
1890 uint objID = objIDs_out.at(p);
1894 if (comparator ==
"==" && data == filter_value) {
1896 }
else if (comparator ==
">" && data > filter_value) {
1898 }
else if (comparator ==
"<" && data < filter_value) {
1900 }
else if (comparator ==
">=" && data >= filter_value) {
1902 }
else if (comparator ==
"<=" && data <= filter_value) {
1906 std::swap(objIDs_out.at(p), objIDs_out.back());
1907 objIDs_out.pop_back();
1909 std::swap(objIDs_out.at(p), objIDs_out.back());
1910 objIDs_out.pop_back();
1917std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
double filter_value,
const std::string &comparator)
const {
1919 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1920 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1923 std::vector<uint> objIDs_out = objIDs;
1924 for (std::size_t p = objIDs.size(); p-- > 0;) {
1925 uint objID = objIDs_out.at(p);
1929 if (comparator ==
"==" && data == filter_value) {
1931 }
else if (comparator ==
">" && data > filter_value) {
1933 }
else if (comparator ==
"<" && data < filter_value) {
1935 }
else if (comparator ==
">=" && data >= filter_value) {
1937 }
else if (comparator ==
"<=" && data <= filter_value) {
1941 std::swap(objIDs_out.at(p), objIDs_out.back());
1942 objIDs_out.pop_back();
1944 std::swap(objIDs_out.at(p), objIDs_out.back());
1945 objIDs_out.pop_back();
1952std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
int filter_value,
const std::string &comparator)
const {
1954 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1955 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1958 std::vector<uint> objIDs_out = objIDs;
1959 for (std::size_t p = objIDs.size(); p-- > 0;) {
1960 uint objID = objIDs_out.at(p);
1964 if (comparator ==
"==" && data == filter_value) {
1966 }
else if (comparator ==
">" && data > filter_value) {
1968 }
else if (comparator ==
"<" && data < filter_value) {
1970 }
else if (comparator ==
">=" && data >= filter_value) {
1972 }
else if (comparator ==
"<=" && data <= filter_value) {
1976 std::swap(objIDs_out.at(p), objIDs_out.back());
1977 objIDs_out.pop_back();
1979 std::swap(objIDs_out.at(p), objIDs_out.back());
1980 objIDs_out.pop_back();
1989 if (comparator !=
"==" && comparator !=
">" && comparator !=
"<" && comparator !=
">=" && comparator !=
"<=") {
1990 helios_runtime_error(
"ERROR (Context::filterObjectsByData): Invalid comparator. Must be one of '==', '>', '<', '>=', or '<='.");
1993 std::vector<uint> objIDs_out = objIDs;
1994 for (std::size_t p = objIDs.size(); p-- > 0;) {
1995 uint objID = objIDs_out.at(p);
1999 if (comparator ==
"==" && data == filter_value) {
2001 }
else if (comparator ==
">" && data > filter_value) {
2003 }
else if (comparator ==
"<" && data < filter_value) {
2005 }
else if (comparator ==
">=" && data >= filter_value) {
2007 }
else if (comparator ==
"<=" && data <= filter_value) {
2011 std::swap(objIDs_out.at(p), objIDs_out.back());
2012 objIDs_out.pop_back();
2014 std::swap(objIDs_out.at(p), objIDs_out.back());
2015 objIDs_out.pop_back();
2022std::vector<uint>
Context::filterObjectsByData(
const std::vector<uint> &objIDs,
const std::string &object_data_label,
const std::string &filter_value)
const {
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 (data != filter_value) {
2031 std::swap(objIDs_out.at(p), objIDs_out.back());
2032 objIDs_out.pop_back();
2035 std::swap(objIDs_out.at(p), objIDs_out.back());
2036 objIDs_out.pop_back();
2048 helios_runtime_error(
"ERROR (Context::duplicateGlobalData): Global data " + std::string(old_label) +
" does not exist in the Context.");
2058 helios_runtime_error(
"ERROR (Context::duplicateGlobalData): Global data " + std::string(old_label) +
" does not exist in the Context.");
2064 std::vector<int> gdata;
2068 std::vector<uint> gdata;
2072 std::vector<float> gdata;
2076 std::vector<double> gdata;
2080 std::vector<vec2> gdata;
2084 std::vector<vec3> gdata;
2088 std::vector<vec4> gdata;
2092 std::vector<int2> gdata;
2096 std::vector<int3> gdata;
2100 std::vector<int4> gdata;
2104 std::vector<std::string> gdata;
2115 globaldata.erase(label);
2122 helios_runtime_error(
"ERROR (Context::getGlobalDataType): Global data " + std::string(label) +
" does not exist in the Context.");
2125 return globaldata.at(label).type;
2131 helios_runtime_error(
"ERROR (Context::getGlobalDataSize): Global data " + std::string(label) +
" does not exist in the Context.");
2134 return globaldata.at(label).size;
2139 std::vector<std::string> labels;
2140 labels.reserve(globaldata.size());
2141 for (
const auto &[label, data]: globaldata) {
2142 labels.push_back(label);
2149 std::vector<std::string> labels;
2150 labels.reserve(primitive_data_label_counts.size());
2151 for (
const auto &[label, count]: primitive_data_label_counts) {
2153 labels.push_back(label);
2161 std::vector<std::string> labels;
2162 labels.reserve(object_data_label_counts.size());
2163 for (
const auto &[label, count]: object_data_label_counts) {
2165 labels.push_back(label);
2172 return globaldata.find(std::string(label)) != globaldata.end();
2178 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2184 for (
uint i = 0; i < size; i++) {
2185 globaldata.at(label).global_data_int.at(i) += increment;
2188 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type int, but data '" << label <<
"' does not have type int." << std::endl;
2195 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2201 for (
uint i = 0; i < size; i++) {
2202 globaldata.at(label).global_data_uint.at(i) += increment;
2205 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type uint, but data '" << label <<
"' does not have type uint." << std::endl;
2212 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2218 for (
uint i = 0; i < size; i++) {
2219 globaldata.at(label).global_data_float.at(i) += increment;
2222 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type float, but data '" << label <<
"' does not have type float." << std::endl;
2229 helios_runtime_error(
"ERROR (Context::incrementGlobalData): Global data " + std::string(label) +
" does not exist in the Context.");
2235 for (
uint i = 0; i < size; i++) {
2236 globaldata.at(label).global_data_double.at(i) += increment;
2239 std::cerr <<
"WARNING (Context::incrementGlobalData): Attempted to increment global data for type double, but data '" << label <<
"' does not have type double." << std::endl;
2243std::string Context::dataTypeToString(
HeliosDataType type)
const {
2280 return (numeric_types.count(from_type) > 0 && numeric_types.count(to_type) > 0);