|
@@ -41,22 +41,137 @@ bl_info = {
|
|
def load_scene():
|
|
def load_scene():
|
|
print("Loading Scene")
|
|
print("Loading Scene")
|
|
# load scene data
|
|
# load scene data
|
|
|
|
+ scene_data = load_scene_data()
|
|
# create parent collections
|
|
# create parent collections
|
|
create_parent_collections("01_Products")
|
|
create_parent_collections("01_Products")
|
|
create_parent_collections("02_Elements")
|
|
create_parent_collections("02_Elements")
|
|
create_parent_collections("03_Shapes")
|
|
create_parent_collections("03_Shapes")
|
|
# append products
|
|
# append products
|
|
-
|
|
|
|
|
|
+ products_data = load_objects_data(scene_data, "product")
|
|
|
|
+ for index, product in enumerate(products_data):
|
|
|
|
+ append_objects(product, index)
|
|
# append elements
|
|
# append elements
|
|
# append shapes
|
|
# append shapes
|
|
# set lighting
|
|
# set lighting
|
|
# set camera
|
|
# set camera
|
|
|
|
|
|
|
|
|
|
-def append_objects():
|
|
|
|
|
|
+def load_scene_data():
|
|
|
|
+ print("Loading Scene Data")
|
|
|
|
+ # load scene data
|
|
|
|
+
|
|
|
|
+ # to be replaced with actual data
|
|
|
|
+ # open scene_info.json
|
|
|
|
+ script_path = Path(__file__).resolve()
|
|
|
|
+ scene_data_path = script_path.parent / "sample_scene" / "scene_info.json"
|
|
|
|
+ with scene_data_path.open() as file:
|
|
|
|
+ scene_data = json.load(file)
|
|
|
|
+ print(scene_data)
|
|
|
|
+ return scene_data
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def load_objects_data(scene_data, object_type: str):
|
|
|
|
+ print("Loading Assets Data")
|
|
|
|
+ # load assets data
|
|
|
|
+ objects_data = []
|
|
|
|
+ for object in scene_data["scene"]["objects"]:
|
|
|
|
+ if object["group_type"] == object_type:
|
|
|
|
+ # get additional object data by id and combine with object data
|
|
|
|
+ object_data = get_object_data_by_id(object["id"])
|
|
|
|
+ object.update(object_data)
|
|
|
|
+ objects_data.append(object)
|
|
|
|
+ return objects_data
|
|
|
|
+
|
|
|
|
+ # to be replaced with actual data
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def get_object_data_by_id(object_id: str):
|
|
|
|
+ print("Getting Object Data")
|
|
|
|
+ # open assets_database.json
|
|
|
|
+ script_path = Path(__file__).resolve()
|
|
|
|
+ assets_data_path = script_path.parent / "sample_scene" / "assets_database.json"
|
|
|
|
+
|
|
|
|
+ with assets_data_path.open() as file:
|
|
|
|
+ assets_data = json.load(file)
|
|
|
|
+ # get object data by id
|
|
|
|
+ for object in assets_data:
|
|
|
|
+ if object["id"] == object_id:
|
|
|
|
+ return object
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def append_objects(productInfo, index):
|
|
print("Appending Objects")
|
|
print("Appending Objects")
|
|
- # append objects
|
|
|
|
- # set transforms
|
|
|
|
|
|
+
|
|
|
|
+ blendFileName = productInfo["name"]
|
|
|
|
+
|
|
|
|
+ # visibleLayersJSONName = productInfo["Version"]
|
|
|
|
+
|
|
|
|
+ # activeSwitchMaterials = json.dumps(productInfo["ActiveMaterials"])
|
|
|
|
+
|
|
|
|
+ collectionName = blendFileName + "_" + str(index)
|
|
|
|
+
|
|
|
|
+ append_active_layers(collectionName, productInfo)
|
|
|
|
+
|
|
|
|
+ # replace_switch_materials(shotInfo, productInfo["ActiveMaterials"])
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def append_active_layers(newCollectionName, product_info):
|
|
|
|
+ utility_collections = ["MaterialLibrary", "Animation_Controller", "Animation_Rig"]
|
|
|
|
+
|
|
|
|
+ # visible_layers = utility_collections + product_info["VisibleLayers"]
|
|
|
|
+ visible_layers = utility_collections
|
|
|
|
+
|
|
|
|
+ script_path = Path(__file__).resolve().parent
|
|
|
|
+ filePath = str(
|
|
|
|
+ script_path / product_info["path"] / (product_info["name"] + ".blend")
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ print(filePath)
|
|
|
|
+
|
|
|
|
+ # delete all objects and collections from product collection
|
|
|
|
+
|
|
|
|
+ create_parent_collections(newCollectionName)
|
|
|
|
+
|
|
|
|
+ # append active collections
|
|
|
|
+ with bpy.data.libraries.load(filePath) as (data_from, data_to):
|
|
|
|
+ data_to.collections = []
|
|
|
|
+ for name in data_from.collections:
|
|
|
|
+
|
|
|
|
+ if name in visible_layers:
|
|
|
|
+ data_to.collections.append(name)
|
|
|
|
+ if "NonConfigurable" in name:
|
|
|
|
+ data_to.collections.append(name)
|
|
|
|
+
|
|
|
|
+ # link appended colections to newCollection
|
|
|
|
+ for collection in data_to.collections:
|
|
|
|
+ try:
|
|
|
|
+ bpy.context.scene.collection.children.link(collection)
|
|
|
|
+ except:
|
|
|
|
+ print(collection)
|
|
|
|
+ link_collection_to_collection(newCollectionName, collection)
|
|
|
|
+
|
|
|
|
+ # hide utility collections
|
|
|
|
+ for utilityCollectionName in utility_collections:
|
|
|
|
+ if utilityCollectionName in collection.name:
|
|
|
|
+ # rename utility collections
|
|
|
|
+ collection.name = newCollectionName + "_" + utilityCollectionName
|
|
|
|
+ hide_collection(collection)
|
|
|
|
+
|
|
|
|
+ #
|
|
|
|
+ # make all objects in collection local
|
|
|
|
+ for obj in bpy.data.collections[newCollectionName].all_objects:
|
|
|
|
+ if obj.type == "MESH":
|
|
|
|
+ obj.make_local()
|
|
|
|
+ obj.data.make_local()
|
|
|
|
+
|
|
|
|
+ # remove duplicated material slots
|
|
|
|
+ mats = bpy.data.materials
|
|
|
|
+
|
|
|
|
+ for obj in bpy.data.collections[newCollectionName].all_objects:
|
|
|
|
+ for slot in obj.material_slots:
|
|
|
|
+ part = slot.name.rpartition(".")
|
|
|
|
+ if part[2].isnumeric() and part[0] in mats:
|
|
|
|
+ slot.material = mats.get(part[0])
|
|
|
|
|
|
|
|
|
|
def create_parent_collections(group_name: str):
|
|
def create_parent_collections(group_name: str):
|
|
@@ -68,6 +183,11 @@ def create_parent_collections(group_name: str):
|
|
create_collection(group_name)
|
|
create_collection(group_name)
|
|
|
|
|
|
|
|
|
|
|
|
+# -------------------------------------------------------------------
|
|
|
|
+# Utilities
|
|
|
|
+# -------------------------------------------------------------------
|
|
|
|
+
|
|
|
|
+
|
|
def remove_collection_and_objects(collection_name):
|
|
def remove_collection_and_objects(collection_name):
|
|
oldObjects = list(bpy.data.collections[collection_name].all_objects)
|
|
oldObjects = list(bpy.data.collections[collection_name].all_objects)
|
|
for obj in oldObjects:
|
|
for obj in oldObjects:
|
|
@@ -103,6 +223,25 @@ def get_subcollection_names(collection):
|
|
return subcollection_names
|
|
return subcollection_names
|
|
|
|
|
|
|
|
|
|
|
|
+# link collection to collection
|
|
|
|
+def link_collection_to_collection(parentCollectionName, childCollection):
|
|
|
|
+
|
|
|
|
+ if bpy.context.scene.collection.children:
|
|
|
|
+ parentCollection = bpy.context.scene.collection.children.get(
|
|
|
|
+ parentCollectionName
|
|
|
|
+ )
|
|
|
|
+ # Add it to the main collection
|
|
|
|
+
|
|
|
|
+ try:
|
|
|
|
+ childCollection = bpy.data.collections[childCollection]
|
|
|
|
+ except:
|
|
|
|
+ print("Collection not found.")
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ parentCollection.children.link(childCollection)
|
|
|
|
+ bpy.context.scene.collection.children.unlink(childCollection)
|
|
|
|
+
|
|
|
|
+
|
|
# function that checks if a collection exists
|
|
# function that checks if a collection exists
|
|
def collection_exists(collection_name):
|
|
def collection_exists(collection_name):
|
|
return collection_name in bpy.data.collections
|
|
return collection_name in bpy.data.collections
|
|
@@ -114,6 +253,11 @@ def create_collection(collection_name):
|
|
bpy.context.scene.collection.children.link(new_collection)
|
|
bpy.context.scene.collection.children.link(new_collection)
|
|
|
|
|
|
|
|
|
|
|
|
+def hide_collection(collection):
|
|
|
|
+ collection.hide_render = True
|
|
|
|
+ collection.hide_viewport = True
|
|
|
|
+
|
|
|
|
+
|
|
# -------------------------------------------------------------------
|
|
# -------------------------------------------------------------------
|
|
# Operators
|
|
# Operators
|
|
# -------------------------------------------------------------------
|
|
# -------------------------------------------------------------------
|