This commit is contained in:
Isuru Samarathunga
2025-09-23 05:46:12 +05:30
parent 3db1904ba4
commit 1573644c51
7 changed files with 134 additions and 16 deletions

View File

@ -26,7 +26,8 @@ namespace ia::iae
SpriteRendererComponent::AnimationKeyFrame SpriteRendererComponent::GetKeyFrame(IN INT32 index)
{
index %= m_activeAnimation.Keys.size();
return m_reverseAnimation ? m_activeAnimation.Keys[m_activeAnimation.Keys.size() - 1 - index] : m_activeAnimation.Keys[index];
return m_reverseAnimation ? m_activeAnimation.Keys[m_activeAnimation.Keys.size() - 1 - index]
: m_activeAnimation.Keys[index];
}
SpriteRendererComponent::SpriteRendererComponent(IN Node *node) : TextureRendererComponent(node)
@ -44,13 +45,24 @@ namespace ia::iae
VOID SpriteRendererComponent::BakeAnimations()
{
if (m_animations.size())
SetActiveAnimation(0);
ForceSetActiveAnimation(0);
}
VOID SpriteRendererComponent::SetAnimationFrame(IN INT32 animation, IN INT32 frame)
{
m_activeAnimation = {};
m_currentAnimationState = m_animations[animation].Keys[frame];
}
VOID SpriteRendererComponent::SetActiveAnimation(IN Handle animation)
{
if (animation == m_activeAnimationHandle)
return;
ForceSetActiveAnimation(animation);
}
VOID SpriteRendererComponent::ForceSetActiveAnimation(IN Handle animation)
{
IA_RELEASE_ASSERT((animation != INVALID_HANDLE) && (animation < m_animations.size()));
m_prevAnimationKeyFrameIndex = 0;
m_activeAnimation = m_animations[animation];
@ -62,7 +74,8 @@ namespace ia::iae
m_activeAnimationHandle = animation;
CurrentTexture() = m_currentAnimationState.Texture;
m_node->DrawnSize() = m_node->GetScale() * m_currentAnimationState.Texture.GetExtent() * m_currentAnimationState.Scale;
m_node->DrawnSize() =
m_node->GetScale() * m_currentAnimationState.Texture.GetExtent() * m_currentAnimationState.Scale;
}
VOID SpriteRendererComponent::Update()
@ -84,7 +97,7 @@ namespace ia::iae
VOID SpriteRendererComponent::UpdateAnimation()
{
const auto keyCount = m_activeAnimation.Keys.size();
if (!keyCount)
if (keyCount <= 1)
return;
if (m_currentAnimationState.ShouldInterpolate)

View File

@ -20,6 +20,8 @@
namespace ia::iae
{
EXTERN SDL_Window *g_windowHandle;
struct InputDirection
{
glm::vec2 Velocity{};
@ -82,4 +84,14 @@ namespace ia::iae
direction = dir.Direction;
return dir.Velocity;
}
VOID Input::StartTextInput()
{
SDL_StartTextInput(g_windowHandle);
}
VOID Input::StopTextInput()
{
SDL_StopTextInput(g_windowHandle);
}
} // namespace ia::iae

View File

@ -175,10 +175,10 @@ namespace ia::iae
g_meshHandleQuad = CreateMesh(
{
{glm::vec3{-1, 1, 0}, glm::vec2{0, 1}, glm::vec4{1.0f, 1.0f, 1.0f, 1.0f}},
{glm::vec3{0, 1, 0}, glm::vec2{0, 1}, glm::vec4{1.0f, 1.0f, 1.0f, 1.0f}},
{glm::vec3{1, 1, 0}, glm::vec2{1, 1}, glm::vec4{1.0f, 1.0f, 1.0f, 1.0f}},
{glm::vec3{1, -1, 0}, glm::vec2{1, 0}, glm::vec4{1.0f, 1.0f, 1.0f, 1.0f}},
{glm::vec3{-1, -1, 0}, glm::vec2{0, 0}, glm::vec4{1.0f, 1.0f, 1.0f, 1.0f}},
{glm::vec3{1, 0, 0}, glm::vec2{1, 0}, glm::vec4{1.0f, 1.0f, 1.0f, 1.0f}},
{glm::vec3{0, 0, 0}, glm::vec2{0, 0}, glm::vec4{1.0f, 1.0f, 1.0f, 1.0f}},
},
{0, 1, 2, 2, 3, 0});

View File

@ -329,6 +329,30 @@ namespace ia::iae
m_clickCallbacks[elementId] = callback;
}
VOID AddHoverEnterListener(IN PCCHAR elementId, IN std::function<VOID()> callback)
{
m_document->GetElementById(elementId)->AddEventListener("mouseover", this);
m_hoverEnterCallbacks[elementId] = callback;
}
VOID AddHoverExitListener(IN PCCHAR elementId, IN std::function<VOID()> callback)
{
m_document->GetElementById(elementId)->AddEventListener("mouseout", this);
m_hoverExitCallbacks[elementId] = callback;
}
VOID AddPointerDownListener(IN PCCHAR elementId, IN std::function<VOID()> callback)
{
m_document->GetElementById(elementId)->AddEventListener("mousedown", this);
m_pointerDownCallbacks[elementId] = callback;
}
VOID AddPointerUpListener(IN PCCHAR elementId, IN std::function<VOID()> callback)
{
m_document->GetElementById(elementId)->AddEventListener("mouseup", this);
m_pointerUpCallbacks[elementId] = callback;
}
VOID ProcessEvent(IN Rml::Event &event)
{
switch (event.GetId())
@ -337,6 +361,22 @@ namespace ia::iae
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;
}
@ -345,6 +385,10 @@ namespace ia::iae
private:
Rml::ElementDocument *CONST m_document;
Map<String, std::function<VOID()>> m_clickCallbacks;
Map<String, std::function<VOID()>> m_hoverEnterCallbacks;
Map<String, std::function<VOID()>> m_hoverExitCallbacks;
Map<String, std::function<VOID()>> m_pointerDownCallbacks;
Map<String, std::function<VOID()>> m_pointerUpCallbacks;
};
} // namespace ia::iae
@ -418,6 +462,9 @@ namespace ia::iae
case SDL_EventType::SDL_EVENT_KEY_UP:
g_context->ProcessKeyUp(SDLKeyToRml(event->key.key), keymods);
break;
case SDL_EventType::SDL_EVENT_TEXT_INPUT:
g_context->ProcessTextInput(Rml::String(&event->text.text[0]));
break;
}
}
@ -466,10 +513,42 @@ namespace ia::iae
g_eventListeners[handle]->AddClickListener(elementId, callback);
}
VOID UI::AddHoverEnterEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback)
{
g_eventListeners[handle]->AddHoverEnterListener(elementId, callback);
}
VOID UI::AddHoverExitEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback)
{
g_eventListeners[handle]->AddHoverExitListener(elementId, callback);
}
VOID UI::AddPointerDownEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback)
{
g_eventListeners[handle]->AddPointerDownListener(elementId, callback);
}
VOID UI::AddPointerUpEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback)
{
g_eventListeners[handle]->AddPointerUpListener(elementId, callback);
}
String UI::GetInputValue(IN INT32 index)
{
return g_mainDataModel.InputValues[index].c_str();
}
VOID UI::SetInputValue(IN INT32 index, IN CONST String &value)
{
g_mainDataModel.InputValues[index] = Rml::String(value.c_str());
}
VOID UI::DestroyWindow(IN Handle handle)
{
const auto w = reinterpret_cast<Rml::ElementDocument *>(handle);
w->Hide();
w->Close();
}
} // namespace ia::iae
namespace ia::iae
@ -496,9 +575,10 @@ namespace ia::iae
Renderer::SetState_CameraRelative(false);
Renderer::SetState_TextureOffset(0, 0);
if (texture)
Renderer::Draw(geometry, g_textures[texture - 1].GetHandle(), {translation.x, translation.y}, {1.0f, 1.0f});
Renderer::Draw(geometry, g_textures[texture - 1].GetHandle(), {translation.x, translation.y}, {1.0f, 1.0f},
0.0f, Renderer::MAX_LAYER_INDEX);
else
Renderer::Draw(geometry, 0, {translation.x, translation.y}, {1.0f, 1.0f});
Renderer::Draw(geometry, 0, {translation.x, translation.y}, {1.0f, 1.0f}, 0.0f, Renderer::MAX_LAYER_INDEX);
}
void RmlUIRenderInterface::ReleaseGeometry(Rml::CompiledGeometryHandle geometry)
@ -507,8 +587,7 @@ namespace ia::iae
Rml::TextureHandle RmlUIRenderInterface::LoadTexture(Rml::Vector2i &texture_dimensions, const Rml::String &source)
{
g_textures.pushBack(
Engine::CreateTexture(File::ReadToVector(source.c_str())));
g_textures.pushBack(Engine::CreateTexture(File::ReadToVector(source.c_str())));
return g_textures.size();
}

View File

@ -50,6 +50,9 @@ namespace ia::iae
VOID BakeAnimations();
VOID SetActiveAnimation(IN Handle animation);
VOID ForceSetActiveAnimation(IN Handle animation);
VOID SetAnimationFrame(IN INT32 animation, IN INT32 frame);
public:
Vector<Animation> &Animations()

View File

@ -270,6 +270,9 @@ namespace ia::iae
STATIC VOID Initialize();
STATIC VOID OnEvent(IN PVOID event);
STATIC VOID StartTextInput();
STATIC VOID StopTextInput();
STATIC BOOL IsKeyDown(IN Key key)
{
return s_keys[(UINT8)key];

View File

@ -27,11 +27,19 @@ namespace ia::iae
STATIC Handle AddWindowFromFile(IN CONST String &path);
STATIC VOID DestroyWindow(IN Handle handle);
STATIC VOID ShowWindow(IN Handle handle);
STATIC VOID HideWindow(IN Handle handle);
STATIC String GetInputValue(IN INT32 index);
STATIC VOID SetInputValue(IN INT32 index, IN CONST String& value);
STATIC VOID AddClickEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback);
STATIC VOID AddHoverEnterEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback);
STATIC VOID AddHoverExitEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback);
STATIC VOID AddPointerDownEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback);
STATIC VOID AddPointerUpEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback);
STATIC VOID EnableDebugger();
STATIC VOID DisableDebugger();