Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
        }