Beispiel #1
0
    def resetStaticMeshMaterial(self, package_path):
        # def __init__(self, package_names=[], package_paths=[], object_paths=[], class_names=[], recursive_classes_exclusion_set=[], recursive_paths=False, recursive_classes=False, include_only_on_disk_assets=False):
        filter_staticmesh = unreal.ARFilter(
            [], [package_path], [],
            [unreal.StaticMesh.static_class().get_name()], [], True)
        filter_materialIns = unreal.ARFilter(
            [], [package_path], [],
            [unreal.MaterialInstanceConstant.static_class().get_name()], [],
            True)
        AssetRegistry = unreal.AssetRegistryHelpers().get_asset_registry()
        MaterialInsDataArr = AssetRegistry.get_assets(filter_materialIns)
        StaticMeshAssetDataArr = AssetRegistry.get_assets(filter_staticmesh)

        print('MaterialInsDataArr len is {}, StaticMeshAssetDataArr is {}'.
              format(len(MaterialInsDataArr), len(StaticMeshAssetDataArr)))

        for StaticMeshAssetData in StaticMeshAssetDataArr:
            # print StaticMeshAssetData
            StaticMeshStr = str(StaticMeshAssetData.package_name)
            # print StaticMeshStr
            StaticMeshAsset = unreal.StaticMesh.cast(
                unreal.load_asset(StaticMeshStr))
            if (StaticMeshAsset != None):
                for MaterialInsData in MaterialInsDataArr:
                    # print MaterialInsData.asset_name
                    materialIndex = StaticMeshAsset.get_material_index(
                        MaterialInsData.asset_name)
                    if (materialIndex != -1):
                        MaterialInsStr = str(MaterialInsData.package_name)
                        targetMaterial = unreal.MaterialInstance.cast(
                            unreal.load_asset(MaterialInsStr))
                        StaticMeshAsset.set_material(materialIndex,
                                                     targetMaterial)
                        print MaterialInsStr
Beispiel #2
0
    def get_material_template(self, material):
        print(material)

        template_material_inst = material.split('_')
        if len(template_material_inst
               ) < 2 or template_material_inst[-1] != 'Inst':
            return None, None
        material_inst = template_material_inst[
            -2] + '_' + template_material_inst[-1]

        package_path = '/Game/ZHAssets/MaterialTemplate/'
        filter_staticmesh = unreal.ARFilter(
            [], [package_path], [],
            [unreal.MaterialInstanceConstant.static_class().get_name()], [],
            True)

        AssetRegistry = unreal.AssetRegistryHelpers().get_asset_registry()
        MaterialInsDataArr = AssetRegistry.get_assets(filter_staticmesh)

        for material in MaterialInsDataArr:
            if str(material.package_name).split('/')[-1] == material_inst:

                return str(material.package_name), material_inst

        return None, None
Beispiel #3
0
    def resetSkeletonMeshMaterial(self, package_path):
        # def __init__(self, package_names=[], package_paths=[], object_paths=[], class_names=[], recursive_classes_exclusion_set=[], recursive_paths=False, recursive_classes=False, include_only_on_disk_assets=False):
        filter_skeletalMesh = unreal.ARFilter(
            [], [package_path], [],
            [unreal.SkeletalMesh.static_class().get_name()])
        filter_materialIns = unreal.ARFilter(
            [], [package_path], [],
            [unreal.MaterialInstanceConstant.static_class().get_name()])
        AssetRegistry = unreal.AssetRegistryHelpers().get_asset_registry()
        MaterialInsDataArr = AssetRegistry.get_assets(filter_materialIns)
        SkeletalMeshAssetDataArr = AssetRegistry.get_assets(
            filter_skeletalMesh)

        for SkeletalMeshAssetData in SkeletalMeshAssetDataArr:
            # print StaticMeshAssetData
            SkeletalMeshStr = str(SkeletalMeshAssetData.package_name)
            # print StaticMeshStr
            SkeletalMeshAsset = unreal.SkeletalMesh.cast(
                unreal.load_asset(SkeletalMeshStr))
            materials = SkeletalMeshAsset.materials
            if (SkeletalMeshAsset != None):
                for MaterialInsData in MaterialInsDataArr:
                    # print MaterialInsData.asset_name
                    materialIndex = SkeletalMeshAsset.get_material_index(
                        MaterialInsData.asset_name)
                    if (materialIndex != -1):
                        MaterialInsStr = str(MaterialInsData.package_name)
                        targetMaterial = unreal.MaterialInstance.cast(
                            unreal.load_asset(MaterialInsStr))
                        # SkeletalMeshAsset.set_material(materialIndex,targetMaterial)
                        for SkeletalMeshMaterialIndex in range(materials):
                            if (materials[SkeletalMeshMaterialIndex].
                                    imported_material_slot_name ==
                                    MaterialInsData.asset_name):
                                targetSkeltalMaterial = unreal.SkeletalMaterial(
                                    targetMaterial,
                                    materials[SkeletalMeshMaterialIndex].
                                    material_slot_name(),
                                    materials[SkeletalMeshMaterialIndex].
                                    uv_channel_data())
                                materials[
                                    SkeletalMeshMaterialIndex] = targetSkeltalMaterial
                        print MaterialInsStr
    def list_asset(self):
        reg = unreal.AssetRegistryHelpers.get_asset_registry()
        n_list = [c.__name__ for c in self.class_filter]
        ar_filter = unreal.ARFilter(class_names=n_list, recursive_classes=True)
        assets = reg.get_assets(ar_filter)
        assets_path = [str(a.object_path) for a in assets]

        self.USelector.clear()
        self.USelector.addItems(assets_path)
        self.USelector.addItem("None")
        return assets_path
Beispiel #5
0
    def queryMaterials(self):
        print("query materials")
        asset_reg = unreal.AssetRegistryHelpers.get_asset_registry()

        filter = unreal.ARFilter(class_names=["MaterialInstanceConstant"],
                                 recursive_paths=False,
                                 include_only_on_disk_assets=True,
                                 package_paths=[self.UEMaterialDirectory])

        assets = asset_reg.get_assets(filter)

        ret = "query materials: " + str(assets)
        print(ret)
        return ret
Beispiel #6
0
    def add_slots(self, asset_path):
        filter_skeletalmesh = unreal.ARFilter(
            [], [asset_path], [],
            [unreal.SkeletalMesh.static_class().get_name()], [], True)
        AssetRegistry = unreal.AssetRegistryHelpers().get_asset_registry()
        MaterialInsDataArr = AssetRegistry.get_assets(filter_skeletalmesh)

        print(len(MaterialInsDataArr))

        for material in MaterialInsDataArr:
            print('material.package_name is xxx{}'.format(
                str(material.get_full_name()).split(' ')[1]))

            unreal.PythonCallLibrary.create_socket(
                str(material.get_full_name()).split(' ')[1], self.Bone_list)
Beispiel #7
0
    def process(self, instance):
        # Define extract output file path
        stagingdir = self.staging_dir(instance)

        # Perform extraction
        self.log.info("Performing extraction..")

        # Check if the loaded level is the same of the instance
        current_level = ell.get_editor_world().get_path_name()
        assert current_level == instance.data.get("level"), \
            "Wrong level loaded"

        json_data = []

        for member in instance[:]:
            actor = ell.get_actor_reference(member)
            mesh = None

            # Check type the type of mesh
            if actor.get_class().get_name() == 'SkeletalMeshActor':
                mesh = actor.skeletal_mesh_component.skeletal_mesh
            elif actor.get_class().get_name() == 'StaticMeshActor':
                mesh = actor.static_mesh_component.static_mesh

            if mesh:
                # Search the reference to the Asset Container for the object
                path = unreal.Paths.get_path(mesh.get_path_name())
                filter = unreal.ARFilter(
                    class_names=["AssetContainer"], package_paths=[path])
                ar = unreal.AssetRegistryHelpers.get_asset_registry()
                try:
                    asset_container = ar.get_assets(filter)[0].get_asset()
                except IndexError:
                    self.log.error("AssetContainer not found.")
                    return

                parent = eal.get_metadata_tag(asset_container, "parent")
                family = eal.get_metadata_tag(asset_container, "family")

                self.log.info("Parent: {}".format(parent))
                blend = io.find_one(
                    {
                        "type": "representation",
                        "parent": io.ObjectId(parent),
                        "name": "blend"
                    },
                    projection={"_id": True})
                blend_id = blend["_id"]

                json_element = {}
                json_element["reference"] = str(blend_id)
                json_element["family"] = family
                json_element["instance_name"] = actor.get_name()
                json_element["asset_name"] = mesh.get_name()
                import_data = mesh.get_editor_property("asset_import_data")
                json_element["file_path"] = import_data.get_first_filename()
                transform = actor.get_actor_transform()

                json_element["transform"] = {
                    "translation": {
                        "x": transform.translation.x,
                        "y": transform.translation.y,
                        "z": transform.translation.z
                    },
                    "rotation": {
                        "x": math.radians(transform.rotation.euler().x),
                        "y": math.radians(transform.rotation.euler().y),
                        "z": math.radians(transform.rotation.euler().z),
                    },
                    "scale": {
                        "x": transform.scale3d.x,
                        "y": transform.scale3d.y,
                        "z": transform.scale3d.z
                    }
                }
                json_data.append(json_element)

        json_filename = "{}.json".format(instance.name)
        json_path = os.path.join(stagingdir, json_filename)

        with open(json_path, "w+") as file:
            json.dump(json_data, fp=file, indent=2)

        if "representations" not in instance.data:
            instance.data["representations"] = []

        json_representation = {
            'name': 'json',
            'ext': 'json',
            'files': json_filename,
            "stagingDir": stagingdir,
        }
        instance.data["representations"].append(json_representation)