diff --git a/Samples/RPG/Resources/Resources.xml b/Samples/RPG/Resources/Resources.xml new file mode 100644 index 0000000..5dd243c --- /dev/null +++ b/Samples/RPG/Resources/Resources.xml @@ -0,0 +1,34 @@ + + + 1.0.0 + 1.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/RPG/Resources/Scenes/GameMap.xml b/Samples/RPG/Resources/Scenes/GameMap.xml new file mode 100644 index 0000000..1c597bf --- /dev/null +++ b/Samples/RPG/Resources/Scenes/GameMap.xml @@ -0,0 +1,32 @@ + + + 1.0.0 + 1.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/RPG/Src/imp/cpp/Game.cpp b/Samples/RPG/Src/imp/cpp/Game.cpp index 75f0c33..ae7927b 100644 --- a/Samples/RPG/Src/imp/cpp/Game.cpp +++ b/Samples/RPG/Src/imp/cpp/Game.cpp @@ -22,27 +22,47 @@ namespace ia::iae::rpg { STATIC GameRequestedConfig EngineConfig{ .DesignWidth = 800, - .DesignHeight = 600, + .DesignHeight = 608, .WindowWidth = 800, - .WindowHeight = 600, + .WindowHeight = 608, }; return &EngineConfig; } - Handle g_playerSpriteSheet; + //Handle g_pathTile; + //Handle g_waterTile; + //Handle g_grassTile; + //Handle g_pathTileSheet; + //Handle g_waterTileSheet; + //Handle g_beachTileSheet; + //Handle g_cliffTileSheet; + //Handle g_farmLandTileSheet; + //Handle g_playerSpriteSheet; VOID OnInitialize() { - g_playerSpriteSheet = IAEngine::CreateSpriteSheet("Resources/Cute_Fantasy_Free/Player/Player.png", 32, 32, + /*g_playerSpriteSheet = IAEngine::CreateSpriteSheet("Resources/Cute_Fantasy_Free/Player/Player.png", 32, 32, {6, 6, 6, 6, 6, 6, 4, 4, 4, 4}); - IAEngine::LoadResources({g_playerSpriteSheet}); + g_pathTile = IAEngine::CreateTileSheet("Resources/Cute_Fantasy_Free/Tiles/Path_Middle.png", 16, 16); + g_waterTile = IAEngine::CreateTileSheet("Resources/Cute_Fantasy_Free/Tiles/Water_Middle.png", 16, 16); + g_grassTile = IAEngine::CreateTileSheet("Resources/Cute_Fantasy_Free/Tiles/Grass_Middle.png", 16, 16); + g_pathTileSheet = IAEngine::CreateTileSheet("Resources/Cute_Fantasy_Free/Tiles/Path_Tile.png", 16, 16); + g_waterTileSheet = IAEngine::CreateTileSheet("Resources/Cute_Fantasy_Free/Tiles/Water_Tile.png", 16, 16); + g_beachTileSheet = IAEngine::CreateTileSheet("Resources/Cute_Fantasy_Free/Tiles/Beach_Tile.png", 16, 16); + g_cliffTileSheet = IAEngine::CreateTileSheet("Resources/Cute_Fantasy_Free/Tiles/Cliff_Tile.png", 16, 16); + g_farmLandTileSheet = IAEngine::CreateTileSheet("Resources/Cute_Fantasy_Free/Tiles/FarmLand_Tile.png", 16, 16); + + IAEngine::LoadResources({g_playerSpriteSheet, g_pathTile, g_waterTile, g_grassTile, g_pathTileSheet, + g_waterTileSheet, g_beachTileSheet, g_cliffTileSheet, g_farmLandTileSheet}); + + IAEngine::GetActiveScene()->SetupGrid({16, 16}); + + IAEngine::GetActiveScene()->GetGridCell(0, 0).TileSheetTexture = g_pathTile;*/ } VOID OnTerminate() { - - IAEngine::DestroyResource(g_playerSpriteSheet); } VOID OnDebugDraw() @@ -55,7 +75,7 @@ namespace ia::iae::rpg VOID OnUpdate(IN FLOAT32 deltaTime) { - IAEngine::DrawSprite(g_playerSpriteSheet, 2, 0, {100.0f, 100.0f}, {1.0f, 1.0f}, 0.0f); + //IAEngine::DrawSprite(g_playerSpriteSheet, 2, 0, {100.0f, 100.0f}, {1.0f, 1.0f}, 0.0f); } VOID OnResize(IN INT32 newWidth, IN INT32 newHeight) diff --git a/Src/IAEngine/CMakeLists.txt b/Src/IAEngine/CMakeLists.txt index d720c8e..301f7c8 100644 --- a/Src/IAEngine/CMakeLists.txt +++ b/Src/IAEngine/CMakeLists.txt @@ -1,9 +1,10 @@ set(SRC_FILES "imp/cpp/IAEngine.cpp" - "imp/cpp/EmbeddedResources.cpp" - + "imp/cpp/Scene.cpp" "imp/cpp/Renderer.cpp" + "imp/cpp/GameData.cpp" + "imp/cpp/EmbeddedResources.cpp" ) add_library(IAEngine STATIC ${SRC_FILES}) diff --git a/Src/IAEngine/imp/cpp/GameData.cpp b/Src/IAEngine/imp/cpp/GameData.cpp new file mode 100644 index 0000000..78e8abc --- /dev/null +++ b/Src/IAEngine/imp/cpp/GameData.cpp @@ -0,0 +1,57 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include +#include + +#include + +namespace ia::iae +{ + VOID GameData::Initialize() + { + if (!LoadResourceData()) + { + IAE_LOG_WARN("Couldn't load \"Resources.XML\", skipping.."); + return; + } + if (!LoadSceneData()) + { + IAE_LOG_WARN("Couldn't load scene XMLs, skipping.."); + return; + } + } + + VOID GameData::Terminate() + { + } + + BOOL GameData::LoadSceneData() + { + return true; + } + + BOOL GameData::LoadResourceData() + { + + return true; + } + + RefPtr GameData::GetEntryScene() + { + return nullptr; + } +} // namespace ia::iae diff --git a/Src/IAEngine/imp/cpp/IAEngine.cpp b/Src/IAEngine/imp/cpp/IAEngine.cpp index d403d25..3e59a4b 100644 --- a/Src/IAEngine/imp/cpp/IAEngine.cpp +++ b/Src/IAEngine/imp/cpp/IAEngine.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #define STB_IMAGE_IMPLEMENTATION #include @@ -47,7 +48,9 @@ namespace ia::iae Vector FrameCounts; }; + RefPtr g_activeScene; Vector g_resources; + Map g_resourceNames; } // namespace ia::iae namespace ia::iae @@ -70,6 +73,8 @@ namespace ia::iae INT32 Run(IN CONST String &name, IN CONST String &packageName, IN CONST String &developerName, IN CONST String &publisherName, IN IA_VERSION_TYPE version) { + INT32 frameCounter{0}; + g_gameName = name; g_gameVersion = version; g_gamePackageName = packageName; @@ -111,6 +116,16 @@ namespace ia::iae break; IAEngine::ProcessEvent(&event); IAEngine::Update(); + + frameCounter++; + if (frameCounter >= 60) + { + frameCounter = 0; + IAEngine::FixedUpdate(); + } + + IAEngine::Draw(); + IAEngine::DebugDraw(); } IAEngine::Terminate(); @@ -131,6 +146,10 @@ namespace ia::iae { Renderer::Initialize(IVec2{g_designViewport.x, g_designViewport.y}); + GameData::Initialize(); + + ChangeActiveScene(GameData::GetEntryScene() ? GameData::GetEntryScene() : CreateScene({g_designViewport.x, g_designViewport.y})); + Game_OnInitialize(); } @@ -138,16 +157,38 @@ namespace ia::iae { Game_OnTerminate(); + GameData::Terminate(); + Renderer::Terminate(); for (SIZE_T i = 0; i < g_resources.size(); i++) DestroyResource(i); } + VOID IAEngine::Draw() + { + g_activeScene->OnDraw(); + Renderer::Draw(); + } + VOID IAEngine::Update() { - Game_OnUpdate(0.0f); - Renderer::Update(); + FLOAT32 deltaTime = 0; + + g_activeScene->OnUpdate(deltaTime); + Game_OnUpdate(deltaTime); + } + + VOID IAEngine::FixedUpdate() + { + g_activeScene->OnFixedUpdate(); + Game_OnFixedUpdate(); + } + + VOID IAEngine::DebugDraw() + { + g_activeScene->OnDebugDraw(); + Game_OnDebugDraw(); } VOID IAEngine::ProcessEvent(IN PVOID _event) @@ -174,7 +215,7 @@ namespace ia::iae t->Type = Resource::EType::TEXTURE; t->Texture = CreateTextureFromFile(path.c_str()); g_resources.pushBack(t); - return (Handle)g_resources.size() - 1; + return (Handle) g_resources.size() - 1; } Handle IAEngine::CreateSprite(IN PCUINT8 rgbaData, IN INT32 width, IN INT32 height) @@ -183,7 +224,7 @@ namespace ia::iae t->Type = Resource::EType::TEXTURE; t->Texture = Renderer::CreateTexture(rgbaData, width, height); g_resources.pushBack(t); - return (Handle)g_resources.size() - 1; + return (Handle) g_resources.size() - 1; } Handle IAEngine::CreateSpriteSheet(IN CONST Vector> &animations) @@ -200,7 +241,7 @@ namespace ia::iae t->FrameCounts = frameCounts; t->Texture = CreateTextureFromFile(path.c_str(), spriteWidth, spriteHeight); g_resources.pushBack(t); - return (Handle)g_resources.size() - 1; + return (Handle) g_resources.size() - 1; } Handle IAEngine::CreateTileSheet(IN CONST String &path, IN INT32 tileWidth, IN INT32 tileHeight) @@ -209,7 +250,7 @@ namespace ia::iae t->Type = Resource::EType::TEXTURE; t->Texture = CreateTextureFromFile(path.c_str(), tileWidth, tileHeight); g_resources.pushBack(t); - return (Handle)g_resources.size() - 1; + return (Handle) g_resources.size() - 1; } Handle IAEngine::CreateTileSheet(IN PCUINT8 rgbaData, IN INT32 width, IN INT32 height, IN INT32 tileWidth, @@ -219,12 +260,13 @@ namespace ia::iae t->Type = Resource::EType::TEXTURE; t->Texture = Renderer::CreateTexture(rgbaData, width, height, width / tileWidth, height / tileHeight); g_resources.pushBack(t); - return (Handle)g_resources.size() - 1; + return (Handle) g_resources.size() - 1; } VOID IAEngine::DestroyResource(IN Handle resource) { - if(!g_resources[resource]) return; + if (!g_resources[resource]) + return; switch (g_resources[resource]->Type) { @@ -241,6 +283,20 @@ namespace ia::iae } delete g_resources[resource]; g_resources[resource] = nullptr; + + for (auto &t : g_resourceNames) + if (t->Value == resource) + t->Value = INVALID_HANDLE; + } + + Handle IAEngine::GetResourceByName(IN CONST String &name) + { + return g_resourceNames[name]; + } + + VOID IAEngine::AssignResourceName(IN Handle resource, IN CONST String &name) + { + g_resourceNames[name] = resource; } VOID IAEngine::LoadResources(IN CONST Vector &resources) @@ -273,21 +329,42 @@ namespace ia::iae VOID IAEngine::DrawTile(IN Handle tileSheet, IN INT32 tileIndexX, IN INT32 tileIndexY, IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset) { - const auto t = static_cast(g_resources[tileSheet]); - Renderer::DrawStaticSpriteTopLeft(t->Texture, tileIndexX, tileIndexY, position, scale, rotation, flipH, flipV, uvOffset); + const auto t = static_cast(g_resources[tileSheet]); + Renderer::DrawStaticSpriteTopLeft(t->Texture, tileIndexX, tileIndexY, position, scale, rotation, flipH, flipV, + uvOffset); } VOID IAEngine::DrawSprite(IN Handle sprite, IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset) { - const auto t = static_cast(g_resources[sprite]); + const auto t = static_cast(g_resources[sprite]); Renderer::DrawDynamicSpriteTopLeft(t->Texture, 0, 0, position, scale, rotation, flipH, flipV, uvOffset); } VOID IAEngine::DrawSprite(IN Handle spriteSheet, IN INT32 animationIndex, IN INT32 frameIndex, IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset) { - const auto t = static_cast(g_resources[spriteSheet]); - Renderer::DrawDynamicSpriteTopLeft(t->Texture, frameIndex, animationIndex, position, scale, rotation, flipH, flipV, uvOffset); + const auto t = static_cast(g_resources[spriteSheet]); + Renderer::DrawDynamicSpriteTopLeft(t->Texture, frameIndex, animationIndex, position, scale, rotation, flipH, + flipV, uvOffset); + } +} // namespace ia::iae + +namespace ia::iae +{ + RefPtr IAEngine::GetActiveScene() + { + return g_activeScene; + } + + RefPtr IAEngine::CreateScene(IN IVec2 extent) + { + return MakeRefPtr(extent); + } + + VOID IAEngine::ChangeActiveScene(IN RefPtr scene) + { + g_activeScene = scene; + LoadResources(scene->GetReferencedResources()); } } // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/imp/cpp/Renderer.cpp b/Src/IAEngine/imp/cpp/Renderer.cpp index 22650a5..1f36e32 100644 --- a/Src/IAEngine/imp/cpp/Renderer.cpp +++ b/Src/IAEngine/imp/cpp/Renderer.cpp @@ -125,7 +125,7 @@ namespace ia::iae SDL_DestroyGPUDevice(g_gpuDevice); } - VOID Renderer::Update() + VOID Renderer::Draw() { Render(); } @@ -197,6 +197,8 @@ namespace ia::iae VOID Renderer::SetCameraPosition(IN Vec2 position) { + if B_LIKELY (g_cameraPosition == position) + return; g_cameraPosition = position; g_viewMatrix = glm::lookAtLH(glm::vec3{g_cameraPosition, -1.0f}, {g_cameraPosition, 0.0f}, {0.0f, 1.0f, 0.0f}); } @@ -205,56 +207,64 @@ namespace ia::iae namespace ia::iae { Vec2 Renderer::DrawStaticSpriteTopLeft(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY, - IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset) + IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, + IN BOOL flipV, IN Vec2 uvOffset) { const auto _s = Vec2{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight}; Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0}); transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f)); transform = glm::scale(transform, glm::vec3(_s, 1.0f)); - g_staticSprites.pushBack({.Transform = transform, - .TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset), - .Color = {1.0f, 1.0f, 1.0f, 1.0f}}); + g_staticSprites.pushBack( + {.Transform = transform, + .TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset), + .Color = {1.0f, 1.0f, 1.0f, 1.0f}}); return _s; } Vec2 Renderer::DrawStaticSpriteCentered(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY, - IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset) + IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, + IN BOOL flipV, IN Vec2 uvOffset) { const auto _s = Vec2{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight}; Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x - _s.x / 2.0f, position.y - _s.y / 2.0f, 0}); transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f)); transform = glm::scale(transform, glm::vec3(_s, 1.0f)); - g_staticSprites.pushBack({.Transform = transform, - .TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset), - .Color = {1.0f, 1.0f, 1.0f, 1.0f}}); + g_staticSprites.pushBack( + {.Transform = transform, + .TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset), + .Color = {1.0f, 1.0f, 1.0f, 1.0f}}); return _s; } Vec2 Renderer::DrawDynamicSpriteTopLeft(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY, - IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset) + IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, + IN BOOL flipV, IN Vec2 uvOffset) { const auto _s = Vec2{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight}; Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0}); transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f)); transform = glm::scale(transform, glm::vec3{_s, 1.0f}); - g_dynamicSprites.pushBack({.Transform = transform, - .TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset), - .Color = {1.0f, 1.0f, 1.0f, 1.0f}}); + g_dynamicSprites.pushBack( + {.Transform = transform, + .TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset), + .Color = {1.0f, 1.0f, 1.0f, 1.0f}}); return _s; } Vec2 Renderer::DrawDynamicSpriteCentered(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY, - IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset) + IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, + IN BOOL flipV, IN Vec2 uvOffset) { const auto _s = Vec2{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight}; Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x - _s.x / 2.0f, position.y - _s.y / 2.0f, 0}); transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f)); transform = glm::scale(transform, glm::vec3{_s, 1.0f}); - g_dynamicSprites.pushBack({.Transform = transform, - .TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset), - .Color = {1.0f, 1.0f, 1.0f, 1.0f}}); + g_dynamicSprites.pushBack( + {.Transform = transform, + .TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset), + .Color = {1.0f, 1.0f, 1.0f, 1.0f}}); return _s; } @@ -318,6 +328,9 @@ namespace ia::iae VOID Renderer::BakeTextureAtlas(IN CONST Vector textures) { + if (textures.empty()) + return; + if (g_activeTextureAtlas && (g_activeTextureAtlas != g_defaultTexture)) DestroyTexture(g_activeTextureAtlas); @@ -352,20 +365,21 @@ namespace ia::iae delete[] pixels; } - Vec4 Renderer::GetTextureAtlasCoordinates(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset) + Vec4 Renderer::GetTextureAtlasCoordinates(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY, + IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset) { const auto &d = g_texureData[texture]; const auto &t = g_activeTextureAtlasUVMap[texture]; const auto pX = ((tileIndexX + uvOffset.x) * ((FLOAT32) d.TileWidth)) * g_activeTextureAtlasInverseSize.x; const auto pY = ((tileIndexY + uvOffset.y) * ((FLOAT32) d.TileHeight)) * g_activeTextureAtlasInverseSize.y; auto texCoords = Vec4(t.x + pX, t.y + pY, d.TileWidth * g_activeTextureAtlasInverseSize.x, - d.TileHeight * g_activeTextureAtlasInverseSize.y); - if(flipH) + d.TileHeight * g_activeTextureAtlasInverseSize.y); + if (flipH) { texCoords.x += texCoords.z; texCoords.z *= -1; } - if(flipV) + if (flipV) { texCoords.y += texCoords.w; texCoords.w *= -1; diff --git a/Src/IAEngine/imp/cpp/Scene.cpp b/Src/IAEngine/imp/cpp/Scene.cpp new file mode 100644 index 0000000..ec654e5 --- /dev/null +++ b/Src/IAEngine/imp/cpp/Scene.cpp @@ -0,0 +1,59 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include +#include + +namespace ia::iae +{ + Scene::Scene(IN IVec2 extent) : m_extent(extent) + { + } + + Scene::~Scene() + { + } + + VOID Scene::SetupGrid(IN IVec2 gridCellSize) + { + m_gridCellSize = gridCellSize; + m_gridSize = {m_extent.x / m_gridCellSize.x, m_extent.y / m_gridCellSize.y}; + m_gridCells.resize(m_gridSize.x * m_gridSize.y); + } + + VOID Scene::OnDraw() + { + for(const auto& cell: m_gridCells) + { + IAEngine::DrawTile(cell.TileSheetTexture, cell.TileIndex.x, cell.TileIndex.y, { + + }, {1.0f, 1.0f}, 0.0f); + } + } + + VOID Scene::OnDebugDraw() + { + } + + VOID Scene::OnFixedUpdate() + { + } + + VOID Scene::OnUpdate(IN FLOAT32 deltaTime) + { + Renderer::SetCameraPosition(m_cameraPosition); + } +} // namespace ia::iae diff --git a/Src/IAEngine/imp/hpp/GameData.hpp b/Src/IAEngine/imp/hpp/GameData.hpp new file mode 100644 index 0000000..fe5e5e9 --- /dev/null +++ b/Src/IAEngine/imp/hpp/GameData.hpp @@ -0,0 +1,38 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia::iae +{ + class GameData + { + public: + STATIC RefPtr GetEntryScene(); + + private: + STATIC BOOL LoadSceneData(); + STATIC BOOL LoadResourceData(); + + private: + STATIC VOID Initialize(); + STATIC VOID Terminate(); + + friend class IAEngine; + }; +} // namespace ia::iae diff --git a/Src/IAEngine/imp/hpp/Renderer.hpp b/Src/IAEngine/imp/hpp/Renderer.hpp index 41854cd..a64e3cc 100644 --- a/Src/IAEngine/imp/hpp/Renderer.hpp +++ b/Src/IAEngine/imp/hpp/Renderer.hpp @@ -123,7 +123,7 @@ namespace ia::iae private: STATIC VOID Initialize(IN IVec2 screenExtent); STATIC VOID Terminate(); - STATIC VOID Update(); + STATIC VOID Draw(); friend class IAEngine; }; diff --git a/Src/IAEngine/inc/IAEngine/IAEngine.hpp b/Src/IAEngine/inc/IAEngine/IAEngine.hpp index a512f72..82c45ef 100644 --- a/Src/IAEngine/inc/IAEngine/IAEngine.hpp +++ b/Src/IAEngine/inc/IAEngine/IAEngine.hpp @@ -16,7 +16,7 @@ #pragma once -#include +#include namespace ia::iae { @@ -35,16 +35,24 @@ namespace ia::iae IN INT32 tileHeight); STATIC VOID DestroyResource(IN Handle resource); + STATIC Handle GetResourceByName(IN CONST String &name); + STATIC VOID AssignResourceName(IN Handle resource, IN CONST String &name); STATIC VOID LoadResources(IN CONST Vector &resources); + public: + STATIC RefPtr GetActiveScene(); + STATIC RefPtr CreateScene(IN IVec2 extent); + STATIC VOID ChangeActiveScene(IN RefPtr scene); + public: STATIC VOID DrawTile(IN Handle tileSheet, IN INT32 tileIndexX, IN INT32 tileIndexY, IN Vec2 position, IN Vec2 scale = {1.0f, 1.0f}, IN FLOAT32 rotation = 0.0f, IN BOOL flipH = false, IN BOOL flipV = false, IN Vec2 uvOffset = {}); STATIC VOID DrawSprite(IN Handle sprite, IN Vec2 position, IN Vec2 scale = {1.0f, 1.0f}, - IN FLOAT32 rotation = 0.0f, IN BOOL flipH = false, IN BOOL flipV = false, IN Vec2 uvOffset = {}); + IN FLOAT32 rotation = 0.0f, IN BOOL flipH = false, IN BOOL flipV = false, + IN Vec2 uvOffset = {}); STATIC VOID DrawSprite(IN Handle spriteSheet, IN INT32 animationIndex, IN INT32 frameIndex, IN Vec2 position, IN Vec2 scale = {1.0f, 1.0f}, IN FLOAT32 rotation = 0.0f, IN BOOL flipH = false, IN BOOL flipV = false, IN Vec2 uvOffset = {}); @@ -52,10 +60,15 @@ namespace ia::iae private: STATIC VOID Initialize(); STATIC VOID Terminate(); + STATIC VOID Draw(); STATIC VOID Update(); + STATIC VOID FixedUpdate(); + STATIC VOID DebugDraw(); STATIC VOID ProcessEvent(IN PVOID event); friend INT32 Run(IN CONST String &name, IN CONST String &packageName, IN CONST String &developerName, IN CONST String &publisherName, IN IA_VERSION_TYPE version); + + friend class Scene; }; } // namespace ia::iae diff --git a/Src/IAEngine/inc/IAEngine/Scene.hpp b/Src/IAEngine/inc/IAEngine/Scene.hpp new file mode 100644 index 0000000..874a508 --- /dev/null +++ b/Src/IAEngine/inc/IAEngine/Scene.hpp @@ -0,0 +1,77 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia::iae +{ + struct GridCell + { + IVec2 TileIndex; + PVOID UserData{}; + Vec4 ColorOverlay; + Handle TileSheetTexture{}; + UINT64 CollisionMask{}; + }; + + class Scene + { + public: + Scene(IN IVec2 extent); + ~Scene(); + + VOID SetupGrid(IN IVec2 gridCellSize); + + public: + INLINE GridCell &GetGridCell(IN INT32 x, IN INT32 y); + INLINE VOID AddReferencedResources(IN Handle resource); + + INLINE CONST Vector &GetReferencedResources() CONST; + + private: + IVec2 m_gridSize{}; + CONST IVec2 m_extent; + IVec2 m_gridCellSize{}; + Vec2 m_cameraPosition{}; + Vector m_gridCells; + Vector m_referencedResources; + + private: + VOID OnDraw(); + VOID OnDebugDraw(); + VOID OnFixedUpdate(); + VOID OnUpdate(IN FLOAT32 deltaTime); + + friend class IAEngine; + }; + + GridCell &Scene::GetGridCell(IN INT32 x, IN INT32 y) + { + return m_gridCells[x + (y * m_gridSize.x)]; + } + + VOID Scene::AddReferencedResources(IN Handle resource) + { + m_referencedResources.pushBack(resource); + } + + CONST Vector &Scene::GetReferencedResources() CONST + { + return m_referencedResources; + } +} // namespace ia::iae