Release 1.0.0

Release 1.0.0

Find the full changelog below.

Wonderland Engine 1.0.0 is about building a strong foundation for future versions:

By integrating NodeJS and esbuild for bundling, we are able to make all projects NodeJS based while keeping the convenience of the previous internal bundler. And we made sharing components as npm packages easier than ever before.

We rewrote the JavaScript API in TypeScript. Even if you keep using JavaScript for your projects, you will notice how your IDE is able to make more intelligent suggestions because of it. But then you would miss out on fancy new features like:

1@property.string('Hello TypeScript!')
2message!: string;

With the rewrite, we created a thorough test suite and fixed a large amount of bugs. Read all about the new API in our “Wonderland Engine 1.0.0 JavaScript Migration” blog post.

For rendering, we made some important changes, like adapting the lighting model of our default shaders to use a more intuitive intensity setting to replace attenuation. These changes are paving the way for wonderful rendering features in the future.

Wonderland Editor is the heart of the Wonderland Engine development workflow. We added a new experimental feature to launch your project directly onto Android devices, e.g. standalone VR browsers, setting up port-forwarding for you.

Finally, the open web enables you to reach a wide audience. Not just device compatibility, but also language can be a barrier. We added tools to help you translate your projects and reach an even wider audience.

Find the full changelog below.

Breaking Changes 

Because we care about backwards compatibility a lot, we do not often get the chance to break things. With the major version switch, we have a rare opportunity to clean up and make things right.

So we were thorough, but we took the community with us! Your favorite libraries are already up to date and ready to go with the new version.

Here are a few examples of changes we made and how we decided on them. We are excited to see what you think of the result.

Example: .getTranslationWorld() and .getTransformationWorld() are dangerously similar. Even with auto-completion in your IDE, you might not realize you are using the wrong function. Instead, we now use “Position” instead of “Translation” to describe the position of an object.

Example: the old API was storing everything in a global WL object. That made it difficult to embed Wonderland Engine into other libraries, or running multiple instances on one page. Now that instances of Wonderland Engine are wrapped in a WonderlandEngine class, you have full control over how and when you instantiate it.



  • Added Benchmarking view
  • Added Localization view to aid translation of WebXR experiences
  • Added WL_EDITOR JavaScript macro, which is set to true for when the editor bundles components
  • Added alpha value slider to color pickers
  • Added choice for ETC1S (smaller, default) and UASTC (higher quality) for image compression
  • Added defaults for Sky Material colorStop properties
  • Added devices drop-down to launch page directly on connected Android devices instead of local device (port forwarding automatically set up)
  • Packaging: Removed unused VR and AR button SVGs
  • Windows: Fixed random error messages produce from file watch
  • Animation component with empty animations are now inactive at runtime
  • Automatically detect components from scripts and npm packages
  • Fixed a rare bug where a component added in the editor could return undefined when retrieved at runtime
  • Fixed random darkening of the entire UI when making various changes to the project
  • Fixed rotation Gizmo behavior on objects with non-uniform scaled ancestors
  • Fixed crashes when switching projects
  • Fixed retargeting of some FBX files
  • Fixed crashes and import errors with some FBX files
  • When retargeting, tracks for which no new target could be found are now dropped
  • Made all color property alpha values default to 1.0
  • Negative text component spacing values can now be set
  • Removed legacy JavaScript bundler in favor of default “esbuild” bundler
  • Removed “8thwallToken” setting in favor of specifying in the entrypoint script
  • Text materials now have thumbnails
  • Fonts now have thumbnails
  • CLI
    • Fix –import command not instantiating the scene
    • Tokens were added as a more secure method of passing credentials to the editor for packaging on CI
    • Added benchmarking framework
  • Linux
    • Fixed file watching
    • Fixed modifier key states
  • Views
    • Asset Browser: Deleted files are now moved into system trash folder instead of deleting permanently
    • Asset Browser: Working directories for default applications launched on double click is now project root
    • Console: Error, Warning, Info checkbox states are now persisted per project
    • Console: Fixed horizontal scroll
    • Project Settings: Fixed huge lag when changing editor server port
    • Properties: Fixed pasting of Euler rotations
    • Resources: Added horizontal scroll to ensure entirety of the tables can be read even on smaller screens
    • Profiler: Improved which profile sections are enabled by default
  • Scene import
    • Optimized mesh processing
    • Added import for more light properties


  • Rendering
    • Fixed texture seam on Sky shader
    • Updated to latest Slug Library
  • Fixed shadowing bug due to internal shadow count was not updated
  • Improved GPU profiling queries
  • Negative animation speed now plays the animation backwards
  • Shaders are now compiled asynchronously for even faster loading times
  • Support UASTC compression
  • Switched animation engine for upcoming features
  • Systematically fix various rare crashes due to out of bounds array access
  • Light “attenuation” was removed in favor for a more intuitive “intensity”
  • Phong
    • Ambient term is now retrieved by multiplying ambient color with the diffuse term
    • Diffuse color is now multiplied with the diffuse texture
    • Vertex color is now multiplied with diffuse texture and color
    • Default light distance model is now a standard inverse squared falloff (old behavior is deprecated but still available through a feature checkbox)
    • Added a basic TONE_MAPPING feature
  • Flat
    • Vertex color is now multiplied with color and texture
  • Optimized CPU times of Texture Streaming
  • Fixed various rare Texture Streaming crashes
  • Added more profile sections to Profiler


  • PWA: Fixed various files not cached by service worker for offline use
  • Fixed a potential crash in Profiler
  • Fixed input type “Head”
  • Fully consumed .bin file data is now discarded after load, improving memory use
  • It is now possible to use multiple engine instances on a single webpage
  • Lowered maximum available WebAssembly memory to 512 MB for better debugging experience and older iOS hardware compatibility
  • The WebAssembly is now properly modularized to allow use with any other WebAssembly module
  • Resize is now handled through ResizeObserver

JavaScript API

  • TypeScript
    • Added @property.<type> decorator to define configurable properties directly in the class body
    • Fully rewrote the API in TypeScript
  • Added, PhysXComponent.block and many more missing properties
  • Added XR.currentReferenceSpace, XR.currentReferenceSpaceType and XR.referenceSpaceForType
  • Added XR and WonderlandEngine.xr for access to WebXR related state
  • Added a huge amount of new automated tests
  • Added a new Color property type
  • Added equals() methods for Mesh, Material, Texture, Animation and Skin
  • Added LightComponent.setColor
  • Added _wl_nextUpdate and _wl_nextFrame to enable automated testing of components
  • Added remaining LightComponent properties
  • LightComponent.color now returns only 3-elements for RGB
  • Added runtime and API version compatibility checks
  • Added onRegister to allow running addition behavior when a component is registered
  • All of the API’s global state has been removed
  • Custom components are now classes: export class CustomComponent extends Component
  • Fixed AnimationComponent.state returning incorrect enum values
  • Fixed Object3D.lookAt() and clarified its behavior in the documentation
  • Fixed cloning of components with Object3D.addComponent(type, otherComponent)
  • Fixed Component.destroy() only destroying, but not removing components from objects
  • Fixed RayHit.objects elements not null for unused indices
  • Made default parameters apply consistent with the editor
  • Removed onXRSupported callback, as WonderlandEngine.arSupported and WonderlandEngine.vrSupported are now available from the start of the application
  • Renamed Material.shader to Material.pipeline
  • Replaced callbacks arrays (onSceneLoaded, onXRSessionStart, …) with a new Emitter class
  • onXRSessionStart is now a RetainEmitter, which triggers callbacks immediately if an XR session is already running.
  • AnimationComponent.animation now properly returns null when unset
  • Component.onDestroy is now called when a new scene is loaded
  • Object is now Object3D to avoid shadowing built-in JavaScript type
  • Scene.load() and Scene.append() are now async
  • Renamed Translation functions to Position to avoid confusion with Transform functions


  • Converted all components to classes
  • Converted some components to TypeScript
  • Added trail component
  • Added plane-detection component
  • Added anchor component
  • cursor-target: Deprecated add*Function in favor of onClick, onHover, onUnhover, onMove event emitters

Known Issues

  • Input via WebXR Emulator extensions doesn’t work
  • Missing custom components can cause a packaging loop on Windows
Last Update: May 1, 2023

Stay up to date.