Calculating height doesn't have anything to do with rotation (As far as I understand) maybe I am forgetting something. I am a bit tired so i might change my comment on the weekend. Here's what I found after reading the code.
POE Game Code that calculate Height from Grid Position X, Y
Code:
int FUN_140ba8350(longlong TerrainDataStartPtr,int *GridPos)
{
int iVar1;
longlong SPECIFIC_TGT_DATA_START;
int GridPosX;
int GridPosY;
GridPosX = *GridPos;
if ((((-1 < GridPosX) && (GridPosY = GridPos[1], -1 < GridPosY)) &&
(SBORROW4(GridPosX,*(int *)(TerrainDataStartPtr + 0x18) * 0x17) !=
GridPosX + *(int *)(TerrainDataStartPtr + 0x18) * -0x17 < 0)) &&
(SBORROW4(GridPosY,*(int *)(TerrainDataStartPtr + 0x20) * 0x17) !=
GridPosY + *(int *)(TerrainDataStartPtr + 0x20) * -0x17 < 0)) {
SPECIFIC_TGT_DATA_START =
((ulonglong)(uint)(GridPosY / 0x17) * *(longlong *)(TerrainDataStartPtr + 0x18) +
(ulonglong)(uint)(GridPosX / 0x17)) * 0x38 + *(longlong *)(TerrainDataStartPtr + 0x28);
if (*(longlong *)(SPECIFIC_TGT_DATA_START + 8) != 0) {
GridPosX = GridPosX % 0x17;
GridPosY = GridPosY % 0x17;
iVar1 = FUN_140c438a0(*(longlong *)(SPECIFIC_TGT_DATA_START + 8),&GridPosX,
*(byte *)(SPECIFIC_TGT_DATA_START + 0x30) & 7);
return iVar1 + ((int)*(short *)(SPECIFIC_TGT_DATA_START + 0x30) >> 3) *
*(int *)(TerrainDataStartPtr + 0x80);
}
}
return 0;
}
my translation of that code with variable names that human understand.
Code:
TOTAL_COLUMNS_IN_A_ROW = READ(TerrainDataStartPtr + 0x18)
TOTAL_ROWS = READ(TerrainDataStartPtr + 0x18 + 0x04)
INT_PTR TGT_DATA_LIST_START = READ(TerrainDataStartPtr + 0x28);
int CURRENT_MAP_HEIGHT_MULTIPLIER = READ(TerrainDataStartPtr + 0x80)
float CURR_TGT_DATA_ROW = (uint)(GridPosY / 23)
float CURR_TGT_DATA_COL = (uint)(GridPosX / 23)
uint index = (CURR_TGT_DATA_ROW * TOTAL_COLUMNS_IN_A_ROW) + CURR_TGT_DATA_COL
bytes_to_skip = index * 0x38
SPECIFIC_TGT_DATA_START = bytes_to_skip + TGT_DATA_LIST_START;
SPECIFIC_TGT_DATA_2nd_PTR = SPECIFIC_TGT_DATA_START + 0x08;
if (SPECIFIC_TGT_DATA_2nd_PTR == 0x00)
{
return 0;
}
else
{
int GridPosX_Remaining = GridPosX % 23
int GridPosY_Remaining = GridPosY % 23
height_of_that_specific_part_of_x23_x23_tile = FUN_140c438a0(some args.....)
height_of_THAT_SPECIFIC_TGT_DATA = READ(SPECIFIC_TGT_DATA_START + 0x30) >> 3
return height_of_that_specific_part_of_x23_x23_tile + (height_of_THAT_SPECIFIC_TGT_DATA * CURRENT_MAP_HEIGHT_MULTIPLIER)
}
NOTE: FUN_140c438a0 is still not translated yet ( by me ). It's WIP.
NOTE 2: What you are doing, I think that happens in FUN_140c438a0. (i might be wrong since it's not translated yet.
NOTE 2: in my translation I ignored the first whole if condition (as shown below), basically i assumed it's always gonna be true unless data is corrupted. This assumption can be wrong, I will fix this assumption once I am done with FUN_140c438a0 function.
Code:
if ((((-1 < GridPosX) && (GridPosY = GridPos[1], -1 < GridPosY)) &&
(SBORROW4(GridPosX,*(int *)(TerrainDataStartPtr + 0x18) * 0x17) !=
GridPosX + *(int *)(TerrainDataStartPtr + 0x18) * -0x17 < 0)) &&
(SBORROW4(GridPosY,*(int *)(TerrainDataStartPtr + 0x20) * 0x17) !=
GridPosY + *(int *)(TerrainDataStartPtr + 0x20) * -0x17 < 0))