OverviewFilesCommitsIssuesDocsReleasesPeers

blender-bridge commits / 2621a62

Fix flipped faces on geometry nodes instances (v0.12.2)
Reverse face winding in _realize_instances() by swapping vertices[1] and vertices[2] per triangle. loop_triangles.vertices internal order, when fed to from_pydata() as a standalone mesh, produces inward-facing normals. The swap ensures outward-facing normals that display correctly after the Blender→Godot coordinate conversion pipeline. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2621a62b72d4644134d41c83d696d3517c796b47
by plankatron <fleeky@gmail.com> · 2026-03-03T19:51:15.000Z

Changed files (5) +8 -4

blender_addon/__init__.py +1 -1
……@@ -11,7 +11,7 @@ Usage:
1111
1212import bpy
1313
14ADDON_VERSION = "0.12.1"
14ADDON_VERSION = "0.12.2"
1515
1616# Support hot-reload (F3 > Reload Scripts)
1717if "shm_protocol" in locals():
blender_addon/blender_manifest.toml +1 -1
……@@ -2,7 +2,7 @@ schema_version = "1.0.0"
22id = "blender_godot_bridge"
33name = "Blender-Godot Bridge"
44tagline = "Real-time bidirectional scene sync with Godot"
5version = "0.12.1"
5version = "0.12.2"
66blender_version_min = "4.2.0"
77type = "add-on"
88maintainer = "blender-bridge <noreply@localhost>"
blender_addon/change_detector.py +5 -1
……@@ -267,10 +267,14 @@ class ChangeDetector:
267267 all_verts.append((pos.x, pos.y, pos.z))
268268
269269 for tri in inst_mesh.loop_triangles:
270 # Reverse winding (swap vertices 1↔2) so from_pydata()
271 # produces outward-facing normals. loop_triangles.vertices
272 # uses the internal loop order which, when fed to from_pydata
273 # as a new standalone mesh, creates inward-facing faces.
270274 all_faces.append((
271275 tri.vertices[0] + vert_offset,
272 tri.vertices[1] + vert_offset,
273276 tri.vertices[2] + vert_offset,
277 tri.vertices[1] + vert_offset,
274278 ))
275279
276280 vert_offset += len(inst_mesh.vertices)
blender_bridge_addon.zip +0 -0
(no content changes — binary or rename)
src/blender_bridge.cpp +1 -1
……@@ -163,7 +163,7 @@ Error BlenderBridge::start_server(const String &socket_path) {
163163 _known_instance_ids.clear();
164164 _next_object_id = 1;
165165
166 UtilityFunctions::print("BlenderBridge v0.12.1: Server started (shm=", _shm_name, ", sock=", socket_path, ", regions=2x", (int)_region_size, ")");
166 UtilityFunctions::print("BlenderBridge v0.12.2: Server started (shm=", _shm_name, ", sock=", socket_path, ", regions=2x", (int)_region_size, ")");
167167 return OK;
168168}
169169