rotation fix
This commit is contained in:
BIN
assets/blender/Channels.blend
LFS
BIN
assets/blender/Channels.blend
LFS
Binary file not shown.
Binary file not shown.
BIN
assets/textures/w straight.png
LFS
BIN
assets/textures/w straight.png
LFS
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -218,6 +218,16 @@ namespace Game
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsInPuzzle(WorldPuzzle& puz, Vec3 worldPos)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
return (offsetX >= 0 && offsetX < puz.Data.WidthTiles / 2 && offsetY >= -1 &&
|
||||||
|
offsetY < puz.Data.HeightTiles / 2);
|
||||||
|
}
|
||||||
|
|
||||||
bool IsOnGround(Level& level, Vec3 worldPos)
|
bool IsOnGround(Level& level, Vec3 worldPos)
|
||||||
{
|
{
|
||||||
for (auto& puz : level.Puzzles)
|
for (auto& puz : level.Puzzles)
|
||||||
@@ -226,7 +236,10 @@ namespace Game
|
|||||||
worldPos - puz.WorldPosition + (Vec3{0.5f, 0.0f, 0.5f} * Puzzle::Config::CardScaleWorld);
|
worldPos - puz.WorldPosition + (Vec3{0.5f, 0.0f, 0.5f} * Puzzle::Config::CardScaleWorld);
|
||||||
Vec3 scaledOffset = offsetToPuzzle / Puzzle::Config::CardScaleWorld;
|
Vec3 scaledOffset = offsetToPuzzle / Puzzle::Config::CardScaleWorld;
|
||||||
int32_t offsetX = (int32_t)bx::floor(scaledOffset.x);
|
int32_t offsetX = (int32_t)bx::floor(scaledOffset.x);
|
||||||
int32_t offsetY = (int32_t)bx::floor(scaledOffset.z);
|
int32_t offsetY = puz.Data.HeightTiles / 2 - (int32_t)bx::floor(scaledOffset.z) - 1;
|
||||||
|
float fracOffsetX = scaledOffset.x - offsetX;
|
||||||
|
float fracOffsetY = scaledOffset.z - bx::floor(scaledOffset.z);
|
||||||
|
|
||||||
if (offsetX >= 0 && offsetX < puz.Data.WidthTiles / 2 && offsetY >= 0 && offsetY < puz.Data.HeightTiles / 2)
|
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];
|
auto& card = puz.Data.PlacedCards[offsetY * Puzzle::Config::MaxPuzzleSizeCards + offsetX];
|
||||||
@@ -243,8 +256,6 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto& heightmap = GameRendering::Get().Models[refCard.BaseModelHandle.ModelIdx].Height;
|
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 xPos = (int32_t)(fracOffsetX * heightmap.Width);
|
||||||
int32_t yPos = (int32_t)(fracOffsetY * heightmap.Height);
|
int32_t yPos = (int32_t)(fracOffsetY * heightmap.Height);
|
||||||
|
|
||||||
@@ -255,7 +266,7 @@ namespace Game
|
|||||||
height = heightmap.Values[yPos * heightmap.Width + xPos];
|
height = heightmap.Values[yPos * heightmap.Width + xPos];
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
height = heightmap.Values[(heightmap.Height - xPos - 1) * heightmap.Width + yPos];
|
height = heightmap.Values[xPos * heightmap.Width + (heightmap.Height - yPos - 1)];
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
height =
|
height =
|
||||||
@@ -263,7 +274,7 @@ namespace Game
|
|||||||
.Values[(heightmap.Height - yPos - 1) * heightmap.Width + (heightmap.Width - xPos - 1)];
|
.Values[(heightmap.Height - yPos - 1) * heightmap.Width + (heightmap.Width - xPos - 1)];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
height = heightmap.Values[xPos * heightmap.Width + (heightmap.Height - yPos - 1)];
|
height = heightmap.Values[(heightmap.Height - xPos - 1) * heightmap.Width + yPos];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return height >= 110 && height <= 125;
|
return height >= 110 && height <= 125;
|
||||||
@@ -387,6 +398,10 @@ namespace Game
|
|||||||
uint16_t activeIdx = GetInstance().DebugData.SelectedDebugLevel;
|
uint16_t activeIdx = GetInstance().DebugData.SelectedDebugLevel;
|
||||||
for (int32_t i = 0; i < BX_COUNTOF(Puzzles); ++i)
|
for (int32_t i = 0; i < BX_COUNTOF(Puzzles); ++i)
|
||||||
{
|
{
|
||||||
|
if (IsInPuzzle(Puzzles[i], player.PlayerCamTransform.Position))
|
||||||
|
{
|
||||||
|
activeIdx = i;
|
||||||
|
}
|
||||||
Puzzles[i].IsActive = activeIdx == i;
|
Puzzles[i].IsActive = activeIdx == i;
|
||||||
Puzzles[i].Update();
|
Puzzles[i].Update();
|
||||||
Puzzles[i].IsSolved = solver.IsPuzzleSolved(Puzzles[i].Data);
|
Puzzles[i].IsSolved = solver.IsPuzzleSolved(Puzzles[i].Data);
|
||||||
@@ -495,6 +510,15 @@ namespace Game
|
|||||||
LOG("finished setup!");
|
LOG("finished setup!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vec3 PuzPosToWorldPos(const PuzzleData& data, int32_t x, int32_t y)
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
(float)x * Puzzle::Config::CardScaleWorld,
|
||||||
|
-5.0f,
|
||||||
|
(float)(data.HeightTiles / 2 - y - 1) * Puzzle::Config::CardScaleWorld,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
void WorldPuzzle::Update()
|
void WorldPuzzle::Update()
|
||||||
{
|
{
|
||||||
Level& level = GetInstance().GameLevel;
|
Level& level = GetInstance().GameLevel;
|
||||||
@@ -521,17 +545,13 @@ namespace Game
|
|||||||
tile.EData.DotColor = visuals.TileDotColor;
|
tile.EData.DotColor = visuals.TileDotColor;
|
||||||
tile.EData.BaseColor = visuals.TileBaseColor;
|
tile.EData.BaseColor = visuals.TileBaseColor;
|
||||||
|
|
||||||
Vec3 cardPos = {
|
Vec3 cardPos = PuzPosToWorldPos(Data, card.Position.X, card.Position.Y);
|
||||||
(float)card.Position.X * Puzzle::Config::CardScaleWorld,
|
|
||||||
-5.0f,
|
|
||||||
(float)card.Position.Y * Puzzle::Config::CardScaleWorld,
|
|
||||||
};
|
|
||||||
if (!isValid)
|
if (!isValid)
|
||||||
{
|
{
|
||||||
cardPos = {x * Puzzle::Config::CardScaleWorld, -5.0f, y * Puzzle::Config::CardScaleWorld};
|
cardPos = PuzPosToWorldPos(Data, x, y);
|
||||||
}
|
}
|
||||||
tile.EData.Transform.Position = cardPos + WorldPosition;
|
tile.EData.Transform.Position = cardPos + WorldPosition;
|
||||||
bx::mtxRotateY(tile.EData.Transform.Rotation.M, card.Rotation * bx::kPi * 0.5f);
|
bx::mtxRotateY(tile.EData.Transform.Rotation.M, card.Rotation * bx::kPi * -0.5f);
|
||||||
|
|
||||||
// Covers
|
// Covers
|
||||||
if (IsValid(staticCard.BaseModelHandle))
|
if (IsValid(staticCard.BaseModelHandle))
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#include "../gen/Def.h"
|
#include "../gen/Def.h"
|
||||||
#include "Gen.h"
|
#include "Gen.h"
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
#include "Instance.h"
|
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "Puzzle.h"
|
#include "Puzzle.h"
|
||||||
|
|
||||||
|
|||||||
@@ -678,16 +678,22 @@ namespace Tools
|
|||||||
ImGui::Text("Anleitung:");
|
ImGui::Text("Anleitung:");
|
||||||
ImGui::Text("Bewege dich mit");
|
ImGui::Text("Bewege dich mit");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::TextColored({1.0f, 0.8f, 0.8f, 1.0f}, "W, A, S, D");
|
ImGui::TextColored({1.0f, 0.6f, 0.6f, 1.0f}, "W, A, S, D");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Text("und schau dich um mit der");
|
ImGui::Text("und schau dich um mit der");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::TextColored({1.0f, 0.8f, 0.8f, 1.0f}, "Maus.");
|
ImGui::TextColored({1.0f, 0.6f, 0.6f, 1.0f}, "Maus.");
|
||||||
ImGui::Text("Drücke");
|
ImGui::Text("Drücke");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::TextColored({1.0f, 0.8f, 0.8f, 1.0f}, "Leertaste");
|
ImGui::TextColored({1.0f, 0.6f, 0.6f, 1.0f}, "Leertaste");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Text("um den Spielplan zu öffnen.");
|
ImGui::Text("um den Spielplan zu öffnen.");
|
||||||
|
ImGui::Text("Auf dem Spielplan kannst du Karten verschieben.");
|
||||||
|
ImGui::Text("Mit");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::TextColored({1.0f, 0.6f, 0.6f, 1.0f}, "Rechter Maustaste");
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::Text("kannst du Karten drehen.");
|
||||||
ImGui::Text("");
|
ImGui::Text("");
|
||||||
auto& inflowTexture = rendering.Textures[10];
|
auto& inflowTexture = rendering.Textures[10];
|
||||||
auto& outflowTexture = rendering.Textures[9];
|
auto& outflowTexture = rendering.Textures[9];
|
||||||
|
|||||||
@@ -124,6 +124,22 @@ namespace Game
|
|||||||
WorldPuzzleUI::UICardScale * WorldPuzzleUI::UICardScale;
|
WorldPuzzleUI::UICardScale * WorldPuzzleUI::UICardScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vec3 CardPosToUIPos(const Gen::PuzzleData& data, int32_t cardX, int32_t cardY)
|
||||||
|
{
|
||||||
|
return Vec3{(float)cardX, (float)(data.HeightTiles / 2 - cardY - 1), -0.3f} * WorldPuzzleUI::UICardOffset *
|
||||||
|
WorldPuzzleUI::UICardScale -
|
||||||
|
CalcBoardOffset(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UIPosToCardPos(const Gen::PuzzleData& data, Vec3 uiPos, int32_t& cardXOut, int32_t& cardYOut)
|
||||||
|
{
|
||||||
|
Vec3 boardOffset = CalcBoardOffset(data) / WorldPuzzleUI::UICardScale;
|
||||||
|
Vec3 boardPos = GlobalToLocalPoint(StaticData.UITransform, uiPos);
|
||||||
|
Vec3 boardTilePos = (boardPos + boardOffset) / WorldPuzzleUI::UICardOffset;
|
||||||
|
cardXOut = (int32_t)bx::round(boardTilePos.x);
|
||||||
|
cardYOut = data.HeightTiles / 2 - (int32_t)bx::round(boardTilePos.y) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
void WorldPuzzleUI::UpdateAvailableCards(Gen::PuzzleData& Data)
|
void WorldPuzzleUI::UpdateAvailableCards(Gen::PuzzleData& Data)
|
||||||
{
|
{
|
||||||
auto& level = GetInstance().GameLevel;
|
auto& level = GetInstance().GameLevel;
|
||||||
@@ -169,11 +185,9 @@ namespace Game
|
|||||||
dragPos += StaticData.ZAxis * -0.01f;
|
dragPos += StaticData.ZAxis * -0.01f;
|
||||||
quad.EData.Transform.Position = dragPos;
|
quad.EData.Transform.Position = dragPos;
|
||||||
|
|
||||||
Vec3 boardOffset = CalcBoardOffset(Data) / WorldPuzzleUI::UICardScale;
|
int32_t xPos;
|
||||||
Vec3 boardPos = GlobalToLocalPoint(StaticData.UITransform, quadPlaneIntersectPos);
|
int32_t yPos;
|
||||||
Vec3 boardTilePos = (boardPos + boardOffset) / UICardOffset;
|
UIPosToCardPos(Data, quadPlaneIntersectPos, xPos, yPos);
|
||||||
int32_t xPos = (int32_t)bx::round(boardTilePos.x);
|
|
||||||
int32_t yPos = (int32_t)bx::round(boardTilePos.y);
|
|
||||||
|
|
||||||
if (!GetMouseButton(MouseButton::Left))
|
if (!GetMouseButton(MouseButton::Left))
|
||||||
{
|
{
|
||||||
@@ -219,9 +233,8 @@ namespace Game
|
|||||||
bool isLocked = GetFlag(card.Flags, PlacedPuzzleCardFlags::Locked);
|
bool isLocked = GetFlag(card.Flags, PlacedPuzzleCardFlags::Locked);
|
||||||
|
|
||||||
auto& quad = level.UIQuads.Get(UIPlacedCards[cardIdx]);
|
auto& quad = level.UIQuads.Get(UIPlacedCards[cardIdx]);
|
||||||
quad.UIPos = Vec3{(float)card.Position.X, (float)card.Position.Y, -0.3f} * UICardOffset * UICardScale;
|
quad.UIPos = CardPosToUIPos(Data, card.Position.X, card.Position.Y);
|
||||||
quad.UIPos -= boardOffset;
|
quad.UIRot = card.Rotation * bx::kPi * -0.5f;
|
||||||
quad.UIRot = card.Rotation * bx::kPi * 0.5f;
|
|
||||||
UpdateQuad(level.UIQuads, UIPlacedCards[cardIdx]);
|
UpdateQuad(level.UIQuads, UIPlacedCards[cardIdx]);
|
||||||
|
|
||||||
quad.EData.Visible = isValid;
|
quad.EData.Visible = isValid;
|
||||||
@@ -253,10 +266,9 @@ namespace Game
|
|||||||
dragPos += StaticData.ZAxis * -0.01f;
|
dragPos += StaticData.ZAxis * -0.01f;
|
||||||
quad.EData.Transform.Position = dragPos;
|
quad.EData.Transform.Position = dragPos;
|
||||||
|
|
||||||
Vec3 boardPos = GlobalToLocalPoint(StaticData.UITransform, quadPlaneIntersectPos);
|
int32_t xPos;
|
||||||
Vec3 boardTilePos = boardPos / UICardOffset;
|
int32_t yPos;
|
||||||
int32_t xPos = (int32_t)bx::round(boardTilePos.x);
|
UIPosToCardPos(Data, quadPlaneIntersectPos, xPos, yPos);
|
||||||
int32_t yPos = (int32_t)bx::round(boardTilePos.y);
|
|
||||||
Gen::PuzPos srcCardPos = {(int8_t)DraggedCard.X, (int8_t)DraggedCard.Y};
|
Gen::PuzPos srcCardPos = {(int8_t)DraggedCard.X, (int8_t)DraggedCard.Y};
|
||||||
Gen::PlacedPuzzleCard& srcCard =
|
Gen::PlacedPuzzleCard& srcCard =
|
||||||
Data.PlacedCards[srcCardPos.Y * Puzzle::Config::MaxPuzzleSizeCards + srcCardPos.X];
|
Data.PlacedCards[srcCardPos.Y * Puzzle::Config::MaxPuzzleSizeCards + srcCardPos.X];
|
||||||
|
|||||||
BIN
src/game/data/puzzles/0.pzl
LFS
BIN
src/game/data/puzzles/0.pzl
LFS
Binary file not shown.
BIN
src/game/data/puzzles/1.pzl
LFS
BIN
src/game/data/puzzles/1.pzl
LFS
Binary file not shown.
BIN
src/game/data/puzzles/2.pzl
LFS
BIN
src/game/data/puzzles/2.pzl
LFS
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
src/textures/w corner long.ktx
LFS
BIN
src/textures/w corner long.ktx
LFS
Binary file not shown.
BIN
src/textures/w! corner short.ktx
LFS
BIN
src/textures/w! corner short.ktx
LFS
Binary file not shown.
BIN
src/textures/w+ corner short.ktx
LFS
BIN
src/textures/w+ corner short.ktx
LFS
Binary file not shown.
@@ -1,17 +1,18 @@
|
|||||||
// raddbg 0.9.19 project file
|
// raddbg 0.9.19 project file
|
||||||
|
|
||||||
recent_file: path: "../src/game/level.cpp"
|
recent_file: path: "../src/game/level.cpp"
|
||||||
|
recent_file: path: "../src/game/puzzle.cpp"
|
||||||
|
recent_file: path: "../src/dependency/bgfx.cmake/bx/src/debug.cpp"
|
||||||
|
recent_file: path: "../src/game/entity.h"
|
||||||
|
recent_file: path: "../src/game/ui.cpp"
|
||||||
recent_file: path: "../src/game/Log.cpp"
|
recent_file: path: "../src/game/Log.cpp"
|
||||||
recent_file: path: "../src/game/rendering/dither.cpp"
|
recent_file: path: "../src/game/rendering/dither.cpp"
|
||||||
recent_file: path: "../src/game/rendering/rendering.cpp"
|
recent_file: path: "../src/game/rendering/rendering.cpp"
|
||||||
recent_file: path: "../src/game/entity.h"
|
|
||||||
recent_file: path: "../src/game/ui.cpp"
|
|
||||||
recent_file: path: "../src/gen/generated.cpp"
|
recent_file: path: "../src/gen/generated.cpp"
|
||||||
recent_file: path: "../src/engine/main.cpp"
|
recent_file: path: "../src/engine/main.cpp"
|
||||||
recent_file: path: "../src/game/setup.cpp"
|
recent_file: path: "../src/game/setup.cpp"
|
||||||
recent_file: path: "../src/dependency/imgui/imgui_widgets.cpp"
|
recent_file: path: "../src/dependency/imgui/imgui_widgets.cpp"
|
||||||
recent_file: path: "../src/game/tools.cpp"
|
recent_file: path: "../src/game/tools.cpp"
|
||||||
recent_file: path: "../src/dependency/bgfx.cmake/bx/src/debug.cpp"
|
|
||||||
recent_file: path: "../src/gen/def.h"
|
recent_file: path: "../src/gen/def.h"
|
||||||
recent_file: path: "../src/game/global.cpp"
|
recent_file: path: "../src/game/global.cpp"
|
||||||
target:
|
target:
|
||||||
|
|||||||
Reference in New Issue
Block a user