working collision!
This commit is contained in:
@@ -212,6 +212,44 @@ namespace Game
|
||||
UpdatePlayerInputMode();
|
||||
}
|
||||
|
||||
bool IsOnGround(Level& level, Vec3 worldPos)
|
||||
{
|
||||
for (auto& puz : level.Puzzles)
|
||||
{
|
||||
Vec3 offsetToPuzzle =
|
||||
worldPos - puz.WorldPosition + (Vec3{0.5f, 0.0f, 0.5f} * Puzzle::Config::CardScaleWorld);
|
||||
Vec3 scaledOffset = offsetToPuzzle / Puzzle::Config::CardScaleWorld;
|
||||
int32_t offsetX = (int32_t)bx::floor(scaledOffset.x);
|
||||
int32_t offsetY = (int32_t)bx::floor(scaledOffset.z);
|
||||
if (offsetX >= 0 && offsetX < puz.Data.WidthTiles / 2 && offsetY >= 0 && offsetY < puz.Data.HeightTiles / 2)
|
||||
{
|
||||
auto& card = puz.Data.PlacedCards[offsetY * Puzzle::Config::MaxPuzzleSizeCards + offsetX];
|
||||
if (card.RefCard.Idx == UINT16_MAX)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
auto& refCard = Puzzle::GetStaticPuzzleData().Cards[card.RefCard.Idx];
|
||||
if (!IsValid(refCard.BaseModelHandle))
|
||||
{
|
||||
LOG_WARN("missing base model! @ %i %i", offsetX, offsetY);
|
||||
return true;
|
||||
}
|
||||
|
||||
auto& heightmap = GameRendering::Get().Models[refCard.BaseModelHandle.ModelIdx].Height;
|
||||
float fracOffsetX = scaledOffset.x - offsetX;
|
||||
float fracOffsetY = scaledOffset.z - offsetY;
|
||||
int32_t xPos = (int32_t)(fracOffsetX * heightmap.Width);
|
||||
int32_t yPos = (int32_t)(fracOffsetY * heightmap.Height);
|
||||
uint8_t height = heightmap.Values[yPos * heightmap.Width + xPos];
|
||||
|
||||
LOG("Height: %u", height);
|
||||
return height > 230;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Level::Update()
|
||||
{
|
||||
ZoneScopedN("Level update");
|
||||
@@ -263,9 +301,15 @@ namespace Game
|
||||
}
|
||||
else if (player.CameraM == CameraMode::Walk)
|
||||
{
|
||||
TranslateLocal(player.PlayerCamTransform, {0.0f, 0.0f, inputVec.z});
|
||||
TranslateLocal(player.PlayerCamTransform, {inputVec.x, 0.0f, 0.0f});
|
||||
player.PlayerCamTransform.Position.y = 3.0f;
|
||||
auto newTransform = player.PlayerCamTransform;
|
||||
TranslateLocal(newTransform, {0.0f, 0.0f, inputVec.z});
|
||||
TranslateLocal(newTransform, {inputVec.x, 0.0f, 0.0f});
|
||||
newTransform.Position.y = 3.0f;
|
||||
|
||||
if (IsOnGround(*this, newTransform.Position))
|
||||
{
|
||||
player.PlayerCamTransform = newTransform;
|
||||
}
|
||||
|
||||
player.WalkXRot += rotInput.x;
|
||||
player.WalkYRot += rotInput.y;
|
||||
|
||||
Reference in New Issue
Block a user