public NullVertexMorphObject AppendVertexMorphObject(NullDataStructType vertexDataType, int vertexCount)
        {
            NullVertexMorphObject av = new NullVertexMorphObject(vertexDataType, vertexCount);

            mVertexMorphObjectList.Add(av);
            return(av);
        }
예제 #2
0
        protected bool RotateVertexMorphObject(NullVertexMorphObject vertexMorphObject, float angle)
        {
            if (vertexMorphObject == null || vertexMorphObject.GetVertexCount() == 0)
            {
                return(false);
            }
            List <Vector3> posDataArray = vertexMorphObject.GetVertexData();
            int            vertexCount  = GetTriangleCount() * 3;
            List <Vector3> vertices     = new List <Vector3>();
            List <Vector3> nVertices    = new List <Vector3>();

            vertices.AddRange(posDataArray);
            Vector3RotateCalculation(angle, vertices, nVertices, false);
            for (int i = 0; i < vertexCount; i += 3)
            {
                vertexMorphObject.SetVertex(i + 0, nVertices[i]);
                vertexMorphObject.SetVertex(i + 1, nVertices[i + 1]);
                vertexMorphObject.SetVertex(i + 2, nVertices[i + 2]);

                Vector3 normal = CalcPlaneNormal3f(nVertices[i], nVertices[i + 1], nVertices[i + 2]);
                vertexMorphObject.SetNormal(i + 0, normal);
                vertexMorphObject.SetNormal(i + 1, normal);
                vertexMorphObject.SetNormal(i + 2, normal);
            }
            vertices.Clear();
            nVertices.Clear();
            return(true);
        }
 public NullVertexMorphObject FindMorphAnimationNodeByIndex(int index)
 {
     for (int i = 0; i < mVertexMorphObjectList.Count; i++)
     {
         NullVertexMorphObject mo = mVertexMorphObjectList[i];
         if (mo.GetMeshObjectIndex() == index)
         {
             return(mo);
         }
     }
     return(null);
 }
예제 #4
0
        protected bool RotateVertexMorphAnimationFrame(NullVertexMorphAnimationFrame vertexMorphAnimationFrame, float angle)
        {
            if (vertexMorphAnimationFrame == null || vertexMorphAnimationFrame.GetMorphObjectCount() == 0)
            {
                return(false);
            }
            bool res = true;

            for (int i = 0; i < vertexMorphAnimationFrame.GetMorphObjectCount(); i++)
            {
                NullVertexMorphObject vertexMorphObject = vertexMorphAnimationFrame[i];
                res &= RotateVertexMorphObject(vertexMorphObject, angle);
            }
            return(res);
        }
예제 #5
0
        public bool BuildIndexedPrimitives()
        {
            bool res = false;

            if (mMeshObjectList != null)
            {
                List <NullMergeIndex> indexMapping = new List <NullMergeIndex>();
                for (int i = 0; i < mMeshObjectList.GetMeshObjectCount(); i++)
                {
                    NullMeshObject meshObject = mMeshObjectList[i];
                    res |= meshObject.BuildIndexedPrimitives(indexMapping);
                    if (meshObject.IsVertexAnimationMeshObject() && mVertexMorphAnimations != null)
                    {
                        for (int k = 0; k < mVertexMorphAnimations.GetAnimationCount(); k++)
                        {
                            NullVertexMorphAnimation animation = mVertexMorphAnimations[k];
                            for (int j = 0; j < animation.GetFrameCount(); j++)
                            {
                                NullVertexMorphAnimationFrame animationFrame = animation[j];
                                NullVertexMorphObject         morphObject    = animationFrame.FindMorphAnimationNodeByIndex(i);
                                Assert.IsTrue(morphObject != null, "");
                                res |= morphObject.BuildIndexedPrimitives(indexMapping);
                            }
                        }
                    }
                }
            }

            //try extract mesh-objects and skeleton-bindings
            if (mSkinObjectList != null)
            {
                for (int i = 0; i < mSkinObjectList.GetMeshObjectCount(); i++)
                {
                    List <NullMergeIndex> indexMapping = new List <NullMergeIndex>();
                    NullMeshObject        meshObject   = mSkinObjectList[i];
                    res |= meshObject.BuildIndexedPrimitives(indexMapping);
                    if (mSkeletonBinding != null && indexMapping.Count > 0)
                    {
                        NullSkeletonPiece skeletonPiece = mSkeletonBinding[i];
                        res |= skeletonPiece.BuildIndexedPrimitives(indexMapping);
                    }
                }
            }
            return(res);
        }
예제 #6
0
        public bool ExtractToTriangles()
        {
            bool res = false;

            //try extract mesh-objects and vertex-morph animations
            if (mMeshObjectList != null)
            {
                for (int i = 0; i < mMeshObjectList.GetMeshObjectCount(); i++)
                {
                    List <Vector3Int> originalFaceIndices = new List <Vector3Int>();
                    NullMeshObject    meshObject          = mMeshObjectList[i];
                    res |= meshObject.ExtractToTriangles(originalFaceIndices);
                    if (meshObject.IsVertexAnimationMeshObject() && mVertexMorphAnimations != null)
                    {
                        for (int k = 0; k < mVertexMorphAnimations.GetAnimationCount(); k++)
                        {
                            NullVertexMorphAnimation animation = mVertexMorphAnimations[k];
                            for (int j = 0; j < animation.GetFrameCount(); j++)
                            {
                                NullVertexMorphAnimationFrame animationFrame = animation[j];
                                NullVertexMorphObject         morphObject    = animationFrame.FindMorphAnimationNodeByIndex(i);
                                Assert.IsTrue(morphObject != null, "");
                                switch (meshObject.GetMeshObjectType())
                                {
                                case NullPrimitiveType.MOT_INDEXED_PRIMITIVES:
                                    res |= morphObject.ExtractToTrianglesFromIndexedPrimitives(originalFaceIndices);
                                    break;
                                    //case NullPrimitiveType.MOT_TRIANGLE_STRIPS:
                                    //    res |= morphObject.ExtractToTrianglesFromStrips(meshObject.GetTriangleCount());
                                    //    break;
                                }
                            }
                        }
                    }
                    originalFaceIndices.Clear();
                }
            }

            //try extract mesh-objects and skeleton-bindings
            if (mSkinObjectList != null)
            {
                for (int i = 0; i < mSkinObjectList.GetMeshObjectCount(); i++)
                {
                    List <Vector3Int> originalFaceIndices = new List <Vector3Int>();
                    NullMeshObject    meshObject          = mSkinObjectList[i];
                    res |= meshObject.ExtractToTriangles(originalFaceIndices);
                    if (mSkeletonBinding != null && mSkeletonBinding.GetSkeletonBindingCount() > 0)
                    {
                        NullSkeletonPiece skeletonPiece = mSkeletonBinding[i];
                        switch (meshObject.GetMeshObjectType())
                        {
                        case NullPrimitiveType.MOT_INDEXED_PRIMITIVES:
                            res |= skeletonPiece.ExtractToTrianglesFromIndexedPrimitives(originalFaceIndices);
                            break;
                            //case HexMeshObject::MOT_TRIANGLE_STRIPS:
                            //    res |= skeletonPiece.ExtractToTrianglesFromStrips(meshObject.GetTriangleCount());
                            //    break;
                        }
                    }
                }
            }

            return(res);
        }