io_scene_3ds: Improved import and export of background color and images #104801

Merged
Sebastian Sille merged 54 commits from :main into main 2023-07-30 16:34:21 +02:00
2 changed files with 13 additions and 6 deletions

View File

@ -1578,11 +1578,12 @@ def save(operator, context, filepath="", scale_factor=1.0, use_scene_unit=False,
background_color_chunk = _3ds_chunk(RGB) background_color_chunk = _3ds_chunk(RGB)
background_chunk = _3ds_chunk(SOLIDBACKGND) background_chunk = _3ds_chunk(SOLIDBACKGND)
background_flag = _3ds_chunk(USE_SOLIDBGND) background_flag = _3ds_chunk(USE_SOLIDBGND)
bgshader = 'ADD_SHADER', 'MIX_SHADER', 'OUTPUT_WORLD' bgtype = 'BACKGROUND'
bgtexture = 'TEX_IMAGE', 'TEX_ENVIRONMENT' bgshade = 'ADD_SHADER', 'MIX_SHADER', 'OUTPUT_WORLD'
acol, bcol = 'EMISSION', 'BACKGROUND' bg_tex = 'TEX_IMAGE', 'TEX_ENVIRONMENT'
bg_color = next((lk.from_node.inputs[0].default_value[:3] for lk in ntree if lk.from_node.type == bcol and lk.to_node.type in bgshader), world.color) bg_color = next((lk.from_node.inputs[0].default_value[:3] for lk in ntree if lk.from_node.type == bgtype and lk.to_node.type in bgshade), world.color)
bg_image = next((lk.from_node.image.name for lk in ntree if lk.from_node.type in bgtexture and lk.to_node.type in {acol, bcol}), False) bg_mixer = next((lk.from_node.type for lk in ntree if lk.from_node.type in {'MIX', 'MIX_RGB'} and lk.to_node.type == bgtype), bgtype)
bg_image = next((lk.from_node.image.name for lk in ntree if lk.from_node.type in bg_tex and lk.to_node.type == bg_mixer), False)
background_color_chunk.add_variable("color", _3ds_float_color(bg_color)) background_color_chunk.add_variable("color", _3ds_float_color(bg_color))
background_chunk.add_subchunk(background_color_chunk) background_chunk.add_subchunk(background_color_chunk)
if bg_image: if bg_image:

View File

@ -735,11 +735,17 @@ def process_next_chunk(context, file, previous_chunk, imported_objects, CONSTRAI
contextWorld.use_nodes = True contextWorld.use_nodes = True
links = contextWorld.node_tree.links links = contextWorld.node_tree.links
nodes = contextWorld.node_tree.nodes nodes = contextWorld.node_tree.nodes
bitmap_mix = nodes.new(type='ShaderNodeMixRGB')
bitmapnode = nodes.new(type='ShaderNodeTexEnvironment') bitmapnode = nodes.new(type='ShaderNodeTexEnvironment')
bitmap_mix.label = "Solid Color"
bitmapnode.label = bitmap_name bitmapnode.label = bitmap_name
bitmap_mix.location = (-250, 300)
bitmapnode.location = (-300, 300) bitmapnode.location = (-300, 300)
bitmap_mix.inputs[2].default_value = nodes['Background'].inputs[0].default_value
bitmapnode.image = load_image(bitmap_name, dirname, place_holder=False, recursive=IMAGE_SEARCH, check_existing=True) bitmapnode.image = load_image(bitmap_name, dirname, place_holder=False, recursive=IMAGE_SEARCH, check_existing=True)
links.new(bitmapnode.outputs['Color'], nodes['Background'].inputs[0]) bitmap_mix.inputs[0].default_value = 0.0 if bitmapnode.image is not None else 1.0
links.new(bitmap_mix.outputs['Color'], nodes['Background'].inputs[0])
links.new(bitmapnode.outputs['Color'], bitmap_mix.inputs[1])
new_chunk.bytes_read += read_str_len new_chunk.bytes_read += read_str_len
# If fog chunk # If fog chunk