81 unsigned long int pixelsWide,
82 unsigned long int pixelsHigh,
83 float backingScaleFactor,
88 rl->rootSceneObject = rootSceneObject;
91 rl->pixelsWide = pixelsWide;
92 rl->pixelsHigh = pixelsHigh;
93 rl->backingScaleFactor = backingScaleFactor;
94 rl->hasRenderingDimensions =
true;
96 rl->interactions = interactions;
269 bool *renderingDimensionsChanged)
271 VuoRenderedLayers_internal *arl = (VuoRenderedLayers_internal *)accumulatedRenderedLayers;
272 VuoRenderedLayers_internal *nrl = (VuoRenderedLayers_internal *)newerRenderedLayers;
274 *renderingDimensionsChanged =
false;
290 float backingScaleFactor;
293 if (!arl->hasRenderingDimensions ||
294 arl->pixelsWide != pixelsWide || arl->pixelsHigh != pixelsHigh || arl->backingScaleFactor != backingScaleFactor)
295 *renderingDimensionsChanged =
true;
297 arl->hasRenderingDimensions =
true;
298 arl->pixelsWide = pixelsWide;
299 arl->pixelsHigh = pixelsHigh;
300 arl->backingScaleFactor = backingScaleFactor;
330 VuoPoint3d* layerCenter3d,
331 VuoPoint3d layerCorners3d[4],
332 bool applyTargetTransform)
335 VuoPoint3d center = *layerCenter3d;
346 if(applyTargetTransform)
352 for (
unsigned long i = ancestorObjectCount; i >= 1; --i)
366 if(applyTargetTransform)
370 for(
int i = 0; i < 4; i++)
376 for (
unsigned long i = ancestorObjectCount; i >= 1; --i)
380 if(layerCorners3d != NULL)
382 for (
int i = 0; i < 4; ++i)
389 *layerCenter3d = center;
437 bool foundRect = rectIsInitialized;
438 VuoPoint2d layerCenter;
439 VuoPoint2d layerCorners[4];
442 float localToWorldMatrix[16];
443 float modelMatrix[16];
452 if(rectIsInitialized)
460 if (includeChildrenInBounds)
465 for(
int i = 1; i <= children; i++)
503 VuoPoint2d *layerCenter,
504 VuoPoint2d layerCorners[4],
505 bool includeChildrenInBounds)
507 for (
int i = 0; i < 4; ++i)
508 layerCorners[i] = (VuoPoint2d){NAN,NAN};
511 VuoPoint3d layerCorners3d[4];
518 VuoPoint2d c = rect.center;
531 for (
int i = 0; i < 4; ++i)
532 layerCorners[i] =
VuoPoint2d_make(layerCorners3d[i].x, layerCorners3d[i].y);
585 float localToWorldMatrix[16];
587 float modelMatrix[16];
594 for(
int i = count; i > 0; i--)
604 float worldToLocalMatrix[16];
613 invPoint.x /= shader->objectScale;
614 invPoint.y /= shader->objectScale;
627 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
630 VuoPoint3d layerCorners3d[4];
639 if (!shader && !isText)
644 for (
int i = 0; i < 4; ++i)
646 layerCorners3d[i].x *= shader->objectScale;
647 layerCorners3d[i].y *= shader->objectScale;
660 float widthScale = 1, heightScale = 1;
665 float verticalScale = 1.;
666 float rotationZ = 0.;
670 widthScale = transform.scale.x;
671 verticalScale = transform.scale.y / transform.scale.x;
679 rl->backingScaleFactor);
681 widthScale *= size.x;
682 heightScale *= size.y;
688 widthScale = 2. * (float)image->pixelsWide / rl->pixelsWide;
689 heightScale = widthScale * (float)image->pixelsHigh / (
float)image->pixelsWide;
691 VuoReal combinedScaleFactor = 1;
694 combinedScaleFactor = rl->backingScaleFactor / image->scaleFactor;
696 widthScale *= combinedScaleFactor;
697 heightScale *= combinedScaleFactor;
700 for (
int i = 0; i < 4; ++i)
702 layerCorners3d[i].x *= widthScale;
703 layerCorners3d[i].y *= heightScale;
705 layerCorners3d[i].x += center.x;
706 layerCorners3d[i].y += center.y;
713 for (
int i = 0; i < 4; ++i)
719 for (
int i = 0; i < 4; ++i)
720 layerCorners[i] =
VuoPoint2d_make(layerCorners3d[i].x, layerCorners3d[i].y);
732 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
736 if (!scaleWithScene && (rl->pixelsWide < 1 || rl->pixelsHigh < 1))
741 float w = textBounds.size.x;
742 float h = textBounds.size.y;
748 size.x = (w / (float)rl->pixelsWide) * 2;
749 size.y = size.x * (h / w);
761 for (
int i = 0; i < 4; ++i)
763 if (isnan(layerCorners[i].x) || isnan(layerCorners[i].y))
766 if (layerCorners[i].x < min.x)
767 min.x = layerCorners[i].x;
768 if (layerCorners[i].x > max.x)
769 max.x = layerCorners[i].x;
770 if (layerCorners[i].y < min.y)
771 min.y = layerCorners[i].y;
772 if (layerCorners[i].y > max.y)
773 max.y = layerCorners[i].y;
776 min.x + (max.x-min.x)/2.,
777 min.y + (max.y-min.y)/2.,
782 (VuoPoint2d){NAN,NAN},
783 (VuoPoint2d){NAN,NAN}
794 VuoPoint2d triangles[] = { corners[0], corners[1], corners[2],
795 corners[3], corners[2], corners[1] };
796 for (
int i = 0; i < 2; ++i)
798 VuoPoint2d p0 = triangles[3*i];
799 VuoPoint2d p1 = triangles[3*i+1];
800 VuoPoint2d p2 = triangles[3*i+2];
801 float area = 1./2.*(-p1.y*p2.x + p0.y*(-p1.x + p2.x) + p0.x*(p1.y - p2.y) + p1.x*p2.y);
802 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);
803 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);
804 if (s >= 0 && t >= 0 && s + t <= 1)
816 VuoPoint2d layerCenter;
817 VuoPoint2d layerCorners[4];
820 float localToWorldMatrix[16];
821 float modelMatrix[16];
835 for(
int i = 1; i <= children; i++)
852 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
854 float aspect = (double)rl->pixelsHigh / rl->pixelsWide;
856 if( point.x < -1 || point.x > 1 || point.y < -aspect || point.y > aspect )
866 float modelMatrix[16], tmp[16];
867 float composite[16] = {
892 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
894 float aspect = (double)rl->pixelsHigh / rl->pixelsWide;
896 if( point.x < -1 || point.x > 1 || point.y < -aspect || point.y > aspect )
906 float modelMatrix[16], tmp[16];
907 float composite[16] = {
971 json_object *o = NULL;
975 if (json_object_object_get_ex(js,
"rootSceneObject", &o))
981 if (json_object_object_get_ex(js,
"pixelsWide", &o))
982 rl->pixelsWide = json_object_get_int64(o);
984 if (json_object_object_get_ex(js,
"pixelsHigh", &o))
985 rl->pixelsHigh = json_object_get_int64(o);
987 if (rl->pixelsWide && rl->pixelsHigh)
988 rl->hasRenderingDimensions =
true;
990 if (json_object_object_get_ex(js,
"backingScaleFactor", &o))
993 if (json_object_object_get_ex(js,
"interactions", &o))
999 if (json_object_object_get_ex(js,
"window", &o))
1001 rl->hasWindow =
true;
1015 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
1017 json_object *js = json_object_new_object();
1022 json_object_object_add(js,
"rootSceneObject", rootSceneObjectObject);
1025 if (rl->hasRenderingDimensions)
1027 json_object *pixelsWideObject = json_object_new_int64(rl->pixelsWide);
1028 json_object_object_add(js,
"pixelsWide", pixelsWideObject);
1030 json_object *pixelsHighObject = json_object_new_int64(rl->pixelsHigh);
1031 json_object_object_add(js,
"pixelsHigh", pixelsHighObject);
1034 json_object_object_add(js,
"backingScaleFactor", bsfObject);
1040 json_object_object_add(js,
"window", windowObject);
1043 if (rl->interactions)
1046 json_object_object_add(js,
"interactions", interactionObj);
1058 VuoRenderedLayers_internal *rl = (VuoRenderedLayers_internal *)renderedLayers;
1060 char *windowSummary = NULL;
1064 char *sizeSummary = NULL;
1065 if (rl->hasRenderingDimensions)
1066 sizeSummary =
VuoText_format(
"<p>Size: %luĂ—%lu @ %gx</p>", rl->pixelsWide, rl->pixelsHigh, rl->backingScaleFactor);
1068 char *layersSummary = NULL;
1073 windowSummary ? windowSummary :
"",
1074 sizeSummary ? sizeSummary :
"",
1075 layersSummary ? layersSummary :
"");
1077 free(windowSummary);
1079 free(layersSummary);