18 "title" :
"Window State",
19 "description" :
"A set of layers, transformed to their final positions for rendering",
29 "VuoList_VuoInteraction",
30 "VuoList_VuoSceneObject"
45 unsigned long int pixelsWide;
46 unsigned long int pixelsHigh;
47 float backingScaleFactor;
48 bool hasRenderingDimensions;
52 } VuoRenderedLayers_internal;
66 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
82 unsigned long int pixelsWide,
83 unsigned long int pixelsHigh,
84 float backingScaleFactor,
89 rl->rootSceneObject = rootSceneObject;
92 rl->pixelsWide = pixelsWide;
93 rl->pixelsHigh = pixelsHigh;
94 rl->backingScaleFactor = backingScaleFactor;
95 rl->hasRenderingDimensions =
true;
97 rl->interactions = interactions;
109 unsigned long int pixelsWide,
unsigned long int pixelsHigh,
110 float backingScaleFactor,
116 return renderedLayers;
125 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)calloc(1,
sizeof(VuoRenderedLayers_internal));
128 rl->backingScaleFactor = 1;
140 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
142 if (rl->interactions)
145 rl->interactions = interactions;
152 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
156 rl->rootSceneObject = rootSceneObject;
163 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
168 rl->hasWindow =
true;
178 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
179 return rl->interactions;
187 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
188 return rl->rootSceneObject;
197 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
199 if (rl->hasRenderingDimensions)
201 *pixelsWide = rl->pixelsWide;
202 *pixelsHigh = rl->pixelsHigh;
203 *backingScaleFactor = rl->backingScaleFactor;
213 void VuoRenderedLayers_setRenderingDimensions(
const VuoRenderedLayers renderedLayers,
unsigned long int pixelsWide,
unsigned long int pixelsHigh,
float backingScaleFactor)
215 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
217 rl->hasRenderingDimensions =
true;
218 rl->pixelsWide = pixelsWide;
219 rl->pixelsHigh = pixelsHigh;
220 rl->backingScaleFactor = backingScaleFactor;
229 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
233 *window = rl->window;
250 if (! hasWindow || oldWindow != window)
270 bool *renderingDimensionsChanged)
272 VuoRenderedLayers_internal *arl = (VuoRenderedLayers_internal *)accumulatedRenderedLayers;
273 VuoRenderedLayers_internal *nrl = (VuoRenderedLayers_internal *)newerRenderedLayers;
275 *renderingDimensionsChanged =
false;
291 float backingScaleFactor;
294 if (!arl->hasRenderingDimensions ||
295 arl->pixelsWide != pixelsWide || arl->pixelsHigh != pixelsHigh || arl->backingScaleFactor != backingScaleFactor)
296 *renderingDimensionsChanged =
true;
298 arl->hasRenderingDimensions =
true;
299 arl->pixelsWide = pixelsWide;
300 arl->pixelsHigh = pixelsHigh;
301 arl->backingScaleFactor = backingScaleFactor;
310 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
319 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
331 VuoPoint3d* layerCenter3d,
332 VuoPoint3d layerCorners3d[4],
333 bool applyTargetTransform)
336 VuoPoint3d center = *layerCenter3d;
347 if(applyTargetTransform)
353 for (
unsigned long i = ancestorObjectCount; i >= 1; --i)
367 if(applyTargetTransform)
371 for(
int i = 0; i < 4; i++)
377 for (
unsigned long i = ancestorObjectCount; i >= 1; --i)
381 if(layerCorners3d != NULL)
383 for (
int i = 0; i < 4; ++i)
390 *layerCenter3d = center;
404 unsigned int vertexCount;
411 for (
int i = 0; i < 4; ++i)
422 VuoPoint3d c = layerCorners3d[0];
424 for(
int i = 1; i < 4; i++)
426 c.x += layerCorners3d[i].x;
427 c.y += layerCorners3d[i].y;
438 bool foundRect = rectIsInitialized;
439 VuoPoint2d layerCenter;
440 VuoPoint2d layerCorners[4];
443 float localToWorldMatrix[16];
444 float modelMatrix[16];
453 if(rectIsInitialized)
464 for(
int i = 1; i <= children; i++)
480 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
482 float identity[16] = {
501 VuoPoint2d *layerCenter,
502 VuoPoint2d layerCorners[4],
503 bool includeChildrenInBounds)
505 for (
int i = 0; i < 4; ++i)
506 layerCorners[i] = (VuoPoint2d){NAN,NAN};
509 VuoPoint3d layerCorners3d[4];
511 if(includeChildrenInBounds)
518 VuoPoint2d c = rect.center;
537 if (!includeChildrenInBounds && !isText && shader)
539 for (
int i = 0; i < 4; ++i)
551 for (
int i = 0; i < 4; ++i)
552 layerCorners[i] =
VuoPoint2d_make(layerCorners3d[i].x, layerCorners3d[i].y);
605 float localToWorldMatrix[16];
607 float modelMatrix[16];
614 for(
int i = count; i > 0; i--)
624 float worldToLocalMatrix[16];
647 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
650 VuoPoint3d layerCorners3d[4];
659 if (!shader && !isText)
664 for (
int i = 0; i < 4; ++i)
680 float widthScale = 1, heightScale = 1;
685 float verticalScale = 1.;
686 float rotationZ = 0.;
690 widthScale = transform.scale.x;
691 verticalScale = transform.scale.y / transform.scale.x;
699 rl->backingScaleFactor);
701 widthScale *= size.x;
702 heightScale *= size.y;
708 widthScale = 2. * (float)image->
pixelsWide / rl->pixelsWide;
711 VuoReal combinedScaleFactor = 1;
714 combinedScaleFactor = rl->backingScaleFactor / image->
scaleFactor;
716 widthScale *= combinedScaleFactor;
717 heightScale *= combinedScaleFactor;
720 for (
int i = 0; i < 4; ++i)
722 layerCorners3d[i].x *= widthScale;
723 layerCorners3d[i].y *= heightScale;
725 layerCorners3d[i].x += center.x;
726 layerCorners3d[i].y += center.y;
733 for (
int i = 0; i < 4; ++i)
739 for (
int i = 0; i < 4; ++i)
740 layerCorners[i] =
VuoPoint2d_make(layerCorners3d[i].x, layerCorners3d[i].y);
752 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
756 if (!scaleWithScene && (rl->pixelsWide < 1 || rl->pixelsHigh < 1))
761 float w = textBounds.size.x;
762 float h = textBounds.size.y;
768 size.x = (w / (float)rl->pixelsWide) * 2;
769 size.y = size.x * (h / w);
781 for (
int i = 0; i < 4; ++i)
783 if (isnan(layerCorners[i].x) || isnan(layerCorners[i].y))
786 if (layerCorners[i].x < min.x)
787 min.x = layerCorners[i].x;
788 if (layerCorners[i].x > max.x)
789 max.x = layerCorners[i].x;
790 if (layerCorners[i].y < min.y)
791 min.y = layerCorners[i].y;
792 if (layerCorners[i].y > max.y)
793 max.y = layerCorners[i].y;
796 min.x + (max.x-min.x)/2.,
797 min.y + (max.y-min.y)/2.,
802 (VuoPoint2d){NAN,NAN},
803 (VuoPoint2d){NAN,NAN}
814 VuoPoint2d triangles[] = { corners[0], corners[1], corners[2],
815 corners[3], corners[2], corners[1] };
816 for (
int i = 0; i < 2; ++i)
818 VuoPoint2d p0 = triangles[3*i];
819 VuoPoint2d p1 = triangles[3*i+1];
820 VuoPoint2d p2 = triangles[3*i+2];
821 float area = 1./2.*(-p1.y*p2.x + p0.y*(-p1.x + p2.x) + p0.x*(p1.y - p2.y) + p1.x*p2.y);
822 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);
823 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);
824 if (s >= 0 && t >= 0 && s + t <= 1)
836 VuoPoint2d layerCenter;
837 VuoPoint2d layerCorners[4];
840 float localToWorldMatrix[16];
841 float modelMatrix[16];
855 for(
int i = 1; i <= children; i++)
872 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
874 float aspect = (double)rl->pixelsHigh / rl->pixelsWide;
876 if( point.x < -1 || point.x > 1 || point.y < -aspect || point.y > aspect )
886 float modelMatrix[16], tmp[16];
887 float composite[16] = {
912 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
914 float aspect = (double)rl->pixelsHigh / rl->pixelsWide;
916 if( point.x < -1 || point.x > 1 || point.y < -aspect || point.y > aspect )
926 float modelMatrix[16], tmp[16];
927 float composite[16] = {
955 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
959 *anyReleased =
false;
976 if( it.type == VuoInteractionType_Click )
979 if( it.type == VuoInteractionType_Release )
994 if (json_object_object_get_ex(js,
"rootSceneObject", &o))
997 rootSceneObject = NULL;
1000 if (json_object_object_get_ex(js,
"pixelsWide", &o))
1001 pixelsWide = json_object_get_int64(o);
1004 if (json_object_object_get_ex(js,
"pixelsHigh", &o))
1005 pixelsHigh = json_object_get_int64(o);
1007 float backingScaleFactor = 1;
1008 if (json_object_object_get_ex(js,
"backingScaleFactor", &o))
1012 if (json_object_object_get_ex(js,
"interactions", &o))
1017 if (json_object_object_get_ex(js,
"window", &o))
1029 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
1034 json_object_object_add(js,
"rootSceneObject", rootSceneObjectObject);
1036 json_object *pixelsWideObject = json_object_new_int64(rl->pixelsWide);
1037 json_object_object_add(js,
"pixelsWide", pixelsWideObject);
1039 json_object *pixelsHighObject = json_object_new_int64(rl->pixelsHigh);
1040 json_object_object_add(js,
"pixelsHigh", pixelsHighObject);
1045 json_object_object_add(js,
"window", windowObject);
1049 json_object_object_add(js,
"backingScaleFactor", bsfObject);
1052 json_object_object_add(js,
"interactions", interactionObj);
1063 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
1068 char *summary =
VuoText_format(
"%lux%lu<br>%s<br>%s", rl->pixelsWide, rl->pixelsHigh, windowSummary, rootSummary);
1070 free(windowSummary);