internal static IEnumerable <int> GetLinkedBoneIndexes(DistortionMesh mesh)
 {
     foreach (var point in mesh.Nodes.OfType <DistortionMeshPoint>())
     {
         if (point.SkinningWeights?.IsEmpty() ?? true)
         {
             continue;
         }
         if (point.SkinningWeights.Bone0.Index != 0)
         {
             yield return(point.SkinningWeights.Bone0.Index);
         }
         if (point.SkinningWeights.Bone1.Index != 0)
         {
             yield return(point.SkinningWeights.Bone1.Index);
         }
         if (point.SkinningWeights.Bone2.Index != 0)
         {
             yield return(point.SkinningWeights.Bone2.Index);
         }
         if (point.SkinningWeights.Bone3.Index != 0)
         {
             yield return(point.SkinningWeights.Bone3.Index);
         }
     }
 }
Beispiel #2
0
 void WriteDistortionMeshProperties(DistortionMesh node)
 {
     WriteWidgetProperties(node);
     WriteProperty("TexturePath", node.Texture, null);
     WriteProperty("NumRows", node.NumRows, 2);
     WriteProperty("NumCols", node.NumCols, 2);
 }
Beispiel #3
0
        void RestorePointsIfNeeded(DistortionMesh mesh)
        {
            if (ValidateMeshPoints(mesh))
            {
                return;
            }
            var rootFolder = mesh.RootFolder();

            foreach (var item in rootFolder.Items.ToList())
            {
                UnlinkFolderItem.Perform(mesh, item);
            }
            for (int i = 0; i <= mesh.NumRows; i++)
            {
                for (int j = 0; j <= mesh.NumCols; j++)
                {
                    var pos   = new Vector2((float)j / mesh.NumCols, (float)i / mesh.NumRows);
                    var point = new DistortionMeshPoint {
                        Id       = $"{i};{j}",
                        Color    = Color4.White,
                        UV       = pos,
                        Position = pos
                    };
                    InsertFolderItem.Perform(mesh, new FolderItemLocation(rootFolder, rootFolder.Items.Count), point);
                }
            }
        }
Beispiel #4
0
        private static ContentSizeComponent ProcessDistortionMesh(DistortionMesh distortionMesh)
        {
            if (distortionMesh.Nodes.Count == 0)
            {
                return(ProcessEmptyNode(distortionMesh));
            }

            var aabb     = distortionMesh.GetLocalAABB();
            var selfSize = distortionMesh.Components.GetOrAdd <ContentSizeComponent>();

            selfSize.Size = new ContentRectangle(aabb, Vector2.One / distortionMesh.Size);
            return(selfSize);
        }
Beispiel #5
0
        bool ValidateMeshPoints(DistortionMesh mesh)
        {
            if ((mesh.NumRows + 1) * (mesh.NumCols + 1) != mesh.Nodes.Count)
            {
                return(false);
            }
            int t = 0;

            for (int i = 0; i <= mesh.NumRows; i++)
            {
                for (int j = 0; j <= mesh.NumCols; j++)
                {
                    if (t >= mesh.Nodes.Count || mesh.Nodes[t].Id != $"{i};{j}")
                    {
                        return(false);
                    }
                    t++;
                }
            }
            return(true);
        }
        public void onProjectionChanged(HeadMountedDisplay hmd, EyeParams leftEye, EyeParams rightEye, float zNear, float zFar)
        {
            mHmd         = new HeadMountedDisplay(hmd);
            mLeftEyeFov  = new FieldOfView(leftEye.getFov());
            mRightEyeFov = new FieldOfView(rightEye.getFov());

            ScreenParams          screen = mHmd.getScreen();
            CardboardDeviceParams cdp    = mHmd.getCardboard();

            if (mProgramHolder == null)
            {
                mProgramHolder = createProgramHolder();
            }

            EyeViewport leftEyeViewport  = initViewportForEye(leftEye, 0.0F);
            EyeViewport rightEyeViewport = initViewportForEye(rightEye, leftEyeViewport.width);

            leftEye.getFov().toPerspectiveMatrix(zNear, zFar, leftEye.getTransform().GetPerspective(), 0);

            rightEye.getFov().toPerspectiveMatrix(zNear, zFar, rightEye.getTransform().GetPerspective(), 0);

            float textureWidthM   = leftEyeViewport.width + rightEyeViewport.width;
            float textureHeightM  = Math.Max(leftEyeViewport.height, rightEyeViewport.height);
            float xPxPerM         = screen.getWidth() / screen.getWidthMeters();
            float yPxPerM         = screen.getHeight() / screen.getHeightMeters();
            int   textureWidthPx  = Math.Round(textureWidthM * xPxPerM);
            int   textureHeightPx = Math.Round(textureHeightM * yPxPerM);

            float xEyeOffsetMScreen = screen.getWidthMeters() / 2.0F - cdp.getInterpupillaryDistance() / 2.0F;
            float yEyeOffsetMScreen = cdp.getVerticalDistanceToLensCenter() - screen.getBorderSizeMeters();

            mLeftEyeDistortionMesh = createDistortionMesh(leftEye, leftEyeViewport, textureWidthM, textureHeightM, xEyeOffsetMScreen, yEyeOffsetMScreen);

            xEyeOffsetMScreen       = screen.getWidthMeters() - xEyeOffsetMScreen;
            mRightEyeDistortionMesh = createDistortionMesh(rightEye, rightEyeViewport, textureWidthM, textureHeightM, xEyeOffsetMScreen, yEyeOffsetMScreen);

            setupRenderTextureAndRenderbuffer(textureWidthPx, textureHeightPx);
        }
Beispiel #7
0
        void ParseDistortionMeshProperty(Node node, string name)
        {
            DistortionMesh mesh = (DistortionMesh)node;

            switch (name)
            {
            case "NumRows":
                mesh.NumRows = lexer.ParseInt();
                break;

            case "NumCols":
                mesh.NumCols = lexer.ParseInt();
                break;

            case "TexturePath":
                mesh.Texture = new SerializableTexture(lexer.ParsePath());
                break;

            default:
                ParseGraphicProperty(mesh, name);
                break;
            }
        }
        private void renderDistortionMesh(DistortionMesh mesh)
        {
            GLES20.GlBindBuffer(34962, mesh.mArrayBufferId);
            /*mesh.getClass(); mesh.getClass();*/ GLES20.GlVertexAttribPointer(mProgramHolder.aPosition, 3, 5126, false, 20, 0 * 4);

            GLES20.GlEnableVertexAttribArray(mProgramHolder.aPosition);

            /*mesh.getClass(); mesh.getClass();*/ GLES20.GlVertexAttribPointer(mProgramHolder.aVignette, 1, 5126, false, 20, 2 * 4);

            GLES20.GlEnableVertexAttribArray(mProgramHolder.aVignette);

            /*mesh.getClass(); mesh.getClass();*/ GLES20.GlVertexAttribPointer(mProgramHolder.aTextureCoord, 2, 5126, false, 20, 3 * 4);

            GLES20.GlEnableVertexAttribArray(mProgramHolder.aTextureCoord);

            GLES20.GlActiveTexture(33984);
            GLES20.GlBindTexture(3553, mTextureId);
            GLES20.GlUniform1i(mProgramHolder.uTextureSampler, 0);
            GLES20.GlUniform1f(mProgramHolder.uTextureCoordScale, mResolutionScale);

            GLES20.GlBindBuffer(34963, mesh.mElementBufferId);
            GLES20.GlDrawElements(5, mesh.nIndices, 5125, 0);
        }
Beispiel #9
0
        public static Rectangle GetLocalAABB(this DistortionMesh mesh)
        {
            var parent = mesh.ParentWidget;

            var existsAnimation = false;
            var animationStart  = int.MaxValue;
            var animationEnd    = 0;

            foreach (var bone in parent.Nodes.OfType <Bone>())
            {
                foreach (var animator in bone.Animators)
                {
                    existsAnimation = true;
                    animationStart  = Math.Min(animationStart, animator.Keys.First().Frame);
                    animationEnd    = Math.Max(animationEnd, animator.Duration);
                }
            }
            if (!existsAnimation)
            {
                animationStart = animationEnd = parent.DefaultAnimation.Frame;
            }

            var existsPointAnimation = false;
            var pointsAnimationStart = int.MaxValue;
            var pointsAnimationEnd   = 0;

            foreach (var point in mesh.Nodes.OfType <DistortionMeshPoint>())
            {
                foreach (var animator in point.Animators)
                {
                    existsPointAnimation = true;
                    pointsAnimationStart = Math.Min(pointsAnimationStart, animator.Keys.First().Frame);
                    pointsAnimationEnd   = Math.Max(pointsAnimationEnd, animator.Duration);
                }
            }
            if (!existsPointAnimation)
            {
                pointsAnimationStart = pointsAnimationEnd = mesh.DefaultAnimation.Frame;
            }

            var rectangle            = new Rectangle(float.MaxValue, float.MaxValue, float.MinValue, float.MinValue);
            var animationFrame       = parent.DefaultAnimation.Frame;
            var pointsAnimationFrame = mesh.DefaultAnimation.Frame;

            for (var frame = animationStart; frame <= animationEnd; frame++)
            {
                parent.DefaultAnimation.Frame = frame;

                var bones                 = parent.BoneArray;
                var weightsMatrix         = mesh.CalcLocalToParentTransform();
                var weightsMatrixInversed = weightsMatrix.CalcInversed();

                for (var pointsFrame = pointsAnimationStart; pointsFrame <= pointsAnimationEnd; pointsFrame++)
                {
                    mesh.DefaultAnimation.Frame = frame;

                    for (var i = 0; i < mesh.Nodes.Count; i++)
                    {
                        var point = (DistortionMeshPoint)mesh.Nodes[i];
                        rectangle = ExpandMeshLocalAABB(rectangle, mesh.Size, point, bones, weightsMatrix, weightsMatrixInversed);
                    }
                }
            }
            parent.DefaultAnimation.Frame = animationFrame;
            mesh.DefaultAnimation.Frame   = pointsAnimationFrame;

            return(rectangle);
        }