X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=168f023d71f6c65c3009adec6edb046a62391603;hb=61559a4d856351c40f5ad6be67b811ec01b037f9;hp=d397cd793583ac38d90dd36a9ea5bd9fb2717c68;hpb=1c56bc84c9ad3da49c9d2447ec97aaf7f6038601;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index d397cd7..168f023 100644 --- a/blender_export.py +++ b/blender_export.py @@ -41,13 +41,15 @@ sr_entity_list = [ ('ent_challenge', 'Challenge', '', 19 ), ('ent_relay', 'Relay', '', 20 ), ('ent_miniworld', 'Mini World', '', 22 ), - ('ent_prop', 'Prop', '', 23 ) + ('ent_prop', 'Prop', '', 23 ), + ('ent_list', 'Entity List', '', 24 ), + ('ent_region', 'Region', '', 25 ) ] MDL_VERSION_NR = 104 SR_TRIGGERABLE = [ 'ent_audio', 'ent_ccmd', 'ent_gate', 'ent_challenge', \ 'ent_relay', 'ent_skateshop', 'ent_objective', 'ent_route',\ - 'ent_miniworld' ] + 'ent_miniworld', 'ent_region' ] def get_entity_enum_id( alias ): #{ @@ -273,6 +275,10 @@ class ent_route(Structure): sr_functions = { 0: 'view' } #} +class ent_list(Structure):#{ + _fields_ = [("start",c_uint16),("count",c_uint16)] +#} + class ent_water(Structure): #{ _fields_ = [("transform",mdl_transform), @@ -382,17 +388,24 @@ class ent_skateshop_worlds(Structure): _fields_ = [("id_display",c_uint32), ("id_info",c_uint32)] #} +class ent_skateshop_server(Structure): +#{ + _fields_ = [("id_lever",c_uint32)] +#} class ent_skateshop_anon_union(Union): #{ _fields_ = [("boards",ent_skateshop_boards), ("character",ent_skateshop_characters), - ("worlds",ent_skateshop_worlds)] + ("worlds",ent_skateshop_worlds), + ("server",ent_skateshop_server)] #} class ent_skateshop(Structure): #{ _fields_ = [("transform",mdl_transform), ("type",c_uint32), ("id_camera",c_uint32), ("_anonymous_union",ent_skateshop_anon_union)] + + sr_functions = { 0: 'trigger' } #} class ent_swspreview(Structure): @@ -509,6 +522,15 @@ class ent_challenge(Structure):#{ 1: 'view/reset' } #} +class ent_region(Structure):#{ + _fields_ = [("transform",mdl_transform), + ("submesh_start",c_uint32), ("submesh_count",c_uint32), + ("pstr_title",c_uint32), + ("flags",c_uint32), + ("zone_volume",c_uint32)] + sr_functions = { 0: 'enter', 1: 'leave' } +#} + class ent_relay(Structure):#{ _fields_ = [("targets",(c_uint32*2)*4), ("targets_events",c_uint32*4)] @@ -525,6 +547,8 @@ class ent_cubemap(Structure):#{ ("placeholder",c_uint32*2)] #} +print( sizeof(ent_cubemap) ) + class ent_miniworld(Structure):#{ _fields_ = [("transform",mdl_transform), ("pstr_world",c_uint32), @@ -1683,6 +1707,7 @@ def sr_compile( collection ): if ent_type == 'ent_font_variant': continue if ent_type == 'ent_menuitem': continue if ent_type == 'ent_objective': continue + if ent_type == 'ent_region': continue #TODO: This is messy. if ent_type == 'ent_gate':#{ @@ -1889,6 +1914,10 @@ def sr_compile( collection ): worldshop.id_display = sr_entity_id( obj_data.mark_display ) worldshop.id_info = sr_entity_id( obj_data.mark_info ) #} + elif skateshop.type == 3:#{ + server = skateshop._anonymous_union.server + server.id_lever = sr_entity_id( obj_data.mark_display ) + #} skateshop.id_camera = sr_entity_id( obj_data.cam ) compile_obj_transform( obj, skateshop.transform ) sr_ent_push(skateshop) @@ -1949,6 +1978,16 @@ def sr_compile( collection ): challenge.status = 0 sr_ent_push( challenge ) #} + elif ent_type == 'ent_region':#{ + region = ent_region() + obj_data = obj.SR_data.ent_region[0] + compile_obj_transform( obj, region.transform ) + region.submesh_start, region.submesh_count, _ = \ + sr_compile_mesh_internal( obj ) + region.pstr_title = sr_compile_string( obj_data.title ) + region.zone_volume = sr_entity_id( obj_data.zone_volume ) + sr_ent_push( region ) + #} elif ent_type == 'ent_relay':#{ relay = ent_relay() obj_data = obj.SR_data.ent_relay[0] @@ -2975,6 +3014,66 @@ class SR_OBJECT_ENT_ROUTE(bpy.types.PropertyGroup): #} #} + +class SR_OT_ENT_LIST_NEW_ITEM(bpy.types.Operator):#{ + bl_idname = "skaterift.ent_list_new_entry" + bl_label = "Add entity" + + def execute(self, context):#{ + return internal_listadd_execute(self,context,'ent_list','entities') + #} +#} + +class SR_OT_ENT_LIST_DEL_ITEM(bpy.types.Operator):#{ + bl_idname = "skaterift.ent_list_del_entry" + bl_label = "Remove entity" + + @classmethod + def poll(cls, context):#{ + active_object = context.active_object + if obj_ent_type(active_object) == 'ent_list':#{ + return active_object.SR_data.ent_list[0].entities + #} + else: return False + #} + + def execute(self, context):#{ + return internal_listdel_execute(self,context,'ent_list','entities') + #} +#} + +class SR_OBJECT_ENT_LIST_ENTRY(bpy.types.PropertyGroup): +#{ + target: bpy.props.PointerProperty( \ + type=bpy.types.Object, name='target' ) +#} + +class SR_UL_ENT_LIST(bpy.types.UIList):#{ + bl_idname = 'SR_UL_ENT_LIST' + + def draw_item(_,context,layout,data,item,icon,active_data,active_propname):#{ + layout.prop( item, 'target', text='', emboss=False ) + #} +#} + +class SR_OBJECT_ENT_LIST(bpy.types.PropertyGroup):#{ + entities: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_LIST_ENTRY) + entities_index: bpy.props.IntProperty() + + @staticmethod + def sr_inspector( layout, data ):#{ + layout.label( text='Entities' ) + layout.template_list('SR_UL_ENT_LIST', 'Entities', \ + data[0], 'entities', data[0], \ + 'entities_index', rows=5) + + row = layout.row() + row.operator( 'skaterift.ent_list_new_entry', text='Add' ) + row.operator( 'skaterift.ent_list_del_entry', text='Remove' ) + #} +#} + + class SR_OBJECT_ENT_VOLUME(bpy.types.PropertyGroup):#{ subtype: bpy.props.EnumProperty( name="Subtype", @@ -3170,7 +3269,8 @@ class SR_OBJECT_ENT_SKATESHOP(bpy.types.PropertyGroup): tipo: bpy.props.EnumProperty( name='Type', items=[('0','boards',''), ('1','character',''), - ('2','world','')] ) + ('2','world',''), + ('4','server','')] ) mark_rack: bpy.props.PointerProperty( \ type=bpy.types.Object, name="Board Rack", \ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker'])) @@ -3179,7 +3279,8 @@ class SR_OBJECT_ENT_SKATESHOP(bpy.types.PropertyGroup): poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker'])) mark_info: bpy.props.PointerProperty( \ type=bpy.types.Object, name="Selected Board Info", \ - poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker'])) + poll=lambda self,obj: sr_filter_ent_type(obj,\ + ['ent_marker','ent_prop'])) cam: bpy.props.PointerProperty( \ type=bpy.types.Object, name="Viewpoint", \ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera'])) @@ -3387,6 +3488,13 @@ class SR_OBJECT_ENT_CHALLENGE(bpy.types.PropertyGroup):#{ #} #} +class SR_OBJECT_ENT_REGION(bpy.types.PropertyGroup):#{ + title: bpy.props.StringProperty( name="Title" ) + zone_volume: bpy.props.PointerProperty( + type=bpy.types.Object, name="Zone Volume", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_volume'])) +#} + class SR_OBJECT_ENT_RELAY(bpy.types.PropertyGroup):#{ target0: bpy.props.PointerProperty( \ type=bpy.types.Object, name="Target 0", \ @@ -3434,8 +3542,10 @@ class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup): 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_region: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_REGION) 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_type: bpy.props.EnumProperty( name="Type", @@ -4513,6 +4623,11 @@ def cv_draw():#{ display = None info = None #} + elif data.tipo == '4':#{ + rack = None + display = None + info = None + #} if rack: cv_draw_ucube( rack.matrix_world, cc, rack_cu, rack_co ) @@ -4665,7 +4780,10 @@ classes = [ SR_INTERFACE, SR_MATERIAL_PANEL,\ SR_OBJECT_ENT_WORKSHOP_PREVIEW,SR_OBJECT_ENT_MENU_ITEM,\ SR_OBJECT_ENT_WORLD_INFO,SR_OBJECT_ENT_CCMD,\ SR_OBJECT_ENT_OBJECTIVE,SR_OBJECT_ENT_CHALLENGE,\ + SR_OBJECT_ENT_REGION,\ 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_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES, SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \