X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=50f46c3d7184917431fad6d799748b6ea56ea24b;hb=99376ce8eaf30125fb08dd5dc8b534800580fe47;hp=8d4c12fb12e5148289065050db153ce0f3d1346c;hpb=c16f95624c142beec1572baa24f262e8a661f3fb;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index 8d4c12f..50f46c3 100644 --- a/blender_export.py +++ b/blender_export.py @@ -37,14 +37,14 @@ sr_entity_list = [ ('ent_menuitem', 'Menu Item', '', 15 ), ('ent_worldinfo', 'World Info', '', 16 ), ('ent_ccmd', 'CCmd', '', 17 ), - ('ent_challenge', 'Challenge', '', 18 ), - ('ent_unlock', 'Unlockable', '', 19 ), + ('ent_objective', 'Objective', '', 18 ), + ('ent_challenge', 'Challenge', '', 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' ] +SR_TRIGGERABLE = [ 'ent_audio', 'ent_ccmd', 'ent_gate', 'ent_challenge', \ + 'ent_relay', 'ent_skateshop', 'ent_objective' ] def get_entity_enum_id( alias ): #{ @@ -459,7 +459,7 @@ class ent_ccmd(Structure): _fields_ = [("pstr_command",c_uint32)] #} -class ent_challenge(Structure):#{ +class ent_objective(Structure):#{ _fields_ = [("transform",mdl_transform), ("submesh_start",c_uint32), ("submesh_count",c_uint32), ("flags",c_uint32), @@ -470,18 +470,23 @@ class ent_challenge(Structure):#{ ("time_limit",c_float)] sr_functions = { 0: 'trigger', - 1: 'start_challenge', 2: 'show', 3: 'hide' } #} -class ent_unlock(Structure):#{ +class ent_challenge(Structure):#{ _fields_ = [("transform",mdl_transform), ("pstr_alias",c_uint32), + ("flags",c_uint32), ("target",c_uint32), ("target_event",c_uint32), - ("status",c_uint32)] - sr_functions = { 0: 'unlock' } + ("reset",c_uint32), + ("reset_event",c_uint32), + ("first",c_uint32), + ("camera",c_uint32), + ("status",c_uint32)] #runtime + sr_functions = { 0: 'unlock', + 1: 'view/reset' } #} class ent_relay(Structure):#{ @@ -1626,7 +1631,7 @@ def sr_compile( collection ): if ent_type == 'ent_font': continue if ent_type == 'ent_font_variant': continue if ent_type == 'ent_menuitem': continue - if ent_type == 'ent_challenge': continue + if ent_type == 'ent_objective': continue #TODO: This is messy. if ent_type == 'ent_gate':#{ @@ -1856,32 +1861,38 @@ def sr_compile( collection ): ccmd.pstr_command = sr_compile_string( obj_data.command ) sr_ent_push( ccmd ) #} + elif ent_type == 'ent_objective':#{ + objective = ent_objective() + obj_data = obj.SR_data.ent_objective[0] + objective.id_next = sr_entity_id( obj_data.proxima ) + objective.id_win = sr_entity_id( obj_data.target ) + objective.win_event = obj_data.target_event + objective.filter = int(obj_data.filtrar) + objective.filter2 = 0 + objective.time_limit = obj_data.time_limit + + compile_obj_transform( obj, objective.transform ) + objective.submesh_start, objective.submesh_count, _ = \ + sr_compile_mesh_internal( obj ) + + sr_ent_push( objective ) + #} elif ent_type == 'ent_challenge':#{ 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 = int(obj_data.filtrar) - challenge.filter2 = 0 - challenge.time_limit = obj_data.time_limit - compile_obj_transform( obj, challenge.transform ) - challenge.submesh_start, challenge.submesh_count, _ = \ - sr_compile_mesh_internal( obj ) - + challenge.pstr_alias = sr_compile_string( obj_data.alias ) + challenge.target = sr_entity_id( obj_data.target ) + challenge.target_event = obj_data.target_event + challenge.reset = sr_entity_id( obj_data.reset ) + challenge.reset_event = obj_data.reset_event + challenge.first = sr_entity_id( obj_data.first ) + challenge.flags = 0x00 + challenge.camera = sr_entity_id( obj_data.camera ) + if obj_data.time_limit: challenge.flags |= 0x01 + challenge.status = 0 sr_ent_push( challenge ) #} - elif ent_type == 'ent_unlock':#{ - unlock = ent_unlock() - obj_data = obj.SR_data.ent_unlock[0] - compile_obj_transform( obj, unlock.transform ) - 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] @@ -2137,7 +2148,7 @@ class SR_SCENE_SETTINGS(bpy.types.PropertyGroup): #{ use_hidden: bpy.props.BoolProperty( name="use hidden", default=False ) export_dir: bpy.props.StringProperty( name="Export Dir", subtype='DIR_PATH' ) - gizmos: bpy.props.BoolProperty( name="Draw Gizmos", default=True ) + gizmos: bpy.props.BoolProperty( name="Draw Gizmos", default=False ) panel: bpy.props.EnumProperty( name='Panel', @@ -3197,10 +3208,10 @@ class SR_OBJECT_ENT_CCMD(bpy.types.PropertyGroup): command: bpy.props.StringProperty(name="Command Line") #} -class SR_OBJECT_ENT_CHALLENGE(bpy.types.PropertyGroup):#{ +class SR_OBJECT_ENT_OBJECTIVE(bpy.types.PropertyGroup):#{ proxima: bpy.props.PointerProperty( \ type=bpy.types.Object, name="Next", \ - poll=lambda self,obj: sr_filter_ent_type(obj,['ent_challenge'])) + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_objective'])) target: bpy.props.PointerProperty( \ type=bpy.types.Object, name="Win", \ poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) @@ -3218,7 +3229,8 @@ class SR_OBJECT_ENT_CHALLENGE(bpy.types.PropertyGroup):#{ (str(0x20),'grind_truck_any',''), (str(0x40),'grind_board_any',''), (str(0x20|0x40),'grind_any',''), - (str(0x80),'footplant','') + (str(0x80),'footplant',''), + (str(0x100),'passthrough',''), ]) @staticmethod @@ -3230,17 +3242,37 @@ class SR_OBJECT_ENT_CHALLENGE(bpy.types.PropertyGroup):#{ #} #} -class SR_OBJECT_ENT_UNLOCK(bpy.types.PropertyGroup):#{ +class SR_OBJECT_ENT_CHALLENGE(bpy.types.PropertyGroup):#{ alias: bpy.props.StringProperty( name="Alias" ) + target: bpy.props.PointerProperty( \ - type=bpy.types.Object, name="Target", \ + type=bpy.types.Object, name="On Complete", \ poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) target_event: bpy.props.IntProperty( name="Event/Method" ) + reset: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="On Reset", \ + poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) + reset_event: bpy.props.IntProperty( name="Event/Method" ) + + time_limit: bpy.props.BoolProperty( name="Time Limit" ) + + first: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="First Objective", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_objective'])) + + camera: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Camera", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera'])) + @staticmethod def sr_inspector( layout, data ):#{ layout.prop( data[0], 'alias' ) + layout.prop( data[0], 'camera' ) + layout.prop( data[0], 'first' ) + layout.prop( data[0], 'time_limit' ) SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target' ) + SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'reset' ) #} #} @@ -3289,8 +3321,8 @@ class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup): ent_menuitem: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MENU_ITEM) ent_worldinfo: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_WORLD_INFO) ent_ccmd: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_CCMD) + ent_objective: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_OBJECTIVE) 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( @@ -3612,7 +3644,7 @@ def cv_tangent_basis( n, tx, ty ): # Draw coloured arrow # -def cv_draw_arrow( p0, p1, c0, size=0.25 ): +def cv_draw_arrow( p0, p1, c0, size=0.25, outline=True ): #{ global cv_view_verts, cv_view_colours @@ -3623,10 +3655,26 @@ def cv_draw_arrow( p0, p1, c0, size=0.25 ): tx = Vector((1,0,0)) ty = Vector((1,0,0)) cv_tangent_basis( n, tx, ty ) - + tx *= 0.5 + ty *= 0.5 + + if outline:#{ + cv_draw_lines() + gpu.state.line_width_set(1.0) + #} + cv_view_verts += [p0,p1, midpt+(tx-n)*size,midpt, midpt+(-tx-n)*size,midpt ] cv_view_colours += [c0,c0,c0,c0,c0,c0] - #cv_draw_lines() + cv_draw_lines() + + if outline:#{ + gpu.state.line_width_set(3.0) + cv_view_verts += [p0,p1,midpt+(tx-n)*size,midpt,midpt+(-tx-n)*size,midpt] + b0 = (0,0,0) + cv_view_colours += [b0,b0,b0,b0,b0,b0] + cv_draw_lines() + gpu.state.line_width_set(2.0) + #} #} def cv_draw_line_dotted( p0, p1, c0, dots=10 ): @@ -3949,17 +3997,17 @@ def cv_ent_volume( obj ): data = obj.SR_data.ent_volume[0] if data.subtype == '0':#{ - cv_draw_ucube( obj.matrix_world, (0,1,0) ) + cv_draw_ucube( obj.matrix_world, (0,1,0), Vector((0.99,0.99,0.99)) ) if data.target:#{ - cv_draw_arrow( obj.location, data.target.location, (0,1,0) ) + cv_draw_arrow( obj.location, data.target.location, (1,1,1) ) #} #} elif data.subtype == '1':#{ cv_draw_ucube( obj.matrix_world, (1,1,0) ) if data.target:#{ - cv_draw_arrow( obj.location, data.target.location, (1,1,0) ) + cv_draw_arrow( obj.location, data.target.location, (1,1,1) ) #} #} #} @@ -4178,14 +4226,14 @@ def cv_draw_route( route, dij ): path = solve_graph( dij, gi.name, gj.name ) if path:#{ - cv_draw_arrow(gi.location,dij.points[path[0]],cc,1.5) - cv_draw_arrow(dij.points[path[len(path)-1]],gj.location,cc,1.5) + cv_draw_arrow(gi.location,dij.points[path[0]],cc,1.5,False) + cv_draw_arrow(dij.points[path[len(path)-1]],gj.location,cc,1.5,False) for j in range(len(path)-1):#{ i0 = path[j] i1 = path[j+1] o0 = dij.points[ i0 ] o1 = dij.points[ i1 ] - cv_draw_arrow(o0,o1,cc,1.5) + cv_draw_arrow(o0,o1,cc,1.5,False) #} #} else:#{ @@ -4205,7 +4253,7 @@ def cv_draw():#{ cv_view_colours = [] cv_view_shader.bind() - gpu.state.depth_mask_set(False) + gpu.state.depth_mask_set(True) gpu.state.line_width_set(2.0) gpu.state.face_culling_set('BACK') gpu.state.depth_test_set('LESS') @@ -4237,33 +4285,40 @@ def cv_draw():#{ elif ent_type == 'ent_volume':#{ cv_ent_volume( obj ) #} - elif ent_type == 'ent_challenge':#{ - data = obj.SR_data.ent_challenge[0] + elif ent_type == 'ent_objective':#{ + data = obj.SR_data.ent_objective[0] if data.proxima:#{ - cv_draw_arrow( obj.location, data.proxima.location, (0,0.2,1.0) ) + cv_draw_arrow( obj.location, data.proxima.location, (1,0.6,0.2) ) #} if data.target: - cv_draw_arrow( obj.location, data.target.location, (0,1.0,0.0) ) + cv_draw_arrow( obj.location, data.target.location, (1,1,1) ) #} 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) ) + cv_draw_arrow( obj.location, data.target0.location, (1,1,1) ) if data.target1: - cv_draw_arrow( obj.location, data.target1.location, (0,1,0) ) + cv_draw_arrow( obj.location, data.target1.location, (1,1,1) ) if data.target2: - cv_draw_arrow( obj.location, data.target2.location, (0,1,0) ) + cv_draw_arrow( obj.location, data.target2.location, (1,1,1) ) if data.target3: - cv_draw_arrow( obj.location, data.target3.location, (0,1,0) ) + cv_draw_arrow( obj.location, data.target3.location, (1,1,1) ) #} - elif ent_type == 'ent_unlock':#{ - data = obj.SR_data.ent_unlock[0] + elif ent_type == 'ent_challenge':#{ + data = obj.SR_data.ent_challenge[0] if data.target: - cv_draw_arrow( obj.location, data.target.location, (0,1.0,0.0) ) + cv_draw_arrow( obj.location, data.target.location, (1,1,1) ) + if data.reset: + cv_draw_arrow( obj.location, data.reset.location, (0.9,0,0) ) + if data.first: + cv_draw_arrow( obj.location, data.first.location, (1,0.6,0.2) ) + cc1 = (0.4,0.3,0.2) info_cu = Vector((1.2,0.01,0.72))*0.5 info_co = Vector((0.0,0.0,0.72))*0.5 cv_draw_ucube( obj.matrix_world, cc1, info_cu, info_co) + if data.camera: + cv_draw_line_dotted( obj.location, data.camera.location, (1,1,1)) vs = [Vector((-0.2,0.0,0.10)),Vector((-0.2,0.0,0.62)),\ Vector(( 0.2,0.0,0.62)),Vector((-0.2,0.0,0.30)),\ @@ -4339,6 +4394,11 @@ def cv_draw():#{ info_cu = Vector((1.2,0.01,0.3))*0.5 info_co = Vector((0.0,0.0,0.0))*0.5 #} + elif data.tipo == '3':#{ + rack = None + display = None + info = None + #} if rack: cv_draw_ucube( rack.matrix_world, cc, rack_cu, rack_co ) @@ -4490,7 +4550,8 @@ 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_UNLOCK,SR_OBJECT_ENT_RELAY,\ + SR_OBJECT_ENT_OBJECTIVE,SR_OBJECT_ENT_CHALLENGE,\ + SR_OBJECT_ENT_RELAY,\ \ SR_OBJECT_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES, SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \