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

@@ -11,6 +11,38 @@ namespace Scripting {
namespace {
void FilterAndSortScriptClasses(
const std::vector<ScriptClassDescriptor>& runtimeClasses,
std::vector<ScriptClassDescriptor>& outClasses,
const std::string& assemblyName) {
outClasses.clear();
outClasses.reserve(runtimeClasses.size());
for (const ScriptClassDescriptor& descriptor : runtimeClasses) {
if (!assemblyName.empty() && descriptor.assemblyName != assemblyName) {
continue;
}
if (descriptor.className.empty()) {
continue;
}
outClasses.push_back(descriptor);
}
std::sort(
outClasses.begin(),
outClasses.end(),
[](const ScriptClassDescriptor& lhs, const ScriptClassDescriptor& rhs) {
if (lhs.assemblyName != rhs.assemblyName) {
return lhs.assemblyName < rhs.assemblyName;
}
if (lhs.namespaceName != rhs.namespaceName) {
return lhs.namespaceName < rhs.namespaceName;
}
return lhs.className < rhs.className;
});
}
std::unordered_map<std::string, ScriptFieldValue> CollectClassDefaultValues(
const IScriptRuntime* runtime,
const ScriptComponent* component,
@@ -371,39 +403,26 @@ bool ScriptEngine::HasRuntimeInstance(const ScriptComponent* component) const {
bool ScriptEngine::TryGetAvailableScriptClasses(
std::vector<ScriptClassDescriptor>& outClasses,
const std::string& assemblyName) const {
outClasses.clear();
std::vector<ScriptClassDescriptor> runtimeClasses;
if (!m_runtime->TryGetAvailableScriptClasses(runtimeClasses)) {
outClasses.clear();
return false;
}
outClasses.reserve(runtimeClasses.size());
for (const ScriptClassDescriptor& descriptor : runtimeClasses) {
if (!assemblyName.empty() && descriptor.assemblyName != assemblyName) {
continue;
}
FilterAndSortScriptClasses(runtimeClasses, outClasses, assemblyName);
return true;
}
if (descriptor.className.empty()) {
continue;
}
outClasses.push_back(descriptor);
bool ScriptEngine::TryGetAvailableRenderPipelineAssetClasses(
std::vector<ScriptClassDescriptor>& outClasses,
const std::string& assemblyName) const {
std::vector<ScriptClassDescriptor> runtimeClasses;
if (!m_runtime->TryGetAvailableRenderPipelineAssetClasses(runtimeClasses)) {
outClasses.clear();
return false;
}
std::sort(
outClasses.begin(),
outClasses.end(),
[](const ScriptClassDescriptor& lhs, const ScriptClassDescriptor& rhs) {
if (lhs.assemblyName != rhs.assemblyName) {
return lhs.assemblyName < rhs.assemblyName;
}
if (lhs.namespaceName != rhs.namespaceName) {
return lhs.namespaceName < rhs.namespaceName;
}
return lhs.className < rhs.className;
});
FilterAndSortScriptClasses(runtimeClasses, outClasses, assemblyName);
return true;
}