X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=a7698e9bf2fa6f33334d1d2d31de574286b6c873;hb=1b522daa02f28128498b04def4d60b63e590d1f3;hp=c8639711a06a352c4a852945ea929c22e693aecd;hpb=4af3f141e332ae426ecda80ca4ccd8cf4e84d0cb;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index c863971..a7698e9 100644 --- a/blender_export.py +++ b/blender_export.py @@ -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 \