refactor
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#include "Level.h"
|
||||
#include "Log.h"
|
||||
#include "Puzzle.h"
|
||||
#include "UI.h"
|
||||
#include "bx/bx.h"
|
||||
#include "rendering/Rendering.h"
|
||||
|
||||
@@ -189,6 +190,7 @@ namespace Game
|
||||
Puzzles[i].Setup();
|
||||
}
|
||||
}
|
||||
PuzzleUI.Setup();
|
||||
TabletHandle = UIQuads.New();
|
||||
UpdatePlayerInputMode();
|
||||
|
||||
@@ -286,12 +288,17 @@ namespace Game
|
||||
}
|
||||
|
||||
// Puzzle tiles
|
||||
uint16_t activeIdx = GetInstance().DebugData.SelectedDebugLevel;
|
||||
for (int32_t i = 0; i < BX_COUNTOF(Puzzles); ++i)
|
||||
{
|
||||
Puzzles[i].IsActive = GetInstance().DebugData.SelectedDebugLevel == i;
|
||||
Puzzles[i].IsActive = activeIdx == i;
|
||||
Puzzles[i].Update();
|
||||
}
|
||||
|
||||
Puzzle::PuzzleSolver solver;
|
||||
bool isPuzzleSolved = solver.IsPuzzleSolved(Puzzles[activeIdx].Data);
|
||||
PuzzleUI.Update(Puzzles[activeIdx].Data, isPuzzleSolved);
|
||||
|
||||
END_PERF(GetShared().Window.PerfCounters, PerfCounterType::GameLevelUpdate, GetShared().Window.FrameCounter);
|
||||
}
|
||||
|
||||
@@ -369,187 +376,18 @@ namespace Game
|
||||
auto& cover = level.PuzzleTileCovers.Get(CoverHandles[idx]);
|
||||
cover.EData.Visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
UIPlacedCards[i] = level.UIQuads.New();
|
||||
auto& quad = level.UIQuads.Get(UIPlacedCards[i]);
|
||||
quad.EData.ModelH = GameRendering::Get().GetModelHandleFromPath("models/plane.glb");
|
||||
quad.EData.MaterialHandle = EMaterial::UI;
|
||||
}
|
||||
for (int32_t i = 0; i < Puzzle::Config::MaxAvailableStacks * WorldPuzzle::UIAvailableCardMaxStackPreview; ++i)
|
||||
{
|
||||
UIAvailableCards[i] = level.UIQuads.New();
|
||||
auto& quad = level.UIQuads.Get(UIAvailableCards[i]);
|
||||
quad.EData.MaterialHandle = EMaterial::UI;
|
||||
quad.EData.ModelH = GameRendering::Get().GetModelHandleFromPath("models/plane.glb");
|
||||
}
|
||||
SolvedQuad = level.UIQuads.New();
|
||||
ResetQuad = level.UIQuads.New();
|
||||
IsSetup = true;
|
||||
LOG("finished setup!");
|
||||
}
|
||||
|
||||
Vec3 GetMousePosWorld()
|
||||
{
|
||||
auto& window = GetShared().Window;
|
||||
Vec2 mousePos = GetMousePos();
|
||||
mousePos.x = mousePos.x / window.WindowWidth;
|
||||
mousePos.y = mousePos.y / window.WindowHeight;
|
||||
mousePos *= 2.0f;
|
||||
mousePos -= 1.0f;
|
||||
Vec4 mousePosView = {mousePos.x, -mousePos.y, 0.0f, 1.0f};
|
||||
Vec4 mousePosCam4 = Mul(GetInstance().Player.ProjectionInverse, mousePosView);
|
||||
Vec3 mousePosCam = Vec3{
|
||||
mousePosCam4.x /= mousePosCam4.w,
|
||||
mousePosCam4.y /= mousePosCam4.w,
|
||||
mousePosCam4.z /= mousePosCam4.w,
|
||||
};
|
||||
|
||||
return LocalToGlobalPoint(GetInstance().Player.PlayerCamTransform, mousePosCam);
|
||||
}
|
||||
|
||||
bool IsQuadHovered(Transform& quadTransform, Vec3 mousePosWorld, Vec3& outQuadPlaneIntersectPos)
|
||||
{
|
||||
Vec3 quadPosWorld = quadTransform.Position;
|
||||
Vec3 quadXWorld = LocalToGlobalPoint(quadTransform, {1, 0, 0});
|
||||
Vec3 quadZWorld = LocalToGlobalPoint(quadTransform, {0, 0, 1});
|
||||
if (RayPlaneIntersect(GetInstance().Player.PlayerCamTransform.Position,
|
||||
mousePosWorld,
|
||||
quadPosWorld,
|
||||
quadXWorld,
|
||||
quadZWorld,
|
||||
outQuadPlaneIntersectPos))
|
||||
{
|
||||
Vec3 quadSpaceIntersect = GlobalToLocalPoint(quadTransform, outQuadPlaneIntersectPos);
|
||||
if (quadSpaceIntersect.x >= -1.0f && quadSpaceIntersect.x <= 1.0f && quadSpaceIntersect.z >= -1.0f &&
|
||||
quadSpaceIntersect.z <= 1.0f)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void WorldPuzzle::Update()
|
||||
{
|
||||
Level& level = GetInstance().GameLevel;
|
||||
auto& staticCards = Puzzle::GetStaticPuzzleData().Cards;
|
||||
auto& visuals = Puzzle::GetStaticPuzzleData().Visuals;
|
||||
|
||||
Transform& camTransform = GetInstance().Player.PlayerCamTransform;
|
||||
UpdateMatrix(camTransform);
|
||||
Vec3 cameraPos = camTransform.Position;
|
||||
|
||||
// TODO: disable warning & check if parentheses make sense like this
|
||||
Vec2 uiOffset = Vec2{static_cast<float>(Data.WidthTiles / Puzzle::Config::CardSize) - 1,
|
||||
static_cast<float>(Data.HeightTiles / Puzzle::Config::CardSize) - 1};
|
||||
uiOffset *= -UICardOffset * 0.5f;
|
||||
|
||||
Transform& boardTransform = level.UIQuads.Get(level.TabletHandle).EData.Transform;
|
||||
Transform tileOriginTransform = boardTransform;
|
||||
tileOriginTransform.Position += AxisForward(camTransform.M) * -0.01f;
|
||||
TranslateLocal(tileOriginTransform, Vec3{uiOffset.x, 0.0f, uiOffset.y} * 1.0f);
|
||||
UpdateMatrix(tileOriginTransform);
|
||||
|
||||
Vec3 mousePosWorld = GetMousePosWorld();
|
||||
Vec3 quadPlaneIntersectPos;
|
||||
|
||||
Puzzle::PuzzleSolver solver;
|
||||
EntityRenderData solvedData;
|
||||
solvedData.LoadFromSaved(GetInstance().Player.Config.TabletStatusRenderData);
|
||||
auto& solvedQuad = level.UIQuads.Get(SolvedQuad);
|
||||
solvedQuad.EData = solvedData;
|
||||
solvedQuad.EData.Visible = IsActive;
|
||||
solvedQuad.EData.TextureHandle = solver.IsPuzzleSolved(Data)
|
||||
? GetInstance().Player.Config.TabletStatusSolvedTexture
|
||||
: solvedData.TextureHandle;
|
||||
solvedQuad.EData.Transform.Position = tileOriginTransform.Position;
|
||||
solvedQuad.EData.Transform.Rotation = camTransform.Rotation;
|
||||
TranslateLocal(solvedQuad.EData.Transform, solvedData.Transform.Position);
|
||||
Rotate(solvedQuad.EData.Transform, Vec3{bx::kPi * 0.5f, 0.0f, (1.0f - 0 * 0.5f) * bx::kPi});
|
||||
|
||||
EntityRenderData resetData;
|
||||
resetData.LoadFromSaved(GetInstance().Player.Config.TabletResetRenderData);
|
||||
auto& resetQuad = level.UIQuads.Get(ResetQuad);
|
||||
resetQuad.EData = resetData;
|
||||
resetQuad.EData.Visible = IsActive;
|
||||
resetQuad.EData.Transform.Position = tileOriginTransform.Position;
|
||||
resetQuad.EData.Transform.Rotation = camTransform.Rotation;
|
||||
TranslateLocal(resetQuad.EData.Transform, resetData.Transform.Position);
|
||||
Rotate(resetQuad.EData.Transform, Vec3{bx::kPi * 0.5f, 0.0f, (1.0f - 0 * 0.5f) * bx::kPi});
|
||||
if (GetMouseButtonPressedNow(MouseButton::Left) &&
|
||||
IsQuadHovered(resetQuad.EData.Transform, mousePosWorld, quadPlaneIntersectPos))
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
// Available Cards
|
||||
for (int32_t i = 0; i < Puzzle::Config::MaxAvailableStacks; ++i)
|
||||
{
|
||||
auto& card = Data.AvailableCards[i];
|
||||
for (int32_t j = 0; j < UIAvailableCardMaxStackPreview; j++)
|
||||
{
|
||||
auto& quad = level.UIQuads.Get(UIAvailableCards[i * UIAvailableCardMaxStackPreview + j]);
|
||||
int32_t remaining = (int32_t)card.MaxAvailableCount - (int32_t)card.UsedCount;
|
||||
if (i < Data.AvailableCardCount && j < remaining)
|
||||
{
|
||||
quad.EData.Visible = IsActive;
|
||||
quad.EData.TextureHandle = Puzzle::IsValid(Data.AvailableCards[i].RefCard)
|
||||
? staticCards[Data.AvailableCards[i].RefCard.Idx].BoardTextureHandle
|
||||
: Gen::TextureHandle{};
|
||||
quad.EData.Transform.Position = tileOriginTransform.Position;
|
||||
quad.EData.Transform.Rotation = camTransform.Rotation;
|
||||
TranslateLocal(quad.EData.Transform,
|
||||
Vec3{j * 0.05f + i * 1.2f, 6.0f + (j % 2 == 0 ? 0.02f : 0.0f), j * 0.001f} *
|
||||
UICardOffset * UICardScale);
|
||||
Rotate(quad.EData.Transform, Vec3{bx::kPi * 0.5f, 0.0f, (1.0f - 0 * 0.5f) * bx::kPi});
|
||||
quad.EData.Transform.Scale = {UICardScale, UICardScale, UICardScale};
|
||||
quad.EData.DotColor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||
quad.EData.BaseColor = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||
|
||||
if (j == 0)
|
||||
{
|
||||
if (IsQuadHovered(quad.EData.Transform, mousePosWorld, quadPlaneIntersectPos) &&
|
||||
DraggedAvailableCardIdx == UINT16_MAX && DraggedCard.X == -1 &&
|
||||
GetMouseButtonPressedNow(MouseButton::Left))
|
||||
{
|
||||
DraggedAvailableCardIdx = i;
|
||||
}
|
||||
if (DraggedAvailableCardIdx == i)
|
||||
{
|
||||
Vec3 dragPos = quadPlaneIntersectPos;
|
||||
dragPos -= AxisForward(camTransform.M) * 0.01f;
|
||||
quad.EData.Transform.Position = dragPos;
|
||||
|
||||
Vec3 boardPos = GlobalToLocalPoint(tileOriginTransform, quadPlaneIntersectPos);
|
||||
Vec3 boardTilePos = boardPos / UICardOffset;
|
||||
int32_t xPos = (int32_t)bx::round(boardTilePos.x);
|
||||
int32_t yPos = (int32_t)bx::round(boardTilePos.z);
|
||||
|
||||
if (!GetMouseButton(MouseButton::Left))
|
||||
{
|
||||
if (xPos >= 0 && xPos < Data.WidthTiles / Puzzle::Config::CardSize && yPos >= 0 &&
|
||||
yPos < Data.HeightTiles / Puzzle::Config::CardSize)
|
||||
{
|
||||
Gen::PuzPos targetCardPos = {(int8_t)xPos, (int8_t)yPos};
|
||||
Gen::PlacedPuzzleCard& targetCard =
|
||||
Data.PlacedCards[yPos * Puzzle::Config::MaxPuzzleSizeCards + xPos];
|
||||
if (!Puzzle::IsValid(targetCard.RefCard) || targetCard.RefCard.Idx == 0)
|
||||
{
|
||||
Puzzle::DragAvailableCardTo(Data, targetCardPos, DraggedAvailableCardIdx, 0);
|
||||
}
|
||||
}
|
||||
DraggedAvailableCardIdx = UINT16_MAX;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
quad.EData.Visible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Board
|
||||
for (int8_t y = 0; y < Data.HeightTiles / Puzzle::Config::CardSize; ++y)
|
||||
{
|
||||
@@ -558,7 +396,6 @@ namespace Game
|
||||
int32_t cardIdx = y * Puzzle::Config::MaxPuzzleSizeCards + x;
|
||||
Gen::PlacedPuzzleCard& card = Data.PlacedCards[cardIdx];
|
||||
auto& tile = level.PuzzleTiles.Get(TileHandles[cardIdx]);
|
||||
auto& quad = level.UIQuads.Get(UIPlacedCards[cardIdx]);
|
||||
|
||||
bool isValid = Puzzle::IsValid(card.RefCard);
|
||||
auto& staticCard = isValid ? staticCards[card.RefCard.Idx] : staticCards[0];
|
||||
@@ -597,96 +434,6 @@ namespace Game
|
||||
Gen::RotateLocal(cover.EData.Transform, Gen::EulerFromRotation(model.Sockets[i].Rot));
|
||||
}
|
||||
}
|
||||
|
||||
// UI Quad
|
||||
quad.EData.Visible = isValid && IsActive;
|
||||
quad.EData.TextureHandle =
|
||||
isValid ? staticCards[card.RefCard.Idx].BoardTextureHandle : Gen::TextureHandle{};
|
||||
quad.EData.DotColor = card.IsLocked ? Puzzle::GetStaticPuzzleData().Visuals.DisabledCardTint
|
||||
: Vec4{1.0f, 1.0f, 1.0f, 1.0f};
|
||||
|
||||
quad.EData.Transform.Position = tileOriginTransform.Position;
|
||||
quad.EData.Transform.Rotation = camTransform.Rotation;
|
||||
TranslateLocal(quad.EData.Transform,
|
||||
Vec3{(float)card.Position.X, (float)card.Position.Y, 0.0f} * UICardOffset * UICardScale);
|
||||
Rotate(quad.EData.Transform, Vec3{bx::kPi * 0.5f, 0.0f, (1.0f - card.Rotation * 0.5f) * bx::kPi});
|
||||
quad.EData.Transform.Scale = {UICardScale, UICardScale, UICardScale};
|
||||
|
||||
Vec3 quadPlaneIntersectPos;
|
||||
if (isValid && IsQuadHovered(quad.EData.Transform, mousePosWorld, quadPlaneIntersectPos))
|
||||
{
|
||||
if (!card.IsLocked && DraggedCard.X == -1 && DraggedAvailableCardIdx == UINT16_MAX)
|
||||
{
|
||||
if (GetMouseButtonPressedNow(MouseButton::Left))
|
||||
{
|
||||
DraggedCard.X = x;
|
||||
DraggedCard.Y = y;
|
||||
}
|
||||
if (GetMouseButtonPressedNow(MouseButton::Right))
|
||||
{
|
||||
Puzzle::RotateCard(card);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (DraggedCard.X == x && DraggedCard.Y == y)
|
||||
{
|
||||
Vec3 dragPos = quadPlaneIntersectPos;
|
||||
dragPos -= AxisForward(camTransform.M) * 0.01f;
|
||||
quad.EData.Transform.Position = dragPos;
|
||||
|
||||
Vec3 boardPos = GlobalToLocalPoint(tileOriginTransform, quadPlaneIntersectPos);
|
||||
Vec3 boardTilePos = boardPos / UICardOffset;
|
||||
int32_t xPos = (int32_t)bx::round(boardTilePos.x);
|
||||
int32_t yPos = (int32_t)bx::round(boardTilePos.z);
|
||||
Gen::PuzPos srcCardPos = {(int8_t)DraggedCard.X, (int8_t)DraggedCard.Y};
|
||||
Gen::PlacedPuzzleCard& srcCard =
|
||||
Data.PlacedCards[srcCardPos.Y * Puzzle::Config::MaxPuzzleSizeCards + srcCardPos.X];
|
||||
|
||||
if (GetMouseButtonPressedNow(MouseButton::Right))
|
||||
{
|
||||
Puzzle::RotateCard(srcCard);
|
||||
}
|
||||
|
||||
if (!GetMouseButton(MouseButton::Left))
|
||||
{
|
||||
Gen::PuzPos targetCardPos = {(int8_t)xPos, (int8_t)yPos};
|
||||
if (xPos >= 0 && xPos < Data.WidthTiles / Puzzle::Config::CardSize && yPos >= 0 &&
|
||||
yPos < Data.HeightTiles / Puzzle::Config::CardSize)
|
||||
{
|
||||
PlacedPuzzleCard srcCardCopy = srcCard;
|
||||
Gen::PlacedPuzzleCard& targetCard =
|
||||
Data.PlacedCards[yPos * Puzzle::Config::MaxPuzzleSizeCards + xPos];
|
||||
bool canBeReplaced = !Puzzle::IsValid(targetCard.RefCard) || targetCard.RefCard.Idx == 0;
|
||||
if (canBeReplaced && Puzzle::ReturnPlacedCard(Data, srcCardPos))
|
||||
{
|
||||
int32_t foundIdx = -1;
|
||||
for (int32_t availCardIdx = 0; availCardIdx < Data.AvailableCardCount; ++availCardIdx)
|
||||
{
|
||||
LOG("CHECK: %u", Data.AvailableCards[availCardIdx].RefCard.Idx);
|
||||
if (Data.AvailableCards[availCardIdx].RefCard.Idx == srcCardCopy.RefCard.Idx)
|
||||
{
|
||||
foundIdx = availCardIdx;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (foundIdx >= 0)
|
||||
{
|
||||
Puzzle::DragAvailableCardTo(Data, targetCardPos, foundIdx, srcCard.Rotation);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_ERROR("NOTFOUND: %u", srcCardCopy.RefCard.Idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Puzzle::ReturnPlacedCard(Data, srcCardPos);
|
||||
}
|
||||
DraggedCard.X = -1;
|
||||
DraggedCard.Y = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user