0
0
Fork 0
mirror of https://git.do.srb2.org/STJr/UltimateZoneBuilder.git synced 2025-03-03 16:30:56 +00:00
UltimateZoneBuilder/Source/Core/Rendering/ShaderManager.cs

132 lines
3.4 KiB
C#
Raw Normal View History

#region ================== Copyright (c) 2007 Pascal vd Heiden
/*
* Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
* This program is released under GNU General Public License
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#endregion
#region ================== Namespaces
using System;
#endregion
namespace CodeImp.DoomBuilder.Rendering
{
2019-08-09 21:22:16 +00:00
internal class ShaderManager : IRenderResource, IDisposable
{
#region ================== Constants
#endregion
#region ================== Variables
// Shaders
2019-08-13 00:43:01 +00:00
private VertexDeclaration flatvertexdecl;
private Things2DShader things2dshader;
private World3DShader world3dshader;
// Device
2019-08-09 21:22:16 +00:00
private RenderDevice device;
// Disposing
private bool isdisposed;
#endregion
#region ================== Properties
2019-08-13 00:43:01 +00:00
public VertexDeclaration FlatVertexDecl { get { return flatvertexdecl; } }
public Things2DShader Things2D { get { return things2dshader; } }
public World3DShader World3D { get { return world3dshader; } }
public bool IsDisposed { get { return isdisposed; } }
2019-08-09 21:22:16 +00:00
internal RenderDevice D3DDevice { get { return device; } }
#endregion
#region ================== Constructor / Disposer
// Constructor
2019-08-09 21:22:16 +00:00
public ShaderManager(RenderDevice device)
{
// Initialize
this.device = device;
// Load
ReloadResource();
// Register as resource
device.RegisterResource(this);
// We have no destructor
GC.SuppressFinalize(this);
}
// Disposer
public void Dispose()
{
// Not already disposed?
if(!isdisposed)
{
// Clean up
UnloadResource();
// Unregister as resource
device.UnregisterResource(this);
// Done
device = null;
isdisposed = true;
}
}
#endregion
#region ================== Resources
// Clean up resources
public void UnloadResource()
{
2019-08-13 00:43:01 +00:00
flatvertexdecl.Dispose();
things2dshader.Dispose();
world3dshader.Dispose();
}
// Load resources
public void ReloadResource()
{
2019-08-13 00:43:01 +00:00
flatvertexdecl = new VertexDeclaration(new VertexElement[] {
new VertexElement(0, 0, DeclarationType.Float3, DeclarationUsage.Position),
new VertexElement(0, 12, DeclarationType.Color, DeclarationUsage.Color),
new VertexElement(0, 16, DeclarationType.Float2, DeclarationUsage.TextureCoordinate)
});
things2dshader = new Things2DShader(this);
world3dshader = new World3DShader(this);
}
2019-08-13 00:43:01 +00:00
#endregion
public void SetDisplay2DSettings(float texelx, float texely, float fsaafactor, float alpha, bool bilinear)
{
Vector4 values = new Vector4(texelx, texely, fsaafactor, alpha);
D3DDevice.SetUniform(Uniform.rendersettings, values);
Matrix world = D3DDevice.GetTransform(TransformState.World);
Matrix view = D3DDevice.GetTransform(TransformState.View);
D3DDevice.SetUniform(Uniform.transformsettings, world * view);
TextureFilter filter = (bilinear ? TextureFilter.Linear : TextureFilter.Point);
D3DDevice.SetUniform(Uniform.filtersettings, (int)filter);
}
}
}