def __gather_cache_primitives(blender_mesh_name: str, vertex_groups: Optional[bpy.types.VertexGroups], modifiers: Optional[bpy.types.ObjectModifiers], export_settings) -> List[dict]: """ Gather parts that are identical for instances, i.e. excluding materials """ blender_mesh = bpy.data.meshes[blender_mesh_name] primitives = [] blender_primitives = gltf2_blender_extract.extract_primitives( None, blender_mesh, vertex_groups, modifiers, export_settings) for internal_primitive in blender_primitives: primitive = { "attributes": __gather_attributes(internal_primitive, blender_mesh, modifiers, export_settings), "indices": __gather_indices(internal_primitive, blender_mesh, modifiers, export_settings), "material": internal_primitive['material'], "targets": __gather_targets(internal_primitive, blender_mesh, modifiers, export_settings) } primitives.append(primitive) return primitives
def __gather_cache_primitives(blender_mesh: bpy.types.Mesh, uuid_for_skined_data, vertex_groups: Optional[bpy.types.VertexGroups], modifiers: Optional[bpy.types.ObjectModifiers], export_settings) -> List[dict]: """ Gather parts that are identical for instances, i.e. excluding materials """ primitives = [] blender_primitives = gltf2_blender_extract.extract_primitives( blender_mesh, uuid_for_skined_data, vertex_groups, modifiers, export_settings) for internal_primitive in blender_primitives: primitive = { "attributes": __gather_attributes(internal_primitive, blender_mesh, modifiers, export_settings), "indices": __gather_indices(internal_primitive, blender_mesh, modifiers, export_settings), "mode": internal_primitive.get('mode'), "material": internal_primitive.get('material'), "targets": __gather_targets(internal_primitive, blender_mesh, modifiers, export_settings) } primitives.append(primitive) return primitives
def gather_primitives(blender_object, export_settings): """ Extract the mesh primitives from a blender object :param blender_object: the mesh object :param export_settings: :return: a list of glTF2 primitives """ primitives = [] blender_mesh = blender_object.data blender_vertex_groups = blender_object.vertex_groups blender_primitives = gltf2_blender_extract.extract_primitives( None, blender_mesh, blender_vertex_groups, export_settings) for internal_primitive in blender_primitives: primitive = gltf2_io.MeshPrimitive( attributes=__gather_attributes(internal_primitive, export_settings), extensions=None, extras=None, indices=__gather_indices(internal_primitive, export_settings), material=__gather_materials(internal_primitive, export_settings), mode=None, targets=__gather_targets(internal_primitive, blender_object, export_settings)) primitives.append(primitive) return primitives
def gather_primitives(blender_mesh: bpy.types.Mesh, vertex_groups: Optional[bpy.types.VertexGroups], modifiers: Optional[bpy.types.ObjectModifiers], export_settings) -> List[gltf2_io.MeshPrimitive]: """ Extract the mesh primitives from a blender object :return: a list of glTF2 primitives """ primitives = [] blender_primitives = gltf2_blender_extract.extract_primitives( None, blender_mesh, vertex_groups, modifiers, export_settings) for internal_primitive in blender_primitives: primitive = gltf2_io.MeshPrimitive( attributes=__gather_attributes(internal_primitive, blender_mesh, modifiers, export_settings), extensions=None, extras=None, indices=__gather_indices(internal_primitive, blender_mesh, modifiers, export_settings), material=__gather_materials(internal_primitive, blender_mesh, modifiers, export_settings), mode=None, targets=__gather_targets(internal_primitive, blender_mesh, modifiers, export_settings)) primitives.append(primitive) return primitives
def gather_primitives( blender_mesh: bpy.types.Mesh, vertex_groups: Optional[bpy.types.VertexGroups], modifiers: Optional[bpy.types.ObjectModifiers], export_settings ) -> List[gltf2_io.MeshPrimitive]: """ Extract the mesh primitives from a blender object :return: a list of glTF2 primitives """ primitives = [] blender_primitives = gltf2_blender_extract.extract_primitives( None, blender_mesh, vertex_groups, modifiers, export_settings) for internal_primitive in blender_primitives: primitive = gltf2_io.MeshPrimitive( attributes=__gather_attributes(internal_primitive, blender_mesh, modifiers, export_settings), extensions=None, extras=None, indices=__gather_indices(internal_primitive, blender_mesh, modifiers, export_settings), material=__gather_materials(internal_primitive, blender_mesh, modifiers, export_settings), mode=None, targets=__gather_targets(internal_primitive, blender_mesh, modifiers, export_settings) ) primitives.append(primitive) return primitives
def gather_primitives(blender_mesh: bpy.types.Mesh, vertex_groups: Optional[bpy.types.VertexGroups], modifiers: Optional[bpy.types.ObjectModifiers], export_settings) -> List[gltf2_io.MeshPrimitive]: """ Extract the mesh primitives from a blender object :return: a list of glTF2 primitives """ primitives = [] blender_primitives = gltf2_blender_extract.extract_primitives( None, blender_mesh, vertex_groups, modifiers, export_settings) for internal_primitive in blender_primitives: if bpy.app.version < (2, 80, 0): def __gather_materials_279(blender_primitive, blender_mesh, modifiers, export_settings): if not blender_primitive['material']: # TODO: fix 'extract_primitives' so that the value of 'material' is None and not empty string return None mesh_double_sided = blender_mesh.show_double_sided material = bpy.data.materials[blender_primitive['material']] return gltf2_blender_gather_materials.gather_material( material, mesh_double_sided, export_settings) primitive = gltf2_io.MeshPrimitive( attributes=__gather_attributes(internal_primitive, blender_mesh, modifiers, export_settings), extensions=None, extras=None, indices=__gather_indices(internal_primitive, blender_mesh, modifiers, export_settings), material=__gather_materials_279(internal_primitive, blender_mesh, modifiers, export_settings), mode=None, targets=__gather_targets(internal_primitive, blender_mesh, modifiers, export_settings)) else: primitive = gltf2_io.MeshPrimitive( attributes=__gather_attributes(internal_primitive, blender_mesh, modifiers, export_settings), extensions=None, extras=None, indices=__gather_indices(internal_primitive, blender_mesh, modifiers, export_settings), material=__gather_materials(internal_primitive, modifiers, export_settings), mode=None, targets=__gather_targets(internal_primitive, blender_mesh, modifiers, export_settings)) primitives.append(primitive) return primitives
def __gather_cache_primitives(blender_mesh: bpy.types.Mesh, library: Optional[str], blender_object: Optional[bpy.types.Object], vertex_groups: Optional[bpy.types.VertexGroups], modifiers: Optional[bpy.types.ObjectModifiers], export_settings) -> List[dict]: """ Gather parts that are identical for instances, i.e. excluding materials """ primitives = [] blender_primitives = gltf2_blender_extract.extract_primitives( None, blender_mesh, library, blender_object, vertex_groups, modifiers, export_settings) is_skinned_mesh = any('BLEND' in x['VertexType'] for x in blender_primitives) for prim in blender_primitives: max_index = max(prim['indices']) assert (max_index + 1) == len(prim['attributes']['POSITION']) // 3 if not is_skinned_mesh: max_index = 0 for internal_primitive in blender_primitives: indices = internal_primitive['indices'] indices = [x + max_index for x in indices] internal_primitive['indices'] = indices max_index = max(indices) + 1 split_primitives = [] base_vertex_index = None if not is_skinned_mesh: for internal_primitive in blender_primitives: indices = internal_primitive['indices'] if base_vertex_index is not None: internal_primitive['BaseVertexIndex'] = base_vertex_index indices = [x - base_vertex_index for x in indices] internal_primitive['indices'] = indices max_index = max(indices) if max_index >= 65530: first_big_index = indices.index(65530) mod3 = first_big_index % 3 start = first_big_index - mod3 indices1 = internal_primitive['indices'][:start] new_primitive1 = { 'VertexType': internal_primitive['VertexType'], 'material': internal_primitive['material'], 'attributes': internal_primitive['attributes'], 'indices': indices1, 'BaseVertexIndex': base_vertex_index, } split_primitives.append(new_primitive1) indices2 = internal_primitive['indices'][start:] min_index2 = min(indices2) indices2 = [x - min_index2 for x in indices2] if base_vertex_index is not None: base_vertex_index += min_index2 else: base_vertex_index = min_index2 new_primitive2 = { 'VertexType': internal_primitive['VertexType'], 'material': internal_primitive['material'], 'attributes': {}, 'indices': indices2, 'BaseVertexIndex': base_vertex_index, } for attr in new_primitive1['attributes']: # Empty list, since its all gonna get combined later anyways new_primitive2['attributes'][attr] = [] # TODO Handle mesh primitive that needs to be split into more than parts assert max(indices2) < 65530 split_primitives.append(new_primitive2) else: split_primitives.append(internal_primitive) blender_primitives = split_primitives if not is_skinned_mesh: max_index = max([ max(x['indices']) + (x['BaseVertexIndex'] or 0) for x in blender_primitives ]) + 1 assert max_index == sum([ len(x['attributes']['POSITION']) // 3 for x in blender_primitives ]) else: for prim in blender_primitives: max_index = max(prim['indices']) assert (max_index + 1) == len(prim['attributes']['POSITION']) // 3 for internal_primitive in blender_primitives: asobo_vertex_type = internal_primitive['VertexType'] primitive = { "attributes": __gather_attributes(internal_primitive, blender_mesh, modifiers, export_settings, asobo_vertex_type), "indices": __gather_indices(internal_primitive, blender_mesh, modifiers, export_settings), "material": internal_primitive['material'], "targets": __gather_targets(internal_primitive, blender_mesh, modifiers, export_settings), "extras": { "ASOBO_primitive": {} } } primitive['extras']['ASOBO_primitive'][ 'BaseVertexIndex'] = internal_primitive['BaseVertexIndex'] primitive['extras']['ASOBO_primitive'][ 'PrimitiveCount'] = primitive['indices'].count // 3 primitive['extras']['ASOBO_primitive']['StartIndex'] = None primitive['extras']['ASOBO_primitive'][ 'VertexType'] = asobo_vertex_type primitive['extras']['ASOBO_primitive']['VertexVersion'] = 2 primitives.append(primitive) if not is_skinned_mesh: foo(primitives) max_index = max([ max(x['indices'].buffer_view) + (x['extras']['ASOBO_primitive']['BaseVertexIndex'] or 0) for x in primitives ]) assert (max_index + 1) == primitives[0]['attributes']['POSITION'].count else: for prim in primitives: max_index = max(prim['indices'].buffer_view) assert (max_index + 1) == prim['attributes']['POSITION'].count return primitives