public void Export_MLOD(StreamWriter w, GenericRCOLResource rcolResource, MLOD mlod, MLOD.Mesh mesh) { float[] uvScales = rcolResource.GetUVScales(mesh); if (mesh.GeometryStates.Count > 0) { w.WriteLine(";"); w.WriteLine("; Extended format: GeoStates follow IBUF"); w.WriteLine(";"); } if (mesh.Flags != 0) { w.WriteLine(";"); w.WriteLine("; Extended format: MeshFlags follow IBUF" + (mesh.GeometryStates.Count > 0 ? " and GeoStates" : "")); w.WriteLine("; (They are ignored on import.)"); w.WriteLine(";"); } VRTF vrtf = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexFormatIndex) as VRTF; bool isDefault = vrtf == null; if (isDefault) { vrtf = VRTF.CreateDefaultForMesh(mesh); w.WriteLine(";;-marker: vrtf is default for mesh"); } w.Export_VRTF(mpb, vrtf); w.Export_SKIN(mpb, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.SkinControllerIndex) as SKIN, mesh); Export_VBUF_Main(w, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexBufferIndex) as VBUF, vrtf, uvScales, mesh); Export_IBUF_Main(w, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.IndexBufferIndex) as IBUF, mesh); //For backward compatibility, these come after the IBUFs Export_MeshGeoStates(w, vrtf, uvScales, mlod, mesh, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexBufferIndex) as VBUF, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.IndexBufferIndex) as IBUF); if (mesh.Flags != 0) { w.WriteLine(";"); w.WriteLine("; Extended format: MeshFlags"); w.WriteLine(";"); w.WriteLine("flags " + mesh.Flags); w.Flush(); } }
public void Export_MLOD(StreamWriter w, GenericRCOLResource rcolResource, MLOD mlod, MLOD.Mesh mesh) { float[] uvScales = rcolResource.GetUVScales(mesh); if (mesh.GeometryStates.Count > 0) { w.WriteLine(";"); w.WriteLine("; Extended format: GeoStates follow IBUF"); w.WriteLine(";"); } if (mesh.Flags != 0) { w.WriteLine(";"); w.WriteLine("; Extended format: MeshFlags follow IBUF" + (mesh.GeometryStates.Count > 0 ? " and GeoStates" : "")); w.WriteLine("; (They are ignored on import.)"); w.WriteLine(";"); } VRTF vrtf = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexFormatIndex) as VRTF; bool isDefault = vrtf == null; if (isDefault) { vrtf = VRTF.CreateDefaultForMesh(mesh); w.WriteLine(";;-marker: vrtf is default for mesh"); } w.Export_VRTF(mpb, vrtf); w.Export_SKIN(mpb, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.SkinControllerIndex) as SKIN, mesh); Export_VBUF_Main(w, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexBufferIndex) as VBUF, vrtf, uvScales, mesh); Export_IBUF_Main(w, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.IndexBufferIndex) as IBUF, mesh); //For backward compatibility, these come after the IBUFs Export_MeshGeoStates(w, vrtf, uvScales, mlod, mesh, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexBufferIndex) as VBUF, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.IndexBufferIndex) as IBUF); if (mesh.Flags != 0) { w.WriteLine(";"); w.WriteLine("; Extended format: MeshFlags"); w.WriteLine(";"); w.WriteLine("flags " + mesh.Flags); w.Flush(); } }
public void Export_MLOD(StreamWriter w, GenericRCOLResource rcolResource, MLOD mlod, MLOD.Mesh mesh) { float[] uvScales = rcolResource.GetUVScales(mesh); VRTF vrtf = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexFormatIndex) as VRTF; bool isDefault = vrtf == null; if (isDefault) { vrtf = VRTF.CreateDefaultForMesh(mesh); w.WriteLine(";;-marker: vrtf is default for mesh"); } w.Export_VRTF(mpb, vrtf); w.Export_SKIN(mpb, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.SkinControllerIndex) as SKIN, mesh); Export_VBUF_Main(w, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexBufferIndex) as VBUF, vrtf, uvScales, mesh); Export_IBUF_Main(w, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.IndexBufferIndex) as IBUF, mesh); }
public void Export_MLOD(StreamWriter w, GenericRCOLResource rcolResource, MLOD mlod, MLOD.Mesh mesh) { float[] uvScales = rcolResource.GetUVScales(mesh); VRTF vrtf = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexFormatIndex) as VRTF; bool isDefault = vrtf == null; if (isDefault) { vrtf = VRTF.CreateDefaultForMesh(mesh); w.WriteLine(";;-marker: vrtf is default for mesh"); } w.Export_VRTF(mpb, vrtf); w.Export_SKIN(mpb, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.SkinControllerIndex) as SKIN, mesh); Export_VBUF_Main(w, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.VertexBufferIndex) as VBUF, vrtf, uvScales, mesh); Export_IBUF_Main(w, GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mesh.IndexBufferIndex) as IBUF, mesh); }
public List <offScale> VertsToVBUFs(GenericRCOLResource rcolResource, MLOD mlod, IResourceKey defaultRK, List <meshExpImp.ModelBlocks.Vertex[]> lmverts, List <List <meshExpImp.ModelBlocks.Vertex[]> > llverts, bool updateBBs, bool updateUVs) { // List of UV elements going off scale List <offScale> offScales = new List <offScale>(); // Find everything for each mesh group Dictionary <GenericRCOLResource.ChunkReference, List <int> > meshGroups = new Dictionary <GenericRCOLResource.ChunkReference, List <int> >(); Dictionary <int, VRTF> meshVRTF = new Dictionary <int, VRTF>(); Dictionary <int, float[]> meshUVScales = new Dictionary <int, float[]>(); for (int m = 0; m < mlod.Meshes.Count; m++) { if (meshGroups.ContainsKey(mlod.Meshes[m].MaterialIndex)) { meshGroups[mlod.Meshes[m].MaterialIndex].Add(m); } else { meshGroups.Add(mlod.Meshes[m].MaterialIndex, new List <int> { m }); } VRTF vrtf = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mlod.Meshes[m].VertexFormatIndex) as VRTF ?? VRTF.CreateDefaultForMesh(mlod.Meshes[m]); meshVRTF.Add(m, vrtf); if (updateUVs) { rcolResource.FixUVScales(mlod.Meshes[m]); } meshUVScales.Add(m, rcolResource.GetUVScales(mlod.Meshes[m])); } // Update the VBUFs for each mesh group and set the mesh bounds whilst we're here foreach (var key in meshGroups.Keys) { foreach (int m in meshGroups[key]) { VBUF vbuf = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mlod.Meshes[m].VertexBufferIndex) as VBUF; if (vbuf == null) { vbuf = new VBUF(rcolResource.RequestedApiVersion, null) { Version = 0x00000101, Flags = VBUF.FormatFlags.None, SwizzleInfo = new GenericRCOLResource.ChunkReference(0, null, 0), } } ; offScales.AddRange(getOffScales(m, -1, lmverts[m], meshUVScales[m])); vbuf.SetVertices(mlod, m, meshVRTF[m], lmverts[m], meshUVScales[m]); if (llverts[m] != null) { for (int g = 0; g < llverts[m].Count; g++) { if (llverts[m][g] != null) { offScales.AddRange(getOffScales(m, g, llverts[m][g], meshUVScales[m])); vbuf.SetVertices(mlod, mlod.Meshes[m], g, meshVRTF[m], llverts[m][g], meshUVScales[m]); } } } IResourceKey vbufRK = GenericRCOLResource.ChunkReference.GetKey(rcolResource, mlod.Meshes[m].VertexBufferIndex); if (vbufRK == null)//means we created the VBUF: create a RK and add it { vbufRK = new TGIBlock(0, null, defaultRK) { ResourceType = vbuf.ResourceType, } } ; rcolResource.ReplaceChunk(mlod.Meshes[m], "VertexBufferIndex", vbufRK, vbuf); if (updateBBs) { mlod.Meshes[m].Bounds = vbuf.GetBoundingBox(mlod.Meshes[m], meshVRTF[m]); } } } return(offScales); }
public List<offScale> VertsToVBUFs(GenericRCOLResource rcolResource, MLOD mlod, IResourceKey defaultRK, List<meshExpImp.ModelBlocks.Vertex[]> lmverts, bool updateBBs, bool updateUVs) { // List of UV elements going off scale List<offScale> offScales = new List<offScale>(); // Find everything for each mesh group Dictionary<GenericRCOLResource.ChunkReference, List<int>> meshGroups = new Dictionary<GenericRCOLResource.ChunkReference, List<int>>(); Dictionary<int, VRTF> meshVRTF = new Dictionary<int, VRTF>(); Dictionary<int, float[]> meshUVScales = new Dictionary<int, float[]>(); for (int m = 0; m < mlod.Meshes.Count; m++) { if (meshGroups.ContainsKey(mlod.Meshes[m].MaterialIndex)) meshGroups[mlod.Meshes[m].MaterialIndex].Add(m); else meshGroups.Add(mlod.Meshes[m].MaterialIndex, new List<int> { m }); VRTF vrtf = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mlod.Meshes[m].VertexFormatIndex) as VRTF ?? VRTF.CreateDefaultForMesh(mlod.Meshes[m]); meshVRTF.Add(m, vrtf); if (updateUVs) rcolResource.FixUVScales(mlod.Meshes[m]); meshUVScales.Add(m, rcolResource.GetUVScales(mlod.Meshes[m])); } // Update the VBUFs for each mesh group and set the mesh bounds whilst we're here foreach (var key in meshGroups.Keys) { foreach (int m in meshGroups[key]) { VBUF vbuf = GenericRCOLResource.ChunkReference.GetBlock(rcolResource, mlod.Meshes[m].VertexBufferIndex) as VBUF; if (vbuf == null) vbuf = new VBUF(rcolResource.RequestedApiVersion, null) { Version = 0x00000101, Flags = VBUF.FormatFlags.None, SwizzleInfo = new GenericRCOLResource.ChunkReference(0, null, 0), }; offScales.AddRange(getOffScales(m, -1, lmverts[m], meshUVScales[m])); vbuf.SetVertices(mlod, m, meshVRTF[m], lmverts[m], meshUVScales[m]); IResourceKey vbufRK = GenericRCOLResource.ChunkReference.GetKey(rcolResource, mlod.Meshes[m].VertexBufferIndex); if (vbufRK == null)//means we created the VBUF: create a RK and add it vbufRK = new TGIBlock(0, null, defaultRK) { ResourceType = vbuf.ResourceType, }; rcolResource.ReplaceChunk(mlod.Meshes[m], "VertexBufferIndex", vbufRK, vbuf); if (updateBBs) mlod.Meshes[m].Bounds = vbuf.GetBoundingBox(mlod.Meshes[m], meshVRTF[m]); } } return offScales; }