Browse Source

Pass at cleaning up JS package registration

Josh Engebretson 9 years ago
parent
commit
0150959005

+ 2 - 3
Source/AtomicApp/AppBase.cpp

@@ -87,6 +87,7 @@ namespace Atomic
         // Instantiate and register the Javascript subsystem
         // Instantiate and register the Javascript subsystem
         Javascript* javascript = new Javascript(context_);
         Javascript* javascript = new Javascript(context_);
         context_->RegisterSubsystem(javascript);
         context_->RegisterSubsystem(javascript);
+        vm_ = javascript->InstantiateVM("MainVM");
 
 
         SubscribeToEvent(E_JSERROR, HANDLER(AppBase, HandleJSError));
         SubscribeToEvent(E_JSERROR, HANDLER(AppBase, HandleJSError));
 
 
@@ -95,9 +96,7 @@ namespace Atomic
     void AppBase::Start()
     void AppBase::Start()
     {
     {
         Application::Start();
         Application::Start();
-
-        Javascript* javascript = GetSubsystem<Javascript>();
-        vm_ = javascript->InstantiateVM("MainVM");
+        
         vm_->InitJSContext();
         vm_->InitJSContext();
 
 
     }
     }

+ 5 - 3
Source/AtomicApp/Player/PlayerApp.cpp

@@ -90,12 +90,13 @@ namespace Atomic
         FileSystem *filesystem = GetSubsystem<FileSystem>();
         FileSystem *filesystem = GetSubsystem<FileSystem>();
         engineParameters_.InsertNew("LogName", filesystem->GetAppPreferencesDir("AtomicPlayer", "Logs") + "AtomicPlayer.log");
         engineParameters_.InsertNew("LogName", filesystem->GetAppPreferencesDir("AtomicPlayer", "Logs") + "AtomicPlayer.log");
 
 
+        // Register JS packages
+        JSVM::RegisterPackage(AtomicPlayer::jsapi_init_atomicplayer);
+
     }
     }
 
 
     void PlayerApp::Start()
     void PlayerApp::Start()
     {
     {
-        AppBase::Start();
-
         UI* ui = GetSubsystem<UI>();
         UI* ui = GetSubsystem<UI>();
         ui->Initialize("DefaultUI/language/lng_en.tb.txt");
         ui->Initialize("DefaultUI/language/lng_en.tb.txt");
         ui->LoadDefaultPlayerSkin();
         ui->LoadDefaultPlayerSkin();
@@ -104,7 +105,8 @@ namespace Atomic
 
 
         // Instantiate and register the Player subsystem
         // Instantiate and register the Player subsystem
         context_->RegisterSubsystem(new AtomicPlayer::Player(context_));
         context_->RegisterSubsystem(new AtomicPlayer::Player(context_));
-        AtomicPlayer::jsapi_init_atomicplayer(vm_);
+
+        AppBase::Start();
 
 
         if (executeJSMain_)
         if (executeJSMain_)
         {
         {

+ 15 - 14
Source/AtomicEditor/Application/AEEditorApp.cpp

@@ -137,6 +137,17 @@ namespace AtomicEditor
 #endif // ATOMIC_DEV_BUILD
 #endif // ATOMIC_DEV_BUILD
 
 
         GetSubsystem<AEEditorPrefs>()->ReadPreferences(engineParameters_);
         GetSubsystem<AEEditorPrefs>()->ReadPreferences(engineParameters_);
+
+        // Register JS packages
+
+        JSVM::RegisterPackage(jsapi_init_toolcore);
+        JSVM::RegisterPackage(jsapi_init_editor);
+        JSVM::RegisterPackage(jsb_package_atomicnetscript_init);
+
+#ifdef ATOMIC_WEBVIEW
+        JSVM::RegisterPackage(jsapi_init_webview, engineParameters_);
+#endif
+
     }
     }
 
 
     void AEEditorApp::Start()
     void AEEditorApp::Start()
@@ -145,29 +156,19 @@ namespace AtomicEditor
         // this can be toggled temporarily, for example to setup an animation preview
         // this can be toggled temporarily, for example to setup an animation preview
         AnimatedModel::SetBoneCreationEnabled(false);
         AnimatedModel::SetBoneCreationEnabled(false);
 
 
-        AppBase::Start();
-
         GetSubsystem<AEEditorPrefs>()->ValidateWindow();
         GetSubsystem<AEEditorPrefs>()->ValidateWindow();
 
 
-        jsapi_init_toolcore(vm_);
-
-#ifdef ATOMIC_WEBVIEW
-        // Initialize in Start so window already exists    
-        jsapi_init_webview(vm_, engineParameters_);
-#endif
-
         context_->RegisterSubsystem(new EditorMode(context_));
         context_->RegisterSubsystem(new EditorMode(context_));
         context_->RegisterSubsystem(new NETBuildSystem(context_));
         context_->RegisterSubsystem(new NETBuildSystem(context_));
-        context_->RegisterSubsystem(new EditorNETService(context_));
+        context_->RegisterSubsystem(new EditorNETService(context_));        
+
+        AppBase::Start();
 
 
         vm_->SetModuleSearchPaths("AtomicEditor/JavaScript;AtomicEditor/EditorScripts;AtomicEditor/EditorScripts/AtomicEditor");
         vm_->SetModuleSearchPaths("AtomicEditor/JavaScript;AtomicEditor/EditorScripts;AtomicEditor/EditorScripts/AtomicEditor");
 
 
         // move UI initialization to JS
         // move UI initialization to JS
         UI* ui = GetSubsystem<UI>();
         UI* ui = GetSubsystem<UI>();
-        ui->Initialize("AtomicEditor/resources/language/lng_en.tb.txt");
-
-        jsapi_init_editor(vm_);
-        jsb_package_atomicnetscript_init(vm_);
+        ui->Initialize("AtomicEditor/resources/language/lng_en.tb.txt");        
 
 
         duk_get_global_string(vm_->GetJSContext(), "require");
         duk_get_global_string(vm_->GetJSContext(), "require");
         duk_push_string(vm_->GetJSContext(), "main");
         duk_push_string(vm_->GetJSContext(), "main");

+ 7 - 5
Source/AtomicEditor/Application/AEPlayerApp.cpp

@@ -20,6 +20,8 @@
 // THE SOFTWARE.
 // THE SOFTWARE.
 //
 //
 
 
+#include <AtomicJS/Javascript/JSVM.h>
+
 #include "AEEditorPrefs.h"
 #include "AEEditorPrefs.h"
 #include "AEPlayerApp.h"
 #include "AEPlayerApp.h"
 
 
@@ -47,6 +49,11 @@ namespace AtomicEditor
 
 
         AEEditorPrefs* prefs = new AEEditorPrefs(context_);
         AEEditorPrefs* prefs = new AEEditorPrefs(context_);
         context_->RegisterSubsystem(prefs);
         context_->RegisterSubsystem(prefs);
+
+#ifdef ATOMIC_WEBVIEW
+        JSVM::RegisterPackage(jsapi_init_webview, engineParameters_);
+#endif
+
     }
     }
 
 
     void AEPlayerApplication::Start()
     void AEPlayerApplication::Start()
@@ -55,11 +62,6 @@ namespace AtomicEditor
 
 
         GetSubsystem<AEEditorPrefs>()->ValidateWindow();
         GetSubsystem<AEEditorPrefs>()->ValidateWindow();
 
 
-#ifdef ATOMIC_WEBVIEW
-        // Initialize in Start so window already exists    
-        jsapi_init_webview(vm_, engineParameters_);
-#endif
-
     }
     }
 
 
     void AEPlayerApplication::Stop()
     void AEPlayerApplication::Stop()

+ 34 - 0
Source/AtomicJS/Javascript/JSVM.cpp

@@ -45,6 +45,7 @@ namespace Atomic
 {
 {
 
 
 JSVM* JSVM::instance_ = NULL;
 JSVM* JSVM::instance_ = NULL;
+Vector<JSVM::JSAPIPackageRegistration*> JSVM::packageRegistrations_;
 
 
 JSVM::JSVM(Context* context) :
 JSVM::JSVM(Context* context) :
     Object(context),
     Object(context),
@@ -94,11 +95,44 @@ void JSVM::InitJSContext()
 
 
     ui_ = new JSUI(context_);
     ui_ = new JSUI(context_);
 
 
+    InitializePackages();
+
     // handle this elsewhere?
     // handle this elsewhere?
     SubscribeToEvents();
     SubscribeToEvents();
 
 
 }
 }
 
 
+void JSVM::InitializePackages()
+{   
+    for (unsigned i = 0; i < packageRegistrations_.Size(); i++)
+    {
+        JSAPIPackageRegistration* pkgReg = packageRegistrations_.At(i);
+
+        if (pkgReg->registrationFunction)
+        {
+            pkgReg->registrationFunction(this);
+        }
+        else
+        {
+            pkgReg->registrationSettingsFunction(this, pkgReg->settings);
+        }
+
+        delete pkgReg;
+    }
+
+    packageRegistrations_.Clear();
+    
+}
+
+void JSVM::RegisterPackage(JSVMPackageRegistrationFunction regFunction)
+{
+    packageRegistrations_.Push(new JSAPIPackageRegistration(regFunction));
+}
+
+void JSVM::RegisterPackage(JSVMPackageRegistrationSettingsFunction regFunction, const VariantMap& settings)
+{
+    packageRegistrations_.Push(new JSAPIPackageRegistration(regFunction, settings));
+}
 
 
 void JSVM::SubscribeToEvents()
 void JSVM::SubscribeToEvents()
 {
 {

+ 46 - 1
Source/AtomicJS/Javascript/JSVM.h

@@ -40,13 +40,21 @@ namespace Atomic
 class JSFile;
 class JSFile;
 class JSUI;
 class JSUI;
 class JSMetrics;
 class JSMetrics;
+class JSVM;
+
+
+/// Registration signature for JSVM package registration
+typedef void(*JSVMPackageRegistrationFunction)(JSVM* vm);
+
+/// Registration signature for JSVM package registration with settings
+typedef void(*JSVMPackageRegistrationSettingsFunction)(JSVM* vm, const VariantMap& setting);
 
 
 class ATOMIC_API JSVM : public Object
 class ATOMIC_API JSVM : public Object
 {
 {
 
 
     friend class JSMetrics;
     friend class JSMetrics;
 
 
-    OBJECT(JSVM);
+    OBJECT(JSVM)
 
 
 public:
 public:
     /// Construct.
     /// Construct.
@@ -56,6 +64,13 @@ public:
 
 
     void InitJSContext();
     void InitJSContext();
 
 
+    /// Package registration
+    static void RegisterPackage(JSVMPackageRegistrationFunction regFunction);
+    static void RegisterPackage(JSVMPackageRegistrationSettingsFunction regFunction, const VariantMap& settings);
+
+    /// Initialize registered packages
+    void InitializePackages();
+
     bool ExecuteFile(File* file);
     bool ExecuteFile(File* file);
 
 
     // Resources/Scripts/*.js
     // Resources/Scripts/*.js
@@ -184,6 +199,33 @@ public:
 
 
 private:
 private:
 
 
+    struct JSAPIPackageRegistration
+    {
+        JSAPIPackageRegistration()
+        {
+            registrationFunction = 0;
+            registrationSettingsFunction = 0;
+        }
+
+        JSAPIPackageRegistration(JSVMPackageRegistrationFunction regFunction)
+        {
+            registrationFunction = regFunction;
+            registrationSettingsFunction = 0;
+        }
+
+        JSAPIPackageRegistration(JSVMPackageRegistrationSettingsFunction regFunction, const VariantMap& regSettings)
+        {
+            registrationFunction = 0;
+            registrationSettingsFunction = regFunction;
+            settings = regSettings;
+        }
+
+
+        JSVMPackageRegistrationFunction registrationFunction;
+        JSVMPackageRegistrationSettingsFunction registrationSettingsFunction;
+        VariantMap settings;
+    };
+
     void SubscribeToEvents();
     void SubscribeToEvents();
     void HandleUpdate(StringHash eventType, VariantMap& eventData);
     void HandleUpdate(StringHash eventType, VariantMap& eventData);
 
 
@@ -211,6 +253,9 @@ private:
 
 
     SharedPtr<JSMetrics> metrics_;
     SharedPtr<JSMetrics> metrics_;
 
 
+    static Vector<JSAPIPackageRegistration*> packageRegistrations_;
+
+
     static JSVM* instance_;
     static JSVM* instance_;
 
 
 };
 };