Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
958cbf2
Updated submodules. Fix ImVec2 math operator compilation conflict wit…
TamasPetii Jun 24, 2026
da72e90
Update imgui-node-editor submodule to include math operator fix
TamasPetii Jun 24, 2026
ebae830
Resolved ssao texture compile errors, and imguizmo works!!
TamasPetii Jun 26, 2026
68aea1f
Updated submodules. Fix ImVec2 math operator compilation conflict wit…
TamasPetii Jun 24, 2026
ea25f72
Update imgui-node-editor submodule to include math operator fix
TamasPetii Jun 24, 2026
323b4aa
Resolved ssao texture compile errors, and imguizmo works!!
TamasPetii Jun 26, 2026
bd2f7d2
Merge branch 'feature/update-dependencies' of https://github.com/Tama…
TamasPetii Jun 26, 2026
2fbcdc5
Imgui math operator define disabled.
TamasPetii Jun 26, 2026
c6fda70
Texture hierarchy, viewer graph and properties window and mvi layers …
TamasPetii Jun 26, 2026
7766526
Implemented material workspace, material hierarchy window and propert…
TamasPetii Jun 26, 2026
9e9af7e
Implemented model hierarchy mvi
TamasPetii Jun 29, 2026
d9c53d6
Model properties window
TamasPetii Jun 29, 2026
d62f8f5
Implemented isActive tracking in gpu/cpu-driven geometry and light cu…
TamasPetii Jun 29, 2026
dcbf6eb
Implemented camera, box, sphere, capsule, convex, mesh collider mvi, …
TamasPetii Jun 30, 2026
2076bc0
Resolved async system and manager bugs, resolved image manager image …
TamasPetii Jul 2, 2026
0ce5481
Implemented model and animation component mvi architecture, deleted c…
TamasPetii Jul 2, 2026
b1488b0
Resolved model and material desync bug
TamasPetii Jul 2, 2026
ab693a7
Implemented material override MVI, fixed material override system. Ma…
TamasPetii Jul 2, 2026
02ebdb4
Implemented skysphere rendering
TamasPetii Jul 3, 2026
117db60
Skysphere settings panel implemented
TamasPetii Jul 3, 2026
ffd047b
Implemented query statistics
TamasPetii Jul 3, 2026
58ce7c4
Debug buffer names and texture metadata added to shader texture sampling
TamasPetii Jul 3, 2026
9734942
Gpu bug search, kinda resolved and refactored manager gpu upload
TamasPetii Jul 3, 2026
ab36a04
Global barrier added
TamasPetii Jul 3, 2026
1c6e0fa
Small refactors
TamasPetii Jul 4, 2026
dcf8913
Resolved tangent space normal calculation problems
TamasPetii Jul 4, 2026
e81dd26
Implemented infinite grid post process effect
TamasPetii Jul 7, 2026
dfb4c42
Implemented ortho and orbit camera
TamasPetii Jul 7, 2026
ec59d23
Created material viewport
TamasPetii Jul 7, 2026
aec8add
Material viewport material selection works fine
TamasPetii Jul 7, 2026
7964b6f
Implemented model viewport mvi, and hdr image loader
TamasPetii Jul 8, 2026
cea58d0
Assets download refactor
TamasPetii Jul 8, 2026
fa3fee9
Transform hierarchical fully parallel update work queue graph impleme…
TamasPetii Jul 8, 2026
a09d84c
Tag hierarchical fully parallel update work queue graph implemented
TamasPetii Jul 8, 2026
a69fe70
Material override combo box disabled bc of performance issues
TamasPetii Jul 8, 2026
ac8d361
Resolved tag issues
TamasPetii Jul 8, 2026
09615fc
Direction light instance buffer issues resolved
TamasPetii Jul 8, 2026
4814964
Material sampler refactor
TamasPetii Jul 9, 2026
e92b7ae
Implemented material preview manager and preview texture rendering
TamasPetii Jul 9, 2026
67e493f
Implemented new item card widget and item card container
TamasPetii Jul 9, 2026
ce735be
Texture hierarchy reworked, using modern item card abstraction
TamasPetii Jul 9, 2026
ee03277
Material hierarchy refactored using preview material textures and new…
TamasPetii Jul 9, 2026
fad5ba6
Implemented bloom simulation on preview material textures.
TamasPetii Jul 9, 2026
b9227f1
Model hierarchy refactored to use new item card
TamasPetii Jul 10, 2026
265fbef
Resolved material-image async loading preview dirty state tracking is…
TamasPetii Jul 10, 2026
d09bafc
Model preview texture rendering
TamasPetii Jul 10, 2026
37422f9
Resolved default sync loading preview texture rendering issues
TamasPetii Jul 10, 2026
57fc377
Resolved large model preview viewport display bug
TamasPetii Jul 10, 2026
70c2400
Found and fixed the long-standing hidden GPU memory garbage read bug.…
TamasPetii Jul 12, 2026
6be1dda
Refactored UI view files
TamasPetii Jul 13, 2026
bb58d5c
Updated Readme
TamasPetii Jul 13, 2026
9ad1f65
Updated gitignore
TamasPetii Jul 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ install_manifest.txt
# ==========================================
# Binaries, Intermediates, and Compiled Objects
# ==========================================
Assets/
Binaries/
Intermediates/
[Dd]ebug/
Expand Down
4 changes: 2 additions & 2 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
path = External/ImGuiFileDialog
url = https://github.com/aiekick/ImGuiFileDialog
[submodule "External/imgui-node-editor"]
path = External/imgui-node-editor
url = https://github.com/thedmd/imgui-node-editor.git
path = External/imgui-node-editor
url = https://github.com/TamasPetii/imgui-node-editor
[submodule "External/IconFontCppHeaders"]
path = External/IconFontCppHeaders
url = https://github.com/juliettef/IconFontCppHeaders.git
3 changes: 3 additions & 0 deletions Docs/Images/MaterialWorkspace.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Docs/Images/ModelWorkspace.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Docs/Images/SceneWorkspace.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Docs/Images/TextureWorkspace.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion External/imgui-node-editor
2 changes: 1 addition & 1 deletion External/vcpkg
Submodule vcpkg updated 6076 files
13 changes: 11 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,17 @@ Synapse Engine is a research-oriented real-time rendering engine focusing on eli

The system integrates a segmented data-oriented ECS with a hierarchical GPU culling architecture, modern mesh shader support, and an advanced virtualized shadow map system for directional, spot, and point lights (supporting both CPU and GPU-driven paths). The engine now utilizes an MVI architecture for its tooling and features a robust cross-platform build system using `xmake` for Windows and Linux.

![Synapse Engine Editor UI](Docs/Images/EditorUI.png)
*Synapse Engine running with the integrated ImGui editor, showcasing the MVI architecture.*
![Synapse Engine Scene Workspace](Docs/Images/SceneWorkspace.png)
*Synapse Engine running with the integrated ImGui editor (Scene Workspace), showcasing the MVI architecture.*

![Synapse Engine Model Workspace](Docs/Images/ModelWorkspace.png)
*Model Workspace*

![Synapse Engine Material Workspace](Docs/Images/MaterialWorkspace.png)
*Material Workspace*

![Synapse Engine Texture Workspace](Docs/Images/TextureWorkspace.png)
*Texture Workspace*

## Core Concepts

Expand Down
3 changes: 0 additions & 3 deletions SynapseEngine/Assets/CameraIcon.png

This file was deleted.

3 changes: 0 additions & 3 deletions SynapseEngine/Assets/DirectionLightIcon.png

This file was deleted.

Binary file not shown.
Binary file not shown.
Binary file not shown.
3 changes: 0 additions & 3 deletions SynapseEngine/Assets/Editor/Icons/code.png

This file was deleted.

3 changes: 0 additions & 3 deletions SynapseEngine/Assets/Editor/Icons/folder.png

This file was deleted.

3 changes: 0 additions & 3 deletions SynapseEngine/Assets/Editor/Icons/mp3.png

This file was deleted.

3 changes: 0 additions & 3 deletions SynapseEngine/Assets/Editor/Icons/obj.png

This file was deleted.

3 changes: 0 additions & 3 deletions SynapseEngine/Assets/Editor/Icons/png.png

This file was deleted.

3 changes: 0 additions & 3 deletions SynapseEngine/Assets/Editor/Icons/txt.png

This file was deleted.

3 changes: 0 additions & 3 deletions SynapseEngine/Assets/PointLightIcon.png

This file was deleted.

3 changes: 0 additions & 3 deletions SynapseEngine/Assets/SpotLightIcon.png

This file was deleted.

11 changes: 11 additions & 0 deletions SynapseEngine/Editor/Core/Windows/GlfwWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,4 +160,15 @@ namespace Syn {
void GlfwWindow::SetCallbacks(const WindowCallbacks& callbacks) {
_data.callbacks = callbacks;
}

void GlfwWindow::SetIcon(uint32_t width, uint32_t height, const uint8_t* pixels) {
if (!_window || !pixels) return;

GLFWimage image;
image.width = static_cast<int>(width);
image.height = static_cast<int>(height);
image.pixels = const_cast<unsigned char*>(pixels);

glfwSetWindowIcon(_window, 1, &image);
}
}
2 changes: 1 addition & 1 deletion SynapseEngine/Editor/Core/Windows/GlfwWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace Syn {

void CreateSurface(VkInstance instance, VkSurfaceKHR* surface) override;
void SetCallbacks(const WindowCallbacks& callbacks) override;

void SetIcon(uint32_t width, uint32_t height, const uint8_t* pixels) override;
void* GetNativePointer() const override { return _window; }
private:
void Init(const WindowConfig& config);
Expand Down
2 changes: 1 addition & 1 deletion SynapseEngine/Editor/Core/Windows/Window.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ namespace Syn

virtual void CreateSurface(VkInstance instance, VkSurfaceKHR* surface) = 0;
virtual void SetCallbacks(const WindowCallbacks& callbacks) = 0;

virtual void SetIcon(uint32_t width, uint32_t height, const uint8_t* pixels) = 0;
virtual void* GetNativePointer() const = 0;

static std::unique_ptr<Window> Create(const WindowConfig& config);
Expand Down
38 changes: 38 additions & 0 deletions SynapseEngine/Editor/EditorApi/EditorApiUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,16 @@
#include "Engine/Scene/SceneManager.h"
#include "Engine/Scene/Scene.h"
#include "EditorCore/Types/EntityHandle.h"
#include <type_traits>
#include <concepts>

namespace Syn {

template <typename T>
concept HasStorageCategory = requires(T pool, EntityID entity) {
pool->SetCategory(entity, pool->GetCategory(entity));
};

class EditorApiUtils {
public:
template <typename T, typename Getter, typename ReturnType>
Expand Down Expand Up @@ -44,5 +52,35 @@ namespace Syn {
auto registry = scene->GetRegistry();
return registry && registry->HasComponent<T>(entity);
}


template <typename... Components>
static void CloneEntityComponents(SceneManager* sm, EntityID src, EntityID dst) {
auto scene = sm->GetActiveScene();
if (!scene) return;

auto registry = scene->GetRegistry();
if (!registry) return;

(
[&]() {
auto pool = registry->GetPool<Components>();
if (pool && pool->Has(src)) {

if constexpr (std::is_empty_v<Components>) {
pool->Add(dst);
}
else {
registry->AddComponent<Components>(dst);
registry->GetComponent<Components>(dst) = registry->GetComponent<Components>(src);
}

if constexpr (HasStorageCategory<decltype(pool)>) {
pool->SetCategory(dst, pool->GetCategory(src));
}
}
}(), ...
);
}
};
}
54 changes: 39 additions & 15 deletions SynapseEngine/Editor/EditorApi/EditorContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,49 @@
#include "Impl/SelectionApiImpl.h"
#include "Impl/PointLightApiImpl.h"
#include "Impl/SpotLightApiImpl.h"
#include "Impl/TextureApiImpl.h"
#include "Impl/ModelApiImpl.h"
#include "Impl/CameraApiImpl.h"
#include "Impl/BoxColliderApiImpl.h"
#include "Impl/SphereColliderApiImpl.h"
#include "Impl/CapsuleColliderApiImpl.h"
#include "Impl/ConvexColliderApiImpl.h"
#include "Impl/MeshColliderApiImpl.h"
#include "Impl/RigidBodyApiImpl.h"
#include "Impl/ModelComponentApiImpl.h"
#include "Impl/AnimationApiImpl.h"
#include "Impl/MaterialOverrideApiImpl.h"
#include "Impl/PreviewApiImpl.h"

namespace Syn {
EditorContext::EditorContext(Engine* engine, GuiTextureManager* textureManager) {
SceneManager* sm = engine->GetSceneManager();

_selectionApi = std::make_unique<SelectionApiImpl>(sm);
_tagApi = std::make_unique<TagApiImpl>(sm);
_transformApi = std::make_unique<TransformApiImpl>(sm);
_directionLightApi = std::make_unique<DirectionLightApiImpl>(sm);
_fileSystemApi = std::make_unique<FileSystemApiImpl>();
_hierarchyApi = std::make_unique<HierarchyApiImpl>(sm);
_loggerApi = std::make_unique<LoggerApiImpl>(engine);
_materialApi = std::make_unique<MaterialApiImpl>(engine);
_renderApi = std::make_unique<RenderApiImpl>(engine, textureManager, sm);
_sceneApi = std::make_unique<SceneApiImpl>(sm);
_settingsApi = std::make_unique<SettingsApiImpl>(sm);
_pointLightApi = std::make_unique<PointLightApiImpl>(sm);
_spotLightApi = std::make_unique<SpotLightApiImpl>(sm);
RegisterApi<ISelectionApi, SelectionApiImpl>(sm);
RegisterApi<ITagApi, TagApiImpl>(sm);
RegisterApi<ITransformApi, TransformApiImpl>(sm);
RegisterApi<IDirectionLightApi, DirectionLightApiImpl>(sm);
RegisterApi<IFileSystemApi, FileSystemApiImpl>();
RegisterApi<IHierarchyApi, HierarchyApiImpl>(sm, engine->GetModelManager());
RegisterApi<ILoggerApi, LoggerApiImpl>(engine);
RegisterApi<IMaterialApi, MaterialApiImpl>(engine->GetMaterialManager(), sm);
RegisterApi<IRenderApi, RenderApiImpl>(engine, textureManager, sm);
RegisterApi<ISceneApi, SceneApiImpl>(sm);
RegisterApi<ISettingsApi, SettingsApiImpl>(sm);
RegisterApi<IPointLightApi, PointLightApiImpl>(sm);
RegisterApi<ISpotLightApi, SpotLightApiImpl>(sm);
RegisterApi<ITextureApi, TextureApiImpl>(engine->GetImageManager(), textureManager);
RegisterApi<IModelApi, ModelApiImpl>(engine->GetModelManager(), sm);
RegisterApi<ICameraApi, CameraApiImpl>(sm);
RegisterApi<IBoxColliderApi, BoxColliderApiImpl>(sm);
RegisterApi<ISphereColliderApi, SphereColliderApiImpl>(sm);
RegisterApi<ICapsuleColliderApi, CapsuleColliderApiImpl>(sm);
RegisterApi<IConvexColliderApi, ConvexColliderApiImpl>(sm);
RegisterApi<IMeshColliderApi, MeshColliderApiImpl>(sm);
RegisterApi<IRigidBodyApi, RigidBodyApiImpl>(sm);
RegisterApi<IModelComponentApi, ModelComponentApiImpl>(sm);
RegisterApi<IAnimationApi, AnimationApiImpl>(sm);
RegisterApi<IMaterialOverrideApi, MaterialOverrideApiImpl>(sm);
RegisterApi<IPreviewApi, PreviewApiImpl>(engine->GetPreviewManager(), textureManager, engine->GetImageManager());
}

EditorContext::~EditorContext() = default;
}
60 changes: 33 additions & 27 deletions SynapseEngine/Editor/EditorApi/EditorContext.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
#pragma once
#include <memory>
#include <unordered_map>
#include <typeindex>
#include "Engine/Engine.h"
#include "Editor/Manager/GuiTextureManager.h"

#include "EditorCore/Api/IApi.h"
#include "EditorCore/Api/ISelectionApi.h"
#include "EditorCore/Api/ITagApi.h"
#include "EditorCore/Api/ITransformApi.h"
Expand All @@ -16,39 +19,42 @@
#include "EditorCore/Api/ISettingsApi.h"
#include "EditorCore/Api/IPointLightApi.h"
#include "EditorCore/Api/ISpotLightApi.h"
#include "EditorCore/Api/ITextureApi.h"
#include "EditorCore/Api/IModelApi.h"
#include "EditorCore/Api/ICameraApi.h"
#include "EditorCore/Api/IBoxColliderApi.h"
#include "EditorCore/Api/ISphereColliderApi.h"
#include "EditorCore/Api/ICapsuleColliderApi.h"
#include "EditorCore/Api/IConvexColliderApi.h"
#include "EditorCore/Api/IMeshColliderApi.h"
#include "EditorCore/Api/IRigidBodyApi.h"
#include "EditorCore/Api/IModelComponentApi.h"
#include "EditorCore/Api/IAnimationApi.h"
#include "EditorCore/Api/IMaterialOverrideApi.h"
#include "EditorCore/Api/IPreviewApi.h"

namespace Syn {
class EditorContext {
public:
EditorContext(Engine* engine, GuiTextureManager* textureManager);
~EditorContext();

ISelectionApi* GetSelectionApi() const { return _selectionApi.get(); }
ITagApi* GetTagApi() const { return _tagApi.get(); }
ITransformApi* GetTransformApi() const { return _transformApi.get(); }
IDirectionLightApi* GetDirectionLightApi() const { return _directionLightApi.get(); }
IFileSystemApi* GetFileSystemApi() const { return _fileSystemApi.get(); }
IHierarchyApi* GetHierarchyApi() const { return _hierarchyApi.get(); }
ILoggerApi* GetLoggerApi() const { return _loggerApi.get(); }
IMaterialApi* GetMaterialApi() const { return _materialApi.get(); }
IRenderApi* GetRenderApi() const { return _renderApi.get(); }
ISceneApi* GetSceneApi() const { return _sceneApi.get(); }
ISettingsApi* GetSettingsApi() const { return _settingsApi.get(); }
IPointLightApi* GetPointLightApi() const { return _pointLightApi.get(); }
ISpotLightApi* GetSpotLightApi() const { return _spotLightApi.get(); }
template <typename T>
T* GetApi() const {
auto it = _apis.find(std::type_index(typeid(T)));

if (it != _apis.end()) {
return static_cast<T*>(it->second.get());
}

return nullptr;
}

private:
std::unique_ptr<ISelectionApi> _selectionApi;
std::unique_ptr<ITagApi> _tagApi;
std::unique_ptr<ITransformApi> _transformApi;
std::unique_ptr<IFileSystemApi> _fileSystemApi;
std::unique_ptr<IHierarchyApi> _hierarchyApi;
std::unique_ptr<ILoggerApi> _loggerApi;
std::unique_ptr<IMaterialApi> _materialApi;
std::unique_ptr<IRenderApi> _renderApi;
std::unique_ptr<ISceneApi> _sceneApi;
std::unique_ptr<ISettingsApi> _settingsApi;
std::unique_ptr<IDirectionLightApi> _directionLightApi;
std::unique_ptr<IPointLightApi> _pointLightApi;
std::unique_ptr<ISpotLightApi> _spotLightApi;
template <typename Interface, typename Implementation, typename... Args>
void RegisterApi(Args&&... args) {
_apis[std::type_index(typeid(Interface))] = std::make_unique<Implementation>(std::forward<Args>(args)...);
}

std::unordered_map<std::type_index, std::unique_ptr<IApi>> _apis;
};
}
49 changes: 49 additions & 0 deletions SynapseEngine/Editor/EditorApi/Impl/AnimationApiImpl.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include "AnimationApiImpl.h"
#include "../EditorApiUtils.h"
#include "Engine/Component/Rendering/AnimationComponent.h"
#include "Engine/ServiceLocator.h"
#include "Engine/Animation/AnimationManager.h"

namespace Syn {
bool AnimationApiImpl::HasAnimation(EntityID entity) const {
return EditorApiUtils::HasComponent<AnimationComponent>(_sceneManager, entity);
}

float AnimationApiImpl::GetAnimationSpeed(EntityID entity) const {
return EditorApiUtils::ReadComponent<AnimationComponent>(_sceneManager, entity, [](const auto& c) { return c.speed; }, 1.0f);
}

uint32_t AnimationApiImpl::GetAnimationIndex(EntityID entity) const {
return EditorApiUtils::ReadComponent<AnimationComponent>(_sceneManager, entity, [](const auto& c) { return c.animationIndex; }, UINT32_MAX);
}

void AnimationApiImpl::SetAnimationSpeed(EntityID entity, float speed) {
EditorApiUtils::ModifyComponent<AnimationComponent>(_sceneManager, entity, [&](auto& c, auto pool) { c.speed = speed; });
}

void AnimationApiImpl::SetAnimationIndex(EntityID entity, uint32_t index) {
EditorApiUtils::ModifyComponent<AnimationComponent>(_sceneManager, entity, [&](auto& c, auto pool) {
c.animationIndex = index;
});
}

std::vector<std::pair<uint32_t, std::string>> AnimationApiImpl::GetAvailableAnimations() const {
std::vector<std::pair<uint32_t, std::string>> result;

auto animManager = ServiceLocator::GetAnimationManager();
if (!animManager) {
return result;
}

auto paths = animManager->GetResourcePaths();
auto snapshots = animManager->GetResourceSnapshot();

for (uint32_t i = 0; i < paths.size(); ++i) {
if (snapshots[i].state == ResourceState::Ready) {
result.push_back({ i, paths[i] });
}
}

return result;
}
}
Loading
Loading