Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
c0a3982
GS Datastream
CedricGuillemet Oct 31, 2025
0d6946e
leftover
CedricGuillemet Oct 31, 2025
8d148da
notice, disabled warnings
CedricGuillemet Oct 31, 2025
d7a3fd2
warnings
CedricGuillemet Oct 31, 2025
b0a9a90
unused field
CedricGuillemet Oct 31, 2025
cdc7d64
TextDecoder and up bjs
CedricGuillemet Nov 3, 2025
db7cc88
canvas + webp
CedricGuillemet Nov 3, 2025
8d76667
gzip data stream
CedricGuillemet Nov 4, 2025
ab92f9e
removed extra qualif
CedricGuillemet Nov 4, 2025
266e650
libdeflate for gzip stream
CedricGuillemet Nov 4, 2025
98f1658
unity build disabled for miniz and libdeflate
CedricGuillemet Nov 4, 2025
0688bde
unity build
CedricGuillemet Nov 4, 2025
32fdab0
Response
CedricGuillemet Nov 5, 2025
c039c33
Merge branch 'master' of https://github.com/babylonjs/BabylonNative i…
CedricGuillemet Nov 12, 2025
1a66ea2
Merge branch 'master' of https://github.com/babylonjs/BabylonNative i…
CedricGuillemet Nov 14, 2025
c2ac387
Merge branch 'master' of https://github.com/babylonjs/BabylonNative i…
CedricGuillemet Nov 17, 2025
3fd0328
removed perf test, up bjs
CedricGuillemet Nov 17, 2025
6f128e8
revert bjs to 8.25.1
CedricGuillemet Nov 17, 2025
6115bad
fix webpack
CedricGuillemet Nov 17, 2025
13dfdd5
a bit faster by avoiding copy
CedricGuillemet Nov 18, 2025
2ed2d93
Merge branch 'master' of https://github.com/babylonjs/BabylonNative i…
CedricGuillemet Nov 18, 2025
dcc7c66
Merge branch 'master' of https://github.com/babylonjs/BabylonNative i…
CedricGuillemet Nov 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Apps/Playground/Android/BabylonNative/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ target_link_libraries(BabylonNativeJNI
GraphicsDevice
NativeCamera
NativeEngine
DataStream
NativeInput
NativeOptimizations
NativeXr
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <Babylon/Plugins/NativeXr.h>
#include <Babylon/Plugins/NativeCamera.h>
#include <Babylon/Plugins/NativeOptimizations.h>
#include <Babylon/Plugins/DataStream.h>
#include <Babylon/Polyfills/Console.h>
#include <Babylon/Polyfills/Window.h>
#include <Babylon/Polyfills/XMLHttpRequest.h>
Expand Down Expand Up @@ -123,6 +124,7 @@ extern "C"
nativeInput = &Babylon::Plugins::NativeInput::CreateForJavaScript(env);

Babylon::Plugins::NativeCamera::Initialize(env);
Babylon::Plugins::DataStream::Initialize(env);
Babylon::Polyfills::Window::Initialize(env);

Babylon::Polyfills::XMLHttpRequest::Initialize(env);
Expand Down
1 change: 1 addition & 0 deletions Apps/Playground/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ target_link_libraries(Playground
PRIVATE GraphicsDevice
PRIVATE NativeCapture
PRIVATE NativeEngine
PRIVATE DataStream
PRIVATE NativeInput
PRIVATE NativeOptimizations
PRIVATE ScriptLoader
Expand Down
3 changes: 2 additions & 1 deletion Apps/Playground/UWP/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <Babylon/ScriptLoader.h>
#include <Babylon/Plugins/NativeEngine.h>
#include <Babylon/Plugins/NativeOptimizations.h>
#include <Babylon/Plugins/DataStream.h>
#include <Babylon/Polyfills/Console.h>
#include <Babylon/Polyfills/Window.h>
#include <Babylon/Polyfills/XMLHttpRequest.h>
Expand Down Expand Up @@ -393,7 +394,7 @@ void App::RestartRuntime(Windows::Foundation::Rect bounds)
m_nativeCanvas.emplace(Babylon::Polyfills::Canvas::Initialize(env));

Babylon::Polyfills::Window::Initialize(env);

Babylon::Plugins::DataStream::Initialize(env);
Babylon::Polyfills::XMLHttpRequest::Initialize(env);

Babylon::Plugins::NativeEngine::Initialize(env);
Expand Down
3 changes: 2 additions & 1 deletion Apps/Playground/Win32/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <Babylon/Plugins/NativeCamera.h>
#include <Babylon/Plugins/NativeInput.h>
#include <Babylon/Plugins/TestUtils.h>
#include <Babylon/Plugins/DataStream.h>
#include <Babylon/Polyfills/Console.h>
#include <Babylon/Polyfills/Window.h>
#include <Babylon/Polyfills/XMLHttpRequest.h>
Expand Down Expand Up @@ -177,7 +178,7 @@ namespace
});

Babylon::Polyfills::Window::Initialize(env);

Babylon::Plugins::DataStream::Initialize(env);
Babylon::Polyfills::XMLHttpRequest::Initialize(env);

nativeCanvas.emplace(Babylon::Polyfills::Canvas::Initialize(env));
Expand Down
2 changes: 2 additions & 0 deletions Apps/Playground/X11/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <Babylon/Plugins/NativeOptimizations.h>
#include <Babylon/Plugins/NativeInput.h>
#include <Babylon/Plugins/TestUtils.h>
#include <Babylon/Plugins/DataStream.h>
#include <Babylon/Polyfills/Console.h>
#include <Babylon/Polyfills/Window.h>
#include <Babylon/Polyfills/XMLHttpRequest.h>
Expand Down Expand Up @@ -76,6 +77,7 @@ namespace
});

Babylon::Polyfills::Window::Initialize(env);
Babylon::Plugins::DataStream::Initialize(env);
Babylon::Polyfills::XMLHttpRequest::Initialize(env);
nativeCanvas.emplace(Babylon::Polyfills::Canvas::Initialize(env));

Expand Down
3 changes: 2 additions & 1 deletion Apps/Playground/iOS/LibNativeBridge.mm
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#import <Babylon/Plugins/NativeInput.h>
#import <Babylon/Plugins/NativeOptimizations.h>
#import <Babylon/Plugins/NativeXr.h>
#import <Babylon/Plugins/DataStream.h>
#import <Babylon/Polyfills/Canvas.h>
#import <Babylon/Polyfills/Console.h>
#import <Babylon/Polyfills/Window.h>
Expand Down Expand Up @@ -81,7 +82,7 @@ - (void)init:(MTKView*)view screenScale:(float)inScreenScale width:(int)inWidth
nativeCanvas.emplace(Babylon::Polyfills::Canvas::Initialize(env));

Babylon::Polyfills::Window::Initialize(env);

Babylon::Plugins::DataStream::Initialize(env);
Babylon::Polyfills::XMLHttpRequest::Initialize(env);

Babylon::Plugins::NativeCamera::Initialize(env);
Expand Down
3 changes: 2 additions & 1 deletion Apps/Playground/macOS/ViewController.mm
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#import <Babylon/Graphics/Device.h>
#import <Babylon/Plugins/NativeEngine.h>
#import <Babylon/Plugins/NativeInput.h>
#import <Babylon/Plugins/DataStream.h>
#import <Babylon/Polyfills/Window.h>
#import <Babylon/Polyfills/XMLHttpRequest.h>
#import <Babylon/Polyfills/Canvas.h>
Expand Down Expand Up @@ -123,7 +124,7 @@ - (void)refreshBabylon {
});

Babylon::Polyfills::Window::Initialize(env);

Babylon::Plugins::DataStream::Initialize(env);
Babylon::Polyfills::XMLHttpRequest::Initialize(env);

nativeCanvas.emplace(Babylon::Polyfills::Canvas::Initialize(env));
Expand Down
3 changes: 2 additions & 1 deletion Apps/Playground/visionOS/LibNativeBridge.mm
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#import <Babylon/Plugins/NativeEngine.h>
#import <Babylon/Plugins/NativeInput.h>
#import <Babylon/Plugins/NativeOptimizations.h>
#import <Babylon/Plugins/DataStream.h>
#import <Babylon/Polyfills/Canvas.h>
#import <Babylon/Polyfills/Console.h>
#import <Babylon/Polyfills/Window.h>
Expand Down Expand Up @@ -60,7 +61,7 @@ - (bool)initializeWithWidth:(NSInteger)width height:(NSInteger)height {
self->_nativeCanvas.emplace(Babylon::Polyfills::Canvas::Initialize(env));

Babylon::Polyfills::Window::Initialize(env);

Babylon::Plugins::DataStream::Initialize(env);
Babylon::Polyfills::XMLHttpRequest::Initialize(env);

Babylon::Plugins::NativeEngine::Initialize(env);
Expand Down
1 change: 1 addition & 0 deletions Apps/UnitTests/Android/app/src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ target_link_libraries(UnitTestsJNI
PRIVATE GraphicsDevice
PRIVATE NativeCamera
PRIVATE NativeEngine
PRIVATE DataStream
PRIVATE NativeInput
PRIVATE NativeOptimizations
PRIVATE NativeEncoding
Expand Down
1 change: 1 addition & 0 deletions Apps/UnitTests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ target_link_libraries(UnitTests
PRIVATE Console
PRIVATE GraphicsDevice
PRIVATE NativeEngine
PRIVATE DataStream
PRIVATE NativeEncoding
PRIVATE ScriptLoader
PRIVATE UrlLib
Expand Down
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ FetchContent_Declare(SPIRV-Cross
FetchContent_Declare(libwebp
GIT_REPOSITORY https://github.com/webmproject/libwebp.git
GIT_TAG 57e324e2eb99be46df46d77b65705e34a7ae616c)
FetchContent_Declare(miniz
GIT_REPOSITORY https://github.com/richgel999/miniz.git
GIT_TAG 174573d60290f447c13a2b1b3405de2b96e27d6c)

# --------------------------------------------------

FetchContent_MakeAvailable(CMakeExtensions)
Expand Down Expand Up @@ -102,6 +106,7 @@ option(BABYLON_NATIVE_PLUGIN_NATIVEOPTIMIZATIONS "Include Babylon Native Plugin
option(BABYLON_NATIVE_PLUGIN_NATIVETRACING "Include Babylon Native Plugin NativeTracing." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVEXR "Include Babylon Native Plugin XR." ON)
option(BABYLON_NATIVE_PLUGIN_TESTUTILS "Include Babylon Native Plugin TestUtils." ON)
option(BABYLON_NATIVE_PLUGIN_DATASTREAM "Include Babylon Native Plugin DataStream." ON)

# Polyfills
option(BABYLON_NATIVE_POLYFILL_WINDOW "Include Babylon Native Polyfill Window." ON)
Expand Down
7 changes: 7 additions & 0 deletions Dependencies/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -233,3 +233,10 @@ endif()
if(WINDOWS_STORE)
add_subdirectory(WindowsAppSDK)
endif()

# --------------------------------------------------
# miniz
# --------------------------------------------------
if(BABYLON_NATIVE_PLUGIN_DATASTREAM)
FetchContent_MakeAvailable_With_Message(miniz)
endif()
1 change: 1 addition & 0 deletions Install/Test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ target_link_libraries(TestInstall
NativeCamera
NativeCapture
NativeEngine
DataStream
NativeInput
NativeOptimizations
NativeTracing
Expand Down
4 changes: 4 additions & 0 deletions Plugins/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,7 @@ endif()
if(BABYLON_NATIVE_PLUGIN_NATIVEENCODING)
add_subdirectory(NativeEncoding)
endif()

if(BABYLON_NATIVE_PLUGIN_DATASTREAM)
add_subdirectory(DataStream)
endif()
18 changes: 18 additions & 0 deletions Plugins/DataStream/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
set(SOURCES
"Include/Babylon/Plugins/DataStream.h"
"Source/DataStream.h"
"Source/DataStream.cpp")

add_library(DataStream ${SOURCES})
warnings_as_errors(DataStream)

target_include_directories(DataStream PUBLIC
"Include")

target_link_libraries(DataStream
PUBLIC napi
PRIVATE miniz
PRIVATE JsRuntimeInternal)

set_property(TARGET DataStream PROPERTY FOLDER Plugins)
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES})
8 changes: 8 additions & 0 deletions Plugins/DataStream/Include/Babylon/Plugins/DataStream.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#pragma once

#include <napi/env.h>

namespace Babylon::Plugins::DataStream
{
void BABYLON_API Initialize(Napi::Env env);
}
87 changes: 87 additions & 0 deletions Plugins/DataStream/Source/DataStream.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#include "DataStream.h"

#include <functional>
#include <sstream>
#include <Babylon/JsRuntime.h>

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4505) // unreferenced function with internal linkage has been removed
#endif // _MSC_VER

#include "miniz.h"

#ifdef _MSC_VER
#pragma warning(pop)
#endif // _MSC_VER

namespace Babylon::Plugins::Internal
{
Napi::Value DataStream::UnzipSync(const Napi::CallbackInfo& info)
{
const Napi::Env env{ info.Env() };
if (info.Length() < 1 || !info[0].IsTypedArray()) {
throw Napi::Error::New(info.Env(), "Expected Uint8Array argument");
}

// zip content
Napi::Uint8Array input = info[0].As<Napi::Uint8Array>();
const uint8_t* zipData = input.Data();
const size_t zipSize = input.ByteLength();

// initialize miniz ZIP archive
mz_zip_archive zip_archive;
memset(&zip_archive, 0, sizeof(zip_archive));

if (!mz_zip_reader_init_mem(&zip_archive, zipData, zipSize, 0)) {
throw Napi::Error::New(info.Env(), "Failed to initialize zip archive");
}

// result object
Napi::Object result = Napi::Object::New(env);
const auto fileCount = mz_zip_reader_get_num_files(&zip_archive);

for (mz_uint i = 0; i < fileCount; i++) {
mz_zip_archive_file_stat file_stat;
if (!mz_zip_reader_file_stat(&zip_archive, i, &file_stat)) {
continue;
}

if (mz_zip_reader_is_file_a_directory(&zip_archive, i)) {
continue; // skip directories
}

std::string filename(file_stat.m_filename);

// extract file to memory
size_t uncompressed_size = (size_t)file_stat.m_uncomp_size;
std::vector<uint8_t> buffer(uncompressed_size);

if (!mz_zip_reader_extract_to_mem(&zip_archive, i, buffer.data(), uncompressed_size, 0)) {
throw Napi::Error::New(info.Env(), "Failed to extract file");
continue;
}

// file content
Napi::ArrayBuffer jsBuffer = Napi::ArrayBuffer::New(env, uncompressed_size);
memcpy(jsBuffer.Data(), buffer.data(), uncompressed_size);
Napi::Uint8Array jsArray = Napi::Uint8Array::New(env, uncompressed_size, jsBuffer, 0);

// result[filename] = Uint8Array
result.Set(Napi::String::New(env, filename), jsArray);
}

// done
mz_zip_reader_end(&zip_archive);

return result;
}
}

namespace Babylon::Plugins::DataStream
{
void BABYLON_API Initialize(Napi::Env env)
{
Internal::DataStream::CreateInstance(env);
}
}
44 changes: 44 additions & 0 deletions Plugins/DataStream/Source/DataStream.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#pragma once
#include <napi/env.h>

#include <Babylon/JsRuntime.h>

namespace Babylon::Plugins::Internal
{
class DataStream final : public Napi::ObjectWrap<DataStream>
{
public:
static inline constexpr const char* JS_INSTANCE_NAME{"fflate"};

using ParentT = Napi::ObjectWrap<DataStream>;

static void CreateInstance(Napi::Env env)
{
Napi::HandleScope scope{env};

Napi::Object fflate = Napi::Object::New(env);

fflate.Set("unzipSync", Napi::Function::New(env, DataStream::UnzipSync, "unzipSync"));

// Attach to global scope
env.Global().Set("fflate", fflate);
}

DataStream(const Napi::CallbackInfo& info)
: DataStream(info, JsRuntime::GetFromJavaScript(info.Env()))
{
}

explicit DataStream(const Napi::CallbackInfo& info, JsRuntime& runtime)
: ParentT{info}
, m_runtime{runtime}
{
}

private:
JsRuntime& m_runtime;

static Napi::Value UnzipSync(const Napi::CallbackInfo& info);

};
} // namespace
Loading