Faster exporter
This commit is contained in:
parent
87a895d3b6
commit
e760a781fd
|
@ -755,7 +755,7 @@ class ArmoryExporter:
|
|||
if hasattr(bobject, 'users_group') and bobject.users_group != None and len(bobject.users_group) > 0:
|
||||
o['groups'] = []
|
||||
for g in bobject.users_group:
|
||||
if g.name.startswith('RigidBodyWorld') or g.name.startswith('Trait|'):
|
||||
if g.name.startswith('RigidBodyWorld'): # or g.name.startswith('Trait|'):
|
||||
continue
|
||||
o['groups'].append(g.name)
|
||||
|
||||
|
@ -1093,70 +1093,6 @@ class ArmoryExporter:
|
|||
oskin['constraints'] = []
|
||||
self.add_constraints(bone, oskin, bone=True)
|
||||
|
||||
def calc_tangents(self, posa, nora, uva, ias, scale_pos):
|
||||
num_verts = int(len(posa) / 4)
|
||||
tangents = np.empty(num_verts * 3, dtype='<f4')
|
||||
# bitangents = np.empty(num_verts * 3, dtype='<f4')
|
||||
for ar in ias:
|
||||
ia = ar['values']
|
||||
num_tris = int(len(ia) / 3)
|
||||
for i in range(0, num_tris):
|
||||
i0 = ia[i * 3 ]
|
||||
i1 = ia[i * 3 + 1]
|
||||
i2 = ia[i * 3 + 2]
|
||||
v0 = Vector((posa[i0 * 4], posa[i0 * 4 + 1], posa[i0 * 4 + 2]))
|
||||
v1 = Vector((posa[i1 * 4], posa[i1 * 4 + 1], posa[i1 * 4 + 2]))
|
||||
v2 = Vector((posa[i2 * 4], posa[i2 * 4 + 1], posa[i2 * 4 + 2]))
|
||||
uv0 = Vector((uva[i0 * 2], uva[i0 * 2 + 1]))
|
||||
uv1 = Vector((uva[i1 * 2], uva[i1 * 2 + 1]))
|
||||
uv2 = Vector((uva[i2 * 2], uva[i2 * 2 + 1]))
|
||||
|
||||
deltaPos1 = v1 - v0
|
||||
deltaPos2 = v2 - v0
|
||||
deltaUV1 = uv1 - uv0
|
||||
deltaUV2 = uv2 - uv0
|
||||
d = (deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x)
|
||||
if d != 0:
|
||||
r = 1.0 / d
|
||||
else:
|
||||
r = 1.0
|
||||
tangent = (deltaPos1 * deltaUV2.y - deltaPos2 * deltaUV1.y) * r
|
||||
# bitangent = (deltaPos2 * deltaUV1.x - deltaPos1 * deltaUV2.x) * r
|
||||
|
||||
tangents[i0 * 3 ] += tangent.x
|
||||
tangents[i0 * 3 + 1] += tangent.y
|
||||
tangents[i0 * 3 + 2] += tangent.z
|
||||
tangents[i1 * 3 ] += tangent.x
|
||||
tangents[i1 * 3 + 1] += tangent.y
|
||||
tangents[i1 * 3 + 2] += tangent.z
|
||||
tangents[i2 * 3 ] += tangent.x
|
||||
tangents[i2 * 3 + 1] += tangent.y
|
||||
tangents[i2 * 3 + 2] += tangent.z
|
||||
# bitangents[i0 * 3 ] += bitangent.x
|
||||
# bitangents[i0 * 3 + 1] += bitangent.y
|
||||
# bitangents[i0 * 3 + 2] += bitangent.z
|
||||
# bitangents[i1 * 3 ] += bitangent.x
|
||||
# bitangents[i1 * 3 + 1] += bitangent.y
|
||||
# bitangents[i1 * 3 + 2] += bitangent.z
|
||||
# bitangents[i2 * 3 ] += bitangent.x
|
||||
# bitangents[i2 * 3 + 1] += bitangent.y
|
||||
# bitangents[i2 * 3 + 2] += bitangent.z
|
||||
# Orthogonalize
|
||||
for i in range(0, num_verts):
|
||||
t = Vector((tangents[i * 3], tangents[i * 3 + 1], tangents[i * 3 + 2]))
|
||||
# b = Vector((bitangents[i * 3], bitangents[i * 3 + 1], bitangents[i * 3 + 2]))
|
||||
n = Vector((nora[i * 2], nora[i * 2 + 1], posa[i * 4 + 3] / scale_pos))
|
||||
v = t - n * n.dot(t)
|
||||
v.normalize()
|
||||
# Calculate handedness
|
||||
# cnv = n.cross(v)
|
||||
# if cnv.dot(b) < 0.0:
|
||||
# v = v * -1.0
|
||||
tangents[i * 3 ] = v.x
|
||||
tangents[i * 3 + 1] = v.y
|
||||
tangents[i * 3 + 2] = v.z
|
||||
return tangents
|
||||
|
||||
def write_mesh(self, bobject, fp, o):
|
||||
# One mesh data per file
|
||||
if ArmoryExporter.option_mesh_per_file:
|
||||
|
@ -1178,7 +1114,6 @@ class ArmoryExporter:
|
|||
def export_mesh_data(self, exportMesh, bobject, o, has_armature=False):
|
||||
exportMesh.calc_normals_split()
|
||||
# exportMesh.calc_loop_triangles()
|
||||
# exportMesh.calc_tangents()
|
||||
|
||||
loops = exportMesh.loops
|
||||
num_verts = len(loops)
|
||||
|
@ -1212,7 +1147,7 @@ class ArmoryExporter:
|
|||
t1data = np.empty(num_verts * 2, dtype='<f4')
|
||||
# Scale for packed coords
|
||||
maxdim = 1.0
|
||||
lay0 = exportMesh.uv_layers[t0map]
|
||||
lay0 = uv_layers[t0map] # TODO: handle t1map
|
||||
for v in lay0.data:
|
||||
if abs(v.uv[0]) > maxdim:
|
||||
maxdim = abs(v.uv[0])
|
||||
|
@ -1223,7 +1158,9 @@ class ArmoryExporter:
|
|||
invscale_tex = (1 / o['scale_tex']) * 32767
|
||||
else:
|
||||
invscale_tex = 1 * 32767
|
||||
# TODO: handle t1map
|
||||
if has_tang:
|
||||
exportMesh.calc_tangents(uvmap=lay0.name)
|
||||
tangdata = np.empty(num_verts * 3, dtype='<f4')
|
||||
if has_col:
|
||||
cdata = np.empty(num_verts * 3, dtype='<f4')
|
||||
|
||||
|
@ -1245,6 +1182,7 @@ class ArmoryExporter:
|
|||
v = verts[loop.vertex_index]
|
||||
co = v.co
|
||||
normal = loop.normal
|
||||
tang = loop.tangent
|
||||
|
||||
i4 = i * 4
|
||||
i2 = i * 2
|
||||
|
@ -1262,6 +1200,11 @@ class ArmoryExporter:
|
|||
uv = lay1.data[loop.index].uv
|
||||
t1data[i2 ] = uv[0]
|
||||
t1data[i2 + 1] = 1.0 - uv[1]
|
||||
if has_tang:
|
||||
i3 = i * 3
|
||||
tangdata[i3 ] = tang[0]
|
||||
tangdata[i3 + 1] = tang[1]
|
||||
tangdata[i3 + 2] = tang[2]
|
||||
if has_col:
|
||||
i3 = i * 3
|
||||
cdata[i3 ] = pow(v.col[0], 2.2)
|
||||
|
@ -1310,9 +1253,6 @@ class ArmoryExporter:
|
|||
break
|
||||
o['index_arrays'].append(ia)
|
||||
|
||||
if has_tang:
|
||||
tangdata = self.calc_tangents(pdata, ndata, t0data, o['index_arrays'], scale_pos)
|
||||
|
||||
# Pack
|
||||
pdata *= invscale_pos
|
||||
ndata *= 32767
|
||||
|
@ -1636,7 +1576,7 @@ class ArmoryExporter:
|
|||
camera = objectRef[1]["objectTable"][0]
|
||||
render = self.scene.render
|
||||
proj = camera.calc_matrix_camera(
|
||||
self.scene.view_layers[0].depsgraph,
|
||||
bpy.context.depsgraph,
|
||||
x=render.resolution_x,
|
||||
y=render.resolution_y,
|
||||
scale_x=render.pixel_aspect_x,
|
||||
|
@ -2068,7 +2008,7 @@ class ArmoryExporter:
|
|||
for group in bpy.data.groups:
|
||||
# Blender automatically stores physics objects in this group,
|
||||
# can cause stuck unused objects, skip for now
|
||||
if group.name.startswith('RigidBodyWorld') or group.name.startswith('Trait|'):
|
||||
if group.name.startswith('RigidBodyWorld'): #or group.name.startswith('Trait|'):
|
||||
continue
|
||||
o = {}
|
||||
o['name'] = group.name
|
||||
|
|
|
@ -36,6 +36,70 @@ class Vertex:
|
|||
other.loop_indices = indices
|
||||
return eq
|
||||
|
||||
def calc_tangents(posa, nora, uva, ias, scale_pos):
|
||||
num_verts = int(len(posa) / 4)
|
||||
tangents = np.empty(num_verts * 3, dtype='<f4')
|
||||
# bitangents = np.empty(num_verts * 3, dtype='<f4')
|
||||
for ar in ias:
|
||||
ia = ar['values']
|
||||
num_tris = int(len(ia) / 3)
|
||||
for i in range(0, num_tris):
|
||||
i0 = ia[i * 3 ]
|
||||
i1 = ia[i * 3 + 1]
|
||||
i2 = ia[i * 3 + 2]
|
||||
v0 = Vector((posa[i0 * 4], posa[i0 * 4 + 1], posa[i0 * 4 + 2]))
|
||||
v1 = Vector((posa[i1 * 4], posa[i1 * 4 + 1], posa[i1 * 4 + 2]))
|
||||
v2 = Vector((posa[i2 * 4], posa[i2 * 4 + 1], posa[i2 * 4 + 2]))
|
||||
uv0 = Vector((uva[i0 * 2], uva[i0 * 2 + 1]))
|
||||
uv1 = Vector((uva[i1 * 2], uva[i1 * 2 + 1]))
|
||||
uv2 = Vector((uva[i2 * 2], uva[i2 * 2 + 1]))
|
||||
|
||||
deltaPos1 = v1 - v0
|
||||
deltaPos2 = v2 - v0
|
||||
deltaUV1 = uv1 - uv0
|
||||
deltaUV2 = uv2 - uv0
|
||||
d = (deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x)
|
||||
if d != 0:
|
||||
r = 1.0 / d
|
||||
else:
|
||||
r = 1.0
|
||||
tangent = (deltaPos1 * deltaUV2.y - deltaPos2 * deltaUV1.y) * r
|
||||
# bitangent = (deltaPos2 * deltaUV1.x - deltaPos1 * deltaUV2.x) * r
|
||||
|
||||
tangents[i0 * 3 ] += tangent.x
|
||||
tangents[i0 * 3 + 1] += tangent.y
|
||||
tangents[i0 * 3 + 2] += tangent.z
|
||||
tangents[i1 * 3 ] += tangent.x
|
||||
tangents[i1 * 3 + 1] += tangent.y
|
||||
tangents[i1 * 3 + 2] += tangent.z
|
||||
tangents[i2 * 3 ] += tangent.x
|
||||
tangents[i2 * 3 + 1] += tangent.y
|
||||
tangents[i2 * 3 + 2] += tangent.z
|
||||
# bitangents[i0 * 3 ] += bitangent.x
|
||||
# bitangents[i0 * 3 + 1] += bitangent.y
|
||||
# bitangents[i0 * 3 + 2] += bitangent.z
|
||||
# bitangents[i1 * 3 ] += bitangent.x
|
||||
# bitangents[i1 * 3 + 1] += bitangent.y
|
||||
# bitangents[i1 * 3 + 2] += bitangent.z
|
||||
# bitangents[i2 * 3 ] += bitangent.x
|
||||
# bitangents[i2 * 3 + 1] += bitangent.y
|
||||
# bitangents[i2 * 3 + 2] += bitangent.z
|
||||
# Orthogonalize
|
||||
for i in range(0, num_verts):
|
||||
t = Vector((tangents[i * 3], tangents[i * 3 + 1], tangents[i * 3 + 2]))
|
||||
# b = Vector((bitangents[i * 3], bitangents[i * 3 + 1], bitangents[i * 3 + 2]))
|
||||
n = Vector((nora[i * 2], nora[i * 2 + 1], posa[i * 4 + 3] / scale_pos))
|
||||
v = t - n * n.dot(t)
|
||||
v.normalize()
|
||||
# Calculate handedness
|
||||
# cnv = n.cross(v)
|
||||
# if cnv.dot(b) < 0.0:
|
||||
# v = v * -1.0
|
||||
tangents[i * 3 ] = v.x
|
||||
tangents[i * 3 + 1] = v.y
|
||||
tangents[i * 3 + 2] = v.z
|
||||
return tangents
|
||||
|
||||
def export_mesh_data(self, exportMesh, bobject, o, has_armature=False):
|
||||
exportMesh.calc_normals_split()
|
||||
# exportMesh.calc_loop_triangles()
|
||||
|
@ -176,7 +240,7 @@ def export_mesh_data(self, exportMesh, bobject, o, has_armature=False):
|
|||
o['index_arrays'].append(ia)
|
||||
|
||||
if has_tang:
|
||||
tangdata = self.calc_tangents(pdata, ndata, t0data, o['index_arrays'], scale_pos)
|
||||
tangdata = calc_tangents(pdata, ndata, t0data, o['index_arrays'], scale_pos)
|
||||
|
||||
pdata *= invscale_pos
|
||||
ndata *= 32767
|
||||
|
|
|
@ -72,7 +72,7 @@ def on_load_post(context):
|
|||
blender.register()
|
||||
sys.path.remove(fp)
|
||||
|
||||
arm.utils.update_trait_groups()
|
||||
# arm.utils.update_trait_groups()
|
||||
|
||||
def reload_blend_data():
|
||||
armory_pbr = bpy.data.node_groups.get('Armory PBR')
|
||||
|
|
|
@ -28,7 +28,7 @@ def update_preset(self, context):
|
|||
rpdat.rp_gi = 'Off'
|
||||
rpdat.rp_render_to_texture = True
|
||||
rpdat.rp_supersampling = '1'
|
||||
rpdat.rp_antialiasing = 'FXAA'
|
||||
rpdat.rp_antialiasing = 'SMAA'
|
||||
rpdat.rp_compositornodes = True
|
||||
rpdat.rp_volumetriclight = False
|
||||
rpdat.rp_ssgi = 'SSAO'
|
||||
|
@ -562,6 +562,7 @@ class ArmRPListNewItem(bpy.types.Operator):
|
|||
wrd = bpy.data.worlds['Arm']
|
||||
wrd.arm_rplist.add()
|
||||
wrd.arm_rplist_index = len(wrd.arm_rplist) - 1
|
||||
wrd.arm_rplist[wrd.arm_rplist_index].name = bpy.data.worlds['Arm'].rp_preset
|
||||
update_preset(wrd, context)
|
||||
return{'FINISHED'}
|
||||
|
||||
|
|
|
@ -36,18 +36,18 @@ def update_trait_group(self, context):
|
|||
if os.path.exists(file_path):
|
||||
arm.utils.fetch_script_props(file_path)
|
||||
arm.utils.fetch_prop(o)
|
||||
if hasattr(bpy.data, 'groups'):
|
||||
# Clean
|
||||
for g in bpy.data.groups:
|
||||
if g.name.startswith('Trait|') and o.name in g.objects:
|
||||
g.objects.unlink(o)
|
||||
# Re-add
|
||||
for t in o.arm_traitlist:
|
||||
if 'Trait|' + t.name not in bpy.data.groups:
|
||||
g = bpy.data.groups.new('Trait|' + t.name)
|
||||
else:
|
||||
g = bpy.data.groups['Trait|' + t.name]
|
||||
g.objects.link(o)
|
||||
# if hasattr(bpy.data, 'groups'):
|
||||
# # Clean
|
||||
# for g in bpy.data.groups:
|
||||
# if g.name.startswith('Trait|') and o.name in g.objects:
|
||||
# g.objects.unlink(o)
|
||||
# # Re-add
|
||||
# for t in o.arm_traitlist:
|
||||
# if 'Trait|' + t.name not in bpy.data.groups:
|
||||
# g = bpy.data.groups.new('Trait|' + t.name)
|
||||
# else:
|
||||
# g = bpy.data.groups['Trait|' + t.name]
|
||||
# g.objects.link(o)
|
||||
|
||||
class ArmTraitListItem(bpy.types.PropertyGroup):
|
||||
name: StringProperty(name="Name", description="A name for this item", default="")
|
||||
|
|
|
@ -363,19 +363,19 @@ def fetch_bundled_trait_props():
|
|||
fetch_script_props(file_path)
|
||||
fetch_prop(o)
|
||||
|
||||
def update_trait_groups():
|
||||
if not hasattr(bpy.data, 'groups'):
|
||||
return
|
||||
for g in bpy.data.groups:
|
||||
if g.name.startswith('Trait|'):
|
||||
bpy.data.groups.remove(g)
|
||||
for o in bpy.data.objects:
|
||||
for t in o.arm_traitlist:
|
||||
if 'Trait|' + t.name not in bpy.data.groups:
|
||||
g = bpy.data.groups.new('Trait|' + t.name)
|
||||
else:
|
||||
g = bpy.data.groups['Trait|' + t.name]
|
||||
g.objects.link(o)
|
||||
# def update_trait_groups():
|
||||
# if not hasattr(bpy.data, 'groups'):
|
||||
# return
|
||||
# for g in bpy.data.groups:
|
||||
# if g.name.startswith('Trait|'):
|
||||
# bpy.data.groups.remove(g)
|
||||
# for o in bpy.data.objects:
|
||||
# for t in o.arm_traitlist:
|
||||
# if 'Trait|' + t.name not in bpy.data.groups:
|
||||
# g = bpy.data.groups.new('Trait|' + t.name)
|
||||
# else:
|
||||
# g = bpy.data.groups['Trait|' + t.name]
|
||||
# g.objects.link(o)
|
||||
|
||||
def to_hex(val):
|
||||
return '#%02x%02x%02x%02x' % (int(val[3] * 255), int(val[0] * 255), int(val[1] * 255), int(val[2] * 255))
|
||||
|
|
Loading…
Reference in a new issue