From 2a238d32da833812e837cf38e16a7685c98db5c3 Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 15 Jan 2023 19:48:24 +0000 Subject: [PATCH] a fairly major physics update --- blender_export.py | 232 +++++++++-- bvh.h | 84 ++-- distq.h | 7 - maps_src/mp_gridmap.mdl | Bin 909312 -> 909312 bytes model.h | 30 +- models_src/ch_jordan.mdl | Bin 612624 -> 612864 bytes models_src/ch_new.mdl | Bin 664096 -> 664352 bytes models_src/ch_outlaw.mdl | Bin 607424 -> 607664 bytes player.h | 55 ++- player_animation.h | 3 +- player_physics.h | 16 +- player_ragdoll.h | 327 +++++++++++----- rigidbody.h | 810 ++++++++++++++++++++++++++++++--------- scene.h | 1 - skaterift.c | 2 +- skeleton.h | 30 +- 16 files changed, 1198 insertions(+), 399 deletions(-) delete mode 100644 distq.h diff --git a/blender_export.py b/blender_export.py index 8cd60ea..515acd7 100644 --- a/blender_export.py +++ b/blender_export.py @@ -548,13 +548,14 @@ class classtype_skeleton(Structure): class classtype_bone(Structure): #{ _pack_ = 1 - _fields_ = [("deform",c_uint32), + _fields_ = [("flags",c_uint32), ("ik_target",c_uint32), ("ik_pole",c_uint32), - ("collider",c_uint32), - ("use_limits",c_uint32), - ("angle_limits",(c_float*3)*2), - ("hitbox",(c_float*3)*2)] + ("hitbox",(c_float*3)*2), + ("conevx",c_float*3), + ("conevy",c_float*3), + ("coneva",c_float*3), + ("conet",c_float)] def encode_obj(_, node,node_def): #{ @@ -563,19 +564,24 @@ class classtype_bone(Structure): armature_def = node_def['linked_armature'] obj = node_def['bone'] - _.deform = node_def['deform'] + _.flags = node_def['deform'] if 'ik_target' in node_def: #{ + _.flags |= 0x2 _.ik_target = armature_def['bones'].index( node_def['ik_target'] ) _.ik_pole = armature_def['bones'].index( node_def['ik_pole'] ) #} # For ragdolls # - if obj.cv_data.collider: + if obj.cv_data.collider != 'collider_none': #{ - _.collider = 1 + if obj.cv_data.collider == 'collider_box': + _.flags |= 0x4 + else: + _.flags |= 0x8 + _.hitbox[0][0] = obj.cv_data.v0[0] _.hitbox[0][1] = obj.cv_data.v0[2] _.hitbox[0][2] = -obj.cv_data.v1[1] @@ -586,13 +592,17 @@ class classtype_bone(Structure): if obj.cv_data.con0: #{ - _.use_limits = 1 - _.angle_limits[0][0] = obj.cv_data.mins[0] - _.angle_limits[0][1] = obj.cv_data.mins[2] - _.angle_limits[0][2] = -obj.cv_data.maxs[1] - _.angle_limits[1][0] = obj.cv_data.maxs[0] - _.angle_limits[1][1] = obj.cv_data.maxs[2] - _.angle_limits[1][2] = -obj.cv_data.mins[1] + _.flags |= 0x100 + _.conevx[0] = obj.cv_data.conevx[0] + _.conevx[1] = obj.cv_data.conevx[2] + _.conevx[2] = -obj.cv_data.conevx[1] + _.conevy[0] = obj.cv_data.conevy[0] + _.conevy[1] = obj.cv_data.conevy[2] + _.conevy[2] = -obj.cv_data.conevy[1] + _.coneva[0] = obj.cv_data.coneva[0] + _.coneva[1] = obj.cv_data.coneva[2] + _.coneva[2] = -obj.cv_data.coneva[1] + _.conet = obj.cv_data.conet #} #} #} @@ -1279,7 +1289,7 @@ def encoder_build_scene_graph( collection ): #} #} - if n.cv_data.collider: + if n.cv_data.collider != 'collider_none': tree['collider_count'] += 1 btree['deform'] = n.use_deform @@ -2041,6 +2051,44 @@ def cv_draw_sphere( pos, radius, colour ): cv_draw_lines() #} +# Draw axis alligned sphere at position with radius +# +def cv_draw_halfsphere( pos, tx, ty, tz, radius, colour ): +#{ + global cv_view_verts, cv_view_colours + + ly = pos + tz*radius + lx = pos + ty*radius + lz = pos + tz*radius + + pi = 3.14159265358979323846264 + + for i in range(16): + #{ + t = ((i+1.0) * 1.0/16.0) * pi + s = math.sin(t) + c = math.cos(t) + + s1 = math.sin(t*2.0) + c1 = math.cos(t*2.0) + + py = pos + s*tx*radius + c *tz*radius + px = pos + s*tx*radius + c *ty*radius + pz = pos + s1*ty*radius + c1*tz*radius + + cv_view_verts += [ px, lx ] + cv_view_verts += [ py, ly ] + cv_view_verts += [ pz, lz ] + + cv_view_colours += [ colour, colour, colour, colour, colour, colour ] + + ly = py + lx = px + lz = pz + #} + cv_draw_lines() +#} + # Draw transformed -1 -> 1 cube # def cv_draw_ucube( transform, colour ): @@ -2096,9 +2144,9 @@ def cv_draw_line2( p0, p1, c0, c1 ): cv_draw_lines() #} -# Just the tx because we dont really need ty for this app +# # -def cv_tangent_basis_tx( n, tx ): +def cv_tangent_basis( n, tx, ty ): #{ if abs( n[0] ) >= 0.57735027: #{ @@ -2114,6 +2162,11 @@ def cv_tangent_basis_tx( n, tx ): #} tx.normalize() + _ty = n.cross( tx ) + + ty[0] = _ty[0] + ty[1] = _ty[1] + ty[2] = _ty[2] #} # Draw coloured arrow @@ -2127,7 +2180,8 @@ def cv_draw_arrow( p0, p1, c0 ): n.normalize() tx = Vector((1,0,0)) - cv_tangent_basis_tx( n, tx ) + ty = Vector((1,0,0)) + cv_tangent_basis( n, tx, ty ) cv_view_verts += [p0,p1, midpt+(tx-n)*0.15,midpt, midpt+(-tx-n)*0.15,midpt ] cv_view_colours += [c0,c0,c0,c0,c0,c0] @@ -2260,19 +2314,61 @@ def draw_limit( obj, center, major, minor, amin, amax, colour ): cv_draw_lines() #} +# Cone and twist limit +# +def draw_cone_twist( center, vx, vy, va ): +#{ + global cv_view_verts, cv_view_colours + axis = vy.cross( vx ) + axis.normalize() + + size = 0.12 + + cv_view_verts += [center, center+va*size] + cv_view_colours += [ (1,1,1,1), (1,1,1,1) ] + + for x in range(32): + #{ + t0 = (x/32) * math.tau + t1 = ((x+1)/32) * math.tau + + c0 = math.cos(t0) + s0 = math.sin(t0) + c1 = math.cos(t1) + s1 = math.sin(t1) + + p0 = center + (axis + vx*c0 + vy*s0).normalized() * size + p1 = center + (axis + vx*c1 + vy*s1).normalized() * size + + col0 = ( abs(c0), abs(s0), 0.0, 1.0 ) + col1 = ( abs(c1), abs(s1), 0.0, 1.0 ) + + cv_view_verts += [center, p0, p0, p1] + cv_view_colours += [ (0,0,0,0), col0, col0, col1 ] + #} + + cv_draw_lines() +#} + # Draws constraints and stuff for the skeleton. This isnt documented and wont be # def draw_skeleton_helpers( obj ): #{ global cv_view_verts, cv_view_colours + if obj.data.pose_position != 'REST': + #{ + return + #} + for bone in obj.data.bones: #{ - if bone.cv_data.collider and (obj.data.pose_position == 'REST'): + c = bone.head_local + a = Vector((bone.cv_data.v0[0], bone.cv_data.v0[1], bone.cv_data.v0[2])) + b = Vector((bone.cv_data.v1[0], bone.cv_data.v1[1], bone.cv_data.v1[2])) + + if bone.cv_data.collider == 'collider_box': #{ - c = bone.head_local - a = bone.cv_data.v0 - b = bone.cv_data.v1 vs = [None]*8 vs[0]=obj.matrix_world@Vector((c[0]+a[0],c[1]+a[1],c[2]+a[2])) @@ -2296,20 +2392,67 @@ def draw_skeleton_helpers( obj ): cv_view_verts += [(v1[0],v1[1],v1[2])] cv_view_colours += [(0.5,0.5,0.5,0.5),(0.5,0.5,0.5,0.5)] #} + #} + elif bone.cv_data.collider == 'collider_capsule': + #{ + v0 = b-a + major_axis = 0 + largest = -1.0 - center = obj.matrix_world @ c - if bone.cv_data.con0: + for i in range(3): #{ - draw_limit( obj, c, Vector((0,1,0)),Vector((0,0,1)), \ - bone.cv_data.mins[0], bone.cv_data.maxs[0], \ - (1,0,0,1)) - draw_limit( obj, c, Vector((0,0,1)),Vector((1,0,0)), \ - bone.cv_data.mins[1], bone.cv_data.maxs[1], \ - (0,1,0,1)) - draw_limit( obj, c, Vector((1,0,0)),Vector((0,1,0)), \ - bone.cv_data.mins[2], bone.cv_data.maxs[2], \ - (0,0,1,1)) + if abs(v0[i]) > largest: + #{ + largest = abs(v0[i]) + major_axis = i + #} #} + + v1 = Vector((0,0,0)) + v1[major_axis] = 1.0 + + tx = Vector((0,0,0)) + ty = Vector((0,0,0)) + + cv_tangent_basis( v1, tx, ty ) + r = (abs(tx.dot( v0 )) + abs(ty.dot( v0 ))) * 0.25 + l = v0[ major_axis ] - r*2 + + p0 = obj.matrix_world@Vector( c + (a+b)*0.5 + v1*l*-0.5 ) + p1 = obj.matrix_world@Vector( c + (a+b)*0.5 + v1*l* 0.5 ) + + colour = [0.2,0.2,0.2,1.0] + colour[major_axis] = 0.5 + + cv_draw_halfsphere( p0, -v1, ty, tx, r, colour ) + cv_draw_halfsphere( p1, v1, ty, tx, r, colour ) + cv_draw_line( p0+tx* r, p1+tx* r, colour ) + cv_draw_line( p0+tx*-r, p1+tx*-r, colour ) + cv_draw_line( p0+ty* r, p1+ty* r, colour ) + cv_draw_line( p0+ty*-r, p1+ty*-r, colour ) + #} + else: + #{ + continue + #} + + center = obj.matrix_world @ c + if bone.cv_data.con0: + #{ + vx = Vector([bone.cv_data.conevx[_] for _ in range(3)]) + vy = Vector([bone.cv_data.conevy[_] for _ in range(3)]) + va = Vector([bone.cv_data.coneva[_] for _ in range(3)]) + draw_cone_twist( center, vx, vy, va ) + + #draw_limit( obj, c, Vector((0,0,1)),Vector((0,-1,0)), \ + # bone.cv_data.mins[0], bone.cv_data.maxs[0], \ + # (1,0,0,1)) + #draw_limit( obj, c, Vector((0,-1,0)),Vector((1,0,0)), \ + # bone.cv_data.mins[1], bone.cv_data.maxs[1], \ + # (0,1,0,1)) + #draw_limit( obj, c, Vector((1,0,0)),Vector((0,0,1)), \ + # bone.cv_data.mins[2], bone.cv_data.maxs[2], \ + # (0,0,1,1)) #} #} #} @@ -2428,13 +2571,25 @@ class CV_OBJ_SETTINGS(bpy.types.PropertyGroup): class CV_BONE_SETTINGS(bpy.types.PropertyGroup): #{ - collider: bpy.props.BoolProperty(name="Collider",default=False) + collider: bpy.props.EnumProperty( + name="Collider Type", + items = [ + ('collider_none', "collider_none", "", 0), + ('collider_box', "collider_box", "", 1), + ('collider_capsule', "collider_capsule", "", 2), + ]) + v0: bpy.props.FloatVectorProperty(name="v0",size=3) v1: bpy.props.FloatVectorProperty(name="v1",size=3) con0: bpy.props.BoolProperty(name="Constriant 0",default=False) mins: bpy.props.FloatVectorProperty(name="mins",size=3) maxs: bpy.props.FloatVectorProperty(name="maxs",size=3) + + conevx: bpy.props.FloatVectorProperty(name="conevx",size=3) + conevy: bpy.props.FloatVectorProperty(name="conevy",size=3) + coneva: bpy.props.FloatVectorProperty(name="coneva",size=3) + conet: bpy.props.FloatProperty(name="conet") #} class CV_BONE_PANEL(bpy.types.Panel): @@ -2459,8 +2614,11 @@ class CV_BONE_PANEL(bpy.types.Panel): _.layout.label( text="Angle Limits" ) _.layout.prop( bone.cv_data, "con0" ) - _.layout.prop( bone.cv_data, "mins" ) - _.layout.prop( bone.cv_data, "maxs" ) + + _.layout.prop( bone.cv_data, "conevx" ) + _.layout.prop( bone.cv_data, "conevy" ) + _.layout.prop( bone.cv_data, "coneva" ) + _.layout.prop( bone.cv_data, "conet" ) #} #} diff --git a/bvh.h b/bvh.h index 41a4108..e79e3dd 100644 --- a/bvh.h +++ b/bvh.h @@ -5,7 +5,6 @@ #ifndef BVH_H #define BVH_H #include "common.h" -#include "distq.h" /* * Usage: @@ -178,7 +177,28 @@ VG_STATIC bh_tree *bh_create( void *lin_alloc, bh_system *system, return bh; } -VG_STATIC void bh_debug_node( bh_tree *bh, u32 inode, v3f pos, u32 colour ) +/* + * Draw items in this leaf node. + * *item_debug() must be set! + */ +VG_STATIC void bh_debug_leaf( bh_tree *bh, bh_node *node ) +{ + vg_line_boxf( node->bbx, 0xff00ff00 ); + + if( bh->system->item_debug ) + { + for( u32 i=0; icount; i++ ) + { + u32 idx = node->start+i; + bh->system->item_debug( bh->user, idx ); + } + } +} + +/* + * Trace the bh tree all the way down to the leaf nodes where pos is inside + */ +VG_STATIC void bh_debug_trace( bh_tree *bh, u32 inode, v3f pos, u32 colour ) { bh_node *node = &bh->nodes[ inode ]; @@ -189,21 +209,13 @@ VG_STATIC void bh_debug_node( bh_tree *bh, u32 inode, v3f pos, u32 colour ) { vg_line_boxf( node->bbx, colour ); - bh_debug_node( bh, node->il, pos, colour ); - bh_debug_node( bh, node->ir, pos, colour ); + bh_debug_trace( bh, node->il, pos, colour ); + bh_debug_trace( bh, node->ir, pos, colour ); } else { - vg_line_boxf( node->bbx, 0xff00ff00 ); - if( bh->system->item_debug ) - { - for( u32 i=0; icount; i++ ) - { - u32 idx = node->start+i; - bh->system->item_debug( bh->user, idx ); - } - } + bh_debug_leaf( bh, node ); } } } @@ -288,39 +300,39 @@ VG_STATIC int bh_next( bh_tree *bh, bh_iter *it, boxf box, int *em ) { bh_node *inode = &bh->nodes[ it->stack[it->depth].id ]; - if( box_overlap( inode->bbx, box ) ) + /* Only process overlapping nodes */ + if( !box_overlap( inode->bbx, box ) ) { - if( inode->count ) + it->depth --; + continue; + } + + if( inode->count ) + { + if( it->i < inode->count ) { - if( it->i < inode->count ) - { - *em = inode->start+it->i; - it->i ++; - return 1; - } - else - { - it->depth --; - it->i = 0; - } + *em = inode->start+it->i; + it->i ++; + return 1; } else { - if( it->depth+1 >= vg_list_size(it->stack) ) - { - vg_error( "Maximum stack reached!\n" ); - return 0; - } - - it->stack[it->depth ].id = inode->il; - it->stack[it->depth+1].id = inode->ir; - it->depth ++; + it->depth --; it->i = 0; } } else { - it->depth --; + if( it->depth+1 >= vg_list_size(it->stack) ) + { + vg_error( "Maximum stack reached!\n" ); + return 0; + } + + it->stack[it->depth ].id = inode->il; + it->stack[it->depth+1].id = inode->ir; + it->depth ++; + it->i = 0; } } diff --git a/distq.h b/distq.h deleted file mode 100644 index 1ae5436..0000000 --- a/distq.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef DISTQ_H -#define DISTQ_H - -#include "vg_m.h" - - -#endif /* DISTQ_H */ diff --git a/maps_src/mp_gridmap.mdl b/maps_src/mp_gridmap.mdl index 78b0dd0e485b2b75e71c77ecd23b7a9b467653a0..1f1079f43f015321f1e7622a6bff54136b94c0d6 100644 GIT binary patch delta 986 zcmZ9Jact8?6vy{^_v^f^)s5QV(Ag4Nwz#mlxY3x|-!YRa3lUs&b}~k{*h&@%y3B1P zrKLpOEY%G9+x8&HB9g|K4MfL0T-O#>C+Q!JHV%yrGNK^_vPtGbgv1$-zl{9x$>qI! z_rBlvE_A^Wy5Kl`*N{D!nSSoC$>)FDaHf8of=$P+4L9<Mkv&ulxV2 z@xS#8RI@2X(Za%aiJ_kuK%x`GKpI-v&8>eXMt3ywBciE;SWNJ%=-yAZ6u{efv5!>2 zs95SFT{>7sUzn7!`mc^A8XN&0#-aORcI2IedqaR{aVAXMkS9tH5w3s>TL(xQB4X`f zV$wky)<#JgSg|!qZnI_z{fqkQ7>%>0? z_$4v%G09ihIkq=pP6as^GbiOe?8mF05)boNeLh)m?*Ok5u2aPED4Y-hK?Vr>Xzm5o z`~Abb0L^h}bbFvhT~%>T-HEO^akE%?yZXi65$AUz7AL!P%9{Q*K7!^X@xYkqP7-$` zBS~js;B1h8iQoryL(NtFxlpOy>b!7fq|FAAn=-F4bn zr-zm?Ukl~wB^TGBy_dQb_w89#!-KtYpj(S$YSG0G`3V!f^l^Yz%VY3Irpekd%*lgo%3N_eb_IDCDuYt;ntsN)90>B? zv35|pKh5TxC;kZVV`6CV{(67F?qRtDo5&8+d5dEIC8hR=FTbXR3VT+YR-1$A^H!XR z%aTo4IwiMo6R%ED2l&yPphD3$XVeVl5;UT`wIieEV|$WDAlAQ_q!LA0bL delta 983 zcmZ9Ie@N749LN3K^E}rcJ-75anrn7SUJ7DzOuInt`?x@v6BdHkwbWg*yGF$XY1g&Y zsj=pdjH&lkKT)l=!bNjM&FLfQeJ^#lO~J)sqlLA$K@CES8p4DXd-`jvKVCe1KF|C4 zyg$#o<*KXYs;m2N%jwyRlatqe**rIMcw&e`j*0)?UnP=~l3D^oPSOScmAaEy^;$=Dk9F^JK#A9l@EPj;3 zC&>!Nhj~NP7Hbl28UI4vLl|$LAwGVv@cfnJ_l5`RN>3q57zxJX? zLED&G^zCqsmY)Bu=EJfv;^k-a>a`0Er`+Gkfibej#4_4;h|_2@hz|y3&>-F_&J1_7 z=TejS9)Es`*1#d@TuJ9CEMuyT`uG{VG45*Lrp?Kqjoty+E$N34f|=^E5>6?_irWm_L!*Lv_!NPTEw@oOz@VwWhD!y&o`pcWJR)wCt~WIx@K!QZsr zbz^^6OrR%1#~>ZkbY=1Y%XI34>o}k*?FCGzgKwU`<=*sOlL#W~RhGY+^2W3_gNZ2ZWDT{`8pC>ncEXo!iw0FNg;}ve@q&UYk`*Zm Li(E8Pt=azq&vbBe diff --git a/model.h b/model.h index be0666a..287eefd 100644 --- a/model.h +++ b/model.h @@ -68,6 +68,26 @@ enum material_flag k_material_flag_grind_surface = 0x8 }; +enum bone_flag +{ + k_bone_flag_deform = 0x1, + k_bone_flag_ik = 0x2, + k_bone_flag_collider_box = 0x4, + k_bone_flag_collider_capsule = 0x8, + k_bone_flag_collider_reserved0 = 0x10, + k_bone_flag_collider_reserved1 = 0x20, + k_bone_flag_collider_reserved2 = 0x40, + k_bone_flag_collider_reserved3 = 0x80, + k_bone_flag_collider_any = k_bone_flag_collider_box | + k_bone_flag_collider_capsule | + k_bone_flag_collider_reserved0 | + k_bone_flag_collider_reserved1 | + k_bone_flag_collider_reserved2 | + k_bone_flag_collider_reserved3, + k_bone_flag_cone_constraint = 0x100, + k_bone_flag_force_u32 = 0xffffffff +}; + #pragma pack(push,1) struct mdl_vert @@ -200,14 +220,14 @@ struct classtype_route struct classtype_bone { - u32 deform, + u32 flags, ik_target, - ik_pole, - collider, - use_limits; + ik_pole; - v3f angle_limits[2]; boxf hitbox; + + v3f conevx, conevy, coneva; + float conet; }; struct classtype_skeleton diff --git a/models_src/ch_jordan.mdl b/models_src/ch_jordan.mdl index 7130ad03ced7e5e1d94fa4a54bb69b31e0d9ae4a..0d147d1765460c17371fd29bcdf13a9a4bd195f1 100644 GIT binary patch delta 26938 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

f(Oy+@k)%%0FZ{)LY8SubocO$CbFU+pYaLYhvXi zD)8|4kM%F!B`NjA6WGJV!}phH&GeH(4#!no)E^Xf7}okrq2@dVaZ{Ee{qn98*pOgegz9DV8v;Z(gx9W7tbQscDayjnHng~k{vy0R@(8OLgft7ZIJZtuhN?s z4D>EHdch6I>nRx1Qspk3Fc|0!t>`RR$&S!cPd(a8G6#$F&Y0Gb8@_Wmw_;ozyOtD% z{1UyoA>z`C&hJpxu+zL5^t-9WHDO@O##KYaOO~Hmf4MT1-Bz)l%Dho zm)`pY4ghvASutGN*I53%B9Gg>Z4}q-R4i*CWg~xyw#rCpVSBlUyGfbWv{6%atywjh zXeUeGI?1m#X=u{5VvWk_4?`nKNR|Fqg`HKJ^s$NT#HP}KRHN0!CZuJ9^eZ$T&VNX^ z_VPz|b1`CxWRnzLH5ZaR`mEfN4ezW%?Vc&TWPIkjS0lSchqc^nN4Xc=UPj6{V8;J<=+O z(Y)u=)%tAyuhLNnviftuytk!XHY7#+)5wm-kXzZ33!8e@rGd8b_eGk;S?DWq-YbRc zipHaoQ%9p*k@(XB7vzJ-klyy+?2`1hMLGCYVV6CA9<093{-a`UKjU ldwG99O diff --git a/models_src/ch_new.mdl b/models_src/ch_new.mdl index c11c27fe27b6de02d41644d971244b9027753b48..53b5900c5916ef3dd9124e9cb646f81a5b34fbae 100644 GIT binary patch delta 26910 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 F{{cP0cpCr! delta 26746 zcmbTe2UHZx);3Jf3}Jvqk|H@M5)@@-Km?|%2?7F2FoOXxBPwD>Q9(rnBaT>N#)KG9 zrhyiit`-ww1TmrL5i@4Y81Sz?@45GX@44q&>sue|jBvKK)3bN&+7)EadDlH>UG=rJ zt{fq>w6q+Y^7MQ6Y1Y-!$}rT@dWcEm%(b+xyK89$bkWk`tMehlfkvNF( zQpJjciG`|saj>&Sq@{)b(=x`|VwPX3Zp_f5`-y8P3oUQHzR5-N+e+6o$Ji@Fj6l#aEo38pOjABt$AwraUfkm!)M z>OB7TT3e;B8$@`j2I&Ti=IW?6=>~~T>ZoqvZ$EWZR(e6A0A1Bsy&&mI3^TS;>!?a5 z?UVOVqH5ODlV13X7=wvjRAQ;K^zvVndQ9<`*8lZ?cLb)+*x5ft;9zOp`0H=p=au$R zy^tD;?&vaKq`e73S7l-v#!NS`AxJYkPWTccN2me~dM+FK_yA|!=f37yy%So1c2oV= zOa}{)JrE50*O&0K@Npd-&2KBPSOCuY^ z{}^KWZ%h7dh^n6Ky6m6a2l}^xV7gNOHad+hz~2FegC6%ZhTCv@o>KU3jkPX6b&jx3+T(2kJ4INr|7!*h{M)vR-C%XjeA^};@ zxcwVLLCD`B#IT`%K`6i}7-EY*miQz5EPP(ao9--1vrs zB*JidQwO)7t;T}>5yB0pKcjT>nf$(4OZZo@CxKFb1cot}R(TqCCH|Zl!cYI023S7& zmk-z<`v1lUYiz&8|MEeQ@h>0FVD$f=d`PFu|Lp^I{Quy?U*3E(!G1A;rbQx^XJ;E` zXy;Qz*9lV-rp!*9m^5kTT&?jb6VtGPT2m8~W;05Q7=rXzWyN#~19TsaGxJ~kNWay}0r4t;7sIzrl=vq}VrreM0ppH1|A|I|<`BT-Q$q;fUnT8nO|HGK zr=DwhQZ{XtF+E%*>zPdYCJ)y1H@nDPK0SippepWZt=C;Vk-3<*&|P)8=Pd2?4i7Yu z3G5XtmJaLpmOJn20UoQ?_2J29PW_l&V_wQ^1`VP=sNy`6$?R^>GNSIQmpYtUH6M81L`Zw=0;e1|!LH`W``8KzKyM>#%sV9qO#$)+}spl35J zUb{uoVU4%Y+c_?bLY3oFP5Lw*S6h7WrU%THF31XLTGjdNuxjiTxF_aaq7UvhFSTk`#1m4oU`AEV$~2V34dH!MiILW1 z)4I{juoZjN5zBnBy*ZJ|!!lbWoBvJzkX>olH7}Ide%ZtI)D7p}dZ&HCjbl z5`{<};KN&0tVYL~oR~-vd9dd`WV*KyToA8B&8n8cD)PhtS7y67nil`Kq>fZ&4oQ|8 z>~c}3Y~oK0RDB+jLXJq-%_T3(Mym>Zc$F%3sEW*&??cKaA3l4<9#q1Z48x!n7wa(R zjU#Dba!!3gB^{Zp*Su?+dW7X=HIqKloRBV#@!?rZ7P&G7aX2G4c`W60Us!nc$9bP$LJYX>Kr035^7~AfVabAwdMX9=Xk3U@8+atbdo3 zOtw$z!FLHE@%uxq>cI~MSB+Y z5|gin%>%k;o%jxYb3TS?T7nh*Cz5STgGmF8HNAI|KI+>dLm5oqGAzy|(TP9TyOe8s z+)jN{6=ztJ{v+E_R($siJ?=R}Ajq_>z;StJ z*o}WYvYIOy@R9OlWLba5nITp$mi)~yLENde4~ZX4;W{jW+1*(^SEhfW^n^F)!L+RZ zujDexdrUTJ+0Y|9%r%sW4rpbFO>4yeEtILxZx)f%k{|w8QvEdVr*uOfnaZtyN04#c zhU;-ovYDn~+wQ8z!h4YggVJuM5(aKj*%x z3U}-#jxvEe|1M8eysMU&pi13sO@8QNL;ox&)_l(H3apue-G4Wdk?q5=uZs8J6CQR& zKW-kUelV^3{|=c-w$DfPzQ~aLU~WyjYuTb1r?pW&BRzztkN&y>Ww3Dsw=6Ay>!WHd z4kjZBLuzuN2*j(Oa_1P|!$1C>27yPDNy^-vx6(R8DeB!3ud2k9DV-hYZry+TFRj-H z8b)>u$6=%lD)p)ca3w}GSENcUc}%W!GvMAt63CpjKqr~Rq;k_%)qSzH$XGob}sjH|rJ^uvAl-(Rf2*De0&i7K`#8pB^$l}x@XGv{6&KBT#9 zS*LMiEUR%V@Sg$_Q8GFFswY3R*#&$Ipb^0|A?!E`_24i6-p;kD#NkXo z>Gj2);9N-{vSt#`i2t6|skOo6kqm1(bBPp*)_9?Bs+!tv#1Ylg+Qr0ECh@}Gli|-W zdtO!&fSGam9bUJdj{`=T_WaH4uKZ6X>DqtI=gj(Ga`-W8+Bo_bcc*3$Do{1l+iTlz zQ-IB?&-E$fJu`dSRJN2l(V3x)nbd}VR2XoxpSIz^-e5Vi$q8 z+q|Y^^29Mu{>{W5;PfqkI#klT0@87JYl(R($9pQWJoA;Z>-G}OtM3Q6fvTE&)@1sq z{xSy-jpxVJ!@*{z^&a+NtotBv`h_*W*VvYS!w~oX%Pk?QF%SA_$NSj;npyV%L-B1; z1lTgxnlEQ<`D!Mo1c0&5wv zCmh)KwdRLDx8;8^1uy?gLg}kyvi@~X{;cbBDy63<+O2YXolNT0TGMCFmML%C{YZUM z6~3+}1K;-GS9F}i?aZtbc z#5Y@J5$h`<@N)7feuLZCjCN+>*fI1>wnc})8h_hmYxEqGH0vcgd?PfG64rVS<6M{r zQj=2FOG;c2k&jn)R`#GQl*7`3zyT;VB!bD{d0psDP0pIjgBrOMHqMa1X?y-ad8sIK zd1?{ivJYx^z--Pjx>qLGlk4!?$uuI)izfRl`gOT;r)W!Q5|2SJ2@ez37dH$05MBnG?8`Dxba?sA~uEE|tZo2is~v zCCq7_mptB_rCY4%TL~A~K(#de1CBc*Ll3F>D>uUc$I?2FcHqc7YM!N1+ z$A!g}dUv@1X0vhD0&TKC1ox>he%Y@Qw1iEyA;c2td5Tq+Y;G@|$}VvrmPz!^*gG;6 zu|3p95@$k0*6-sGJI#k4+4DB)3Qb%HYjWBSA5Gr_Ba~~DK|l$8U5I4zO?s2ObA=W! z%ga;`WlLQIUFpLt)^=t+Ra)}e|8&G1M6+!k#3c#YZtq&P z{fLZud?pWUVe90?3PPJKVq8PnSTEupK^m6Cb4fqzz{Izc)&&xC2!f@8h-i^?!HUlQ7kY+jI@tXF z#BqXbT>Q-C?uU2G(I-RcBQQ1;+ue4+!7Z{!v|9TTOKpT{p+vCs%J8em>9ZSc$({=( zvI$cDsz0~q{Y7x)I{^LIxB)^6|LD99#N>?RPp#d7ve}w&!Ty~5YpCgNclr%!jCR4; zNF0}M4wS-df;}&Zvt&Zqwn&_VWV|EEysL96)%qo)9az~Q;tbwREMKCuw-YPdvV%Yh zOT-8&e)S&2WjpT$lc*u!15Ap=xPx0;G&f$ot3I;z5&Fr>1`D%tZv8cMpx%aFSeDD( zVH1ZEBP7!CEd^*#?pd@F){G?VwfE$nq-@~RkvPR)>a*PD(>qbxXE)@^mc|j)Vxk?+ z7(;}S(+xaa$ z3y$opM-DJgAYCo6Rj#tntom5Bui62&q!90jeXwB`o`%zhbiTSeft(a~x(M<&k)e`pOwDX=aZb4fQDG0nE` zJ$uhM3CdW@)x;c;G^O2`{+h51iC}&%VNXs;>c&sk+6~5jJcL%mnp`}SmX}YGeFe?%Z*x9X93T5Pvhf#OO}H>8aq2acPO& zg6qYFtSn9NJxl7W9)Y~sv@JrOwn;J^=XY7*xvA%RWjELY@i1y*mP__&x3Wq8n?Nrp z-HOXf!gMcwo=FLH9uC`zr<(xYYz*GWKfx>BikY6Cx2MsN?x6Q260Cp?n2G#Z)`eqb zxybq35v~I|7T_W!CxH8yrT&NiKblivKtT6lK{F`GP)?LY^2HU@J} z{GaDuk{D?!=H zLcAc77Rx))Kl^5(Gw%D58>~A(L=yqf@*uXBF!qg zMtf)yf3HBD*tk++idedH))h3RmIv0bu8gQ9LfE`=!bKa;(#k4f`WfEPrS-q7(Cffz zWW%Ov2)yy#yj+LAJ!%X3@*5#v*nSFI@bR<-J(Ob|`Pj{5Xrk)qv+Z?aW6g}K|B5Z~s z-JQ*;#i>soJS(9Or52z=ch8`{Pa^?ndD z6FSyol0n*H3Vi6qcPBjg*D$;uN5nokOxCcZw_-?Cf7+Zas23EBPQSxtTZQq47xU2& zHn8ze1-U1YX-F0-{X}Ul!^|64+DrAEvU6Pn=|;U(OfD=INdA)tQ)M22UT9%KSHgxH zSiz*wRb{PV38mGQvGhUK@g`0X!;^+1%G|qp(`hNk8R*$W^e4UAyQABrglfJ>@_sP0 z2{)K+zB`!K_bv*!zlrEY(D%8 z)0&0(e6Fz!bZ*bqc%5db#jxc*p1gC+Y#CE?TXhKZctE6(yOwIe?cF}8EGUHU!4^Nj z2`H65&H=^Oefd=O*hAtsA&m}PUbb$ytKv8;e}oskAlBot&`lI@Yq*c4x!_^{^_&S? z^F&x(a<2X0KDLU$Gt)>u0$M)Djwk00Rd^@&E``eH#4NJR{Swgk%Hw1scPazQnnz_vGkZd0>sD0-k+EY}MPidyv=Y z$^GSU;%mY|x-eaVe)oR_bl7#T@uDrw75mULNK??kroP1qt2ZI)r`PVRt7b@HK`xH9De?QAs(4a z(CG`0a0BYLqc)iO5l_Tr+b>e2JPXy@{^UkOlTWyCltbT7gi6}C>ZezTlPO-nZhj(k zB_zoD#vF1AqN7}^nI5q98%~;8u|K_9^t!7D?}(-|U}8HaO&b{m?lN1rQ!69*i?FF3 zL%87NJFlguH>&UD)3gyJzT;7Mr&gl+?|qPR>(dF))e2fKl&AYMLFx1IcLfGk|L~$+4~MH zjc!F|?kv{=lRAl9h-jGCNn}mFC^6vnWIjioLw)&2uu>qY%;QlwxS-4nH3$=|!_T=ecCvd$f0XrmnIwV-a4ED`w_#5349%$sRKmEt8O=e@3B8 zZ=C4N%8k@c*4IL`L5FzH*4g5*q-4iPH0q`kZF%VswF!nhh=R!zEnPK>%J)!lYe(P( zslY*`BEN2%R=uLQR0$sGaqFS4BR1{Fp6S$vjgjEMsq?srNpuw91CT$=mQ$%!dqMg4 z2Fi?W?=JXTaqSoty=WUX+i@d$&bqk>v<~l7bbO{0J<|RuWeelnu!dP*4xW7X*^ZYS zi>r7A+ucOT@7mi`{5y z%|pFjInZkwJU|+3>no}zYt#jx_T*4hb=!^p3@d%GAgc>zXh}j6w@Dd<=Xh~HJZkJo z=h9l|YjW9E3?7^6E5Z}wV3t08LFmG76K(j82L_=1J5)CV0|gVLOExC9+@? z(`_Y6H#~`+v5r85m%+XtOlZ5U+Wax|Az%q?qOr=Uw#UGmA{{j5movQp)&*d6@1`_* z&AQTyUXy-|F@Q<<`3bqB-WC=2$>WZmjpYMiWgwQn*5ZD14c7>TiI9ol~;vm7AoF3#&0ZegE{^2=!7-V6>9+CYiD;Z8w=e+ zu*~K@mEb~p1vfCF8$B1shTu_WLoa)M+S`vFJ7yze4BLcJPnQ>f;W6j9)DfMjanLdp zlP+wqL#N&pab}Z7@)$Tw(#uW&r91b3Vc^72(N=Pp?sd8Cs-1Gt*9dwrD-9Fjb+4Op za7FLx2>vn%EYpLf;aE;q#5oXXPIIQS9cXjd6fRO3e4cjCE7UxcuD{g;7et6==%tU; zQODi6$H3PSqFJQxfl#F%YY#4N^5%Kx^mC#_ z$p&ZEJo9>QHG)nY!@%EBq8a3gA_ql_{T203{QGGLgIanMO%GiNXL5w^r*N$FnI$i%^p zK9@ZeEQPXBIB_OBMOU1-=*yQ?WtG{(hEdq~@wByfUgIQMtLq(R0xTGfk+RKjkh{NK z$TU<((B7=c7@^8t&pHOICx1kj3d?{wo0lNM{anIdfmr+JG%Oy6Sr?zE_4@iFoHl*z zU3M8dCSo&o93_$0j1I1d4dcUMY9fX;a@i626YyL8t}1}Gh6Rb3arNdUeKVJL1JkUH z`2EmiJRY@5*MzCi>n)#_J&dkpea8!Kz8anYE=_7dJ==INpS7GQ!mV%I%vFli!4H|5 z;@)`U=QtV9Fe4Z~S(L1I=6ISs=2||(Y9@;=i=^kIBalm_Gi}7?C5dp4UKeId75axz zedzmC3|lxugqxq)_j++dx2ib%fp?HGD@_rd5lKf~K99aMIOAiOo2jDT1Q~XEGnMzn zj_PcdPqo38IoSND!JTDe$6qV`JuVyMv2k++yH>02pxA{nI$-l=&03f^AA>Eq)}8+{ za|yCp=?damw*>-juW*}#PYO}qUpcY72lgR{CT`mk|n!cv&|b1*QU zdJ^=Wxdg0a3l@oP6Vhq@M{&!6P?`A2p7dB;JrjF!zTBcJ-{kp7$UP2-hlcb~Ga{l|{D1F1e zJPF+d(u3KY+Alk>OrufK7BDtbq|&oZyevCApg>;qI#VPfwa?!|$EuuZH!n+m5Nuz8 zLCI~s2O3rcf|9v?z-!$qs#p3zB=mf|Yoblf`KzDr}%a=iO88g(mn( zA9-+{F?*venr_z}>s1O91=6W6GPM3xB^CTLjPC|Zv#_k~EAGnm&2KS{!<6{ItSJkd zbbyqp|JXM{4d<>BIgs~X3`OT#jkqrnU%63i;VPlp4`I^LhLVre{mCI{8XLD-Kzr{K zH%-=|3@SSCJhu&|=7^FFH^kiZs{bRJUbbkz48F(_*^uMReCW-WT|oL+E93}GaN4)yM=f{jogd2SfCgzG%(w6y9*8aLq_KN+LiU!*N!`onlile}urXYSdtXYpoJ?-Sd zc)n?pr|1o!`?5J3glTzfn zhTTxon{5)|*G-}ja=>~e+TolCLJBBcpu<&Iy4AKy^)1$!ap*RXZe&e1izbN4Shvky zj*~oSz4SQdI?RNkV52+JeNg-#@xXF=KmNi-cpZwW$X%~6?M%q^l-LdtI$g* z7Cu8oV?DvlF*ng(wq?7J!TqnO6`|{m6$xkKXh+s@r-%`g-@JREQ_>*d(62jxiEY_~ z=Noz6ya5f1a-e-oyYptSbRRBUOSJSWb*itTz(93H1dQE}^M-XZ_r2SDK4osMhqtPA z`!V_sk1Eg#Cs%N^=Uem)w(ZBg%^f!BfFQGN?p1WU-ig*o9r?Sg?;#=XZ-Z7Bs`i***uP zep-o+ur;NE`1{>oQu-4#N@LUA$Qw4Pu^+pugV48jJ>{)rz-zGtBf@tXiu;$mHd-3f zd+eQH z5uG*fU}hDT-o1Pr_bw$vIo19M_yLQnaJ}5ZHdF}_@>&&&UbJhWB_4x#cW9!)qq7q( z$`|YkDLWSyiWfIujo`*4RU*>80%+gPE75hf1qle;4+%vj_rlQoLovJwEI5T(KW2?o zqtAWHs+UF4t!&LHfz>F~3+>8;0Ssao6{<4)FDAZBlC$O=ncffvd%E+ zJ%(vbkL{qf?ml|aW({7jdGAFD5@I}T`-JE6=wD&z=s`K{*1%ACY~W|nVu|$Z^!{j> zhcEq|J=c!+CPWzw=@7Y)Rfnf>mAwf%FM-3miL?&UJ+ZX8#|5Tklpk#g$B4u!WOAeu zE#4DCe_i~=WA%-suP%L4W(o@o z#F5(3FTlCK(CZ$5&S{*08OUc#c%}oE&ZN zh^6!43}fu>tE`KlSNucj{2^U12DTbwnR$L0C^pwhxuDvEng@MN#E(heb}_fmEDgjq zt3f#HW-7*65%e<(;O!o7S0!xs8q5Wn-p5;tq@uHO#^)QD$);I|agj^8eh1YW$w3bb zymZ4FE9}VQiMmw%opw&46N{YK9BZ+QNP6h>LDVUt<-i=a(pHQUEWGxX^3Ym;Ja1nC z8Czg4#?u>~xsKZ2*@3Uew}bs`LpL$*MU>C1xg+lua$nN*@e#YP^Pgt)Pe2n-ZlU7T zFR9sVi;EDPg}pqBMmy=r@7(gnxVF2Bf9Ob!Rbhaequ?FbUwy>*x?-FE=3PpdvO^=^V1s_KaXw;(z_o<*72_`Hi&jQyFRfFu{LGKl zGHB^9-c8i9mHrq2DL6!fC5-`mD4S1-@u5)tf`jUUSz2`IH#7Bd=thfG?EqG!m=bHs1$CUytNPz1~wj zp)6ADLO8K;kz(BcuiDxbEIbi{94saxk}Vx1Xn$33=+MvEgZURO>kk&dylAn#wpnTv ze~K-S7LSk^2F`o!QbLd5UyXh23cC&!+mNzF3gACAhM(~E2ZdY1p<-OcTF4k~(VUfF zTdWF|vZ=!bn$FHoMM*C4e9&ms!FX6W5}Rf}Ob%8ah~;zKep3l--AFM$-2IQVhOuLC z4m7lMRpJc@H|)<1NZlAbA#Uw>j4Y0OfS?uY!9-X&76)S{bw+L5u}*%l@II(y;}QgC z$}9(KM2fEdHpc!+cj%jlbN}AwLXL=2xM(s8pbQ=T7TG-$mkTqfa+XLG|}l zRE}|9{!0QYS}azJ$-Rl&kk6QS&}QLIr@)$}IIV6$-(@(xT?@>>%~8{+J9H4goy}P$ zguJhTuM+Pxx&Jw5C|)iOlV)5m)uhMhpzE-GIpz}IJb<M}n; z&YV%puEP8kxC-^3U=379ms5uEk$fIBS&0Ey^5B5l;hc`*5bj6tY0^qDZnadGUU|I~ z`_T^*Aae{BXX9aSCo;%%P6t)w*_|$i4cX#gJ?$4}^3(E=QfRYUJd14B*nt@%w^1W5 z4#CHw1*~6@FRa^uC7g8_RuSVH!9VM5R`vw8Z4g%* z<{xhNa%+mE=Pdd|4NqQBx-+-zLg^c9L!OWWeExa_{X;2z;~bo&zACYTF!0iz zSTWZso^Kqt11{Js<_u$jmUsPtcslvSQw9d)<4GoddLM25SfM#LqzhdDlk)KtXc?lG zxwKj+23ADU{%qV9q3YDL**)syhtW4Ha|M3GuoZiW*qp6`61($vybg15w1ItBwzfcw z-`zfVTE{HYEK{`pF^I;uo!f+Z)DqK3V&DPYlIGBg`qn zfjzw{h9XVVS|HKuo@8Q14RHM)FyGNppWhq0|M zpKK|w>9HK0>pzC^V;zqOwvMoQtf9cLdC4_Q6aZ4+IcczvVnw(CW8#9ISdDRcyW0N?6^NI6K`G;TQm|~=) zf5A+I6|A#kG##e;%BrdwsuLT|3z$sTb>mVD{kR;11}Yn-)!>4loHL~2(4H{9-RL?~ z59?|$?0ve&^9$w{au&aS;~UGi8ga7G>zcPHNB&e}yZs0Cy9b}AIw3a zVu(-tTTY9urRUyfDHbUc+?PY`Gq{vYO@Bi@GL7fHw|euQF!PMqS~thjn_-v8*nMZj zO$6Dg<`y`{I`fuFOFjqYoWsh$6{Uj`k2-GF4QqVUPCL zys+-yf=RVl;f_l`KM4L7Aur=m4WlF)m-ShFy0wTFJO6PxnJe>;ZaOqiIU#I z$}R|*y}%|HESANf6!#D?AC_JeTN{AaBP)99Me&!@UE%GEVq0?Y8y~*X*Aqz?I}`zl zOBkxBHszX8uP$-s8OxOqVC*Gviu9<-MNn(E0;ypg9-&v~mZ(=;VCEF*E28NLuq4JSda60^tV6|wloGknGuLzcv&`JcTcR{ zF3(xJ{lxWoCiFQrut7+Ua}_O>j`n-~hV)(U_kxYPj=NB@Zvb7P7v7I|S!7qX9JV%M zn7eP=fo9j=L>qfh+#8s4L#)zkI^-?)EVEX_?l-YNiW*-q$7&)fP4wp**utBFRoW{@ zS4B;*^MCkG-+w>ba!XiguZKyM^4HPaHTfQ{8?3p5lkwZn$6Q+JGBiX#6TOEyO*nKZ zVRh;mx%(9B;jtzhx&}W580kL_@rK^K6YF+Y2(mRBc<;|HC?E#K&6t9ED+i+QtmA#b zspW%O)tzQG%1`SKr@uho2N;gLqpsitABTSGy7Tkc(g)%>x@4W>NEGMgi-v8;LK-N0 zhKF_7tVB;yDvJCXf*RQ3XM!6iAM{p7n7x(_-*FX?Z0mDDYw)M5plXy854JnpOimC0?FGu&QhA3 z0xEF*1tfzeghWL?IlNU_xAm$f>fQ?ch^~~71d|)9PnUL{OVGazLzqdB5Mfei^G#&mRM)d?}q9chWUb2Zg!e2%H z3IRxa2xz()!&5L#SAy@Boq5HuE$PhYInlHN7V1h|2%fFemEcF7!%y`Bjcb&A5nLjb zEGFK;b}9C7txsdWk!|)>m*&r}`pOpQOI8qiMA-y&;=*AJ+ucxdM>y~_16`N;@zok4WL%KthBmJE8YTUeZ8wtOF1K!FHX5GZ#68{WO((!iGf6TzEV~{3ap@74%NA67 zvh8LP9D>%aL%f;|4>KB1e|jA2+gXBFpuA_*XyHT+H?`fBzR60vVgtxfmmAcD#fLfh zzKduOEU=VVOTUk;Q<&>P`7xHWl-$NcDxJ{P7rCfuGYRg(LTkxma^LVqblDMd%Byy? zA)9A|oyJxed0l8}2&NCr#?9IWX1%qu^f_STLuG%-3RyVMiLMdEi64Nj8dgw(Odk8XCd zQX0XW?igdoHA4xT7bS#G1^E6IAX!al)_XM7pbI12sv~64wWuweTv232F1Rux! z|88U5g4^M8%zS#SYq=FMoIg7)pXth)D1@}0c4)QR$AgdL&o2(dZ&2F2{u8v~z8Kd} z3x}6GEf~p{)HSF#!2%yiE#VFm`$?WlZ&Yjs2XYFPzondD&BH%~AoIua*61qB>3(rM(`hwxlXX-I!wf1Pa|2WMgB#IS{CU_!VQE@} z3>BH-#)_`v!{|bm02ovJ)~KAuX}%EkEgv>;B)@I=Lv<)y93bRx|CiRKn_SG)XFoj0 z4`^Ehahf|7{O0;K900u%O!-`x7=$xNyU%>}!3tGrCYu$6T_qpxovfVg=tobLE}(wE z!2TGek2wY4$l7~cnsOVO4y7U3lz_#9$`{lR!T4a<+Zs1{H<3@83$N57<-*=hZiyrcje7l4d6T5Hdr!2 zEKPY857K6N;Fs28hD%&TdMgH29yhbnW8m76l3AoI9&K=?TORBIfiN`z7v;il zI%uYWKMhzeL4uELRuAvPFZ(tVWc#e*`a&WRn|SI*fwBv4MenqIOsqF*om zz`P5fevm2hf;p3L_60geqR89ZsO%x3{Aox`#)d?kekhL&dZ*sJVi>)db(@SG*M6bp zLL0y(Q?d9$LWb^%0G;l}Q%-EdR0-};KEl={ENswuOFF-O1rkm21T$dbG>Ns*o{ACZ zf7@TJT^_TkBDSrlLgNn^~ncPrW<|l76aO$bOwg$ zu`C63I!4jMIY=FcaWilVe7o`*ZC9mIE26ssd+0b5lTJL;qVvZeK-_wb<_m0{DGAoC zd!Z>cH9X2HQY5i>+Z9>^R6je@#^M&R66U31o~cR)`rWmuT+Lw>uKsbev9hI(B`9dV z6d0^(LN8$PY+MB1d>ezl?mt?sUN@e{C!=#PI#Ks+7^`MO^|>cuc(tjSBf5U?zHeh|HcGt8RxO3neLJuiww8miP*dr}=*T zq_<`vHb~!E;W?_iy%z}RiVxje7fNt{6t(y?*tBPD9JZk}&O`S{xSyCoRUa zo)528Ub!}qmN)%oLttDwj@;c}x8>726pZpJpaWq;I+ly(F##G0md%FIW^_Ig4RC0ic6NH;{9LSGVF$nRUG<--{-uY*n_Wwff;yI z-pVV=wCW+WVZQjJ4Q$E4D%HHdY(ZZTY9LZly$}KmI_y@TpRKF6SrEj zoz%PEjh=RiRra&I2%bYC2RoG4<0JCbIRgfi8t}(pY!23Pe`tfUf*eU_pM`I8B%$8j z-DjZs%RRY4qhk0kKXvI5S{bxH{>bnL|F#MS|K0_)meyA0Sm*?1>pXX+uHGBJHA%|F zUO&o`FuU!~D*E2hqu;R7HFycpKD?w0ods*wV&$WByU|O2>j!^BNEH#S>pG?sHlDre<>MEfOWkB(S6ZYAv4gkeA3b1FLJ{!8Qc zL&|DxfSEIz!?vmL0;Sz`|63r3b@{l)ABCUuCA{HThoR-C>;m~M zZTN8M)E0>ine^O^4kq z!BtQaYP5N40{XOPuja@lPyW|T_AZpn#xJm%nnB>gO(5kPL5IV*ZP>jc{B|LKrXQ`g z-w$rV;%&GS84Vk@NsJK zgEG^00ZB0v(HFLKhXfzvv;E7oB^C_?IMoF61kqVEb+?-X*v~Y4O#Uo)q(%-OU#4kuYLI zy(>QD?I(hH=iA~kIC4K;Rdvga_`%V`som+>fMMJBOK7pw#L}1kv1>410s;?VK?)b^ za;3Z&CVm68c!}5z*-A)vny55D_}WwjLHbh9=bs@9A-3|E&~I;jT2Q)o!ezx+J0p4>8-84ne)={< zhB?f)fSPVa}7YMgK*;;i^&LpwBB>#6b+o2QoG>#Z|Z z-?_<0^SS1+3OWxKR$$IH-$d}8D5V1S^#c`b5{q#l$M1Z@8BhGkUCj2z4=~-TCA$d= zwys)eO83twP~5{GuPl4KH)_#H@P-pV2%vAToyuJ&?@~c9k(UG;Z8-FXI}#~DSCB6) zTEMD#$z3s7U^akD9AAv0(^OnAEI1>1M|^@gXR)oncE6z{2@)`?#+M!siE}uv3ziHn z+wgU>JnOP6?aaoW6BPZ&i9Op;D=coS4!Z!dvW;?HucSTLoI1hC#PO_VPW@ig9L1vd zY~e)-zMLBFG~P>VmJR)T$vU|aY`uc<9-fg6K28~*HD)w9kiEDUp?=`(NWx0Ei-q;gp7VCBmw?m}zK{d!erlH(^xzczQyN(5{PES{~ z{HiORC=I2>u=P52uJf!qP2q;=l+#o_w3h&=81y0btQ(NS-PY$LLxTm&(maURx zy|!VGnXB$*3U+Ple|lN-O0q#{nquGJP^i*5=3d7z+R3m$y#f}#!HnLjn{p?)zJfJ> z`yY(3;giII9rs?M!N<#Gux!BGk@VQg6j>MO_5nK~KT)rU*UeU&^a`TAVWB{Z%E+fO zdM0w7@0WAVtmVi5aEQg?@Sfyw_p@B9TO}HO*c8XdiXz*Sp z&gzhI%uzqS5DsgX3?bZLF{YBA&u<4COaH${zB4R}ik<-zVmQH!V!#B5+5(DVMg`p+un*Yj5m6DtDP}wqVvgYNygM+xHUH=T z<$Zo1UO(`lO?RcPs_E*ksy6NK1tHoMq`p<6qhkCnx(wgYzN*|oZ)2-3;37ZH=XGns z$8m-g2lY7MOS{=@xbudx<_Q)0AD(JXL3CfFBf^{g(+nvt14ZNZi?wZ}@td^ADPbOb z&>yi})4>RSHmUvrZdp;|yh^x}9RQ#3sm9C!*)pOqVF0h?^x0*eQ=_=EBbTW9lJItn zxvb-*LF@E0-#h5Td$HV)Y%-Z);C)eh@o!;m^QtZjpG`QBii_k7l)4mt6q-)>iDo1E zfa7hEOYo4{20H#hn=rO@p1~0-&6wN{!LBJ~x4RGHiq_Qd&gGDFygg_&BT%_($D zyt%j?7qd)v_C;NpPu8GReQcsT*PGO{jGM7634gX=7PFO?+|m646ZBz9i)J!Ovy|w2 z9yW>wSUI56OW<%zDy)ECw#m*BJv!Eb?yr`MvvGYVfZBUU7k$D;UjM;W%_Wo8P7FNT z&kakX+MDh^KwO&=gBFqoYxpzkal+BZd$|Xv%)Y4~gp;}elqbbok@X~9 zmCcN;$P4FmVVc-QM!1YlxO8$*eJFQ_q}xg>A+Vy4vwDf2Ah1H%%8rR(7I6qI#))=J zE*m+l4>xe^T-wfJlaNSc-9Rwxikbna$mE7#>f-~~>W$q2m+Hb%pD~_2RTh6oaz}~6 zUIP5}eFk0Hp_k|b;Zgw3b6|oMuI|hUHHajzuWUSFd zHI+1fLH_Flfw_;tH6T%9IE~C-FO;;|iEN%*L7yzYk{EB7HC;&nA{wp+M2gkf5ff5T|^cW(tR?CA-t`dxX&f6DL7D|(OQo{%EX|Hjei#e^|izS@X(xQ{oJ z%=%ro63sjZQUAXV84S4Co2gOl47kSc{Yoi>P9pE-h#YZ{8oWZ$ z???I0H)6zT>{~s4qGq)*SB8;sIQ#4h?%!GD}OR`gmpmB%;!4hm@9-K@vaoatU3r^Aq*Y8U=wu+F;O|i?(a{6K>U25UZOcx43zU;`O&Fb;uF6WKN1~*7U_w_~8 zv)~>58`4C!VW=5|zC5c#e7%Q{5t*)eK2XaV2C&}v-_#^_SYY_4%8cH}b<$9NemC*; zB5Ogj8 zLAx_EOuRvq;S7<<8u9C4AT0kS{l%Cw6m7)n2$*^9Lz;GQjhXl~rV`D=4G~Ot^X@Bl z@}I4v#mC<~@Q(;4PtjK9CCqvA9_8br;Xp#|v|gO^P)pIhZ2>&cwG0Q-?Dkbd;8 z#>Gf0KEV|ufU1_?Cg_JPex$nePzjlOjUy!2X?O4gbsN2lu8nWcMdOrF0IXq)EqAw< zzgX$bqj+3B3RVtg@~Lx*N=)__5CmtVm|XL1ci*ex#RxIQwH;m`$;@Fb-fl5$tv8`x zu!eravM7KQ_w+>Bw{Ah)yY_Pa8;*(sXE`InS=?kN(+tCDQ9z|b+(dNx!2!*|>-|NM z1Vu}>_n&o>pu^i5+g^dfK|fL)BaN-~I_XqTX0 z+HlS{vOBpO%aoh2`D@C`D%%efJ*HuPG0uwvG#(ZfKEZdwxoXy!?~N1Vfu)GEFOc|< z6=Np3L`HwM^vo{(U=vJOn@E_oLMxaYNZrV z;q>XS(cvv#=tbvN;p&zC5Kpt@0y>W;3=XEcIM1I8H91nw9f}-MB6ppl@kEla|jf5&le7BX68E z55(}pv`y>v#|~}CWFHO=Ezt9n%`#l#=VlxE>|E6aUeD4~7^rlLcRH^wyf?Wbdf<=B z$JlNW0E^i1Ui%Vy+N|E_$C;CgMGQnhsgX)LZdMXaezQta-Bg%n8(1fJKOi*U>28%8 zH>85lbVQaWNyswB9ywk2K#CsA;gvaP3Has>_pSI_l^(p3^jRu-)QTnEbW+k9YWXEQ z@EuNB1_0eiS7cosEwXd>2&;(Ia!DK+`%;9%9}P6V2vawbwnBm)5YfqZUV)uYm)J4f zJyNk!Iy@WaPc{lc#}FCDm@Ik`^Qxb6@gpRBGrhF?oVYi9S$`1dWbYd;W)p{XOh04ht#vak#ZenzSJy>;>ngZrlpcjNDDoh|7J&M`8Dc2BOT8_^+{BB*-nlYnq1o!q?C$2QcijFGFtY z-f2^+M~RQIE(f%E+27{A{E>mW!|M|`W73erK+NslBUBhd|EWsiv|=dE+rdRV$!ctW z_z1~=T(9hfi*^G(b4{hzpEgm($wI2T-wkTnp!U?&(!;daYogu}=j?%5J+5ujys5XN z=*ejM0axq+_=N$h41S)4!u`+)u^TBalr;6(gg?~tGNuY3hlp(loCxzZq=9sx_|bBj{jUcNnIHSkKpVdiqYVJs%@}B^5^)xcK~S`4WR^ zFBaKbb~h9gt7CA)X0M)js>%0h6NVfcBj%By6JVo?dG`_x7cvHL4={TY&PDGp2cj1~ zTad@I?ai45>RMfvUT;UucT%!*%oPjP~JHJ)9}rI$H>? zY#8?r@8IEda&SZ`v_hSRPOTlTeMPEyNrZKihiU_U{a5Ik8ZWltsB+lFmbmWR%6~o! zjs`n%B55fH4O2KD-6*(R&~PO`!fcS9J9L0}7r#EsbXQdW zo}-Uz+N4xtwgx1=r<6qhhl34>rDXYa5=Rt8E&pcIOQGUx{T(^fp$Aj~L zV&mgG^v0AV)FkUFF2v~k@qKmI-bb> zkd$n{MI+s36oalFvxJSwxh6^N&V3c1HIy^`X9U!iE3bnqpN!+K1KOD9YIzz7B4%aZ^uJ1Yf0r!XR-!cBzM1=Q23n=t%^xu?vQ< zCcIwqj8)TB+MM;f(EA1_YJ+t*ByoM5sfpj6Cybo_T=NjiZo-hG`!ckgIfEwct)~z+ z-2`AMP0uU&xyKDXG^=PZNxLaoozxC7SUKszFd9*kqgiu%us9Yg zZo^7vKTBSDyO*wPM>ORtTNXOHhBGQL;Db`MoC)JAGoWIpN-_yC${h&IO-`Zb@k4o zsvg}0tHm1e3@&;KsGY8_L!+MU)OON_iocMcCdr>hYi9AybB1xRmu=>aal;E(X}Y

v*7(aFW=)l0H$}W_SwX zxdL>SM#H(a^)-A9x;Ve2Q~GZb9=|A~Z*lb-AmMCL8E>*{5XVFeR<*;4Z^3?ESL{Yn zS+?kN`(ENV67^2nn$vrmgl@lNq1)BnXev(s0773ra~!JcXTjxUr;y7QEqug+)Al|poMI1> zULD%TyN$HwuFK}~nON-rj5H56hJ@D&AuB8n-nSDSfZf`6dHhVB!e@MWJZDd$9Dhcv zSlaNN&hmHckA~B4hH#ei`vJ<+lT)ZCBU^^gX_;gBtbo-X&+w& z``if*5bsV7&_BoN?jR_kRz~wrBf)%f8BN5k?m%+C13^fZ$O!kN zInPW*#(VsX&?E+eaR*O%Gutf8ZdV#v! z?R!R0&i2-n-{YwnPWJ-BHas-pxOsBA_0MsJhzR!_Wmi( zqx#5wW#(g6`?z|m#p%g6d6L~%eoJOHXicepct)v;%1%Adjf^qLakbmo~8GHd!ilbe#`7PK}1M(Mi zT}A7c3u!egpb`?Lk;qkc@53)Rv9!Np;dt&MNz(od7LvkA(=WdeE$_^FIev)5-fF`Q4wTR}%vCE;D-058TsBG^S;$9audC=nbptDq1Oy&@wMQ z+D#INNc2vh+L<4*eFVRJTmrX-q=o(zz3D@xrBz+uq1@r+f*CZtsmFQYV9Lfd!|2o7 z0(xgsKquqGVe(wF>zPV^Tj*##`8rH~?iWJk=+M25^>PaMMlKibRd!<=RldqO&)y{tyUK4e?{J%=<8rR4l znekD@K;z-UhjdHt0Ax28BaYN(%HdUWA=yKpR$6iqUDc=~G(eNQ zxBa#)K65hMxr;Go`~s4`RgzKTwob~D2MPMX1+7R=^0MTR8G3nSDS!FQwo|nQZBQWM zvRxYMH1&|)f7Bb#z7M{jbW*%aUIQVT&wRQ{pC|mMY&3$j{sJ)Xt!bAG$uR*msw5&EYumBlRcb z$05DDDxUsgG!{A4`a%j$W+||#Sk|(hu2lAebnjT5+==ba;wszBHQKD)M}iSa*Gc?L zj18f0V-C>CezTzqmaI%ZK&A-rKaWoH8~cyPLFHg6&x12)T8Ik18V}3m$*lcd8}8W0 zj%bWdtSlgLr{(Ynzr0};C0Bhpt;rR12`5zo{S%iS5>9N<)5NR$(NdzUlEa0-+jC24 z`9**3>D!yoTB(J~;WRWaM1cybyu^(qo2e;@s*$$4ZpbZa+}#JwQtm{1*H@gA!;dNa Mn30Neis=*n2lu0>fB*mh diff --git a/models_src/ch_outlaw.mdl b/models_src/ch_outlaw.mdl index f3d78588041729450696b67dc85d709e414b5ffe..29609e767f25a00932614718282ec5ff70bb017b 100644 GIT binary patch delta 27983 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 Y_wL5~@4m#Y#?udo=rEpJ$|N5Ce+&d13;+NC delta 27824 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 diff --git a/player.h b/player.h index 2325f72..0e92f3a 100644 --- a/player.h +++ b/player.h @@ -194,17 +194,28 @@ VG_STATIC struct gplayer struct ragdoll_part { u32 bone_id; - v3f offset; + //v3f offset; + + /* Collider transform relative to bone */ + m4x3f collider_mtx, + inv_collider_mtx; u32 use_limits; v3f limits[2]; rigidbody rb; u32 parent; + u32 colour; } ragdoll[32]; u32 ragdoll_count; + rb_constr_pos position_constraints[32]; + u32 position_constraints_count; + + rb_constr_swingtwist cone_constraints[32]; + u32 cone_constraints_count; + int shoes[2]; } mdl; @@ -241,6 +252,8 @@ VG_STATIC void player_mouseview(void); * Events * ----------------------------------------------------------------------------- */ +VG_STATIC int kill_player( int argc, char const *argv[] ); +VG_STATIC int reset_player( int argc, char const *argv[] ); VG_STATIC void player_init(void) /* 1 */ { @@ -364,11 +377,51 @@ VG_STATIC void player_init(void) /* 1 */ .persistent = 1 }); + vg_convar_push( (struct vg_convar){ + .name = "k_ragdoll_limit_scale", + .data = &k_ragdoll_limit_scale, + .data_type = k_convar_dtype_f32, + .opt_f32 = { .clamp = 0 }, + .persistent = 1 + }); + + vg_convar_push( (struct vg_convar){ + .name = "k_ragdoll_div", + .data = &k_ragdoll_div, + .data_type = k_convar_dtype_i32, + .opt_i32 = { .clamp=0 }, + .persistent = 1 + }); + + vg_convar_push( (struct vg_convar){ + .name = "k_ragdoll_debug_collider", + .data = &k_ragdoll_debug_collider, + .data_type = k_convar_dtype_i32, + .opt_i32 = { .clamp=0 }, + .persistent = 1 + }); + + vg_convar_push( (struct vg_convar){ + .name = "k_ragdoll_debug_constraints", + .data = &k_ragdoll_debug_constraints, + .data_type = k_convar_dtype_i32, + .opt_i32 = { .clamp=0 }, + .persistent = 1 + }); + vg_function_push( (struct vg_cmd){ .name = "reset", .function = reset_player }); + vg_function_push( (struct vg_cmd){ + .name = "kill", + .function = kill_player + }); + + /* HACK */ + rb_register_cvar(); + player.rewind_length = 0; player.rewind_buffer = vg_linear_alloc( vg_mem.rtmemory, diff --git a/player_animation.h b/player_animation.h index 98aa256..08a5405 100644 --- a/player_animation.h +++ b/player_animation.h @@ -30,7 +30,6 @@ VG_STATIC void player_animate_offboard(void) mdl_keyframe apose[32], bpose[32]; struct skeleton *sk = &player.mdl.sk; - if( player.walk > 0.025f ) { /* TODO move */ @@ -88,6 +87,8 @@ VG_STATIC void player_animate(void) { struct player_phys *phys = &player.phys; rb_extrapolate_transform( &player.phys.rb, player.visual_transform ); + v3_muladds( player.visual_transform[3], phys->rb.up, -0.2f, + player.visual_transform[3] ); v4f qfake_rot; m3x3f fake_rot; diff --git a/player_physics.h b/player_physics.h index a2aabff..6a744e8 100644 --- a/player_physics.h +++ b/player_physics.h @@ -1366,6 +1366,12 @@ VG_STATIC void player_freecam(void) v3_add( move_vel, player.camera_pos, player.camera_pos ); } +VG_STATIC int kill_player( int argc, char const *argv[] ) +{ + player_kill(); + return 0; +} + VG_STATIC int reset_player( int argc, char const *argv[] ) { struct player_phys *phys = &player.phys; @@ -1428,10 +1434,12 @@ VG_STATIC int reset_player( int argc, char const *argv[] ) v3f delta = {1.0f,0.0f,0.0f}; m3x3_mulv( the_long_way, delta, delta ); - - player.angles[0] = atan2f( delta[0], -delta[2] ); - player.angles[1] = -asinf( delta[1] ); - + + if( !freecam ) + { + player.angles[0] = atan2f( delta[0], -delta[2] ); + player.angles[1] = -asinf( delta[1] ); + } v4_copy( rp->q, phys->rb.q ); v3_copy( rp->co, phys->rb.co ); diff --git a/player_ragdoll.h b/player_ragdoll.h index 6193bf7..0e48f0c 100644 --- a/player_ragdoll.h +++ b/player_ragdoll.h @@ -4,7 +4,94 @@ #include "player.h" VG_STATIC float k_ragdoll_floatyiness = 20.0f, - k_ragdoll_floatydrag = 1.0f; + k_ragdoll_floatydrag = 1.0f, + k_ragdoll_limit_scale = 1.0f; + +VG_STATIC int k_ragdoll_div = 1, + ragdoll_frame = 0, + k_ragdoll_debug_collider = 1, + k_ragdoll_debug_constraints = 0; + +VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone, + struct ragdoll_part *rp ) +{ + m4x3_identity( rp->collider_mtx ); + + if( bone->flags & k_bone_flag_collider_box ) + { + v3f delta; + v3_sub( bone->hitbox[1], bone->hitbox[0], delta ); + v3_muls( delta, 0.5f, delta ); + v3_add( bone->hitbox[0], delta, rp->collider_mtx[3] ); + + v3_copy( delta, rp->rb.bbx[1] ); + v3_muls( delta, -1.0f, rp->rb.bbx[0] ); + + q_identity( rp->rb.q ); + rp->rb.type = k_rb_shape_box; + rp->colour = 0xffcccccc; + } + else if( bone->flags & k_bone_flag_collider_capsule ) + { + v3f v0, v1, tx, ty; + v3_sub( bone->hitbox[1], bone->hitbox[0], v0 ); + + int major_axis = 0; + float largest = -1.0f; + + for( int i=0; i<3; i ++ ) + { + if( fabsf( v0[i] ) > largest ) + { + largest = fabsf( v0[i] ); + major_axis = i; + } + } + + v3_zero( v1 ); + v1[ major_axis ] = 1.0f; + rb_tangent_basis( v1, tx, ty ); + + float r = (fabsf(v3_dot(tx,v0)) + fabsf(v3_dot(ty,v0))) * 0.25f, + l = fabsf(v0[ major_axis ]); + + /* orientation */ + v3_muls( tx, -1.0f, rp->collider_mtx[0] ); + v3_muls( v1, -1.0f, rp->collider_mtx[1] ); + v3_muls( ty, -1.0f, rp->collider_mtx[2] ); + v3_add( bone->hitbox[0], bone->hitbox[1], rp->collider_mtx[3] ); + v3_muls( rp->collider_mtx[3], 0.5f, rp->collider_mtx[3] ); + + rp->rb.type = k_rb_shape_capsule; + rp->rb.inf.capsule.height = l; + rp->rb.inf.capsule.radius = r; + + rp->colour = 0xff000000 | (0xff << (major_axis*8)); + } + else + vg_fatal_exit_loop( "Invalid bone collider type" ); + + m4x3_invert_affine( rp->collider_mtx, rp->inv_collider_mtx ); + + /* Position collider into rest */ + m3x3_q( rp->collider_mtx, rp->rb.q ); + v3_add( rp->collider_mtx[3], bone->co, rp->rb.co ); + rp->rb.is_world = 0; + rb_init( &rp->rb ); +} + +/* + * Get parent index in the ragdoll + */ +VG_STATIC u32 ragdoll_bone_parent( struct player_model *mdl, u32 bone_id ) +{ + for( u32 j=0; jragdoll_count; j++ ) + if( mdl->ragdoll[ j ].bone_id == bone_id ) + return j; + + vg_fatal_exit_loop( "Referenced parent bone does not have a rigidbody" ); + return 0; +} /* * Setup ragdoll colliders @@ -21,54 +108,82 @@ VG_STATIC void player_init_ragdoll(void) } mdl->ragdoll_count = 0; + mdl->position_constraints_count = 0; + mdl->cone_constraints_count = 0; for( u32 i=0; isk.bone_count; i ++ ) { struct skeleton_bone *bone = &mdl->sk.bones[i]; - - if( bone->collider ) - { - if( mdl->ragdoll_count > vg_list_size(player.mdl.ragdoll) ) - vg_fatal_exit_loop( "Playermodel has too many colliders" ); - struct ragdoll_part *rp = &mdl->ragdoll[ mdl->ragdoll_count ++ ]; - rp->bone_id = i; - - v3f delta; - v3_sub( bone->hitbox[1], bone->hitbox[0], delta ); - v3_muls( delta, 0.5f, delta ); + /* + * Bones with colliders + */ + if( !(bone->flags & k_bone_flag_collider_any) ) + continue; - v3_add( bone->hitbox[0], delta, rp->offset ); + if( mdl->ragdoll_count > vg_list_size(player.mdl.ragdoll) ) + vg_fatal_exit_loop( "Playermodel has too many colliders" ); - v3_copy( delta, rp->rb.bbx[1] ); - v3_muls( delta, -1.0f, rp->rb.bbx[0] ); + struct ragdoll_part *rp = &mdl->ragdoll[ mdl->ragdoll_count ++ ]; + rp->bone_id = i; + rp->parent = 0xffffffff; - q_identity( rp->rb.q ); - v3_add( bone->co, rp->offset, rp->rb.co ); - rp->rb.type = k_rb_shape_box; - rp->rb.is_world = 0; - rp->parent = 0xffffffff; + player_init_ragdoll_bone_collider( bone, rp ); + + struct mdl_node *pnode = mdl_node_from_id( src, bone->orig_node ); + struct classtype_bone *inf = mdl_get_entdata( src, pnode ); + + /* + * Bones with collider and parent + */ + if( !bone->parent ) + continue; - if( bone->parent ) - { - for( u32 j=0; jragdoll_count; j++ ) - { - if( mdl->ragdoll[ j ].bone_id == bone->parent ) - { - rp->parent = j; - break; - } - } - } + rp->parent = ragdoll_bone_parent( mdl, bone->parent ); + + /* Always assign a point-to-point constraint */ + struct rb_constr_pos *c = + &mdl->position_constraints[ mdl->position_constraints_count ++ ]; + + struct skeleton_bone *bj = &mdl->sk.bones[rp->bone_id]; + struct ragdoll_part *pp = &mdl->ragdoll[rp->parent]; + struct skeleton_bone *bp = &mdl->sk.bones[pp->bone_id]; + + /* Convention: rba -- parent, rbb -- child */ + c->rba = &pp->rb; + c->rbb = &rp->rb; + + v3f delta; + v3_sub( bj->co, bp->co, delta ); + m4x3_mulv( rp->inv_collider_mtx, (v3f){0.0f,0.0f,0.0f}, c->lcb ); + m4x3_mulv( pp->inv_collider_mtx, delta, c->lca ); + + if( inf->flags & k_bone_flag_cone_constraint ) + { + struct rb_constr_swingtwist *a = + &mdl->cone_constraints[ mdl->cone_constraints_count ++ ]; + a->rba = &pp->rb; + a->rbb = &rp->rb; + a->conet = cosf( inf->conet )-0.0001f; + + /* Store constraint in local space vectors */ + m3x3_mulv( c->rba->to_local, inf->conevx, a->conevx ); + m3x3_mulv( c->rba->to_local, inf->conevy, a->conevy ); + m3x3_mulv( c->rbb->to_local, inf->coneva, a->coneva ); + v3_copy( c->lca, a->view_offset ); - struct mdl_node *pnode = mdl_node_from_id( src, bone->orig_node ); - struct classtype_bone *bone_inf = mdl_get_entdata( src, pnode ); + v3_cross( inf->coneva, inf->conevy, a->conevxb ); + m3x3_mulv( c->rbb->to_local, a->conevxb, a->conevxb ); - rp->use_limits = bone_inf->use_limits; - v3_copy( bone_inf->angle_limits[0], rp->limits[0] ); - v3_copy( bone_inf->angle_limits[1], rp->limits[1] ); + v3_normalize( a->conevxb ); + v3_normalize( a->conevx ); + v3_normalize( a->conevy ); + v3_normalize( a->coneva ); - rb_init( &rp->rb ); + a->conevx[3] = v3_length( inf->conevx ); + a->conevy[3] = v3_length( inf->conevy ); + + rp->use_limits = 1; } } } @@ -85,8 +200,8 @@ VG_STATIC void player_model_copy_ragdoll(void) struct ragdoll_part *part = &mdl->ragdoll[i]; m4x3f offset; m3x3_identity(offset); - v3_negate( part->offset, offset[3] ); - m4x3_mul( part->rb.to_world, offset, mdl->sk.final_mtx[part->bone_id] ); + m4x3_mul( part->rb.to_world, part->inv_collider_mtx, + mdl->sk.final_mtx[part->bone_id] ); } skeleton_apply_inverses( &mdl->sk ); @@ -105,11 +220,15 @@ VG_STATIC void player_ragdoll_copy_model( v3f v ) v3f pos, offset; u32 bone = part->bone_id; - + m4x3_mulv( mdl->sk.final_mtx[bone], mdl->sk.bones[bone].co, pos ); - m3x3_mulv( mdl->sk.final_mtx[bone], part->offset, offset ); + m3x3_mulv( mdl->sk.final_mtx[bone], part->collider_mtx[3], offset ); v3_add( pos, offset, part->rb.co ); - m3x3_q( mdl->sk.final_mtx[bone], part->rb.q ); + + m3x3f r; + m3x3_mul( mdl->sk.final_mtx[bone], part->collider_mtx, r ); + m3x3_q( r, part->rb.q ); + v3_copy( v, part->rb.v ); v3_zero( part->rb.w ); @@ -123,9 +242,6 @@ VG_STATIC void player_ragdoll_copy_model( v3f v ) VG_STATIC void player_debug_ragdoll(void) { struct player_model *mdl = &player.mdl; - - for( u32 i=0; iragdoll_count; i ++ ) - rb_debug( &mdl->ragdoll[i].rb, 0xff00ff00 ); } /* @@ -134,84 +250,99 @@ VG_STATIC void player_debug_ragdoll(void) VG_STATIC void player_ragdoll_iter(void) { struct player_model *mdl = &player.mdl; - rb_solver_reset(); + int run_sim = 0; + ragdoll_frame ++; + + if( ragdoll_frame >= k_ragdoll_div ) + { + ragdoll_frame = 0; + run_sim = 1; + } + + rb_solver_reset(); for( int i=0; iragdoll_count; i ++ ) rb_collide( &mdl->ragdoll[i].rb, &world.rb_geo ); + /* + * COLLISION DETECTION + */ + for( int i=0; iragdoll_count-1; i ++ ) + { + for( int j=i+1; jragdoll_count; j ++ ) + { + if( mdl->ragdoll[j].parent != i ) + rb_collide( &mdl->ragdoll[i].rb, &mdl->ragdoll[j].rb ); + } + } + + /* + * PRESOLVE + */ rb_presolve_contacts( rb_contact_buffer, rb_contact_count ); + rb_presolve_swingtwist_constraints( mdl->cone_constraints, + mdl->cone_constraints_count ); + + /* + * DEBUG + */ + if( k_ragdoll_debug_collider ) + { + for( u32 i=0; iragdoll_count; i ++ ) + rb_debug( &mdl->ragdoll[i].rb, mdl->ragdoll[i].colour ); + } - v3f rv; + if( k_ragdoll_debug_constraints ) + { + rb_debug_position_constraints( mdl->position_constraints, + mdl->position_constraints_count ); + + rb_debug_swingtwist_constraints( mdl->cone_constraints, + mdl->cone_constraints_count ); + } #if 0 - float shoe_vel[2] = {0.0f,0.0f}; - for( int i=0; i<2; i++ ) - if( mdl->shoes[i] ) - shoe_vel[i] = v3_length( mdl->ragdoll[i].rb.v ); -#endif - for( int j=0; jragdoll_count; j++ ) { struct ragdoll_part *pj = &mdl->ragdoll[j]; struct skeleton_bone *bj = &mdl->sk.bones[pj->bone_id]; - if( pj->parent != 0xffffffff ) + if( run_sim ) { - struct ragdoll_part *pp = &mdl->ragdoll[pj->parent]; - struct skeleton_bone *bp = &mdl->sk.bones[pp->bone_id]; - - v3f lca, lcb; - v3_negate( pj->offset, lca ); - v3_add( bp->co, pp->offset, lcb ); - v3_sub( bj->co, lcb, lcb ); - - rb_debug_constraint_position( &pj->rb, lca, &pp->rb, lcb ); - - if( pj->use_limits ) - { - rb_debug_constraint_limits( &pj->rb, &pp->rb, lca, pj->limits ); - } + v4f plane = {0.0f,1.0f,0.0f,0.0f}; + rb_effect_simple_bouyency( &pj->rb, plane, k_ragdoll_floatyiness, + k_ragdoll_floatydrag ); } - - v4f plane = {0.0f,1.0f,0.0f,0.0f}; - rb_effect_simple_bouyency( &pj->rb, plane, k_ragdoll_floatyiness, - k_ragdoll_floatydrag ); } +#endif - /* CONSTRAINTS */ - for( int i=0; i<10; i++ ) + /* + * SOLVE CONSTRAINTS + */ + if( run_sim ) { - rb_solve_contacts( rb_contact_buffer, rb_contact_count ); - - for( int j=0; jragdoll_count; j++ ) + for( int i=0; i<25; i++ ) { - struct ragdoll_part *pj = &mdl->ragdoll[j]; - struct skeleton_bone *bj = &mdl->sk.bones[pj->bone_id]; + rb_solve_contacts( rb_contact_buffer, rb_contact_count ); + rb_solve_swingtwist_constraints( mdl->cone_constraints, + mdl->cone_constraints_count ); + rb_solve_position_constraints( mdl->position_constraints, + mdl->position_constraints_count ); + } - if( (pj->parent != 0xffffffff) && pj->use_limits ) - { - struct ragdoll_part *pp = &mdl->ragdoll[pj->parent]; - struct skeleton_bone *bp = &mdl->sk.bones[pp->bone_id]; + for( int i=0; iragdoll_count; i++ ) + rb_iter( &mdl->ragdoll[i].rb ); - v3f lca, lcb; - v3_negate( pj->offset, lca ); - v3_add( bp->co, pp->offset, lcb ); - v3_sub( bj->co, lcb, lcb ); + for( int i=0; iragdoll_count; i++ ) + rb_update_transform( &mdl->ragdoll[i].rb ); - rb_constraint_position( &pj->rb, lca, &pp->rb, lcb ); + rb_correct_swingtwist_constraints( mdl->cone_constraints, + mdl->cone_constraints_count, 0.25f ); - rb_constraint_limits( &pj->rb, lca, &pp->rb, lcb, pj->limits ); - } - } + rb_correct_position_constraints( mdl->position_constraints, + mdl->position_constraints_count, 0.5f ); } - /* INTEGRATION */ - for( int i=0; iragdoll_count; i++ ) - rb_iter( &mdl->ragdoll[i].rb ); - - /* SHOES */ - for( int i=0; iragdoll_count; i++ ) - rb_update_transform( &mdl->ragdoll[i].rb ); } #endif /* PLAYER_RAGDOLL_H */ diff --git a/rigidbody.h b/rigidbody.h index aa8d4f8..f4d6ef9 100644 --- a/rigidbody.h +++ b/rigidbody.h @@ -10,7 +10,6 @@ #include "common.h" #include "bvh.h" #include "scene.h" -#include "distq.h" #include @@ -29,14 +28,41 @@ VG_STATIC bh_system bh_system_rigidbodies; VG_STATIC const float k_rb_rate = (1.0/VG_TIMESTEP_FIXED), k_rb_delta = (1.0/k_rb_rate), - k_friction = 0.6f, - k_damp_linear = 0.05f, /* scale velocity 1/(1+x) */ + k_friction = 0.4f, + k_damp_linear = 0.1f, /* scale velocity 1/(1+x) */ k_damp_angular = 0.1f, /* scale angular 1/(1+x) */ + k_penetration_slop = 0.01f, + k_inertia_scale = 8.0f, + k_phys_baumgarte = 0.2f; + +VG_STATIC float k_limit_bias = 0.02f, - k_joint_bias = 0.08f, /* positional joints */ k_joint_correction = 0.01f, - k_penetration_slop = 0.01f, - k_inertia_scale = 4.0f; + k_joint_impulse = 1.0f, + k_joint_bias = 0.08f; /* positional joints */ + +VG_STATIC void rb_register_cvar(void) +{ + vg_convar_push( (struct vg_convar){ + .name = "k_limit_bias", .data = &k_limit_bias, + .data_type = k_convar_dtype_f32, .opt_f32 = {.clamp = 0}, .persistent = 1 + }); + + vg_convar_push( (struct vg_convar){ + .name = "k_joint_bias", .data = &k_joint_bias, + .data_type = k_convar_dtype_f32, .opt_f32 = {.clamp = 0}, .persistent = 1 + }); + + vg_convar_push( (struct vg_convar){ + .name = "k_joint_correction", .data = &k_joint_correction, + .data_type = k_convar_dtype_f32, .opt_f32 = {.clamp = 0}, .persistent = 1 + }); + + vg_convar_push( (struct vg_convar){ + .name = "k_joint_impulse", .data = &k_joint_impulse, + .data_type = k_convar_dtype_f32, .opt_f32 = {.clamp = 0}, .persistent = 1 + }); +} /* * ----------------------------------------------------------------------------- @@ -112,6 +138,30 @@ VG_STATIC struct contact rb_contact_buffer[256]; VG_STATIC int rb_contact_count = 0; +typedef struct rb_constr_pos rb_constr_pos; +typedef struct rb_constr_swingtwist rb_constr_swingtwist; + +struct rb_constr_pos +{ + rigidbody *rba, *rbb; + v3f lca, lcb; +}; + +struct rb_constr_swingtwist +{ + rigidbody *rba, *rbb; + + v4f conevx, conevy; /* relative to rba */ + v3f view_offset, /* relative to rba */ + coneva, conevxb;/* relative to rbb */ + + int tangent_violation, axis_violation; + v3f axis, tangent_axis, tangent_target, axis_target; + + float conet; + float tangent_mass, axis_mass; +}; + /* * ----------------------------------------------------------------------------- * Math Utils @@ -155,8 +205,8 @@ VG_STATIC void rb_debug_contact( rb_ct *ct ) if( ct->type != k_contact_type_disabled ) { v3f p1; - v3_muladds( ct->co, ct->n, 0.1f, p1 ); - vg_line_pt3( ct->co, 0.025f, 0xff0000ff ); + v3_muladds( ct->co, ct->n, 0.05f, p1 ); + vg_line_pt3( ct->co, 0.0025f, 0xff0000ff ); vg_line( ct->co, p1, 0xffffffff ); } } @@ -397,8 +447,8 @@ VG_STATIC void rb_init( rigidbody *rb ) h = rb->inf.capsule.height; volume = sphere_volume( r ) + VG_PIf * r*r * (h - r*2.0f); - v3_fill( rb->bbx[0], -rb->inf.sphere.radius ); - v3_fill( rb->bbx[1], rb->inf.sphere.radius ); + v3_fill( rb->bbx[0], -r ); + v3_fill( rb->bbx[1], r ); rb->bbx[0][1] = -h; rb->bbx[1][1] = h; } @@ -778,7 +828,7 @@ struct capsule_manifold * on the oriented object which created this pair. */ VG_STATIC void rb_capsule_manifold( v3f pa, v3f pb, float t, float r, - capsule_manifold *manifold ) + capsule_manifold *manifold ) { v3f delta; v3_sub( pa, pb, delta ); @@ -911,6 +961,9 @@ VG_STATIC int rb_capsule_sphere( rigidbody *rba, rigidbody *rbb, rb_ct *buf ) VG_STATIC int rb_capsule_capsule( rigidbody *rba, rigidbody *rbb, rb_ct *buf ) { + if( !box_overlap( rba->bbx_world, rbb->bbx_world ) ) + return 0; + float ha = rba->inf.capsule.height, hb = rbb->inf.capsule.height, ra = rba->inf.capsule.radius, @@ -1483,10 +1536,147 @@ VG_STATIC int rb_box_scene( rigidbody *rba, rigidbody *rbb, rb_ct *buf ) return count; } +/* + * Generates up to two contacts; optimised for the most stable manifold + */ +VG_STATIC int rb_capsule_triangle( rigidbody *rba, rigidbody *rbb, + v3f tri[3], rb_ct *buf ) +{ + float h = rba->inf.capsule.height, + r = rba->inf.capsule.radius; + + v3f pc, p0w, p1w; + v3_muladds( rba->co, rba->up, -h*0.5f+r, p0w ); + v3_muladds( rba->co, rba->up, h*0.5f-r, p1w ); + + capsule_manifold manifold; + rb_capsule_manifold_init( &manifold ); + + v3f c0, c1; + closest_on_triangle_1( p0w, tri, c0 ); + closest_on_triangle_1( p1w, tri, c1 ); + + v3f d0, d1, da; + v3_sub( c0, p0w, d0 ); + v3_sub( c1, p1w, d1 ); + v3_sub( p1w, p0w, da ); + + v3_normalize(d0); + v3_normalize(d1); + v3_normalize(da); + + if( v3_dot( da, d0 ) <= 0.01f ) + rb_capsule_manifold( p0w, c0, 0.0f, r, &manifold ); + + if( v3_dot( da, d1 ) >= -0.01f ) + rb_capsule_manifold( p1w, c1, 1.0f, r, &manifold ); + + for( int i=0; i<3; i++ ) + { + int i0 = i, + i1 = (i+1)%3; + + v3f ca, cb; + float ta, tb; + closest_segment_segment( p0w, p1w, tri[i0], tri[i1], &ta, &tb, ca, cb ); + rb_capsule_manifold( ca, cb, ta, r, &manifold ); + } + + v3f v0, v1, n; + v3_sub( tri[1], tri[0], v0 ); + v3_sub( tri[2], tri[0], v1 ); + v3_cross( v0, v1, n ); + v3_normalize( n ); + + int count = rb_capsule_manifold_done( rba, rbb, &manifold, buf ); + for( int i=0; iinf.capsule.height, + r = rba->inf.capsule.radius, + g = 90.8f; + + v3f p[2]; + v3_muladds( rba->co, rba->up, -h*0.5f+r, p[0] ); + v3_muladds( rba->co, rba->up, h*0.5f-r, p[1] ); + + int count = 0; + + + for( int i=0; i<2; i++ ) + { + if( p[i][1] < g + r ) + { + rb_ct *ct = &buf[ count ++ ]; + + v3_copy( p[i], ct->co ); + ct->p = r - (p[i][1]-g); + ct->co[1] -= r; + v3_copy( (v3f){0.0f,1.0f,0.0f}, ct->n ); + ct->rba = rba; + ct->rbb = rbb; + ct->type = k_contact_type_default; + } + } + + return count; + +#else + scene *sc = rbb->inf.scene.bh_scene->user; + + bh_iter it; + bh_iter_init( 0, &it ); + int idx; + + int count = 0; + + while( bh_next( rbb->inf.scene.bh_scene, &it, rba->bbx_world, &idx ) ) + { + u32 *ptri = &sc->arrindices[ idx*3 ]; + v3f tri[3]; + + for( int j=0; j<3; j++ ) + v3_copy( sc->arrvertices[ptri[j]].co, tri[j] ); + + buf[ count ].element_id = ptri[0]; + +#if 0 + vg_line( tri[0],tri[1],0x70ff6000 ); + vg_line( tri[1],tri[2],0x70ff6000 ); + vg_line( tri[2],tri[0],0x70ff6000 ); +#endif + + int contact = rb_capsule_triangle( rba, rbb, tri, buf+count ); + count += contact; + + if( count == 16 ) + { + vg_warn("Exceeding capsule_vs_scene capacity. Geometry too dense!\n"); + return count; + } + } + + return count; +#endif +} + +VG_STATIC int rb_scene_capsule( rigidbody *rba, rigidbody *rbb, rb_ct *buf ) +{ + return rb_capsule_scene( rbb, rba, buf ); +} + VG_STATIC int RB_MATRIX_ERROR( rigidbody *rba, rigidbody *rbb, rb_ct *buf ) { +#if 0 vg_error( "Collision type is unimplemented between types %d and %d\n", rba->type, rbb->type ); +#endif return 0; } @@ -1516,8 +1706,8 @@ VG_STATIC int (*rb_jump_table[4][4])( rigidbody *a, rigidbody *b, rb_ct *buf ) = /* box */ /* Sphere */ /* Capsule */ /* Mesh */ { RB_MATRIX_ERROR, rb_box_sphere, rb_box_capsule, rb_box_scene }, { rb_sphere_box, rb_sphere_sphere, rb_sphere_capsule, rb_sphere_scene }, - { rb_capsule_box, rb_capsule_sphere, rb_capsule_capsule, RB_MATRIX_ERROR }, - { rb_scene_box, RB_MATRIX_ERROR, RB_MATRIX_ERROR, RB_MATRIX_ERROR } + { rb_capsule_box, rb_capsule_sphere, rb_capsule_capsule, rb_capsule_scene }, + { rb_scene_box, RB_MATRIX_ERROR, rb_scene_capsule, RB_MATRIX_ERROR } }; VG_STATIC int rb_collide( rigidbody *rba, rigidbody *rbb ) @@ -1619,21 +1809,15 @@ VG_STATIC void rb_presolve_contacts( rb_ct *buffer, int len ) } /* - * Creates relative contact velocity vector, and offsets between each body + * Creates relative contact velocity vector */ -VG_STATIC void rb_rcv( rb_ct *ct, v3f rv, v3f da, v3f db ) +VG_STATIC void rb_rcv( rigidbody *rba, rigidbody *rbb, v3f ra, v3f rb, v3f rv ) { - rigidbody *rba = ct->rba, - *rbb = ct->rbb; - - v3_sub( ct->co, rba->co, da ); - v3_sub( ct->co, rbb->co, db ); - v3f rva, rvb; - v3_cross( rba->w, da, rva ); - v3_add( rba->v, rva, rva ); - v3_cross( rbb->w, db, rvb ); - v3_add( rbb->v, rvb, rvb ); + v3_cross( rba->w, ra, rva ); + v3_add( rba->v, rva, rva ); + v3_cross( rbb->w, rb, rvb ); + v3_add( rbb->v, rvb, rvb ); v3_sub( rva, rvb, rv ); } @@ -1663,10 +1847,10 @@ VG_STATIC void rb_solve_contacts( rb_ct *buf, int len ) { struct contact *ct = &buf[i]; - rigidbody *rb = ct->rba; - - v3f rv, da, db; - rb_rcv( ct, rv, da, db ); + v3f rv, ra, rb; + v3_sub( ct->co, ct->rba->co, ra ); + v3_sub( ct->co, ct->rbb->co, rb ); + rb_rcv( ct->rba, ct->rbb, ra, rb, rv ); /* Friction */ for( int j=0; j<2; j++ ) @@ -1681,14 +1865,14 @@ VG_STATIC void rb_solve_contacts( rb_ct *buf, int len ) v3f impulse; v3_muls( ct->t[j], lambda, impulse ); - rb_linear_impulse( ct->rba, da, impulse ); + rb_linear_impulse( ct->rba, ra, impulse ); v3_muls( ct->t[j], -lambda, impulse ); - rb_linear_impulse( ct->rbb, db, impulse ); + rb_linear_impulse( ct->rbb, rb, impulse ); } /* Normal */ - rb_rcv( ct, rv, da, db ); + rb_rcv( ct->rba, ct->rbb, ra, rb, rv ); float vn = v3_dot( rv, ct->n ), lambda = ct->normal_mass * (-vn + ct->bias); @@ -1698,10 +1882,10 @@ VG_STATIC void rb_solve_contacts( rb_ct *buf, int len ) v3f impulse; v3_muls( ct->n, lambda, impulse ); - rb_linear_impulse( ct->rba, da, impulse ); + rb_linear_impulse( ct->rba, ra, impulse ); v3_muls( ct->n, -lambda, impulse ); - rb_linear_impulse( ct->rbb, db, impulse ); + rb_linear_impulse( ct->rbb, rb, impulse ); } } @@ -1711,220 +1895,468 @@ VG_STATIC void rb_solve_contacts( rb_ct *buf, int len ) * ----------------------------------------------------------------------------- */ -VG_STATIC void draw_angle_limit( v3f c, v3f major, v3f minor, - float amin, float amax, float measured, - u32 colour ) +VG_STATIC void rb_debug_position_constraints( rb_constr_pos *buffer, int len ) { - float f = 0.05f; - v3f ay, ax; - v3_muls( major, f, ay ); - v3_muls( minor, f, ax ); - - for( int x=0; x<16; x++ ) + for( int i=0; irba, *rbb = constr->rbb; + + v3f wca, wcb; + m3x3_mulv( rba->to_world, constr->lca, wca ); + m3x3_mulv( rbb->to_world, constr->lcb, wcb ); v3f p0, p1; - v3_muladds( c, ay, cosf(a0), p0 ); - v3_muladds( p0, ax, sinf(a0), p0 ); - v3_muladds( c, ay, cosf(a1), p1 ); - v3_muladds( p1, ax, sinf(a1), p1 ); + v3_add( wca, rba->co, p0 ); + v3_add( wcb, rbb->co, p1 ); + vg_line_pt3( p0, 0.0025f, 0xff000000 ); + vg_line_pt3( p1, 0.0025f, 0xffffffff ); + vg_line2( p0, p1, 0xff000000, 0xffffffff ); + } +} + +VG_STATIC void rb_presolve_swingtwist_constraints( rb_constr_swingtwist *buf, + int len ) +{ + float size = 0.12f; + + for( int i=0; irba->to_world, st->conevx, vx ); + m3x3_mulv( st->rbb->to_world, st->conevxb, vxb ); + m3x3_mulv( st->rba->to_world, st->conevy, vy ); + m3x3_mulv( st->rbb->to_world, st->coneva, va ); + m4x3_mulv( st->rba->to_world, st->view_offset, center ); + v3_cross( vy, vx, axis ); + + /* Constraint violated ? */ + float fx = v3_dot( vx, va ), /* projection world */ + fy = v3_dot( vy, va ), + fn = v3_dot( va, axis ), + + rx = st->conevx[3], /* elipse radii */ + ry = st->conevy[3], + + lx = fx/rx, /* projection local (fn==lz) */ + ly = fy/ry; + + st->tangent_violation = ((lx*lx + ly*ly) > fn*fn) || (fn <= 0.0f); + if( st->tangent_violation ) + { + /* Calculate a good position and the axis to solve on */ + v2f closest, tangent, + p = { fx/fabsf(fn), fy/fabsf(fn) }; + + closest_point_elipse( p, (v2f){rx,ry}, closest ); + tangent[0] = -closest[1] / (ry*ry); + tangent[1] = closest[0] / (rx*rx); + v2_normalize( tangent ); + + v3f v0, v1; + v3_muladds( axis, vx, closest[0], v0 ); + v3_muladds( v0, vy, closest[1], v0 ); + v3_normalize( v0 ); + + v3_muls( vx, tangent[0], v1 ); + v3_muladds( v1, vy, tangent[1], v1 ); + + v3_copy( v0, st->tangent_target ); + v3_copy( v1, st->tangent_axis ); + + /* calculate mass */ + v3f aIw, bIw; + m3x3_mulv( st->rba->iIw, st->tangent_axis, aIw ); + m3x3_mulv( st->rbb->iIw, st->tangent_axis, bIw ); + st->tangent_mass = 1.0f / (v3_dot( st->tangent_axis, aIw ) + + v3_dot( st->tangent_axis, bIw )); + + float angle = v3_dot( va, st->tangent_target ); + } + + v3f refaxis; + v3_cross( vy, va, refaxis ); /* our default rotation */ + v3_normalize( refaxis ); + + float angle = v3_dot( refaxis, vxb ); + st->axis_violation = fabsf(angle) < st->conet; - v3f p2; - v3_muladds( c, ay, cosf(measured)*1.2f, p2 ); - v3_muladds( p2, ax, sinf(measured)*1.2f, p2 ); - vg_line( c, p2, colour ); + if( st->axis_violation ) + { + v3f dir_test; + v3_cross( refaxis, vxb, dir_test ); + + if( v3_dot(dir_test, va) < 0.0f ) + st->axis_violation = -st->axis_violation; + + float newang = (float)st->axis_violation * acosf(st->conet-0.0001f); + + v3f refaxis_up; + v3_cross( va, refaxis, refaxis_up ); + v3_muls( refaxis_up, sinf(newang), st->axis_target ); + v3_muladds( st->axis_target, refaxis, -cosf(newang), st->axis_target ); + + /* calculate mass */ + v3_copy( va, st->axis ); + v3f aIw, bIw; + m3x3_mulv( st->rba->iIw, st->axis, aIw ); + m3x3_mulv( st->rbb->iIw, st->axis, bIw ); + st->axis_mass = 1.0f / (v3_dot( st->axis, aIw ) + + v3_dot( st->axis, bIw )); + } + } } -VG_STATIC void rb_debug_constraint_limits( rigidbody *ra, rigidbody *rb, v3f lca, - v3f limits[2] ) +VG_STATIC void rb_debug_swingtwist_constraints( rb_constr_swingtwist *buf, + int len ) { - v3f ax, ay, az, bx, by, bz; - m3x3_mulv( ra->to_world, (v3f){1.0f,0.0f,0.0f}, ax ); - m3x3_mulv( ra->to_world, (v3f){0.0f,1.0f,0.0f}, ay ); - m3x3_mulv( ra->to_world, (v3f){0.0f,0.0f,1.0f}, az ); - m3x3_mulv( rb->to_world, (v3f){1.0f,0.0f,0.0f}, bx ); - m3x3_mulv( rb->to_world, (v3f){0.0f,1.0f,0.0f}, by ); - m3x3_mulv( rb->to_world, (v3f){0.0f,0.0f,1.0f}, bz ); + float size = 0.12f; + + for( int i=0; irba->to_world, st->conevx, vx ); + m3x3_mulv( st->rbb->to_world, st->conevxb, vxb ); + m3x3_mulv( st->rba->to_world, st->conevy, vy ); + m3x3_mulv( st->rbb->to_world, st->coneva, va ); + m4x3_mulv( st->rba->to_world, st->view_offset, center ); + v3_cross( vy, vx, axis ); + + float rx = st->conevx[3], /* elipse radii */ + ry = st->conevy[3]; + + v3f p0, p1; + v3_muladds( center, va, size, p1 ); + vg_line( center, p1, 0xffffffff ); + vg_line_pt3( p1, 0.00025f, 0xffffffff ); + + if( st->tangent_violation ) + { + v3_muladds( center, st->tangent_target, size, p0 ); + + vg_line( center, p0, 0xff00ff00 ); + vg_line_pt3( p0, 0.00025f, 0xff00ff00 ); + vg_line( p1, p0, 0xff000000 ); + } + + for( int x=0; x<32; x++ ) + { + float t0 = ((float)x * (1.0f/32.0f)) * VG_TAUf, + t1 = (((float)x+1.0f) * (1.0f/32.0f)) * VG_TAUf, + c0 = cosf( t0 ), + s0 = sinf( t0 ), + c1 = cosf( t1 ), + s1 = sinf( t1 ); + + v3f v0, v1; + v3_muladds( axis, vx, c0*rx, v0 ); + v3_muladds( v0, vy, s0*ry, v0 ); + v3_muladds( axis, vx, c1*rx, v1 ); + v3_muladds( v1, vy, s1*ry, v1 ); + + v3_normalize( v0 ); + v3_normalize( v1 ); + + v3_muladds( center, v0, size, p0 ); + v3_muladds( center, v1, size, p1 ); + + u32 col0r = fabsf(c0) * 255.0f, + col0g = fabsf(s0) * 255.0f, + col1r = fabsf(c1) * 255.0f, + col1g = fabsf(s1) * 255.0f, + col = st->tangent_violation? 0xff0000ff: 0xff000000, + col0 = col | (col0r<<16) | (col0g << 8), + col1 = col | (col1r<<16) | (col1g << 8); + + vg_line2( center, p0, VG__NONE, col0 ); + vg_line2( p0, p1, col0, col1 ); + } - v2f px, py, pz; - px[0] = v3_dot( ay, by ); - px[1] = v3_dot( az, by ); + /* Draw twist */ + v3_muladds( center, va, size, p0 ); + v3_muladds( p0, vxb, size, p1 ); - py[0] = v3_dot( az, bz ); - py[1] = v3_dot( ax, bz ); + vg_line( p0, p1, 0xff0000ff ); - pz[0] = v3_dot( ax, bx ); - pz[1] = v3_dot( ay, bx ); + if( st->axis_violation ) + { + v3_muladds( p0, st->axis_target, size*1.25f, p1 ); + vg_line( p0, p1, 0xffffff00 ); + vg_line_pt3( p1, 0.0025f, 0xffffff80 ); + } - float r0 = atan2f( px[1], px[0] ), - r1 = atan2f( py[1], py[0] ), - r2 = atan2f( pz[1], pz[0] ); + v3f refaxis; + v3_cross( vy, va, refaxis ); /* our default rotation */ + v3_normalize( refaxis ); + v3f refaxis_up; + v3_cross( va, refaxis, refaxis_up ); + float newang = acosf(st->conet-0.0001f); - v3f c; - m4x3_mulv( ra->to_world, lca, c ); - draw_angle_limit( c, ay, az, limits[0][0], limits[1][0], r0, 0xff0000ff ); - draw_angle_limit( c, az, ax, limits[0][1], limits[1][1], r1, 0xff00ff00 ); - draw_angle_limit( c, ax, ay, limits[0][2], limits[1][2], r2, 0xffff0000 ); + v3_muladds( p0, refaxis_up, sinf(newang)*size, p1 ); + v3_muladds( p1, refaxis, -cosf(newang)*size, p1 ); + vg_line( p0, p1, 0xff000000 ); + + v3_muladds( p0, refaxis_up, sinf(-newang)*size, p1 ); + v3_muladds( p1, refaxis, -cosf(-newang)*size, p1 ); + vg_line( p0, p1, 0xff404040 ); + } } -VG_STATIC void rb_limit_cure( rigidbody *ra, rigidbody *rb, v3f axis, float d ) +/* + * Solve a list of positional constraints + */ +VG_STATIC void rb_solve_position_constraints( rb_constr_pos *buf, int len ) { - if( d != 0.0f ) + for( int i=0; iw, axis ) - v3_dot( rb->w, axis ); - float joint_mass = rb->inv_mass + ra->inv_mass; - joint_mass = 1.0f/joint_mass; + rb_constr_pos *constr = &buf[i]; + rigidbody *rba = constr->rba, *rbb = constr->rbb; - float bias = (k_limit_bias * k_rb_rate) * d, - lambda = -(avx + bias) * joint_mass; - - /* Angular velocity */ v3f wa, wb; - v3_muls( axis, lambda * ra->inv_mass, wa ); - v3_muls( axis, -lambda * rb->inv_mass, wb ); + m3x3_mulv( rba->to_world, constr->lca, wa ); + m3x3_mulv( rbb->to_world, constr->lcb, wb ); - v3_add( ra->w, wa, ra->w ); - v3_add( rb->w, wb, rb->w ); + m3x3f ssra, ssrat, ssrb, ssrbt; + + m3x3_skew_symetric( ssrat, wa ); + m3x3_skew_symetric( ssrbt, wb ); + m3x3_transpose( ssrat, ssra ); + m3x3_transpose( ssrbt, ssrb ); + + v3f b, b_wa, b_wb, b_a, b_b; + m3x3_mulv( ssra, rba->w, b_wa ); + m3x3_mulv( ssrb, rbb->w, b_wb ); + v3_add( rba->v, b_wa, b ); + v3_sub( b, rbb->v, b ); + v3_sub( b, b_wb, b ); + v3_muls( b, -1.0f, b ); + + m3x3f invMa, invMb; + m3x3_diagonal( invMa, rba->inv_mass ); + m3x3_diagonal( invMb, rbb->inv_mass ); + + m3x3f ia, ib; + m3x3_mul( ssra, rba->iIw, ia ); + m3x3_mul( ia, ssrat, ia ); + m3x3_mul( ssrb, rbb->iIw, ib ); + m3x3_mul( ib, ssrbt, ib ); + + m3x3f cma, cmb; + m3x3_add( invMa, ia, cma ); + m3x3_add( invMb, ib, cmb ); + + m3x3f A; + m3x3_add( cma, cmb, A ); + + /* Solve Ax = b ( A^-1*b = x ) */ + v3f impulse; + m3x3f invA; + m3x3_inv( A, invA ); + m3x3_mulv( invA, b, impulse ); + + v3f delta_va, delta_wa, delta_vb, delta_wb; + m3x3f iwa, iwb; + m3x3_mul( rba->iIw, ssrat, iwa ); + m3x3_mul( rbb->iIw, ssrbt, iwb ); + + m3x3_mulv( invMa, impulse, delta_va ); + m3x3_mulv( invMb, impulse, delta_vb ); + m3x3_mulv( iwa, impulse, delta_wa ); + m3x3_mulv( iwb, impulse, delta_wb ); + + v3_add( rba->v, delta_va, rba->v ); + v3_add( rba->w, delta_wa, rba->w ); + v3_sub( rbb->v, delta_vb, rbb->v ); + v3_sub( rbb->w, delta_wb, rbb->w ); } } -VG_STATIC void rb_constraint_limits( rigidbody *ra, v3f lca, - rigidbody *rb, v3f lcb, v3f limits[2] ) +VG_STATIC void rb_solve_swingtwist_constraints( rb_constr_swingtwist *buf, + int len ) { - v3f ax, ay, az, bx, by, bz; - m3x3_mulv( ra->to_world, (v3f){1.0f,0.0f,0.0f}, ax ); - m3x3_mulv( ra->to_world, (v3f){0.0f,1.0f,0.0f}, ay ); - m3x3_mulv( ra->to_world, (v3f){0.0f,0.0f,1.0f}, az ); - m3x3_mulv( rb->to_world, (v3f){1.0f,0.0f,0.0f}, bx ); - m3x3_mulv( rb->to_world, (v3f){0.0f,1.0f,0.0f}, by ); - m3x3_mulv( rb->to_world, (v3f){0.0f,0.0f,1.0f}, bz ); + float size = 0.12f; + + for( int i=0; iaxis_violation ) + continue; + + float rv = v3_dot( st->axis, st->rbb->w ) - + v3_dot( st->axis, st->rba->w ); + + if( rv * (float)st->axis_violation > 0.0f ) + continue; + + v3f impulse, wa, wb; + v3_muls( st->axis, rv*st->axis_mass, impulse ); + m3x3_mulv( st->rba->iIw, impulse, wa ); + v3_add( st->rba->w, wa, st->rba->w ); - v2f px, py, pz; - px[0] = v3_dot( ay, by ); - px[1] = v3_dot( az, by ); + v3_muls( impulse, -1.0f, impulse ); + m3x3_mulv( st->rbb->iIw, impulse, wb ); + v3_add( st->rbb->w, wb, st->rbb->w ); - py[0] = v3_dot( az, bz ); - py[1] = v3_dot( ax, bz ); + float rv2 = v3_dot( st->axis, st->rbb->w ) - + v3_dot( st->axis, st->rba->w ); + } - pz[0] = v3_dot( ax, bx ); - pz[1] = v3_dot( ay, bx ); + for( int i=0; itangent_violation ) + continue; - /* calculate angle deltas */ - float dx = 0.0f, dy = 0.0f, dz = 0.0f; + float rv = v3_dot( st->tangent_axis, st->rbb->w ) - + v3_dot( st->tangent_axis, st->rba->w ); - if( r0 < limits[0][0] ) dx = limits[0][0] - r0; - if( r0 > limits[1][0] ) dx = limits[1][0] - r0; - if( r1 < limits[0][1] ) dy = limits[0][1] - r1; - if( r1 > limits[1][1] ) dy = limits[1][1] - r1; - if( r2 < limits[0][2] ) dz = limits[0][2] - r2; - if( r2 > limits[1][2] ) dz = limits[1][2] - r2; + if( rv > 0.0f ) + continue; + + v3f impulse, wa, wb; + v3_muls( st->tangent_axis, rv*st->tangent_mass, impulse ); + m3x3_mulv( st->rba->iIw, impulse, wa ); + v3_add( st->rba->w, wa, st->rba->w ); - v3f wca, wcb; - m3x3_mulv( ra->to_world, lca, wca ); - m3x3_mulv( rb->to_world, lcb, wcb ); + v3_muls( impulse, -1.0f, impulse ); + m3x3_mulv( st->rbb->iIw, impulse, wb ); + v3_add( st->rbb->w, wb, st->rbb->w ); - rb_limit_cure( ra, rb, ax, dx ); - rb_limit_cure( ra, rb, ay, dy ); - rb_limit_cure( ra, rb, az, dz ); + float rv2 = v3_dot( st->tangent_axis, st->rbb->w ) - + v3_dot( st->tangent_axis, st->rba->w ); + } } -VG_STATIC void rb_debug_constraint_position( rigidbody *ra, v3f lca, - rigidbody *rb, v3f lcb ) +VG_STATIC void rb_solve_constr_angle( rigidbody *rba, rigidbody *rbb, + v3f ra, v3f rb ) { - v3f wca, wcb; - m3x3_mulv( ra->to_world, lca, wca ); - m3x3_mulv( rb->to_world, lcb, wcb ); + m3x3f ssra, ssrb, ssrat, ssrbt; + m3x3f cma, cmb; + + m3x3_skew_symetric( ssrat, ra ); + m3x3_skew_symetric( ssrbt, rb ); + m3x3_transpose( ssrat, ssra ); + m3x3_transpose( ssrbt, ssrb ); + + m3x3_mul( ssra, rba->iIw, cma ); + m3x3_mul( cma, ssrat, cma ); + m3x3_mul( ssrb, rbb->iIw, cmb ); + m3x3_mul( cmb, ssrbt, cmb ); + + m3x3f A, invA; + m3x3_add( cma, cmb, A ); + m3x3_inv( A, invA ); + + v3f b_wa, b_wb, b; + m3x3_mulv( ssra, rba->w, b_wa ); + m3x3_mulv( ssrb, rbb->w, b_wb ); + v3_add( b_wa, b_wb, b ); + v3_negate( b, b ); + + v3f impulse; + m3x3_mulv( invA, b, impulse ); + + v3f delta_wa, delta_wb; + m3x3f iwa, iwb; + m3x3_mul( rba->iIw, ssrat, iwa ); + m3x3_mul( rbb->iIw, ssrbt, iwb ); + m3x3_mulv( iwa, impulse, delta_wa ); + m3x3_mulv( iwb, impulse, delta_wb ); + v3_add( rba->w, delta_wa, rba->w ); + v3_sub( rbb->w, delta_wb, rbb->w ); +} - v3f p0, p1; - v3_add( wca, ra->co, p0 ); - v3_add( wcb, rb->co, p1 ); - vg_line_pt3( p0, 0.005f, 0xffffff00 ); - vg_line_pt3( p1, 0.005f, 0xffffff00 ); - vg_line( p0, p1, 0xffffff00 ); +/* + * Correct position constraint drift errors + * [ 0.0 <= amt <= 1.0 ]: the correction amount + */ +VG_STATIC void rb_correct_position_constraints( rb_constr_pos *buf, int len, + float amt ) +{ + for( int i=0; irba, *rbb = constr->rbb; + + v3f p0, p1, d; + m3x3_mulv( rba->to_world, constr->lca, p0 ); + m3x3_mulv( rbb->to_world, constr->lcb, p1 ); + v3_add( rba->co, p0, p0 ); + v3_add( rbb->co, p1, p1 ); + v3_sub( p1, p0, d ); + + v3_muladds( rbb->co, d, -1.0f * amt, rbb->co ); + rb_update_transform( rbb ); + } } -VG_STATIC void rb_constraint_position( rigidbody *ra, v3f lca, - rigidbody *rb, v3f lcb ) +VG_STATIC void rb_correct_swingtwist_constraints( rb_constr_swingtwist *buf, + int len, float amt ) { - /* C = (COa + Ra*LCa) - (COb + Rb*LCb) = 0 */ - v3f wca, wcb; - m3x3_mulv( ra->to_world, lca, wca ); - m3x3_mulv( rb->to_world, lcb, wcb ); + for( int i=0; iv, rb->v, rcv ); + if( !st->tangent_violation ) + continue; - v3f rcv_Ra, rcv_Rb; - v3_cross( ra->w, wca, rcv_Ra ); - v3_cross( rb->w, wcb, rcv_Rb ); - v3_add( rcv_Ra, rcv, rcv ); - v3_sub( rcv, rcv_Rb, rcv ); + v3f va; + m3x3_mulv( st->rbb->to_world, st->coneva, va ); - v3f delta; - v3f p0, p1; - v3_add( wca, ra->co, p0 ); - v3_add( wcb, rb->co, p1 ); - v3_sub( p1, p0, delta ); + float angle = v3_dot( va, st->tangent_target ); - float dist2 = v3_length2( delta ); + if( fabsf(angle) < 0.9999f ) + { + v3f axis; + v3_cross( va, st->tangent_target, axis ); - if( dist2 > 0.00001f ) + v4f correction; + q_axis_angle( correction, axis, acosf(angle) * amt ); + q_mul( correction, st->rbb->q, st->rbb->q ); + rb_update_transform( st->rbb ); + } + } + + for( int i=0; iinv_mass + ra->inv_mass; + if( !st->axis_violation ) + continue; - v3f raCn, rbCn, raCt, rbCt; - v3_cross( wca, delta, raCn ); - v3_cross( wcb, delta, rbCn ); - - /* orient inverse inertia tensors */ - v3f raCnI, rbCnI; - m3x3_mulv( ra->iIw, raCn, raCnI ); - m3x3_mulv( rb->iIw, rbCn, rbCnI ); - joint_mass += v3_dot( raCn, raCnI ); - joint_mass += v3_dot( rbCn, rbCnI ); - joint_mass = 1.0f/joint_mass; + v3f vxb; + m3x3_mulv( st->rbb->to_world, st->conevxb, vxb ); - float vd = v3_dot( rcv, delta ), - bias = -(k_joint_bias * k_rb_rate) * dist, - lambda = -(vd + bias) * joint_mass; + float angle = v3_dot( vxb, st->axis_target ); - v3f impulse; - v3_muls( delta, lambda, impulse ); - rb_linear_impulse( ra, wca, impulse ); - v3_muls( delta, -lambda, impulse ); - rb_linear_impulse( rb, wcb, impulse ); - - /* 'fake' snap */ - v3_muladds( ra->co, delta, dist * k_joint_correction, ra->co ); - v3_muladds( rb->co, delta, -dist * k_joint_correction, rb->co ); + if( fabsf(angle) < 0.9999f ) + { + v3f axis; + v3_cross( vxb, st->axis_target, axis ); + + v4f correction; + q_axis_angle( correction, axis, acosf(angle) * amt ); + q_mul( correction, st->rbb->q, st->rbb->q ); + rb_update_transform( st->rbb ); + } } } + /* * Effectors */ VG_STATIC void rb_effect_simple_bouyency( rigidbody *ra, v4f plane, - float amt, float drag ) + float amt, float drag ) { /* float */ float depth = v3_dot( plane, ra->co ) - plane[3], diff --git a/scene.h b/scene.h index 7fc29f3..8fffe97 100644 --- a/scene.h +++ b/scene.h @@ -4,7 +4,6 @@ #include "common.h" #include "model.h" #include "bvh.h" -#include "distq.h" typedef struct scene scene; diff --git a/skaterift.c b/skaterift.c index f31e1f6..9d72bec 100644 --- a/skaterift.c +++ b/skaterift.c @@ -2,7 +2,7 @@ * ============================================================================= * * Copyright . . . -----, ,----- ,---. .---. - * 2021-2022 |\ /| | / | | | | /| + * 2021-2023 |\ /| | / | | | | /| * | \ / | +-- / +----- +---' | / | * | \ / | | / | | \ | / | * | \/ | | / | | \ | / | diff --git a/skeleton.h b/skeleton.h index 9f715ef..4f35d58 100644 --- a/skeleton.h +++ b/skeleton.h @@ -14,16 +14,14 @@ struct skeleton v3f co, end; u32 parent; - int deform, ik; + u32 flags; int defer; mdl_keyframe kf; u32 orig_node; - int collider; boxf hitbox; - const char *name; } *bones; @@ -155,7 +153,8 @@ VG_STATIC int should_apply_bone( struct skeleton *skele, u32 id, anim_apply type if( type == k_anim_apply_defer_ik ) { - if( (sp->ik && !sb->ik) || sp->defer ) + if( ((sp->flags & k_bone_flag_ik) && !(sb->flags & k_bone_flag_ik)) + || sp->defer ) { sb->defer = 1; return 0; @@ -185,7 +184,7 @@ VG_STATIC void skeleton_apply_pose( struct skeleton *skele, mdl_keyframe *pose, { m4x3_identity( skele->final_mtx[0] ); skele->bones[0].defer = 0; - skele->bones[0].ik = 0; + skele->bones[0].flags &= ~k_bone_flag_ik; for( int i=1; ibone_count; i++ ) { @@ -454,18 +453,16 @@ VG_STATIC void skeleton_setup( struct skeleton *skele, struct skeleton_bone *sb = &skele->bones[bone_count]; struct classtype_bone *bone_inf = mdl_get_entdata( mdl, pnode ); - int is_ik = bone_inf->ik_target; v3_copy( pnode->co, sb->co ); v3_copy( pnode->s, sb->end ); sb->parent = pnode->parent-skeleton_root; sb->name = mdl_pstr( mdl, pnode->pstr_name ); - sb->deform = bone_inf->deform; + sb->flags = bone_inf->flags; - if( is_ik ) + if( sb->flags & k_bone_flag_ik ) { - sb->ik = 1; /* TODO: place into new IK array */ - skele->bones[ sb->parent ].ik = 1; + skele->bones[ sb->parent ].flags |= k_bone_flag_ik; if( ik_count == skele->ik_count ) { @@ -479,16 +476,11 @@ VG_STATIC void skeleton_setup( struct skeleton *skele, ik->target = bone_inf->ik_target; ik->pole = bone_inf->ik_pole; } - else - { - sb->ik = 0; - } - sb->collider = bone_inf->collider; sb->orig_node = i; box_copy( bone_inf->hitbox, sb->hitbox ); - if( bone_inf->collider ) + if( bone_inf->flags & k_bone_flag_collider_any ) { if( collider_count == skele->collider_count ) { @@ -538,7 +530,7 @@ VG_STATIC void skeleton_setup( struct skeleton *skele, v3_zero( skele->bones[0].co ); v3_copy( (v3f){0.0f,1.0f,0.0f}, skele->bones[0].end ); skele->bones[0].parent = 0xffffffff; - skele->bones[0].collider = 0; + skele->bones[0].flags = 0; skele->bones[0].name = "[root]"; /* process animation quick refs */ @@ -575,9 +567,9 @@ VG_STATIC void skeleton_debug( struct skeleton *skele ) m4x3_mulv( skele->final_mtx[i], p0, p0 ); m4x3_mulv( skele->final_mtx[i], p1, p1 ); - if( sb->deform ) + if( sb->flags & k_bone_flag_deform ) { - if( sb->ik ) + if( sb->flags & k_bone_flag_ik ) { vg_line( p0, p1, 0xff0000ff ); } -- 2.25.1