io_scene_3ds: Added fog and gradient import and export #104811

Merged
Sebastian Sille merged 64 commits from :main into main 2023-08-01 16:21:54 +02:00
2 changed files with 30 additions and 30 deletions
Showing only changes of commit e8803f4296 - Show all commits

View File

@ -572,6 +572,7 @@ def make_material_texture_chunk(chunk_id, texslots, pct):
def add_texslot(texslot):
image = texslot.image
socket = None
filename = bpy.path.basename(image.filepath)
mat_sub_file = _3ds_chunk(MAT_MAP_FILE)
@ -1092,6 +1093,7 @@ def make_kfdata(revision, start=0, stop=100, curtime=0):
kfdata.add_subchunk(kfcurtime)
return kfdata
def make_track_chunk(ID, ob, ob_pos, ob_rot, ob_size):
"""Make a chunk for track data. Depending on the ID, this will construct
a position, rotation, scale, roll, color, fov, hotspot or falloff track."""
@ -1456,11 +1458,15 @@ def make_ambient_node(world):
amb_node.add_subchunk(amb_node_header_chunk)
if world.use_nodes and world.node_tree.animation_data.action:
ambioutput = 'EMISSION' ,'MIX_SHADER', 'WORLD_OUTPUT'
action = world.node_tree.animation_data.action
ambinode = next((nd for nd in world.node_tree.nodes if nd.type in {'RGB', 'EMISSION'}), False)
if ambinode and action.fcurves:
links = world.node_tree.links
ambilinks = [lk for lk in links if lk.from_node.type in {'EMISSION', 'RGB'} and lk.to_node.type in ambioutput]
if ambilinks and action.fcurves:
fcurves = action.fcurves
fcurves.update()
emission = next((lk.from_socket.node for lk in ambilinks if lk.to_node.type in ambioutput), False)
ambinode = next((lk.from_socket.node for lk in ambilinks if lk.to_node.type == 'EMISSION'), emission)
kframes = [kf.co[0] for kf in [fc for fc in fcurves if fc is not None][0].keyframe_points]
ambipath = ('nodes[\"RGB\"].outputs[0].default_value' if ambinode.type == 'RGB' else
'nodes[\"Emission\"].inputs[0].default_value')
@ -1477,7 +1483,7 @@ def make_ambient_node(world):
for i, frame in enumerate(kframes):
ambient = [fc.evaluate(frame) for fc in fcurves if fc is not None and fc.data_path == ambipath]
if not ambient:
ambient.append(world.color)
ambient = amb_color
track_chunk.add_variable("tcb_frame", _3ds_uint(int(frame)))
track_chunk.add_variable("tcb_flags", _3ds_ushort())
track_chunk.add_variable("color", _3ds_float_color(ambient[:3]))

View File

@ -115,12 +115,11 @@ def get_bmesh_loosevert_array(bm):
class _Mesh_Arrays:
def __init__(self, obj, create_tris, create_edges, create_looseverts):
def __init__(self, depsgraph, obj, create_tris, create_edges, create_looseverts):
self.tri_verts = self.edge_verts = self.looseverts = ()
if obj.type == "MESH":
me = obj.data
if me.is_editmode:
bm = bmesh.from_edit_mesh(me)
if obj.data.is_editmode:
bm = bmesh.from_edit_mesh(obj.data)
bm.verts.ensure_lookup_table()
self.verts_co = get_bmesh_vert_co_array(bm)
@ -131,11 +130,9 @@ class _Mesh_Arrays:
self.edge_verts = get_bmesh_edge_verts_array(bm)
if create_looseverts:
self.looseverts = get_bmesh_loosevert_array(bm)
del bm
else:
import bpy
ob_eval = obj.evaluated_get(depsgraph)
me = ob_eval.data
self.verts_co = get_mesh_vert_co_array(me)
if create_tris:
@ -177,21 +174,20 @@ class GPU_Indices_Mesh:
"users",
)
_Hash = {}
_cache = {}
shader = None
UBO_data = None
UBO = None
@classmethod
def end_opengl(cls):
def gpu_data_free(cls):
del cls.shader
del cls.UBO
del cls.UBO_data
del cls
cls.shader = cls.UBO = cls.UBO_data = None
@staticmethod
def init_opengl():
def gpu_data_ensure():
cls = GPU_Indices_Mesh
# OpenGL was already initialized, nothing to do here.
if cls.shader is not None:
@ -200,8 +196,8 @@ class GPU_Indices_Mesh:
import atexit
# Make sure we only registered the callback once.
atexit.unregister(cls.end_opengl)
atexit.register(cls.end_opengl)
atexit.unregister(cls.gpu_data_free)
atexit.register(cls.gpu_data_free)
shader_info = gpu.types.GPUShaderCreateInfo()
@ -280,8 +276,8 @@ class GPU_Indices_Mesh:
def __init__(self, depsgraph, obj, draw_tris, draw_edges, draw_verts):
self.ob_data = obj.original.data
if self.ob_data in GPU_Indices_Mesh._Hash:
src = GPU_Indices_Mesh._Hash[self.ob_data]
if self.ob_data in GPU_Indices_Mesh._cache:
src = GPU_Indices_Mesh._cache[self.ob_data]
dst = self
dst.draw_tris = src.draw_tris
@ -298,10 +294,10 @@ class GPU_Indices_Mesh:
dst.users.append(self)
update = False
else:
GPU_Indices_Mesh._Hash[self.ob_data] = self
GPU_Indices_Mesh._cache[self.ob_data] = self
self.users = [self]
update = True
if update:
@ -309,12 +305,10 @@ class GPU_Indices_Mesh:
self.draw_edges = draw_edges
self.draw_verts = draw_verts
GPU_Indices_Mesh.init_opengl()
GPU_Indices_Mesh.gpu_data_ensure()
## Init Array ##
mesh_arrays = _Mesh_Arrays(
depsgraph.id_eval_get(obj), draw_tris, draw_edges, draw_verts
)
mesh_arrays = _Mesh_Arrays(depsgraph, obj, draw_tris, draw_edges, draw_verts)
if mesh_arrays.verts_co is None:
self.draw_tris = False
@ -479,13 +473,13 @@ class GPU_Indices_Mesh:
del self.tri_verts
del self.edge_verts
del self.looseverts
GPU_Indices_Mesh._Hash.pop(self.ob_data)
GPU_Indices_Mesh._cache.pop(self.ob_data)
# print('mesh_del', self.obj.name)
def gpu_Indices_enable_state(winmat, viewmat):
GPU_Indices_Mesh.init_opengl()
GPU_Indices_Mesh.gpu_data_ensure()
gpu.matrix.push()
gpu.matrix.push_projection()
gpu.matrix.load_projection_matrix(winmat)
@ -499,7 +493,7 @@ def gpu_Indices_restore_state():
def gpu_Indices_use_clip_planes(rv3d, value):
GPU_Indices_Mesh.init_opengl()
GPU_Indices_Mesh.gpu_data_ensure()
if value and rv3d.use_clip_planes:
GPU_Indices_Mesh.UBO_data.use_clip_planes = True
GPU_Indices_Mesh.UBO_data.WorldClipPlanes[0] = rv3d.clip_planes[0][:]
@ -513,4 +507,4 @@ def gpu_Indices_use_clip_planes(rv3d, value):
def gpu_Indices_mesh_cache_clear():
GPU_Indices_Mesh._Hash.clear()
GPU_Indices_Mesh._cache.clear()