protected void UpdateTransformWorld(GraphicsDevice graphics, D3DRenderComponent render, GraphicEntity en) { var transform = en.GetComponent <TransformComponent>(); var matrixWorld = transform.MatrixWorld; //var isChanged = false; //if(en.TryGetComponent<MovingComponent>(out var moving)) { // isChanged = true; // matrixWorld *= moving.MovingMatrix; // en.RemoveComponent(moving); // en.UpdateComponent(TransformComponent.Create(matrixWorld)); //} if (!render.TransformWorldBuffer.HasValue) { var tr = TransforStructBuffer.ToTranspose(matrixWorld); if (render.TransformWorldBuffer.HasValue) { var buff = render.TransformWorldBuffer.Get(); graphics.UpdateDynamicBuffer(ref tr, buff); } else { var buff = graphics.CreateDynamicBuffer(ref tr, Unsafe.SizeOf <TransforStructBuffer>()); render.TransformWorldBuffer.Set(buff); } } }
protected void UpdateShaders(GraphicsDevice graphics, D3DRenderComponent render, D3DShaderTechniquePass pass, VertexLayoutConstructor layconst) { var device = graphics.D3DDevice; var vertexShaderByteCode = pass.VertexShader.ReadCompiledBytes(); var inputSignature = ShaderSignature.GetInputSignature(vertexShaderByteCode); render.Layout.Set(new InputLayout(device, inputSignature, layconst.ConstuctElements())); render.VertexShader.Set(new VertexShader(device, vertexShaderByteCode)); if (pass.GeometryShader != null) { render.GeometryShader.Set(new GeometryShader(device, pass.GeometryShader.ReadCompiledBytes())); } if (pass.PixelShader != null) { render.PixelShader.Set(new PixelShader(device, pass.PixelShader.ReadCompiledBytes())); } render.RasterizerState = new D3DRasterizerState(rasterizerStateDescription); render.SetStates( new BlendState(graphics.D3DDevice, blendStateDescription), new DepthStencilState(graphics.D3DDevice, depthStencilStateDescription)); }
protected void DefaultUpdateInputOutput(GraphicsDevice graphics, D3DRenderComponent render, VertexLayoutConstructor layconst, DisposableSetter <InputLayout> inputLayout, RenderableComponent renderable) { var context = graphics.ImmediateContext; context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(render.VertexBuffer.Get(), layconst.VertexSize, 0)); context.InputAssembler.SetIndexBuffer(render.IndexBuffer.Get(), SharpDX.DXGI.Format.R32_UInt, 0); context.InputAssembler.InputLayout = inputLayout.Get(); context.InputAssembler.PrimitiveTopology = renderable.PrimitiveTopology; context.OutputMerger.SetDepthStencilState(render.DepthStencilState.Get(), 0); context.OutputMerger.SetBlendState(render.BlendingState.Get(), new SharpDX.Mathematics.Interop.RawColor4(0, 0, 0, 0), -1); }
protected void UpdateMaterial(GraphicsDevice graphics, D3DRenderComponent render, MaterialColorComponent material) { if (material.IsValid) { var buf = MaterialStructBuffer.From(material); if (render.MaterialBuffer.HasValue) { var buff = render.MaterialBuffer.Get(); graphics.UpdateDynamicBuffer(ref buf, buff); } else { var buff = graphics.CreateDynamicBuffer(ref buf, Unsafe.SizeOf <MaterialStructBuffer>()); render.MaterialBuffer.Set(buff); } } }
protected static void Render(GraphicsDevice graphics, DeviceContext context, D3DRenderComponent render, int vertexSize) { if (render.TransformWorldBuffer.HasValue) { context.VertexShader.SetConstantBuffer(TransforStructBuffer.RegisterResourceSlot, render.TransformWorldBuffer.Get()); } context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(render.VertexBuffer.Get(), vertexSize, 0)); context.InputAssembler.SetIndexBuffer(render.IndexBuffer.Get(), SharpDX.DXGI.Format.R32_UInt, 0); context.InputAssembler.InputLayout = render.Layout.Get(); context.InputAssembler.PrimitiveTopology = render.PrimitiveTopology; graphics.UpdateRasterizerState(render.RasterizerState.GetDescription()); context.OutputMerger.SetDepthStencilState(render.DepthStencilState.Get(), 0); var blendFactor = new SharpDX.Mathematics.Interop.RawColor4(0, 0, 0, 0); context.OutputMerger.SetBlendState(render.BlendingState.Get(), blendFactor, -1); }
public void RenderEach(GraphicsDevice graphics, TProperties props, GraphicEntity en) { var device = graphics.D3DDevice; var context = graphics.ImmediateContext; if (!en.TryGetComponent <D3DRenderComponent>(out var render)) { render = new D3DRenderComponent(); en.AddComponent(render); } var renderable = en.GetComponent <RenderableComponent>(); var color = en.GetComponent <MaterialColorComponent>(); var geo = ContextState.GetGeometryPool().GetGeometry <IGeometryData>(en); if (!render.DepthStencilState.HasValue) { render.DepthStencilState.Set(new DepthStencilState(graphics.D3DDevice, renderable.DepthStencilStateDefinition.Description)); } if (!render.BlendingState.HasValue) { render.BlendingState.Set(new BlendState(graphics.D3DDevice, renderable.BlendStateDescription)); } { graphics.ClearAllShader(); context.VertexShader.Set(vertexShader.Get()); context.GeometryShader.Set(null); context.PixelShader.Set(pixelShader.Get()); if (en.Contains <FlatShadingGeometryComponent>()) { context.GeometryShader.Set(flatShadingGS.Get()); } else if (en.Contains <WireframeGeometryComponent>()) { context.GeometryShader.Set(wireframeGS.Get()); context.PixelShader.Set(wireframePS.Get()); } } var topology = renderable.PrimitiveTopology; if (geo.IsModified || (!render.VertexBuffer.HasValue && !render.IndexBuffer.HasValue)) { Vertex[] vertex = null; switch (geo.Topology) { case GeometryPrimitiveTopologies.TriangleList: topology = PrimitiveTopology.TriangleList; vertex = new Vertex[geo.Positions.Length]; for (var index = 0; index < vertex.Length; index++) { vertex[index] = new Vertex(geo.Positions[index], geo.Normals[index]); } break; } render.VertexBuffer.Set(graphics.CreateBuffer(BindFlags.VertexBuffer, vertex)); render.IndexBuffer.Set(graphics.CreateBuffer(BindFlags.IndexBuffer, geo.Indices.ToArray())); geo.IsModified = false; } if (!render.VertexBuffer.HasValue && !render.IndexBuffer.HasValue) { throw RenderTechniqueException.NoVertexAndIndexBuffers; } if (color.IsValid) { var material = MaterialStructBuffer.From(color); if (render.MaterialBuffer.HasValue) { var buff = render.MaterialBuffer.Get(); graphics.UpdateDynamicBuffer(ref material, buff); } else { var buff = graphics.CreateDynamicBuffer(ref material, Unsafe.SizeOf <MaterialStructBuffer>()); render.MaterialBuffer.Set(buff); } } UpdateTransformWorld(graphics, render, en); if (!render.TransformWorldBuffer.HasValue) { throw RenderTechniqueException.NoWorldTransformBuffers; } {//Update constant buffers context.VertexShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, props.Game); context.VertexShader.SetConstantBuffer(TransforStructBuffer.RegisterResourceSlot, render.TransformWorldBuffer.Get()); context.PixelShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, props.Game); context.PixelShader.SetConstantBuffer(LightStructBuffer.RegisterResourceSlot, props.Lights); if (render.MaterialBuffer.HasValue) { context.PixelShader.SetConstantBuffer(MaterialStructBuffer.RegisterResourceSlot, render.MaterialBuffer.Get()); } } { context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(render.VertexBuffer.Get(), layconst.VertexSize, 0)); context.InputAssembler.SetIndexBuffer(render.IndexBuffer.Get(), SharpDX.DXGI.Format.R32_UInt, 0); context.InputAssembler.InputLayout = inputLayout.Get(); context.InputAssembler.PrimitiveTopology = topology; context.OutputMerger.SetDepthStencilState( render.DepthStencilState.Get(), renderable.DepthStencilStateDefinition.StencilRef); context.OutputMerger.SetBlendState(render.BlendingState.Get(), new SharpDX.Mathematics.Interop.RawColor4(0, 0, 0, 0), -1); } var rasterizerDesc = renderable.RasterizerStateDescription; using (var rasterizerState = graphics.CreateRasterizerState(rasterizerDesc)) { context.Rasterizer.State = rasterizerState; graphics.ImmediateContext.DrawIndexed(geo.Indices.Length, 0, 0); } }
protected override void Rendering(GraphicsDevice graphics, TProperties game) { var context = graphics.ImmediateContext; var device = graphics.D3DDevice; if (!VS_FS.IsCompiled) { VS_FS.Compile(graphics.Compilator); var vertexShaderByteCode = VS_FS.VertexShader.ReadCompiledBytes(); var inputSignature = ShaderSignature.GetInputSignature(vertexShaderByteCode); inputLayout.Set(new InputLayout(device, inputSignature, layconst.ConstuctElements())); vertexShader.Set(new VertexShader(device, vertexShaderByteCode)); pixelShader.Set(new PixelShader(device, VS_FS.PixelShader.ReadCompiledBytes())); } if (!GS_ScreenFixed.IsCompiled) { GS_ScreenFixed.Compile(graphics.Compilator); gsScreenFixed.Set(new GeometryShader(device, GS_ScreenFixed.GeometryShader.ReadCompiledBytes())); } if (!GS_SizeFixed.IsCompiled) { GS_SizeFixed.Compile(graphics.Compilator); gsSizeFixed.Set(new GeometryShader(device, GS_SizeFixed.GeometryShader.ReadCompiledBytes())); } foreach (var en in entities) { var renderable = en.GetComponent <RenderableComponent>(); var billboard = en.GetComponent <BillboardTextComponent>(); var transform = en.GetComponent <TransformComponent>(); if (!en.TryGetComponent <D3DRenderComponent>(out var render)) { render = new D3DRenderComponent(); en.AddComponent(render); } if (!en.TryGetComponent <InternalBillboardRenderedTextComponent>(out var renderedText) || !renderedText.IsRendered(billboard)) { renderedText = new InternalBillboardRenderedTextComponent(); renderedText.Render(billboard); en.UpdateComponent(renderedText); var image = renderedText.RenderedBitmapText; var v = new Vertex() { Position = billboard.Position.ToVector4(), ImageSize = new Vector3( new Vector2(image.Width, image.Height) * renderedText.Scale, 0) }; render.VertexBuffer.Set(graphics.CreateBuffer(BindFlags.VertexBuffer, new[] { v })); render.TextureResources.Set(new[] { ConvertToResource(image, graphics.TexturedLoader) }); if (!render.SampleState.HasValue) { render.SampleState.Set(graphics.CreateSampler(SamplerStateDescriptions.Default)); } } if (!render.BlendingState.HasValue) { render.BlendingState.Set(new BlendState(graphics.D3DDevice, renderable.BlendStateDescription)); } if (!render.DepthStencilState.HasValue) { render.DepthStencilState.Set(new DepthStencilState(graphics.D3DDevice, renderable.DepthStencilStateDefinition.Description)); } base.UpdateTransformWorld(graphics, render, en); graphics.ClearAllShader(); { context.VertexShader.Set(vertexShader.Get()); context.VertexShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, game.Game); context.VertexShader.SetConstantBuffer(TransforStructBuffer.RegisterResourceSlot, render.TransformWorldBuffer.Get()); switch (billboard.SizeMode) { case BillboardSizeModes.SceenFixed: context.GeometryShader.Set(gsScreenFixed.Get()); break; case BillboardSizeModes.SizeFixed: context.GeometryShader.Set(gsSizeFixed.Get()); break; } context.GeometryShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, game.Game); context.PixelShader.Set(pixelShader.Get()); context.PixelShader.SetShaderResources(0, render.TextureResources.Get()); context.PixelShader.SetSampler(0, render.SampleState.Get()); } context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(render.VertexBuffer.Get(), layconst.VertexSize, 0)); context.InputAssembler.SetIndexBuffer(null, Format.R32_UInt, 0); context.InputAssembler.InputLayout = inputLayout.Get(); context.InputAssembler.PrimitiveTopology = renderable.PrimitiveTopology; context.OutputMerger.SetDepthStencilState(render.DepthStencilState.Get(), 0); context.OutputMerger.SetBlendState(render.BlendingState.Get(), new SharpDX.Mathematics.Interop.RawColor4(0, 0, 0, 0), -1); using (var rasterizerState = graphics.CreateRasterizerState(renderable.RasterizerStateDescription)) { context.Rasterizer.State = rasterizerState; graphics.ImmediateContext.Draw(1, 0); } } }
protected override void Rendering(GraphicsDevice graphics, TProperties props) { var device = graphics.D3DDevice; var context = graphics.ImmediateContext; if (!pass.IsCompiled) { pass.Compile(graphics.Compilator); var vertexShaderByteCode = pass.VertexShader.ReadCompiledBytes(); var inputSignature = ShaderSignature.GetInputSignature(vertexShaderByteCode); inputLayout.Set(new InputLayout(device, inputSignature, layconst.ConstuctElements())); vertexShader.Set(new VertexShader(device, vertexShaderByteCode)); pixelShader.Set(new PixelShader(device, pass.PixelShader.ReadCompiledBytes())); geometryShader.Set(new GeometryShader(device, pass.GeometryShader.ReadCompiledBytes())); } if (!depthStencilState.HasValue) { depthStencilState.Set(new DepthStencilState(graphics.D3DDevice, D3DDepthStencilDefinition.DepthDisabled.Description)); } foreach (var entity in entities) { var point = entity.GetComponent <SpherePointComponent>(); var renderable = entity.GetComponent <RenderableComponent>(); var material = entity.GetComponent <MaterialColorComponent>(); if (!entity.TryGetComponent <D3DRenderComponent>(out var render)) { render = new D3DRenderComponent(); entity.AddComponent(render); } if (!render.DepthStencilState.HasValue) { render.DepthStencilState.Set(new DepthStencilState(graphics.D3DDevice, renderable.DepthStencilStateDefinition.Description)); } if (!render.BlendingState.HasValue) { render.BlendingState.Set(new BlendState(graphics.D3DDevice, renderable.BlendStateDescription)); } graphics.ClearAllShader(); graphics.SetVertexShader(vertexShader); graphics.SetGeometryShader(geometryShader); graphics.SetPixelShader(pixelShader); render.VertexBuffer.Set(graphics.CreateBuffer(BindFlags.VertexBuffer, new Vertex[] { new Vertex(point.Center, material.Diffuse) })); render.IndexBuffer.Set(graphics.CreateBuffer(BindFlags.IndexBuffer, new [] { 0 })); UpdateTransformWorld(graphics, render, entity); {//Update constant buffers context.VertexShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, props.Game); context.VertexShader.SetConstantBuffer(TransforStructBuffer.RegisterResourceSlot, render.TransformWorldBuffer.Get()); context.GeometryShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, props.Game); context.GeometryShader.SetConstantBuffer(TransforStructBuffer.RegisterResourceSlot, render.TransformWorldBuffer.Get()); context.PixelShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, props.Game); context.PixelShader.SetConstantBuffer(LightStructBuffer.RegisterResourceSlot, props.Lights); if (render.MaterialBuffer.HasValue) { context.PixelShader.SetConstantBuffer(MaterialStructBuffer.RegisterResourceSlot, render.MaterialBuffer.Get()); } } DefaultUpdateInputOutput(graphics, render, layconst, inputLayout, renderable); using (var rasterizerState = graphics.CreateRasterizerState(renderable.RasterizerStateDescription)) { context.Rasterizer.State = rasterizerState; graphics.ImmediateContext.Draw(1, 0); } } }
protected override void Rendering(GraphicsDevice graphics, TProperties game) { var device = graphics.D3DDevice; var context = graphics.ImmediateContext; if (!pass.IsCompiled) { pass.Compile(graphics.Compilator); var vertexShaderByteCode = pass.VertexShader.ReadCompiledBytes(); inputLayout.Set(graphics.CreateInputLayout(vertexShaderByteCode, layconst.ConstuctElements())); vertexShader.Set(new VertexShader(device, vertexShaderByteCode)); pixelShader.Set(new PixelShader(device, pass.PixelShader.ReadCompiledBytes())); } { //clear shaders off prev. technique graphics.ClearAllShader(); //all shaders shared for all entity with LineVertexRenderComponent context.VertexShader.Set(vertexShader.Get()); context.PixelShader.Set(pixelShader.Get()); //Update constant buffers ones becase shaders will not changed context.VertexShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, game.Game); //shared for all entity context.InputAssembler.InputLayout = inputLayout.Get(); } foreach (var en in entities) { if (!en.TryGetComponent <D3DRenderComponent>(out var d3drender)) { d3drender = new D3DRenderComponent(); en.AddComponent(d3drender); } en.TryGetComponent <ColorComponent>(out var color); var renderable = en.GetComponent <RenderableComponent>(); var transform = en.GetComponent <TransformComponent>(); var geoId = en.GetComponent <GeometryPoolComponent>(); var geo = ContextState.GetGeometryPool().GetGeometry <IGeometryData>(geoId); if (!d3drender.DepthStencilState.HasValue) { d3drender.DepthStencilState.Set( new DepthStencilState(graphics.D3DDevice, renderable.DepthStencilStateDefinition.Description)); } if (!d3drender.BlendingState.HasValue) { d3drender.BlendingState.Set(new BlendState(graphics.D3DDevice, renderable.BlendStateDescription)); } UpdateTransformWorld(graphics, d3drender, en); if (geo.IsModified) { var pos = geo.Positions; var vertex = new Vertex[pos.Length]; for (var i = 0; i < pos.Length; i++) { var c = color.IsValid ? color.Color : geo.Colors[i]; vertex[i] = new Vertex(pos[i], c); } d3drender.VertexBuffer.Set(graphics.CreateBuffer(BindFlags.VertexBuffer, vertex)); geo.IsModified = false; } context.VertexShader.SetConstantBuffer(TransforStructBuffer.RegisterResourceSlot, d3drender.TransformWorldBuffer.Get()); { context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(d3drender.VertexBuffer.Get(), layconst.VertexSize, 0)); context.InputAssembler.PrimitiveTopology = renderable.PrimitiveTopology; context.OutputMerger.SetDepthStencilState(d3drender.DepthStencilState.Get(), 0); context.OutputMerger.SetBlendState(d3drender.BlendingState.Get(), new SharpDX.Mathematics.Interop.RawColor4(0, 0, 0, 0), -1); } using (var rasterizerState = graphics.CreateRasterizerState(renderable.RasterizerStateDescription)) { context.Rasterizer.State = rasterizerState; context.Draw(geo.Positions.Length, 0); } } }
public void RenderEach(GraphicsDevice graphics, TProperties game, GraphicEntity en) { var device = graphics.D3DDevice; var context = graphics.ImmediateContext; if (!en.TryGetComponent <D3DRenderComponent>(out var render)) { render = new D3DRenderComponent(); en.AddComponent(render); } var renderable = en.GetComponent <RenderableComponent>(); var geo = ContextState.GetGeometryPool().GetGeometry <IGeometryData>(en); //optional var hasColor = en.TryGetComponent <MaterialColorComponent>(out var color); var hasTexture = en.TryGetComponent <D3DTexturedMaterialSamplerComponent>(out var texture); if (!render.DepthStencilState.HasValue) { render.DepthStencilState.Set(new DepthStencilState(graphics.D3DDevice, renderable.DepthStencilStateDefinition.Description)); } if (!render.BlendingState.HasValue) { render.BlendingState.Set(new BlendState(graphics.D3DDevice, renderable.BlendStateDescription)); } UpdateTransformWorld(graphics, render, en); if (geo.IsModified) { var vertex = new Vertex[geo.Positions.Length]; for (var index = 0; index < vertex.Length; index++) { vertex[index] = new Vertex( geo.Positions[index], geo.Normals[index], geo.TexCoor[index]); } render.VertexBuffer.Set(graphics.CreateBuffer(BindFlags.VertexBuffer, vertex)); render.IndexBuffer.Set(graphics.CreateBuffer(BindFlags.IndexBuffer, geo.Indices.ToArray())); geo.IsModified = false; } if (hasColor) { var material = MaterialStructBuffer.From(color); if (render.MaterialBuffer.HasValue) { var buff = render.MaterialBuffer.Get(); graphics.UpdateDynamicBuffer(ref material, buff); } else { var buff = graphics.CreateDynamicBuffer(ref material, Unsafe.SizeOf <MaterialStructBuffer>()); render.MaterialBuffer.Set(buff); } } if (hasTexture && texture.IsModified) { render.TextureResources.Set(ConvertToResources(texture, graphics.TexturedLoader)); render.SampleState.Set(graphics.CreateSampler(texture.SampleDescription)); texture.IsModified = false; } { graphics.ClearAllShader(); context.VertexShader.Set(vertexShader.Get()); if (en.Contains <FlatShadingGeometryComponent>()) { context.GeometryShader.Set(flatShadingGS.Get()); } context.PixelShader.Set(pixelShader.Get()); context.VertexShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, game.Game); context.VertexShader.SetConstantBuffer(TransforStructBuffer.RegisterResourceSlot, render.TransformWorldBuffer.Get()); context.PixelShader.SetConstantBuffer(GameStructBuffer.RegisterResourceSlot, game.Game); context.PixelShader.SetConstantBuffer(LightStructBuffer.RegisterResourceSlot, game.Lights); if (render.MaterialBuffer.HasValue) { context.PixelShader.SetConstantBuffer(MaterialStructBuffer.RegisterResourceSlot, render.MaterialBuffer.Get()); } if (render.TextureResources.HasValue && render.SampleState.HasValue) { context.PixelShader.SetShaderResources(0, render.TextureResources.Get()); context.PixelShader.SetSampler(0, render.SampleState.Get()); } } context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(render.VertexBuffer.Get(), layconst.VertexSize, 0)); context.InputAssembler.SetIndexBuffer(render.IndexBuffer.Get(), SharpDX.DXGI.Format.R32_UInt, 0); context.InputAssembler.InputLayout = inputLayout.Get(); context.InputAssembler.PrimitiveTopology = renderable.PrimitiveTopology; context.OutputMerger.SetDepthStencilState(render.DepthStencilState.Get(), 0); context.OutputMerger.SetBlendState(render.BlendingState.Get(), new SharpDX.Mathematics.Interop.RawColor4(0, 0, 0, 0), -1); using (var rasterizerState = graphics.CreateRasterizerState(renderable.RasterizerStateDescription)) { context.Rasterizer.State = rasterizerState; graphics.ImmediateContext.DrawIndexed(geo.Indices.Length, 0, 0); } }
protected static void SetShaders(DeviceContext context, D3DRenderComponent render) { context.VertexShader.Set(render.VertexShader.Get()); context.GeometryShader.Set(render.GeometryShader.Get()); context.PixelShader.Set(render.PixelShader.Get()); }