diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/LICENSE b/pk3_build/models/props/rustchain_vintage_powerpc_tower/LICENSE new file mode 100644 index 0000000..f7b7682 --- /dev/null +++ b/pk3_build/models/props/rustchain_vintage_powerpc_tower/LICENSE @@ -0,0 +1,14 @@ +RustChain Vintage PowerPC Tower prop + +Copyright 2026 + +This model, texture pack, preview image, and deterministic procedural source +are licensed under the Creative Commons Attribution-ShareAlike 4.0 +International License (CC-BY-SA-4.0). + +You are free to share and adapt the material for any purpose, even +commercially, provided attribution is given and adaptations are distributed +under the same license. + +License summary and legal code: +https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/README.md b/pk3_build/models/props/rustchain_vintage_powerpc_tower/README.md new file mode 100644 index 0000000..9c1e3f4 --- /dev/null +++ b/pk3_build/models/props/rustchain_vintage_powerpc_tower/README.md @@ -0,0 +1,53 @@ +# RustChain Vintage PowerPC Tower prop + +Original low-poly set-dressing prop for the Xonotic RustChain Arena prop bounty #14015: +https://github.com/Scottcjn/rustchain-bounties/issues/14015 + +## Package + +| File | Purpose | +| --- | --- | +| `rustchain_vintage_powerpc_tower.iqm` | Static IQM model for Xonotic/DarkPlaces | +| `rustchain_vintage_powerpc_tower.obj` | Editable source mesh generated by the Python script | +| `rustchain_vintage_powerpc_tower.mtl` | Source material table for the OBJ | +| `rustchain_vintage_powerpc_tower.skin` | Xonotic material-to-texture mapping | +| `textures/*.tga` | 256x256 power-of-two texture set | +| `preview.png` | Generated 1280x720 preview sheet | +| `README.md` | Integration and design notes | +| `LICENSE` | CC-BY-SA-4.0 / GPL-compatible asset license | + +## Design + +This implements the **Vintage PowerPC / retro tower** wishlist item. The prop is +a beige late-1990s tower silhouette with stacked optical/floppy bays, vertical +front vents, a small cyan RTC activity window, colored side badge stripes, rear +port hints, and chunky pedestal feet. It is meant for antiquity-vault corners, +server rooms, spawn alcoves, and map-side storytelling around old silicon. + +The geometry and textures are original procedural assets. No external mesh, +photo texture, AI-generated model file, or trademarked logo is embedded. + +## Regeneration + +From the repository root: + +```powershell +python tools/generate_rustchain_vintage_powerpc_tower_prop.py +``` + +The script writes the OBJ/MTL source, TGA textures, PNG preview, README, +LICENSE, and skin file. The committed IQM was converted from the generated OBJ +with the repository IQM compiler rebuilt locally for the current Linux runtime: + +```bash +cd source/iqm +g++ -O3 -fomit-frame-pointer -Wall -fsigned-char -o /tmp/iqm-local iqm.cpp +cd ../.. +/tmp/iqm-local pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.iqm pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.obj +``` + +## Placement + +Suggested use: low-cover set dressing against walls, behind glass, or inside an +antiquity vault. The model is static and low-poly; mappers can scale it to fit +server-room corridors or museum-style displays. diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/preview.png b/pk3_build/models/props/rustchain_vintage_powerpc_tower/preview.png new file mode 100644 index 0000000..f232391 Binary files /dev/null and b/pk3_build/models/props/rustchain_vintage_powerpc_tower/preview.png differ diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.iqm b/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.iqm new file mode 100644 index 0000000..7a9ded1 Binary files /dev/null and b/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.iqm differ diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.mtl b/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.mtl new file mode 100644 index 0000000..77f8c39 --- /dev/null +++ b/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.mtl @@ -0,0 +1,28 @@ +# Material table for rustchain_vintage_powerpc_tower +newmtl powerpc_case +Ka 0.000 0.000 0.000 +Kd 0.720 0.680 0.580 +Ks 0.050 0.050 0.050 +Ns 16.0 +map_Kd textures/powerpc_case.tga + +newmtl powerpc_dark +Ka 0.000 0.000 0.000 +Kd 0.120 0.130 0.140 +Ks 0.050 0.050 0.050 +Ns 16.0 +map_Kd textures/powerpc_dark.tga + +newmtl powerpc_glow +Ka 0.000 0.000 0.000 +Kd 0.050 0.840 0.880 +Ks 0.050 0.050 0.050 +Ns 16.0 +map_Kd textures/powerpc_glow.tga + +newmtl powerpc_label +Ka 0.000 0.000 0.000 +Kd 0.820 0.500 0.180 +Ks 0.050 0.050 0.050 +Ns 16.0 +map_Kd textures/powerpc_label.tga diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.obj b/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.obj new file mode 100644 index 0000000..ccb3455 --- /dev/null +++ b/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.obj @@ -0,0 +1,1092 @@ +# rustchain_vintage_powerpc_tower - deterministic source mesh +mtllib rustchain_vintage_powerpc_tower.mtl +o rustchain_vintage_powerpc_tower +v -0.5250 -0.2700 0.0500 +v 0.5250 -0.2700 0.0500 +v 0.5250 -0.2700 2.8500 +v -0.5250 -0.2700 2.8500 +v 0.5250 0.2700 0.0500 +v -0.5250 0.2700 0.0500 +v -0.5250 0.2700 2.8500 +v 0.5250 0.2700 2.8500 +v -0.5250 0.2700 0.0500 +v -0.5250 -0.2700 0.0500 +v -0.5250 -0.2700 2.8500 +v -0.5250 0.2700 2.8500 +v 0.5250 -0.2700 0.0500 +v 0.5250 0.2700 0.0500 +v 0.5250 0.2700 2.8500 +v 0.5250 -0.2700 2.8500 +v -0.5250 -0.2700 2.8500 +v 0.5250 -0.2700 2.8500 +v 0.5250 0.2700 2.8500 +v -0.5250 0.2700 2.8500 +v -0.5250 0.2700 0.0500 +v 0.5250 0.2700 0.0500 +v 0.5250 -0.2700 0.0500 +v -0.5250 -0.2700 0.0500 +v -0.4400 -0.3450 0.2400 +v 0.4400 -0.3450 0.2400 +v 0.4400 -0.3450 2.6600 +v -0.4400 -0.3450 2.6600 +v 0.4400 -0.2750 0.2400 +v -0.4400 -0.2750 0.2400 +v -0.4400 -0.2750 2.6600 +v 0.4400 -0.2750 2.6600 +v -0.4400 -0.2750 0.2400 +v -0.4400 -0.3450 0.2400 +v -0.4400 -0.3450 2.6600 +v -0.4400 -0.2750 2.6600 +v 0.4400 -0.3450 0.2400 +v 0.4400 -0.2750 0.2400 +v 0.4400 -0.2750 2.6600 +v 0.4400 -0.3450 2.6600 +v -0.4400 -0.3450 2.6600 +v 0.4400 -0.3450 2.6600 +v 0.4400 -0.2750 2.6600 +v -0.4400 -0.2750 2.6600 +v -0.4400 -0.2750 0.2400 +v 0.4400 -0.2750 0.2400 +v 0.4400 -0.3450 0.2400 +v -0.4400 -0.3450 0.2400 +v -0.3100 -0.3900 2.3300 +v 0.3100 -0.3900 2.3300 +v 0.3100 -0.3900 2.5100 +v -0.3100 -0.3900 2.5100 +v 0.3100 -0.3300 2.3300 +v -0.3100 -0.3300 2.3300 +v -0.3100 -0.3300 2.5100 +v 0.3100 -0.3300 2.5100 +v -0.3100 -0.3300 2.3300 +v -0.3100 -0.3900 2.3300 +v -0.3100 -0.3900 2.5100 +v -0.3100 -0.3300 2.5100 +v 0.3100 -0.3900 2.3300 +v 0.3100 -0.3300 2.3300 +v 0.3100 -0.3300 2.5100 +v 0.3100 -0.3900 2.5100 +v -0.3100 -0.3900 2.5100 +v 0.3100 -0.3900 2.5100 +v 0.3100 -0.3300 2.5100 +v -0.3100 -0.3300 2.5100 +v -0.3100 -0.3300 2.3300 +v 0.3100 -0.3300 2.3300 +v 0.3100 -0.3900 2.3300 +v -0.3100 -0.3900 2.3300 +v -0.3100 -0.3900 2.0550 +v 0.3100 -0.3900 2.0550 +v 0.3100 -0.3900 2.1850 +v -0.3100 -0.3900 2.1850 +v 0.3100 -0.3300 2.0550 +v -0.3100 -0.3300 2.0550 +v -0.3100 -0.3300 2.1850 +v 0.3100 -0.3300 2.1850 +v -0.3100 -0.3300 2.0550 +v -0.3100 -0.3900 2.0550 +v -0.3100 -0.3900 2.1850 +v -0.3100 -0.3300 2.1850 +v 0.3100 -0.3900 2.0550 +v 0.3100 -0.3300 2.0550 +v 0.3100 -0.3300 2.1850 +v 0.3100 -0.3900 2.1850 +v -0.3100 -0.3900 2.1850 +v 0.3100 -0.3900 2.1850 +v 0.3100 -0.3300 2.1850 +v -0.3100 -0.3300 2.1850 +v -0.3100 -0.3300 2.0550 +v 0.3100 -0.3300 2.0550 +v 0.3100 -0.3900 2.0550 +v -0.3100 -0.3900 2.0550 +v -0.2100 -0.3900 1.7250 +v 0.2100 -0.3900 1.7250 +v 0.2100 -0.3900 1.8350 +v -0.2100 -0.3900 1.8350 +v 0.2100 -0.3400 1.7250 +v -0.2100 -0.3400 1.7250 +v -0.2100 -0.3400 1.8350 +v 0.2100 -0.3400 1.8350 +v -0.2100 -0.3400 1.7250 +v -0.2100 -0.3900 1.7250 +v -0.2100 -0.3900 1.8350 +v -0.2100 -0.3400 1.8350 +v 0.2100 -0.3900 1.7250 +v 0.2100 -0.3400 1.7250 +v 0.2100 -0.3400 1.8350 +v 0.2100 -0.3900 1.8350 +v -0.2100 -0.3900 1.8350 +v 0.2100 -0.3900 1.8350 +v 0.2100 -0.3400 1.8350 +v -0.2100 -0.3400 1.8350 +v -0.2100 -0.3400 1.7250 +v 0.2100 -0.3400 1.7250 +v 0.2100 -0.3900 1.7250 +v -0.2100 -0.3900 1.7250 +v -0.3300 -0.3950 0.9200 +v -0.2300 -0.3950 0.9200 +v -0.2300 -0.3950 1.7600 +v -0.3300 -0.3950 1.7600 +v -0.2300 -0.3450 0.9200 +v -0.3300 -0.3450 0.9200 +v -0.3300 -0.3450 1.7600 +v -0.2300 -0.3450 1.7600 +v -0.3300 -0.3450 0.9200 +v -0.3300 -0.3950 0.9200 +v -0.3300 -0.3950 1.7600 +v -0.3300 -0.3450 1.7600 +v -0.2300 -0.3950 0.9200 +v -0.2300 -0.3450 0.9200 +v -0.2300 -0.3450 1.7600 +v -0.2300 -0.3950 1.7600 +v -0.3300 -0.3950 1.7600 +v -0.2300 -0.3950 1.7600 +v -0.2300 -0.3450 1.7600 +v -0.3300 -0.3450 1.7600 +v -0.3300 -0.3450 0.9200 +v -0.2300 -0.3450 0.9200 +v -0.2300 -0.3950 0.9200 +v -0.3300 -0.3950 0.9200 +v -0.1600 -0.3950 0.9200 +v -0.0600 -0.3950 0.9200 +v -0.0600 -0.3950 1.7600 +v -0.1600 -0.3950 1.7600 +v -0.0600 -0.3450 0.9200 +v -0.1600 -0.3450 0.9200 +v -0.1600 -0.3450 1.7600 +v -0.0600 -0.3450 1.7600 +v -0.1600 -0.3450 0.9200 +v -0.1600 -0.3950 0.9200 +v -0.1600 -0.3950 1.7600 +v -0.1600 -0.3450 1.7600 +v -0.0600 -0.3950 0.9200 +v -0.0600 -0.3450 0.9200 +v -0.0600 -0.3450 1.7600 +v -0.0600 -0.3950 1.7600 +v -0.1600 -0.3950 1.7600 +v -0.0600 -0.3950 1.7600 +v -0.0600 -0.3450 1.7600 +v -0.1600 -0.3450 1.7600 +v -0.1600 -0.3450 0.9200 +v -0.0600 -0.3450 0.9200 +v -0.0600 -0.3950 0.9200 +v -0.1600 -0.3950 0.9200 +v 0.0100 -0.3950 0.9200 +v 0.1100 -0.3950 0.9200 +v 0.1100 -0.3950 1.7600 +v 0.0100 -0.3950 1.7600 +v 0.1100 -0.3450 0.9200 +v 0.0100 -0.3450 0.9200 +v 0.0100 -0.3450 1.7600 +v 0.1100 -0.3450 1.7600 +v 0.0100 -0.3450 0.9200 +v 0.0100 -0.3950 0.9200 +v 0.0100 -0.3950 1.7600 +v 0.0100 -0.3450 1.7600 +v 0.1100 -0.3950 0.9200 +v 0.1100 -0.3450 0.9200 +v 0.1100 -0.3450 1.7600 +v 0.1100 -0.3950 1.7600 +v 0.0100 -0.3950 1.7600 +v 0.1100 -0.3950 1.7600 +v 0.1100 -0.3450 1.7600 +v 0.0100 -0.3450 1.7600 +v 0.0100 -0.3450 0.9200 +v 0.1100 -0.3450 0.9200 +v 0.1100 -0.3950 0.9200 +v 0.0100 -0.3950 0.9200 +v 0.1900 -0.3950 1.3000 +v 0.3900 -0.3950 1.3000 +v 0.3900 -0.3950 1.5600 +v 0.1900 -0.3950 1.5600 +v 0.3900 -0.3450 1.3000 +v 0.1900 -0.3450 1.3000 +v 0.1900 -0.3450 1.5600 +v 0.3900 -0.3450 1.5600 +v 0.1900 -0.3450 1.3000 +v 0.1900 -0.3950 1.3000 +v 0.1900 -0.3950 1.5600 +v 0.1900 -0.3450 1.5600 +v 0.3900 -0.3950 1.3000 +v 0.3900 -0.3450 1.3000 +v 0.3900 -0.3450 1.5600 +v 0.3900 -0.3950 1.5600 +v 0.1900 -0.3950 1.5600 +v 0.3900 -0.3950 1.5600 +v 0.3900 -0.3450 1.5600 +v 0.1900 -0.3450 1.5600 +v 0.1900 -0.3450 1.3000 +v 0.3900 -0.3450 1.3000 +v 0.3900 -0.3950 1.3000 +v 0.1900 -0.3950 1.3000 +v 0.0900 -0.3950 0.8800 +v 0.4300 -0.3950 0.8800 +v 0.4300 -0.3950 1.0000 +v 0.0900 -0.3950 1.0000 +v 0.4300 -0.3450 0.8800 +v 0.0900 -0.3450 0.8800 +v 0.0900 -0.3450 1.0000 +v 0.4300 -0.3450 1.0000 +v 0.0900 -0.3450 0.8800 +v 0.0900 -0.3950 0.8800 +v 0.0900 -0.3950 1.0000 +v 0.0900 -0.3450 1.0000 +v 0.4300 -0.3950 0.8800 +v 0.4300 -0.3450 0.8800 +v 0.4300 -0.3450 1.0000 +v 0.4300 -0.3950 1.0000 +v 0.0900 -0.3950 1.0000 +v 0.4300 -0.3950 1.0000 +v 0.4300 -0.3450 1.0000 +v 0.0900 -0.3450 1.0000 +v 0.0900 -0.3450 0.8800 +v 0.4300 -0.3450 0.8800 +v 0.4300 -0.3950 0.8800 +v 0.0900 -0.3950 0.8800 +v -0.5350 -0.4900 0.1200 +v -0.3050 -0.4900 0.1200 +v -0.3050 -0.4900 0.2800 +v -0.5350 -0.4900 0.2800 +v -0.3050 -0.2900 0.1200 +v -0.5350 -0.2900 0.1200 +v -0.5350 -0.2900 0.2800 +v -0.3050 -0.2900 0.2800 +v -0.5350 -0.2900 0.1200 +v -0.5350 -0.4900 0.1200 +v -0.5350 -0.4900 0.2800 +v -0.5350 -0.2900 0.2800 +v -0.3050 -0.4900 0.1200 +v -0.3050 -0.2900 0.1200 +v -0.3050 -0.2900 0.2800 +v -0.3050 -0.4900 0.2800 +v -0.5350 -0.4900 0.2800 +v -0.3050 -0.4900 0.2800 +v -0.3050 -0.2900 0.2800 +v -0.5350 -0.2900 0.2800 +v -0.5350 -0.2900 0.1200 +v -0.3050 -0.2900 0.1200 +v -0.3050 -0.4900 0.1200 +v -0.5350 -0.4900 0.1200 +v 0.3050 -0.4900 0.1200 +v 0.5350 -0.4900 0.1200 +v 0.5350 -0.4900 0.2800 +v 0.3050 -0.4900 0.2800 +v 0.5350 -0.2900 0.1200 +v 0.3050 -0.2900 0.1200 +v 0.3050 -0.2900 0.2800 +v 0.5350 -0.2900 0.2800 +v 0.3050 -0.2900 0.1200 +v 0.3050 -0.4900 0.1200 +v 0.3050 -0.4900 0.2800 +v 0.3050 -0.2900 0.2800 +v 0.5350 -0.4900 0.1200 +v 0.5350 -0.2900 0.1200 +v 0.5350 -0.2900 0.2800 +v 0.5350 -0.4900 0.2800 +v 0.3050 -0.4900 0.2800 +v 0.5350 -0.4900 0.2800 +v 0.5350 -0.2900 0.2800 +v 0.3050 -0.2900 0.2800 +v 0.3050 -0.2900 0.1200 +v 0.5350 -0.2900 0.1200 +v 0.5350 -0.4900 0.1200 +v 0.3050 -0.4900 0.1200 +v -0.5950 -0.2400 0.2200 +v -0.5250 -0.2400 0.2200 +v -0.5250 -0.2400 2.6800 +v -0.5950 -0.2400 2.6800 +v -0.5250 0.2400 0.2200 +v -0.5950 0.2400 0.2200 +v -0.5950 0.2400 2.6800 +v -0.5250 0.2400 2.6800 +v -0.5950 0.2400 0.2200 +v -0.5950 -0.2400 0.2200 +v -0.5950 -0.2400 2.6800 +v -0.5950 0.2400 2.6800 +v -0.5250 -0.2400 0.2200 +v -0.5250 0.2400 0.2200 +v -0.5250 0.2400 2.6800 +v -0.5250 -0.2400 2.6800 +v -0.5950 -0.2400 2.6800 +v -0.5250 -0.2400 2.6800 +v -0.5250 0.2400 2.6800 +v -0.5950 0.2400 2.6800 +v -0.5950 0.2400 0.2200 +v -0.5250 0.2400 0.2200 +v -0.5250 -0.2400 0.2200 +v -0.5950 -0.2400 0.2200 +v 0.5250 -0.2400 0.2200 +v 0.5950 -0.2400 0.2200 +v 0.5950 -0.2400 2.6800 +v 0.5250 -0.2400 2.6800 +v 0.5950 0.2400 0.2200 +v 0.5250 0.2400 0.2200 +v 0.5250 0.2400 2.6800 +v 0.5950 0.2400 2.6800 +v 0.5250 0.2400 0.2200 +v 0.5250 -0.2400 0.2200 +v 0.5250 -0.2400 2.6800 +v 0.5250 0.2400 2.6800 +v 0.5950 -0.2400 0.2200 +v 0.5950 0.2400 0.2200 +v 0.5950 0.2400 2.6800 +v 0.5950 -0.2400 2.6800 +v 0.5250 -0.2400 2.6800 +v 0.5950 -0.2400 2.6800 +v 0.5950 0.2400 2.6800 +v 0.5250 0.2400 2.6800 +v 0.5250 0.2400 0.2200 +v 0.5950 0.2400 0.2200 +v 0.5950 -0.2400 0.2200 +v 0.5250 -0.2400 0.2200 +v -0.3600 0.2750 0.9300 +v 0.3600 0.2750 0.9300 +v 0.3600 0.2750 2.4300 +v -0.3600 0.2750 2.4300 +v 0.3600 0.3450 0.9300 +v -0.3600 0.3450 0.9300 +v -0.3600 0.3450 2.4300 +v 0.3600 0.3450 2.4300 +v -0.3600 0.3450 0.9300 +v -0.3600 0.2750 0.9300 +v -0.3600 0.2750 2.4300 +v -0.3600 0.3450 2.4300 +v 0.3600 0.2750 0.9300 +v 0.3600 0.3450 0.9300 +v 0.3600 0.3450 2.4300 +v 0.3600 0.2750 2.4300 +v -0.3600 0.2750 2.4300 +v 0.3600 0.2750 2.4300 +v 0.3600 0.3450 2.4300 +v -0.3600 0.3450 2.4300 +v -0.3600 0.3450 0.9300 +v 0.3600 0.3450 0.9300 +v 0.3600 0.2750 0.9300 +v -0.3600 0.2750 0.9300 +v -0.3300 0.3350 1.9200 +v -0.1900 0.3350 1.9200 +v -0.1900 0.3350 2.0400 +v -0.3300 0.3350 2.0400 +v -0.1900 0.3850 1.9200 +v -0.3300 0.3850 1.9200 +v -0.3300 0.3850 2.0400 +v -0.1900 0.3850 2.0400 +v -0.3300 0.3850 1.9200 +v -0.3300 0.3350 1.9200 +v -0.3300 0.3350 2.0400 +v -0.3300 0.3850 2.0400 +v -0.1900 0.3350 1.9200 +v -0.1900 0.3850 1.9200 +v -0.1900 0.3850 2.0400 +v -0.1900 0.3350 2.0400 +v -0.3300 0.3350 2.0400 +v -0.1900 0.3350 2.0400 +v -0.1900 0.3850 2.0400 +v -0.3300 0.3850 2.0400 +v -0.3300 0.3850 1.9200 +v -0.1900 0.3850 1.9200 +v -0.1900 0.3350 1.9200 +v -0.3300 0.3350 1.9200 +v -0.0700 0.3350 1.9200 +v 0.0700 0.3350 1.9200 +v 0.0700 0.3350 2.0400 +v -0.0700 0.3350 2.0400 +v 0.0700 0.3850 1.9200 +v -0.0700 0.3850 1.9200 +v -0.0700 0.3850 2.0400 +v 0.0700 0.3850 2.0400 +v -0.0700 0.3850 1.9200 +v -0.0700 0.3350 1.9200 +v -0.0700 0.3350 2.0400 +v -0.0700 0.3850 2.0400 +v 0.0700 0.3350 1.9200 +v 0.0700 0.3850 1.9200 +v 0.0700 0.3850 2.0400 +v 0.0700 0.3350 2.0400 +v -0.0700 0.3350 2.0400 +v 0.0700 0.3350 2.0400 +v 0.0700 0.3850 2.0400 +v -0.0700 0.3850 2.0400 +v -0.0700 0.3850 1.9200 +v 0.0700 0.3850 1.9200 +v 0.0700 0.3350 1.9200 +v -0.0700 0.3350 1.9200 +v 0.1900 0.3350 1.9200 +v 0.3300 0.3350 1.9200 +v 0.3300 0.3350 2.0400 +v 0.1900 0.3350 2.0400 +v 0.3300 0.3850 1.9200 +v 0.1900 0.3850 1.9200 +v 0.1900 0.3850 2.0400 +v 0.3300 0.3850 2.0400 +v 0.1900 0.3850 1.9200 +v 0.1900 0.3350 1.9200 +v 0.1900 0.3350 2.0400 +v 0.1900 0.3850 2.0400 +v 0.3300 0.3350 1.9200 +v 0.3300 0.3850 1.9200 +v 0.3300 0.3850 2.0400 +v 0.3300 0.3350 2.0400 +v 0.1900 0.3350 2.0400 +v 0.3300 0.3350 2.0400 +v 0.3300 0.3850 2.0400 +v 0.1900 0.3850 2.0400 +v 0.1900 0.3850 1.9200 +v 0.3300 0.3850 1.9200 +v 0.3300 0.3350 1.9200 +v 0.1900 0.3350 1.9200 +v -0.3300 -0.2100 2.8400 +v 0.3300 -0.2100 2.8400 +v 0.3300 -0.2100 3.0000 +v -0.3300 -0.2100 3.0000 +v 0.3300 0.2100 2.8400 +v -0.3300 0.2100 2.8400 +v -0.3300 0.2100 3.0000 +v 0.3300 0.2100 3.0000 +v -0.3300 0.2100 2.8400 +v -0.3300 -0.2100 2.8400 +v -0.3300 -0.2100 3.0000 +v -0.3300 0.2100 3.0000 +v 0.3300 -0.2100 2.8400 +v 0.3300 0.2100 2.8400 +v 0.3300 0.2100 3.0000 +v 0.3300 -0.2100 3.0000 +v -0.3300 -0.2100 3.0000 +v 0.3300 -0.2100 3.0000 +v 0.3300 0.2100 3.0000 +v -0.3300 0.2100 3.0000 +v -0.3300 0.2100 2.8400 +v 0.3300 0.2100 2.8400 +v 0.3300 -0.2100 2.8400 +v -0.3300 -0.2100 2.8400 +v -0.1800 -0.1200 3.0000 +v 0.1800 -0.1200 3.0000 +v 0.1800 -0.1200 3.0800 +v -0.1800 -0.1200 3.0800 +v 0.1800 0.0800 3.0000 +v -0.1800 0.0800 3.0000 +v -0.1800 0.0800 3.0800 +v 0.1800 0.0800 3.0800 +v -0.1800 0.0800 3.0000 +v -0.1800 -0.1200 3.0000 +v -0.1800 -0.1200 3.0800 +v -0.1800 0.0800 3.0800 +v 0.1800 -0.1200 3.0000 +v 0.1800 0.0800 3.0000 +v 0.1800 0.0800 3.0800 +v 0.1800 -0.1200 3.0800 +v -0.1800 -0.1200 3.0800 +v 0.1800 -0.1200 3.0800 +v 0.1800 0.0800 3.0800 +v -0.1800 0.0800 3.0800 +v -0.1800 0.0800 3.0000 +v 0.1800 0.0800 3.0000 +v 0.1800 -0.1200 3.0000 +v -0.1800 -0.1200 3.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +usemtl powerpc_case +f 1/1 2/2 3/3 4/4 +f 5/5 6/6 7/7 8/8 +f 9/9 10/10 11/11 12/12 +f 13/13 14/14 15/15 16/16 +f 17/17 18/18 19/19 20/20 +f 21/21 22/22 23/23 24/24 +f 25/25 26/26 27/27 28/28 +f 29/29 30/30 31/31 32/32 +f 33/33 34/34 35/35 36/36 +f 37/37 38/38 39/39 40/40 +f 41/41 42/42 43/43 44/44 +f 45/45 46/46 47/47 48/48 +usemtl powerpc_dark +f 49/49 50/50 51/51 52/52 +f 53/53 54/54 55/55 56/56 +f 57/57 58/58 59/59 60/60 +f 61/61 62/62 63/63 64/64 +f 65/65 66/66 67/67 68/68 +f 69/69 70/70 71/71 72/72 +f 73/73 74/74 75/75 76/76 +f 77/77 78/78 79/79 80/80 +f 81/81 82/82 83/83 84/84 +f 85/85 86/86 87/87 88/88 +f 89/89 90/90 91/91 92/92 +f 93/93 94/94 95/95 96/96 +f 97/97 98/98 99/99 100/100 +f 101/101 102/102 103/103 104/104 +f 105/105 106/106 107/107 108/108 +f 109/109 110/110 111/111 112/112 +f 113/113 114/114 115/115 116/116 +f 117/117 118/118 119/119 120/120 +f 121/121 122/122 123/123 124/124 +f 125/125 126/126 127/127 128/128 +f 129/129 130/130 131/131 132/132 +f 133/133 134/134 135/135 136/136 +f 137/137 138/138 139/139 140/140 +f 141/141 142/142 143/143 144/144 +f 145/145 146/146 147/147 148/148 +f 149/149 150/150 151/151 152/152 +f 153/153 154/154 155/155 156/156 +f 157/157 158/158 159/159 160/160 +f 161/161 162/162 163/163 164/164 +f 165/165 166/166 167/167 168/168 +f 169/169 170/170 171/171 172/172 +f 173/173 174/174 175/175 176/176 +f 177/177 178/178 179/179 180/180 +f 181/181 182/182 183/183 184/184 +f 185/185 186/186 187/187 188/188 +f 189/189 190/190 191/191 192/192 +usemtl powerpc_glow +f 193/193 194/194 195/195 196/196 +f 197/197 198/198 199/199 200/200 +f 201/201 202/202 203/203 204/204 +f 205/205 206/206 207/207 208/208 +f 209/209 210/210 211/211 212/212 +f 213/213 214/214 215/215 216/216 +usemtl powerpc_label +f 217/217 218/218 219/219 220/220 +f 221/221 222/222 223/223 224/224 +f 225/225 226/226 227/227 228/228 +f 229/229 230/230 231/231 232/232 +f 233/233 234/234 235/235 236/236 +f 237/237 238/238 239/239 240/240 +usemtl powerpc_case +f 241/241 242/242 243/243 244/244 +f 245/245 246/246 247/247 248/248 +f 249/249 250/250 251/251 252/252 +f 253/253 254/254 255/255 256/256 +f 257/257 258/258 259/259 260/260 +f 261/261 262/262 263/263 264/264 +f 265/265 266/266 267/267 268/268 +f 269/269 270/270 271/271 272/272 +f 273/273 274/274 275/275 276/276 +f 277/277 278/278 279/279 280/280 +f 281/281 282/282 283/283 284/284 +f 285/285 286/286 287/287 288/288 +usemtl powerpc_dark +f 289/289 290/290 291/291 292/292 +f 293/293 294/294 295/295 296/296 +f 297/297 298/298 299/299 300/300 +f 301/301 302/302 303/303 304/304 +f 305/305 306/306 307/307 308/308 +f 309/309 310/310 311/311 312/312 +f 313/313 314/314 315/315 316/316 +f 317/317 318/318 319/319 320/320 +f 321/321 322/322 323/323 324/324 +f 325/325 326/326 327/327 328/328 +f 329/329 330/330 331/331 332/332 +f 333/333 334/334 335/335 336/336 +f 337/337 338/338 339/339 340/340 +f 341/341 342/342 343/343 344/344 +f 345/345 346/346 347/347 348/348 +f 349/349 350/350 351/351 352/352 +f 353/353 354/354 355/355 356/356 +f 357/357 358/358 359/359 360/360 +usemtl powerpc_glow +f 361/361 362/362 363/363 364/364 +f 365/365 366/366 367/367 368/368 +f 369/369 370/370 371/371 372/372 +f 373/373 374/374 375/375 376/376 +f 377/377 378/378 379/379 380/380 +f 381/381 382/382 383/383 384/384 +f 385/385 386/386 387/387 388/388 +f 389/389 390/390 391/391 392/392 +f 393/393 394/394 395/395 396/396 +f 397/397 398/398 399/399 400/400 +f 401/401 402/402 403/403 404/404 +f 405/405 406/406 407/407 408/408 +f 409/409 410/410 411/411 412/412 +f 413/413 414/414 415/415 416/416 +f 417/417 418/418 419/419 420/420 +f 421/421 422/422 423/423 424/424 +f 425/425 426/426 427/427 428/428 +f 429/429 430/430 431/431 432/432 +usemtl powerpc_case +f 433/433 434/434 435/435 436/436 +f 437/437 438/438 439/439 440/440 +f 441/441 442/442 443/443 444/444 +f 445/445 446/446 447/447 448/448 +f 449/449 450/450 451/451 452/452 +f 453/453 454/454 455/455 456/456 +usemtl powerpc_dark +f 457/457 458/458 459/459 460/460 +f 461/461 462/462 463/463 464/464 +f 465/465 466/466 467/467 468/468 +f 469/469 470/470 471/471 472/472 +f 473/473 474/474 475/475 476/476 +f 477/477 478/478 479/479 480/480 diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.skin b/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.skin new file mode 100644 index 0000000..0c9d162 --- /dev/null +++ b/pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.skin @@ -0,0 +1,4 @@ +powerpc_case,models/props/rustchain_vintage_powerpc_tower/textures/powerpc_case.tga +powerpc_dark,models/props/rustchain_vintage_powerpc_tower/textures/powerpc_dark.tga +powerpc_glow,models/props/rustchain_vintage_powerpc_tower/textures/powerpc_glow.tga +powerpc_label,models/props/rustchain_vintage_powerpc_tower/textures/powerpc_label.tga diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_case.tga b/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_case.tga new file mode 100644 index 0000000..a148099 Binary files /dev/null and b/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_case.tga differ diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_dark.tga b/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_dark.tga new file mode 100644 index 0000000..e4a899e Binary files /dev/null and b/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_dark.tga differ diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_glow.tga b/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_glow.tga new file mode 100644 index 0000000..a5a6dc2 Binary files /dev/null and b/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_glow.tga differ diff --git a/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_label.tga b/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_label.tga new file mode 100644 index 0000000..0bc2732 Binary files /dev/null and b/pk3_build/models/props/rustchain_vintage_powerpc_tower/textures/powerpc_label.tga differ diff --git a/tests/test_vintage_powerpc_tower_prop.py b/tests/test_vintage_powerpc_tower_prop.py new file mode 100644 index 0000000..10eea8b --- /dev/null +++ b/tests/test_vintage_powerpc_tower_prop.py @@ -0,0 +1,67 @@ +import struct +import unittest +from pathlib import Path + +from PIL import Image + + +ROOT = Path(__file__).resolve().parents[1] +PROP_NAME = "rustchain_vintage_powerpc_tower" +PROP = ROOT / "pk3_build" / "models" / "props" / PROP_NAME + + +class VintagePowerPCTowerPropTest(unittest.TestCase): + def test_required_bounty_files_exist(self): + required = [ + f"{PROP_NAME}.iqm", + f"{PROP_NAME}.obj", + f"{PROP_NAME}.mtl", + f"{PROP_NAME}.skin", + "preview.png", + "README.md", + "LICENSE", + "textures/powerpc_case.tga", + "textures/powerpc_dark.tga", + "textures/powerpc_glow.tga", + "textures/powerpc_label.tga", + ] + for name in required: + self.assertTrue((PROP / name).is_file(), name) + + def test_iqm_header_is_static_model(self): + data = (PROP / f"{PROP_NAME}.iqm").read_bytes() + values = struct.unpack("<16s27I", data[:124]) + self.assertEqual(values[0], b"INTERQUAKEMODEL\0") + self.assertEqual(values[1], 2) + self.assertEqual(values[2], len(data)) + self.assertGreaterEqual(values[6], 1) + self.assertGreaterEqual(values[8], 2) + self.assertGreater(values[9], 40) + self.assertGreater(values[11], 20) + self.assertEqual(values[14], 0) + self.assertEqual(values[18], 0) + + def test_textures_and_preview_have_expected_sizes(self): + for texture in (PROP / "textures").glob("*.tga"): + with Image.open(texture) as image: + self.assertEqual(image.size, (256, 256), texture.name) + with Image.open(PROP / "preview.png") as preview: + self.assertEqual(preview.size, (1280, 720)) + self.assertEqual(preview.format, "PNG") + + def test_skin_and_obj_reference_all_materials(self): + skin = (PROP / f"{PROP_NAME}.skin").read_text(encoding="ascii") + obj = (PROP / f"{PROP_NAME}.obj").read_text(encoding="ascii") + for material in ("powerpc_case", "powerpc_dark", "powerpc_glow", "powerpc_label"): + self.assertIn(material, skin) + self.assertIn(f"usemtl {material}", obj) + + def test_readme_identifies_distinct_wishlist_item(self): + readme = (PROP / "README.md").read_text(encoding="utf-8") + self.assertIn("bounty #14015", readme.lower()) + self.assertIn("vintage powerpc", readme.lower()) + self.assertIn("retro tower", readme.lower()) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/generate_rustchain_vintage_powerpc_tower_prop.py b/tools/generate_rustchain_vintage_powerpc_tower_prop.py new file mode 100644 index 0000000..46acbcc --- /dev/null +++ b/tools/generate_rustchain_vintage_powerpc_tower_prop.py @@ -0,0 +1,320 @@ +"""Generate the RustChain vintage PowerPC-style tower prop package. + +The output is an original low-poly static prop for bounty #14015: +pk3_build/models/props/rustchain_vintage_powerpc_tower/. +""" + +from __future__ import annotations + +from pathlib import Path + +from PIL import Image, ImageDraw, ImageFont + + +ROOT = Path(__file__).resolve().parents[1] +PROP_NAME = "rustchain_vintage_powerpc_tower" +OUT = ROOT / "pk3_build" / "models" / "props" / PROP_NAME +TEXTURES = OUT / "textures" + +OBJ_FILE = OUT / f"{PROP_NAME}.obj" +MTL_FILE = OUT / f"{PROP_NAME}.mtl" +SKIN_FILE = OUT / f"{PROP_NAME}.skin" +PREVIEW_FILE = OUT / "preview.png" +IQM_FILE = OUT / f"{PROP_NAME}.iqm" + +MATERIALS = { + "powerpc_case": { + "texture": "textures/powerpc_case.tga", + "color": (190, 181, 154), + "kd": (0.72, 0.68, 0.58), + }, + "powerpc_dark": { + "texture": "textures/powerpc_dark.tga", + "color": (34, 36, 38), + "kd": (0.12, 0.13, 0.14), + }, + "powerpc_glow": { + "texture": "textures/powerpc_glow.tga", + "color": (31, 216, 224), + "kd": (0.05, 0.84, 0.88), + }, + "powerpc_label": { + "texture": "textures/powerpc_label.tga", + "color": (220, 152, 52), + "kd": (0.82, 0.50, 0.18), + }, +} + +README_TEXT = """# RustChain Vintage PowerPC Tower prop + +Original low-poly set-dressing prop for the Xonotic RustChain Arena prop bounty #14015: +https://github.com/Scottcjn/rustchain-bounties/issues/14015 + +## Package + +| File | Purpose | +| --- | --- | +| `rustchain_vintage_powerpc_tower.iqm` | Static IQM model for Xonotic/DarkPlaces | +| `rustchain_vintage_powerpc_tower.obj` | Editable source mesh generated by the Python script | +| `rustchain_vintage_powerpc_tower.mtl` | Source material table for the OBJ | +| `rustchain_vintage_powerpc_tower.skin` | Xonotic material-to-texture mapping | +| `textures/*.tga` | 256x256 power-of-two texture set | +| `preview.png` | Generated 1280x720 preview sheet | +| `README.md` | Integration and design notes | +| `LICENSE` | CC-BY-SA-4.0 / GPL-compatible asset license | + +## Design + +This implements the **Vintage PowerPC / retro tower** wishlist item. The prop is +a beige late-1990s tower silhouette with stacked optical/floppy bays, vertical +front vents, a small cyan RTC activity window, colored side badge stripes, rear +port hints, and chunky pedestal feet. It is meant for antiquity-vault corners, +server rooms, spawn alcoves, and map-side storytelling around old silicon. + +The geometry and textures are original procedural assets. No external mesh, +photo texture, AI-generated model file, or trademarked logo is embedded. + +## Regeneration + +From the repository root: + +```powershell +python tools/generate_rustchain_vintage_powerpc_tower_prop.py +``` + +The script writes the OBJ/MTL source, TGA textures, PNG preview, README, +LICENSE, and skin file. The committed IQM was converted from the generated OBJ +with the repository IQM compiler rebuilt locally for the current Linux runtime: + +```bash +cd source/iqm +g++ -O3 -fomit-frame-pointer -Wall -fsigned-char -o /tmp/iqm-local iqm.cpp +cd ../.. +/tmp/iqm-local pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.iqm \ + pk3_build/models/props/rustchain_vintage_powerpc_tower/rustchain_vintage_powerpc_tower.obj +``` + +## Placement + +Suggested use: low-cover set dressing against walls, behind glass, or inside an +antiquity vault. The model is static and low-poly; mappers can scale it to fit +server-room corridors or museum-style displays. +""" + +LICENSE_TEXT = """RustChain Vintage PowerPC Tower prop + +Copyright 2026 + +This model, texture pack, preview image, and deterministic procedural source +are licensed under the Creative Commons Attribution-ShareAlike 4.0 +International License (CC-BY-SA-4.0). + +You are free to share and adapt the material for any purpose, even +commercially, provided attribution is given and adaptations are distributed +under the same license. + +License summary and legal code: +https://creativecommons.org/licenses/by-sa/4.0/ +""" + + +class ObjMesh: + def __init__(self) -> None: + self.vertices: list[tuple[float, float, float]] = [] + self.uvs: list[tuple[float, float]] = [] + self.faces: list[tuple[str, tuple[int, int, int, int], tuple[int, int, int, int]]] = [] + + def _add_vertex(self, xyz: tuple[float, float, float], uv: tuple[float, float]) -> tuple[int, int]: + self.vertices.append(xyz) + self.uvs.append(uv) + idx = len(self.vertices) + return idx, idx + + def add_quad(self, material: str, points: list[tuple[float, float, float]]) -> None: + uv_points = [(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)] + pairs = [self._add_vertex(point, uv) for point, uv in zip(points, uv_points)] + self.faces.append((material, tuple(v for v, _ in pairs), tuple(t for _, t in pairs))) + + def add_box( + self, + center: tuple[float, float, float], + size: tuple[float, float, float], + material: str, + ) -> None: + cx, cy, cz = center + sx, sy, sz = (axis / 2.0 for axis in size) + x0, x1 = cx - sx, cx + sx + y0, y1 = cy - sy, cy + sy + z0, z1 = cz - sz, cz + sz + self.add_quad(material, [(x0, y0, z0), (x1, y0, z0), (x1, y0, z1), (x0, y0, z1)]) + self.add_quad(material, [(x1, y1, z0), (x0, y1, z0), (x0, y1, z1), (x1, y1, z1)]) + self.add_quad(material, [(x0, y1, z0), (x0, y0, z0), (x0, y0, z1), (x0, y1, z1)]) + self.add_quad(material, [(x1, y0, z0), (x1, y1, z0), (x1, y1, z1), (x1, y0, z1)]) + self.add_quad(material, [(x0, y0, z1), (x1, y0, z1), (x1, y1, z1), (x0, y1, z1)]) + self.add_quad(material, [(x0, y1, z0), (x1, y1, z0), (x1, y0, z0), (x0, y0, z0)]) + + def write_obj(self, path: Path) -> None: + lines = [ + f"# {PROP_NAME} - deterministic source mesh", + f"mtllib {MTL_FILE.name}", + "o rustchain_vintage_powerpc_tower", + ] + for vertex in self.vertices: + lines.append("v {:.4f} {:.4f} {:.4f}".format(*vertex)) + for uv in self.uvs: + lines.append("vt {:.4f} {:.4f}".format(*uv)) + current_material = "" + for material, verts, texcoords in self.faces: + if material != current_material: + lines.append(f"usemtl {material}") + current_material = material + refs = [f"{v}/{t}" for v, t in zip(verts, texcoords)] + lines.append("f " + " ".join(refs)) + path.write_text("\n".join(lines) + "\n", encoding="ascii") + + +def font(size: int) -> ImageFont.ImageFont: + for name in ("DejaVuSans.ttf", "arial.ttf"): + try: + return ImageFont.truetype(name, size) + except OSError: + continue + return ImageFont.load_default() + + +def write_texture(name: str, base: tuple[int, int, int], accent: tuple[int, int, int]) -> None: + image = Image.new("RGB", (256, 256), base) + draw = ImageDraw.Draw(image) + if "case" in name: + for x in range(0, 256, 32): + draw.line((x, 0, x, 255), fill=tuple(max(0, c - 18) for c in base)) + for y in range(0, 256, 32): + draw.line((0, y, 255, y), fill=tuple(min(255, c + 12) for c in base)) + draw.rectangle((18, 18, 238, 238), outline=accent, width=3) + elif "dark" in name: + for y in range(12, 256, 18): + draw.rectangle((22, y, 234, y + 7), fill=accent) + elif "glow" in name: + for r in range(110, 8, -12): + shade = tuple(min(255, int(c * (0.28 + r / 130))) for c in accent) + draw.ellipse((128 - r, 128 - r, 128 + r, 128 + r), outline=shade, width=5) + draw.text((86, 110), "RTC", fill=(8, 34, 38), font=font(36)) + else: + colors = [(220, 67, 57), (239, 167, 45), (86, 184, 96), (58, 137, 220)] + for idx, color in enumerate(colors): + draw.rectangle((0, idx * 64, 256, idx * 64 + 47), fill=color) + draw.text((54, 196), "PPC", fill=(30, 28, 24), font=font(36)) + image.save(TEXTURES / name) + + +def write_textures() -> None: + write_texture("powerpc_case.tga", (190, 181, 154), (128, 117, 88)) + write_texture("powerpc_dark.tga", (28, 30, 32), (78, 84, 86)) + write_texture("powerpc_glow.tga", (10, 39, 43), (31, 216, 224)) + write_texture("powerpc_label.tga", (220, 152, 52), (255, 232, 142)) + + +def build_mesh() -> ObjMesh: + mesh = ObjMesh() + mesh.add_box((0.0, 0.0, 1.45), (1.05, 0.54, 2.80), "powerpc_case") + mesh.add_box((0.0, -0.31, 1.45), (0.88, 0.07, 2.42), "powerpc_case") + mesh.add_box((0.0, -0.36, 2.42), (0.62, 0.06, 0.18), "powerpc_dark") + mesh.add_box((0.0, -0.36, 2.12), (0.62, 0.06, 0.13), "powerpc_dark") + mesh.add_box((0.0, -0.365, 1.78), (0.42, 0.05, 0.11), "powerpc_dark") + mesh.add_box((-0.28, -0.37, 1.34), (0.10, 0.05, 0.84), "powerpc_dark") + mesh.add_box((-0.11, -0.37, 1.34), (0.10, 0.05, 0.84), "powerpc_dark") + mesh.add_box((0.06, -0.37, 1.34), (0.10, 0.05, 0.84), "powerpc_dark") + mesh.add_box((0.29, -0.37, 1.43), (0.20, 0.05, 0.26), "powerpc_glow") + mesh.add_box((0.26, -0.37, 0.94), (0.34, 0.05, 0.12), "powerpc_label") + mesh.add_box((-0.42, -0.39, 0.20), (0.23, 0.20, 0.16), "powerpc_case") + mesh.add_box((0.42, -0.39, 0.20), (0.23, 0.20, 0.16), "powerpc_case") + mesh.add_box((-0.56, 0.0, 1.45), (0.07, 0.48, 2.46), "powerpc_dark") + mesh.add_box((0.56, 0.0, 1.45), (0.07, 0.48, 2.46), "powerpc_dark") + mesh.add_box((0.0, 0.31, 1.68), (0.72, 0.07, 1.50), "powerpc_dark") + mesh.add_box((-0.26, 0.36, 1.98), (0.14, 0.05, 0.12), "powerpc_glow") + mesh.add_box((0.00, 0.36, 1.98), (0.14, 0.05, 0.12), "powerpc_glow") + mesh.add_box((0.26, 0.36, 1.98), (0.14, 0.05, 0.12), "powerpc_glow") + mesh.add_box((0.0, 0.0, 2.92), (0.66, 0.42, 0.16), "powerpc_case") + mesh.add_box((0.0, -0.02, 3.04), (0.36, 0.20, 0.08), "powerpc_dark") + return mesh + + +def write_mtl() -> None: + lines = ["# Material table for rustchain_vintage_powerpc_tower"] + for name, material in MATERIALS.items(): + kd = material["kd"] + lines.extend( + [ + f"newmtl {name}", + "Ka 0.000 0.000 0.000", + "Kd {:.3f} {:.3f} {:.3f}".format(*kd), + "Ks 0.050 0.050 0.050", + "Ns 16.0", + f"map_Kd {material['texture']}", + "", + ] + ) + MTL_FILE.write_text("\n".join(lines), encoding="ascii") + + +def write_skin() -> None: + lines = [ + f"{name},models/props/{PROP_NAME}/{material['texture']}" + for name, material in MATERIALS.items() + ] + SKIN_FILE.write_text("\n".join(lines) + "\n", encoding="ascii") + + +def write_preview() -> None: + image = Image.new("RGB", (1280, 720), (20, 24, 27)) + draw = ImageDraw.Draw(image) + draw.rectangle((80, 80, 520, 660), fill=(47, 51, 52), outline=(86, 96, 99), width=4) + draw.rectangle((185, 100, 415, 640), fill=MATERIALS["powerpc_case"]["color"], outline=(128, 117, 88), width=6) + draw.rectangle((225, 146, 375, 188), fill=MATERIALS["powerpc_dark"]["color"]) + draw.rectangle((235, 220, 365, 250), fill=MATERIALS["powerpc_dark"]["color"]) + for x in (232, 275, 318): + draw.rectangle((x, 305, x + 22, 488), fill=MATERIALS["powerpc_dark"]["color"]) + draw.rectangle((335, 360, 392, 420), fill=MATERIALS["powerpc_glow"]["color"]) + draw.text((341, 374), "RTC", fill=(5, 35, 38), font=font(16)) + stripe_y = 530 + for idx, color in enumerate([(220, 67, 57), (239, 167, 45), (86, 184, 96), (58, 137, 220)]): + draw.rectangle((230 + idx * 36, stripe_y, 258 + idx * 36, stripe_y + 24), fill=color) + draw.text((620, 112), "RustChain Vintage", fill=(238, 238, 230), font=font(39)) + draw.text((620, 158), "PowerPC Tower", fill=(238, 238, 230), font=font(39)) + draw.text((622, 218), "Original low-poly static IQM prop", fill=(168, 180, 180), font=font(25)) + draw.text((622, 258), "Bounty #14015 - vintage / retro tower slot", fill=(168, 180, 180), font=font(25)) + draw.text((622, 300), "Features", fill=(238, 238, 230), font=font(30)) + for i, line in enumerate( + [ + "Stacked optical and floppy bays", + "Vertical front cooling vents", + "Cyan RTC activity window", + "Side badge color stripes", + "Rear port hints and chunky feet", + ] + ): + draw.text((650, 352 + i * 38), "- " + line, fill=(204, 210, 204), font=font(23)) + for i, (name, material) in enumerate(MATERIALS.items()): + x = 630 + i * 140 + draw.rectangle((x, 580, x + 86, 640), fill=material["color"]) + draw.text((x, 650), name.replace("powerpc_", ""), fill=(190, 198, 196), font=font(18)) + image.save(PREVIEW_FILE) + + +def main() -> None: + OUT.mkdir(parents=True, exist_ok=True) + TEXTURES.mkdir(parents=True, exist_ok=True) + write_textures() + mesh = build_mesh() + mesh.write_obj(OBJ_FILE) + write_mtl() + write_skin() + write_preview() + (OUT / "README.md").write_text(README_TEXT, encoding="utf-8") + (OUT / "LICENSE").write_text(LICENSE_TEXT, encoding="utf-8") + print(f"Wrote prop source package to {OUT}") + print(f"Convert OBJ to IQM separately: {IQM_FILE}") + + +if __name__ == "__main__": + main()