('ent_font', 'Font', '', 9 ),
('ent_font_variant', 'Font:Variant', '', 10 ),
('ent_traffic', 'Traffic Model', '', 11 ),
- ('ent_skateshop', 'Skate Shop', '', 12 )
+ ('ent_skateshop', 'Skate Shop', '', 12 ),
+ ('ent_camera', 'Camera', '', 13 )
]
def get_entity_enum_id( alias ):
_fields_ = [("transform",mdl_transform),
("id_display",c_uint32),
("id_info",c_uint32),
- ("id_rack",c_uint32)]
+ ("id_rack",c_uint32),
+ ("id_camera",c_uint32)]
+#}
+
+class ent_camera(Structure):
+#{
+ _fields_ = [("transform",mdl_transform),
+ ("fov",c_float)]
#}
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'
else: return obj.SR_data.ent_type
#}
light.colour[3] = obj.data.energy
sr_ent_push( light )
#}
+ elif ent_type == 'ent_camera': #{
+ cam = ent_camera()
+ compile_obj_transform( obj, cam.transform )
+ cam.fov = obj.data.angle
+ sr_ent_push(cam)
+ #}
elif ent_type == 'ent_gate': #{
gate = ent_gate()
obj_data = obj.SR_data.ent_gate[0]
skateshop.id_display = sr_entity_id( obj_data.mark_display )
skateshop.id_info = sr_entity_id( obj_data.mark_info )
skateshop.id_rack = sr_entity_id( obj_data.mark_rack )
+ skateshop.id_camera = sr_entity_id( obj_data.cam )
compile_obj_transform( obj, skateshop.transform )
sr_ent_push(skateshop)
#}
mark_info: bpy.props.PointerProperty( \
type=bpy.types.Object, name="Selected Board Info", \
poll=lambda self,obj: sr_filter_ent_type(obj,['ent_marker']))
+ cam: bpy.props.PointerProperty( \
+ type=bpy.types.Object, name="Viewpoint", \
+ poll=lambda self,obj: sr_filter_ent_type(obj,['ent_camera']))
#}
class SR_OBJECT_PROPERTIES(bpy.types.PropertyGroup):
rack_cu = Vector((3.15,2.0,0.1))*0.5
rack_co = Vector((0.0,0.0,0.0))
- display_cu = Vector((0.2,1.2,0.1))*0.5
+ display_cu = Vector((0.3,1.2,0.1))*0.5
display_co = Vector((0.0,0.0,0.1))*0.5
info_cu = Vector((1.2,0.01,0.3))*0.5
info_co = Vector((0.0,0.0,0.0))*0.5
struct{
v3f look_target;
- mdl_transform rack_root,
- display_root,
- info_root;
-
- enum camera_mode prev_camera_mode;
+ ent_skateshop *ptr_ent;
int active;
float factive;
VG_STATIC void global_skateshop_exit(void)
{
+ localplayer.immobile = 0;
global_skateshop.active = 0;
- localplayer.camera_mode = global_skateshop.prev_camera_mode;
}
VG_STATIC void skateshop_request_viewpage( u32 page )
vg_info( "Entering skateshop\n" );
localplayer.immobile = 1;
- global_skateshop.prev_camera_mode = localplayer.camera_mode;
- localplayer.camera_mode = k_cam_firstperson;
global_skateshop.active = 1;
global_skateshop.interface_loc = k_skateshop_loc_page__viewing;
v3_zero( localplayer.rb.w );
localplayer._walk.move_speed = 0.0f;
- struct{
- mdl_transform *transform;
- u32 id;
- }
- targets[] = {
- { &global_skateshop.rack_root, shop->id_rack, },
- { &global_skateshop.info_root, shop->id_info, },
- { &global_skateshop.display_root, shop->id_display, },
- };
-
- v3_copy( shop->transform.co, global_skateshop.look_target );
-
- for( u32 i=0; i<vg_list_size(targets); i++ ){
-
- u32 type = mdl_entity_id_type( targets[i].id ),
- index = mdl_entity_id_id( targets[i].id );
-
- if( type == k_ent_marker ){
- ent_marker *m = mdl_arritm( &world->ent_marker, index );
-
- *targets[i].transform = m->transform;
- }
- else{
- transform_identity( targets[i].transform );
- }
- }
+ global_skateshop.ptr_ent = shop;
skateshop_request_viewpage(0);
skateshop_loader_start( skateshop_scan_for_items );
global_skateshop.factive = vg_lerpf( global_skateshop.factive,
global_skateshop.active, rate );
-
if( !global_skateshop.active ) return;
- v3f delta;
- v3_sub( global_skateshop.look_target, localplayer.cam.pos, delta );
- v3_normalize( delta );
+ world_instance *world = get_active_world();
+
+ ent_skateshop *shop = global_skateshop.ptr_ent;
+ ent_camera *ref = mdl_arritm( &world->ent_camera,
+ mdl_entity_id_id(shop->id_camera) );
+ ent_marker *display = mdl_arritm( &world->ent_marker,
+ mdl_entity_id_id(shop->id_display) );
+
+ v3f dir = {0.0f,-1.0f,0.0f};
+ mdl_transform_vector( &ref->transform, dir, dir );
+ player_vector_angles( localplayer.cam_override_angles, dir, 1.0f, 0.0f );
+
+ v3f lookat;
+ v3_sub( display->transform.co, localplayer.rb.co, lookat );
+
+ q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f},
+ atan2f(lookat[0],lookat[2]) );
- v3f target;
- player_vector_angles( target, delta, 1.0f, 0.0f );
+ v3_copy( ref->transform.co, localplayer.cam_override_pos );
+ localplayer.cam_override_fov = ref->fov;
- camera_lerp_angles( localplayer.angles, target,
- global_skateshop.factive, localplayer.angles);
+ localplayer.cam_override_strength = global_skateshop.factive;
if( global_skateshop.interaction_cooldown > 0.0f ){
global_skateshop.interaction_cooldown -= vg.time_delta;
}
if( vg_input_button_down( &input_menu_back ) ){
- global_skateshop.active = 0;
+ global_skateshop_exit();
return;
}
}
- else if( global_skateshop.interface_loc <= k_skateshop_loc_page__selected ){
- if( vg_input_button_down( &input_menu_back ) ){
- global_skateshop.interface_loc = k_skateshop_loc_page__viewing;
- return;
- }
-
- if( fabsf(h) > 0.25f ){
- if( global_skateshop.interface_loc == k_skateshop_loc_select_use ){
- global_skateshop.interface_loc = k_skateshop_loc_select_cancel;
- return;
- }
- }
- else{
- if( global_skateshop.interface_loc == k_skateshop_loc_select_cancel ){
- global_skateshop.interface_loc = k_skateshop_loc_select_use;
- return;
- }
- }
- }
}
VG_STATIC void skateshop_init(void)
{
if( !global_skateshop.active ) return;
+ ent_skateshop *shop = global_skateshop.ptr_ent;
world_instance *world = get_active_world();
u32 slot_count = vg_list_size(global_skateshop.shop_view_slots);
if( slot->db->state != k_dynamic_board_state_loaded )
goto set_fade_amt;
- mdl_transform rack_xform;
- transform_identity( &rack_xform );
+ mdl_transform xform;
+ transform_identity( &xform );
+
+ xform.co[0] = -((float)i - ((float)slot_count)*0.5f)*0.45f;
- rack_xform.co[0] = -((float)i - ((float)slot_count)*0.5f)*0.45f;
+ ent_marker *rack = mdl_arritm( &world->ent_marker,
+ mdl_entity_id_id(shop->id_rack)),
+ *display = mdl_arritm( &world->ent_marker,
+ mdl_entity_id_id(shop->id_display));
- mdl_transform_mul( &global_skateshop.rack_root,
- &rack_xform, &rack_xform );
+ mdl_transform_mul( &rack->transform, &xform, &xform );
if( slot->db->registry_id == global_skateshop.selected_registry_id ){
selected = 1.0f;
}
float t = slot->view_blend;
- v3_lerp( rack_xform.co, global_skateshop.display_root.co,
- t, rack_xform.co );
- q_nlerp( rack_xform.q, global_skateshop.display_root.q,
- t, rack_xform.q );
- v3_lerp( rack_xform.s, global_skateshop.display_root.s,
- t, rack_xform.s );
+ v3_lerp( xform.co, display->transform.co, t, xform.co );
+ q_nlerp( xform.q, display->transform.q, t, xform.q );
+ v3_lerp( xform.s, display->transform.s, t, xform.s );
m4x3f mmdl;
- mdl_transform_m4x3( &rack_xform, mmdl );
+ mdl_transform_m4x3( &xform, mmdl );
render_board( &main_camera, world, &slot->db->board, mmdl,
k_board_shader_entity );
slot->view_blend = vg_lerpf( slot->view_blend, selected, rate );
}
+ ent_marker *info = mdl_arritm( &world->ent_marker,
+ mdl_entity_id_id(shop->id_info));
m4x3f mtext;
- mdl_transform_m4x3( &global_skateshop.info_root, mtext );
+ mdl_transform_m4x3( &info->transform, mtext );
- m4x3f mlocal = {{0.2f,0.0f,0.0f},{0.0f,0.2f,0.0f},{0.0f,0.0f,0.03f},
- {-font3d_string_width( &world_global.font,0,
- "Made by... Bob man 123" )*0.2f*0.5f,0.0f,0.0f}
- };
+ const char *text_title = "Fish - Title";
+ const char *text_author = "by Shaniqua";
- m4x3_mul( mtext, mlocal, mtext );
+ m4x3f mlocal, mmdl;
+ m4x3_identity( mlocal );
+
+ float scale = 0.2f;
+
+ mlocal[0][0] = scale; mlocal[1][1] = scale;
+ mlocal[2][2] = 0.03f;
+ mlocal[3][0] = -font3d_string_width(&world_global.font,0,text_title);
+ mlocal[3][0] *= scale*0.5f;
+ mlocal[3][1] = 0.1f;
+ m4x3_mul( mtext, mlocal, mmdl );
font3d_bind( &world_global.font, &main_camera );
- shader_model_font_uColour( (v4f){1.0f,0.5f,0.1f,1.0f} );
- font3d_simple_draw( &world_global.font, 0, "Made by... Bob man 123",
- &main_camera, mtext );
+ shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} );
+ font3d_simple_draw( &world_global.font, 0, text_title, &main_camera, mmdl );
+
+ scale *= 0.4f;
+ mlocal[0][0] = scale; mlocal[1][1] = scale;
+ mlocal[3][0] = -font3d_string_width(&world_global.font,0,text_author);
+ mlocal[3][0] *= scale*0.5f;
+ mlocal[3][1] = 0.0f;
+ m4x3_mul( mtext, mlocal, mmdl );
+ font3d_simple_draw( &world_global.font, 0, text_author, &main_camera, mmdl );
}
#endif /* ENT_SKATESHOP_C */