#include "blocks.h" #include "state.h" float tc_cube_front_uv[12] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f }; float tc_cube_front_xyz[18] = { -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f }; float tc_cube_back_uv[12] = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f }; float tc_cube_back_xyz[18] = { 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f }; float tc_cube_west_uv[12] = { // Left 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f }; float tc_cube_west_xyz[18] = { -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f }; float tc_cube_east_uv[12] = { // Right 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; float tc_cube_east_xyz[18] = { 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f }; float tc_cube_top_uv[12] = { // Top 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f }; float tc_cube_top_xyz[18] = { -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f }; float tc_cube_bottom_uv[12] = { // Bottom 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f }; float tc_cube_bottom_xyz[18] = { -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f }; void tc_adjust_cube_uvs_for_image(tc_image_s *image, float *face_uvs) { float lower_x = ((float) image->x) / ((float) image->width); float lower_y = ((float) image->y) / ((float) image->height); float higher_x; float higher_y; if(image->superimage != NULL) { higher_x = (((float) (image->x + image->width)) / ((float) image->superimage->width)); higher_y = (((float) (image->y + image->height)) / ((float) image->superimage->height)); } else { higher_x = 1.0f; higher_y = 1.0f; } uint32_t num_floats = 2 * 6; uint32_t index = 0; while(index < num_floats) { if(face_uvs[index] == 1.0f) { face_uvs[index] = higher_x; } else { face_uvs[index] = lower_x; } ++index; if(face_uvs[index] == 1.0f) { face_uvs[index] = higher_y; } else { face_uvs[index] = lower_y; } ++index; } } tc_cube_side_mesh_s * tc_premesh_cube_block_side( tc_image_s *image, float *xyz, float *uv, uint32_t num_vertices ) { tc_cube_side_mesh_s *side = malloc(sizeof(tc_cube_side_mesh_s)); side->num_vertices = num_vertices; side->allocation = malloc(sizeof(float) * num_vertices * (2+3)); side->xyz = side->allocation; memcpy(side->xyz, xyz, sizeof(float) * num_vertices * 3); side->uv = &side->allocation[num_vertices*3]; memcpy(side->uv, uv, sizeof(float) * num_vertices * 2); tc_adjust_cube_uvs_for_image(image, side->uv); return side; } void tc_premesh_cube(tc_block_entry_s *entry) { tc_image_s *front_texture = tc_block_resolve_name_to_attribute(entry, "front_texture")->value.pointer; tc_image_s *back_texture = tc_block_resolve_name_to_attribute(entry, "back_texture")->value.pointer; tc_image_s *west_texture = tc_block_resolve_name_to_attribute(entry, "west_texture")->value.pointer; tc_image_s *east_texture = tc_block_resolve_name_to_attribute(entry, "east_texture")->value.pointer; tc_image_s *top_texture = tc_block_resolve_name_to_attribute(entry, "top_texture")->value.pointer; tc_image_s *bottom_texture = tc_block_resolve_name_to_attribute(entry, "bottom_texture")->value.pointer; tc_cube_side_mesh_s *front = tc_premesh_cube_block_side(front_texture, tc_cube_front_xyz, tc_cube_front_uv, 6); tc_cube_side_mesh_s *back = tc_premesh_cube_block_side(back_texture, tc_cube_back_xyz, tc_cube_back_uv, 6); tc_cube_side_mesh_s *west = tc_premesh_cube_block_side(west_texture, tc_cube_west_xyz, tc_cube_west_uv, 6); tc_cube_side_mesh_s *east = tc_premesh_cube_block_side(east_texture, tc_cube_east_xyz, tc_cube_east_uv, 6); tc_cube_side_mesh_s *top = tc_premesh_cube_block_side(top_texture, tc_cube_top_xyz, tc_cube_top_uv, 6); tc_cube_side_mesh_s *bottom = tc_premesh_cube_block_side(bottom_texture, tc_cube_bottom_xyz, tc_cube_bottom_uv, 6); tc_block_attribute_s front_attribute; front_attribute.name = "south_mesh"; front_attribute.value.pointer = front; tc_block_attribute_s back_attribute; back_attribute.name = "north_mesh"; back_attribute.value.pointer = back; tc_block_attribute_s west_attribute; west_attribute.name = "west_mesh"; west_attribute.value.pointer = west; tc_block_attribute_s east_attribute; east_attribute.name = "east_mesh"; east_attribute.value.pointer = east; tc_block_attribute_s top_attribute; top_attribute.name = "top_mesh"; top_attribute.value.pointer = top; tc_block_attribute_s bottom_attribute; bottom_attribute.name = "bottom_mesh"; bottom_attribute.value.pointer = bottom; tc_add_attribute_to_block_entry(entry, front_attribute); tc_add_attribute_to_block_entry(entry, back_attribute); tc_add_attribute_to_block_entry(entry, east_attribute); tc_add_attribute_to_block_entry(entry, west_attribute); tc_add_attribute_to_block_entry(entry, top_attribute); tc_add_attribute_to_block_entry(entry, bottom_attribute); }