Compare commits

2 Commits

Author SHA1 Message Date
a119e92bf6 fixed brush drawing across chunk borders 2025-04-27 15:16:10 +02:00
da3afd22fc fixed drawpixel optimization
minor class refactoring
2025-04-27 15:05:40 +02:00
5 changed files with 41 additions and 28 deletions

View File

@@ -7,6 +7,7 @@
[node name="Main" type="Node2D"]
script = ExtResource("1_k1i8e")
DebugMode = true
BrushSize = 2
RainAmount = 1.0

View File

@@ -2,7 +2,7 @@
namespace FOU.Scripts.Elements;
public class Element {
public class Element{
public Chunk Chunk;
public Vector2I Position;
@@ -15,12 +15,12 @@ public class Element {
protected const float MAX_COLOR_VARIANCE = 0.1f;
protected static readonly Vector2I VERTICAL_OPPOSITE = new Vector2I(-1, 1);
protected int lastMove = 0;
private bool active = false;
private bool wasMovedThisTick = false;
private int lastUpdate = -1;
private int lastMove = 0;
private Color originalColor;
private bool markedForUpdate = false;
public Element(Element e) {
Position = e.Position;
@@ -34,7 +34,6 @@ public class Element {
Chunk = chunk;
lastMove = Engine.GetFramesDrawn();
Active = false;
wasMovedThisTick = true;
}
public bool Active {
@@ -44,6 +43,9 @@ public class Element {
active = value;
Chunk.SetElementActive(this, value);
if (!active)
ResetColor();
else
Moved();
}
}
@@ -58,8 +60,13 @@ public class Element {
public virtual bool Update() {
if (!Active) return false;
if (lastUpdate == Engine.GetFramesDrawn()) return false; // already updated this frame
lastUpdate = Engine.GetFramesDrawn();
int frame = Engine.GetFramesDrawn();
if (lastMove + STEPS_UNTIL_INACTIVE < frame)
Active = false;
if (lastUpdate == frame)
return false; // already updated this frame
lastUpdate = frame;
return true;
}
@@ -70,7 +77,6 @@ public class Element {
protected virtual void Tick() {
Vector2I randomDirection = RandomDirectionDown();
wasMovedThisTick = false;
if (Chunk.IsEmpty(Position + Vector2I.Down))
Chunk.Swap(this, Position + Vector2I.Down);
@@ -106,21 +112,25 @@ public class Element {
public void ResetColor() {
color = originalColor;
MarkForUpdate();
}
public void SetDebugColor(Color color) {
if (!Main.Instance.DebugMode) return;
this.color = color;
wasMovedThisTick = true;
}
public void Moved() {
lastMove = Engine.GetFramesDrawn();
wasMovedThisTick = true;
MarkForUpdate();
}
public bool WasMoved() {
return wasMovedThisTick;
public bool MarkedForUpdate() {
return markedForUpdate;
}
public void MarkForUpdate(bool mark = true) {
markedForUpdate = true;
}
}

View File

@@ -5,11 +5,12 @@ namespace FOU.Scripts.Elements;
public abstract class Liquid : Element {
public const int MAX_VERTICAL_SPREAD = 3;
protected Liquid(int x, int y, ref Chunk chunk) : base(x, y, chunk) { }
protected Liquid(int x, int y, ref Chunk chunk) : base(x, y, chunk) {
MarkForUpdate();
}
public override bool Update() {
if (!base.Update()) return false;
if (lastMove + STEPS_UNTIL_INACTIVE < Engine.GetFramesDrawn()) Active = false;
Tick();

View File

@@ -3,11 +3,12 @@
namespace FOU.Scripts.Elements;
public abstract class Solid : Element {
protected Solid(int x, int y, ref Chunk chunk) : base(x, y, chunk) { }
protected Solid(int x, int y, ref Chunk chunk) : base(x, y, chunk) {
MarkForUpdate();
}
public override bool Update() {
if (!base.Update()) return false;
if (lastMove + STEPS_UNTIL_INACTIVE < Engine.GetFramesDrawn()) Active = false;
Tick();

View File

@@ -113,28 +113,26 @@ public class Level {
iteratorX = chunkResX + startPtX + iteratorX;
ptX = startPtX + iteratorX;
// right of chunk
} else if (startPtX + iteratorX >= chunkResX) {
chunkX++;
ptX = startPtX + iteratorX - chunkResX;
} else {
ptX = startPtX + iteratorX;
}
if (startPtX + iteratorX >= chunkResX) {
chunkX++;
ptX = startPtX + iteratorX - chunkResX;
}
int chunkY = y/chunkResY;
// above chunk
if (startPtY + iteratorY < 0) {
chunkY--;
ptY = chunkResY + (startPtY + iteratorY);
// left of chunk
} else if (startPtY + iteratorY >= chunkResY) {
chunkY++;
ptY = iteratorY % chunkResY;
} else {
ptY = startPtY + iteratorY;
}
if (startPtY + iteratorY >= chunkResY) {
chunkY++;
ptY = startPtY + iteratorY - chunkResY;
}
// ignore everything outside
if (chunkX < 0) continue;
@@ -157,8 +155,10 @@ public class Level {
for (int y = 0; y < chunkResY; y++) {
// TODO: multithreading here! use Chunk.DrawLevel() and stitch images together
if (chunks[cx, cy].Elements[x, y].WasMoved())
image.SetPixel(cx*chunkResX + x, cy*chunkResY + y, chunks[cx, cy].Elements[x, y].Color);
if (chunks[cx, cy].Elements[x, y].MarkedForUpdate()) {
image.SetPixel(cx * chunkResX + x, cy * chunkResY + y, chunks[cx, cy].Elements[x, y].Color);
chunks[cx, cy].Elements[x, y].MarkForUpdate(false);
}
}
}
}