factorio-quality-glassware/render.py
Hornwitser 8d9a16b307 Quality Glassware
A set of flask graphics assets for mods to use in Factorio.
2024-10-23 23:28:56 +02:00

119 lines
3.3 KiB
Python

import bpy
import os
base_path = "src/graphics/technology"
base_collection = bpy.data.scenes["Scene"].view_layers["Base"].layer_collection
shadows_collection = bpy.data.scenes["Scene"].view_layers["Shadows"].layer_collection
def set_exclude(model, value):
base_collection.children[model].exclude = value
shadows_collection.children[model].exclude = value
def set_color(model, variant, values):
for obj in base_collection.children[model].collection.all_objects.values():
if obj.data.name == "Floor":
obj.hide_render = False
if "liquid_color" not in obj:
continue
obj["liquid_color"][0] = values[0]
obj["liquid_color"][1] = values[1]
obj["liquid_color"][2] = values[2]
obj.update_tag()
glass = "glass_frozen" if variant == "frozen" else "glass_no_back_grime"
obj.material_slots[0].material = bpy.data.materials[glass]
obj.material_slots[1].material = bpy.data.materials[f"liquid_clear_surface"]
obj.material_slots[2].material = bpy.data.materials[f"liquid_clear_glass"]
def set_empty(model, variant):
for obj in base_collection.children[model].collection.all_objects.values():
if obj.data.name == "Floor":
obj.hide_render = True
if "liquid_color" not in obj:
continue
glass = "glass_frozen" if variant == "frozen" else "glass_no_back_grime"
obj.material_slots[0].material = bpy.data.materials[glass]
obj.material_slots[1].material = bpy.data.materials[f"transparent"]
obj.material_slots[2].material = bpy.data.materials[f"glass_inside"]
def render_bottle(color, variant, model, output):
set_exclude(model, False)
if color != "empty":
set_color(model, variant, colors[color])
else:
set_empty(model, variant)
bpy.data.scenes["Scene"].render.filepath = output
bpy.ops.render.render(write_still=True)
set_exclude(model, True)
models = [
"cone_normal",
"cone_slim",
"cone_inverted",
"cylinder",
"tube_one",
"tube_two",
"tube_three",
"sphere_normal",
"sphere_tiny",
"sphere_double",
"sphere_tubed",
"sphere_hemi",
"sphere_spiked",
"hourglass",
"torus",
"klein",
"pyramid",
"cube",
"triangle",
"triangle_alt",
"pentagon",
"hexagon",
]
colors = {
"red": [0.554, 0.044, 0.046],
"green": [0.075, 0.573, 0.075],
"black": [0.050, 0.050, 0.050],
"cyan": [0.066, 0.430, 0.592],
"purple": [0.233, 0.039, 0.372],
"yellow": [0.536, 0.402, 0.000],
"white": [0.515, 0.534, 0.555],
"orange": [0.644, 0.277, 0.012],
"pink": [0.557, 0.043, 0.433],
"blue": [0.038, 0.050, 0.606],
"lime": [0.523, 0.570, 0.000],
"empty": None,
}
# Code to render all types
bottles = []
for model in models:
bottles.append(["empty", "clear", model, f"//{base_path}/{model}_empty.png"])
variants = ["clear"]
if model == "cone_normal":
variants.append("frozen")
for variant in variants:
for color in colors:
if color == "empty":
continue
bottles.append([color, variant, model, f"//{base_path}/{model}_{variant}_{color}.png"])
# Code for prototyping speedup
#bpy.data.scenes["Scene"].cycles.samples = 1024
# Reset visibility of all bottles
for model in models:
set_exclude(model, True)
# Render the bottles
for color, variant, model, output in bottles:
# Code to only render files that don't exist
#if os.path.exists(bpy.path.abspath(output)): continue
print("Rendering", output)
render_bottle(color, variant, model, output)
print("Done!")