Refactored code to be better separated (Rendering, Logic)
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
using Godot;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class DecorationHandler
|
||||
{
|
||||
public static void Spawn(List<TileRenderData> tiles, Dictionary<string, MeshInstance3D> decorationMeshes)
|
||||
{
|
||||
foreach (var data in tiles)
|
||||
{
|
||||
Node3D tileNode = data.Tile.DecorationNode;
|
||||
|
||||
foreach (var placeholder in data.Placeholders)
|
||||
{
|
||||
string key = placeholder.name.ToLower();
|
||||
|
||||
var decoration = new MeshInstance3D();
|
||||
|
||||
if (decorationMeshes.ContainsKey(key))
|
||||
{
|
||||
decoration.Mesh = decorationMeshes[key].Mesh;
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
decoration.Position = placeholder.pos;
|
||||
|
||||
decoration.Rotate(Vector3.Up, Mathf.DegToRad(-90));
|
||||
|
||||
if (key == "light")
|
||||
{
|
||||
decoration.AddChild(new OmniLight3D()
|
||||
{
|
||||
OmniAttenuation = 2f,
|
||||
LightColor = new Color("#eae7ad"),
|
||||
ShadowEnabled = true,
|
||||
LightEnergy = 5f,
|
||||
LightIndirectEnergy = 1.5f,
|
||||
Position = new Vector3(0.5f, 0, 0)
|
||||
});
|
||||
}
|
||||
|
||||
tileNode.AddChild(decoration);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://oe2d2ape41jj
|
||||
@@ -5,6 +5,7 @@ using System.Linq;
|
||||
using static WFC;
|
||||
public partial class Layer : Node3D
|
||||
{
|
||||
private Node3D decorationRoot;
|
||||
public Tile[,] tiles;
|
||||
int layerSize;
|
||||
Tile tile;
|
||||
@@ -14,7 +15,11 @@ public partial class Layer : Node3D
|
||||
// Called when the node enters the scene tree for the first time.
|
||||
public override void _Ready()
|
||||
{
|
||||
|
||||
decorationRoot = new Node3D
|
||||
{
|
||||
Name = "Decorations"
|
||||
};
|
||||
AddChild(decorationRoot);
|
||||
}
|
||||
|
||||
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
@@ -22,6 +27,17 @@ public partial class Layer : Node3D
|
||||
{
|
||||
}
|
||||
|
||||
public void ClearDecorations()
|
||||
{
|
||||
foreach (var tile in tiles)
|
||||
{
|
||||
foreach (Node child in tile.DecorationNode.GetChildren())
|
||||
{
|
||||
child.QueueFree();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetupLayer(int layerSize, int level, Dictionary<string, MeshInstance3D> tileMeshes)
|
||||
{
|
||||
this.layerSize = layerSize;
|
||||
@@ -44,6 +60,7 @@ public partial class Layer : Node3D
|
||||
safetyCounter++;
|
||||
if (safetyCounter > 1000) break;
|
||||
}
|
||||
CreateTileNodes();
|
||||
}
|
||||
|
||||
private void GenerateBaseStructure(Dictionary<string, MeshInstance3D> tileMeshes)
|
||||
@@ -68,6 +85,20 @@ public partial class Layer : Node3D
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateTileNodes()
|
||||
{
|
||||
foreach (var tile in tiles)
|
||||
{
|
||||
var node = new Node3D
|
||||
{
|
||||
Position = tile.Position
|
||||
};
|
||||
decorationRoot.AddChild(node);
|
||||
|
||||
tile.DecorationNode = node;
|
||||
}
|
||||
}
|
||||
|
||||
private void ResetLayer(Dictionary<string, MeshInstance3D> tileMeshes)
|
||||
{
|
||||
for (int x = 0; x < layerSize; x++)
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
using Godot;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class MultiMeshHandler
|
||||
{
|
||||
private Dictionary<string, MultiMeshInstance3D> multiMeshes;
|
||||
|
||||
public MultiMeshHandler(Dictionary<string, MultiMeshInstance3D> multiMeshes)
|
||||
{
|
||||
this.multiMeshes = multiMeshes;
|
||||
}
|
||||
|
||||
public void Build(List<TileRenderData> tiles)
|
||||
{
|
||||
foreach (var mm in multiMeshes.Values)
|
||||
mm.Multimesh.InstanceCount = 0;
|
||||
|
||||
var batches = new Dictionary<string, List<Transform3D>>();
|
||||
|
||||
foreach (var tile in tiles)
|
||||
{
|
||||
if (!batches.ContainsKey(tile.MeshKey))
|
||||
batches[tile.MeshKey] = new List<Transform3D>();
|
||||
|
||||
batches[tile.MeshKey].Add(tile.Transform);
|
||||
}
|
||||
|
||||
foreach (var kvp in batches)
|
||||
{
|
||||
var mm = multiMeshes[kvp.Key].Multimesh;
|
||||
var list = kvp.Value;
|
||||
|
||||
mm.InstanceCount = list.Count;
|
||||
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
mm.SetInstanceTransform(i, list[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://dc0v2yndgikkw
|
||||
Reference in New Issue
Block a user