diff --git a/src/player_control.cpp b/src/player_control.cpp index 48d1900c..7772f097 100644 --- a/src/player_control.cpp +++ b/src/player_control.cpp @@ -1,6 +1,5 @@ #include "player_control.h" -#include "graphics/LineBatch.h" #include "objects/Player.h" #include "physics/PhysicsSolver.h" #include "physics/Hitbox.h" @@ -30,10 +29,11 @@ #define CHEAT_SPEED_MUL 5.0f #define JUMP_FORCE 7.0f -void update_controls(PhysicsSolver* physics, - Chunks* chunks, - Player* player, - float delta){ +PlayerController::PlayerController(Level* level) : level(level) { +} + +void PlayerController::update_controls(float delta){ + Player* player = level->player; if (Events::jpressed(GLFW_KEY_ESCAPE)){ Window::setShouldClose(true); @@ -65,7 +65,7 @@ void update_controls(PhysicsSolver* physics, } int substeps = (int)(delta * 1000); substeps = (substeps <= 0 ? 1 : (substeps > 100 ? 100 : substeps)); - physics->step(chunks, hitbox, delta, substeps, shift, player->flight ? 0.0f : 1.0f); + level->physics->step(level->chunks, hitbox, delta, substeps, shift, player->flight ? 0.0f : 1.0f); camera->position.x = hitbox->position.x; camera->position.y = hitbox->position.y + 0.7f; camera->position.z = hitbox->position.z; @@ -169,23 +169,19 @@ void update_controls(PhysicsSolver* physics, } } -void update_interaction(Level* level, LineBatch* lineBatch){ +void PlayerController::update_interaction(){ Chunks* chunks = level->chunks; Player* player = level->player; - Camera* camera = player->camera; Lighting* lighting = level->lighting; + Camera* camera = player->camera; vec3 end; vec3 norm; vec3 iend; voxel* vox = chunks->rayCast(camera->position, camera->front, 10.0f, end, norm, iend); if (vox != nullptr){ - if (Block::blocks[vox->id]->model == 1){ - lineBatch->box(iend.x+0.5f, iend.y+0.5f, iend.z+0.5f, 1.005f,1.005f,1.005f, 0,0,0,0.5f); - } else if (Block::blocks[vox->id]->model == 2){ - lineBatch->box(iend.x+0.4f, iend.y+0.3f, iend.z+0.4f, 0.805f,0.805f,0.805f, 0,0,0,0.5f); - } + selectedBlockId = vox->id; + selectedBlockPosition = iend; - if (Events::jclicked(GLFW_MOUSE_BUTTON_1) && Block::blocks[vox->id]->breakable){ int x = (int)iend.x; int y = (int)iend.y; @@ -208,5 +204,7 @@ void update_interaction(Level* level, LineBatch* lineBatch){ int z = (int)iend.z; player->choosenBlock = chunks->get(x,y,z)->id; } + } else { + selectedBlockId = -1; } } diff --git a/src/player_control.h b/src/player_control.h index d486b9b8..86fbc85b 100644 --- a/src/player_control.h +++ b/src/player_control.h @@ -1,13 +1,21 @@ #ifndef PLAYER_CONTROL_H_ #define PLAYER_CONTROL_H_ +#include + class PhysicsSolver; class Chunks; class Player; -class LineBatch; class Level; -void update_controls(PhysicsSolver* physics, Chunks* chunks, Player* player, float delta); -void update_interaction(Level* level, LineBatch* lineBatch); +class PlayerController { + Level* level; +public: + glm::vec3 selectedBlockPosition; + int selectedBlockId = -1; + PlayerController(Level* level); + void update_controls(float delta); + void update_interaction(); +}; #endif /* PLAYER_CONTROL_H_ */ diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 31ee3cb1..74ed3206 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -78,9 +78,9 @@ void write_world(World* world, Level* level){ world->wfile->writePlayer(level->player); } -void update_level(World* world, Level* level, vec3 position, float delta, long frame, VoxelRenderer* renderer, LineBatch* lineBatch){ - update_controls(level->physics, level->chunks, level->player, delta); - update_interaction(level, lineBatch); +void update_level(World* world, Level* level, vec3 position, float delta, long frame, VoxelRenderer* renderer, PlayerController* playerController){ + playerController->update_controls(delta); + playerController->update_interaction(); level->chunks->setCenter(world->wfile, position.x, 0, position.z); int freeLoaders = level->chunksController->countFreeLoaders(); @@ -137,6 +137,7 @@ int main() { std::cout << "-- preparing systems" << std::endl; HudRenderer hud; WorldRenderer worldRenderer(level); + PlayerController playerController(level); float lastTime = glfwGetTime(); float delta = 0.0f; @@ -161,8 +162,18 @@ int main() { devdata = !devdata; } - update_level(world, level, camera->position, delta, frame, worldRenderer.renderer, worldRenderer.lineBatch); + update_level(world, level, camera->position, delta, frame, worldRenderer.renderer, &playerController); worldRenderer.draw(world, camera, assets, occlusion); + if (playerController.selectedBlockId != -1){ + Block* selectedBlock = Block::blocks[playerController.selectedBlockId]; + LineBatch* lineBatch = worldRenderer.lineBatch; + vec3 pos = playerController.selectedBlockPosition; + if (selectedBlock->model == 1){ + lineBatch->box(pos.x+0.5f, pos.y+0.5f, pos.z+0.5f, 1.005f,1.005f,1.005f, 0,0,0,0.5f); + } else if (selectedBlock->model == 2){ + lineBatch->box(pos.x+0.4f, pos.y+0.3f, pos.z+0.4f, 0.805f,0.805f,0.805f, 0,0,0,0.5f); + } + } hud.draw(world, level, assets, devdata, fps); Window::swapBuffers(); @@ -170,6 +181,8 @@ int main() { } std::cout << "-- saving world" << std::endl; write_world(world, level); + + delete level; delete world; std::cout << "-- shutting down" << std::endl; diff --git a/src/voxels/WorldGenerator.cpp b/src/voxels/WorldGenerator.cpp index 54e80f83..c2a0f047 100644 --- a/src/voxels/WorldGenerator.cpp +++ b/src/voxels/WorldGenerator.cpp @@ -28,7 +28,7 @@ public: } void setSeed(int number){ - seed = (unsigned short)number+23729 xor (unsigned short)number+16786; + seed = ((unsigned short)number+23729 xor (unsigned short)number+16786); rand(); } }; @@ -102,7 +102,7 @@ void WorldGenerator::generate(voxel* voxels, int cx, int cy, int cz, int seed){ float heights[CHUNK_VOL]; - std::cout << calc_height(&noise, cx, cy) << "\n"; + // std::cout << calc_height(&noise, cx, cy) << "\n"; for (int z = 0; z < CHUNK_D; z++){ for (int x = 0; x < CHUNK_W; x++){ @@ -130,11 +130,11 @@ void WorldGenerator::generate(voxel* voxels, int cx, int cy, int cz, int seed){ id = 1; } else { int tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 16); - if (tree) + if (tree) { id = tree; - else if ((tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 19))){ + } else if ((tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 19))){ id = tree; - }else if ((tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 23))){ + } else if ((tree = generate_tree(&noise, &randomtree, heights, real_x, real_y, real_z, 23))){ id = tree; } }