build: baked lighting pass on kit_demo test map
- Restructured kit_demo.tscn from linear demo to enclosed 5.12x5.12 room with walls, floor tiles, pillar, beam, doorway, window - Added WorldEnvironment with ProceduralSky for ambient lighting - Added DirectionalLight3D (sun key light, 45° angle, shadows enabled) - Added OmniLight3D (warm interior fill light) - Added ReflectionProbe for interior specular reflections (box projection, room-sized extents) - Added LightmapGI with balanced quality settings (bounces=3, texel_scale=1.0, max_texture_size=2048, denoiser=true) - Added tool script (kit_demo.gd) that prints bake status in editor - Added bake_lighting.gd CLI bake script (requires GPU-enabled instance) - Updated project.godot with reflection atlas and shadow map quality settings Headless baking note: Godot's standard editor build requires a GPU/display for LightmapGI.bake(). Open the scene in the Godot editor and click 'Bake Lightmap' on the LightmapGI node to generate the baked lightmap data.
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate Godot 4 .tres material resource files for the modular art kit.
|
||||
Godot 4 text resource format:
|
||||
[ext_resource type="Texture2D" path="res://..." id="1"]
|
||||
[resource]
|
||||
property = value
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
MATERIALS_DIR = os.path.expanduser("/home/oplabs/tactical-shooter/client/assets/materials")
|
||||
TEX_BASE = "res://assets/textures"
|
||||
|
||||
|
||||
def make_tres(name, props):
|
||||
textures = props.get("textures", {})
|
||||
load_steps = 1 + len(textures)
|
||||
|
||||
lines = [
|
||||
f'[gd_resource type="StandardMaterial3D" load_steps={load_steps} format=3]',
|
||||
]
|
||||
|
||||
ext_id = 1
|
||||
ext_map = {}
|
||||
for slot, rel_path in textures.items():
|
||||
eid = str(ext_id)
|
||||
path = f"{TEX_BASE}/{name}/{rel_path}"
|
||||
lines.append(f'[ext_resource type="Texture2D" path="{path}" id="{eid}"]')
|
||||
ext_map[slot] = eid
|
||||
ext_id += 1
|
||||
|
||||
lines.append("")
|
||||
lines.append("[resource]")
|
||||
|
||||
# Albedo
|
||||
if "albedo" in ext_map:
|
||||
lines.append(f'albedo_texture = ExtResource("{ext_map["albedo"]}")')
|
||||
|
||||
# Normal map
|
||||
if "normal" in ext_map:
|
||||
lines.append("normal_enabled = true")
|
||||
lines.append(f'normal_texture = ExtResource("{ext_map["normal"]}")')
|
||||
if "normal_scale" in props:
|
||||
lines.append(f"normal_scale = {props['normal_scale']}")
|
||||
|
||||
# Roughness
|
||||
lines.append(f"roughness = {props.get('roughness', 0.5)}")
|
||||
if "roughness" in ext_map:
|
||||
lines.append(f'roughness_texture = ExtResource("{ext_map["roughness"]}")')
|
||||
|
||||
# Metallic
|
||||
lines.append(f"metallic = {props.get('metallic', 0.0)}")
|
||||
if "metallic" in ext_map:
|
||||
lines.append(f'metallic_texture = ExtResource("{ext_map["metallic"]}")')
|
||||
|
||||
# Texture filter (1 = linear)
|
||||
if "texture_filter" in props:
|
||||
lines.append(f"texture_filter = {props['texture_filter']}")
|
||||
|
||||
# UV tiling
|
||||
if "uv_scale" in props:
|
||||
s = props["uv_scale"]
|
||||
lines.append(f'uv1_scale = Vector3({s[0]}, {s[1]}, {s[2]})')
|
||||
|
||||
content = "\n".join(lines) + "\n"
|
||||
path = os.path.join(MATERIALS_DIR, f"{name}.tres")
|
||||
with open(path, "w") as f:
|
||||
f.write(content)
|
||||
print(f" Created {name}.tres ({len(textures)} textures, {load_steps} steps)")
|
||||
|
||||
|
||||
def generate():
|
||||
os.makedirs(MATERIALS_DIR, exist_ok=True)
|
||||
print("Generating material .tres files...")
|
||||
|
||||
# 1 - Wall concrete 01: primary wall, clean light concrete
|
||||
make_tres("wall_concrete_01", {
|
||||
"textures": {"albedo": "basecolor.png", "normal": "normal.png",
|
||||
"roughness": "roughness.png", "metallic": "metallic.png"},
|
||||
"roughness": 0.85, "metallic": 0.0, "normal_scale": 0.5,
|
||||
"texture_filter": 1,
|
||||
"uv_scale": (1.0, 1.0, 1.0),
|
||||
})
|
||||
|
||||
# 2 - Wall concrete 02: darker accent concrete
|
||||
make_tres("wall_concrete_02", {
|
||||
"textures": {"albedo": "basecolor.png", "normal": "normal.png",
|
||||
"roughness": "roughness.png", "metallic": "metallic.png"},
|
||||
"roughness": 0.75, "metallic": 0.0, "normal_scale": 0.4,
|
||||
"texture_filter": 1,
|
||||
"uv_scale": (1.0, 1.0, 1.0),
|
||||
})
|
||||
|
||||
# 3 - Floor tile 01: ceramic tile interior
|
||||
make_tres("floor_tile_01", {
|
||||
"textures": {"albedo": "basecolor.png", "normal": "normal.png",
|
||||
"roughness": "roughness.png", "metallic": "metallic.png"},
|
||||
"roughness": 0.6, "metallic": 0.0, "normal_scale": 1.0,
|
||||
"texture_filter": 1,
|
||||
"uv_scale": (2.0, 2.0, 1.0), # repeat to show tile grid
|
||||
})
|
||||
|
||||
# 4 - Floor concrete 01: industrial floor
|
||||
make_tres("floor_concrete_01", {
|
||||
"textures": {"albedo": "basecolor.png", "normal": "normal.png",
|
||||
"roughness": "roughness.png", "metallic": "metallic.png"},
|
||||
"roughness": 0.9, "metallic": 0.0, "normal_scale": 0.8,
|
||||
"texture_filter": 1,
|
||||
"uv_scale": (2.0, 2.0, 1.0),
|
||||
})
|
||||
|
||||
# 5 - Metal structural 01: structural beams
|
||||
make_tres("metal_structural_01", {
|
||||
"textures": {"albedo": "basecolor.png", "normal": "normal.png",
|
||||
"roughness": "roughness.png", "metallic": "metallic.png"},
|
||||
"roughness": 0.3, "metallic": 1.0, "normal_scale": 0.3,
|
||||
"texture_filter": 1,
|
||||
"uv_scale": (1.0, 1.0, 1.0),
|
||||
})
|
||||
|
||||
# 6 - Accent team blue: CT-side colored panels
|
||||
make_tres("accent_team_blue", {
|
||||
"textures": {"albedo": "basecolor.png", "normal": "normal.png",
|
||||
"roughness": "roughness.png", "metallic": "metallic.png"},
|
||||
"roughness": 0.35, "metallic": 0.5, "normal_scale": 0.3,
|
||||
"texture_filter": 1,
|
||||
"uv_scale": (1.0, 1.0, 1.0),
|
||||
})
|
||||
|
||||
# 7 - Accent team red: T-side colored panels
|
||||
make_tres("accent_team_red", {
|
||||
"textures": {"albedo": "basecolor.png", "normal": "normal.png",
|
||||
"roughness": "roughness.png", "metallic": "metallic.png"},
|
||||
"roughness": 0.35, "metallic": 0.5, "normal_scale": 0.3,
|
||||
"texture_filter": 1,
|
||||
"uv_scale": (1.0, 1.0, 1.0),
|
||||
})
|
||||
|
||||
print("\nDone — 7 material .tres files created.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate()
|
||||
Reference in New Issue
Block a user