Made Path follower Component

This commit is contained in:
OusmBlueNinja 2025-05-08 10:15:32 -05:00
parent 31d50d60c3
commit 2a5dc76b35
11 changed files with 1505 additions and 55 deletions

View File

@ -21,9 +21,9 @@ DockId=0x00000018,0
[Window][Scene Tree]
Pos=0,19
Size=388,461
Size=388,579
Collapsed=0
DockId=0x0000001B,0
DockId=0x0000000F,0
[Window][Viewport]
Pos=390,19
@ -43,9 +43,9 @@ DockId=0x00000019,0
[Window][Console]
Pos=390,680
Size=1185,497
Size=880,273
Collapsed=0
DockId=0x00000013,0
DockId=0x0000001B,0
[Window][Tilemap Editor]
Pos=265,19
@ -132,12 +132,12 @@ DockId=0x00000010,0
[Window][Import Preview]
Pos=584,22
Size=536,391
Size=550,1152
Collapsed=0
[Window][Lua Globals]
Pos=0,482
Size=388,116
Pos=1272,680
Size=303,273
Collapsed=0
DockId=0x0000001C,0
@ -153,33 +153,33 @@ Column 1 Width=50
Column 2 Weight=1.0000
[Docking][Data]
DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1920,1158 Split=X
DockNode ID=0x00000005 Parent=0x11111111 SizeRef=989,1158 Split=X
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=388,701 Split=Y Selected=0x12EF0F59
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,637 Split=Y Selected=0x12EF0F59
DockNode ID=0x0000000F Parent=0x00000003 SizeRef=342,579 Split=Y Selected=0x12EF0F59
DockNode ID=0x0000001B Parent=0x0000000F SizeRef=335,461 HiddenTabBar=1 Selected=0x12EF0F59
DockNode ID=0x0000001C Parent=0x0000000F SizeRef=335,116 HiddenTabBar=1 Selected=0x8CFF897F
DockNode ID=0x00000010 Parent=0x00000003 SizeRef=342,577 HiddenTabBar=1 Selected=0x30401527
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=342,519 HiddenTabBar=1 Selected=0x36AF052B
DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1530,701 Split=Y Selected=0xC450F867
DockNode ID=0x00000007 Parent=0x00000002 SizeRef=606,659 Split=X Selected=0xC450F867
DockNode ID=0x00000017 Parent=0x00000007 SizeRef=1161,860 CentralNode=1 HiddenTabBar=1 Selected=0xC450F867
DockNode ID=0x00000018 Parent=0x00000007 SizeRef=367,860 HiddenTabBar=1 Selected=0x36DC96AB
DockNode ID=0x00000008 Parent=0x00000002 SizeRef=606,497 Split=X Selected=0xEA83D666
DockNode ID=0x00000015 Parent=0x00000008 SizeRef=1236,172 Split=X Selected=0xEA83D666
DockNode ID=0x00000011 Parent=0x00000015 SizeRef=1185,168 Split=Y Selected=0x9B5D3198
DockNode ID=0x00000013 Parent=0x00000011 SizeRef=1449,273 HiddenTabBar=1 Selected=0xEA83D666
DockNode ID=0x00000014 Parent=0x00000011 SizeRef=1449,222 HiddenTabBar=1 Selected=0x9B5D3198
DockNode ID=0x00000012 Parent=0x00000015 SizeRef=49,168 HiddenTabBar=1 Selected=0x56009A08
DockNode ID=0x00000016 Parent=0x00000008 SizeRef=292,172 Split=Y Selected=0x3FC1A724
DockNode ID=0x00000019 Parent=0x00000016 SizeRef=314,268 HiddenTabBar=1 Selected=0x3FC1A724
DockNode ID=0x0000001A Parent=0x00000016 SizeRef=314,227 HiddenTabBar=1 Selected=0xA873C17F
DockNode ID=0x00000006 Parent=0x11111111 SizeRef=289,1158 Split=Y Selected=0x36DC96AB
DockNode ID=0x00000009 Parent=0x00000006 SizeRef=449,488 Split=Y Selected=0x36DC96AB
DockNode ID=0x0000000B Parent=0x00000009 SizeRef=449,556 Split=Y Selected=0x36DC96AB
DockNode ID=0x0000000D Parent=0x0000000B SizeRef=449,860 Selected=0x36DC96AB
DockNode ID=0x0000000E Parent=0x0000000B SizeRef=449,296 HiddenTabBar=1 Selected=0x9D7E7171
DockNode ID=0x0000000C Parent=0x00000009 SizeRef=449,143 HiddenTabBar=1 Selected=0xB6C74292
DockNode ID=0x0000000A Parent=0x00000006 SizeRef=449,211 HiddenTabBar=1 Selected=0xD83E5DD3
DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1920,1158 Split=X
DockNode ID=0x00000005 Parent=0x11111111 SizeRef=989,1158 Split=X
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=388,701 Split=Y Selected=0x12EF0F59
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,637 Split=Y Selected=0x12EF0F59
DockNode ID=0x0000000F Parent=0x00000003 SizeRef=342,579 HiddenTabBar=1 Selected=0x12EF0F59
DockNode ID=0x00000010 Parent=0x00000003 SizeRef=342,577 HiddenTabBar=1 Selected=0x30401527
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=342,519 HiddenTabBar=1 Selected=0x36AF052B
DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1530,701 Split=Y Selected=0xC450F867
DockNode ID=0x00000007 Parent=0x00000002 SizeRef=606,659 Split=X Selected=0xC450F867
DockNode ID=0x00000017 Parent=0x00000007 SizeRef=1161,860 CentralNode=1 HiddenTabBar=1 Selected=0xC450F867
DockNode ID=0x00000018 Parent=0x00000007 SizeRef=367,860 HiddenTabBar=1 Selected=0x36DC96AB
DockNode ID=0x00000008 Parent=0x00000002 SizeRef=606,497 Split=X Selected=0xEA83D666
DockNode ID=0x00000015 Parent=0x00000008 SizeRef=1236,172 Split=X Selected=0xEA83D666
DockNode ID=0x00000011 Parent=0x00000015 SizeRef=1185,168 Split=Y Selected=0x9B5D3198
DockNode ID=0x00000013 Parent=0x00000011 SizeRef=1449,273 Split=X Selected=0xEA83D666
DockNode ID=0x0000001B Parent=0x00000013 SizeRef=880,497 HiddenTabBar=1 Selected=0xEA83D666
DockNode ID=0x0000001C Parent=0x00000013 SizeRef=303,497 HiddenTabBar=1 Selected=0x8CFF897F
DockNode ID=0x00000014 Parent=0x00000011 SizeRef=1449,222 HiddenTabBar=1 Selected=0x9B5D3198
DockNode ID=0x00000012 Parent=0x00000015 SizeRef=49,168 HiddenTabBar=1 Selected=0x56009A08
DockNode ID=0x00000016 Parent=0x00000008 SizeRef=292,172 Split=Y Selected=0x3FC1A724
DockNode ID=0x00000019 Parent=0x00000016 SizeRef=314,268 HiddenTabBar=1 Selected=0x3FC1A724
DockNode ID=0x0000001A Parent=0x00000016 SizeRef=314,227 HiddenTabBar=1 Selected=0xA873C17F
DockNode ID=0x00000006 Parent=0x11111111 SizeRef=289,1158 Split=Y Selected=0x36DC96AB
DockNode ID=0x00000009 Parent=0x00000006 SizeRef=449,488 Split=Y Selected=0x36DC96AB
DockNode ID=0x0000000B Parent=0x00000009 SizeRef=449,556 Split=Y Selected=0x36DC96AB
DockNode ID=0x0000000D Parent=0x0000000B SizeRef=449,860 Selected=0x36DC96AB
DockNode ID=0x0000000E Parent=0x0000000B SizeRef=449,296 HiddenTabBar=1 Selected=0x9D7E7171
DockNode ID=0x0000000C Parent=0x00000009 SizeRef=449,143 HiddenTabBar=1 Selected=0xB6C74292
DockNode ID=0x0000000A Parent=0x00000006 SizeRef=449,211 HiddenTabBar=1 Selected=0xD83E5DD3

View File

@ -53,6 +53,7 @@ cxxflags:
- -Wall
- -g
# - -DDISABLE_DEEP_PROFILING
- -DGLM_ENABLE_EXPERIMENTAL
# Auto-detect libraries and headers
auto_libs:

View File

@ -8,6 +8,6 @@
"ssl": "C:\\msys64\\mingw64\\lib\\libssl.a",
"crypto": "C:\\msys64\\mingw64\\lib\\libcrypto.a",
"dbghelp": "C:\\msys64\\mingw64\\lib\\libdbghelp.a",
"imgui": "src\\vendor\\imgui",
"z": "C:\\msys64\\mingw64\\lib\\libz.a"
"z": "C:\\msys64\\mingw64\\lib\\libz.a",
"imgui": "src\\vendor\\imgui"
}

View File

@ -1,2 +1,3 @@
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -Isrc\vendor\imgui -IC:\msys64\mingw64\lib\libyaml-cpp.a -MMD -MP -c src\src\Engine.cpp -o src\build\Engine.o
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.o src\build\Components\AudioPlayerComponent.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ParticleComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\core\audio\AudioEngine.o src\build\core\functions\Prefab.o src\build\core\functions\ScenePacker.o src\build\core\scripts\LuaGlobalBridge.o src\build\core\scripts\ScriptCore.o src\build\core\utils\AssetManager.o src\build\core\utils\EngineConfig.o src\build\core\utils\ExceptionHandler.o src\build\core\utils\FileDialog.o src\build\core\utils\input.o src\build\core\utils\LoadingWindow.o src\build\core\utils\Logging.o src\build\core\utils\Popup.o src\build\core\utils\Profiler.o src\build\core\utils\Texture.o src\build\core\utils\utils.o src\build\editor\windows\AssetBrowser.o src\build\editor\windows\AudioInfo.o src\build\editor\windows\Inspector.o src\build\editor\windows\LuaGlobals.o src\build\Entitys\Object.o src\build\utils\GameObjectsList.o src\build\utils\Shader.o src\build\utils\UID.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o src\build\xxhash.o src\build\miniaudio.o src\build\ImGuizmo.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto -ldbghelp -lz
[COMPILE] g++ -std=c++20 -Wall -g -DGLM_ENABLE_EXPERIMENTAL -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -Isrc\vendor\imgui -IC:\msys64\mingw64\lib\libyaml-cpp.a -MMD -MP -c src\src\Components\PathFollowerComponent.cpp -o src\build\Components\PathFollowerComponent.o
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.o src\build\Components\AudioPlayerComponent.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ParticleComponent.o src\build\Components\PathFollowerComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\core\audio\AudioEngine.o src\build\core\functions\Prefab.o src\build\core\functions\ScenePacker.o src\build\core\scripts\LuaGlobalBridge.o src\build\core\scripts\ScriptCore.o src\build\core\utils\AssetManager.o src\build\core\utils\EngineConfig.o src\build\core\utils\ExceptionHandler.o src\build\core\utils\FileDialog.o src\build\core\utils\input.o src\build\core\utils\LoadingWindow.o src\build\core\utils\Logging.o src\build\core\utils\Popup.o src\build\core\utils\Profiler.o src\build\core\utils\Texture.o src\build\core\utils\utils.o src\build\editor\windows\AssetBrowser.o src\build\editor\windows\AudioInfo.o src\build\editor\windows\Inspector.o src\build\editor\windows\LuaGlobals.o src\build\Entitys\Object.o src\build\utils\GameObjectsList.o src\build\utils\Shader.o src\build\utils\UID.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o src\build\xxhash.o src\build\miniaudio.o src\build\ImGuizmo.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto -ldbghelp -lz
[RUN] Executed app.exe successfully.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,135 @@
#include "PathFollowerComponent.h"
#include "../Renderer.h"
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/glm.hpp>
#include <glm/gtx/vector_angle.hpp>
#include <cmath>
#include "../Entitys/Object.h"
#include "../core/utils/ExceptionHandler.h"
using core::types::Vec2;
PathFollowerComponent::PathFollowerComponent(Object* owner)
: Component(owner) {}
void PathFollowerComponent::AddTarget(const Vec2& point)
{
m_targets.push_back(point);
}
void PathFollowerComponent::ClearPath()
{
m_targets.clear();
m_currentTarget = 0;
}
float PathFollowerComponent::Ease(float t) const
{
switch (m_easing)
{
case EasingFunction::EaseInOut: return t * t * (3 - 2 * t);
case EasingFunction::EaseOutCubic: return 1 - std::pow(1 - t, 3);
default: return t;
}
}
float PathFollowerComponent::GetCornerSharpness(const Vec2& a, const Vec2& b, const Vec2& c) const
{
glm::vec2 d1 = glm::normalize(glm::vec2(b - a));
glm::vec2 d2 = glm::normalize(glm::vec2(c - b));
float angle = glm::degrees(glm::angle(d1, d2));
return glm::clamp(angle / 180.0f, 0.1f, 1.0f);
}
void PathFollowerComponent::Update(float dt)
{
if (m_targets.empty()) return;
if (!m_initialized)
{
m_currentPosition = owner->GetLocalPosition();
m_initialized = true;
}
Vec2 target = m_targets[m_currentTarget];
Vec2 delta = target - m_currentPosition;
float dist = delta.Length();
if (dist < 1.0f)
{
m_currentTarget++;
if (m_currentTarget >= m_targets.size())
{
m_currentTarget = 0;
}
return;
}
Vec2 direction = delta.Normalized();
float slowdownFactor = 1.0f;
if (m_currentTarget > 0 && m_currentTarget < m_targets.size() - 1)
{
slowdownFactor = GetCornerSharpness(
m_targets[m_currentTarget - 1],
m_targets[m_currentTarget],
m_targets[m_currentTarget + 1]
);
}
float easedSpeed = Ease(slowdownFactor) * m_speed;
m_currentPosition += direction * easedSpeed * dt;
owner->SetLocalPosition(m_currentPosition);
}
void PathFollowerComponent::Save(YAML::Emitter& out) const
{
out << YAML::BeginMap;
out << YAML::Key << "type" << YAML::Value << GetName();
out << YAML::Key << "speed" << YAML::Value << m_speed;
out << YAML::Key << "easing" << YAML::Value << static_cast<int>(m_easing);
out << YAML::Key << "targets" << YAML::Value << YAML::BeginSeq;
for (const auto& pt : m_targets)
{
out << YAML::BeginMap;
out << YAML::Key << "x" << YAML::Value << pt.x;
out << YAML::Key << "y" << YAML::Value << pt.y;
out << YAML::EndMap;
}
out << YAML::EndSeq;
out << YAML::EndMap;
}
void PathFollowerComponent::Load(const YAML::Node& node)
{
try
{
m_speed = node["speed"] ? node["speed"].as<float>() : 100.0f;
m_easing = node["easing"] ? static_cast<EasingFunction>(node["easing"].as<int>()) : EasingFunction::Linear;
m_targets.clear();
if (node["targets"])
{
for (const auto& pt : node["targets"])
{
float x = pt["x"] ? pt["x"].as<float>() : 0.0f;
float y = pt["y"] ? pt["y"].as<float>() : 0.0f;
m_targets.emplace_back(x, y);
}
}
m_currentTarget = 0;
m_initialized = false;
}
catch (const std::exception& e)
{
RecoverableError("Failed to load PathFollowerComponent: " + std::string(e.what()), Create::Exceptions::ComponentLoad).Handle();
}
}

View File

@ -0,0 +1,53 @@
#pragma once
#include "Component.h"
#include "../core/types/vec2.h"
#include "../core/types/color.h"
#include <vector>
enum class EasingFunction
{
Linear,
EaseInOut,
EaseOutCubic
};
class PathFollowerComponent : public Component
{
public:
PathFollowerComponent(Object *owner);
void Update(float dt);
void AddTarget(const core::types::Vec2 &point);
void ClearPath();
void Save(YAML::Emitter &out) const override;
void Load(const YAML::Node &node) override;
std::string GetName() const override { return "PathFollowerComponent"; }
float GetSpeed() const { return m_speed; }
void SetSpeed(float s) { m_speed = s; }
EasingFunction GetEasing() const { return m_easing; }
void SetEasing(EasingFunction easing) { m_easing = easing; }
std::vector<core::types::Vec2> &GetTargets() { return m_targets; }
void RemoveTarget(size_t index)
{
if (index < m_targets.size())
m_targets.erase(m_targets.begin() + index);
}
private:
std::vector<core::types::Vec2> m_targets;
size_t m_currentTarget = 0;
float m_speed = 100.0f;
EasingFunction m_easing = EasingFunction::Linear;
core::types::Vec2 m_currentPosition;
bool m_initialized = false;
float Ease(float t) const;
float GetCornerSharpness(const core::types::Vec2 &a, const core::types::Vec2 &b, const core::types::Vec2 &c) const;
};

View File

@ -9,6 +9,7 @@
#include "components/PhysicsComponent.h"
#include "components/ParticleComponent.h"
#include "components/AnimationComponent.h"
#include "components/PathFollowerComponent.h"
#include "core/utils/FileDialog.h"
#include "core/utils/Logging.h"
@ -586,6 +587,7 @@ void Engine::Init()
m_physicsUpdates.reserve(512); // 256-512 physics bodies/entities with Box2D
m_particleUpdates.reserve(24); // ~1K particle systems active is fair in effects-heavy scenes
m_animationsUpdates.reserve(512); // ~500 animated objects (characters, FX, etc.)
m_PathUpdates.reserve(16);
Logger::LogOk("Engine Core");
}
@ -606,6 +608,7 @@ void Engine::collectObjects(bool playing, const glm::vec2 &camPos, float camZoom
m_collectStack.clear();
m_physicsUpdates.clear();
m_particleUpdates.clear();
m_PathUpdates.clear();
const glm::vec2 screenSize = glm::vec2(Renderer::GetSize());
@ -649,6 +652,9 @@ void Engine::collectObjects(bool playing, const glm::vec2 &camPos, float camZoom
if (auto *particle = raw->GetComponent<ParticleComponent>().get())
m_particleUpdates.push_back(particle);
if (auto *follower = raw->GetComponent<PathFollowerComponent>().get())
m_PathUpdates.push_back(follower);
if (auto *animator = raw->GetComponent<AnimationComponent>().get())
m_animationsUpdates.push_back(animator);
@ -715,7 +721,6 @@ void Engine::Run()
Logger::Draw();
profiler.EndEngineSection();
{
if (ImGui::BeginPopupModal("ConfirmClearScene", nullptr, ImGuiWindowFlags_AlwaysAutoResize))
{
@ -738,7 +743,6 @@ void Engine::Run()
}
}
profiler.BeginEngineSection("BeginMainMenuBar");
if (ImGui::BeginMainMenuBar())
@ -859,8 +863,6 @@ void Engine::Run()
DrawAudioPlayingList();
DrawImGuiWindow();
{
PROFILE_ENGINE_SCOPE("Engine::DrawSceneTree");
@ -1060,14 +1062,22 @@ void Engine::Run()
}
profiler.BeginSection("Updates");
profiler.BeginSection("Scripts");
if (playing)
{
ScriptCore::CallAllUpdates(deltaTime);
}
profiler.BeginSection("Scripts");
profiler.EndSection();
ScriptCore::CallAllUpdates(deltaTime);
profiler.EndSection();
profiler.BeginSection("Pathing");
for (auto *follower : m_PathUpdates)
{
profiler.BeginSection("Object: " + follower->GetOwner()->GetName());
follower->Update(deltaTime);
profiler.EndSection();
}
profiler.EndSection();
}
profiler.BeginSection("Particles");
for (auto *script : m_particleUpdates)

View File

@ -12,6 +12,7 @@ class PhysicsComponent;
class ParticleComponent;
class AnimationComponent;
class TilemapComponent;
class PathFollowerComponent;
class Engine
{
@ -46,5 +47,7 @@ private:
std::vector<std::shared_ptr<Object>> m_collectStack;
std::vector<PhysicsComponent*> m_physicsUpdates;
std::vector<ParticleComponent*> m_particleUpdates;
std::vector<PathFollowerComponent*> m_PathUpdates;
};

View File

@ -9,6 +9,8 @@
#include "../Components/ParticleComponent.h"
#include "../Components/AnimationComponent.h"
#include "../Components/AudioPlayerComponent.h"
#include "../Components/PathFollowerComponent.h"
#include "../core/utils/Logging.h"
#include "../utils/UID.h"
@ -264,6 +266,8 @@ void Object::Load(const YAML::Node &node)
AddComponent<AnimationComponent>()->Load(compNode);
else if (type == "AudioPlayerComponent")
AddComponent<AudioPlayerComponent>()->Load(compNode);
else if (type == "PathFollowerComponent")
AddComponent<PathFollowerComponent>()->Load(compNode);
else
{
Logger::LogError("Invalid Componenet type '%s' found in component '%s'(%d)", type.c_str(), name.c_str(), uid.id);

View File

@ -10,14 +10,13 @@
#include "../../components/ParticleComponent.h"
#include "../../components/AnimationComponent.h"
#include "../../components/AudioPlayerComponent.h"
#include "../../components/PathFollowerComponent.h"
#include "imgui.h"
#include "imgui_internal.h"
#include <iostream>
void DrawInspectorUI(std::shared_ptr<Object> selected)
{
@ -84,7 +83,8 @@ void DrawInspectorUI(std::shared_ptr<Object> selected)
"Tilemap",
"Particle",
"Animation",
"Audio Player"};
"Audio Player",
"Path Follower"};
static int selectedIndex = -1;
@ -122,7 +122,8 @@ void DrawInspectorUI(std::shared_ptr<Object> selected)
selected->AddComponent<AnimationComponent>();
else if (type == "Audio Player" && !selected->GetComponent<AudioPlayerComponent>())
selected->AddComponent<AudioPlayerComponent>();
else if (type == "Path Follower" && !selected->GetComponent<PathFollowerComponent>())
selected->AddComponent<PathFollowerComponent>();
}
if (auto sprite = selected->GetComponent<SpriteComponent>())
@ -748,17 +749,62 @@ void DrawInspectorUI(std::shared_ptr<Object> selected)
{
audio->SetLooping(loop);
}
// Volume
static float volume = 1.0f;
if (ImGui::SliderFloat("Volume", &volume, 0.0f, 1.0f))
audio->SetVolume(volume);
if (ImGui::Button("Remove AudioPlayerComponent"))
selected->RemoveComponent<AudioPlayerComponent>();
}
if (auto pathfollower = selected->GetComponent<PathFollowerComponent>())
{
ImGui::SeparatorText("PathFollower");
// Speed
float speed = pathfollower->GetSpeed();
if (ImGui::DragFloat("Speed", &speed, 1.0f, 0.0f, 1000.0f))
pathfollower->SetSpeed(speed);
// Easing
const char *easingNames[] = {"Linear", "EaseInOut", "EaseOutCubic"};
int currentEasing = static_cast<int>(pathfollower->GetEasing());
if (ImGui::Combo("Easing", &currentEasing, easingNames, IM_ARRAYSIZE(easingNames)))
pathfollower->SetEasing(static_cast<EasingFunction>(currentEasing));
ImGui::SeparatorText("Path Points");
// Path points
auto &targets = pathfollower->GetTargets(); // Must return a reference!
for (int i = 0; i < static_cast<int>(targets.size()); ++i)
{
ImGui::PushID(i);
core::types::Vec2 &pt = targets[i];
ImGui::DragFloat2("Point", &pt.x, 1.0f);
ImGui::SameLine();
if (ImGui::Button("X"))
{
pathfollower->RemoveTarget(i);
ImGui::PopID();
break;
}
ImGui::PopID();
}
if (ImGui::Button("Add Point"))
{
core::types::Vec2 last = targets.empty() ? core::types::Vec2(0, 0) : targets.back();
pathfollower->AddTarget(last + core::types::Vec2(50.0f, 0.0f));
}
if (ImGui::Button("Remove PathFollowerComponent"))
selected->RemoveComponent<PathFollowerComponent>();
}
ImGui::End();
}