From 750c1c48f4d16028012dd616b4503c00d3019f2d Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 16 May 2015 19:03:53 -0600 Subject: [PATCH] Add torch renderer Supports all torch orientations, but does not support the usual particles. --- TrueCraft.Client.Linux/Content/terrain.png | Bin 33830 -> 33945 bytes .../Rendering/Blocks/SnowRenderer.cs | 2 +- .../Rendering/Blocks/TorchRenderer.cs | 108 ++++++++++++++++++ .../TrueCraft.Client.Linux.csproj | 1 + TrueCraft.Core/Logic/Blocks/TorchBlock.cs | 2 + 5 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 TrueCraft.Client.Linux/Rendering/Blocks/TorchRenderer.cs diff --git a/TrueCraft.Client.Linux/Content/terrain.png b/TrueCraft.Client.Linux/Content/terrain.png index 8beba3e4f3f71a54e385d36763c3319f7599dd36..67efe47ba53abea18105b7c91de923d7db03d08b 100644 GIT binary patch delta 17413 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 delta 17297 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 QT>t<807*qoM6N<$g44PC!T textureMap, int indiciesOffset, out int[] indicies) + Tuple textureMap, int indiciesOffset, out int[] indicies) { var overhead = new Vector3(0.5f, 0.5f, 0.5f); var cube = CreateUniformCube(overhead, Texture, indiciesOffset, out indicies); diff --git a/TrueCraft.Client.Linux/Rendering/Blocks/TorchRenderer.cs b/TrueCraft.Client.Linux/Rendering/Blocks/TorchRenderer.cs new file mode 100644 index 0000000..b38f28d --- /dev/null +++ b/TrueCraft.Client.Linux/Rendering/Blocks/TorchRenderer.cs @@ -0,0 +1,108 @@ +using System; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; +using TrueCraft.Core.Logic.Blocks; +using TrueCraft.API.Logic; + +namespace TrueCraft.Client.Linux.Rendering.Blocks +{ + public class TorchRenderer : BlockRenderer + { + static TorchRenderer() + { + BlockRenderer.RegisterRenderer(TorchBlock.BlockID, new TorchRenderer()); + for (int i = 0; i < Texture.Length; i++) + Texture[i] /= 256f; + } + + private static Vector2 TextureMap = new Vector2(7, 85); // Note: this is in pixels (torch texture is not a full block) + private static Vector2[] Texture = + { + // Positive Z + TextureMap + new Vector2(2, 10), + TextureMap + new Vector2(0, 10), + TextureMap, + TextureMap + new Vector2(2, 0), + // Negative Z + TextureMap + new Vector2(2, 10), + TextureMap + new Vector2(0, 10), + TextureMap, + TextureMap + new Vector2(2, 0), + // Positive X + TextureMap + new Vector2(2, 10), + TextureMap + new Vector2(0, 10), + TextureMap, + TextureMap + new Vector2(2, 0), + // Negative X + TextureMap + new Vector2(2, 10), + TextureMap + new Vector2(0, 10), + TextureMap, + TextureMap + new Vector2(2, 0), + // Positive Y + TextureMap + new Vector2(2, 2), + TextureMap + new Vector2(0, 2), + TextureMap, + TextureMap + new Vector2(2, 0), + // Negative Y + TextureMap + new Vector2(0, 10), + TextureMap + new Vector2(0, 10), + TextureMap, + TextureMap + new Vector2(2, 0), + }; + + public override VertexPositionNormalTexture[] Render(BlockDescriptor descriptor, Vector3 offset, + Tuple textureMap, int indiciesOffset, out int[] indicies) + { + var overhead = new Vector3(0.5f, 0.5f, 0.5f); + var centerized = new Vector3(7f / 16f, 0, 7f / 16f); + var cube = CreateUniformCube(overhead, Texture, indiciesOffset, out indicies); + for (int i = 0; i < cube.Length; i++) + { + cube[i].Position.X *= 1f / 8f; + cube[i].Position.Z *= 1f / 8f; + if (cube[i].Position.Y > 0) + cube[i].Position.Y *= 5f / 8f; + switch ((TorchBlock.TorchDirection)descriptor.Metadata) + { + case TorchBlock.TorchDirection.West: + if (cube[i].Position.Y == 0) + cube[i].Position.X += 8f / 16f; + else + cube[i].Position.X += 3f / 16f; + cube[i].Position.Y += 5f / 16f; + break; + case TorchBlock.TorchDirection.East: + if (cube[i].Position.Y == 0) + cube[i].Position.X -= 8f / 16f; + else + cube[i].Position.X -= 3f / 16f; + cube[i].Position.Y += 5f / 16f; + break; + case TorchBlock.TorchDirection.North: + if (cube[i].Position.Y == 0) + cube[i].Position.Z += 8f / 16f; + else + cube[i].Position.Z += 3f / 16f; + cube[i].Position.Y += 5f / 16f; + break; + case TorchBlock.TorchDirection.South: + if (cube[i].Position.Y == 0) + cube[i].Position.Z -= 8f / 16f; + else + cube[i].Position.Z -= 3f / 16f; + cube[i].Position.Y += 5f / 16f; + break; + case TorchBlock.TorchDirection.Ground: + default: + // nop + break; + } + + cube[i].Position += offset; + cube[i].Position += centerized; + cube[i].Position -= overhead; + } + return cube; + } + } +} \ No newline at end of file diff --git a/TrueCraft.Client.Linux/TrueCraft.Client.Linux.csproj b/TrueCraft.Client.Linux/TrueCraft.Client.Linux.csproj index 0de8b30..a444170 100644 --- a/TrueCraft.Client.Linux/TrueCraft.Client.Linux.csproj +++ b/TrueCraft.Client.Linux/TrueCraft.Client.Linux.csproj @@ -86,6 +86,7 @@ + diff --git a/TrueCraft.Core/Logic/Blocks/TorchBlock.cs b/TrueCraft.Core/Logic/Blocks/TorchBlock.cs index 2e5c9bb..a0d1423 100644 --- a/TrueCraft.Core/Logic/Blocks/TorchBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/TorchBlock.cs @@ -30,6 +30,8 @@ namespace TrueCraft.Core.Logic.Blocks public override byte Luminance { get { return 13; } } public override bool Opaque { get { return false; } } + + public override bool RenderOpaque { get { return true; } } public override string DisplayName { get { return "Torch"; } }