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; }
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; }
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; }
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]; }