33#include < android/native_window_jni.h> // requires ndk r5 or newer
44#include < android/log.h>
55
6- #include < stdlib.h>
7- #include < string.h>
8- #include < signal.h>
9- #include < time.h>
106#include < optional>
7+ #include < string>
8+ #include < vector>
119
10+ #include < Shared/AppContext.h>
1211#include < AndroidExtensions/Globals.h>
13- #include < Babylon/AppRuntime.h>
14- #include < Babylon/Graphics/Device.h>
15- #include < Babylon/ScriptLoader.h>
16- #include < Babylon/Plugins/NativeEncoding.h>
17- #include < Babylon/Plugins/NativeEngine.h>
18- #include < Babylon/Plugins/NativeInput.h>
1912#include < Babylon/Plugins/NativeXr.h>
20- #include < Babylon/Plugins/NativeCamera.h>
21- #include < Babylon/Plugins/NativeOptimizations.h>
22- #include < Babylon/Polyfills/Blob.h>
23- #include < Babylon/Polyfills/Console.h>
24- #include < Babylon/Polyfills/Window.h>
25- #include < Babylon/Polyfills/XMLHttpRequest.h>
26- #include < Babylon/Polyfills/Canvas.h>
27- #include < Babylon/DebugTrace.h>
2813
2914namespace
3015{
31- std::optional<Babylon::Graphics::Device> device{};
32- std::optional<Babylon::Graphics::DeviceUpdate> deviceUpdate{};
33- std::optional<Babylon::AppRuntime> runtime{};
16+ std::optional<AppContext> appContext{};
3417 std::optional<Babylon::Plugins::NativeXr> nativeXr{};
35- Babylon::Plugins::NativeInput* nativeInput{};
36- std::optional<Babylon::Polyfills::Canvas> nativeCanvas{};
37- std::optional<Babylon::ScriptLoader> scriptLoader{};
3818 bool isXrActive{};
3919}
4020
@@ -48,112 +28,52 @@ extern "C"
4828 JNIEXPORT void JNICALL
4929 Java_com_library_babylonnative_Wrapper_finishEngine (JNIEnv* env, jclass clazz)
5030 {
51- if (device)
52- {
53- deviceUpdate->Finish ();
54- device->FinishRenderingCurrentFrame ();
55- }
56-
5731 isXrActive = false ;
5832
59- scriptLoader.reset ();
60-
61- nativeInput = {};
6233 nativeXr.reset ();
63- scriptLoader.reset ();
64- runtime.reset ();
65- device.reset ();
34+ appContext.reset ();
6635 }
6736
6837 JNIEXPORT void JNICALL
69- Java_com_library_babylonnative_Wrapper_surfaceCreated (JNIEnv* env, jclass clazz, jobject surface, jobject context )
38+ Java_com_library_babylonnative_Wrapper_surfaceCreated (JNIEnv* env, jclass clazz, jobject surface, jobject jniContext )
7039 {
71- if (!runtime )
40+ if (!appContext )
7241 {
7342 JavaVM* javaVM{};
7443 if (env->GetJavaVM (&javaVM) != JNI_OK)
7544 {
7645 throw std::runtime_error (" Failed to get Java VM" );
7746 }
7847
79- android::global::Initialize (javaVM, context);
80-
81- Babylon::DebugTrace::EnableDebugTrace (true );
82- Babylon::DebugTrace::SetTraceOutput ([](const char * trace) { printf (" %s\n " , trace); fflush (stdout); });
48+ android::global::Initialize (javaVM, jniContext);
8349
8450 ANativeWindow* window = ANativeWindow_fromSurface (env, surface);
8551 int32_t width = ANativeWindow_getWidth (window);
8652 int32_t height = ANativeWindow_getHeight (window);
8753
88- Babylon::Graphics::Configuration graphicsConfig{};
89- graphicsConfig.Window = window;
90- graphicsConfig.Width = static_cast <size_t >(width);
91- graphicsConfig.Height = static_cast <size_t >(height);
92- device.emplace (graphicsConfig);
93- deviceUpdate.emplace (device->GetUpdate (" update" ));
94- device->StartRenderingCurrentFrame ();
95- deviceUpdate->Start ();
96-
97- runtime.emplace ();
98-
99- runtime->Dispatch ([](Napi::Env env)
100- {
101- device->AddToJavaScript (env);
102-
103- Babylon::Polyfills::Blob::Initialize (env);
104-
105- Babylon::Polyfills::Console::Initialize (env, [](const char * message, Babylon::Polyfills::Console::LogLevel level)
106- {
107- switch (level)
108- {
109- case Babylon::Polyfills::Console::LogLevel::Log:
110- __android_log_write (ANDROID_LOG_INFO, " BabylonNative" , message);
111- break ;
112- case Babylon::Polyfills::Console::LogLevel::Warn:
113- __android_log_write (ANDROID_LOG_WARN, " BabylonNative" , message);
114- break ;
115- case Babylon::Polyfills::Console::LogLevel::Error:
116- __android_log_write (ANDROID_LOG_ERROR, " BabylonNative" , message);
117- break ;
118- }
54+ appContext.emplace (
55+ window,
56+ static_cast <size_t >(width),
57+ static_cast <size_t >(height),
58+ [](const char * message) {
59+ __android_log_write (ANDROID_LOG_INFO, " BabylonNative" , message);
60+ },
61+ [](Napi::Env env) {
62+ nativeXr.emplace (Babylon::Plugins::NativeXr::Initialize (env));
63+ nativeXr->SetSessionStateChangedCallback ([](bool isXrActive){ ::isXrActive = isXrActive; });
11964 });
120-
121- Babylon::Plugins::NativeEncoding::Initialize (env);
122- Babylon::Plugins::NativeEngine::Initialize (env);
123- Babylon::Plugins::NativeOptimizations::Initialize (env);
124-
125- nativeXr.emplace (Babylon::Plugins::NativeXr::Initialize (env));
126- nativeXr->SetSessionStateChangedCallback ([](bool isXrActive){ ::isXrActive = isXrActive; });
127-
128- nativeInput = &Babylon::Plugins::NativeInput::CreateForJavaScript (env);
129-
130- Babylon::Plugins::NativeCamera::Initialize (env);
131- Babylon::Polyfills::Window::Initialize (env);
132-
133- Babylon::Polyfills::XMLHttpRequest::Initialize (env);
134- nativeCanvas.emplace (Babylon::Polyfills::Canvas::Initialize (env));
135- });
136-
137- scriptLoader.emplace (*runtime);
138- scriptLoader->LoadScript (" app:///Scripts/ammo.js" );
139- scriptLoader->LoadScript (" app:///Scripts/recast.js" );
140- scriptLoader->LoadScript (" app:///Scripts/babylon.max.js" );
141- scriptLoader->LoadScript (" app:///Scripts/babylonjs.loaders.js" );
142- scriptLoader->LoadScript (" app:///Scripts/babylonjs.materials.js" );
143- scriptLoader->LoadScript (" app:///Scripts/babylon.gui.js" );
144- scriptLoader->LoadScript (" app:///Scripts/babylonjs.serializers.js" );
14565 }
14666 }
14767
14868 JNIEXPORT void JNICALL
14969 Java_com_library_babylonnative_Wrapper_surfaceChanged (JNIEnv* env, jclass clazz, jint width, jint height, jobject surface)
15070 {
151- if (runtime )
71+ if (appContext )
15272 {
15373 ANativeWindow* window = ANativeWindow_fromSurface (env, surface);
154- runtime-> Dispatch ([window, width = static_cast <size_t >(width), height = static_cast <size_t >(height)](auto ) {
155- device-> UpdateWindow (window);
156- device-> UpdateSize (width, height);
74+ appContext-> Runtime (). Dispatch ([window, width = static_cast <size_t >(width), height = static_cast <size_t >(height)](auto ) {
75+ appContext-> Device (). UpdateWindow (window);
76+ appContext-> Device (). UpdateSize (width, height);
15777 });
15878 }
15979 }
@@ -168,18 +88,18 @@ extern "C"
16888 Java_com_library_babylonnative_Wrapper_activityOnPause (JNIEnv* env, jclass clazz)
16989 {
17090 android::global::Pause ();
171- if (runtime )
91+ if (appContext )
17292 {
173- runtime-> Suspend ();
93+ appContext-> Runtime (). Suspend ();
17494 }
17595 }
17696
17797 JNIEXPORT void JNICALL
17898 Java_com_library_babylonnative_Wrapper_activityOnResume (JNIEnv* env, jclass clazz)
17999 {
180- if (runtime )
100+ if (appContext )
181101 {
182- runtime-> Resume ();
102+ appContext-> Runtime (). Resume ();
183103 }
184104 android::global::Resume ();
185105 }
@@ -207,50 +127,50 @@ extern "C"
207127 JNIEXPORT void JNICALL
208128 Java_com_library_babylonnative_Wrapper_loadScript (JNIEnv* env, jclass clazz, jstring path)
209129 {
210- if (scriptLoader )
130+ if (appContext )
211131 {
212- scriptLoader-> LoadScript (env->GetStringUTFChars (path, nullptr ));
132+ appContext-> ScriptLoader (). LoadScript (env->GetStringUTFChars (path, nullptr ));
213133 }
214134 }
215135
216136 JNIEXPORT void JNICALL
217137 Java_com_library_babylonnative_Wrapper_eval (JNIEnv* env, jclass clazz, jstring source, jstring sourceURL)
218138 {
219- if (runtime )
139+ if (appContext )
220140 {
221141 std::string url = env->GetStringUTFChars (sourceURL, nullptr );
222142 std::string src = env->GetStringUTFChars (source, nullptr );
223- scriptLoader-> Eval (std::move (src), std::move (url));
143+ appContext-> ScriptLoader (). Eval (std::move (src), std::move (url));
224144 }
225145 }
226146
227147 JNIEXPORT void JNICALL
228148 Java_com_library_babylonnative_Wrapper_setTouchInfo (JNIEnv* env, jclass clazz, jint pointerId, jfloat x, jfloat y, jboolean buttonAction, jint buttonValue)
229149 {
230- if (nativeInput != nullptr )
150+ if (appContext && appContext-> Input () )
231151 {
232152 if (buttonAction)
233153 {
234154 if (buttonValue == 1 )
235- nativeInput ->TouchDown (pointerId, x, y);
155+ appContext-> Input () ->TouchDown (pointerId, x, y);
236156 else
237- nativeInput ->TouchUp (pointerId, x, y);
157+ appContext-> Input () ->TouchUp (pointerId, x, y);
238158 }
239159 else {
240- nativeInput ->TouchMove (pointerId, x, y);
160+ appContext-> Input () ->TouchMove (pointerId, x, y);
241161 }
242162 }
243163 }
244164
245165 JNIEXPORT void JNICALL
246166 Java_com_library_babylonnative_Wrapper_renderFrame (JNIEnv* env, jclass clazz)
247167 {
248- if (device )
168+ if (appContext )
249169 {
250- deviceUpdate-> Finish ();
251- device-> FinishRenderingCurrentFrame ();
252- device-> StartRenderingCurrentFrame ();
253- deviceUpdate-> Start ();
170+ appContext-> DeviceUpdate (). Finish ();
171+ appContext-> Device (). FinishRenderingCurrentFrame ();
172+ appContext-> Device (). StartRenderingCurrentFrame ();
173+ appContext-> DeviceUpdate (). Start ();
254174 }
255175 }
256176
0 commit comments