From 9f911204d2a8295a669b0741a5076f55a0dd9cc5 Mon Sep 17 00:00:00 2001 From: Elisey Puzko Date: Sun, 18 Feb 2018 13:25:30 +0300 Subject: Small changes to conform Google C++ styleguide --- src/GameState.cpp | 106 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 81 insertions(+), 25 deletions(-) (limited to 'src/GameState.cpp') diff --git a/src/GameState.cpp b/src/GameState.cpp index 28e8007..6182d20 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -13,7 +13,10 @@ void GameState::Update(float deltaTime) { auto delta = clock.now() - timeOfPreviousSendedPacket; using namespace std::chrono_literals; if (delta >= 50ms) { - auto packetToSend = std::make_shared(player->pos.x, player->pos.y, player->pos.z, player->yaw, player->pitch, player->onGround); + auto packetToSend = std::make_shared( + player->pos.x, player->pos.y, player->pos.z, + player->yaw, player->pitch, player->onGround); + auto packet = std::static_pointer_cast(packetToSend); PUSH_EVENT("SendPacket",packet); timeOfPreviousSendedPacket = clock.now(); @@ -22,7 +25,10 @@ void GameState::Update(float deltaTime) { bool prevOnGround = player->onGround; world.UpdatePhysics(deltaTime); if (player->onGround != prevOnGround) { - auto updatePacket = std::make_shared(player->pos.x, player->pos.y, player->pos.z, player->onGround); + auto updatePacket = std::make_shared( + player->pos.x, player->pos.y, + player->pos.z, player->onGround); + auto packet = std::static_pointer_cast(updatePacket); PUSH_EVENT("SendPacket",packet); } @@ -60,10 +66,13 @@ void GameState::UpdatePacket(std::shared_ptr ptr) PUSH_EVENT("EntityChanged", entity.entityId); break; } + case SpawnExperienceOrb: break; + case SpawnGlobalEntity: break; + case SpawnMob: { auto packet = std::static_pointer_cast(ptr); Entity entity; @@ -78,8 +87,10 @@ void GameState::UpdatePacket(std::shared_ptr ptr) PUSH_EVENT("EntityChanged", entity.entityId); break; } + case SpawnPainting: break; + case SpawnPlayer: { auto packet = std::static_pointer_cast(ptr); Entity entity; @@ -105,28 +116,33 @@ void GameState::UpdatePacket(std::shared_ptr ptr) break; case BlockAction: break; + case BlockChange: { auto packet = std::static_pointer_cast(ptr); world.ParseChunkData(packet); break; } + case BossBar: break; case ServerDifficulty: break; case TabCompleteCB: break; + case ChatMessageCB: { auto packet = std::static_pointer_cast(ptr); LOG(INFO) << "Message (" << int(packet->Position) << "): " << packet->JsonData.text; PUSH_EVENT("ChatMessageReceived", std::make_tuple(packet->JsonData, packet->Position)); break; } + case MultiBlockChange: { auto packet = std::static_pointer_cast(ptr); world.ParseChunkData(packet); break; } + case ConfirmTransactionCB: { auto packet = std::static_pointer_cast(ptr); if (packet->WindowId == 0) { @@ -138,14 +154,17 @@ void GameState::UpdatePacket(std::shared_ptr ptr) } break; } + case CloseWindowCB: break; + case OpenWindow: { auto packet = std::static_pointer_cast(ptr); LOG(INFO) << "Open new window " << packet->WindowTitle << ": " << packet->WindowId; break; } + case WindowItems: { auto packet = std::static_pointer_cast(ptr); if (packet->WindowId == 0) { @@ -154,8 +173,10 @@ void GameState::UpdatePacket(std::shared_ptr ptr) } break; } + case WindowProperty: break; + case SetSlot: { auto packet = std::static_pointer_cast(ptr); if (packet->WindowId == 0) { @@ -163,41 +184,51 @@ void GameState::UpdatePacket(std::shared_ptr ptr) } break; } + case SetCooldown: break; case PluginMessageCB: break; case NamedSoundEffect: break; + case DisconnectPlay: { auto packet = std::static_pointer_cast(ptr); LOG(INFO) << "Disconnect reason: " << packet->Reason; PUSH_EVENT("Disconnected", packet->Reason); break; } + case EntityStatus: break; case Explosion: break; + case UnloadChunk: { auto packet = std::static_pointer_cast(ptr); world.ParseChunkData(packet); break; } + case ChangeGameState: break; - case KeepAliveCB: + + case KeepAliveCB: { LOG(WARNING) << "Receive KeepAlive packet in GameState handler"; break; + } + case ChunkData: { auto packet = std::static_pointer_cast(ptr); world.ParseChunkData(packet); break; } + case Effect: break; case Particle: break; + case JoinGame: { auto packet = std::static_pointer_cast(ptr); Entity entity; @@ -219,8 +250,10 @@ void GameState::UpdatePacket(std::shared_ptr ptr) PUSH_EVENT("PlayerConnected", 0); break; } + case Map: break; + case EntityRelativeMove: { auto packet = std::static_pointer_cast(ptr); Entity &entity = world.GetEntity(packet->EntityId); @@ -229,6 +262,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) LOG(INFO) << "M: " << packet->EntityId; break; } + case EntityLookAndRelativeMove: { auto packet = std::static_pointer_cast(ptr); Entity &entity = world.GetEntity(packet->EntityId); @@ -237,6 +271,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) entity.yaw = packet->Yaw / 256.0; break; } + case EntityLook: { auto packet = std::static_pointer_cast(ptr); Entity &entity = world.GetEntity(packet->EntityId); @@ -245,6 +280,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) //LOG(INFO) << "L: " << packet->EntityId; break; } + case EntityCB: break; case VehicleMove: @@ -257,6 +293,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) break; case PlayerListItem: break; + case PlayerPositionAndLookCB: { auto packet = std::static_pointer_cast(ptr); if ((packet->Flags & 0x10) != 0) { @@ -306,10 +343,12 @@ void GameState::UpdatePacket(std::shared_ptr ptr) PUSH_EVENT("SendPacket",std::static_pointer_cast(packetPerformRespawn)); break; } + case UseBed: break; case UnlockRecipes: break; + case DestroyEntities: { auto packet = std::static_pointer_cast(ptr); for (unsigned int entityId : packet->EntityIds) { @@ -317,6 +356,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) } break; } + case RemoveEntityEffect: break; case ResourcePackSend: @@ -339,16 +379,19 @@ void GameState::UpdatePacket(std::shared_ptr ptr) break; case AttachEntity: break; + case EntityVelocity: { auto packet = std::static_pointer_cast(ptr); Entity &entity = world.GetEntity(packet->EntityId); entity.vel = Entity::DecodeVelocity(packet->VelocityX, packet->VelocityY, packet->VelocityZ); break; } + case EntityEquipment: break; case SetExperience: break; + case UpdateHealth: { auto packet = std::static_pointer_cast(ptr); g_PlayerHealth = packet->Health; @@ -359,6 +402,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) } break; } + case ScoreboardObjective: break; case SetPassengers: @@ -367,6 +411,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) break; case UpdateScore: break; + case SpawnPosition: { auto packet = std::static_pointer_cast(ptr); g_SpawnPosition = packet->Location; @@ -374,12 +419,14 @@ void GameState::UpdatePacket(std::shared_ptr ptr) << g_SpawnPosition.z; break; } + case TimeUpdate: { auto packet = std::static_pointer_cast(ptr); WorldAge = packet->WorldAge; TimeOfDay = packet->TimeOfDay; break; } + case Title: break; case SoundEffect: @@ -388,6 +435,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) break; case CollectItem: break; + case EntityTeleport: { auto packet = std::static_pointer_cast(ptr); Entity &entity = world.GetEntity(packet->EntityId); @@ -396,6 +444,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) entity.yaw = packet->Yaw / 256.0; break; } + case Advancements: break; case EntityProperties: @@ -403,6 +452,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) case EntityEffect: break; } + while (!playerInventory.pendingTransactions.empty()) { auto packet = std::make_shared(playerInventory.pendingTransactions.front()); playerInventory.pendingTransactions.pop(); @@ -431,25 +481,33 @@ void GameState::HandleMovement(GameState::Direction direction, float deltaTime) glm::vec3 vel = player->vel.glm(); switch (direction) { - case FORWARD: - vel += front * velocity; - break; - case BACKWARD: - vel -= front * velocity; - break; - case RIGHT: - vel += right * velocity; - break; - case LEFT: - vel -= right * velocity; - break; - case JUMP: - if (player->onGround) { - vel.y += 10; - player->onGround = false; - } - break; - } + case FORWARD: { + vel += front * velocity; + break; + } + + case BACKWARD: { + vel -= front * velocity; + break; + } + + case RIGHT: { + vel += right * velocity; + break; + } + + case LEFT: { + vel -= right * velocity; + break; + } + + case JUMP: + if (player->onGround) { + vel.y += 10; + player->onGround = false; + } + break; + } player->vel = VectorF(vel.x, vel.y, vel.z); } @@ -494,6 +552,4 @@ void GameState::StartDigging() { PUSH_EVENT("SendPacket",packet); } -void GameState::StopDigging() { - -} +void GameState::StopDigging() {} -- cgit v1.2.3 From 99354db9db9be0f921980f081ee7ed6515d2dcdc Mon Sep 17 00:00:00 2001 From: Elisey Puzko Date: Tue, 20 Feb 2018 13:09:39 +0300 Subject: New event: SelectedBlockChanged --- src/GameState.cpp | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) (limited to 'src/GameState.cpp') diff --git a/src/GameState.cpp b/src/GameState.cpp index 6182d20..3166f1a 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -18,7 +18,7 @@ void GameState::Update(float deltaTime) { player->yaw, player->pitch, player->onGround); auto packet = std::static_pointer_cast(packetToSend); - PUSH_EVENT("SendPacket",packet); + PUSH_EVENT("SendPacket", packet); timeOfPreviousSendedPacket = clock.now(); } @@ -30,7 +30,7 @@ void GameState::Update(float deltaTime) { player->pos.z, player->onGround); auto packet = std::static_pointer_cast(updatePacket); - PUSH_EVENT("SendPacket",packet); + PUSH_EVENT("SendPacket", packet); } @@ -43,15 +43,26 @@ void GameState::Update(float deltaTime) { direction.z = sin(glm::radians(playerYaw)) * cos(glm::radians(playerPitch)); RaycastResult raycast = world.Raycast(player->pos + player->EyeOffset, direction); - selectedBlock = raycast.isHit ? raycast.hitBlock : Vector(0,0,0); - distanceToSelectedBlock = raycast.isHit ? (player->pos - raycast.hitPos).GetLength() : 0.0f; + if (raycast.isHit != isBlockSelected || ((raycast.isHit == true && isBlockSelected == true) && + selectedBlock != raycast.hitBlock)) { + PUSH_EVENT("SelectedBlockChanged", 0); + } + + if (raycast.isHit) { + selectedBlock = raycast.hitBlock; + distanceToSelectedBlock = (player->pos - raycast.hitPos).GetLength(); + } else { + selectedBlock = Vector(0, 0, 0); + distanceToSelectedBlock = 0.0f; + } + + isBlockSelected = raycast.isHit; raycastHit = raycast.hitPos; } } -void GameState::UpdatePacket(std::shared_ptr ptr) -{ - switch ((PacketNamePlayCB)ptr->GetPacketId()) { +void GameState::UpdatePacket(std::shared_ptr ptr) { + switch ((PacketNamePlayCB) ptr->GetPacketId()) { case SpawnObject: { auto packet = std::static_pointer_cast(ptr); Entity entity = CreateObject(static_cast(packet->Type)); @@ -300,7 +311,7 @@ void GameState::UpdatePacket(std::shared_ptr ptr) player->pitch += packet->Pitch; } else { player->pitch = packet->Pitch; - }; + } if ((packet->Flags & 0x08) != 0) { player->yaw += packet->Yaw; @@ -543,13 +554,31 @@ glm::mat4 GameState::GetViewMatrix() { return glm::lookAt(eyePos, eyePos + front, up); } +// TODO: it should actually be something like this: +// function start_digging(): +// send_packet(packet_type=start_digging_packet) +// delay(time=selected_block_dig_time, action=finish_digging) void GameState::StartDigging() { auto packetStart = std::make_shared(0,selectedBlock,1); - auto packetStop = std::make_shared(2,selectedBlock,1); auto packet = std::static_pointer_cast(packetStart); PUSH_EVENT("SendPacket",packet); - packet = std::static_pointer_cast(packetStop); + + FinishDigging(); +} + +void GameState::FinishDigging() { + auto packetFinish = std::make_shared(2,selectedBlock,1); + auto packet = std::static_pointer_cast(packetFinish); PUSH_EVENT("SendPacket",packet); } -void GameState::StopDigging() {} +// TODO: it should actually be something like this: +// function cancel_digging(): +// if finish_digging is in delayed_actions: +// send_packet(packet_type=start_digging_packet) +// remove_delayed_action(finish_digging) +void GameState::CancelDigging() { + auto packetCancel = std::make_shared(1,selectedBlock,1); + auto packet = std::static_pointer_cast(packetCancel); + PUSH_EVENT("SendPacket", packet); +} -- cgit v1.2.3 From 228423d91518d0b8bd1c4bf047f3d378567e00f9 Mon Sep 17 00:00:00 2001 From: Elisey Puzko Date: Thu, 22 Feb 2018 22:07:08 +0300 Subject: Bare-bones blocks placement --- src/GameState.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/GameState.cpp') diff --git a/src/GameState.cpp b/src/GameState.cpp index 3166f1a..b963ef0 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -582,3 +582,11 @@ void GameState::CancelDigging() { auto packet = std::static_pointer_cast(packetCancel); PUSH_EVENT("SendPacket", packet); } + +void GameState::PlaceBlock() { + auto packetPlace = std::make_shared( + selectedBlock, 1, 0, 0.0, 0.0, 0.0); + + auto packet = std::static_pointer_cast(packetPlace); + PUSH_EVENT("SendPacket", packet); +} \ No newline at end of file -- cgit v1.2.3 From 083eef7a50a223bd5993ca4715e6ada42bbca3a0 Mon Sep 17 00:00:00 2001 From: Elisey Puzko Date: Thu, 22 Feb 2018 22:27:43 +0300 Subject: Quick fix. A quick fix for a segfault caused by the block placement when there aren't any selected blocks. --- src/GameState.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/GameState.cpp') diff --git a/src/GameState.cpp b/src/GameState.cpp index b963ef0..743a750 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -7,11 +7,11 @@ #include "Packet.hpp" void GameState::Update(float deltaTime) { - if (g_IsGameStarted) { - std::chrono::steady_clock clock; - static auto timeOfPreviousSendedPacket(clock.now()); + if (g_IsGameStarted) { + std::chrono::steady_clock clock; + static auto timeOfPreviousSendedPacket(clock.now()); auto delta = clock.now() - timeOfPreviousSendedPacket; - using namespace std::chrono_literals; + using namespace std::chrono_literals; if (delta >= 50ms) { auto packetToSend = std::make_shared( player->pos.x, player->pos.y, player->pos.z, @@ -58,7 +58,7 @@ void GameState::Update(float deltaTime) { isBlockSelected = raycast.isHit; raycastHit = raycast.hitPos; - } + } } void GameState::UpdatePacket(std::shared_ptr ptr) { @@ -559,6 +559,9 @@ glm::mat4 GameState::GetViewMatrix() { // send_packet(packet_type=start_digging_packet) // delay(time=selected_block_dig_time, action=finish_digging) void GameState::StartDigging() { + if (!isBlockSelected) + return; + auto packetStart = std::make_shared(0,selectedBlock,1); auto packet = std::static_pointer_cast(packetStart); PUSH_EVENT("SendPacket",packet); @@ -584,6 +587,9 @@ void GameState::CancelDigging() { } void GameState::PlaceBlock() { + if (!isBlockSelected) + return; + auto packetPlace = std::make_shared( selectedBlock, 1, 0, 0.0, 0.0, 0.0); -- cgit v1.2.3 From ab8278e3b61e009253e34d13d6706da7702dbb6c Mon Sep 17 00:00:00 2001 From: Elisey Puzko Date: Fri, 23 Feb 2018 11:51:09 +0300 Subject: Bare-bones face detection for a block placement --- src/GameState.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) (limited to 'src/GameState.cpp') diff --git a/src/GameState.cpp b/src/GameState.cpp index 743a750..7498e17 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -586,12 +586,54 @@ void GameState::CancelDigging() { PUSH_EVENT("SendPacket", packet); } +#include + +BlockFacing detectHitFace(VectorF raycastHit, Vector selectedBlock) { + auto vec = VectorF(selectedBlock.x + .5, selectedBlock.y + .5, selectedBlock.z +.5) - raycastHit; + + // TODO: move these vectors to Vector.hpp + static const auto vecUp = VectorF(0, 1, 0); + static const auto vecRight = VectorF(1, 0, 0); + static const auto vecForward = VectorF(0, 0, -1); + + auto up = (vec.dot(vecUp))/(vec.GetLength()*vecUp.GetLength()); + auto down = -up; + auto right = (vec.dot(vecRight))/(vec.GetLength()*vecRight.GetLength()); + auto left = -right; + auto forward = (vec.dot(vecForward))/(vec.GetLength()*vecForward.GetLength()); + auto backward = -forward; + + // TODO: create a min/max function for the variable number of arguments + auto min = std::min( + std::min( + std::min( + std::min( + std::min(up, down), + right), + left), + forward), + backward); + + if (min == down) + return BlockFacing::Bottom; + else if (min == up) + return BlockFacing::Top; + else if (min == forward) + return BlockFacing::North; + else if (min == backward) + return BlockFacing::South; + else if (min == left) + return BlockFacing::West; + else return BlockFacing::East; +} + void GameState::PlaceBlock() { if (!isBlockSelected) - return; + return; + BlockFacing face = detectHitFace(raycastHit, selectedBlock); auto packetPlace = std::make_shared( - selectedBlock, 1, 0, 0.0, 0.0, 0.0); + selectedBlock, (unsigned char) face, 0, 0, 0, 0); auto packet = std::static_pointer_cast(packetPlace); PUSH_EVENT("SendPacket", packet); -- cgit v1.2.3 From 70e34f36453fdb116eb580a32a6757a11163a812 Mon Sep 17 00:00:00 2001 From: Elisey Puzko Date: Fri, 23 Feb 2018 11:53:57 +0300 Subject: Removed redundant header --- src/GameState.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/GameState.cpp') diff --git a/src/GameState.cpp b/src/GameState.cpp index 7498e17..4128fd6 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -586,8 +586,6 @@ void GameState::CancelDigging() { PUSH_EVENT("SendPacket", packet); } -#include - BlockFacing detectHitFace(VectorF raycastHit, Vector selectedBlock) { auto vec = VectorF(selectedBlock.x + .5, selectedBlock.y + .5, selectedBlock.z +.5) - raycastHit; -- cgit v1.2.3 From 0bfe80ec281f856e99d158647436f3470b3013c7 Mon Sep 17 00:00:00 2001 From: Elisey Puzko Date: Fri, 23 Feb 2018 13:11:49 +0300 Subject: I forgot about these functions --- src/GameState.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/GameState.cpp') diff --git a/src/GameState.cpp b/src/GameState.cpp index 4128fd6..9478085 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -594,11 +594,11 @@ BlockFacing detectHitFace(VectorF raycastHit, Vector selectedBlock) { static const auto vecRight = VectorF(1, 0, 0); static const auto vecForward = VectorF(0, 0, -1); - auto up = (vec.dot(vecUp))/(vec.GetLength()*vecUp.GetLength()); + auto up = vec.cosBetween(vecUp); auto down = -up; - auto right = (vec.dot(vecRight))/(vec.GetLength()*vecRight.GetLength()); + auto right = vec.cosBetween(vecRight); auto left = -right; - auto forward = (vec.dot(vecForward))/(vec.GetLength()*vecForward.GetLength()); + auto forward = vec.cosBetween(vecForward); auto backward = -forward; // TODO: create a min/max function for the variable number of arguments -- cgit v1.2.3 From df7024b9e1bac4b8b27b74b77a948d4f3d1d3253 Mon Sep 17 00:00:00 2001 From: Elisey Puzko Date: Sun, 25 Feb 2018 13:33:12 +0300 Subject: Some nice hack to avoid conflict of std::min and min macro --- src/GameState.cpp | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) (limited to 'src/GameState.cpp') diff --git a/src/GameState.cpp b/src/GameState.cpp index 9478085..192a0c5 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -594,33 +594,37 @@ BlockFacing detectHitFace(VectorF raycastHit, Vector selectedBlock) { static const auto vecRight = VectorF(1, 0, 0); static const auto vecForward = VectorF(0, 0, -1); - auto up = vec.cosBetween(vecUp); - auto down = -up; - auto right = vec.cosBetween(vecRight); - auto left = -right; - auto forward = vec.cosBetween(vecForward); - auto backward = -forward; + double up = vec.cosBetween(vecUp); + double down = -up; + double right = vec.cosBetween(vecRight); + double left = -right; + double forward = vec.cosBetween(vecForward); + double backward = -forward; // TODO: create a min/max function for the variable number of arguments - auto min = std::min( - std::min( - std::min( - std::min( - std::min(up, down), + // NOTE: function names are surrounded by parentheses to avoid conflict of + // `std::min` and a `min` macro from `windows.h`. If there will be more uses + // of `std::min`, a macro `NOMINMAX` should be defined because these hacks can + // have the real impact on the performance. + double min_cos = (std::min)( + (std::min)( + (std::min)( + (std::min)( + (std::min)(up, down), right), left), forward), backward); - if (min == down) + if (min_cos == down) return BlockFacing::Bottom; - else if (min == up) + else if (min_cos == up) return BlockFacing::Top; - else if (min == forward) + else if (min_cos == forward) return BlockFacing::North; - else if (min == backward) + else if (min_cos == backward) return BlockFacing::South; - else if (min == left) + else if (min_cos == left) return BlockFacing::West; else return BlockFacing::East; } -- cgit v1.2.3 From 78221efae3c038e2c21cb553891d9de8c37cf809 Mon Sep 17 00:00:00 2001 From: Elisey Puzko Date: Sun, 25 Feb 2018 14:49:36 +0300 Subject: min/max functions --- src/GameState.cpp | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) (limited to 'src/GameState.cpp') diff --git a/src/GameState.cpp b/src/GameState.cpp index 192a0c5..6c2ad42 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -594,28 +594,14 @@ BlockFacing detectHitFace(VectorF raycastHit, Vector selectedBlock) { static const auto vecRight = VectorF(1, 0, 0); static const auto vecForward = VectorF(0, 0, -1); - double up = vec.cosBetween(vecUp); - double down = -up; - double right = vec.cosBetween(vecRight); - double left = -right; - double forward = vec.cosBetween(vecForward); - double backward = -forward; - - // TODO: create a min/max function for the variable number of arguments - // NOTE: function names are surrounded by parentheses to avoid conflict of - // `std::min` and a `min` macro from `windows.h`. If there will be more uses - // of `std::min`, a macro `NOMINMAX` should be defined because these hacks can - // have the real impact on the performance. - double min_cos = (std::min)( - (std::min)( - (std::min)( - (std::min)( - (std::min)(up, down), - right), - left), - forward), - backward); - + const double up = vec.cosBetween(vecUp); + const double down = -up; + const double right = vec.cosBetween(vecRight); + const double left = -right; + const double forward = vec.cosBetween(vecForward); + const double backward = -forward; + + const double min_cos = _min(up, down, right, left, forward, backward); if (min_cos == down) return BlockFacing::Bottom; else if (min_cos == up) -- cgit v1.2.3