protected override void OnDraw() { // To make sure things are in a defined state for legacy rendering... ((TombLib.Rendering.DirectX11.Dx11RenderingSwapChain)SwapChain).BindForce(); ((TombLib.Rendering.DirectX11.Dx11RenderingDevice)Device).ResetState(); _device.SetDepthStencilState(_device.DepthStencilStates.Default); _device.SetRasterizerState(_device.RasterizerStates.CullBack); _device.SetBlendState(_device.BlendStates.Opaque); Matrix4x4 viewProjection = Camera.GetViewProjectionMatrix(ClientSize.Width, ClientSize.Height); Effect solidEffect = _deviceManager.___LegacyEffects["Solid"]; _wadRenderer.Dispose(); if (Skeleton != null) { var effect = _deviceManager.___LegacyEffects["Model"]; effect.Parameters["TextureSampler"].SetResource(_device.SamplerStates.Default); foreach (var node in Skeleton) { // TODO Keep data on GPU, optimize data upload // Use new renderer var mesh = _wadRenderer.GetStatic(new WadStatic(new WadStaticId(0)) { Mesh = node.WadMesh }); effect.Parameters["Texture"].SetResource(_wadRenderer.Texture); effect.Parameters["ModelViewProjection"].SetValue((node.GlobalTransform * viewProjection).ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var mesh_ in mesh.Meshes) { _device.SetVertexBuffer(0, mesh_.VertexBuffer); _device.SetIndexBuffer(mesh_.IndexBuffer, true); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, mesh_.VertexBuffer)); foreach (var submesh in mesh_.Submeshes) { _device.Draw(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } } //foreach (var submesh in mesh_.Submeshes) // _device.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.MeshBaseIndex); } // Draw box if (SelectedNode != null) { _vertexBufferVisibility?.Dispose(); _vertexBufferVisibility = GetVertexBufferFromBoundingBox(SelectedNode.WadMesh.BoundingBox); _device.SetVertexBuffer(_vertexBufferVisibility); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _vertexBufferVisibility)); _device.SetIndexBuffer(null, false); solidEffect.Parameters["ModelViewProjection"].SetValue((SelectedNode.GlobalTransform * viewProjection).ToSharpDX()); solidEffect.Parameters["Color"].SetValue(new Vector4(0.0f, 1.0f, 0.0f, 1.0f)); solidEffect.CurrentTechnique.Passes[0].Apply(); _device.Draw(PrimitiveType.LineList, _vertexBufferVisibility.ElementCount); } } if (DrawGrid) { _device.SetRasterizerState(_rasterizerWireframe); // Draw the grid _device.SetVertexBuffer(0, _plane.VertexBuffer); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _plane.VertexBuffer)); _device.SetIndexBuffer(_plane.IndexBuffer, true); solidEffect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); solidEffect.Parameters["Color"].SetValue(Vector4.One); solidEffect.Techniques[0].Passes[0].Apply(); _device.Draw(PrimitiveType.LineList, _plane.VertexBuffer.ElementCount); } if (DrawGizmo && SelectedNode != null) { // Draw the gizmo SwapChain.ClearDepth(); _gizmo.Draw(viewProjection); } // Draw debug strings if (SelectedNode != null) { ((TombLib.Rendering.DirectX11.Dx11RenderingDevice)Device).ResetState(); // To make sure SharpDx.Toolkit didn't change settings. Matrix4x4 worldViewProjection = SelectedNode.GlobalTransform * viewProjection; SwapChain.RenderText(new Text { Font = _fontDefault, Pos = worldViewProjection.TransformPerspectively(SelectedNode.Centre - Vector3.UnitY * 128.0f).To2(), TextAlignment = new Vector2(0, 0), ScreenAlignment = new Vector2(0.5f, 0.5f), String = "Name: " + SelectedNode.Bone.Name + "\nLocal offset: " + SelectedNode.Bone.Translation }); } }
protected override void OnDraw() { // To make sure things are in a defined state for legacy rendering... ((TombLib.Rendering.DirectX11.Dx11RenderingSwapChain)SwapChain).BindForce(); ((TombLib.Rendering.DirectX11.Dx11RenderingDevice)Device).ResetState(); _device.SetDepthStencilState(_device.DepthStencilStates.Default); _device.SetRasterizerState(_device.RasterizerStates.CullBack); _device.SetBlendState(_device.BlendStates.Opaque); Matrix4x4 viewProjection = Camera.GetViewProjectionMatrix(ClientSize.Width, ClientSize.Height); /*if (Level != null && Room != null) * { * Effect roomsEffect = _deviceManager.Effects["Room"]; * * roomsEffect.Parameters["TextureEnabled"].SetValue(true); * roomsEffect.Parameters["DrawSectorOutlinesAndUseEditorUV"].SetValue(false); * roomsEffect.Parameters["Highlight"].SetValue(false); * roomsEffect.Parameters["Dim"].SetValue(false); * roomsEffect.Parameters["Color"].SetValue(new Vector4(1.0f, 1.0f, 1.0f, 1.0f)); * roomsEffect.Parameters["Texture"].SetResource(_textureAtlas); * roomsEffect.Parameters["TextureSampler"].SetResource(_device.SamplerStates.AnisotropicWrap); * roomsEffect.Parameters["UseVertexColors"].SetValue(true); * roomsEffect.Parameters["TextureAtlasRemappingSize"].SetValue(_textureAtlasRemappingSize); * roomsEffect.Parameters["TextureCoordinateFactor"].SetValue(_textureAtlas == null ? new Vector2(0) : new Vector2(1.0f / _textureAtlas.Width, 1.0f / _textureAtlas.Height)); * * _device.SetVertexBuffer(0, Room.VertexBuffer); * _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, Room.VertexBuffer)); * * var world = Matrix4x4.CreateTranslation(new Vector3(-RoomPosition.X, 0, -RoomPosition.Z)); * * roomsEffect.Parameters["ModelViewProjection"].SetValue((world * viewProjection).ToSharpDX()); * * roomsEffect.Techniques[0].Passes[0].Apply(); * _device.Draw(PrimitiveType.TriangleList, Room.VertexBuffer.ElementCount); * * }*/ Effect solidEffect = _deviceManager.___LegacyEffects["Solid"]; if (_model != null) { var skin = (_skinModel != null ? _skinModel : _model); var effect = _deviceManager.___LegacyEffects["Model"]; effect.Parameters["Texture"].SetResource(_wadRenderer.Texture); effect.Parameters["TextureSampler"].SetResource(_device.SamplerStates.Default); // Build animation transforms var matrices = new List <Matrix4x4>(); if (_editor.ValidAnimationAndFrames) { for (var b = 0; b < _model.Meshes.Count; b++) { matrices.Add(_model.AnimationTransforms[b]); } } else { foreach (var bone in _model.Bones) { matrices.Add(bone.GlobalTransform); } } for (int i = 0; i < skin.Meshes.Count; i++) { var mesh = skin.Meshes[i]; if (mesh.Vertices.Count == 0) { continue; } _device.SetVertexBuffer(0, mesh.VertexBuffer); _device.SetIndexBuffer(mesh.IndexBuffer, true); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, mesh.VertexBuffer)); if (SelectedMesh == _model.Meshes[i] && _editor.ValidAnimationAndFrames) { effect.Parameters["Color"].SetValue(new Vector4(1.0f, 0.0f, 0.0f, 1.0f)); } else { effect.Parameters["Color"].SetValue(Vector4.One); } effect.Parameters["ModelViewProjection"].SetValue((matrices[i] * viewProjection).ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var submesh in mesh.Submeshes) { _device.Draw(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } //foreach (var submesh in mesh.Submeshes) // _device.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.MeshBaseIndex); } if (_editor.ValidAnimationAndFrames) { _device.SetRasterizerState(_rasterizerWireframe); // Draw selection box if (SelectedMesh != null) { if (_vertexBufferVisibility != null) { _vertexBufferVisibility.Dispose(); } int meshIndex = _model.Meshes.IndexOf(SelectedMesh); _vertexBufferVisibility = GetVertexBufferFromBoundingBox(Skin.Meshes[meshIndex].BoundingBox); _device.SetVertexBuffer(_vertexBufferVisibility); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _vertexBufferVisibility)); _device.SetIndexBuffer(null, false); solidEffect.Parameters["ModelViewProjection"].SetValue((_model.AnimationTransforms[meshIndex] * viewProjection).ToSharpDX()); solidEffect.Parameters["Color"].SetValue(new Vector4(0.0f, 1.0f, 0.0f, 1.0f)); solidEffect.CurrentTechnique.Passes[0].Apply(); _device.Draw(PrimitiveType.LineList, _vertexBufferVisibility.ElementCount); } // Draw collision box if (Configuration.AnimationEditor_ShowCollisionBox) { if (_vertexBufferVisibility != null) { _vertexBufferVisibility.Dispose(); } _vertexBufferVisibility = GetVertexBufferFromBoundingBox(_editor.CurrentKeyFrame.BoundingBox); _device.SetVertexBuffer(_vertexBufferVisibility); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _vertexBufferVisibility)); _device.SetIndexBuffer(null, false); solidEffect.Parameters["ModelViewProjection"].SetValue((viewProjection).ToSharpDX()); solidEffect.Parameters["Color"].SetValue(new Vector4(0.0f, 0.0f, 1.0f, 1.0f)); solidEffect.CurrentTechnique.Passes[0].Apply(); _device.Draw(PrimitiveType.LineList, _vertexBufferVisibility.ElementCount); } } } if (Configuration.AnimationEditor_ShowGrid) { // Draw the grid _device.SetVertexBuffer(0, _plane.VertexBuffer); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _plane.VertexBuffer)); _device.SetIndexBuffer(_plane.IndexBuffer, true); _device.SetRasterizerState(_rasterizerWireframe); var shift = Matrix4x4.CreateTranslation(new Vector3(-GridPosition.X, GridPosition.Y, -GridPosition.Z)); solidEffect.Parameters["ModelViewProjection"].SetValue((shift * viewProjection).ToSharpDX()); solidEffect.Parameters["Color"].SetValue(Vector4.One); solidEffect.Techniques[0].Passes[0].Apply(); _device.Draw(PrimitiveType.LineList, _plane.VertexBuffer.ElementCount); } if (Configuration.AnimationEditor_ShowGizmo && SelectedMesh != null && _editor.ValidAnimationAndFrames) { // Draw the gizmo SwapChain.ClearDepth(); _gizmo.Draw(viewProjection); } if (_editor.CurrentAnim != null && Configuration.RenderingItem_ShowDebugInfo) { ((TombLib.Rendering.DirectX11.Dx11RenderingDevice)Device).ResetState(); // To make sure SharpDx.Toolkit didn't change settings. string debugMessage = "Frame: " + (_editor.CurrentFrameIndex + 1) + "/" + _editor.CurrentAnim.DirectXAnimation.KeyFrames.Count; if (SelectedMesh != null) { debugMessage += "\nMesh: " + SelectedMesh.Name; debugMessage += "\nBone: " + _model.Bones[_model.Meshes.IndexOf(SelectedMesh)].Name; debugMessage += "\nRotation: " + _editor.CurrentKeyFrame.Rotations[Model.Meshes.IndexOf(SelectedMesh)]; } SwapChain.RenderText(new Text { Font = _fontDefault, PixelPos = new Vector2(10, 25), Alignment = new Vector2(0, 0), String = debugMessage }); } }
protected override void OnDraw() { // To make sure things are in a defined state for legacy rendering... ((TombLib.Rendering.DirectX11.Dx11RenderingSwapChain)SwapChain).BindForce(); ((TombLib.Rendering.DirectX11.Dx11RenderingDevice)Device).ResetState(); _device.SetDepthStencilState(_device.DepthStencilStates.Default); _device.SetRasterizerState(_device.RasterizerStates.CullBack); _device.SetBlendState(_device.BlendStates.Opaque); Matrix4x4 viewProjection = Camera.GetViewProjectionMatrix(ClientSize.Width, ClientSize.Height); Effect solidEffect = _deviceManager.___LegacyEffects["Solid"]; if (Static != null) { var model = _wadRenderer.GetStatic(Static); var effect = _deviceManager.___LegacyEffects["StaticModel"]; var world = GizmoTransform; effect.Parameters["ModelViewProjection"].SetValue((world * viewProjection).ToSharpDX()); effect.Parameters["Color"].SetValue(Vector4.One); effect.Parameters["Texture"].SetResource(_wadRenderer.Texture); effect.Parameters["TextureSampler"].SetResource(_device.SamplerStates.Default); for (int i = 0; i < model.Meshes.Count; i++) { var mesh = model.Meshes[i]; _device.SetVertexBuffer(0, mesh.VertexBuffer); _device.SetIndexBuffer(mesh.IndexBuffer, true); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, mesh.VertexBuffer)); effect.Parameters["ModelViewProjection"].SetValue((world * viewProjection).ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var submesh in mesh.Submeshes) { _device.Draw(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } //foreach (var submesh in mesh.Submeshes) // _device.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.MeshBaseIndex); } _device.SetRasterizerState(_rasterizerWireframe); // Draw boxes if (DrawVisibilityBox || DrawCollisionBox) { if (DrawVisibilityBox) { _vertexBufferVisibility?.Dispose(); _vertexBufferVisibility = GetVertexBufferFromBoundingBox(Static.VisibilityBox); _device.SetVertexBuffer(_vertexBufferVisibility); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _vertexBufferVisibility)); _device.SetIndexBuffer(null, false); solidEffect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); solidEffect.Parameters["Color"].SetValue(new Vector4(0.0f, 1.0f, 0.0f, 1.0f)); solidEffect.CurrentTechnique.Passes[0].Apply(); _device.Draw(PrimitiveType.LineList, _vertexBufferVisibility.ElementCount); } if (DrawCollisionBox) { _vertexBufferCollision?.Dispose(); _vertexBufferCollision = GetVertexBufferFromBoundingBox(Static.CollisionBox); _device.SetVertexBuffer(_vertexBufferCollision); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _vertexBufferCollision)); _device.SetIndexBuffer(null, false); solidEffect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); solidEffect.Parameters["Color"].SetValue(new Vector4(1.0f, 0.0f, 0.0f, 1.0f)); solidEffect.CurrentTechnique.Passes[0].Apply(); _device.Draw(PrimitiveType.LineList, _vertexBufferCollision.ElementCount); } } // Draw normals if (DrawNormals) { var lines = new List <SolidVertex>(); for (int i = 0; i < Static.Mesh.VerticesNormals.Count; i++) { var p = Vector3.Transform(Static.Mesh.VerticesPositions[i], world); var n = Vector3.TransformNormal(Static.Mesh.VerticesNormals[i] / Static.Mesh.VerticesNormals[i].Length(), world); var v = new SolidVertex(); v.Position = p; v.Color = new Vector4(1.0f, 1.0f, 1.0f, 1.0f); lines.Add(v); v = new SolidVertex(); v.Position = p + n * 256.0f; v.Color = new Vector4(1.0f, 1.0f, 1.0f, 1.0f); lines.Add(v); } Buffer <SolidVertex> bufferLines = Buffer.New(_device, lines.ToArray(), BufferFlags.VertexBuffer, SharpDX.Direct3D11.ResourceUsage.Default); _device.SetVertexBuffer(bufferLines); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, bufferLines)); _device.SetIndexBuffer(null, false); solidEffect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); solidEffect.Parameters["Color"].SetValue(new Vector4(1.0f, 1.0f, 1.0f, 1.0f)); solidEffect.CurrentTechnique.Passes[0].Apply(); _device.Draw(PrimitiveType.LineList, bufferLines.ElementCount); } } if (DrawGrid) { _device.SetRasterizerState(_rasterizerWireframe); // Draw the grid _device.SetVertexBuffer(0, _plane.VertexBuffer); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _plane.VertexBuffer)); _device.SetIndexBuffer(_plane.IndexBuffer, true); solidEffect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); solidEffect.Parameters["Color"].SetValue(Vector4.One); solidEffect.Techniques[0].Passes[0].Apply(); _device.Draw(PrimitiveType.LineList, _plane.VertexBuffer.ElementCount); } if (DrawLights) { _device.SetRasterizerState(_rasterizerWireframe); foreach (var light in Static.Lights) { // Draw the little sphere _device.SetVertexBuffer(0, _littleSphere.VertexBuffer); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _littleSphere.VertexBuffer)); _device.SetIndexBuffer(_littleSphere.IndexBuffer, false); var world = Matrix4x4.CreateTranslation(light.Position); solidEffect.Parameters["ModelViewProjection"].SetValue((world * viewProjection).ToSharpDX()); solidEffect.Parameters["Color"].SetValue(new Vector4(1.0f, 1.0f, 0.0f, 1.0f)); solidEffect.Techniques[0].Passes[0].Apply(); _device.DrawIndexed(PrimitiveType.TriangleList, _littleSphere.IndexBuffer.ElementCount); if (SelectedLight == light) { _device.SetVertexBuffer(0, _sphere.VertexBuffer); _device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, _sphere.VertexBuffer)); _device.SetIndexBuffer(_sphere.IndexBuffer, false); world = Matrix4x4.CreateScale(light.Radius * 2.0f) * Matrix4x4.CreateTranslation(light.Position); solidEffect.Parameters["ModelViewProjection"].SetValue((world * viewProjection).ToSharpDX()); solidEffect.Parameters["Color"].SetValue(new Vector4(0.0f, 1.0f, 0.0f, 1.0f)); solidEffect.Techniques[0].Passes[0].Apply(); _device.DrawIndexed(PrimitiveType.TriangleList, _sphere.IndexBuffer.ElementCount); } } _device.SetRasterizerState(_device.RasterizerStates.CullBack); } if (DrawGizmo) { // Draw the gizmo SwapChain.ClearDepth(); _gizmo.Draw(viewProjection); } if (SelectedLight != null) { // Draw the gizmo of selected light SwapChain.ClearDepth(); _gizmoLight.Draw(viewProjection); } // Draw debug strings ((TombLib.Rendering.DirectX11.Dx11RenderingDevice)Device).ResetState(); // To make sure SharpDx.Toolkit didn't change settings. SwapChain.RenderText(new Text { Font = _fontDefault, PixelPos = new Vector2(5, 5), Alignment = new Vector2(0, 0), String = "Position: " + StaticPosition + "\nRotation: " + StaticRotation.X * (180 / Math.PI) + "\nScale: " + StaticScale }); }