Пример #1
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];
        }