From 92d66a20d4ccea47ad5235d310ff30bebfe29893 Mon Sep 17 00:00:00 2001 From: Pyogenics Date: Sun, 19 Jan 2025 15:50:02 +0000 Subject: [PATCH] Add auto texture import option --- io_scene_a3d/A3DBlenderImporter.py | 50 ++++++++++++++++++++++++++++-- io_scene_a3d/__init__.py | 7 +++-- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/io_scene_a3d/A3DBlenderImporter.py b/io_scene_a3d/A3DBlenderImporter.py index 167310d..295e375 100644 --- a/io_scene_a3d/A3DBlenderImporter.py +++ b/io_scene_a3d/A3DBlenderImporter.py @@ -22,6 +22,7 @@ SOFTWARE. import bpy from bpy_extras.node_shader_utils import PrincipledBSDFWrapper +from bpy_extras.image_utils import load_image from .A3DObjects import ( A3D_VERTEXTYPE_COORDINATE, @@ -32,15 +33,32 @@ from .A3DObjects import ( A3D_VERTEXTYPE_NORMAL2 ) +def addImageTextureToMaterial(image, node_tree): + nodes = node_tree.nodes + links = node_tree.links + + # Check if this material already has a texture on it + if len(nodes) > 2: + return + + # Create nodes + principledBSDFNode = nodes[0] + textureNode = nodes.new(type="ShaderNodeTexImage") + links.new(textureNode.outputs["Color"], principledBSDFNode.inputs["Base Color"]) + # Apply image + if image != None: textureNode.image = image + class A3DBlenderImporter: - def __init__(self, modelData, create_collection=True, reset_empty_transform=True): + def __init__(self, modelData, directory, create_collection=True, reset_empty_transform=True, try_import_textures=True): self.modelData = modelData + self.directory = directory self.materials = [] self.meshes = [] # User settings self.create_collection = create_collection self.reset_empty_transform = reset_empty_transform + self.try_import_textures = try_import_textures def importData(self): print("Importing A3D model data into blender") @@ -192,9 +210,37 @@ class A3DBlenderImporter: ob.rotation_mode = "QUATERNION" x, y, z, w = transform.rotation ob.rotation_quaternion = (w, x, y, z) - if self.reset_empty_transform: if transform.scale == (0.0, 0.0, 0.0): ob.scale = (1.0, 1.0, 1.0) if transform.rotation == (0.0, 0.0, 0.0, 0.0): ob.rotation_quaternion = (1.0, 0.0, 0.0, 0.0) + # Attempt to load textures + if self.try_import_textures and len(me.materials) != 0: + ma = me.materials[0] # Assume this is the main material + name = name.lower() + if name == "hull" or name == "turret": + # lightmap.webp + print("Load lightmap") + + # Load image + image = load_image("lightmap.webp", self.directory, check_existing=True) + # Apply image + addImageTextureToMaterial(image, ma.node_tree) + elif "track" in name: + # tracks.webp + print("Load tracks") + + # Load image + image = load_image("tracks.webp", self.directory, check_existing=True) + # Apply image + addImageTextureToMaterial(image, ma.node_tree) + elif "wheel" in name: + # wheels.webp + print("Load wheels") + + # Load image + image = load_image("wheels.webp", self.directory, check_existing=True) + # Apply image + addImageTextureToMaterial(image, ma.node_tree) + return ob \ No newline at end of file diff --git a/io_scene_a3d/__init__.py b/io_scene_a3d/__init__.py index 7b18a11..e20b3bb 100644 --- a/io_scene_a3d/__init__.py +++ b/io_scene_a3d/__init__.py @@ -38,10 +38,11 @@ class ImportA3D(Operator, ImportHelper): bl_options = {'PRESET', 'UNDO'} filter_glob: StringProperty(default="*.a3d", options={'HIDDEN'}) + directory: StringProperty(subtype='DIR_PATH', options={'HIDDEN'}) # User options - #try_import_textures: BoolProperty(name="Search for textures", description="Automatically search for lightmap, track and wheel textures and attempt to apply them", default=True) create_collection: BoolProperty(name="Create collection", description="Create a collection to hold all the model objects", default=True) + try_import_textures: BoolProperty(name="Search for textures", description="Automatically search for lightmap, track and wheel textures and attempt to apply them", default=True) reset_empty_transform: BoolProperty(name="Reset empty transforms", description="Reset rotation and scale if it is set to 0, more useful for version 2 models like props", default=True) def draw(self, context): @@ -60,7 +61,7 @@ class ImportA3D(Operator, ImportHelper): modelData.read(file) # Import data into blender - modelImporter = A3DBlenderImporter(modelData, self.create_collection, self.reset_empty_transform) + modelImporter = A3DBlenderImporter(modelData, self.directory, self.create_collection, self.reset_empty_transform, self.try_import_textures) modelImporter.importData() return {"FINISHED"} @@ -72,8 +73,8 @@ def import_panel_options(layout, operator): header, body = layout.panel("alternativa_import_options", default_closed=False) header.label(text="Options") if body: - #body.prop(operator, "try_import_textures") body.prop(operator, "create_collection") + body.prop(operator, "try_import_textures") body.prop(operator, "reset_empty_transform") def menu_func_import_a3d(self, context):