Skip to content

Commit

Permalink
Bin mesh rendering fix
Browse files Browse the repository at this point in the history
  • Loading branch information
NanoBob committed Mar 31, 2023
1 parent 54cc5e4 commit d20826c
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 20 deletions.
14 changes: 4 additions & 10 deletions RenderWarePreviewer/Helpers/AssetHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,29 +130,23 @@ public Dictionary<string, Image<Rgba32>> GetImages(Txd txd)
case "RGB32":
case "BGRA32":
{
var image = Image.LoadPixelData<Bgra32>(data, texture.Data.Width, texture.Data.Height);
using var image = Image.LoadPixelData<Bgra32>(data, texture.Data.Width, texture.Data.Height);
rgbaImage = image.CloneAs<Rgba32>();
image.Dispose();
break;
}
case "RGBA32":
{
var image = Image.LoadPixelData<Rgba32>(data, texture.Data.Width, texture.Data.Height);
rgbaImage = image;
rgbaImage = Image.LoadPixelData<Rgba32>(data, texture.Data.Width, texture.Data.Height);
break;
}
case "DXT1":
{
BcDecoder decoder = new();
Image<Rgba32> image = decoder.DecodeRawToImageRgba32(data, texture.Data.Width, texture.Data.Height, BCnEncoder.Shared.CompressionFormat.Bc1);
rgbaImage = image;
rgbaImage = new BcDecoder().DecodeRawToImageRgba32(data, texture.Data.Width, texture.Data.Height, BCnEncoder.Shared.CompressionFormat.Bc1);
break;
}
case "DXT3":
{
BcDecoder decoder = new();
Image<Rgba32> image = decoder.DecodeRawToImageRgba32(data, texture.Data.Width, texture.Data.Height, BCnEncoder.Shared.CompressionFormat.Bc3);
rgbaImage = image;
rgbaImage = new BcDecoder().DecodeRawToImageRgba32(data, texture.Data.Width, texture.Data.Height, BCnEncoder.Shared.CompressionFormat.Bc3);
break;
}
}
Expand Down
39 changes: 29 additions & 10 deletions RenderWarePreviewer/Helpers/MeshHelper.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
using RenderWareIo.Structs.Dff;
using RenderWareIo.Structs.Dff.Plugins;
using RenderWareIo.Structs.Ide;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
Expand Down Expand Up @@ -38,7 +34,7 @@ static MeshHelper()
}

public static IEnumerable<GeometryModel3D> GetModels(
Dff dff,
Dff dff,
Dictionary<string, SixLabors.ImageSharp.Image<Rgba32>> images,
bool useBinMeshPlugin = false)
{
Expand All @@ -57,10 +53,11 @@ public static IEnumerable<GeometryModel3D> GetModels(
var material = geometry.MaterialList.Materials[index];
var materialName = AssetHelper.SanitizeName(material.Texture.Name.Value);

var isStrip = (binMesh.Flags & 0x01) != 0;
if (images.ContainsKey(materialName))
models.Add(GetModel(GetMesh(geometry, strip), images[materialName]));
models.Add(GetModel(GetMesh(geometry, strip, isStrip), images[materialName]));
else
models.Add(GetModel(GetMesh(geometry, strip), MissingTexture));
models.Add(GetModel(GetMesh(geometry, strip, isStrip), MissingTexture));
}
}
else
Expand Down Expand Up @@ -169,7 +166,7 @@ public static DiffuseMaterial GetMaterial(System.Windows.Media.Color color)
return material;
}

public static MeshGeometry3D GetMesh(RenderWareIo.Structs.Dff.Geometry geometry, BinMeshStrip strip)
public static MeshGeometry3D GetMesh(RenderWareIo.Structs.Dff.Geometry geometry, BinMeshStrip strip, bool isStrip)
{
Dictionary<int, int> vertexTranslationMap = new();
Dictionary<int, int> reverseVertexTranslationMap = new();
Expand Down Expand Up @@ -197,8 +194,30 @@ public static MeshGeometry3D GetMesh(RenderWareIo.Structs.Dff.Geometry geometry,
mesh.TextureCoordinates.Add(new System.Windows.Point(uv.X, uv.Y));
}

foreach (var index in strip.Indices.Select(x => reverseVertexTranslationMap[(int)x]))
mesh.TriangleIndices.Add(index);
var indices = strip.Indices.Select(x => reverseVertexTranslationMap[(int)x]).ToArray();

if (isStrip)
{
for (var index = 2; index < indices.Length; index++)
{
if (index % 2 == 0)
{
mesh.TriangleIndices.Add(indices[index - 2]);
mesh.TriangleIndices.Add(indices[index - 1]);
mesh.TriangleIndices.Add(indices[index]);
}
else
{
mesh.TriangleIndices.Add(indices[index]);
mesh.TriangleIndices.Add(indices[index - 1]);
mesh.TriangleIndices.Add(indices[index - 2]);
}
}
} else
{
foreach (var index in indices)
mesh.TriangleIndices.Add(index);
}

//foreach (var normal in geometry.MorphTargets.SelectMany(y => y.Normals))
// mesh.Normals.Add(new Vector3D(normal.X, normal.Y, normal.Z));
Expand Down

0 comments on commit d20826c

Please sign in to comment.