Skip to content

Instantly share code, notes, and snippets.

@TurtleP
Last active January 25, 2026 20:08
Show Gist options
  • Select an option

  • Save TurtleP/4f6800119a68be1952c927a426f03563 to your computer and use it in GitHub Desktop.

Select an option

Save TurtleP/4f6800119a68be1952c927a426f03563 to your computer and use it in GitHub Desktop.
Blender LÖVE2D 3D Mesh Exporter
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