private ModelMeshPart CreateModelMeshPartShaderMaterial( AssetLoadContext context, W3dMesh w3dMesh, W3dMaterialPass w3dMaterialPass, W3dShaderMaterial w3dShaderMaterial, ShaderMaterialShaderResources shaderResources) { var texCoords = new MeshShaderResources.MeshVertex.TexCoords[w3dMesh.Header.NumVertices]; if (w3dMaterialPass.TexCoords != null) { for (var i = 0; i < texCoords.Length; i++) { texCoords[i].UV0 = w3dMaterialPass.TexCoords.Items[i]; } } var blendEnabled = false; var texCoordsVertexBuffer = AddDisposable(context.GraphicsDevice.CreateStaticBuffer( texCoords, BufferUsage.VertexBuffer)); var material = shaderResources.GetCachedMaterial(w3dShaderMaterial, context); var materialPass = new MaterialPass(material, context.ShaderResources.MeshDepth.Material); return(new ModelMeshPart( this, texCoordsVertexBuffer, 0, (uint)w3dMesh.Triangles.Items.Length * 3, blendEnabled, materialPass, materialPass)); // TODO }
private ModelMeshPart CreateModelMeshPartShaderMaterial( AssetLoadContext context, W3dMesh w3dMesh, W3dMaterialPass w3dMaterialPass, W3dShaderMaterial w3dShaderMaterial, ShaderMaterialShaderResources shaderResources) { var texCoords = new MeshShaderResources.MeshVertex.TexCoords[w3dMesh.Header.NumVertices]; if (w3dMaterialPass.TexCoords != null) { for (var i = 0; i < texCoords.Length; i++) { texCoords[i].UV0 = w3dMaterialPass.TexCoords.Items[i]; } } // TODO: Extract state properties from shader material. var blendEnabled = false; var pipeline = shaderResources.Pipeline; var materialResourceSetBuilder = AddDisposable(new ShaderMaterialResourceSetBuilder( context.GraphicsDevice, shaderResources)); foreach (var w3dShaderProperty in w3dShaderMaterial.Properties) { switch (w3dShaderProperty.PropertyType) { case W3dShaderMaterialPropertyType.Texture: var texture = context.AssetStore.Textures.GetByName(w3dShaderProperty.StringValue); materialResourceSetBuilder.SetTexture(w3dShaderProperty.PropertyName, texture); break; case W3dShaderMaterialPropertyType.Bool: materialResourceSetBuilder.SetConstant(w3dShaderProperty.PropertyName, w3dShaderProperty.Value.Bool); break; case W3dShaderMaterialPropertyType.Float: materialResourceSetBuilder.SetConstant(w3dShaderProperty.PropertyName, w3dShaderProperty.Value.Float); break; case W3dShaderMaterialPropertyType.Vector2: materialResourceSetBuilder.SetConstant(w3dShaderProperty.PropertyName, w3dShaderProperty.Value.Vector2); break; case W3dShaderMaterialPropertyType.Vector3: materialResourceSetBuilder.SetConstant(w3dShaderProperty.PropertyName, w3dShaderProperty.Value.Vector3); break; case W3dShaderMaterialPropertyType.Vector4: materialResourceSetBuilder.SetConstant(w3dShaderProperty.PropertyName, w3dShaderProperty.Value.Vector4); break; case W3dShaderMaterialPropertyType.Int: materialResourceSetBuilder.SetConstant(w3dShaderProperty.PropertyName, w3dShaderProperty.Value.Int); break; default: throw new NotSupportedException(); } } var materialResourceSet = materialResourceSetBuilder.CreateResourceSet(); var texCoordsVertexBuffer = AddDisposable(context.GraphicsDevice.CreateStaticBuffer( texCoords, BufferUsage.VertexBuffer)); return(new ModelMeshPart( texCoordsVertexBuffer, 0, (uint)w3dMesh.Triangles.Items.Length * 3, blendEnabled, pipeline, pipeline, // TODO materialResourceSet)); }