From f4b0ef450726ee1845a941c913b5773234fccd23 Mon Sep 17 00:00:00 2001 From: Daniel Walder Date: Sat, 21 Dec 2024 13:05:30 +1000 Subject: [PATCH] Fix incorrect loading of texture rotation and shift values for pre-2.2 RMF files Fixes #39 --- .../Formats/TestWorldcraftFormat.cs | 36 ++++++++++++++++-- .../Resources/rmf/test-cube-1.6.rmf | Bin 0 -> 1031 bytes .../Resources/rmf/test-cube-2.2.rmf | Bin 0 -> 2590 bytes .../Sledge.Formats.Map.Tests.csproj | 4 ++ .../Formats/WorldcraftRmfFormat.cs | 2 +- Sledge.Formats.Map/Sledge.Formats.Map.csproj | 4 +- 6 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 Sledge.Formats.Map.Tests/Resources/rmf/test-cube-1.6.rmf create mode 100644 Sledge.Formats.Map.Tests/Resources/rmf/test-cube-2.2.rmf diff --git a/Sledge.Formats.Map.Tests/Formats/TestWorldcraftFormat.cs b/Sledge.Formats.Map.Tests/Formats/TestWorldcraftFormat.cs index 5b363bb..6c067a7 100644 --- a/Sledge.Formats.Map.Tests/Formats/TestWorldcraftFormat.cs +++ b/Sledge.Formats.Map.Tests/Formats/TestWorldcraftFormat.cs @@ -1,10 +1,7 @@ -using System; -using System.IO; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using Sledge.Formats.Map.Formats; using Sledge.Formats.Map.Objects; -using Path = System.IO.Path; namespace Sledge.Formats.Map.Tests.Formats; @@ -37,4 +34,37 @@ public void TestRmf08Visgroups() var format = new WorldcraftRmfFormat(); var map = format.Read(file); } + + [TestMethod] + public void TestRmfQuakeToValveTextureConversion() + { + var format = new WorldcraftRmfFormat(); + + using var file16 = typeof(TestWorldcraftFormat).Assembly.GetManifestResourceStream($"Sledge.Formats.Map.Tests.Resources.rmf.test-cube-1.6.rmf"); + using var file22 = typeof(TestWorldcraftFormat).Assembly.GetManifestResourceStream($"Sledge.Formats.Map.Tests.Resources.rmf.test-cube-2.2.rmf"); + + var map16 = format.Read(file16); + var map22 = format.Read(file22); + + var solid16 = (Solid)map16.Worldspawn.Children[0]; + var solid22 = (Solid)map22.Worldspawn.Children[0]; + + foreach (var face22 in solid22.Faces) + { + var face16 = solid16.Faces.Single(x => x.Plane.Equals(face22.Plane)); + + Assert.AreEqual(face22.UAxis, face16.UAxis); + Assert.AreEqual(face22.VAxis, face16.VAxis); + Assert.AreEqual(face22.XScale, face16.XScale); + Assert.AreEqual(face22.YScale, face16.YScale); + Assert.AreEqual(face22.XShift, face16.XShift); + Assert.AreEqual(face22.YShift, face16.YShift); + Assert.AreEqual(face22.Rotation, face16.Rotation); + Assert.AreEqual(face22.ContentFlags, face16.ContentFlags); + Assert.AreEqual(face22.SurfaceFlags, face16.SurfaceFlags); + Assert.AreEqual(face22.Value, face16.Value); + Assert.AreEqual(face22.LightmapScale, face16.LightmapScale); + Assert.AreEqual(face22.SmoothingGroups, face16.SmoothingGroups); + } + } } \ No newline at end of file diff --git a/Sledge.Formats.Map.Tests/Resources/rmf/test-cube-1.6.rmf b/Sledge.Formats.Map.Tests/Resources/rmf/test-cube-1.6.rmf new file mode 100644 index 0000000000000000000000000000000000000000..fe40c88183dc7826e3639e7530ac61a4a5f3695b GIT binary patch literal 1031 zcmb_by9&ZU5L`hl^iQ<07Yx1vL8G98wO}Iz6SPPt_bJwXfu&*_OCd%6MQ^+;EKwBU z7LJ{po7~PWxm%JrQ{N>W)tAC-EmmatI_la{h>F<{&%R$ zp3WU2<+P4<2m12sBc-`Rm*{jgSz?@lN0wM>BsQ9VedYISPpaSx_ocZniBS_gIEkf3 zVxzI=i+e^5EIFf3zP{`2_(BcSr^&K^_Q)FeWemT-?|Qqwct)rtG1mt#vD8SMUhVnf po{@_fHF+))r}=;PuCK*-ySr!^Z@xaq{-o!P-3i^2QTw3-;wLL^!zKU# literal 0 HcmV?d00001 diff --git a/Sledge.Formats.Map.Tests/Resources/rmf/test-cube-2.2.rmf b/Sledge.Formats.Map.Tests/Resources/rmf/test-cube-2.2.rmf new file mode 100644 index 0000000000000000000000000000000000000000..3f46bf977a2318e621fde9baab1fd367546bb3e6 GIT binary patch literal 2590 zcmeH}F;4p_SRMzZa zt)9RI!G6z0vs5mheI*d7xFFAb$%QpCM;|@b>|w2*z(w<|GPijtdHI<^X20QLcOHH` zJR|G4{Ok{0Ho*lM>pj=X_um+q2fR#!7xbz>a4F}4-Wz|J7t7gZ1bfz&Kl-fM!#bY@ zE}Ppbtn=l2XVt$m#ecUfji)0UXsLNsA0}~@jpDl-S!XeCr{C_Kcl)xK KpB=vYh5iTkXW4lG literal 0 HcmV?d00001 diff --git a/Sledge.Formats.Map.Tests/Sledge.Formats.Map.Tests.csproj b/Sledge.Formats.Map.Tests/Sledge.Formats.Map.Tests.csproj index 290df2e..350ab67 100644 --- a/Sledge.Formats.Map.Tests/Sledge.Formats.Map.Tests.csproj +++ b/Sledge.Formats.Map.Tests/Sledge.Formats.Map.Tests.csproj @@ -19,6 +19,8 @@ + + @@ -33,6 +35,8 @@ + + diff --git a/Sledge.Formats.Map/Formats/WorldcraftRmfFormat.cs b/Sledge.Formats.Map/Formats/WorldcraftRmfFormat.cs index 0ce1c37..26289ae 100644 --- a/Sledge.Formats.Map/Formats/WorldcraftRmfFormat.cs +++ b/Sledge.Formats.Map/Formats/WorldcraftRmfFormat.cs @@ -293,9 +293,9 @@ private static Face ReadFace(RmfVersion version, BinaryReader br) if (version <= RmfVersion.Version18) { // We need to use quake editor logic to work out the texture axes, for that we need the plane data - see below + face.Rotation = br.ReadSingle(); face.XShift = br.ReadSingle(); face.YShift = br.ReadSingle(); - face.Rotation = br.ReadSingle(); } else // if (version == RmfVersion.Version22) { diff --git a/Sledge.Formats.Map/Sledge.Formats.Map.csproj b/Sledge.Formats.Map/Sledge.Formats.Map.csproj index f09fb2a..bde98f1 100644 --- a/Sledge.Formats.Map/Sledge.Formats.Map.csproj +++ b/Sledge.Formats.Map/Sledge.Formats.Map.csproj @@ -11,8 +11,8 @@ https://github.com/LogicAndTrick/sledge-formats Git half-life quake valve hammer worldcraft jackhammer jack rmf vmf map jmf - Add some basic factory classes to create known solid types - 1.2.3 + Fix incorrect loading of texture rotation and shift values for pre-2.2 RMF files + 1.2.4 full true