diff --git a/Source/Core/GZBuilder/md3/ModelReader.cs b/Source/Core/GZBuilder/md3/ModelReader.cs index bb0a708e..da21e529 100755 --- a/Source/Core/GZBuilder/md3/ModelReader.cs +++ b/Source/Core/GZBuilder/md3/ModelReader.cs @@ -12,6 +12,7 @@ using CodeImp.DoomBuilder.Data; using CodeImp.DoomBuilder.Rendering; using CodeImp.DoomBuilder.GZBuilder.Data; using CodeImp.DoomBuilder.Geometry; +using System.Linq; #endregion @@ -988,19 +989,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3 } //mesh - Mesh mesh = new Mesh(polyIndecesList.Count / 3, vertList.Count, MeshFlags.Use32Bit | MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, vertexElements); - - using(DataStream stream = mesh.VertexBuffer.Lock(LockFlags.None)) - { - stream.WriteRange(vertList.ToArray()); - } - mesh.VertexBuffer.Unlock(); - - using(DataStream stream = mesh.IndexBuffer.Lock(LockFlags.None)) - { - stream.WriteRange(polyIndecesList.ToArray()); - } - mesh.IndexBuffer.Unlock(); + Mesh mesh = new Mesh(vertexElements, vertList.ToArray(), polyIndecesList.ToArray()); //store in result result.Meshes.Add(mesh); @@ -1183,23 +1172,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3 mde.Model.Textures.Add(texture); // Create mesh - MeshFlags meshflags = MeshFlags.Managed; - if(indices.Count > ushort.MaxValue - 1) meshflags |= MeshFlags.Use32Bit; - - Mesh mesh = new Mesh(facescount, verts.Count, meshflags, vertexElements); - - DataStream mstream = mesh.VertexBuffer.Lock(LockFlags.None); - mstream.WriteRange(verts.ToArray()); - mesh.VertexBuffer.Unlock(); - - mstream = mesh.IndexBuffer.Lock(LockFlags.None); - - if(indices.Count > ushort.MaxValue - 1) - mstream.WriteRange(indices.ToArray()); - else - foreach(int index in indices) mstream.Write((ushort)index); - - mesh.IndexBuffer.Unlock(); + Mesh mesh = new Mesh(vertexElements, verts.ToArray(), indices.ToArray()); // Add mesh mde.Model.Meshes.Add(mesh); @@ -1718,19 +1691,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3 private static void CreateMesh(ref MD3LoadResult result, List verts, List indices) { //create mesh - Mesh mesh = new Mesh(indices.Count / 3, verts.Count, MeshFlags.Use32Bit | MeshFlags.IndexBufferManaged | MeshFlags.VertexBufferManaged, vertexElements); - - using (DataStream stream = mesh.VertexBuffer.Lock(LockFlags.None)) - { - stream.WriteRange(verts.ToArray()); - } - mesh.VertexBuffer.Unlock(); - - using(DataStream stream = mesh.IndexBuffer.Lock(LockFlags.None)) - { - stream.WriteRange(indices.ToArray()); - } - mesh.IndexBuffer.Unlock(); + Mesh mesh = new Mesh(vertexElements, verts.ToArray(), indices.ToArray()); //store in result result.Meshes.Add(mesh); diff --git a/Source/Core/Rendering/D3DDevice.cs b/Source/Core/Rendering/D3DDevice.cs index cb43d283..aeb874e3 100755 --- a/Source/Core/Rendering/D3DDevice.cs +++ b/Source/Core/Rendering/D3DDevice.cs @@ -30,10 +30,7 @@ namespace CodeImp.DoomBuilder.Rendering #region High level mesh rendering public class Mesh { - public Mesh(int indexCount, int vertexCount, MeshFlags flags, VertexElement[] elements) { } - - public VertexBuffer VertexBuffer { get; private set; } - public IndexBuffer IndexBuffer { get; private set; } + public Mesh(VertexElement[] vertexDecl, Array vertexData, Array indexData) { } public void DrawSubset(int index) { } @@ -81,33 +78,13 @@ namespace CodeImp.DoomBuilder.Rendering { public VertexBuffer(int sizeInBytes) { } - public DataStream Lock(LockFlags flags) { return null; } - public DataStream Lock(int offset, int size, LockFlags flags) { return null; } - public void Unlock() { } - - public object Tag { get; set; } + public void SetBufferData(Array data) { } + public void SetBufferSubdata(long destOffset, Array data) { } + public void SetBufferSubdata(long destOffset, Array data, long offset, long size) { } public bool Disposed { get; private set; } public void Dispose() { Disposed = true; } } - - public class IndexBuffer - { - public DataStream Lock(LockFlags flags) { return null; } - public void Unlock() { } - - public bool Disposed { get; private set; } - public void Dispose() { Disposed = true; } - } - - public class DataStream : IDisposable - { - public void Seek(long offset, System.IO.SeekOrigin origin) { } - public void Write(ushort v) { } - public void WriteRange(Array data) { } - public void WriteRange(Array data, long offset, long size) { } - public void Dispose() { } - } #endregion #region Textures @@ -188,8 +165,6 @@ namespace CodeImp.DoomBuilder.Rendering public enum SamplerState { AddressU, AddressV, AddressW } public enum TextureAddress { Wrap, Clamp } public enum Format { Unknown, A8R8G8B8 } - public enum LockFlags { None, Discard } - public enum MeshFlags { Use32Bit, IndexBufferManaged, VertexBufferManaged, Managed } public enum ShaderFlags { None, Debug } public enum PrimitiveType { LineList, TriangleList, TriangleStrip } public enum CubeMapFace { PositiveX, PositiveY, PositiveZ, NegativeX, NegativeY, NegativeZ } diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs index 7ce8af0a..89446a7d 100755 --- a/Source/Core/Rendering/Renderer2D.cs +++ b/Source/Core/Rendering/Renderer2D.cs @@ -391,11 +391,8 @@ namespace CodeImp.DoomBuilder.Rendering thingsvertices = new VertexBuffer(THING_BUFFER_SIZE * 12 * sizeof(FlatVertex)); // Make screen vertices - DataStream stream = screenverts.Lock(LockFlags.Discard); FlatVertex[] verts = CreateScreenVerts(structsize); - stream.WriteRange(verts); - screenverts.Unlock(); - stream.Dispose(); + screenverts.SetBufferData(verts); // Force update of view lastgridscale = -1f; @@ -1203,8 +1200,6 @@ namespace CodeImp.DoomBuilder.Rendering // Anything to render? if(things.Count > 0) { - DataStream stream; - // Make alpha color Color4 alphacolor = new Color4(alpha, 1.0f, 1.0f, 1.0f); bool isthingsmode = (General.Editing.Mode.GetType().Name == "ThingsMode"); @@ -1272,10 +1267,7 @@ namespace CodeImp.DoomBuilder.Rendering if(buffercount == locksize) { // Write to buffer - stream = thingsvertices.Lock(0, locksize * 6 * FlatVertex.Stride, LockFlags.Discard); - stream.WriteRange(verts, 0, buffercount * 6); - thingsvertices.Unlock(); - stream.Dispose(); + thingsvertices.SetBufferSubdata(0, verts, 0, buffercount * 6); // Draw! graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2); @@ -1287,10 +1279,7 @@ namespace CodeImp.DoomBuilder.Rendering } // Write to buffer - stream = thingsvertices.Lock(0, locksize * 6 * FlatVertex.Stride, LockFlags.Discard); - if(buffercount > 0) stream.WriteRange(verts, 0, buffercount * 6); - thingsvertices.Unlock(); - stream.Dispose(); + if(buffercount > 0) thingsvertices.SetBufferSubdata(0, verts, 0, buffercount * 6); // Draw what's still remaining if(buffercount > 0) @@ -1421,10 +1410,7 @@ namespace CodeImp.DoomBuilder.Rendering if(buffercount == locksize) { // Write to buffer - stream = thingsvertices.Lock(0, locksize * 6 * FlatVertex.Stride, LockFlags.Discard); - stream.WriteRange(verts, 0, buffercount * 6); - thingsvertices.Unlock(); - stream.Dispose(); + thingsvertices.SetBufferSubdata(0, verts, 0, buffercount * 6); // Draw! graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2); @@ -1437,10 +1423,7 @@ namespace CodeImp.DoomBuilder.Rendering } // Write to buffer - stream = thingsvertices.Lock(0, locksize * 6 * FlatVertex.Stride, LockFlags.Discard); - if(buffercount > 0) stream.WriteRange(verts, 0, buffercount * 6); - thingsvertices.Unlock(); - stream.Dispose(); + thingsvertices.SetBufferSubdata(0, verts, 0, buffercount * 6); // Draw what's still remaining if(buffercount > 0) graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2); @@ -1474,10 +1457,7 @@ namespace CodeImp.DoomBuilder.Rendering if(buffercount == locksize) { // Write to buffer - stream = thingsvertices.Lock(0, locksize * 6 * FlatVertex.Stride, LockFlags.Discard); - stream.WriteRange(verts, 0, buffercount * 6); - thingsvertices.Unlock(); - stream.Dispose(); + thingsvertices.SetBufferSubdata(0, verts, 0, buffercount * 6); // Draw! graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2); @@ -1489,10 +1469,7 @@ namespace CodeImp.DoomBuilder.Rendering } // Write to buffer - stream = thingsvertices.Lock(0, locksize * 6 * FlatVertex.Stride, LockFlags.Discard); - if(buffercount > 0) stream.WriteRange(verts, 0, buffercount * 6); - thingsvertices.Unlock(); - stream.Dispose(); + if(buffercount > 0) thingsvertices.SetBufferSubdata(0, verts, 0, buffercount * 6); // Draw what's still remaining if(buffercount > 0) @@ -1997,10 +1974,7 @@ namespace CodeImp.DoomBuilder.Rendering // Write to buffer VertexBuffer vb = new VertexBuffer(FlatVertex.Stride * verts.Length); - DataStream s = vb.Lock(LockFlags.Discard); - s.WriteRange(verts); - vb.Unlock(); - s.Dispose(); + vb.SetBufferData(verts); // Set renderstates for rendering graphics.SetRenderState(RenderState.CullMode, Cull.None); diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs index a76e7168..ce07a22a 100755 --- a/Source/Core/Rendering/Renderer3D.cs +++ b/Source/Core/Rendering/Renderer3D.cs @@ -720,10 +720,7 @@ namespace CodeImp.DoomBuilder.Rendering } VertexBuffer vb = new VertexBuffer(WorldVertex.Stride * verts.Length); - DataStream s = vb.Lock(LockFlags.Discard); - s.WriteRange(verts); - vb.Unlock(); - s.Dispose(); + vb.SetBufferData(verts); //begin rendering graphics.SetRenderState(RenderState.AlphaBlendEnable, true); diff --git a/Source/Core/Rendering/SurfaceManager.cs b/Source/Core/Rendering/SurfaceManager.cs index 49962c26..4cea80f6 100755 --- a/Source/Core/Rendering/SurfaceManager.cs +++ b/Source/Core/Rendering/SurfaceManager.cs @@ -142,22 +142,15 @@ namespace CodeImp.DoomBuilder.Rendering VertexBuffer b = new VertexBuffer(FlatVertex.Stride * set.Value.buffersizes[i]); // Start refilling the buffer with sector geometry - DataStream bstream = b.Lock(LockFlags.Discard); foreach(SurfaceEntry e in set.Value.entries) { if(e.bufferindex == i) { - // Fill buffer - bstream.Seek(e.vertexoffset * FlatVertex.Stride, SeekOrigin.Begin); - bstream.WriteRange(e.floorvertices); - bstream.WriteRange(e.ceilvertices); + b.SetBufferSubdata(e.vertexoffset * FlatVertex.Stride, e.floorvertices); + b.SetBufferSubdata((e.vertexoffset + e.floorvertices.Length) * FlatVertex.Stride, e.ceilvertices); } } - // Unlock buffer - b.Unlock(); - bstream.Dispose(); - // Add to list set.Value.buffers[i] = b; } @@ -246,7 +239,6 @@ namespace CodeImp.DoomBuilder.Rendering // This ensures there is enough space for a given number of free entries (also adds new bufers if needed) private void EnsureFreeBufferSpace(SurfaceBufferSet set, int freeentries) { - DataStream bstream = null; VertexBuffer vb = null; // Check if we have to add entries @@ -301,15 +293,6 @@ namespace CodeImp.DoomBuilder.Rendering // Reallocate a buffer else { - // Trash the old buffer - if(set.buffers[bufferindex].Tag != null) - { - bstream = (DataStream)set.buffers[bufferindex].Tag; - set.buffers[bufferindex].Unlock(); - bstream.Dispose(); - set.buffers[bufferindex].Tag = null; - } - if((set.buffers[bufferindex] != null) && !resourcesunloaded) set.buffers[bufferindex].Dispose(); @@ -331,7 +314,6 @@ namespace CodeImp.DoomBuilder.Rendering { // Make the new buffer and lock it vb = new VertexBuffer(FlatVertex.Stride * buffernumvertices); - bstream = vb.Lock(LockFlags.Discard); } // Start refilling the buffer with sector geometry @@ -340,9 +322,9 @@ namespace CodeImp.DoomBuilder.Rendering { if(!resourcesunloaded) { - // Fill buffer - bstream.WriteRange(e.floorvertices); - bstream.WriteRange(e.ceilvertices); + // Fill buffer + set.buffers[bufferindex].SetBufferSubdata(vertexoffset * FlatVertex.Stride, e.floorvertices); + set.buffers[bufferindex].SetBufferSubdata((vertexoffset + e.floorvertices.Length) * FlatVertex.Stride, e.ceilvertices); } // Set the new location in the buffer @@ -354,9 +336,6 @@ namespace CodeImp.DoomBuilder.Rendering if(!resourcesunloaded) { - // Unlock buffer - vb.Unlock(); - bstream.Dispose(); set.buffers[bufferindex] = vb; } else @@ -465,26 +444,9 @@ namespace CodeImp.DoomBuilder.Rendering if(!resourcesunloaded) { - // Lock the buffer - DataStream bstream; VertexBuffer vb = set.buffers[e.bufferindex]; - if(vb.Tag == null) - { - // Note: DirectX warns me that I am not using LockFlags.Discard or LockFlags.NoOverwrite here, - // but we don't have much of a choice since we want to update our data and not destroy other data - bstream = vb.Lock(0, set.buffersizes[e.bufferindex] * FlatVertex.Stride, LockFlags.None); - vb.Tag = bstream; - lockedbuffers.Add(vb); - } - else - { - bstream = (DataStream)vb.Tag; - } - - // Write the vertices to buffer - bstream.Seek(e.vertexoffset * FlatVertex.Stride, SeekOrigin.Begin); - bstream.WriteRange(e.floorvertices); - bstream.WriteRange(e.ceilvertices); + vb.SetBufferSubdata(e.vertexoffset * FlatVertex.Stride, e.floorvertices); + vb.SetBufferSubdata((e.vertexoffset + e.floorvertices.Length) * FlatVertex.Stride, e.ceilvertices); } } } @@ -511,17 +473,6 @@ namespace CodeImp.DoomBuilder.Rendering { if(!resourcesunloaded) { - foreach(VertexBuffer vb in lockedbuffers) - { - if(vb.Tag != null) - { - DataStream bstream = (DataStream)vb.Tag; - vb.Unlock(); - bstream.Dispose(); - vb.Tag = null; - } - } - // Clear list lockedbuffers = new List(); } diff --git a/Source/Core/Rendering/TextLabel.cs b/Source/Core/Rendering/TextLabel.cs index d71c1eb8..63eaafac 100755 --- a/Source/Core/Rendering/TextLabel.cs +++ b/Source/Core/Rendering/TextLabel.cs @@ -344,15 +344,8 @@ namespace CodeImp.DoomBuilder.Rendering textbuffer = new VertexBuffer(4 * FlatVertex.Stride); } - //mxd. Lock the buffer - using(DataStream stream = textbuffer.Lock(LockFlags.Discard)) - { - FlatQuad quad = new FlatQuad(PrimitiveType.TriangleStrip, beginx, beginy, beginx + texturesize.Width, beginy + texturesize.Height); - stream.WriteRange(quad.Vertices); - } - - // Done filling the vertex buffer - textbuffer.Unlock(); + FlatQuad quad = new FlatQuad(PrimitiveType.TriangleStrip, beginx, beginy, beginx + texturesize.Width, beginy + texturesize.Height); + textbuffer.SetBufferData(quad.Vertices); } else { diff --git a/Source/Core/Rendering/VisualVertexHandle.cs b/Source/Core/Rendering/VisualVertexHandle.cs index 01908a3a..39a2c6b0 100755 --- a/Source/Core/Rendering/VisualVertexHandle.cs +++ b/Source/Core/Rendering/VisualVertexHandle.cs @@ -85,8 +85,7 @@ namespace CodeImp.DoomBuilder.Rendering v3, v0 }; upper = new VertexBuffer(WorldVertex.Stride * vu.Length); - upper.Lock(LockFlags.None).WriteRange(vu); - upper.Unlock(); + upper.SetBufferData(vu); WorldVertex[] vl = new[]{ c, v4, c, v5, @@ -99,8 +98,7 @@ namespace CodeImp.DoomBuilder.Rendering v7, v4 }; lower = new VertexBuffer(WorldVertex.Stride * vl.Length); - lower.Lock(LockFlags.None).WriteRange(vl); - lower.Unlock(); + lower.SetBufferData(vl); } // This is called before a device is reset diff --git a/Source/Core/VisualModes/VisualSector.cs b/Source/Core/VisualModes/VisualSector.cs index 89d1e8f7..9c43b2e8 100755 --- a/Source/Core/VisualModes/VisualSector.cs +++ b/Source/Core/VisualModes/VisualSector.cs @@ -140,18 +140,15 @@ namespace CodeImp.DoomBuilder.VisualModes geobuffer = new VertexBuffer(WorldVertex.Stride * numverts); // Fill the buffer - DataStream bufferstream = geobuffer.Lock(LockFlags.Discard); foreach(VisualGeometry g in allgeometry) { if((g.Vertices != null) && (g.Vertices.Length > 0)) { - bufferstream.WriteRange(g.Vertices); + geobuffer.SetBufferSubdata(v * WorldVertex.Stride, g.Vertices); g.VertexOffset = v; v += g.Vertices.Length; } } - geobuffer.Unlock(); - bufferstream.Dispose(); } this.sector.UpdateFogColor(); //mxd diff --git a/Source/Core/VisualModes/VisualThing.cs b/Source/Core/VisualModes/VisualThing.cs index 822b6049..82971af6 100755 --- a/Source/Core/VisualModes/VisualThing.cs +++ b/Source/Core/VisualModes/VisualThing.cs @@ -527,11 +527,8 @@ namespace CodeImp.DoomBuilder.VisualModes // Make a new buffer geobuffers[i] = new VertexBuffer(WorldVertex.Stride * vertices[i].Length); - // Fill the buffer - DataStream bufferstream = geobuffers[i].Lock(LockFlags.Discard); - bufferstream.WriteRange(vertices[i]); - geobuffers[i].Unlock(); - bufferstream.Dispose(); + // Fill the buffer + geobuffers[i].SetBufferData(vertices[i]); } } @@ -616,8 +613,7 @@ namespace CodeImp.DoomBuilder.VisualModes WorldVertex[] cv = cageverts.ToArray(); cagelength = cv.Length / 2; cagebuffer = new VertexBuffer(WorldVertex.Stride * cv.Length); - cagebuffer.Lock(LockFlags.None).WriteRange(cv); - cagebuffer.Unlock(); + cagebuffer.SetBufferData(cv); // Done updatecage = false;