private static FixedFunction.ShadingConfiguration CreateShadingConfiguration(W3dShader w3dShader) { return(new FixedFunction.ShadingConfiguration { DiffuseLightingType = w3dShader.PrimaryGradient.ToDiffuseLightingType(), SpecularEnabled = (w3dShader.SecondaryGradient == W3dShaderSecondaryGradient.Enable) ? 1u : 0u, TexturingEnabled = (w3dShader.Texturing == W3dShaderTexturing.Enable) ? 1u : 0u, SecondaryTextureColorBlend = w3dShader.DetailColorFunc.ToSecondaryTextureBlend(), SecondaryTextureAlphaBlend = w3dShader.DetailAlphaFunc.ToSecondaryTextureBlend(), AlphaTest = (w3dShader.AlphaTest == W3dShaderAlphaTest.Enable) ? 1u : 0u }); }
// One ModelMeshPart for each unique shader in a W3D_CHUNK_MATERIAL_PASS. private static ModelMeshPart CreateModelMeshPart( uint startIndex, uint indexCount, W3dMesh w3dMesh, W3dShader w3dShader) { var rasterizerState = RasterizerStateDescription.CullBackSolid; rasterizerState.CullMode = w3dMesh.Header.Attributes.HasFlag(W3dMeshFlags.TwoSided) ? CullMode.None : CullMode.CullBack; var depthState = DepthStencilStateDescription.Default; depthState.IsDepthEnabled = true; depthState.IsDepthWriteEnabled = w3dShader.DepthMask == W3dShaderDepthMask.WriteEnable; // TODO: DepthCompare var blendState = BlendStateDescription.Opaque; blendState.Enabled = w3dShader.SrcBlend != W3dShaderSrcBlendFunc.One || w3dShader.DestBlend != W3dShaderDestBlendFunc.Zero; blendState.SourceBlend = w3dShader.SrcBlend.ToBlend(); blendState.DestinationBlend = w3dShader.DestBlend.ToBlend(); var pipelineStateHandle = new EffectPipelineState( rasterizerState, depthState, blendState) .GetHandle(); return(new ModelMeshPart( startIndex, indexCount, w3dShader.AlphaTest == W3dShaderAlphaTest.Enable, w3dShader.Texturing == W3dShaderTexturing.Enable, pipelineStateHandle)); }