Skip to content

Commit

Permalink
See desc
Browse files Browse the repository at this point in the history
* seperate physics and render code
* player/grenade physics now run at a fixed 60ups
* other physics run as fast as possible but min. 60ups
* use signals instead of busy waiting on mesher threads
* speed up floating block detection using minheap/hashtable
* link all libraries static
  • Loading branch information
xtreme8000 committed Sep 9, 2019
1 parent 35559ab commit 9dc9e97
Show file tree
Hide file tree
Showing 17 changed files with 850 additions and 563 deletions.
16 changes: 10 additions & 6 deletions src/CMakeLists.txt
Expand Up @@ -24,6 +24,8 @@ download_file_if_it_doesnt_exist(parson.h https://raw.githubusercontent.com/kgab
download_file_if_it_doesnt_exist(http.h https://raw.githubusercontent.com/mattiasgustavsson/libs/master/http.h)
download_file_if_it_doesnt_exist(log.h https://raw.githubusercontent.com/xtreme8000/log.c/master/src/log.h)
download_file_if_it_doesnt_exist(log.c https://raw.githubusercontent.com/xtreme8000/log.c/master/src/log.c)
download_file_if_it_doesnt_exist(hashtable.c https://raw.githubusercontent.com/goldsborough/hashtable/master/hashtable.c)
download_file_if_it_doesnt_exist(hashtable.h https://raw.githubusercontent.com/goldsborough/hashtable/master/hashtable.h)
download_file_if_it_doesnt_exist(../deps/libdeflate.h https://raw.githubusercontent.com/ebiggers/libdeflate/master/libdeflate.h)
download_file_if_it_doesnt_exist(../bsresources.zip http://aos.party/bsresources.zip)

Expand Down Expand Up @@ -58,6 +60,8 @@ list(APPEND CLIENT_SOURCES window.c)
list(APPEND CLIENT_SOURCES utils.c)
list(APPEND CLIENT_SOURCES ping.c)
list(APPEND CLIENT_SOURCES log.c)
list(APPEND CLIENT_SOURCES minheap.c)
list(APPEND CLIENT_SOURCES hashtable.c)
list(APPEND CLIENT_SOURCES ${BetterSpades_SOURCE_DIR}/resources/icon.rc)

add_executable(client ${CLIENT_SOURCES})
Expand Down Expand Up @@ -100,29 +104,29 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${BetterSpades_SOURCE_DIR}/cmake/Modu
set(OpenGL_GL_PREFERENCE LEGACY)
if(ENABLE_GLFW)
find_package(glfw3 REQUIRED)
target_link_libraries(client glfw3::glfw3)
target_link_libraries(client glfw3::glfw3 -static)
endif()
if(ENABLE_SDL)
find_package(SDL REQUIRED)
target_link_libraries(client ${SDL_LIBRARY})
target_link_libraries(client ${SDL_LIBRARY} -static)
endif()
if(ENABLE_SOUND)
find_package(OpenAL REQUIRED)
target_link_libraries(client ${OPENAL_LIBRARY})
target_link_libraries(client ${OPENAL_LIBRARY} -static)
endif()
find_package(enet REQUIRED)
find_package(deflate REQUIRED)
find_package(Threads REQUIRED)
if(NOT ENABLE_OPENGLES)
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
target_link_libraries(client GLEW::GLEW)
target_link_libraries(client GLEW::GLEW -static)
else()
find_package(OpenGL REQUIRED COMPONENTS EGL)
target_link_libraries(client OpenGL::EGL)
target_link_libraries(client OpenGL::EGL -static)
endif()

target_link_libraries(client ${CMAKE_THREAD_LIBS_INIT} ${OPENGL_LIBRARIES} enet::enet deflate::deflate m)
target_link_libraries(client ${CMAKE_THREAD_LIBS_INIT} ${OPENGL_LIBRARIES} enet::enet deflate::deflate m -static)
include_directories(client ${OPENAL_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIR} ${OPENGL_EGL_INCLUDE_DIRS})

add_custom_command(
Expand Down
19 changes: 18 additions & 1 deletion src/camera.c
Expand Up @@ -57,7 +57,24 @@ void camera_overflow_adjust() {
}
}

void camera_apply(float dt) {
void camera_apply() {
switch(camera_mode) {
case CAMERAMODE_FPS:
cameracontroller_fps_render();
break;
case CAMERAMODE_BODYVIEW:
cameracontroller_bodyview_render();
break;
case CAMERAMODE_SPECTATOR:
cameracontroller_spectator_render();
break;
case CAMERAMODE_SELECTION:
cameracontroller_selection_render();
break;
}
}

void camera_update(float dt) {
switch(camera_mode) {
case CAMERAMODE_FPS:
cameracontroller_fps(dt);
Expand Down
3 changes: 2 additions & 1 deletion src/camera.h
Expand Up @@ -58,4 +58,5 @@ int camera_CubeInFrustum(float x, float y, float z, float size, float size_y);
int* camera_terrain_pick(unsigned char mode);
int* camera_terrain_pickEx(unsigned char mode, float x, float y, float z, float ray_x, float ray_y, float ray_z);
void camera_overflow_adjust(void);
void camera_apply(float dt);
void camera_apply(void);
void camera_update(float dt);
67 changes: 47 additions & 20 deletions src/cameracontroller.c
Expand Up @@ -23,6 +23,7 @@ int cameracontroller_bodyview_mode = 0;
int cameracontroller_bodyview_player = 0;
float cameracontroller_bodyview_zoom = 0.0F;

float last_cy;
void cameracontroller_fps(float dt) {
players[local_player_id].connected = 1;
players[local_player_id].alive = 1;
Expand Down Expand Up @@ -54,6 +55,8 @@ void cameracontroller_fps(float dt) {
}
#endif

last_cy = players[local_player_id].physics.eye.y-players[local_player_id].physics.velocity.y*0.4F;

if(chat_input_mode==CHAT_NO_INPUT) {
players[local_player_id].input.keys.up = window_key_down(WINDOW_KEY_UP);
players[local_player_id].input.keys.down = window_key_down(WINDOW_KEY_DOWN);
Expand All @@ -62,18 +65,24 @@ void cameracontroller_fps(float dt) {
if(players[local_player_id].input.keys.crouch && !window_key_down(WINDOW_KEY_CROUCH) && player_uncrouch(&players[local_player_id])) {
players[local_player_id].input.keys.crouch = 0;
}
if(window_key_down(WINDOW_KEY_CROUCH)) {
players[local_player_id].input.keys.crouch = 1;
}
//players[local_player_id].input.keys.crouch = window_key_down(WINDOW_KEY_CROUCH);
players[local_player_id].input.keys.sprint = window_key_down(WINDOW_KEY_SPRINT);
players[local_player_id].input.keys.jump = window_key_down(WINDOW_KEY_SPACE);
players[local_player_id].input.keys.sneak = window_key_down(WINDOW_KEY_SNEAK);

if(window_key_down(WINDOW_KEY_SPACE) && !players[local_player_id].physics.airborne) {
players[local_player_id].physics.jump = 1;
}
}
if(window_key_down(WINDOW_KEY_CROUCH)) {
//following if-statement disables smooth crouching on local player
if(!players[local_player_id].input.keys.crouch && !players[local_player_id].physics.airborne) {
players[local_player_id].pos.y -= 0.9F;
players[local_player_id].physics.eye.y -= 0.9F;
last_cy -= 0.9F;
}
players[local_player_id].input.keys.crouch = 1;
}
players[local_player_id].input.keys.sprint = window_key_down(WINDOW_KEY_SPRINT);
players[local_player_id].input.keys.jump = window_key_down(WINDOW_KEY_SPACE);
players[local_player_id].input.keys.sneak = window_key_down(WINDOW_KEY_SNEAK);

if(window_key_down(WINDOW_KEY_SPACE) && !players[local_player_id].physics.airborne) {
players[local_player_id].physics.jump = 1;
}
}

camera_x = players[local_player_id].physics.eye.x;
camera_y = players[local_player_id].physics.eye.y+player_height(&players[local_player_id]);
Expand Down Expand Up @@ -114,8 +123,10 @@ void cameracontroller_fps(float dt) {
camera_vx = players[local_player_id].physics.velocity.x;
camera_vy = players[local_player_id].physics.velocity.y;
camera_vz = players[local_player_id].physics.velocity.z;
}

matrix_lookAt(camera_x,camera_y,camera_z,camera_x+sin(camera_rot_x)*sin(camera_rot_y),camera_y+cos(camera_rot_y),camera_z+cos(camera_rot_x)*sin(camera_rot_y),0.0F,1.0F,0.0F);
void cameracontroller_fps_render() {
matrix_lookAt(camera_x,camera_y,camera_z,camera_x+sin(camera_rot_x)*sin(camera_rot_y),camera_y+cos(camera_rot_y),camera_z+cos(camera_rot_x)*sin(camera_rot_y),0.0F,1.0F,0.0F);
}

void cameracontroller_spectator(float dt) {
Expand Down Expand Up @@ -206,21 +217,27 @@ void cameracontroller_spectator(float dt) {
camera_vx = p->physics.velocity.x;
camera_vy = p->physics.velocity.y;
camera_vz = p->physics.velocity.z;
} else {
camera_x += camera_movement_x;
camera_y += camera_movement_y;
camera_z += camera_movement_z;
camera_vx = camera_movement_x;
camera_vy = camera_movement_y;
camera_vz = camera_movement_z;
}
}

float l = sqrt(distance3D(p->orientation_smooth.x,p->orientation_smooth.y,p->orientation_smooth.z,0,0,0));
void cameracontroller_spectator_render() {
if(cameracontroller_bodyview_mode && players[cameracontroller_bodyview_player].alive) {
struct Player* p = &players[cameracontroller_bodyview_player];
float l = len3D(p->orientation_smooth.x,p->orientation_smooth.y,p->orientation_smooth.z);
float ox = p->orientation_smooth.x/l;
float oy = p->orientation_smooth.y/l;
float oz = p->orientation_smooth.z/l;

matrix_lookAt(camera_x,camera_y,camera_z,camera_x+ox,camera_y+oy,camera_z+oz,0.0F,1.0F,0.0F);
} else {
camera_x += camera_movement_x;
camera_y += camera_movement_y;
camera_z += camera_movement_z;
camera_vx = camera_movement_x;
camera_vy = camera_movement_y;
camera_vz = camera_movement_z;
matrix_lookAt(camera_x,camera_y,camera_z,camera_x+sin(camera_rot_x)*sin(camera_rot_y),camera_y+cos(camera_rot_y),camera_z+cos(camera_rot_x)*sin(camera_rot_y),0.0F,1.0F,0.0F);
matrix_lookAt(camera_x,camera_y,camera_z,camera_x+sin(camera_rot_x)*sin(camera_rot_y),camera_y+cos(camera_rot_y),camera_z+cos(camera_rot_x)*sin(camera_rot_y),0.0F,1.0F,0.0F);
}
}

Expand Down Expand Up @@ -281,7 +298,12 @@ void cameracontroller_bodyview(float dt) {
camera_vx = p->physics.velocity.x;
camera_vy = p->physics.velocity.y;
camera_vz = p->physics.velocity.z;
}
}

void cameracontroller_bodyview_render() {
if(cameracontroller_bodyview_mode && players[cameracontroller_bodyview_player].alive) {
struct Player* p = &players[cameracontroller_bodyview_player];
float l = sqrt(distance3D(p->orientation_smooth.x,p->orientation_smooth.y,p->orientation_smooth.z,0,0,0));
float ox = p->orientation_smooth.x/l;
float oy = p->orientation_smooth.y/l;
Expand Down Expand Up @@ -309,3 +331,8 @@ void cameracontroller_selection(float dt) {
matrix_rotate(90.0F,1.0F,0.0F,0.0F);
matrix_translate(-camera_x,-camera_y,-camera_z);
}

void cameracontroller_selection_render() {
matrix_rotate(90.0F,1.0F,0.0F,0.0F);
matrix_translate(-camera_x,-camera_y,-camera_z);
}
5 changes: 5 additions & 0 deletions src/cameracontroller.h
Expand Up @@ -25,3 +25,8 @@ void cameracontroller_fps(float dt);
void cameracontroller_spectator(float dt);
void cameracontroller_bodyview(float dt);
void cameracontroller_selection(float dt);

void cameracontroller_fps_render(void);
void cameracontroller_spectator_render(void);
void cameracontroller_bodyview_render(void);
void cameracontroller_selection_render(void);
56 changes: 26 additions & 30 deletions src/chunk.c
Expand Up @@ -63,6 +63,7 @@ void chunk_init() {
chunk_workers[k].vertex_data = NULL;
chunk_workers[k].color_data = NULL;
pthread_mutex_init(&chunk_workers[k].state_lock,NULL);
pthread_cond_init(&chunk_workers[k].can_work,NULL);
pthread_create(&chunk_workers[k].thread,NULL,chunk_generate,&chunk_workers[k]);
}
}
Expand Down Expand Up @@ -137,42 +138,34 @@ void* chunk_generate(void* data) {
struct chunk_worker* worker = (struct chunk_worker*)data;

while(1) {
int state = -1;
pthread_mutex_lock(&worker->state_lock);
state = worker->state;
while(worker->state!=CHUNK_WORKERSTATE_BUSY)
pthread_cond_wait(&worker->can_work,&worker->state_lock);
pthread_mutex_unlock(&worker->state_lock);

if(state==CHUNK_WORKERSTATE_BUSY) {
pthread_mutex_lock(&chunk_minimap_lock);
for(int x=worker->chunk_x;x<worker->chunk_x+CHUNK_SIZE;x++) {
for(int z=worker->chunk_y;z<worker->chunk_y+CHUNK_SIZE;z++) {
if((x%64)>0 && (z%64)>0) {
pthread_rwlock_rdlock(&chunk_map_locks[x+z*map_size_x]);
for(int y=map_size_y-1;y>=0;y--) {
if(map_colors[x+(y*map_size_z+z)*map_size_x]!=0xFFFFFFFF) {
map_minimap[(x+z*map_size_x)*4+0] = red(map_colors[x+(y*map_size_z+z)*map_size_x]);
map_minimap[(x+z*map_size_x)*4+1] = green(map_colors[x+(y*map_size_z+z)*map_size_x]);
map_minimap[(x+z*map_size_x)*4+2] = blue(map_colors[x+(y*map_size_z+z)*map_size_x]);
break;
}
}
pthread_rwlock_unlock(&chunk_map_locks[x+z*map_size_x]);
}
pthread_mutex_lock(&chunk_minimap_lock);
for(int x=worker->chunk_x;x<worker->chunk_x+CHUNK_SIZE;x++) {
for(int z=worker->chunk_y;z<worker->chunk_y+CHUNK_SIZE;z++) {
if((x%64)>0 && (z%64)>0) {
pthread_rwlock_rdlock(&chunk_map_locks[x+z*map_size_x]);
uint32_t color = map_colors[x+(map_heights[x+z*map_size_x]*map_size_z+z)*map_size_x];
map_minimap[(x+z*map_size_x)*4+0] = red(color);
map_minimap[(x+z*map_size_x)*4+1] = green(color);
map_minimap[(x+z*map_size_x)*4+2] = blue(color);
pthread_rwlock_unlock(&chunk_map_locks[x+z*map_size_x]);
}
}
pthread_mutex_unlock(&chunk_minimap_lock);

if(settings.greedy_meshing)
chunk_generate_greedy(worker);
else
chunk_generate_naive(worker);

pthread_mutex_lock(&worker->state_lock);
worker->state = CHUNK_WORKERSTATE_FINISHED;
pthread_mutex_unlock(&worker->state_lock);
}
pthread_mutex_unlock(&chunk_minimap_lock);

usleep(10);
if(settings.greedy_meshing)
chunk_generate_greedy(worker);
else
chunk_generate_naive(worker);

pthread_mutex_lock(&worker->state_lock);
worker->state = CHUNK_WORKERSTATE_FINISHED;
pthread_mutex_unlock(&worker->state_lock);
}
return NULL;
}
Expand Down Expand Up @@ -1054,7 +1047,7 @@ void chunk_update_all() {
glBindTexture(GL_TEXTURE_2D,0);
}
if(chunk_workers[j].state==CHUNK_WORKERSTATE_IDLE && chunk_geometry_changed_lenght>0) {
float closest_dist = 1e10;
float closest_dist = FLT_MAX;
int closest_index = 0;
for(int k=0;k<chunk_geometry_changed_lenght;k++) {
int chunk_x = (chunk_geometry_changed[k]%CHUNKS_PER_DIM)*CHUNK_SIZE;
Expand All @@ -1077,6 +1070,9 @@ void chunk_update_all() {
chunk_workers[j].state = CHUNK_WORKERSTATE_BUSY;
chunks[chunk_geometry_changed[closest_index]].last_update = window_time();
chunks[chunk_geometry_changed[closest_index]].created = 1;

pthread_cond_signal(&chunk_workers[j].can_work);

for(int i=closest_index;i<chunk_geometry_changed_lenght-1;i++) {
chunk_geometry_changed[i] = chunk_geometry_changed[i+1];
}
Expand Down
1 change: 1 addition & 0 deletions src/chunk.h
Expand Up @@ -48,6 +48,7 @@ extern struct chunk_worker {
int chunk_id;
int chunk_x, chunk_y;
pthread_mutex_t state_lock;
pthread_cond_t can_work;
int state;
pthread_t thread;
short* vertex_data;
Expand Down
2 changes: 2 additions & 0 deletions src/common.h
Expand Up @@ -60,6 +60,8 @@
#include "libdeflate.h"
#include "ini.h"
#include "log.h"
#include "hashtable.h"
#include "minheap.h"

#ifdef _WIN32
#define OS_WINDOWS
Expand Down

0 comments on commit 9dc9e97

Please sign in to comment.