feat(scripting): add managed SRP runtime bridge

This commit is contained in:
2026-04-17 21:38:22 +08:00
parent 8f847db816
commit f4fb859972
6 changed files with 908 additions and 4 deletions

View File

@@ -5,6 +5,7 @@
#include <array>
#include <filesystem>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
@@ -21,6 +22,8 @@ namespace XCEngine {
namespace Scripting {
class ScriptComponent;
class MonoManagedRenderPipelineBridge;
class MonoManagedRenderPipelineStageRecorder;
class MonoScriptRuntime : public IScriptRuntime {
public:
@@ -156,6 +159,11 @@ private:
uint32_t gcHandle = 0;
};
struct ExternalManagedObjectData {
MonoClass* monoClass = nullptr;
uint32_t gcHandle = 0;
};
void ResolveSettings();
bool InitializeRootDomain();
bool CreateAppDomain();
@@ -195,11 +203,43 @@ private:
bool TryReadFieldValue(MonoObject* instance, const FieldMetadata& fieldMetadata, ScriptFieldValue& outValue) const;
void ClearManagedInstances();
void ClearExternalManagedObjects();
void ClearClassCache();
bool InvokeManagedMethod(MonoObject* instance, MonoMethod* method, void** args = nullptr);
bool ResolveManagedClass(
const std::string& assemblyName,
const std::string& namespaceName,
const std::string& className,
MonoClass*& outClass) const;
bool CreateExternalManagedObject(
const std::string& assemblyName,
const std::string& namespaceName,
const std::string& className,
uint32_t& outHandle);
bool CreateExternalManagedObject(
MonoClass* monoClass,
uint32_t& outHandle);
uint32_t RetainExternalManagedObject(MonoObject* instance);
void DestroyExternalManagedObject(uint32_t gcHandle);
MonoObject* GetManagedObject(uint32_t gcHandle) const;
MonoMethod* ResolveManagedMethod(
MonoClass* monoClass,
const char* methodName,
int parameterCount) const;
MonoMethod* ResolveManagedMethod(
MonoObject* instance,
const char* methodName,
int parameterCount) const;
bool InvokeManagedMethod(
MonoObject* instance,
MonoMethod* method,
void** args = nullptr,
MonoObject** outReturnValue = nullptr);
void RecordException(MonoObject* exception);
void SetError(const std::string& error);
friend class MonoManagedRenderPipelineBridge;
friend class MonoManagedRenderPipelineStageRecorder;
Settings m_settings;
Components::Scene* m_activeScene = nullptr;
@@ -215,6 +255,8 @@ private:
MonoClass* m_behaviourClass = nullptr;
MonoClass* m_gameObjectClass = nullptr;
MonoClass* m_monoBehaviourClass = nullptr;
MonoClass* m_scriptableRenderPipelineAssetClass = nullptr;
MonoClass* m_scriptableRenderPipelineClass = nullptr;
MonoClass* m_serializeFieldAttributeClass = nullptr;
MonoMethod* m_gameObjectConstructor = nullptr;
MonoClassField* m_managedGameObjectUUIDField = nullptr;
@@ -223,6 +265,8 @@ private:
std::unordered_map<std::string, ClassMetadata> m_classes;
std::unordered_map<InstanceKey, InstanceData, InstanceKeyHasher> m_instances;
std::unordered_map<uint32_t, ExternalManagedObjectData> m_externalManagedObjects;
std::shared_ptr<void> m_runtimeLifetimeToken;
};
} // namespace Scripting