--- /dev/null
+# Goxel 0.10.6
+# One line per voxel
+# X Y Z RRGGBB
+0 0 0 503612
+0 0 1 503612
+0 0 2 584120
+0 0 3 43351e
+0 0 4 503612
+0 0 5 503612
+0 0 6 4a3312
+0 0 7 5c421a
+0 0 8 5a380e
+0 0 9 959595
+1 0 9 a0a0a0
+0 0 10 959595
+1 0 10 959595
+0 0 11 7e7e7e
+1 0 11 a0a0a0
+0 0 12 a0a0a0
+-1 0 9 7e7e7e
+-1 0 10 959595
+-1 0 11 959595
bool client_entity_gfx_init()
{
- char *shader_defs;
- asprintf(&shader_defs, "#define VIEW_DISTANCE %lf\n", client_config.view_distance);
+ char *shader_def;
+ asprintf(&shader_def, "#define VIEW_DISTANCE %lf\n", client_config.view_distance);
- if (!shader_program_create(RESSOURCE_PATH "shaders/3d/entity", &shader_prog, shader_defs)) {
+ if (!shader_program_create(RESSOURCE_PATH "shaders/3d/entity", &shader_prog, shader_def)) {
fprintf(stderr, "[error] failed to create entity shader program\n");
return false;
}
- free(shader_defs);
+ free(shader_def);
loc_VP = glGetUniformLocation(shader_prog, "VP"); GL_DEBUG
loc_depthOffset = glGetUniformLocation(shader_prog, "depthOffset"); GL_DEBUG
bool client_inventory_init()
{
- char *_3d_shader_defs;
- asprintf(&_3d_shader_defs, "#define VIEW_DISTANCE %lf\n", client_config.view_distance);
+ char *_3d_shader_def;
+ asprintf(&_3d_shader_def, "#define VIEW_DISTANCE %lf\n", client_config.view_distance);
- if (!shader_program_create(RESSOURCE_PATH "shaders/3d/item", &_3d_shader_prog, _3d_shader_defs)) {
+ if (!shader_program_create(RESSOURCE_PATH "shaders/3d/item", &_3d_shader_prog, _3d_shader_def)) {
fprintf(stderr, "[error] failed to create 3D item shader program\n");
return false;
}
- free(_3d_shader_defs);
+ free(_3d_shader_def);
_3d_loc_VP = glGetUniformLocation(_3d_shader_prog, "VP");
_3d_loc_depthOffset = glGetUniformLocation(_3d_shader_prog, "depthOffset");
static bool use_dig(__attribute__((unused)) ItemStack *stack)
{
return interact_pointed.exists
- && (node_defs[interact_pointed.node].dig_class & item_defs[stack->type].dig_class);
+ && (node_def[interact_pointed.node].dig_class & item_def[stack->type].dig_class);
}
-ClientItemDef client_item_defs[COUNT_ITEM] = {
+ClientItemDef client_item_def[COUNT_ITEM] = {
// unknown
{
.mesh_path = RESSOURCE_PATH "meshes/unknown.txt",
.mesh = {0},
.use = &use_dig,
},
+ // shovel
+ {
+ .mesh_path = RESSOURCE_PATH "meshes/shovel.txt",
+ .mesh = {0},
+ .use = &use_dig,
+ },
};
void client_item_init()
{
for (ItemType i = 0; i < COUNT_ITEM; i++)
- if (client_item_defs[i].mesh_path)
- mesh_load(&client_item_defs[i].mesh, client_item_defs[i].mesh_path);
+ if (client_item_def[i].mesh_path)
+ mesh_load(&client_item_def[i].mesh, client_item_def[i].mesh_path);
}
void client_item_deinit()
{
for (ItemType i = 0; i < COUNT_ITEM; i++)
- if (client_item_defs[i].mesh_path)
- mesh_destroy(&client_item_defs[i].mesh);
+ if (client_item_def[i].mesh_path)
+ mesh_destroy(&client_item_def[i].mesh);
}
Mesh *client_item_mesh(ItemType type)
{
- return client_item_defs[type].mesh_path ? &client_item_defs[type].mesh : NULL;
+ return client_item_def[type].mesh_path ? &client_item_def[type].mesh : NULL;
}
bool (*use)(ItemStack *stack);
} ClientItemDef;
-extern ClientItemDef client_item_defs[];
+extern ClientItemDef client_item_def[];
void client_item_init();
void client_item_deinit();
args->vertex.color = ((ColorData *) args->node->data)->color;
}
-ClientNodeDef client_node_defs[NODE_UNLOADED] = {
+ClientNodeDef client_node_def[NODE_UNLOADED] = {
// unknown
{
.tiles = TILES_SIMPLE(RESSOURCE_PATH "textures/unknown.png"),
void client_node_init()
{
for (NodeType node = 0; node < NODE_UNLOADED; node++) {
- ClientNodeDef *def = &client_node_defs[node];
+ ClientNodeDef *def = &client_node_def[node];
if (def->visibility != VISIBILITY_NONE) {
Texture *textures[6];
char *name;
} ClientNodeDef;
-extern ClientNodeDef client_node_defs[];
+extern ClientNodeDef client_node_def[];
void client_node_init();
#endif // _CLIENT_NODE_H_
if (meta->state == CHUNK_RECIEVING)
meta->state = CHUNK_FRESH;
- pthread_mutex_unlock(&chunk->mtx);
-
client_terrain_meshgen_task(chunk, true);
+ pthread_mutex_unlock(&chunk->mtx);
for (int i = 0; i < 6; i++) {
TerrainChunk *neighbor = terrain_get_chunk(client_terrain,
if (!pnt->exists)
return strdup("");
- pnt_name = client_node_defs[pnt->node].name;
+ pnt_name = client_node_def[pnt->node].name;
break;
case ENTRY_FLIGHT:
static int cmp_element(const GUIElement *ea, const GUIElement *eb)
{
- return f32_cmp(&ea->def.z_index, &eb->def.z_index);
+ return -f32_cmp(&ea->def.z_index, &eb->def.z_index);
}
static void delete_elements(Array *elements)
&& !v3s32_equals(interact_pointed.pos, old_pointed)) {
mat4x4_translate(model,
interact_pointed.pos.x, interact_pointed.pos.y, interact_pointed.pos.z);
- v3f32 *color = &client_node_defs[interact_pointed.node].selection_color;
+ v3f32 *color = &client_node_def[interact_pointed.node].selection_color;
glProgramUniform3f(shader_prog, loc_color, color->x, color->y, color->z); GL_DEBUG
debug_menu_changed(ENTRY_POINTED);
}
pthread_mutex_lock(&data->mtx_inv);
ItemStack *stack = left ? &data->inventory.left : &data->inventory.right;
- if (client_item_defs[stack->type].use && client_item_defs[stack->type].use(stack))
+ if (client_item_def[stack->type].use && client_item_def[stack->type].use(stack))
dragonnet_peer_send_ToServerInteract(client, &(ToServerInteract) {
.left = left,
.pointed = interact_pointed.exists,
if (*node == NODE_UNLOADED)
return false;
- if (client_node_defs[*node].pointable)
+ if (client_node_def[*node].pointable)
return true;
f64 vpos[3] = {pos.x, pos.y, pos.z};
#include "client/gl_debug.h"
#include "client/shader.h"
-static GLuint compile_shader(GLenum type, const char *path, const char *name, GLuint program, const char *defs)
+static GLuint compile_shader(GLenum type, const char *path, const char *name, GLuint program, const char *def)
{
char full_path[strlen(path) + 1 + strlen(name) + 1 + 4 + 1];
sprintf(full_path, "%s/%s.glsl", path, name);
const char *code_list[3] = {
version,
- defs,
+ def,
code,
};
int size_list[3] = {
18,
- strlen(defs),
+ strlen(def),
size,
};
return id;
}
-bool shader_program_create(const char *path, GLuint *idptr, const char *defs)
+bool shader_program_create(const char *path, GLuint *idptr, const char *def)
{
GLuint id = glCreateProgram(); GL_DEBUG
- if (!defs)
- defs = "";
+ if (!def)
+ def = "";
GLuint vert, frag;
- if (!(vert = compile_shader(GL_VERTEX_SHADER, path, "vertex", id, defs))) {
+ if (!(vert = compile_shader(GL_VERTEX_SHADER, path, "vertex", id, def))) {
glDeleteProgram(id); GL_DEBUG
return false;
}
- if (!(frag = compile_shader(GL_FRAGMENT_SHADER, path, "fragment", id, defs))) {
+ if (!(frag = compile_shader(GL_FRAGMENT_SHADER, path, "fragment", id, def))) {
glDeleteShader(vert); GL_DEBUG
glDeleteProgram(id); GL_DEBUG
return false;
#include <GL/gl.h>
#include <stdbool.h>
-bool shader_program_create(const char *path, GLuint *idptr, const char *defs);
+bool shader_program_create(const char *path, GLuint *idptr, const char *def);
#endif // _SHADER_H_
static inline bool show_face(NodeType self, NodeType nbr)
{
- switch (client_node_defs[self].visibility) {
+ switch (client_node_def[self].visibility) {
case VISIBILITY_CLIP:
return true;
return nbr != self;
case VISIBILITY_SOLID:
- return nbr != NODE_UNLOADED && client_node_defs[nbr].visibility != VISIBILITY_SOLID;
+ return nbr != NODE_UNLOADED && client_node_def[nbr].visibility != VISIBILITY_SOLID;
default: // impossible
break;
args.node = &data->chunk->data[offset.x][offset.y][offset.z];
- ClientNodeDef *def = &client_node_defs[args.node->type];
+ ClientNodeDef *def = &client_node_def[args.node->type];
if (def->visibility == VISIBILITY_NONE)
return;
CHUNK_ITERATE
render_node(&data, (v3s32) {x, y, z});
+ for (int i = 0; i < 6; i++)
+ if (data.nbrs[i])
+ depends[i] = true;
+
if (!data.visible || (!data.batch->textures.siz && !data.batch_transparent->textures.siz)) {
model_batch_free(data.batch);
model_batch_free(data.batch_transparent);
model_batch_free(data.batch_transparent);
}
- for (int i = 0; i < 6; i++)
- if (data.nbrs[i])
- data.tried_nbrs[i] = true;
-
return model;
}
GLint texture_units;
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &texture_units); GL_DEBUG
- char *shader_defs;
- asprintf(&shader_defs,
+ char *shader_def;
+ asprintf(&shader_def,
"#define MAX_TEXTURE_UNITS %d\n"
"#define VIEW_DISTANCE %lf\n",
texture_units,
client_config.view_distance
);
- if (!shader_program_create(RESSOURCE_PATH "shaders/3d/terrain", &shader_prog, shader_defs)) {
+ if (!shader_program_create(RESSOURCE_PATH "shaders/3d/terrain", &shader_prog, shader_def)) {
fprintf(stderr, "[error] failed to create terrain shader program\n");
return false;
}
- free(shader_defs);
+ free(shader_def);
loc_VP = glGetUniformLocation(shader_prog, "VP"); GL_DEBUG
DIG_STONE = 0x01,
DIG_WOOD = 0x02,
DIG_DIRT = 0x04,
+ DIG_LEAVES = 0x08,
} DigClass;
#endif // _DIG_H_
stack->count = 1;
stack->data = NULL;
- if (item_defs[stack->type].callbacks.create)
- item_defs[stack->type].callbacks.create(stack);
+ if (item_def[stack->type].callbacks.create)
+ item_def[stack->type].callbacks.create(stack);
}
void item_stack_destroy(ItemStack *stack)
{
- if (item_defs[stack->type].callbacks.delete)
- item_defs[stack->type].callbacks.delete(stack);
+ if (item_def[stack->type].callbacks.delete)
+ item_def[stack->type].callbacks.delete(stack);
if (stack->data) {
free(stack->data);
stack->type = type;
stack->count = count;
- stack->data = item_defs[stack->type].data_size > 0 ?
- malloc(item_defs[stack->type].data_size) : NULL;
+ stack->data = item_def[stack->type].data_size > 0 ?
+ malloc(item_def[stack->type].data_size) : NULL;
- if (item_defs[stack->type].callbacks.create)
- item_defs[stack->type].callbacks.create(stack);
+ if (item_def[stack->type].callbacks.create)
+ item_def[stack->type].callbacks.create(stack);
- if (item_defs[stack->type].callbacks.deserialize)
- item_defs[stack->type].callbacks.deserialize(&buffer, stack->data);
+ if (item_def[stack->type].callbacks.deserialize)
+ item_def[stack->type].callbacks.deserialize(&buffer, stack->data);
}
void item_stack_serialize(ItemStack *stack, SerializedItemStack *serialized)
serialized->count = stack->count;
serialized->data = (Blob) {0, NULL};
- if (item_defs[stack->type].callbacks.serialize)
- item_defs[stack->type].callbacks.serialize(&serialized->data, stack->data);
+ if (item_def[stack->type].callbacks.serialize)
+ item_def[stack->type].callbacks.serialize(&serialized->data, stack->data);
}
void item_stack_deserialize(ItemStack *stack, SerializedItemStack *serialized)
item_stack_set(stack, type, serialized->count, serialized->data);
}
-ItemDef item_defs[COUNT_ITEM] = {
+ItemDef item_def[COUNT_ITEM] = {
// unknown
{
.stackable = false,
.dig_class = DIG_WOOD,
.callbacks = {NULL},
},
+ // shovel
+ {
+ .stackable = false,
+ .data_size = 0,
+ .dig_class = DIG_DIRT,
+ .callbacks = {NULL},
+ },
};
ITEM_NONE,
ITEM_PICKAXE,
ITEM_AXE,
+ ITEM_SHOVEL,
COUNT_ITEM,
} ItemType;
void item_stack_serialize(ItemStack *stack, SerializedItemStack *serialized);
void item_stack_deserialize(ItemStack *stack, SerializedItemStack *serialized);
-extern ItemDef item_defs[];
+extern ItemDef item_def[];
#endif // _ITEM_H_
#include "terrain.h"
#include "types.h"
-NodeDef node_defs[NODE_UNLOADED] = {
+NodeDef node_def[NODE_UNLOADED] = {
// unknown
{
.solid = true,
{
.solid = true,
.data_size = sizeof(ColorData),
- .dig_class = DIG_NONE,
+ .dig_class = DIG_LEAVES,
.callbacks = {
.create = NULL,
.delete = NULL,
{
.solid = true,
.data_size = sizeof(ColorData),
- .dig_class = DIG_NONE,
+ .dig_class = DIG_LEAVES,
.callbacks = {
.create = NULL,
.delete = NULL,
{
.solid = true,
.data_size = sizeof(ColorData),
- .dig_class = DIG_NONE,
+ .dig_class = DIG_LEAVES,
.callbacks = {
.create = NULL,
.delete = NULL,
} callbacks;
} NodeDef;
-extern NodeDef node_defs[];
+extern NodeDef node_def[];
#endif
static bool is_solid(Terrain *terrain, s32 x, s32 y, s32 z)
{
NodeType node = terrain_get_node(terrain, (v3s32) {x, y, z}).type;
- return node == NODE_UNLOADED || node_defs[node].solid;
+ return node == NODE_UNLOADED || node_def[node].solid;
}
bool physics_ground(Terrain *terrain, bool collide, aabb3f32 box, v3f64 *pos, v3f64 *vel)
pthread_mutex_lock(&player->mtx_inv);
ItemStack *stack = pkt->left ? &player->inventory.left : &player->inventory.right;
- if (server_item_defs[stack->type].use)
- server_item_defs[stack->type].use(player, stack, pkt->pointed, pkt->pos);
+ if (server_item_def[stack->type].use)
+ server_item_def[stack->type].use(player, stack, pkt->pointed, pkt->pos);
pthread_mutex_unlock(&player->mtx_inv);
}
if (node == NODE_UNLOADED)
return;
- if (!(node_defs[node].dig_class & item_defs[stack->type].dig_class))
+ if (!(node_def[node].dig_class & item_def[stack->type].dig_class))
return;
terrain_set_node(server_terrain, pos,
false, NULL);
}
-ServerItemDef server_item_defs[COUNT_ITEM] = {
+ServerItemDef server_item_def[COUNT_ITEM] = {
// unknown
{
.use = NULL,
{
.use = &use_dig,
},
+ // shovel
+ {
+ .use = &use_dig,
+ },
};
void (*use)(ServerPlayer *player, ItemStack *stack, bool pointed, v3s32 pos);
} ServerItemDef;
-extern ServerItemDef server_item_defs[];
+extern ServerItemDef server_item_def[];
#endif // _SERVER_ITEM_H_
database_create_player(player->name, player->pos, player->rot);
}
- item_stack_set(&player->inventory.left, ITEM_NONE + rand() % (ITEM_AXE - ITEM_NONE + 1), 1, (Blob) {0, NULL});
- item_stack_set(&player->inventory.right, ITEM_NONE + rand() % (ITEM_AXE - ITEM_NONE + 1), 1, (Blob) {0, NULL});
+ item_stack_set(&player->inventory.left, ITEM_NONE + rand() % (COUNT_ITEM - ITEM_NONE), 1, (Blob) {0, NULL});
+ item_stack_set(&player->inventory.right, ITEM_NONE + rand() % (COUNT_ITEM - ITEM_NONE), 1, (Blob) {0, NULL});
// since this is recv thread, we don't need lock_peer
dragonnet_peer_send_ToClientInfo(player->peer, &(ToClientInfo) {
pos.y++;
}
- if (node_defs[node].solid)
+ if (node_def[node].solid)
break;
server_terrain_gen_node(pos,
node = NODE_SNOW;
if (generate_args.diff == 1) for (int i = 0; i < NUM_TREES; i++) {
- TreeDef *def = &tree_defs[i];
+ TreeDef *def = &tree_def[i];
if (def->condition(&condition_args)
&& noise2d(condition_args.pos.x, condition_args.pos.z, 0, seed + def->offset) * 0.5 + 0.5 < def->probability
voxel_procedural_delete(proc);
}
-TreeDef tree_defs[NUM_TREES] = {
+TreeDef tree_def[NUM_TREES] = {
// oak
{
.spread = 64.0f,
void (*generate)(v3s32 pos, List *changed_chunks);
} TreeDef;
-extern TreeDef tree_defs[];
+extern TreeDef tree_def[];
#endif // _TREES_H_
},
};
- NodeDef *def = &node_defs[node->type];
+ NodeDef *def = &node_def[node->type];
if (def->callbacks.serialize)
def->callbacks.serialize(&node_data->data, node->data);
if (type >= NODE_UNLOADED)
type = NODE_UNKNOWN;
- NodeDef *def = &node_defs[type];
+ NodeDef *def = &node_def[type];
TerrainNode node;
node.type = type;
void terrain_node_delete(TerrainNode node)
{
- NodeDef *def = &node_defs[node.type];
+ NodeDef *def = &node_def[node.type];
if (def->callbacks.delete)
def->callbacks.delete(&node);