rodecomp/Source/Contents/World/WorldTerrainPicking.cpp
ragnarok-clanker 4a63a0b9b2 Decompile 10 functions in Source/Client/Mode/GameMode.cpp, Source/Client/Mode/CGameMode.h, ...
Batch #14326 by eAthena: 0 byte-identical, 10 confirmed by peer review.

- fn_21311 CGameMode::EnsureNameBalloon: logic confirmed by peer review
- fn_21329 CGameMode::ProcessGroundClick: logic confirmed by peer review
- fn_21330 CGameMode::ProcessInput: logic confirmed by peer review
- fn_21333 CGameMode::UpdateBalloons: logic confirmed by peer review
- fn_21346 CGameMode::SaveActiveSkillEffects: logic confirmed by peer review
- fn_21347 CGameMode::SaveNameCardState: logic confirmed by peer review
- fn_21348 CGameMode::SaveUnknown024C: logic confirmed by peer review
- fn_21349 CGameMode::SaveGroundItems: logic confirmed by peer review
- fn_21350 CGameMode::SaveActorStates: logic confirmed by peer review
- fn_21351 CGameMode::WriteReplaySkillState: logic confirmed by peer review

Peer-reviewed-by: Yommy, secret, codeplay
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
2026-11-07 07:16:29 +00:00

46 lines
1.4 KiB
C++

#include "Client/Mode/CGameMode.h"
#include "Contents/Camera/Camera.h"
#include "Contents/World/World.h"
#include "Contents/World/WorldRayQuery.h"
#include "Contents/World/WorldSpatialTree.h"
#include "Render/Renderer.h"
#include "UI/Buttons/UITextButton.h"
#include "Contents/World/WorldTerrainPicking.h"
#include "Resource/World/TerrainResource.h"
// OFFSET: 0x00CD4060
// FUNCTION: fn_21274
bool CGameMode::PickScreenTerrain(int& column, int& row) {
WorldRayQuery query;
float ray[6]{};
g_renderer->viewport.Ray(g_screenWidth, g_screenHeight, this->camera->frame.eye, this->camera->frame.inverse.values, ray);
query.Collect(ray, &this->scene->spatial);
float nearest = 999999.0f;
float result = nearest;
for (WorldSpatialTree* node : query.nodes) {
C3dAttr* terrain = node->terrain;
int candidateRow = node->terrainCells[1];
while (candidateRow <= node->terrainCells[3]) {
int candidateColumn = node->terrainCells[0];
while (candidateColumn <= node->terrainCells[2]) {
const float distance = terrain->RayDistance(ray, candidateColumn, candidateRow);
if (nearest > distance) {
nearest = distance;
column = candidateColumn;
row = candidateRow;
}
result = nearest;
candidateColumn = candidateColumn + 1;
}
candidateRow = candidateRow + 1;
}
}
return result < 999999.0f;
}