Skip to content

Commit 999cd7f

Browse files
fix: terrain low res interpolation
1 parent aefa3eb commit 999cd7f

File tree

1 file changed

+18
-17
lines changed

1 file changed

+18
-17
lines changed

extensions/pl_terrain_ext.c

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1404,47 +1404,48 @@ pl_finalize_terrain(plCommandBuffer* ptCmdBuffer)
14041404
uint32_t uDstRowStart = (uint32_t)((ptTile->tWorldPos.y - gptTerrainCtx->tMinWorldPosition.y) / gptTerrainCtx->fLowResMetersPerTexel);
14051405
uint32_t uDstColStart = (uint32_t)((ptTile->tWorldPos.x - gptTerrainCtx->tMinWorldPosition.x) / gptTerrainCtx->fLowResMetersPerTexel);
14061406

1407-
uint32_t uDstRowCount = (uint32_t)gptTerrainCtx->uTileSize + uDstRowStart;
1408-
uint32_t uDstColCount = (uint32_t)gptTerrainCtx->uTileSize + uDstColStart;
1407+
int iDstHorizontalPixels = (int)(gptTerrainCtx->uHeightMapResolution / gptTerrainCtx->uHorizontalTiles);
1408+
int iDstVerticalPixels = (int)(gptTerrainCtx->uHeightMapResolution / gptTerrainCtx->uVerticalTiles);
14091409

1410-
int iHorizontalPixels = (int)(gptTerrainCtx->fLowResMetersPerTexel / gptTerrainCtx->fMetersPerTexel);
1411-
int iVerticalPixels = (int)(gptTerrainCtx->fLowResMetersPerTexel / gptTerrainCtx->fMetersPerTexel);
1412-
float fUvxInc = (float)iHorizontalPixels / (float)gptTerrainCtx->uTileSize;
1413-
float fUvyInc = (float)iVerticalPixels / (float)gptTerrainCtx->uTileSize;
1410+
uint32_t uDstRowCount = (uint32_t)iDstVerticalPixels + uDstRowStart;
1411+
uint32_t uDstColCount = (uint32_t)iDstHorizontalPixels + uDstColStart;
1412+
1413+
float fUvxInc = 1.0f / (float)gptTerrainCtx->uTileSize;
1414+
float fUvyInc = 1.0f / (float)gptTerrainCtx->uTileSize;
14141415
for(uint32_t uDstRow = uDstRowStart; uDstRow < uDstRowCount; uDstRow++)
14151416
{
1416-
float fUvy = (float)(uDstRow - uDstRowStart) / (float)gptTerrainCtx->uTileSize;
1417+
float fUvy = (0.5f / (float)(iDstVerticalPixels)) + (float)(uDstRow - uDstRowStart) / (float)iDstVerticalPixels;
14171418
for(uint32_t uDstCol = uDstColStart; uDstCol < uDstColCount; uDstCol++)
14181419
{
14191420

1420-
float fUvx = (float)(uDstCol - uDstColStart) / (float)gptTerrainCtx->uTileSize;
1421+
float fUvx = (0.5f / (float)(iDstHorizontalPixels)) + (float)(uDstCol - uDstColStart) / (float)iDstHorizontalPixels;
14211422

14221423
uint32_t uResult = 0;
14231424
uint32_t uSumCount = 0;
1424-
for(int x = 0; x < iHorizontalPixels; x++)
1425+
for(int x = 0; x < 4; x++)
14251426
{
1426-
for(int y = 0; y < iVerticalPixels; y++)
1427+
for(int y = 0; y < 4; y++)
14271428
{
1428-
float fUvxTap = fUvx + x * fUvxInc - fUvxInc * (iHorizontalPixels - 1);
1429-
float fUvyTap = fUvy + y * fUvyInc - fUvyInc * (iVerticalPixels - 1);
1429+
float fUvxTap = fUvx + x * fUvxInc - fUvxInc * (4 - 1);
1430+
float fUvyTap = fUvy + y * fUvyInc - fUvyInc * (4 - 1);
14301431

14311432

1432-
if(fUvxTap < 0.0f || fUvxTap > 1.0f || fUvyTap < 0.0f || fUvyTap > 1.0f)
1433+
if(fUvxTap < 0.0f || fUvxTap >= 1.0f || fUvyTap < 0.0f || fUvyTap >= 1.0f)
14331434
{
14341435
}
14351436
else
14361437
{
14371438
uint32_t uSrcRow = (uint32_t)(fUvyTap * (float)gptTerrainCtx->uTileSize);
14381439
uint32_t uSrcCol = (uint32_t)(fUvxTap * (float)gptTerrainCtx->uTileSize);
1439-
// uResult += (uint32_t)puOriginalData[uSrcRow * gptTerrainCtx->uTileSize + uSrcCol];
1440-
uResult = pl_max((uint32_t)puOriginalData[uSrcRow * gptTerrainCtx->uTileSize + uSrcCol], uResult);
1440+
uResult += (uint32_t)puOriginalData[uSrcRow * gptTerrainCtx->uTileSize + uSrcCol];
1441+
// uResult = pl_max((uint32_t)puOriginalData[uSrcRow * gptTerrainCtx->uTileSize + uSrcCol], uResult);
14411442
uSumCount++;
14421443
}
14431444
}
14441445
}
14451446
// TODO: make sample technique option
1446-
// if(uSumCount > 0)
1447-
// uResult /= uSumCount;
1447+
if(uSumCount > 0)
1448+
uResult /= uSumCount;
14481449

14491450
puDestData[uDstRow * gptTerrainCtx->uHeightMapResolution + uDstCol] = (uint16_t)uResult;
14501451
}

0 commit comments

Comments
 (0)