Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,25 @@ Record the current branch at the top of `tasks/todo.md` as `# Branch: <branch-na

- Grep for usages of any removed or renamed symbols to clean up dead references
- Add unit tests for new logic when a test framework is available
- Build the relevant executable target before manual testing app/editor behavior, and report the exact executable path used for the manual test.

## GPT-Codex-5.3-Spark Subagent Workflow

Use `GPT-Codex-5.3-Spark` subagents to preserve the main `GPT-5.5` lane for implementation, architecture, debugging decisions, code review conclusions, commits, and PR work.

Spark subagents should run commands, inspect files, collect logs, narrow failures, and return concise findings. They must not modify source code or repository files, stage changes, commit, push, create pull requests, or make architecture/product decisions. If a Spark subagent finds a code issue, it should report the failure and suspected cause; only the current/main agent should make code changes, then ask the Spark subagent to rerun the relevant verification.

Suitable Spark subagent tasks:

- Test runner: run focused/full tests, retry flaky commands once, and report pass/fail with key logs.
- Build/install runner: run package builds, app builds, install scripts, and verify expected binaries or manifests exist.
- Failure log triage: parse MSBuild, CTest, runtime, or installer logs and identify the first real error, target, file, and likely cause.
- Codebase reconnaissance: search APIs, call sites, ownership boundaries, and related tests; return a compact file/function map.
- Diff review: inspect staged/unstaged changes for regressions, accidental files, missing tests, dead references, and scope creep.
- UI smoke/screenshot collector: launch apps, click basic paths, capture screenshots, and report crashes, blank windows, or obvious layout issues.
- Package/dependency inventory: inspect `.evepackage` manifests, package DLLs, dependency chains, and loaded/available package states.
- Docs consistency check: compare changed behavior against README, scripts, and AGENTS guidance; report stale or missing docs.
- PR readiness audit: check branch, status, staged files, test evidence, dirty submodules, and PR body accuracy without changing git state.

This file provides repository-wide guidance for coding agents working in EvoEngine.

Expand Down
1 change: 1 addition & 0 deletions EvoEngine_App/include/LauncherUtils.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include "EvoEngine_SDK_PCH.hpp"
#include "PackageManager.hpp"
#include "ProjectManager.hpp"

Expand Down
1 change: 0 additions & 1 deletion EvoEngine_App/src/LauncherUtils.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#include "LauncherUtils.hpp"
#include "EvoEngine_SDK_PCH.hpp"

#include <algorithm>
#include <cctype>
Expand Down
1 change: 1 addition & 0 deletions EvoEngine_SDK/include/Core/AssetManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ class AssetManager {
* @param editor_layer The editor layer instance used for displaying assets.
*/
static void OnInspect(const std::shared_ptr<EditorLayer>& editor_layer);
static void DrawAssetInspectorContent(const std::shared_ptr<EditorLayer>& editor_layer);
/**
* @brief Cleans up resources when destroying the AssetManager.
*/
Expand Down
2 changes: 1 addition & 1 deletion EvoEngine_SDK/include/Core/ILayer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ class ILayer {
/**
* @brief Indicates whether the layer enables editor inspection.
*/
bool enable_inspection = false;
bool enable_inspection = true;

/**
* @brief Retrieves the Scene associated with this layer.
Expand Down
1 change: 1 addition & 0 deletions EvoEngine_SDK/include/Core/PackageManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ class PackageManager final {
static bool Unload(const std::string& package_name);
static bool Reload(const std::string& package_name);
static void UnloadAll();
static bool CanModifyPackages();
static void ScanAvailablePackages();
static std::vector<std::filesystem::path> GetSearchPaths();
static std::vector<AvailablePackageInfo> GetAvailablePackages();
Expand Down
3 changes: 3 additions & 0 deletions EvoEngine_SDK/include/Core/ProjectManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ class ProjectManager {
*/
static void LoadAllPendingAssets();

static void DrawViewMenuItems();
static void DrawProjectMenu();

public:
bool show_project_window = true; ///< Indicates whether the project window should be shown in the editor.

Expand Down
26 changes: 26 additions & 0 deletions EvoEngine_SDK/include/Layers/EditorLayer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
#include "Strands.hpp"
#include "Texture2D.hpp"

#include <filesystem>
#include <future>
#include <optional>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

Expand Down Expand Up @@ -263,6 +267,7 @@ class EditorLayer : public ILayer {
bool show_entity_explorer_window = true; /**< Indicates whether the entity explorer window is visible. */
bool show_entity_inspector_window = true; /**< Indicates whether the entity inspector window is visible. */
bool show_package_manager_window = false; /**< Indicates whether the runtime package manager window is visible. */
bool show_layer_inspector_window = true; /**< Indicates whether the layer inspector window is visible. */
bool main_camera_focus_override = false; /**< Indicates if the main camera focus has been overridden. */
bool scene_camera_focus_override = false; /**< Indicates if the scene camera focus has been overridden. */

Expand Down Expand Up @@ -866,6 +871,27 @@ class EditorLayer : public ILayer {

bool runtime_package_manager_scanned_ = false; /**< Whether package manifests were scanned. */
std::unordered_set<std::string> selected_runtime_package_names_; /**< Selected runtime packages for bulk loading. */
enum class RuntimePackageInspectionSource { Available, Loaded };
RuntimePackageInspectionSource inspected_runtime_package_source_ = RuntimePackageInspectionSource::Available;
std::string inspected_runtime_package_name_;

struct RuntimePackageBuildResult {
bool success = false;
int exit_code = -1;
std::string command;
std::string output;
std::string error;
};

struct RuntimePackageBuildJob {
std::future<RuntimePackageBuildResult> future;
std::optional<RuntimePackageBuildResult> result;
};

void PollRuntimePackageBuildJobs();
[[nodiscard]] bool HasActiveRuntimePackageBuild() const;

std::unordered_map<std::string, RuntimePackageBuildJob> runtime_package_build_jobs_;

bool enable_console_logs_ = true; /**< Indicates if console logs are enabled. */
bool enable_console_errors_ = true; /**< Indicates if console errors are enabled. */
Expand Down
1 change: 1 addition & 0 deletions EvoEngine_SDK/src/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,7 @@ void Application::ExecuteEndOfLoopActions() {

void Application::Terminate() {
ApplicationContextScope application_scope(*this);
this->execution_status_ = ExecutionStatus::OnDestroy;
const bool has_render_layer = GetLayer<RenderLayer>() != nullptr;
for (auto i = this->layers_.rbegin(); i != this->layers_.rend(); ++i) {
(*i)->OnDestroy();
Expand Down
92 changes: 45 additions & 47 deletions EvoEngine_SDK/src/AssetManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,57 +49,55 @@ void AssetManager::Initialize() {
auto& asset_manager = GetInstance();
asset_manager.initialized = true;
}
void AssetManager::OnInspect(const std::shared_ptr<EditorLayer>& editor_layer) {
auto& asset_manager = GetInstance();
if (ImGui::BeginMainMenuBar()) {
if (ImGui::BeginMenu("View")) {
ImGui::Checkbox("Assets", &asset_manager.show_asset_inspector_);
ImGui::EndMenu();

void AssetManager::DrawAssetInspectorContent(const std::shared_ptr<EditorLayer>& editor_layer) {
if (editor_layer->inspecting_asset) {
const auto& asset = editor_layer->inspecting_asset;
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0.5f, 0, 1));
ImGui::Button(asset->GetTitle().c_str());
ImGui::PopStyleColor(1);
editor_layer->DraggableAsset(asset);
ImGui::SameLine();
ImGui::Text("Type:");
ImGui::SameLine();
ImGui::Text(asset->GetTypeName().c_str());
if (!asset->IsTemporary()) {
if (ImGui::Button("Save")) {
asset->Save();
}
ImGui::SameLine();
if (ImGui::Button("Reload")) {
asset->Load();
}
}
ImGui::EndMainMenuBar();
ImGui::SameLine();
FileUtils::SaveFile(
"Export...", asset->GetTypeName(), Serialization::PeekAssetExtensions(asset->GetTypeName()),
[&](const std::filesystem::path& path) {
asset->Export(path);
},
false);
ImGui::SameLine();
FileUtils::OpenFile(
"Import...", asset->GetTypeName(), Serialization::PeekAssetExtensions(asset->GetTypeName()),
[&](const std::filesystem::path& path) {
asset->Import(path);
},
false);

ImGui::Separator();
if (asset->OnInspect(editor_layer))
asset->SetUnsaved();
} else {
ImGui::Text("None");
}
}

void AssetManager::OnInspect(const std::shared_ptr<EditorLayer>& editor_layer) {
auto& asset_manager = GetInstance();
if (asset_manager.show_asset_inspector_) {
if (ImGui::Begin("Asset Inspector")) {
if (editor_layer->inspecting_asset) {
const auto& asset = editor_layer->inspecting_asset;
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0.5f, 0, 1));
ImGui::Button(asset->GetTitle().c_str());
ImGui::PopStyleColor(1);
editor_layer->DraggableAsset(asset);
ImGui::SameLine();
ImGui::Text("Type:");
ImGui::SameLine();
ImGui::Text(asset->GetTypeName().c_str());
if (!asset->IsTemporary()) {
if (ImGui::Button("Save")) {
asset->Save();
}
ImGui::SameLine();
if (ImGui::Button("Reload")) {
asset->Load();
}
}
ImGui::SameLine();
FileUtils::SaveFile(
"Export...", asset->GetTypeName(), Serialization::PeekAssetExtensions(asset->GetTypeName()),
[&](const std::filesystem::path& path) {
asset->Export(path);
},
false);
ImGui::SameLine();
FileUtils::OpenFile(
"Import...", asset->GetTypeName(), Serialization::PeekAssetExtensions(asset->GetTypeName()),
[&](const std::filesystem::path& path) {
asset->Import(path);
},
false);

ImGui::Separator();
if (asset->OnInspect(editor_layer))
asset->SetUnsaved();
} else {
ImGui::Text("None");
}
DrawAssetInspectorContent(editor_layer);
}
ImGui::End();
}
Expand Down
Loading
Loading