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