diff --git a/Source/Core/Data/ColorImage.cs b/Source/Core/Data/ColorImage.cs index 67f09416c484dead872bd8b5d5166c0a4f17c61c..0c125fc2152cfeee6901997503f0171a84889757 100644 --- a/Source/Core/Data/ColorImage.cs +++ b/Source/Core/Data/ColorImage.cs @@ -13,7 +13,7 @@ */ #endregion - +/* #region ================== Namespaces using System; @@ -97,3 +97,4 @@ namespace CodeImp.DoomBuilder.Data #endregion } } +*/ \ No newline at end of file diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs index cf988f289a16d21a07f5737e8b9ac09a3e96e938..191410224e0689dac97fe6a7c57b7a2ea3518306 100644 --- a/Source/Core/Data/DataManager.cs +++ b/Source/Core/Data/DataManager.cs @@ -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); + + // ...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..."); + } - cubeface.Dispose(); + // 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; diff --git a/Source/Core/Rendering/D3DDevice.cs b/Source/Core/Rendering/D3DDevice.cs index 0f7f0cd91e6f5bd4145707b69fb4029364c14d64..e328027c887051077a56869b58f6c527981ad548 100644 --- a/Source/Core/Rendering/D3DDevice.cs +++ b/Source/Core/Rendering/D3DDevice.cs @@ -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); diff --git a/Source/Core/Rendering/D3DShader.cs b/Source/Core/Rendering/D3DShader.cs index b67b48f8dce433c948792668b0818770669c04a0..deae788bcf08acece5362e8e279b323c05798cee 100644 --- a/Source/Core/Rendering/D3DShader.cs +++ b/Source/Core/Rendering/D3DShader.cs @@ -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 diff --git a/Source/Core/Rendering/Display2DShader.cs b/Source/Core/Rendering/Display2DShader.cs index 48ad5f96d42721161752662780f6f3a433ff6c76..5bf3c2d3cfeed3b5121ea32122f7d6d0ea9a783e 100644 --- a/Source/Core/Rendering/Display2DShader.cs +++ b/Source/Core/Rendering/Display2DShader.cs @@ -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 diff --git a/Source/Core/Rendering/Renderer.cs b/Source/Core/Rendering/Renderer.cs index 85d8c7f31a396cb5bb24a2bd01e93b6edcec46fc..719b00e54a03276babf7e59ada8da07b0f3ed654 100644 --- a/Source/Core/Rendering/Renderer.cs +++ b/Source/Core/Rendering/Renderer.cs @@ -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() { } diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs index 36d29ad23722dcbf0aa93f55e3fc41fc9e155b92..208143db30bbcbc753ac19243df39877a583fd0a 100644 --- a/Source/Core/Rendering/Renderer2D.cs +++ b/Source/Core/Rendering/Renderer2D.cs @@ -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() diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs index 5c3f7158a7c3eb4cddc4fc8952bd00d788e7168e..257e8d4bf6745084ecb83908433d7060888298af 100644 --- a/Source/Core/Rendering/Renderer3D.cs +++ b/Source/Core/Rendering/Renderer3D.cs @@ -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); } diff --git a/Source/Core/Rendering/ShaderManager.cs b/Source/Core/Rendering/ShaderManager.cs index 243715413a279dcf8030dbeaa688472917da8888..3497645fd8fc0e77299df4deaf85d5c88a2423d6 100644 --- a/Source/Core/Rendering/ShaderManager.cs +++ b/Source/Core/Rendering/ShaderManager.cs @@ -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); diff --git a/Source/Core/Rendering/SurfaceManager.cs b/Source/Core/Rendering/SurfaceManager.cs index d5109d4523b95a5623d7a3481816fec0444489bc..6be14c33a8e247cbe659104a6c0274312bd14557 100644 --- a/Source/Core/Rendering/SurfaceManager.cs +++ b/Source/Core/Rendering/SurfaceManager.cs @@ -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); diff --git a/Source/Core/Rendering/Things2DShader.cs b/Source/Core/Rendering/Things2DShader.cs index 1f1fd495640240e83b399f48bf0831551e03516d..0b41641070d6a55bfaab19343ca7e203db9e2712 100644 --- a/Source/Core/Rendering/Things2DShader.cs +++ b/Source/Core/Rendering/Things2DShader.cs @@ -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 diff --git a/Source/Core/Rendering/World3DShader.cs b/Source/Core/Rendering/World3DShader.cs index a2d023ecf86577da27af097d376d4afc0b6dfa93..0cec5ca85697219547201bcae01c213581c73c04 100644 --- a/Source/Core/Rendering/World3DShader.cs +++ b/Source/Core/Rendering/World3DShader.cs @@ -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 diff --git a/Source/Core/VisualModes/VisualMode.cs b/Source/Core/VisualModes/VisualMode.cs index f8f93ae0874e94ee698307c809f765606dbc189c..40fa7711ee40ee6905323c0959934097d3236ea2 100644 --- a/Source/Core/VisualModes/VisualMode.cs +++ b/Source/Core/VisualModes/VisualMode.cs @@ -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(); } diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs index 2382206740e41b4414889857d0149375da9a55a5..355b4b91da8b8c78f07030f9dcb219547bbde7d3 100644 --- a/Source/Core/Windows/MainForm.cs +++ b/Source/Core/Windows/MainForm.cs @@ -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 diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs index c231860de417629f17d56facd684351c54090396..4e020853511748444d1fcaa29dd2978e5fad82a3 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs @@ -1277,6 +1277,7 @@ namespace CodeImp.DoomBuilder.BuilderModes { base.ResourcesReloaded(); RebuildElementData(); + UpdateChangedObjects(); //mxd PickTarget(); }