Skip to content

Commit 846933b

Browse files
authored
Factor out shared parts of the playground (#1593)
1 parent 18aecc8 commit 846933b

File tree

13 files changed

+543
-879
lines changed

13 files changed

+543
-879
lines changed

Apps/Playground/Android/BabylonNative/CMakeLists.txt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ get_filename_component(REPO_ROOT_DIR "${PLAYGROUND_DIR}/../.." ABSOLUTE)
1010

1111
add_subdirectory(${REPO_ROOT_DIR} "${CMAKE_CURRENT_BINARY_DIR}/BabylonNative")
1212

13-
1413
add_library(BabylonNativeJNI SHARED
15-
src/main/cpp/BabylonNativeJNI.cpp)
14+
src/main/cpp/BabylonNativeJNI.cpp
15+
${PLAYGROUND_DIR}/Shared/AppContext.cpp)
1616

1717
target_include_directories(BabylonNativeJNI
18-
PRIVATE ${PLAYGROUND_DIR}/Shared)
18+
PRIVATE ${PLAYGROUND_DIR})
1919

2020
target_link_libraries(BabylonNativeJNI
2121
GLESv3
@@ -30,11 +30,14 @@ target_link_libraries(BabylonNativeJNI
3030
Console
3131
GraphicsDevice
3232
NativeCamera
33+
NativeCapture
3334
NativeEncoding
3435
NativeEngine
3536
NativeInput
3637
NativeOptimizations
38+
NativeTracing
3739
NativeXr
3840
ScriptLoader
39-
XMLHttpRequest
40-
Window)
41+
TestUtils
42+
Window
43+
XMLHttpRequest)

Apps/Playground/Android/BabylonNative/src/main/cpp/BabylonNativeJNI.cpp

Lines changed: 39 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,18 @@
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

2914
namespace
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

Apps/Playground/CMakeLists.txt

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ set(SCRIPTS
1818
"Scripts/validation_native.js"
1919
"Scripts/config.json")
2020

21+
set(SOURCES
22+
"Shared/AppContext.cpp"
23+
"Shared/AppContext.h")
24+
2125
if(APPLE)
2226
find_library(JAVASCRIPTCORE_LIBRARY JavaScriptCore)
2327
if(IOS)
@@ -28,8 +32,7 @@ if(APPLE)
2832
"${CMAKE_CURRENT_LIST_DIR}/iOS/Base.lproj/LaunchScreen.storyboard")
2933
set(RESOURCE_FILES ${STORYBOARD} ${SCRIPTS})
3034
set(ADDITIONAL_LIBRARIES PRIVATE z NativeXr)
31-
set(SOURCES
32-
${SOURCES}
35+
set(SOURCES ${SOURCES}
3336
"iOS/AppDelegate.swift"
3437
"iOS/ViewController.swift"
3538
"iOS/LibNativeBridge.h"
@@ -42,8 +45,7 @@ if(APPLE)
4245
set(PLIST_FILE
4346
"${CMAKE_CURRENT_LIST_DIR}/visionOS/Info.plist")
4447
set(RESOURCE_FILES ${SCRIPTS})
45-
set(SOURCES
46-
${SOURCES}
48+
set(SOURCES ${SOURCES}
4749
"visionOS/App.swift"
4850
"visionOS/LibNativeBridge.mm"
4951
"visionOS/LibNativeBridge.h"
@@ -55,8 +57,7 @@ if(APPLE)
5557
set(STORYBOARD "${CMAKE_CURRENT_LIST_DIR}/macOS/Base.lproj/Main.storyboard")
5658
set(ADDITIONAL_LIBRARIES ${ADDITIONAL_LIBRARIES} PRIVATE NativeCamera)
5759
set(RESOURCE_FILES ${STORYBOARD})
58-
set(SOURCES
59-
${SOURCES}
60+
set(SOURCES ${SOURCES}
6061
"macOS/main.m"
6162
"macOS/AppDelegate.m"
6263
"macOS/AppDelegate.h"
@@ -72,8 +73,7 @@ if(APPLE)
7273
string(REPLACE "-Wall" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
7374
string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
7475
elseif(UNIX)
75-
set(SOURCES
76-
${SOURCES}
76+
set(SOURCES ${SOURCES}
7777
"X11/App.cpp")
7878
elseif(WINDOWS_STORE)
7979
set(APPX_FILES "UWP/Package.appxmanifest" "UWP/TemporaryKey.pfx")
@@ -88,15 +88,13 @@ elseif(WINDOWS_STORE)
8888
"UWP/Assets/Wide310x150Logo.scale-200.png")
8989
set_property(SOURCE ${APPX_ASSETS} PROPERTY VS_DEPLOYMENT_CONTENT 1)
9090
set_property(SOURCE ${APPX_ASSETS} PROPERTY VS_DEPLOYMENT_LOCATION "Assets")
91-
set(SOURCES
92-
${SOURCES}
91+
set(SOURCES ${SOURCES}
9392
${APPX_FILES}
9493
${APPX_ASSETS}
9594
"UWP/App.cpp"
9695
"UWP/App.h")
9796
elseif(WIN32)
98-
set(SOURCES
99-
${SOURCES}
97+
set(SOURCES ${SOURCES}
10098
"Win32/App.cpp"
10199
"Win32/App.h"
102100
"Win32/App.ico"
@@ -123,7 +121,7 @@ if(WINDOWS_STORE)
123121
target_compile_options(Playground PRIVATE /await)
124122
endif()
125123

126-
target_include_directories(Playground PRIVATE "Source" ".")
124+
target_include_directories(Playground PRIVATE ".")
127125

128126
target_link_libraries(Playground
129127
PRIVATE AppRuntime
@@ -132,16 +130,17 @@ target_link_libraries(Playground
132130
PRIVATE Console
133131
PRIVATE ExternalTexture
134132
PRIVATE GraphicsDevice
135-
PRIVATE NativeTracing
133+
PRIVATE NativeCamera
136134
PRIVATE NativeCapture
137135
PRIVATE NativeEncoding
138136
PRIVATE NativeEngine
139137
PRIVATE NativeInput
140138
PRIVATE NativeOptimizations
139+
PRIVATE NativeTracing
141140
PRIVATE ScriptLoader
141+
PRIVATE TestUtils
142142
PRIVATE Window
143143
PRIVATE XMLHttpRequest
144-
PRIVATE TestUtils
145144
${ADDITIONAL_LIBRARIES}
146145
${BABYLON_NATIVE_PLAYGROUND_EXTENSION_LIBRARIES})
147146

0 commit comments

Comments
 (0)