Use lightweight natural tree rendering

This commit is contained in:
2026-07-27 12:36:55 +08:00
parent cf69c99d20
commit 59a22ea697
9 changed files with 161 additions and 196640 deletions

View File

@@ -19,6 +19,9 @@ import numpy as np
EXPORT_TINTS = {
"Grass": ((0.12, 0.48, 0.08), 0.72),
"Tree Crown Dark": ((0.06, 0.22, 0.05), 0.18),
"Tree Crown Light": ((0.16, 0.42, 0.09), 0.16),
"Scrub Ground Cover": ((0.08, 0.28, 0.07), 0.28),
"Office White Plaster Facade": ((0.92, 0.94, 0.92), 0.38),
"Office White Metal Facade": ((0.92, 0.94, 0.92), 0.68),
"Office Light Flat Roof": ((0.82, 0.86, 0.88), 0.35),
@@ -33,12 +36,18 @@ EXPORT_METALLIC_OVERRIDES = {
}
EXPORT_BASE_COLOR_OVERRIDES = {
"Tree Crown": (0.11, 0.34, 0.075),
"Tree Crown Dark": (0.065, 0.24, 0.055),
"Tree Crown Light": (0.14, 0.40, 0.085),
"Office White Plaster Facade": (0.93, 0.94, 0.91),
"Office White Metal Facade": (0.93, 0.94, 0.91),
"Office Light Flat Roof": (0.88, 0.90, 0.88),
}
EXPORT_EMISSION_OVERRIDES = {
"Tree Crown": ((0.04, 0.11, 0.035), 0.02),
"Tree Crown Dark": ((0.025, 0.07, 0.02), 0.015),
"Tree Crown Light": ((0.045, 0.12, 0.03), 0.015),
"Office White Plaster Facade": ((0.93, 0.94, 0.91), 0.18),
"Office White Metal Facade": ((0.93, 0.94, 0.91), 0.18),
"Office Light Flat Roof": ((0.88, 0.90, 0.88), 0.14),
@@ -85,10 +94,17 @@ def source_color(material):
return color
def source_principled_value(material, input_name, fallback):
def principled_bsdf(material):
if not material.use_nodes:
return fallback
node = material.node_tree.nodes.get("Principled BSDF")
return None
for node in material.node_tree.nodes:
if node.type == "BSDF_PRINCIPLED":
return node
return None
def source_principled_value(material, input_name, fallback):
node = principled_bsdf(material)
if not node or input_name not in node.inputs:
return fallback
return node.inputs[input_name].default_value
@@ -144,8 +160,8 @@ def tree_crown_image():
np.sin((x * 89.0 + y * 67.0) * np.pi) * 0.07
)
noise = np.clip(0.5 + noise, 0.0, 1.0)[..., None]
dark = np.asarray((0.035, 0.16, 0.045), dtype=np.float32)
light = np.asarray((0.12, 0.42, 0.13), dtype=np.float32)
dark = np.asarray((0.04, 0.17, 0.04), dtype=np.float32)
light = np.asarray((0.17, 0.46, 0.115), dtype=np.float32)
rgb = dark + (light - dark) * noise
rgba = np.concatenate(
(rgb, np.ones((size, size, 1), dtype=np.float32)), axis=2)
@@ -353,4 +369,4 @@ def export(args):
if __name__ == "__main__":
export(cli_args())
export(cli_args())