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()
							 |