Files
sow-module-tilesets/wgt01/flake.nix
T
archvillainetteandClaude Opus 4.8 1284f15595 wgt01: real .mdl/.wok export via Neverblender
Neverblender is installed + enabled in this machine's Blender 4.0.2 config and
confirmed working headless via the flake. Add generator/export_mdl.py:
assembles each tile as a Neverblender-native model (AuroraBase dummy/tile,
trimesh, single aabb walkmesh) in its own scene and calls scene.nvb_mdlexport
to emit real ASCII <resref>.mdl + <resref>.wok for all 40 tiles.

Walkmesh surfacemats via create_wok_materials() slot order (walkable Stone=4,
Nonwalk=7) -> verified correct per tile (CP1 all 4, CN1 all 7, BR_1/CE_S mixed).

flake.nix: add `export` app (nix run .#export -- <blend> <outdir> [CODE...]).
AGENTS.md: record the Neverblender node/surfacemat facts and the kit's tools;
note the slot-index (not material-name) surfacemat gotcha.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 17:04:41 +02:00

102 lines
2.8 KiB
Nix

{
description = "Westgate Urban Foundation MVP — Blender 4.0.2 tileset generator kit";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
# Reuse the machine's pinned Blender 4.0.2 + NWN toolchain via the repo overlay.
theorem.url = "git+file:///nix/nixos";
};
outputs =
{
self,
nixpkgs,
theorem,
}:
let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
overlays = [ theorem.overlays.default ];
};
blender = pkgs.blender-402-bin; # /bin/blender-4.0.2 (NWN needs 4.0.x, not 5.x)
py = pkgs.python3.withPackages (ps: [ ps.mcp ]);
gen = ./generator; # whole dir so tiles.py sits beside each script for import
build = pkgs.writeShellApplication {
name = "wgt-build";
runtimeInputs = [ blender ];
text = ''
out="''${1:-westgate_urban_foundation_mvp.blend}"
exec blender-4.0.2 --background --python ${gen}/build.py -- "$out"
'';
};
mkset = pkgs.writeShellApplication {
name = "wgt-set";
runtimeInputs = [ py ];
text = ''exec python ${gen}/make_set.py "$@"'';
};
mkwok = pkgs.writeShellApplication {
name = "wgt-wok";
runtimeInputs = [ py ];
text = ''exec python ${gen}/make_wok.py "$@"'';
};
# Real .mdl + .wok export via the Neverblender addon (must be enabled in
# this Blender's user config — confirmed working headless).
mkmdl = pkgs.writeShellApplication {
name = "wgt-export";
runtimeInputs = [ blender ];
text = ''
blend="''${1:?usage: wgt-export <blend> <outdir> [CODE...]}"
outdir="''${2:-mdl}"
shift 2 || true
exec blender-4.0.2 --background "$blend" --python ${gen}/export_mdl.py \
--python-exit-code 1 -- "$outdir" "$@"
'';
};
in
{
packages.${system}.default = build;
apps.${system} = {
default = {
type = "app";
program = "${build}/bin/wgt-build";
};
build = {
type = "app";
program = "${build}/bin/wgt-build";
};
set = {
type = "app";
program = "${mkset}/bin/wgt-set";
};
wok = {
type = "app";
program = "${mkwok}/bin/wgt-wok";
};
export = {
type = "app";
program = "${mkmdl}/bin/wgt-export";
};
};
devShells.${system}.default = pkgs.mkShell {
packages = [
blender
py
pkgs.neverwinter-nim
pkgs.cleanmodels
];
shellHook = ''
export BLENDER_BIN=${blender}/bin/blender-4.0.2
echo "wgt01 dev shell — build: blender-4.0.2 --background --python generator/build.py -- out.blend" >&2
'';
};
};
}