Skip to content

Instantly share code, notes, and snippets.

@nasser
Last active July 16, 2019 11:23
Show Gist options
  • Select an option

  • Save nasser/2d391ef90c6f8287f8b7c6c43e218e4b to your computer and use it in GitHub Desktop.

Select an option

Save nasser/2d391ef90c6f8287f8b7c6c43e218e4b to your computer and use it in GitHub Desktop.
diff --git a/blender/exp/gltf2_blender_extract.py b/blender/exp/gltf2_blender_extract.py
index b5c09de..c65a9fc 100644
--- a/blender/exp/gltf2_blender_extract.py
+++ b/blender/exp/gltf2_blender_extract.py
@@ -32,6 +32,7 @@ from io_scene_gltf2.blender.exp import gltf2_blender_gather_skins
INDICES_ID = 'indices'
MATERIAL_ID = 'material'
ATTRIBUTES_ID = 'attributes'
+MODE_ID = 'mode'
COLOR_PREFIX = 'COLOR_'
MORPH_TANGENT_PREFIX = 'MORPH_TANGENT_'
@@ -383,6 +384,40 @@ def extract_primitive_pack(a, indices, use_tangents):
return result_primitive
+def extract_line_primitives(blender_mesh, vertices_in_polygons, export_settings):
+ range_indices = 65535
+ valid_edges = []
+ for blender_edge in blender_mesh.edges:
+ if blender_edge.vertices[0] not in vertices_in_polygons or blender_edge.vertices[1] not in vertices_in_polygons:
+ # edge has at least one edge not in a polygon, add to primitive
+ valid_edges.append(blender_edge)
+
+ if len(valid_edges) == 0:
+ return []
+
+ else:
+ attributes = {
+ POSITION_ATTRIBUTE: [],
+ NORMAL_ATTRIBUTE: []
+ }
+
+ primitive = {
+ MODE_ID: 1, # LINES
+ INDICES_ID: [],
+ MATERIAL_ID: 0,
+ ATTRIBUTES_ID: attributes
+ }
+
+ for edge in valid_edges:
+ attributes[POSITION_ATTRIBUTE].extend([v for i in edge.vertices for v in convert_swizzle_location(blender_mesh.vertices[i].co, export_settings)])
+ attributes[NORMAL_ATTRIBUTE].extend([v for i in edge.vertices for v in blender_mesh.vertices[i].normal])
+ primitive[INDICES_ID].append(len(primitive[INDICES_ID]))
+ primitive[INDICES_ID].append(len(primitive[INDICES_ID]))
+
+ edge_primitives = [primitive]
+
+ return edge_primitives
+
def extract_primitives(glTF, blender_mesh, blender_vertex_groups, modifiers, export_settings):
"""
Extract primitives from a mesh. Polygons are triangulated and sorted by material.
@@ -1108,6 +1143,14 @@ def extract_primitives(glTF, blender_mesh, blender_vertex_groups, modifiers, exp
print_console('DEBUG', 'Adding primitive without splitting. Indices: ' + str(
len(primitive[INDICES_ID])) + ' Vertices: ' + str(
len(primitive[ATTRIBUTES_ID][POSITION_ATTRIBUTE]) // 3))
+ #
+ # Add edges and points not associated with a polygon
+ #
+
+ # compute this once, might get expensive for big meshes
+ vertices_in_polygons = frozenset([v for p in blender_mesh.polygons for v in p.vertices])
+ line_primitives = extract_line_primitives(blender_mesh, vertices_in_polygons, export_settings)
+ result_primitives.extend(line_primitives)
print_console('INFO', 'Primitives created: ' + str(len(result_primitives)))
diff --git a/blender/exp/gltf2_blender_gather_primitives.py b/blender/exp/gltf2_blender_gather_primitives.py
index 2c4ee91..e1b4d8c 100644
--- a/blender/exp/gltf2_blender_gather_primitives.py
+++ b/blender/exp/gltf2_blender_gather_primitives.py
@@ -69,7 +69,7 @@ def gather_primitives(
extras=None,
indices=internal_primitive['indices'],
material=material,
- mode=None,
+ mode=internal_primitive.get('mode', None),
targets=internal_primitive['targets']
)
primitives.append(primitive)
@@ -96,6 +96,7 @@ def __gather_cache_primitives(
"attributes": __gather_attributes(internal_primitive, blender_mesh, modifiers, export_settings),
"indices": __gather_indices(internal_primitive, blender_mesh, modifiers, export_settings),
"material": internal_primitive['material'],
+ "mode": internal_primitive.get('mode', None),
"targets": __gather_targets(internal_primitive, blender_mesh, modifiers, export_settings)
}
primitives.append(primitive)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment