Skip to content

Commit b9e2a62

Browse files
committed
Added special and additional ped models (for MTA), added support for multiple textures
1 parent 4bac806 commit b9e2a62

File tree

6 files changed

+120
-43
lines changed

6 files changed

+120
-43
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
namespace RenderWarePreviewer.Constants;
2+
3+
public class PedModelConstants
4+
{
5+
public static string[] Specials { get; } = new string[]
6+
{
7+
"N/A",
8+
"rose",
9+
"paul",
10+
"cesar",
11+
"ogloc",
12+
"wuzimu",
13+
"torino",
14+
"jizzy",
15+
"maddogg",
16+
"cat",
17+
"claude",
18+
};
19+
20+
public static string[] Additionals { get; } = new string[]
21+
{
22+
"ryder2",
23+
"ryder3",
24+
"emmet",
25+
"andre",
26+
"kendl",
27+
"jethro",
28+
"zero",
29+
"tbone",
30+
"sindaco",
31+
"janitor",
32+
"bbthin",
33+
"smokev",
34+
"psycho"
35+
};
36+
}

RenderWarePreviewer/Helpers/AssetHelper.cs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using RenderWareIo.Structs.Ide;
66
using RenderWareIo.Structs.Img;
77
using RenderWareIo.Structs.Txd;
8+
using RenderWarePreviewer.Constants;
89
using SixLabors.ImageSharp;
910
using SixLabors.ImageSharp.PixelFormats;
1011
using System.Collections.Generic;
@@ -116,10 +117,43 @@ public Dictionary<string, Image<Rgba32>> GetImages(Txd txd)
116117
public IEnumerable<Ped> GetSkins()
117118
{
118119
var ide = new IdeFile(Path.Join(this.gtaPath, "data", "peds.ide"));
119-
return ide.Ide.Peds.Where(x => x.Id > 0);
120+
return ide.Ide.Peds
121+
.Where(x => x.Id > 0)
122+
.Select(ReplaceSpecials)
123+
.Concat(GetAdditionalSkins());
120124
}
121125

122-
public string SanitizeName(string name)
126+
private Ped ReplaceSpecials(Ped ped)
127+
{
128+
if (ped.ModelName.StartsWith("special"))
129+
{
130+
var index = ped.ModelName[^2..];
131+
if (int.TryParse(index, out var value))
132+
{
133+
ped.ModelName = PedModelConstants.Specials[value];
134+
ped.TxdName = PedModelConstants.Specials[value];
135+
}
136+
}
137+
return ped;
138+
}
139+
140+
private IEnumerable<Ped> GetAdditionalSkins()
141+
{
142+
List<Ped> additionalPeds = new();
143+
144+
int i = 300;
145+
foreach (var additional in PedModelConstants.Additionals)
146+
additionalPeds.Add(new Ped()
147+
{
148+
Id = i++,
149+
TxdName = additional,
150+
ModelName = additional
151+
});
152+
153+
return additionalPeds;
154+
}
155+
156+
public static string SanitizeName(string name)
123157
{
124158
return name.Replace("_", "").Trim('\0').ToLower();
125159
}

RenderWarePreviewer/Helpers/MeshHelper.cs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,26 @@ public static class MeshHelper
1515
{
1616
private static Dictionary<string, MeshGeometry3D> pyramids = new();
1717

18-
public static GeometryModel3D GetModel(Dff dff, SixLabors.ImageSharp.Image<Rgba32>? image)
18+
public static IEnumerable<GeometryModel3D> GetModels(
19+
Dff dff,
20+
Dictionary<string, SixLabors.ImageSharp.Image<Rgba32>> images)
1921
{
20-
return GetModel(GetMesh(dff), image);
22+
var models = new List<GeometryModel3D>();
23+
foreach (var geometry in dff.Clump.GeometryList.Geometries)
24+
{
25+
var materialIndices = geometry.Triangles
26+
.Select(x => x.MaterialIndex)
27+
.Distinct();
28+
29+
foreach (var materialIndex in materialIndices)
30+
{
31+
var material = geometry.MaterialList.Materials[materialIndex];
32+
var materialName = AssetHelper.SanitizeName(material.Texture.Name.Value);
33+
models.Add(GetModel(GetMesh(geometry, materialIndex), images[materialName]));
34+
}
35+
}
36+
37+
return models;
2138
}
2239

2340
public static GeometryModel3D GetModel(MeshGeometry3D mesh, SixLabors.ImageSharp.Image<Rgba32>? image)
@@ -97,27 +114,27 @@ public static DiffuseMaterial GetMaterial(System.Windows.Media.Color color)
97114
return material;
98115
}
99116

100-
public static MeshGeometry3D GetMesh(Dff dff)
117+
public static MeshGeometry3D GetMesh(RenderWareIo.Structs.Dff.Geometry geometry, int materialIndex)
101118
{
102119
var mesh = new MeshGeometry3D();
103-
foreach (var vertex in dff.Clump.GeometryList.Geometries.SelectMany(x => x.MorphTargets.SelectMany(y => y.Vertices)))
120+
foreach (var vertex in geometry.MorphTargets.SelectMany(y => y.Vertices))
104121
{
105122
mesh.Positions.Add(new Point3D(vertex.X, vertex.Y, vertex.Z));
106123
}
107124

108-
foreach (var triangle in dff.Clump.GeometryList.Geometries.SelectMany(x => x.Triangles))
125+
foreach (var triangle in geometry.Triangles.Where(x => x.MaterialIndex == materialIndex))
109126
{
110127
mesh.TriangleIndices.Add(triangle.VertexIndexThree);
111128
mesh.TriangleIndices.Add(triangle.VertexIndexTwo);
112129
mesh.TriangleIndices.Add(triangle.VertexIndexOne);
113130
}
114131

115-
foreach (var normal in dff.Clump.GeometryList.Geometries.SelectMany(x => x.MorphTargets.SelectMany(y => y.Normals)))
132+
foreach (var normal in geometry.MorphTargets.SelectMany(y => y.Normals))
116133
{
117134
mesh.Normals.Add(new Vector3D(normal.X, normal.Y, normal.Z));
118135
}
119136

120-
foreach (var uv in dff.Clump.GeometryList.Geometries.SelectMany(x => x.TexCoords))
137+
foreach (var uv in geometry.TexCoords)
121138
{
122139
mesh.TextureCoordinates.Add(new Point(uv.X, uv.Y));
123140
}
@@ -131,7 +148,7 @@ private static BitmapSource GetBitMap(SixLabors.ImageSharp.Image<Rgba32> image)
131148
image.CopyPixelDataTo(span);
132149
var data = MemoryMarshal.AsBytes(span).ToArray();
133150
var bitmap = new RgbaBitmapSource(data, image.Width);
134-
//File.WriteAllBytes("output.rgba", data);
151+
//System.IO.File.WriteAllBytes("output.rgba", data);
135152

136153
return bitmap;
137154
}

RenderWarePreviewer/MainWindow.xaml.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ public partial class MainWindow : Window
2525

2626
private FileSystemWatcher? watcher;
2727

28+
private Ped SelectedPedModel => (Ped)(this.SkinComboBox.SelectedItem as ComboBoxItem)!.Tag;
29+
private string SelectedTexture => ((this.TextureComboBox.SelectedItem as ComboBoxItem)?.Tag as string) ?? "";
30+
2831
public MainWindow()
2932
{
3033
InitializeComponent();
@@ -141,19 +144,19 @@ private void SelectSkin(object sender, SelectionChangedEventArgs e)
141144
this.TextureComboBox.Items.Add(new ComboBoxItem() { Content = texture, Tag = texture.Trim('\0') });
142145

143146
this.TextureComboBox.SelectedIndex = 0;
144-
LoadSkin((Ped)(this.SkinComboBox.SelectedItem as ComboBoxItem)!.Tag, ((this.TextureComboBox.SelectedItem as ComboBoxItem)?.Tag as string) ?? "");
147+
LoadSkin(this.SelectedPedModel, this.SelectedTexture);
145148
}
146149

147150
private void SelectTexture(object sender, SelectionChangedEventArgs e)
148151
{
149-
LoadSkin((Ped)(this.SkinComboBox.SelectedItem as ComboBoxItem)!.Tag, ((this.TextureComboBox.SelectedItem as ComboBoxItem)?.Tag as string) ?? "");
152+
LoadSkin(this.SelectedPedModel, this.SelectedTexture);
150153
}
151154

152155
private void LoadSkin(Ped ped, string texture)
153156
{
154157
try
155158
{
156-
this.sceneManager.LoadModel(ped, texture);
159+
this.sceneManager.LoadModel(ped);
157160
this.sceneManager.ApplyTo(this.ViewPort);
158161
UpdateTexturePreview(ped, texture);
159162
}
@@ -186,8 +189,8 @@ private void UpdateTexturePreview(Ped ped, Image<Rgba32> image)
186189

187190
public void ExportImage(object sender, RoutedEventArgs e)
188191
{
189-
var ped = (Ped)(this.SkinComboBox.SelectedItem as ComboBoxItem)!.Tag;
190-
var texture = ((this.TextureComboBox.SelectedItem as ComboBoxItem)?.Tag as string) ?? "";
192+
var ped = this.SelectedPedModel;
193+
var texture = this.SelectedTexture;
191194

192195
var dialog = new System.Windows.Forms.SaveFileDialog()
193196
{
@@ -252,7 +255,7 @@ private void UpdatePedTexture(string file)
252255
{
253256
var image = SixLabors.ImageSharp.Image.Load<Rgba32>(file);
254257
var ped = (Ped)(this.SkinComboBox.SelectedItem as ComboBoxItem)!.Tag;
255-
this.sceneManager.LoadModel(ped, image);
258+
this.sceneManager.LoadModel(ped, image, this.SelectedTexture);
256259
this.sceneManager.ApplyTo(this.ViewPort);
257260

258261
UpdateTexturePreview(ped, image);

RenderWarePreviewer/Scenes/Scene.cs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
using RenderWareIo.Structs.Dff;
2-
using RenderWarePreviewer.Extensions;
1+
using RenderWarePreviewer.Extensions;
32
using RenderWarePreviewer.Helpers;
4-
using SixLabors.ImageSharp;
5-
using SixLabors.ImageSharp.PixelFormats;
63
using System.Numerics;
74
using System.Windows;
85
using System.Windows.Controls;
@@ -62,13 +59,6 @@ public void Clear()
6259
this.group.Children.Add(light);
6360
}
6461

65-
public void Add(Dff dff, Vector3D position, Image<Rgba32>? texture)
66-
{
67-
var model = MeshHelper.GetModel(dff, texture);
68-
model.Transform = new TranslateTransform3D(position);
69-
this.group.Children.Add(model);
70-
}
71-
7262
public void Add(GeometryModel3D model, Vector3D position, Vector3D rotation)
7363
{
7464
var group = new Transform3DGroup();
@@ -128,13 +118,6 @@ public void SetCameraRotation(Vector3 rotation)
128118

129119
Application.Current.Dispatcher.Invoke(DispatcherPriority.Input, () =>
130120
{
131-
//var oldPosition = this.cameraPosition;
132-
//this.cameraTransformGroup.Children.Clear();
133-
//this.cameraTransformGroup.Children.Add(new TranslateTransform3D((-oldPosition).ToVector3D()));
134-
//this.cameraTransformGroup.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(this.right, rotation.X)));
135-
//this.cameraTransformGroup.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(this.forward, rotation.Y)));
136-
//this.cameraTransformGroup.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(this.up, rotation.Z)));
137-
//this.cameraTransformGroup.Children.Add(new TranslateTransform3D(oldPosition.ToVector3D()));
138121
this.camera.LookDirection = this.CameraForward.ToVector3D();
139122
this.camera.UpDirection = this.CameraUp.ToVector3D();
140123
});

RenderWarePreviewer/Scenes/SceneManager.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,28 +59,32 @@ public IEnumerable<string> GetTextures(Ped ped)
5959
return txd.TextureContainer.Textures.Select(x => x.Data.TextureName);
6060
}
6161

62-
public void LoadModel(Ped ped, string texture)
62+
public void LoadModel(Ped ped)
6363
{
6464
var dff = this.assetHelper.GetDff(ped.ModelName);
6565
var txd = this.assetHelper.GetTxd(ped.TxdName);
6666

6767
var images = this.assetHelper.GetImages(txd);
6868

69-
var imageName = this.assetHelper.SanitizeName(texture);
70-
var image = images.ContainsKey(imageName) ? images[imageName] : images.Values.First();
71-
var model = MeshHelper.GetModel(dff, image);
69+
var models = MeshHelper.GetModels(dff, images);
7270

7371
this.scene.Clear();
74-
this.scene.Add(model, new Vector3D(0, 0, 0), new Vector3D(0, 90, 0));
72+
foreach (var model in models)
73+
this.scene.Add(model, new Vector3D(0, 0, 0), new Vector3D(0, 90, 0));
7574
}
7675

77-
public void LoadModel(Ped ped, Image<Rgba32> image)
76+
public void LoadModel(Ped ped, Image<Rgba32> image, string imageName)
7877
{
7978
var dff = this.assetHelper.GetDff(ped.ModelName);
80-
var model = MeshHelper.GetModel(dff, image);
79+
var txd = this.assetHelper.GetTxd(ped.TxdName);
80+
81+
var images = this.assetHelper.GetImages(txd);
82+
images[imageName] = image;
83+
var models = MeshHelper.GetModels(dff, images);
8184

8285
this.scene.Clear();
83-
this.scene.Add(model, new Vector3D(0, 0, 0), new Vector3D(0, 90, 0));
86+
foreach (var model in models)
87+
this.scene.Add(model, new Vector3D(0, 0, 0), new Vector3D(0, 90, 0));
8488
}
8589

8690
public Image<Rgba32> GetImage(Ped ped, string texture)
@@ -89,7 +93,7 @@ public Image<Rgba32> GetImage(Ped ped, string texture)
8993

9094
var images = this.assetHelper.GetImages(txd);
9195

92-
var imageName = this.assetHelper.SanitizeName(texture);
96+
var imageName = AssetHelper.SanitizeName(texture);
9397
var image = images.ContainsKey(imageName) ? images[imageName] : images.Values.First();
9498
return image;
9599
}

0 commit comments

Comments
 (0)