public MultiMeshContainer(Engine.Serialize.MeshesContainer MC) { if (MC != null) { //Transform = Matrix.Scaling(1); Hardpoints = MC.HardPoints; if (MC.Materials != null && MC.Geometry != null && MC.Geometry.Meshes != null) { BSP = MC.Geometry.BSP; LocalAABBMax = MC.Geometry.AABBMax; LocalAABBMin = MC.Geometry.AABBMin; Meshes = new Serialize.MeshLink[MC.Materials.Length]; Materials = new MaterialContainer[MC.Materials.Length]; for (int i = 0; i < MC.Materials.Length; i++) { Meshes[i] = MC.Geometry.Meshes[i]; Materials[i] = new MaterialContainer(MC.Materials[i]); } VertexsCount = MC.Geometry.VertexCount; BytesPerVertex = MC.Geometry.VertexData.Length / VertexsCount; FaceCount = MC.Geometry.IndexData.Length / 12; using (var vertices = new DataStream(BytesPerVertex * VertexsCount, true, true)) { vertices.WriteRange<byte>(MC.Geometry.VertexData, 0, MC.Geometry.VertexData.Length); vertices.Position = 0; Vertexs = new Buffer(ModelViewer.Program.device, vertices, BytesPerVertex * VertexsCount, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0); binding = new VertexBufferBinding(Vertexs, BytesPerVertex, 0); } using (var indices = new DataStream(4 * FaceCount * 3, true, true)) { indices.WriteRange<byte>(MC.Geometry.IndexData, 0, MC.Geometry.IndexData.Length); indices.Position = 0; Indices = new Buffer(ModelViewer.Program.device, indices, 4 * FaceCount * 3, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0); } BufferDescription bd = new BufferDescription(); bd.SizeInBytes = Marshal.SizeOf(typeof(ShaderConstants)); bd.Usage = ResourceUsage.Dynamic; bd.BindFlags = BindFlags.ConstantBuffer; bd.CpuAccessFlags = CpuAccessFlags.Write; bd.OptionFlags = ResourceOptionFlags.None; bd.StructureByteStride = 0; constantsBuffer = new Buffer(ModelViewer.Program.device, bd); constants = new ShaderConstants(); } } }
private void CahseSetTexture(MaterialContainer MC) { if (DifuseName != MC.Diffuse.Name) { Program.context.PixelShader.SetShaderResource(0, MC.Diffuse.TextureResource); Program.context.PixelShader.SetSampler(0, MC.DiffuseSamplerState); DifuseName = MC.Diffuse.Name; } if (SpecularMapName != MC.SpecularMap.Name) { Program.context.PixelShader.SetShaderResource(1, MC.SpecularMap.TextureResource); Program.context.PixelShader.SetSampler(1, MC.SpecularMapSamplerState); SpecularMapName = MC.SpecularMap.Name; } if (NormalMapName != MC.NormalMap.Name) { Program.context.PixelShader.SetShaderResource(2, MC.NormalMap.TextureResource); Program.context.PixelShader.SetSampler(2, MC.NormalMapSamplerState); NormalMapName = MC.NormalMap.Name; } if (SelfMapName != MC.SelfMap.Name) { Program.context.PixelShader.SetShaderResource(3, MC.SelfMap.TextureResource); Program.context.PixelShader.SetSampler(3, MC.SelfMapSamplerState); SelfMapName = MC.SelfMap.Name; } if (UV2DifuseName != MC.UV2Diffuse.Name) { Program.context.PixelShader.SetShaderResource(4, MC.UV2Diffuse.TextureResource); Program.context.PixelShader.SetSampler(4, MC.UV2DiffuseSamplerState); UV2DifuseName = MC.UV2Diffuse.Name; } }