io_scene_3ds: Added ambient light color #104519

Merged
Sebastian Sille merged 2 commits from nrgsille-io_scene_3ds into main 2023-04-02 14:29:06 +02:00
2 changed files with 22 additions and 8 deletions

View File

@ -87,10 +87,12 @@ MAP_RCOL = 0xA364 # Red tint
MAP_GCOL = 0xA366 # Green tint MAP_GCOL = 0xA366 # Green tint
MAP_BCOL = 0xA368 # Blue tint MAP_BCOL = 0xA368 # Blue tint
RGB = 0x0010 # RGB float RGB = 0x0010 # RGB float Color1
RGB1 = 0x0011 # RGB Color1 RGB1 = 0x0011 # RGB int Color1
RGB2 = 0x0012 # RGB Color2 RGBI = 0x0012 # RGB int Color2
RGBF = 0x0013 # RGB float Color2
PCT = 0x0030 # Percent chunk PCT = 0x0030 # Percent chunk
PCTF = 0x0031 # Percent float
MASTERSCALE = 0x0100 # Master scale factor MASTERSCALE = 0x0100 # Master scale factor
# >------ sub defines of OBJECT # >------ sub defines of OBJECT
@ -518,7 +520,7 @@ def make_material_subchunk(chunk_id, color):
col1.add_variable("color1", _3ds_rgb_color(color)) col1.add_variable("color1", _3ds_rgb_color(color))
mat_sub.add_subchunk(col1) mat_sub.add_subchunk(col1)
# optional: # optional:
#col2 = _3ds_chunk(RGB1) #col2 = _3ds_chunk(RGBI)
#col2.add_variable("color2", _3ds_rgb_color(color)) #col2.add_variable("color2", _3ds_rgb_color(color))
# mat_sub.add_subchunk(col2) # mat_sub.add_subchunk(col2)
return mat_sub return mat_sub
@ -716,7 +718,7 @@ def make_material_chunk(material, image):
if wrap.roughness_texture: if wrap.roughness_texture:
roughness = [wrap.roughness_texture] roughness = [wrap.roughness_texture]
r_pct = material.roughness r_pct = 1 - material.roughness
matmap = make_material_texture_chunk(MAT_SHINMAP, roughness, r_pct) matmap = make_material_texture_chunk(MAT_SHINMAP, roughness, r_pct)
if matmap: if matmap:
material_chunk.add_subchunk(matmap) material_chunk.add_subchunk(matmap)

View File

@ -42,6 +42,7 @@ PRIMARY = 0x4D4D
# ------ Main Chunks # ------ Main Chunks
OBJECTINFO = 0x3D3D # This gives the version of the mesh and is found right before the material and object information OBJECTINFO = 0x3D3D # This gives the version of the mesh and is found right before the material and object information
VERSION = 0x0002 # This gives the version of the .3ds file VERSION = 0x0002 # This gives the version of the .3ds file
AMBIENTLIGHT = 0x2100 # The color of the ambient light
EDITKEYFRAME = 0xB000 # This is the header for all of the key frame info EDITKEYFRAME = 0xB000 # This is the header for all of the key frame info
# ------ Data Chunks, used for various attributes # ------ Data Chunks, used for various attributes
@ -91,6 +92,8 @@ MAT_MAP_GCOL = 0xA366 # Green mapping
MAT_MAP_BCOL = 0xA368 # Blue mapping MAT_MAP_BCOL = 0xA368 # Blue mapping
MAT_FLOAT_COLOR = 0x0010 # color defined as 3 floats MAT_FLOAT_COLOR = 0x0010 # color defined as 3 floats
MAT_24BIT_COLOR = 0x0011 # color defined as 3 bytes MAT_24BIT_COLOR = 0x0011 # color defined as 3 bytes
MAT_LIN_COLOR_24 = 0x0012 # byte color in newer 3ds versions
MAT_LIN_COLOR_F = 0x0013 # float color in newer 3ds versions
# >------ sub defines of OBJECT # >------ sub defines of OBJECT
OBJECT_MESH = 0x4100 # This lets us know that we are reading a new object OBJECT_MESH = 0x4100 # This lets us know that we are reading a new object
@ -580,6 +583,16 @@ def process_next_chunk(context, file, previous_chunk, imported_objects, IMAGE_SE
if version > 3: if version > 3:
print('\tNon-Fatal Error: Version greater than 3, may not load correctly: ', version) print('\tNon-Fatal Error: Version greater than 3, may not load correctly: ', version)
# is it an ambient light chunk?
elif new_chunk.ID == AMBIENTLIGHT:
read_chunk(file, temp_chunk)
if temp_chunk.ID == RGB:
context.scene.world.color[:] = read_float_color(temp_chunk)
elif temp_chunk.ID == RGBF:
context.scene.world.color[:] = read_float_color(temp_chunk)
else: skip_to_end(file, temp_chunk)
new_chunk.bytes_read += temp_chunk.bytes_read
# is it an object info chunk? # is it an object info chunk?
elif new_chunk.ID == OBJECTINFO: elif new_chunk.ID == OBJECTINFO:
process_next_chunk(context, file, new_chunk, imported_objects, IMAGE_SEARCH, KEYFRAME) process_next_chunk(context, file, new_chunk, imported_objects, IMAGE_SEARCH, KEYFRAME)
@ -779,7 +792,6 @@ def process_next_chunk(context, file, previous_chunk, imported_objects, IMAGE_SE
elif new_chunk.ID == OBJECT_VERTICES: elif new_chunk.ID == OBJECT_VERTICES:
"""Worldspace vertex locations""" """Worldspace vertex locations"""
temp_data = file.read(SZ_U_SHORT) temp_data = file.read(SZ_U_SHORT)
num_verts = struct.unpack('<H', temp_data)[0] num_verts = struct.unpack('<H', temp_data)[0]
new_chunk.bytes_read += 2 new_chunk.bytes_read += 2
@ -935,7 +947,7 @@ def process_next_chunk(context, file, previous_chunk, imported_objects, IMAGE_SE
new_chunk.bytes_read += 2 new_chunk.bytes_read += 2
child = object_dictionary.get(object_name) child = object_dictionary.get(object_name)
if child is None: # and object_name != '$AMBIENT$': if child is None and object_name != '$AMBIENT$':
child = bpy.data.objects.new(object_name, None) # create an empty object child = bpy.data.objects.new(object_name, None) # create an empty object
context.view_layer.active_layer_collection.collection.objects.link(child) context.view_layer.active_layer_collection.collection.objects.link(child)
imported_objects.append(child) imported_objects.append(child)
@ -1097,7 +1109,7 @@ def process_next_chunk(context, file, previous_chunk, imported_objects, IMAGE_SE
parent = object_parent[ind] parent = object_parent[ind]
if parent == ROOT_OBJECT: if parent == ROOT_OBJECT:
if ob.parent is not None: if ob.parent is not None:
ob.parent = ROOT_OBJECT ob.parent = None
else: else:
if ob.parent != object_list[parent]: if ob.parent != object_list[parent]:
if ob == object_list[parent]: if ob == object_list[parent]: