Пример #1
0
        public NullUVGroup AppendUV(UVType uvType, int uvSize)
        {
            NullUVGroup group = this[uvType];

            if (group != null)
            {
                return(null);
            }
            group = new NullUVGroup(CurrentVersion, uvType, uvSize);
            mUVGroupList.Add(group);
            return(group);
        }
Пример #2
0
        protected List <NullVertexStruct> PrepareFloatDataForVertexMerging()
        {
            if ((GetMeshObjectType() != NullPrimitiveType.MOT_TRIANGLES) || (GetTriangleCount() < 2))
            {
                return(null);
            }
            List <NullVertexStruct> floatData = new List <NullVertexStruct>();

            for (int i = 0; i < GetVertexCount(); ++i)
            {
                floatData.Add(new NullVertexStruct());
            }

            bool hadColor   = HadVertexColorData();
            bool hadTangent = HadTangentData();
            int  uvCount    = 0;

            if (UVGroups != null)
            {
                uvCount = UVGroups.GetUVGroupCount();
            }
            NullVertexStruct buffer = null;

            for (int i = 0; i < GetVertexCount(); i++)
            {
                buffer = floatData[i];
                GetVertex(i, ref buffer.vertex);
                GetNormal(i, ref buffer.normal);
                buffer.hadColor   = hadColor;
                buffer.hadTangent = hadTangent;
                if (hadColor)
                {
                    GetVertexColor(i, ref buffer.color);
                }
                else
                {
                    buffer.color = 0;
                }
                if (hadTangent)
                {
                    GetTangent(i, ref buffer.tangent);
                    GetBinormal(i, ref buffer.binormal);
                }
                for (int j = 0; j < uvCount; j++)
                {
                    NullUVGroup uvGroup = UVGroups.GetUVGroupByIndex(j);
                    Vector2     uv      = Vector2.zero;
                    uvGroup.GetUV(i, ref uv);
                    buffer.uvLst.Add(uv);
                }
            }
            return(floatData);
        }
Пример #3
0
 public NullUVGroup this[UVType uvType]
 {
     get
     {
         for (int i = 0; i < GetUVGroupCount(); i++)
         {
             NullUVGroup group = mUVGroupList[i];
             if (group.GetUVType() == uvType)
             {
                 return(group);
             }
         }
         return(null);
     }
 }
Пример #4
0
        private void CreateSkeletonMesh()
        {
            NullMeshFile meshFile = new NullMeshFile(NullWorkingFlag.WF_SKELETON_MESHPIECE);

            bool hadNormals  = mVertexNormals.Length > 0;
            bool hadTangents = mVertexTangents.Length > 0;
            bool hadColors   = mVertexColors.Length > 0;
            bool hadUv       = mVertexuvs.Length > 0;

            NullMeshObject meshObject  = meshFile.AppendSkinObject(NullPrimitiveType.MOT_INDEXED_PRIMITIVES, mVertexTriangles.Length, mVertexPoses.Length, true, true, true);
            NullUVGroup    uvGroup     = hadUv ? meshObject.GetOrCreateUVGroup(UVType.UVT_DEFAULT, mVertexPoses.Length) : null;
            int            vertexCount = mVertexPoses.Length;

            for (int i = 0; i < vertexCount; ++i)
            {
                meshObject.SetVertex(i, mVertexPoses[i]);
                if (hadColors)
                {
                    meshObject.SetVertexColor(i, Convert(mVertexColors[i]));
                }
                if (hadTangents)
                {
                    meshObject.SetTangent(i, mVertexTangents[i]);
                }
                if (hadNormals)
                {
                    meshObject.SetNormal(i, mVertexNormals[i]);
                }
                if (hadUv)
                {
                    uvGroup.SetUV(i, mVertexuvs[i]);
                }
            }

            for (int i = 0; i < mVertexTriangles.Length; i += 3)
            {
                int i1 = mVertexTriangles[i];
                int i2 = mVertexTriangles[i + 1];
                int i3 = mVertexTriangles[i + 2];
                meshObject.SetTriangleIndex(i, new Vector3Int(i1, i2, i3));
            }

            // 骨骼数
            NullNodeTree rootNode = meshFile.GetNodeTree();

            ConvertNodeTree(mRootBone, rootNode, mBindposes, mBones);

            // 权重绑定
            NullSkeletonBinding skeletonBinding = meshFile.GetSkeletonBinding();
            int pieceCount = 1; // 对应子模型,现在只限制一个子模型

            skeletonBinding.SetSkeletonName(mMesh.name);
            skeletonBinding.SetSkeletonBindingCount(pieceCount);
            for (int i = 0; i < pieceCount; ++i)
            {
                NullSkeletonPiece skeletonPiece = skeletonBinding[i];
                skeletonPiece.SetPieceHandle(i);
                ConvertSkeletonPiece(skeletonPiece, mBoneweights);
            }

            string fileName = OutPutDir + "/" + Target.name + ".hxs";

            using (NullMemoryStream stream = NullMemoryStream.WriteToFile(fileName))
            {
                meshFile.SaveToStream(stream);
            }
        }
Пример #5
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);
        }