private ModelMesh CreateModelMesh( ContentManager contentManager, W3dMesh w3dMesh, ModelBone parentBone, int numBones) { W3dShaderMaterial w3dShaderMaterial; Effect effect = null; if (w3dMesh.MaterialPasses.Length == 1 && w3dMesh.MaterialPasses[0].ShaderMaterialId != null) { var shaderMaterialID = w3dMesh.MaterialPasses[0].ShaderMaterialId.Value; w3dShaderMaterial = w3dMesh.ShaderMaterials.Materials[(int)shaderMaterialID]; var effectName = w3dShaderMaterial.Header.TypeName.Replace(".fx", string.Empty); effect = contentManager.EffectLibrary.GetEffect( effectName, MeshVertex.VertexDescriptors); } else { w3dShaderMaterial = null; effect = contentManager.EffectLibrary.FixedFunction; } var vertexMaterials = CreateMaterials(w3dMesh); var shadingConfigurations = new FixedFunction.ShadingConfiguration[w3dMesh.Shaders.Length]; for (var i = 0; i < shadingConfigurations.Length; i++) { shadingConfigurations[i] = CreateShadingConfiguration(w3dMesh.Shaders[i]); } var materialPasses = new ModelMeshMaterialPass[w3dMesh.MaterialPasses.Length]; if (w3dShaderMaterial != null) { materialPasses[0] = CreateModelMeshMaterialPassShaderMaterial( contentManager, w3dMesh, w3dMesh.MaterialPasses[0], w3dShaderMaterial, effect); } else { for (var i = 0; i < materialPasses.Length; i++) { materialPasses[i] = CreateModelMeshMaterialPassFixedFunction( contentManager, w3dMesh, w3dMesh.MaterialPasses[i], vertexMaterials, shadingConfigurations); } } var boundingBox = new BoundingBox( w3dMesh.Header.Min, w3dMesh.Header.Max); var isSkinned = (w3dMesh.Header.Attributes & W3dMeshFlags.GeometryTypeMask) == W3dMeshFlags.GeometryTypeSkin; var cameraOriented = (w3dMesh.Header.Attributes & W3dMeshFlags.GeometryTypeMask) == W3dMeshFlags.GeometryTypeCameraOriented; return(new ModelMesh( contentManager.GraphicsDevice, w3dMesh.Header.MeshName, CreateVertices(w3dMesh, isSkinned), CreateIndices(w3dMesh), effect, materialPasses, isSkinned, parentBone, (uint)numBones, boundingBox, w3dMesh.Header.Attributes.HasFlag(W3dMeshFlags.Hidden), cameraOriented)); }
private ModelMesh CreateModelMesh( ContentManager contentManager, W3dMesh w3dMesh) { W3dShaderMaterial w3dShaderMaterial; Effect effect = null; 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); effect = contentManager.EffectLibrary.GetEffect( effectName, MeshVertex.VertexDescriptors); } else { w3dShaderMaterial = null; effect = contentManager.EffectLibrary.FixedFunction; } var vertexMaterials = CreateMaterials(w3dMesh); var shadingConfigurations = new FixedFunction.ShadingConfiguration[w3dMesh.Shaders.Items.Count]; for (var i = 0; i < shadingConfigurations.Length; i++) { shadingConfigurations[i] = CreateShadingConfiguration(w3dMesh.Shaders.Items[i]); } var materialPasses = new ModelMeshMaterialPass[w3dMesh.MaterialPasses.Count]; if (w3dShaderMaterial != null) { materialPasses[0] = CreateModelMeshMaterialPassShaderMaterial( contentManager, w3dMesh, w3dMesh.MaterialPasses[0], w3dShaderMaterial, effect); } else { for (var i = 0; i < materialPasses.Length; i++) { materialPasses[i] = CreateModelMeshMaterialPassFixedFunction( contentManager, w3dMesh, w3dMesh.MaterialPasses[i], vertexMaterials, shadingConfigurations); } } 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, w3dMesh.Header.MeshName, MemoryMarshal.AsBytes(new ReadOnlySpan <MeshVertex.Basic>(CreateVertices(w3dMesh, w3dMesh.IsSkinned))), CreateIndices(w3dMesh, w3dShaderMaterial != null), materialPasses, w3dMesh.IsSkinned, boundingBox, w3dMesh.Header.Attributes.HasFlag(W3dMeshFlags.Hidden), cameraOriented, hasHouseColor)); }