Skip to content

Commit

Permalink
Refactor damaged voxel code
Browse files Browse the repository at this point in the history
* now unlimited number of damaged voxels possible
  • Loading branch information
xtreme8000 committed Oct 15, 2020
1 parent cd5a254 commit 28d378a
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 48 deletions.
90 changes: 42 additions & 48 deletions src/map.c
Expand Up @@ -53,53 +53,65 @@ float fog_color[4] = {0.5F, 0.9098F, 1.0F, 1.0F};
float map_sun[4];

struct damaged_voxel {
uint32_t x, y, z;
int damage;
int used;
float timer;
} map_damaged_voxels[8];
};

HashTable map_damaged_voxels;
struct tesselator map_damaged_tesselator;

int map_object_visible(float x, float y, float z) {
return !(x <= 0.0F && z <= 0.0F);
}

int map_damage(int x, int y, int z, int damage) {
struct damaged_voxel* oldest = map_damaged_voxels;

for(int k = 0; k < 8; k++) {
struct damaged_voxel* voxel = map_damaged_voxels + k;
uint32_t key = pos_key(x, y, z);
struct damaged_voxel* voxel = ht_lookup(&map_damaged_voxels, &key);

if(voxel->used && voxel->x == x && voxel->y == y && voxel->z == z) {
voxel->damage = min(damage + voxel->damage, 100);
voxel->timer = window_time();
if(voxel) {
voxel->damage = min(damage + voxel->damage, 100);
voxel->timer = window_time();

return voxel->damage;
}
return voxel->damage;
} else {
ht_insert(&map_damaged_voxels, &key,
&(struct damaged_voxel) {
.damage = damage,
.timer = window_time(),
});

if((voxel->used && voxel->timer < oldest->timer) || !voxel->used)
oldest = voxel;
return damage;
}

oldest->used = 1;
oldest->x = x;
oldest->y = y;
oldest->z = z;
oldest->damage = damage;
oldest->timer = window_time();
return damage;
}

int map_damage_get(int x, int y, int z) {
for(int k = 0; k < 8; k++) {
struct damaged_voxel* voxel = map_damaged_voxels + k;
uint32_t key = pos_key(x, y, z);
struct damaged_voxel* voxel = ht_lookup(&map_damaged_voxels, &key);

if(voxel->used && voxel->x == x && voxel->y == y && voxel->z == z)
return voxel->damage;
}
return voxel ? voxel->damage : 0;
}

static bool damaged_voxel_update(void* key, void* value, void* user) {
uint32_t pos = *(uint32_t*)key;
struct damaged_voxel* voxel = (struct damaged_voxel*)value;
struct tesselator* tess = (struct tesselator*)user;
int x = pos_keyx(pos);
int y = pos_keyy(pos);
int z = pos_keyz(pos);

return 0;
if(window_time() - voxel->timer > 10.0F || map_isair(x, y, z))
return true;

tesselator_set_color(tess, rgba(0, 0, 0, voxel->damage * 1.9125F));

tesselator_addi_cube_face(tess, CUBE_FACE_Z_N, x, y, z);
tesselator_addi_cube_face(tess, CUBE_FACE_Z_P, x, y, z);
tesselator_addi_cube_face(tess, CUBE_FACE_X_N, x, y, z);
tesselator_addi_cube_face(tess, CUBE_FACE_X_P, x, y, z);
tesselator_addi_cube_face(tess, CUBE_FACE_Y_P, x, y, z);
tesselator_addi_cube_face(tess, CUBE_FACE_Y_N, x, y, z);

return false;
}

void map_damaged_voxels_render() {
Expand All @@ -113,24 +125,7 @@ void map_damaged_voxels_render() {

tesselator_clear(&map_damaged_tesselator);

for(int k = 0; k < 8; k++) {
struct damaged_voxel* voxel = map_damaged_voxels + k;

if(voxel->used) {
if(window_time() - voxel->timer > 10.0F || map_isair(voxel->x, voxel->y, voxel->z)) {
voxel->used = 0;
} else {
tesselator_set_color(&map_damaged_tesselator, rgba(0, 0, 0, voxel->damage * 1.9125F));

tesselator_addi_cube_face(&map_damaged_tesselator, CUBE_FACE_Z_N, voxel->x, voxel->y, voxel->z);
tesselator_addi_cube_face(&map_damaged_tesselator, CUBE_FACE_Z_P, voxel->x, voxel->y, voxel->z);
tesselator_addi_cube_face(&map_damaged_tesselator, CUBE_FACE_X_N, voxel->x, voxel->y, voxel->z);
tesselator_addi_cube_face(&map_damaged_tesselator, CUBE_FACE_X_P, voxel->x, voxel->y, voxel->z);
tesselator_addi_cube_face(&map_damaged_tesselator, CUBE_FACE_Y_P, voxel->x, voxel->y, voxel->z);
tesselator_addi_cube_face(&map_damaged_tesselator, CUBE_FACE_Y_N, voxel->x, voxel->y, voxel->z);
}
}
}
ht_iterate_remove(&map_damaged_voxels, &map_damaged_tesselator, damaged_voxel_update);

tesselator_draw(&map_damaged_tesselator, 1);

Expand Down Expand Up @@ -492,8 +487,7 @@ void map_init() {
tesselator_create(&map_damaged_tesselator, VERTEX_INT, 0);
pthread_rwlock_init(&map_lock, NULL);

for(int k = 0; k < 8; k++)
map_damaged_voxels[k].used = 0;
ht_setup(&map_damaged_voxels, sizeof(uint32_t), sizeof(struct damaged_voxel), 16);

for(int k = 0; k < 32; k++)
map_collapsing_structures[k].used = 0;
Expand Down
45 changes: 45 additions & 0 deletions src/utils.c
Expand Up @@ -17,6 +17,8 @@
along with BetterSpades. If not, see <http://www.gnu.org/licenses/>.
*/

#include <assert.h>

#include "utils.h"

static int base64_map(char c) {
Expand All @@ -35,6 +37,8 @@ static int base64_map(char c) {

// works in place
int base64_decode(char* data, int len) {
assert(data && len > 0);

int buffer = 0;
int buffer_len = 0;
int data_index = 0;
Expand All @@ -54,18 +58,59 @@ int base64_decode(char* data, int len) {
}

int int_cmp(void* first_key, void* second_key, size_t key_size) {
assert(first_key && second_key);

return (*(uint32_t*)first_key) != (*(uint32_t*)second_key);
}

size_t int_hash(void* raw_key, size_t key_size) {
assert(raw_key);

uint32_t x = *(uint32_t*)raw_key;
x = ((x >> 16) ^ x) * 0x45d9f3b;
x = ((x >> 16) ^ x) * 0x45d9f3b;
x = (x >> 16) ^ x;
return x;
}

void ht_iterate_remove(HashTable* ht, void* user, bool (*callback)(void* key, void* value, void* user)) {
assert(ht && callback);

bool removed = false;

for(size_t chain = 0; chain < ht->capacity; chain++) {
HTNode* node = ht->nodes[chain];
HTNode* prev = NULL;

while(node) {
if(callback(node->key, node->value, user)) {
if(prev) {
prev->next = node->next;
} else {
ht->nodes[chain] = node->next;
}

HTNode* del = node;
node = node->next;

_ht_destroy_node(del);

ht->size--;
removed = true;
} else {
prev = node;
node = node->next;
}
}
}

if(removed && _ht_should_shrink(ht))
_ht_adjust_capacity(ht);
}

bool ht_iterate(HashTable* ht, void* user, bool (*callback)(void* key, void* value, void* user)) {
assert(ht && callback);

for(size_t chain = 0; chain < ht->capacity; chain++) {
HTNode* node = ht->nodes[chain];

Expand Down
1 change: 1 addition & 0 deletions src/utils.h
Expand Up @@ -29,6 +29,7 @@ int base64_decode(char* data, int len);

int int_cmp(void* first_key, void* second_key, size_t key_size);
size_t int_hash(void* raw_key, size_t key_size);
void ht_iterate_remove(HashTable* ht, void* user, bool (*callback)(void* key, void* value, void* user));
bool ht_iterate(HashTable* ht, void* user, bool (*callback)(void* key, void* value, void* user));

#endif

0 comments on commit 28d378a

Please sign in to comment.