private static void TransformWMO(MapObjectDefinition currentMODF, WMORoot currentWMO)
{
currentWMO.ClearCollisionData();
var position = currentMODF.Position;
var posX = (position.X - TerrainConstants.CenterPoint) * -1;
var posY = (position.Y - TerrainConstants.CenterPoint) * -1;
var origin = new Vector3(posX, posY, position.Z);
//origin = new Vector3(0.0f);
//DrawWMOPositionPoint(origin, currentWMO);
//DrawBoundingBox(currentMODF.Extents, Color.Purple, currentWMO);
//var rotateZ = Matrix.CreateRotationZ(0*RadiansPerDegree);
var rotateZ = Matrix.CreateRotationZ((currentMODF.OrientationB + 180) * RadiansPerDegree);
//var rotateX = Matrix.CreateRotationX(currentMODF.OrientationC * RadiansPerDegree);
//var rotateY = Matrix.CreateRotationY(currentMODF.OrientationA * RadiansPerDegree);
int offset;
foreach (var currentGroup in currentWMO.Groups)
{
if (currentGroup == null)
{
continue;
}
//if (!currentGroup.Header.HasMLIQ) continue;
var usedTris = new Dictionary <Index3, int>();
var wmoTrisUnique = new List <Index3>();
foreach (var node in currentGroup.BSPNodes)
{
if (node.TriIndices == null)
{
continue;
}
foreach (var index3 in node.TriIndices)
{
if (usedTris.ContainsKey(index3))
{
continue;
}
usedTris.Add(index3, 0);
wmoTrisUnique.Add(index3);
}
}
var newIndices = new Dictionary <int, int>();
foreach (var tri in wmoTrisUnique)
{
int newIndex;
if (!newIndices.TryGetValue(tri.Index0, out newIndex))
{
newIndex = currentWMO.WmoVertices.Count;
newIndices.Add(tri.Index0, newIndex);
var basePosVec = currentGroup.Vertices[tri.Index0];
var rotatedPosVec = Vector3.Transform(basePosVec, rotateZ);
var finalPosVector = rotatedPosVec + origin;
currentWMO.WmoVertices.Add(finalPosVector);
}
currentWMO.WmoIndices.Add(newIndex);
if (!newIndices.TryGetValue(tri.Index1, out newIndex))
{
newIndex = currentWMO.WmoVertices.Count;
newIndices.Add(tri.Index1, newIndex);
var basePosVec = currentGroup.Vertices[tri.Index1];
var rotatedPosVec = Vector3.Transform(basePosVec, rotateZ);
var finalPosVector = rotatedPosVec + origin;
currentWMO.WmoVertices.Add(finalPosVector);
}
currentWMO.WmoIndices.Add(newIndex);
if (!newIndices.TryGetValue(tri.Index2, out newIndex))
{
newIndex = currentWMO.WmoVertices.Count;
newIndices.Add(tri.Index2, newIndex);
var basePosVec = currentGroup.Vertices[tri.Index2];
var rotatedPosVec = Vector3.Transform(basePosVec, rotateZ);
var finalPosVector = rotatedPosVec + origin;
currentWMO.WmoVertices.Add(finalPosVector);
}
currentWMO.WmoIndices.Add(newIndex);
}
//for (var i = 0; i < currentGroup.Vertices.Count; i++)
//{
// var basePosVector = currentGroup.Vertices[i];
// var rotatedPosVector = Vector3.Transform(basePosVector, rotateZ);
// var finalPosVector = rotatedPosVector + origin;
// //var baseNormVector = currentGroup.Normals[i];
// //var rotatedNormVector = Vector3.Transform(baseNormVector, rotateZ);
// currentWMO.WmoVertices.Add(finalPosVector);
//}
//for (var index = 0; index < currentGroup.Indices.Count; index++)
//{
// currentWMO.WmoIndices.Add(currentGroup.Indices[index].Index0 + offset);
// currentWMO.WmoIndices.Add(currentGroup.Indices[index].Index1 + offset);
// currentWMO.WmoIndices.Add(currentGroup.Indices[index].Index2 + offset);
//}
// WMO Liquids
if (!currentGroup.Header.HasMLIQ)
{
continue;
}
var liqInfo = currentGroup.LiquidInfo;
var liqOrigin = liqInfo.BaseCoordinates;
offset = currentWMO.WmoVertices.Count;
for (var xStep = 0; xStep < liqInfo.XVertexCount; xStep++)
{
for (var yStep = 0; yStep < liqInfo.YVertexCount; yStep++)
{
var xPos = liqOrigin.X + xStep * TerrainConstants.UnitSize;
var yPos = liqOrigin.Y + yStep * TerrainConstants.UnitSize;
var zPosTop = liqInfo.HeightMapMax[xStep, yStep];
var liqVecTop = new Vector3(xPos, yPos, zPosTop);
var rotatedTop = Vector3.Transform(liqVecTop, rotateZ);
var vecTop = rotatedTop + origin;
currentWMO.WmoLiquidVertices.Add(vecTop);
}
}
for (var row = 0; row < liqInfo.XTileCount; row++)
{
for (var col = 0; col < liqInfo.YTileCount; col++)
{
if ((liqInfo.LiquidTileFlags[row, col] & 0x0F) == 0x0F)
{
continue;
}
var index = ((row + 1) * (liqInfo.YVertexCount) + col);
currentWMO.WmoLiquidIndices.Add(offset + index);
index = (row * (liqInfo.YVertexCount) + col);
currentWMO.WmoLiquidIndices.Add(offset + index);
index = (row * (liqInfo.YVertexCount) + col + 1);
currentWMO.WmoLiquidIndices.Add(offset + index);
index = ((row + 1) * (liqInfo.YVertexCount) + col + 1);
currentWMO.WmoLiquidIndices.Add(offset + index);
index = ((row + 1) * (liqInfo.YVertexCount) + col);
currentWMO.WmoLiquidIndices.Add(offset + index);
index = (row * (liqInfo.YVertexCount) + col + 1);
currentWMO.WmoLiquidIndices.Add(offset + index);
}
}
}
//Rotate the M2s to the new orientation
if (currentWMO.WMOM2s != null)
{
foreach (var currentM2 in currentWMO.WMOM2s)
{
offset = currentWMO.WmoVertices.Count;
for (var i = 0; i < currentM2.Vertices.Count; i++)
{
var basePosition = currentM2.Vertices[i];
var rotatedPosition = Vector3.Transform(basePosition, rotateZ);
var finalPosition = rotatedPosition + origin;
//var rotatedNormal = Vector3.Transform(basePosition, rotateZ);
currentWMO.WmoM2Vertices.Add(finalPosition);
}
foreach (var index in currentM2.Indices)
{
currentWMO.WmoM2Indices.Add(index + offset);
}
}
}
}