1848 VuoSceneObject_internal *o = (VuoSceneObject_internal *)
object;
1855 co->transform = o->transform;
1858 co->isRealSize = o->isRealSize;
1859 co->preservePhysicalSize = o->preservePhysicalSize;
1860 co->blendMode = o->blendMode;
1862 if (o->type == VuoSceneObjectSubType_Group && o->childObjects)
1867 VuoListAppendValue_VuoSceneObject(co->childObjects, VuoSceneObject_copy(object));
1872 if (o->type == VuoSceneObjectSubType_PerspectiveCamera
1873 || o->type == VuoSceneObjectSubType_StereoCamera
1874 || o->type == VuoSceneObjectSubType_OrthographicCamera
1875 || o->type == VuoSceneObjectSubType_FisheyeCamera)
1877 co->camera.fieldOfView = o->camera.fieldOfView;
1878 co->camera.width = o->camera.width;
1879 co->camera.distanceMin = o->camera.distanceMin;
1880 co->camera.distanceMax = o->camera.distanceMax;
1881 co->camera.confocalDistance = o->camera.confocalDistance;
1882 co->camera.intraocularDistance = o->camera.intraocularDistance;
1883 co->camera.vignetteWidth = o->camera.vignetteWidth;
1884 co->camera.vignetteSharpness = o->camera.vignetteSharpness;
1886 else if (o->type == VuoSceneObjectSubType_AmbientLight
1887 || o->type == VuoSceneObjectSubType_PointLight
1888 || o->type == VuoSceneObjectSubType_Spotlight)
1890 co->light.color = o->light.color;
1891 co->light.brightness = o->light.brightness;
1892 co->light.range = o->light.range;
1893 co->light.cone = o->light.cone;
1894 co->light.sharpness = o->light.sharpness;
1896 else if (o->type == VuoSceneObjectSubType_Text)
1900 co->text.scaleWithScene = o->text.scaleWithScene;
1901 co->text.wrapWidth = o->text.wrapWidth;
2029 json_object *o = NULL;
2032 if (json_object_object_get_ex(js,
"id", &o))
2033 id = json_object_get_int64(o);
2036 if (json_object_object_get_ex(js,
"type", &o))
2040 if (json_object_object_get_ex(js,
"mesh", &o))
2044 if (json_object_object_get_ex(js,
"shader", &o))
2047 bool isRealSize =
false;
2048 if (json_object_object_get_ex(js,
"isRealSize", &o))
2051 bool preservePhysicalSize =
false;
2052 if (json_object_object_get_ex(js,
"preservePhysicalSize", &o))
2056 if (json_object_object_get_ex(js,
"blendMode", &o))
2060 if (json_object_object_get_ex(js,
"childObjects", &o))
2063 float cameraFieldOfView;
2064 if (json_object_object_get_ex(js,
"cameraFieldOfView", &o))
2065 cameraFieldOfView = json_object_get_double(o);
2068 if (json_object_object_get_ex(js,
"cameraWidth", &o))
2069 cameraWidth = json_object_get_double(o);
2071 float cameraDistanceMin;
2072 if (json_object_object_get_ex(js,
"cameraDistanceMin", &o))
2073 cameraDistanceMin = json_object_get_double(o);
2075 float cameraDistanceMax;
2076 if (json_object_object_get_ex(js,
"cameraDistanceMax", &o))
2077 cameraDistanceMax = json_object_get_double(o);
2079 float cameraConfocalDistance;
2080 if (json_object_object_get_ex(js,
"cameraConfocalDistance", &o))
2081 cameraConfocalDistance = json_object_get_double(o);
2083 float cameraIntraocularDistance;
2084 if (json_object_object_get_ex(js,
"cameraIntraocularDistance", &o))
2085 cameraIntraocularDistance = json_object_get_double(o);
2087 float cameraVignetteWidth;
2088 if (json_object_object_get_ex(js,
"cameraVignetteWidth", &o))
2089 cameraVignetteWidth = json_object_get_double(o);
2091 float cameraVignetteSharpness;
2092 if (json_object_object_get_ex(js,
"cameraVignetteSharpness", &o))
2093 cameraVignetteSharpness = json_object_get_double(o);
2096 if (json_object_object_get_ex(js,
"lightColor", &o))
2099 float lightBrightness;
2100 if (json_object_object_get_ex(js,
"lightBrightness", &o))
2101 lightBrightness = json_object_get_double(o);
2104 if (json_object_object_get_ex(js,
"lightCone", &o))
2105 lightCone = json_object_get_double(o);
2108 if (json_object_object_get_ex(js,
"lightRange", &o))
2109 lightRange = json_object_get_double(o);
2111 float lightSharpness;
2112 if (json_object_object_get_ex(js,
"lightSharpness", &o))
2113 lightSharpness = json_object_get_double(o);
2116 if (json_object_object_get_ex(js,
"name", &o))
2119 json_object_object_get_ex(js,
"transform", &o);
2123 if (json_object_object_get_ex(js,
"text", &o))
2127 if (json_object_object_get_ex(js,
"textFont", &o))
2130 bool scaleWithScene =
false;
2131 if (json_object_object_get_ex(js,
"textScaleWithScene", &o))
2134 float wrapWidth = INFINITY;
2135 if (json_object_object_get_ex(js,
"textWrapWidth", &o))
2136 wrapWidth = json_object_get_double(o);
2141 case VuoSceneObjectSubType_Empty:
2144 case VuoSceneObjectSubType_Group:
2147 case VuoSceneObjectSubType_Mesh:
2150 VuoSceneObject_internal *so = (VuoSceneObject_internal *)obj;
2151 so->isRealSize = isRealSize;
2152 so->preservePhysicalSize = preservePhysicalSize;
2153 so->blendMode = blendMode;
2157 case VuoSceneObjectSubType_PerspectiveCamera:
2166 case VuoSceneObjectSubType_StereoCamera:
2173 cameraConfocalDistance,
2174 cameraIntraocularDistance
2177 case VuoSceneObjectSubType_OrthographicCamera:
2186 case VuoSceneObjectSubType_FisheyeCamera:
2193 cameraVignetteWidth,
2194 cameraVignetteSharpness
2197 case VuoSceneObjectSubType_AmbientLight:
2200 case VuoSceneObjectSubType_PointLight:
2203 case VuoSceneObjectSubType_Spotlight:
2206 case VuoSceneObjectSubType_Text:
2226 VuoSceneObject_internal *so = (VuoSceneObject_internal *)sceneObject;
2228 json_object *js = json_object_new_object();
2230 json_object_object_add(js,
"id", json_object_new_int64(so->id));
2235 case VuoSceneObjectSubType_Empty:
2238 case VuoSceneObjectSubType_Mesh:
2247 json_object_object_add(js,
"preservePhysicalSize",
VuoBoolean_getJson(so->preservePhysicalSize));
2253 case VuoSceneObjectSubType_Group:
2254 if (so->childObjects)
2258 case VuoSceneObjectSubType_PerspectiveCamera:
2259 case VuoSceneObjectSubType_StereoCamera:
2260 case VuoSceneObjectSubType_OrthographicCamera:
2261 case VuoSceneObjectSubType_FisheyeCamera:
2263 if (so->type != VuoSceneObjectSubType_FisheyeCamera)
2265 json_object_object_add(js,
"cameraDistanceMin", json_object_new_double(so->camera.distanceMin));
2266 json_object_object_add(js,
"cameraDistanceMax", json_object_new_double(so->camera.distanceMax));
2269 if (so->type == VuoSceneObjectSubType_PerspectiveCamera
2270 || so->type == VuoSceneObjectSubType_StereoCamera
2271 || so->type == VuoSceneObjectSubType_FisheyeCamera)
2272 json_object_object_add(js,
"cameraFieldOfView", json_object_new_double(so->camera.fieldOfView));
2274 if (so->type == VuoSceneObjectSubType_StereoCamera)
2276 json_object_object_add(js,
"cameraConfocalDistance", json_object_new_double(so->camera.confocalDistance));
2277 json_object_object_add(js,
"cameraIntraocularDistance", json_object_new_double(so->camera.intraocularDistance));
2280 if (so->type == VuoSceneObjectSubType_OrthographicCamera)
2281 json_object_object_add(js,
"cameraWidth", json_object_new_double(so->camera.width));
2283 if (so->type == VuoSceneObjectSubType_FisheyeCamera)
2285 json_object_object_add(js,
"cameraVignetteWidth", json_object_new_double(so->camera.vignetteWidth));
2286 json_object_object_add(js,
"cameraVignetteSharpness", json_object_new_double(so->camera.vignetteSharpness));
2292 case VuoSceneObjectSubType_AmbientLight:
2293 case VuoSceneObjectSubType_PointLight:
2294 case VuoSceneObjectSubType_Spotlight:
2296 json_object_object_add(js,
"lightColor",
VuoColor_getJson(so->light.color));
2297 json_object_object_add(js,
"lightBrightness", json_object_new_double(so->light.brightness));
2299 if (so->type == VuoSceneObjectSubType_PointLight
2300 || so->type == VuoSceneObjectSubType_Spotlight)
2302 json_object_object_add(js,
"lightRange", json_object_new_double(so->light.range));
2303 json_object_object_add(js,
"lightSharpness", json_object_new_double(so->light.sharpness));
2305 if (so->type == VuoSceneObjectSubType_Spotlight)
2306 json_object_object_add(js,
"lightCone", json_object_new_double(so->light.cone));
2311 case VuoSceneObjectSubType_Text:
2316 json_object_object_add(js,
"textFont",
VuoFont_getJson(so->text.font));
2321 json_object_object_add(js,
"textScaleWithScene",
VuoBoolean_getJson(so->text.scaleWithScene));
2322 json_object_object_add(js,
"textWrapWidth",
VuoReal_getJson(so->text.wrapWidth));
2331 if (so->type != VuoSceneObjectSubType_AmbientLight)
2424 return strdup(
"No object");
2426 VuoSceneObject_internal *so = (VuoSceneObject_internal *)sceneObject;
2428 if (so->type == VuoSceneObjectSubType_Text)
2431 char *textSummary =
VuoText_format(
"<div>\"%s\"</div><div>%sat (%g,%g)</div><div>ID %llu</div>", so->text.text, fontSummary, so->transform.translation.x, so->transform.translation.y, so->id);
2436 if (so->type == VuoSceneObjectSubType_PerspectiveCamera
2437 || so->type == VuoSceneObjectSubType_StereoCamera
2438 || so->type == VuoSceneObjectSubType_OrthographicCamera
2439 || so->type == VuoSceneObjectSubType_FisheyeCamera)
2442 type[0] = toupper(type[0]);
2444 float cameraViewValue = 0;
2445 const char *cameraViewString =
"";
2446 if (so->type == VuoSceneObjectSubType_PerspectiveCamera)
2448 cameraViewValue = so->camera.fieldOfView;
2449 cameraViewString =
"° field of view";
2451 else if (so->type == VuoSceneObjectSubType_StereoCamera)
2453 cameraViewValue = so->camera.fieldOfView;
2454 cameraViewString =
"° field of view (stereoscopic)";
2456 else if (so->type == VuoSceneObjectSubType_OrthographicCamera)
2458 cameraViewValue = so->camera.width;
2459 cameraViewString =
" unit width";
2461 else if (so->type == VuoSceneObjectSubType_FisheyeCamera)
2463 cameraViewValue = so->camera.fieldOfView;
2464 cameraViewString =
"° field of view (fisheye)";
2469 const char *rotationLabel;
2470 char *rotationString;
2471 if (so->transform.type == VuoTransformTypeEuler)
2473 rotationLabel =
"Rotated";
2478 rotationLabel =
"Target";
2482 char *valueAsString =
VuoText_format(
"<div>%s named \"%s\"</div>\n<div>At (%s)</div>\n<div>%s (%s)</div>\n<div>%g%s</div>\n<div>Shows objects between depth %g and %g</div>",
2483 type, so->name ? so->name :
"",
2485 rotationLabel, rotationString,
2486 cameraViewValue, cameraViewString,
2487 so->camera.distanceMin, so->camera.distanceMax);
2488 free(rotationString);
2489 free(translationString);
2491 return valueAsString;
2494 if (so->type == VuoSceneObjectSubType_AmbientLight
2495 || so->type == VuoSceneObjectSubType_PointLight
2496 || so->type == VuoSceneObjectSubType_Spotlight)
2499 type[0] = toupper(type[0]);
2503 char *positionRangeString;
2504 if (so->type == VuoSceneObjectSubType_PointLight
2505 || so->type == VuoSceneObjectSubType_Spotlight)
2509 positionRangeString =
VuoText_format(
"\n<div>Position (%s)</div>\n<div>Range %g units (%g sharpness)</div>",
2510 positionString, so->light.range, so->light.sharpness);
2512 free(positionString);
2515 positionRangeString = strdup(
"");
2517 char *directionConeString;
2518 if (so->type == VuoSceneObjectSubType_Spotlight)
2523 directionConeString =
VuoText_format(
"\n<div>Direction (%s)</div>\n<div>Cone %g°</div>",
2524 directionString, so->light.cone * 180./M_PI);
2526 free(directionString);
2529 directionConeString = strdup(
"");
2531 char *valueAsString =
VuoText_format(
"<div>%s</div>\n<div>Color %s</div>\n<div>Brightness %g</div>%s%s",
2532 type, colorString, so->light.brightness, positionRangeString, directionConeString);
2534 free(directionConeString);
2535 free(positionRangeString);
2539 return valueAsString;
2547 unsigned long childObjectCount = 0;
2548 if (so->type == VuoSceneObjectSubType_Group && so->childObjects)
2550 const char *childObjectPlural = childObjectCount == 1 ?
"" :
"s";
2553 if (childObjectCount)
2555 unsigned long descendantCount = 0;
2556 unsigned long totalVertexCount = 0;
2557 unsigned long totalElementCount = 0;
2559 const char *descendantPlural = descendantCount == 1 ?
"" :
"s";
2561 descendants =
VuoText_format(
"\n<div>%ld descendant%s</div>\n<div>Total, including descendants:</div>\n<div>%ld vertices, %ld elements</div>",
2562 descendantCount, descendantPlural, totalVertexCount, totalElementCount);
2565 descendants = strdup(
"");
2569 char *shaderNamesSummary;
2573 const char *header =
"\n<div>Shaders:<ul>";
2575 VuoInteger shaderNameLength = strlen(header);
2576 for (
VuoInteger i = 1; i <= shaderNameCount; ++i)
2578 shaderNameLength += strlen(
"</ul></div>");
2580 shaderNamesSummary = (
char *)malloc(shaderNameLength + 1);
2581 char *t = shaderNamesSummary;
2582 t = strcpy(t, header) + strlen(header);
2583 for (
VuoInteger i = 1; i <= shaderNameCount; ++i)
2585 t = strcpy(t,
"\n<li>") + strlen(
"\n<li>");
2587 t = strcpy(t,
"</li>") + strlen(
"</li>");
2589 t = strcpy(t,
"</ul></div>");
2592 shaderNamesSummary = strdup(
"");
2597 name =
VuoText_format(
"<div>Object named \"%s\"</div>\n", so->name);
2599 char *valueAsString =
VuoText_format(
"%s<div>%ld vertices, %ld elements</div>\n<div>%s</div>\n<div>ID %lld</div>\n<div>%ld child object%s</div>%s%s",
2601 vertexCount, elementCount,
2604 childObjectCount, childObjectPlural,
2605 descendants, shaderNamesSummary);
2610 free(shaderNamesSummary);
2612 return valueAsString;
2669 __block
unsigned long triangleVertexCount = 0;
2670 __block
unsigned long trianglePrimitiveCount = 0;
2673 __block
unsigned long lineVertexCount = 0;
2674 __block
unsigned long linePrimitiveCount = 0;
2675 __block
double linePrimitiveSize = 0;
2677 __block
unsigned long pointVertexCount = 0;
2678 __block
unsigned long pointPrimitiveCount = 0;
2679 __block
double pointPrimitiveSize = 0;
2682 VuoSceneObject_internal *co = (VuoSceneObject_internal *)currentObject;
2688 unsigned int vertexCount;
2689 VuoMesh_getCPUBuffers(co->mesh, &vertexCount,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr);
2695 triangleVertexCount += vertexCount;
2702 lineVertexCount += vertexCount;
2708 pointVertexCount += vertexCount;
2717 if (!trianglePrimitiveCount && !linePrimitiveCount && !pointPrimitiveCount)
2721 unsigned int *triangleElements =
nullptr;
2722 float *trianglePositions =
nullptr, *triangleNormals =
nullptr, *triangleTextureCoordinates =
nullptr;
2723 unsigned int *lineElements =
nullptr;
2724 float *linePositions =
nullptr, *lineNormals =
nullptr, *lineTextureCoordinates =
nullptr;
2725 unsigned int *pointElements =
nullptr;
2726 float *pointPositions =
nullptr, *pointNormals =
nullptr, *pointTextureCoordinates =
nullptr;
2727 if (trianglePrimitiveCount)
2728 VuoMesh_allocateCPUBuffers(triangleVertexCount, &trianglePositions, &triangleNormals, &triangleTextureCoordinates,
nullptr, trianglePrimitiveCount * 3, &triangleElements);
2729 if (linePrimitiveCount)
2730 VuoMesh_allocateCPUBuffers(lineVertexCount, &linePositions, &lineNormals, &lineTextureCoordinates,
nullptr, linePrimitiveCount * 2, &lineElements);
2731 if (pointPrimitiveCount)
2732 VuoMesh_allocateCPUBuffers(pointVertexCount, &pointPositions, &pointNormals, &pointTextureCoordinates,
nullptr, pointPrimitiveCount, &pointElements);
2735 __block
unsigned long triangleVertexIndex = 0;
2736 __block
unsigned long triangleElementIndex = 0;
2737 __block
unsigned long lineVertexIndex = 0;
2738 __block
unsigned long lineElementIndex = 0;
2739 __block
unsigned long pointVertexIndex = 0;
2740 __block
unsigned long pointElementIndex = 0;
2741 __block
bool anyTextureCoordinates =
false;
2743 VuoSceneObject_internal *co = (VuoSceneObject_internal *)currentObject;
2749 unsigned int vertexCount, elementCount, *elements;
2750 float *positions, *normals, *textureCoordinates;
2751 VuoMesh_getCPUBuffers(co->mesh, &vertexCount, &positions, &normals, &textureCoordinates,
nullptr, &elementCount, &elements);
2753 if (textureCoordinates)
2754 anyTextureCoordinates =
true;
2760 unsigned long indexOffset = triangleVertexIndex;
2761 for (
unsigned int n = 0; n < vertexCount; ++n)
2774 if (textureCoordinates)
2777 ++triangleVertexIndex;
2783 for (
unsigned int n = 0; n < elementCount; ++n)
2784 triangleElements[triangleElementIndex++] = indexOffset + elements[n];
2786 for (
unsigned int n = 0; n < vertexCount; ++n)
2787 triangleElements[triangleElementIndex++] = indexOffset + n;
2793 for (
unsigned int n = 2; n < elementCount; ++n)
2796 triangleElements[triangleElementIndex++] = indexOffset + elements[n-2];
2797 triangleElements[triangleElementIndex++] = indexOffset + elements[n-1];
2798 triangleElements[triangleElementIndex++] = indexOffset + elements[n ];
2802 triangleElements[triangleElementIndex++] = indexOffset + elements[n-1];
2803 triangleElements[triangleElementIndex++] = indexOffset + elements[n-2];
2804 triangleElements[triangleElementIndex++] = indexOffset + elements[n ];
2807 for (
unsigned int n = 0; n < vertexCount; ++n)
2810 triangleElements[triangleElementIndex++] = indexOffset + n-2;
2811 triangleElements[triangleElementIndex++] = indexOffset + n-1;
2812 triangleElements[triangleElementIndex++] = indexOffset + n ;
2816 triangleElements[triangleElementIndex++] = indexOffset + n-1;
2817 triangleElements[triangleElementIndex++] = indexOffset + n-2;
2818 triangleElements[triangleElementIndex++] = indexOffset + n ;
2825 for (
unsigned int n = 2; n < elementCount; ++n)
2827 triangleElements[triangleElementIndex++] = indexOffset + elements[0 ];
2828 triangleElements[triangleElementIndex++] = indexOffset + elements[n-1];
2829 triangleElements[triangleElementIndex++] = indexOffset + elements[n ];
2832 for (
unsigned int n = 2; n < vertexCount; ++n)
2834 triangleElements[triangleElementIndex++] = indexOffset + 0;
2835 triangleElements[triangleElementIndex++] = indexOffset + n-1;
2836 triangleElements[triangleElementIndex++] = indexOffset + n;
2843 unsigned long indexOffset = lineVertexIndex;
2844 for (
unsigned int n = 0; n < vertexCount; ++n)
2857 if (textureCoordinates)
2866 for (
unsigned int n = 0; n < elementCount; ++n)
2867 lineElements[lineElementIndex++] = indexOffset + elements[n];
2869 for (
unsigned int n = 0; n < vertexCount; ++n)
2870 lineElements[lineElementIndex++] = indexOffset + n;
2876 for (
unsigned int n = 1; n < elementCount; ++n)
2878 lineElements[lineElementIndex++] = indexOffset + elements[n-1];
2879 lineElements[lineElementIndex++] = indexOffset + elements[n ];
2882 for (
unsigned int n = 1; n < vertexCount; ++n)
2884 lineElements[lineElementIndex++] = indexOffset + n-1;
2885 lineElements[lineElementIndex++] = indexOffset + n;
2891 unsigned long indexOffset = pointVertexIndex;
2892 for (
unsigned int n = 0; n < vertexCount; ++n)
2905 if (textureCoordinates)
2913 for (
unsigned int n = 0; n < elementCount; ++n)
2914 pointElements[pointElementIndex++] = indexOffset + elements[n];
2917 for (
unsigned int n = 0; n < vertexCount; ++n)
2918 pointElements[pointElementIndex++] = indexOffset + n;
2926 VuoMesh triangleMesh =
nullptr;
2929 if (trianglePrimitiveCount)
2931 if (!anyTextureCoordinates)
2933 free(triangleTextureCoordinates);
2934 triangleTextureCoordinates =
nullptr;
2939 if (linePrimitiveCount)
2941 if (!anyTextureCoordinates)
2943 free(lineTextureCoordinates);
2944 lineTextureCoordinates =
nullptr;
2949 if (pointPrimitiveCount)
2951 if (!anyTextureCoordinates)
2953 free(pointTextureCoordinates);
2954 pointTextureCoordinates =
nullptr;
2960 if (triangleMesh && !lineMesh && !pointMesh)
2962 else if (!triangleMesh && lineMesh && !pointMesh)
2964 else if (!triangleMesh && !lineMesh && pointMesh)