UltimateZoneBuilder/Source/Core/Rendering/World3DShader.cs
MaxED 9a72148ad1 GZDoomBuilder 1.06:
Fog rendering (including colored fog in maps in UDMF format).
Fixed lots of bugs in model loading and rendering.
Added "Toggle GZDoom Effects" button, which currently toggles dynamic lights, models and fog rendering.
Model loading process is more verbose now, so if something goes wrong, check Errors and Warnings window (F11) for details.
ColorPicker plugin:
You can now select surfaces in 3D-mode and then open Color Picker window to edit sector colors of sectors, to which these surfaces belong.
If nothing is selected, you can hilight a surface and then open Color Picker window to edit sector colors of sector, to which hilighted surface belongs.
If nothing is selected, you can hilight a Light Thing and then open Color Picker window to edit it's properties.
2012-05-20 00:56:59 +00:00

330 lines
13 KiB
C#

#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.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
using System.Drawing;
using System.ComponentModel;
using CodeImp.DoomBuilder.Map;
using SlimDX.Direct3D9;
using SlimDX;
using CodeImp.DoomBuilder.Geometry;
using System.Drawing.Imaging;
#endregion
namespace CodeImp.DoomBuilder.Rendering
{
internal sealed class World3DShader : D3DShader
{
#region ================== Variables
// Property handlers
private EffectHandle texture1;
private EffectHandle worldviewproj;
private EffectHandle minfiltersettings;
private EffectHandle magfiltersettings;
private EffectHandle mipfiltersettings;
private EffectHandle maxanisotropysetting;
private EffectHandle modulatecolor;
private EffectHandle highlightcolor;
//mxd
private EffectHandle vertexColorHadle;
//lights
private EffectHandle lightPositionAndRadiusHandle;
private EffectHandle lightColorHandle;
private EffectHandle worldHandle;
//fog
private EffectHandle camPosHandle;
//used in ModelReader
private VertexElement[] vertexElements;
#endregion
#region ================== Properties
public Matrix WorldViewProj { set { if(manager.Enabled) effect.SetValue<Matrix>(worldviewproj, value); } }
public Texture Texture1 { set { if(manager.Enabled) effect.SetTexture(texture1, value); } }
//mxd
public Color4 VertexColor { set { if (manager.Enabled) effect.SetValue<Color4>(vertexColorHadle, value); } }
//lights
public Color4 LightColor { set { if (manager.Enabled) effect.SetValue<Color4>(lightColorHandle, value); } }
public Vector4 LightPositionAndRadius { set { if (manager.Enabled) effect.SetValue(lightPositionAndRadiusHandle, value); } }
//fog
public Vector4 CameraPosition { set { if (manager.Enabled) effect.SetValue(camPosHandle, value); } }
public Matrix World { set { if (manager.Enabled) effect.SetValue<Matrix>(worldHandle, value); } }
public VertexElement[] VertexElements { get { return vertexElements; } }
#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");
modulatecolor = effect.GetParameter(null, "modulatecolor");
highlightcolor = effect.GetParameter(null, "highlightcolor");
maxanisotropysetting = effect.GetParameter(null, "maxanisotropysetting");
//mxd
vertexColorHadle = effect.GetParameter(null, "vertexColor");
//lights
lightPositionAndRadiusHandle = effect.GetParameter(null, "lightPosAndRadius");
lightColorHandle = effect.GetParameter(null, "lightColor");
//fog
camPosHandle = effect.GetParameter(null, "cameraPos");
worldHandle = effect.GetParameter(null, "world");
}
// Initialize world vertex declaration
vertexElements = new VertexElement[]
{
new VertexElement(0, 0, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position, 0),
new VertexElement(0, 12, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0),
new VertexElement(0, 16, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),
//mxd
new VertexElement(0, 24, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Normal, 0),
VertexElement.VertexDeclarationEnd
};
vertexdecl = new VertexDeclaration(General.Map.Graphics.Device, vertexElements);
// 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(modulatecolor != null) modulatecolor.Dispose();
if(highlightcolor != null) highlightcolor.Dispose();
if(maxanisotropysetting != null) maxanisotropysetting.Dispose();
//mxd
if (vertexColorHadle != null) vertexColorHadle.Dispose();
if (lightColorHandle != null) lightColorHandle.Dispose();
if (lightPositionAndRadiusHandle != null) lightPositionAndRadiusHandle.Dispose();
if (camPosHandle != null) camPosHandle.Dispose();
if (worldHandle != null) worldHandle.Dispose();
// Done
base.Dispose();
}
}
#endregion
#region ================== Methods
// This sets the constant settings
public void SetConstants(bool bilinear, bool useanisotropic, float maxanisotropy)
{
if(manager.Enabled)
{
if(bilinear)
{
if(useanisotropic)
{
effect.SetValue(magfiltersettings, (int)TextureFilter.Linear);
effect.SetValue(minfiltersettings, (int)TextureFilter.Anisotropic);
effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
effect.SetValue(maxanisotropysetting, maxanisotropy);
}
else
{
effect.SetValue(magfiltersettings, (int)TextureFilter.Linear);
effect.SetValue(minfiltersettings, (int)TextureFilter.Linear);
effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
effect.SetValue(maxanisotropysetting, 1.0f);
}
}
else
{
effect.SetValue(magfiltersettings, (int)TextureFilter.Point);
effect.SetValue(minfiltersettings, (int)TextureFilter.Point);
effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
effect.SetValue(maxanisotropysetting, 1.0f);
}
}
}
// This sets the modulation color
public void SetModulateColor(int modcolor)
{
if(manager.Enabled)
{
effect.SetValue(modulatecolor, new Color4(modcolor));
}
}
// This sets the highlight color
public void SetHighlightColor(int hicolor)
{
if(manager.Enabled)
{
effect.SetValue(highlightcolor, new Color4(hicolor));
}
}
// This sets up the render pipeline
public override void BeginPass(int index)
{
Device device = manager.D3DDevice.Device;
if(!manager.Enabled)
{
// Sampler settings
if(General.Settings.VisualBilinear)
{
device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear);
device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);
device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);
device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
}
else
{
device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Point);
device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Point);
device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);
device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f);
}
// Texture addressing
device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
// First texture stage
//mxd
//if((index == 0) || (index == 2))
if ((index == 0) || (index == 2) || (index == 4) || (index == 6) || (index == 8) || (index == 10) || (index == 12) || (index == 14) || index > 15)
{
// Normal
device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);
device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
device.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.Diffuse);
device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current);
device.SetTextureStageState(0, TextureStage.TexCoordIndex, 0);
}
else
{
// Full brightness
device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg1);
device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current);
device.SetTextureStageState(0, TextureStage.TexCoordIndex, 0);
}
// First alpha stage
device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Modulate);
device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);
device.SetTextureStageState(0, TextureStage.AlphaArg2, TextureArgument.Diffuse);
// Second texture stage
device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.Modulate);
device.SetTextureStageState(1, TextureStage.ColorArg1, TextureArgument.Current);
device.SetTextureStageState(1, TextureStage.ColorArg2, TextureArgument.TFactor);
device.SetTextureStageState(1, TextureStage.ResultArg, TextureArgument.Current);
device.SetTextureStageState(1, TextureStage.TexCoordIndex, 0);
// Second alpha stage
device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Modulate);
device.SetTextureStageState(1, TextureStage.AlphaArg1, TextureArgument.Current);
device.SetTextureStageState(1, TextureStage.AlphaArg2, TextureArgument.TFactor);
// Highlight?
//mxd
//if(index > 1) 2 3 6 10 14
//if ((index > 1 && index < 4) || (index > 5 && index < 8) || (index > 9 && index < 12) || (index > 13 && index < 16))
if (index == 2 || index == 3 || index == 6 || index == 10 || index == 14)
{
// Third texture stage
device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.AddSigned);
device.SetTextureStageState(2, TextureStage.ColorArg1, TextureArgument.Current);
device.SetTextureStageState(2, TextureStage.ColorArg2, TextureArgument.Texture);
device.SetTextureStageState(2, TextureStage.ColorArg0, TextureArgument.Texture);
device.SetTextureStageState(2, TextureStage.ResultArg, TextureArgument.Current);
device.SetTextureStageState(2, TextureStage.TexCoordIndex, 0);
// Third alpha stage
device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.SelectArg1);
device.SetTextureStageState(2, TextureStage.AlphaArg1, TextureArgument.Current);
// Fourth texture stage
device.SetTextureStageState(3, TextureStage.ColorOperation, TextureOperation.AddSigned);
device.SetTextureStageState(3, TextureStage.ColorArg1, TextureArgument.Current);
device.SetTextureStageState(3, TextureStage.ColorArg2, TextureArgument.Texture);
device.SetTextureStageState(3, TextureStage.ColorArg0, TextureArgument.Texture);
device.SetTextureStageState(3, TextureStage.ResultArg, TextureArgument.Current);
device.SetTextureStageState(3, TextureStage.TexCoordIndex, 0);
// Fourth alpha stage
device.SetTextureStageState(3, TextureStage.AlphaOperation, TextureOperation.SelectArg1);
device.SetTextureStageState(3, TextureStage.AlphaArg1, TextureArgument.Current);
// No more further stages
device.SetTextureStageState(4, TextureStage.ColorOperation, TextureOperation.Disable);
device.SetTextureStageState(4, TextureStage.AlphaOperation, TextureOperation.Disable);
}
else
{
// No more further stages
device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.Disable);
device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.Disable);
}
}
base.BeginPass(index);
}
#endregion
}
}