feat(scripting): add managed SRP runtime bridge
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user