From 786d0c706da3e6978afe38f9671ff01456981564 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Wed, 26 Nov 2025 15:36:39 +0200 Subject: [PATCH] fixed game object frame snapping --- activeGameState.cpp | 2 +- gameObjectFrameController.cpp | 65 +++++++++++++++-------------------- gameObjectFrameController.h | 3 +- 3 files changed, 29 insertions(+), 41 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index 9c6d3c1..ecede1c 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -312,7 +312,7 @@ namespace battleship{ if(!buildableStructSelected) for(int i = 0; i < selectedUnits.size(); i++) - fc->addGameObjectFrame(GameObjectFrame(selectedUnits[i]->getId(), GameObject::Type::UNIT, targets[0].pos)); + fc->addGameObjectFrame(GameObjectFrame(selectedUnits[i]->getId(), GameObject::Type::UNIT, selectedUnits[i], targets[0].pos)); selectingDestOrient = true; fc->setRotating(true); diff --git a/gameObjectFrameController.cpp b/gameObjectFrameController.cpp index c0230f9..0311bfa 100644 --- a/gameObjectFrameController.cpp +++ b/gameObjectFrameController.cpp @@ -57,20 +57,17 @@ namespace battleship{ } } - //TODO specify what to snap the frame to - void GameObjectFrameController::snapToObj(GameObjectFrame &s, GameObject::Type type, int unitId, float maxDist){ - if(s.getType() == GameObject::Type::UNIT && s.getId() == unitId){ - s.status = GameObjectFrame::NOT_PLACEABLE; - Player *civPl = Game::getSingleton()->getCivilianPlayer(); + void GameObjectFrameController::snapToObj(GameObjectFrame &s, vector snapTargets, float maxDist){ + s.status = GameObjectFrame::NOT_PLACEABLE; - for(ResourceDeposit *dep : civPl->getResourceDeposits()){ - Vector3 depPos = dep->getPos(); + for(GameObject *st : snapTargets){ + Vector3 stPos = st->getPos(); - if(!dep->getExtractor() && s.getPos().getDistanceFrom(depPos) < maxDist){ - s.status = GameObjectFrame::PLACEABLE; - s.placeAt(depPos); - break; - } + if(s.getPos().getDistanceFrom(stPos) < maxDist){ + s.status = GameObjectFrame::PLACEABLE; + s.placeAt(stPos); + checkPlacement(s); + break; } } } @@ -82,7 +79,7 @@ namespace battleship{ MeshData::Vertex *verts = meshData.vertices; int numVerts = 3 * meshData.numTris; - bool placeable = true; + s.status = GameObjectFrame::PLACEABLE; if(s.getMaxUnevenness() > 0) for(int i = 0; i < numVerts; i++){ @@ -91,7 +88,7 @@ namespace battleship{ float diffZ = fabs(s.getPos().z - verts[i].pos->z); if(diffX < 0.5 * s.getWidth() && diffZ < 0.5 * s.getLength() && diffY > s.getMaxUnevenness()){ - placeable = false; + s.status = GameObjectFrame::NOT_PLACEABLE; break; } } @@ -133,24 +130,10 @@ namespace battleship{ ); if(intersects){ - placeable = false; + s.status = GameObjectFrame::NOT_PLACEABLE; break; } } - - Vector4 color; - - if(placeable){ - s.status = GameObjectFrame::PLACEABLE; - color = Vector4(0, 1, 0, 1); - } - else{ - s.status = GameObjectFrame::NOT_PLACEABLE; - color = Vector4(1, 0, 0, 1); - } - - Material *mat = s.getModel()->getMaterial(); - mat->setVec4Uniform("diffuseColor", color); } void GameObjectFrameController::shiftVerticalPlacement(){ @@ -193,10 +176,7 @@ namespace battleship{ } } - void GameObjectFrameController::updatePlacement(){ - for(GameObjectFrame &frame : gameObjectFrames) - frame.update(); - + void GameObjectFrameController::update(){ Map *map = Map::getSingleton(); Vector3 startPos = Root::getSingleton()->getCamera()->getPosition(); Vector3 endPos = screenToSpace(getCursorPos()); @@ -209,7 +189,13 @@ namespace battleship{ if(placingVertically) shiftVerticalPlacement(); else if(placingOnSurface) placementPos = results[0].pos; + vector deposits; + for(ResourceDeposit *rd : Game::getSingleton()->getCivilianPlayer()->getResourceDeposits()) + deposits.push_back((GameObject*)rd); + for(int i = 0; i < gameObjectFrames.size(); i++){ + gameObjectFrames[i].update(); + if(paintSelecting){ float width = gameObjectFrames[0].getWidth(); float length = gameObjectFrames[0].getLength(); @@ -221,12 +207,15 @@ namespace battleship{ if(!rotating && (placingOnSurface || placingVertically)) gameObjectFrames[i].placeAt(placementPos); - checkPlacement(gameObjectFrames[i]); - } - } + if(gameObjectFrames[i].getId() == 23) + snapToObj(gameObjectFrames[i], deposits, 20); + else + checkPlacement(gameObjectFrames[i]); - void GameObjectFrameController::update(){ - updatePlacement(); + bool placeable = (gameObjectFrames[i].status == GameObjectFrame::PLACEABLE); + Vector4 color = (placeable ? Vector4(0, 1, 0, 1) : Vector4(1, 0, 0, 1)); + gameObjectFrames[i].getModel()->getMaterial()->setVec4Uniform("diffuseColor", color); + } if(!placingVertically) minDepthCalculated = false; } diff --git a/gameObjectFrameController.h b/gameObjectFrameController.h index 357cd9e..2726e9e 100644 --- a/gameObjectFrameController.h +++ b/gameObjectFrameController.h @@ -42,9 +42,8 @@ namespace battleship{ private: GameObjectFrameController(){} void paintSelect(vb01::Vector3); - void snapToObj(GameObjectFrame&, GameObject::Type, int, float); + void snapToObj(GameObjectFrame&, std::vector, float); void shiftVerticalPlacement(); - void updatePlacement(); std::vector gameObjectFrames; vb01::Vector3 paintSelectRowStart, placementPos;