blender: emit polygon normals

This commit is contained in:
Zack Buhman 2025-05-09 01:17:24 -05:00
parent f64eb29558
commit 70b3c72c6f
2 changed files with 10830 additions and 9 deletions

View File

@ -3,18 +3,27 @@ import bpy
def render_vec3(v):
return f"{{{v.x}, {v.y}, {v.z}}}"
def render_vec2(v):
return f"{{{v.x}, {v.y}}}"
def render_mesh_vertices(f, name, vertices):
f.write(f"const vec3 {name}_position[] = {{\n")
for vertex in vertices:
f.write(f" {render_vec3(vertex.co)},\n")
f.write("};\n\n")
def render_mesh_normals(f, name, vertices):
def render_vertex_normals(f, name, vertices):
f.write(f"const vec3 {name}_normal[] = {{\n")
for vertex in vertices:
f.write(f" {render_vec3(vertex.normal)},\n")
f.write("};\n\n")
def render_polygon_normals(f, name, polygon_normals):
f.write(f"const vec3 {name}_polygon_normal[] = {{\n")
for normal in polygon_normals:
f.write(f" {render_vec3(normal.vector)},\n")
f.write("};\n\n")
def render_polygons(f, name, polygons):
f.write(f"const polygon {name}_polygons[] = {{\n")
for i, polygon in enumerate(polygons):
@ -24,6 +33,14 @@ def render_polygons(f, name, polygons):
f.write(f" {c}{{{s}}},\n")
f.write("};\n\n")
def render_uv_map(f, name, name2, uvm):
f.write(f"const vec2 {name}_{name2}_uvmap[] = {{\n")
print(uvm)
for uv in uvm:
s = render_vec2(uv.vector)
f.write(f" {s},\n")
f.write("};\n\n")
def render_location(f, location):
s = render_vec3(location)
f.write(f" .location = {s},\n")
@ -36,15 +53,22 @@ def render_rotation_axis_angle(f, r):
r = f"{{{r[0]}, {r[1]}, {r[2]}, {r[3]}}}"
f.write(f" .rotation = {r},\n")
def render_mesh(f, name):
def render_mesh(f, name, mesh):
f.write(f"const vec2 * {name}_uv_layers[] = {{\n")
for layer_name in mesh.uv_layers.keys():
f.write(f" {name}_{layer_name}_uvmap,\n");
f.write( "};\n\n")
f.write(f"const mesh {name} = {{\n")
f.write(f" .position = {name}_position,\n")
f.write(f" .position_length = (sizeof ({name}_position)) / (sizeof ({name}_position[0])),\n")
f.write(f" .normal = {name}_normal,\n")
f.write(f" .normal_length = (sizeof ({name}_normal)) / (sizeof ({name}_normal[0])),\n")
f.write(f" .polygon_normal = {name}_polyon_normal,\n")
f.write(f" .polygon_normal_length = (sizeof ({name}_polygon_normal)) / (sizeof ({name}_polygon_normal[0])),\n")
f.write(f" .polygons = {name}_polygons,\n")
f.write(f" .polygons_length = (sizeof ({name}_polygons)) / (sizeof ({name}_polygons[0])),\n")
f.write("};\n\n")
f.write(f" .uv_layers = {name}_uv_layers,\n")
f.write(f" .uv_layers_length = (sizeof ({name}_uv_layers)) / (sizeof ({name}_uv_layers[0])),\n")
f.write( "};\n\n")
def translate_name(name):
return name.replace(".", "_").replace("-", "_")
@ -70,10 +94,14 @@ def export_scene(f):
mesh_name = "mesh_" + translate_name(mesh.name)
render_mesh_vertices(f, mesh_name, mesh.vertices)
render_mesh_normals(f, mesh_name, mesh.vertices)
for layer_name, layer in mesh.uv_layers.items():
render_uv_map(f, mesh_name, layer_name, layer.uv)
#render_vertex_normals(f, mesh_name, mesh.vertices)
render_polygon_normals(f, mesh_name, mesh.polygon_normals)
render_polygons(f, mesh_name, mesh.polygons)
render_mesh(f, mesh_name);
render_mesh(f, mesh_name, mesh);
#mesh.polygons[0].vertices
# [0, 1, 3, 2]
@ -92,17 +120,21 @@ def export_scene(f):
obj_name = "object_" + translate_name(object.name)
f.write(f"{{ // {obj_name}\n")
f.write(f" {{ // {obj_name}\n")
obj_mesh_name = "mesh_" + translate_name(object.to_mesh().name)
f.write(" ")
f.write(f" .mesh = &{obj_mesh_name},\n")
f.write(" ")
render_scale(f, object.scale)
f.write(" ")
render_rotation_axis_angle(f, object.rotation_axis_angle)
f.write(" ")
render_location(f, object.location)
f.write("},\n")
f.write(" },\n")
f.write("};\n\n")
with open("output.h", "w") as f:

10789
model/cube_subdivided.h Normal file

File diff suppressed because it is too large Load Diff