New Addon: Import Autodesk .max #105013

Closed
Sebastian Sille wants to merge 136 commits from (deleted):nrgsille-import_max into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
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): def add_texslot(texslot):
image = texslot.image image = texslot.image
socket = None
filename = bpy.path.basename(image.filepath) filename = bpy.path.basename(image.filepath)
mat_sub_file = _3ds_chunk(MAT_MAP_FILE) 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) kfdata.add_subchunk(kfcurtime)
return kfdata return kfdata
def make_track_chunk(ID, ob, ob_pos, ob_rot, ob_size): 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 """Make a chunk for track data. Depending on the ID, this will construct
a position, rotation, scale, roll, color, fov, hotspot or falloff track.""" 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) amb_node.add_subchunk(amb_node_header_chunk)
if world.use_nodes and world.node_tree.animation_data.action: if world.use_nodes and world.node_tree.animation_data.action:
ambioutput = 'EMISSION' ,'MIX_SHADER', 'WORLD_OUTPUT'
action = world.node_tree.animation_data.action action = world.node_tree.animation_data.action
ambinode = next((nd for nd in world.node_tree.nodes if nd.type in {'RGB', 'EMISSION'}), False) links = world.node_tree.links
if ambinode and action.fcurves: 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 = action.fcurves
fcurves.update() 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] 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 ambipath = ('nodes[\"RGB\"].outputs[0].default_value' if ambinode.type == 'RGB' else
'nodes[\"Emission\"].inputs[0].default_value') 'nodes[\"Emission\"].inputs[0].default_value')
@ -1477,7 +1483,7 @@ def make_ambient_node(world):
for i, frame in enumerate(kframes): for i, frame in enumerate(kframes):
ambient = [fc.evaluate(frame) for fc in fcurves if fc is not None and fc.data_path == ambipath] ambient = [fc.evaluate(frame) for fc in fcurves if fc is not None and fc.data_path == ambipath]
if not ambient: 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_frame", _3ds_uint(int(frame)))
track_chunk.add_variable("tcb_flags", _3ds_ushort()) track_chunk.add_variable("tcb_flags", _3ds_ushort())
track_chunk.add_variable("color", _3ds_float_color(ambient[:3])) 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: 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 = () self.tri_verts = self.edge_verts = self.looseverts = ()
if obj.type == "MESH": if obj.type == "MESH":
me = obj.data if obj.data.is_editmode:
if me.is_editmode: bm = bmesh.from_edit_mesh(obj.data)
bm = bmesh.from_edit_mesh(me)
bm.verts.ensure_lookup_table() bm.verts.ensure_lookup_table()
self.verts_co = get_bmesh_vert_co_array(bm) 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) self.edge_verts = get_bmesh_edge_verts_array(bm)
if create_looseverts: if create_looseverts:
self.looseverts = get_bmesh_loosevert_array(bm) self.looseverts = get_bmesh_loosevert_array(bm)
del bm
else: else:
import bpy ob_eval = obj.evaluated_get(depsgraph)
me = ob_eval.data
self.verts_co = get_mesh_vert_co_array(me) self.verts_co = get_mesh_vert_co_array(me)
if create_tris: if create_tris:
@ -177,21 +174,20 @@ class GPU_Indices_Mesh:
"users", "users",
) )
_Hash = {} _cache = {}
shader = None shader = None
UBO_data = None UBO_data = None
UBO = None UBO = None
@classmethod @classmethod
def end_opengl(cls): def gpu_data_free(cls):
del cls.shader del cls.shader
del cls.UBO del cls.UBO
del cls.UBO_data del cls.UBO_data
cls.shader = cls.UBO = cls.UBO_data = None
del cls
@staticmethod @staticmethod
def init_opengl(): def gpu_data_ensure():
cls = GPU_Indices_Mesh cls = GPU_Indices_Mesh
# OpenGL was already initialized, nothing to do here. # OpenGL was already initialized, nothing to do here.
if cls.shader is not None: if cls.shader is not None:
@ -200,8 +196,8 @@ class GPU_Indices_Mesh:
import atexit import atexit
# Make sure we only registered the callback once. # Make sure we only registered the callback once.
atexit.unregister(cls.end_opengl) atexit.unregister(cls.gpu_data_free)
atexit.register(cls.end_opengl) atexit.register(cls.gpu_data_free)
shader_info = gpu.types.GPUShaderCreateInfo() shader_info = gpu.types.GPUShaderCreateInfo()
@ -280,8 +276,8 @@ class GPU_Indices_Mesh:
def __init__(self, depsgraph, obj, draw_tris, draw_edges, draw_verts): def __init__(self, depsgraph, obj, draw_tris, draw_edges, draw_verts):
self.ob_data = obj.original.data self.ob_data = obj.original.data
if self.ob_data in GPU_Indices_Mesh._Hash: if self.ob_data in GPU_Indices_Mesh._cache:
src = GPU_Indices_Mesh._Hash[self.ob_data] src = GPU_Indices_Mesh._cache[self.ob_data]
dst = self dst = self
dst.draw_tris = src.draw_tris dst.draw_tris = src.draw_tris
@ -298,10 +294,10 @@ class GPU_Indices_Mesh:
dst.users.append(self) dst.users.append(self)
update = False update = False
else: else:
GPU_Indices_Mesh._Hash[self.ob_data] = self GPU_Indices_Mesh._cache[self.ob_data] = self
self.users = [self] self.users = [self]
update = True update = True
if update: if update:
@ -309,12 +305,10 @@ class GPU_Indices_Mesh:
self.draw_edges = draw_edges self.draw_edges = draw_edges
self.draw_verts = draw_verts self.draw_verts = draw_verts
GPU_Indices_Mesh.init_opengl() GPU_Indices_Mesh.gpu_data_ensure()
## Init Array ## ## Init Array ##
mesh_arrays = _Mesh_Arrays( mesh_arrays = _Mesh_Arrays(depsgraph, obj, draw_tris, draw_edges, draw_verts)
depsgraph.id_eval_get(obj), draw_tris, draw_edges, draw_verts
)
if mesh_arrays.verts_co is None: if mesh_arrays.verts_co is None:
self.draw_tris = False self.draw_tris = False
@ -479,13 +473,13 @@ class GPU_Indices_Mesh:
del self.tri_verts del self.tri_verts
del self.edge_verts del self.edge_verts
del self.looseverts 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) # print('mesh_del', self.obj.name)
def gpu_Indices_enable_state(winmat, viewmat): def gpu_Indices_enable_state(winmat, viewmat):
GPU_Indices_Mesh.init_opengl() GPU_Indices_Mesh.gpu_data_ensure()
gpu.matrix.push() gpu.matrix.push()
gpu.matrix.push_projection() gpu.matrix.push_projection()
gpu.matrix.load_projection_matrix(winmat) gpu.matrix.load_projection_matrix(winmat)
@ -499,7 +493,7 @@ def gpu_Indices_restore_state():
def gpu_Indices_use_clip_planes(rv3d, value): 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: if value and rv3d.use_clip_planes:
GPU_Indices_Mesh.UBO_data.use_clip_planes = True GPU_Indices_Mesh.UBO_data.use_clip_planes = True
GPU_Indices_Mesh.UBO_data.WorldClipPlanes[0] = rv3d.clip_planes[0][:] 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(): def gpu_Indices_mesh_cache_clear():
GPU_Indices_Mesh._Hash.clear() GPU_Indices_Mesh._cache.clear()