Exemplo n.º 1
0
 public bool CombineWithObjects(NullMeshObjects otherOne, Matrix4x4 m1, Matrix4x4 m2, bool newCenter, ref Vector3 center)
 {
     if (otherOne == null)
     {
         return(false);
     }
     for (int i = 0; i < MeshObjectList.Count; i++)
     {
         if (this[i].IsVertexAnimationMeshObject())
         {
             return(false);
         }
     }
     for (int i = 0; i < otherOne.GetMeshObjectCount(); i++)
     {
         if (otherOne[i].IsVertexAnimationMeshObject())
         {
             return(false);
         }
     }
     for (int i = 0; i < MeshObjectList.Count; i++)
     {
         this[i].Transform(m1);
     }
     for (int i = 0; i < otherOne.GetMeshObjectCount(); i++)
     {
         otherOne[i].Transform(m2);
     }
     for (int i = 0; i < otherOne.GetMeshObjectCount(); i++)
     {
         MeshObjectList.Add(otherOne[i]);
     }
     otherOne.ClearWithOutDeletingData();
     if (newCenter)
     {
         GetCenter(ref center);
         DoAutoCenter(center);
     }
     else
     {
         DoAutoCenter();
     }
     return(false);
 }
Exemplo n.º 2
0
        protected bool RotateMeshObjects(NullMeshObjects meshObjects, float angle)
        {
            if (meshObjects == null || meshObjects.GetVertexCount() == 0)
            {
                return(false);
            }
            int triangleCount = meshObjects.GetTriangleCount();

            if (triangleCount > 0)
            {
                //preparing data
                List <Vector3> vertices    = new List <Vector3>();
                List <Vector3> newVertices = new List <Vector3>();
                for (int i = 0; i < meshObjects.GetMeshObjectCount(); i++)
                {
                    NullMeshObject meshObject = meshObjects[i];
                    int            count      = meshObject.GetTriangleCount();
                    vertices.AddRange(meshObject.GetVertexData());
                }

                //do rotate calculation
                Vector3RotateCalculation(angle, vertices, newVertices, false);

                //update mesh objects vertices
                int index = 0;
                for (int i = 0; i < meshObjects.GetMeshObjectCount(); i++)
                {
                    NullMeshObject meshObject = meshObjects[i];
                    int            count      = meshObject.GetTriangleCount();
                    for (int j = 0; j < count; j++)
                    {
                        meshObject.SetVertex(j * 3 + 0, newVertices[index++]);
                        meshObject.SetVertex(j * 3 + 1, newVertices[index++]);
                        meshObject.SetVertex(j * 3 + 2, newVertices[index++]);
                    }
                }
                //delete temp buffer
                vertices.Clear();
                newVertices.Clear();
            }
            return(true);
        }
Exemplo n.º 3
0
        protected bool BuildTangentForMeshObjects(NullMeshObjects meshObjects, float thresHold, bool forceSmooth = false)
        {
            if (meshObjects == null || meshObjects.GetMeshObjectCount() == 0)
            {
                return(false);
            }

            int triangleCount = meshObjects.GetTriangleCount();

            if (triangleCount > 0)
            {
                //preparing data
                List <Vector3> vertices = new List <Vector3>();
                List <Vector2> uvs      = new List <Vector2>();

                List <Vector3> tangents          = Make <Vector3>(triangleCount * 3);
                List <Vector3> binormals         = Make <Vector3>(triangleCount * 3);
                List <byte>    smoothGroups      = Make <byte>(triangleCount);
                int            realTriangleCount = 0;

                for (int i = 0; i < meshObjects.GetMeshObjectCount(); i++)
                {
                    NullMeshObject meshObject = meshObjects[i];
                    if (meshObject.GetUVGroups().Count == 0 || meshObject.GetNormalData().Count == 0)
                    {
                        continue;
                    }
                    int count = meshObject.GetTriangleCount();
                    vertices.AddRange(meshObject.GetVertexData());
                    byte smoothGroup = meshObject.GetSmoothGroup();

                    if (forceSmooth && smoothGroup == 0)
                    {
                        smoothGroup = 1;
                    }
                    Set(smoothGroups, smoothGroup);
                    NullUVGroup uvGroup = meshObject.GetUVGroup(UVType.UVT_NORMAL_MAP);
                    if (uvGroup == null)
                    {
                        uvGroup = meshObject.GetUVGroup(UVType.UVT_DEFAULT);
                    }
                    uvs.AddRange(uvGroup.GetUVData());
                    realTriangleCount += count;
                }
                //do face-smoothing
                ComputeTengents(thresHold, vertices, realTriangleCount, smoothGroups, uvs, tangents, binormals);

                //update mesh objects normals
                for (int i = 0; i < meshObjects.GetMeshObjectCount(); i++)
                {
                    NullMeshObject meshObject = meshObjects[i];
                    if (meshObject.GetUVGroups().Count == 0 || meshObject.GetNormalData().Count == 0)
                    {
                        continue;
                    }
                    meshObject.BuildTangentArray();
                    int count = meshObject.GetTriangleCount();
                    for (int j = 0; j < count; j++)
                    {
                        //set tangent
                        meshObject.SetTangent(j * 3 + 0, tangents[j * 3]);
                        meshObject.SetTangent(j * 3 + 1, tangents[j * 3 + 1]);
                        meshObject.SetTangent(j * 3 + 2, tangents[j * 3 + 2]);

                        //set binormal
                        meshObject.SetBinormal(j * 3 + 0, binormals[j * 3]);
                        meshObject.SetBinormal(j * 3 + 1, binormals[j * 3 + 1]);
                        meshObject.SetBinormal(j * 3 + 2, binormals[j * 3 + 2]);
                    }
                }
                //delete temp buffer
                vertices.Clear();
                tangents.Clear();
                binormals.Clear();
                uvs.Clear();
                smoothGroups.Clear();
            }
            return(true);
        }