18 "title" :
"Window State",
19 "description" :
"A set of layers, transformed to their final positions for rendering",
29 "VuoList_VuoInteraction",
30 "VuoList_VuoSceneObject"
47 unsigned long int pixelsWide,
48 unsigned long int pixelsHigh,
49 float backingScaleFactor,
53 rl.rootSceneObject = rootSceneObject;
54 rl.pixelsWide = pixelsWide;
55 rl.pixelsHigh = pixelsHigh;
56 rl.backingScaleFactor = backingScaleFactor;
58 rl.interactions = interactions;
59 rl.hasRootSceneObject =
true;
60 rl.hasRenderingDimensions =
true;
71 unsigned long int pixelsWide,
unsigned long int pixelsHigh,
72 float backingScaleFactor,
77 rl.rootSceneObject = rootSceneObject;
78 rl.pixelsWide = pixelsWide;
79 rl.pixelsHigh = pixelsHigh;
80 rl.backingScaleFactor = backingScaleFactor;
82 rl.interactions = interactions;
83 rl.hasRootSceneObject =
true;
84 rl.hasRenderingDimensions =
true;
97 rl.interactions = NULL;
99 rl.hasRootSceneObject =
false;
102 rl.hasRenderingDimensions =
false;
105 rl.backingScaleFactor = 1;
107 rl.hasWindow =
false;
119 renderedLayers->interactions = interactions;
125 renderedLayers->hasRootSceneObject =
true;
126 renderedLayers->rootSceneObject = rootSceneObject;
132 renderedLayers->hasWindow =
true;
133 renderedLayers->window = window;
142 if (renderedLayers.interactions)
144 *interactions = renderedLayers.interactions;
154 if (renderedLayers.hasRootSceneObject)
156 *rootSceneObject = renderedLayers.rootSceneObject;
166 if (renderedLayers.hasRenderingDimensions)
168 *pixelsWide = renderedLayers.pixelsWide;
169 *pixelsHigh = renderedLayers.pixelsHigh;
170 *backingScaleFactor = renderedLayers.backingScaleFactor;
180 if (renderedLayers.hasWindow)
182 *window = renderedLayers.window;
199 if (! hasWindow || oldWindow != window)
219 bool *renderingDimensionsChanged)
221 *renderingDimensionsChanged =
false;
223 VuoRetain(newerRenderedLayers.interactions);
224 VuoRelease(accumulatedRenderedLayers->interactions);
239 VuoRelease(accumulatedRenderedLayers->window);
247 float backingScaleFactor;
250 if (! accumulatedRenderedLayers->hasRenderingDimensions ||
251 accumulatedRenderedLayers->pixelsWide != pixelsWide || accumulatedRenderedLayers->pixelsHigh != pixelsHigh || accumulatedRenderedLayers->backingScaleFactor != backingScaleFactor)
252 *renderingDimensionsChanged =
true;
254 accumulatedRenderedLayers->hasRenderingDimensions =
true;
255 accumulatedRenderedLayers->pixelsWide = pixelsWide;
256 accumulatedRenderedLayers->pixelsHigh = pixelsHigh;
257 accumulatedRenderedLayers->backingScaleFactor = backingScaleFactor;
266 return VuoSceneObject_find(renderedLayers.rootSceneObject, layerName, ancestorObjects, foundObject);
285 VuoPoint3d* layerCenter3d,
286 VuoPoint3d layerCorners3d[4],
287 bool applyTargetTransform)
290 VuoPoint3d center = *layerCenter3d;
291 bool isText = targetObject.type == VuoSceneObjectSubType_Text && targetObject.text != NULL;
293 if (targetObject.
isRealSize || (isText && !targetObject.scaleWithScene))
300 if(applyTargetTransform)
306 for (
unsigned long i = ancestorObjectCount; i >= 1; --i)
320 if(applyTargetTransform)
324 for(
int i = 0; i < 4; i++)
330 for (
unsigned long i = ancestorObjectCount; i >= 1; --i)
334 if(layerCorners3d != NULL)
336 for (
int i = 0; i < 4; ++i)
343 *layerCenter3d = center;
353 if( targetObject.mesh == NULL ||
374 VuoPoint3d c = layerCorners3d[0];
376 for(
int i = 1; i < 4; i++)
378 c.x += layerCorners3d[i].x;
379 c.y += layerCorners3d[i].y;
390 bool foundRect = rectIsInitialized;
391 VuoPoint2d layerCenter;
392 VuoPoint2d layerCorners[4];
395 float localToWorldMatrix[16];
396 float modelMatrix[16];
405 if(rectIsInitialized)
415 for(
int i = 1; i <= children; i++)
431 float identity[16] = {
450 VuoPoint2d *layerCenter,
451 VuoPoint2d layerCorners[4],
452 bool includeChildrenInBounds)
454 for (
int i = 0; i < 4; ++i)
455 layerCorners[i] = (VuoPoint2d){NAN,NAN};
458 VuoPoint3d layerCorners3d[4];
460 if(includeChildrenInBounds)
467 VuoPoint2d c = rect.center;
481 bool isText = targetObject.type == VuoSceneObjectSubType_Text && targetObject.text != NULL;
484 if(!includeChildrenInBounds && !isText && targetObject.shader != NULL)
486 for (
int i = 0; i < 4; ++i)
488 layerCorners3d[i].x *= targetObject.shader->
objectScale;
489 layerCorners3d[i].y *= targetObject.shader->
objectScale;
498 for (
int i = 0; i < 4; ++i)
499 layerCorners[i] =
VuoPoint2d_make(layerCorners3d[i].x, layerCorners3d[i].y);
511 if(targetObject.shader == NULL)
551 float localToWorldMatrix[16];
553 float modelMatrix[16];
560 for(
int i = count; i > 0; i--)
570 float worldToLocalMatrix[16];
576 if(targetObject.shader != NULL)
593 VuoPoint3d layerCorners3d[4];
598 bool isText = targetObject.type == VuoSceneObjectSubType_Text && targetObject.text != NULL;
600 if(targetObject.shader == NULL && !isText)
605 for (
int i = 0; i < 4; ++i)
607 layerCorners3d[i].x *= targetObject.shader->
objectScale;
608 layerCorners3d[i].y *= targetObject.shader->
objectScale;
621 float widthScale = 1, heightScale = 1;
626 float verticalScale = 1.;
627 float rotationZ = 0.;
628 if (targetObject.scaleWithScene)
631 widthScale = transform.scale.x;
632 verticalScale = transform.scale.y / transform.scale.x;
636 VuoPoint2d size =
VuoRenderedLayers_getTextSize(renderedLayers, targetObject.text, targetObject.font, targetObject.scaleWithScene, verticalScale, rotationZ, targetObject.wrapWidth,
true);
640 renderedLayers.backingScaleFactor);
642 widthScale *= size.x;
643 heightScale *= size.y;
649 widthScale = 2. * (float)image->
pixelsWide / (
float)renderedLayers.pixelsWide;
652 VuoReal combinedScaleFactor = 1;
655 combinedScaleFactor = renderedLayers.backingScaleFactor / image->
scaleFactor;
657 widthScale *= combinedScaleFactor;
658 heightScale *= combinedScaleFactor;
661 for (
int i = 0; i < 4; ++i)
663 layerCorners3d[i].x *= widthScale;
664 layerCorners3d[i].y *= heightScale;
666 layerCorners3d[i].x += center.x;
667 layerCorners3d[i].y += center.y;
674 for (
int i = 0; i < 4; ++i)
680 for (
int i = 0; i < 4; ++i)
681 layerCorners[i] =
VuoPoint2d_make(layerCorners3d[i].x, layerCorners3d[i].y);
695 if (!scaleWithScene && (renderedLayers.pixelsWide < 1 || renderedLayers.pixelsHigh < 1))
700 float w = textBounds.size.x;
701 float h = textBounds.size.y;
707 size.x = (w / (float)renderedLayers.pixelsWide) * 2;
708 size.y = size.x * (h / w);
720 for (
int i = 0; i < 4; ++i)
722 if (isnan(layerCorners[i].x) || isnan(layerCorners[i].y))
725 if (layerCorners[i].x < min.x)
726 min.x = layerCorners[i].x;
727 if (layerCorners[i].x > max.x)
728 max.x = layerCorners[i].x;
729 if (layerCorners[i].y < min.y)
730 min.y = layerCorners[i].y;
731 if (layerCorners[i].y > max.y)
732 max.y = layerCorners[i].y;
735 min.x + (max.x-min.x)/2.,
736 min.y + (max.y-min.y)/2.,
741 (VuoPoint2d){NAN,NAN},
742 (VuoPoint2d){NAN,NAN}
753 VuoPoint2d triangles[] = { corners[0], corners[1], corners[2],
754 corners[3], corners[2], corners[1] };
755 for (
int i = 0; i < 2; ++i)
757 VuoPoint2d p0 = triangles[3*i];
758 VuoPoint2d p1 = triangles[3*i+1];
759 VuoPoint2d p2 = triangles[3*i+2];
760 float area = 1./2.*(-p1.y*p2.x + p0.y*(-p1.x + p2.x) + p0.x*(p1.y - p2.y) + p1.x*p2.y);
761 float s = 1./(2.*area)*(p0.y*p2.x - p0.x*p2.y + (p2.y - p0.y)*point.x + (p0.x - p2.x)*point.y);
762 float t = 1./(2.*area)*(p0.x*p1.y - p0.y*p1.x + (p0.y - p1.y)*point.x + (p1.x - p0.x)*point.y);
763 if (s >= 0 && t >= 0 && s + t <= 1)
775 VuoPoint2d layerCenter;
776 VuoPoint2d layerCorners[4];
779 float localToWorldMatrix[16];
780 float modelMatrix[16];
793 for(
int i = 1; i <= children; i++)
810 float aspect = (double) renderedLayers.pixelsHigh / (
double) renderedLayers.pixelsWide;
812 if( point.x < -1 || point.x > 1 || point.y < -aspect || point.y > aspect )
822 float modelMatrix[16], tmp[16];
823 float composite[16] = {
848 float aspect = (double) renderedLayers.pixelsHigh / (
double) renderedLayers.pixelsWide;
850 if( point.x < -1 || point.x > 1 || point.y < -aspect || point.y > aspect )
860 float modelMatrix[16], tmp[16];
861 float composite[16] = {
891 *anyReleased =
false;
908 if( it.type == VuoInteractionType_Click )
911 if( it.type == VuoInteractionType_Release )
925 if (json_object_object_get_ex(js,
"rootSceneObject", &o))
931 if (json_object_object_get_ex(js,
"pixelsWide", &o))
932 pixelsWide = json_object_get_int64(o);
935 if (json_object_object_get_ex(js,
"pixelsHigh", &o))
936 pixelsHigh = json_object_get_int64(o);
938 float backingScaleFactor = 1;
939 if (json_object_object_get_ex(js,
"backingScaleFactor", &o))
943 if (json_object_object_get_ex(js,
"interactions", &o))
949 if (json_object_object_get_ex(js,
"window", &o))
964 json_object_object_add(js,
"rootSceneObject", rootSceneObjectObject);
966 json_object *pixelsWideObject = json_object_new_int64(value.pixelsWide);
967 json_object_object_add(js,
"pixelsWide", pixelsWideObject);
969 json_object *pixelsHighObject = json_object_new_int64(value.pixelsHigh);
970 json_object_object_add(js,
"pixelsHigh", pixelsHighObject);
975 json_object_object_add(js,
"window", windowObject);
979 json_object_object_add(js,
"backingScaleFactor", bsfObject);
982 json_object_object_add(js,
"interactions", interactionObj);
996 char *summary =
VuoText_format(
"%lux%lu<br>%s<br>%s", value.pixelsWide, value.pixelsHigh, windowSummary, rootSummary);