diff --git a/Engine/CMakeLists.txt b/Engine/CMakeLists.txt index fa148d7..1ba0f0b 100644 --- a/Engine/CMakeLists.txt +++ b/Engine/CMakeLists.txt @@ -1,10 +1,11 @@ set(SRC_FILES "Src/Imp/CPP/UI.cpp" "Src/Imp/CPP/Time.cpp" + "Src/Imp/CPP/Utils.cpp" "Src/Imp/CPP/Scene.cpp" "Src/Imp/CPP/Random.cpp" "Src/Imp/CPP/Engine.cpp" - "Src/Imp/CPP/Utils.cpp" + "Src/Imp/CPP/Physics.cpp" "Src/Imp/CPP/InternalEngine.cpp" "Src/Imp/CPP/InputManager.cpp" diff --git a/Engine/Src/Imp/CPP/Components/CameraComponent.cpp b/Engine/Src/Imp/CPP/Components/CameraComponent.cpp index 8ac3930..5d15d69 100644 --- a/Engine/Src/Imp/CPP/Components/CameraComponent.cpp +++ b/Engine/Src/Imp/CPP/Components/CameraComponent.cpp @@ -46,7 +46,7 @@ namespace ia::iae VOID CameraComponent::Update() { - const auto pos = m_node->GetPosition(); + const auto pos = m_node->GetPosition() + m_positionOffset; m_viewMatrix = glm::lookAtLH(glm::vec3{pos, -2.0f}, {pos, 0.0f}, {0.0f, 1.0f, 0.0f}); } diff --git a/Engine/Src/Imp/CPP/Components/PhysicsComponent.cpp b/Engine/Src/Imp/CPP/Components/PhysicsComponent.cpp index e69de29..05c857e 100644 --- a/Engine/Src/Imp/CPP/Components/PhysicsComponent.cpp +++ b/Engine/Src/Imp/CPP/Components/PhysicsComponent.cpp @@ -0,0 +1,83 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include +#include +#include + +namespace ia::iae +{ + PhysicsComponent::PhysicsComponent(IN Node2D *node) : IComponent(node) + { + m_physicsHandle = Physics::RegisterComponent(this); + } + + VOID PhysicsComponent::Draw() + { + } + + VOID PhysicsComponent::DebugDraw() + { + } + + VOID PhysicsComponent::Update() + { + m_velocity = {}; + } + + VOID PhysicsComponent::FixedUpdate() + { + } + + Handle PhysicsComponent::CreateCollider() + { + m_colliders.pushBack({}); + return m_colliders.size() - 1; + } + + Handle PhysicsComponent::AddCollider(IN Collider collider) + { + m_colliders.pushBack(collider); + return m_colliders.size() - 1; + } + + PhysicsComponent::Collider &PhysicsComponent::GetCollider(IN Handle handle) + { + return m_colliders[handle]; + } + + VOID PhysicsComponent::Move(IN glm::vec2 direction) + { + IA_ASSERT(m_isDynamic); + const auto v = direction * m_movementSpeed; + m_velocity += v; + for(const auto& t: m_colliders) + { + if(!Physics::CanMove(m_physicsHandle, t, v)) + return; + } + m_node->SetLocalPosition(m_node->GetLocalPosition() + v); + } + + VOID PhysicsComponent::Jump(IN FLOAT32 force) + { + } + + VOID PhysicsComponent::OnCollision(IN PhysicsComponent *other) + { + } + +} // namespace ia::iae \ No newline at end of file diff --git a/Engine/Src/Imp/CPP/Engine.cpp b/Engine/Src/Imp/CPP/Engine.cpp index bc595f8..d5de7ae 100644 --- a/Engine/Src/Imp/CPP/Engine.cpp +++ b/Engine/Src/Imp/CPP/Engine.cpp @@ -37,6 +37,20 @@ namespace ia::iae #endif } + Direction Engine::GetVectorPointingDirection(IN Vec2 v) + { + STATIC CONSTEXPR Direction DIRECTION_MAP[] = {Direction::RIGHT, Direction::DOWN_RIGHT, Direction::DOWN, Direction::DOWN_LEFT, + Direction::LEFT, Direction::UP_LEFT, Direction::UP, Direction::UP_RIGHT}; + if ((abs(v.x) <= FLOAT32_EPSILON) && (abs(v.y) <= FLOAT32_EPSILON)) + return Direction::NONE; + + auto angle = glm::degrees(atan2(v.y, v.x)); + if (angle < 0) + angle += 360; + + return DIRECTION_MAP[INT32((angle + 22.5) / 45) % 8]; + } + VOID Engine::ResizeDisplay(IN INT32 newWidth, IN INT32 newHeight) { Renderer::WaitForGPUIdle(); diff --git a/Engine/Src/Imp/CPP/InternalEngine.cpp b/Engine/Src/Imp/CPP/InternalEngine.cpp index a2402e5..7fde88e 100644 --- a/Engine/Src/Imp/CPP/InternalEngine.cpp +++ b/Engine/Src/Imp/CPP/InternalEngine.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -64,6 +65,7 @@ namespace ia::iae ResourceManager::Initialize(); WorldManager::Initialize(); UI::Initialize(); + Physics::Initialize(); g_gameFunctions.OnInitialize(); } @@ -72,6 +74,7 @@ namespace ia::iae { g_gameFunctions.OnTerminate(); + Physics::Terminate(); UI::Terminate(); WorldManager::Terminate(); ResourceManager::Terminate(); @@ -90,6 +93,7 @@ namespace ia::iae VOID __Internal_Engine::Iterate() { UI::Update(); + Physics::Update(); WorldManager::Update(); WorldManager::FixedUpdate(); g_gameFunctions.OnUpdate(Time::GetFrameDeltaTime()); diff --git a/Engine/Src/Imp/CPP/Physics.cpp b/Engine/Src/Imp/CPP/Physics.cpp new file mode 100644 index 0000000..b87287c --- /dev/null +++ b/Engine/Src/Imp/CPP/Physics.cpp @@ -0,0 +1,95 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include +#include + +namespace ia::iae +{ + BOOL g_physicsDebugDrawEnabled = false; + + Vector g_physicsComponents; + + VOID Physics::Initialize() + { + } + + VOID Physics::Terminate() + { + } + + VOID Physics::Update() + { + if(Engine::WasInputKeyPressed(InputKey::F6)) + g_physicsDebugDrawEnabled = !g_physicsDebugDrawEnabled; + } + + VOID Physics::DebugDraw() + { + if (!g_physicsDebugDrawEnabled) + return; + + for (const auto &t : g_physicsComponents) + { + for (const auto &c : t->Colliders()) + { + auto color = Color{192, 0, 0, 0xFF}; + if (c.IsTrigger) + color = {64, 96, 192, 192}; + Engine::DebugDraw_SetColor(color); + Engine::DebugDraw_SetStrokeWidth(2); + Engine::DebugDraw_StrokeRect(t->GetNode()->GetPosition() + c.Position - + Engine::GetActiveCamera()->GetNode()->GetPosition(), + c.Size); + } + } + } + + Handle Physics::RegisterComponent(IN PhysicsComponent *component) + { + g_physicsComponents.pushBack(component); + return g_physicsComponents.size() - 1; + } + + BOOL Physics::CanMove(IN Handle handle, IN CONST PhysicsComponent::Collider &collider, IN glm::vec2 movement) + { + const auto comp = g_physicsComponents[handle]; + const auto pos = comp->GetNode()->GetPosition() + movement + collider.Position; + for (const auto &t : g_physicsComponents) + { + if (t == comp) + continue; + for (const auto &tc : t->Colliders()) + { + const auto tPos = t->GetNode()->GetPosition() + tc.Position; + const auto xColliding = ((pos.x + collider.Size.x) >= tPos.x) && ((tPos.x + tc.Size.x) >= pos.x); + const auto yColliding = ((pos.y + collider.Size.y) >= tPos.y) && ((tPos.y + tc.Size.y) >= pos.y); + if (xColliding && yColliding) + { + // Collision callback + comp->OnCollision(t); + t->OnCollision(comp); + + // Overlap block + if (tc.IsTrigger) + continue; + return false; + } + } + } + return true; + } +} // namespace ia::iae \ No newline at end of file diff --git a/Engine/Src/Imp/CPP/Renderer/DebugDraw.cpp b/Engine/Src/Imp/CPP/Renderer/DebugDraw.cpp index 102ad8f..e045deb 100644 --- a/Engine/Src/Imp/CPP/Renderer/DebugDraw.cpp +++ b/Engine/Src/Imp/CPP/Renderer/DebugDraw.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -69,6 +70,7 @@ namespace ia::iae ImGui_ImplSDL3_NewFrame(); ImGui::NewFrame(); + Physics::DebugDraw(); WorldManager::DebugDraw(); g_gameFunctions.OnDebugDraw(); @@ -89,7 +91,7 @@ namespace ia::iae g_debugDrawState.ActiveColor = IM_COL32(color.R, color.G, color.B, color.A); } - VOID Engine::DebugDraw_StrokeWidth(IN FLOAT32 width) + VOID Engine::DebugDraw_SetStrokeWidth(IN FLOAT32 width) { g_debugDrawState.ActiveStrokeWidth = width; } diff --git a/Engine/Src/Imp/CPP/Renderer/Renderer.cpp b/Engine/Src/Imp/CPP/Renderer/Renderer.cpp index 4000ed6..9869cff 100644 --- a/Engine/Src/Imp/CPP/Renderer/Renderer.cpp +++ b/Engine/Src/Imp/CPP/Renderer/Renderer.cpp @@ -239,7 +239,8 @@ namespace ia::iae const auto sceneExtent = activeScene->Extent(); s_state.SceneScaleFactor = {(FLOAT32) newWidth / (FLOAT32) sceneExtent.x, (FLOAT32) newHeight / (FLOAT32) sceneExtent.y}; - IAE_LOG_INFO("Updated Scene Scale Factor: (", s_state.SceneScaleFactor.x, ", ", s_state.SceneScaleFactor.y, ")"); + IAE_LOG_INFO("Updated Scene Scale Factor: (", s_state.SceneScaleFactor.x, ", ", s_state.SceneScaleFactor.y, + ")"); } } @@ -319,6 +320,11 @@ namespace ia::iae Renderer::OnScreenResize(Renderer::s_screenWidth, Renderer::s_screenHeight); } + CameraComponent *Engine::GetActiveCamera() + { + return Renderer::s_state.ActiveCamera; + } + Handle Engine::CreateGeometry(IN CONST Vector &vertices, IN CONST Vector &indices) { return (Handle) Renderer::CreateGeometry(vertices, indices); @@ -379,7 +385,7 @@ namespace ia::iae sortIndex += static_cast(position.y); position *= Renderer::s_state.SceneScaleFactor; - //scale *= Renderer::s_state.SceneScaleFactor; + // scale *= Renderer::s_state.SceneScaleFactor; Renderer::s_state.ModelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, diff --git a/Engine/Src/Imp/CPP/UI.cpp b/Engine/Src/Imp/CPP/UI.cpp index b5d2c4f..30e03af 100644 --- a/Engine/Src/Imp/CPP/UI.cpp +++ b/Engine/Src/Imp/CPP/UI.cpp @@ -52,10 +52,71 @@ namespace ia::iae { } - VOID ProcessEvent(IN Rml::Event &event) + VOID AddClickListener(IN Rml::Element *element, IN std::function callback) { + element->AddEventListener("click", this); + m_clickCallbacks[element->GetId().c_str()] = callback; } + // VOID AddHoverEnterListener(IN PCCHAR elementId, IN std::function callback) + //{ + // m_document->GetElementById(elementId)->AddEventListener("mouseover", this); + // m_hoverEnterCallbacks[elementId] = callback; + // } + // + // VOID AddHoverExitListener(IN PCCHAR elementId, IN std::function callback) + //{ + // m_document->GetElementById(elementId)->AddEventListener("mouseout", this); + // m_hoverExitCallbacks[elementId] = callback; + //} + // + // VOID AddPointerDownListener(IN PCCHAR elementId, IN std::function callback) + //{ + // m_document->GetElementById(elementId)->AddEventListener("mousedown", this); + // m_pointerDownCallbacks[elementId] = callback; + //} + // + // VOID AddPointerUpListener(IN PCCHAR elementId, IN std::function callback) + //{ + // m_document->GetElementById(elementId)->AddEventListener("mouseup", this); + // m_pointerUpCallbacks[elementId] = callback; + //} + + VOID ProcessEvent(IN Rml::Event &event) + { + switch (event.GetId()) + { + case Rml::EventId::Click: + m_clickCallbacks[event.GetTargetElement()->GetId().c_str()](); + break; + + case Rml::EventId::Mouseover: + m_hoverEnterCallbacks[event.GetTargetElement()->GetId().c_str()](); + break; + + case Rml::EventId::Mouseout: + m_hoverExitCallbacks[event.GetTargetElement()->GetId().c_str()](); + break; + + case Rml::EventId::Mousedown: + m_pointerDownCallbacks[event.GetTargetElement()->GetId().c_str()](); + break; + + case Rml::EventId::Mouseup: + m_pointerUpCallbacks[event.GetTargetElement()->GetId().c_str()](); + break; + + default: + break; + } + } + + private: + Map> m_clickCallbacks; + Map> m_hoverEnterCallbacks; + Map> m_hoverExitCallbacks; + Map> m_pointerDownCallbacks; + Map> m_pointerUpCallbacks; } g_eventListener{}; /* Taken from https://github.com/mikke89/RmlUi/blob/master/Backends/RmlUi_Platform_SDL.cpp */ @@ -396,6 +457,11 @@ namespace ia::iae g_document->SetInnerRML( BuildString("", source, "").c_str()); } + + VOID UI::AddClickEvent(IN PCCHAR elementId, IN std::function callback) + { + g_eventListener.AddClickListener(g_document->GetElementById(elementId), callback); + } } // namespace ia::iae namespace ia::iae diff --git a/Engine/Src/Imp/HPP/Physics.hpp b/Engine/Src/Imp/HPP/Physics.hpp new file mode 100644 index 0000000..0ca67a8 --- /dev/null +++ b/Engine/Src/Imp/HPP/Physics.hpp @@ -0,0 +1,40 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia::iae +{ + class Physics + { + public: + STATIC Handle RegisterComponent(IN PhysicsComponent* component); + + STATIC BOOL CanMove(IN Handle handle, IN CONST PhysicsComponent::Collider& collider, IN glm::vec2 movement); + + private: + STATIC VOID Initialize(); + STATIC VOID Terminate(); + + STATIC VOID Update(); + STATIC VOID DebugDraw(); + + friend class DebugDraw; + friend class __Internal_Engine; + }; +} \ No newline at end of file diff --git a/Engine/Src/Inc/IAEngine/Base.hpp b/Engine/Src/Inc/IAEngine/Base.hpp index 5890c69..edc9052 100644 --- a/Engine/Src/Inc/IAEngine/Base.hpp +++ b/Engine/Src/Inc/IAEngine/Base.hpp @@ -102,6 +102,18 @@ namespace ia::iae Vec4 Color{}; }; + enum class Direction : UINT8 { + NONE = 255, + DOWN = 0, + DOWN_LEFT, + LEFT, + UP_LEFT, + UP, + UP_RIGHT, + RIGHT, + DOWN_RIGHT + }; + struct Color { UINT8 R{0xFF}; diff --git a/Engine/Src/Inc/IAEngine/Components/CameraComponent.hpp b/Engine/Src/Inc/IAEngine/Components/CameraComponent.hpp index 116b865..fe9c044 100644 --- a/Engine/Src/Inc/IAEngine/Components/CameraComponent.hpp +++ b/Engine/Src/Inc/IAEngine/Components/CameraComponent.hpp @@ -35,6 +35,11 @@ namespace ia::iae public: VOID SetViewport(IN INT32 width, IN INT32 height); + Vec2& PositionOffset() + { + return m_positionOffset; + } + Vec4 GetViewport() CONST { return m_viewport; @@ -53,6 +58,7 @@ namespace ia::iae private: Vec4 m_viewport{}; Mat4 m_viewMatrix{1.0f}; + Vec2 m_positionOffset{}; Mat4 m_projectionMatrix{1.0f}; }; } // namespace ia::iae diff --git a/Engine/Src/Inc/IAEngine/Components/PhysicsComponent.hpp b/Engine/Src/Inc/IAEngine/Components/PhysicsComponent.hpp index e69de29..b761d72 100644 --- a/Engine/Src/Inc/IAEngine/Components/PhysicsComponent.hpp +++ b/Engine/Src/Inc/IAEngine/Components/PhysicsComponent.hpp @@ -0,0 +1,83 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia::iae +{ + class PhysicsComponent : public IComponent + { + public: + struct Collider + { + BOOL IsTrigger{false}; + Vec2 Position{}; + Vec2 Size{}; + }; + + public: + PhysicsComponent(IN Node2D *node); + + Handle CreateCollider(); + Handle AddCollider(IN Collider collider); + Collider &GetCollider(IN Handle handle); + + VOID Move(IN glm::vec2 direction); + + VOID Jump(IN FLOAT32 force); + + public: + BOOL &IsDynamic() + { + return m_isDynamic; + } + + FLOAT32 &MovementSpeed() + { + return m_movementSpeed; + } + + Vector &Colliders() + { + return m_colliders; + } + + CONST Vec2 &GetVelocity() CONST + { + return m_velocity; + } + + private: + Vec2 m_velocity{}; + BOOL m_isDynamic{false}; + Vector m_colliders; + FLOAT32 m_movementSpeed{1.0f}; + Handle m_physicsHandle{INVALID_HANDLE}; + + VOID OnCollision(IN PhysicsComponent *other); + + friend class Physics; + + public: + VIRTUAL VOID Draw(); + VIRTUAL VOID DebugDraw(); + + VIRTUAL VOID Update(); + VIRTUAL VOID FixedUpdate(); + }; +} // namespace ia::iae \ No newline at end of file diff --git a/Engine/Src/Inc/IAEngine/Engine.hpp b/Engine/Src/Inc/IAEngine/Engine.hpp index 990d547..7a2c157 100644 --- a/Engine/Src/Inc/IAEngine/Engine.hpp +++ b/Engine/Src/Inc/IAEngine/Engine.hpp @@ -24,8 +24,8 @@ #include #include -#include #include +#include #include namespace ia::iae @@ -34,103 +34,104 @@ namespace ia::iae { public: // Event Functions - STATIC Handle CreateEvent(IN CONST String &name); - STATIC VOID DestroyEvent(IN Handle event); - STATIC Handle GetEventByName(IN CONST String &name); - STATIC VOID AddEventListener(IN Handle event, IN std::function callback); - STATIC VOID AddEventListener(IN CONST String &eventName, IN std::function callback); - STATIC VOID BroadcastEvent(IN Handle event); - STATIC VOID BroadcastEvent(IN CONST String &eventName); + STATIC Handle CreateEvent(IN CONST String &name); + STATIC VOID DestroyEvent(IN Handle event); + STATIC Handle GetEventByName(IN CONST String &name); + STATIC VOID AddEventListener(IN Handle event, IN std::function callback); + STATIC VOID AddEventListener(IN CONST String &eventName, IN std::function callback); + STATIC VOID BroadcastEvent(IN Handle event); + STATIC VOID BroadcastEvent(IN CONST String &eventName); // Renderer Functions - STATIC Handle GetGeometry_Quad(); - STATIC Handle CreateGeometry(IN CONST Vector &vertices, - IN CONST Vector &indices); - STATIC VOID DestroyGeometry(IN Handle geometry); - STATIC VOID DrawGeometry(IN Handle handle); - STATIC IVec2 GetDisplayExtent(); - STATIC VOID ResizeDisplay(IN INT32 newWidth, IN INT32 newHeight); + STATIC Handle GetGeometry_Quad(); + STATIC Handle CreateGeometry(IN CONST Vector &vertices, IN CONST Vector &indices); + STATIC VOID DestroyGeometry(IN Handle geometry); + STATIC VOID DrawGeometry(IN Handle handle); + STATIC IVec2 GetDisplayExtent(); + STATIC VOID ResizeDisplay(IN INT32 newWidth, IN INT32 newHeight); // Renderer State Functions - STATIC VOID SetRenderState_Scissor(IN IVec4 rect); - STATIC VOID SetRenderState_FlippedH(IN BOOL value); - STATIC VOID SetRenderState_FlippedV(IN BOOL value); - STATIC VOID SetRenderState_TextureOffset(IN Vec2 off); - STATIC VOID SetRenderState_YSortingEnabled(IN BOOL value); - STATIC VOID SetRenderState_ColorOverlay(IN Color color); - STATIC VOID SetRenderState_CameraRelative(IN BOOL value); - STATIC VOID SetRenderState_Texture(IN Handle image); - STATIC VOID SetRenderState_Transform(IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, - IN UINT8 layer, IN INT16 sortIndex); + STATIC VOID SetRenderState_Scissor(IN IVec4 rect); + STATIC VOID SetRenderState_FlippedH(IN BOOL value); + STATIC VOID SetRenderState_FlippedV(IN BOOL value); + STATIC VOID SetRenderState_TextureOffset(IN Vec2 off); + STATIC VOID SetRenderState_YSortingEnabled(IN BOOL value); + STATIC VOID SetRenderState_ColorOverlay(IN Color color); + STATIC VOID SetRenderState_CameraRelative(IN BOOL value); + STATIC VOID SetRenderState_Texture(IN Handle image); + STATIC VOID SetRenderState_Transform(IN Vec2 position, IN Vec2 scale, IN FLOAT32 rotation, IN UINT8 layer, + IN INT16 sortIndex); // Debug Draw Functions - STATIC VOID DebugDraw_SetColor(IN Color color); - STATIC VOID DebugDraw_StrokeWidth(IN FLOAT32 width); - STATIC VOID DebugDraw_Line(IN Vec2 from, IN Vec2 to); - STATIC VOID DebugDraw_FillRect(IN Vec2 position, IN Vec2 size); - STATIC VOID DebugDraw_StrokeRect(IN Vec2 position, IN Vec2 size); + STATIC VOID DebugDraw_SetColor(IN Color color); + STATIC VOID DebugDraw_SetStrokeWidth(IN FLOAT32 width); + STATIC VOID DebugDraw_Line(IN Vec2 from, IN Vec2 to); + STATIC VOID DebugDraw_FillRect(IN Vec2 position, IN Vec2 size); + STATIC VOID DebugDraw_StrokeRect(IN Vec2 position, IN Vec2 size); // Resource Functions - STATIC Handle CreateSoundFromFile(IN CONST String &name, IN CONST String &path); - STATIC Handle CreateImageFromFile(IN CONST String &name, IN CONST String &path, - IN INT32 resizeToWidth = 0, IN INT32 resizeToHeight = 0); - STATIC Handle CreateImage(IN CONST String &name, IN PCUINT8 encodedData, IN SIZE_T encodedDataSize); - STATIC Handle CreateImage(IN CONST String &name, IN PCUINT8 rgbaData, IN INT32 width, - IN INT32 height); - STATIC Handle CreateSound(IN CONST String &name, IN PCUINT8 encodedData, IN SIZE_T encodedDataSize); - STATIC Handle GetImage(IN CONST String &name); - STATIC Handle GetSound(IN CONST String &name); - STATIC VOID DestroyImage(IN Handle image); - STATIC VOID DestroySound(IN Handle sound); - STATIC IVec2 GetImageExtent(IN Handle image); - STATIC Handle ResizeImage(IN Handle image, IN INT32 newWidth, IN INT32 newHeight); - STATIC Handle ResizeImage(IN CONST String& name, IN INT32 newWidth, IN INT32 newHeight); - STATIC VOID RescaleAllImages(IN FLOAT32 factorX, IN FLOAT32 factorY); - STATIC Handle CombineImages(IN CONST Vector &images, IN INT32 unitWidth, - IN INT32 unitHeight, IN INT32 unitCountX, IN INT32 unitCountY); + STATIC Handle CreateSoundFromFile(IN CONST String &name, IN CONST String &path); + STATIC Handle CreateImageFromFile(IN CONST String &name, IN CONST String &path, IN INT32 resizeToWidth = 0, + IN INT32 resizeToHeight = 0); + STATIC Handle CreateImage(IN CONST String &name, IN PCUINT8 encodedData, IN SIZE_T encodedDataSize); + STATIC Handle CreateImage(IN CONST String &name, IN PCUINT8 rgbaData, IN INT32 width, IN INT32 height); + STATIC Handle CreateSound(IN CONST String &name, IN PCUINT8 encodedData, IN SIZE_T encodedDataSize); + STATIC Handle GetImage(IN CONST String &name); + STATIC Handle GetSound(IN CONST String &name); + STATIC VOID DestroyImage(IN Handle image); + STATIC VOID DestroySound(IN Handle sound); + STATIC IVec2 GetImageExtent(IN Handle image); + STATIC Handle ResizeImage(IN Handle image, IN INT32 newWidth, IN INT32 newHeight); + STATIC Handle ResizeImage(IN CONST String &name, IN INT32 newWidth, IN INT32 newHeight); + STATIC VOID RescaleAllImages(IN FLOAT32 factorX, IN FLOAT32 factorY); + STATIC Handle CombineImages(IN CONST Vector &images, IN INT32 unitWidth, IN INT32 unitHeight, + IN INT32 unitCountX, IN INT32 unitCountY); // Game Functions - STATIC VOID SetTimeScale(IN FLOAT32 scale); - STATIC VOID SetActiveCamera(IN CameraComponent *cameraComponent); + STATIC VOID SetTimeScale(IN FLOAT32 scale); + STATIC VOID SetActiveCamera(IN CameraComponent *cameraComponent); + STATIC CameraComponent *GetActiveCamera(); // Scene Functions - STATIC RefPtr CreateSceneFromFile(IN CONST String &path); - STATIC Scene *GetActiveScene(); - STATIC VOID ChangeActiveScene(IN RefPtr scene); - STATIC VOID AddNodeToActiveScene(IN RefPtr node); - STATIC INode *GetNodeFromActiveScene(IN CONST String &name); - STATIC VOID RemoveNodeFromActiveScene(IN CONST String &name); + STATIC RefPtr CreateSceneFromFile(IN CONST String &path); + STATIC Scene *GetActiveScene(); + STATIC VOID ChangeActiveScene(IN RefPtr scene); + STATIC VOID AddNodeToActiveScene(IN RefPtr node); + STATIC INode *GetNodeFromActiveScene(IN CONST String &name); + STATIC VOID RemoveNodeFromActiveScene(IN CONST String &name); // Input Functions - STATIC Vec2 GetInputAxis(); - STATIC VOID SwitchInputModeToText(); - STATIC VOID SwitchInputModeToAction(); - STATIC Vec2 GetInputPointerPosition(); - STATIC BOOL IsInputKeyDown(IN InputKey key); - STATIC BOOL WasInputKeyPressed(IN InputKey key); - STATIC BOOL WasInputKeyReleased(IN InputKey key); - STATIC BOOL IsInputActionDown(IN Handle action); - STATIC BOOL WasInputActionPressed(IN Handle action); - STATIC BOOL WasInputActionReleased(IN Handle action); - STATIC BOOL IsInputActionDown(IN CONST String &action); - STATIC BOOL WasInputActionPressed(IN CONST String &action); - STATIC BOOL WasInputActionReleased(IN CONST String &action); - STATIC Handle BindInputAction(IN CONST String &name, IN InputKey key); - STATIC VOID BindInputAxis(IN InputKey upKey, IN InputKey downKey, IN InputKey leftKey, - IN InputKey rightKey); + STATIC Vec2 GetInputAxis(); + STATIC VOID SwitchInputModeToText(); + STATIC VOID SwitchInputModeToAction(); + STATIC Vec2 GetInputPointerPosition(); + STATIC BOOL IsInputKeyDown(IN InputKey key); + STATIC BOOL WasInputKeyPressed(IN InputKey key); + STATIC BOOL WasInputKeyReleased(IN InputKey key); + STATIC BOOL IsInputActionDown(IN Handle action); + STATIC BOOL WasInputActionPressed(IN Handle action); + STATIC BOOL WasInputActionReleased(IN Handle action); + STATIC BOOL IsInputActionDown(IN CONST String &action); + STATIC BOOL WasInputActionPressed(IN CONST String &action); + STATIC BOOL WasInputActionReleased(IN CONST String &action); + STATIC Handle BindInputAction(IN CONST String &name, IN InputKey key); + STATIC VOID BindInputAxis(IN InputKey upKey, IN InputKey downKey, IN InputKey leftKey, IN InputKey rightKey); + + // Utility Functions + STATIC Direction GetVectorPointingDirection(IN Vec2 v); // Random Functions - STATIC FLOAT32 GetRandomFloat(); - STATIC INT32 GetRandomInRange(IN INT32 min, IN INT32 max); + STATIC FLOAT32 GetRandomFloat(); + STATIC INT32 GetRandomInRange(IN INT32 min, IN INT32 max); // Time Functions - STATIC INT64 GetTickCount(); - STATIC INT64 GetUnixSecond(); - STATIC INT64 GetUnixMillisecond(); - STATIC FLOAT32 GetFrameDeltaTime(); + STATIC INT64 GetTickCount(); + STATIC INT64 GetUnixSecond(); + STATIC INT64 GetUnixMillisecond(); + STATIC FLOAT32 GetFrameDeltaTime(); // Engine Functions - STATIC BOOL IsDebugMode(); - STATIC String GetUniqueResourceName(); + STATIC BOOL IsDebugMode(); + STATIC String GetUniqueResourceName(); }; } // namespace ia::iae \ No newline at end of file diff --git a/Engine/Src/Inc/IAEngine/Nodes/SpriteObjectNode.hpp b/Engine/Src/Inc/IAEngine/Nodes/SpriteObjectNode.hpp index 0d79a50..a0473c8 100644 --- a/Engine/Src/Inc/IAEngine/Nodes/SpriteObjectNode.hpp +++ b/Engine/Src/Inc/IAEngine/Nodes/SpriteObjectNode.hpp @@ -17,6 +17,7 @@ #pragma once #include +#include namespace ia::iae { diff --git a/Engine/Src/Inc/IAEngine/Nodes/TextureObjectNode.hpp b/Engine/Src/Inc/IAEngine/Nodes/TextureObjectNode.hpp index 3f91a00..a5903a9 100644 --- a/Engine/Src/Inc/IAEngine/Nodes/TextureObjectNode.hpp +++ b/Engine/Src/Inc/IAEngine/Nodes/TextureObjectNode.hpp @@ -17,6 +17,7 @@ #pragma once #include +#include namespace ia::iae { diff --git a/Engine/Src/Inc/IAEngine/UI.hpp b/Engine/Src/Inc/IAEngine/UI.hpp index 9b8ab3b..e84e864 100644 --- a/Engine/Src/Inc/IAEngine/UI.hpp +++ b/Engine/Src/Inc/IAEngine/UI.hpp @@ -22,12 +22,14 @@ namespace ia::iae { class UI { - public: - STATIC VOID AddFontFromFile(IN CONST String& path); - - STATIC VOID SetHTML(IN CONST String& source); + public: + STATIC VOID AddFontFromFile(IN CONST String &path); - public: + STATIC VOID SetHTML(IN CONST String &source); + + STATIC VOID AddClickEvent(IN PCCHAR elementId, IN std::function callback); + + public: STATIC VOID Initialize(); STATIC VOID Terminate(); @@ -35,6 +37,6 @@ namespace ia::iae STATIC VOID Draw(); STATIC VOID OnSDLEvent(IN PVOID event); - STATIC VOID OnScreenResize(IN INT32 newWidth, IN INT32 newHeight); - }; -} \ No newline at end of file + STATIC VOID OnScreenResize(IN INT32 newWidth, IN INT32 newHeight); + }; +} // namespace ia::iae \ No newline at end of file diff --git a/Vendor/IACore b/Vendor/IACore index 5c02010..07638ea 160000 --- a/Vendor/IACore +++ b/Vendor/IACore @@ -1 +1 @@ -Subproject commit 5c02010ae1ec9638f8019a35e65c126ac0a23809 +Subproject commit 07638ea7b3145902cd9ed99c0c358ecab2fe29fe