mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2025-02-17 01:22:18 +00:00
Fixed a crash when trying to load a model with more than 32767 vertices.
This commit is contained in:
parent
7a952a2e5e
commit
a9d6eb5ce2
2 changed files with 44 additions and 41 deletions
|
@ -12,13 +12,13 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
|
||||||
internal byte NUM_MESHES; //can't be greater than 255, can it?
|
internal byte NUM_MESHES; //can't be greater than 255, can it?
|
||||||
internal Vector3[] BoundingBox;
|
internal Vector3[] BoundingBox;
|
||||||
internal List<IndexBuffer> Indeces2D;
|
internal List<IndexBuffer> Indeces2D;
|
||||||
internal List<short> NumIndeces2D;
|
internal List<int> NumIndeces2D;
|
||||||
|
|
||||||
internal GZModel() {
|
internal GZModel() {
|
||||||
Meshes = new List<Mesh>();
|
Meshes = new List<Mesh>();
|
||||||
Textures = new List<Texture>();
|
Textures = new List<Texture>();
|
||||||
Indeces2D = new List<IndexBuffer>();
|
Indeces2D = new List<IndexBuffer>();
|
||||||
NumIndeces2D = new List<short>();
|
NumIndeces2D = new List<int>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
|
||||||
if (s.Position != ofsSurfaces + start)
|
if (s.Position != ofsSurfaces + start)
|
||||||
s.Position = ofsSurfaces + start;
|
s.Position = ofsSurfaces + start;
|
||||||
|
|
||||||
List<short> polyIndecesList = new List<short>();
|
List<int> polyIndecesList = new List<int>();
|
||||||
List<WorldVertex> vertList = new List<WorldVertex>();
|
List<WorldVertex> vertList = new List<WorldVertex>();
|
||||||
|
|
||||||
string error = "";
|
string error = "";
|
||||||
|
@ -128,35 +128,36 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
|
||||||
}
|
}
|
||||||
|
|
||||||
//indeces for rendering current mesh in 2d
|
//indeces for rendering current mesh in 2d
|
||||||
short[] indeces2d_arr = CreateLineListIndeces(polyIndecesList);
|
int[] indeces2d_arr = CreateLineListIndeces(polyIndecesList);
|
||||||
|
|
||||||
//mesh
|
//mesh
|
||||||
Mesh mesh = new Mesh(D3DDevice, polyIndecesList.Count / 3, vertList.Count, MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, General.Map.Graphics.Shaders.World3D.VertexElements);
|
Mesh mesh = new Mesh(D3DDevice, polyIndecesList.Count / 3, vertList.Count, MeshFlags.Use32Bit | MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, General.Map.Graphics.Shaders.World3D.VertexElements);
|
||||||
|
|
||||||
DataStream stream = mesh.VertexBuffer.Lock(0, 0, LockFlags.None);
|
using (DataStream stream = mesh.LockVertexBuffer(LockFlags.None)) {
|
||||||
stream.WriteRange(vertList.ToArray());
|
stream.WriteRange(vertList.ToArray());
|
||||||
mesh.VertexBuffer.Unlock();
|
}
|
||||||
|
mesh.UnlockVertexBuffer();
|
||||||
|
|
||||||
stream = mesh.IndexBuffer.Lock(0, 0, LockFlags.None);
|
using (DataStream stream = mesh.LockIndexBuffer(LockFlags.None)) {
|
||||||
stream.WriteRange(polyIndecesList.ToArray());
|
stream.WriteRange(polyIndecesList.ToArray());
|
||||||
mesh.IndexBuffer.Unlock();
|
}
|
||||||
|
|
||||||
mesh.OptimizeInPlace(MeshOptimizeFlags.AttributeSort);
|
mesh.OptimizeInPlace(MeshOptimizeFlags.AttributeSort);
|
||||||
mde.Model.Meshes.Add(mesh);
|
mde.Model.Meshes.Add(mesh);
|
||||||
|
|
||||||
//2d data
|
//2d data
|
||||||
IndexBuffer indeces2d = new IndexBuffer(D3DDevice, 2 * indeces2d_arr.Length, Usage.WriteOnly, Pool.Managed, true);
|
IndexBuffer indeces2d = new IndexBuffer(D3DDevice, 4 * indeces2d_arr.Length, Usage.WriteOnly, Pool.Managed, false);
|
||||||
stream = indeces2d.Lock(0, 0, LockFlags.None);
|
DataStream stream2d = indeces2d.Lock(0, 0, LockFlags.None);
|
||||||
stream.WriteRange(indeces2d_arr);
|
stream2d.WriteRange(indeces2d_arr);
|
||||||
indeces2d.Unlock();
|
indeces2d.Unlock();
|
||||||
|
|
||||||
mde.Model.Indeces2D.Add(indeces2d);
|
mde.Model.Indeces2D.Add(indeces2d);
|
||||||
mde.Model.NumIndeces2D.Add((short)polyIndecesList.Count);
|
mde.Model.NumIndeces2D.Add(polyIndecesList.Count);
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string ReadSurface(ref BoundingBoxSizes bbs, BinaryReader br, List<short> polyIndecesList, List<WorldVertex> vertList, ModeldefEntry mde) {
|
private static string ReadSurface(ref BoundingBoxSizes bbs, BinaryReader br, List<int> polyIndecesList, List<WorldVertex> vertList, ModeldefEntry mde) {
|
||||||
int vertexOffset = vertList.Count;
|
int vertexOffset = vertList.Count;
|
||||||
long start = br.BaseStream.Position;
|
long start = br.BaseStream.Position;
|
||||||
string magic = ReadString(br, 4);
|
string magic = ReadString(br, 4);
|
||||||
|
@ -177,7 +178,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
|
||||||
br.BaseStream.Position = start + ofsTriangles;
|
br.BaseStream.Position = start + ofsTriangles;
|
||||||
|
|
||||||
for (int i = 0; i < numTriangles * 3; i++)
|
for (int i = 0; i < numTriangles * 3; i++)
|
||||||
polyIndecesList.Add( (short)(vertexOffset + br.ReadInt32()) );
|
polyIndecesList.Add( vertexOffset + br.ReadInt32() );
|
||||||
|
|
||||||
|
|
||||||
//Vertices
|
//Vertices
|
||||||
|
@ -289,8 +290,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
|
||||||
int ofs_tris = br.ReadInt32(); //Offset to triangles
|
int ofs_tris = br.ReadInt32(); //Offset to triangles
|
||||||
int ofs_animFrame = br.ReadInt32(); //An offset to the first animation frame
|
int ofs_animFrame = br.ReadInt32(); //An offset to the first animation frame
|
||||||
|
|
||||||
List<short> polyIndecesList = new List<short>();
|
List<int> polyIndecesList = new List<int>();
|
||||||
List<short> uvIndecesList = new List<short>();
|
List<int> uvIndecesList = new List<int>();
|
||||||
List<Vector2> uvCoordsList = new List<Vector2>();
|
List<Vector2> uvCoordsList = new List<Vector2>();
|
||||||
List<WorldVertex> vertList = new List<WorldVertex>();
|
List<WorldVertex> vertList = new List<WorldVertex>();
|
||||||
|
|
||||||
|
@ -299,13 +300,13 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
|
||||||
s.Position = ofs_tris + start;
|
s.Position = ofs_tris + start;
|
||||||
|
|
||||||
for (int i = 0; i < num_tris; i++) {
|
for (int i = 0; i < num_tris; i++) {
|
||||||
polyIndecesList.Add((short)br.ReadInt16());
|
polyIndecesList.Add((int)br.ReadInt16());
|
||||||
polyIndecesList.Add((short)br.ReadInt16());
|
polyIndecesList.Add((int)br.ReadInt16());
|
||||||
polyIndecesList.Add((short)br.ReadInt16());
|
polyIndecesList.Add((int)br.ReadInt16());
|
||||||
|
|
||||||
uvIndecesList.Add((short)br.ReadInt16());
|
uvIndecesList.Add((int)br.ReadInt16());
|
||||||
uvIndecesList.Add((short)br.ReadInt16());
|
uvIndecesList.Add((int)br.ReadInt16());
|
||||||
uvIndecesList.Add((short)br.ReadInt16());
|
uvIndecesList.Add((int)br.ReadInt16());
|
||||||
}
|
}
|
||||||
|
|
||||||
//UV coords
|
//UV coords
|
||||||
|
@ -392,39 +393,41 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
|
||||||
}
|
}
|
||||||
|
|
||||||
//indeces for rendering current mesh in 2d
|
//indeces for rendering current mesh in 2d
|
||||||
short[] indeces2d_arr = CreateLineListIndeces(polyIndecesList);
|
int[] indeces2d_arr = CreateLineListIndeces(polyIndecesList);
|
||||||
|
|
||||||
//mesh
|
//mesh
|
||||||
Mesh mesh = new Mesh(D3DDevice, polyIndecesList.Count / 3, vertList.Count, MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, General.Map.Graphics.Shaders.World3D.VertexElements);
|
Mesh mesh = new Mesh(D3DDevice, polyIndecesList.Count / 3, vertList.Count, MeshFlags.Use32Bit | MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, General.Map.Graphics.Shaders.World3D.VertexElements);
|
||||||
|
|
||||||
DataStream stream = mesh.VertexBuffer.Lock(0, 0, LockFlags.None);
|
using (DataStream stream = mesh.LockVertexBuffer(LockFlags.None)) {
|
||||||
stream.WriteRange(vertList.ToArray());
|
stream.WriteRange(vertList.ToArray());
|
||||||
mesh.VertexBuffer.Unlock();
|
}
|
||||||
|
mesh.UnlockVertexBuffer();
|
||||||
|
|
||||||
stream = mesh.IndexBuffer.Lock(0, 0, LockFlags.None);
|
using (DataStream stream = mesh.LockIndexBuffer(LockFlags.None)) {
|
||||||
stream.WriteRange(polyIndecesList.ToArray());
|
stream.WriteRange(polyIndecesList.ToArray());
|
||||||
mesh.IndexBuffer.Unlock();
|
}
|
||||||
|
mesh.UnlockIndexBuffer();
|
||||||
|
|
||||||
mesh.OptimizeInPlace(MeshOptimizeFlags.AttributeSort);
|
mesh.OptimizeInPlace(MeshOptimizeFlags.AttributeSort);
|
||||||
mde.Model.Meshes.Add(mesh);
|
mde.Model.Meshes.Add(mesh);
|
||||||
|
|
||||||
//2d data
|
//2d data
|
||||||
IndexBuffer indeces2d = new IndexBuffer(D3DDevice, 2 * indeces2d_arr.Length, Usage.WriteOnly, Pool.Managed, true);
|
IndexBuffer indeces2d = new IndexBuffer(D3DDevice, 4 * indeces2d_arr.Length, Usage.WriteOnly, Pool.Managed, false);
|
||||||
stream = indeces2d.Lock(0, 0, LockFlags.None);
|
DataStream stream2d = indeces2d.Lock(0, 0, LockFlags.None);
|
||||||
stream.WriteRange(indeces2d_arr);
|
stream2d.WriteRange(indeces2d_arr);
|
||||||
indeces2d.Unlock();
|
indeces2d.Unlock();
|
||||||
|
|
||||||
mde.Model.Indeces2D.Add(indeces2d);
|
mde.Model.Indeces2D.Add(indeces2d);
|
||||||
mde.Model.NumIndeces2D.Add((short)polyIndecesList.Count);
|
mde.Model.NumIndeces2D.Add((int)polyIndecesList.Count);
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
//this creates list of vertex indeces for rendering using LineList method
|
//this creates list of vertex indeces for rendering using LineList method
|
||||||
private static short[] CreateLineListIndeces(List<short> polyIndecesList) {
|
private static int[] CreateLineListIndeces(List<int> polyIndecesList) {
|
||||||
short[] indeces2d_arr = new short[polyIndecesList.Count * 2];
|
int[] indeces2d_arr = new int[polyIndecesList.Count * 2];
|
||||||
short ind1, ind2, ind3;
|
int ind1, ind2, ind3;
|
||||||
for (short i = 0; i < polyIndecesList.Count; i += 3) {
|
for (int i = 0; i < polyIndecesList.Count; i += 3) {
|
||||||
ind1 = polyIndecesList[i];
|
ind1 = polyIndecesList[i];
|
||||||
ind2 = polyIndecesList[i + 1];
|
ind2 = polyIndecesList[i + 1];
|
||||||
ind3 = polyIndecesList[i + 2];
|
ind3 = polyIndecesList[i + 2];
|
||||||
|
|
Loading…
Reference in a new issue