X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=54a02e81310a2300b73ab1a3e3038239a1a92229;hb=44459e0aa734b6a090d60a309e29a9a2a232c731;hp=8eb39a365dba70129c69776182175b39a30ea90f;hpb=6ab4435fb19beb6af6c52691793d5ca17a120f69;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index 8eb39a3..54a02e8 100644 --- a/blender_export.py +++ b/blender_export.py @@ -36,10 +36,14 @@ sr_entity_list = [ ('ent_menuitem', 'Menu Item', '', 15 ), ('ent_worldinfo', 'World Info', '', 16 ), ('ent_ccmd', 'CCmd', '', 17 ), - ('ent_challenge', 'Challenge', '', 18 ) + ('ent_challenge', 'Challenge', '', 18 ), + ('ent_unlock', 'Unlockable', '', 19 ), + ('ent_relay', 'Relay', '', 20 ) ] MDL_VERSION_NR = 102 +SR_TRIGGERABLE = [ 'ent_audio', 'ent_ccmd', 'ent_gate', 'ent_unlock', \ + 'ent_relay', 'ent_skateshop', 'ent_challenge' ] def get_entity_enum_id( alias ): #{ @@ -203,6 +207,7 @@ class ent_gate(Structure): ("submesh_start",c_uint32), # v102+ ("submesh_count",c_uint32), # v102+ (can be 0) ] + sr_functions = { 0: 'unlock' } #} class ent_route_node(Structure): @@ -456,12 +461,28 @@ class ent_challenge(Structure):#{ ("submesh_start",c_uint32), ("submesh_count",c_uint32), ("id_next",c_uint32), ("filter",c_uint32), + ("id_win",c_uint32), + ("win_event",c_uint32), ("time_limit",c_float)] sr_functions = { 0: 'trigger', 1: 'start_challenge' } #} +class ent_unlock(Structure):#{ + _fields_ = [("pstr_alias",c_uint32), + ("target",c_uint32), + ("target_event",c_uint32), + ("status",c_uint32)] + sr_functions = { 0: 'unlock' } +#} + +class ent_relay(Structure):#{ + _fields_ = [("targets",(c_uint32*2)*4), + ("targets_events",c_uint32*4)] + sr_functions = { 0: 'trigger' } +#} + def obj_ent_type( obj ): #{ if obj.type == 'ARMATURE': return 'mdl_armature' @@ -1650,6 +1671,7 @@ def sr_compile( collection ): gate.submesh_start, gate.submesh_count, _ = \ sr_compile_mesh_internal( obj ) #} + if obj_data.locked: flags |= 0x0010 gate.flags = flags gate.dimensions[0] = mesh_data.dimensions[0] @@ -1747,7 +1769,7 @@ def sr_compile( collection ): if obj_data.target:#{ volume.target = sr_entity_id( obj_data.target ) - volume._anon.trigger.event = obj_data.event + volume._anon.trigger.event = obj_data.target_event #} sr_ent_push(volume) @@ -1809,6 +1831,8 @@ def sr_compile( collection ): challenge = ent_challenge() obj_data = obj.SR_data.ent_challenge[0] challenge.id_next = sr_entity_id( obj_data.proxima ) + challenge.id_win = sr_entity_id( obj_data.target ) + challenge.win_event = obj_data.target_event challenge.filter = 0 challenge.time_limit = obj_data.time_limit @@ -1818,6 +1842,28 @@ def sr_compile( collection ): sr_ent_push( challenge ) #} + elif ent_type == 'ent_unlock':#{ + unlock = ent_unlock() + obj_data = obj.SR_data.ent_unlock[0] + unlock.pstr_alias = sr_compile_string( obj_data.alias ) + unlock.target = sr_entity_id( obj_data.target ) + unlock.target_event = obj_data.target_event + unlock.status = 0 + sr_ent_push( unlock ) + #} + elif ent_type == 'ent_relay':#{ + relay = ent_relay() + obj_data = obj.SR_data.ent_relay[0] + relay.targets[0][0] = sr_entity_id( obj_data.target0 ) + relay.targets[1][0] = sr_entity_id( obj_data.target1 ) + relay.targets[2][0] = sr_entity_id( obj_data.target2 ) + relay.targets[3][0] = sr_entity_id( obj_data.target3 ) + relay.targets[0][1] = obj_data.target0_event + relay.targets[1][1] = obj_data.target1_event + relay.targets[2][1] = obj_data.target2_event + relay.targets[3][1] = obj_data.target3_event + sr_ent_push( relay ) + #} #} #} @@ -2404,6 +2450,7 @@ class SR_OBJECT_ENT_GATE(bpy.types.PropertyGroup): flip: bpy.props.BoolProperty( name="Flip exit", default=False ) custom: bpy.props.BoolProperty( name="Mesh is surface", default=False ) + locked: bpy.props.BoolProperty( name="Start Locked", default=False ) @staticmethod def sr_inspector( layout, data ): @@ -2417,6 +2464,7 @@ class SR_OBJECT_ENT_GATE(bpy.types.PropertyGroup): flags = box.box() flags.prop( data[0], 'flip' ) flags.prop( data[0], 'custom' ) + flags.prop( data[0], 'locked' ) #} #} @@ -2776,31 +2824,40 @@ class SR_OBJECT_ENT_VOLUME(bpy.types.PropertyGroup):#{ poll=lambda self,obj: sr_filter_ent_type(obj,\ ['ent_audio','ent_skateshop','ent_ccmd',\ 'ent_challenge'])) - - event: bpy.props.IntProperty( name="Event/Method" ) + target_event: bpy.props.IntProperty( name="Event/Method" ) @staticmethod - def sr_inspector( layout, data ):#{ - layout.prop( data[0], 'subtype' ) - layout.prop( data[0], 'target' ) + def inspect_target( layout, data, propname ):#{ + box = layout.box() + box.prop( data[0], propname ) - row = layout.row() - row.prop( data[0], 'event' ) + row = box.row() + row.prop( data[0], propname + '_event') - if data[0].target:#{ - tipo = data[0].target.SR_data.ent_type + target = getattr( data[0], propname ) + if target:#{ + tipo = target.SR_data.ent_type cls = globals()[ tipo ] table = getattr( cls, 'sr_functions', None ) if table:#{ - if data[0].event in table:#{ - row.label( text=table[data[0].event] ) - #} - else:#{ + index = getattr( data[0], propname+'_event') + if index in table: + row.label( text=table[index] ) + else: row.label( text="undefined function" ) - #} #} #} + else:#{ + row.label( text="..." ) + row.enabled=False + #} + #} + + @staticmethod + def sr_inspector( layout, data ):#{ + layout.prop( data[0], 'subtype' ) + SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target' ) #} #} @@ -3087,11 +3144,59 @@ class SR_OBJECT_ENT_CHALLENGE(bpy.types.PropertyGroup):#{ type=bpy.types.Object, name="Next", \ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_challenge'])) target: bpy.props.PointerProperty( \ - type=bpy.types.Object, name="Target", \ - poll=lambda self,obj: sr_filter_ent_type(obj,\ - ['ent_audio','ent_ccmd'])) - event: bpy.props.IntProperty( name="Event/Method" ) + type=bpy.types.Object, name="Win", \ + poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) + target_event: bpy.props.IntProperty( name="Event/Method" ) time_limit: bpy.props.FloatProperty( name="Time Limit", default=1.0 ) + + @staticmethod + def sr_inspector( layout, data ):#{ + layout.prop( data[0], 'proxima' ) + layout.prop( data[0], 'time_limit' ) + SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target' ) + #} +#} + +class SR_OBJECT_ENT_UNLOCK(bpy.types.PropertyGroup):#{ + alias: bpy.props.StringProperty( name="Alias" ) + target: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Target", \ + poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) + target_event: bpy.props.IntProperty( name="Event/Method" ) + + @staticmethod + def sr_inspector( layout, data ):#{ + layout.prop( data[0], 'alias' ) + SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target' ) + #} +#} + +class SR_OBJECT_ENT_RELAY(bpy.types.PropertyGroup):#{ + target0: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Target 0", \ + poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) + target1: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Target 1", \ + poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) + target2: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Target 2", \ + poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) + target3: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Target 3", \ + poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) + + target0_event: bpy.props.IntProperty( name="Event" ) + target1_event: bpy.props.IntProperty( name="Event" ) + target2_event: bpy.props.IntProperty( name="Event" ) + target3_event: bpy.props.IntProperty( name="Event" ) + + @staticmethod + def sr_inspector( layout, data ):#{ + SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target0' ) + SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target1' ) + SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target2' ) + SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target3' ) + #} #} class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup): @@ -3112,6 +3217,8 @@ class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup): ent_worldinfo: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_WORLD_INFO) ent_ccmd: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_CCMD) ent_challenge: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_CHALLENGE) + ent_unlock: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_UNLOCK) + ent_relay: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_RELAY) ent_type: bpy.props.EnumProperty( name="Type", @@ -3417,7 +3524,7 @@ def cv_tangent_basis( n, tx, ty ): # Draw coloured arrow # -def cv_draw_arrow( p0, p1, c0, size=0.15 ): +def cv_draw_arrow( p0, p1, c0, size=0.25 ): #{ global cv_view_verts, cv_view_colours @@ -4048,6 +4155,24 @@ def cv_draw(): if data.proxima:#{ cv_draw_arrow( obj.location, data.proxima.location, (0,0.2,1.0) ) #} + if data.target: + cv_draw_arrow( obj.location, data.target.location, (0,1.0,0.0) ) + #} + elif ent_type == 'ent_relay':#{ + data = obj.SR_data.ent_relay[0] + if data.target0: + cv_draw_arrow( obj.location, data.target0.location, (0,1,0) ) + if data.target1: + cv_draw_arrow( obj.location, data.target1.location, (0,1,0) ) + if data.target2: + cv_draw_arrow( obj.location, data.target2.location, (0,1,0) ) + if data.target3: + cv_draw_arrow( obj.location, data.target3.location, (0,1,0) ) + #} + elif ent_type == 'ent_unlock':#{ + data = obj.SR_data.ent_unlock[0] + if data.target: + cv_draw_arrow( obj.location, data.target.location, (0,1.0,0.0) ) #} elif ent_type == 'ent_audio':#{ if obj.SR_data.ent_audio[0].flag_3d: @@ -4240,7 +4365,7 @@ classes = [ SR_INTERFACE, SR_MATERIAL_PANEL,\ SR_OBJECT_ENT_FONT,SR_OBJECT_ENT_TRAFFIC,SR_OBJECT_ENT_SKATESHOP,\ SR_OBJECT_ENT_WORKSHOP_PREVIEW,SR_OBJECT_ENT_MENU_ITEM,\ SR_OBJECT_ENT_WORLD_INFO,SR_OBJECT_ENT_CCMD,\ - SR_OBJECT_ENT_CHALLENGE,\ + SR_OBJECT_ENT_CHALLENGE,SR_OBJECT_ENT_UNLOCK,SR_OBJECT_ENT_RELAY,\ \ SR_OBJECT_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES, SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \