mirror of
https://github.com/MapMakersAndProgrammers/io_scene_a3d.git
synced 2025-10-26 01:49:13 -07:00
Add auto texture import option
This commit is contained in:
@@ -22,6 +22,7 @@ SOFTWARE.
|
|||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
from bpy_extras.node_shader_utils import PrincipledBSDFWrapper
|
from bpy_extras.node_shader_utils import PrincipledBSDFWrapper
|
||||||
|
from bpy_extras.image_utils import load_image
|
||||||
|
|
||||||
from .A3DObjects import (
|
from .A3DObjects import (
|
||||||
A3D_VERTEXTYPE_COORDINATE,
|
A3D_VERTEXTYPE_COORDINATE,
|
||||||
@@ -32,15 +33,32 @@ from .A3DObjects import (
|
|||||||
A3D_VERTEXTYPE_NORMAL2
|
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:
|
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.modelData = modelData
|
||||||
|
self.directory = directory
|
||||||
self.materials = []
|
self.materials = []
|
||||||
self.meshes = []
|
self.meshes = []
|
||||||
|
|
||||||
# User settings
|
# User settings
|
||||||
self.create_collection = create_collection
|
self.create_collection = create_collection
|
||||||
self.reset_empty_transform = reset_empty_transform
|
self.reset_empty_transform = reset_empty_transform
|
||||||
|
self.try_import_textures = try_import_textures
|
||||||
|
|
||||||
def importData(self):
|
def importData(self):
|
||||||
print("Importing A3D model data into blender")
|
print("Importing A3D model data into blender")
|
||||||
@@ -192,9 +210,37 @@ class A3DBlenderImporter:
|
|||||||
ob.rotation_mode = "QUATERNION"
|
ob.rotation_mode = "QUATERNION"
|
||||||
x, y, z, w = transform.rotation
|
x, y, z, w = transform.rotation
|
||||||
ob.rotation_quaternion = (w, x, y, z)
|
ob.rotation_quaternion = (w, x, y, z)
|
||||||
|
|
||||||
if self.reset_empty_transform:
|
if self.reset_empty_transform:
|
||||||
if transform.scale == (0.0, 0.0, 0.0): ob.scale = (1.0, 1.0, 1.0)
|
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)
|
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
|
return ob
|
||||||
@@ -38,10 +38,11 @@ class ImportA3D(Operator, ImportHelper):
|
|||||||
bl_options = {'PRESET', 'UNDO'}
|
bl_options = {'PRESET', 'UNDO'}
|
||||||
|
|
||||||
filter_glob: StringProperty(default="*.a3d", options={'HIDDEN'})
|
filter_glob: StringProperty(default="*.a3d", options={'HIDDEN'})
|
||||||
|
directory: StringProperty(subtype='DIR_PATH', options={'HIDDEN'})
|
||||||
|
|
||||||
# User options
|
# 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)
|
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)
|
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):
|
def draw(self, context):
|
||||||
@@ -60,7 +61,7 @@ class ImportA3D(Operator, ImportHelper):
|
|||||||
modelData.read(file)
|
modelData.read(file)
|
||||||
|
|
||||||
# Import data into blender
|
# 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()
|
modelImporter.importData()
|
||||||
|
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
@@ -72,8 +73,8 @@ def import_panel_options(layout, operator):
|
|||||||
header, body = layout.panel("alternativa_import_options", default_closed=False)
|
header, body = layout.panel("alternativa_import_options", default_closed=False)
|
||||||
header.label(text="Options")
|
header.label(text="Options")
|
||||||
if body:
|
if body:
|
||||||
#body.prop(operator, "try_import_textures")
|
|
||||||
body.prop(operator, "create_collection")
|
body.prop(operator, "create_collection")
|
||||||
|
body.prop(operator, "try_import_textures")
|
||||||
body.prop(operator, "reset_empty_transform")
|
body.prop(operator, "reset_empty_transform")
|
||||||
|
|
||||||
def menu_func_import_a3d(self, context):
|
def menu_func_import_a3d(self, context):
|
||||||
|
|||||||
Reference in New Issue
Block a user