Example #1
0
        static void ExportVrm(IVrmExporter exporter, Model m)
        {
            if (m.Vrm == null)
            {
                return;
            }

            exporter.ExportVrmMeta(m.Vrm, m.Textures);

            exporter.ExportVrmHumanoid(m.GetBoneMap(), m.Nodes);

            exporter.ExportVrmMaterialProperties(m.Materials, m.Textures);

            exporter.ExportVrmBlendShape(m.Vrm.BlendShape, m.MeshGroups, m.Materials);

            exporter.ExportVrmSpringBone(m.Vrm.SpringBone, m.Nodes);

            exporter.ExportVrmFirstPersonAndLookAt(m.Vrm.FirstPerson, m.Vrm.LookAt, m.MeshGroups, m.Nodes);
        }
Example #2
0
        public static byte[] Export(this IVrmExporter exporter, Model m, ExportArgs option)
        {
            exporter.ExportAsset(m);

            ///
            /// 必要な容量を先に確保
            /// (sparseは考慮してないので大きめ)
            ///
            {
                var reserveBytes = 0;
                // image
                foreach (var image in m.Images)
                {
                    reserveBytes += image.Bytes.Count;
                }
                // mesh
                foreach (var g in m.MeshGroups)
                {
                    foreach (var mesh in g.Meshes)
                    {
                        // 頂点バッファ
                        reserveBytes += mesh.IndexBuffer.ByteLength;
                        foreach (var kv in mesh.VertexBuffer)
                        {
                            reserveBytes += kv.Value.ByteLength;
                        }
                        // morph
                        foreach (var morph in mesh.MorphTargets)
                        {
                            foreach (var kv in morph.VertexBuffer)
                            {
                                reserveBytes += kv.Value.ByteLength;
                            }
                        }
                    }
                }
                exporter.Reserve(reserveBytes);
            }

            exporter.ExportImageAndTextures(m.Images, m.Textures);

            // material
            foreach (var src in m.Materials)
            {
                if (src is MToonMaterial mtoon)
                {
                    exporter.ExportMaterialMToon(src, mtoon, m.Textures);
                }
                else if (src is UnlitMaterial unlit)
                {
                    exporter.ExportMaterialUnlit(src, unlit, m.Textures);
                }
                else if (src is PBRMaterial pbr)
                {
                    exporter.ExportMaterialPBR(src, pbr, m.Textures);
                }
                else
                {
                    throw new NotImplementedException();
                }
            }

            // mesh
            exporter.ExportMeshes(m.MeshGroups, m.Materials, option);

            // node
            exporter.ExportNodes(m.Root, m.Nodes, m.MeshGroups, option);

            // animation
            exporter.ExportAnimations(m.Animations, m.Nodes, option);

            if (option.vrm)
            {
                ExportVrm(exporter, m);
            }

            return(exporter.ToBytes());
        }