X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=d397cd793583ac38d90dd36a9ea5bd9fb2717c68;hb=15c0b8cb57ed5d10814103eaa0b5c06e8ae117e4;hp=239bfd03afa2f394f50694b2336aec4d8fa6c6de;hpb=53597f45307d8a2120e3a0bbe71797b216e8750b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index 239bfd0..d397cd7 100644 --- a/blender_export.py +++ b/blender_export.py @@ -39,12 +39,15 @@ sr_entity_list = [ ('ent_ccmd', 'CCmd', '', 17 ), ('ent_objective', 'Objective', '', 18 ), ('ent_challenge', 'Challenge', '', 19 ), - ('ent_relay', 'Relay', '', 20 ) + ('ent_relay', 'Relay', '', 20 ), + ('ent_miniworld', 'Mini World', '', 22 ), + ('ent_prop', 'Prop', '', 23 ) ] -MDL_VERSION_NR = 102 +MDL_VERSION_NR = 104 SR_TRIGGERABLE = [ 'ent_audio', 'ent_ccmd', 'ent_gate', 'ent_challenge', \ - 'ent_relay', 'ent_skateshop', 'ent_objective' ] + 'ent_relay', 'ent_skateshop', 'ent_objective', 'ent_route',\ + 'ent_miniworld' ] def get_entity_enum_id( alias ): #{ @@ -263,7 +266,11 @@ class ent_route(Structure): ("factive",c_float), ("board_transform",(c_float*3)*4), ("sm",mdl_submesh), - ("latest_pass",c_double)] + ("latest_pass",c_double), + ("id_camera",c_uint32), # v103+ + ] + + sr_functions = { 0: 'view' } #} class ent_water(Structure): @@ -277,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): @@ -463,7 +470,8 @@ class ent_worldinfo(Structure): _fields_ = [("pstr_name",c_uint32), ("pstr_author",c_uint32), # unused ("pstr_desc",c_uint32), # unused - ("timezone",c_float)] + ("timezone",c_float), + ("pstr_skybox",c_uint32)] #} class ent_ccmd(Structure): @@ -517,6 +525,22 @@ class ent_cubemap(Structure):#{ ("placeholder",c_uint32*2)] #} +class ent_miniworld(Structure):#{ + _fields_ = [("transform",mdl_transform), + ("pstr_world",c_uint32), + ("camera",c_uint32), + ("proxy",c_uint32)] + + 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 ): #{ if obj.type == 'ARMATURE': return 'mdl_armature' @@ -886,6 +910,10 @@ def sr_compile_material( mat ):#{ m.tex_diffuse = sr_compile_texture(inf['tex_diffuse']) #} + if mat.SR_data.tex_diffuse_rt >= 0:#{ + m.tex_diffuse = 0x80000000 | mat.SR_data.tex_diffuse_rt + #} + sr_compile.material_data.extend( bytearray(m) ) return index #} @@ -1328,7 +1356,7 @@ def sr_compile_menus( collection ): sr_compile_mesh_internal( obj ) #} - if item.type == 1 or item.type == 2:#{ + if item.type == 1 or item.type == 2 or item.type == 7:#{ item_button = item._anonymous_union.button item_button.pstr = sr_compile_string( obj_data.string ) item_button.stack_behaviour = int( obj_data.stack_behaviour ) @@ -1650,6 +1678,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 @@ -1826,6 +1855,10 @@ def sr_compile( collection ): if obj_data.target:#{ volume.target = sr_entity_id( obj_data.target ) volume._anon.trigger.event = obj_data.target_event + + ev = 0xffffffff if obj_data.target_event_leave < 0 else \ + obj_data.target_event_leave + volume._anon.trigger.event_leave = ev #} sr_ent_push(volume) @@ -1875,6 +1908,7 @@ def sr_compile( collection ): worldinfo.pstr_author = sr_compile_string( obj_data.author ) worldinfo.pstr_desc = sr_compile_string( obj_data.desc ) worldinfo.timezone = obj_data.timezone + worldinfo.pstr_skybox = sr_compile_string( obj_data.skybox ) sr_ent_push( worldinfo ) #} elif ent_type == 'ent_ccmd':#{ @@ -1938,6 +1972,24 @@ def sr_compile( collection ): cubemap.live = 60 sr_ent_push( cubemap ) #} + elif ent_type == 'ent_miniworld':#{ + miniworld = ent_miniworld() + obj_data = obj.SR_data.ent_miniworld[0] + + compile_obj_transform( obj, miniworld.transform ) + miniworld.pstr_world = sr_compile_string( obj_data.world ) + miniworld.proxy = sr_entity_id( obj_data.proxy ) + miniworld.camera = sr_entity_id( obj_data.camera ) + 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 ) + #} #} #} @@ -1989,6 +2041,7 @@ def sr_compile( collection ): route.pstr_name = sr_compile_string( obj_data.alias ) route.checkpoints_start = checkpoint_count route.checkpoints_count = 0 + route.id_camera = sr_entity_id( obj_data.cam ) for ci in range(3): route.colour[ci] = obj_data.colour[ci] @@ -2453,6 +2506,7 @@ class SR_MATERIAL_PANEL(bpy.types.Panel): _.layout.prop( active_mat.SR_data, "shader" ) _.layout.prop( active_mat.SR_data, "surface_prop" ) _.layout.prop( active_mat.SR_data, "collision" ) + _.layout.prop( active_mat.SR_data, "tex_diffuse_rt" ) if active_mat.SR_data.collision:#{ box = _.layout.box() @@ -2573,6 +2627,17 @@ class SR_OBJECT_ENT_ROUTE_ENTRY(bpy.types.PropertyGroup): poll=lambda self,obj: sr_filter_ent_type(obj,['ent_gate'])) #} +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'])) + camera: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Camera", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera'])) +#} + class SR_UL_ROUTE_NODE_LIST(bpy.types.UIList): #{ bl_idname = 'SR_UL_ROUTE_NODE_LIST' @@ -2889,11 +2954,16 @@ class SR_OBJECT_ENT_ROUTE(bpy.types.PropertyGroup): name="Alias",\ default="Untitled Course") + cam: bpy.props.PointerProperty( \ + type=bpy.types.Object, name="Viewpoint", \ + poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera'])) + @staticmethod def sr_inspector( layout, data ): #{ layout.prop( data[0], 'alias' ) layout.prop( data[0], 'colour' ) + layout.prop( data[0], 'cam' ) layout.label( text='Checkpoints' ) layout.template_list('SR_UL_ROUTE_NODE_LIST', 'Checkpoints', \ @@ -2915,40 +2985,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", default=-1 ) @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'] ) #} #} @@ -3174,7 +3248,8 @@ class SR_OBJECT_ENT_MENU_ITEM(bpy.types.PropertyGroup): ('3','toggle', ''), ('4','slider',''), ('5','page',''), - ('6','binding','')]) + ('6','binding',''), + ('7','visual(no colourize)','')]) @staticmethod def sr_inspector( layout, data ): @@ -3183,7 +3258,7 @@ class SR_OBJECT_ENT_MENU_ITEM(bpy.types.PropertyGroup): box = layout.box() box.prop( data, 'tipo' ) - if data.tipo == '0':#{ + if data.tipo == '0' or data.tipo == '7':#{ box.prop( data, 'string', text='Name' ) return #} @@ -3236,6 +3311,7 @@ class SR_OBJECT_ENT_WORLD_INFO(bpy.types.PropertyGroup): desc: bpy.props.StringProperty(name="Description") author: bpy.props.StringProperty(name="Author") timezone: bpy.props.FloatProperty(name="Timezone(hrs) (UTC0 +hrs)") + skybox: bpy.props.StringProperty(name="Skybox") #} class SR_OBJECT_ENT_CCMD(bpy.types.PropertyGroup): @@ -3359,6 +3435,7 @@ class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup): ent_objective: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_OBJECTIVE) ent_challenge: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_CHALLENGE) ent_relay: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_RELAY) + ent_miniworld: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MINIWORLD) ent_type: bpy.props.EnumProperty( name="Type", @@ -3514,6 +3591,8 @@ class SR_MATERIAL_PROPERTIES(bpy.types.PropertyGroup): cubemap: bpy.props.PointerProperty( \ type=bpy.types.Object, name="cubemap", \ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_cubemap'])) + + tex_diffuse_rt: bpy.props.IntProperty( name="diffuse: RT index", default=-1 ) #} # ---------------------------------------------------------------------------- # @@ -4586,7 +4665,7 @@ 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_RELAY,\ + SR_OBJECT_ENT_RELAY,SR_OBJECT_ENT_MINIWORLD,\ \ SR_OBJECT_PROPERTIES, SR_LIGHT_PROPERTIES, SR_BONE_PROPERTIES, SR_MESH_PROPERTIES, SR_MATERIAL_PROPERTIES \