diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj
index bbf74aca..74c80cae 100644
--- a/Source/Core/Builder.csproj
+++ b/Source/Core/Builder.csproj
@@ -222,8 +222,6 @@
-
-
@@ -576,9 +574,7 @@
-
-
diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs
index 08e197d6..2f0027cf 100755
--- a/Source/Core/Data/DataManager.cs
+++ b/Source/Core/Data/DataManager.cs
@@ -3419,9 +3419,6 @@ namespace CodeImp.DoomBuilder.Data
skyimage = ResizeImage(skyimage, (int)Math.Round(skyimage.Width * scaler), (int)Math.Round(skyimage.Height * scaler));
}
- // Get Device and shader...
- World3DShader effect = General.Map.Graphics.Shaders.World3D;
-
// Make custom rendertarget
const int cubemaptexsize = 1024;
Texture rendertarget = new Texture(cubemaptexsize, cubemaptexsize);
@@ -3464,18 +3461,18 @@ namespace CodeImp.DoomBuilder.Data
Matrix mworld = Matrix.Multiply(Matrix.Identity, Matrix.Translation(offset) * Matrix.Scaling(1.0f, 1.0f, yscale));
Matrix mprojection = Matrix.PerspectiveFovLH(Angle2D.PIHALF, 1.0f, 0.5f, 100.0f);
- // Place camera at origin
- effect.CameraPosition = new Vector4();
+ // Place camera at origin
+ General.Map.Graphics.SetUniform(Uniform.campos, new Vector4());
- // Begin fullbright shaderpass
- effect.Begin();
- effect.BeginPass(1);
+ // Begin fullbright shaderpass
+ General.Map.Graphics.SetVertexDeclaration(General.Map.Graphics.Shaders.WorldVertexDecl);
+ General.Map.Graphics.SetShader(Shader.world3d_fullbright);
// Render to the six faces of the cube map
for(int i = 0; i < 6; i++)
{
Matrix faceview = GetCubeMapViewMatrix((CubeMapFace)i);
- effect.WorldViewProj = mworld * faceview * mprojection;
+ General.Map.Graphics.SetUniform(Uniform.worldviewproj, mworld * faceview * mprojection);
// Render the skysphere meshes
for(int j = 0; j < meshes.Meshes.Count; j++)
@@ -3483,25 +3480,20 @@ namespace CodeImp.DoomBuilder.Data
// Set appropriate texture
switch(meshes.Skins[j])
{
- case "top.png": effect.Texture1 = textop; break;
- case "bottom.png": effect.Texture1 = texbottom; break;
- case "side.png": effect.Texture1 = texside; break;
+ case "top.png": General.Map.Graphics.SetUniform(Uniform.texture1, textop); break;
+ case "bottom.png": General.Map.Graphics.SetUniform(Uniform.texture1, texbottom); break;
+ case "side.png": General.Map.Graphics.SetUniform(Uniform.texture1, texside); break;
default: throw new Exception("Unexpected skin!");
}
- // Commit changes
- effect.ApplySettings();
-
// Render mesh
- meshes.Meshes[j].DrawSubset(0);
+ meshes.Meshes[j].Draw(General.Map.Graphics);
}
General.Map.Graphics.CopyTexture(rendertarget, cubemap, (CubeMapFace)i);
}
// End rendering
- effect.EndPass();
- effect.End();
General.Map.Graphics.FinishRendering();
// Dispose unneeded stuff
diff --git a/Source/Core/Rendering/Effect.cs b/Source/Core/Rendering/Effect.cs
deleted file mode 100644
index 2645c69d..00000000
--- a/Source/Core/Rendering/Effect.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.IO;
-
-namespace CodeImp.DoomBuilder.Rendering
-{
- public enum ShaderFlags { None, Debug }
-
- public class Effect
- {
- public static Effect FromStream(Stream stream, ShaderFlags flags, out string errors)
- {
- errors = "";
- return new Effect();
- }
-
- public void SetTexture(EffectHandle handle, BaseTexture texture)
- {
- }
-
- public void SetValue(EffectHandle handle, T value) where T : struct
- {
- }
-
- public EffectHandle GetParameter(EffectHandle parameter, string name)
- {
- if (!Parameters.ContainsKey(name))
- {
- Parameters[name] = new EffectHandle();
- }
- return Parameters[name];
- }
-
- public void CommitChanges()
- {
- }
-
- public void Begin()
- {
- }
-
- public void BeginPass(int index)
- {
- }
-
- public void EndPass()
- {
- }
-
- public void End()
- {
- }
-
- public void Dispose()
- {
- }
-
- Dictionary Parameters = new Dictionary();
- }
-
- public class EffectHandle
- {
- public void Dispose()
- {
- }
- }
-}
diff --git a/Source/Core/Rendering/EffectShader.cs b/Source/Core/Rendering/EffectShader.cs
deleted file mode 100755
index 15ed41d2..00000000
--- a/Source/Core/Rendering/EffectShader.cs
+++ /dev/null
@@ -1,190 +0,0 @@
-
-#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;
-using System.IO;
-
-#endregion
-
-namespace CodeImp.DoomBuilder.Rendering
-{
- internal abstract class EffectShader : IDisposable
- {
- #region ================== Constants
-
- #endregion
-
- #region ================== Variables
-
- // The manager
- protected ShaderManager manager;
-
- // The effect
- protected Effect effect;
-
- // The vertex declaration
- protected VertexDeclaration vertexdecl;
-
- // Disposing
- protected bool isdisposed;
-
- //mxd. Settings changes
- protected bool settingschanged;
-
- #endregion
-
- #region ================== Properties
-
- // Disposing
- public bool IsDisposed { get { return isdisposed; } }
-
- #endregion
-
- #region ================== Constructor / Disposer
-
- // Constructor
- protected EffectShader(ShaderManager manager)
- {
- // Initialize
- this.manager = manager;
-
- // We have no destructor
- GC.SuppressFinalize(this);
- }
-
- // Disposer
- public virtual void Dispose()
- {
- // Not already disposed?
- if(!isdisposed)
- {
- // Clean up
- manager = null;
- if(effect != null) effect.Dispose();
- vertexdecl.Dispose();
-
- // Done
- isdisposed = true;
- }
- }
-
- #endregion
-
- #region ================== Methods
-
- // This loads an effect
- protected Effect LoadEffect(string fxfile)
- {
- Effect fx;
- string errors = string.Empty;
-
- // Load the resource
- Stream fxdata = General.ThisAssembly.GetManifestResourceStream("CodeImp.DoomBuilder.Resources." + fxfile);
- fxdata.Seek(0, SeekOrigin.Begin);
-
- try
- {
- // Compile effect
- fx = Effect.FromStream(fxdata, ShaderFlags.None, out errors);
- if(!string.IsNullOrEmpty(errors))
- {
- throw new Exception("Errors in effect file " + fxfile + ": " + errors);
- }
- }
- catch(Exception)
- {
- string debugerrors = string.Empty; //mxd
-
- // Compiling failed, try with debug information
- try
- {
- //mxd. Rewind before use!
- fxdata.Seek(0, SeekOrigin.Begin);
-
- // Compile effect
- fx = Effect.FromStream(fxdata, ShaderFlags.Debug, out debugerrors);
- if(!string.IsNullOrEmpty(debugerrors))
- {
- throw new Exception("Errors in effect file " + fxfile + ": " + debugerrors);
- }
- }
- catch(Exception e)
- {
- //mxd. Try to get something. Anything!
- string message;
- if(!string.IsNullOrEmpty(debugerrors))
- message = e.Message + "\nInitial message (debug mode): \"" + debugerrors + "\"";
- else if(!string.IsNullOrEmpty(errors))
- message = e.Message + "\nInitial message: \"" + errors + "\"";
- else
- message = e.ToString();
-
- if(string.IsNullOrEmpty(message)) message = "No initial message...";
-
- // No debug information, just crash
- throw new Exception(e.GetType().Name + " while loading effect " + fxfile + ": " + message);
- }
- }
-
- fxdata.Dispose();
-
- // Return result
- return fx;
- }
-
- // This applies the shader
- public void Begin()
- {
- // Set vertex declaration
- General.Map.Graphics.SetVertexDeclaration(vertexdecl);
-
- // Set effect
- effect.Begin();
- }
-
- // This begins a pass
- public virtual void BeginPass(int index)
- {
- effect.BeginPass(index);
- }
-
- // This ends a pass
- public void EndPass()
- {
- effect.EndPass();
- }
-
- // This ends te shader
- public void End()
- {
- effect.End();
- }
-
- // This applies properties during a pass
- public void ApplySettings()
- {
- if(settingschanged)
- {
- effect.CommitChanges();
- settingschanged = false; //mxd
- }
- }
-
- #endregion
- }
-}
diff --git a/Source/Core/Rendering/Mesh.cs b/Source/Core/Rendering/Mesh.cs
index 77ba94b8..c5f00816 100644
--- a/Source/Core/Rendering/Mesh.cs
+++ b/Source/Core/Rendering/Mesh.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace CodeImp.DoomBuilder.Rendering
{
- public class Mesh : IDisposable
+ internal class Mesh : IDisposable
{
public Mesh(VertexElement[] vertexDecl, WorldVertex[] vertexData, int[] indexData)
{
@@ -15,6 +15,7 @@ namespace CodeImp.DoomBuilder.Rendering
Vertices.SetBufferData(vertexData);
Indices = new IndexBuffer(sizeof(int) * indexData.Length);
Indices.SetBufferData(indexData);
+ Count = indexData.Length;
}
~Mesh()
@@ -22,8 +23,17 @@ namespace CodeImp.DoomBuilder.Rendering
Dispose();
}
- public void DrawSubset(int index)
+ internal void Draw(RenderDevice device)
{
+ /*
+ device.SetVertexDeclaration(VertexDecl);
+ device.SetVertexBuffer(0, Vertices, 0, WorldVertex.Stride);
+ device.SetIndexBuffer(Indices);
+ device.DrawElements(0, Count);
+ device.SetIndexBuffer(null);
+ device.SetVertexBuffer(0, null, 0, 0);
+ device.SetVertexDeclaration(null);
+ */
}
public void Dispose()
@@ -35,5 +45,6 @@ namespace CodeImp.DoomBuilder.Rendering
VertexDeclaration VertexDecl;
VertexBuffer Vertices;
IndexBuffer Indices;
+ int Count;
}
}
diff --git a/Source/Core/Rendering/RenderDevice.cs b/Source/Core/Rendering/RenderDevice.cs
index 9c1e0de0..fd1bd090 100755
--- a/Source/Core/Rendering/RenderDevice.cs
+++ b/Source/Core/Rendering/RenderDevice.cs
@@ -247,7 +247,7 @@ namespace CodeImp.DoomBuilder.Rendering
SetSamplerState(0, TextureAddress.Wrap);
// Shader settings
- Shaders.World3D.SetConstants(General.Settings.VisualBilinear, General.Settings.FilterAnisotropy);
+ Shaders.SetWorld3DConstants(General.Settings.VisualBilinear, General.Settings.FilterAnisotropy);
// Initialize presentations
Presentation.Initialize();
@@ -391,12 +391,15 @@ namespace CodeImp.DoomBuilder.Rendering
}
public void SetShader(Shader shader) { }
+ public void SetUniform(Uniform uniform, bool value) { }
public void SetUniform(Uniform uniform, float value) { }
public void SetUniform(Uniform uniform, Vector2 value) { }
public void SetUniform(Uniform uniform, Vector3 value) { }
public void SetUniform(Uniform uniform, Vector4 value) { }
+ public void SetUniform(Uniform uniform, Color4 value) { }
public void SetUniform(Uniform uniform, Matrix value) { }
- public void SetUniform(Uniform uniform, Texture value) { }
+ public void SetUniform(Uniform uniform, BaseTexture value) { }
+ public void SetUniform(Uniform uniform, TextureFilter value) { }
}
public enum Shader : int
@@ -408,20 +411,24 @@ namespace CodeImp.DoomBuilder.Rendering
things2d_thing,
things2d_sprite,
things2d_fill,
- world3d_main,
- world3d_fullbright,
- world3d_main_highlight,
- world3d_fullbright_highlight,
- world3d_main_vertexcolor,
- world3d_skybox,
- world3d_main_highlight_vertexcolor,
- world3d_main_fog,
- world3d_main_highlight_fog,
- world3d_main_fog_vertexcolor,
- world3d_main_highlight_fog_vertexcolor,
- world3d_vertex_color,
- world3d_constant_color,
- world3d_lightpass // AlphaBlendEnable = true
+ world3d_main, // 0
+ world3d_fullbright, // 1
+ world3d_main_highlight, // 2
+ world3d_fullbright_highlight, // 3
+ world3d_main_vertexcolor, // 4
+ world3d_skybox, // 5
+ world3d_main_highlight_vertexcolor, // 6
+ world3d_p7,
+ world3d_main_fog, // 8
+ world3d_p9,
+ world3d_main_highlight_fog, // 10
+ world3d_p11,
+ world3d_main_fog_vertexcolor, // 12
+ world3d_p13,
+ world3d_main_highlight_fog_vertexcolor, // 14
+ world3d_vertex_color, // 15
+ world3d_constant_color, // 16
+ world3d_lightpass // 17 // AlphaBlendEnable = true
}
public enum Uniform : int
@@ -435,6 +442,7 @@ namespace CodeImp.DoomBuilder.Rendering
worldviewproj,
world,
modelnormal,
+ FillColor,
vertexColor,
stencilColor,
lightPosAndRadius,
@@ -444,6 +452,10 @@ namespace CodeImp.DoomBuilder.Rendering
ignoreNormals,
spotLight,
campos,
+ magfiltersettings,
+ minfiltersettings,
+ mipfiltersettings,
+ maxanisotropysetting
}
public enum Cull : int { None, Counterclockwise }
diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs
index 71baa007..5a232c4c 100755
--- a/Source/Core/Rendering/Renderer2D.cs
+++ b/Source/Core/Rendering/Renderer2D.cs
@@ -1209,14 +1209,12 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.SetVertexBuffer(0, thingsvertices, 0, FlatVertex.Stride);
// Set things texture
- graphics.Shaders.Things2D.Texture1 = General.Map.Data.ThingTexture.Texture; //mxd
+ graphics.SetUniform(Uniform.texture1, General.Map.Data.ThingTexture.Texture); //mxd
SetWorldTransformation(false);
- graphics.Shaders.Things2D.SetSettings(alpha);
+ graphics.SetVertexDeclaration(graphics.Shaders.FlatVertexDecl);
+ graphics.SetShader(Shader.things2d_thing);
+ graphics.Shaders.SetThings2DSettings(alpha);
- // Begin drawing
- graphics.Shaders.Things2D.Begin();
- graphics.Shaders.Things2D.BeginPass(0);
-
// Determine next lock size
int locksize = (things.Count > THING_BUFFER_SIZE) ? THING_BUFFER_SIZE : things.Count;
FlatVertex[] verts = new FlatVertex[THING_BUFFER_SIZE * 6];
@@ -1278,12 +1276,9 @@ namespace CodeImp.DoomBuilder.Rendering
if(buffercount > 0)
graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
- // Done
- graphics.Shaders.Things2D.EndPass();
-
//mxd. Render sprites
int selectionColor = General.Colors.Selection.ToInt();
- graphics.Shaders.Things2D.BeginPass(1);
+ graphics.SetShader(Shader.things2d_sprite);
foreach(KeyValuePair> group in thingsByType)
{
@@ -1328,8 +1323,7 @@ namespace CodeImp.DoomBuilder.Rendering
}
if(sprite.Texture == null) sprite.CreateTexture();
- graphics.Shaders.Things2D.Texture1 = sprite.Texture;
- graphics.Shaders.Things2D.ApplySettings();
+ graphics.SetUniform(Uniform.texture1, sprite.Texture);
// Determine next lock size
locksize = (framegroup.Value.Count > THING_BUFFER_SIZE) ? THING_BUFFER_SIZE : framegroup.Value.Count;
@@ -1423,12 +1417,9 @@ namespace CodeImp.DoomBuilder.Rendering
}
}
- // Done
- graphics.Shaders.Things2D.EndPass();
-
//mxd. Render thing arrows
- graphics.Shaders.Things2D.Texture1 = General.Map.Data.ThingTexture.Texture;
- graphics.Shaders.Things2D.BeginPass(0);
+ graphics.SetUniform(Uniform.texture1, General.Map.Data.ThingTexture.Texture);
+ graphics.SetShader(Shader.things2d_thing);
// Determine next lock size
locksize = (thingsByPosition.Count > THING_BUFFER_SIZE) ? THING_BUFFER_SIZE : thingsByPosition.Count;
@@ -1468,9 +1459,6 @@ namespace CodeImp.DoomBuilder.Rendering
if(buffercount > 0)
graphics.DrawPrimitives(PrimitiveType.TriangleList, 0, buffercount * 2);
- //Done with this pass
- graphics.Shaders.Things2D.EndPass();
-
//mxd. Render models
if(General.Settings.GZDrawModelsMode != ModelRenderMode.NONE)
{
@@ -1479,7 +1467,7 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.SetTextureFactor(-1);
graphics.SetFillMode(FillMode.Wireframe);
- graphics.Shaders.Things2D.BeginPass(2);
+ graphics.SetShader(Shader.things2d_fill);
Color4 cSelection = General.Colors.Selection.ToColorValue();
Color4 cWire = ((c.ToInt() == General.Colors.Highlight.ToInt()) ? General.Colors.Highlight.ToColorValue() : General.Colors.ModelWireframe.ToColorValue());
@@ -1503,7 +1491,7 @@ namespace CodeImp.DoomBuilder.Rendering
((screenpos.y + mde.Model.Radius * modelScale) <= 0.0f) || ((screenpos.y - mde.Model.Radius * modelScale) >= windowsize.Height))
continue;
- graphics.Shaders.Things2D.FillColor = (t.Selected ? cSelection : cWire);
+ graphics.SetUniform(Uniform.FillColor, (t.Selected ? cSelection : cWire));
// Set transform settings
float sx = t.ScaleX * t.ActorScale.Width;
@@ -1514,21 +1502,17 @@ namespace CodeImp.DoomBuilder.Rendering
Matrix position = Matrix.Translation(screenpos.x, screenpos.y, 0.0f);
Matrix world = General.Map.Data.ModeldefEntries[t.Type].Transform * modelscale * rotation * viewscale * position;
- graphics.Shaders.Things2D.SetTransformSettings(world);
- graphics.Shaders.Things2D.ApplySettings();
+ graphics.Shaders.SetThings2DTransformSettings(world);
// Draw
- foreach(Mesh mesh in mde.Model.Meshes) mesh.DrawSubset(0);
+ foreach(Mesh mesh in mde.Model.Meshes) mesh.Draw(graphics);
}
}
//Done with this pass
- graphics.Shaders.Things2D.EndPass();
graphics.SetFillMode(FillMode.Solid);
}
- graphics.Shaders.Things2D.End();
-
//mxd. Render thing boxes
RenderArrows(bboxes, false);
}
@@ -1661,15 +1645,13 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.SetFogEnable(false);
SetWorldTransformation(true);
- graphics.Shaders.Things2D.FillColor = new Color4(color);
- graphics.Shaders.Things2D.SetSettings(1.0f);
+ graphics.SetUniform(Uniform.FillColor, new Color4(color));
+ graphics.Shaders.SetThings2DSettings(1.0f);
- // Draw
- graphics.Shaders.Things2D.Begin();
- graphics.Shaders.Things2D.BeginPass(2);
+ // Draw
+ graphics.SetVertexDeclaration(graphics.Shaders.FlatVertexDecl);
+ graphics.SetShader(Shader.things2d_fill);
graphics.DrawUserPrimitives(PrimitiveType.TriangleList, 0, vertices.Length / 3, vertices);
- graphics.Shaders.Things2D.EndPass();
- graphics.Shaders.Things2D.End();
}
//mxd. This renders text (DB2 compatibility)
diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs
index 15b6b269..112d2ee3 100755
--- a/Source/Core/Rendering/Renderer3D.cs
+++ b/Source/Core/Rendering/Renderer3D.cs
@@ -38,9 +38,6 @@ namespace CodeImp.DoomBuilder.Rendering
private const float PROJ_NEAR_PLANE = 1f;
private const float FOG_RANGE = 0.9f;
- private const int SHADERPASS_LIGHT = 17; //mxd
- private const int SHADERPASS_SKYBOX = 5; //mxd
-
#endregion
#region ================== Variables
@@ -54,7 +51,7 @@ namespace CodeImp.DoomBuilder.Rendering
private Matrix world;
private Vector3D cameraposition;
private Vector3D cameravector;
- private int shaderpass;
+ private Shader shaderpass;
// Window size
private Size windowsize;
@@ -284,7 +281,7 @@ namespace CodeImp.DoomBuilder.Rendering
// This applies the matrices
private void ApplyMatrices3D()
{
- graphics.Shaders.World3D.WorldViewProj = world * viewproj; //mxd. Multiplication is ~2x faster than "world * view3d * projection";
+ graphics.SetUniform(Uniform.worldviewproj, world * viewproj); //mxd. Multiplication is ~2x faster than "world * view3d * projection";
}
// This sets the appropriate view matrix
@@ -317,7 +314,7 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.SetFogStart(General.Settings.ViewDistance * FOG_RANGE);
graphics.SetFogEnd(General.Settings.ViewDistance);
graphics.SetTextureFactor(-1);
- graphics.Shaders.World3D.HighlightColor = new Color4(); //mxd
+ graphics.SetUniform(Uniform.highlightcolor, new Color4()); //mxd
// Texture addressing
graphics.SetSamplerState(0, TextureAddress.Wrap);
@@ -339,7 +336,7 @@ namespace CodeImp.DoomBuilder.Rendering
}
// Determine shader pass to use
- shaderpass = (fullbrightness ? 1 : 0);
+ shaderpass = (fullbrightness ? Shader.world3d_fullbright : Shader.world3d_main);
// Create crosshair vertices
if(crosshairverts == null)
@@ -385,7 +382,7 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.SetAlphaBlendEnable(false);
graphics.SetAlphaTestEnable(false);
graphics.SetTextureFactor(-1);
- graphics.Shaders.World3D.Begin();
+ graphics.SetVertexDeclaration(graphics.Shaders.WorldVertexDecl);
//mxd. SKY PASS
if(skygeo.Count > 0)
@@ -435,9 +432,9 @@ namespace CodeImp.DoomBuilder.Rendering
{
graphics.SetAlphaTestEnable(true);
graphics.SetCullMode(Cull.None);
- graphics.Shaders.World3D.IgnoreNormals = true;
+ graphics.SetUniform(Uniform.ignoreNormals, true);
RenderModels(true, false);
- graphics.Shaders.World3D.IgnoreNormals = false;
+ graphics.SetUniform(Uniform.ignoreNormals, false);
graphics.SetCullMode(Cull.Counterclockwise);
}
}
@@ -480,9 +477,9 @@ namespace CodeImp.DoomBuilder.Rendering
if (General.Settings.GZDrawLightsMode != LightRenderMode.NONE && !fullbrightness && lightthings.Count > 0 && translucentmodelthings.Count > 0)
{
graphics.SetAlphaTestEnable(true);
- graphics.Shaders.World3D.IgnoreNormals = true;
+ graphics.SetUniform(Uniform.ignoreNormals, true);
RenderModels(true, true);
- graphics.Shaders.World3D.IgnoreNormals = false;
+ graphics.SetUniform(Uniform.ignoreNormals, false);
}
// THING CAGES
@@ -500,11 +497,8 @@ namespace CodeImp.DoomBuilder.Rendering
if(General.Settings.GZShowEventLines) RenderArrows(eventlines);
// Remove references
- graphics.Shaders.World3D.Texture1 = null;
+ graphics.SetUniform(Uniform.texture1, null);
- // Done
- graphics.Shaders.World3D.End();
-
//mxd. Trash collections
solidgeo = null;
maskedgeo = null;
@@ -592,7 +586,7 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.SetSourceBlend(Blend.SourceAlpha);
graphics.SetDestinationBlend(Blend.SourceAlpha);
- graphics.Shaders.World3D.BeginPass(16);
+ graphics.SetShader(Shader.world3d_constant_color);
foreach(VisualThing t in allthings)
{
@@ -607,16 +601,14 @@ namespace CodeImp.DoomBuilder.Rendering
thingcolor = t.CageColor;
if(t != highlighted) thingcolor.Alpha = 0.6f;
}
- graphics.Shaders.World3D.VertexColor = thingcolor;
+ graphics.SetUniform(Uniform.vertexColor, thingcolor);
//Render cage
- graphics.Shaders.World3D.ApplySettings();
graphics.SetVertexBuffer(0, t.CageBuffer, 0, WorldVertex.Stride);
graphics.DrawPrimitives(PrimitiveType.LineList, 0, t.CageLength);
}
// Done
- graphics.Shaders.World3D.EndPass();
graphics.SetTextureFactor(-1);
}
@@ -631,7 +623,7 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.SetSourceBlend(Blend.SourceAlpha);
graphics.SetDestinationBlend(Blend.SourceAlpha);
- graphics.Shaders.World3D.BeginPass(16);
+ graphics.SetShader(Shader.world3d_constant_color);
foreach(VisualVertex v in visualvertices)
{
@@ -649,16 +641,14 @@ namespace CodeImp.DoomBuilder.Rendering
color = v.HaveHeightOffset ? General.Colors.InfoLine.ToColorValue() : General.Colors.Vertices.ToColorValue();
if(v != highlighted) color.Alpha = 0.6f;
}
- graphics.Shaders.World3D.VertexColor = color;
+ graphics.SetUniform(Uniform.vertexColor, color);
//Commence drawing!!11
- graphics.Shaders.World3D.ApplySettings();
graphics.SetVertexBuffer(0, v.CeilingVertex ? vertexhandle.Upper : vertexhandle.Lower, 0, WorldVertex.Stride);
graphics.DrawPrimitives(PrimitiveType.LineList, 0, 8);
}
// Done
- graphics.Shaders.World3D.EndPass();
graphics.SetTextureFactor(-1);
}
@@ -727,18 +717,16 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.SetSourceBlend(Blend.SourceAlpha);
graphics.SetDestinationBlend(Blend.SourceAlpha);
- graphics.Shaders.World3D.BeginPass(15);
+ graphics.SetShader(Shader.world3d_vertex_color);
world = Matrix.Identity;
ApplyMatrices3D();
//render
- graphics.Shaders.World3D.ApplySettings();
graphics.SetVertexBuffer(0, vb, 0, WorldVertex.Stride);
graphics.DrawPrimitives(PrimitiveType.LineList, 0, pointscount / 2);
// Done
- graphics.Shaders.World3D.EndPass();
graphics.SetTextureFactor(-1);
vb.Dispose();
}
@@ -747,11 +735,11 @@ namespace CodeImp.DoomBuilder.Rendering
private void RenderSinglePass(Dictionary> geopass, Dictionary> thingspass)
{
ImageData curtexture;
- int currentshaderpass = shaderpass;
- int highshaderpass = shaderpass + 2;
+ Shader currentshaderpass = shaderpass;
+ Shader highshaderpass = (Shader)(shaderpass + 2);
// Begin rendering with this shader
- graphics.Shaders.World3D.BeginPass(shaderpass);
+ graphics.SetShader(shaderpass);
// Render the geometry collected
foreach(KeyValuePair> group in geopass)
@@ -768,8 +756,8 @@ namespace CodeImp.DoomBuilder.Rendering
if((curtexture.Texture == null) || curtexture.Texture.Disposed)
curtexture.CreateTexture();
- // Apply texture
- graphics.Shaders.World3D.Texture1 = curtexture.Texture;
+ // Apply texture
+ graphics.SetUniform(Uniform.texture1, curtexture.Texture);
//mxd. Sort geometry by sector index
group.Value.Sort((g1, g2) => g1.Sector.Sector.FixedIndex - g2.Sector.Sector.FixedIndex);
@@ -801,11 +789,11 @@ namespace CodeImp.DoomBuilder.Rendering
}
}
- graphics.Shaders.World3D.Desaturation = 0;
+ graphics.SetUniform(Uniform.desaturation, 0.0f);
if (sector != null)
{
// Determine the shader pass we want to use for this object
- int wantedshaderpass = (((g == highlighted) && showhighlight) || (g.Selected && showselection)) ? highshaderpass : shaderpass;
+ Shader wantedshaderpass = (((g == highlighted) && showhighlight) || (g.Selected && showselection)) ? highshaderpass : shaderpass;
//mxd. Render fog?
if(General.Settings.GZDrawFog && !fullbrightness && sector.Sector.FogMode != SectorFogMode.NONE)
@@ -814,34 +802,30 @@ namespace CodeImp.DoomBuilder.Rendering
// Switch shader pass?
if(currentshaderpass != wantedshaderpass)
{
- graphics.Shaders.World3D.EndPass();
- graphics.Shaders.World3D.BeginPass(wantedshaderpass);
+ graphics.SetShader(wantedshaderpass);
currentshaderpass = wantedshaderpass;
//mxd. Set variables for fog rendering?
- if(wantedshaderpass > 7)
+ if(wantedshaderpass > Shader.world3d_p7)
{
- graphics.Shaders.World3D.World = world;
- graphics.Shaders.World3D.ModelNormal = Matrix.Identity;
+ graphics.SetUniform(Uniform.world, world);
+ graphics.SetUniform(Uniform.modelnormal, Matrix.Identity);
}
}
//mxd. Set variables for fog rendering?
- if(wantedshaderpass > 7)
+ if(wantedshaderpass > Shader.world3d_p7)
{
- graphics.Shaders.World3D.CameraPosition = new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, g.FogFactor);
- graphics.Shaders.World3D.LightColor = sector.Sector.FogColor;
+ graphics.SetUniform(Uniform.campos, new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, g.FogFactor));
+ graphics.SetUniform(Uniform.lightColor, sector.Sector.FogColor);
}
// Set the colors to use
- graphics.Shaders.World3D.HighlightColor = CalculateHighlightColor((g == highlighted) && showhighlight, (g.Selected && showselection));
+ graphics.SetUniform(Uniform.highlightcolor, CalculateHighlightColor((g == highlighted) && showhighlight, (g.Selected && showselection)));
// [ZZ] include desaturation factor
- graphics.Shaders.World3D.Desaturation = sector.Sector.Desaturation;
+ graphics.SetUniform(Uniform.desaturation, sector.Sector.Desaturation);
- // Apply changes
- graphics.Shaders.World3D.ApplySettings();
-
// Render!
graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
}
@@ -872,8 +856,8 @@ namespace CodeImp.DoomBuilder.Rendering
if((curtexture.Texture == null) || curtexture.Texture.Disposed)
curtexture.CreateTexture();
- // Apply texture
- graphics.Shaders.World3D.Texture1 = curtexture.Texture;
+ // Apply texture
+ graphics.SetUniform(Uniform.texture1, curtexture.Texture);
// Render all things with this texture
foreach(VisualThing t in group.Value)
@@ -889,7 +873,7 @@ namespace CodeImp.DoomBuilder.Rendering
if(t.GeometryBuffer != null)
{
// Determine the shader pass we want to use for this object
- int wantedshaderpass = (((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass;
+ Shader wantedshaderpass = (((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass;
//mxd. If fog is enagled, switch to shader, which calculates it
if(General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && t.Thing.Sector.FogMode != SectorFogMode.NONE)
@@ -922,35 +906,33 @@ namespace CodeImp.DoomBuilder.Rendering
// Switch shader pass?
if(currentshaderpass != wantedshaderpass)
{
- graphics.Shaders.World3D.EndPass();
- graphics.Shaders.World3D.BeginPass(wantedshaderpass);
+ graphics.SetShader(wantedshaderpass);
currentshaderpass = wantedshaderpass;
}
//mxd. Set variables for fog rendering?
- if(wantedshaderpass > 7)
+ if(wantedshaderpass > Shader.world3d_p7)
{
- graphics.Shaders.World3D.World = world;
- graphics.Shaders.World3D.ModelNormal = Matrix.Identity;
- graphics.Shaders.World3D.CameraPosition = new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, t.FogFactor);
+ graphics.SetUniform(Uniform.world, world);
+ graphics.SetUniform(Uniform.modelnormal, Matrix.Identity);
+ graphics.SetUniform(Uniform.campos, new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, t.FogFactor));
}
// Set the colors to use
- if(t.Thing.Sector != null) graphics.Shaders.World3D.LightColor = t.Thing.Sector.FogColor;
- graphics.Shaders.World3D.VertexColor = vertexcolor;
- graphics.Shaders.World3D.HighlightColor = CalculateHighlightColor((t == highlighted) && showhighlight, (t.Selected && showselection));
+ if(t.Thing.Sector != null) graphics.SetUniform(Uniform.lightColor, t.Thing.Sector.FogColor);
+ graphics.SetUniform(Uniform.vertexColor, vertexcolor);
+ graphics.SetUniform(Uniform.highlightcolor, CalculateHighlightColor((t == highlighted) && showhighlight, (t.Selected && showselection)));
// [ZZ] check if we want stencil
- graphics.Shaders.World3D.StencilColor = t.StencilColor.ToColorValue();
+ graphics.SetUniform(Uniform.stencilColor, t.StencilColor.ToColorValue());
// [ZZ] apply desaturation
if (t.Thing.Sector != null)
- graphics.Shaders.World3D.Desaturation = t.Thing.Sector.Desaturation;
- else graphics.Shaders.World3D.Desaturation = 0;
+ graphics.SetUniform(Uniform.desaturation, t.Thing.Sector.Desaturation);
+ else graphics.SetUniform(Uniform.desaturation, 0.0f);
// Apply changes
ApplyMatrices3D();
- graphics.Shaders.World3D.ApplySettings();
// Apply buffer
graphics.SetVertexBuffer(0, t.GeometryBuffer, 0, WorldVertex.Stride);
@@ -961,23 +943,20 @@ namespace CodeImp.DoomBuilder.Rendering
}
// [ZZ]
- graphics.Shaders.World3D.StencilColor = new Color4(0f, 1f, 1f, 1f);
+ graphics.SetUniform(Uniform.stencilColor, new Color4(0f, 1f, 1f, 1f));
}
// Texture addressing
graphics.SetSamplerState(0, TextureAddress.Wrap);
graphics.SetCullMode(Cull.Counterclockwise); //mxd
}
-
- // Done rendering with this shader
- graphics.Shaders.World3D.EndPass();
}
//mxd
private void RenderTranslucentPass(List geopass, List thingspass)
{
- int currentshaderpass = shaderpass;
- int highshaderpass = shaderpass + 2;
+ Shader currentshaderpass = shaderpass;
+ Shader highshaderpass = (Shader)(shaderpass + 2);
// Sort geometry by camera distance. First vertex of the BoundingBox is it's center
geopass.Sort(delegate(VisualGeometry vg1, VisualGeometry vg2)
@@ -1020,7 +999,7 @@ namespace CodeImp.DoomBuilder.Rendering
float fogfactor = -1;
// Begin rendering with this shader
- graphics.Shaders.World3D.BeginPass(shaderpass);
+ graphics.SetShader(shaderpass);
// Go for all geometry
foreach(VisualGeometry g in geopass)
@@ -1057,8 +1036,8 @@ namespace CodeImp.DoomBuilder.Rendering
if((curtexture.Texture == null) || curtexture.Texture.Disposed)
curtexture.CreateTexture();
- // Apply texture
- graphics.Shaders.World3D.Texture1 = curtexture.Texture;
+ // Apply texture
+ graphics.SetUniform(Uniform.texture1, curtexture.Texture);
curtexturename = g.Texture.LongName;
}
@@ -1087,7 +1066,7 @@ namespace CodeImp.DoomBuilder.Rendering
if (sector != null)
{
// Determine the shader pass we want to use for this object
- int wantedshaderpass = (((g == highlighted) && showhighlight) || (g.Selected && showselection)) ? highshaderpass : shaderpass;
+ Shader wantedshaderpass = (((g == highlighted) && showhighlight) || (g.Selected && showselection)) ? highshaderpass : shaderpass;
//mxd. Render fog?
if (General.Settings.GZDrawFog && !fullbrightness && sector.Sector.FogMode != SectorFogMode.NONE)
@@ -1096,39 +1075,35 @@ namespace CodeImp.DoomBuilder.Rendering
// Switch shader pass?
if (currentshaderpass != wantedshaderpass)
{
- graphics.Shaders.World3D.EndPass();
- graphics.Shaders.World3D.BeginPass(wantedshaderpass);
+ graphics.SetShader(wantedshaderpass);
currentshaderpass = wantedshaderpass;
//mxd. Set variables for fog rendering?
- if (wantedshaderpass > 7)
+ if (wantedshaderpass > Shader.world3d_p7)
{
- graphics.Shaders.World3D.World = world;
- graphics.Shaders.World3D.ModelNormal = Matrix.Identity;
+ graphics.SetUniform(Uniform.world, world);
+ graphics.SetUniform(Uniform.modelnormal, Matrix.Identity);
}
}
// Set variables for fog rendering?
- if (wantedshaderpass > 7 && g.FogFactor != fogfactor)
+ if (wantedshaderpass > Shader.world3d_p7 && g.FogFactor != fogfactor)
{
- graphics.Shaders.World3D.CameraPosition = new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, g.FogFactor);
+ graphics.SetUniform(Uniform.campos, new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, g.FogFactor));
fogfactor = g.FogFactor;
}
//
- graphics.Shaders.World3D.Desaturation = sector.Sector.Desaturation;
+ graphics.SetUniform(Uniform.desaturation, sector.Sector.Desaturation);
// Set the colors to use
- graphics.Shaders.World3D.LightColor = sector.Sector.FogColor;
- graphics.Shaders.World3D.HighlightColor = CalculateHighlightColor((g == highlighted) && showhighlight, (g.Selected && showselection));
-
- // Apply changes
- graphics.Shaders.World3D.ApplySettings();
+ graphics.SetUniform(Uniform.lightColor, sector.Sector.FogColor);
+ graphics.SetUniform(Uniform.highlightcolor, CalculateHighlightColor((g == highlighted) && showhighlight, (g.Selected && showselection)));
// Render!
graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
}
- else graphics.Shaders.World3D.Desaturation = 0f;
+ else graphics.SetUniform(Uniform.desaturation, 0.0f);
}
// Get things for this pass
@@ -1195,8 +1170,8 @@ namespace CodeImp.DoomBuilder.Rendering
if((curtexture.Texture == null) || curtexture.Texture.Disposed)
curtexture.CreateTexture();
- // Apply texture
- graphics.Shaders.World3D.Texture1 = curtexture.Texture;
+ // Apply texture
+ graphics.SetUniform(Uniform.texture1, curtexture.Texture);
curtexturename = t.Texture.LongName;
}
@@ -1204,7 +1179,7 @@ namespace CodeImp.DoomBuilder.Rendering
if(t.GeometryBuffer != null)
{
// Determine the shader pass we want to use for this object
- int wantedshaderpass = (((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass;
+ Shader wantedshaderpass = (((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass;
//mxd. if fog is enagled, switch to shader, which calculates it
if(General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && t.Thing.Sector.FogMode != SectorFogMode.NONE)
@@ -1237,37 +1212,35 @@ namespace CodeImp.DoomBuilder.Rendering
// Switch shader pass?
if(currentshaderpass != wantedshaderpass)
{
- graphics.Shaders.World3D.EndPass();
- graphics.Shaders.World3D.BeginPass(wantedshaderpass);
+ graphics.SetShader(wantedshaderpass);
currentshaderpass = wantedshaderpass;
}
//mxd. Set variables for fog rendering?
- if(wantedshaderpass > 7)
+ if(wantedshaderpass > Shader.world3d_p7)
{
- graphics.Shaders.World3D.World = world;
- graphics.Shaders.World3D.ModelNormal = Matrix.Identity;
+ graphics.SetUniform(Uniform.world, world);
+ graphics.SetUniform(Uniform.modelnormal, Matrix.Identity);
if (t.FogFactor != fogfactor)
{
- graphics.Shaders.World3D.CameraPosition = new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, t.FogFactor);
+ graphics.SetUniform(Uniform.campos, new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, t.FogFactor));
fogfactor = t.FogFactor;
}
}
- // Set the colors to use
- graphics.Shaders.World3D.LightColor = t.Thing.Sector.FogColor;
- graphics.Shaders.World3D.VertexColor = vertexcolor;
- graphics.Shaders.World3D.HighlightColor = CalculateHighlightColor((t == highlighted) && showhighlight, (t.Selected && showselection));
+ // Set the colors to use
+ graphics.SetUniform(Uniform.lightColor, t.Thing.Sector.FogColor);
+ graphics.SetUniform(Uniform.vertexColor, vertexcolor);
+ graphics.SetUniform(Uniform.highlightcolor, CalculateHighlightColor((t == highlighted) && showhighlight, (t.Selected && showselection)));
// [ZZ] check if we want stencil
- graphics.Shaders.World3D.StencilColor = t.StencilColor.ToColorValue();
+ graphics.SetUniform(Uniform.stencilColor, t.StencilColor.ToColorValue());
//
- graphics.Shaders.World3D.Desaturation = t.Thing.Sector.Desaturation;
+ graphics.SetUniform(Uniform.desaturation, t.Thing.Sector.Desaturation);
// Apply changes
ApplyMatrices3D();
- graphics.Shaders.World3D.ApplySettings();
// Apply buffer
graphics.SetVertexBuffer(0, t.GeometryBuffer, 0, WorldVertex.Stride);
@@ -1278,15 +1251,12 @@ namespace CodeImp.DoomBuilder.Rendering
}
// [ZZ] check if we want stencil
- graphics.Shaders.World3D.StencilColor = new Color4(0f, 1f, 1f, 1f);
+ graphics.SetUniform(Uniform.stencilColor, new Color4(0f, 1f, 1f, 1f));
// Texture addressing
graphics.SetSamplerState(0, TextureAddress.Wrap);
graphics.SetCullMode(Cull.Counterclockwise); //mxd
}
-
- // Done rendering with this shader
- graphics.Shaders.World3D.EndPass();
}
//mxd
@@ -1356,14 +1326,14 @@ namespace CodeImp.DoomBuilder.Rendering
if (sector == null) continue;
- graphics.Shaders.World3D.Desaturation = sector.Sector.Desaturation;
+ graphics.SetUniform(Uniform.desaturation, sector.Sector.Desaturation);
// note: additive geometry doesn't receive lighting
if (g.RenderPass == RenderPass.Additive)
continue;
if (settexture)
- graphics.Shaders.World3D.Texture1 = g.Texture.Texture;
+ graphics.SetUniform(Uniform.texture1, g.Texture.Texture);
//normal lights
int count = lightOffsets[0];
@@ -1378,17 +1348,16 @@ namespace CodeImp.DoomBuilder.Rendering
{
lpr = new Vector4(lights[i].Center, lights[i].LightRadius);
if (lpr.W == 0) continue;
- graphics.Shaders.World3D.LightColor = lights[i].LightColor;
- graphics.Shaders.World3D.LightPositionAndRadius = lpr;
+ graphics.SetUniform(Uniform.lightColor, lights[i].LightColor);
+ graphics.SetUniform(Uniform.lightPosAndRadius, lpr);
GZGeneral.LightData ld = lights[i].LightType;
if (ld.LightType == GZGeneral.LightType.SPOT)
{
- graphics.Shaders.World3D.SpotLight = true;
- graphics.Shaders.World3D.LightOrientation = lights[i].VectorLookAt;
- graphics.Shaders.World3D.Light2Radius = new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2));
+ graphics.SetUniform(Uniform.spotLight, true);
+ graphics.SetUniform(Uniform.lightOrientation, lights[i].VectorLookAt);
+ graphics.SetUniform(Uniform.light2Radius, new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2)));
}
- else graphics.Shaders.World3D.SpotLight = false;
- graphics.Shaders.World3D.ApplySettings();
+ else graphics.SetUniform(Uniform.spotLight, false);
graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
}
}
@@ -1406,17 +1375,16 @@ namespace CodeImp.DoomBuilder.Rendering
{
lpr = new Vector4(lights[i].Center, lights[i].LightRadius);
if (lpr.W == 0) continue;
- graphics.Shaders.World3D.LightColor = lights[i].LightColor;
- graphics.Shaders.World3D.LightPositionAndRadius = lpr;
+ graphics.SetUniform(Uniform.lightColor, lights[i].LightColor);
+ graphics.SetUniform(Uniform.lightPosAndRadius, lpr);
GZGeneral.LightData ld = lights[i].LightType;
if (ld.LightType == GZGeneral.LightType.SPOT)
{
- graphics.Shaders.World3D.SpotLight = true;
- graphics.Shaders.World3D.LightOrientation = lights[i].VectorLookAt;
- graphics.Shaders.World3D.Light2Radius = new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2));
+ graphics.SetUniform(Uniform.spotLight, true);
+ graphics.SetUniform(Uniform.lightOrientation, lights[i].VectorLookAt);
+ graphics.SetUniform(Uniform.light2Radius, new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2)));
}
- else graphics.Shaders.World3D.SpotLight = false;
- graphics.Shaders.World3D.ApplySettings();
+ else graphics.SetUniform(Uniform.spotLight, false);
graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
}
}
@@ -1434,17 +1402,16 @@ namespace CodeImp.DoomBuilder.Rendering
{
lpr = new Vector4(lights[i].Center, lights[i].LightRadius);
if (lpr.W == 0) continue;
- graphics.Shaders.World3D.LightColor = lights[i].LightColor;
- graphics.Shaders.World3D.LightPositionAndRadius = lpr;
+ graphics.SetUniform(Uniform.lightColor, lights[i].LightColor);
+ graphics.SetUniform(Uniform.lightPosAndRadius, lpr);
GZGeneral.LightData ld = lights[i].LightType;
if (ld.LightType == GZGeneral.LightType.SPOT)
{
- graphics.Shaders.World3D.SpotLight = true;
- graphics.Shaders.World3D.LightOrientation = lights[i].VectorLookAt;
- graphics.Shaders.World3D.Light2Radius = new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2));
+ graphics.SetUniform(Uniform.spotLight, true);
+ graphics.SetUniform(Uniform.lightOrientation, lights[i].VectorLookAt);
+ graphics.SetUniform(Uniform.light2Radius, new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2)));
}
- else graphics.Shaders.World3D.SpotLight = false;
- graphics.Shaders.World3D.ApplySettings();
+ else graphics.SetUniform(Uniform.spotLight, false);
graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
}
}
@@ -1463,17 +1430,16 @@ namespace CodeImp.DoomBuilder.Rendering
lpr = new Vector4(lights[i].Center, lights[i].LightRadius);
if (lpr.W == 0) continue;
Color4 lc = lights[i].LightColor;
- graphics.Shaders.World3D.LightColor = new Color4(lc.Alpha, (lc.Green + lc.Blue) / 2, (lc.Red + lc.Blue) / 2, (lc.Green + lc.Red) / 2);
- graphics.Shaders.World3D.LightPositionAndRadius = lpr;
+ graphics.SetUniform(Uniform.lightColor, new Color4(lc.Alpha, (lc.Green + lc.Blue) / 2, (lc.Red + lc.Blue) / 2, (lc.Green + lc.Red) / 2));
+ graphics.SetUniform(Uniform.lightPosAndRadius, lpr);
GZGeneral.LightData ld = lights[i].LightType;
if (ld.LightType == GZGeneral.LightType.SPOT)
{
- graphics.Shaders.World3D.SpotLight = true;
- graphics.Shaders.World3D.LightOrientation = lights[i].VectorLookAt;
- graphics.Shaders.World3D.Light2Radius = new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2));
+ graphics.SetUniform(Uniform.spotLight, true);
+ graphics.SetUniform(Uniform.lightOrientation, lights[i].VectorLookAt);
+ graphics.SetUniform(Uniform.light2Radius, new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2)));
}
- else graphics.Shaders.World3D.SpotLight = false;
- graphics.Shaders.World3D.ApplySettings();
+ else graphics.SetUniform(Uniform.spotLight, false);
graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
}
}
@@ -1488,9 +1454,9 @@ namespace CodeImp.DoomBuilder.Rendering
{
if (geometrytolit.Count == 0) return;
- graphics.Shaders.World3D.World = Matrix.Identity;
- graphics.Shaders.World3D.ModelNormal = Matrix.Identity;
- graphics.Shaders.World3D.BeginPass(SHADERPASS_LIGHT);
+ graphics.SetUniform(Uniform.world, Matrix.Identity);
+ graphics.SetUniform(Uniform.modelnormal, Matrix.Identity);
+ graphics.SetShader(Shader.world3d_lightpass);
VisualSector sector = null;
@@ -1501,7 +1467,6 @@ namespace CodeImp.DoomBuilder.Rendering
RenderLightsFromGeometryList(geometrytolit, lights, sector, true);
//
- graphics.Shaders.World3D.EndPass();
graphics.SetBlendOperation(BlendOperation.Add);
}
@@ -1511,9 +1476,9 @@ namespace CodeImp.DoomBuilder.Rendering
// Anything to do?
if (geometrytolit.Count == 0) return;
- graphics.Shaders.World3D.World = Matrix.Identity;
- graphics.Shaders.World3D.ModelNormal = Matrix.Identity;
- graphics.Shaders.World3D.BeginPass(SHADERPASS_LIGHT);
+ graphics.SetUniform(Uniform.world, Matrix.Identity);
+ graphics.SetUniform(Uniform.modelnormal, Matrix.Identity);
+ graphics.SetShader(Shader.world3d_lightpass);
VisualSector sector = null;
@@ -1523,32 +1488,31 @@ namespace CodeImp.DoomBuilder.Rendering
foreach (KeyValuePair> group in geometrytolit)
{
if (group.Key.Texture == null) continue;
- graphics.Shaders.World3D.Texture1 = group.Key.Texture;
+ graphics.SetUniform(Uniform.texture1, group.Key.Texture);
sector = RenderLightsFromGeometryList(group.Value, lights, sector, false);
}
- graphics.Shaders.World3D.EndPass();
graphics.SetBlendOperation(BlendOperation.Add);
}
//mxd. Render models
private void RenderModels(bool lightpass, bool trans)
{
- int shaderpass = (fullbrightness ? 1 : 4);
- int currentshaderpass = shaderpass;
- int highshaderpass = shaderpass + 2;
+ Shader shaderpass = (fullbrightness ? Shader.world3d_fullbright : Shader.world3d_main_vertexcolor);
+ Shader currentshaderpass = shaderpass;
+ Shader highshaderpass = (Shader)(shaderpass + 2);
RenderPass currentpass = RenderPass.Solid;
// Begin rendering with this shader
if (!lightpass)
{
- graphics.Shaders.World3D.BeginPass(currentshaderpass);
+ graphics.SetShader(currentshaderpass);
}
else
{
- graphics.Shaders.World3D.BeginPass(SHADERPASS_LIGHT);
+ graphics.SetShader(Shader.world3d_lightpass);
}
List things;
@@ -1599,10 +1563,10 @@ namespace CodeImp.DoomBuilder.Rendering
Color4 vertexcolor = new Color4(t.VertexColor);
// Check if model is affected by dynamic lights and set color accordingly
- graphics.Shaders.World3D.VertexColor = vertexcolor;
+ graphics.SetUniform(Uniform.vertexColor, vertexcolor);
// Determine the shader pass we want to use for this object
- int wantedshaderpass = ((((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass);
+ Shader wantedshaderpass = ((((t == highlighted) && showhighlight) || (t.Selected && showselection)) ? highshaderpass : shaderpass);
// If fog is enagled, switch to shader, which calculates it
if (General.Settings.GZDrawFog && !fullbrightness && t.Thing.Sector != null && t.Thing.Sector.FogMode != SectorFogMode.NONE)
@@ -1611,13 +1575,12 @@ namespace CodeImp.DoomBuilder.Rendering
// Switch shader pass?
if (!lightpass && currentshaderpass != wantedshaderpass)
{
- graphics.Shaders.World3D.EndPass();
- graphics.Shaders.World3D.BeginPass(wantedshaderpass);
+ graphics.SetShader(wantedshaderpass);
currentshaderpass = wantedshaderpass;
}
- // Set the colors to use
- graphics.Shaders.World3D.HighlightColor = CalculateHighlightColor((t == highlighted) && showhighlight, (t.Selected && showselection));
+ // Set the colors to use
+ graphics.SetUniform(Uniform.highlightcolor, CalculateHighlightColor((t == highlighted) && showhighlight, (t.Selected && showselection)));
// Create the matrix for positioning / rotation
float sx = t.Thing.ScaleX * t.Thing.ActorScale.Width;
@@ -1630,29 +1593,28 @@ namespace CodeImp.DoomBuilder.Rendering
ApplyMatrices3D();
// Set variables for fog rendering
- if(wantedshaderpass > 7)
+ if(wantedshaderpass > Shader.world3d_p7)
{
- graphics.Shaders.World3D.World = world;
+ graphics.SetUniform(Uniform.world, world);
// this is not right...
- graphics.Shaders.World3D.ModelNormal = General.Map.Data.ModeldefEntries[t.Thing.Type].TransformRotation * modelrotation;
- if (t.Thing.Sector != null) graphics.Shaders.World3D.LightColor = t.Thing.Sector.FogColor;
- graphics.Shaders.World3D.CameraPosition = new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, t.FogFactor);
+ graphics.SetUniform(Uniform.modelnormal, General.Map.Data.ModeldefEntries[t.Thing.Type].TransformRotation * modelrotation);
+ if (t.Thing.Sector != null) graphics.SetUniform(Uniform.lightColor, t.Thing.Sector.FogColor);
+ graphics.SetUniform(Uniform.campos, new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, t.FogFactor));
}
if (t.Thing.Sector != null)
- graphics.Shaders.World3D.Desaturation = t.Thing.Sector.Desaturation;
- else graphics.Shaders.World3D.Desaturation = 0;
+ graphics.SetUniform(Uniform.desaturation, t.Thing.Sector.Desaturation);
+ else graphics.SetUniform(Uniform.desaturation, 0.0f);
GZModel model = General.Map.Data.ModeldefEntries[t.Thing.Type].Model;
for (int j = 0; j < model.Meshes.Count; j++)
{
- graphics.Shaders.World3D.Texture1 = model.Textures[j];
- graphics.Shaders.World3D.ApplySettings();
+ graphics.SetUniform(Uniform.texture1, model.Textures[j]);
if (!lightpass)
{
// Render!
- model.Meshes[j].DrawSubset(0);
+ model.Meshes[j].Draw(graphics);
}
else if (lightpass && t.RenderPass != RenderPass.Additive) // additive stuff does not get any lighting
{
@@ -1672,18 +1634,17 @@ namespace CodeImp.DoomBuilder.Rendering
{
lpr = new Vector4(lights[i].Center, lights[i].LightRadius);
if (lpr.W == 0) continue;
- graphics.Shaders.World3D.LightColor = lights[i].LightColor;
- graphics.Shaders.World3D.LightPositionAndRadius = lpr;
+ graphics.SetUniform(Uniform.lightColor, lights[i].LightColor);
+ graphics.SetUniform(Uniform.lightPosAndRadius, lpr);
GZGeneral.LightData ld = lights[i].LightType;
if (ld.LightType == GZGeneral.LightType.SPOT)
{
- graphics.Shaders.World3D.SpotLight = true;
- graphics.Shaders.World3D.LightOrientation = lights[i].VectorLookAt;
- graphics.Shaders.World3D.Light2Radius = new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2));
+ graphics.SetUniform(Uniform.spotLight, true);
+ graphics.SetUniform(Uniform.lightOrientation, lights[i].VectorLookAt);
+ graphics.SetUniform(Uniform.light2Radius, new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2)));
}
- else graphics.Shaders.World3D.SpotLight = false;
- graphics.Shaders.World3D.ApplySettings();
- model.Meshes[j].DrawSubset(0);
+ else graphics.SetUniform(Uniform.spotLight, false);
+ model.Meshes[j].Draw(graphics);
}
}
}
@@ -1700,18 +1661,17 @@ namespace CodeImp.DoomBuilder.Rendering
{
lpr = new Vector4(lights[i].Center, lights[i].LightRadius);
if (lpr.W == 0) continue;
- graphics.Shaders.World3D.LightColor = lights[i].LightColor;
- graphics.Shaders.World3D.LightPositionAndRadius = lpr;
+ graphics.SetUniform(Uniform.lightColor, lights[i].LightColor);
+ graphics.SetUniform(Uniform.lightPosAndRadius, lpr);
GZGeneral.LightData ld = lights[i].LightType;
if (ld.LightType == GZGeneral.LightType.SPOT)
{
- graphics.Shaders.World3D.SpotLight = true;
- graphics.Shaders.World3D.LightOrientation = lights[i].VectorLookAt;
- graphics.Shaders.World3D.Light2Radius = new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2));
+ graphics.SetUniform(Uniform.spotLight, true);
+ graphics.SetUniform(Uniform.lightOrientation, lights[i].VectorLookAt);
+ graphics.SetUniform(Uniform.light2Radius, new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2)));
}
- else graphics.Shaders.World3D.SpotLight = false;
- graphics.Shaders.World3D.ApplySettings();
- model.Meshes[j].DrawSubset(0);
+ else graphics.SetUniform(Uniform.spotLight, false);
+ model.Meshes[j].Draw(graphics);
}
}
}
@@ -1728,18 +1688,17 @@ namespace CodeImp.DoomBuilder.Rendering
{
lpr = new Vector4(lights[i].Center, lights[i].LightRadius);
if (lpr.W == 0) continue;
- graphics.Shaders.World3D.LightColor = lights[i].LightColor;
- graphics.Shaders.World3D.LightPositionAndRadius = lpr;
+ graphics.SetUniform(Uniform.lightColor, lights[i].LightColor);
+ graphics.SetUniform(Uniform.lightPosAndRadius, lpr);
GZGeneral.LightData ld = lights[i].LightType;
if (ld.LightType == GZGeneral.LightType.SPOT)
{
- graphics.Shaders.World3D.SpotLight = true;
- graphics.Shaders.World3D.LightOrientation = lights[i].VectorLookAt;
- graphics.Shaders.World3D.Light2Radius = new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2));
+ graphics.SetUniform(Uniform.spotLight, true);
+ graphics.SetUniform(Uniform.lightOrientation, lights[i].VectorLookAt);
+ graphics.SetUniform(Uniform.light2Radius, new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2)));
}
- else graphics.Shaders.World3D.SpotLight = false;
- graphics.Shaders.World3D.ApplySettings();
- model.Meshes[j].DrawSubset(0);
+ else graphics.SetUniform(Uniform.spotLight, false);
+ model.Meshes[j].Draw(graphics);
}
}
}
@@ -1757,18 +1716,17 @@ namespace CodeImp.DoomBuilder.Rendering
lpr = new Vector4(lights[i].Center, lights[i].LightRadius);
if (lpr.W == 0) continue;
Color4 lc = lights[i].LightColor;
- graphics.Shaders.World3D.LightColor = new Color4(lc.Alpha, (lc.Green + lc.Blue) / 2, (lc.Red + lc.Blue) / 2, (lc.Green + lc.Red) / 2);
- graphics.Shaders.World3D.LightPositionAndRadius = lpr;
+ graphics.SetUniform(Uniform.lightColor, new Color4(lc.Alpha, (lc.Green + lc.Blue) / 2, (lc.Red + lc.Blue) / 2, (lc.Green + lc.Red) / 2));
+ graphics.SetUniform(Uniform.lightPosAndRadius, lpr);
GZGeneral.LightData ld = lights[i].LightType;
if (ld.LightType == GZGeneral.LightType.SPOT)
{
- graphics.Shaders.World3D.SpotLight = true;
- graphics.Shaders.World3D.LightOrientation = lights[i].VectorLookAt;
- graphics.Shaders.World3D.Light2Radius = new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2));
+ graphics.SetUniform(Uniform.spotLight, true);
+ graphics.SetUniform(Uniform.lightOrientation, lights[i].VectorLookAt);
+ graphics.SetUniform(Uniform.light2Radius, new Vector2(CosDeg(lights[i].LightSpotRadius1), CosDeg(lights[i].LightSpotRadius2)));
}
- else graphics.Shaders.World3D.SpotLight = false;
- graphics.Shaders.World3D.ApplySettings();
- model.Meshes[j].DrawSubset(0);
+ else graphics.SetUniform(Uniform.spotLight, false);
+ model.Meshes[j].Draw(graphics);
}
}
}
@@ -1776,7 +1734,6 @@ namespace CodeImp.DoomBuilder.Rendering
}
}
- graphics.Shaders.World3D.EndPass();
if (lightpass) graphics.SetBlendOperation(BlendOperation.Add);
}
@@ -1786,10 +1743,10 @@ namespace CodeImp.DoomBuilder.Rendering
VisualSector sector = null;
// Set render settings
- graphics.Shaders.World3D.BeginPass(SHADERPASS_SKYBOX);
- graphics.Shaders.World3D.Texture1 = General.Map.Data.SkyBox;
- graphics.Shaders.World3D.World = world;
- graphics.Shaders.World3D.CameraPosition = new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, 0f);
+ graphics.SetShader(Shader.world3d_skybox);
+ graphics.SetUniform(Uniform.texture1, General.Map.Data.SkyBox);
+ graphics.SetUniform(Uniform.world, world);
+ graphics.SetUniform(Uniform.campos, new Vector4(cameraposition.x, cameraposition.y, cameraposition.z, 0f));
foreach(VisualGeometry g in geo)
{
@@ -1817,18 +1774,10 @@ namespace CodeImp.DoomBuilder.Rendering
if(sector != null)
{
- // Set the colors to use
- graphics.Shaders.World3D.HighlightColor = CalculateHighlightColor((g == highlighted) && showhighlight, (g.Selected && showselection));
-
- // Apply changes
- graphics.Shaders.World3D.ApplySettings();
-
- // Render!
+ graphics.SetUniform(Uniform.highlightcolor, CalculateHighlightColor((g == highlighted) && showhighlight, (g.Selected && showselection)));
graphics.DrawPrimitives(PrimitiveType.TriangleList, g.VertexOffset, g.Triangles);
}
}
-
- graphics.Shaders.World3D.EndPass();
}
// [ZZ] this is copied from GZDoom
diff --git a/Source/Core/Rendering/ShaderManager.cs b/Source/Core/Rendering/ShaderManager.cs
index 4d7dbdde..51475426 100755
--- a/Source/Core/Rendering/ShaderManager.cs
+++ b/Source/Core/Rendering/ShaderManager.cs
@@ -32,8 +32,7 @@ namespace CodeImp.DoomBuilder.Rendering
// Shaders
private VertexDeclaration flatvertexdecl;
- private Things2DShader things2dshader;
- private World3DShader world3dshader;
+ private VertexDeclaration worldvertexdecl;
// Device
private RenderDevice device;
@@ -46,8 +45,7 @@ namespace CodeImp.DoomBuilder.Rendering
#region ================== Properties
public VertexDeclaration FlatVertexDecl { get { return flatvertexdecl; } }
- public Things2DShader Things2D { get { return things2dshader; } }
- public World3DShader World3D { get { return world3dshader; } }
+ public VertexDeclaration WorldVertexDecl { get { return worldvertexdecl; } }
public bool IsDisposed { get { return isdisposed; } }
internal RenderDevice D3DDevice { get { return device; } }
@@ -97,8 +95,7 @@ namespace CodeImp.DoomBuilder.Rendering
public void UnloadResource()
{
flatvertexdecl.Dispose();
- things2dshader.Dispose();
- world3dshader.Dispose();
+ worldvertexdecl.Dispose();
}
// Load resources
@@ -110,9 +107,13 @@ namespace CodeImp.DoomBuilder.Rendering
new VertexElement(0, 16, DeclarationType.Float2, DeclarationUsage.TextureCoordinate)
});
- things2dshader = new Things2DShader(this);
- world3dshader = new World3DShader(this);
- }
+ worldvertexdecl = 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),
+ new VertexElement(0, 24, DeclarationType.Float3, DeclarationUsage.Normal)
+ });
+ }
#endregion
@@ -127,5 +128,30 @@ namespace CodeImp.DoomBuilder.Rendering
D3DDevice.SetUniform(Uniform.filtersettings, (int)filter);
}
+ public void SetThings2DSettings(float alpha)
+ {
+ Vector4 values = new Vector4(0.0f, 0.0f, 1.0f, alpha);
+ D3DDevice.SetUniform(Uniform.rendersettings, values);
+ Matrix world = D3DDevice.GetTransform(TransformState.World);
+ Matrix view = D3DDevice.GetTransform(TransformState.View);
+ D3DDevice.SetUniform(Uniform.transformsettings, world * view);
+ }
+
+ //mxd. Used to render models
+ public void SetThings2DTransformSettings(Matrix world)
+ {
+ Matrix view = D3DDevice.GetTransform(TransformState.View);
+ D3DDevice.SetUniform(Uniform.transformsettings, world * view);
+ }
+
+ public void SetWorld3DConstants(bool bilinear, float maxanisotropy)
+ {
+ //mxd. It's still nice to have anisotropic filtering when texture filtering is disabled
+ TextureFilter magminfilter = (bilinear ? TextureFilter.Linear : TextureFilter.Point);
+ D3DDevice.SetUniform(Uniform.magfiltersettings, magminfilter);
+ D3DDevice.SetUniform(Uniform.minfiltersettings, (maxanisotropy > 1.0f ? TextureFilter.Anisotropic : magminfilter));
+ D3DDevice.SetUniform(Uniform.mipfiltersettings, (bilinear ? TextureFilter.Linear : TextureFilter.None)); // [SB] use None, otherwise textures are still filtered
+ D3DDevice.SetUniform(Uniform.maxanisotropysetting, maxanisotropy);
+ }
}
}
diff --git a/Source/Core/Rendering/SurfaceManager.cs b/Source/Core/Rendering/SurfaceManager.cs
index 25d7b332..b5362b60 100755
--- a/Source/Core/Rendering/SurfaceManager.cs
+++ b/Source/Core/Rendering/SurfaceManager.cs
@@ -632,7 +632,7 @@ namespace CodeImp.DoomBuilder.Rendering
graphics.DrawPrimitives(PrimitiveType.TriangleList, entry.vertexoffset + (entry.numvertices * surfacevertexoffsetmul), entry.numvertices / 3);
}
}
- graphics.SetUniform(Uniform.desaturation, 0);
+ graphics.SetUniform(Uniform.desaturation, 0.0f);
}
}
diff --git a/Source/Core/Rendering/Things2DShader.cs b/Source/Core/Rendering/Things2DShader.cs
deleted file mode 100755
index 31d8e1b6..00000000
--- a/Source/Core/Rendering/Things2DShader.cs
+++ /dev/null
@@ -1,148 +0,0 @@
-
-#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
-{
- internal sealed class Things2DShader : EffectShader
- {
- #region ================== Variables
-
- // Property handlers
- private readonly EffectHandle texture1;
- private readonly EffectHandle rendersettings;
- private readonly EffectHandle transformsettings;
- private readonly EffectHandle fillcolor; //mxd
- private readonly EffectHandle desaturationHandle; // [ZZ]
-
- #endregion
-
- #region ================== Properties
-
- public Texture Texture1 { set { effect.SetTexture(texture1, value); settingschanged = true; } }
-
- //mxd
- private Color4 fc;
- public Color4 FillColor
- {
- set
- {
- if(fc != value)
- {
- effect.SetValue(fillcolor, value);
- fc = value;
- settingschanged = true;
- }
- }
- }
-
- // [ZZ]
- private float desaturation;
- public float Desaturation
- {
- set
- {
- if (desaturation != value)
- {
- effect.SetValue(desaturationHandle, value);
- desaturation = value;
- settingschanged = true;
- }
- }
- }
-
- #endregion
-
- #region ================== Constructor / Disposer
-
- // Constructor
- public Things2DShader(ShaderManager manager) : base(manager)
- {
- // Load effect from file
- effect = LoadEffect("things2d.fx");
-
- // Get the property handlers from effect
- if(effect != null)
- {
- texture1 = effect.GetParameter(null, "texture1");
- rendersettings = effect.GetParameter(null, "rendersettings");
- transformsettings = effect.GetParameter(null, "transformsettings");
- fillcolor = effect.GetParameter(null, "fillColor"); //mxd
- desaturationHandle = effect.GetParameter(null, "desaturation"); // [ZZ]
- }
-
- // Initialize world vertex declaration
- VertexElement[] elements = new[]
- {
- new VertexElement(0, 0, DeclarationType.Float3, DeclarationUsage.Position),
- new VertexElement(0, 12, DeclarationType.Color, DeclarationUsage.Color),
- new VertexElement(0, 16, DeclarationType.Float2, DeclarationUsage.TextureCoordinate)
- };
- vertexdecl = new VertexDeclaration(elements);
-
- // We have no destructor
- GC.SuppressFinalize(this);
- }
-
- // Disposer
- public override void Dispose()
- {
- // Not already disposed?
- if(!isdisposed)
- {
- // Clean up
- if(texture1 != null) texture1.Dispose();
- if(rendersettings != null) rendersettings.Dispose();
- if(transformsettings != null) transformsettings.Dispose();
- if(fillcolor != null) fillcolor.Dispose(); //mxd
- if(desaturationHandle != null) desaturationHandle.Dispose();
-
- // Done
- base.Dispose();
- }
- }
-
- #endregion
-
- #region ================== Methods
-
- // This sets the settings
- public void SetSettings(float alpha)
- {
- Vector4 values = new Vector4(0.0f, 0.0f, 1.0f, alpha);
- effect.SetValue(rendersettings, values);
- Matrix world = manager.D3DDevice.GetTransform(TransformState.World);
- Matrix view = manager.D3DDevice.GetTransform(TransformState.View);
- effect.SetValue(transformsettings, world * view);
- settingschanged = true; //mxd
- }
-
- //mxd. Used to render models
- public void SetTransformSettings(Matrix world)
- {
- Matrix view = manager.D3DDevice.GetTransform(TransformState.View);
- effect.SetValue(transformsettings, world * view);
- settingschanged = true;
- }
-
- #endregion
- }
-}
diff --git a/Source/Core/Rendering/World3DShader.cs b/Source/Core/Rendering/World3DShader.cs
deleted file mode 100755
index 971c8d7f..00000000
--- a/Source/Core/Rendering/World3DShader.cs
+++ /dev/null
@@ -1,370 +0,0 @@
-
-#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
-{
- internal sealed class World3DShader : EffectShader
- {
- #region ================== Variables
-
- // Property handlers
- private readonly EffectHandle texture1;
- private readonly EffectHandle worldviewproj;
- private readonly EffectHandle minfiltersettings;
- private readonly EffectHandle magfiltersettings;
- private readonly EffectHandle mipfiltersettings;
- private readonly EffectHandle maxanisotropysetting;
- private readonly EffectHandle highlightcolor;
-
- //mxd
- private readonly EffectHandle vertexColorHandle;
- private readonly EffectHandle lightPositionAndRadiusHandle; //lights
- private readonly EffectHandle lightOrientationHandle;
- private readonly EffectHandle light2RadiusHandle;
- private readonly EffectHandle lightColorHandle;
- private readonly EffectHandle desaturationHandle;
- private readonly EffectHandle ignoreNormalsHandle;
- private readonly EffectHandle spotLightHandle;
- private readonly EffectHandle world;
- private readonly EffectHandle modelnormal;
- private readonly EffectHandle camPosHandle; //used for fog rendering
-
- // [ZZ]
- private readonly EffectHandle stencilColorHandle;
-
- #endregion
-
- #region ================== Properties
-
- private Matrix wwp;
- public Matrix WorldViewProj
- {
- set
- {
- if(wwp != value)
- {
- effect.SetValue(worldviewproj, value);
- wwp = value;
- settingschanged = true;
- }
- }
- }
-
- public BaseTexture Texture1 { set { effect.SetTexture(texture1, value); settingschanged = true; } }
-
- //mxd
- private Color4 vertexcolor;
- public Color4 VertexColor
- {
- set
- {
- if(vertexcolor != value)
- {
- effect.SetValue(vertexColorHandle, value);
- vertexcolor = value;
- settingschanged = true;
- }
- }
- }
-
- // [ZZ]
- private Color4 stencilcolor;
- public Color4 StencilColor
- {
- set
- {
- if (stencilcolor != value)
- {
- effect.SetValue(stencilColorHandle, value);
- stencilcolor = value;
- settingschanged = true;
- }
- }
- }
-
- //lights
- private Color4 lightcolor;
- public Color4 LightColor
- {
- set
- {
- if(lightcolor != value)
- {
- effect.SetValue(lightColorHandle, value);
- lightcolor = value;
- settingschanged = true;
- }
- }
- }
-
- // [ZZ] desaturation!
- private float desaturation;
- public float Desaturation
- {
- set
- {
- if (desaturation != value)
- {
- effect.SetValue(desaturationHandle, value);
- desaturation = value;
- settingschanged = true;
- }
- }
- }
-
- // [ZZ] emulating broken gz lights
- private bool ignorenormals;
- public bool IgnoreNormals
- {
- set
- {
- if (ignorenormals != value)
- {
- effect.SetValue(ignoreNormalsHandle, value ? 1f : 0f);
- ignorenormals = value;
- settingschanged = true;
- }
- }
- }
-
- private bool spotlight;
- public bool SpotLight
- {
- set
- {
- if (spotlight != value)
- {
- effect.SetValue(spotLightHandle, value ? 1f : 0f);
- spotlight = value;
- settingschanged = true;
- }
- }
- }
-
- private Vector4 lightpos;
- public Vector4 LightPositionAndRadius
- {
- set
- {
- if(lightpos != value)
- {
- effect.SetValue(lightPositionAndRadiusHandle, value);
- lightpos = value;
- settingschanged = true;
- }
- }
- }
-
- private Vector3 lightori;
- public Vector3 LightOrientation
- {
- set
- {
- if (lightori != value)
- {
- effect.SetValue(lightOrientationHandle, value);
- lightori = value;
- settingschanged = true;
- }
- }
- }
-
- private Vector2 light2rad;
- public Vector2 Light2Radius
- {
- set
- {
- if (light2rad != value)
- {
- effect.SetValue(light2RadiusHandle, value);
- light2rad = value;
- settingschanged = true;
- }
- }
- }
-
- //fog
- private Vector4 campos;
- public Vector4 CameraPosition
- {
- set
- {
- if(campos != value)
- {
- effect.SetValue(camPosHandle, value);
- campos = value;
- settingschanged = true;
- }
- }
- }
-
- private Matrix mworld;
- public Matrix World
- {
- set
- {
- if(mworld != value)
- {
- effect.SetValue(world, value);
- mworld = value;
- settingschanged = true;
- }
- }
- }
-
- private Matrix mmodelnormal;
- public Matrix ModelNormal
- {
- set
- {
- if (mmodelnormal != value)
- {
- effect.SetValue(modelnormal, value);
- mmodelnormal = value;
- settingschanged = true;
- }
- }
- }
-
- //mxd. This sets the highlight color
- private Color4 hicolor;
- public Color4 HighlightColor
- {
- set
- {
- if(hicolor != value)
- {
- effect.SetValue(highlightcolor, value);
- hicolor = value;
- settingschanged = true;
- }
- }
- }
-
- #endregion
-
- #region ================== Constructor / Disposer
-
- // Constructor
- public World3DShader(ShaderManager manager) : base(manager)
- {
- // Load effect from file
- effect = LoadEffect("world3d.fx");
-
- // Get the property handlers from effect
- if(effect != null)
- {
- worldviewproj = effect.GetParameter(null, "worldviewproj");
- texture1 = effect.GetParameter(null, "texture1");
- minfiltersettings = effect.GetParameter(null, "minfiltersettings");
- magfiltersettings = effect.GetParameter(null, "magfiltersettings");
- mipfiltersettings = effect.GetParameter(null, "mipfiltersettings");
- highlightcolor = effect.GetParameter(null, "highlightcolor");
- maxanisotropysetting = effect.GetParameter(null, "maxanisotropysetting");
-
- //mxd
- vertexColorHandle = effect.GetParameter(null, "vertexColor");
- //lights
- lightPositionAndRadiusHandle = effect.GetParameter(null, "lightPosAndRadius");
- lightOrientationHandle = effect.GetParameter(null, "lightOrientation");
- light2RadiusHandle = effect.GetParameter(null, "light2Radius");
- lightColorHandle = effect.GetParameter(null, "lightColor");
- desaturationHandle = effect.GetParameter(null, "desaturation");
- ignoreNormalsHandle = effect.GetParameter(null, "ignoreNormals");
- spotLightHandle = effect.GetParameter(null, "spotLight");
- //fog
- camPosHandle = effect.GetParameter(null, "campos");
-
- // [ZZ]
- stencilColorHandle = effect.GetParameter(null, "stencilColor");
-
- world = effect.GetParameter(null, "world");
- modelnormal = effect.GetParameter(null, "modelnormal");
- }
-
- // Initialize world vertex declaration
- VertexElement[] ve = {
- new VertexElement(0, 0, DeclarationType.Float3, DeclarationUsage.Position),
- new VertexElement(0, 12, DeclarationType.Color, DeclarationUsage.Color),
- new VertexElement(0, 16, DeclarationType.Float2, DeclarationUsage.TextureCoordinate),
- new VertexElement(0, 24, DeclarationType.Float3, DeclarationUsage.Normal)
- };
-
- vertexdecl = new VertexDeclaration(ve);
-
- // We have no destructor
- GC.SuppressFinalize(this);
- }
-
- // Disposer
- public override void Dispose()
- {
- // Not already disposed?
- if(!isdisposed)
- {
- // Clean up
- if(texture1 != null) texture1.Dispose();
- if(worldviewproj != null) worldviewproj.Dispose();
- if(minfiltersettings != null) minfiltersettings.Dispose();
- if(magfiltersettings != null) magfiltersettings.Dispose();
- if(mipfiltersettings != null) mipfiltersettings.Dispose();
- if(highlightcolor != null) highlightcolor.Dispose();
- if(maxanisotropysetting != null) maxanisotropysetting.Dispose();
-
- //mxd
- if(vertexColorHandle != null) vertexColorHandle.Dispose();
- if(lightColorHandle != null) lightColorHandle.Dispose();
- if(desaturationHandle != null) desaturationHandle.Dispose();
- if(ignoreNormalsHandle != null) ignoreNormalsHandle.Dispose();
- if(light2RadiusHandle != null) light2RadiusHandle.Dispose();
- if(lightOrientationHandle != null) lightOrientationHandle.Dispose();
- if(lightPositionAndRadiusHandle != null) lightPositionAndRadiusHandle.Dispose();
- if(camPosHandle != null) camPosHandle.Dispose();
- if(stencilColorHandle != null) stencilColorHandle.Dispose();
- if(world != null) world.Dispose();
- if(modelnormal != null) modelnormal.Dispose();
-
- // Done
- base.Dispose();
- }
- }
-
- #endregion
-
- #region ================== Methods
-
- // This sets the constant settings
- public void SetConstants(bool bilinear, float maxanisotropy)
- {
- //mxd. It's still nice to have anisotropic filtering when texture filtering is disabled
- TextureFilter magminfilter = (bilinear ? TextureFilter.Linear : TextureFilter.Point);
- effect.SetValue(magfiltersettings, magminfilter);
- effect.SetValue(minfiltersettings, (maxanisotropy > 1.0f ? TextureFilter.Anisotropic : magminfilter));
- effect.SetValue(mipfiltersettings, (bilinear ? TextureFilter.Linear : TextureFilter.None)); // [SB] use None, otherwise textures are still filtered
- effect.SetValue(maxanisotropysetting, maxanisotropy);
-
- settingschanged = true; //mxd
- }
-
- #endregion
- }
-}