('ent_menuitem', 'Menu Item', '', 15 ),
('ent_worldinfo', 'World Info', '', 16 ),
('ent_ccmd', 'CCmd', '', 17 ),
- ('ent_challenge', 'Challenge', '', 18 ),
- ('ent_unlock', 'Unlockable', '', 19 ),
- ('ent_relay', 'Relay', '', 20 )
+ ('ent_objective', 'Objective', '', 18 ),
+ ('ent_challenge', 'Challenge', '', 19 ),
+ ('ent_relay', 'Relay', '', 20 ),
+ ('ent_miniworld', 'Mini World', '', 22 ),
+ ('ent_prop', 'Prop', '', 23 ),
+ ('ent_list', 'Entity List', '', 24 ),
+ ('ent_region', 'Region', '', 25 )
]
-MDL_VERSION_NR = 102
-SR_TRIGGERABLE = [ 'ent_audio', 'ent_ccmd', 'ent_gate', 'ent_unlock', \
- 'ent_relay', 'ent_skateshop', 'ent_challenge' ]
+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_region' ]
def get_entity_enum_id( alias ):
#{
#}
#}
+ if alias == 'ent_cubemap': return 21
+
return 0
#}
("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_list(Structure):#{
+ _fields_ = [("start",c_uint16),("count",c_uint16)]
#}
class ent_water(Structure):
class volume_trigger(Structure):
#{
_fields_ = [("event",c_uint32),
- ("blank",c_uint32)]
+ ("event_leave",c_uint32)]
#}
class volume_particles(Structure):
_fields_ = [("id_display",c_uint32),
("id_info",c_uint32)]
#}
+class ent_skateshop_server(Structure):
+#{
+ _fields_ = [("id_lever",c_uint32)]
+#}
class ent_skateshop_anon_union(Union):
#{
_fields_ = [("boards",ent_skateshop_boards),
("character",ent_skateshop_characters),
- ("worlds",ent_skateshop_worlds)]
+ ("worlds",ent_skateshop_worlds),
+ ("server",ent_skateshop_server)]
#}
class ent_skateshop(Structure):
#{
_fields_ = [("transform",mdl_transform), ("type",c_uint32),
("id_camera",c_uint32),
("_anonymous_union",ent_skateshop_anon_union)]
+
+ sr_functions = { 0: 'trigger' }
#}
class ent_swspreview(Structure):
# Menu
# -----------------------------------------------------------------
+class ent_menuitem_visual(Structure):
+#{
+ _fields_ = [("pstr_name",c_uint32)]
+#}
class ent_menuitem_slider(Structure):
#{
_fields_ = [("id_min",c_uint32),
#}
class ent_menuitem_button(Structure):
#{
- _fields_ = [("pstr",c_uint32)]
+ _fields_ = [("pstr",c_uint32),
+ ("stack_behaviour",c_uint32)]
#}
class ent_menuitem_checkmark(Structure):
#{
("id_entrypoint",c_uint32),
("id_viewpoint",c_uint32)]
#}
+class ent_menuitem_binding(Structure):
+#{
+ _fields_ = [("pstr_bind",c_uint32),
+ ("font_variant",c_uint32)]
+#}
class ent_menuitem_anon_union(Union):
#{
_fields_ = [("slider",ent_menuitem_slider),
("button",ent_menuitem_button),
("checkmark",ent_menuitem_checkmark),
- ("page",ent_menuitem_page)]
+ ("page",ent_menuitem_page),
+ ("visual",ent_menuitem_visual),
+ ("binding",ent_menuitem_binding)]
#}
class ent_menuitem(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):
_fields_ = [("pstr_command",c_uint32)]
#}
-class ent_challenge(Structure):#{
+class ent_objective(Structure):#{
_fields_ = [("transform",mdl_transform),
("submesh_start",c_uint32), ("submesh_count",c_uint32),
+ ("flags",c_uint32),
("id_next",c_uint32),
- ("filter",c_uint32),
+ ("filter",c_uint32),("filter2",c_uint32),
("id_win",c_uint32),
("win_event",c_uint32),
("time_limit",c_float)]
sr_functions = { 0: 'trigger',
- 1: 'start_challenge' }
+ 2: 'show',
+ 3: 'hide' }
#}
-class ent_unlock(Structure):#{
- _fields_ = [("pstr_alias",c_uint32),
+class ent_challenge(Structure):#{
+ _fields_ = [("transform",mdl_transform),
+ ("pstr_alias",c_uint32),
+ ("flags",c_uint32),
("target",c_uint32),
("target_event",c_uint32),
- ("status",c_uint32)]
- sr_functions = { 0: 'unlock' }
+ ("reset",c_uint32),
+ ("reset_event",c_uint32),
+ ("first",c_uint32),
+ ("camera",c_uint32),
+ ("status",c_uint32)] #runtime
+ sr_functions = { 0: 'unlock',
+ 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):#{
sr_functions = { 0: 'trigger' }
#}
+class ent_cubemap(Structure):#{
+ _fields_ = [("co",c_float*3),
+ ("resolution",c_uint32), #placeholder
+ ("live",c_uint32), #placeholder
+ ("texture_id",c_uint32), #engine
+ ("framebuffer_id",c_uint32),#engine
+ ("renderbuffer_id",c_uint32),#engine
+ ("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'
elif obj.type == 'LIGHT': return 'ent_light'
elif obj.type == 'CAMERA': return 'ent_camera'
+ elif obj.type == 'LIGHT_PROBE' and obj.data.type == 'CUBEMAP':
+ return 'ent_cubemap'
else: return obj.SR_data.ent_type
#}
return texture_index
#}
-def sr_compile_material( mat ):
-#{
+def sr_compile_material( mat ):#{
if mat == None:
return 0
if mat.name in sr_compile.material_cache:
#}
if mat.SR_data.shader == 'invisible': flags |= 0x10
if mat.SR_data.shader == 'boundary': flags |= (0x10|0x20)
+ if mat.SR_data.shader == 'walking': flags |= (0x10|0x80)
#}
m.flags = flags
m.surface_prop = int(mat.SR_data.surface_prop)
+ inf = material_info( mat )
if mat.SR_data.shader == 'standard': m.shader = 0
if mat.SR_data.shader == 'standard_cutout': m.shader = 1
if mat.SR_data.shader == 'fxglow':#{
m.shader = 7
#}
-
- inf = material_info( mat )
- if mat.SR_data.shader == 'standard' or \
- mat.SR_data.shader == 'standard_cutout' or \
- mat.SR_data.shader == 'terrain_blend' or \
- mat.SR_data.shader == 'vertex_blend' or \
- mat.SR_data.shader == 'fxglow': #{
+ if mat.SR_data.shader == 'cubemap':#{
+ m.shader = 8
+ m.tex_none0 = sr_entity_id( mat.SR_data.cubemap )
+
+ m.colour[0] = pow( mat.SR_data.tint[0], 1.0/2.2 )
+ m.colour[1] = pow( mat.SR_data.tint[1], 1.0/2.2 )
+ m.colour[2] = pow( mat.SR_data.tint[2], 1.0/2.2 )
+ m.colour[3] = pow( mat.SR_data.tint[3], 1.0/2.2 )
+ #}
+
+ if mat.SR_data.shader == 'walking':#{
+ m.shader = 9
+ #}
+
+ if mat.SR_data.shader in ['standard', 'standard_cutout', 'terrain_blend', \
+ 'vertex_blend', 'fxglow', 'cubemap' ]: #{
if 'tex_diffuse' in inf:
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
#}
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 )
+ #}
+ elif item.type == 0:#{
+ item_visual = item._anonymous_union.visual
+ item_visual.pstr_name = sr_compile_string( obj_data.string )
#}
elif item.type == 3:#{
item_checkmark = item._anonymous_union.checkmark
item_page.id_entrypoint = sr_entity_id( obj_data.newloc )
item_page.id_viewpoint = sr_entity_id( obj_data.camera )
#}
+ elif item.type == 6:#{
+ item_binding = item._anonymous_union.binding
+ item_binding.pstr_bind = sr_compile_string( obj_data.string )
+ item_binding.font_variant = obj_data.font_variant
+ #}
if obj_data.link0:
item.id_links[0] = sr_entity_id( obj_data.link0 )
# 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
- if ent_type == 'ent_challenge': continue
+ if ent_type == 'ent_objective': continue
+ if ent_type == 'ent_region': continue
#TODO: This is messy.
if ent_type == 'ent_gate':#{
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)
worldshop.id_display = sr_entity_id( obj_data.mark_display )
worldshop.id_info = sr_entity_id( obj_data.mark_info )
#}
+ elif skateshop.type == 3:#{
+ server = skateshop._anonymous_union.server
+ server.id_lever = sr_entity_id( obj_data.mark_display )
+ #}
skateshop.id_camera = sr_entity_id( obj_data.cam )
compile_obj_transform( obj, skateshop.transform )
sr_ent_push(skateshop)
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':#{
ccmd.pstr_command = sr_compile_string( obj_data.command )
sr_ent_push( ccmd )
#}
+ elif ent_type == 'ent_objective':#{
+ objective = ent_objective()
+ obj_data = obj.SR_data.ent_objective[0]
+ objective.id_next = sr_entity_id( obj_data.proxima )
+ objective.id_win = sr_entity_id( obj_data.target )
+ objective.win_event = obj_data.target_event
+ objective.filter = int(obj_data.filtrar)
+ objective.filter2 = 0
+ objective.time_limit = obj_data.time_limit
+
+ compile_obj_transform( obj, objective.transform )
+ objective.submesh_start, objective.submesh_count, _ = \
+ sr_compile_mesh_internal( obj )
+
+ sr_ent_push( objective )
+ #}
elif ent_type == 'ent_challenge':#{
challenge = ent_challenge()
obj_data = obj.SR_data.ent_challenge[0]
- challenge.id_next = sr_entity_id( obj_data.proxima )
- challenge.id_win = sr_entity_id( obj_data.target )
- challenge.win_event = obj_data.target_event
- challenge.filter = 0
- challenge.time_limit = obj_data.time_limit
-
compile_obj_transform( obj, challenge.transform )
- challenge.submesh_start, challenge.submesh_count, _ = \
- sr_compile_mesh_internal( obj )
-
+ challenge.pstr_alias = sr_compile_string( obj_data.alias )
+ challenge.target = sr_entity_id( obj_data.target )
+ challenge.target_event = obj_data.target_event
+ challenge.reset = sr_entity_id( obj_data.reset )
+ challenge.reset_event = obj_data.reset_event
+ challenge.first = sr_entity_id( obj_data.first )
+ challenge.flags = 0x00
+ challenge.camera = sr_entity_id( obj_data.camera )
+ if obj_data.time_limit: challenge.flags |= 0x01
+ challenge.status = 0
sr_ent_push( challenge )
#}
- elif ent_type == 'ent_unlock':#{
- unlock = ent_unlock()
- obj_data = obj.SR_data.ent_unlock[0]
- unlock.pstr_alias = sr_compile_string( obj_data.alias )
- unlock.target = sr_entity_id( obj_data.target )
- unlock.target_event = obj_data.target_event
- unlock.status = 0
- sr_ent_push( unlock )
+ 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()
relay.targets[3][1] = obj_data.target3_event
sr_ent_push( relay )
#}
+ elif ent_type == 'ent_cubemap':#{
+ cubemap = ent_cubemap()
+ co = obj.matrix_world @ Vector((0,0,0))
+ cubemap.co[0] = co[0]
+ cubemap.co[1] = co[2]
+ cubemap.co[2] = -co[1]
+ cubemap.resolution = 0
+ 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 )
+ #}
#}
#}
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]
#{
use_hidden: bpy.props.BoolProperty( name="use hidden", default=False )
export_dir: bpy.props.StringProperty( name="Export Dir", subtype='DIR_PATH' )
- gizmos: bpy.props.BoolProperty( name="Draw Gizmos", default=True )
+ gizmos: bpy.props.BoolProperty( name="Draw Gizmos", default=False )
panel: bpy.props.EnumProperty(
name='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()
row = box.row()
if (active_mat.SR_data.shader != 'invisible') and \
- (active_mat.SR_data.shader != 'boundary'):#{
+ (active_mat.SR_data.shader != 'boundary') and \
+ (active_mat.SR_data.shader != 'walking'):#{
row.prop( active_mat.SR_data, "skate_surface" )
row.prop( active_mat.SR_data, "grind_surface" )
row.prop( active_mat.SR_data, "grow_grass" )
box.prop( active_mat.SR_data, "shore_colour" )
box.prop( active_mat.SR_data, "ocean_colour" )
#}
+ elif active_mat.SR_data.shader == "cubemap":#{
+ box = _.layout.box()
+ box.prop( active_mat.SR_data, "cubemap" )
+ box.prop( active_mat.SR_data, "tint" )
+ #}
#}
#}
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'
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', \
#}
#}
+
+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",
target: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Target", \
- poll=lambda self,obj: sr_filter_ent_type(obj,\
- ['ent_audio','ent_skateshop','ent_ccmd',\
- 'ent_challenge']))
- target_event: bpy.props.IntProperty( name="Event/Method" )
+ poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE))
+ 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'] )
#}
#}
tipo: bpy.props.EnumProperty( name='Type',
items=[('0','boards',''),
('1','character',''),
- ('2','world','')] )
+ ('2','world',''),
+ ('4','server','')] )
mark_rack: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Board Rack", \
poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
mark_info: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Selected Board Info", \
- poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
+ poll=lambda self,obj: sr_filter_ent_type(obj,\
+ ['ent_marker','ent_prop']))
cam: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Viewpoint", \
poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera']))
newloc: bpy.props.PointerProperty( \
type=bpy.types.Object, name="New location", \
poll=lambda self,obj: sr_filter_ent_type(obj,['ent_menuitem']))
+ stack_behaviour: bpy.props.EnumProperty( name='Stack Behaviour',
+ items=[('0','append',''),
+ ('1','replace','')])
+
camera: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Camera", \
poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera']))
type=bpy.types.Object, name="Checked", \
poll=lambda self,obj: sr_filter_ent_type(obj,['ent_menuitem']))
+ font_variant: bpy.props.IntProperty( name="Font Variant" )
+
string: bpy.props.StringProperty( name="String" )
tipo: bpy.props.EnumProperty( name='Type',
items=[('0','visual',''),
('2','page button',''),
('3','toggle', ''),
('4','slider',''),
- ('5','page','')])
+ ('5','page',''),
+ ('6','binding',''),
+ ('7','visual(no colourize)','')])
@staticmethod
def sr_inspector( layout, data ):
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
#}
elif data.tipo == '1':#{
#}
elif data.tipo == '2':#{
box.prop( data, 'string', text='Page' )
- box.prop( data, 'newloc' )
+ box.prop( data, 'stack_behaviour' )
#}
elif data.tipo == '3':#{
box.prop( data, 'string', text='Data (i32)' )
box.prop( data, 'camera', text='Viewpoint' )
return
#}
+ elif data.tipo == '6':#{
+ box.prop( data, 'string', text='ID' )
+ box.prop( data, 'font_variant' )
+ return
+ #}
box = box.box()
box.label( text="Links" )
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):
command: bpy.props.StringProperty(name="Command Line")
#}
-class SR_OBJECT_ENT_CHALLENGE(bpy.types.PropertyGroup):#{
+class SR_OBJECT_ENT_OBJECTIVE(bpy.types.PropertyGroup):#{
proxima: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Next", \
- poll=lambda self,obj: sr_filter_ent_type(obj,['ent_challenge']))
+ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_objective']))
target: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Win", \
poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE))
target_event: bpy.props.IntProperty( name="Event/Method" )
time_limit: bpy.props.FloatProperty( name="Time Limit", default=1.0 )
+ filtrar: bpy.props.EnumProperty( name='Filter',\
+ items=[('0','none',''),
+ (str(0x1),'trick_shuvit',''),
+ (str(0x2),'trick_kickflip',''),
+ (str(0x4),'trick_treflip',''),
+ (str(0x1|0x2|0x4),'trick_any',''),
+ (str(0x8),'flip_back',''),
+ (str(0x10),'flip_front',''),
+ (str(0x8|0x10),'flip_any',''),
+ (str(0x20),'grind_truck_any',''),
+ (str(0x40),'grind_board_any',''),
+ (str(0x20|0x40),'grind_any',''),
+ (str(0x80),'footplant',''),
+ (str(0x100),'passthrough',''),
+ ])
@staticmethod
def sr_inspector( layout, data ):#{
layout.prop( data[0], 'proxima' )
layout.prop( data[0], 'time_limit' )
+ layout.prop( data[0], 'filtrar' )
SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target' )
#}
#}
-class SR_OBJECT_ENT_UNLOCK(bpy.types.PropertyGroup):#{
+class SR_OBJECT_ENT_CHALLENGE(bpy.types.PropertyGroup):#{
alias: bpy.props.StringProperty( name="Alias" )
+
target: bpy.props.PointerProperty( \
- type=bpy.types.Object, name="Target", \
+ type=bpy.types.Object, name="On Complete", \
poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE))
target_event: bpy.props.IntProperty( name="Event/Method" )
+ reset: bpy.props.PointerProperty( \
+ type=bpy.types.Object, name="On Reset", \
+ poll=lambda self,obj: sr_filter_ent_type(obj,SR_TRIGGERABLE))
+ reset_event: bpy.props.IntProperty( name="Event/Method" )
+
+ time_limit: bpy.props.BoolProperty( name="Time Limit" )
+
+ first: bpy.props.PointerProperty( \
+ type=bpy.types.Object, name="First Objective", \
+ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_objective']))
+
+ camera: bpy.props.PointerProperty( \
+ type=bpy.types.Object, name="Camera", \
+ 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], 'camera' )
+ layout.prop( data[0], 'first' )
+ layout.prop( data[0], 'time_limit' )
SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'target' )
+ SR_OBJECT_ENT_VOLUME.inspect_target( layout, data, 'reset' )
#}
#}
+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", \
ent_menuitem: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MENU_ITEM)
ent_worldinfo: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_WORLD_INFO)
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_unlock: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_UNLOCK)
+ 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",
('invisible','Invisible',''),
('boundary','Boundary',''),
('fxglow','FX Glow',''),
+ ('cubemap','Cubemap',''),
+ ('walking','Walking','')
])
surface_prop: bpy.props.EnumProperty(
default=Vector((0.0,0.006,0.03)),\
description="Water colour in the deep bits"\
)
+ tint: bpy.props.FloatVectorProperty( \
+ name="Tint",\
+ subtype='COLOR',\
+ min=0.0,max=1.0,\
+ size=4,\
+ default=Vector((1.0,1.0,1.0,1.0)),\
+ description="Reflection tint"\
+ )
+
+ 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 )
#}
# ---------------------------------------------------------------------------- #
# Draw coloured arrow
#
-def cv_draw_arrow( p0, p1, c0, size=0.25 ):
+def cv_draw_arrow( p0, p1, c0, size=0.25, outline=True ):
#{
global cv_view_verts, cv_view_colours
tx = Vector((1,0,0))
ty = Vector((1,0,0))
cv_tangent_basis( n, tx, ty )
-
+ tx *= 0.5
+ ty *= 0.5
+
+ if outline:#{
+ cv_draw_lines()
+ gpu.state.line_width_set(1.0)
+ #}
+
cv_view_verts += [p0,p1, midpt+(tx-n)*size,midpt, midpt+(-tx-n)*size,midpt ]
cv_view_colours += [c0,c0,c0,c0,c0,c0]
- #cv_draw_lines()
+ cv_draw_lines()
+
+ if outline:#{
+ gpu.state.line_width_set(3.0)
+ cv_view_verts += [p0,p1,midpt+(tx-n)*size,midpt,midpt+(-tx-n)*size,midpt]
+ b0 = (0,0,0)
+ cv_view_colours += [b0,b0,b0,b0,b0,b0]
+ cv_draw_lines()
+ gpu.state.line_width_set(2.0)
+ #}
#}
def cv_draw_line_dotted( p0, p1, c0, dots=10 ):
data = obj.SR_data.ent_volume[0]
if data.subtype == '0':#{
- cv_draw_ucube( obj.matrix_world, (0,1,0) )
+ cv_draw_ucube( obj.matrix_world, (0,1,0), Vector((0.99,0.99,0.99)) )
if data.target:#{
- cv_draw_arrow( obj.location, data.target.location, (0,1,0) )
+ cv_draw_arrow( obj.location, data.target.location, (1,1,1) )
#}
#}
elif data.subtype == '1':#{
cv_draw_ucube( obj.matrix_world, (1,1,0) )
if data.target:#{
- cv_draw_arrow( obj.location, data.target.location, (1,1,0) )
+ cv_draw_arrow( obj.location, data.target.location, (1,1,1) )
#}
#}
#}
path = solve_graph( dij, gi.name, gj.name )
if path:#{
- cv_draw_arrow(gi.location,dij.points[path[0]],cc,1.5)
- cv_draw_arrow(dij.points[path[len(path)-1]],gj.location,cc,1.5)
+ cv_draw_arrow(gi.location,dij.points[path[0]],cc,1.5,False)
+ cv_draw_arrow(dij.points[path[len(path)-1]],gj.location,cc,1.5,False)
for j in range(len(path)-1):#{
i0 = path[j]
i1 = path[j+1]
o0 = dij.points[ i0 ]
o1 = dij.points[ i1 ]
- cv_draw_arrow(o0,o1,cc,1.5)
+ cv_draw_arrow(o0,o1,cc,1.5,False)
#}
#}
else:#{
cv_view_colours = []
cv_view_shader.bind()
- gpu.state.depth_mask_set(False)
+ gpu.state.depth_mask_set(True)
gpu.state.line_width_set(2.0)
gpu.state.face_culling_set('BACK')
gpu.state.depth_test_set('LESS')
elif ent_type == 'ent_volume':#{
cv_ent_volume( obj )
#}
- elif ent_type == 'ent_challenge':#{
- data = obj.SR_data.ent_challenge[0]
+ elif ent_type == 'ent_objective':#{
+ data = obj.SR_data.ent_objective[0]
if data.proxima:#{
- cv_draw_arrow( obj.location, data.proxima.location, (0,0.2,1.0) )
+ cv_draw_arrow( obj.location, data.proxima.location, (1,0.6,0.2) )
#}
if data.target:
- cv_draw_arrow( obj.location, data.target.location, (0,1.0,0.0) )
+ cv_draw_arrow( obj.location, data.target.location, (1,1,1) )
#}
elif ent_type == 'ent_relay':#{
data = obj.SR_data.ent_relay[0]
if data.target0:
- cv_draw_arrow( obj.location, data.target0.location, (0,1,0) )
+ cv_draw_arrow( obj.location, data.target0.location, (1,1,1) )
if data.target1:
- cv_draw_arrow( obj.location, data.target1.location, (0,1,0) )
+ cv_draw_arrow( obj.location, data.target1.location, (1,1,1) )
if data.target2:
- cv_draw_arrow( obj.location, data.target2.location, (0,1,0) )
+ cv_draw_arrow( obj.location, data.target2.location, (1,1,1) )
if data.target3:
- cv_draw_arrow( obj.location, data.target3.location, (0,1,0) )
+ cv_draw_arrow( obj.location, data.target3.location, (1,1,1) )
#}
- elif ent_type == 'ent_unlock':#{
- data = obj.SR_data.ent_unlock[0]
+ elif ent_type == 'ent_challenge':#{
+ data = obj.SR_data.ent_challenge[0]
if data.target:
- cv_draw_arrow( obj.location, data.target.location, (0,1.0,0.0) )
+ cv_draw_arrow( obj.location, data.target.location, (1,1,1) )
+ if data.reset:
+ cv_draw_arrow( obj.location, data.reset.location, (0.9,0,0) )
+ if data.first:
+ cv_draw_arrow( obj.location, data.first.location, (1,0.6,0.2) )
+
+ cc1 = (0.4,0.3,0.2)
+ info_cu = Vector((1.2,0.01,0.72))*0.5
+ info_co = Vector((0.0,0.0,0.72))*0.5
+ cv_draw_ucube( obj.matrix_world, cc1, info_cu, info_co)
+ if data.camera:
+ cv_draw_line_dotted( obj.location, data.camera.location, (1,1,1))
+
+ vs = [Vector((-0.2,0.0,0.10)),Vector((-0.2,0.0,0.62)),\
+ Vector(( 0.2,0.0,0.62)),Vector((-0.2,0.0,0.30)),\
+ Vector(( 0.1,0.0,0.30))]
+ for v in range(len(vs)):#{
+ vs[v] = obj.matrix_world @ vs[v]
+ #}
+
+ cv_view_verts += [vs[0],vs[1],vs[1],vs[2],vs[3],vs[4]]
+ cv_view_colours += [cc1,cc1,cc1,cc1,cc1,cc1]
#}
elif ent_type == 'ent_audio':#{
if obj.SR_data.ent_audio[0].flag_3d:
info_cu = Vector((1.2,0.01,0.3))*0.5
info_co = Vector((0.0,0.0,0.0))*0.5
#}
+ elif data.tipo == '3':#{
+ rack = None
+ display = None
+ info = None
+ #}
+ elif data.tipo == '4':#{
+ rack = None
+ display = None
+ info = None
+ #}
if rack:
cv_draw_ucube( rack.matrix_world, cc, rack_cu, rack_co )
SR_OBJECT_ENT_FONT,SR_OBJECT_ENT_TRAFFIC,SR_OBJECT_ENT_SKATESHOP,\
SR_OBJECT_ENT_WORKSHOP_PREVIEW,SR_OBJECT_ENT_MENU_ITEM,\
SR_OBJECT_ENT_WORLD_INFO,SR_OBJECT_ENT_CCMD,\
- SR_OBJECT_ENT_CHALLENGE,SR_OBJECT_ENT_UNLOCK,SR_OBJECT_ENT_RELAY,\
+ 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 \