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