From 022c159f76815dd816e29e22cd9b385293665eb4 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 9 Feb 2025 16:24:55 +0200 Subject: [PATCH] only shifting depth when placing submarine frame over water --- activeGameState.cpp | 30 ++++++++-------- gameObjectFrameController.cpp | 65 +++++++++++++++++++++-------------- gameObjectFrameController.h | 6 ++++ 3 files changed, 62 insertions(+), 39 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index fffb9bc..7472049 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -171,20 +171,18 @@ namespace battleship{ } selectingDestOrient = true; - fc->setPlacingOnSurface(true); fc->setRotating(true); } else if(selectingDestOrient && !orderMouseClicked){ selectingDestOrient = false; - fc->setPlacingOnSurface(false); - fc->setRotating(false); + fc->toggleFrameTransformations(false, false, false); fc->removeGameObjectFrames(); } renderUnits(); - if(fc->isPlacingOnSurface()) + if(fc->isRotating() || fc->isPlacingOnSurface() || fc->isPlacingVertically()) fc->update(); CameraController *camCtr = CameraController::getSingleton(); @@ -221,8 +219,7 @@ namespace battleship{ mainPlayer->deselectUnits(); GameObjectFrameController *ufCtr = GameObjectFrameController::getSingleton(); ufCtr->removeGameObjectFrames(); - ufCtr->setPlacingOnSurface(false); - ufCtr->setRotating(false); + ufCtr->toggleFrameTransformations(false, false, false); unitGuiScreen = ""; ConcreteGuiManager::getSingleton()->readLuaScreenScript("activeGameState.lua"); @@ -428,7 +425,15 @@ namespace battleship{ //TODO fix ejectable unit selection with multiple transports selected void ActiveGameState::issueOrder(Order::TYPE type, vector targets, bool addOrder) { - Vector3 destDir = (selectingDestOrient ? GameObjectFrameController::getSingleton()->getGameObjectFrame(0).getDirVec() : Vector3::VEC_ZERO); + depth = 1; + Vector3 destDir = Vector3::VEC_ZERO; + + if(selectingDestOrient){ + GameObjectFrame &objFrame = GameObjectFrameController::getSingleton()->getGameObjectFrame(0); + destDir = objFrame.getDirVec(); + targets[0].pos = objFrame.getPos(); + } + mainPlayer->issueOrder(type, destDir, targets, addOrder); this->targets.clear(); } @@ -492,8 +497,7 @@ namespace battleship{ quad->setSize(Vector3::VEC_ZERO); quad->updateVerts(quad->getMeshBase()); - ufCtr->setPlacingOnSurface(false); - ufCtr->setRotating(false); + ufCtr->toggleFrameTransformations(false, false, false); ufCtr->removeGameObjectFrames(); } @@ -563,7 +567,6 @@ namespace battleship{ issueOrder(Order::TYPE::MOVE, targets, shiftPressed); } } - } break; @@ -596,8 +599,7 @@ namespace battleship{ break; } case Bind::SHIFT_SUB_DEPTH: - ufCtr->setPlacingVertically(isPressed); - ufCtr->setRotating(false); + ufCtr->toggleFrameTransformations(false, false, isPressed); break; case Bind::ZOOM_IN: if (zooms > -NUM_MAX_ZOOMS) { @@ -674,9 +676,9 @@ namespace battleship{ break; case Bind::DESELECT_STRUCTURE: - ufCtr->removeGameObjectFrames(); - ufCtr->setPlacingOnSurface(false); buildableStructSelected = false; + ufCtr->toggleFrameTransformations(false, false, false); + ufCtr->removeGameObjectFrames(); break; } } diff --git a/gameObjectFrameController.cpp b/gameObjectFrameController.cpp index 3a077e7..d3f2b16 100644 --- a/gameObjectFrameController.cpp +++ b/gameObjectFrameController.cpp @@ -83,6 +83,7 @@ namespace battleship{ //TODO implement terrain evenness check //TODO factor out literal values + //TODO fix which unit frames light green or red void GameObjectFrameController::placeGameObjectFrame(int id, Vector3 newPos, float width, float length){ Map *map = Map::getSingleton(); MeshData meshData = map->getNodeParent()->getChild(0)->getMesh(0)->getMeshBase(); @@ -90,6 +91,7 @@ namespace battleship{ int numVerts = 3 * meshData.numTris; float maxUnevenness = .5, unevenness = 0; + bool placeable = true; for(int i = 0; i < numVerts; i++){ float diffX = fabs(newPos.x - verts[i].pos->x); @@ -99,30 +101,41 @@ namespace battleship{ if(diffX < 0.5 * width && diffZ < 0.5 * length && diffY > unevenness){ unevenness = diffY; - if(unevenness > maxUnevenness) + if(unevenness > maxUnevenness){ + placeable = false; break; + } } } GameObjectFrame &s = gameObjectFrames[id]; s.placeAt(newPos); - s.status = (unevenness < maxUnevenness ? GameObjectFrame::PLACEABLE : GameObjectFrame::NOT_PLACEABLE); snapToObj(s, GameObject::Type::UNIT, 20, 3); + 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(); - Vector4 color = (s.status == GameObjectFrame::NOT_PLACEABLE ? Vector4(1, 0, 0, 1) : Vector4(0, 1, 0, 1)); mat->setVec4Uniform("diffuseColor", color); } - void GameObjectFrameController::update(){ + void GameObjectFrameController::updatePlacement(){ for(GameObjectFrame &frame : gameObjectFrames) frame.update(); Map *map = Map::getSingleton(); Vector3 startPos = Root::getSingleton()->getCamera()->getPosition(); Vector3 endPos = screenToSpace(getCursorPos()); - vector results = map->raycastTerrain(startPos, (endPos - startPos).norm(), true); + vector results = map->raycastTerrain(startPos, (screenToSpace(getCursorPos()) - startPos).norm(), true); if(results.empty()) return; @@ -146,27 +159,27 @@ namespace battleship{ Vector3 wPos = nodeParent->getChild(i)->getPosition(); Vector3 wSize = ((Quad*)nodeParent->getChild(i)->getMesh(0))->getSize(); - if(fabs(wPos.x - endPos.x) < .5 * wSize.x && fabs(wPos.z - endPos.z) < .5 * wSize.y){ + if(fabs(wPos.x - placementPos.x) < .5 * wSize.x && fabs(wPos.z - placementPos.z) < .5 * wSize.y){ waterBodyPos = wPos; inWater = true; break; } } + + if(!inWater) return; - if(inWater){ - vector res = map->raycastTerrain( - Vector3(endPos.x, 100, endPos.z), - -Vector3::VEC_J, - false - ); + vector res = map->raycastTerrain( + Vector3(placementPos.x, 100, placementPos.z), + -Vector3::VEC_J, + false + ); - vector &cells = map->getCells(); - int cid = map->getCellId(placementPos, false); - int numSubmarineCells = cells[cid].underWaterCellIds.size(); - maxDepth = cells[cid].pos.y; - minDepth = (numSubmarineCells > 0 ? cells[cells[cid].underWaterCellIds[numSubmarineCells - 1]].pos.y : maxDepth) - .5 * cellSize.y; - minDepthCalculated = true; - } + vector &cells = map->getCells(); + int cid = map->getCellId(placementPos, false); + int numSubmarineCells = cells[cid].underWaterCellIds.size(); + maxDepth = cells[cid].pos.y; + minDepth = (numSubmarineCells > 0 ? cells[cells[cid].underWaterCellIds[numSubmarineCells - 1]].pos.y : maxDepth) - .5 * cellSize.y; + minDepthCalculated = true; } else{ ActiveGameState *activeState = (ActiveGameState*)(GameManager::getSingleton()->getStateManager()->getAppStateByType((int)AppStateType::ACTIVE_STATE)); @@ -174,12 +187,8 @@ namespace battleship{ placementPos.y = newDepth; } } - else{ - minDepthCalculated = false; - - if(placingOnSurface) - placementPos = results[0].pos; - } + else if(placingOnSurface) + placementPos = results[0].pos; for(int i = 0; i < gameObjectFrames.size(); i++){ if(paintSelecting){ @@ -193,6 +202,12 @@ namespace battleship{ } } + void GameObjectFrameController::update(){ + updatePlacement(); + + if(!placingVertically) minDepthCalculated = false; + } + void GameObjectFrameController::removeGameObjectFrame(int i){ gameObjectFrames[i].destroy(); gameObjectFrames.erase(gameObjectFrames.begin() + i); diff --git a/gameObjectFrameController.h b/gameObjectFrameController.h index d7e49d1..488c7df 100644 --- a/gameObjectFrameController.h +++ b/gameObjectFrameController.h @@ -34,10 +34,16 @@ namespace battleship{ inline bool isPlacingVertically(){return placingVertically;} inline void setPlacingVertically(bool v){this->placingVertically = v;} inline void setPaintSelectRowStart(vb01::Vector3 st){paintSelectRowStart = st;} + inline void toggleFrameTransformations(bool rot, bool pos, bool pv){ + setRotating(rot); + setPlacingOnSurface(pos); + setPlacingVertically(pv); + } private: GameObjectFrameController(){} void paintSelect(vb01::Vector3, float, float); void snapToObj(GameObjectFrame&, GameObject::Type, int, float); + void updatePlacement(); std::vector gameObjectFrames; vb01::Vector3 paintSelectRowStart, placementPos;