private ScenarioLightmapBspData ConvertScenarioLightmapBspData(ScenarioLightmapBspData Lbsp) { var lightmapResourceDefinition = BlamCache.ResourceCache.GetRenderGeometryApiResourceDefinition(Lbsp.Geometry.Resource); if (lightmapResourceDefinition == null) { return(Lbsp); } var converter = new RenderGeometryConverter(CacheContext, BlamCache); var newLightmapResourceDefinition = converter.Convert(Lbsp.Geometry, lightmapResourceDefinition); // // convert vertex buffers and add them to the new resource // foreach (var staticPerVertexLighting in Lbsp.StaticPerVertexLightingBuffers) { if (staticPerVertexLighting.VertexBufferIndex != -1) { staticPerVertexLighting.VertexBuffer = lightmapResourceDefinition.VertexBuffers[staticPerVertexLighting.VertexBufferIndex].Definition; VertexBufferConverter.ConvertVertexBuffer(BlamCache.Version, CacheContext.Version, staticPerVertexLighting.VertexBuffer); var d3dPointer = new D3DStructure <VertexBufferDefinition>(); d3dPointer.Definition = staticPerVertexLighting.VertexBuffer; newLightmapResourceDefinition.VertexBuffers.Add(d3dPointer); // set the new buffer index staticPerVertexLighting.VertexBufferIndex = (short)(newLightmapResourceDefinition.VertexBuffers.Elements.Count - 1); } } Lbsp.Geometry.Resource = CacheContext.ResourceCache.CreateRenderGeometryApiResource(newLightmapResourceDefinition); return(Lbsp); }
private static RenderGeometryApiResourceDefinition GetSingleMeshResourceDefinition(RenderGeometry renderGeometry, int meshindex) { RenderGeometryApiResourceDefinition result = new RenderGeometryApiResourceDefinition { IndexBuffers = new TagBlock <D3DStructure <IndexBufferDefinition> >(), VertexBuffers = new TagBlock <D3DStructure <VertexBufferDefinition> >() }; // valid for gen3, InteropLocations should also point to the definition. result.IndexBuffers.AddressType = CacheAddressType.Definition; result.VertexBuffers.AddressType = CacheAddressType.Definition; var mesh = renderGeometry.Meshes[meshindex]; for (int i = 0; i < mesh.ResourceVertexBuffers.Length; i++) { var vertexBuffer = mesh.ResourceVertexBuffers[i]; if (vertexBuffer != null) { var d3dPointer = new D3DStructure <VertexBufferDefinition>(); d3dPointer.Definition = vertexBuffer; result.VertexBuffers.Add(d3dPointer); mesh.VertexBufferIndices[i] = (short)(result.VertexBuffers.Elements.Count - 1); } else { mesh.VertexBufferIndices[i] = -1; } } for (int i = 0; i < mesh.ResourceIndexBuffers.Length; i++) { var indexBuffer = mesh.ResourceIndexBuffers[i]; if (indexBuffer != null) { var d3dPointer = new D3DStructure <IndexBufferDefinition>(); d3dPointer.Definition = indexBuffer; result.IndexBuffers.Add(d3dPointer); mesh.IndexBufferIndices[i] = (short)(result.IndexBuffers.Elements.Count - 1); } else { mesh.IndexBufferIndices[i] = -1; } } // if the mesh is unindexed the index in the index buffer should be 0, but the buffer is empty. Copying what h3\ho does. if (mesh.Flags.HasFlag(MeshFlags.MeshIsUnindexed)) { mesh.IndexBufferIndices[0] = 0; mesh.IndexBufferIndices[1] = 0; } return(result); }