internal ModelMesh(W3dMesh w3dMesh, AssetLoadContext loadContext) { SetNameAndInstanceId("W3DMesh", w3dMesh.Header.MeshName); W3dShaderMaterial w3dShaderMaterial; ShaderResourcesBase shaderResources; if (w3dMesh.MaterialPasses.Count == 1 && w3dMesh.MaterialPasses[0].ShaderMaterialIds != null) { if (w3dMesh.MaterialPasses[0].ShaderMaterialIds.Items.Length > 1) { throw new NotSupportedException(); } var shaderMaterialID = w3dMesh.MaterialPasses[0].ShaderMaterialIds.Items[0]; w3dShaderMaterial = w3dMesh.ShaderMaterials.Items[(int)shaderMaterialID]; var effectName = w3dShaderMaterial.Header.TypeName.Replace(".fx", string.Empty); shaderResources = loadContext.ShaderResources.GetShaderMaterialResources(effectName); _depthPipeline = loadContext.ShaderResources.MeshDepth.TriangleListPipeline; } else { w3dShaderMaterial = null; shaderResources = loadContext.ShaderResources.FixedFunction; _depthPipeline = loadContext.ShaderResources.MeshDepth.TriangleStripPipeline; } MeshParts = new List <ModelMeshPart>(); if (w3dShaderMaterial != null) { MeshParts.Add(CreateModelMeshPartShaderMaterial( loadContext, w3dMesh, w3dMesh.MaterialPasses[0], w3dShaderMaterial, (ShaderMaterialShaderResources)shaderResources)); } else { var vertexMaterials = CreateMaterials(w3dMesh); var shadingConfigurations = new FixedFunctionShaderResources.ShadingConfiguration[w3dMesh.Shaders.Items.Count]; for (var i = 0; i < shadingConfigurations.Length; i++) { shadingConfigurations[i] = CreateShadingConfiguration(w3dMesh.Shaders.Items[i]); } for (var i = 0; i < w3dMesh.MaterialPasses.Count; i++) { CreateModelMeshPartsFixedFunction( loadContext, w3dMesh, w3dMesh.MaterialPasses[i], vertexMaterials, shadingConfigurations, MeshParts); } } BoundingBox = new BoundingBox( w3dMesh.Header.Min, w3dMesh.Header.Max); _shaderSet = shaderResources.ShaderSet; Skinned = w3dMesh.IsSkinned; Hidden = w3dMesh.Header.Attributes.HasFlag(W3dMeshFlags.Hidden); CameraOriented = (w3dMesh.Header.Attributes & W3dMeshFlags.GeometryTypeMask) == W3dMeshFlags.GeometryTypeCameraOriented; _vertexBuffer = AddDisposable(loadContext.GraphicsDevice.CreateStaticBuffer( MemoryMarshal.AsBytes(new ReadOnlySpan <MeshShaderResources.MeshVertex.Basic>(CreateVertices(w3dMesh, w3dMesh.IsSkinned))), BufferUsage.VertexBuffer)); _indexBuffer = AddDisposable(loadContext.GraphicsDevice.CreateStaticBuffer( CreateIndices(w3dMesh), BufferUsage.IndexBuffer)); var hasHouseColor = w3dMesh.Header.MeshName.StartsWith("HOUSECOLOR"); _meshConstantsResourceSet = loadContext.ShaderResources.Mesh.GetCachedMeshResourceSet( Skinned, hasHouseColor); PostInitialize(loadContext); }
private ModelMesh CreateModelMesh( ContentManager contentManager, W3dMesh w3dMesh) { W3dShaderMaterial w3dShaderMaterial; ShaderResourcesBase shaderResources; Pipeline depthPipeline; if (w3dMesh.MaterialPasses.Count == 1 && w3dMesh.MaterialPasses[0].ShaderMaterialIds != null) { if (w3dMesh.MaterialPasses[0].ShaderMaterialIds.Items.Length > 1) { throw new NotSupportedException(); } var shaderMaterialID = w3dMesh.MaterialPasses[0].ShaderMaterialIds.Items[0]; w3dShaderMaterial = w3dMesh.ShaderMaterials.Items[(int)shaderMaterialID]; var effectName = w3dShaderMaterial.Header.TypeName.Replace(".fx", string.Empty); shaderResources = contentManager.ShaderResources.GetShaderMaterialResources(effectName); depthPipeline = contentManager.ShaderResources.MeshDepth.TriangleListPipeline; } else { w3dShaderMaterial = null; shaderResources = contentManager.ShaderResources.FixedFunction; depthPipeline = contentManager.ShaderResources.MeshDepth.TriangleStripPipeline; } var vertexMaterials = CreateMaterials(w3dMesh); var shadingConfigurations = new FixedFunctionShaderResources.ShadingConfiguration[w3dMesh.Shaders.Items.Count]; for (var i = 0; i < shadingConfigurations.Length; i++) { shadingConfigurations[i] = CreateShadingConfiguration(w3dMesh.Shaders.Items[i]); } var meshParts = new List <ModelMeshPart>(); if (w3dShaderMaterial != null) { meshParts.Add(CreateModelMeshPartShaderMaterial( contentManager, w3dMesh, w3dMesh.MaterialPasses[0], w3dShaderMaterial, (ShaderMaterialShaderResources)shaderResources)); } else { for (var i = 0; i < w3dMesh.MaterialPasses.Count; i++) { CreateModelMeshPartsFixedFunction( contentManager, w3dMesh, w3dMesh.MaterialPasses[i], vertexMaterials, shadingConfigurations, meshParts); } } var boundingBox = new BoundingBox( w3dMesh.Header.Min, w3dMesh.Header.Max); var cameraOriented = (w3dMesh.Header.Attributes & W3dMeshFlags.GeometryTypeMask) == W3dMeshFlags.GeometryTypeCameraOriented; var hasHouseColor = w3dMesh.Header.MeshName.StartsWith("HOUSECOLOR"); return(new ModelMesh( contentManager.GraphicsDevice, contentManager.ShaderResources, w3dMesh.Header.MeshName, shaderResources.ShaderSet, depthPipeline, MemoryMarshal.AsBytes(new ReadOnlySpan <MeshShaderResources.MeshVertex.Basic>(CreateVertices(w3dMesh, w3dMesh.IsSkinned))), CreateIndices(w3dMesh, w3dShaderMaterial != null), meshParts, w3dMesh.IsSkinned, boundingBox, w3dMesh.Header.Attributes.HasFlag(W3dMeshFlags.Hidden), cameraOriented, hasHouseColor)); }