180 lines
6.1 KiB
C
180 lines
6.1 KiB
C
#include "blocks.h"
|
|
#include "state.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
tc_block_entry_s * tc_new_block_entry(char *name)
|
|
{
|
|
tc_block_entry_s *entry = malloc(sizeof(tc_block_entry_s));
|
|
entry->name = name;
|
|
entry->attributes_capacity = 16;
|
|
entry->num_attributes = 0;
|
|
entry->attributes = calloc(
|
|
sizeof(tc_block_attribute_s), entry->attributes_capacity
|
|
);
|
|
|
|
if(tc_game_state_g.block_registry.num_blocks >= tc_game_state_g.block_registry.blocks_capacity)
|
|
{
|
|
tc_game_state_g.block_registry.blocks =
|
|
realloc(tc_game_state_g.block_registry.blocks,
|
|
sizeof(tc_block_entry_s)
|
|
*
|
|
tc_game_state_g.block_registry.blocks_capacity
|
|
);
|
|
}
|
|
|
|
tc_game_state_g.block_registry.blocks[tc_game_state_g.block_registry.num_blocks] = entry;
|
|
++tc_game_state_g.block_registry.num_blocks;
|
|
|
|
return entry;
|
|
}
|
|
|
|
uint32_t tc_sanitize_block_id(uint32_t id)
|
|
{
|
|
return id & 0x00ffffff;
|
|
}
|
|
|
|
void tc_add_attribute_to_block_entry(tc_block_entry_s *entry, tc_block_attribute_s attribute)
|
|
{
|
|
if(entry->num_attributes >= entry->attributes_capacity)
|
|
{
|
|
entry->attributes_capacity *= 2;
|
|
entry->attributes =
|
|
realloc(entry->attributes, sizeof(tc_block_attribute_s) * entry->attributes_capacity);
|
|
}
|
|
|
|
entry->attributes[entry->num_attributes] = attribute;
|
|
++entry->num_attributes;
|
|
}
|
|
|
|
|
|
tc_block_attribute_s * tc_block_resolve_name_to_attribute(tc_block_entry_s *block, char *name)
|
|
{
|
|
uint32_t attribute_index = 0;
|
|
while(attribute_index < block->num_attributes)
|
|
{
|
|
if(!strcmp(block->attributes[attribute_index].name, name))
|
|
return &block->attributes[attribute_index];
|
|
|
|
++attribute_index;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
tc_block_entry_s * tc_get_block(char *name)
|
|
{
|
|
uint32_t index = 0;
|
|
while(index < tc_game_state_g.block_registry.num_blocks)
|
|
{
|
|
if(!strcmp(tc_game_state_g.block_registry.blocks[index]->name, name))
|
|
return tc_game_state_g.block_registry.blocks[index];
|
|
|
|
++index;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
tc_block_entry_s * tc_resolve_id_to_block_entry(uint32_t id)
|
|
{
|
|
uint32_t index = 0;
|
|
while(index < tc_game_state_g.block_registry.num_blocks)
|
|
{
|
|
if(tc_sanitize_block_id(tc_game_state_g.block_registry.blocks[index]->identifier) == tc_sanitize_block_id(id))
|
|
{
|
|
return tc_game_state_g.block_registry.blocks[index];
|
|
}
|
|
++index;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
tc_block_registry_s tc_init_blocks()
|
|
{
|
|
tc_block_registry_s registry;
|
|
registry.blocks_capacity = 256;
|
|
registry.num_blocks = 0;
|
|
registry.blocks = calloc(sizeof(tc_block_entry_s), registry.blocks_capacity);
|
|
|
|
return registry;
|
|
}
|
|
|
|
tc_block_entry_s * tc_new_cube_block(tc_cube_info_s info)
|
|
{
|
|
tc_block_entry_s *entry = tc_new_block_entry(info.name);
|
|
entry->identifier = info.identifier;
|
|
|
|
tc_block_attribute_s block_type_attrib;
|
|
block_type_attrib.name = "block_type";
|
|
block_type_attrib.value.string = "basic_cube";
|
|
tc_add_attribute_to_block_entry(entry, block_type_attrib);
|
|
|
|
tc_block_attribute_s top_attrib;
|
|
top_attrib.name = "top_texture";
|
|
top_attrib.value.pointer = tc_resolve_id_to_image(info.texture_top);
|
|
tc_add_attribute_to_block_entry(entry, top_attrib);
|
|
|
|
tc_block_attribute_s bottom_attrib;
|
|
bottom_attrib.name = "bottom_texture";
|
|
bottom_attrib.value.pointer = tc_resolve_id_to_image(info.texture_bottom);
|
|
tc_add_attribute_to_block_entry(entry, bottom_attrib);
|
|
|
|
tc_block_attribute_s east_attrib;
|
|
east_attrib.name = "east_texture";
|
|
east_attrib.value.pointer = tc_resolve_id_to_image(info.texture_east);
|
|
tc_add_attribute_to_block_entry(entry, east_attrib);
|
|
|
|
tc_block_attribute_s west_attrib;
|
|
west_attrib.name = "west_texture";
|
|
west_attrib.value.pointer = tc_resolve_id_to_image(info.texture_west);
|
|
tc_add_attribute_to_block_entry(entry, west_attrib);
|
|
|
|
tc_block_attribute_s back_attrib;
|
|
back_attrib.name = "back_texture";
|
|
back_attrib.value.pointer = tc_resolve_id_to_image(info.texture_back);
|
|
tc_add_attribute_to_block_entry(entry, back_attrib);
|
|
|
|
tc_block_attribute_s front_attrib;
|
|
front_attrib.name = "front_texture";
|
|
front_attrib.value.pointer = tc_resolve_id_to_image(info.texture_front);
|
|
tc_add_attribute_to_block_entry(entry, front_attrib);
|
|
|
|
tc_premesh_cube(entry);
|
|
|
|
return entry;
|
|
}
|
|
|
|
tc_cube_info_s tc_gen_unitexture_cube_info
|
|
(char *name, uint32_t identifier, uint32_t texture)
|
|
{
|
|
tc_cube_info_s cube_info;
|
|
cube_info.name = name;
|
|
cube_info.identifier = identifier;
|
|
cube_info.texture_top = texture;
|
|
cube_info.texture_bottom = texture;
|
|
cube_info.texture_east = texture;
|
|
cube_info.texture_west = texture;
|
|
cube_info.texture_back = texture;
|
|
cube_info.texture_front = texture;
|
|
|
|
return cube_info;
|
|
}
|
|
|
|
void tc_create_blocks()
|
|
{
|
|
tc_image_s *dirt_texture = tc_resolve_name_to_image("dirt");
|
|
tc_image_s *grass_texture = tc_resolve_name_to_image("grass-side");
|
|
tc_image_s *grass_top_texture = tc_resolve_name_to_image("grass-top");
|
|
tc_image_s *stone_texture = tc_resolve_name_to_image("stone");
|
|
|
|
tc_cube_info_s dirt = tc_gen_unitexture_cube_info("Dirt", 1 | TC_BLOCK_OPAQUE_BIT, dirt_texture->image_id);
|
|
tc_cube_info_s stone = tc_gen_unitexture_cube_info("Stone", 3 | TC_BLOCK_OPAQUE_BIT, stone_texture->image_id);
|
|
tc_cube_info_s grass = tc_gen_unitexture_cube_info("Grass", 2 | TC_BLOCK_OPAQUE_BIT, grass_texture->image_id);
|
|
grass.texture_top = grass_top_texture->image_id;
|
|
|
|
tc_new_cube_block(dirt);
|
|
tc_new_cube_block(grass);
|
|
tc_new_cube_block(stone);
|
|
}
|
|
|