From 4ba11bb2767762e7daca641a76fd2cac91caf5d6 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sat, 23 Sep 2023 15:50:20 +0300 Subject: [PATCH] paintselecting buildable structures while rotating --- activeGameState.cpp | 46 ++++++----------------------------------- activeGameState.h | 3 +-- unitFrameController.cpp | 19 +++++++++++++---- unitFrameController.h | 3 ++- 4 files changed, 24 insertions(+), 47 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index 64e4385..723731a 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -107,44 +107,10 @@ namespace battleship{ UnitFrameController *ufCtr = UnitFrameController::getSingleton(); - if(ufCtr->isPlacingFrames()){ + if(ufCtr->isPlacingFrames()) ufCtr->update(); - } } - void ActiveGameState::paintSelectUnitFrames(){ - UnitFrameController *ufCtr = UnitFrameController::getSingleton(); - Vector3 rowStartPos = ufCtr->getUnitFrame(0).model->getPosition(); - - Camera *cam = Root::getSingleton()->getCamera(); - Vector3 camPos = cam->getPosition(), rayDir = (screenToSpace(getCursorPos()) - camPos).norm(); - Node *node = Map::getSingleton()->getNodeParent()->getChild(0); - vector results; - Ray::retrieveCollisions(camPos, rayDir, node, results); - - if(results.empty()) return; - - Vector3 rowDir = results[0].pos - rowStartPos; - float lenRow = rowDir.getLength(); - - sol::state_view SOL_LUA_STATE = generateView(); - sol::table cornerTable = SOL_LUA_STATE[buildableStructId]; - float width = (float)cornerTable[0]["x"] - (float)cornerTable[1]["x"]; - float length = (float)cornerTable[3]["z"] - (float)cornerTable[0]["z"]; - float hypothenuse = sqrt(width * width + length * length); - - int numStructsInRow = int(lenRow / hypothenuse); - - if(numStructsInRow != ufCtr->getNumUnitFrames()){ - ufCtr->removeUnitFrames(); - - for(int i = 0; i < numStructsInRow; i++){ - string modelPath = (string)SOL_LUA_STATE["basePath"][buildableStructId + 1] + (string)SOL_LUA_STATE["meshPath"][buildableStructId + 1]; - ufCtr->addUnitFrame(UnitFrameController::UnitFrame(modelPath, buildableStructId, (int)UnitType::LAND)); - } - } - } - void ActiveGameState::deselectUnits(){ mainPlayer->deselectUnits(); UnitFrameController *ufCtr = UnitFrameController::getSingleton(); @@ -309,7 +275,8 @@ namespace battleship{ UnitFrameController *ufCtr = UnitFrameController::getSingleton(); if(ufCtr->isPlacingFrames()){ - unit = new Structure(mainPlayer, ufCtr->getUnitFrame(0).id, results[0].pos, ufCtr->getUnitFrame(0).model->getOrientation()); + Model *model = ufCtr->getUnitFrame(0).model; + unit = new Structure(mainPlayer, ufCtr->getUnitFrame(0).id, model->getPosition(), model->getOrientation()); mainPlayer->addUnit(unit); } @@ -375,6 +342,7 @@ namespace battleship{ else if(ufCtr->isPlacingFrames()){ type = Order::TYPE::BUILD; ufCtr->setPlacingFrames(false); + ufCtr->setRotatingFrames(false); ufCtr->removeUnitFrames(); } @@ -426,12 +394,10 @@ namespace battleship{ if(isPressed){ depth += 0.05; - Camera *cam = Root::getSingleton()->getCamera(); - Vector3 startPos = cam->getPosition(); - Vector3 endPos = screenToSpace(getCursorPos()); + Vector3 startPos = Root::getSingleton()->getCamera()->getPosition(); vector results; - Ray::retrieveCollisions(startPos, (endPos - startPos).norm(), Map::getSingleton()->getNodeParent()->getChild(0), results); + Ray::retrieveCollisions(startPos, (screenToSpace(getCursorPos()) - startPos).norm(), Map::getSingleton()->getNodeParent()->getChild(0), results); Ray::sortResults(results); if(!results.empty()) diff --git a/activeGameState.h b/activeGameState.h index 5881802..a6a804c 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -33,7 +33,6 @@ namespace battleship{ void issueOrder(Order::TYPE, bool); bool isInLineOfSight(vb01::Vector3, float, Unit*); bool engineersSelected(); - void paintSelectUnitFrames(); GuiAppState *guiState; Player *mainPlayer; @@ -45,7 +44,7 @@ namespace battleship{ std::vector unitGroups[9]; std::vector targets; bool isSelectionBox = false, shiftPressed = false, controlPressed = false, selectingPatrolPoints = false, selectingGuidedMissileTarget = false; - int playerId, zooms = 0, buildableStructId; + int playerId, zooms = 0; const int NUM_MAX_ZOOMS = 10; float depth = 1; }; diff --git a/unitFrameController.cpp b/unitFrameController.cpp index 98f83c2..060c3c8 100644 --- a/unitFrameController.cpp +++ b/unitFrameController.cpp @@ -21,7 +21,7 @@ namespace battleship{ static UnitFrameController *unitFrameController = nullptr; - UnitFrameController::UnitFrame::UnitFrame(string modelPath, int i, int t) : id(i), type(t) { + UnitFrameController::UnitFrame::UnitFrame(string modelPath, int i, int t, Vector3 pos, Quaternion rot) : id(i), type(t) { Root *root = Root::getSingleton(); Material *mat = new Material(root->getLibPath() + "texture"); mat->addBoolUniform("texturingEnabled", false); @@ -31,6 +31,8 @@ namespace battleship{ model = new Model(modelPath); model->setWireframe(true); model->setMaterial(mat); + model->setPosition(pos); + model->setOrientation(rot); root->getRootNode()->attachChild(model); } @@ -42,7 +44,8 @@ namespace battleship{ } void UnitFrameController::paintSelect(Vector3 rowEnd, float width, float length){ - float lenRow = (rowEnd - paintSelectRowStart).getLength(); + Vector3 rowDir = rowEnd - paintSelectRowStart; + float lenRow = rowDir.getLength(); float hypothenuse = sqrt(width * width + length * length); int numStructsInRow = int(lenRow / hypothenuse); @@ -53,14 +56,22 @@ namespace battleship{ int structureId = unitFrames[0].id; sol::state_view SOL_LUA_STATE = generateView(); string modelPath = (string)SOL_LUA_STATE["basePath"][structureId + 1] + (string)SOL_LUA_STATE["meshPath"][structureId + 1]; - addUnitFrame(UnitFrame(modelPath, structureId, (int)UnitType::LAND)); + Vector3 buildDir = rowDir; + + if(unitFrames.size() > 1) + buildDir = unitFrames[1].model->getPosition() - unitFrames[0].model->getPosition(); + + Vector3 pos = paintSelectRowStart + buildDir.norm() * hypothenuse * unitFrames.size(); + addUnitFrame(UnitFrame(modelPath, structureId, (int)UnitType::LAND, pos)); } } //TODO implement terrain evenness check void UnitFrameController::placeUnitFrame(int id, Vector3 newPos, float width, float length){ UnitFrame &s = unitFrames[id]; - s.model->setPosition(newPos); + + if(!rotatingStructure) + s.model->setPosition(newPos); Map *map = Map::getSingleton(); MeshData meshData = map->getNodeParent()->getChild(0)->getMesh(0)->getMeshBase(); diff --git a/unitFrameController.h b/unitFrameController.h index 0e45786..1c889b9 100644 --- a/unitFrameController.h +++ b/unitFrameController.h @@ -5,6 +5,7 @@ #include #include +#include namespace vb01{ class Model; @@ -16,7 +17,7 @@ namespace battleship{ struct UnitFrame{ enum Status{PLACEABLE, NOT_PLACEABLE, PLACED}; - UnitFrame(std::string, int, int); + UnitFrame(std::string, int, int, vb01::Vector3 = vb01::Vector3::VEC_ZERO, vb01::Quaternion = vb01::Quaternion::QUAT_W); ~UnitFrame(){} void update();