diff --git a/Makefile b/Makefile index 8fcf1af..436ee61 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ XNOECRAFT_C_SRCS = $(shell find src/ -name '*.c') 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_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_RES_DIRS = $(shell find res/* -type d) @@ -19,9 +20,11 @@ XNOECRAFT_OBJ_DIRS = $(patsubst src/%,build/%,$(XNOECRAFT_SRC_DIRS)) $(patsubst .PHONY = all cleanbuild clean prepare -all: prepare build/xnoecraft +run: all ./build/xnoecraft +all: prepare build/xnoecraft build/xnoecraft.exe + cleanbuild: clean prepare build/xnoecraft clean: @@ -32,12 +35,21 @@ prepare: $(XNOECRAFT_OBJ_DIRS) build/xnoecraft: $(XNOECRAFT_OBJS) $(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 $(CXX) $(CXXFLAGS) -o $@ -c $< build/%.o: src/%.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 $(LD) -r -b binary $< -o $@ diff --git a/res/fragment_shader.dat b/res/fragment_shader.dat index 3e38817..df72a09 100644 --- a/res/fragment_shader.dat +++ b/res/fragment_shader.dat @@ -22,16 +22,4 @@ void main() { float intensity = clamp(dot(to_sun_vector, normal_pass), 0.25, 1.0); 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; } \ No newline at end of file diff --git a/src/camera.h b/src/camera.h index 3afa046..4ab987e 100644 --- a/src/camera.h +++ b/src/camera.h @@ -10,14 +10,14 @@ private: glm::mat4 projection_matrix; 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 height; void update_projection_matrix(int width, int height); 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(int width, int height); diff --git a/src/chunk.h b/src/chunk.h index 4acb89c..daaf78b 100644 --- a/src/chunk.h +++ b/src/chunk.h @@ -9,6 +9,9 @@ #include class Chunk { +public: + static constexpr int horiz_size = 16; + static constexpr int vert_size = 256; private: GLuint VAO = 0; GLuint VBOs[4]; @@ -16,14 +19,7 @@ private: int mesh_version=0; int current_version=1; - static constexpr int horiz_size = 16; - static constexpr int vert_size = 256; - 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: int x; int z; @@ -40,6 +36,9 @@ public: glm::mat4 get_transformation_matrix(); void select(); + + void set_block(int x, int y, int z, int block); + int get_block(int x, int y, int z); }; #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 78678f6..6749e8d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,25 +34,69 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod key_states[key] = 0; } +float vel_forward, vel_y, vel_right; void loop(float deltatime, GLFWwindow* w) { + float speed = 5.0f; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.2f, 0.6f, 0.7f, 1.0f); std::cout << "Deltatime: " << deltatime << "\n"; - float speed = 20.0f; + glm::vec3 old_position = c->get_position(); + 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]) - c->move_by(glm::vec3(0.0f, 0.0f, -speed) * deltatime); - if (key_states[GLFW_KEY_A]) - c->move_by(glm::vec3(-speed, 0.0f, 0.0f) * deltatime); + vel_forward = -speed; if (key_states[GLFW_KEY_S]) - c->move_by(glm::vec3(0.0f, 0.0f, speed) * deltatime); + vel_forward = speed; + if (key_states[GLFW_KEY_A]) + vel_right = -speed; if (key_states[GLFW_KEY_D]) - c->move_by(glm::vec3(speed, 0.0f, 0.0f) * deltatime); - if (key_states[GLFW_KEY_SPACE]) - c->change_position_by(glm::vec3(0.0f, speed, 0.0f) * deltatime); - if (key_states[GLFW_KEY_LEFT_SHIFT]) - c->change_position_by(glm::vec3(0.0f, -speed, 0.0f) * deltatime); + vel_right = speed; + if (key_states[GLFW_KEY_SPACE] && vel_y == 0.0f) + vel_y = 6.0f; + + forward *= vel_forward; + 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; glfwGetCursorPos(w, ¤t_x_pos, ¤t_y_pos); diff --git a/src/world.cpp b/src/world.cpp index 973612b..4883115 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -128,4 +128,27 @@ void World::render(Camera* c, Shader* s) { 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); } \ No newline at end of file diff --git a/src/world.h b/src/world.h index 78956d7..60baaa8 100644 --- a/src/world.h +++ b/src/world.h @@ -44,6 +44,8 @@ public: static Chunk* get_chunk(int x, int z); void render(Camera* c, Shader* s); + + bool collide(float x, float y, float z); }; #endif \ No newline at end of file