Compare commits

..

No commits in common. "584332788de195d61946bd89d4852c7abd8b727c" and "a516f29be1882a17ded96900e9e8238b20a53c39" have entirely different histories.

9 changed files with 132 additions and 241 deletions

View File

@ -1,18 +1,17 @@
CXX = g++ CXX = g++
CXXFLAGS = -O3 -Isrc CXXFLAGS = -g -Isrc
LD = ld LD = ld
LINKFLAGS = -lGL -lglfw LINKFLAGS = -lGL -lglfw
CC = gcc CC = gcc
CCFLAGS = -O3 -Isrc CCFLAGS = -g -Isrc
XNOECRAFT_CPP_SRCS = $(shell find src/ -name '*.cpp') XNOECRAFT_CPP_SRCS = $(shell find src/ -name '*.cpp')
XNOECRAFT_C_SRCS = $(shell find src/ -name '*.c') XNOECRAFT_C_SRCS = $(shell find src/ -name '*.c')
XNOECRAFT_RES = $(shell find res/ -type f) XNOECRAFT_RES = $(shell find res/ -type f)
XNOECRAFT_OBJS = $(patsubst src/%.cpp,build/%.o,$(XNOECRAFT_CPP_SRCS)) $(patsubst src/%.c,build/%.o,$(XNOECRAFT_C_SRCS)) $(patsubst res/%.dat,build/%.o,$(XNOECRAFT_RES)) XNOECRAFT_OBJS = $(patsubst src/%.cpp,build/%.o,$(XNOECRAFT_CPP_SRCS)) $(patsubst src/%.c,build/%.o,$(XNOECRAFT_C_SRCS)) $(patsubst res/%.dat,build/%.o,$(XNOECRAFT_RES))
XNOECRAFT_OBJS_WIN = $(patsubst src/%.cpp,build/%.wo,$(XNOECRAFT_CPP_SRCS)) $(patsubst src/%.c,build/%.wo,$(XNOECRAFT_C_SRCS)) $(patsubst res/%.dat,build/%.o,$(XNOECRAFT_RES))
XNOECRAFT_SRC_DIRS = $(shell find src/* -type d) XNOECRAFT_SRC_DIRS = $(shell find src/* -type d)
XNOECRAFT_RES_DIRS = $(shell find res/* -type d) XNOECRAFT_RES_DIRS = $(shell find res/* -type d)
@ -20,11 +19,9 @@ XNOECRAFT_OBJ_DIRS = $(patsubst src/%,build/%,$(XNOECRAFT_SRC_DIRS)) $(patsubst
.PHONY = all cleanbuild clean prepare .PHONY = all cleanbuild clean prepare
run: all all: prepare build/xnoecraft
./build/xnoecraft ./build/xnoecraft
all: prepare build/xnoecraft build/xnoecraft.exe
cleanbuild: clean prepare build/xnoecraft cleanbuild: clean prepare build/xnoecraft
clean: clean:
@ -35,21 +32,12 @@ prepare: $(XNOECRAFT_OBJ_DIRS)
build/xnoecraft: $(XNOECRAFT_OBJS) build/xnoecraft: $(XNOECRAFT_OBJS)
$(CXX) $(LINKFLAGS) -o $@ $^ $(CXX) $(LINKFLAGS) -o $@ $^
build/xnoecraft.exe: $(XNOECRAFT_OBJS_WIN)
x86_64-w64-mingw32-g++ -static -static-libgcc -static-libstdc++ $^ -lglfw3 -lgdi32 -lssp -o $@
build/%.o: src/%.cpp build/%.o: src/%.cpp
$(CXX) $(CXXFLAGS) -o $@ -c $< $(CXX) $(CXXFLAGS) -o $@ -c $<
build/%.o: src/%.c build/%.o: src/%.c
$(CC) $(CCFLAGS) -o $@ -c $< $(CC) $(CCFLAGS) -o $@ -c $<
build/%.wo: src/%.cpp
x86_64-w64-mingw32-g++ $(CXXFLAGS) -o $@ -c $<
build/%.wo: src/%.c
x86_64-w64-mingw32-gcc $(CCFLAGS) -o $@ -c $<
build/%.o: res/%.dat build/%.o: res/%.dat
$(LD) -r -b binary $< -o $@ $(LD) -r -b binary $< -o $@

View File

@ -2,8 +2,6 @@
Instructions on how to build: Instructions on how to build:
- Install GLFW - Install GLFW via your Package manager
- Install GLM - Install GLM via your Package manager
- Install MinGW cross compiler
- Install GLFW MinGW
- `make` - `make`

View File

@ -22,4 +22,16 @@ void main() {
float intensity = clamp(dot(to_sun_vector, normal_pass), 0.25, 1.0); float intensity = clamp(dot(to_sun_vector, normal_pass), 0.25, 1.0);
color.xyz *= intensity; color.xyz *= intensity;
//vec3 to_camera_vector = normalize(camera_position_pass - position_pass);
//vec3 reflection = reflect(-to_sun_vector, normal_pass);
//float specular_intensity = max(dot(to_camera_vector, reflection), 0.0);
//specular_intensity = pow(specular_intensity, shine_dampener);
//specular_intensity *= reflectivity;
//if (dot(normal_pass, to_camera_vector) >= 0.3)
//color.xyz += vec3(1.0, 1.0, 1.0) * specular_intensity;
} }

View File

@ -10,14 +10,14 @@ private:
glm::mat4 projection_matrix; glm::mat4 projection_matrix;
float field_of_view; float field_of_view;
glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f);
glm::vec3 rotation = glm::vec3(0.0f, 0.0f, 0.0f);
int width; int width;
int height; int height;
void update_projection_matrix(int width, int height); void update_projection_matrix(int width, int height);
public: public:
glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f);
glm::vec3 rotation = glm::vec3(0.0f, 0.0f, 0.0f);
Camera(); Camera();
Camera(int width, int height); Camera(int width, int height);

View File

@ -31,37 +31,12 @@ void Chunk::set_block(int x, int y, int z, int block) {
} }
int Chunk::get_block(int x, int y, int z) { int Chunk::get_block(int x, int y, int z) {
if (x < 0 || x >= Chunk::horiz_size)
return 0;
if (z < 0 || z >= Chunk::horiz_size)
return 0;
if (y < 0 || y >= Chunk::vert_size) if (y < 0 || y >= Chunk::vert_size)
return 0; return 0;
if (x < 0) {
Chunk* c;
if (c = World::get_chunk(this->x-1, this->z))
return c->get_block(Chunk::horiz_size-1, y, z);
else
return 0;
} else if (x >= Chunk::horiz_size) {
Chunk* c;
if (c = World::get_chunk(this->x+1, this->z))
return c->get_block(0, y, z);
else
return 0;
}
if (z < 0) {
Chunk* c;
if (c = World::get_chunk(this->x, this->z-1))
return c->get_block(x, y, Chunk::horiz_size-1);
else
return 0;
} else if (z >= Chunk::horiz_size) {
Chunk* c;
if (c = World::get_chunk(this->x, this->z+1))
return c->get_block(x, y, 0);
else
return 0;
}
return this->blocks[y * Chunk::horiz_size * Chunk::horiz_size + z * Chunk::horiz_size + x]; return this->blocks[y * Chunk::horiz_size * Chunk::horiz_size + z * Chunk::horiz_size + x];
} }
@ -102,98 +77,100 @@ Chunk::~Chunk() {
void Chunk::generate() { void Chunk::generate() {
std::chrono::high_resolution_clock clock; std::chrono::high_resolution_clock clock;
auto t1 = clock.now(); if (mesh_version < current_version) {
mesh_version++; auto t1 = clock.now();
mesh_version++;
std::vector<glm::vec3> vertex_positions; std::vector<glm::vec3> vertex_positions;
std::vector<glm::vec3> vertex_normals; std::vector<glm::vec3> vertex_normals;
std::vector<glm::vec2> vertex_tex_coords; std::vector<glm::vec2> vertex_tex_coords;
std::vector<int> vertex_indexes; std::vector<int> vertex_indexes;
int index=0; int index=0;
for (int x=0; x<Chunk::horiz_size; x++) { for (int x=0; x<Chunk::horiz_size; x++) {
for (int z=0; z<Chunk::horiz_size; z++) { for (int z=0; z<Chunk::horiz_size; z++) {
for (int y=0; y<Chunk::vert_size; y++) { for (int y=0; y<Chunk::vert_size; y++) {
int block; int block;
if (block = get_block(x, y, z)) { if (block = get_block(x, y, z)) {
bool faces[6] = { bool faces[6] = {
!get_block(x-1, y, z), // Left !get_block(x-1, y, z), // Left
!get_block(x+1, y, z), // Right !get_block(x+1, y, z), // Right
!get_block(x, y, z-1), // Back !get_block(x, y, z-1), // Back
!get_block(x, y, z+1), // Front !get_block(x, y, z+1), // Front
!get_block(x, y-1, z), // Bottom !get_block(x, y-1, z), // Bottom
!get_block(x, y+1, z), // Top !get_block(x, y+1, z), // Top
}; };
for (int i=0; i<6; i++) { for (int i=0; i<6; i++) {
if (faces[i]) { if (faces[i]) {
vertex_positions.emplace_back(cube_vertexes[i][0].x + x, cube_vertexes[i][0].y + y, cube_vertexes[i][0].z + z); vertex_positions.emplace_back(cube_vertexes[i][0].x + x, cube_vertexes[i][0].y + y, cube_vertexes[i][0].z + z);
vertex_positions.emplace_back(cube_vertexes[i][1].x + x, cube_vertexes[i][1].y + y, cube_vertexes[i][1].z + z); vertex_positions.emplace_back(cube_vertexes[i][1].x + x, cube_vertexes[i][1].y + y, cube_vertexes[i][1].z + z);
vertex_positions.emplace_back(cube_vertexes[i][2].x + x, cube_vertexes[i][2].y + y, cube_vertexes[i][2].z + z); vertex_positions.emplace_back(cube_vertexes[i][2].x + x, cube_vertexes[i][2].y + y, cube_vertexes[i][2].z + z);
vertex_positions.emplace_back(cube_vertexes[i][3].x + x, cube_vertexes[i][3].y + y, cube_vertexes[i][3].z + z); vertex_positions.emplace_back(cube_vertexes[i][3].x + x, cube_vertexes[i][3].y + y, cube_vertexes[i][3].z + z);
vertex_normals.push_back(cube_normals[i]); vertex_normals.push_back(cube_normals[i]);
vertex_normals.push_back(cube_normals[i]); vertex_normals.push_back(cube_normals[i]);
vertex_normals.push_back(cube_normals[i]); vertex_normals.push_back(cube_normals[i]);
vertex_normals.push_back(cube_normals[i]); vertex_normals.push_back(cube_normals[i]);
int u = block % 16; int u = block % 16;
int v = block / 16; int v = block / 16;
float uv_step = 1.0f / 16.0f; float uv_step = 1.0f / 16.0f;
vertex_tex_coords.emplace_back(uv_step * (u), uv_step * (v)); vertex_tex_coords.emplace_back(uv_step * (u), uv_step * (v));
vertex_tex_coords.emplace_back(uv_step * (u), uv_step * (v+1)); vertex_tex_coords.emplace_back(uv_step * (u), uv_step * (v+1));
vertex_tex_coords.emplace_back(uv_step * (u+1), uv_step * (v+1)); vertex_tex_coords.emplace_back(uv_step * (u+1), uv_step * (v+1));
vertex_tex_coords.emplace_back(uv_step * (u+1), uv_step * (v)); vertex_tex_coords.emplace_back(uv_step * (u+1), uv_step * (v));
vertex_indexes.push_back(index + 0); vertex_indexes.push_back(index + 0);
vertex_indexes.push_back(index + 1); vertex_indexes.push_back(index + 1);
vertex_indexes.push_back(index + 2); vertex_indexes.push_back(index + 2);
vertex_indexes.push_back(index + 2); vertex_indexes.push_back(index + 2);
vertex_indexes.push_back(index + 3); vertex_indexes.push_back(index + 3);
vertex_indexes.push_back(index + 0); vertex_indexes.push_back(index + 0);
index += 4; index += 4;
}
} }
} }
} }
} }
} }
glGenVertexArrays(1, &this->VAO);
glBindVertexArray(this->VAO);
glGenBuffers(4, this->VBOs);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, this->VBOs[0]);
glBufferData(GL_ARRAY_BUFFER, vertex_positions.size() * sizeof(glm::vec3), &vertex_positions[0].x, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, this->VBOs[1]);
glBufferData(GL_ARRAY_BUFFER, vertex_normals.size() * sizeof(glm::vec3), &vertex_normals[0].x, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_TRUE, 0, (void*)0);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, this->VBOs[2]);
glBufferData(GL_ARRAY_BUFFER, vertex_tex_coords.size() * sizeof(glm::vec2), &vertex_tex_coords[0].x, GL_STATIC_DRAW);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(3);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->VBOs[3]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertex_indexes.size() * sizeof(int), &vertex_indexes[0], GL_STATIC_DRAW);
glVertexAttribPointer(3, 1, GL_INT, GL_FALSE, 0, (void*)0);
this->vertex_count = vertex_indexes.size();
auto t2 = clock.now();
std::chrono::duration<double> d = (t2 - t1);
std::cerr << "Generated chunk in " << d.count() << " seconds.\n";
} }
glGenVertexArrays(1, &this->VAO);
glBindVertexArray(this->VAO);
glGenBuffers(4, this->VBOs);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, this->VBOs[0]);
glBufferData(GL_ARRAY_BUFFER, vertex_positions.size() * sizeof(glm::vec3), &vertex_positions[0].x, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, this->VBOs[1]);
glBufferData(GL_ARRAY_BUFFER, vertex_normals.size() * sizeof(glm::vec3), &vertex_normals[0].x, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_TRUE, 0, (void*)0);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, this->VBOs[2]);
glBufferData(GL_ARRAY_BUFFER, vertex_tex_coords.size() * sizeof(glm::vec2), &vertex_tex_coords[0].x, GL_STATIC_DRAW);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(3);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->VBOs[3]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertex_indexes.size() * sizeof(int), &vertex_indexes[0], GL_STATIC_DRAW);
glVertexAttribPointer(3, 1, GL_INT, GL_FALSE, 0, (void*)0);
this->vertex_count = vertex_indexes.size();
auto t2 = clock.now();
std::chrono::duration<double> d = (t2 - t1);
std::cerr << "Generated chunk in " << d.count() << " seconds.\n";
} }
bool Chunk::outdated() { bool Chunk::outdated() {

View File

@ -9,9 +9,6 @@
#include <iostream> #include <iostream>
class Chunk { class Chunk {
public:
static constexpr int horiz_size = 16;
static constexpr int vert_size = 256;
private: private:
GLuint VAO = 0; GLuint VAO = 0;
GLuint VBOs[4]; GLuint VBOs[4];
@ -19,7 +16,14 @@ private:
int mesh_version=0; int mesh_version=0;
int current_version=1; int current_version=1;
static constexpr int horiz_size = 16;
static constexpr int vert_size = 256;
int blocks[horiz_size * horiz_size * vert_size]; int blocks[horiz_size * horiz_size * vert_size];
inline void set_block(int x, int y, int z, int block);
inline int get_block(int x, int y, int z);
public: public:
int x; int x;
int z; int z;
@ -36,9 +40,6 @@ public:
glm::mat4 get_transformation_matrix(); glm::mat4 get_transformation_matrix();
void select(); void select();
void set_block(int x, int y, int z, int block);
int get_block(int x, int y, int z);
}; };
#endif #endif

View File

@ -34,69 +34,25 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod
key_states[key] = 0; key_states[key] = 0;
} }
float vel_forward, vel_y, vel_right;
void loop(float deltatime, GLFWwindow* w) { void loop(float deltatime, GLFWwindow* w) {
float speed = 5.0f;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.2f, 0.6f, 0.7f, 1.0f); glClearColor(0.2f, 0.6f, 0.7f, 1.0f);
std::cout << "Deltatime: " << deltatime << "\n"; std::cout << "Deltatime: " << deltatime << "\n";
glm::vec3 old_position = c->get_position(); float speed = 20.0f;
glm::vec3 new_position = old_position;
glm::vec3 forward(
glm::sin(c->rotation.y),
0,
glm::cos(c->rotation.y)
);
glm::vec3 right(
glm::sin(c->rotation.y + 1.57f),
0,
glm::cos(c->rotation.y + 1.57f)
);
new_position.y += vel_y * deltatime;
if (world->collide(new_position.x, new_position.y-0.5f, new_position.z) || world->collide(new_position.x, new_position.y-1.5f, new_position.z)) {
vel_y = 0.0f;
new_position.y = old_position.y;
}
vel_forward = 0.0f;
vel_right = 0.0f;
if (key_states[GLFW_KEY_W]) if (key_states[GLFW_KEY_W])
vel_forward = -speed; c->move_by(glm::vec3(0.0f, 0.0f, -speed) * deltatime);
if (key_states[GLFW_KEY_S])
vel_forward = speed;
if (key_states[GLFW_KEY_A]) if (key_states[GLFW_KEY_A])
vel_right = -speed; c->move_by(glm::vec3(-speed, 0.0f, 0.0f) * deltatime);
if (key_states[GLFW_KEY_S])
c->move_by(glm::vec3(0.0f, 0.0f, speed) * deltatime);
if (key_states[GLFW_KEY_D]) if (key_states[GLFW_KEY_D])
vel_right = speed; c->move_by(glm::vec3(speed, 0.0f, 0.0f) * deltatime);
if (key_states[GLFW_KEY_SPACE] && vel_y == 0.0f) if (key_states[GLFW_KEY_SPACE])
vel_y = 6.0f; c->change_position_by(glm::vec3(0.0f, speed, 0.0f) * deltatime);
if (key_states[GLFW_KEY_LEFT_SHIFT])
forward *= vel_forward; c->change_position_by(glm::vec3(0.0f, -speed, 0.0f) * deltatime);
forward *= deltatime;
right *= vel_right;
right *= deltatime;
new_position += forward;
if (world->collide(new_position.x, new_position.y-0.5f, new_position.z) || world->collide(new_position.x, new_position.y-1.5f, new_position.z)) {
new_position.x = old_position.x;
new_position.z = old_position.z;
}
new_position += right;
if (world->collide(new_position.x, new_position.y-0.5f, new_position.z) || world->collide(new_position.x, new_position.y-1.5f, new_position.z)) {
new_position.x = old_position.x;
new_position.z = old_position.z;
}
c->set_position(new_position);
if (vel_y >= -50.0f)
vel_y -= 9.81f * deltatime;
double current_x_pos, current_y_pos; double current_x_pos, current_y_pos;
glfwGetCursorPos(w, &current_x_pos, &current_y_pos); glfwGetCursorPos(w, &current_x_pos, &current_y_pos);

View File

@ -6,11 +6,10 @@ FastNoise World::noise;
World::World() { World::World() {
World::noise = FastNoise(); World::noise = FastNoise();
World::noise.SetNoiseType(FastNoise::Perlin); World::noise.SetNoiseType(FastNoise::Perlin);
World::world = this;
} }
void World::generate_around(int x, int z) { void World::generate_around(int x, int z) {
int world_size_half = this->world_size; int world_size_half = this->world_size / 2;
this->world_center = glm::vec2(x, z); this->world_center = glm::vec2(x, z);
@ -24,6 +23,8 @@ void World::generate_around(int x, int z) {
for (Chunk* c : this->chunks) for (Chunk* c : this->chunks)
c->generate(); c->generate();
World::world = this;
} }
void World::process(int x, int z) { void World::process(int x, int z) {
@ -33,13 +34,12 @@ void World::process(int x, int z) {
return; return;
std::vector<Chunk*> new_chunks; std::vector<Chunk*> new_chunks;
std::vector<Chunk*> to_generate;
// Player has moved from the world center. // Player has moved from the world center.
// Determine world bounds. // Determine world bounds.
int world_size_half = this->world_size; int world_size_half = this->world_size / 2;
int x_low = x - world_size_half; int x_low = x - world_size_half;
int x_high = x + world_size_half; int x_high = x + world_size_half;
@ -68,37 +68,21 @@ void World::process(int x, int z) {
Chunk* c = new Chunk(x + rel_x, z + rel_z); Chunk* c = new Chunk(x + rel_x, z + rel_z);
new_chunks.push_back(c); new_chunks.push_back(c);
to_generate.push_back(c);
this->location_map[std::tuple<int, int>(x + rel_x, z + rel_z)] = c; this->location_map[std::tuple<int, int>(x + rel_x, z + rel_z)] = c;
// Remove and delete it. // Remove and delete it.
this->location_map.erase(std::tuple<int, int>(chunk->x, chunk->z)); this->location_map.erase(std::tuple<int, int>(chunk->x, chunk->z));
delete chunk; delete chunk;
} else { } else {
// If it's in bounds, keep it // If it's in bounds, keep it.
new_chunks.push_back(chunk); new_chunks.push_back(chunk);
// Determine if its mesh needs regeneration
if (x < this->world_center[0]) {
if (chunk->x == x_low+2 || chunk->x == x_high)
to_generate.push_back(chunk);
} else if (x > this->world_center[0]) {
if (chunk->x == x_low || chunk->x == x_high-2)
to_generate.push_back(chunk);
}
if (z < this->world_center[1]) {
if (chunk->z == z_low+2 || chunk->z == z_high)
to_generate.push_back(chunk);
} else if (z > this->world_center[1]) {
if (chunk->z == z_low || chunk->z == z_high-2)
to_generate.push_back(chunk);
}
} }
} }
// Go through all the chunks and regenerate them if they are outdated // Go through all the chunks and regenerate them if they are outdated
for (Chunk* chunk : to_generate) for (Chunk* chunk : new_chunks)
chunk->generate(); if (chunk->outdated())
chunk->generate();
//new_chunks.swap(this->chunks); //new_chunks.swap(this->chunks);
this->chunks = new_chunks; this->chunks = new_chunks;
@ -111,8 +95,8 @@ float World::get_height_at(int x, int z) {
} }
Chunk* World::get_chunk(int x, int z) { Chunk* World::get_chunk(int x, int z) {
auto search = World::world->location_map.find(std::tuple<int, int>(x, z)); auto search = this->location_map.find(std::tuple<int, int>(x, z));
if (search == World::world->location_map.end()) if (search == this->location_map.end())
return 0; return 0;
return std::get<1>(*search); return std::get<1>(*search);
} }
@ -129,26 +113,3 @@ void World::render(Camera* c, Shader* s) {
glDrawElements(GL_TRIANGLES, chunk->vertex_count, GL_UNSIGNED_INT, 0); glDrawElements(GL_TRIANGLES, chunk->vertex_count, GL_UNSIGNED_INT, 0);
} }
} }
bool World::collide(float x, float y, float z) {
int chunk_x = x / 16;
int chunk_z = z / 16;
int chunk_rel_x = (int)x % 16;
int chunk_rel_z = (int)z % 16;
if (chunk_rel_x < 0) {
chunk_rel_x += (Chunk::horiz_size-1);
chunk_x--;
}
if (chunk_rel_z < 0) {
chunk_rel_z += (Chunk::horiz_size-1);
chunk_z--;
}
Chunk* c;
if (!(c = get_chunk(chunk_x, chunk_z)))
return false;
return c->get_block(chunk_rel_x, y, chunk_rel_z);
}

View File

@ -30,7 +30,7 @@ private:
glm::ivec2 world_center; glm::ivec2 world_center;
int world_size = 16; int world_size = 32;
static World* world; static World* world;
@ -41,11 +41,9 @@ public:
void process(int x, int z); void process(int x, int z);
static float get_height_at(int x, int z); static float get_height_at(int x, int z);
static Chunk* get_chunk(int x, int z); Chunk* get_chunk(int x, int z);
void render(Camera* c, Shader* s); void render(Camera* c, Shader* s);
bool collide(float x, float y, float z);
}; };
#endif #endif