diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index 5ed8d3d4bb..5aa44eec6f 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -439,6 +439,7 @@
+
diff --git a/OpenRA.Mods.RA/VoxelNormalsPalette.cs b/OpenRA.Mods.RA/VoxelNormalsPalette.cs
new file mode 100644
index 0000000000..4584b844f9
--- /dev/null
+++ b/OpenRA.Mods.RA/VoxelNormalsPalette.cs
@@ -0,0 +1,347 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using System;
+using OpenRA.FileFormats;
+using OpenRA.Traits;
+using OpenRA.Graphics;
+
+namespace OpenRA.Mods.RA
+{
+ public class VoxelNormalsPaletteInfo : ITraitInfo
+ {
+ public readonly string Name = "normals";
+ public readonly NormalType Type = NormalType.TiberianSun;
+
+ public object Create(ActorInitializer init) { return new VoxelNormalsPalette(this); }
+ }
+
+ public class VoxelNormalsPalette : IPalette
+ {
+ readonly VoxelNormalsPaletteInfo info;
+
+ public VoxelNormalsPalette(VoxelNormalsPaletteInfo info)
+ {
+ this.info = info;
+ }
+
+ public void InitPalette(WorldRenderer wr)
+ {
+ // Rotate vectors to expected orientation
+ // Voxel coordinates are x=forward, y=right, z=up
+ var channel = new int[] {2,1,0};
+ var n = info.Type == NormalType.RedAlert2 ? RA2Normals : TSNormals;
+
+ // Map normals into color range
+ // Introduces a maximum error of ~0.5%
+ var data = new uint[256];
+ for (var i = 0; i < n.Length / 3; i++)
+ {
+ data[i] = 0xFF000000;
+ for (int j = 0; j < 3; j++)
+ {
+ var t = (n[3*i + j] + 1) / 2;
+ data[i] |= (uint)((byte)(t*0xFF + 0.5) << (8*channel[j]));
+ }
+ }
+
+ wr.AddPalette(info.Name, new Palette(data), false);
+ }
+
+ // Normal vector tables from http://www.sleipnirstuff.com/forum/viewtopic.php?t=8048
+ static readonly float[] TSNormals =
+ {
+ 0.671214f, 0.198492f, -0.714194f,
+ 0.269643f, 0.584394f, -0.765360f,
+ -0.040546f, 0.096988f, -0.994459f,
+ -0.572428f, -0.091914f, -0.814787f,
+ -0.171401f, -0.572710f, -0.801639f,
+ 0.362557f, -0.302999f, -0.881331f,
+ 0.810347f, -0.348972f, -0.470698f,
+ 0.103962f, 0.938672f, -0.328767f,
+ -0.324047f, 0.587669f, -0.741376f,
+ -0.800865f, 0.340461f, -0.492647f,
+ -0.665498f, -0.590147f, -0.456989f,
+ 0.314767f, -0.803002f, -0.506073f,
+ 0.972629f, 0.151076f, -0.176550f,
+ 0.680291f, 0.684236f, -0.262727f,
+ -0.520079f, 0.827777f, -0.210483f,
+ -0.961644f, -0.179001f, -0.207847f,
+ -0.262714f, -0.937451f, -0.228401f,
+ 0.219707f, -0.971301f, 0.091125f,
+ 0.923808f, -0.229975f, 0.306087f,
+ -0.082489f, 0.970660f, 0.225866f,
+ -0.591798f, 0.696790f, 0.405289f,
+ -0.925296f, 0.366601f, 0.097111f,
+ -0.705051f, -0.687775f, 0.172828f,
+ 0.732400f, -0.680367f, -0.026305f,
+ 0.855162f, 0.374582f, 0.358311f,
+ 0.473006f, 0.836480f, 0.276705f,
+ -0.097617f, 0.654112f, 0.750072f,
+ -0.904124f, -0.153725f, 0.398658f,
+ -0.211916f, -0.858090f, 0.467732f,
+ 0.500227f, -0.674408f, 0.543091f,
+ 0.584539f, -0.110249f, 0.803841f,
+ 0.437373f, 0.454644f, 0.775889f,
+ -0.042441f, 0.083318f, 0.995619f,
+ -0.596251f, 0.220132f, 0.772028f,
+ -0.506455f, -0.396977f, 0.765449f,
+ 0.070569f, -0.478474f, 0.875262f
+ };
+
+ static readonly float[] RA2Normals =
+ {
+ 0.526578f, -0.359621f, -0.770317f,
+ 0.150482f, 0.435984f, 0.887284f,
+ 0.414195f, 0.738255f, -0.532374f,
+ 0.075152f, 0.916249f, -0.393498f,
+ -0.316149f, 0.930736f, -0.183793f,
+ -0.773819f, 0.623334f, -0.112510f,
+ -0.900842f, 0.428537f, -0.069568f,
+ -0.998942f, -0.010971f, 0.044665f,
+ -0.979761f, -0.157670f, -0.123324f,
+ -0.911274f, -0.362371f, -0.195620f,
+ -0.624069f, -0.720941f, -0.301301f,
+ -0.310173f, -0.809345f, -0.498752f,
+ 0.146613f, -0.815819f, -0.559414f,
+ -0.716516f, -0.694356f, -0.066888f,
+ 0.503972f, -0.114202f, -0.856137f,
+ 0.455491f, 0.872627f, -0.176211f,
+ -0.005010f, -0.114373f, -0.993425f,
+ -0.104675f, -0.327701f, -0.938965f,
+ 0.560412f, 0.752589f, -0.345756f,
+ -0.060576f, 0.821628f, -0.566796f,
+ -0.302341f, 0.797007f, -0.522847f,
+ -0.671543f, 0.670740f, -0.314863f,
+ -0.778401f, -0.128357f, 0.614505f,
+ -0.924050f, 0.278382f, -0.261985f,
+ -0.699773f, -0.550491f, -0.455278f,
+ -0.568248f, -0.517189f, -0.640008f,
+ 0.054098f, -0.932864f, -0.356143f,
+ 0.758382f, 0.572893f, -0.310888f,
+ 0.003620f, 0.305026f, -0.952337f,
+ -0.060850f, -0.986886f, -0.149511f,
+ 0.635230f, 0.045478f, -0.770983f,
+ 0.521705f, 0.241309f, -0.818287f,
+ 0.269404f, 0.635425f, -0.723641f,
+ 0.045676f, 0.672754f, -0.738455f,
+ -0.180511f, 0.674657f, -0.715719f,
+ -0.397131f, 0.636640f, -0.661042f,
+ -0.552004f, 0.472515f, -0.687038f,
+ -0.772170f, 0.083090f, -0.629960f,
+ -0.669819f, -0.119533f, -0.732840f,
+ -0.540455f, -0.318444f, -0.778782f,
+ -0.386135f, -0.522789f, -0.759994f,
+ -0.261466f, -0.688567f, -0.676395f,
+ -0.019412f, -0.696103f, -0.717680f,
+ 0.303569f, -0.481844f, -0.821993f,
+ 0.681939f, -0.195129f, -0.704900f,
+ -0.244889f, -0.116562f, -0.962519f,
+ 0.800759f, -0.022979f, -0.598546f,
+ -0.370275f, 0.095584f, -0.923991f,
+ -0.330671f, -0.326578f, -0.885440f,
+ -0.163220f, -0.527579f, -0.833679f,
+ 0.126390f, -0.313146f, -0.941257f,
+ 0.349548f, -0.272226f, -0.896498f,
+ 0.239918f, -0.085825f, -0.966992f,
+ 0.390845f, 0.081537f, -0.916838f,
+ 0.255267f, 0.268697f, -0.928785f,
+ 0.146245f, 0.480438f, -0.864749f,
+ -0.326016f, 0.478456f, -0.815349f,
+ -0.469682f, -0.112519f, -0.875636f,
+ 0.818440f, -0.258520f, -0.513151f,
+ -0.474318f, 0.292238f, -0.830433f,
+ 0.778943f, 0.395842f, -0.486371f,
+ 0.624094f, 0.393773f, -0.674870f,
+ 0.740886f, 0.203834f, -0.639953f,
+ 0.480217f, 0.565768f, -0.670297f,
+ 0.380930f, 0.424535f, -0.821378f,
+ -0.093422f, 0.501124f, -0.860318f,
+ -0.236485f, 0.296198f, -0.925387f,
+ -0.131531f, 0.093959f, -0.986849f,
+ -0.823562f, 0.295777f, -0.484006f,
+ 0.611066f, -0.624304f, -0.486664f,
+ 0.069496f, -0.520330f, -0.851133f,
+ 0.226522f, -0.664879f, -0.711775f,
+ 0.471308f, -0.568904f, -0.673957f,
+ 0.388425f, -0.742624f, -0.545560f,
+ 0.783675f, -0.480729f, -0.393385f,
+ 0.962394f, 0.135676f, -0.235349f,
+ 0.876607f, 0.172034f, -0.449406f,
+ 0.633405f, 0.589793f, -0.500941f,
+ 0.182276f, 0.800658f, -0.570721f,
+ 0.177003f, 0.764134f, 0.620297f,
+ -0.544016f, 0.675515f, -0.497721f,
+ -0.679297f, 0.286467f, -0.675642f,
+ -0.590391f, 0.091369f, -0.801929f,
+ -0.824360f, -0.133124f, -0.550189f,
+ -0.715794f, -0.334542f, -0.612961f,
+ 0.174286f, -0.892484f, 0.416049f,
+ -0.082528f, -0.837123f, -0.540753f,
+ 0.283331f, -0.880874f, -0.379189f,
+ 0.675134f, -0.426627f, -0.601817f,
+ 0.843720f, -0.512335f, -0.160156f,
+ 0.977304f, -0.098556f, -0.187520f,
+ 0.846295f, 0.522672f, -0.102947f,
+ 0.677141f, 0.721325f, -0.145501f,
+ 0.320965f, 0.870892f, -0.372194f,
+ -0.178978f, 0.911533f, -0.370236f,
+ -0.447169f, 0.826701f, -0.341474f,
+ -0.703203f, 0.496328f, -0.509081f,
+ -0.977181f, 0.063563f, -0.202674f,
+ -0.878170f, -0.412938f, 0.241455f,
+ -0.835831f, -0.358550f, -0.415728f,
+ -0.499174f, -0.693433f, -0.519592f,
+ -0.188789f, -0.923753f, -0.333225f,
+ 0.192254f, -0.969361f, -0.152896f,
+ 0.515940f, -0.783907f, -0.345392f,
+ 0.905925f, -0.300952f, -0.297871f,
+ 0.991112f, -0.127746f, 0.037107f,
+ 0.995135f, 0.098424f, -0.004383f,
+ 0.760123f, 0.646277f, 0.067367f,
+ 0.205221f, 0.959580f, -0.192591f,
+ -0.042750f, 0.979513f, -0.196791f,
+ -0.438017f, 0.898927f, 0.008492f,
+ -0.821994f, 0.480785f, -0.305239f,
+ -0.899917f, 0.081710f, -0.428337f,
+ -0.926612f, -0.144618f, -0.347096f,
+ -0.793660f, -0.557792f, -0.242839f,
+ -0.431350f, -0.847779f, -0.308558f,
+ -0.005492f, -0.965000f, 0.262193f,
+ 0.587905f, -0.804026f, -0.088940f,
+ 0.699493f, -0.667686f, -0.254765f,
+ 0.889303f, 0.359795f, -0.282291f,
+ 0.780972f, 0.197037f, 0.592672f,
+ 0.520121f, 0.506696f, 0.687557f,
+ 0.403895f, 0.693961f, 0.596060f,
+ -0.154983f, 0.899236f, 0.409090f,
+ -0.657338f, 0.537168f, 0.528543f,
+ -0.746195f, 0.334091f, 0.575827f,
+ -0.624952f, -0.049144f, 0.779115f,
+ 0.318141f, -0.254715f, 0.913185f,
+ -0.555897f, 0.405294f, 0.725752f,
+ -0.794434f, 0.099406f, 0.599160f,
+ -0.640361f, -0.689463f, 0.338495f,
+ -0.126713f, -0.734095f, 0.667120f,
+ 0.105457f, -0.780817f, 0.615795f,
+ 0.407993f, -0.480916f, 0.776055f,
+ 0.695136f, -0.545120f, 0.468647f,
+ 0.973191f, -0.006489f, 0.229908f,
+ 0.946894f, 0.317509f, -0.050799f,
+ 0.563583f, 0.825612f, 0.027183f,
+ 0.325773f, 0.945423f, 0.006949f,
+ -0.171821f, 0.985097f, -0.007815f,
+ -0.670441f, 0.739939f, 0.054769f,
+ -0.822981f, 0.554962f, 0.121322f,
+ -0.966193f, 0.117857f, 0.229307f,
+ -0.953769f, -0.294704f, 0.058945f,
+ -0.864387f, -0.502728f, -0.010015f,
+ -0.530609f, -0.842006f, -0.097366f,
+ -0.162618f, -0.984075f, 0.071772f,
+ 0.081447f, -0.996011f, 0.036439f,
+ 0.745984f, -0.665963f, 0.000762f,
+ 0.942057f, -0.329269f, -0.064106f,
+ 0.939702f, -0.281090f, 0.194803f,
+ 0.771214f, 0.550670f, 0.319363f,
+ 0.641348f, 0.730690f, 0.234021f,
+ 0.080682f, 0.996691f, 0.009879f,
+ -0.046725f, 0.976643f, 0.209725f,
+ -0.531076f, 0.821001f, 0.209562f,
+ -0.695815f, 0.655990f, 0.292435f,
+ -0.976122f, 0.216709f, -0.014913f,
+ -0.961661f, -0.144129f, 0.233314f,
+ -0.772084f, -0.613647f, 0.165299f,
+ -0.449600f, -0.836060f, 0.314426f,
+ -0.392700f, -0.914616f, 0.096247f,
+ 0.390589f, -0.919470f, 0.044890f,
+ 0.582529f, -0.799198f, 0.148127f,
+ 0.866431f, -0.489812f, 0.096864f,
+ 0.904587f, 0.111498f, 0.411450f,
+ 0.953537f, 0.232330f, 0.191806f,
+ 0.497311f, 0.770803f, 0.398177f,
+ 0.194066f, 0.956320f, 0.218611f,
+ 0.422876f, 0.882276f, 0.206797f,
+ -0.373797f, 0.849566f, 0.372174f,
+ -0.534497f, 0.714023f, 0.452200f,
+ -0.881827f, 0.237160f, 0.407598f,
+ -0.904948f, -0.014069f, 0.425289f,
+ -0.751827f, -0.512817f, 0.414458f,
+ -0.501015f, -0.697917f, 0.511758f,
+ -0.235190f, -0.925923f, 0.295555f,
+ 0.228983f, -0.953940f, 0.193819f,
+ 0.734025f, -0.634898f, 0.241062f,
+ 0.913753f, -0.063253f, -0.401316f,
+ 0.905735f, -0.161487f, 0.391875f,
+ 0.858930f, 0.342446f, 0.380749f,
+ 0.624486f, 0.607581f, 0.490777f,
+ 0.289264f, 0.857479f, 0.425508f,
+ 0.069968f, 0.902169f, 0.425671f,
+ -0.286180f, 0.940700f, 0.182165f,
+ -0.574013f, 0.805119f, -0.149309f,
+ 0.111258f, 0.099718f, -0.988776f,
+ -0.305393f, -0.944228f, -0.123160f,
+ -0.601166f, -0.789576f, 0.123163f,
+ -0.290645f, -0.812140f, 0.505919f,
+ -0.064920f, -0.877163f, 0.475785f,
+ 0.408301f, -0.862216f, 0.299789f,
+ 0.566097f, -0.725566f, 0.391264f,
+ 0.839364f, -0.427387f, 0.335869f,
+ 0.818900f, -0.041305f, 0.572448f,
+ 0.719784f, 0.414997f, 0.556497f,
+ 0.881744f, 0.450270f, 0.140659f,
+ 0.401823f, -0.898220f, -0.178152f,
+ -0.054020f, 0.791344f, 0.608980f,
+ -0.293774f, 0.763994f, 0.574465f,
+ -0.450798f, 0.610347f, 0.651351f,
+ -0.638221f, 0.186694f, 0.746873f,
+ -0.872870f, -0.257127f, 0.414708f,
+ -0.587257f, -0.521710f, 0.618828f,
+ -0.353658f, -0.641974f, 0.680291f,
+ 0.041649f, -0.611273f, 0.790323f,
+ 0.348342f, -0.779183f, 0.521087f,
+ 0.499167f, -0.622441f, 0.602826f,
+ 0.790019f, -0.303831f, 0.532500f,
+ 0.660118f, 0.060733f, 0.748702f,
+ 0.604921f, 0.294161f, 0.739960f,
+ 0.385697f, 0.379346f, 0.841032f,
+ 0.239693f, 0.207876f, 0.948332f,
+ 0.012623f, 0.258532f, 0.965920f,
+ -0.100557f, 0.457147f, 0.883688f,
+ 0.046967f, 0.628588f, 0.776319f,
+ -0.430391f, -0.445405f, 0.785097f,
+ -0.434291f, -0.196228f, 0.879139f,
+ -0.256637f, -0.336867f, 0.905902f,
+ -0.131372f, -0.158910f, 0.978514f,
+ 0.102379f, -0.208767f, 0.972592f,
+ 0.195687f, -0.450129f, 0.871258f,
+ 0.627319f, -0.423148f, 0.653771f,
+ 0.687439f, -0.171583f, 0.705682f,
+ 0.275920f, -0.021255f, 0.960946f,
+ 0.459367f, 0.157466f, 0.874178f,
+ 0.285395f, 0.583184f, 0.760556f,
+ -0.812174f, 0.460303f, 0.358461f,
+ -0.189068f, 0.641223f, 0.743698f,
+ -0.338875f, 0.476480f, 0.811252f,
+ -0.920994f, 0.347186f, 0.176727f,
+ 0.040639f, 0.024465f, 0.998874f,
+ -0.739132f, -0.353747f, 0.573190f,
+ -0.603512f, -0.286615f, 0.744060f,
+ -0.188676f, -0.547059f, 0.815554f,
+ -0.026045f, -0.397820f, 0.917094f,
+ 0.267897f, -0.649041f, 0.712023f,
+ 0.518246f, -0.284891f, 0.806386f,
+ 0.493451f, -0.066533f, 0.867225f,
+ -0.328188f, 0.140251f, 0.934143f,
+ -0.328188f, 0.140251f, 0.934143f,
+ -0.328188f, 0.140251f, 0.934143f,
+ -0.328188f, 0.140251f, 0.934143f
+ };
+ }
+}