Last active
January 25, 2026 20:08
-
-
Save TurtleP/4f6800119a68be1952c927a426f03563 to your computer and use it in GitHub Desktop.
Blender LÖVE2D 3D Mesh Exporter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import struct | |
| import bpy | |
| from bpy_extras.io_utils import ExportHelper | |
| bl_info = { | |
| "name": "LÖVE Mesh Binary Exporter", | |
| "author": "TurtleP", | |
| "version": (1, 0), | |
| "blender": (3, 0, 0), | |
| "location": "File > Export", | |
| "description": "Export a mesh as a flat binary for a LÖVE Mesh", | |
| "category": "Import-Export", | |
| } | |
| class ExportLoveMesh(bpy.types.Operator, ExportHelper): | |
| bl_idname = "export_mesh.love_mesh" | |
| bl_label = "Export MSH" | |
| filename_ext = ".msh" | |
| def get_uvs(self, layer, index): | |
| if layer is not None: | |
| return layer.data[index].uv | |
| return [0.0, 0.0] | |
| def get_color(self, layer, index): | |
| if layer is not None: | |
| return layer.data[index].color | |
| return [1.0, 1.0, 1.0, 1.0] | |
| def execute(self, context): | |
| obj = bpy.context.active_object | |
| if not obj or obj.type != "MESH": | |
| raise RuntimeError("Select a mesh object") | |
| mesh = obj.to_mesh() | |
| mesh.calc_loop_triangles() | |
| out = bytearray() | |
| VERTEX_FMT = "<fffffffff" # xyz uv rgba | |
| uv_layer = mesh.uv_layers.active | |
| color_layer = mesh.vertex_colors.active | |
| for tri in mesh.loop_triangles: | |
| for loop_index in tri.loops: | |
| loop = mesh.loops[loop_index] | |
| vert = mesh.vertices[loop.vertex_index] | |
| pos = vert.co | |
| uv = self.get_uvs(uv_layer, loop_index) | |
| color = self.get_color(color_layer, loop_index) | |
| out += struct.pack(VERTEX_FMT, pos.x, pos.y, pos.z, *uv, *color) | |
| with open(self.filepath, "wb") as f: | |
| f.write(out) | |
| self.report({"INFO"}, f"Exported {len(out)} bytes") | |
| return {"FINISHED"} | |
| def menu_func_export(self, context): | |
| self.layout.operator(ExportLoveMesh.bl_idname, text="MSH") | |
| def register(): | |
| bpy.utils.register_class(ExportLoveMesh) | |
| bpy.types.TOPBAR_MT_file_export.append(menu_func_export) | |
| def unregister(): | |
| bpy.types.TOPBAR_MT_file_export.remove(menu_func_export) | |
| bpy.utils.unregister_class(ExportLoveMesh) | |
| if __name__ == "__main__": | |
| register() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment