add TileMap and Chunk renderers
This commit is contained in:
parent
03c7a83471
commit
cb60306944
|
@ -205,6 +205,8 @@
|
|||
<Compile Include="TileMap\TileChunk.cs" />
|
||||
<Compile Include="TileMap\ChunkVertexGenerator.cs" />
|
||||
<Compile Include="TileMap\Lighting\ITileMapLighter.cs" />
|
||||
<Compile Include="TileMap\TileMapRenderer.cs" />
|
||||
<Compile Include="TileMap\ChunkRenderer.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
|
||||
<ItemGroup>
|
||||
|
|
44
Blarg.GameFramework/TileMap/ChunkRenderer.cs
Normal file
44
Blarg.GameFramework/TileMap/ChunkRenderer.cs
Normal file
|
@ -0,0 +1,44 @@
|
|||
using System;
|
||||
using Blarg.GameFramework.Graphics;
|
||||
|
||||
namespace Blarg.GameFramework.TileMap
|
||||
{
|
||||
public class ChunkRenderer
|
||||
{
|
||||
RenderState _renderState = RenderState.Default;
|
||||
BlendState _defaultBlendState = BlendState.Default;
|
||||
BlendState _alphaBlendState = BlendState.AlphaBlend;
|
||||
|
||||
public void Render(TileChunk chunk)
|
||||
{
|
||||
if (chunk.Mesh == null)
|
||||
return;
|
||||
|
||||
var texture = chunk.TileMap.TileMeshes.Atlas.Texture;
|
||||
|
||||
_renderState.Apply(Framework.GraphicsDevice);
|
||||
_defaultBlendState.Apply(Framework.GraphicsDevice);
|
||||
Framework.GraphicsDevice.BindTexture(texture);
|
||||
Framework.GraphicsDevice.BindVertexBuffer(chunk.Mesh);
|
||||
Framework.GraphicsDevice.RenderTriangles();
|
||||
Framework.GraphicsDevice.UnbindVertexBuffer();
|
||||
}
|
||||
|
||||
public void RenderAlpha(TileChunk chunk)
|
||||
{
|
||||
if (chunk.AlphaMesh == null)
|
||||
return;
|
||||
|
||||
var texture = chunk.TileMap.TileMeshes.Atlas.Texture;
|
||||
|
||||
_renderState.Apply(Framework.GraphicsDevice);
|
||||
_alphaBlendState.Apply(Framework.GraphicsDevice);
|
||||
Framework.GraphicsDevice.BindTexture(texture);
|
||||
Framework.GraphicsDevice.BindVertexBuffer(chunk.AlphaMesh);
|
||||
Framework.GraphicsDevice.RenderTriangles();
|
||||
Framework.GraphicsDevice.UnbindVertexBuffer();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
78
Blarg.GameFramework/TileMap/TileMapRenderer.cs
Normal file
78
Blarg.GameFramework/TileMap/TileMapRenderer.cs
Normal file
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using Blarg.GameFramework.Graphics;
|
||||
|
||||
namespace Blarg.GameFramework.TileMap
|
||||
{
|
||||
public class TileMapRenderer
|
||||
{
|
||||
ChunkRenderer _chunkRenderer = new ChunkRenderer();
|
||||
|
||||
public void Render(TileMap tileMap, Shader shader = null)
|
||||
{
|
||||
var graphicsDevice = Framework.GraphicsDevice;
|
||||
|
||||
if (shader == null)
|
||||
{
|
||||
graphicsDevice.BindShader(Framework.GraphicsDevice.SimpleColorTextureShader);
|
||||
graphicsDevice.SimpleColorTextureShader.SetModelViewMatrix(graphicsDevice.ViewContext.ModelViewMatrix);
|
||||
graphicsDevice.SimpleColorTextureShader.SetProjectionMatrix(graphicsDevice.ViewContext.ProjectionMatrix);
|
||||
}
|
||||
else
|
||||
{
|
||||
graphicsDevice.BindShader(shader);
|
||||
}
|
||||
|
||||
for (int y = 0; y < tileMap.HeightInChunks; ++y)
|
||||
{
|
||||
for (int z = 0; z < tileMap.DepthInChunks; ++z)
|
||||
{
|
||||
for (int x = 0; x < tileMap.WidthInChunks; ++x)
|
||||
{
|
||||
var chunk = tileMap.GetChunk(x, y, z);
|
||||
var bounds = chunk.Bounds;
|
||||
if (graphicsDevice.ViewContext.Camera.Frustum.Test(ref bounds))
|
||||
_chunkRenderer.Render(chunk);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
graphicsDevice.UnbindShader();
|
||||
}
|
||||
|
||||
public void RenderAlpha(TileMap tileMap, Shader shader = null)
|
||||
{
|
||||
var graphicsDevice = Framework.GraphicsDevice;
|
||||
|
||||
if (shader == null)
|
||||
{
|
||||
graphicsDevice.BindShader(Framework.GraphicsDevice.SimpleColorTextureShader);
|
||||
graphicsDevice.SimpleColorTextureShader.SetModelViewMatrix(graphicsDevice.ViewContext.ModelViewMatrix);
|
||||
graphicsDevice.SimpleColorTextureShader.SetProjectionMatrix(graphicsDevice.ViewContext.ProjectionMatrix);
|
||||
}
|
||||
else
|
||||
{
|
||||
graphicsDevice.BindShader(shader);
|
||||
}
|
||||
|
||||
for (int y = 0; y < tileMap.HeightInChunks; ++y)
|
||||
{
|
||||
for (int z = 0; z < tileMap.DepthInChunks; ++z)
|
||||
{
|
||||
for (int x = 0; x < tileMap.WidthInChunks; ++x)
|
||||
{
|
||||
var chunk = tileMap.GetChunk(x, y, z);
|
||||
if (chunk.AlphaMesh != null)
|
||||
{
|
||||
var bounds = chunk.Bounds;
|
||||
if (graphicsDevice.ViewContext.Camera.Frustum.Test(ref bounds))
|
||||
_chunkRenderer.Render(chunk);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
graphicsDevice.UnbindShader();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in a new issue