things! incomplete though.

This commit is contained in:
codeimp 2007-10-21 04:07:36 +00:00
parent 109e4a4690
commit b8e7370db6
21 changed files with 630 additions and 65 deletions

BIN
Resources/ThingArrow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
Resources/ThingCircle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
Resources/ThingMask.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 942 B

BIN
Resources/ThingTexture1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
Resources/ThingTexture2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -51,6 +51,7 @@
<Compile Include="Data\FlatImage.cs" /> <Compile Include="Data\FlatImage.cs" />
<Compile Include="Data\PatchNames.cs" /> <Compile Include="Data\PatchNames.cs" />
<Compile Include="Data\Playpal.cs" /> <Compile Include="Data\Playpal.cs" />
<Compile Include="Data\ResourceImage.cs" />
<Compile Include="Data\SpriteImage.cs" /> <Compile Include="Data\SpriteImage.cs" />
<Compile Include="Data\TextureImage.cs" /> <Compile Include="Data\TextureImage.cs" />
<Compile Include="Editing\EditMode.cs" /> <Compile Include="Editing\EditMode.cs" />
@ -177,6 +178,7 @@
<Compile Include="Rendering\Renderer2D.cs" /> <Compile Include="Rendering\Renderer2D.cs" />
<Compile Include="Rendering\Renderer3D.cs" /> <Compile Include="Rendering\Renderer3D.cs" />
<Compile Include="Rendering\ShaderManager.cs" /> <Compile Include="Rendering\ShaderManager.cs" />
<Compile Include="Rendering\Things2DShader.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="SlimDX, Version=1.0.2847.35002, Culture=neutral, processorArchitecture=x86" /> <Reference Include="SlimDX, Version=1.0.2847.35002, Culture=neutral, processorArchitecture=x86" />
@ -248,6 +250,8 @@
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Resources\Actions.cfg" /> <EmbeddedResource Include="Resources\Actions.cfg" />
<EmbeddedResource Include="Resources\base2d.fx" /> <EmbeddedResource Include="Resources\base2d.fx" />
<EmbeddedResource Include="Resources\Thing2D.png" />
<EmbeddedResource Include="Resources\things2d.fx" />
<None Include="Resources\Splash2.png" /> <None Include="Resources\Splash2.png" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -26,6 +26,7 @@ using SlimDX.Direct3D9;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using CodeImp.DoomBuilder.Rendering; using CodeImp.DoomBuilder.Rendering;
using CodeImp.DoomBuilder.IO; using CodeImp.DoomBuilder.IO;
using System.IO;
#endregion #endregion
@ -149,7 +150,19 @@ namespace CodeImp.DoomBuilder.Data
// This creates the Direct3D texture // This creates the Direct3D texture
public void CreateTexture() public void CreateTexture()
{ {
// TODO: Write to memory stream and read with Texture.FromStream MemoryStream memstream;
// Only do this when texture is not created yet
if(texture == null)
{
// Write to memory stream and read from memory
memstream = new MemoryStream();
bitmap.Save(memstream, ImageFormat.Bmp);
memstream.Seek(0, SeekOrigin.Begin);
texture = Texture.FromStream(General.Map.Graphics.Device, memstream, (int)memstream.Length, bitmap.Size.Width, bitmap.Size.Height, 0,
Usage.None, Format.Unknown, Pool.Managed, Filter.Box, Filter.Box, 0);
memstream.Dispose();
}
} }
// This destroys the Direct3D texture // This destroys the Direct3D texture

View file

@ -0,0 +1,92 @@
#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.Drawing;
using System.Drawing.Imaging;
using CodeImp.DoomBuilder.Rendering;
using CodeImp.DoomBuilder.IO;
using System.IO;
#endregion
namespace CodeImp.DoomBuilder.Data
{
internal class ResourceImage : ImageData
{
#region ================== Constants
#endregion
#region ================== Variables
#endregion
#region ================== Properties
#endregion
#region ================== Constructor / Disposer
// Constructor
public ResourceImage(string resourcename)
{
// Initialize
SetName(resourcename);
// We have no destructor
GC.SuppressFinalize(this);
}
// Diposer
public override void Dispose()
{
// Not already disposed?
if(!isdisposed)
{
// Clean up
// Done
base.Dispose();
}
}
#endregion
#region ================== Methods
// This loads the image
public override void LoadImage()
{
Stream bitmapdata;
// Get resource from memory
bitmapdata = General.ThisAssembly.GetManifestResourceStream("CodeImp.DoomBuilder.Resources." + Name);
bitmap = (Bitmap)Image.FromStream(bitmapdata);
// Pass on to base
base.LoadImage();
}
#endregion
}
}

View file

@ -102,14 +102,14 @@ namespace CodeImp.DoomBuilder.Editing
if(renderer.StartRendering(true)) if(renderer.StartRendering(true))
{ {
// Render lines // Render lines
renderer.RenderLinedefSet(General.Map.Map, General.Map.Map.Linedefs); renderer.RenderLinedefSet(General.Map.Map.Linedefs);
// Render highlighted item // Render highlighted item
if(highlighted != null) if(highlighted != null)
renderer.RenderLinedef(highlighted, General.Colors.Highlight); renderer.RenderLinedef(highlighted, General.Colors.Highlight);
// Render vertices // Render vertices
renderer.RenderVerticesSet(General.Map.Map, General.Map.Map.Vertices); renderer.RenderVerticesSet(General.Map.Map.Vertices);
// Done // Done
renderer.FinishRendering(); renderer.FinishRendering();

View file

@ -100,8 +100,8 @@ namespace CodeImp.DoomBuilder.Editing
if(renderer.StartRendering(true)) if(renderer.StartRendering(true))
{ {
// Render stuff // Render stuff
renderer.RenderLinedefSet(General.Map.Map, General.Map.Map.Linedefs); renderer.RenderLinedefSet(General.Map.Map.Linedefs);
renderer.RenderVerticesSet(General.Map.Map, General.Map.Map.Vertices); renderer.RenderVerticesSet(General.Map.Map.Vertices);
// Render highlighted item // Render highlighted item
if(highlighted != null) if(highlighted != null)

View file

@ -102,13 +102,16 @@ namespace CodeImp.DoomBuilder.Editing
if(renderer.StartRendering(true)) if(renderer.StartRendering(true))
{ {
// Render stuff // Render stuff
renderer.RenderLinedefSet(General.Map.Map, General.Map.Map.Linedefs); renderer.RenderLinedefSet(General.Map.Map.Linedefs);
renderer.RenderVerticesSet(General.Map.Map, General.Map.Map.Vertices); renderer.RenderVerticesSet(General.Map.Map.Vertices);
// Render highlighted item // Render highlighted item
if(highlighted != null) if(highlighted != null)
renderer.RenderVertex(highlighted, General.Colors.Highlight); renderer.RenderVertex(highlighted, General.Colors.Highlight);
// Render things
renderer.RenderThingSet(General.Map.Map.Things);
// Done // Done
renderer.FinishRendering(); renderer.FinishRendering();
} }

View file

@ -73,7 +73,10 @@ namespace CodeImp.DoomBuilder.IO
// Read things // Read things
ReadThings(map, firstindex); ReadThings(map, firstindex);
// Remove unused vertices
map.RemoveUnusedVertices();
// Return result; // Return result;
return map; return map;
} }

View file

@ -433,6 +433,21 @@ namespace CodeImp.DoomBuilder.Map
// TODO: Make this // TODO: Make this
} }
// This removes unused vertices
public void RemoveUnusedVertices()
{
LinkedListNode<Vertex> vn, vc;
// Go for all vertices
vn = vertices.First;
while(vn != null)
{
vc = vn;
vn = vc.Next;
if(vc.Value.Linedefs.Count == 0) vertices.Remove(vc);
}
}
#endregion #endregion
} }
} }

View file

@ -88,10 +88,6 @@ namespace CodeImp.DoomBuilder.Rendering
// Create resources list // Create resources list
resources = new List<ID3DResource>(); resources = new List<ID3DResource>();
// Create renderers
renderer2d = new Renderer2D(this);
renderer3d = new Renderer3D(this);
// We have no destructor // We have no destructor
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
@ -121,6 +117,9 @@ namespace CodeImp.DoomBuilder.Rendering
// This completes initialization after the device has started or has been reset // This completes initialization after the device has started or has been reset
private void SetupSettings() private void SetupSettings()
{ {
int intvalue;
float floatvalue;
// Setup renderstates // Setup renderstates
device.SetRenderState(RenderState.AntialiasedLineEnable, false); device.SetRenderState(RenderState.AntialiasedLineEnable, false);
device.SetRenderState(RenderState.Ambient, Color.White.ToArgb()); device.SetRenderState(RenderState.Ambient, Color.White.ToArgb());
@ -142,19 +141,25 @@ namespace CodeImp.DoomBuilder.Rendering
device.SetRenderState(RenderState.Clipping, true); device.SetRenderState(RenderState.Clipping, true);
device.SetRenderState(RenderState.CullMode, Cull.None); device.SetRenderState(RenderState.CullMode, Cull.None);
// Make LOD bias hack until SlimDX has a SetSamplerState overload that accepts a float
floatvalue = -0.99f;
unsafe { General.CopyMemory(&intvalue, &floatvalue, new UIntPtr(4)); }
// Sampler settings // Sampler settings
device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear); device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Linear);
device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear); device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);
device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear); device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);
device.SetSamplerState(0, SamplerState.MipMapLodBias, intvalue);
// Texture addressing // Texture addressing
device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap); device.SetSamplerState(0, SamplerState.AddressU, TextureAddress.Wrap);
device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap); device.SetSamplerState(0, SamplerState.AddressV, TextureAddress.Wrap);
device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap); device.SetSamplerState(0, SamplerState.AddressW, TextureAddress.Wrap);
// First texture stage // First texture stage
device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg1); device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);
device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture); device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
device.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.TFactor);
device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current); device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current);
device.SetTextureStageState(0, TextureStage.TexCoordIndex, 0); device.SetTextureStageState(0, TextureStage.TexCoordIndex, 0);
@ -162,9 +167,10 @@ namespace CodeImp.DoomBuilder.Rendering
device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.Disable); device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.Disable);
// First alpha stage // First alpha stage
device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.SelectArg1); device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Modulate);
device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture); device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);
device.SetTextureStageState(0, TextureStage.AlphaArg2, TextureArgument.TFactor);
// No more further stages // No more further stages
device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Disable); device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Disable);
@ -236,10 +242,10 @@ namespace CodeImp.DoomBuilder.Rendering
// Add event to cancel resize event // Add event to cancel resize event
//device.DeviceResizing += new CancelEventHandler(CancelResize); //device.DeviceResizing += new CancelEventHandler(CancelResize);
// Reset renderers // Create renderers
renderer2d.Reset(); renderer2d = new Renderer2D(this);
renderer3d.Reset(); renderer3d = new Renderer3D(this);
// Initialize settings // Initialize settings
SetupSettings(); SetupSettings();

View file

@ -11,7 +11,7 @@ namespace CodeImp.DoomBuilder.Rendering
public struct FlatVertex public struct FlatVertex
{ {
// Vertex format // Vertex format
public static readonly int Stride = 7 * 4; public static readonly int Stride = 6 * 4;
// Members // Members
public float x; public float x;

View file

@ -32,6 +32,7 @@ using SlimDX.Direct3D9;
using SlimDX; using SlimDX;
using CodeImp.DoomBuilder.Geometry; using CodeImp.DoomBuilder.Geometry;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using CodeImp.DoomBuilder.Data;
#endregion #endregion
@ -43,17 +44,31 @@ namespace CodeImp.DoomBuilder.Rendering
private const byte DOUBLESIDED_LINE_ALPHA = 130; private const byte DOUBLESIDED_LINE_ALPHA = 130;
private const float FSAA_BLEND_FACTOR = 0.6f; private const float FSAA_BLEND_FACTOR = 0.6f;
private const float THING_ARROW_SIZE = 15f;
private const float THING_CIRCLE_SIZE = 10f;
private const int THING_BUFFER_STEP = 100;
#endregion #endregion
#region ================== Variables #region ================== Variables
// Rendering memory // Rendering memory for lines and vertices
private Texture tex; private Texture tex;
private int width, height; private int width, height;
private int pwidth, pheight; private int pwidth, pheight;
private Plotter plotter; private Plotter plotter;
private FlatVertex[] screenverts = new FlatVertex[4];
private LockedRect lockedrect;
// Buffers for rendering things
private VertexBuffer thingsvertices;
private PixelColor[] thingcolors;
private int numthings;
private int maxthings;
// Images
private ResourceImage thingtexture;
// View settings (world coordinates) // View settings (world coordinates)
private float scale; private float scale;
private float scaleinv; private float scaleinv;
@ -79,6 +94,12 @@ namespace CodeImp.DoomBuilder.Rendering
public Renderer2D(D3DGraphics graphics) : base(graphics) public Renderer2D(D3DGraphics graphics) : base(graphics)
{ {
// Initialize // Initialize
thingtexture = new ResourceImage("Thing2D.png");
thingtexture.LoadImage();
thingtexture.CreateTexture();
// Create texture for rendering lines/vertices
CreateTexture();
// We have no destructor // We have no destructor
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
@ -93,6 +114,9 @@ namespace CodeImp.DoomBuilder.Rendering
// Clean up // Clean up
if(tex != null) tex.Dispose(); if(tex != null) tex.Dispose();
tex = null; tex = null;
if(thingsvertices != null) thingsvertices.Dispose();
thingsvertices = null;
thingtexture.Dispose();
// Done // Done
base.Dispose(); base.Dispose();
@ -106,56 +130,61 @@ namespace CodeImp.DoomBuilder.Rendering
// This draws the image on screen // This draws the image on screen
public void Present() public void Present()
{ {
FlatVertex[] verts = new FlatVertex[4];
// Start drawing // Start drawing
if(graphics.StartRendering(General.Colors.Background.PixelColor.ToInt())) if(graphics.StartRendering(General.Colors.Background.PixelColor.ToInt()))
{ {
// Left top // Set renderstates
verts[0].x = -0.5f;
verts[0].y = -0.5f;
verts[0].w = 1f;
verts[0].u = 0f;
verts[0].v = 0f;
// Right top
verts[1].x = pwidth - 0.5f;
verts[1].y = -0.5f;
verts[1].w = 1f;
verts[1].u = 1f;
verts[1].v = 0f;
// Left bottom
verts[2].x = -0.5f;
verts[2].y = pheight - 0.5f;
verts[2].w = 1f;
verts[2].u = 0f;
verts[2].v = 1f;
// Right bottom
verts[3].x = pwidth - 0.5f;
verts[3].y = pheight - 0.5f;
verts[3].w = 1f;
verts[3].u = 1f;
verts[3].v = 1f;
// Set renderstates AND shader settings
graphics.Device.SetTexture(0, tex); graphics.Device.SetTexture(0, tex);
graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true); graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha); graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
graphics.Device.SetRenderState(RenderState.DestBlend, Blend.InvSourceAlpha); graphics.Device.SetRenderState(RenderState.DestBlend, Blend.InvSourceAlpha);
graphics.Device.SetRenderState(RenderState.TextureFactor, -1);
graphics.Shaders.Base2D.Texture1 = tex; graphics.Shaders.Base2D.Texture1 = tex;
graphics.Shaders.Base2D.SetSettings(1f / pwidth, 1f / pheight, FSAA_BLEND_FACTOR); graphics.Shaders.Base2D.SetSettings(1f / pwidth, 1f / pheight, FSAA_BLEND_FACTOR);
// Draw // Draw the lines and vertices texture
graphics.Shaders.Base2D.Begin(); graphics.Shaders.Base2D.Begin();
graphics.Shaders.Base2D.BeginPass(0); graphics.Shaders.Base2D.BeginPass(0);
try { graphics.Device.DrawUserPrimitives<FlatVertex>(PrimitiveType.TriangleStrip, 0, 2, verts); } try { graphics.Device.DrawUserPrimitives<FlatVertex>(PrimitiveType.TriangleStrip, 0, 2, screenverts); } catch(Exception) { }
catch(Exception) { }
graphics.Shaders.Base2D.EndPass(); graphics.Shaders.Base2D.EndPass();
graphics.Shaders.Base2D.End(); graphics.Shaders.Base2D.End();
// Do we have things to render?
if((numthings > 0) && (thingsvertices != null))
{
// Set renderstates
graphics.Device.SetRenderState(RenderState.CullMode, Cull.None);
graphics.Device.SetRenderState(RenderState.AlphaBlendEnable, true);
graphics.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
graphics.Device.SetRenderState(RenderState.DestBlend, Blend.InvSourceAlpha);
graphics.Device.SetTexture(0, thingtexture.Texture);
graphics.Shaders.Things2D.Texture1 = thingtexture.Texture;
// Set the vertex buffer
graphics.Device.SetStreamSource(0, thingsvertices, 0, FlatVertex.Stride);
// Go for all things
for(int i = 0; i < numthings; i++)
{
// Set renderstates
graphics.Device.SetRenderState(RenderState.TextureFactor, thingcolors[i].ToInt());
graphics.Shaders.Things2D.SetColors(thingcolors[i]);
// Draw the thing circle
graphics.Shaders.Things2D.Begin();
graphics.Shaders.Things2D.BeginPass(0);
try { graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, i * 8, 2); } catch(Exception) { }
graphics.Shaders.Things2D.EndPass();
// Draw the thing icon
graphics.Shaders.Things2D.BeginPass(1);
try { graphics.Device.DrawPrimitives(PrimitiveType.TriangleStrip, i * 8 + 4, 2); } catch(Exception) { }
graphics.Shaders.Things2D.EndPass();
graphics.Shaders.Things2D.End();
}
}
// Done // Done
graphics.FinishRendering(); graphics.FinishRendering();
} }
@ -168,6 +197,12 @@ namespace CodeImp.DoomBuilder.Rendering
// Trash old texture // Trash old texture
if(tex != null) tex.Dispose(); if(tex != null) tex.Dispose();
tex = null; tex = null;
// Trash things buffer
if(thingsvertices != null) thingsvertices.Dispose();
thingsvertices = null;
maxthings = 0;
numthings = 0;
} }
// This is called resets when the device is reset // This is called resets when the device is reset
@ -205,13 +240,34 @@ namespace CodeImp.DoomBuilder.Rendering
sd = tex.GetLevelDescription(0); sd = tex.GetLevelDescription(0);
pwidth = sd.Width; pwidth = sd.Width;
pheight = sd.Height; pheight = sd.Height;
// Setup screen vertices
screenverts[0].x = 0.5f;
screenverts[0].y = 0.5f;
screenverts[0].w = 1f;
screenverts[0].u = 1f / pwidth;
screenverts[0].v = 1f / pheight;
screenverts[1].x = pwidth - 1.5f;
screenverts[1].y = 0.5f;
screenverts[1].w = 1f;
screenverts[1].u = 1f - 1f / pwidth;
screenverts[1].v = 1f / pheight;
screenverts[2].x = 0.5f;
screenverts[2].y = pheight - 1.5f;
screenverts[2].w = 1f;
screenverts[2].u = 1f / pwidth;
screenverts[2].v = 1f - 1f / pheight;
screenverts[3].x = pwidth - 1.5f;
screenverts[3].y = pheight - 1.5f;
screenverts[3].w = 1f;
screenverts[3].u = 1f - 1f / pwidth;
screenverts[3].v = 1f - 1f / pheight;
} }
// This begins a drawing session // This begins a drawing session
public unsafe bool StartRendering(bool cleardisplay) public unsafe bool StartRendering(bool cleardisplay)
{ {
LockFlags lockflags; LockFlags lockflags;
LockedRect rect;
// Do we have a texture? // Do we have a texture?
if(tex != null) if(tex != null)
@ -221,12 +277,15 @@ namespace CodeImp.DoomBuilder.Rendering
else lockflags = LockFlags.NoSystemLock; else lockflags = LockFlags.NoSystemLock;
// Lock memory // Lock memory
rect = tex.LockRectangle(0, lockflags); lockedrect = tex.LockRectangle(0, lockflags);
// Create plotter // Create plotter
plotter = new Plotter((PixelColor*)rect.Data.DataPointer.ToPointer(), rect.Pitch / sizeof(PixelColor), pheight, width, height); plotter = new Plotter((PixelColor*)lockedrect.Data.DataPointer.ToPointer(), lockedrect.Pitch / sizeof(PixelColor), pheight, width, height);
if(cleardisplay) plotter.Clear(); if(cleardisplay) plotter.Clear();
// Reset things buffer when display is cleared
if(cleardisplay) ReserveThingsMemory(0, false);
// Ready for rendering // Ready for rendering
return true; return true;
} }
@ -242,7 +301,8 @@ namespace CodeImp.DoomBuilder.Rendering
{ {
// Unlock memory // Unlock memory
tex.UnlockRectangle(0); tex.UnlockRectangle(0);
lockedrect.Data.Dispose();
// Present new image // Present new image
Present(); Present();
} }
@ -287,8 +347,128 @@ namespace CodeImp.DoomBuilder.Rendering
#endregion #endregion
#region ================== Things
// This ensures there is enough place in the things buffer
private void ReserveThingsMemory(int newnumthings, bool preserve)
{
int newmaxthings;
DataStream stream;
FlatVertex[] verts = null;
PixelColor[] oldcolors = null;
// Do we need to resize the buffer?
if((newnumthings > maxthings) || !preserve)
{
// Calculate new size
newmaxthings = newnumthings + THING_BUFFER_STEP;
// Read old things data if we want to keep it
if(preserve && (thingsvertices != null) && (numthings > 0))
{
stream = thingsvertices.Lock(0, numthings * 8 * FlatVertex.Stride, LockFlags.ReadOnly);
verts = stream.ReadRange<FlatVertex>(numthings * 8);
thingsvertices.Unlock();
stream.Dispose();
thingsvertices.Dispose();
oldcolors = thingcolors;
}
// Create new buffer
thingsvertices = new VertexBuffer(graphics.Device, newmaxthings * 8 * FlatVertex.Stride, Usage.Dynamic, VertexFormat.None, Pool.Default);
thingcolors = new PixelColor[newmaxthings];
maxthings = newmaxthings;
// Keep old things?
if(preserve && (verts != null))
{
// Write old things into new buffer
stream = thingsvertices.Lock(0, maxthings * 8 * FlatVertex.Stride, LockFlags.Discard);
stream.WriteRange<FlatVertex>(verts);
thingsvertices.Unlock();
stream.Dispose();
oldcolors.CopyTo(thingcolors, 0);
}
else
{
// Things were trashed
numthings = 0;
}
}
}
// This makes vertices for a thing
private void CreateThingVerts(Thing t, ref FlatVertex[] verts, int offset)
{
// Transform to screen coordinates
Vector2D screenpos = ((Vector2D)t.Position).GetTransformed(translatex, translatey, scale, -scale);
// Setup fixed rect for circle
verts[offset].x = screenpos.x - THING_CIRCLE_SIZE;
verts[offset].y = screenpos.y - THING_CIRCLE_SIZE;
verts[offset].w = 1f;
verts[offset].u = 1f / 512f;
verts[offset].v = 1f / 128f;
offset++;
verts[offset].x = screenpos.x + THING_CIRCLE_SIZE;
verts[offset].y = screenpos.y - THING_CIRCLE_SIZE;
verts[offset].w = 1f;
verts[offset].u = 0.25f - 1f / 512f;
verts[offset].v = 1f / 128f;
offset++;
verts[offset].x = screenpos.x - THING_CIRCLE_SIZE;
verts[offset].y = screenpos.y + THING_CIRCLE_SIZE;
verts[offset].w = 1f;
verts[offset].u = 1f / 512f;
verts[offset].v = 1f - 1f / 128f;
offset++;
verts[offset].x = screenpos.x + THING_CIRCLE_SIZE;
verts[offset].y = screenpos.y + THING_CIRCLE_SIZE;
verts[offset].w = 1f;
verts[offset].u = 0.25f - 1f / 512f;
verts[offset].v = 1f - 1f / 128f;
offset++;
// Setup rotated rect for arrow
verts[offset].x = screenpos.x + (float)Math.Sin(t.Angle - Angle2D.PI * 0.25f) * THING_ARROW_SIZE;
verts[offset].y = screenpos.y + (float)Math.Cos(t.Angle - Angle2D.PI * 0.25f) * THING_ARROW_SIZE;
verts[offset].w = 1f;
verts[offset].u = 0.50f;
verts[offset].v = 0f;
offset++;
verts[offset].x = screenpos.x + (float)Math.Sin(t.Angle + Angle2D.PI * 0.25f) * THING_ARROW_SIZE;
verts[offset].y = screenpos.y + (float)Math.Cos(t.Angle + Angle2D.PI * 0.25f) * THING_ARROW_SIZE;
verts[offset].w = 1f;
verts[offset].u = 0.75f;
verts[offset].v = 0f;
offset++;
verts[offset].x = screenpos.x + (float)Math.Sin(t.Angle - Angle2D.PI * 0.75f) * THING_ARROW_SIZE;
verts[offset].y = screenpos.y + (float)Math.Cos(t.Angle - Angle2D.PI * 0.75f) * THING_ARROW_SIZE;
verts[offset].w = 1f;
verts[offset].u = 0.50f;
verts[offset].v = 1f;
offset++;
verts[offset].x = screenpos.x + (float)Math.Sin(t.Angle + Angle2D.PI * 0.75f) * THING_ARROW_SIZE;
verts[offset].y = screenpos.y + (float)Math.Cos(t.Angle + Angle2D.PI * 0.75f) * THING_ARROW_SIZE;
verts[offset].w = 1f;
verts[offset].u = 0.75f;
verts[offset].v = 1f;
}
#endregion
#region ================== Colors #region ================== Colors
// This returns the color for a thing
public PixelColor DetermineThingColor(Thing t)
{
// Determine color
if(t.Selected > 0) return General.Colors.Selection;
else return PixelColor.FromColor(Color.Tomato);
// TODO: Check against game configuration or embed color into thing
}
// This returns the color for a vertex // This returns the color for a vertex
public PixelColor DetermineVertexColor(Vertex v) public PixelColor DetermineVertexColor(Vertex v)
{ {
@ -323,6 +503,68 @@ namespace CodeImp.DoomBuilder.Rendering
#region ================== Map Rendering #region ================== Map Rendering
// This adds a thing in the things buffer for rendering
public void RenderThing(Thing t, PixelColor c)
{
FlatVertex[] verts = new FlatVertex[8];
DataStream stream;
// TODO: Check if the thing is actually on screen
// Make sure there is enough memory reserved
ReserveThingsMemory(numthings + 1, true);
// Store the thing color
thingcolors[numthings] = c;
// Store vertices in buffer
stream = thingsvertices.Lock(numthings * 8 * FlatVertex.Stride, 8 * FlatVertex.Stride, LockFlags.NoSystemLock);
CreateThingVerts(t, ref verts, 0);
stream.WriteRange<FlatVertex>(verts);
thingsvertices.Unlock();
stream.Dispose();
// Thing added!
numthings++;
}
// This adds a thing in the things buffer for rendering
public void RenderThingSet(ICollection<Thing> things)
{
FlatVertex[] verts = new FlatVertex[things.Count * 8];
DataStream stream;
int offset = 0;
int added = 0;
// Make sure there is enough memory reserved
ReserveThingsMemory(numthings + things.Count, true);
// Go for all things
foreach(Thing t in things)
{
// TODO: Check if the thing is actually on screen
// Store the thing color
thingcolors[numthings + offset] = DetermineThingColor(t);
// Create vertices
CreateThingVerts(t, ref verts, offset * 8);
// Next
added++;
offset++;
}
// Store vertices in buffer
stream = thingsvertices.Lock(numthings * 8 * FlatVertex.Stride, things.Count * 8 * FlatVertex.Stride, LockFlags.NoSystemLock);
stream.WriteRange<FlatVertex>(verts);
thingsvertices.Unlock();
stream.Dispose();
// Things added!
numthings += added;
}
// This renders the linedefs of a sector with special color // This renders the linedefs of a sector with special color
public void RenderSector(Sector s, PixelColor c) public void RenderSector(Sector s, PixelColor c)
{ {
@ -374,7 +616,7 @@ namespace CodeImp.DoomBuilder.Rendering
} }
// This renders a set of linedefs // This renders a set of linedefs
public void RenderLinedefSet(MapSet map, ICollection<Linedef> linedefs) public void RenderLinedefSet(ICollection<Linedef> linedefs)
{ {
// Go for all linedefs // Go for all linedefs
foreach(Linedef l in linedefs) RenderLinedef(l, DetermineLinedefColor(l)); foreach(Linedef l in linedefs) RenderLinedef(l, DetermineLinedefColor(l));
@ -391,7 +633,7 @@ namespace CodeImp.DoomBuilder.Rendering
} }
// This renders a set of vertices // This renders a set of vertices
public void RenderVerticesSet(MapSet map, ICollection<Vertex> vertices) public void RenderVerticesSet(ICollection<Vertex> vertices)
{ {
// Go for all vertices // Go for all vertices
foreach(Vertex v in vertices) RenderVertex(v, DetermineVertexColor(v)); foreach(Vertex v in vertices) RenderVertex(v, DetermineVertexColor(v));

View file

@ -51,6 +51,7 @@ namespace CodeImp.DoomBuilder.Rendering
// Shaders // Shaders
private Base2DShader base2dshader; private Base2DShader base2dshader;
private Things2DShader things2dshader;
// Disposing // Disposing
private bool isdisposed = false; private bool isdisposed = false;
@ -62,6 +63,7 @@ namespace CodeImp.DoomBuilder.Rendering
public bool Enabled { get { return useshaders; } } public bool Enabled { get { return useshaders; } }
public string ShaderTechnique { get { return shadertechnique; } } public string ShaderTechnique { get { return shadertechnique; } }
public Base2DShader Base2D { get { return base2dshader; } } public Base2DShader Base2D { get { return base2dshader; } }
public Things2DShader Things2D { get { return things2dshader; } }
public bool IsDisposed { get { return isdisposed; } } public bool IsDisposed { get { return isdisposed; } }
#endregion #endregion
@ -80,6 +82,7 @@ namespace CodeImp.DoomBuilder.Rendering
// Initialize effects // Initialize effects
base2dshader = new Base2DShader(this); base2dshader = new Base2DShader(this);
things2dshader = new Things2DShader(this);
// We have no destructor // We have no destructor
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
@ -93,6 +96,7 @@ namespace CodeImp.DoomBuilder.Rendering
{ {
// Clean up // Clean up
base2dshader.Dispose(); base2dshader.Dispose();
things2dshader.Dispose();
// Done // Done
isdisposed = true; isdisposed = true;

View file

@ -0,0 +1,112 @@
#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.Direct3D;
using SlimDX.Direct3D9;
using SlimDX;
using CodeImp.DoomBuilder.Geometry;
using System.Drawing.Imaging;
#endregion
namespace CodeImp.DoomBuilder.Rendering
{
internal sealed class Things2DShader : D3DShader
{
#region ================== Variables
// Property handlers
private EffectHandle texture1;
private EffectHandle thingcolor;
#endregion
#region ================== Properties
public Texture Texture1 { set { if(manager.Enabled) effect.SetValue(texture1, value); } }
#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");
thingcolor = effect.GetParameter(null, "thingcolor");
}
// Initialize world vertex declaration
VertexElement[] elements = new VertexElement[]
{
new VertexElement(0, 0, DeclarationType.Float4, DeclarationMethod.Default, DeclarationUsage.PositionTransformed, 0),
new VertexElement(0, 16, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),
VertexElement.VertexDeclarationEnd
};
vertexdecl = new VertexDeclaration(General.Map.Graphics.Device, elements);
// We have no destructor
GC.SuppressFinalize(this);
}
// Diposer
public override void Dispose()
{
// Not already disposed?
if(!isdisposed)
{
// Clean up
texture1.Dispose();
thingcolor.Dispose();
// Done
base.Dispose();
}
}
#endregion
#region ================== Methods
// This sets the settings
public void SetColors(PixelColor thing)
{
// Set settings
if(manager.Enabled) effect.SetValue(thingcolor, ColorValue.FromColor(Color.FromArgb(thing.ToInt())));
}
#endregion
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -42,7 +42,7 @@ float4 addcolor(float4 c1, float4 c2)
} }
// Pixel shader // Pixel shader
float4 ps20_main(PixelData pd) : COLOR float4 ps_main(PixelData pd) : COLOR
{ {
// Take this pixel's color // Take this pixel's color
float4 c = tex2D(texture1samp, pd.uv); float4 c = tex2D(texture1samp, pd.uv);
@ -69,7 +69,7 @@ technique SM20
pass p0 pass p0
{ {
VertexShader = null; VertexShader = null;
PixelShader = compile ps_2_0 ps20_main(); PixelShader = compile ps_2_0 ps_main();
CullMode = None; CullMode = None;
ZEnable = false; ZEnable = false;
AlphaBlendEnable = true; AlphaBlendEnable = true;

View file

@ -0,0 +1,71 @@
// Things 2D rendering shader
// Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
// Pixel input data
struct PixelData
{
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};
// Colors
float4 thingcolor;
// Texture1 input
texture texture1
<
string UIName = "Texture1";
string ResourceType = "2D";
>;
// Texture sampler settings
sampler2D texture1samp = sampler_state
{
Texture = <texture1>;
MagFilter = Linear;
MinFilter = Linear;
MipFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
MipMapLodBias = -0.99f;
};
// Pixel shader for colored circle
float4 ps_circle(PixelData pd) : COLOR
{
float4 c = tex2D(texture1samp, pd.uv);
float4 s = tex2D(texture1samp, pd.uv + float2(0.25f, 0.0f));
return lerp(c * thingcolor, float4(s.rgb, c.a), s.a);
}
// Pixel shader for icon
float4 ps_icon(PixelData pd) : COLOR
{
return tex2D(texture1samp, pd.uv);
}
// Technique for shader model 2.0
technique SM20
{
pass p0
{
VertexShader = null;
PixelShader = compile ps_2_0 ps_circle();
CullMode = None;
ZEnable = false;
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = InvSrcAlpha;
}
pass p1
{
VertexShader = null;
PixelShader = compile ps_2_0 ps_icon();
CullMode = None;
ZEnable = false;
AlphaBlendEnable = true;
SrcBlend = SrcAlpha;
DestBlend = InvSrcAlpha;
}
}