Fixed, Visual mode: fixed D3DERR_INVALIDCALL error caused by a bug in classic skybox texture creation.

Fixed, Visual mode: aspect ratio was not updated when render area was resized.
Fixed, Visual mode: vertex handles were disappearing after using Reload Resources (F8) action.
Changed, internal: removed most of the fixed pipeline rendering code. The editor can no longer be used on a video card without Shader Model 2.0 support.
This commit is contained in:
MaxED 2016-01-14 22:15:54 +00:00
parent f0643cbd04
commit ada38c4454
15 changed files with 159 additions and 485 deletions

View file

@ -13,7 +13,7 @@
*/
#endregion
/*
#region ================== Namespaces
using System;
@ -97,3 +97,4 @@ namespace CodeImp.DoomBuilder.Data
#endregion
}
}
*/

View file

@ -498,6 +498,9 @@ namespace CodeImp.DoomBuilder.Data
// Add to all
alltextures.AddFlat(img.Value);
}
//mxd. Create skybox texture(s)
SetupSkybox();
// Start background loading
StartBackgroundLoader();
@ -1875,9 +1878,8 @@ namespace CodeImp.DoomBuilder.Data
return;
}
// Reset skybox texture
skybox.Dispose();
skybox = null;
// Rebuild skybox texture
SetupSkybox();
// Rebuild geometry if in Visual mode
if(General.Editing.Mode != null && General.Editing.Mode.GetType().Name == "BaseVisualMode")
@ -2357,11 +2359,6 @@ namespace CodeImp.DoomBuilder.Data
#region ================== mxd. Skybox Making
internal void UpdateSkybox()
{
if(skybox == null) SetupSkybox();
}
private void SetupSkybox()
{
// Get rid of old texture
@ -2489,14 +2486,33 @@ namespace CodeImp.DoomBuilder.Data
}
}
// Load the skysphere model...
// Get Device and shader...
Device device = General.Map.Graphics.Device;
World3DShader effect = General.Map.Graphics.Shaders.World3D;
// Make custom rendertarget
const int cubemaptexsize = 1024;
Surface rendertarget = Surface.CreateRenderTarget(device, cubemaptexsize, cubemaptexsize, Format.A8R8G8B8, MultisampleType.None, 0, false);
Surface depthbuffer = Surface.CreateDepthStencil(device, cubemaptexsize, cubemaptexsize, General.Map.Graphics.DepthBuffer.Description.Format, MultisampleType.None, 0, false);
// Start rendering
if(!General.Map.Graphics.StartRendering(true, new Color4(), rendertarget, depthbuffer))
{
General.ErrorLogger.Add(ErrorType.Error, "Skybox creation failed: unable to start rendering...");
// Get rid of unmanaged stuff...
rendertarget.Dispose();
depthbuffer.Dispose();
// No dice...
return null;
}
// Load the skysphere model...
BoundingBoxSizes bbs = new BoundingBoxSizes();
Stream modeldata = General.ThisAssembly.GetManifestResourceStream("CodeImp.DoomBuilder.Resources.SkySphere.md3");
ModelReader.MD3LoadResult result = ModelReader.ReadMD3Model(ref bbs, true, modeldata, device, 0);
if(result.Meshes.Count != 3) throw new Exception("Skybox creation failed: " + result.Errors);
ModelReader.MD3LoadResult meshes = ModelReader.ReadMD3Model(ref bbs, true, modeldata, device, 0);
if(meshes.Meshes.Count != 3) throw new Exception("Skybox creation failed: " + meshes.Errors);
// Make skysphere textures...
Texture texside = TextureFromBitmap(device, skyimage);
@ -2511,16 +2527,13 @@ namespace CodeImp.DoomBuilder.Data
else yscale = 1.2f * 1.17f;
// Make cubemap texture
const int cubemaptexsize = 1024;
CubeTexture cubemap = new CubeTexture(device, cubemaptexsize, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default);
CubeTexture cubemap = new CubeTexture(device, cubemaptexsize, 1, Usage.None, Format.A8R8G8B8, Pool.Managed);
Surface sysmemsurf = Surface.CreateOffscreenPlain(device, cubemaptexsize, cubemaptexsize, Format.A8R8G8B8, Pool.SystemMemory);
// Set render settings...
device.SetRenderState(RenderState.ZEnable, false);
device.SetRenderState(RenderState.CullMode, Cull.None);
// Make custom rendertarget
Surface rendertarget = Surface.CreateRenderTarget(device, cubemaptexsize, cubemaptexsize, Format.A8R8G8B8, MultisampleType.None, 0, false);
// Setup matrices
Vector3 offset = new Vector3(0f, 0f, -1.8f); // Sphere size is 10 mu
Matrix mworld = Matrix.Multiply(Matrix.Identity, Matrix.Translation(offset) * Matrix.Scaling(1.0f, 1.0f, yscale));
@ -2529,17 +2542,9 @@ namespace CodeImp.DoomBuilder.Data
// Place camera at origin
effect.CameraPosition = new Vector4();
// Set the rendertarget to our own RT surface
device.SetRenderTarget(0, rendertarget);
// Set custom depth stencil
device.DepthStencilSurface = Surface.CreateDepthStencil(device, cubemaptexsize, cubemaptexsize, General.Map.Graphics.DepthBuffer.Description.Format, MultisampleType.None, 0, false);
// Begin rendering
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkRed, 1.0f, 0);
device.BeginScene();
// Begin fullbright shaderpass
effect.Begin();
effect.BeginPass(1); // Fullbright pass
effect.BeginPass(1);
// Render to the six faces of the cube map
for(int i = 0; i < 6; i++)
@ -2548,10 +2553,10 @@ namespace CodeImp.DoomBuilder.Data
effect.WorldViewProj = mworld * faceview * mprojection;
// Render the skysphere meshes
for(int j = 0; j < result.Meshes.Count; j++)
for(int j = 0; j < meshes.Meshes.Count; j++)
{
// Set appropriate texture
switch(result.Skins[j])
switch(meshes.Skins[j])
{
case "top.png": effect.Texture1 = textop; break;
case "bottom.png": effect.Texture1 = texbottom; break;
@ -2563,29 +2568,49 @@ namespace CodeImp.DoomBuilder.Data
effect.ApplySettings();
// Render mesh
result.Meshes[j].DrawSubset(0);
meshes.Meshes[j].DrawSubset(0);
}
// Copy the rendered image from our RT surface to the texture face
Surface cubeface = cubemap.GetCubeMapSurface((CubeMapFace)i, 0);
device.StretchRectangle(rendertarget, cubeface, TextureFilter.None);
// Get rendered data from video memory...
device.GetRenderTargetData(rendertarget, sysmemsurf);
cubeface.Dispose();
// ...Then copy it to destination texture
Surface targetsurf = cubemap.GetCubeMapSurface((CubeMapFace)i, 0);
DataRectangle sourcerect = sysmemsurf.LockRectangle(LockFlags.NoSystemLock);
DataRectangle targetrect = targetsurf.LockRectangle(LockFlags.NoSystemLock);
if(sourcerect.Data.CanRead && targetrect.Data.CanWrite)
{
byte[] data = new byte[sourcerect.Data.Length];
sourcerect.Data.ReadRange(data, 0, (int)sourcerect.Data.Length);
targetrect.Data.Write(data, 0, data.Length);
}
else
{
General.ErrorLogger.Add(ErrorType.Error, "Skybox creation failed: unable to copy to CubeTexture surface...");
}
// Unlock and dispose
sysmemsurf.UnlockRectangle();
targetsurf.UnlockRectangle();
targetsurf.Dispose();
}
// End rendering
effect.EndPass();
effect.End();
device.EndScene();
General.Map.Graphics.FinishRendering();
// Dispose unneeded stuff
rendertarget.Dispose();
depthbuffer.Dispose();
sysmemsurf.Dispose();
textop.Dispose();
texside.Dispose();
texbottom.Dispose();
// Dispose skybox meshes
foreach(Mesh m in result.Meshes) m.Dispose();
foreach(Mesh m in meshes.Meshes) m.Dispose();
// All done...
return cubemap;

View file

@ -164,66 +164,20 @@ namespace CodeImp.DoomBuilder.Rendering
device.SetTransform(TransformState.View, Matrix.Identity);
device.SetTransform(TransformState.Projection, Matrix.Identity);
// Sampler settings
if(General.Settings.ClassicBilinear)
{
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.Point);
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
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);
// 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);
// No more further stages
device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.Disable);
// 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 alpha stage
device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Modulate);
device.SetTextureStageState(1, TextureStage.AlphaArg1, TextureArgument.Current);
device.SetTextureStageState(1, TextureStage.AlphaArg2, TextureArgument.TFactor);
// No more further stages
device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.Disable);
// Setup material
Material material = new Material();
material.Ambient = new Color4(Color.White);
material.Diffuse = new Color4(Color.White);
material.Specular = new Color4(Color.White);
device.Material = material;
device.Material = new Material {
Ambient = new Color4(Color.White),
Diffuse = new Color4(Color.White),
Specular = new Color4(Color.White)
};
// Shader settings
shaders.World3D.SetConstants(General.Settings.VisualBilinear, true, General.Settings.FilterAnisotropy);
shaders.World3D.SetConstants(General.Settings.VisualBilinear, General.Settings.FilterAnisotropy);
// Texture filters
postfilter = Filter.Point;
@ -295,6 +249,14 @@ namespace CodeImp.DoomBuilder.Rendering
return false;
}
//mxd. Check if we can use shaders
if(device.Capabilities.PixelShaderVersion.Major < 2)
{
// Failed
MessageBox.Show(General.MainWindow, "Unable to initialize the Direct3D video device. Video device with Shader Model 2.0 support is required.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
// Add event to cancel resize event
//device.DeviceResizing += new CancelEventHandler(CancelResize);

View file

@ -91,9 +91,6 @@ namespace CodeImp.DoomBuilder.Rendering
// This loads an effect
protected Effect LoadEffect(string fxfile)
{
// Return null when not using shaders
if(!manager.Enabled) return null;
Effect fx;
string errors = string.Empty;
@ -145,31 +142,31 @@ namespace CodeImp.DoomBuilder.Rendering
General.Map.Graphics.Device.VertexDeclaration = vertexdecl;
// Set effect
if(manager.Enabled) effect.Begin(FX.DoNotSaveState);
effect.Begin(FX.DoNotSaveState);
}
// This begins a pass
public virtual void BeginPass(int index)
{
if(manager.Enabled) effect.BeginPass(index);
effect.BeginPass(index);
}
// This ends a pass
public void EndPass()
{
if(manager.Enabled) effect.EndPass();
effect.EndPass();
}
// This ends te shader
public void End()
{
if(manager.Enabled) effect.End();
effect.End();
}
// This applies properties during a pass
public void ApplySettings()
{
if(manager.Enabled && settingschanged)
if(settingschanged)
{
effect.CommitChanges();
settingschanged = false; //mxd

View file

@ -38,7 +38,7 @@ namespace CodeImp.DoomBuilder.Rendering
#region ================== Properties
public Texture Texture1 { set { if(manager.Enabled) effect.SetTexture(texture1, value); settingschanged = true; } }
public Texture Texture1 { set { effect.SetTexture(texture1, value); settingschanged = true; } }
#endregion
@ -97,79 +97,14 @@ namespace CodeImp.DoomBuilder.Rendering
// This sets the settings
public void SetSettings(float texelx, float texely, float fsaafactor, float alpha, bool bilinear)
{
if(manager.Enabled)
{
Vector4 values = new Vector4(texelx, texely, fsaafactor, alpha);
effect.SetValue(rendersettings, values);
Matrix world = manager.D3DDevice.Device.GetTransform(TransformState.World);
Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
effect.SetValue(transformsettings, world * view);
TextureFilter filter = (bilinear ? TextureFilter.Linear : TextureFilter.Point);
effect.SetValue(filtersettings, (int)filter);
settingschanged = true; //mxd
}
}
// This sets up the render pipeline
public override void BeginPass(int index)
{
if(!manager.Enabled)
{
Device device = manager.D3DDevice.Device;
// Sampler settings
if(General.Settings.ClassicBilinear)
{
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.Point);
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
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);
// 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);
// No more further stages
device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.Disable);
// 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 alpha stage
device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Modulate);
device.SetTextureStageState(1, TextureStage.AlphaArg1, TextureArgument.Current);
device.SetTextureStageState(1, TextureStage.AlphaArg2, TextureArgument.TFactor);
// No more further stages
device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.Disable);
}
base.BeginPass(index);
Vector4 values = new Vector4(texelx, texely, fsaafactor, alpha);
effect.SetValue(rendersettings, values);
Matrix world = manager.D3DDevice.Device.GetTransform(TransformState.World);
Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
effect.SetValue(transformsettings, world * view);
TextureFilter filter = (bilinear ? TextureFilter.Linear : TextureFilter.Point);
effect.SetValue(filtersettings, (int)filter);
settingschanged = true; //mxd
}
#endregion

View file

@ -159,7 +159,7 @@ namespace CodeImp.DoomBuilder.Rendering
}
// This is called when the graphics need to be reset
public virtual void Reset() { }
//public virtual void Reset() { }
// For DirectX resources
public virtual void UnloadResource() { }

View file

@ -350,11 +350,11 @@ namespace CodeImp.DoomBuilder.Rendering
}
// This resets the graphics
public override void Reset()
/*public override void Reset()
{
UnloadResource();
ReloadResource();
}
}*/
// This destroys the rendertargets
public void DestroyRendertargets()

View file

@ -70,7 +70,7 @@ namespace CodeImp.DoomBuilder.Rendering
// Thing cage
private bool renderthingcages;
//mxd
private VisualVertexHandle vertexHandle;
private VisualVertexHandle vertexhandle;
private int[] lightOffsets;
// Crosshair
@ -81,8 +81,6 @@ namespace CodeImp.DoomBuilder.Rendering
private IVisualPickable highlighted;
private float highlightglow;
private float highlightglowinv;
private ColorImage highlightimage;
private ColorImage selectionimage;
private bool showselection;
private bool showhighlight;
@ -144,8 +142,6 @@ namespace CodeImp.DoomBuilder.Rendering
// Initialize
CreateProjection();
CreateMatrices2D();
SetupHelperObjects(); //mxd
SetupTextures();
renderthingcages = true;
showselection = true;
showhighlight = true;
@ -166,11 +162,7 @@ namespace CodeImp.DoomBuilder.Rendering
if(!isdisposed)
{
// Clean up
if(selectionimage != null) selectionimage.Dispose();
if(highlightimage != null) highlightimage.Dispose();
selectionimage = null;
highlightimage = null;
vertexHandle.Dispose(); //mxd
if(vertexhandle != null) vertexhandle.Dispose(); //mxd
// Done
base.Dispose();
@ -186,11 +178,6 @@ namespace CodeImp.DoomBuilder.Rendering
public override void UnloadResource()
{
crosshairverts = null;
if(selectionimage != null) selectionimage.Dispose();
if(highlightimage != null) highlightimage.Dispose();
selectionimage = null;
highlightimage = null;
}
// This is called resets when the device is reset
@ -198,7 +185,6 @@ namespace CodeImp.DoomBuilder.Rendering
public override void ReloadResource()
{
CreateMatrices2D();
SetupTextures();
}
// This makes screen vertices for display
@ -233,32 +219,14 @@ namespace CodeImp.DoomBuilder.Rendering
#region ================== Resources
// This loads the textures for highlight and selection if we need them
private void SetupTextures()
{
if(!graphics.Shaders.Enabled)
{
highlightimage = new ColorImage(General.Colors.Highlight, 32, 32);
highlightimage.LoadImage();
highlightimage.CreateTexture();
selectionimage = new ColorImage(General.Colors.Selection, 32, 32);
selectionimage.LoadImage();
selectionimage.CreateTexture();
}
}
//mxd
private void SetupHelperObjects()
{
vertexHandle = new VisualVertexHandle();
}
//mxd
internal void UpdateVertexHandle()
{
vertexHandle.UnloadResource();
vertexHandle.ReloadResource();
if(vertexhandle != null)
{
vertexhandle.UnloadResource();
vertexhandle.ReloadResource();
}
}
#endregion
@ -284,9 +252,7 @@ namespace CodeImp.DoomBuilder.Rendering
// Make the projection matrix
projection = Matrix.PerspectiveFovRH(fovy, aspect, PROJ_NEAR_PLANE, General.Settings.ViewDistance);
// Apply matrices
ApplyMatrices3D();
viewproj = view3d * projection; //mxd
}
// This creates matrices for a camera view
@ -388,6 +354,9 @@ namespace CodeImp.DoomBuilder.Rendering
// Create crosshair vertices
if(crosshairverts == null)
CreateCrosshairVerts(new Size(General.Map.Data.Crosshair3D.Width, General.Map.Data.Crosshair3D.Height));
//mxd. Crate vertex handle
if(vertexhandle == null) vertexhandle = new VisualVertexHandle();
// Ready
return true;
@ -645,7 +614,7 @@ namespace CodeImp.DoomBuilder.Rendering
//Commence drawing!!11
graphics.Shaders.World3D.ApplySettings();
graphics.Device.SetStreamSource(0, v.CeilingVertex ? vertexHandle.Upper : vertexHandle.Lower, 0, WorldVertex.Stride);
graphics.Device.SetStreamSource(0, v.CeilingVertex ? vertexhandle.Upper : vertexhandle.Lower, 0, WorldVertex.Stride);
graphics.Device.DrawPrimitives(PrimitiveType.LineList, 0, 8);
}

View file

@ -32,8 +32,7 @@ namespace CodeImp.DoomBuilder.Rendering
#region ================== Variables
// Settings
private string shadertechnique;
private bool useshaders;
private readonly string shadertechnique;
// Shaders
private Display2DShader display2dshader;
@ -50,7 +49,6 @@ namespace CodeImp.DoomBuilder.Rendering
#region ================== Properties
public bool Enabled { get { return useshaders; } }
public string ShaderTechnique { get { return shadertechnique; } }
public Display2DShader Display2D { get { return display2dshader; } }
public Things2DShader Things2D { get { return things2dshader; } }
@ -67,6 +65,7 @@ namespace CodeImp.DoomBuilder.Rendering
{
// Initialize
this.device = device;
shadertechnique = "SM20"; //mxd
// Load
ReloadResource();
@ -111,11 +110,6 @@ namespace CodeImp.DoomBuilder.Rendering
// Load resources
public void ReloadResource()
{
// Check if we can use shaders
Capabilities caps = General.Map.Graphics.Device.Capabilities;
useshaders = (caps.PixelShaderVersion.Major >= 2);
shadertechnique = "SM20";
// Initialize effects
display2dshader = new Display2DShader(this);
things2dshader = new Things2DShader(this);

View file

@ -665,7 +665,6 @@ namespace CodeImp.DoomBuilder.Rendering
{
// Set texture
graphics.Shaders.Display2D.Texture1 = imgsurfaces.Key.Texture;
if(!graphics.Shaders.Enabled) graphics.Device.SetTexture(0, imgsurfaces.Key.Texture);
graphics.Shaders.Display2D.BeginPass(pass);

View file

@ -38,7 +38,7 @@ namespace CodeImp.DoomBuilder.Rendering
#region ================== Properties
public Texture Texture1 { set { if(manager.Enabled) effect.SetTexture(texture1, value); settingschanged = true; } }
public Texture Texture1 { set { effect.SetTexture(texture1, value); settingschanged = true; } }
//mxd
private Color4 fc;
@ -46,7 +46,7 @@ namespace CodeImp.DoomBuilder.Rendering
{
set
{
if(manager.Enabled && fc != value)
if(fc != value)
{
effect.SetValue(fillcolor, value);
fc = value;
@ -112,88 +112,20 @@ namespace CodeImp.DoomBuilder.Rendering
// This sets the settings
public void SetSettings(float alpha)
{
if(manager.Enabled)
{
Vector4 values = new Vector4(0.0f, 0.0f, 1.0f, alpha);
effect.SetValue(rendersettings, values);
Matrix world = manager.D3DDevice.Device.GetTransform(TransformState.World);
Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
effect.SetValue(transformsettings, world * view);
settingschanged = true; //mxd
}
Vector4 values = new Vector4(0.0f, 0.0f, 1.0f, alpha);
effect.SetValue(rendersettings, values);
Matrix world = manager.D3DDevice.Device.GetTransform(TransformState.World);
Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
effect.SetValue(transformsettings, world * view);
settingschanged = true; //mxd
}
//mxd. Used to render models
public void SetTransformSettings(Matrix world)
{
if(manager.Enabled)
{
Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
effect.SetValue(transformsettings, world * view);
settingschanged = true;
}
}
// This sets up the render pipeline
public override void BeginPass(int index)
{
if(!manager.Enabled)
{
Device device = manager.D3DDevice.Device;
// Sampler settings
if(General.Settings.ClassicBilinear)
{
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.Point);
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
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);
// 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);
// No more further stages
device.SetTextureStageState(2, TextureStage.ColorOperation, TextureOperation.Disable);
// 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 alpha stage
device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Modulate);
device.SetTextureStageState(1, TextureStage.AlphaArg1, TextureArgument.Current);
device.SetTextureStageState(1, TextureStage.AlphaArg2, TextureArgument.TFactor);
// No more further stages
device.SetTextureStageState(2, TextureStage.AlphaOperation, TextureOperation.Disable);
}
base.BeginPass(index);
Matrix view = manager.D3DDevice.Device.GetTransform(TransformState.View);
effect.SetValue(transformsettings, world * view);
settingschanged = true;
}
#endregion

View file

@ -58,7 +58,7 @@ namespace CodeImp.DoomBuilder.Rendering
{
set
{
if(manager.Enabled && wwp != value)
if(wwp != value)
{
effect.SetValue(worldviewproj, value);
wwp = value;
@ -67,7 +67,7 @@ namespace CodeImp.DoomBuilder.Rendering
}
}
public BaseTexture Texture1 { set { if(manager.Enabled) effect.SetTexture(texture1, value); settingschanged = true; } }
public BaseTexture Texture1 { set { effect.SetTexture(texture1, value); settingschanged = true; } }
//mxd
private Color4 vertexcolor;
@ -75,7 +75,7 @@ namespace CodeImp.DoomBuilder.Rendering
{
set
{
if(manager.Enabled && vertexcolor != value)
if(vertexcolor != value)
{
effect.SetValue(vertexColorHadle, value);
vertexcolor = value;
@ -90,7 +90,7 @@ namespace CodeImp.DoomBuilder.Rendering
{
set
{
if(manager.Enabled && lightcolor != value)
if(lightcolor != value)
{
effect.SetValue(lightColorHandle, value);
lightcolor = value;
@ -104,7 +104,7 @@ namespace CodeImp.DoomBuilder.Rendering
{
set
{
if(manager.Enabled && value != lightpos)
if(lightpos != value)
{
effect.SetValue(lightPositionAndRadiusHandle, value);
lightpos = value;
@ -119,7 +119,7 @@ namespace CodeImp.DoomBuilder.Rendering
{
set
{
if(manager.Enabled && campos != value)
if(campos != value)
{
effect.SetValue(camPosHandle, value);
campos = value;
@ -133,7 +133,7 @@ namespace CodeImp.DoomBuilder.Rendering
{
set
{
if(manager.Enabled && mworld != value)
if(mworld != value)
{
effect.SetValue(world, value);
mworld = value;
@ -148,7 +148,7 @@ namespace CodeImp.DoomBuilder.Rendering
{
set
{
if(manager.Enabled && hicolor != value)
if(hicolor != value)
{
effect.SetValue(highlightcolor, value);
hicolor = value;
@ -190,27 +190,15 @@ namespace CodeImp.DoomBuilder.Rendering
}
// Initialize world vertex declaration
if(manager.Enabled) //mxd
{
vertexElements = new[]
{
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),
new VertexElement(0, 24, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Normal, 0), //mxd
VertexElement.VertexDeclarationEnd
};
}
else
vertexElements = new[]
{
vertexElements = new[]
{
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),
VertexElement.VertexDeclarationEnd
};
}
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),
new VertexElement(0, 24, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Normal, 0), //mxd
VertexElement.VertexDeclarationEnd
};
vertexdecl = new VertexDeclaration(General.Map.Graphics.Device, vertexElements);
// We have no destructor
@ -249,148 +237,24 @@ namespace CodeImp.DoomBuilder.Rendering
#region ================== Methods
// This sets the constant settings
public void SetConstants(bool bilinear, bool useanisotropic, float maxanisotropy)
public void SetConstants(bool bilinear, float maxanisotropy)
{
if(manager.Enabled)
if(bilinear)
{
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);
}
settingschanged = true; //mxd
effect.SetValue(magfiltersettings, (int)TextureFilter.Linear);
effect.SetValue(minfiltersettings, (int)TextureFilter.Anisotropic);
effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
effect.SetValue(maxanisotropysetting, maxanisotropy);
}
}
// This sets up the render pipeline
public override void BeginPass(int index)
{
if(!manager.Enabled)
else
{
Device device = manager.D3DDevice.Device;
// 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);
}
effect.SetValue(magfiltersettings, (int)TextureFilter.Point);
effect.SetValue(minfiltersettings, (int)TextureFilter.Point);
effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear);
effect.SetValue(maxanisotropysetting, 1.0f);
}
base.BeginPass(index);
settingschanged = true; //mxd
}
#endregion

View file

@ -158,9 +158,6 @@ namespace CodeImp.DoomBuilder.VisualModes
{
base.OnEngage();
//mxd. Sky texture may need recreating
General.Map.Data.UpdateSkybox();
// Update projection (mxd)
General.Map.CRenderer3D.CreateProjection();
@ -881,9 +878,6 @@ namespace CodeImp.DoomBuilder.VisualModes
// Make new blockmap
FillBlockMap();
//mxd. Sky texture may need recreating
General.Map.Data.UpdateSkybox();
// Visibility culling (this re-creates the needed resources)
DoCulling();
}

View file

@ -1067,6 +1067,9 @@ namespace CodeImp.DoomBuilder.Windows
{
// Reset graphics to match changes
General.Map.Graphics.Reset();
//mxd. Aspect ratio may've been changed
General.Map.CRenderer3D.CreateProjection();
}
// This is a dirty trick to give the display a new mousemove event with correct arguments
@ -4001,21 +4004,19 @@ namespace CodeImp.DoomBuilder.Windows
float deltatime = curtime - lastupdatetime;
lastupdatetime = curtime;
// In exclusive mouse mode?
if(mouseinput != null)
if((General.Map != null) && (General.Editing.Mode != null))
{
// Process mouse input
Vector2D deltamouse = mouseinput.Process();
if((General.Map != null) && (General.Editing.Mode != null))
// In exclusive mouse mode?
if(mouseinput != null)
{
Vector2D deltamouse = mouseinput.Process();
General.Plugins.OnEditMouseInput(deltamouse);
General.Editing.Mode.OnMouseInput(deltamouse);
}
}
// Process signal
if((General.Map != null) && (General.Editing.Mode != null))
// Process signal
General.Editing.Mode.OnProcess(deltatime);
}
}
#endregion

View file

@ -1277,6 +1277,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
{
base.ResourcesReloaded();
RebuildElementData();
UpdateChangedObjects(); //mxd
PickTarget();
}