Пример #1
0
        internal ModelMesh(
            GraphicsDevice graphicsDevice,
            string name,
            ReadOnlySpan <byte> vertexData,
            ushort[] indices,
            ModelMeshMaterialPass[] materialPasses,
            bool isSkinned,
            BoundingBox boundingBox,
            bool hidden,
            bool cameraOriented,
            bool hasHouseColor)
        {
            Name = name;

            BoundingBox = boundingBox;

            Skinned = isSkinned;

            Hidden         = hidden;
            CameraOriented = cameraOriented;

            _vertexBuffer = AddDisposable(graphicsDevice.CreateStaticBuffer(vertexData, BufferUsage.VertexBuffer));

            _indexBuffer = AddDisposable(graphicsDevice.CreateStaticBuffer(
                                             indices,
                                             BufferUsage.IndexBuffer));

            var commandEncoder = graphicsDevice.ResourceFactory.CreateCommandList();

            commandEncoder.Begin();

            _meshConstantsBuffer = AddDisposable(new ConstantBuffer <MeshMaterial.MeshConstants>(graphicsDevice));
            _meshConstantsBuffer.Value.SkinningEnabled = isSkinned;
            _meshConstantsBuffer.Value.HasHouseColor   = hasHouseColor;
            _meshConstantsBuffer.Update(commandEncoder);

            commandEncoder.End();

            graphicsDevice.SubmitCommands(commandEncoder);

            graphicsDevice.DisposeWhenIdle(commandEncoder);

            foreach (var materialPass in materialPasses)
            {
                AddDisposable(materialPass);

                foreach (var meshPart in materialPass.MeshParts)
                {
                    AddDisposable(meshPart.Material);
                    meshPart.Material.SetMeshConstants(_meshConstantsBuffer.Buffer);

                    AddDisposable(meshPart.DepthMaterial);
                    meshPart.DepthMaterial.SetMeshConstants(_meshConstantsBuffer.Buffer);
                }
            }
            MaterialPasses = materialPasses;
        }
Пример #2
0
        public ModelMesh(
            GraphicsDevice graphicsDevice,
            string name,
            MeshVertex.Basic[] vertices,
            ushort[] indices,
            Effect effect,
            ModelMeshMaterialPass[] materialPasses,
            bool isSkinned,
            ModelBone parentBone,
            uint numBones,
            BoundingBox boundingBox,
            bool hidden,
            bool cameraOriented)
        {
            Name = name;

            ParentBone = parentBone;
            NumBones   = numBones;

            BoundingBox = boundingBox;

            Skinned = isSkinned;

            Hidden         = hidden;
            CameraOriented = cameraOriented;

            _effect = effect;

            _vertexBuffer = AddDisposable(Buffer <MeshVertex.Basic> .CreateStatic(
                                              graphicsDevice,
                                              vertices,
                                              BufferBindFlags.VertexBuffer));

            _indexBuffer = AddDisposable(Buffer <ushort> .CreateStatic(
                                             graphicsDevice,
                                             indices,
                                             BufferBindFlags.IndexBuffer));

            _meshConstantsBuffer = AddDisposable(new ConstantBuffer <MeshMaterial.MeshConstants>(graphicsDevice));
            _meshConstantsBuffer.Value.SkinningEnabled = isSkinned;
            _meshConstantsBuffer.Value.NumBones        = numBones;
            _meshConstantsBuffer.Update();

            foreach (var materialPass in materialPasses)
            {
                AddDisposable(materialPass);

                foreach (var meshPart in materialPass.MeshParts)
                {
                    meshPart.Material.SetMeshConstants(_meshConstantsBuffer.Buffer);
                }
            }
            MaterialPasses = materialPasses;
        }
Пример #3
0
        internal ModelMesh(
            GraphicsDevice graphicsDevice,
            string name,
            MeshVertex.Basic[] vertices,
            ushort[] indices,
            Effect effect,
            ModelMeshMaterialPass[] materialPasses,
            bool isSkinned,
            ModelBone parentBone,
            uint numBones,
            BoundingBox boundingBox,
            bool hidden,
            bool cameraOriented)
        {
            Name = name;

            ParentBone = parentBone;
            NumBones   = numBones;

            BoundingBox = boundingBox;

            Skinned = isSkinned;

            Hidden         = hidden;
            CameraOriented = cameraOriented;

            _effect = effect;

            _vertexBuffer = AddDisposable(graphicsDevice.CreateStaticBuffer(
                                              vertices,
                                              BufferUsage.VertexBuffer));

            _indexBuffer = AddDisposable(graphicsDevice.CreateStaticBuffer(
                                             indices,
                                             BufferUsage.IndexBuffer));

            var commandEncoder = graphicsDevice.ResourceFactory.CreateCommandList();

            commandEncoder.Begin();

            _meshConstantsBuffer = AddDisposable(new ConstantBuffer <MeshMaterial.MeshConstants>(graphicsDevice));
            _meshConstantsBuffer.Value.SkinningEnabled = isSkinned;
            _meshConstantsBuffer.Value.NumBones        = numBones;
            _meshConstantsBuffer.Update(commandEncoder);

            commandEncoder.End();

            graphicsDevice.SubmitCommands(commandEncoder);

            graphicsDevice.DisposeWhenIdle(commandEncoder);

            foreach (var materialPass in materialPasses)
            {
                AddDisposable(materialPass);

                foreach (var meshPart in materialPass.MeshParts)
                {
                    AddDisposable(meshPart.Material);
                    meshPart.Material.SetMeshConstants(_meshConstantsBuffer.Buffer);
                }
            }
            MaterialPasses = materialPasses;
        }
Пример #4
0
        internal ModelInstance(Model model, AssetLoadContext loadContext)
        {
            Model = model;

            _graphicsDevice = loadContext.GraphicsDevice;

            ModelBoneInstances = new ModelBoneInstance[model.BoneHierarchy.Bones.Length];
            for (var i = 0; i < model.BoneHierarchy.Bones.Length; i++)
            {
                ModelBoneInstances[i] = new ModelBoneInstance(model.BoneHierarchy.Bones[i]);
            }

            RelativeBoneTransforms = new Matrix4x4[model.BoneHierarchy.Bones.Length];
            AbsoluteBoneTransforms = new Matrix4x4[model.BoneHierarchy.Bones.Length];

            BoneVisibilities      = new bool[model.BoneHierarchy.Bones.Length];
            BoneFrameVisibilities = new bool[model.BoneHierarchy.Bones.Length];

            for (var i = 0; i < model.BoneHierarchy.Bones.Length; i++)
            {
                BoneVisibilities[i]      = true;
                BoneFrameVisibilities[i] = true;
            }

            if (model.HasSkinnedMeshes)
            {
                _skinningBuffer = SkinningBuffer = AddDisposable(_graphicsDevice.ResourceFactory.CreateBuffer(
                                                                     new BufferDescription(
                                                                         (uint)(64 * model.BoneHierarchy.Bones.Length),
                                                                         BufferUsage.StructuredBufferReadOnly | BufferUsage.Dynamic,
                                                                         64,
                                                                         true)));

                _skinningBones = new Matrix4x4[model.BoneHierarchy.Bones.Length];
            }
            else
            {
                SkinningBuffer = loadContext.StandardGraphicsResources.GetNullStructuredBuffer(64);
            }

            AnimationInstances = new List <AnimationInstance>();

            RenderItemConstantsBufferPS = AddDisposable(new ConstantBuffer <MeshShaderResources.RenderItemConstantsPS>(_graphicsDevice, "RenderItemConstantsPS"));

            RenderItemConstantsBufferPS.Value = new MeshShaderResources.RenderItemConstantsPS
            {
                HouseColor = Vector3.One,
                Opacity    = 1.0f,
                TintColor  = Vector3.One
            };
            RenderItemConstantsBufferPS.Update(_graphicsDevice);

            MeshInstances = new ModelMeshInstance[model.SubObjects.Length];

            for (var i = 0; i < model.SubObjects.Length; i++)
            {
                var renderObject = model.SubObjects[i].RenderObject;

                if (!(renderObject is ModelMesh mesh))
                {
                    continue;
                }

                MeshInstances[i] = AddDisposable(
                    new ModelMeshInstance(
                        mesh,
                        this,
                        loadContext));
            }

            UnknownBools = new bool[model.SubObjects.Length];
        }