Named Resources

This commit is contained in:
Isuru Samarathunga
2025-11-03 00:39:30 +05:30
parent e4cd9abe52
commit a00fe1a165
12 changed files with 469 additions and 47 deletions

View 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>

View 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>

View File

@ -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)

View File

@ -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})

View 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

View File

@ -17,6 +17,7 @@
#include <EmbeddedResources.hpp>
#include <IAEngine/LibInterface.hpp>
#include <Renderer.hpp>
#include <GameData.hpp>
#define STB_IMAGE_IMPLEMENTATION
#include <Vendor/stb/stb_image.h>
@ -47,7 +48,9 @@ namespace ia::iae
Vector<INT32> FrameCounts;
};
RefPtr<Scene> g_activeScene;
Vector<Resource *> g_resources;
Map<String, Handle> 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<Vector<Handle>> &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<Handle> &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<Resource_Texture*>(g_resources[tileSheet]);
Renderer::DrawStaticSpriteTopLeft(t->Texture, tileIndexX, tileIndexY, position, scale, rotation, flipH, flipV, uvOffset);
const auto t = static_cast<Resource_Texture *>(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<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);
}
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<Resource_SpriteSheet*>(g_resources[spriteSheet]);
Renderer::DrawDynamicSpriteTopLeft(t->Texture, frameIndex, animationIndex, position, scale, rotation, flipH, flipV, uvOffset);
const auto t = static_cast<Resource_SpriteSheet *>(g_resources[spriteSheet]);
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

View File

@ -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<Handle> 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;

View 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

View 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

View File

@ -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;
};

View File

@ -16,7 +16,7 @@
#pragma once
#include <IAEngine/Base.hpp>
#include <IAEngine/Scene.hpp>
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<Handle> &resources);
public:
STATIC RefPtr<Scene> GetActiveScene();
STATIC RefPtr<Scene> CreateScene(IN IVec2 extent);
STATIC VOID ChangeActiveScene(IN RefPtr<Scene> 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

View 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