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

@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.Versioning;
using System.Text;
@@ -10,10 +11,20 @@ using System.Windows.Forms;
namespace SpriteStacker
{
public enum RenderMode
{
Editing,
Rendering
}
public static class Config
{
public static Color BasePlateColour = Color.FromArgb(255, 255, 255, 255);
public static int BackgroundTile = 2;
public static List<Font> customFonts = new List<Font>();
public static int FontSize = 16;
public static int RenderIndex = 0;
public static RenderMode renderMode = RenderMode.Editing;
public static int RenderResolution = 1;
}
public class ColourPalette
{
@@ -167,10 +178,12 @@ namespace SpriteStacker
public int Width;
public int Length;
public List<Rectangle> Bounds = new List<Rectangle>();
public Bitmap RenderedModel;
public Model(int Width, int Length)
{
this.Width = Width;
this.Length = Length;
RenderedModel = new Bitmap(Width * 2, Length * 2);
AddLayer();
}
public void SetCurrentLayer(int Layer)
@@ -220,6 +233,61 @@ namespace SpriteStacker
LayerImages.Add(new Bitmap(Width, Length));
ModelData.Add(new Voxel[Width,Length]);
Bounds.Add(new Rectangle(new Point(-(int)(Width * Camera.scale) / 2, -(int)(Length * Camera.scale) / 2), new Size((int)(Width * Camera.scale), (int)(Length * Camera.scale))));
Bitmap Render = new Bitmap(Width * 2, (Length + (int)(ModelData.Count * Camera.ViewAngle)) * 2);
}
public void RenderModel(Graphics R, int RenderResolution)
{
RenderResolution = Math.Max(RenderResolution, 1);
Bitmap Render = new Bitmap((Width * 2 * RenderResolution), (Length + (int)(ModelData.Count * Camera.ViewAngle)) * 2 * RenderResolution);
Graphics G = Graphics.FromImage(Render);
G.ResetTransform();
G.TranslateTransform(Render.Width/2, Render.Height/2);
G.RotateTransform(Camera.Rotation);
float AngleScale = Camera.ViewAngle * RenderResolution;
G.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
G.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
G.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
float[][] colorMatrixElements = {
new float[] {0.0f, 0, 0, 0, 0},//R
new float[] {0, 0.0f, 0, 0, 0},//G
new float[] {0, 0, 0.0f, 0, 0},//B
new float[] {0, 0, 0, 0.8f, 0},
new float[] {0.0f, 0.0f, 0.0f, 0f, 1}};
ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
ImageAttributes imageAttributes = new ImageAttributes();
imageAttributes.SetColorMatrix(
colorMatrix,
ColorMatrixFlag.Default,
ColorAdjustType.Bitmap);
for (int i = 0; i < ModelData.Count; i++)
{
G.ResetTransform();
G.TranslateTransform(Render.Width / 2 - ((i * RenderResolution / 1.25f) * (float)Math.Cos(Camera.Rotation * Math.PI / 180.0)), Render.Height / 2 - (((i / 1.25f) * (float)Math.Sin(Camera.Rotation * Math.PI / 180.0)) * AngleScale));
G.RotateTransform(Camera.Rotation);
G.DrawImage(LayerImages[i], new Rectangle(-(LayerImages[i].Width / 2) * RenderResolution, -(LayerImages[i].Height / 2) * RenderResolution, LayerImages[i].Width * RenderResolution, LayerImages[i].Height * RenderResolution)
, 0, 0, LayerImages[i].Width, LayerImages[i].Height, GraphicsUnit.Pixel, imageAttributes);
}
for (int i = 0; i < ModelData.Count; i++)
{
G.ResetTransform();
G.TranslateTransform(Render.Width / 2, Render.Height / 2 - (i * AngleScale));
G.RotateTransform(Camera.Rotation);
G.DrawImage(LayerImages[i], new Rectangle(-(LayerImages[i].Width / 2) * RenderResolution, -(LayerImages[i].Height / 2) * RenderResolution, LayerImages[i].Width * RenderResolution, LayerImages[i].Height * RenderResolution));
}
int X = Camera.LocX + Camera.Width / 2;
int Y = Camera.Height / 2 + Camera.LocY;
R.ResetTransform();
R.TranslateTransform(X, Y);
R.RotateTransform(Camera.Rotation);
R.FillRectangle(new SolidBrush(Config.BasePlateColour), Bounds[0]);
int difference = Render.Height - Render.Width;
R.ResetTransform();
R.TranslateTransform(X, Y);
R.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
R.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
R.DrawImage(Render,( -Render.Width / 2)/ RenderResolution * Camera.scale, (-(Render.Width + difference) / 2)/ RenderResolution * Camera.scale, Render.Width/ RenderResolution * Camera.scale, Render.Height/ RenderResolution * Camera.scale);
RenderedModel = Render;
}
public void DrawSpriteStack(Graphics G)
{
@@ -254,7 +322,7 @@ namespace SpriteStacker
{
G.ResetTransform();
G.TranslateTransform(X, Y);
TextureBrush TileBrush = new TextureBrush(Resources.Background);
TextureBrush TileBrush = new TextureBrush(Resources.OpaqueBackground);
TileBrush.ScaleTransform((1 / 32.0f) * Camera.scale * (Config.BackgroundTile / 2), (1 / 32.0f) * Camera.scale * (Config.BackgroundTile / 2));
G.FillRectangle(TileBrush, Bounds[Camera.SelectedLayer]);
G.DrawImage(LayerImages[Camera.SelectedLayer], Bounds[Camera.SelectedLayer]);
@@ -263,6 +331,21 @@ namespace SpriteStacker
}
}
public void DrawSelectedLayerToImage()
{
Bitmap newImage = new Bitmap(Width, Length);
for (int x = 0; x < ModelData[Camera.SelectedLayer].GetLength(0); x++)
{
for (int y = 0; y < ModelData[Camera.SelectedLayer].GetLength(1); y++)
{
if (ModelData[Camera.SelectedLayer][x, y] != null)
{
newImage.SetPixel(x, y, ModelData[Camera.SelectedLayer][x, y].GetColor());
}
}
}
LayerImages[Camera.SelectedLayer] = newImage;
}
public void DrawLayersToImages()
{
for (int i = 0; i < ModelData.Count; i++)