bool Model_IO::Save(BinaryWriter& writer, const achar* path) { // ヘッダー uint8_t header[] = "MDL"; for (int32_t i = 0; i < 4; i++) { writer.Push(header[i]); } // バージョン writer.Push(0); // ボーン SaveDeformer(Deformer_, writer, path); // メッシュ SaveMeshes(Meshes, writer, path); // アニメーション writer.Push((int32_t)AnimationSources.size()); for (int32_t i = 0; i < AnimationSources.size(); i++) { SaveAnimationSource(AnimationSources[i], writer, path); } writer.Push((int32_t) AnimationClips.size()); for (int32_t i = 0; i <AnimationClips.size(); i++) { SaveAnimationClip(AnimationClips[i], writer, path); } return true; }
void Model_IO::SaveAnimationSource(AnimationSource& as, BinaryWriter& writer, const achar* path) { writer.Push(as.Name); writer.Push((int32_t) as.KeyframeAnimations.size()); for (int32_t i = 0; i < as.KeyframeAnimations.size(); i++) { SaveKeyframeAnimation(as.KeyframeAnimations[i], writer, path); } }
void Model_IO::SaveDeformer(Deformer& deformer, BinaryWriter& writer, const achar* path) { writer.Push((int32_t)deformer.Bones.size()); for (auto i = 0; i < deformer.Bones.size(); i++) { auto& bone = deformer.Bones[i]; writer.Push(deformer.Bones[i].Name); writer.Push(deformer.Bones[i].ParentBoneIndex); writer.Push((int32_t)deformer.Bones[i].RotationType); writer.Push(deformer.Bones[i].LocalMat); } }
void Model_IO::SaveMaterials(std::vector<Material>& materials, BinaryWriter& writer, const achar* path) { writer.Push((int32_t) materials.size()); for (int32_t i = 0; i < materials.size(); i++) { SaveMaterial(materials[i], writer, path); } }
void Model_IO::SaveMeshes(std::vector<Mesh>& meshes, BinaryWriter& writer, const achar* path) { writer.Push((int32_t) meshes.size()); for (auto i = 0; i < meshes.size(); i++) { SaveMesh(meshes[i], writer, path); } }
void Model_IO::SaveMesh(Mesh& mesh, BinaryWriter& writer, const achar* path) { writer.Push((int32_t)mesh.DividedMeshes.size()); for (auto i = 0; i < mesh.DividedMeshes.size(); i++) { SaveDividedMesh(mesh.DividedMeshes[i], writer, path); } SaveMaterials(mesh.Materials, writer, path); }
void AffIndexTable::Push(BinaryWriter& writer) { array<int16_t, CHARCODE_MAX> indexes; for (auto& x : m_indexes) { indexes[(int)(x.first)] = x.second; } for (auto& x : indexes) { writer.Push(x); } }
void Model_IO::SaveKeyframeAnimation(KeyframeAnimation& ka, BinaryWriter& writer, const achar* path) { writer.Push(ka.Name); writer.Push((int32_t) ka.Keyframes.size()); for (int32_t i = 0; i < ka.Keyframes.size(); i++) { writer.Push(ka.Keyframes[i].KeyValue); writer.Push(ka.Keyframes[i].LeftHandle); writer.Push(ka.Keyframes[i].RightHandle); writer.Push((int32_t)ka.Keyframes[i].Interpolation); } }
void Model_IO::SaveMaterial(Material& material, BinaryWriter& writer, const achar* path) { if (material.Type == 1) { writer.Push((int32_t)1); astring path; writer.Push(path); } else { writer.Push((int32_t) 0); writer.Push(material.OriginalColorTexture.c_str()); writer.Push(material.OriginalNormalTexture.c_str()); writer.Push(material.OriginalMetalnessTexture.c_str()); } }
void Model_IO::SaveAnimationClip(AnimationClip& ac, BinaryWriter& writer, const achar* path) { writer.Push(ac.Name); writer.Push(ac.Index); }
void Model_IO::SaveDividedMesh(DividedMesh& mesh, BinaryWriter& writer, const achar* path) { writer.Push((int32_t) mesh.Vertices.size()); for (int32_t i = 0; i < mesh.Vertices.size(); i++) { auto& v = mesh.Vertices[i]; writer.Push(v.Position); writer.Push(v.Normal); writer.Push(v.Binormal); writer.Push(v.UV1); writer.Push(v.UV2); writer.Push(v.VColor.R); writer.Push(v.VColor.G); writer.Push(v.VColor.B); writer.Push(v.VColor.A); writer.Push(v.BoneWeights[0]); writer.Push(v.BoneWeights[1]); writer.Push(v.BoneWeights[2]); writer.Push(v.BoneWeights[3]); writer.Push(v.BoneIndexes[0]); writer.Push(v.BoneIndexes[1]); writer.Push(v.BoneIndexes[2]); writer.Push(v.BoneIndexes[3]); writer.Push(v.BoneIndexesOriginal[0]); writer.Push(v.BoneIndexesOriginal[1]); writer.Push(v.BoneIndexesOriginal[2]); writer.Push(v.BoneIndexesOriginal[3]); } writer.Push((int32_t) mesh.Faces.size()); for (auto i = 0; i < mesh.Faces.size(); i++) { auto& f = mesh.Faces[i]; writer.Push(f.Indexes[0]); writer.Push(f.Indexes[1]); writer.Push(f.Indexes[2]); } writer.Push((int32_t) mesh.MaterialOffsets.size()); for (int32_t i = 0; i < mesh.MaterialOffsets.size(); i++) { writer.Push(mesh.MaterialOffsets[i].MaterialIndex); writer.Push(mesh.MaterialOffsets[i].FaceOffset); } writer.Push((int32_t) mesh.BoneConnectors.size()); for (int32_t i = 0; i < mesh.BoneConnectors.size(); i++) { writer.Push(mesh.BoneConnectors[i].TargetIndex); writer.Push(mesh.BoneConnectors[i].OffsetMatrix); } }