proxy models
[carveJwlIkooP6JGAAIwe30JlM.git] / blender_export.py
index b4a501d64ad36bce28ed88f6473e7f70f46bab25..36ca3681d866831fdf74430cc34176450c85435a 100644 (file)
@@ -40,7 +40,8 @@ sr_entity_list = [
    ('ent_objective',    'Objective',      '', 18 ),
    ('ent_challenge',    'Challenge',      '', 19 ),
    ('ent_relay',        'Relay',          '', 20 ),
-   ('ent_miniworld',    'Mini World',     '', 22 )
+   ('ent_miniworld',    'Mini World',     '', 22 ),
+   ('ent_prop',         'Prop',           '', 23 )
 ]
 
 MDL_VERSION_NR = 104
@@ -283,7 +284,7 @@ class ent_water(Structure):
 class volume_trigger(Structure):
 #{
    _fields_ = [("event",c_uint32),
-               ("blank",c_uint32)]
+               ("event_leave",c_uint32)]
 #}
 
 class volume_particles(Structure):
@@ -527,9 +528,17 @@ class ent_cubemap(Structure):#{
 class ent_miniworld(Structure):#{
    _fields_ = [("transform",mdl_transform),
                ("pstr_world",c_uint32),
-               ("purpose",c_int32)]
+               ("purpose",c_int32),
+               ("proxy",c_uint32)]
 
-   sr_functions = { 0: 'zone' }
+   sr_functions = { 0: 'zone', 1: 'leave' }
+#}
+
+class ent_prop(Structure):#{
+   _fields_ = [("transform",mdl_transform),
+               ("submesh_start",c_uint32),
+               ("submesh_count",c_uint32),
+               ("flags",c_uint32)]
 #}
 
 def obj_ent_type( obj ):
@@ -1665,6 +1674,7 @@ def sr_compile( collection ):
          # entity ignore mesh list
          #
          if ent_type == 'ent_traffic': continue
+         if ent_type == 'ent_prop': continue
          if ent_type == 'ent_font': continue
          if ent_type == 'ent_font_variant': continue
          if ent_type == 'ent_menuitem': continue
@@ -1841,6 +1851,7 @@ def sr_compile( collection ):
             if obj_data.target:#{
                volume.target = sr_entity_id( obj_data.target )
                volume._anon.trigger.event = obj_data.target_event
+               volume._anon.trigger.event_leave = obj_data.target_event_leave
             #}
 
             sr_ent_push(volume)
@@ -1960,8 +1971,17 @@ def sr_compile( collection ):
 
             compile_obj_transform( obj, miniworld.transform )
             miniworld.pstr_world = sr_compile_string( obj_data.world )
+            miniworld.proxy = sr_entity_id( obj_data.proxy )
             sr_ent_push( miniworld )
          #}
+         elif ent_type == 'ent_prop':#{
+            prop = ent_prop()
+            compile_obj_transform( obj, prop.transform )
+            prop.submesh_start, prop.submesh_count, _ = \
+                  sr_compile_mesh_internal( obj )
+            prop.flags = 0
+            sr_ent_push( prop )
+         #}
       #}
    #}
 
@@ -2601,6 +2621,9 @@ class SR_OBJECT_ENT_ROUTE_ENTRY(bpy.types.PropertyGroup):
 class SR_OBJECT_ENT_MINIWORLD(bpy.types.PropertyGroup):
 #{
    world: bpy.props.StringProperty( name='world UID' )
+   proxy: bpy.props.PointerProperty( \
+               type=bpy.types.Object, name='proxy', \
+               poll=lambda self,obj: sr_filter_ent_type(obj,['ent_prop']))
 #}
 
 class SR_UL_ROUTE_NODE_LIST(bpy.types.UIList):
@@ -2950,40 +2973,44 @@ class SR_OBJECT_ENT_VOLUME(bpy.types.PropertyGroup):#{
    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" )
+   target_event: bpy.props.IntProperty( name="Enter Ev" )
+   target_event_leave: bpy.props.IntProperty( name="Leave Ev" )
 
    @staticmethod
-   def inspect_target( layout, data, propname ):#{
+   def inspect_target( layout, data, propname, evs = ['_event'] ):#{
       box = layout.box()
       box.prop( data[0], propname )
 
-      row = box.row()
-      row.prop( data[0], propname + '_event')
-
-      target = getattr( data[0], propname )
-      if target:#{
-         tipo = target.SR_data.ent_type
-         cls = globals()[ tipo ]
-
-         table = getattr( cls, 'sr_functions', None )
-         if table:#{
-            index = getattr( data[0], propname+'_event')
-            if index in table:
-               row.label( text=table[index] )
-            else:
-               row.label( text="undefined function" )
+      for evname in evs:#{
+         row = box.row()
+         row.prop( data[0], propname + evname )
+
+         target = getattr( data[0], propname )
+         if target:#{
+            tipo = target.SR_data.ent_type
+            cls = globals()[ tipo ]
+
+            table = getattr( cls, 'sr_functions', None )
+            if table:#{
+               index = getattr( data[0], propname + evname )
+               if index in table:
+                  row.label( text=table[index] )
+               else:
+                  row.label( text="undefined function" )
+            #}
+         #}
+         else:#{
+            row.label( text="..." )
+            row.enabled=False
          #}
-      #}
-      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' )
+      SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target', \
+            ['_event','_event_leave'] )
    #}
 #}