feat(rendering): add managed SRP renderer runtime

This commit is contained in:
2026-04-19 00:05:29 +08:00
parent a57b322bc7
commit b989edca91
50 changed files with 5732 additions and 171 deletions

View File

@@ -74,6 +74,8 @@ public:
virtual bool TryGetAvailableScriptClasses(
std::vector<ScriptClassDescriptor>& outClasses) const = 0;
virtual bool TryGetAvailableRenderPipelineAssetClasses(
std::vector<ScriptClassDescriptor>& outClasses) const = 0;
virtual bool TryGetClassFieldMetadata(
const std::string& assemblyName,

View File

@@ -19,6 +19,12 @@ typedef struct _MonoMethod MonoMethod;
typedef struct _MonoClassField MonoClassField;
namespace XCEngine {
namespace Rendering {
namespace Pipelines {
struct ManagedRenderPipelineAssetDescriptor;
} // namespace Pipelines
} // namespace Rendering
namespace Scripting {
class ScriptComponent;
@@ -56,6 +62,8 @@ public:
std::vector<std::string> GetScriptClassNames(const std::string& assemblyName = std::string()) const;
bool TryGetAvailableScriptClasses(
std::vector<ScriptClassDescriptor>& outClasses) const override;
bool TryGetAvailableRenderPipelineAssetClasses(
std::vector<ScriptClassDescriptor>& outClasses) const override;
bool TryGetClassFieldMetadata(
const std::string& assemblyName,
const std::string& namespaceName,
@@ -76,6 +84,8 @@ public:
uint32_t RetainExternalManagedObjectReference(MonoObject* managedObject);
void ReleaseExternalManagedObject(uint32_t gcHandle);
bool IsScriptableRenderPipelineAssetObject(MonoObject* managedObject) const;
bool TryEnsureManagedRenderPipelineAssetHandle(
Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor& ioDescriptor);
bool TryGetFieldValue(
const ScriptComponent* component,
@@ -178,6 +188,9 @@ private:
bool LoadAssemblies();
bool DiscoverScriptClasses();
void DiscoverScriptClassesInImage(const std::string& assemblyName, MonoImage* image);
void DiscoverRenderPipelineAssetClassesInImage(
const std::string& assemblyName,
MonoImage* image);
bool IsMonoBehaviourSubclass(MonoClass* monoClass) const;
bool IsSupportedComponentFieldClass(MonoClass* monoClass) const;
bool IsScriptComponentFieldClass(MonoClass* monoClass) const;
@@ -282,6 +295,7 @@ private:
MonoClassField* m_scriptComponentUUIDField = nullptr;
std::unordered_map<std::string, ClassMetadata> m_classes;
std::vector<ScriptClassDescriptor> m_renderPipelineAssetClasses;
std::unordered_map<InstanceKey, InstanceData, InstanceKeyHasher> m_instances;
std::unordered_map<uint32_t, ExternalManagedObjectData> m_externalManagedObjects;
std::shared_ptr<void> m_runtimeLifetimeToken;

View File

@@ -11,6 +11,8 @@ public:
void OnRuntimeStop(Components::Scene* scene) override;
bool TryGetAvailableScriptClasses(
std::vector<ScriptClassDescriptor>& outClasses) const override;
bool TryGetAvailableRenderPipelineAssetClasses(
std::vector<ScriptClassDescriptor>& outClasses) const override;
bool TryGetClassFieldMetadata(
const std::string& assemblyName,
const std::string& namespaceName,

View File

@@ -60,6 +60,9 @@ public:
bool TryGetAvailableScriptClasses(
std::vector<ScriptClassDescriptor>& outClasses,
const std::string& assemblyName = std::string()) const;
bool TryGetAvailableRenderPipelineAssetClasses(
std::vector<ScriptClassDescriptor>& outClasses,
const std::string& assemblyName = std::string()) const;
bool TrySetScriptFieldValue(
ScriptComponent* component,
const std::string& fieldName,