Skip to content

Commit

Permalink
Force gpu skinning
Browse files Browse the repository at this point in the history
  • Loading branch information
luboslenco committed Apr 6, 2019
1 parent 5b2b642 commit 4ecec19
Show file tree
Hide file tree
Showing 8 changed files with 24 additions and 75 deletions.
20 changes: 0 additions & 20 deletions Shaders/std/skinning_mat.glsl

This file was deleted.

13 changes: 4 additions & 9 deletions blender/arm/exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -1017,15 +1017,10 @@ def export_skin(self, bobject, armature, exportMesh, o):

# Write the bind pose transform array
oskin['transformsI'] = []
if rpdat.arm_skin == 'CPU':
for i in range(bone_count):
skeletonI = (armature.matrix_world @ bone_array[i].matrix_local).inverted_safe()
oskin['transformsI'].append(self.write_matrix(skeletonI))
else:
for i in range(bone_count):
skeletonI = (armature.matrix_world @ bone_array[i].matrix_local).inverted_safe()
skeletonI = (skeletonI @ bobject.matrix_world)
oskin['transformsI'].append(self.write_matrix(skeletonI))
for i in range(bone_count):
skeletonI = (armature.matrix_world @ bone_array[i].matrix_local).inverted_safe()
skeletonI = (skeletonI @ bobject.matrix_world)
oskin['transformsI'].append(self.write_matrix(skeletonI))

# Export the per-vertex bone influence data
group_remap = []
Expand Down
13 changes: 4 additions & 9 deletions blender/arm/exporter_opt.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,15 +311,10 @@ def export_skin(self, bobject, armature, vert_list, o):

# Write the bind pose transform array
oskin['transformsI'] = []
if rpdat.arm_skin == 'CPU':
for i in range(bone_count):
skeletonI = (armature.matrix_world @ bone_array[i].matrix_local).inverted_safe()
oskin['transformsI'].append(self.write_matrix(skeletonI))
else:
for i in range(bone_count):
skeletonI = (armature.matrix_world @ bone_array[i].matrix_local).inverted_safe()
skeletonI = (skeletonI @ bobject.matrix_world)
oskin['transformsI'].append(self.write_matrix(skeletonI))
for i in range(bone_count):
skeletonI = (armature.matrix_world @ bone_array[i].matrix_local).inverted_safe()
skeletonI = (skeletonI @ bobject.matrix_world)
oskin['transformsI'].append(self.write_matrix(skeletonI))

# Export the per-vertex bone influence data
group_remap = []
Expand Down
37 changes: 11 additions & 26 deletions blender/arm/material/make_skin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,17 @@ def skin_pos(vert):
vert.add_include('compiled.inc')

rpdat = arm.utils.get_rp()
if rpdat.arm_skin == 'GPU (Matrix)':
vert.add_include('std/skinning_mat.glsl')
vert.add_uniform('vec4 skinBones[skinMaxBones * 3]', link='_skinBones', included=True)
vert.add_uniform('float posUnpack', link='_posUnpack')
vert.write_attrib('mat4 skinningMat = getSkinningMat(ivec4(bone * 32767), weight);')
vert.write_attrib('spos.xyz *= posUnpack;')
vert.write_attrib('spos *= skinningMat;')
vert.write_attrib('spos.xyz /= posUnpack;')

else: # Dual Quat
vert.add_include('std/skinning.glsl')
vert.add_uniform('vec4 skinBones[skinMaxBones * 2]', link='_skinBones', included=True)
vert.add_uniform('float posUnpack', link='_posUnpack')
vert.write_attrib('vec4 skinA;')
vert.write_attrib('vec4 skinB;')
vert.write_attrib('getSkinningDualQuat(ivec4(bone * 32767), weight, skinA, skinB);')
vert.write_attrib('spos.xyz *= posUnpack;')
vert.write_attrib('spos.xyz += 2.0 * cross(skinA.xyz, cross(skinA.xyz, spos.xyz) + skinA.w * spos.xyz); // Rotate')
vert.write_attrib('spos.xyz += 2.0 * (skinA.w * skinB.xyz - skinB.w * skinA.xyz + cross(skinA.xyz, skinB.xyz)); // Translate')
vert.write_attrib('spos.xyz /= posUnpack;')
vert.add_include('std/skinning.glsl')
vert.add_uniform('vec4 skinBones[skinMaxBones * 2]', link='_skinBones', included=True)
vert.add_uniform('float posUnpack', link='_posUnpack')
vert.write_attrib('vec4 skinA;')
vert.write_attrib('vec4 skinB;')
vert.write_attrib('getSkinningDualQuat(ivec4(bone * 32767), weight, skinA, skinB);')
vert.write_attrib('spos.xyz *= posUnpack;')
vert.write_attrib('spos.xyz += 2.0 * cross(skinA.xyz, cross(skinA.xyz, spos.xyz) + skinA.w * spos.xyz); // Rotate')
vert.write_attrib('spos.xyz += 2.0 * (skinA.w * skinB.xyz - skinB.w * skinA.xyz + cross(skinA.xyz, skinB.xyz)); // Translate')
vert.write_attrib('spos.xyz /= posUnpack;')

def skin_nor(vert, prep):
rpdat = arm.utils.get_rp()
if rpdat.arm_skin == 'GPU (Matrix)':
vert.write('mat3 skinningMatVec = getSkinningMatVec(skinningMat);')
vert.write(prep + 'wnormal = normalize(N * (vec3(nor.xy, pos.w) * skinningMatVec));')

else: # Dual Quat
vert.write(prep + 'wnormal = normalize(N * (vec3(nor.xy, pos.w) + 2.0 * cross(skinA.xyz, cross(skinA.xyz, vec3(nor.xy, pos.w)) + skinA.w * vec3(nor.xy, pos.w))));')
vert.write(prep + 'wnormal = normalize(N * (vec3(nor.xy, pos.w) + 2.0 * cross(skinA.xyz, cross(skinA.xyz, vec3(nor.xy, pos.w)) + skinA.w * vec3(nor.xy, pos.w))));')
6 changes: 2 additions & 4 deletions blender/arm/props_renderpath.py
Original file line number Diff line number Diff line change
Expand Up @@ -482,11 +482,9 @@ class ArmRPListItem(bpy.types.PropertyGroup):
arm_lensflare: BoolProperty(name="Lens Flare", default=False, update=assets.invalidate_shader_cache)
arm_lut_texture: StringProperty(name="LUT Texture", description="Color Grading", default="", update=assets.invalidate_shader_cache)
arm_skin: EnumProperty(
items=[('GPU (Dual-Quat)', 'GPU (Dual-Quat)', 'GPU (Dual-Quat)'),
('GPU (Matrix)', 'GPU (Matrix)', 'GPU (Matrix)'),
('CPU', 'CPU', 'CPU'),
items=[('On', 'On', 'On'),
('Off', 'Off', 'Off')],
name='Skinning', description='Skinning method', default='GPU (Dual-Quat)', update=assets.invalidate_shader_cache)
name='Skinning', description='Enable skinning', default='On', update=assets.invalidate_shader_cache)
arm_skin_max_bones_auto: BoolProperty(name="Auto Bones", description="Calculate amount of maximum bones based on armatures", default=True, update=assets.invalidate_compiled_data)
arm_skin_max_bones: IntProperty(name="Max Bones", default=50, min=1, max=3000, update=assets.invalidate_shader_cache)
arm_particles: EnumProperty(
Expand Down
2 changes: 1 addition & 1 deletion blender/arm/props_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -768,7 +768,7 @@ def draw(self, context):
layout.prop(rpdat, 'arm_particles')
layout.prop(rpdat, 'arm_skin')
row = layout.row()
row.enabled = rpdat.arm_skin.startswith('GPU')
row.enabled = rpdat.arm_skin == 'On'
row.prop(rpdat, 'arm_skin_max_bones_auto')
row = layout.row()
row.enabled = not rpdat.arm_skin_max_bones_auto
Expand Down
2 changes: 1 addition & 1 deletion blender/arm/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -522,7 +522,7 @@ def is_bone_animation_enabled(bobject):
return False

def export_bone_data(bobject):
return bobject.find_armature() and is_bone_animation_enabled(bobject) and get_rp().arm_skin.startswith('GPU')
return bobject.find_armature() and is_bone_animation_enabled(bobject) and get_rp().arm_skin == 'On'

def kode_studio_mklink_win(sdk_path):
# Fight long-path issues on Windows
Expand Down
6 changes: 1 addition & 5 deletions blender/arm/write_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,10 +251,6 @@ def write_khafilejs(is_play, export_physics, export_navigation, export_ui, is_pu
assets.add_khafile_def('arm_stream')

rpdat = arm.utils.get_rp()
if rpdat.arm_skin == 'CPU':
assets.add_khafile_def('arm_skin_cpu')
elif rpdat.arm_skin == 'GPU (Matrix)':
assets.add_khafile_def('arm_skin_mat')
if rpdat.arm_skin != 'Off':
assets.add_khafile_def('arm_skin')

Expand Down Expand Up @@ -598,7 +594,7 @@ def write_compiledglsl(defs, make_variants):
""")

# Skinning
if rpdat.arm_skin.startswith('GPU'):
if rpdat.arm_skin == 'On':
f.write(
"""const int skinMaxBones = """ + str(rpdat.arm_skin_max_bones) + """;
""")
Expand Down

0 comments on commit 4ecec19

Please sign in to comment.