3 Commits
Author SHA1 Message Date
archvillainette 90e41e6780 agents.md 2026-07-09 09:47:39 +02:00
archvillainette 8c4736f14e textures 2026-07-08 13:37:00 +02:00
archvillainette 1fe41faa6b texture seeds 2026-07-05 09:34:07 +02:00
61 changed files with 284 additions and 39 deletions
+27 -4
View File
@@ -11,6 +11,21 @@ toolset, so geometry built here converts cleanly to a shippable `.hak`.
--- ---
## What it is / part it serves
Shadows Over Westgate (SoW) is a Neverwinter Nights: Enhanced Edition
persistent-world project split into single-purpose repos. This repo holds the
**tileset sources** for the SoW module: the Blender generators and NWN files
(`.set`, `.mdl`, `.wok`, `.itp`) that become a tileset `.hak` (a HAK is an NWN
resource archive). The packed `.hak` is shipped through sow-assets-manifest
(https://git.westgate.pw/ShadowsOverWestgate/sow-assets-manifest), which owns
HAK publishing and CDN sync; the module in sow-module
(https://git.westgate.pw/ShadowsOverWestgate/sow-module) pins that HAK list.
Nothing here builds the module or the asset pipeline — this repo only makes
tilesets. Repo layout is in §0, the build pipeline in §6.
---
## 0. Repo layout ## 0. Repo layout
Each tileset lives in its own directory. One tileset = one 5-char prefix = one Each tileset lives in its own directory. One tileset = one 5-char prefix = one
@@ -19,14 +34,22 @@ Each tileset lives in its own directory. One tileset = one 5-char prefix = one
``` ```
sow-module-tilesets/ sow-module-tilesets/
├── AGENTS.md ← you are here (applies to all tilesets) ├── AGENTS.md ← you are here (applies to all tilesets)
├── wgt01/ ← Westgate Urban Foundation MVP (streets, canals, ramps) ├── twu01/ ← Westgate Urban Foundation MVP (prefix TWU01)
│ ├── KICKOFF.md ← design brief / tile list for this tileset (the spec) │ ├── KICKOFF.md ← design brief / tile list for this tileset (the spec)
│ ├── concept-art-1.png │ ├── STATUS.md ← current state / known issues
│ ├── flake.nix ← Blender 4.0.2 + generator entry points │ ├── flake.nix ← Blender 4.0.2 + generator entry points
── generator/ ← bpy scripts that build the .blend source ── generator/ ← bpy scripts that build the .blend source
└── <future-tileset>/ ← same shape │ └── build/ ← tileset build output
├── wgt01/ ← art/design side: DESIGN.md, VIBE.md, textures, .blend
├── build/ ← top-level build output (mdl/, twu01.set, .blend)
├── docs/ ← plans/specs archive (do not touch)
└── <future-tileset>/ ← same shape as twu01
``` ```
> Note: older sections below still say `wgt01/generator`, `wgt01/flake.nix`,
> `wgt01/STATUS.md`. Those files now live under `twu01/` (the NWN prefix dir);
> `wgt01/` keeps the art/design side. Read `wgt01/…` in the text as `twu01/…`.
- **wgt01** is the *urban foundation* set: ground grammar only (streets, - **wgt01** is the *urban foundation* set: ground grammar only (streets,
sidewalks, plazas, ramps, terraces, canals, bridges). Buildings/props are sidewalks, plazas, ramps, terraces, canals, bridges). Buildings/props are
placeables layered on top later — **not** part of any tileset here. placeables layered on top later — **not** part of any tileset here.
@@ -1,6 +1,11 @@
# wgt01 Texture Kit — Missing Slots (Phase 2) — Spec # wgt01 Texture Kit — Missing Slots (Phase 2) — Spec
Date: 2026-07-05 · Status: draft, not yet planned Date: 2026-07-05 · Status: **material slots shipped 2026-07-05** (fbrick, iron,
timber, planks, brass, copper, plastr, slate, glass — see `wgt01/textures/SOURCES.md`).
Remaining: decal tail only (canvas, poster, alchst, soot variant) — deferred
until facade/placeable work shows they're needed. Deviations: glass is
diffuse-only (no `.mtr`; alpha/env deferred); slate `_h` is derived from the
diffuse (BC4 source undecodable).
## Goal ## Goal
+29
View File
@@ -0,0 +1,29 @@
# wgt01/textures — sources & licenses
| file | origin | license |
|---|---|---|
| wgt01_cobble_* | PBR_Procampur/tcn01_cobb02_* | see PBR_Procampur readme |
| wgt01_worn_* | PBR_Procampur/tcn01_cobb05_* | see PBR_Procampur readme |
| wgt01_sidewlk_* | PBR_Procampur/tcn01_stone04_* | see PBR_Procampur readme |
| wgt01_wall_* | PBR_Procampur/tcn01_brick03_* | see PBR_Procampur readme |
| wgt01_bridge_* | PBR_Procampur/tcn01_stone04_* | see PBR_Procampur readme |
| wgt01_grime1_d | PBR_Procampur/tcn01_splotch2_d | see readme |
| wgt01_wtrline_d | PBR_Procampur/tcn01_watrstn02 | see readme |
| wgt01_plaza_* | ambientcg.com asset PavingStones127 (1K JPG) | CC0 |
| wgt01_water_d | authored (ImageMagick plasma); bumpyshiny via wgt01_water_d.txi (standard water template, no mtr) | ours |
| wgt01_gutter_* | PBR_Procampur/tcn01_cobb02_* (extra-dark regrade) | see readme |
| wgt01_grate_d | PBR_Procampur/tcn01_grate01.dds via nwn_crunch tga conversion | see readme |
| wgt01_timber_* | PBR_Procampur/tcn01_wood01_* | see PBR_Procampur readme |
| wgt01_planks_* | PBR_Procampur/tcn01_planks01_* (extra-dark tarred regrade: MOD=50,50,100 TINTPCT=18) | see readme |
| wgt01_iron_* | PBR_Procampur/tcn01_metl03_* (near-black regrade: MOD=55,40,100) | see readme |
| wgt01_plastr_* | PBR_Procampur/tcn01_plstr00_* | see readme |
| wgt01_slate_* | PBR_Procampur/tcn01_roof02_[DN].dds (cool slate regrade: MOD=42,40,105 TINT=#1c2436 TINTPCT=22); _h derived from diffuse luminance (BC4 source undecodable) | see readme |
| wgt01_glass_d | PBR_Procampur/tcn01_glas02_d (diffuse only; alpha/env treatment deferred to facade work) | see readme |
| wgt01_fbrick_* | ambientcg.com asset Bricks097 (1K JPG, 1024×512 source stacked 2× vertically to 1024×1024); hue-preserving grade MOD=55,75,100 TINT=#1a1512 TINTPCT=10 | CC0 |
| wgt01_dirt_* | PBR_Procampur/tcn01_dirt00_* (default regrade) | see readme |
| wgt01_grass_* | PBR_Procampur/tcn01_grass02_* (default regrade) | see readme |
| wgt01_gravel_* | pd textures main lib/Ground/pattern_199 (default regrade) | see pd lib readme |
| wgt01_road_* | pd textures main lib/Roads/pattern_50 (default regrade) | see pd lib readme |
| wgt01_brass_* | ambientcg.com asset Metal008 (1K JPG); warm grade MOD=70,85,100 TINT=#241c10 TINTPCT=8 | CC0 |
| wgt01_cobb03_* | PBR_Procampur/tcn01_cobb03_* (default regrade) | see readme |
| wgt01_copper_* | ambientcg.com asset PaintedMetal006 (1K JPG, verdigris); grade MOD=65,80,100 TINT=#0f1a18 TINTPCT=10 | CC0 |
BIN
View File
Binary file not shown.
-15
View File
@@ -1,15 +0,0 @@
# wgt01/textures — sources & licenses
| file | origin | license |
|---|---|---|
| wgt01_cobble_* | PBR_Procampur/tcn01_cobb02_* | see PBR_Procampur readme |
| wgt01_worn_* | PBR_Procampur/tcn01_cobb05_* | see PBR_Procampur readme |
| wgt01_sidewlk_* | PBR_Procampur/tcn01_stone04_* | see PBR_Procampur readme |
| wgt01_wall_* | PBR_Procampur/tcn01_brick03_* | see PBR_Procampur readme |
| wgt01_bridge_* | PBR_Procampur/tcn01_stone04_* | see PBR_Procampur readme |
| wgt01_grime1_d | PBR_Procampur/tcn01_splotch2_d | see readme |
| wgt01_wtrline_d | PBR_Procampur/tcn01_watrstn02 | see readme |
| wgt01_plaza_* | ambientcg.com asset PavingStones127 (1K JPG) | CC0 |
| wgt01_water_d | authored (ImageMagick plasma); bumpyshiny via wgt01_water_d.txi (standard water template, no mtr) | ours |
| wgt01_gutter_* | PBR_Procampur/tcn01_cobb02_* (extra-dark regrade) | see readme |
| wgt01_grate_d | PBR_Procampur/tcn01_grate01.dds via nwn_crunch tga conversion | see readme |
Binary file not shown.
@@ -1,9 +1,9 @@
renderhint NormalAndSpecMapped renderhint NormalAndSpecMapped
// Textures // Textures
texture0 wgt01_plaza_d texture0 wgt01_brass_d
texture1 wgt01_plaza_n texture1 wgt01_brass_n
texture2 black texture2 black
texture3 null texture3 null
texture4 wgt01_plaza_h texture4 wgt01_brass_h
texture5 null texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_cobb03_d
texture1 wgt01_cobb03_n
texture2 black
texture3 null
texture4 wgt01_cobb03_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_copper_d
texture1 wgt01_copper_n
texture2 black
texture3 null
texture4 wgt01_copper_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_dirt_d
texture1 wgt01_dirt_n
texture2 black
texture3 null
texture4 wgt01_dirt_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_fbrick_d
texture1 wgt01_fbrick_n
texture2 black
texture3 null
texture4 wgt01_fbrick_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
+10
View File
@@ -0,0 +1,10 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_fence01_d
texture1 wgt01_fence01_n
texture2 black
texture3 null
texture4 wgt01_fence01_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_grass_d
texture1 wgt01_grass_n
texture2 black
texture3 null
texture4 wgt01_grass_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_iron_d
texture1 wgt01_iron_n
texture2 black
texture3 null
texture4 wgt01_iron_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_planks_d
texture1 wgt01_planks_n
texture2 black
texture3 null
texture4 wgt01_planks_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_plastr_d
texture1 wgt01_plastr_n
texture2 black
texture3 null
texture4 wgt01_plastr_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_slate_d
texture1 wgt01_slate_n
texture2 black
texture3 null
texture4 wgt01_slate_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
renderhint NormalAndSpecMapped
// Textures
texture0 wgt01_timber_d
texture1 wgt01_timber_n
texture2 black
texture3 null
texture4 wgt01_timber_h
texture5 null
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
+3 -2
View File
@@ -1,6 +1,7 @@
"""Create/refresh MAT_wgt01_* materials in wgt01.blend (run headless).""" """Create/refresh MAT_wgt01_* materials in wgt01.blend (run headless)."""
import bpy, os import bpy, os
SLOTS = ["cobble", "worn", "plaza", "sidewlk", "wall", "bridge", "gutter", "water"] SLOTS = ["cobble", "worn", "plaza", "sidewlk", "wall", "bridge", "gutter", "water",
"fbrick", "iron", "timber", "planks", "brass", "copper", "plastr", "slate", "glass", "dirt", "grass", "gravel", "road"]
BASE = os.path.dirname(bpy.data.filepath) BASE = os.path.dirname(bpy.data.filepath)
for slot in SLOTS: for slot in SLOTS:
@@ -26,7 +27,7 @@ for slot in SLOTS:
nt.links.new(ntex.outputs["Color"], nmap.inputs["Color"]) nt.links.new(ntex.outputs["Color"], nmap.inputs["Color"])
nt.links.new(nmap.outputs["Normal"], bsdf.inputs["Normal"]) nt.links.new(nmap.outputs["Normal"], bsdf.inputs["Normal"])
# wet look: low roughness on ground slots # wet look: low roughness on ground slots
bsdf.inputs["Roughness"].default_value = 0.35 if slot in ("cobble", "gutter", "water") else 0.6 bsdf.inputs["Roughness"].default_value = 0.35 if slot in ("cobble", "gutter", "water", "iron", "brass", "copper", "glass") else 0.6
bpy.ops.wm.save_mainfile() bpy.ops.wm.save_mainfile()
print("WIRED:", ", ".join(f"MAT_wgt01_{s}" for s in SLOTS)) print("WIRED:", ", ".join(f"MAT_wgt01_{s}" for s in SLOTS))