private static void WriteSectionLibraryVisualScenes(XmlTextWriter xw, CmbChunk cmbRoot) { xw.WriteStartElement("library_visual_scenes"); { xw.WriteStartElement("visual_scene"); xw.WriteAttributeString("id", "default"); { foreach (MshsChunk.Mesh mesh in cmbRoot.SklmChunk.MshsChunk.Meshes) { SepdChunk sepd = cmbRoot.SklmChunk.ShpChunk.SepdChunks[mesh.SepdID]; MatsChunk.Material mat = cmbRoot.MatsChunk.Materials[mesh.MaterialID]; string nodeId = string.Format("node-{0:X8}", mesh.GetHashCode()); xw.WriteStartElement("node"); xw.WriteAttributeString("id", nodeId); xw.WriteAttributeString("name", nodeId); { xw.WriteStartElement("translate"); xw.WriteString("0.0 0.0 0.0"); xw.WriteEndElement(); xw.WriteStartElement("rotate"); xw.WriteString("0.0 0.0 1.0 0.0"); xw.WriteEndElement(); xw.WriteStartElement("rotate"); xw.WriteString("0.0 1.0 0.0 0.0"); xw.WriteEndElement(); xw.WriteStartElement("rotate"); xw.WriteString("1.0 0.0 0.0 0.0"); xw.WriteEndElement(); xw.WriteStartElement("scale"); xw.WriteString("1.0 1.0 1.0"); xw.WriteEndElement(); xw.WriteStartElement("instance_geometry"); xw.WriteAttributeString("url", string.Format("#geom-{0:X8}", mesh.GetHashCode())); { xw.WriteStartElement("bind_material"); { xw.WriteStartElement("technique_common"); { xw.WriteStartElement("instance_material"); xw.WriteAttributeString("symbol", string.Format("material-{0:X8}-symbol", mat.GetHashCode())); xw.WriteAttributeString("target", string.Format("#material-{0:X8}", mat.GetHashCode())); xw.WriteEndElement(); } xw.WriteEndElement(); } xw.WriteEndElement(); } xw.WriteEndElement(); } xw.WriteEndElement(); } } xw.WriteEndElement(); } xw.WriteEndElement(); }
private static void WriteSectionLibraryGeometry(XmlTextWriter xw, CmbChunk cmbRoot) { xw.WriteStartElement("library_geometries"); { foreach (MshsChunk.Mesh mesh in cmbRoot.SklmChunk.MshsChunk.Meshes) { SepdChunk sepd = cmbRoot.SklmChunk.ShpChunk.SepdChunks[mesh.SepdID]; MatsChunk.Material mat = cmbRoot.MatsChunk.Materials[mesh.MaterialID]; string meshId = string.Format("geom-{0:X8}", mesh.GetHashCode()); xw.WriteStartElement("geometry"); xw.WriteAttributeString("id", meshId); xw.WriteAttributeString("name", meshId); { xw.WriteStartElement("mesh"); { /* Vertices */ xw.WriteStartElement("source"); xw.WriteAttributeString("id", string.Format("{0}-pos", meshId)); { float[] vtxData = ConvertToFloatArray(sepd.VertexArrayDataType, cmbRoot.VatrChunk.Vertices, sepd.VertexArrayOffset, sepd.VertexArrayScale); xw.WriteStartElement("float_array"); xw.WriteAttributeString("id", string.Format("{0}-pos-array", meshId)); xw.WriteAttributeString("count", string.Format("{0}", vtxData.Length)); { for (int i = 0; i < vtxData.Length; i++) { xw.WriteString(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:0.00} ", vtxData[i])); } } xw.WriteEndElement(); xw.WriteStartElement("technique_common"); { xw.WriteStartElement("accessor"); xw.WriteAttributeString("source", string.Format("#{0}-pos-array", meshId)); xw.WriteAttributeString("count", string.Format("{0}", vtxData.Length / 3)); xw.WriteAttributeString("stride", "3"); { xw.WriteStartElement("param"); xw.WriteAttributeString("name", "X"); xw.WriteAttributeString("type", "float"); xw.WriteEndElement(); xw.WriteStartElement("param"); xw.WriteAttributeString("name", "Y"); xw.WriteAttributeString("type", "float"); xw.WriteEndElement(); xw.WriteStartElement("param"); xw.WriteAttributeString("name", "Z"); xw.WriteAttributeString("type", "float"); xw.WriteEndElement(); } xw.WriteEndElement(); } xw.WriteEndElement(); } xw.WriteEndElement(); /* Texcoords */ xw.WriteStartElement("source"); xw.WriteAttributeString("id", string.Format("{0}-texcoord", meshId)); { float[] texCoordData = ConvertToFloatArray(sepd.TextureCoordArrayDataType, cmbRoot.VatrChunk.TextureCoords, sepd.TextureCoordArrayOffset, sepd.TextureCoordArrayScale); xw.WriteStartElement("float_array"); xw.WriteAttributeString("id", string.Format("{0}-texcoord-array", meshId)); xw.WriteAttributeString("count", string.Format("{0}", texCoordData.Length)); { for (int i = 0; i < texCoordData.Length; i++) { xw.WriteString(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:0.00} ", texCoordData[i])); } } xw.WriteEndElement(); xw.WriteStartElement("technique_common"); { xw.WriteStartElement("accessor"); xw.WriteAttributeString("source", string.Format("#{0}-texcoord-array", meshId)); xw.WriteAttributeString("count", string.Format("{0}", texCoordData.Length / 2)); xw.WriteAttributeString("stride", "2"); { xw.WriteStartElement("param"); xw.WriteAttributeString("name", "S"); xw.WriteAttributeString("type", "float"); xw.WriteEndElement(); xw.WriteStartElement("param"); xw.WriteAttributeString("name", "T"); xw.WriteAttributeString("type", "float"); xw.WriteEndElement(); } xw.WriteEndElement(); } xw.WriteEndElement(); } xw.WriteEndElement(); /* Colors */ xw.WriteStartElement("source"); xw.WriteAttributeString("id", string.Format("{0}-colors", meshId)); { float[] colorData = ConvertToFloatArray(sepd.ColorArrayDataType, cmbRoot.VatrChunk.Colors, sepd.ColorArrayOffset, sepd.ColorArrayScale); xw.WriteStartElement("float_array"); xw.WriteAttributeString("id", string.Format("{0}-colors-array", meshId)); xw.WriteAttributeString("count", string.Format("{0}", colorData.Length)); { for (int i = 0; i < colorData.Length; i++) { xw.WriteString(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:0.00} ", colorData[i])); } } xw.WriteEndElement(); xw.WriteStartElement("technique_common"); { xw.WriteStartElement("accessor"); xw.WriteAttributeString("source", string.Format("#{0}-colors-array", meshId)); xw.WriteAttributeString("count", string.Format("{0}", colorData.Length / 4)); xw.WriteAttributeString("stride", "4"); { xw.WriteStartElement("param"); xw.WriteAttributeString("name", "R"); xw.WriteAttributeString("type", "float"); xw.WriteEndElement(); xw.WriteStartElement("param"); xw.WriteAttributeString("name", "G"); xw.WriteAttributeString("type", "float"); xw.WriteEndElement(); xw.WriteStartElement("param"); xw.WriteAttributeString("name", "B"); xw.WriteAttributeString("type", "float"); xw.WriteEndElement(); xw.WriteStartElement("param"); xw.WriteAttributeString("name", "A"); xw.WriteAttributeString("type", "float"); xw.WriteEndElement(); } xw.WriteEndElement(); } xw.WriteEndElement(); } xw.WriteEndElement(); /* Normals */ /*xw.WriteStartElement("source"); * xw.WriteAttributeString("id", string.Format("{0}-norm", meshId)); * { * float[] normData = ConvertToFloatArray(sepd.NormalArrayFormat, cmbRoot.VatrChunk.Normals, sepd.NormalArrayDisplacement, sepd.NormalArrayScale); * * xw.WriteStartElement("float_array"); * xw.WriteAttributeString("id", string.Format("{0}-norm-array", meshId)); * xw.WriteAttributeString("count", string.Format("{0}", normData.Length)); * { * for (int i = 0; i < normData.Length; i += 3) * { * xw.WriteString(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:0.00} {1:0.00} {2:0.00} ", normData[i], normData[i + 1], normData[i + 2])); * } * } * xw.WriteEndElement(); * * xw.WriteStartElement("technique_common"); * { * xw.WriteStartElement("accessor"); * xw.WriteAttributeString("source", string.Format("#{0}-norm-array", meshId)); * xw.WriteAttributeString("count", string.Format("{0}", normData.Length / 3)); * xw.WriteAttributeString("stride", "3"); * { * xw.WriteStartElement("param"); * xw.WriteAttributeString("name", "X"); * xw.WriteAttributeString("type", "float"); * xw.WriteEndElement(); * * xw.WriteStartElement("param"); * xw.WriteAttributeString("name", "Y"); * xw.WriteAttributeString("type", "float"); * xw.WriteEndElement(); * * xw.WriteStartElement("param"); * xw.WriteAttributeString("name", "Z"); * xw.WriteAttributeString("type", "float"); * xw.WriteEndElement(); * } * xw.WriteEndElement(); * } * xw.WriteEndElement(); * } * xw.WriteEndElement(); */ xw.WriteStartElement("vertices"); xw.WriteAttributeString("id", string.Format("{0}-vtx", meshId)); { xw.WriteStartElement("input"); xw.WriteAttributeString("semantic", "POSITION"); xw.WriteAttributeString("source", string.Format("#{0}-pos", meshId)); xw.WriteEndElement(); } xw.WriteEndElement(); foreach (PrmsChunk prms in sepd.PrmsChunks) { xw.WriteStartElement("triangles"); xw.WriteAttributeString("count", string.Format("{0}", prms.PrmChunk.NumberOfIndices)); xw.WriteAttributeString("material", string.Format("material-{0:X8}-symbol", mat.GetHashCode())); { xw.WriteStartElement("input"); xw.WriteAttributeString("semantic", "VERTEX"); xw.WriteAttributeString("source", string.Format("#{0}-vtx", meshId)); xw.WriteAttributeString("offset", "0"); xw.WriteEndElement(); xw.WriteStartElement("input"); xw.WriteAttributeString("semantic", "TEXCOORD"); xw.WriteAttributeString("source", string.Format("#{0}-texcoord", meshId)); xw.WriteAttributeString("offset", "0"); xw.WriteEndElement(); xw.WriteStartElement("input"); xw.WriteAttributeString("semantic", "COLOR"); xw.WriteAttributeString("source", string.Format("#{0}-colors", meshId)); xw.WriteAttributeString("offset", "0"); xw.WriteEndElement(); /* * xw.WriteStartElement("input"); * xw.WriteAttributeString("semantic", "NORMAL"); * xw.WriteAttributeString("source", string.Format("#{0}-norm", meshId)); * xw.WriteAttributeString("offset", "0"); * xw.WriteEndElement(); */ uint[] idx = new uint[prms.PrmChunk.NumberOfIndices]; switch (prms.PrmChunk.DataType) { case Constants.PicaDataType.UnsignedByte: for (int i = 0; i < prms.PrmChunk.NumberOfIndices; i++) { idx[i] = (uint)cmbRoot.Indices[(prms.PrmChunk.FirstIndex * sizeof(ushort)) + (i * prms.PrmChunk.ElementSize)]; } break; case Constants.PicaDataType.UnsignedShort: for (int i = 0; i < prms.PrmChunk.NumberOfIndices; i++) { idx[i] = (uint)BitConverter.ToUInt16(cmbRoot.Indices, (prms.PrmChunk.FirstIndex * sizeof(ushort)) + (i * prms.PrmChunk.ElementSize)); } break; case Constants.PicaDataType.UnsignedInt: for (int i = 0; i < prms.PrmChunk.NumberOfIndices; i++) { idx[i] = BitConverter.ToUInt32(cmbRoot.Indices, (prms.PrmChunk.FirstIndex * sizeof(ushort)) + (i * prms.PrmChunk.ElementSize)); } break; } xw.WriteStartElement("p"); { for (int i = 0; i < idx.Length; i++) { xw.WriteString(string.Format("{0} ", idx[i])); } } xw.WriteEndElement(); } xw.WriteEndElement(); } } xw.WriteEndElement(); } xw.WriteEndElement(); } } xw.WriteEndElement(); }