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... ((Rendering.DirectX11.Dx11RenderingSwapChain)SwapChain).BindForce(); ((Rendering.DirectX11.Dx11RenderingDevice)Device).ResetState(); if (DrawTransparency) { _legacyDevice.SetBlendState(_legacyDevice.BlendStates.AlphaBlend); } else { _legacyDevice.SetBlendState(_legacyDevice.BlendStates.Opaque); } Matrix4x4 viewProjection = Camera.GetViewProjectionMatrix(Width, Height); if (CurrentObject is WadMoveable) { // HACK: new moveables have one bone with null mesh var moveable = (WadMoveable)CurrentObject; if (moveable.Meshes.Count == 0 || (moveable.Meshes.Count == 1 && moveable.Meshes[0] == null)) { return; } AnimatedModel model = _wadRenderer.GetMoveable((WadMoveable)CurrentObject); // We don't need to rebuilt it everytime necessarily, but it's cheap to so and // simpler than trying to figure out when it may be necessary. model.UpdateAnimation(AnimationIndex, KeyFrameIndex); var effect = DeviceManager.DefaultDeviceManager.___LegacyEffects["Model"]; effect.Parameters["AlphaTest"].SetValue(DrawTransparency); effect.Parameters["Color"].SetValue(Vector4.One); effect.Parameters["Texture"].SetResource(_wadRenderer.Texture); effect.Parameters["TextureSampler"].SetResource(_legacyDevice.SamplerStates.Default); // Build animation transforms var matrices = new List <Matrix4x4>(); if (model.Animations.Count != 0) { 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 < model.Meshes.Count; i++) { var mesh = model.Meshes[i]; if (mesh.Vertices.Count == 0) { continue; } _legacyDevice.SetVertexBuffer(0, mesh.VertexBuffer); _legacyDevice.SetIndexBuffer(mesh.IndexBuffer, true); _legacyDevice.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, mesh.VertexBuffer)); effect.Parameters["ModelViewProjection"].SetValue((matrices[i] * viewProjection).ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var submesh in mesh.Submeshes) { _legacyDevice.Draw(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } //foreach (var submesh in mesh.Submeshes) // _legacyDevice.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.MeshBaseIndex); } } else if (CurrentObject is WadStatic) { StaticModel model = _wadRenderer.GetStatic((WadStatic)CurrentObject); var effect = DeviceManager.DefaultDeviceManager.___LegacyEffects["StaticModel"]; effect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); effect.Parameters["AlphaTest"].SetValue(DrawTransparency); effect.Parameters["Color"].SetValue(Vector4.One); effect.Parameters["Texture"].SetResource(_wadRenderer.Texture); effect.Parameters["TextureSampler"].SetResource(_legacyDevice.SamplerStates.Default); for (int i = 0; i < model.Meshes.Count; i++) { var mesh = model.Meshes[i]; _legacyDevice.SetVertexBuffer(0, mesh.VertexBuffer); _legacyDevice.SetIndexBuffer(mesh.IndexBuffer, true); _legacyDevice.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, mesh.VertexBuffer)); effect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var submesh in mesh.Submeshes) { _legacyDevice.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } } } else if (CurrentObject is WadSpriteSequence) { var seq = (WadSpriteSequence)CurrentObject; if (seq.Sprites.Count <= _currentFrame) { return; } WadSprite sprite = seq.Sprites[_currentFrame]; float aspectRatioViewport = (float)ClientSize.Width / ClientSize.Height; float aspectRatioImage = (float)sprite.Texture.Image.Width / sprite.Texture.Image.Height; float aspectRatioAdjust = aspectRatioViewport / aspectRatioImage; Vector2 factor = Vector2.Min(new Vector2(1.0f / aspectRatioAdjust, aspectRatioAdjust), new Vector2(1.0f)); SwapChain.RenderSprites(_textureAllocator, false, new Sprite { Texture = sprite.Texture.Image, PosStart = -0.9f * factor, PosEnd = 0.9f * factor }); } else if (CurrentObject is ImportedGeometry) { var geo = (ImportedGeometry)CurrentObject; var model = geo.DirectXModel; var effect = DeviceManager.DefaultDeviceManager.___LegacyEffects["RoomGeometry"]; effect.Parameters["UseVertexColors"].SetValue(true); effect.Parameters["AlphaTest"].SetValue(DrawTransparency); effect.Parameters["Color"].SetValue(Vector4.One); for (int i = 0; i < model.Meshes.Count; i++) { var mesh = model.Meshes[i]; _legacyDevice.SetVertexBuffer(0, mesh.VertexBuffer); _legacyDevice.SetIndexBuffer(mesh.IndexBuffer, true); _legacyDevice.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, mesh.VertexBuffer)); effect.Parameters["ModelViewProjection"].SetValue(viewProjection.ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var submesh in mesh.Submeshes) { var texture = submesh.Value.Material.Texture; if (texture != null && texture is ImportedGeometryTexture) { effect.Parameters["TextureEnabled"].SetValue(true); effect.Parameters["Texture"].SetResource(((ImportedGeometryTexture)texture).DirectXTexture); effect.Parameters["ReciprocalTextureSize"].SetValue(new Vector2(1.0f / texture.Image.Width, 1.0f / texture.Image.Height)); effect.Parameters["TextureSampler"].SetResource(_legacyDevice.SamplerStates.AnisotropicWrap); } else { effect.Parameters["TextureEnabled"].SetValue(false); } effect.Techniques[0].Passes[0].Apply(); _legacyDevice.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } foreach (var submesh in mesh.Submeshes) { _legacyDevice.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.BaseIndex); } } } }
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.DefaultDeviceManager.___LegacyEffects["Solid"]; _wadRenderer.Dispose(); if (Mesh != null) { // TODO Keep data on GPU, optimize data upload // Use new renderer var mesh = _wadRenderer.GetStatic(new WadStatic(new WadStaticId(0)) { Mesh = Mesh }); var effect = DeviceManager.DefaultDeviceManager.___LegacyEffects["StaticModel"]; var world = Matrix4x4.Identity; 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); effect.Parameters["ModelViewProjection"].SetValue((world * viewProjection).ToSharpDX()); effect.Techniques[0].Passes[0].Apply(); foreach (var mesh_ in mesh.Meshes) { _device.SetVertexBuffer(0, mesh_.VertexBuffer); _device.SetIndexBuffer(mesh_.IndexBuffer, true); _layout = VertexInputLayout.FromBuffer(0, mesh_.VertexBuffer); _device.SetVertexInputLayout(_layout); foreach (var submesh in mesh_.Submeshes) { _device.DrawIndexed(PrimitiveType.TriangleList, submesh.Value.NumIndices, submesh.Value.MeshBaseIndex); } } } 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); } }
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 }); }