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{
|
||||
.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)
|
||||
|
||||
@ -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})
|
||||
|
||||
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 <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
|
||||
@ -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,54 +207,62 @@ 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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,7 +365,8 @@ 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];
|
||||
@ -360,12 +374,12 @@ namespace ia::iae
|
||||
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)
|
||||
if (flipH)
|
||||
{
|
||||
texCoords.x += texCoords.z;
|
||||
texCoords.z *= -1;
|
||||
}
|
||||
if(flipV)
|
||||
if (flipV)
|
||||
{
|
||||
texCoords.y += texCoords.w;
|
||||
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:
|
||||
STATIC VOID Initialize(IN IVec2 screenExtent);
|
||||
STATIC VOID Terminate();
|
||||
STATIC VOID Update();
|
||||
STATIC VOID Draw();
|
||||
|
||||
friend class IAEngine;
|
||||
};
|
||||
|
||||
@ -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
|
||||
|
||||
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