diff --git a/.claude/skills/render-sprite/SKILL.md b/.claude/skills/render-sprite/SKILL.md index 95186ba03..b72fd4cec 100644 --- a/.claude/skills/render-sprite/SKILL.md +++ b/.claude/skills/render-sprite/SKILL.md @@ -6,8 +6,7 @@ description: > east, south, west) with outline applied at working resolution. Use when the user says "render sprite", "render model", "run the render pipeline", "test the pipeline", "/render-sprite", or asks to render a specific model - (e.g., "render wall_structural"). Output: 12 PNG files in - client/tooling/sprite_renderer/output/. + (e.g., "render wall_structural"). Output: 12 PNG files in renderer/output/. --- ## Render Pipeline @@ -20,15 +19,15 @@ Run the render script with the model name: ### Available Models -Models live at `client/tooling/sprite_renderer/models/.tscn`. List them: +Models live at `renderer/models/.tscn`. List them: ```bash -ls client/tooling/sprite_renderer/models/*.tscn | xargs -I{} basename {} .tscn +ls renderer/models/*.tscn | xargs -I{} basename {} .tscn ``` ### Output -12 files per model in `client/tooling/sprite_renderer/output/`: +12 files per model in `renderer/output/`: ``` _north_1024.png _north_256.png _north_64.png @@ -46,11 +45,11 @@ ls client/tooling/sprite_renderer/models/*.tscn | xargs -I{} basename {} .tscn ### Troubleshooting - **No output files**: Godot needs a display. If running headless, prefix with `xvfb-run`. -- **Model not found**: Check the model .tscn exists in `models/` directory. +- **Model not found**: Check the model .tscn exists in `renderer/models/`. - **Godot not found**: Pass path as second arg: `render.sh wall_structural /path/to/godot` ### Adding New Models -1. Create model scene at `client/tooling/sprite_renderer/models/.tscn` -2. Apply texture from `textures/` via StandardMaterial3D +1. Create model scene at `renderer/models/.tscn` +2. Apply texture from `renderer/textures/` via StandardMaterial3D 3. Run: `.claude/skills/render-sprite/scripts/render.sh ` diff --git a/.claude/skills/render-sprite/scripts/render.sh b/.claude/skills/render-sprite/scripts/render.sh index 5d785935f..f015c90ec 100755 --- a/.claude/skills/render-sprite/scripts/render.sh +++ b/.claude/skills/render-sprite/scripts/render.sh @@ -7,16 +7,16 @@ set -euo pipefail MODEL_NAME="${1:?Usage: render.sh [godot_path]}" GODOT="${2:-$HOME/bin/godot}" REPO_ROOT="$(cd "$(dirname "$0")" && git rev-parse --show-toplevel)" -PROJECT="$REPO_ROOT/client" -SCENE="res://tooling/sprite_renderer/render_scene.tscn" -OUTPUT="$PROJECT/tooling/sprite_renderer/output" +PROJECT="$REPO_ROOT/renderer" +SCENE="res://render_scene.tscn" +OUTPUT="$PROJECT/output" # Verify model exists -MODEL_FILE="$PROJECT/tooling/sprite_renderer/models/${MODEL_NAME}.tscn" +MODEL_FILE="$PROJECT/models/${MODEL_NAME}.tscn" if [ ! -f "$MODEL_FILE" ]; then echo "ERROR: Model not found: $MODEL_FILE" echo "Available models:" - ls "$PROJECT/tooling/sprite_renderer/models/"*.tscn 2>/dev/null | xargs -I{} basename {} .tscn + ls "$PROJECT/models/"*.tscn 2>/dev/null | xargs -I{} basename {} .tscn exit 1 fi diff --git a/.gitignore b/.gitignore index 2cbe232e8..b275bf765 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,12 @@ client/export/ client/reports/ client/**/*.import client/**/*.uid -client/tooling/sprite_renderer/output/*.png + +# Renderer (separate Godot project for sprite pipeline) +renderer/.godot/ +renderer/**/*.import +renderer/**/*.uid +renderer/output/*.png # Database (shared across worktrees at ../settledreach.db, not tracked) db/commonwealth.db* diff --git a/client/tooling/sprite_renderer/models/wall_bar_green.tscn b/renderer/models/wall_bar_green.tscn similarity index 77% rename from client/tooling/sprite_renderer/models/wall_bar_green.tscn rename to renderer/models/wall_bar_green.tscn index 19c401ffa..403726ce5 100644 --- a/client/tooling/sprite_renderer/models/wall_bar_green.tscn +++ b/renderer/models/wall_bar_green.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3] -[ext_resource type="Texture2D" path="res://tooling/sprite_renderer/textures/wall_bar_green_panels.png" id="1_wall_texture"] +[ext_resource type="Texture2D" path="res://textures/wall_bar_green_panels.png" id="1_wall_texture"] [sub_resource type="BoxMesh" id="BoxMesh_wall"] size = Vector3(1.0, 0.8, 0.2) diff --git a/client/tooling/sprite_renderer/models/wall_structural.tscn b/renderer/models/wall_structural.tscn similarity index 74% rename from client/tooling/sprite_renderer/models/wall_structural.tscn rename to renderer/models/wall_structural.tscn index 75bcb0386..50796df45 100644 --- a/client/tooling/sprite_renderer/models/wall_structural.tscn +++ b/renderer/models/wall_structural.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3 uid="uid://cyh0xf1nv2j3e"] -[ext_resource type="Texture2D" uid="uid://bgn5kvwjdqrx0" path="res://tooling/sprite_renderer/textures/wall_institutional_era1.png" id="1_wall_texture"] +[ext_resource type="Texture2D" path="res://textures/wall_institutional_era1.png" id="1_wall_texture"] [sub_resource type="BoxMesh" id="BoxMesh_wall"] size = Vector3(1.0, 0.8, 0.2) diff --git a/client/tooling/sprite_renderer/output/.gdignore b/renderer/output/.gdignore similarity index 100% rename from client/tooling/sprite_renderer/output/.gdignore rename to renderer/output/.gdignore diff --git a/renderer/project.godot b/renderer/project.godot new file mode 100644 index 000000000..b4fd3e685 --- /dev/null +++ b/renderer/project.godot @@ -0,0 +1,14 @@ +; Sprite Renderer — standalone Godot project for 3D-to-2D sprite pipeline. +; No game logic, no autoloads, no plugins. Just rendering. + +config_version=5 + +[application] + +config/name="Settled Reach Sprite Renderer" +config/features=PackedStringArray("4.6", "GL Compatibility") + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/client/tooling/sprite_renderer/render_export.gd b/renderer/render_export.gd similarity index 95% rename from client/tooling/sprite_renderer/render_export.gd rename to renderer/render_export.gd index 50b21079c..489da64b2 100644 --- a/client/tooling/sprite_renderer/render_export.gd +++ b/renderer/render_export.gd @@ -24,12 +24,12 @@ const ROTATIONS: PackedFloat64Array = [0.0, 90.0, 180.0, 270.0] func _ready() -> void: if Engine.is_editor_hint(): return - # CLI mode: godot --path client/ res://tooling/sprite_renderer/render_scene.tscn -- wall_structural + # CLI mode: godot --path client/ res://render_scene.tscn -- wall_structural var args := OS.get_cmdline_user_args() if args.size() == 0: return var model_name := args[0] - var model_path := "res://tooling/sprite_renderer/models/%s.tscn" % model_name + var model_path := "res://models/%s.tscn" % model_name if not ResourceLoader.exists(model_path): push_error("Model not found: %s" % model_path) get_tree().quit(1) @@ -59,7 +59,7 @@ func _execute_render() -> void: model_root.add_child(model_instance) # Ensure output directory exists - var output_dir := "res://tooling/sprite_renderer/output" + var output_dir := "res://output" if not DirAccess.dir_exists_absolute(output_dir): DirAccess.make_dir_recursive_absolute(output_dir) diff --git a/client/tooling/sprite_renderer/render_scene.tscn b/renderer/render_scene.tscn similarity index 88% rename from client/tooling/sprite_renderer/render_scene.tscn rename to renderer/render_scene.tscn index 1ca4908d0..de53c654d 100644 --- a/client/tooling/sprite_renderer/render_scene.tscn +++ b/renderer/render_scene.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://cqvfv4uhbgq6h"] -[ext_resource type="Script" path="res://tooling/sprite_renderer/render_export.gd" id="1_render_script"] +[ext_resource type="Script" path="res://render_export.gd" id="1_render_script"] [node name="RenderScene" type="Node3D"] script = ExtResource("1_render_script") diff --git a/client/tooling/sprite_renderer/textures/wall_bar_green_panels.png b/renderer/textures/wall_bar_green_panels.png similarity index 100% rename from client/tooling/sprite_renderer/textures/wall_bar_green_panels.png rename to renderer/textures/wall_bar_green_panels.png diff --git a/client/tooling/sprite_renderer/textures/wall_institutional_era1.png b/renderer/textures/wall_institutional_era1.png similarity index 100% rename from client/tooling/sprite_renderer/textures/wall_institutional_era1.png rename to renderer/textures/wall_institutional_era1.png