X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=421cf5d796e75ebbc8e21123f0ef080f80e66759;hb=888e62fcd8f9777cee774fbb8fab2e52660303a7;hp=695fff05d7eee6303b7333e48ffd8b333c0936ed;hpb=0d211bc488751a2cbc380990492ec549e91b19ca;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index 695fff0..421cf5d 100644 --- a/blender_export.py +++ b/blender_export.py @@ -43,13 +43,14 @@ sr_entity_list = [ ('ent_miniworld', 'Mini World', '', 22 ), ('ent_prop', 'Prop', '', 23 ), ('ent_list', 'Entity List', '', 24 ), - ('ent_region', 'Region', '', 25 ) + ('ent_region', 'Region', '', 25 ), + ('ent_glider', 'Glider', '', 26 ), ] -MDL_VERSION_NR = 104 +MDL_VERSION_NR = 105 SR_TRIGGERABLE = [ 'ent_audio', 'ent_ccmd', 'ent_gate', 'ent_challenge', \ 'ent_relay', 'ent_skateshop', 'ent_objective', 'ent_route',\ - 'ent_miniworld', 'ent_region' ] + 'ent_miniworld', 'ent_region', 'ent_glider', 'ent_list' ] def get_entity_enum_id( alias ): #{ @@ -244,12 +245,26 @@ class union_file_audio_clip(Union): ("reserved",vg_audio_clip)] #} +# NOTE: not really an entity. no reason for ent_ -- makes more sense as file_, +# but then again, too late to change because compat. class ent_audio_clip(Structure): #{ _fields_ = [("_anon",union_file_audio_clip), ("probability",c_float)] #} +class ent_list(Structure): +#{ + _fields_ = [("entity_ref_start",c_uint32), + ("entity_ref_count",c_uint32)] +#} + +# used in ent_list +class file_entity_ref(Structure): +#{ + _fields_ = [("index",c_uint32)] +#} + class ent_checkpoint(Structure): #{ _fields_ = [("gate_index",c_uint16), @@ -279,6 +294,14 @@ class ent_list(Structure):#{ _fields_ = [("start",c_uint16),("count",c_uint16)] #} +class ent_glider(Structure):#{ + _fields_ = [("transform",mdl_transform), + ("flags",c_uint32), + ("cooldown",c_float)] + sr_functions = { 0: 'unlock', + 1: 'equip' } +#} + class ent_water(Structure): #{ _fields_ = [("transform",mdl_transform), @@ -528,7 +551,9 @@ class ent_region(Structure):#{ ("submesh_start",c_uint32), ("submesh_count",c_uint32), ("pstr_title",c_uint32), ("flags",c_uint32), - ("zone_volume",c_uint32)] + ("zone_volume",c_uint32), + #105+ + ("target0",c_uint32*2)] sr_functions = { 0: 'enter', 1: 'leave' } #} @@ -1729,6 +1754,7 @@ def sr_compile( collection ): #} audio_clip_count = 0 + entity_file_ref_count = 0 for ent_type, arr in sr_compile.entities.items():#{ print(F"[SR] Compiling {len(arr)} {ent_type}{'s' if len(arr)>1 else ''}") @@ -2003,6 +2029,8 @@ def sr_compile( collection ): sr_compile_mesh_internal( obj ) region.pstr_title = sr_compile_string( obj_data.title ) region.zone_volume = sr_entity_id( obj_data.zone_volume ) + region.target0[0] = sr_entity_id( obj_data.target0 ) + region.target0[1] = obj_data.target0_event sr_ent_push( region ) #} elif ent_type == 'ent_relay':#{ @@ -2018,6 +2046,27 @@ def sr_compile( collection ): relay.targets[3][1] = obj_data.target3_event sr_ent_push( relay ) #} + # elif ent_type == 'ent_list':#{ + # lista = ent_list() + # obj_data = obj.SR_data.ent_list[0] + + # lista.entity_ref_start = entity_file_ref_count + # lista.entity_ref_count = len( obj_data.entities ) + # entity_file_ref_count += lista.entity_ref_count + + # for child in obj_data.entities:#{ + # reference_struct = file_entity_ref() + # reference_struct.index = sr_entity_id( child.target ) + # sr_ent_push( reference_struct ) + # #} + + # sr_ent_push( lista ) + # #} + elif ent_type == 'ent_glider':#{ + glider = ent_glider() + compile_obj_transform( obj, glider.transform ) + sr_ent_push( glider ) + #} elif ent_type == 'ent_cubemap':#{ cubemap = ent_cubemap() co = obj.matrix_world @ Vector((0,0,0)) @@ -3095,6 +3144,9 @@ class SR_OBJECT_ENT_LIST(bpy.types.PropertyGroup):#{ #} #} +class SR_OBJECT_ENT_GLIDER(bpy.types.PropertyGroup):#{ + nothing: bpy.props.StringProperty() +#} class SR_OBJECT_ENT_VOLUME(bpy.types.PropertyGroup):#{ subtype: bpy.props.EnumProperty( @@ -3532,6 +3584,18 @@ class SR_OBJECT_ENT_REGION(bpy.types.PropertyGroup):#{ zone_volume: bpy.props.PointerProperty( type=bpy.types.Object, name="Zone Volume", \ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_volume'])) + + target0: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Triger on unlock", \ + poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE)) + target0_event: bpy.props.IntProperty( name="Event/Method" ) + + @staticmethod + def sr_inspector( layout, data ):#{ + layout.prop( data[0], 'title' ) + layout.prop( data[0], 'zone_volume' ) + SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target0' ) + #} #} class SR_OBJECT_ENT_RELAY(bpy.types.PropertyGroup):#{ @@ -3586,6 +3650,7 @@ class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup): ent_relay: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_RELAY) ent_miniworld: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MINIWORLD) ent_list: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_LIST) + ent_glider: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_GLIDER) ent_type: bpy.props.EnumProperty( name="Type", @@ -4210,6 +4275,14 @@ def draw_skeleton_helpers( obj ): #} #} +def cv_draw_wireframe( mdl, points, colour ):#{ + for i in range(len(points)//2):#{ + p0 = mdl@points[i*2+0] + p1 = mdl@points[i*2+1] + cv_draw_line( p0, p1, colour ) + #} +#} + def cv_ent_gate( obj ): #{ global cv_view_verts, cv_view_colours @@ -4624,6 +4697,20 @@ def cv_draw():#{ #} #} #} + elif ent_type == 'ent_glider':#{ + mesh = [Vector((-1.13982, 0.137084, -0.026358)), \ + Vector(( 1.13982, 0.137084, -0.026358)), \ + Vector(( 0.0, 1.6, 1.0)), \ + Vector(( 0.0, -3.0, 1.0)), \ + Vector(( -3.45, -1.78, 0.9)), \ + Vector(( 0.0, 1.6, 1.0)), \ + Vector(( 3.45, -1.78, 0.9)), \ + Vector(( 0.0, 1.6, 1.0)), \ + Vector(( 3.45, -1.78, 0.9)), \ + Vector(( -3.45, -1.78, 0.9))] + + cv_draw_wireframe( obj.matrix_world, mesh, (1,1,1) ) + #} elif ent_type == 'ent_skateshop':#{ data = obj.SR_data.ent_skateshop[0] display = data.mark_display @@ -4691,6 +4778,22 @@ def cv_draw():#{ if display1: cv_draw_ucube(display1.matrix_world, cc1, display_cu, display_co) #} + # elif ent_type == 'ent_list':#{ + # data = obj.SR_data.ent_list[0] + # for child in data.entities:#{ + # if child.target:#{ + # cv_draw_arrow( obj.location, child.target.location, \ + # (.5,.5,.5), 0.1 ) + # #} + # #} + # #} + elif ent_type == 'ent_region':#{ + data = obj.SR_data.ent_region[0] + if data.target0:#{ + cv_draw_arrow( obj.location, data.target0.location, \ + (.5,.5,.5), 0.1 ) + #} + #} elif ent_type == 'ent_menuitem':#{ for i,col in enumerate(obj.users_collection):#{ colour32 = hash_djb2( col.name ) @@ -4827,6 +4930,7 @@ classes = [ SR_INTERFACE, SR_MATERIAL_PANEL,\ SR_OBJECT_ENT_RELAY,SR_OBJECT_ENT_MINIWORLD,\ SR_OBJECT_ENT_LIST_ENTRY, SR_UL_ENT_LIST, SR_OBJECT_ENT_LIST, \ SR_OT_ENT_LIST_NEW_ITEM, SR_OT_ENT_LIST_DEL_ITEM,\ + SR_OBJECT_ENT_GLIDER, \ \ SR_OBJECT_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES, SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \