("angle_limits",(c_float*3)*2),
("hitbox",(c_float*3)*2)]
+class classtype_achievement_box(Structure):
+ _pack_ = 1
+ _fields_ = [("pstr_name",c_uint32)]
+
# Exporter
# ==============================================================================
_extendb( tree, b, d+1 )
for obj1 in n.children:
- _extend( tree, obj1, d+1 )
+ nonlocal collection
+ for c1 in obj1.users_collection:
+ if c1 == collection:
+ _extend( tree, obj1, d+1 )
+ break
p["children"] += [tree]
graph_lookup[n] = tree
block.bbx[1][2] = -source.v0[1]
entdata_buffer += [block]
+ elif classtype == 'k_classtype_achievement_box':
+ node.classtype = 13
+
+ entdata_length += sizeof( classtype_achievement_box )
+ ach = classtype_achievement_box()
+ ach.pstr_name = emplace_string( obj.cv_data.strp )
+ entdata_buffer += [ach]
+
elif classtype == 'k_classtype_spawn':
node.classtype = 3
obj.matrix_world.to_quaternion() @ Vector((0,0,-6+1.5))
drawbline( obj.location, p1, sw,sw2 )
+ elif obj.cv_data.classtype == 'k_classtype_achievement_box':
+ a = Vector((-1,-1,-1))
+ b = Vector((1,1,1))
+
+ vs = [None]*8
+ vs[0] = obj.matrix_world @ Vector((a[0], a[1], a[2]))
+ vs[1] = obj.matrix_world @ Vector((a[0], b[1], a[2]))
+ vs[2] = obj.matrix_world @ Vector((b[0], b[1], a[2]))
+ vs[3] = obj.matrix_world @ Vector((b[0], a[1], a[2]))
+ vs[4] = obj.matrix_world @ Vector((a[0], a[1], b[2]))
+ vs[5] = obj.matrix_world @ Vector((a[0], b[1], b[2]))
+ vs[6] = obj.matrix_world @ Vector((b[0], b[1], b[2]))
+ vs[7] = obj.matrix_world @ Vector((b[0], a[1], b[2]))
+
+ indices = [(0,1),(1,2),(2,3),(3,0),(4,5),(5,6),(6,7),(7,4),\
+ (0,4),(1,5),(2,6),(3,7)]
+
+ for l in indices:
+ v0 = vs[l[0]]
+ v1 = vs[l[1]]
+ verts += [(v0[0],v0[1],v0[2])]
+ verts += [(v1[0],v1[1],v1[2])]
+ colours += [(0,1,0,1),(0,1,0,1)]
elif obj.cv_data.classtype == 'k_classtype_block':
a = obj.data.cv_data.v0
class CV_OBJ_SETTINGS(bpy.types.PropertyGroup):
uid: bpy.props.IntProperty( name="" )
+ strp: bpy.props.StringProperty(name="string")
+
target: bpy.props.PointerProperty( type=bpy.types.Object, name="target", \
poll=cv_poll_target )
target1: bpy.props.PointerProperty( type=bpy.types.Object, name="target1", \
('k_classtype_route', "k_classtype_route", "", 9 ),
('k_classtype_bone',"k_classtype_bone","",10),
('k_classtype_SKELETON', "","", 11 ),
- ('k_classtype_SKIN',"","",12)
+ ('k_classtype_SKIN',"","",12),
+ ('k_classtype_achievement_box',"k_classtype_achievement_box","",13),
])
class CV_BONE_SETTINGS(bpy.types.PropertyGroup):
mesh = active_object.data
_.layout.label( text=F"(i) Data is stored in {mesh.name}" )
_.layout.prop( mesh.cv_data, "v0" )
+ elif active_object.cv_data.classtype == 'k_classtype_achievement_box':
+ _.layout.prop( active_object.cv_data, "strp" )
class CV_INTERFACE(bpy.types.Panel):
bl_idname = "VIEW3D_PT_carve"
# TODO
run_game(){
cd $_linux_folder
- ./skaterift
+ ./skaterift --samples=4
cd ./../
}
static void str_utf8_collapse( const char *str, char *buf, u32 length )
{
- if( length == 0 )
- {
- strncpy( buf, "User", length );
- return;
- }
-
u8 *ustr = (u8 *)str;
u32 utf32_code = 0x00000000;
u32 i=0, j=0, utf32_byte_ct=0;
return index;
}
-static aatree_ptr highscore_set_user_nickname( u64 steamid, char nick[10] )
+static aatree_ptr highscore_set_user_nickname( u64 steamid, char nick[16] )
{
char name[17];
for( int i=0; i<16; i++ )
static void vg_start(void)
{
- player_load_model( "ch_new" );
+ player_load_model( "ch_outlaw" );
reset_player( 1, (const char *[]){ "start" } );
}
k_classtype_route = 9,
k_classtype_bone = 10,
k_classtype_skeleton = 11,
- k_classtype_skin = 12
+ k_classtype_skin = 12,
+ k_classtype_achievement_box = 13
};
u32 skeleton;
};
+struct classtype_achievement_box
+{
+ u32 pstr_name;
+};
+
#pragma pack(pop)
/*
nick.inetmsg_id = k_inetmsg_set_nickname;
memset( nick.nickname, 0, 16 );
- strncpy( nick.nickname, steam_username_at_startup, 16 );
+ vg_strncpy( steam_username_at_startup, nick.nickname, 16 );
SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
hSteamNetworkingSockets, cremote, &nick, sizeof(netmsg_set_nickname),
k_board_radius = 0.3f,
k_board_length = 0.45f,
k_board_allowance = 0.04f,
- k_friction_lat = 8.8f,
+ //k_friction_lat = 8.8f,
+ k_friction_lat = 12.0f,
k_friction_resistance = 0.01f,
k_max_push_speed = 16.0f,
k_push_accel = 10.0f,
" float s = -sin(w*0.2);\n"
" float r = 0.2;\n"
"\n"
-" float w1 = clamp( w*4.0 - a_co.y*10.0, -1.0, 1.0 ) * (3.14159265*2.5);\n"
+" float w1 = clamp( w*4.0 - a_co.y*10.0, -1.0, 1.0 ) * (3.14159265*0.5);\n"
" float c1 = cos(w1);\n"
" float s1 = sin(w1);\n"
"\n"
vec3 qnorm = normalize(floor(aNorm*2.0)*0.5) + vec3(0.001,0.0,0.0);
- vfrag = do_light_diffuse( vfrag, qnorm );
- vfrag = do_light_spec( vfrag, qnorm, halfview, 0.1 );
+ vfrag = mix( vfrag, do_light_diffuse( vfrag, qnorm ), 0.5 );
+ //vfrag = do_light_spec( vfrag, qnorm, halfview, 0.1 );
vfrag = do_light_shadowing( vfrag );
vfrag = apply_fog( vfrag, fdist );
float opacity = clamp( fdist, 0.1, 1.0 );
-
FragColor = vec4(vfrag,opacity);
}
"\n"
" vec3 qnorm = normalize(floor(aNorm*2.0)*0.5) + vec3(0.001,0.0,0.0);\n"
"\n"
-" vfrag = do_light_diffuse( vfrag, qnorm );\n"
-" vfrag = do_light_spec( vfrag, qnorm, halfview, 0.1 );\n"
+" vfrag = mix( vfrag, do_light_diffuse( vfrag, qnorm ), 0.5 );\n"
+" //vfrag = do_light_spec( vfrag, qnorm, halfview, 0.1 );\n"
" vfrag = do_light_shadowing( vfrag );\n"
" vfrag = apply_fog( vfrag, fdist );\n"
"\n"
" float opacity = clamp( fdist, 0.1, 1.0 );\n"
-"\n"
" FragColor = vec4(vfrag,opacity);\n"
"}\n"
""},
static void steam_store_achievements(void)
{
- SteamAPI_ISteamUserStats_StoreStats( hSteamUserStats );
+ if( steam_ready && steam_stats_ready )
+ {
+ SteamAPI_ISteamUserStats_StoreStats( hSteamUserStats );
+ }
}
static void steam_set_achievement( const char *name )
spawns[32];
u32 spawn_count;
+ struct achievement_zone
+ {
+ m4x3f transform, inv_transform;
+ char name[32];
+ int triggered;
+ }
+ * achievement_zones;
+
+ u32 achievement_zones_count,
+ achievement_zones_cap;
+
struct subworld_routes
{
struct route_node
{
mesh_free( &world.cars );
mesh_free( &world.skydome );
+ vg_free( world.achievement_zones );
}
static void world_update( v3f pos )
}
}
}
+
+ for( int i=0; i<world.achievement_zones_count; i++ )
+ {
+ struct achievement_zone *zone = &world.achievement_zones[i];
+
+ if( zone->triggered )
+ continue;
+
+ v3f local;
+ m4x3_mulv( zone->inv_transform, pos, local );
+
+ if( (fabsf(local[0]) <= 1.0f) &&
+ (fabsf(local[1]) <= 1.0f) &&
+ (fabsf(local[2]) <= 1.0f) )
+ {
+ zone->triggered = 1;
+ steam_set_achievement( zone->name );
+ steam_store_achievements();
+ }
+
+ vg_line_boxf_transformed( zone->transform, (boxf){{-1.0f,-1.0f,-1.0f},
+ { 1.0f, 1.0f, 1.0f}},
+ 0xff00ff00 );
+ }
sfd_update( &world.sfd.tester );
}
}
}
}
+ else if( pnode->classtype == k_classtype_achievement_box )
+ {
+ world.achievement_zones =
+ buffer_reserve( world.achievement_zones,
+ world.achievement_zones_count,
+ &world.achievement_zones_cap, 1,
+ sizeof(struct achievement_zone) );
+
+ struct achievement_zone *zone = &world.achievement_zones[
+ world.achievement_zones_count ++ ];
+
+
+ struct classtype_achievement_box *box = mdl_get_entdata(mworld,pnode);
+
+ mdl_node_transform( pnode, zone->transform );
+ m4x3_invert_full( zone->transform, zone->inv_transform );
+ vg_strncpy( mdl_pstr(mworld, box->pstr_name), zone->name, 31 );
+ zone->name[31] = 0x00;
+ zone->triggered = 0;
+ }
}
world.instance_cache = buffer_fix( world.instance_cache,