modular stuffs
[carveJwlIkooP6JGAAIwe30JlM.git] / blender_export.py
index c8639711a06a352c4a852945ea929c22e693aecd..a7698e9bf2fa6f33334d1d2d31de574286b6c873 100644 (file)
@@ -17,17 +17,31 @@ bl_info = {
    "category":"Import/Export",
 }
 
-sr_entity_alias = {
-   'ent_gate': 1,
-   'ent_spawn': 2,
-   'ent_route_node': 3,
-   'ent_route': 4,
-   'ent_water': 5,
-   'ent_volume': 6,
-   'ent_audio': 7,
-   'ent_marker': 8,
-   'ent_glyph': 9
-}
+sr_entity_list = [
+   ('none',             'None',           '', 0  ),
+   ('ent_gate',         'Gate',           '', 1  ),
+   ('ent_spawn',        'Spawn Point',    '', 2  ),
+   ('ent_route_node',   'Routing Path',   '', 3  ),
+   ('ent_route',        'Skate Course',   '', 4  ),
+   ('ent_water',        'Water Surface',  '', 5  ),
+   ('ent_volume',       'Volume/Trigger', '', 6  ),
+   ('ent_audio',        'Audio',          '', 7  ),
+   ('ent_marker',       'Marker',         '', 8  ),
+   ('ent_font',         'Font',           '', 9  ),
+   ('ent_font_variant', 'Font:Variant',   '', 10 ),
+   ('ent_traffic',      'Traffic Model',  '', 11 ),
+]
+
+def get_entity_enum_id( alias ):
+#{
+   for et in sr_entity_list:#{
+      if et[0] == alias:#{
+         return et[3]
+      #}
+   #}
+
+   return 0
+#}
 
 class mdl_vert(Structure):              # 48 bytes. Quite large. Could compress
 #{                                      # the normals and uvs to i16s. Not an
@@ -107,7 +121,7 @@ class mdl_mesh(Structure):
                ("submesh_start",c_uint32),
                ("submesh_count",c_uint32),
                ("pstr_name",c_uint32),
-               ("flags",c_uint32),
+               ("entity_id",c_uint32),
                ("armature_id",c_uint32)]
 #}
 
@@ -121,7 +135,7 @@ class mdl_file(Structure):
 class mdl_texture(Structure):
 #{
    _fields_ = [("file",mdl_file),
-               ("type",c_uint32)]
+               ("glname",c_uint32)]
 #}
 
 class mdl_array(Structure):
@@ -538,7 +552,7 @@ def sr_compile_texture( img ):
    texture_index = (len(sr_compile.texture_data)//sizeof(mdl_texture)) +1
 
    tex = mdl_texture()
-   tex.type = 0
+   tex.glname = 0
 
    if sr_compile.pack_textures:#{
       filedata = qoi_encode( img )
@@ -565,12 +579,17 @@ def sr_compile_material( mat ):
    
    flags = 0x00
    if mat.SR_data.collision:#{
-      flags |= 0x2
-      if mat.SR_data.skate_surface: flags |= 0x1
-      if mat.SR_data.grind_surface: flags |= (0x8|0x1)
+      flags |= 0x2 # collision flag
+      if (mat.SR_data.shader != 'invisible') and \
+         (mat.SR_data.shader != 'boundary'):#{
+         if mat.SR_data.skate_surface: flags |= 0x1
+         if mat.SR_data.grow_grass: flags |= 0x4
+         if mat.SR_data.grind_surface: flags |= 0x8
+      #}
+      if mat.SR_data.shader == 'invisible': flags |= 0x10
+      if mat.SR_data.shader == 'boundary': flags |= (0x10|0x20)
    #}
 
-   if mat.SR_data.grow_grass: flags |= 0x4
    m.flags = flags
 
    m.surface_prop = int(mat.SR_data.surface_prop)
@@ -608,6 +627,14 @@ def sr_compile_material( mat ):
       m.colour1[2] = pow( mat.SR_data.ocean_colour[2], 1.0/2.2 )
       m.colour1[3] = 1.0
    #}
+
+   if mat.SR_data.shader == 'invisible':#{
+      m.shader = 5
+   #}
+
+   if mat.SR_data.shader == 'boundary':#{
+      m.shader = 6
+   #}
    
    inf = material_info( mat )
 
@@ -642,7 +669,16 @@ def sr_compile_mesh( obj ):
    node=mdl_mesh()
    compile_obj_transform(obj, node.transform)
    node.pstr_name = sr_compile_string(obj.name)
-   node.flags = 0
+   ent_type = obj_ent_type( obj )
+
+   node.entity_id = 0
+
+   if ent_type != 'none':#{
+      ent_id_lwr = sr_compile.entity_ids[obj.name]
+      ent_id_upr = get_entity_enum_id( obj_ent_type(obj) )
+      node.entity_id = (ent_id_upr << 16) | ent_id_lwr
+   #}
+   print( node.entity_id )
 
    can_use_cache = True
    armature = None
@@ -656,7 +692,6 @@ def sr_compile_mesh( obj ):
       #}
 
       if mod.type == 'ARMATURE': #{
-         node.flags = 1
          armature = mod.object
          rig_weight_groups = \
                ['0 [ROOT]']+[_.name for _ in sr_armature_bones(mod.object)]
@@ -1400,7 +1435,7 @@ def sr_compile( collection ):
 
             if obj_data.target:#{
                target = obj_data.target
-               volume.target.type = sr_entity_alias[obj_ent_type(target)]
+               volume.target.type = get_entity_enum_id( obj_ent_type(target) )
                volume.target.index = sr_compile.entity_ids[ target.name ]
             #}
 
@@ -1866,9 +1901,15 @@ class SR_MATERIAL_PANEL(bpy.types.Panel):
       _.layout.prop( active_mat.SR_data, "collision" )
 
       if active_mat.SR_data.collision:#{
-         _.layout.prop( active_mat.SR_data, "skate_surface" )
-         _.layout.prop( active_mat.SR_data, "grind_surface" )
-         _.layout.prop( active_mat.SR_data, "grow_grass" )
+         box = _.layout.box()
+         row = box.row()
+
+         if (active_mat.SR_data.shader != 'invisible') and \
+            (active_mat.SR_data.shader != 'boundary'):#{
+            row.prop( active_mat.SR_data, "skate_surface" )
+            row.prop( active_mat.SR_data, "grind_surface" )
+            row.prop( active_mat.SR_data, "grow_grass" )
+         #}
       #}
 
       if active_mat.SR_data.shader == "terrain_blend":#{
@@ -2449,6 +2490,13 @@ class SR_OBJECT_ENT_FONT(bpy.types.PropertyGroup):
    #}
 #}
 
+class SR_OBJECT_ENT_TRAFFIC(bpy.types.PropertyGroup):
+#{
+   track: bpy.props.PointerProperty(\
+               type=bpy.types.Object, name='track', \
+               poll=lambda self,obj: sr_filter_ent_type(obj,['ent_route_node']))
+#}
+
 class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup):
 #{
    ent_gate: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_GATE)
@@ -2459,19 +2507,10 @@ class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup):
    ent_marker: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MARKER)
    ent_glyph: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_GLYPH)
    ent_font: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_FONT)
+   ent_traffic: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_TRAFFIC)
    ent_type: bpy.props.EnumProperty(
       name="Type",
-      items=[('none', 'None', '', 0),
-             ('ent_gate','Gate','', 1),
-             ('ent_spawn','Spawn','', 2),
-             ('ent_route_node', 'Route Node', '', 3 ),
-             ('ent_route', 'Route', '', 4),
-             ('ent_water', 'Water Surface', '', 5),
-             ('ent_volume', 'Volume', '', 6 ),
-             ('ent_audio', 'Audio Files', '', 7),
-             ('ent_marker', 'Marker', '', 8),
-             ('ent_font', 'Font', '', 9),
-             ('ent_font_variant','Font variant','',10)],
+      items=sr_entity_list,
       update=sr_on_type_change
    )
 #}
@@ -2540,7 +2579,9 @@ class SR_MATERIAL_PROPERTIES(bpy.types.PropertyGroup):
       ('standard_cutout', "standard_cutout", ''),
       ('terrain_blend', "terrain_blend", ''),
       ('vertex_blend', "vertex_blend", ''),
-      ('water',"water",'')
+      ('water',"water",''),
+      ('invisible','Invisible',''),
+      ('boundary','Boundary','')
       ])
 
    surface_prop: bpy.props.EnumProperty(
@@ -2556,17 +2597,17 @@ class SR_MATERIAL_PROPERTIES(bpy.types.PropertyGroup):
    collision: bpy.props.BoolProperty( \
          name="Collisions Enabled",\
          default=True,\
-         description = "Can the player collide with this material"\
+         description = "Can the player collide with this material?"\
    )
    skate_surface: bpy.props.BoolProperty( \
-         name="Skate Surface", \
+         name="Skate Target", \
          default=True,\
          description = "Should the game try to target this surface?" \
    )
    grind_surface: bpy.props.BoolProperty( \
-         name="Grind Surface", \
-         default=False,\
-         description = "Grind face?" \
+         name="Grindable", \
+         default=True,\
+         description = "Can you grind on this surface?" \
    )
    grow_grass: bpy.props.BoolProperty( \
          name="Grow Grass", \
@@ -3450,7 +3491,7 @@ classes = [ SR_INTERFACE, SR_MATERIAL_PANEL,\
             SR_OBJECT_ENT_FONT_VARIANT,
             SR_OBJECT_ENT_GLYPH_ENTRY,\
             SR_UL_FONT_VARIANT_LIST,SR_UL_FONT_GLYPH_LIST,\
-            SR_OBJECT_ENT_FONT,\
+            SR_OBJECT_ENT_FONT,SR_OBJECT_ENT_TRAFFIC,\
             \
             SR_OBJECT_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES, 
             SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \