ZoneBuilder/Source/Core/Rendering/VisualVertexHandle.cs
2023-05-09 01:55:58 +02:00

120 lines
No EOL
3 KiB
C#

#region ================== Namespaces
using System;
using CodeImp.DoomBuilder.VisualModes;
using SlimDX.Direct3D9;
#endregion
namespace CodeImp.DoomBuilder.Rendering
{
internal sealed class VisualVertexHandle : IDisposable, ID3DResource
{
#region ================== Variables
private VertexBuffer upper;
private VertexBuffer lower;
private bool isdisposed;
#endregion
#region ================== Properties
public VertexBuffer Upper { get { return upper; } }
public VertexBuffer Lower { get { return lower; } }
#endregion
#region ================== Constructor / Disposer
public VisualVertexHandle()
{
// Create geometry
ReloadResource();
// Register as resource
General.Map.Graphics.RegisterResource(this);
}
public void Dispose()
{
// Not already disposed?
if(!isdisposed)
{
if(upper != null) upper.Dispose();
upper = null;
if(lower != null) lower.Dispose();
lower = null;
// Unregister resource
General.Map.Graphics.UnregisterResource(this);
// Done
isdisposed = true;
}
}
#endregion
#region ================== Methods
// This is called resets when the device is reset
// (when resized or display adapter was changed)
public void ReloadResource()
{
float radius = VisualVertex.DEFAULT_SIZE * General.Settings.GZVertexScale3D;
WorldVertex c = new WorldVertex();
WorldVertex v0 = new WorldVertex(-radius, -radius, -radius);
WorldVertex v1 = new WorldVertex(-radius, radius, -radius);
WorldVertex v2 = new WorldVertex(radius, radius, -radius);
WorldVertex v3 = new WorldVertex(radius, -radius, -radius);
WorldVertex v4 = new WorldVertex(-radius, -radius, radius);
WorldVertex v5 = new WorldVertex(-radius, radius, radius);
WorldVertex v6 = new WorldVertex(radius, radius, radius);
WorldVertex v7 = new WorldVertex(radius, -radius, radius);
WorldVertex[] vu = new []{ c, v0,
c, v1,
c, v2,
c, v3,
v0, v1,
v1, v2,
v2, v3,
v3, v0 };
upper = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * vu.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
upper.Lock(0, WorldVertex.Stride * vu.Length, LockFlags.None).WriteRange(vu);
upper.Unlock();
WorldVertex[] vl = new[]{ c, v4,
c, v5,
c, v6,
c, v7,
v4, v5,
v5, v6,
v6, v7,
v7, v4 };
lower = new VertexBuffer(General.Map.Graphics.Device, WorldVertex.Stride * vl.Length, Usage.WriteOnly | Usage.Dynamic, VertexFormat.None, Pool.Default);
lower.Lock(0, WorldVertex.Stride * vl.Length, LockFlags.None).WriteRange(vl);
lower.Unlock();
}
// This is called before a device is reset
// (when resized or display adapter was changed)
public void UnloadResource()
{
// Trash geometry buffers
if(upper != null) upper.Dispose();
upper = null;
if (lower != null) lower.Dispose();
lower = null;
}
#endregion
}
}