Exemplo n.º 1
0
        private static void ReadVertices(BinaryReader reader, MmdModel model)
        {
            var vertexNum = reader.ReadInt32();

            model.Vertices = new Vertex[vertexNum];
            for (var i = 0; i < vertexNum; ++i)
            {
                var vertex = new Vertex
                {
                    Coordinate   = MmdReaderUtil.ReadVector3(reader),
                    Normal       = MmdReaderUtil.ReadVector3(reader),
                    UvCoordinate = MmdReaderUtil.ReadVector2(reader)
                };
                var skinningOperator = new SkinningOperator();
                var bdef2            = new SkinningOperator.Bdef2();
                bdef2.BoneId            = new int[2];
                bdef2.BoneId[0]         = reader.ReadInt16();
                bdef2.BoneId[1]         = reader.ReadInt16();
                bdef2.BoneWeight        = reader.ReadSByte() * 0.01f;
                skinningOperator.Param  = bdef2;
                skinningOperator.Type   = SkinningOperator.SkinningType.SkinningBdef2;
                vertex.SkinningOperator = skinningOperator;
                var noEdge = reader.ReadByte() != 0;
                vertex.EdgeScale  = noEdge ? 0.0f : 1.0f;
                model.Vertices[i] = vertex;
            }
        }
Exemplo n.º 2
0
 private static void ReadModelNameAndDescription(BinaryReader reader, MmdModel model, PmxConfig pmxConfig)
 {
     model.Name          = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding);
     model.NameEn        = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding);
     model.Description   = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding);
     model.DescriptionEn = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding);
 }
Exemplo n.º 3
0
        private Meta ReadMetaAndCheck(MmdModel model)
        {
            var magic = MmdReaderUtil.ReadStringFixedLength(_reader, 4, Encoding.UTF8);

            if (!"VBP ".Equals(magic))
            {
                throw new BonePoseFileFormatException("error magic " + magic);
            }
            var mainVersion = _reader.ReadInt16();
            var subVersion  = _reader.ReadInt16();

            if (mainVersion != 1 || subVersion != 0)
            {
                throw new BonePoseFileFormatException("not supported version: " + mainVersion + "." + subVersion);
            }
            var ret = new Meta
            {
                BoneCount  = _reader.ReadInt32(),
                FrameCount = _reader.ReadInt32(),
                StepLength = _reader.ReadSingle()
            };
            var exceptedModelHash = _reader.ReadBytes(16);
            var modelHash         = BonePoseFileGenerator.CalculateModelHash(model);

            if (!exceptedModelHash.SequenceEqual(modelHash))
            {
                throw new BonePoseNotSuitableException("model hash not equals the value in bone pose file");
            }
            return(ret);
        }
        public static byte[] CalculateModelHash(MmdModel model)
        {
            var byteList = new List <byte>();

            byteList.AddRange(CharEncoding.GetBytes(model.Name));
            byteList.Add(0);
            byteList.AddRange(GetArrayLengthBytes(model.Vertices));
            byteList.Add(0);
            byteList.AddRange(GetArrayLengthBytes(model.TriangleIndexes));
            byteList.Add(0);
            byteList.AddRange(GetArrayLengthBytes(model.Parts));
            byteList.Add(0);
            byteList.AddRange(GetArrayLengthBytes(model.Morphs));
            byteList.Add(0);
            byteList.AddRange(GetArrayLengthBytes(model.Rigidbodies));
            byteList.Add(0);
            byteList.AddRange(GetArrayLengthBytes(model.Constraints));
            byteList.Add(0);
            foreach (var bone in model.Bones)
            {
                byteList.AddRange(CharEncoding.GetBytes(bone.Name));
                byteList.Add(0);
            }
            var bytes = byteList.ToArray();
            var md5   = MD5.Create();

            return(md5.ComputeHash(bytes));
        }
 public static void Generate(MmdModel model, MmdMotion motion, string savePath,
                             float frameStepLength   = DefaultStepLength, float timeAfterMotionFinish = 0.0f,
                             float physicsStepLength = DefaultStepLength)
 {
     new BonePoseFileGenerator().DoGenerate(model, motion, savePath, frameStepLength, timeAfterMotionFinish,
                                            physicsStepLength);
 }
Exemplo n.º 6
0
        private static void ReadInfoEn(BinaryReader reader, MmdModel model, PmdReadContext context)
        {
            var hasInfoEn = reader.ReadSByte() == 1;

            if (!hasInfoEn)
            {
                return;
            }
            model.NameEn        = MmdReaderUtil.ReadStringFixedLength(reader, 20, Tools.JapaneseEncoding);
            model.DescriptionEn = MmdReaderUtil.ReadStringFixedLength(reader, 256, Tools.JapaneseEncoding);

            for (var i = 0; i < context.BoneNum; ++i)
            {
                var bone = model.Bones[i];
                bone.NameEn = MmdReaderUtil.ReadStringFixedLength(reader, 20, Tools.JapaneseEncoding);
            }

            if (model.Morphs.Length > 0)
            {
                model.Morphs[0].NameEn = model.Morphs[0].Name;
            }
            for (var i = 1; i < model.Morphs.Length; ++i)
            {
                var morph = model.Morphs[i];
                morph.NameEn = MmdReaderUtil.ReadStringFixedLength(reader, 20, Tools.JapaneseEncoding);
            }

            // UNDONE
            for (var i = 0; i < context.BoneNameListNum; ++i)
            {
                MmdReaderUtil.ReadStringFixedLength(reader, 50, Tools.JapaneseEncoding);
            }
        }
Exemplo n.º 7
0
        private static void ReadRigidBodies(BinaryReader reader, MmdModel model, PmxConfig pmxConfig)
        {
            var rigidBodyNum = reader.ReadInt32();

            model.Rigidbodies = new MmdRigidBody[rigidBodyNum];
            for (var i = 0; i < rigidBodyNum; ++i)
            {
                var rigidBody = new MmdRigidBody
                {
                    Name   = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding),
                    NameEn = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding),
                    AssociatedBoneIndex = MmdReaderUtil.ReadIndex(reader, pmxConfig.BoneIndexSize),
                    CollisionGroup      = reader.ReadByte(),
                    CollisionMask       = reader.ReadUInt16(),
                    Shape         = (MmdRigidBody.RigidBodyShape)reader.ReadByte(),
                    Dimemsions    = MmdReaderUtil.ReadVector3(reader),
                    Position      = MmdReaderUtil.ReadVector3(reader),
                    Rotation      = MmdReaderUtil.ReadVector3(reader),
                    Mass          = reader.ReadSingle(),
                    TranslateDamp = reader.ReadSingle(),
                    RotateDamp    = reader.ReadSingle(),
                    Restitution   = reader.ReadSingle(),
                    Friction      = reader.ReadSingle(),
                    Type          = (MmdRigidBody.RigidBodyType)reader.ReadByte()
                };
                model.Rigidbodies[i] = rigidBody;
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// 读取mmd
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        public override MmdModel Read(BinaryReader reader, ModelReadConfig config)
        {
            //config虽然现在是空的,但是等下会被赋值,作者只是想顺便传出去一下
            var pmxHeader = ReadMeta(reader);                                                                                   //OYM:读取

            if (!"PMX ".Equals(pmxHeader.Magic) || Math.Abs(pmxHeader.Version - 2.0f) > 0.0001f || pmxHeader.FileFlagSize != 8) //OYM:验证文件
            {
                throw new MmdFileParseException("File is not a PMX 2.0 file");
            }

            var model     = new MmdModel();
            var pmxConfig = ReadPmxConfig(reader, model);             //OYM:底层读取,另外config在这里获取

            ReadModelNameAndDescription(reader, model, pmxConfig);    //OYM:读取文件信息
            ReadVertices(reader, model, pmxConfig);                   //OYM:读取顶点
            ReadTriangles(reader, model, pmxConfig);                  //OYM:读取三角形
            var textureList = ReadTextureList(reader, pmxConfig);     //OYM:获取所有材质的路径的一个类

            ReadParts(reader, config, model, pmxConfig, textureList); //OYM:获取材质shader的类
            ReadBones(reader, model, pmxConfig);                      //OYM:获取骨骼
            ReadMorphs(reader, model, pmxConfig);                     //OYM:表情包~
            ReadEntries(reader, pmxConfig);                           //OYM:没用,但是还是要把字节取出来丢掉
            ReadRigidBodies(reader, model, pmxConfig);                //OYM:获取碰撞
            ReadConstraints(reader, model, pmxConfig);                //OYM:获取约束
            model.Normalize();                                        //OYM:检查顶点
            return(model);
        }
Exemplo n.º 9
0
        private static void UpdateVertexOffsetByMorph(MmdModel model, int index, float rate, Vector3[] output)
        {
            if (rate < Tools.MmdMathConstEps)
            {
                return;
            }
            var morph = model.Morphs[index];

            switch (morph.Type)
            {
            case Morph.MorphType.MorphTypeGroup:
                foreach (var morphData in morph.MorphDatas)
                {
                    var data = (Morph.GroupMorph)morphData;
                    UpdateVertexOffsetByMorph(model, data.MorphIndex, data.MorphRate * rate, output);
                }
                break;

            case Morph.MorphType.MorphTypeVertex:
                foreach (var morphData in morph.MorphDatas)
                {
                    var data = (Morph.VertexMorph)morphData;
                    output[data.VertexIndex] = output[data.VertexIndex] + data.Offset * rate;
                }
                break;
            }
        }
Exemplo n.º 10
0
        public override MmdModel Read(BinaryReader reader, ModelReadConfig config)
        {
            var pmxHeader = ReadMeta(reader);

            if (!"PMX ".Equals(pmxHeader.Magic) || Math.Abs(pmxHeader.Version - 2.0f) > 0.0001f || pmxHeader.FileFlagSize != 8)
            {
                throw new MmdFileParseException("File is not a PMX 2.0 file");
            }

            var model     = new MmdModel();
            var pmxConfig = ReadPmxConfig(reader, model);

            ReadModelNameAndDescription(reader, model, pmxConfig);
            ReadVertices(reader, model, pmxConfig);
            ReadTriangles(reader, model, pmxConfig);
            var textureList = ReadTextureList(reader, pmxConfig);

            ReadParts(reader, config, model, pmxConfig, textureList);
            ReadBones(reader, model, pmxConfig);
            ReadMorphs(reader, model, pmxConfig);
            ReadEntries(reader, pmxConfig);
            ReadRigidBodies(reader, model, pmxConfig);
            ReadConstraints(reader, model, pmxConfig);
            model.Normalize();
            return(model);
        }
Exemplo n.º 11
0
        private void DoGenerate(MmdModel model, MmdMotion motion, string savePath, float frameStepLength, float timeAfterMotionFinish, float physicsStepLength)
        {
            try
            {
                _status = GenerateStatus.Preparing;
                if (physicsStepLength > frameStepLength)
                {
                    physicsStepLength = frameStepLength;
                }
                var poser          = new Poser(model);
                var motionPlayer   = new MotionPlayer(motion, poser);
                var physicsReactor = new BulletPyhsicsReactor();

                var totalTimeLength = motion.Length / 30.0 + timeAfterMotionFinish;
                var totalStepCount  = (int)(totalTimeLength / frameStepLength) + 1;
                var playPos         = 0.0;
                var maxSubSteps     = (int)(frameStepLength / physicsStepLength) + 1;

                using (var fileStream = new FileStream(savePath, FileMode.Create))
                {
                    using (var bufferedStream = new BufferedStream(fileStream))
                    {
                        using (var binaryWriter = new BinaryWriter(bufferedStream))
                        {
                            WriteHeader(binaryWriter, model, totalStepCount + 1, frameStepLength);
                            _status           = GenerateStatus.CalculatingFrames;
                            _totalFrames      = totalStepCount + 1;
                            _calculatedFrames = 0;
                            physicsReactor.AddPoser(poser);
                            motionPlayer.SeekFrame(0);
                            poser.PrePhysicsPosing();
                            physicsReactor.Reset();
                            poser.PostPhysicsPosing();
                            WritePose(binaryWriter, poser);
                            _calculatedFrames = 1;
                            for (var i = 0; i < totalStepCount; ++i)
                            {
                                playPos += frameStepLength;
                                motionPlayer.SeekTime(playPos);
                                poser.PrePhysicsPosing();
                                physicsReactor.React(frameStepLength, maxSubSteps, physicsStepLength);
                                poser.PostPhysicsPosing();
                                WritePose(binaryWriter, poser);
                                _calculatedFrames = i + 2;
                            }
                        }
                    }
                }
                _status = GenerateStatus.Finished;
            }
            catch (Exception e)
            {
                _status = GenerateStatus.Failed;
                Debug.LogException(e);
            }
        }
Exemplo n.º 12
0
 private static void WriteHeader(BinaryWriter binaryWriter, MmdModel model, int totalFrameCount, float frameStepLength)
 {
     binaryWriter.Write(CharEncoding.GetBytes("VBP "));
     binaryWriter.Write((short)1);
     binaryWriter.Write((short)0);
     binaryWriter.Write(model.Bones.Length);
     binaryWriter.Write(totalFrameCount);
     binaryWriter.Write(frameStepLength);
     binaryWriter.Write(CalculateModelHash(model));
 }
Exemplo n.º 13
0
        private static void ReadVertices(BinaryReader reader, MmdModel model, PmxConfig pmxConfig)
        {
            var vertexNum = reader.ReadInt32();

            model.Vertices = new Vertex[vertexNum];
            for (uint i = 0; i < vertexNum; ++i)
            {
                var vertex = ReadVertex(reader, pmxConfig);
                model.Vertices[i] = vertex;
            }
        }
Exemplo n.º 14
0
        public static BonePoseFileGenerator GenerateAsync(MmdModel model, MmdMotion motion, string savePath,
                                                          float frameStepLength = DefaultStepLength, float timeAfterMotionFinish = 0.0f, float physicsStepLength = DefaultStepLength)
        {
            var ret = new BonePoseFileGenerator();

            new Thread(() =>
            {
                ret.DoGenerate(model, motion, savePath, frameStepLength, timeAfterMotionFinish, physicsStepLength);
            }).Start();
            return(ret);
        }
Exemplo n.º 15
0
        private void DoLoadModel(string filePath)
        {
            Debug.LogFormat("start load model {0}", filePath);
            _model = ModelReader.LoadMmdModel(filePath, _modelReadConfig);
            Release();
            var directoryInfo = new FileInfo(filePath).Directory;

            if (directoryInfo == null)
            {
                throw new MmdFileParseException(filePath + " does not belong to any directory.");
            }
            var relativePath = directoryInfo.FullName;

            _materialLoader = new MaterialLoader(new TextureLoader(relativePath, DefaultMaxTextureSize));
            var vertCount = _model.Vertices.Length;

            if (vertCount <= 65535)
            {
                var mesh = new Mesh
                {
                    vertices = new Vector3[vertCount],
                    normals  = new Vector3[vertCount]
                };
                var triangleCount = _model.TriangleIndexes.Length / 3;
                var triangles     = _model.TriangleIndexes;
                FillSubMesh(mesh, triangleCount, triangles);
                var uv    = ExtratUv(_model.Vertices);
                var uvVec = new Vector2[vertCount];
                Utils.MmdUvToUnityUv(uv, uvVec);
                mesh.uv          = uvVec;
                mesh.boneWeights = _model.Vertices.Select(x => ConvertBoneWeight(x.SkinningOperator)).ToArray();
                ReleasePreviousMeshes();
                Mesh = mesh;
                mesh.RecalculateBounds();
                _partIndexes = null;
            }
            else
            {
                var triangleCount = _model.TriangleIndexes.Length / 3;
                var triangles     = _model.TriangleIndexes;
                var uv            = ExtratUv(_model.Vertices);
                ;
                var uvVec = new Vector2[vertCount];
                Utils.MmdUvToUnityUv(uv, uvVec);
                FillPartMeshes(triangleCount, triangles, uv);
            }
            _poser          = new Poser(_model);
            _physicsReactor = new BulletPyhsicsReactor();
            _physicsReactor.AddPoser(_poser);
            InitMesh();
            Debug.LogFormat("load model finished {0}", filePath);
        }
Exemplo n.º 16
0
 public void CalculateMorphVertexOffset(MmdModel model, double time, Vector3[] output)
 {
     if (output.Length != model.Vertices.Length)
     {
         throw new ArgumentException("model vertex count not equals to output array length");
     }
     Array.Clear(output, 0, output.Length);
     foreach (var entry in _morphMap)
     {
         var morphPose = _motion.GetMorphPose(entry.Key, time);
         UpdateVertexOffsetByMorph(model, entry.Value, morphPose.Weight, output);
     }
 }
Exemplo n.º 17
0
        public override MmdModel Read(BinaryReader reader, ModelReadConfig config)
        {
            var model   = new MmdModel();
            var context = new PmdReadContext();
            var meta    = ReadMeta(reader);

            if (!"Pmd".Equals(meta.Magic) || Math.Abs(meta.Version - 1.0f) > 0.0001f)
            {
                throw new MmdFileParseException("File is not a PMD 1.0 file");
            }
            ReadDescription(reader, model);
            ReadVertices(reader, model);
            ReadTriangles(reader, model);
            var toonTextureIds = new List <int>();

            ReadParts(reader, model, toonTextureIds);
            ReadBonesAndIks(reader, model, context);
            ReadFaces(reader, model);
            ReadFacdDisplayListNames(reader);
            ReadBoneNameList(reader, context);
            ReadBoneDisp(reader);
            if (MmdReaderUtil.Eof(reader))
            {
                goto PMD_READER_READ_LEGACY_30;
            }
            ReadInfoEn(reader, model, context);
            if (MmdReaderUtil.Eof(reader))
            {
                goto PMD_READER_READ_LEGACY_30;
            }
            ReadCustomTextures(reader, config, model, toonTextureIds);
            if (MmdReaderUtil.Eof(reader))
            {
                goto PMD_READER_READ_LEGACY_50;
            }
            ReadRigidBodies(reader, model, context);
            ReadConstraints(reader, model);
            goto PMD_READER_READ_SUCCEED;

PMD_READER_READ_LEGACY_30:

            for (var i = 0; i < model.Parts.Length; ++i)
            {
                var material = model.Parts[i].Material;
                material.Toon = MmdTextureUtil.GetGlobalToon(toonTextureIds[i], config.GlobalToonPath);
            }
PMD_READER_READ_LEGACY_50:
PMD_READER_READ_SUCCEED:
            model.Normalize();
            return(model);
        }
Exemplo n.º 18
0
        private static void ReadRigidBodies(BinaryReader reader, MmdModel model, PmdReadContext context)
        {
            var rigidBodyNum = reader.ReadInt32();

            model.Rigidbodies = new MmdRigidBody[rigidBodyNum];
            for (var i = 0; i < rigidBodyNum; ++i)
            {
                var rigidBody = new MmdRigidBody();

                rigidBody.Name = MmdReaderUtil.ReadStringFixedLength(reader, 20, Tools.JapaneseEncoding).Trim();
                var boneIndex = reader.ReadUInt16();
                if (boneIndex < context.BoneNum)
                {
                    rigidBody.AssociatedBoneIndex = boneIndex;
                }
                else
                {
                    if (context.CenterBoneIndex == null)
                    {
                        rigidBody.AssociatedBoneIndex = 0;
                    }
                    else
                    {
                        rigidBody.AssociatedBoneIndex = context.CenterBoneIndex.Value;
                    }
                }
                rigidBody.CollisionGroup = reader.ReadSByte();
                rigidBody.CollisionMask  = reader.ReadUInt16();
                rigidBody.Shape          = (MmdRigidBody.RigidBodyShape)reader.ReadByte();
                rigidBody.Dimemsions     = MmdReaderUtil.ReadVector3(reader);
                var rbPosition = MmdReaderUtil.ReadVector3(reader);
                rigidBody.Position      = model.Bones[rigidBody.AssociatedBoneIndex].Position + rbPosition;
                rigidBody.Rotation      = MmdReaderUtil.ReadVector3(reader);
                rigidBody.Mass          = reader.ReadSingle();
                rigidBody.TranslateDamp = reader.ReadSingle();
                rigidBody.RotateDamp    = reader.ReadSingle();
                rigidBody.Restitution   = reader.ReadSingle();
                rigidBody.Friction      = reader.ReadSingle();

                var type = reader.ReadByte();
                if (boneIndex < context.BoneNum)
                {
                    rigidBody.Type = (MmdRigidBody.RigidBodyType)type;
                }
                else
                {
                    rigidBody.Type = MmdRigidBody.RigidBodyType.RigidTypePhysicsGhost;
                }
                model.Rigidbodies[i] = rigidBody;
            }
        }
Exemplo n.º 19
0
        private static void ReadTriangles(BinaryReader reader, MmdModel model)
        {
            var triangleIndexCount = reader.ReadInt32();

            model.TriangleIndexes = new int[triangleIndexCount];
            if (triangleIndexCount % 3 != 0)
            {
                throw new MmdFileParseException("triangle index count " + triangleIndexCount + " is not multiple of 3");
            }
            for (var i = 0; i < triangleIndexCount; ++i)
            {
                model.TriangleIndexes[i] = reader.ReadUInt16();
            }
        }
Exemplo n.º 20
0
        /// <summary>
        /// 读取三角形数目
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="model"></param>
        /// <param name="pmxConfig"></param>
        private static void ReadTriangles(BinaryReader reader, MmdModel model, PmxConfig pmxConfig)
        {
            var triangleIndexCount = reader.ReadInt32();

            model.TriangleIndexes = new int[triangleIndexCount];
            if (triangleIndexCount % 3 != 0)//OYM:如果不是三的整数倍就报错(这样子就代表肯定有个三角形的数据丢失了)
            {
                throw new MmdFileParseException("triangle index count " + triangleIndexCount + " is not multiple of 3");
            }
            for (var i = 0; i < triangleIndexCount; ++i)
            {
                model.TriangleIndexes[i] = MmdReaderUtil.ReadIndex(reader, pmxConfig.VertexIndexSize);//OYM:读取三角形,注意三角形是根据顶点的序号数目生成的
            }
        }
Exemplo n.º 21
0
        private static void ReadTriangles(BinaryReader reader, MmdModel model, PmxConfig pmxConfig)
        {
            var triangleIndexCount = reader.ReadInt32();

            model.TriangleIndexes = new int[triangleIndexCount];
            if (triangleIndexCount % 3 != 0)
            {
                throw new MmdFileParseException("triangle index count " + triangleIndexCount + " is not multiple of 3");
            }
            for (var i = 0; i < triangleIndexCount; ++i)
            {
                model.TriangleIndexes[i] = MmdReaderUtil.ReadIndex(reader, pmxConfig.VertexIndexSize);
            }
        }
Exemplo n.º 22
0
        private void ReadFaces(BinaryReader reader, MmdModel model)
        {
            var faceNum        = reader.ReadUInt16();
            int?baseMorphIndex = null;

            model.Morphs = new Morph[faceNum];
            for (var i = 0; i < faceNum; ++i)
            {
                var morph = new Morph();
                var fp    = ReadPmdFacePreamble(reader);
                morph.Name     = fp.Name;
                morph.Category = (Morph.MorphCategory)fp.FaceType;
                if (morph.Category == Morph.MorphCategory.MorphCatSystem)
                {
                    baseMorphIndex = i;
                }
                morph.Type       = Morph.MorphType.MorphTypeVertex;
                morph.MorphDatas = new Morph.MorphData[fp.VertexNum];
                for (var j = 0; j < fp.VertexNum; ++j)
                {
                    var vertexMorphData = new Morph.VertexMorph();
                    vertexMorphData.VertexIndex = reader.ReadInt32();
                    vertexMorphData.Offset      = MmdReaderUtil.ReadVector3(reader);
                    morph.MorphDatas[j]         = vertexMorphData;
                }
                model.Morphs[i] = morph;
            }

            if (baseMorphIndex != null)
            {
                var baseMorph = model.Morphs[baseMorphIndex.Value];
                for (var i = 0; i < faceNum; ++i)
                {
                    if (i == baseMorphIndex)
                    {
                        continue;
                    }
                    var morph = model.Morphs[i];
                    for (var j = 0; j < morph.MorphDatas.Length; ++j)
                    {
                        var vertexMorphData      = (Morph.VertexMorph)morph.MorphDatas[j];
                        var morphDataVertexIndex = vertexMorphData.VertexIndex;
                        vertexMorphData.VertexIndex = ((Morph.VertexMorph)baseMorph.MorphDatas[morphDataVertexIndex])
                                                      .VertexIndex;
                    }
                }
            }
        }
Exemplo n.º 23
0
        private Dictionary <string, int> BuildBoneNameToIndexDictionary(MmdModel model)
        {
            var bones = model.Bones;

            if (bones == null || bones.Length == 0)
            {
                return(new Dictionary <string, int>());
            }
            var ret = new Dictionary <string, int>();

            for (var i = 0; i < bones.Length; ++i)
            {
                ret.Add(bones[i].Name, i);
            }
            return(ret);
        }
Exemplo n.º 24
0
        private static PmxConfig ReadPmxConfig(BinaryReader reader, MmdModel model)
        {
            var pmxConfig = new PmxConfig();

            pmxConfig.Utf8Encoding       = reader.ReadByte() != 0;
            pmxConfig.ExtraUvNumber      = reader.ReadSByte();
            pmxConfig.VertexIndexSize    = reader.ReadSByte();
            pmxConfig.TextureIndexSize   = reader.ReadSByte();
            pmxConfig.MaterialIndexSize  = reader.ReadSByte();
            pmxConfig.BoneIndexSize      = reader.ReadSByte();
            pmxConfig.MorphIndexSize     = reader.ReadSByte();
            pmxConfig.RigidBodyIndexSize = reader.ReadSByte();

            model.ExtraUvNumber = pmxConfig.ExtraUvNumber;
            pmxConfig.Encoding  = pmxConfig.Utf8Encoding ? Encoding.UTF8 : Encoding.Unicode;
            return(pmxConfig);
        }
Exemplo n.º 25
0
 private void Load(MmdModel model, string path)
 {
     Release();
     try
     {
         _fileStream     = new FileStream(path, FileMode.Open, FileAccess.Read);
         _bufferedStream = new BufferedStream(_fileStream, BufferSize);
         _reader         = new BinaryReader(_bufferedStream);
     }
     catch (Exception e)
     {
         Release();
         throw e;
     }
     _meta = ReadMetaAndCheck(model);
     _dataStartPosition = _bufferedStream.Position;
     _readFramePos      = 0;
 }
Exemplo n.º 26
0
        private static PmxConfig ReadPmxConfig(BinaryReader reader, MmdModel model)
        {
            //https://www.cnblogs.com/tanding/archive/2012/07/02/2572702.html
            //OYM:下面一摞方法都是读取一个字节,从0-256到-128-128的方法都有.

            var pmxConfig = new PmxConfig();

            pmxConfig.Utf8Encoding       = reader.ReadByte() != 0; //OYM:是否是UTF8
            pmxConfig.ExtraUvNumber      = reader.ReadSByte();     //OYM:UV数量
            pmxConfig.VertexIndexSize    = reader.ReadSByte();     //OYM:不知道
            pmxConfig.TextureIndexSize   = reader.ReadSByte();     //OYM:不知道
            pmxConfig.MaterialIndexSize  = reader.ReadSByte();     //OYM:不知道,下面都不知道,懒得写了
            pmxConfig.BoneIndexSize      = reader.ReadSByte();
            pmxConfig.MorphIndexSize     = reader.ReadSByte();
            pmxConfig.RigidBodyIndexSize = reader.ReadSByte();

            model.ExtraUvNumber = pmxConfig.ExtraUvNumber;
            pmxConfig.Encoding  = pmxConfig.Utf8Encoding ? Encoding.UTF8 : Encoding.Unicode;
            return(pmxConfig);
        }
Exemplo n.º 27
0
        private static List <int> GetMorphIndexes(MmdModel model)
        {
            var morphs   = model.Morphs;
            var indexSet = new HashSet <int>();

            foreach (var morph in morphs)
            {
                if (morph.Type != Morph.MorphType.MorphTypeVertex)
                {
                    continue;
                }
                foreach (var morphData in morph.MorphDatas)
                {
                    var data = (Morph.VertexMorph)morphData;
                    indexSet.Add(data.VertexIndex);
                }
            }
            var ret = new List <int>(indexSet);

            ret.Sort();
            return(ret);
        }
Exemplo n.º 28
0
        private static void ReadConstraints(BinaryReader reader, MmdModel model)
        {
            var constraintNum = reader.ReadUInt32();

            model.Constraints = new Constraint[constraintNum];
            for (var i = 0; i < constraintNum; ++i)
            {
                var constraint = new Constraint();
                constraint.Name = MmdReaderUtil.ReadStringFixedLength(reader, 20, Tools.JapaneseEncoding);
                constraint.AssociatedRigidBodyIndex[0] = reader.ReadInt32();
                constraint.AssociatedRigidBodyIndex[1] = reader.ReadInt32();
                constraint.Position         = MmdReaderUtil.ReadVector3(reader);
                constraint.Rotation         = MmdReaderUtil.ReadVector3(reader);
                constraint.PositionLowLimit = MmdReaderUtil.ReadVector3(reader);
                constraint.PositionHiLimit  = MmdReaderUtil.ReadVector3(reader);
                constraint.RotationLowLimit = MmdReaderUtil.ReadVector3(reader);
                constraint.RotationHiLimit  = MmdReaderUtil.ReadVector3(reader);
                constraint.SpringTranslate  = MmdReaderUtil.ReadVector3(reader);
                constraint.SpringRotate     = MmdReaderUtil.ReadVector3(reader);
                model.Constraints[i]        = constraint;
            }
        }
Exemplo n.º 29
0
        private static void ReadParts(BinaryReader reader, ModelReadConfig config, MmdModel model, PmxConfig pmxConfig, MmdTexture[] textureList)
        {
            var partNum       = reader.ReadInt32();
            var partBaseShift = 0;

            model.Parts = new Part[partNum];
            for (var i = 0; i < partNum; i++)
            {
                var part     = new Part();
                var material = ReadMaterial(reader, config, pmxConfig.Encoding, pmxConfig.TextureIndexSize, textureList);
                part.Material = material;
                var partTriangleIndexNum = reader.ReadInt32();
                if (partTriangleIndexNum % 3 != 0)
                {
                    throw new MmdFileParseException("part" + i + " triangle index count " + partTriangleIndexNum +
                                                    " is not multiple of 3");
                }
                part.BaseShift        = partBaseShift;
                part.TriangleIndexNum = partTriangleIndexNum;
                partBaseShift        += partTriangleIndexNum;
                model.Parts[i]        = part;
            }
        }
Exemplo n.º 30
0
        private static void ReadConstraints(BinaryReader reader, MmdModel model, PmxConfig pmxConfig)
        {
            var constraintNum = reader.ReadInt32();

            model.Constraints = new Constraint[constraintNum];
            for (var i = 0; i < constraintNum; ++i)
            {
                var constraint = new Constraint
                {
                    Name   = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding),
                    NameEn = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding)
                };
                var dofType = reader.ReadByte();
                if (dofType == 0)
                {
                    constraint.AssociatedRigidBodyIndex[0] =
                        MmdReaderUtil.ReadIndex(reader, pmxConfig.RigidBodyIndexSize);
                    constraint.AssociatedRigidBodyIndex[1] =
                        MmdReaderUtil.ReadIndex(reader, pmxConfig.RigidBodyIndexSize);
                    constraint.Position         = MmdReaderUtil.ReadVector3(reader);
                    constraint.Rotation         = MmdReaderUtil.ReadVector3(reader);
                    constraint.PositionLowLimit = MmdReaderUtil.ReadVector3(reader);
                    constraint.PositionHiLimit  = MmdReaderUtil.ReadVector3(reader);
                    constraint.RotationLowLimit = MmdReaderUtil.ReadVector3(reader);
                    constraint.RotationHiLimit  = MmdReaderUtil.ReadVector3(reader);
                    constraint.SpringTranslate  = MmdReaderUtil.ReadVector3(reader);
                    constraint.SpringRotate     = MmdReaderUtil.ReadVector3(reader);
                }
                else
                {
                    throw new MmdFileParseException("Only 6DOF spring joints are supported.");
                }

                model.Constraints[i] = constraint;
            }
        }
Exemplo n.º 31
0
 public MmdMorph(MmdImport import, MmdModel model, int index)
 {
     this.import = import;
     this.Model = model;
     this.Index = index;
 }