Add Hebat Allah wreck to the sunlit shallows site
Quality Gate / Quality Gate (pull_request) Successful in 6m49s
Quality Gate / Quality Gate (pull_request) Successful in 6m49s
First wreck in the production world layer. A WreckActor (StaticBody3D) instantiates a two-LOD glTF visual, builds a trimesh collision from a separate lighter glTF, and carries the sonar metadata (metal, 0.9 reflectivity) so the bathymetry rays echo it. The sunlit shallows site places the MV Hebat Allah 62 m ahead of the submarine on the floor. The assets derive from a CC BY 4.0 photogrammetry scan by Holger Buss (Sketchfab). The raw 274 MB scan stays outside the repo; the committed GLBs come from a reproducible Blender pipeline under scripts/assets/: skirt cut, 44 m rescale, merge by distance (the scan is a triangle soup), fragment removal, 0.4 m voxel remesh, decimation to 58k/14.5k/2.9k triangles, smart UVs and a 2K albedo rebaked from a luminance-rebuilt texture (the scan's red channel is dead). docs/ASSET_LICENSES.md starts the licence registry required by the design plan and records the attribution owed in the credits. The site suite gains twelve assertions covering sonar metadata, collision, LOD handover and triangle budgets. Godot extracts the embedded albedo next to the glb on import; those PNGs are ignored like the cockpit ones. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
f0072a3e11
commit
50b5aac069
10 files changed
+512
-1
No files matched your search
@@ -0,0 +1,42 @@
|
||||
"""Rebuild a neutral 2K albedo from the raw MV Hebat Allah scan texture.
|
||||
|
||||
The underwater scan has a dead red channel (mean 17/255) and a strong blue
|
||||
cast, so a white balance only produces magenta noise. This script keeps the
|
||||
luminance of the two live channels, stretches it, and tints it with a rust /
|
||||
algae palette driven by the green-to-blue ratio. The game's fog adds the water
|
||||
colour at runtime.
|
||||
|
||||
python scripts/assets/hebat_allah_prepare_albedo.py <albedo_8k.png> <out_dir>
|
||||
|
||||
Writes albedo_2k_balanced.png and albedo_1k_balanced.png into <out_dir>.
|
||||
Requires Pillow and numpy. Licence: see docs/ASSET_LICENSES.md.
|
||||
"""
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
from PIL import Image
|
||||
|
||||
|
||||
def balance(source: Path, out_dir: Path) -> None:
|
||||
image = Image.open(source).convert("RGB").resize((2048, 2048), Image.LANCZOS)
|
||||
rgb = np.asarray(image).astype(np.float32) / 255.0
|
||||
luminance = 0.55 * rgb[..., 1] + 0.45 * rgb[..., 2]
|
||||
low, high = np.percentile(luminance, 1), np.percentile(luminance, 99)
|
||||
luminance = np.clip((luminance - low) / (high - low), 0.0, 1.0)
|
||||
luminance = luminance ** 0.9 * 0.75 + 0.08
|
||||
algae_ratio = np.clip((rgb[..., 1] - rgb[..., 2] * 0.68) * 3.0, 0.0, 1.0)
|
||||
rust = np.array([0.62, 0.52, 0.44])
|
||||
algae = np.array([0.50, 0.58, 0.46])
|
||||
tint = rust[None, None, :] * (1.0 - algae_ratio[..., None]) + algae[None, None, :] * algae_ratio[..., None]
|
||||
out = np.clip(luminance[..., None] * tint / 0.55, 0.0, 1.0)
|
||||
result = Image.fromarray((out * 255).astype(np.uint8))
|
||||
out_dir.mkdir(parents=True, exist_ok=True)
|
||||
result.save(out_dir / "albedo_2k_balanced.png")
|
||||
result.resize((1024, 1024), Image.LANCZOS).save(out_dir / "albedo_1k_balanced.png")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 3:
|
||||
sys.exit(__doc__)
|
||||
balance(Path(sys.argv[1]), Path(sys.argv[2]))
|
||||
Reference in new issue
Block a user