Named Resources
This commit is contained in:
34
Samples/RPG/Resources/Resources.xml
Normal file
34
Samples/RPG/Resources/Resources.xml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<Resources>
|
||||||
|
<IAEngine>
|
||||||
|
<EngineVersion>1.0.0</EngineVersion>
|
||||||
|
<EditorVersion>1.0.0</EditorVersion>
|
||||||
|
</IAEngine>
|
||||||
|
|
||||||
|
<Properties>
|
||||||
|
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Entries>
|
||||||
|
<SpriteSheet name="SpriteSheet_Player" path="Cute_Fantasy_Free/Player/Player.png" spriteWidth="32" spriteHeight="32">
|
||||||
|
<Animation name="IdleDown" frameCount="6"></Animation>
|
||||||
|
<Animation name="IdleRight" frameCount="6"></Animation>
|
||||||
|
<Animation name="IdleUp" frameCount="6"></Animation>
|
||||||
|
<Animation name="WalkDown" frameCount="6"></Animation>
|
||||||
|
<Animation name="WalkRight" frameCount="6"></Animation>
|
||||||
|
<Animation name="WalkUp" frameCount="6"></Animation>
|
||||||
|
<Animation name="AttackDown" frameCount="4"></Animation>
|
||||||
|
<Animation name="AttackRight" frameCount="4"></Animation>
|
||||||
|
<Animation name="AttackUp" frameCount="4"></Animation>
|
||||||
|
<Animation name="Die" frameCount="4"></Animation>
|
||||||
|
</SpriteSheet>
|
||||||
|
|
||||||
|
<TileSheet name="TileSheet_MiddlePath" path="Cute_Fantasy_Free/Tiles/Path_Middle.png" tileWidth="16" tileHeight="16"></TileSheet>
|
||||||
|
<TileSheet name="TileSheet_MiddleWater" path="Cute_Fantasy_Free/Tiles/Water_Middle.png" tileWidth="16" tileHeight="16"></TileSheet>
|
||||||
|
<TileSheet name="TileSheet_MiddleGrass" path="Cute_Fantasy_Free/Tiles/Grass_Middle.png" tileWidth="16" tileHeight="16"></TileSheet>
|
||||||
|
<TileSheet name="TileSheet_Path" path="Cute_Fantasy_Free/Tiles/Path_Tile.png" tileWidth="16" tileHeight="16"></TileSheet>
|
||||||
|
<TileSheet name="TileSheet_Water" path="Cute_Fantasy_Free/Tiles/Water_Tile.png" tileWidth="16" tileHeight="16"></TileSheet>
|
||||||
|
<TileSheet name="TileSheet_Beach" path="Cute_Fantasy_Free/Tiles/Beach_Tile.png" tileWidth="16" tileHeight="16"></TileSheet>
|
||||||
|
<TileSheet name="TileSheet_Cliff" path="Cute_Fantasy_Free/Tiles/Cliff_Tile.png" tileWidth="16" tileHeight="16"></TileSheet>
|
||||||
|
<TileSheet name="TileSheet_FarmLand" path="Cute_Fantasy_Free/Tiles/FarmLand_Tile.png" tileWidth="16" tileHeight="16"></TileSheet>
|
||||||
|
</Entries>
|
||||||
|
</Resources>
|
||||||
32
Samples/RPG/Resources/Scenes/GameMap.xml
Normal file
32
Samples/RPG/Resources/Scenes/GameMap.xml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<Scene name="GameMap">
|
||||||
|
<IAEngine>
|
||||||
|
<EngineVersion>1.0.0</EngineVersion>
|
||||||
|
<EditorVersion>1.0.0</EditorVersion>
|
||||||
|
</IAEngine>
|
||||||
|
|
||||||
|
<Properties>
|
||||||
|
<Extent width="800" height="608"></Extent>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Resources>
|
||||||
|
<Entry name="SpriteSheet_Player"></Entry>
|
||||||
|
<Entry name="TileSheet_MiddlePath"></Entry>
|
||||||
|
<Entry name="TileSheet_MiddleWater"></Entry>
|
||||||
|
<Entry name="TileSheet_MiddleGrass"></Entry>
|
||||||
|
<Entry name="TileSheet_Path"></Entry>
|
||||||
|
<Entry name="TileSheet_Water"></Entry>
|
||||||
|
<Entry name="TileSheet_Beach"></Entry>
|
||||||
|
<Entry name="TileSheet_Cliff"></Entry>
|
||||||
|
<Entry name="TileSheet_FarmLand"></Entry>
|
||||||
|
</Resources>
|
||||||
|
|
||||||
|
<Nodes>
|
||||||
|
|
||||||
|
</Nodes>
|
||||||
|
|
||||||
|
<Grid tileWidth="16" tileHeight="16">
|
||||||
|
<Repeat times="1900">
|
||||||
|
<Cell tileSheet="TileSheet_MiddleGrass" tileX="0" tileY="0" collisionMask="0" colorOverlay="#ffffffff"></Cell>
|
||||||
|
</Repeat>
|
||||||
|
</Grid>
|
||||||
|
</Scene>
|
||||||
@ -22,27 +22,47 @@ namespace ia::iae::rpg
|
|||||||
{
|
{
|
||||||
STATIC GameRequestedConfig EngineConfig{
|
STATIC GameRequestedConfig EngineConfig{
|
||||||
.DesignWidth = 800,
|
.DesignWidth = 800,
|
||||||
.DesignHeight = 600,
|
.DesignHeight = 608,
|
||||||
.WindowWidth = 800,
|
.WindowWidth = 800,
|
||||||
.WindowHeight = 600,
|
.WindowHeight = 608,
|
||||||
};
|
};
|
||||||
return &EngineConfig;
|
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()
|
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});
|
{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()
|
VOID OnTerminate()
|
||||||
{
|
{
|
||||||
|
|
||||||
IAEngine::DestroyResource(g_playerSpriteSheet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID OnDebugDraw()
|
VOID OnDebugDraw()
|
||||||
@ -55,7 +75,7 @@ namespace ia::iae::rpg
|
|||||||
|
|
||||||
VOID OnUpdate(IN FLOAT32 deltaTime)
|
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)
|
VOID OnResize(IN INT32 newWidth, IN INT32 newHeight)
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
set(SRC_FILES
|
set(SRC_FILES
|
||||||
"imp/cpp/IAEngine.cpp"
|
"imp/cpp/IAEngine.cpp"
|
||||||
|
|
||||||
"imp/cpp/EmbeddedResources.cpp"
|
"imp/cpp/Scene.cpp"
|
||||||
|
|
||||||
"imp/cpp/Renderer.cpp"
|
"imp/cpp/Renderer.cpp"
|
||||||
|
"imp/cpp/GameData.cpp"
|
||||||
|
"imp/cpp/EmbeddedResources.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(IAEngine STATIC ${SRC_FILES})
|
add_library(IAEngine STATIC ${SRC_FILES})
|
||||||
|
|||||||
57
Src/IAEngine/imp/cpp/GameData.cpp
Normal file
57
Src/IAEngine/imp/cpp/GameData.cpp
Normal file
@ -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 <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include <GameData.hpp>
|
||||||
|
#include <IAEngine/IAEngine.hpp>
|
||||||
|
|
||||||
|
#include <pugixml.hpp>
|
||||||
|
|
||||||
|
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<Scene> GameData::GetEntryScene()
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
} // namespace ia::iae
|
||||||
@ -17,6 +17,7 @@
|
|||||||
#include <EmbeddedResources.hpp>
|
#include <EmbeddedResources.hpp>
|
||||||
#include <IAEngine/LibInterface.hpp>
|
#include <IAEngine/LibInterface.hpp>
|
||||||
#include <Renderer.hpp>
|
#include <Renderer.hpp>
|
||||||
|
#include <GameData.hpp>
|
||||||
|
|
||||||
#define STB_IMAGE_IMPLEMENTATION
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
#include <Vendor/stb/stb_image.h>
|
#include <Vendor/stb/stb_image.h>
|
||||||
@ -47,7 +48,9 @@ namespace ia::iae
|
|||||||
Vector<INT32> FrameCounts;
|
Vector<INT32> FrameCounts;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
RefPtr<Scene> g_activeScene;
|
||||||
Vector<Resource *> g_resources;
|
Vector<Resource *> g_resources;
|
||||||
|
Map<String, Handle> g_resourceNames;
|
||||||
} // namespace ia::iae
|
} // namespace ia::iae
|
||||||
|
|
||||||
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,
|
INT32 Run(IN CONST String &name, IN CONST String &packageName, IN CONST String &developerName,
|
||||||
IN CONST String &publisherName, IN IA_VERSION_TYPE version)
|
IN CONST String &publisherName, IN IA_VERSION_TYPE version)
|
||||||
{
|
{
|
||||||
|
INT32 frameCounter{0};
|
||||||
|
|
||||||
g_gameName = name;
|
g_gameName = name;
|
||||||
g_gameVersion = version;
|
g_gameVersion = version;
|
||||||
g_gamePackageName = packageName;
|
g_gamePackageName = packageName;
|
||||||
@ -111,6 +116,16 @@ namespace ia::iae
|
|||||||
break;
|
break;
|
||||||
IAEngine::ProcessEvent(&event);
|
IAEngine::ProcessEvent(&event);
|
||||||
IAEngine::Update();
|
IAEngine::Update();
|
||||||
|
|
||||||
|
frameCounter++;
|
||||||
|
if (frameCounter >= 60)
|
||||||
|
{
|
||||||
|
frameCounter = 0;
|
||||||
|
IAEngine::FixedUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
IAEngine::Draw();
|
||||||
|
IAEngine::DebugDraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
IAEngine::Terminate();
|
IAEngine::Terminate();
|
||||||
@ -131,6 +146,10 @@ namespace ia::iae
|
|||||||
{
|
{
|
||||||
Renderer::Initialize(IVec2{g_designViewport.x, g_designViewport.y});
|
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();
|
Game_OnInitialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,16 +157,38 @@ namespace ia::iae
|
|||||||
{
|
{
|
||||||
Game_OnTerminate();
|
Game_OnTerminate();
|
||||||
|
|
||||||
|
GameData::Terminate();
|
||||||
|
|
||||||
Renderer::Terminate();
|
Renderer::Terminate();
|
||||||
|
|
||||||
for (SIZE_T i = 0; i < g_resources.size(); i++)
|
for (SIZE_T i = 0; i < g_resources.size(); i++)
|
||||||
DestroyResource(i);
|
DestroyResource(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID IAEngine::Draw()
|
||||||
|
{
|
||||||
|
g_activeScene->OnDraw();
|
||||||
|
Renderer::Draw();
|
||||||
|
}
|
||||||
|
|
||||||
VOID IAEngine::Update()
|
VOID IAEngine::Update()
|
||||||
{
|
{
|
||||||
Game_OnUpdate(0.0f);
|
FLOAT32 deltaTime = 0;
|
||||||
Renderer::Update();
|
|
||||||
|
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)
|
VOID IAEngine::ProcessEvent(IN PVOID _event)
|
||||||
@ -174,7 +215,7 @@ namespace ia::iae
|
|||||||
t->Type = Resource::EType::TEXTURE;
|
t->Type = Resource::EType::TEXTURE;
|
||||||
t->Texture = CreateTextureFromFile(path.c_str());
|
t->Texture = CreateTextureFromFile(path.c_str());
|
||||||
g_resources.pushBack(t);
|
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)
|
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->Type = Resource::EType::TEXTURE;
|
||||||
t->Texture = Renderer::CreateTexture(rgbaData, width, height);
|
t->Texture = Renderer::CreateTexture(rgbaData, width, height);
|
||||||
g_resources.pushBack(t);
|
g_resources.pushBack(t);
|
||||||
return (Handle)g_resources.size() - 1;
|
return (Handle) g_resources.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle IAEngine::CreateSpriteSheet(IN CONST Vector<Vector<Handle>> &animations)
|
Handle IAEngine::CreateSpriteSheet(IN CONST Vector<Vector<Handle>> &animations)
|
||||||
@ -200,7 +241,7 @@ namespace ia::iae
|
|||||||
t->FrameCounts = frameCounts;
|
t->FrameCounts = frameCounts;
|
||||||
t->Texture = CreateTextureFromFile(path.c_str(), spriteWidth, spriteHeight);
|
t->Texture = CreateTextureFromFile(path.c_str(), spriteWidth, spriteHeight);
|
||||||
g_resources.pushBack(t);
|
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)
|
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->Type = Resource::EType::TEXTURE;
|
||||||
t->Texture = CreateTextureFromFile(path.c_str(), tileWidth, tileHeight);
|
t->Texture = CreateTextureFromFile(path.c_str(), tileWidth, tileHeight);
|
||||||
g_resources.pushBack(t);
|
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,
|
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->Type = Resource::EType::TEXTURE;
|
||||||
t->Texture = Renderer::CreateTexture(rgbaData, width, height, width / tileWidth, height / tileHeight);
|
t->Texture = Renderer::CreateTexture(rgbaData, width, height, width / tileWidth, height / tileHeight);
|
||||||
g_resources.pushBack(t);
|
g_resources.pushBack(t);
|
||||||
return (Handle)g_resources.size() - 1;
|
return (Handle) g_resources.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID IAEngine::DestroyResource(IN Handle resource)
|
VOID IAEngine::DestroyResource(IN Handle resource)
|
||||||
{
|
{
|
||||||
if(!g_resources[resource]) return;
|
if (!g_resources[resource])
|
||||||
|
return;
|
||||||
|
|
||||||
switch (g_resources[resource]->Type)
|
switch (g_resources[resource]->Type)
|
||||||
{
|
{
|
||||||
@ -241,6 +283,20 @@ namespace ia::iae
|
|||||||
}
|
}
|
||||||
delete g_resources[resource];
|
delete g_resources[resource];
|
||||||
g_resources[resource] = nullptr;
|
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<Handle> &resources)
|
VOID IAEngine::LoadResources(IN CONST Vector<Handle> &resources)
|
||||||
@ -273,21 +329,42 @@ namespace ia::iae
|
|||||||
VOID IAEngine::DrawTile(IN Handle tileSheet, IN INT32 tileIndexX, IN INT32 tileIndexY, IN Vec2 position,
|
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)
|
IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset)
|
||||||
{
|
{
|
||||||
const auto t = static_cast<Resource_Texture*>(g_resources[tileSheet]);
|
const auto t = static_cast<Resource_Texture *>(g_resources[tileSheet]);
|
||||||
Renderer::DrawStaticSpriteTopLeft(t->Texture, tileIndexX, tileIndexY, position, scale, rotation, flipH, flipV, uvOffset);
|
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,
|
VOID IAEngine::DrawSprite(IN Handle sprite, IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH,
|
||||||
IN BOOL flipV, IN Vec2 uvOffset)
|
IN BOOL flipV, IN Vec2 uvOffset)
|
||||||
{
|
{
|
||||||
const auto t = static_cast<Resource_Texture*>(g_resources[sprite]);
|
const auto t = static_cast<Resource_Texture *>(g_resources[sprite]);
|
||||||
Renderer::DrawDynamicSpriteTopLeft(t->Texture, 0, 0, position, scale, rotation, flipH, flipV, uvOffset);
|
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,
|
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)
|
IN Vec2 scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN Vec2 uvOffset)
|
||||||
{
|
{
|
||||||
const auto t = static_cast<Resource_SpriteSheet*>(g_resources[spriteSheet]);
|
const auto t = static_cast<Resource_SpriteSheet *>(g_resources[spriteSheet]);
|
||||||
Renderer::DrawDynamicSpriteTopLeft(t->Texture, frameIndex, animationIndex, position, scale, rotation, flipH, flipV, uvOffset);
|
Renderer::DrawDynamicSpriteTopLeft(t->Texture, frameIndex, animationIndex, position, scale, rotation, flipH,
|
||||||
|
flipV, uvOffset);
|
||||||
|
}
|
||||||
|
} // namespace ia::iae
|
||||||
|
|
||||||
|
namespace ia::iae
|
||||||
|
{
|
||||||
|
RefPtr<Scene> IAEngine::GetActiveScene()
|
||||||
|
{
|
||||||
|
return g_activeScene;
|
||||||
|
}
|
||||||
|
|
||||||
|
RefPtr<Scene> IAEngine::CreateScene(IN IVec2 extent)
|
||||||
|
{
|
||||||
|
return MakeRefPtr<Scene>(extent);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID IAEngine::ChangeActiveScene(IN RefPtr<Scene> scene)
|
||||||
|
{
|
||||||
|
g_activeScene = scene;
|
||||||
|
LoadResources(scene->GetReferencedResources());
|
||||||
}
|
}
|
||||||
} // namespace ia::iae
|
} // namespace ia::iae
|
||||||
@ -125,7 +125,7 @@ namespace ia::iae
|
|||||||
SDL_DestroyGPUDevice(g_gpuDevice);
|
SDL_DestroyGPUDevice(g_gpuDevice);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID Renderer::Update()
|
VOID Renderer::Draw()
|
||||||
{
|
{
|
||||||
Render();
|
Render();
|
||||||
}
|
}
|
||||||
@ -197,6 +197,8 @@ namespace ia::iae
|
|||||||
|
|
||||||
VOID Renderer::SetCameraPosition(IN Vec2 position)
|
VOID Renderer::SetCameraPosition(IN Vec2 position)
|
||||||
{
|
{
|
||||||
|
if B_LIKELY (g_cameraPosition == position)
|
||||||
|
return;
|
||||||
g_cameraPosition = position;
|
g_cameraPosition = position;
|
||||||
g_viewMatrix = glm::lookAtLH(glm::vec3{g_cameraPosition, -1.0f}, {g_cameraPosition, 0.0f}, {0.0f, 1.0f, 0.0f});
|
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
|
namespace ia::iae
|
||||||
{
|
{
|
||||||
Vec2 Renderer::DrawStaticSpriteTopLeft(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY,
|
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};
|
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});
|
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::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||||
transform = glm::scale(transform, glm::vec3(_s, 1.0f));
|
transform = glm::scale(transform, glm::vec3(_s, 1.0f));
|
||||||
g_staticSprites.pushBack({.Transform = transform,
|
g_staticSprites.pushBack(
|
||||||
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset),
|
{.Transform = transform,
|
||||||
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
|
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset),
|
||||||
|
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
|
||||||
return _s;
|
return _s;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2 Renderer::DrawStaticSpriteCentered(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY,
|
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};
|
const auto _s = Vec2{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight};
|
||||||
Mat4 transform =
|
Mat4 transform =
|
||||||
glm::translate(glm::mat4(1.0f), glm::vec3{position.x - _s.x / 2.0f, position.y - _s.y / 2.0f, 0});
|
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::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||||
transform = glm::scale(transform, glm::vec3(_s, 1.0f));
|
transform = glm::scale(transform, glm::vec3(_s, 1.0f));
|
||||||
g_staticSprites.pushBack({.Transform = transform,
|
g_staticSprites.pushBack(
|
||||||
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset),
|
{.Transform = transform,
|
||||||
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
|
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset),
|
||||||
|
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
|
||||||
return _s;
|
return _s;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2 Renderer::DrawDynamicSpriteTopLeft(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY,
|
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};
|
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});
|
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::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||||
transform = glm::scale(transform, glm::vec3{_s, 1.0f});
|
transform = glm::scale(transform, glm::vec3{_s, 1.0f});
|
||||||
g_dynamicSprites.pushBack({.Transform = transform,
|
g_dynamicSprites.pushBack(
|
||||||
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset),
|
{.Transform = transform,
|
||||||
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
|
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset),
|
||||||
|
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
|
||||||
return _s;
|
return _s;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2 Renderer::DrawDynamicSpriteCentered(IN Handle texture, IN INT32 tileIndexX, IN INT32 tileIndexY,
|
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};
|
const auto _s = Vec2{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight};
|
||||||
Mat4 transform =
|
Mat4 transform =
|
||||||
glm::translate(glm::mat4(1.0f), glm::vec3{position.x - _s.x / 2.0f, position.y - _s.y / 2.0f, 0});
|
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::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||||
transform = glm::scale(transform, glm::vec3{_s, 1.0f});
|
transform = glm::scale(transform, glm::vec3{_s, 1.0f});
|
||||||
g_dynamicSprites.pushBack({.Transform = transform,
|
g_dynamicSprites.pushBack(
|
||||||
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset),
|
{.Transform = transform,
|
||||||
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
|
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndexX, tileIndexY, flipH, flipV, uvOffset),
|
||||||
|
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
|
||||||
return _s;
|
return _s;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,6 +328,9 @@ namespace ia::iae
|
|||||||
|
|
||||||
VOID Renderer::BakeTextureAtlas(IN CONST Vector<Handle> textures)
|
VOID Renderer::BakeTextureAtlas(IN CONST Vector<Handle> textures)
|
||||||
{
|
{
|
||||||
|
if (textures.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
if (g_activeTextureAtlas && (g_activeTextureAtlas != g_defaultTexture))
|
if (g_activeTextureAtlas && (g_activeTextureAtlas != g_defaultTexture))
|
||||||
DestroyTexture(g_activeTextureAtlas);
|
DestroyTexture(g_activeTextureAtlas);
|
||||||
|
|
||||||
@ -352,20 +365,21 @@ namespace ia::iae
|
|||||||
delete[] pixels;
|
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 &d = g_texureData[texture];
|
||||||
const auto &t = g_activeTextureAtlasUVMap[texture];
|
const auto &t = g_activeTextureAtlasUVMap[texture];
|
||||||
const auto pX = ((tileIndexX + uvOffset.x) * ((FLOAT32) d.TileWidth)) * g_activeTextureAtlasInverseSize.x;
|
const auto pX = ((tileIndexX + uvOffset.x) * ((FLOAT32) d.TileWidth)) * g_activeTextureAtlasInverseSize.x;
|
||||||
const auto pY = ((tileIndexY + uvOffset.y) * ((FLOAT32) d.TileHeight)) * g_activeTextureAtlasInverseSize.y;
|
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,
|
auto texCoords = Vec4(t.x + pX, t.y + pY, d.TileWidth * g_activeTextureAtlasInverseSize.x,
|
||||||
d.TileHeight * g_activeTextureAtlasInverseSize.y);
|
d.TileHeight * g_activeTextureAtlasInverseSize.y);
|
||||||
if(flipH)
|
if (flipH)
|
||||||
{
|
{
|
||||||
texCoords.x += texCoords.z;
|
texCoords.x += texCoords.z;
|
||||||
texCoords.z *= -1;
|
texCoords.z *= -1;
|
||||||
}
|
}
|
||||||
if(flipV)
|
if (flipV)
|
||||||
{
|
{
|
||||||
texCoords.y += texCoords.w;
|
texCoords.y += texCoords.w;
|
||||||
texCoords.w *= -1;
|
texCoords.w *= -1;
|
||||||
|
|||||||
59
Src/IAEngine/imp/cpp/Scene.cpp
Normal file
59
Src/IAEngine/imp/cpp/Scene.cpp
Normal file
@ -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 <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include <Renderer.hpp>
|
||||||
|
#include <IAEngine/IAEngine.hpp>
|
||||||
|
|
||||||
|
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
|
||||||
38
Src/IAEngine/imp/hpp/GameData.hpp
Normal file
38
Src/IAEngine/imp/hpp/GameData.hpp
Normal file
@ -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 <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <IAEngine/Scene.hpp>
|
||||||
|
|
||||||
|
namespace ia::iae
|
||||||
|
{
|
||||||
|
class GameData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
STATIC RefPtr<Scene> GetEntryScene();
|
||||||
|
|
||||||
|
private:
|
||||||
|
STATIC BOOL LoadSceneData();
|
||||||
|
STATIC BOOL LoadResourceData();
|
||||||
|
|
||||||
|
private:
|
||||||
|
STATIC VOID Initialize();
|
||||||
|
STATIC VOID Terminate();
|
||||||
|
|
||||||
|
friend class IAEngine;
|
||||||
|
};
|
||||||
|
} // namespace ia::iae
|
||||||
@ -123,7 +123,7 @@ namespace ia::iae
|
|||||||
private:
|
private:
|
||||||
STATIC VOID Initialize(IN IVec2 screenExtent);
|
STATIC VOID Initialize(IN IVec2 screenExtent);
|
||||||
STATIC VOID Terminate();
|
STATIC VOID Terminate();
|
||||||
STATIC VOID Update();
|
STATIC VOID Draw();
|
||||||
|
|
||||||
friend class IAEngine;
|
friend class IAEngine;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <IAEngine/Base.hpp>
|
#include <IAEngine/Scene.hpp>
|
||||||
|
|
||||||
namespace ia::iae
|
namespace ia::iae
|
||||||
{
|
{
|
||||||
@ -35,16 +35,24 @@ namespace ia::iae
|
|||||||
IN INT32 tileHeight);
|
IN INT32 tileHeight);
|
||||||
|
|
||||||
STATIC VOID DestroyResource(IN Handle resource);
|
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<Handle> &resources);
|
STATIC VOID LoadResources(IN CONST Vector<Handle> &resources);
|
||||||
|
|
||||||
|
public:
|
||||||
|
STATIC RefPtr<Scene> GetActiveScene();
|
||||||
|
STATIC RefPtr<Scene> CreateScene(IN IVec2 extent);
|
||||||
|
STATIC VOID ChangeActiveScene(IN RefPtr<Scene> scene);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
STATIC VOID DrawTile(IN Handle tileSheet, IN INT32 tileIndexX, IN INT32 tileIndexY, IN Vec2 position,
|
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 Vec2 scale = {1.0f, 1.0f}, IN FLOAT32 rotation = 0.0f, IN BOOL flipH = false,
|
||||||
IN BOOL flipV = false, IN Vec2 uvOffset = {});
|
IN BOOL flipV = false, IN Vec2 uvOffset = {});
|
||||||
|
|
||||||
STATIC VOID DrawSprite(IN Handle sprite, IN Vec2 position, IN Vec2 scale = {1.0f, 1.0f},
|
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,
|
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 Vec2 scale = {1.0f, 1.0f}, IN FLOAT32 rotation = 0.0f, IN BOOL flipH = false,
|
||||||
IN BOOL flipV = false, IN Vec2 uvOffset = {});
|
IN BOOL flipV = false, IN Vec2 uvOffset = {});
|
||||||
@ -52,10 +60,15 @@ namespace ia::iae
|
|||||||
private:
|
private:
|
||||||
STATIC VOID Initialize();
|
STATIC VOID Initialize();
|
||||||
STATIC VOID Terminate();
|
STATIC VOID Terminate();
|
||||||
|
STATIC VOID Draw();
|
||||||
STATIC VOID Update();
|
STATIC VOID Update();
|
||||||
|
STATIC VOID FixedUpdate();
|
||||||
|
STATIC VOID DebugDraw();
|
||||||
STATIC VOID ProcessEvent(IN PVOID event);
|
STATIC VOID ProcessEvent(IN PVOID event);
|
||||||
|
|
||||||
friend INT32 Run(IN CONST String &name, IN CONST String &packageName, IN CONST String &developerName,
|
friend INT32 Run(IN CONST String &name, IN CONST String &packageName, IN CONST String &developerName,
|
||||||
IN CONST String &publisherName, IN IA_VERSION_TYPE version);
|
IN CONST String &publisherName, IN IA_VERSION_TYPE version);
|
||||||
|
|
||||||
|
friend class Scene;
|
||||||
};
|
};
|
||||||
} // namespace ia::iae
|
} // namespace ia::iae
|
||||||
|
|||||||
77
Src/IAEngine/inc/IAEngine/Scene.hpp
Normal file
77
Src/IAEngine/inc/IAEngine/Scene.hpp
Normal file
@ -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 <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <IAEngine/Base.hpp>
|
||||||
|
|
||||||
|
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<Handle> &GetReferencedResources() CONST;
|
||||||
|
|
||||||
|
private:
|
||||||
|
IVec2 m_gridSize{};
|
||||||
|
CONST IVec2 m_extent;
|
||||||
|
IVec2 m_gridCellSize{};
|
||||||
|
Vec2 m_cameraPosition{};
|
||||||
|
Vector<GridCell> m_gridCells;
|
||||||
|
Vector<Handle> 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<Handle> &Scene::GetReferencedResources() CONST
|
||||||
|
{
|
||||||
|
return m_referencedResources;
|
||||||
|
}
|
||||||
|
} // namespace ia::iae
|
||||||
Reference in New Issue
Block a user