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;
213void 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)
461 if (includeChildrenInBounds)
466 for(
int i = 1; i <= children; i++)
483 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
485 float identity[16] = {
504 VuoPoint2d *layerCenter,
505 VuoPoint2d layerCorners[4],
506 bool includeChildrenInBounds)
508 for (
int i = 0; i < 4; ++i)
509 layerCorners[i] = (VuoPoint2d){NAN,NAN};
512 VuoPoint3d layerCorners3d[4];
519 VuoPoint2d c = rect.center;
532 for (
int i = 0; i < 4; ++i)
533 layerCorners[i] =
VuoPoint2d_make(layerCorners3d[i].x, layerCorners3d[i].y);
551 tp.x *= shader->objectScale;
552 tp.y *= shader->objectScale;
586 float localToWorldMatrix[16];
588 float modelMatrix[16];
595 for(
int i = count; i > 0; i--)
605 float worldToLocalMatrix[16];
614 invPoint.x /= shader->objectScale;
615 invPoint.y /= shader->objectScale;
628 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
631 VuoPoint3d layerCorners3d[4];
640 if (!shader && !isText)
645 for (
int i = 0; i < 4; ++i)
647 layerCorners3d[i].x *= shader->objectScale;
648 layerCorners3d[i].y *= shader->objectScale;
661 float widthScale = 1, heightScale = 1;
666 float verticalScale = 1.;
667 float rotationZ = 0.;
671 widthScale = transform.scale.x;
672 verticalScale = transform.scale.y / transform.scale.x;
680 rl->backingScaleFactor);
682 widthScale *= size.x;
683 heightScale *= size.y;
689 widthScale = 2. * (float)image->pixelsWide / rl->pixelsWide;
690 heightScale = widthScale * (
float)image->pixelsHigh / (float)image->pixelsWide;
692 VuoReal combinedScaleFactor = 1;
695 combinedScaleFactor = rl->backingScaleFactor / image->scaleFactor;
697 widthScale *= combinedScaleFactor;
698 heightScale *= combinedScaleFactor;
701 for (
int i = 0; i < 4; ++i)
703 layerCorners3d[i].x *= widthScale;
704 layerCorners3d[i].y *= heightScale;
706 layerCorners3d[i].x += center.x;
707 layerCorners3d[i].y += center.y;
714 for (
int i = 0; i < 4; ++i)
720 for (
int i = 0; i < 4; ++i)
721 layerCorners[i] =
VuoPoint2d_make(layerCorners3d[i].x, layerCorners3d[i].y);
733 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
737 if (!scaleWithScene && (rl->pixelsWide < 1 || rl->pixelsHigh < 1))
742 float w = textBounds.size.x;
743 float h = textBounds.size.y;
749 size.x = (w / (float)rl->pixelsWide) * 2;
750 size.y = size.x * (h / w);
762 for (
int i = 0; i < 4; ++i)
764 if (isnan(layerCorners[i].x) || isnan(layerCorners[i].y))
767 if (layerCorners[i].x < min.x)
768 min.x = layerCorners[i].x;
769 if (layerCorners[i].x > max.x)
770 max.x = layerCorners[i].x;
771 if (layerCorners[i].y < min.y)
772 min.y = layerCorners[i].y;
773 if (layerCorners[i].y > max.y)
774 max.y = layerCorners[i].y;
777 min.x + (max.x-min.x)/2.,
778 min.y + (max.y-min.y)/2.,
783 (VuoPoint2d){NAN,NAN},
784 (VuoPoint2d){NAN,NAN}
795 VuoPoint2d triangles[] = { corners[0], corners[1], corners[2],
796 corners[3], corners[2], corners[1] };
797 for (
int i = 0; i < 2; ++i)
799 VuoPoint2d p0 = triangles[3*i];
800 VuoPoint2d p1 = triangles[3*i+1];
801 VuoPoint2d p2 = triangles[3*i+2];
802 float area = 1./2.*(-p1.y*p2.x + p0.y*(-p1.x + p2.x) + p0.x*(p1.y - p2.y) + p1.x*p2.y);
803 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);
804 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);
805 if (s >= 0 && t >= 0 && s + t <= 1)
817 VuoPoint2d layerCenter;
818 VuoPoint2d layerCorners[4];
821 float localToWorldMatrix[16];
822 float modelMatrix[16];
836 for(
int i = 1; i <= children; i++)
853 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
855 float aspect = (double)rl->pixelsHigh / rl->pixelsWide;
857 if( point.x < -1 || point.x > 1 || point.y < -aspect || point.y > aspect )
867 float modelMatrix[16], tmp[16];
868 float composite[16] = {
893 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
895 float aspect = (double)rl->pixelsHigh / rl->pixelsWide;
897 if( point.x < -1 || point.x > 1 || point.y < -aspect || point.y > aspect )
907 float modelMatrix[16], tmp[16];
908 float composite[16] = {
936 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
940 *anyReleased =
false;
957 if( it.type == VuoInteractionType_Click )
960 if( it.type == VuoInteractionType_Release )
976 if (json_object_object_get_ex(js,
"rootSceneObject", &o))
982 if (json_object_object_get_ex(js,
"pixelsWide", &o))
983 rl->pixelsWide = json_object_get_int64(o);
985 if (json_object_object_get_ex(js,
"pixelsHigh", &o))
986 rl->pixelsHigh = json_object_get_int64(o);
988 if (rl->pixelsWide && rl->pixelsHigh)
989 rl->hasRenderingDimensions =
true;
991 if (json_object_object_get_ex(js,
"backingScaleFactor", &o))
994 if (json_object_object_get_ex(js,
"interactions", &o))
1000 if (json_object_object_get_ex(js,
"window", &o))
1002 rl->hasWindow =
true;
1016 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
1023 json_object_object_add(js,
"rootSceneObject", rootSceneObjectObject);
1026 if (rl->hasRenderingDimensions)
1028 json_object *pixelsWideObject = json_object_new_int64(rl->pixelsWide);
1029 json_object_object_add(js,
"pixelsWide", pixelsWideObject);
1031 json_object *pixelsHighObject = json_object_new_int64(rl->pixelsHigh);
1032 json_object_object_add(js,
"pixelsHigh", pixelsHighObject);
1035 json_object_object_add(js,
"backingScaleFactor", bsfObject);
1041 json_object_object_add(js,
"window", windowObject);
1044 if (rl->interactions)
1047 json_object_object_add(js,
"interactions", interactionObj);
1059 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
1061 char *windowSummary = NULL;
1065 char *sizeSummary = NULL;
1066 if (rl->hasRenderingDimensions)
1067 sizeSummary =
VuoText_format(
"<p>Size: %luĂ—%lu @ %gx</p>", rl->pixelsWide, rl->pixelsHigh, rl->backingScaleFactor);
1069 char *layersSummary = NULL;
1074 windowSummary ? windowSummary :
"",
1075 sizeSummary ? sizeSummary :
"",
1076 layersSummary ? layersSummary :
"");
1078 free(windowSummary);
1080 free(layersSummary);