15#include <unordered_map>
16#include <unordered_set>
26struct NativeAddonCreateInfo
31 std::string mDescription;
32 std::string mVersion =
"1.0.0";
33 NativeAddonTarget mTarget = NativeAddonTarget::EngineAndEditor;
34 std::string mBinaryName;
40struct NativeAddonPackageOptions
43 bool mIncludeSource =
true;
44 bool mIncludeAssets =
true;
45 bool mIncludeScripts =
true;
46 bool mIncludeThumbnail =
true;
47 std::string mOutputPath;
53struct NativeAddonState
56 std::string mSourcePath;
57 std::string mLoadedPath;
58 void* mModuleHandle =
nullptr;
59 std::string mFingerprint;
62 bool mBuildInProgress =
false;
63 bool mBuildSucceeded =
false;
64 std::string mBuildLog;
65 std::string mBuildError;
69 bool mDescValid =
false;
72 NativeModuleMetadata mNativeMetadata;
75 NativeAddonResolveMode mActiveResolveMode = NativeAddonResolveMode::Source;
76 bool mLoadedFromBinary =
false;
77 std::string mBinaryStatus;
84 std::vector<uint64_t> mPurgedAssetUuids;
96class NativeAddonManager
101 static NativeAddonManager*
Get();
108 void DiscoverNativeAddons();
113 std::vector<std::string> GetDiscoveredAddonIds()
const;
124 bool BuildNativeAddon(
const std::string& addonId, std::string& outError);
132 std::string ComputeFingerprint(
const std::string& addonId);
140 bool NeedsBuild(
const std::string& addonId);
144 void WriteAddonBuildMeta(
const std::string& outputPath,
145 const std::string& fingerprint);
148 NativeAddonResolveMode ResolveModeForAddon(
const std::string& addonId)
const;
151 bool ResolveBinaryModulePath(
const std::string& addonId, std::string& outModulePath, std::string& outStatus, std::string& outError);
154 bool IsBinaryDescriptorCompatible(
const NativeBinaryDescriptor& descriptor,
const NativeAddonState& state)
const;
159 bool MetaIndicatesRebuildNeeded(
const std::string& outputPath)
const;
171 bool LoadNativeAddon(
const std::string& addonId, std::string& outError);
179 bool UnloadNativeAddon(
const std::string& addonId);
188 bool ReloadNativeAddon(
const std::string& addonId, std::string& outError);
195 void ReloadAllNativeAddons();
206 void TickAsyncBuilds();
209 bool IsBuildingAsync()
const;
212 int GetAsyncBuildTotal()
const;
215 int GetAsyncBuildIndex()
const;
218 std::string GetAsyncBuildAddonId()
const;
222 std::string GetAsyncBuildOutput()
const;
235 bool mActive =
false;
236 std::string mAddonId;
237 std::vector<std::string> mLockedFiles;
241 std::string mIntermediateDir;
243 bool IsBuildBlocked()
const {
return mBlocked.mActive; }
244 const BuildBlocked& GetBuildBlocked()
const {
return mBlocked; }
248 void RetryBlockedBuild();
250 void CancelBlockedBuild();
274 enum class ProjectRestartPhase
283 struct ProjectRestart
285 ProjectRestartPhase mPhase = ProjectRestartPhase::None;
288 std::vector<std::string> mTargetAddons;
291 bool mForceRebuild =
false;
295 std::string mProjectPath;
296 std::vector<std::string> mOpenSceneNames;
297 std::string mActiveSceneName;
300 std::vector<std::string> mDirtyScenes;
301 int32_t mDirtyCursor = 0;
304 bool IsProjectRestartActive()
const {
return mRestart.mPhase != ProjectRestartPhase::None; }
305 const ProjectRestart& GetProjectRestart()
const {
return mRestart; }
311 void ReloadNativeAddonsWithProjectRestart(
const std::vector<std::string>& addonIds,
318 void ProjectRestartConfirm();
319 void ProjectRestartCancel();
320 void ProjectRestartDirtySave();
321 void ProjectRestartDirtyDiscard();
322 void ProjectRestartDirtyCancel();
332 void TickAllPlugins(
float deltaTime);
342 void TickEditorAllPlugins(
float deltaTime);
347 void CallOnEditorPreInit();
352 void CallOnEditorReady();
362 const NativeAddonState* GetState(
const std::string& addonId)
const;
367 bool IsLoaded(
const std::string& addonId)
const;
375 std::string GetAddonSourcePath(
const std::string& addonId)
const;
380 std::vector<NativeAddonState> GetEngineAddons()
const;
403 bool CreateNativeAddon(
const NativeAddonCreateInfo& info, std::string& outError, std::string* outPath =
nullptr);
417 bool CreateNativeAddonAtPath(
const NativeAddonCreateInfo& info,
const std::string& targetDir,
418 std::string& outError, std::string* outPath =
nullptr);
429 bool PackageNativeAddon(
const NativeAddonPackageOptions& options, std::string& outError);
439 bool GenerateIDEConfig(
const std::string& addonPath);
444 std::vector<std::string> GetLocalPackageIds()
const;
454 static bool GenerateAddonIncludesManifest();
463 static bool LoadAddonIncludesManifest(std::vector<std::string>& outIncludePaths,
464 std::vector<std::string>& outDefines);
467 static NativeAddonManager* sInstance;
468 NativeAddonManager();
469 ~NativeAddonManager();
472 void ScanLocalPackages();
473 void ScanInstalledAddons();
474 bool ParsePackageJson(
const std::string& path, NativeModuleMetadata& outMetadata);
477 std::string GetIntermediateDir(
const std::string& addonId);
478 std::string GetOutputPath(
const std::string& addonId,
const std::string& fingerprint);
479 bool GenerateBuildScript(
const std::string& addonId,
const std::string& outputDir,
480 const std::string& outputPath, std::string& outScriptPath);
481 std::vector<std::string> GatherSourceFiles(
const std::string& sourceDir);
489 std::vector<std::string> TryClearAddonIntermediates(
const std::string& addonId);
492 void InitializeEngineAPI();
495 std::string GenerateIdFromName(
const std::string& name);
496 bool WriteTemplateSourceFile(
const std::string& path,
const std::string& addonName,
497 const std::string& binaryName);
498 bool WritePackageJson(
const std::string& path,
const NativeAddonCreateInfo& info);
499 bool WriteVSCodeConfig(
const std::string& addonPath);
500 bool WriteCMakeLists(
const std::string& addonPath,
const std::string& binaryName);
501 bool WriteVSProject(
const std::string& addonPath,
const std::string& addonName,
502 const std::string& binaryName);
504 std::unordered_map<std::string, NativeAddonState> mStates;
514 struct AsyncAddonBuild
517 std::string scriptPath;
518 std::string outputPath;
519 std::string fingerprint;
522 std::atomic<bool> complete{
false};
523 std::atomic<int> exitCode{0};
525 mutable std::mutex outputMutex;
529 std::unique_ptr<AsyncAddonBuild> mActiveBuild;
530 std::vector<std::string> mBuildQueue;
531 int mBuildQueueTotal = 0;
532 int mBuildQueueIndex = 0;
535 BuildBlocked mBlocked;
538 ProjectRestart mRestart;
546 std::unordered_set<std::string> mForceSourceForNextLoad;
549 void StartNextQueuedBuild();
550 void FinalizeAsyncBuild(AsyncAddonBuild& job,
bool success);
551 bool LoadNativeAddonAfterBuild(
const std::string& addonId, std::string& outError);
554 void ProjectRestartBeginClose();
555 void ProjectRestartOnBuildsDone();
556 void ProjectRestartReset();
Engine API exposed to native addon plugins.
Stable C ABI header for native addon plugins.
Engine API provided to plugins during OnLoad.
Definition PolyphaseEngineAPI.h:32
Plugin descriptor returned by PolyphasePlugin_GetDesc.
Definition PolyphasePluginAPI.h:46