('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 )
]
-MDL_VERSION_NR = 102
+MDL_VERSION_NR = 103
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 ):
#{
("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):
("placeholder",c_uint32*2)]
#}
+class ent_miniworld(Structure):#{
+ _fields_ = [("transform",mdl_transform),
+ ("pstr_world",c_uint32),
+ ("purpose",c_int32)]
+
+ sr_functions = { 0: 'zone' }
+#}
+
def obj_ent_type( obj ):
#{
if obj.type == 'ARMATURE': return 'mdl_armature'
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 )
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 )
+ sr_ent_push( miniworld )
+ #}
#}
#}
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]
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' )
+#}
+
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', \
('3','toggle', ''),
('4','slider',''),
('5','page',''),
- ('6','binding','')])
+ ('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
#}
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",
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 \