only shifting depth when placing submarine frame over water

This commit is contained in:
devZoGok
2025-02-09 16:24:55 +02:00
parent 728f4b6d4a
commit 022c159f76
3 changed files with 62 additions and 39 deletions
+40 -25
View File
@@ -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<RayCaster::CollisionResult> results = map->raycastTerrain(startPos, (endPos - startPos).norm(), true);
vector<RayCaster::CollisionResult> 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<RayCaster::CollisionResult> res = map->raycastTerrain(
Vector3(endPos.x, 100, endPos.z),
-Vector3::VEC_J,
false
);
vector<RayCaster::CollisionResult> res = map->raycastTerrain(
Vector3(placementPos.x, 100, placementPos.z),
-Vector3::VEC_J,
false
);
vector<Map::Cell> &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<Map::Cell> &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);