Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import bpy
- import bmesh
- import mathutils
- class TE_Vertex:
- pos = mathutils.Vector()
- normal = mathutils.Vector()
- uv = mathutils.Vector((0, 0))
- class TE_Mesh:
- vertices = []
- indices = []
- def prepare_mesh(mesh):
- bm = bmesh.new()
- bm.from_mesh(mesh)
- bmesh.ops.triangulate(bm, faces=bm.faces[:])
- export_mesh = TE_Mesh()
- export_mesh.vertices = [TE_Vertex() for _ in range(len(bm.verts))]
- export_mesh.indices = [-1 for _ in range(len(bm.faces) * 3)]
- uvl = bm.loops.layers.uv[0] if bm.loops.layers.uv else None
- for vert in bm.verts:
- export_vert = export_mesh.vertices[vert.index]
- export_vert.pos = vert.co
- export_vert.normal = vert.normal
- index = 0
- for face in bm.faces:
- vert0 = face.verts[0]
- vert1 = face.verts[1]
- vert2 = face.verts[2]
- export_mesh.indices[index] = vert0.index
- export_mesh.indices[index + 1] = vert1.index
- export_mesh.indices[index + 2] = vert2.index
- index += 3
- if not face.smooth:
- export_mesh.vertices[vert0.index].normal = face.normal
- export_mesh.vertices[vert1.index].normal = face.normal
- export_mesh.vertices[vert2.index].normal = face.normal
- if uvl:
- export_mesh.vertices[vert0.index].uv = mathutils.Vector(face.loops[0][uvl].uv)
- export_mesh.vertices[vert1.index].uv = mathutils.Vector(face.loops[1][uvl].uv)
- export_mesh.vertices[vert2.index].uv = mathutils.Vector(face.loops[2][uvl].uv)
- return export_mesh
- def export_mesh_to_cpp(mesh, filepath):
- with open(filepath, 'w', encoding='utf-8') as f:
- f.write("unique_ptr<StaticMesh> GeometryFactory::mesh()\n")
- f.write("{\n")
- f.write(" unique_ptr<StaticMesh> result = make_unique<StaticMesh>();\n")
- f.write("\n")
- f.write(" result->vertices = \n")
- f.write(" {\n")
- for v in mesh.vertices:
- f.write(str.format(' {{ {{ {0}, {1}, {2} }}, {{ {3}, {4}, {5} }}, {{ {6}, {7} }} }},\n',
- v.pos.x, v.pos.y, v.pos.z, v.normal.x, v.normal.y, v.normal.z, v.uv.x, v.uv.y));
- print(v.uv)
- f.write(" };\n")
- f.write("\n")
- f.write(" result->indices = \n")
- f.write(" {")
- cnt = 0
- for i in mesh.indices:
- if cnt % 3 == 0:
- f.write('\n ')
- f.write(str.format('{0}, ', i))
- cnt += 1
- f.write("\n")
- f.write(" };\n")
- f.write("\n")
- f.write(" return result;\n")
- f.write("}\n")
- def export_to_cpp(context, filepath):
- print("Exporting to C++...")
- with open(filepath, 'w', encoding='utf-8') as f:
- for obj in bpy.context.selected_objects:
- if obj.type != 'MESH':
- continue
- mesh = prepare_mesh(obj.data)
- export_mesh_to_cpp(mesh, filepath)
- print("Exporting to C++... done")
- return {'FINISHED'}
- # ExportHelper is a helper class, defines filename and
- # invoke() function which calls the file selector.
- from bpy_extras.io_utils import ExportHelper
- from bpy.props import StringProperty, BoolProperty, EnumProperty
- from bpy.types import Operator
- class TE_CppExporter(Operator, ExportHelper):
- """Export as C++ source"""
- bl_idname = "te.cpp_export" # important since its how bpy.ops.import_test.some_data is constructed
- bl_label = "TE Export To C++"
- # ExportHelper mixin class uses this
- filename_ext = ".txt"
- filter_glob: StringProperty(
- default="*.cpp",
- options={'HIDDEN'},
- maxlen=255, # Max internal buffer length, longer would be clamped.
- )
- def execute(self, context):
- return export_to_cpp(context, self.filepath)
- # Only needed if you want to add into a dynamic menu
- def menu_func_export(self, context):
- self.layout.operator(TE_CppExporter.bl_idname, text="TE C++ Export")
- def register():
- print("TE_CppExporter register")
- bpy.utils.register_class(TE_CppExporter)
- bpy.types.TOPBAR_MT_file_export.append(menu_func_export)
- def unregister():
- print("TE_CppExporter unregister")
- bpy.utils.unregister_class(TE_CppExporter)
- bpy.types.TOPBAR_MT_file_export.remove(menu_func_export)
- if __name__ == "__main__":
- register()
- # test call
- bpy.ops.te.cpp_export('INVOKE_DEFAULT')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement