shadow casting

This commit is contained in:
Halbear
2026-03-20 19:16:10 +00:00
parent 7f49cf4d6b
commit 98b8e9fc16
10 changed files with 167 additions and 8 deletions

View File

@@ -6,7 +6,9 @@ using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -16,8 +18,10 @@ namespace SpriteStacker
{
public partial class Form1 : Form
{
public static PrivateFontCollection pfc = new PrivateFontCollection();
public static Thread MainThread;
public static bool running = true;
public static bool ValidLocation = true;
Model model = new Model(Camera.CanvasWidth, Camera.CanvasHeight);
public double LastFT = 0;
public bool mouseLeftDown = false;
@@ -50,9 +54,18 @@ namespace SpriteStacker
Color.Beige,
Color.Azure
});
private void initFont()
{
int fontLength = Resources.Monocraft.Length;
byte[] fontdata = Resources.Monocraft;
System.IntPtr data = Marshal.AllocCoTaskMem(fontLength);
Marshal.Copy(fontdata, 0, data, fontLength);
pfc.AddMemoryFont(data, fontLength);
}
public Form1()
{
InitializeComponent();
initFont();
ResizeDisplay();
MainThread = new Thread(mainThread);
MainThread.SetApartmentState(ApartmentState.STA);
@@ -70,9 +83,15 @@ namespace SpriteStacker
public void mainThread()
{
LastFT = Process.GetCurrentProcess().TotalProcessorTime.TotalMilliseconds;
double SecondCounter = Process.GetCurrentProcess().TotalProcessorTime.TotalMilliseconds;
while (running)
{
Display.Refresh();
if (Process.GetCurrentProcess().TotalProcessorTime.TotalMilliseconds - SecondCounter > 1000)
{
SecondCounter = Process.GetCurrentProcess().TotalProcessorTime.TotalMilliseconds;
//model.DrawLayersToImages();
}
if (Process.GetCurrentProcess().TotalProcessorTime.TotalMilliseconds - LastFT > 16)
{
LastFT = Process.GetCurrentProcess().TotalProcessorTime.TotalMilliseconds;
@@ -80,12 +99,12 @@ namespace SpriteStacker
if(Rotate)Camera.Rotation++;
if (mouseLeftDown)
{
if(!palette.Bounds.Contains(MousePosition)) DrawBrush(new Voxel(Camera.SelectedColor));
if(ValidLocation) DrawBrush(new Voxel(Camera.SelectedColor));
}
if (mouseRightDown)
{
if (!palette.Bounds.Contains(MousePosition)) DrawBrush(new Voxel(Color.Transparent));
if (ValidLocation) DrawBrush(new Voxel(Color.Transparent));
}
}
}
@@ -93,10 +112,19 @@ namespace SpriteStacker
private void PaintDisplay(object sender, PaintEventArgs e)
{
e.Graphics.PixelOffsetMode = PixelOffsetMode.Half;
model.DrawSpriteStack(e.Graphics);
switch (Config.renderMode)
{
case RenderMode.Editing:
model.DrawSpriteStack(e.Graphics);
break;
case RenderMode.Rendering:
model.RenderModel(e.Graphics,Config.RenderResolution);
break;
}
palette.Draw(e.Graphics);
e.Graphics.ResetTransform();
e.Graphics.DrawString(String.Format("Selected Brush: {0}\nLayer: {1}/{2}\nBrush Size: {3}\nBrush Intensity: {4}\nRender Type: {5}\nRender Resolution: {6}", Camera.type, Camera.SelectedLayer + 1, model.LayerImages.Count, Camera.BrushSize, Camera.SprayIntensity,Config.renderMode,Config.renderMode == RenderMode.Editing ? "N/A": Config.RenderResolution.ToString()), new Font(pfc.Families[0], Config.FontSize), Brushes.DarkSlateBlue, new Point(0, palette.Bounds.Bottom));
}
private void ResizeDisplay()
@@ -130,10 +158,12 @@ namespace SpriteStacker
private void Reset()
{
model = new Model(Camera.CanvasWidth, Camera.CanvasHeight);
Camera.SelectedLayer = 0;
}
private void KeyDownEvent(object sender, KeyEventArgs e)
{
BrushType[] types = new BrushType[] { BrushType.Square, BrushType.Circle,BrushType.Spray };
RenderMode[] RenderModes = new RenderMode[] {RenderMode.Editing, RenderMode.Rendering };
if (e.KeyCode == Keys.W) Camera.BrushY = Math.Min(Camera.BrushY + 1,model.Length);
if (e.KeyCode == Keys.S) Camera.BrushY = Math.Max(Camera.BrushY -1, 0);
if (e.KeyCode == Keys.A) Camera.BrushX = Math.Min(Camera.BrushX + 1, model.Width);
@@ -146,8 +176,16 @@ namespace SpriteStacker
if (e.KeyCode == Keys.H) Camera.ViewAngle -= 0.25f;
if (e.KeyCode == Keys.D1) Config.BackgroundTile += 2;
if (e.KeyCode == Keys.D2) Config.BackgroundTile -= 2;
if (e.KeyCode == Keys.D3) Config.RenderResolution += 1;
if (e.KeyCode == Keys.D4) Config.RenderResolution -= 1;
if (e.KeyCode == Keys.R) Rotate = !Rotate;
if (e.KeyCode == Keys.ShiftKey) Camera.EditMode = !Camera.EditMode;
if (e.KeyCode == Keys.ControlKey)
{
Config.RenderIndex++;
if (Config.RenderIndex >= RenderModes.Length) Config.RenderIndex = 0;
Config.renderMode = RenderModes[Config.RenderIndex];
}
if (e.KeyCode == Keys.Up) model.SetCurrentLayer(Camera.SelectedLayer + 1);
if (e.KeyCode == Keys.Down) model.SetCurrentLayer(Math.Max(Camera.SelectedLayer - 1,0));
if (e.KeyCode == Keys.Delete) Reset();
@@ -181,8 +219,12 @@ namespace SpriteStacker
{
for (int j = 0; j < Camera.BrushSize; j++)
{
int locx = Math.Min(Math.Max((Camera.BrushX + i - Camera.BrushSize / 2), 0), model.Width - 1);
int locy = Math.Min(Math.Max((Camera.BrushY + j - Camera.BrushSize / 2), 0), model.Length - 1);
int locx = (Camera.BrushX + i - Camera.BrushSize / 2);
int locy = (Camera.BrushY + j - Camera.BrushSize / 2);
if (locx < -4 || locx > model.Width + 4 || locy < -4 || locy > model.Length + 4) ValidLocation = false;
else ValidLocation = true;
locx = Math.Min(Math.Max(locx, 0), model.Width - 1);
locy = Math.Min(Math.Max(locy, 0), model.Length - 1);
bool paintPixel = false;
if (Camera.type == BrushType.Square) paintPixel = true;
if (Camera.type == BrushType.Circle && Camera.isWithinCircle(i, j, (int)Math.Floor(Camera.BrushSize / 2.0), (int)(Camera.BrushSize / 2.0), (int)(Camera.BrushSize / 2.0)))
@@ -196,7 +238,7 @@ namespace SpriteStacker
if(paintPixel) model.SetData(Math.Min(locx, model.Width - 1), Math.Min(locy, model.Length - 1), Camera.SelectedLayer, voxel);
}
}
model.DrawLayersToImages();
model.DrawSelectedLayerToImage();
}
private void MouseMoveEvent(object sender, MouseEventArgs e)
@@ -228,10 +270,14 @@ namespace SpriteStacker
if (e.Button == MouseButtons.Left)
{
mouseLeftDown = false;
model.DrawLayersToImages();
}
if (e.Button == MouseButtons.Right)
{
mouseRightDown = false;
model.DrawLayersToImages();
}
}