Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 7
0
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