79 lines
2.1 KiB
Python
79 lines
2.1 KiB
Python
"""
|
|
This script generates the skydome geometry data as stored in
|
|
iron/Sources/iron/data/ConstData.hx.
|
|
|
|
USAGE:
|
|
On MacOS/Linux:
|
|
Open Blender from the terminal to see the console output.
|
|
On Windows:
|
|
Open the Blender console via "Window > Toggle System Console".
|
|
|
|
Select the skydome object in object mode and run this script. Note
|
|
that the script flips the normals in the output. The original mesh
|
|
is not modified.
|
|
|
|
After running the script, open the console. If the script ran
|
|
successfully, the generated vertex data was printed to the console,
|
|
ready to copy to ConstData.hx.
|
|
"""
|
|
import bmesh
|
|
import bpy
|
|
|
|
|
|
def list_representation(lst) -> str:
|
|
"""List to string without spaces."""
|
|
return f"[{','.join(str(i) for i in lst)}]"
|
|
|
|
|
|
def run():
|
|
obj = bpy.context.object
|
|
|
|
if obj is None:
|
|
print("No object selected, aborting!")
|
|
return
|
|
|
|
if obj.type != "MESH":
|
|
print(f"Selected object '{obj.name}' is not a mesh, aborting!")
|
|
return
|
|
|
|
bm = bmesh.new()
|
|
bm.from_mesh(obj.data)
|
|
bmesh.ops.triangulate(bm, faces=bm.faces[:], quad_method="FIXED")
|
|
|
|
indices = []
|
|
positions = []
|
|
normals = []
|
|
|
|
# Fill index buffer
|
|
for face in bm.faces:
|
|
# Turn the normals inside for correct winding order of indices
|
|
face.normal_flip()
|
|
|
|
for vert in face.verts:
|
|
indices.append(vert.index)
|
|
|
|
# Vertex buffer data
|
|
for vert in bm.verts:
|
|
positions.extend(vert.co)
|
|
# Blender world normals have mirrored coords compared to spheres
|
|
nor = vert.normal
|
|
nor.negate()
|
|
normals.extend(nor)
|
|
|
|
pos_rounded = [round(elem, 5) for elem in positions]
|
|
nor_rounded = [round(elem, 5) for elem in normals]
|
|
|
|
bm.free()
|
|
|
|
print("\n====================")
|
|
print(f"Calculated mesh data for object '{obj.name}':")
|
|
print(f"Indices: {list_representation(indices)}")
|
|
print("")
|
|
print(f"Positions: {list_representation(pos_rounded)}")
|
|
print("")
|
|
print(f"Normals: {list_representation(nor_rounded)}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
run()
|