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