world regions
[carveJwlIkooP6JGAAIwe30JlM.git] / blender_export.py
index 8b0bd104b88aef9a9ab0a9b747423b6a0810181d..b49bf48553a6886d58ab57dc7dc3876aba21d699 100644 (file)
@@ -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),
@@ -516,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)]
@@ -1690,6 +1705,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':#{
@@ -1960,6 +1976,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]
@@ -2986,6 +3012,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",
@@ -3400,6 +3486,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", \
@@ -3447,8 +3540,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",
@@ -4683,7 +4778,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 \