Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -392,3 +392,11 @@ desktop.ini
out/
3DRadSpace/Data/RecentProjects.txt
3DRadSpace/3DRadSpace_Editor_WindowsDX11/RCa07792
/3DRadSpace/3DRadSpace_Editor_WindowsDX11/RCa05476
/3DRadSpace/3DRadSpace_Editor_WindowsDX11/RCa10992
/3DRadSpace/3DRadSpace_Editor_WindowsDX11/RCb05476
/3DRadSpace/3DRadSpace_Editor_WindowsDX11/RCb10992
/3DRadSpace/3DRadSpace_Editor_WindowsDX11/RCc05476
/3DRadSpace/3DRadSpace_Editor_WindowsDX11/RCd05476
/3DRadSpace/3DRadSpace_Editor_WindowsDX11/RCe05476
/3DRadSpace/3DRadSpace_Editor_WindowsDX11/RCf05476
7 changes: 6 additions & 1 deletion 3DRadSpace/3DRadSpace.slnx
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
<Solution />
<Solution>
<Configurations>
<Platform Name="x64" />
</Configurations>
<Project Path="D:/Projects/3D_Rad_Space/3DRadSpace/Dummy/Dummy.vcxproj" Id="d87f5240-7a4a-fb1f-f513-330b76252c7e" />
Comment thread
NicusorN5 marked this conversation as resolved.
Outdated
</Solution>
51 changes: 50 additions & 1 deletion 3DRadSpace/3DRadSpace_Compiler/3DRadSpace_Compiler.rc
Original file line number Diff line number Diff line change
@@ -1,7 +1,56 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#include "winres.h"
#include <Windows.h>
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)

/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x0L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "3DRadSpace"
VALUE "FileDescription", "3DRadSpace Compiler"
VALUE "FileVersion", "0.0.1.0"
VALUE "InternalName", "3DRadSpace.Compiler.exe"
VALUE "LegalCopyright", "Copyright (C) 2026"
VALUE "OriginalFilename", "3DRadSpace.Compiler.exe"
VALUE "ProductName", "3DRadSpace Compiler"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////
// English (United Kingdom) resources

Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
#include "..\..\resource.h"
#include <CommCtrl.h>
#include <Engine3DRadSpace/Objects/Impl/Objects.hpp>
#include <psapi.h>
#include <Engine3DRadSpace/Plugins/CustomObject.hpp>
#include "EditObject.hpp"

using namespace Engine3DRadSpace;
using namespace Engine3DRadSpace::Objects;
Expand Down Expand Up @@ -51,8 +54,8 @@ INT_PTR WINAPI AddObjectDialog_DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA

if(item->iItem >= 0)
{
EditObjectDialog dialog(hwnd, aod->hInstance, e3drsp_internal_objects_list[item->iItem], aod->_content);
EndDialog(hwnd, reinterpret_cast<INT_PTR>(dialog.ShowDialog()));
auto obj = EditObject(hwnd, aod->hInstance, e3drsp_internal_objects_list[item->iItem], aod->_content);
EndDialog(hwnd, reinterpret_cast<INT_PTR>(obj));
}
break;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
#pragma once

#include <Engine3DRadSpace/Reflection/Reflection.hpp>
#include <Engine3DRadSpace/Content/ContentManager.hpp>
#include "..\Controls\Dialog.hpp"
#include "EditObjectDialog.hpp"
#include "EditObject.hpp"

class AddObjectDialog : public Dialog
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#include "EditObject.hpp"
#include "..\..\resource.h"
#include <CommCtrl.h>
#include <Engine3DRadSpace/Objects/Impl/Objects.hpp>
#include <psapi.h>

using namespace Engine3DRadSpace;
using namespace Engine3DRadSpace::Content;
using namespace Engine3DRadSpace::Reflection;
using namespace Engine3DRadSpace::Objects;

std::unordered_map<std::string, Plugins::ObjectCustomWindow> customWindowFunctions;

void* EditObject(HWND hwnd, HINSTANCE hInstance, void* pRefl, void* pContent, void* pObj)
{
auto refl = static_cast<ReflectedObject*>(pRefl);
auto content = static_cast<ContentManager*>(pContent);
auto obj = static_cast<IObject*>(pObj);

bool useDefaultWindow = true;
std::string customWindowFnName;

for (auto field : *refl)
{
if (Attribute* attribute = dynamic_cast<Attribute*>(field); attribute != nullptr)
{
if (attribute->FieldName() == "CustomWindow")
{
customWindowFnName = attribute->FieldDesc();

useDefaultWindow = false;
break;
}
}
}

if (useDefaultWindow)
{
EditObjectDialog dialog(hwnd, hInstance, refl, content);
return dialog.ShowDialog();
}
else
{
if (customWindowFunctions.find(customWindowFnName) != customWindowFunctions.end())
{
auto customWindowFn = customWindowFunctions[customWindowFnName];
return customWindowFn(hwnd, hInstance, refl, content, obj);
}

std::vector<HMODULE> modules;
modules.emplace_back(nullptr);

DWORD neededSize = 0;
EnumProcessModules(GetCurrentProcess(), modules.data(), sizeof(HMODULE), &neededSize);

modules.resize(neededSize / sizeof(HMODULE));

auto r = EnumProcessModules(GetCurrentProcess(), modules.data(), neededSize, &neededSize);

if (!r) throw std::exception("Failed to enumerate process modules!");
Comment thread
NicusorN5 marked this conversation as resolved.
Outdated

for (auto module : modules)
{
auto customWindowFn = reinterpret_cast<Plugins::ObjectCustomWindow>(GetProcAddress(module, customWindowFnName.c_str()));

if (customWindowFn != nullptr)
{
customWindowFunctions[customWindowFnName] = customWindowFn;
return customWindowFn(hwnd, hInstance, refl, content, obj);
}
}
}

throw std::runtime_error("Custom window procedure not found: " + customWindowFnName);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#pragma once
#include "EditObjectDialog.hpp"
#include <Engine3DRadSpace/Plugins/CustomObject.hpp>

void* EditObject(HWND hwnd, HINSTANCE hInstance, void* refl, void* content, void* obj = nullptr);
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include "../Controls/EventControl.hpp"
#include <Engine3DRadSpace/Objects/ObjectList.hpp>
#include "../Controls/ObjectIDControl.hpp"
#include <Engine3DRadSpace/Logging/Warning.hpp>

using namespace Engine3DRadSpace;
using namespace Engine3DRadSpace::Audio;
Expand Down Expand Up @@ -126,16 +127,24 @@ void EditObjectDialog::createForms()
{
auto name = attribute->FieldName();

std::unordered_map<std::string, int> attribMap=
std::unordered_map<std::string, int> attribMap =
{
{"HelpURL", 1}
{"HelpURL", 1},
{"Title", 2 },
{"CustomWindow", 3}
};
Comment thread
NicusorN5 marked this conversation as resolved.
Outdated

switch (attribMap[name])
Comment thread
NicusorN5 marked this conversation as resolved.
Outdated
{
case 1:
_helpUrl = attribute->FieldDesc();
break;
case 2:
SetWindowTextA(window, attribute->FieldDesc().c_str());
break;
case 3:
Logging::SetLastWarning("CustomWindow attribute is not supported in EditObjectDialog. Ignoring.");
break;
default:
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -964,16 +964,13 @@ LRESULT __stdcall EditorWindow_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA
{
IObject *obj = gEditorWindow->editor->Objects->operator[](objID.second.value());

EditObjectDialog eod(
gEditorWindow->_mainWindow,
//update the list view.
IObject* new_obj = static_cast<IObject*>(EditObject(gEditorWindow->_mainWindow,
gEditorWindow->_hInstance,
Internal::GetReflDataFromUUID(obj->GetUUID()),
gEditorWindow->GetContentManager(),
obj
);

//update the list view.
auto new_obj = eod.ShowDialog();
));
if(new_obj != reinterpret_cast<void *>(IDCANCEL) && new_obj != nullptr)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 HIGH RISK

Directly comparing a pointer to IDCANCEL is logically incorrect. This check will likely fail to detect a cancelled dialog as intended. If the dialog was cancelled, the function should return nullptr and this check should be updated to if (obj == nullptr).

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to be fixed later

{
TVITEMA item{};
Expand Down
2 changes: 1 addition & 1 deletion 3DRadSpace/3DRadSpace_Editor_WindowsDX11/resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 154
#define _APS_NEXT_COMMAND_VALUE 40011
#define _APS_NEXT_COMMAND_VALUE 40012
#define _APS_NEXT_CONTROL_VALUE 1006
#define _APS_NEXT_SYMED_VALUE 101
#endif
Expand Down
81 changes: 81 additions & 0 deletions 3DRadSpace/Dummy/Dummy.vcxproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="17.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{D87F5240-7A4A-FB1F-F513-330B76252C7E}</ProjectGuid>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.default.props" />
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<EnableASAN>true</EnableASAN>
</PropertyGroup>
<PropertyGroup>
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v145</PlatformToolset>
</PropertyGroup>
<PropertyGroup>
<PreferredToolArchitecture>x64</PreferredToolArchitecture>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalIncludeDirectories>D:\Projects\3D_Rad_Space\3DRadSpace\out\build\x64-Release\Include; %(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
Comment thread
NicusorN5 marked this conversation as resolved.
Outdated
Comment thread
NicusorN5 marked this conversation as resolved.
Outdated
<LanguageStandard>stdcpplatest</LanguageStandard>
<LanguageStandard_C>stdclatest</LanguageStandard_C>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>D:\Projects\3D_Rad_Space\3DRadSpace\out\build\x64-Release\Bin\Windows-x64\Debug; %(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>3DRadSpace.Core.lib;3DRadSpace.Math.lib;3DRadSpace.Audio.lib;3DRadSpace.Content.lib;3DRadSpace.Content.Assets.lib;3DRadSpace.Games.lib;3DRadSpace.Graphics.lib;3DRadSpace.Graphics.DirectX11.lib;3DRadSpace.Graphics.Null.lib;3DRadSpace.Graphics.Primitives.lib;3DRadSpace.Graphics.Rendering.lib;3DRadSpace.Input.lib;3DRadSpace.Logging.lib;3DRadSpace.Native.lib;3DRadSpace.Objects.lib;3DRadSpace.Objects.Impl.lib;3DRadSpace.Physics.lib;3DRadSpace.Physics.NVPhysX.lib;3DRadSpace.Physics.Objects.lib;3DRadSpace.Projects.lib;3DRadSpace.Reflection.lib;3DRadSpace.Scripting.lib; %(AdditionalDependencies) </AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>xcopy /y /d "D:\Projects\3D_Rad_Space\3DRadSpace\out\build\x64-Release\Bin\Windows-x64\Debug\*.dll" "$(TargetDir)"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalIncludeDirectories>D:\Projects\3D_Rad_Space\3DRadSpace\out\build\x64-Release\Include\; %(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpplatest</LanguageStandard>
</ClCompile>
<Link>
<AdditionalDependencies>3DRadSpace.Core.lib;3DRadSpace.Math.lib;3DRadSpace.Audio.lib;3DRadSpace.Content.lib;3DRadSpace.Content.Assets.lib;3DRadSpace.Games.lib;3DRadSpace.Graphics.lib;3DRadSpace.Graphics.DirectX11.lib;3DRadSpace.Graphics.Null.lib;3DRadSpace.Graphics.Primitives.lib;3DRadSpace.Graphics.Rendering.lib;3DRadSpace.Input.lib;3DRadSpace.Logging.lib;3DRadSpace.Native.lib;3DRadSpace.Objects.lib;3DRadSpace.Objects.Impl.lib;3DRadSpace.Physics.lib;3DRadSpace.Physics.NVPhysX.lib;3DRadSpace.Physics.Objects.lib;3DRadSpace.Projects.lib;3DRadSpace.Reflection.lib;3DRadSpace.Scripting.lib; %(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>D:\Projects\3D_Rad_Space\3DRadSpace\out\build\x64-Release\Bin\Windows-x64\Release; %(AdditionalLibraryDirectories) </AdditionalLibraryDirectories>
</Link>
<PostBuildEvent>
<Command>xcopy /y /d "D:\Projects\3D_Rad_Space\3DRadSpace\out\build\x64-Release\Bin\Windows-x64\Release\*.dll" "$(TargetDir)"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ItemGroup>
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\3DRadSpace_Compiler\3DRadSpace_Compiler.rc">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ResourceCompile>
<ResourceCompile Include="..\3DRadSpace_Editor_WindowsDX11\3DRadSpace_Editor_WindowsDX11.rc">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ResourceCompile>
<ResourceCompile Include="..\Engine3DRadSpace\Scripting\CSharp\Resources.rc">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\Engine3DRadSpace\Scripting\CSharp\resource.h" />
</ItemGroup>
<ItemGroup>
<Image Include="..\Engine3DRadSpace\Scripting\CSharp\OBJ_Script.ico" />
<Image Include="OBJ_Script.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Targets" />
</Project>
2 changes: 2 additions & 0 deletions 3DRadSpace/Dummy/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
//This project is used to edit RC files because of an limitation inside VS2026 using CMake
int main() {}
2 changes: 2 additions & 0 deletions 3DRadSpace/Engine3DRadSpace/Reflection/Reflection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,10 @@
/// ---------------------------------------------------------------------------
/// Supported attributes are:
/// - "HelpURL": Provides a URL to the help documentation for the object being reflected.
/// - "Title" : Custom title for the editor object window. Default is "{Object name} object"
/// - "CustomWindow": Specifies that the given object doesn't use the default editor window, but an custom one instead. The value is the name of the function that creates the custom window.
/// Refer to CustomEditObjectWindow inside the Plugin library for more details.
/// WARNING: The function name must be unique across all loaded modules.
#include "Attribute.hpp"

#define REFL_ATTR(Name, Value) static_cast<::Engine3DRadSpace::Reflection::IReflectedField*>( new ::Engine3DRadSpace::Reflection::Attribute(Name, Value)),
4 changes: 4 additions & 0 deletions 3DRadSpace/Engine3DRadSpace/Scripting/CSharp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@ project("Engine3DRadSpace.Scripting.CSharp")
add_library(3DRadSpace.Scripting.CSharp SHARED
"CSharpScript.hpp"
"CSharpScript.cpp"
"CSharpScriptEditor.hpp"
"CSharpScriptEditor.cpp"
"Main.cpp"
"NETCOREHost.hpp"
"NETCOREHost.cpp"
)

target_sources(3DRadSpace.Scripting.CSharp PRIVATE "Resources.rc")

if (CMAKE_VERSION VERSION_GREATER 3.12)
set_property(TARGET 3DRadSpace.Scripting.CSharp PROPERTY CXX_STANDARD 23)
endif()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ CSharpScript::CSharpScript(
const std::string& name,
bool enabled,
const std::string& src
)
) : IObject(name, enabled)
{
}

Expand Down Expand Up @@ -76,6 +76,9 @@ CSharpScript::~CSharpScript()
}

REFL_BEGIN(CSharpScript, "C# Script", "Scripting", "C# script")
REFL_FIELD(CSharpScript, std::string, Name, "Name", "C# Script", "Name of the script object")
REFL_FIELD(CSharpScript, bool, Enabled, "Enabled", true, "Whether the script is enabled or not")
REFL_FIELD(CSharpScript, std::string, ScriptPath, "Script path", "", "Path to script file")
REFL_FIELD(CSharpScript, std::string, Class, "Entry classname", "", "Path to script file")
Comment thread
NicusorN5 marked this conversation as resolved.
Outdated
REFL_ATTR("CustomWindow", "CreateCSharpEditorWindow")
REFL_END
Loading
Loading