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; } }
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); }
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); }
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); } }
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; } }
/// <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); }
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; } }
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); }
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); } }
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)); }
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; } }
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); }
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); }
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); } }
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); }
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; } }
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(); } }
/// <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:读取三角形,注意三角形是根据顶点的序号数目生成的 } }
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); } }
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; } } } }
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); }
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); }
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; }
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); }
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); }
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; } }
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; } }
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; } }
public MmdMorph(MmdImport import, MmdModel model, int index) { this.import = import; this.Model = model; this.Index = index; }