Faster exporter

This commit is contained in:
unknown 2018-12-29 16:34:04 +01:00
parent 87a895d3b6
commit e760a781fd
6 changed files with 106 additions and 101 deletions

View file

@ -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

View file

@ -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

View file

@ -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')

View file

@ -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'}

View file

@ -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="")

View file

@ -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))