diff --git a/docs/blog/2024-11-08-updated-bitbybit-runners.md b/docs/blog/2024-11-08-updated-bitbybit-runners.md
index 49d15384..01883110 100644
--- a/docs/blog/2024-11-08-updated-bitbybit-runners.md
+++ b/docs/blog/2024-11-08-updated-bitbybit-runners.md
@@ -121,7 +121,7 @@ We are serving the Bitbybit Runners from the **JSDelivr CDN**. You can include t
```
-**Note:** You should replace `` with an actual version number (e.g., `0.20.6`). You can find all the official versions of Bitbybit.dev here:
+**Note:** You should replace `` with an actual version number (e.g., `0.20.7`). You can find all the official versions of Bitbybit.dev here:
➡️ **[Bitbybit.dev GitHub Releases](https://github.com/bitbybit-dev/bitbybit/releases)**
### Examples of the Runners
diff --git a/docs/learn/3d-bits/faq.md b/docs/learn/3d-bits/faq.md
index b4c9cee4..28b2f2f5 100644
--- a/docs/learn/3d-bits/faq.md
+++ b/docs/learn/3d-bits/faq.md
@@ -24,7 +24,7 @@ As 3D Bits makes its way into Shopify stores, we’ve started getting some recur
**Yes, absolutely!** If you can click buttons and copy-paste, you’re good to go for basic 3D model display.
**Here's the simple process:**
-1. Install 3D Bits app, subscribe to Annual Base plan to begin your trial and pin the app.
+1. Install 3D Bits app, subscribe to Base plan to begin your trial and pin the app.
2. Go to Metafields sections within the app admin page and hit create button.
3. Upload your 3D models to Shopify via **Content > Files**.
4. Copy the link to your uploaded 3D model.
@@ -76,7 +76,7 @@ For more complex configurators (e.g., where parts change dynamically beyond pre-
You have a couple of flexible paths, depending on your needs and your team's skills:
- **Want to do it yourself?**
- Our Base plan includes No-Code and Low-Code editors, so you can create 3D product experiences and even basic configurators without writing any code. If you’re comfortable with simple setup steps, you can get started on your own.
+ Our plans include No-Code and Low-Code editors, so you can create 3D product experiences and even basic configurators without writing any code. If you’re comfortable with simple setup steps, you can get started on your own.
- **Have a developer team?**
If your developers are comfortable with coding, they’ll get the most out of our Pro plan. It unlocks advanced features and tools designed for building fully custom 3D experiences.
@@ -92,6 +92,7 @@ While you *could* build your own 3D integration from scratch (handling WebGL vie
**3D Bits takes care of the essentials:**
* Simple 3D model embedding.
+* No-Code solutions that your clients will appreciate.
* Seamless Shopify metafield integration for 3D assets.
* Easy mapping between product variants and 3D models.
* The Runner block, which lets you run your own JavaScript/TypeScript to control the 3D scene and respond to store events.
@@ -154,7 +155,7 @@ This is where our **Pro** plan really shines, but you can also use the **BITBYBI
### Does 3D Bits offer fancy UI controls for product pages (like custom sliders, color swatches, etc.)?
-**In general - no. 3D Bits is not here to reinvent the dropdown or the color swatch.**
+**In general - no. 3D Bits is not here to reinvent the dropdown or the color swatch. But we do provide fancy 3D linked UI elements that improve product experience, such as points of interest - when users click on them camera flies to pre-defined position in fluid cinematic motion.**
There are many excellent Shopify apps and theme development techniques dedicated to creating sophisticated UI controls for product options. Having said that Pro plan does have the ability to use frameworks such as React, Angular or others to create UI elements. However keep in mind that we do not offer any special technologies to alter the prices. If you need such functionality you'll need to build it yourself.
diff --git a/docs/learn/3d-bits/intro.mdx b/docs/learn/3d-bits/intro.mdx
index cff1b675..e3a5bef1 100644
--- a/docs/learn/3d-bits/intro.mdx
+++ b/docs/learn/3d-bits/intro.mdx
@@ -10,24 +10,25 @@ tags: [shopify, 3d-bits]
## What is 3D Bits?
-**3D Bits** is a Shopify app that lets you add interactive 3D product configurators and visualizations to your online store. With 3D Bits, your customers can see and customize products in real-time 3D, making shopping more engaging and helping them understand exactly what they’re buying.
+**3D Bits** is a Shopify app that empowers you to add interactive 3D product configurators and visualizations directly to your online store. Imagine your customers exploring and customizing products in real-time 3D – that's the immersive shopping experience 3D Bits delivers, helping them understand exactly what they're buying.
-**Try it out:**
+**Ready to try it out?**
* Visit our **[Demo Store](https://bitbybit-dev-3d-configurators.myshopify.com)**
* Use password: `3d-bits-demo`
-## Why Use 3D Bits?
+## Why Choose 3D Bits?
-Traditional online stores use static images, but modern shoppers want to see products from every angle and try out different options. 3D Bits makes this possible by letting you build interactive 3D experiences for your products—no advanced coding required.
+Traditional online shopping relies on static images, but today's customers demand more. They want to see products from every angle and visualize different options. 3D Bits makes this possible, allowing you to create dynamic 3D experiences for your products without needing advanced coding skills.
+Here's a quick look at 3D Bits in action:
-## What Our Customers Say
+## Hear From Our Customers
@@ -64,44 +65,64 @@ Traditional online stores use static images, but modern shoppers want to see pro
-
## How Does 3D Bits Work?
-3D Bits is built on the [bitbybit.dev](https://bitbybit.dev) platform, which provides powerful 3D and CAD tools for both beginners and professionals. You can:
+3D Bits is powered by the [bitbybit.dev](https://bitbybit.dev) platform, offering robust 3D and CAD tools for all skill levels:
+
+* **No-Code:** Quickly set up interactive 3D product pages.
+* **Low-Code:** Use visual programming for more detailed control.
+* **TypeScript:** Write custom code for advanced functionalities.
+* **Developer-Friendly:** Integrate with popular 3D engines and professional tools like VSCode.
+
+## Our Plans
+
+We offer three subscription plans: `Base`, `Standard`, and `Pro`, designed to fit various needs and complexities.
-- Use **No-Code** configurators to quickly set up 3D product pages.
-- Try **Low-Code** visual programming for more control.
-- Write custom logic with **TypeScript** if you want advanced features.
-- For developers, connect with popular 3D engines and use professional tools like VSCode.
+### Base Plan
-## Plans
+Ideal for beginner merchants, the Base plan provides No-Code and Low-Code solutions to build dynamic 3D experiences. Whether you're using static 3D assets or implementing more complex parametric designs, this plan simplifies 3D product presentation.
-Currently, we offer 2 subscription plans: `Basic` and `Pro`.
+* Create interactive 3D scenes with No-Code and Low-Code tools.
+* Write short scripts for custom behaviors.
+* Supports the BabylonJS game engine.
-### Basic Plan
+### Standard Plan
-The Basic plan is designed for most merchants and offers a lot of No-Code and Low-Code solutions for building 3D experiences on your Shopify storefront. You can easily configure static and dynamic 3D scenes, and use visual or TypeScript code snippets for extra logic. This plan is ideal if you want to present configurable products in 3D and only need to handle some, but not huge amounts, of logic and complexity. Most technically-minded merchants will find the Basic plan covers common use-cases for 3D product pages.
+The Standard plan expands on the Base features, perfect for merchants seeking enhanced visual effects and dedicated support.
-- Use No-Code and Low-Code tools to create interactive 3D scenes.
-- Add short scripts for custom behaviors.
-- Built to simplify 3D product presentation, but flexible enough for moderate customization.
-- Supports the BabylonJS game engine.
+* Includes all `Base` plan features.
+* Utilize advanced navigation, such as 3D points of interest in No-Code editors.
+* Benefit from Standard support, including expert consultations to optimize performance.
### Pro Plan
-The Pro plan is for merchants with professional development teams or those who hire programmers. Some 3D experiences can become very complex, and even our Low-Code editors or built-in TypeScript environment may not be enough. If you want to set up projects inside game engines such as ThreeJS, BabylonJS, or PlayCanvas, or if your team wants to host code on their own GitHub repositories, use VSCode, or write unit tests, the Pro plan is for you. We provide access to pre-built Vite TypeScript templates and support for advanced workflows.
+Designed for professional development teams or merchants requiring premium support, the Pro plan offers flexibility and power.
+
+* Includes all `Standard` plan features.
+* Build complex 3D experiences with your preferred engine (e.g., ThreeJS, BabylonJS, PlayCanvas).
+* Use your own codebase, GitHub repositories, and professional development tools like VSCode.
+* Access pre-built Vite TypeScript templates for advanced workflows.
+* Receive premium support, including assistance in building your first No-Code configurator.
+
+#### [Learn More](/learn/3d-bits/plans/subscription-plans)
+
+### Choosing Your Plan
-- Build complex 3D experiences with your choice of engine or framework.
-- Use your own codebase, GitHub, and professional tools.
-- Ideal for custom solutions, advanced logic, or large-scale projects.
-- Access to Vite TypeScript templates and more.
+**By Support Level:**
+* **Base:** Self-learners who need guidance to tutorials and documentation.
+* **Standard:** Teams looking for expert advice tailored to their product.
+* **Pro:** Those who want our direct help in building their first No-Code configurator.
-**How to choose?**
+**By No-Code Features:**
+* **Base:** For products that switch & control static 3D assets based on user options.
+* **Standard:** To add beautiful 3D effects that make your products stand out.
-It depends on your needs and preferences. As a guideline: if your configurators start reaching 5000 lines of code, managing them with simple inline scripts becomes difficult—consider moving to the Pro plan. Also, if you want to use a custom game engine or install different NPM packages, you'll need Pro. The Basic plan is built on BabylonJS; for other technologies, go Pro.
+**By Configurator Complexity:**
+* **Base:** For configurators with custom logic that can be handled by low-code visual scripting or short TypeScript programs.
+* **Pro:** For complex configurators (e.g., over 5000 lines of TypeScript code), custom game engines, or the need to install different NPM packages.
## Why Shopify?
-Shopify is one of the world’s most popular e-commerce platforms. It’s easy to use, flexible, and has a huge ecosystem of apps and developers. That’s why we chose Shopify as the home for 3D Bits—so you can easily add cutting-edge 3D experiences to your store and stand out from the competition.
+Shopify is a leading e-commerce platform, renowned for its ease of use, flexibility, and vast ecosystem. We chose Shopify for 3D Bits to ensure you can effortlessly integrate cutting-edge 3D experiences, helping your store captivate customers and stand out in the competitive online market.
-We’re excited to help you create amazing, interactive product pages with 3D Bits!
\ No newline at end of file
+We're excited to help you create amazing, interactive product pages with 3D Bits!
\ No newline at end of file
diff --git a/docs/learn/3d-bits/plans/subscription-plans.md b/docs/learn/3d-bits/plans/subscription-plans.md
index c6991b2e..bfe3dc1c 100644
--- a/docs/learn/3d-bits/plans/subscription-plans.md
+++ b/docs/learn/3d-bits/plans/subscription-plans.md
@@ -10,88 +10,86 @@ tags: [shopify, 3d-bits]
## Plan Comparison
-| Feature | Annual Base | Annual Pro |
-|---------|-------------|------------|
-| **Price** | 142$ yearly | 900$ yearly |
-| **Trial** | 14 days | 21 days |
-| **Target Audience** | Store owners, small teams | Professional development teams |
-| **Setup Complexity** | Easy, no coding required (optional scripting) | Advanced, requires development skills |
-| **Custom Development** | Optional | Mandatory |
-
-## Annual Base Plan
-
-Perfect for store owners who want to add 3D capabilities to their products without complex development work.
-
-### Core 3D Features
-- ✅ Add 3D models to unlimited products
-- ✅ Upload and display 3D files (GLTF format)
-- ✅ Show realistic 3D product scans (Splat format)
-- ✅ Let customers customize products in 3D
-- ✅ Mobile-friendly 3D viewing
-- ✅ Fast loading and smooth performance
-
-### Product Configurators
-- ✅ Create simple product configurators without coding
-- ✅ Build configurators with [bitbybit.dev](https://bitbybit.dev) visual programming tools
-- ✅ Build advanced configurators with dedicated [bitbybit.dev](https://bitbybit.dev) TypeScript editor
-- ✅ Create interactive 3D experiences
-- ✅ Add realistic physics to product demos
-- ✅ Design parametric and custom shapes
-
-### User Experience
-- ✅ View products in full screen mode
-- ✅ Show loading animations during processing
-- ✅ Connect with pricing and UI apps
-
-:::tip Who is this for?
-Annual Base is ideal for merchants who want to enhance their product pages with 3D models and simple configurators without needing a development team.
-:::
-
-## Annual Pro Plan
-
-Designed for professional development teams who need complete control and advanced customization capabilities.
-
-### Everything in Annual Base, Plus:
-
-### Professional Development Tools
-- ✅ Develop professional Single Page Applications (SPA) for product pages
-- ✅ Embed SPA apps to product page via Theme App Extension block
-- ✅ Use ThreeJS, BabylonJS, PlayCanvas or other web 3D engines
-- ✅ Write custom Vite based TypeScript apps for 3D & 2D product presentations
-
-### Development Workflow
-- ✅ Use the tools & editors that your team loves - VSCode, GitHub, etc.
-- ✅ Ensure quality of your apps via unit tests
-- ✅ Use configured local host development environment
-- ✅ Emulate production environment in preview mode
-- ✅ Easily embed build output via single JavaScript file to product page
-
-### Exclusive Access
-- ✅ Access & clone opinionated example templates from our private GitHub repository
-- ✅ Access private `bits-pro` NPM package allowing communication between product page inputs & your app logic
-
-:::warning Development Skills Required
-Annual Pro requires technical expertise in JavaScript/TypeScript, 3D web development, and modern web development workflows. This plan is designed for development teams, not end users.
-:::
-
-## Getting Started
-
-### Annual Base
-1. Subscribe to the plan
-2. Start adding 3D models immediately
-3. Use our visual tools to create configurators
-4. Publish to your store
-
-### Annual Pro
-1. Subscribe to the plan
-2. **Wait 24 hours** for access tokens to be sent to your email
-3. Access our private GitHub repository and NPM package
-4. Follow our [BITBYBIT APPS Pro guide](/learn/3d-bits/theme-app-extensions/bitbybit-apps)
-5. Start developing custom 3D applications
-
-:::info Access Token Delivery
-Pro plan subscribers will receive access tokens within 24 hours of subscription. If you don't receive them, contact us at [info@bitbybit.dev](mailto:info@bitbybit.dev) and we'll extend your trial period by 3 days.
-:::
+| Feature | Base | Standard | Pro |
+|---------|-------------|------------|------------|
+| **Annual Price** | **$142** / year | **$530** / year | **$900** / year |
+| **Monthly Price** | **$25** / month | **$75** / month | **$120** / month |
+| **Savings - Annual** | **53%** | **41%** | **38%** |
+| **Trial** | 7 days | 14 days | 21 days |
+| **Target Audience** | Beginners setting up shops | Merchants running existing business | Pro 3D development teams |
+| **Theme App Extensions** | VIEWER, RUNNER, PREVIEW | VIEWER, RUNNER, PREVIEW | VIEWER, RUNNER, PREVIEW, APPS |
+| **Nr Products** | Unlimited | Unlimited | Unlimited |
+| **Support** | Fundamental | Standard | Premium |
+| **How We Help** | We help mostly by providing links to documentation and tutorials | We actively guide your team by explaining how to set 3D products | We become part of your team and help set up first no-code configurator with your 3D assets |
+
+
+## Plan Differences Per Shopify Theme App Extension
+
+### BITBYBIT VIEWER (No-Code)
+
+BITBYBIT VIEWER theme app extension supports building 3D configurators without writing code. It provides advanced editor user friendly editor that helps you load 3D models, configure loading indicators, scene, lights, camera settings and link 3D models or materials to product options.
+
+| Feature | Base | Standard | Pro |
+|---------|-------------|------------|------------|
+| **Nr 3D Models** | Unlimited | Unlimited | Unlimited |
+| **3D Model Variants** | ✅ | ✅ | ✅ |
+| **Skybox** | ✅ | ✅ | ✅ |
+| **Camera Settings** | ✅ | ✅ | ✅ |
+| **Background Color** | ✅ | ✅ | ✅ |
+| **Loading Progress Indicator** | ✅ | ✅ | ✅ |
+| **Custom Loading Logo** | ✅ | ✅ | ✅ |
+| **Directional Lights** | ✅ | ✅ | ✅ |
+| **File Size Validations** | ✅ | ✅ | ✅ |
+| **GLTF (File Format)** | ✅ | ✅ | ✅ |
+| **3DGS (File Format 3D Scans)** | ✅ | ✅ | ✅ |
+| **KHR Material Variants (GLTF)** | ✅ | ✅ | ✅ |
+| **GLTF Parsing** | ✅ | ✅ | ✅ |
+| **GLTF Node Variants** | ✅ | ✅ | ✅ |
+| **Points of interest** | x | ✅ | ✅ |
+| **Points of interest variants** | x | ✅ | ✅ |
+
+Features in `Standard` and `Pro` plans are expected to grow, so remember to check this list for potential updates in the future.
+
+[Learn More](/learn/3d-bits/theme-app-extensions/bitbybit-viewer)
+
+### BITBYBIT RUNNER (Low-Code & Pro-Code)
+
+BITBYBIT RUNNER theme app extension supports building 3D configurators by composing visual scripts or writing short TypeScript programs.
+
+| Feature | Base | Standard | Pro |
+|---------|-------------|------------|------------|
+| **Bitbybit Rete Editor** | ✅ | ✅ | ✅ |
+| **Bitbybit Blockly Editor** | ✅ | ✅ | ✅ |
+| **Bitbybit TypeScript Editor (Monaco)** | ✅ | ✅ | ✅ |
+
+[Learn More](/learn/3d-bits/theme-app-extensions/bitbybit-runner)
+
+### BITBYBIT APPS (Pro-Code)
+
+BITBYBIT APPS theme app extension supports building 3D configurators by writing full 3D SPA applications in the editors that your team prefers.
+
+| Feature | Base | Standard | Pro |
+|---------|-------------|------------|------------|
+| **Vite template examples** | x | x | ✅ |
+| **Bits-pro NPM package** | x | x | ✅ |
+| **Supports local dev environment** | x | x | ✅ |
+| **Unit Tests** | x | x | ✅ |
+| **Git** | x | x | ✅ |
+| **BabylonJS game engine** | x | x | ✅ |
+| **ThreeJS game engine** | x | x | ✅ |
+| **PlayCanvas game engine** | x | x | ✅ |
+
+[Learn More](/learn/3d-bits/theme-app-extensions/bitbybit-apps)
+
+### BITBYBIT PREVIEW (Low-Code & Pro-Code)
+
+BITBYBIT PREVIEW theme app extension allows you to embed published bitbybit.dev scripts as your products.
+
+| Feature | Base | Standard | Pro |
+|---------|-------------|------------|------------|
+| **Embed public Bitbybit scripts** | ✅ | ✅ | ✅ |
+
+[Learn More](/learn/3d-bits/theme-app-extensions/bitbybit-preview)
## Support
diff --git a/docs/learn/3d-bits/theme-app-extensions/bitbybit-apps.md b/docs/learn/3d-bits/theme-app-extensions/bitbybit-apps.md
index 579dc27d..abd5f6c5 100644
--- a/docs/learn/3d-bits/theme-app-extensions/bitbybit-apps.md
+++ b/docs/learn/3d-bits/theme-app-extensions/bitbybit-apps.md
@@ -1,7 +1,7 @@
---
sidebar_position: 4
title: "BITBYBIT APPS Block for Shopify's '3D Bits' App"
-sidebar_label: BITBYBIT APPS (PRO)
+sidebar_label: BITBYBIT APPS
description: Learn how to use the BITBYBIT APPS theme app extension block to develop and deploy professional 3D & 2D product presentations on Shopify
tags: [shopify, 3d-bits, typescript]
---
@@ -173,7 +173,7 @@ It's crucial to understand what this setup provides and its inherent limitations
### What This Setup Does NOT Provide Out-of-the-Box:
❌ **Server-Side Rendering (SSR)**: Applications are client-side rendered.
❌ **Backend API Solutions**: No built-in backend for custom server logic or databases.
-❌ **Direct Shopify Admin API Integration**: While technically possible to call Shopify APIs from the frontend with appropriate authentication, our templates don't include examples for this, and it requires careful security consideration.
+❌ **Direct Shopify Admin API Integration**: While technically possible to call Shopify APIs from the frontend with appropriate authentication, our templates don't include examples for this, and it requires careful security consideration.
❌ **Database or Persistence Layer**: User-specific data persistence needs a separate backend solution.
❌ **Built-in Secure Pricing Validation**: Price calculations affecting the cart must be validated server-side.
@@ -185,7 +185,7 @@ If your project demands features like Server-Side Rendering, custom backend APIs
Embark on your journey to creating stunning product experiences.
### Prerequisites
-- An active **Annual Pro subscription** to the "3D Bits" Shopify app.
+- An active **Pro subscription** to the "3D Bits" Shopify app.
- **Access tokens** to our private GitHub repository (provided with the Pro plan).
- Solid knowledge of **TypeScript** and modern web development principles.
- A good understanding of Shopify theme structure and development concepts.
@@ -215,4 +215,4 @@ Embark on your journey to creating stunning product experiences.
---
-*The BITBYBIT APPS block and associated professional development features are available exclusively with the Annual Pro subscription plan for "3D Bits".*
\ No newline at end of file
+*The BITBYBIT APPS block and associated professional development features are available exclusively with the Pro subscription plan for "3D Bits".*
\ No newline at end of file
diff --git a/docs/learn/3d-bits/theme-app-extensions/bitbybit-preview.md b/docs/learn/3d-bits/theme-app-extensions/bitbybit-preview.md
index 7cb8e401..029e34e0 100644
--- a/docs/learn/3d-bits/theme-app-extensions/bitbybit-preview.md
+++ b/docs/learn/3d-bits/theme-app-extensions/bitbybit-preview.md
@@ -1,7 +1,7 @@
---
-sidebar_position: 1
+sidebar_position: 3
title: "BITBYBIT PREVIEW Block for Shopify's '3D Bits' App"
-sidebar_label: BITBYBIT PREVIEW (BASIC)
+sidebar_label: BITBYBIT PREVIEW
description: Learn how to use the BITBYBIT PREVIEW theme app extension block in Shopify's "3D Bits" app to embed publicly available Bitbybit project scripts into your product pages.
tags: [shopify, 3d-bits]
---
diff --git a/docs/learn/3d-bits/theme-app-extensions/bitbybit-runner.md b/docs/learn/3d-bits/theme-app-extensions/bitbybit-runner.md
index ca78be4f..096436bb 100644
--- a/docs/learn/3d-bits/theme-app-extensions/bitbybit-runner.md
+++ b/docs/learn/3d-bits/theme-app-extensions/bitbybit-runner.md
@@ -1,7 +1,7 @@
---
sidebar_position: 2
title: "BITBYBIT RUNNER Block for Shopify's '3D Bits' App"
-sidebar_label: BITBYBIT RUNNER (BASIC)
+sidebar_label: BITBYBIT RUNNER
description: Learn how to use the BITBYBIT RUNNER theme app extension block in Shopify's "3D Bits" app to integrate parametric 3D models and interactive scripts from Bitbybit into your product pages.
tags: [shopify, 3d-bits]
---
diff --git a/docs/learn/3d-bits/theme-app-extensions/bitbybit-viewer.md b/docs/learn/3d-bits/theme-app-extensions/bitbybit-viewer.md
index bf19e11f..4e5c7d60 100644
--- a/docs/learn/3d-bits/theme-app-extensions/bitbybit-viewer.md
+++ b/docs/learn/3d-bits/theme-app-extensions/bitbybit-viewer.md
@@ -1,16 +1,16 @@
---
-sidebar_position: 3
+sidebar_position: 1
title: "BITBYBIT VIEWER Block for Shopify's '3D Bits' App"
-sidebar_label: BITBYBIT VIEWER (BASIC)
+sidebar_label: BITBYBIT VIEWER
description: Learn how to use the BITBYBIT VIEWER theme app extension block in Shopify's "3D Bits" app to display static 3D models and configure complex scenes on your product pages without coding.
tags: [shopify, 3d-bits]
---
-# The "BITBYBIT VIEWER" Block for Shopify
+# The "BITBYBIT VIEWER" Block for Shopify (No-Code)
-The **BITBYBIT VIEWER** is a theme app extension block provided by our "3D Bits" Shopify app. It offers the simplest way to present static 3D models on your product pages **without needing to interact with the Bitbybit editors or write any code.**
+The **BITBYBIT VIEWER** is a theme app extension block provided by `3D Bits` app for Shopify. It offers the simplest way to create 3D model configurators from static assets on your product pages **without needing to interact with the Bitbybit coding editors.**
-You can upload your 3D models to the Shopify CDN or any other publicly accessible cloud storage, and then use the URL of the file to display it directly on your product page using this block. For more advanced scenarios, the VIEWER block also allows you to load and configure multiple 3D models at once using a special JSON configuration, which can be easily created with our new **Viewer Editor tool**.
+You can upload your 3D models to the Shopify CDN or any other publicly accessible cloud storage, and then use the URL of the file to display it directly on your product page using this block. For more advanced scenarios, the VIEWER block also allows you to load and configure multiple 3D models at once using a special JSON configuration, which can be easily created with our new **Viewer Editor tool**. These files can be linked to product options, such as size or color. You can also parse files such as GLTF to use material variants.

*Demo store product that uses the BITBYBIT VIEWER block.*
@@ -54,14 +54,15 @@ Currently, the BITBYBIT VIEWER block supports the following 3D model formats:
After completing these steps and previewing your product page, you should see the 3D model displayed.
-## Building More Complex 3D Experiences with Scene Config JSON
+## Building More Complex 3D Experiences with Viewer Editor
Sometimes, simply loading a single 3D model isn't enough. You might want to:
* Customize camera settings (initial position, target, field of view).
* Set up specific lighting (types, intensity, color, position).
* Enable a skybox for realistic environment reflections.
* Load multiple 3D models into the same scene.
-* Even make different models or their properties react to changing Shopify product variants (e.g., show a red chair model when the "Red" variant is selected, and a blue one for "Blue").
+* Make different 3D models or their properties react to changing Shopify product variants (e.g., show a red chair model when the "Red" variant is selected, and a blue one for "Blue").
+* Define points of interest
This is where the **Scene Config JSON** functionality comes in. We have recently released a new **Viewer Editor tool** within the "3D Bits" app that allows you to create this JSON configuration through a simple, visual user interface. With this editor, you can load multiple 3D models, adjust camera settings, enable skyboxes, configure lighting, add shadows, and more, all without writing code.
@@ -101,11 +102,15 @@ Here's a glimpse of how the Viewer Editor looks within the "3D Bits" app environ

*Demo store product that uses the BITBYBIT VIEWER block and Scene Configuration metafield.*
+### What if JSON is too large for the metafield?
+
+Save your JSON configurator as a file, upload it to Shopify CDN as a file. Copy URL and paste it into the metafield, this will inform 3D Bits app to load the contents of the file.
+
### Editing the Scene Config JSON
While our Viewer Editor is the recommended way to create and manage the Scene Config JSON, you can also edit the JSON directly using any text editor. For a better editing experience with features like syntax highlighting and autocompletion (intellisense), we provide a JSON schema.
-* **JSON Schema:** You can find the schema [here](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/viewer-scene-config-schema-0-20-5.json). (Note: This schema link points to version `0.20.6`. The schema may be updated in the future, so ensure you refer to the latest version compatible with your "3D Bits" app version.)
+* **JSON Schema:** You can find the schema [here](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/viewer-scene-config-schema-0-20-6.json). (Note: This schema link points to version `0.20.7`. The schema may be updated in the future, so ensure you refer to the latest version compatible with your "3D Bits" app version.)
Many modern code editors (like VS Code) can use this schema to provide validation and autocompletion as you edit the JSON.
## Video Tutorial: BITBYBIT VIEWER Block Setup
diff --git a/docs/learn/3d-bits/tutorials/product-customizable-text.mdx b/docs/learn/3d-bits/tutorials/product-customizable-text.mdx
index 74144c65..2558dcf3 100644
--- a/docs/learn/3d-bits/tutorials/product-customizable-text.mdx
+++ b/docs/learn/3d-bits/tutorials/product-customizable-text.mdx
@@ -153,7 +153,7 @@ To save you time, here is the embedded Bitbybit Rete script used in this tutoria
diff --git a/docs/learn/3d-bits/tutorials/product-laptop-holder.mdx b/docs/learn/3d-bits/tutorials/product-laptop-holder.mdx
index e7535bd4..abb27661 100644
--- a/docs/learn/3d-bits/tutorials/product-laptop-holder.mdx
+++ b/docs/learn/3d-bits/tutorials/product-laptop-holder.mdx
@@ -63,7 +63,7 @@ To save you time and provide a starting point, here is the embedded Bitbybit Typ
{\n\n laptops.forEach(laptop => {\n laptop.center = [0, laptop.height / 2 + laptopLiftedHeight, 0] as Bit.Inputs.Base.Point3;\n });\n\n let laptopFillets = [];\n let totalDistance = 0;\n let previousLaptopLength = 0;\n\n laptops.forEach(async (laptop, index) => {\n totalDistance += distanceBetweenLaptops + laptop.length / 2 + previousLaptopLength / 2;\n previousLaptopLength = laptop.length;\n laptop.center[2] = totalDistance;\n const laptopBaseModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length,\n height: laptop.height,\n center: laptop.center\n });\n const laptopFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopBaseModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const laptopVisModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length - 0.01,\n height: laptop.height,\n center: laptop.center\n });\n const laptopVisFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopVisModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const di = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n\n di.faceOpacity = 0.2;\n di.edgeWidth = 5;\n di.edgeOpacity = 0.6;\n di.edgeColour = whiteColor;\n di.faceColour = whiteColor;\n const laptopFilletMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopVisFillet, options: di });\n laptopsFilletsMesh.push(laptopFilletMesh);\n })\n\n const polygonWire = await bitbybit.occt.shapes.wire.createPolygonWire({\n points: controlPoints\n });\n const extrusion = await bitbybit.occt.operations.extrude({\n shape: polygonWire, direction: [0, 0, totalDistance += distanceBetweenLaptops + previousLaptopLength / 2]\n });\n const laptopStandFillet = await bitbybit.occt.fillets.filletEdges({ shape: extrusion, indexes: undefined, radius: 1 });\n const laptopStandThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: laptopStandFillet, offset: -0.5 });\n\n laptopStand = await bitbybit.occt.booleans.difference({ shape: laptopStandThick, shapes: laptopFillets, keepEdges: false });\n const li = new Bit.Inputs.OCCT.DrawShapeDto(laptopStand);\n li.faceOpacity = 1;\n if (flipColor) {\n li.faceColour = \"#0000ff\";\n li.edgeColour = whiteColor;\n } else {\n li.faceColour = holderColor;\n li.edgeColour = whiteColor;\n }\n li.edgeWidth = 5;\n laptopStandMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopStand, options: li });\n const laptopsMeshes = await Promise.all(laptopsFilletsMesh);\n return [laptopStandMesh, ...laptopsMeshes];\n }\n\n const meshes = await renderLaptops(laptops);\n return { meshes };\n}\n\nclass Laptop {\n width: number;\n length: number;\n height: number;\n center?: Bit.Inputs.Base.Point3;\n}\n\nBit.setBitbybitRunnerResult(start());","version":"0.20.6","type":"typescript"}}
+ script={{"script":"Bit.mockBitbybitRunnerInputs({\n \"Laptop Type\": \"MacBook Pro 16\",\n \"Number Laptops\": \"3\",\n \"Color\": \"Black\",\n});\nconst inputs = Bit.getBitbybitRunnerInputs();\n\nconst laptops: Laptop[] = []\n\nlet laptop: Laptop;\n\nswitch (inputs[\"Laptop Type\"]) {\n case \"MacBook Pro 16\":\n laptop = {\n length: 1.63,\n width: 35.8,\n height: 24.6\n };\n break;\n case \"MacBook Pro 14\":\n laptop = {\n length: 1.57,\n width: 31.3,\n height: 22.2\n }\n break;\n case \"MacBook Air\":\n laptop = {\n length: 1.2,\n width: 30.5,\n height: 21.6\n }\n break;\n default:\n break;\n}\n\nlet flipColor = false;\nswitch (inputs[\"Color\"]) {\n case \"Blue\":\n flipColor = true;\n break;\n default:\n break;\n}\n\nconsole.log(\"laptop \", laptop);\n\nconst nrLaptops = +inputs[\"Number Laptops\"];\n\nfor (let i = 0; i < nrLaptops; i++) {\n laptops.push({ ...laptop });\n}\n\nconst whiteColor = \"#ffffff\";\nconst holderColor = \"#333333\";\n\nconst laptopLiftedHeight = 3;\nconst distanceBetweenLaptops = 1.7;\nconst exportSTEP = false;\n\nbitbybit.babylon.scene.backgroundColour({ colour: \"#bbbbbb\" });\n\nconst pointLightConf = new Bit.Inputs.BabylonScene.PointLightDto();\npointLightConf.position = [-15, 20, -5];\npointLightConf.intensity = 8000;\npointLightConf.diffuse = \"#3333ff\";\npointLightConf.radius = 0;\nbitbybit.babylon.scene.drawPointLight(pointLightConf);\n\nconst controlPoints = [\n [-12.5, 0, 0],\n [-8, 13, 0],\n [-4, 11, 0],\n [-2, 6, 0],\n [2, 6, 0],\n [4, 14, 0],\n [8, 17, 0],\n [12.5, 0, 0]\n] as Bit.Inputs.Base.Point3[];\n\nlet laptopStand;\nlet laptopStandMesh;\n\nconst laptopsFilletsMesh = [];\n\nasync function start() {\n const ground = await bitbybit.occt.shapes.face.createCircleFace({ center: [0, 0, 0], direction: [0, 1, 0], radius: 75, });\n const groundOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n groundOptions.faceColour = whiteColor;\n groundOptions.drawEdges = false;\n await bitbybit.draw.drawAnyAsync({ entity: ground, options: groundOptions });\n\n const renderLaptops = async (laptops) => {\n\n laptops.forEach(laptop => {\n laptop.center = [0, laptop.height / 2 + laptopLiftedHeight, 0] as Bit.Inputs.Base.Point3;\n });\n\n let laptopFillets = [];\n let totalDistance = 0;\n let previousLaptopLength = 0;\n\n laptops.forEach(async (laptop, index) => {\n totalDistance += distanceBetweenLaptops + laptop.length / 2 + previousLaptopLength / 2;\n previousLaptopLength = laptop.length;\n laptop.center[2] = totalDistance;\n const laptopBaseModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length,\n height: laptop.height,\n center: laptop.center\n });\n const laptopFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopBaseModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const laptopVisModel = await bitbybit.occt.shapes.solid.createBox({\n width: laptop.width,\n length: laptop.length - 0.01,\n height: laptop.height,\n center: laptop.center\n });\n const laptopVisFillet = await bitbybit.occt.fillets.filletEdges({ shape: laptopVisModel, indexes: undefined, radius: 0.2 });\n laptopFillets.push(laptopFillet);\n\n const di = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n\n di.faceOpacity = 0.2;\n di.edgeWidth = 5;\n di.edgeOpacity = 0.6;\n di.edgeColour = whiteColor;\n di.faceColour = whiteColor;\n const laptopFilletMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopVisFillet, options: di });\n laptopsFilletsMesh.push(laptopFilletMesh);\n })\n\n const polygonWire = await bitbybit.occt.shapes.wire.createPolygonWire({\n points: controlPoints\n });\n const extrusion = await bitbybit.occt.operations.extrude({\n shape: polygonWire, direction: [0, 0, totalDistance += distanceBetweenLaptops + previousLaptopLength / 2]\n });\n const laptopStandFillet = await bitbybit.occt.fillets.filletEdges({ shape: extrusion, indexes: undefined, radius: 1 });\n const laptopStandThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: laptopStandFillet, offset: -0.5 });\n\n laptopStand = await bitbybit.occt.booleans.difference({ shape: laptopStandThick, shapes: laptopFillets, keepEdges: false });\n const li = new Bit.Inputs.OCCT.DrawShapeDto(laptopStand);\n li.faceOpacity = 1;\n if (flipColor) {\n li.faceColour = \"#0000ff\";\n li.edgeColour = whiteColor;\n } else {\n li.faceColour = holderColor;\n li.edgeColour = whiteColor;\n }\n li.edgeWidth = 5;\n laptopStandMesh = await bitbybit.draw.drawAnyAsync({ entity: laptopStand, options: li });\n const laptopsMeshes = await Promise.all(laptopsFilletsMesh);\n return [laptopStandMesh, ...laptopsMeshes];\n }\n\n const meshes = await renderLaptops(laptops);\n return { meshes };\n}\n\nclass Laptop {\n width: number;\n length: number;\n height: number;\n center?: Bit.Inputs.Base.Point3;\n}\n\nBit.setBitbybitRunnerResult(start());","version":"0.20.7","type":"typescript"}}
title="Bitbybit Rete Editor - 3D Laptop Holder"
description="3D Laptop holder configurator"
/>
diff --git a/docs/learn/3d-bits/tutorials/product-palm-table.mdx b/docs/learn/3d-bits/tutorials/product-palm-table.mdx
index a6979423..0923e8ed 100644
--- a/docs/learn/3d-bits/tutorials/product-palm-table.mdx
+++ b/docs/learn/3d-bits/tutorials/product-palm-table.mdx
@@ -157,7 +157,7 @@ To save you time, here is the embedded Rete script used in this tutorial for the
diff --git a/docs/learn/code/common/base/color/color-usage-examples.md b/docs/learn/code/common/base/color/color-usage-examples.md
index ea4b150a..1ff16b93 100644
--- a/docs/learn/code/common/base/color/color-usage-examples.md
+++ b/docs/learn/code/common/base/color/color-usage-examples.md
@@ -48,21 +48,21 @@ Click through the tabs below to see the implementation. You can interact with th
colorParamfaceColoredgeColorcolorParam0faceColorcolorParam255colorParam0255edgeColor#0000ff6000TRUE0.01TRUEfaceColorTRUEedgeColor10","version":"0.20.6","type":"blockly"}}
+ script={{"script":"colorParamfaceColoredgeColorcolorParam0faceColorcolorParam255colorParam0255edgeColor#0000ff6000TRUE0.01TRUEfaceColorTRUEedgeColor10","version":"0.20.7","type":"blockly"}}
title="Color Usage Example"
/>
{\n\n const colorParam = 55;\n const rgbToHexOptions = new Bit.Inputs.Color.RGBMinMaxDto();\n rgbToHexOptions.r = colorParam;\n rgbToHexOptions.b = colorParam;\n const faceColor = bitbybit.color.rgbToHex(rgbToHexOptions);\n\n // This might look strange as you could just assign the string to edgeColor directly, \n // but this identity function is nice to have in visual prgramming editors - check Rete & Blockly\n // examples\n \n const edgeColor = bitbybit.color.hexColor({ color: \"#ff0000\" });\n\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = 6;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n\n const drawOpt = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOpt.faceColour = faceColor;\n drawOpt.edgeColour = edgeColor;\n drawOpt.edgeWidth = 10;\n bitbybit.draw.drawAnyAsync({ entity: cube, options: drawOpt });\n}\n\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const colorParam = 55;\n const rgbToHexOptions = new Bit.Inputs.Color.RGBMinMaxDto();\n rgbToHexOptions.r = colorParam;\n rgbToHexOptions.b = colorParam;\n const faceColor = bitbybit.color.rgbToHex(rgbToHexOptions);\n\n // This might look strange as you could just assign the string to edgeColor directly, \n // but this identity function is nice to have in visual prgramming editors - check Rete & Blockly\n // examples\n \n const edgeColor = bitbybit.color.hexColor({ color: \"#ff0000\" });\n\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = 6;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n\n const drawOpt = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOpt.faceColour = faceColor;\n drawOpt.edgeColour = edgeColor;\n drawOpt.edgeWidth = 10;\n bitbybit.draw.drawAnyAsync({ entity: cube, options: drawOpt });\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
title="Color Usage Example"
/>
diff --git a/docs/learn/code/common/base/point/point-hex-grid-example.md b/docs/learn/code/common/base/point/point-hex-grid-example.md
index a28992f3..e8b4eae1 100644
--- a/docs/learn/code/common/base/point/point-hex-grid-example.md
+++ b/docs/learn/code/common/base/point/point-hex-grid-example.md
@@ -55,21 +55,21 @@ Click through the tabs below to see the implementation. Each example will genera
hexagonspointshexCornershexPolylinesihexagons20101010FALSEFALSEFALSEFALSEFALSETRUEFALSEpointshexagonscentershexCornershexagonshexagonshexPolylinesihexCornersINSERTLASThexPolylinesiTRUEpointshexPolylines","version":"0.20.6","type":"blockly"}}
+ script={{"script":"hexagonspointshexCornershexPolylinesihexagons20101010FALSEFALSEFALSEFALSEFALSETRUEFALSEpointshexagonscentershexCornershexagonshexagonshexPolylinesihexCornersINSERTLASThexPolylinesiTRUEpointshexPolylines","version":"0.20.7","type":"blockly"}}
title="Point Hex Grid Example"
/>
{\n\n // 1. Configure the hexagonal grid options\n const hexOptions = new Bit.Inputs.Point.HexGridScaledToFitDto();\n // Set options different from defaults. \n // TypeScript IntelliSense (e.g., typing \"hexOptions.\") will show all available parameters.\n hexOptions.width = 20;\n hexOptions.height = 10;\n hexOptions.nrHexagonsInWidth = 10;\n hexOptions.nrHexagonsInHeight = 10;\n hexOptions.centerGrid = true; // Center the entire grid at the world origin [0,0,0]\n // Example: hexOptions.flatTop = true; // To get flat-topped hexagons\n // Example: hexOptions.pointsOnGround = true; // To project to XZ plane if original is XY\n\n // 2. Generate the hex grid data\n // This function returns an object like: \n // { centers: Point3[], hexagons: Point3[][], shortestDistEdge, longestDistEdge, maxFilletRadius }\n const hexResult = bitbybit.point.hexGridScaledToFit(hexOptions);\n\n // 3. Create polylines for each hexagon's outline\n // hexResult.hexagons is a list of lists (e.g., [[v1,v2..v6 for hex1], [v1,v2..v6 for hex2], ...])\n // We .map() over this list to create a Polyline object for each hexagon.\n const polylines = hexResult.hexagons.map(singleHexagonCornerPoints => {\n const polylineOptions = new Bit.Inputs.Polyline.PolylineCreateDto();\n polylineOptions.points = singleHexagonCornerPoints; // The 6 corner points\n polylineOptions.isClosed = true; // Ensure the polyline forms a closed loop\n return bitbybit.polyline.create(polylineOptions);\n }) as Bit.Inputs.Base.Polyline3[]; // Type assertion: the result is an array of Polyline3 objects\n\n // 4. Draw the center points of the hexagons\n // hexResult.centers is a list of 3D points: [[cx1,cy1,cz1], [cx2,cy2,cz2], ...]\n bitbybit.draw.drawAnyAsync({ entity: hexResult.centers });\n\n // 5. Draw the polylines representing the hexagon outlines\n bitbybit.draw.drawAnyAsync({ entity: polylines });\n\n}\n\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = () => {\n\n // 1. Configure the hexagonal grid options\n const hexOptions = new Bit.Inputs.Point.HexGridScaledToFitDto();\n // Set options different from defaults. \n // TypeScript IntelliSense (e.g., typing \"hexOptions.\") will show all available parameters.\n hexOptions.width = 20;\n hexOptions.height = 10;\n hexOptions.nrHexagonsInWidth = 10;\n hexOptions.nrHexagonsInHeight = 10;\n hexOptions.centerGrid = true; // Center the entire grid at the world origin [0,0,0]\n // Example: hexOptions.flatTop = true; // To get flat-topped hexagons\n // Example: hexOptions.pointsOnGround = true; // To project to XZ plane if original is XY\n\n // 2. Generate the hex grid data\n // This function returns an object like: \n // { centers: Point3[], hexagons: Point3[][], shortestDistEdge, longestDistEdge, maxFilletRadius }\n const hexResult = bitbybit.point.hexGridScaledToFit(hexOptions);\n\n // 3. Create polylines for each hexagon's outline\n // hexResult.hexagons is a list of lists (e.g., [[v1,v2..v6 for hex1], [v1,v2..v6 for hex2], ...])\n // We .map() over this list to create a Polyline object for each hexagon.\n const polylines = hexResult.hexagons.map(singleHexagonCornerPoints => {\n const polylineOptions = new Bit.Inputs.Polyline.PolylineCreateDto();\n polylineOptions.points = singleHexagonCornerPoints; // The 6 corner points\n polylineOptions.isClosed = true; // Ensure the polyline forms a closed loop\n return bitbybit.polyline.create(polylineOptions);\n }) as Bit.Inputs.Base.Polyline3[]; // Type assertion: the result is an array of Polyline3 objects\n\n // 4. Draw the center points of the hexagons\n // hexResult.centers is a list of 3D points: [[cx1,cy1,cz1], [cx2,cy2,cz2], ...]\n bitbybit.draw.drawAnyAsync({ entity: hexResult.centers });\n\n // 5. Draw the polylines representing the hexagon outlines\n bitbybit.draw.drawAnyAsync({ entity: polylines });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
title="Point Hex Grid Example"
/>
diff --git a/docs/learn/code/common/base/point/point-spiral-examples.md b/docs/learn/code/common/base/point/point-spiral-examples.md
index e42d91ee..b3eef77d 100644
--- a/docs/learn/code/common/base/point/point-spiral-examples.md
+++ b/docs/learn/code/common/base/point/point-spiral-examples.md
@@ -45,21 +45,21 @@ Click through the tabs below to see the implementation. Each example will genera
0.9300361","version":"0.20.6","type":"blockly"}}
+ script={{"script":"0.9300361","version":"0.20.7","type":"blockly"}}
title="Point Spiral Example"
/>
{\n\n // 1. Configure the spiral parameters\n const spiralOptions = new Bit.Inputs.Point.SpiralDto();\n spiralOptions.numberPoints = 300;\n spiralOptions.radius = 6; // Overall extent of the spiral; default is 1\n spiralOptions.widening = 3; // Controls how tight the spiral is; default is 10\n spiralOptions.phi = 0.9; // Constant influencing the spiral pattern; default relates to Golden Angle\n spiralOptions.factor = 1; // General scaling factor; default is 1\n\n // 2. Generate the list of points forming the spiral\n // The bitbybit.point.spiral() function returns an array of 3D points.\n const points = bitbybit.point.spiral(spiralOptions);\n\n // 3. Draw the generated points in the scene\n // The drawAnyAsync function can take an array of points and will render them.\n bitbybit.draw.drawAnyAsync({ entity: points });\n\n}\n\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = () => {\n\n // 1. Configure the spiral parameters\n const spiralOptions = new Bit.Inputs.Point.SpiralDto();\n spiralOptions.numberPoints = 300;\n spiralOptions.radius = 6; // Overall extent of the spiral; default is 1\n spiralOptions.widening = 3; // Controls how tight the spiral is; default is 10\n spiralOptions.phi = 0.9; // Constant influencing the spiral pattern; default relates to Golden Angle\n spiralOptions.factor = 1; // General scaling factor; default is 1\n\n // 2. Generate the list of points forming the spiral\n // The bitbybit.point.spiral() function returns an array of 3D points.\n const points = bitbybit.point.spiral(spiralOptions);\n\n // 3. Draw the generated points in the scene\n // The drawAnyAsync function can take an array of points and will render them.\n bitbybit.draw.drawAnyAsync({ entity: points });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
title="Point Spiral Example"
/>
diff --git a/docs/learn/code/common/base/text/text-usage-examples.md b/docs/learn/code/common/base/text/text-usage-examples.md
index 608c2213..07662f2d 100644
--- a/docs/learn/code/common/base/text/text-usage-examples.md
+++ b/docs/learn/code/common/base/text/text-usage-examples.md
@@ -53,21 +53,21 @@ Click through the tabs below to see the implementation. Each example will create
namewordwordListnameJohnwordawesomewordListnamewordHi {0}, you are {1}!wordList'Roboto''Regular'20.2180000010'centerMiddle'","version":"0.20.6","type":"blockly"}}
+ script={{"script":"namewordwordListnameJohnwordawesomewordListnamewordHi {0}, you are {1}!wordList'Roboto''Regular'20.2180000010'centerMiddle'","version":"0.20.7","type":"blockly"}}
title="Text Formatting And 3D Fonts"
/>
{\n const name = \"John\";\n const word = \"awesome\";\n\n const formatOpt = new Bit.Inputs.Text.TextFormatDto();\n formatOpt.text = \"Hi {0}, you are {1}!\";\n formatOpt.values = [name, word];\n const formattedText = bitbybit.text.format(formatOpt);\n\n const text3dOptions = new Bit.Advanced.Text3D.Text3DDto();\n text3dOptions.text = formattedText;\n text3dOptions.rotation = 180;\n text3dOptions.fontSize = 2;\n const text3d = await bitbybit.advanced.text3d.create(text3dOptions);\n bitbybit.draw.drawAnyAsync({ entity: text3d });\n}\n\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n const name = \"John\";\n const word = \"awesome\";\n\n const formatOpt = new Bit.Inputs.Text.TextFormatDto();\n formatOpt.text = \"Hi {0}, you are {1}!\";\n formatOpt.values = [name, word];\n const formattedText = bitbybit.text.format(formatOpt);\n\n const text3dOptions = new Bit.Advanced.Text3D.Text3DDto();\n text3dOptions.text = formattedText;\n text3dOptions.rotation = 180;\n text3dOptions.fontSize = 2;\n const text3d = await bitbybit.advanced.text3d.create(text3dOptions);\n bitbybit.draw.drawAnyAsync({ entity: text3d });\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
title="Text Formatting And 3D Fonts"
/>
diff --git a/docs/learn/code/common/base/vector/vector-usage-examples.md b/docs/learn/code/common/base/vector/vector-usage-examples.md
index 4d259c27..f04543f2 100644
--- a/docs/learn/code/common/base/vector/vector-usage-examples.md
+++ b/docs/learn/code/common/base/vector/vector-usage-examples.md
@@ -60,21 +60,21 @@ Click through the tabs below to see the implementation in Rete, Blockly, and Typ
spanItemsspanEaseItemsvectorsj40040010100.450.50.5FALSE#ffffff#ffffffspanItems0.205spanEaseItemsspanItems05'easeInSine'FALSEvectorsj1spanItems1INSERTLASTvectorsGETFROM_STARTspanItemsjGETFROM_STARTspanEaseItemsj0vectorsvectors","version":"0.20.6","type":"blockly"}}
+ script={{"script":"spanItemsspanEaseItemsvectorsj40040010100.450.50.5FALSE#ffffff#ffffffspanItems0.205spanEaseItemsspanItems05'easeInSine'FALSEvectorsj1spanItems1INSERTLASTvectorsGETFROM_STARTspanItemsjGETFROM_STARTspanEaseItemsj0vectorsvectors","version":"0.20.7","type":"blockly"}}
title="Vector Span & Ease In Combination"
/>
{\n\n const spanOptions = new Bit.Inputs.Vector.SpanDto();\n spanOptions.step = 0.2;\n spanOptions.min = 0;\n spanOptions.max = 5;\n const spanItems = bitbybit.vector.span(spanOptions);\n\n const spanEaseOptions = new Bit.Inputs.Vector.SpanEaseItemsDto();\n spanEaseOptions.ease = Bit.Inputs.Math.easeEnum.easeInSine;\n spanEaseOptions.min = 0;\n spanEaseOptions.max = 5;\n spanEaseOptions.nrItems = spanItems.length;\n const spanEaseItems = bitbybit.vector.spanEaseItems(spanEaseOptions);\n\n const vectors = spanItems.map((s, index) => [s, spanEaseItems[index], 0]) as Bit.Inputs.Base.Vector3[];\n\n bitbybit.draw.drawGridMesh(new Bit.Inputs.Draw.SceneDrawGridMeshDto());\n bitbybit.draw.drawAnyAsync({ entity: vectors });\n\n}\n\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = () => {\n\n const spanOptions = new Bit.Inputs.Vector.SpanDto();\n spanOptions.step = 0.2;\n spanOptions.min = 0;\n spanOptions.max = 5;\n const spanItems = bitbybit.vector.span(spanOptions);\n\n const spanEaseOptions = new Bit.Inputs.Vector.SpanEaseItemsDto();\n spanEaseOptions.ease = Bit.Inputs.Math.easeEnum.easeInSine;\n spanEaseOptions.min = 0;\n spanEaseOptions.max = 5;\n spanEaseOptions.nrItems = spanItems.length;\n const spanEaseItems = bitbybit.vector.spanEaseItems(spanEaseOptions);\n\n const vectors = spanItems.map((s, index) => [s, spanEaseItems[index], 0]) as Bit.Inputs.Base.Vector3[];\n\n bitbybit.draw.drawGridMesh(new Bit.Inputs.Draw.SceneDrawGridMeshDto());\n bitbybit.draw.drawAnyAsync({ entity: vectors });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
title="Vector Span & Ease In Combination"
/>
diff --git a/docs/learn/code/common/draw/examples.mdx b/docs/learn/code/common/draw/examples.mdx
index 2d0250c7..e0405a43 100644
--- a/docs/learn/code/common/draw/examples.mdx
+++ b/docs/learn/code/common/draw/examples.mdx
@@ -28,7 +28,7 @@ The primary component for custom drawing is typically found under the path:
**Rete Example: Filleted Cube with Custom Drawing Options**
@@ -44,7 +44,7 @@ The primary block for custom drawing is typically found under:
5000TRUE111#ff6600#000099#cc33cc20.3TRUETRUETRUE0.01FALSE0.06#ff00ffFALSE0.06#0000ff","version":"0.20.6","type":"blockly"}}
+ script={{"script":"5000TRUE111#ff6600#000099#cc33cc20.3TRUETRUETRUE0.01FALSE0.06#ff00ffFALSE0.06#0000ff","version":"0.20.7","type":"blockly"}}
title="Blockly Drawing Example"
description="Draws simple filletted cube geometry."
/>
@@ -55,7 +55,7 @@ Finally, we achieve the same result using TypeScript. The code follows a similar
{\n\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = 5;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n const filletOptions = new Bit.Inputs.OCCT.FilletDto()\n filletOptions.shape = cube;\n filletOptions.radius = 1;\n const roundedCube = await bitbybit.occt.fillets.filletEdges(filletOptions);\n\n const drawOcctOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOcctOptions.faceColour = \"#0000ff\";\n drawOcctOptions.edgeColour = \"#ff5555\";\n drawOcctOptions.drawVertices = true;\n drawOcctOptions.vertexSize = 0.3;\n // The rest of options remain default (initialized inside the instance)\n const drawnMesh = await bitbybit.draw.drawAnyAsync({ entity: roundedCube, options: drawOcctOptions })\n // drawnMesh is BABYLONJS Mesh if BabylonJS engine is used. In Three.JS it turns into Group.\n return drawnMesh;\n \n}\n\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = 5;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n const filletOptions = new Bit.Inputs.OCCT.FilletDto()\n filletOptions.shape = cube;\n filletOptions.radius = 1;\n const roundedCube = await bitbybit.occt.fillets.filletEdges(filletOptions);\n\n const drawOcctOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOcctOptions.faceColour = \"#0000ff\";\n drawOcctOptions.edgeColour = \"#ff5555\";\n drawOcctOptions.drawVertices = true;\n drawOcctOptions.vertexSize = 0.3;\n // The rest of options remain default (initialized inside the instance)\n const drawnMesh = await bitbybit.draw.drawAnyAsync({ entity: roundedCube, options: drawOcctOptions })\n // drawnMesh is BABYLONJS Mesh if BabylonJS engine is used. In Three.JS it turns into Group.\n return drawnMesh;\n \n}\n\nstart();","version":"0.20.7","type":"typescript"}}
title="TypeScript Drawing Example"
description="Draws simple filletted cube geometry."
/>
\ No newline at end of file
diff --git a/docs/learn/code/common/occt/booleans/operations.mdx b/docs/learn/code/common/occt/booleans/operations.mdx
index be955c40..ec651871 100644
--- a/docs/learn/code/common/occt/booleans/operations.mdx
+++ b/docs/learn/code/common/occt/booleans/operations.mdx
@@ -49,21 +49,21 @@ The following scripts demonstrate creating three solids (a box, a cylinder, and
**TypeScript Example: Union of Solids**
{\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const union = await bitbybit.occt.booleans.union({\n shapes: [box, cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: union\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const union = await bitbybit.occt.booleans.union({\n shapes: [box, cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: union\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Union Three Solids"
/>
**Blockly Example: Union of Solids**
boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.6","type":"blockly"}}
+ script={{"script":"boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.7","type":"blockly"}}
title="Union Three Solids"
/>
**Rete Example: Union of Solids**
@@ -94,21 +94,21 @@ These scripts demonstrate creating a box, cylinder, and sphere, then subtracting
**TypeScript Example: Difference of Solids**
{\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const diff = await bitbybit.occt.booleans.difference({\n shape: box,\n shapes: [cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: diff\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const diff = await bitbybit.occt.booleans.difference({\n shape: box,\n shapes: [cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: diff\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Difference of Solids"
/>
**Blockly Example: Difference of Solids**
boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.6","type":"blockly"}}
+ script={{"script":"boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.7","type":"blockly"}}
title="Difference of Solids"
/>
**Rete Example: Difference of Solids**
@@ -138,21 +138,21 @@ These scripts create a box, cylinder, and sphere, and then compute their common
**TypeScript Example: Intersection of Solids**
{\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const diff = await bitbybit.occt.booleans.intersection({\n shapes: [box, cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: diff\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 5;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.radius = 3;\n cylinderOpt.height = 7;\n cylinderOpt.center = [3, 0, 3];\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt);\n\n\n const sphereOpt = new Bit.Inputs.OCCT.SphereDto();\n sphereOpt.radius = 3;\n sphereOpt.center = [-1.5, 1.5, -5];\n const sphere = await bitbybit.occt.shapes.solid.createSphere(sphereOpt);\n\n const diff = await bitbybit.occt.booleans.intersection({\n shapes: [box, cylinder, sphere],\n keepEdges: false\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: diff\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Intersection of Solids"
/>
**Blockly Example: Intersection of Solids**
boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.6","type":"blockly"}}
+ script={{"script":"boxspherecylinderbox585000sphere3-1.51.5-5cylinder37303010boxcylindersphereFALSE","version":"0.20.7","type":"blockly"}}
title="Intersection of Solids"
/>
**Rete Example: Intersection of Solids**
diff --git a/docs/learn/code/common/occt/fillets/chamfer-circular-edges.mdx b/docs/learn/code/common/occt/fillets/chamfer-circular-edges.mdx
index 7075dc02..d9a45b0e 100644
--- a/docs/learn/code/common/occt/fillets/chamfer-circular-edges.mdx
+++ b/docs/learn/code/common/occt/fillets/chamfer-circular-edges.mdx
@@ -25,21 +25,21 @@ The examples below demonstrate creating a box with a cylindrical hole through it
**TypeScript Example: Chamfer Circular Edge of a Hole**
{\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.direction = [1, 0, 0];\n cylinderOpt.center = [-5, 0, 0];\n cylinderOpt.radius = 2;\n cylinderOpt.height = 10;\n\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt)\n\n const difference = await bitbybit.occt.booleans.difference({\n shape: box,\n shapes: [cylinder],\n keepEdges: false\n });\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: difference,\n distance: 0.4\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n const cylinderOpt = new Bit.Inputs.OCCT.CylinderDto();\n cylinderOpt.direction = [1, 0, 0];\n cylinderOpt.center = [-5, 0, 0];\n cylinderOpt.radius = 2;\n cylinderOpt.height = 10;\n\n const cylinder = await bitbybit.occt.shapes.solid.createCylinder(cylinderOpt)\n\n const difference = await bitbybit.occt.booleans.difference({\n shape: box,\n shapes: [cylinder],\n keepEdges: false\n });\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: difference,\n distance: 0.4\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Chamfer Circular Edge"
/>
**Blockly Example: Chamfer Circular Edge of a Hole**
differenceSoliddifferenceSolid5810000210-500100FALSEdifferenceSolid0.4","version":"0.20.6","type":"blockly"}}
+ script={{"script":"differenceSoliddifferenceSolid5810000210-500100FALSEdifferenceSolid0.4","version":"0.20.7","type":"blockly"}}
title="Chamfer Circular Edge"
/>
**Rete Example: Chamfer Circular Edge of a Hole**
diff --git a/docs/learn/code/common/occt/fillets/chamfers-intro.mdx b/docs/learn/code/common/occt/fillets/chamfers-intro.mdx
index 2d4695cd..cb889ac5 100644
--- a/docs/learn/code/common/occt/fillets/chamfers-intro.mdx
+++ b/docs/learn/code/common/occt/fillets/chamfers-intro.mdx
@@ -48,21 +48,21 @@ The following examples in TypeScript, Rete, and Blockly demonstrate creating a s
**TypeScript Example: Chamfer All Edges of a Solid**
{\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: box,\n distance: 1,\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: box,\n distance: 1,\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Chamfer All Edges of Solid"
/>
**Blockly Example: Chamfer All Edges of a Solid**
58100001","version":"0.20.6","type":"blockly"}}
+ script={{"script":"58100001","version":"0.20.7","type":"blockly"}}
title="Chamfer All Edges of Solid"
/>
**Rete Example: Chamfer All Edges of a Solid**
diff --git a/docs/learn/code/common/occt/fillets/chamfers-var-radius-on-spec-edges.mdx b/docs/learn/code/common/occt/fillets/chamfers-var-radius-on-spec-edges.mdx
index 82eb7026..b74cf7ab 100644
--- a/docs/learn/code/common/occt/fillets/chamfers-var-radius-on-spec-edges.mdx
+++ b/docs/learn/code/common/occt/fillets/chamfers-var-radius-on-spec-edges.mdx
@@ -28,21 +28,21 @@ The examples below demonstrate creating a solid box and then applying chamfers w
**TypeScript Example: Chamfer Specific Edges with Variable Distances**
{\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: box,\n distanceList: [0.2, 1.2, 2],\n indexes: [1, 2, 3]\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const chamfered = await bitbybit.occt.fillets.chamferEdges({\n shape: box,\n distanceList: [0.2, 1.2, 2],\n indexes: [1, 2, 3]\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: chamfered,\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Chamfer Specific Edges of Solid"
/>
**Blockly Example: Chamfer Specific Edges with Variable Distances**
58100000.10.31.22123","version":"0.20.6","type":"blockly"}}
+ script={{"script":"58100000.10.31.22123","version":"0.20.7","type":"blockly"}}
title="Chamfer Specific Edges of Solid"
/>
**Rete Example: Chamfer Specific Edges with Variable Distances**
diff --git a/docs/learn/code/common/occt/fillets/fillet-3d-wires.mdx b/docs/learn/code/common/occt/fillets/fillet-3d-wires.mdx
index 8167ee20..9cc6f872 100644
--- a/docs/learn/code/common/occt/fillets/fillet-3d-wires.mdx
+++ b/docs/learn/code/common/occt/fillets/fillet-3d-wires.mdx
@@ -55,21 +55,21 @@ In these examples, we first construct a 3D star-shaped wire. Then, we apply diff
**TypeScript Example: Fillet Specific Corners of a 3D Wire**
{\n\n const repeatOpt = new Bit.Inputs.Lists.MultiplyItemDto([innerFillet, outerFillet], nrRays);\n const radiusList = bitbybit.lists.repeat(repeatOpt).flat();\n const spanOptions = new Bit.Inputs.Vector.SpanDto(1, 1, nrRays * 2);\n const indexes = bitbybit.vector.span(spanOptions);\n\n const starOptions = new Bit.Inputs.OCCT.StarDto(outerStarRadius, innerStarRadius, nrRays, [0, 0, 0], [0, 1, 0], 4, false);\n const star = await bitbybit.occt.shapes.wire.createStarWire(starOptions);\n\n const filletOptions = new Bit.Inputs.OCCT.Fillet3DWireDto(star, undefined, [0, 1, 0], radiusList, indexes);\n const starFillet = await bitbybit.occt.fillets.fillet3DWire(filletOptions);\n\n const startFilletTranslated1 = await bitbybit.occt.transforms.translate({ shape: starFillet, translation: [0, 5, 0] })\n const startFilletTranslated2 = await bitbybit.occt.transforms.translate({ shape: starFillet, translation: [0, 10, 0] })\n\n\n const starFace = await bitbybit.occt.shapes.face.createFaceFromWire({ shape: startFilletTranslated2, planar: false });\n const starThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: starFace, offset: -1 });\n const starThickFillet = await bitbybit.occt.fillets.filletEdges({ shape: starThick, radius: 0.3 });\n\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOptions.edgeWidth = 15;\n bitbybit.draw.drawAnyAsync({ entity: star, options: drawOptions });\n bitbybit.draw.drawAnyAsync({ entity: startFilletTranslated1, options: drawOptions });\n drawOptions.faceColour = \"#5555ff\";\n drawOptions.edgeColour = \"#000000\";\n drawOptions.edgeWidth = 2;\n drawOptions.precision = 0.005;\n bitbybit.draw.drawAnyAsync({ entity: starThickFillet, options: drawOptions });\n\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n const skyboxOptions = new Bit.Inputs.BabylonScene.SkyboxDto();\n skyboxOptions.skybox = Bit.Inputs.Base.skyboxEnum.clearSky;\n bitbybit.babylon.scene.enableSkybox(skyboxOptions);\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const nrRays = 7;\nconst outerStarRadius = 10;\nconst innerStarRadius = 4;\nconst outerFillet = 0.6;\nconst innerFillet = 1.7;\n\nconst start = async () => {\n\n const repeatOpt = new Bit.Inputs.Lists.MultiplyItemDto([innerFillet, outerFillet], nrRays);\n const radiusList = bitbybit.lists.repeat(repeatOpt).flat();\n const spanOptions = new Bit.Inputs.Vector.SpanDto(1, 1, nrRays * 2);\n const indexes = bitbybit.vector.span(spanOptions);\n\n const starOptions = new Bit.Inputs.OCCT.StarDto(outerStarRadius, innerStarRadius, nrRays, [0, 0, 0], [0, 1, 0], 4, false);\n const star = await bitbybit.occt.shapes.wire.createStarWire(starOptions);\n\n const filletOptions = new Bit.Inputs.OCCT.Fillet3DWireDto(star, undefined, [0, 1, 0], radiusList, indexes);\n const starFillet = await bitbybit.occt.fillets.fillet3DWire(filletOptions);\n\n const startFilletTranslated1 = await bitbybit.occt.transforms.translate({ shape: starFillet, translation: [0, 5, 0] })\n const startFilletTranslated2 = await bitbybit.occt.transforms.translate({ shape: starFillet, translation: [0, 10, 0] })\n\n\n const starFace = await bitbybit.occt.shapes.face.createFaceFromWire({ shape: startFilletTranslated2, planar: false });\n const starThick = await bitbybit.occt.operations.makeThickSolidSimple({ shape: starFace, offset: -1 });\n const starThickFillet = await bitbybit.occt.fillets.filletEdges({ shape: starThick, radius: 0.3 });\n\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOptions.edgeWidth = 15;\n bitbybit.draw.drawAnyAsync({ entity: star, options: drawOptions });\n bitbybit.draw.drawAnyAsync({ entity: startFilletTranslated1, options: drawOptions });\n drawOptions.faceColour = \"#5555ff\";\n drawOptions.edgeColour = \"#000000\";\n drawOptions.edgeWidth = 2;\n drawOptions.precision = 0.005;\n bitbybit.draw.drawAnyAsync({ entity: starThickFillet, options: drawOptions });\n\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n const skyboxOptions = new Bit.Inputs.BabylonScene.SkyboxDto();\n skyboxOptions.skybox = Bit.Inputs.Base.skyboxEnum.clearSky;\n bitbybit.babylon.scene.enableSkybox(skyboxOptions);\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Fillet 3D Wire Specific Corners"
/>
**Blockly Example: Fillet Specific Corners of a 3D Wire**
nrRaysinnerFilletRadiusouterRadiusFilletfilletIndexesradiusLististarPromisestarFilletPromisenrRays7innerFilletRadius1.7outerRadiusFillet0.6filletIndexes11MULTIPLYnrRays2'clearSky'10000.10.7radiusListi1MULTIPLYnrRays21EQi20INSERTLASTradiusListouterRadiusFilletINSERTLASTradiusListinnerFilletRadiusstarPromise000010nrRays1044FALSEstarFilletPromisestarPromiseradiusListfilletIndexes010starPromise0.01FALSE#ff0000TRUE#ffffff15starFilletPromise0500.01FALSE#ff0000TRUE#ffffff15starFilletPromise0100FALSE-10.30.005TRUE#3333ffTRUE#000000240040010100.450.50.5FALSE#ffffff#ffffff","version":"0.20.6","type":"blockly"}}
+ script={{"script":"nrRaysinnerFilletRadiusouterRadiusFilletfilletIndexesradiusLististarPromisestarFilletPromisenrRays7innerFilletRadius1.7outerRadiusFillet0.6filletIndexes11MULTIPLYnrRays2'clearSky'10000.10.7radiusListi1MULTIPLYnrRays21EQi20INSERTLASTradiusListouterRadiusFilletINSERTLASTradiusListinnerFilletRadiusstarPromise000010nrRays1044FALSEstarFilletPromisestarPromiseradiusListfilletIndexes010starPromise0.01FALSE#ff0000TRUE#ffffff15starFilletPromise0500.01FALSE#ff0000TRUE#ffffff15starFilletPromise0100FALSE-10.30.005TRUE#3333ffTRUE#000000240040010100.450.50.5FALSE#ffffff#ffffff","version":"0.20.7","type":"blockly"}}
title="Fillet 3D Wire Specific Corners"
/>
**Rete Example: Fillet Specific Corners of a 3D Wire**
diff --git a/docs/learn/code/common/occt/fillets/fillets-intro.mdx b/docs/learn/code/common/occt/fillets/fillets-intro.mdx
index e4e1ac76..f59cdbb5 100644
--- a/docs/learn/code/common/occt/fillets/fillets-intro.mdx
+++ b/docs/learn/code/common/occt/fillets/fillets-intro.mdx
@@ -43,21 +43,21 @@ The following examples in TypeScript, Rete, and Blockly demonstrate creating a s
**TypeScript Example: Fillet All Edges of a Solid**
{\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const filleted = await bitbybit.occt.fillets.filletEdges({\n shape: box,\n radius: 1,\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: filleted,\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const filleted = await bitbybit.occt.fillets.filletEdges({\n shape: box,\n radius: 1,\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: filleted,\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Fillet Solid"
/>
**Blockly Example: Fillet All Edges of a Solid**
58100001","version":"0.20.6","type":"blockly"}}
+ script={{"script":"58100001","version":"0.20.7","type":"blockly"}}
title="Fillet Solid"
/>
**Rete Example: Fillet All Edges of a Solid**
diff --git a/docs/learn/code/common/occt/fillets/fillets-on-2d-wire-corners.mdx b/docs/learn/code/common/occt/fillets/fillets-on-2d-wire-corners.mdx
index 3660f205..16b2b766 100644
--- a/docs/learn/code/common/occt/fillets/fillets-on-2d-wire-corners.mdx
+++ b/docs/learn/code/common/occt/fillets/fillets-on-2d-wire-corners.mdx
@@ -30,21 +30,21 @@ The examples below demonstrate creating a 2D wire and then applying fillets with
**TypeScript Example: Fillet Specific Corners of a Wire with Variable Radii**
{\n const squareOpt = new Bit.Inputs.OCCT.SquareDto();\n const square = await bitbybit.occt.shapes.wire.createSquareWire(squareOpt);\n const squareFillet = await bitbybit.occt.fillets.fillet2d({\n shape: square,\n radiusList: [0.1, 0.3],\n indexes: [1, 3]\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: squareFillet\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n const squareOpt = new Bit.Inputs.OCCT.SquareDto();\n const square = await bitbybit.occt.shapes.wire.createSquareWire(squareOpt);\n const squareFillet = await bitbybit.occt.fillets.fillet2d({\n shape: square,\n radiusList: [0.1, 0.3],\n indexes: [1, 3]\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: squareFillet\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Fillet Specific Corners of Wire"
/>
**Blockly Example: Fillet Specific Corners of a Wire with Variable Radii**
10000100.10.313","version":"0.20.6","type":"blockly"}}
+ script={{"script":"10000100.10.313","version":"0.20.7","type":"blockly"}}
title="Fillet Specific Corners of Wire"
/>
**Rete Example: Fillet Specific Corners of a Wire with Variable Radii**
diff --git a/docs/learn/code/common/occt/fillets/fillets-on-2d-wires.mdx b/docs/learn/code/common/occt/fillets/fillets-on-2d-wires.mdx
index a7367608..23f1d4f0 100644
--- a/docs/learn/code/common/occt/fillets/fillets-on-2d-wires.mdx
+++ b/docs/learn/code/common/occt/fillets/fillets-on-2d-wires.mdx
@@ -29,21 +29,21 @@ The examples below demonstrate how to create a simple 2D wire (e.g., a polyline
**TypeScript Example: Fillet All Corners of a Wire**
{\n const squareOpt = new Bit.Inputs.OCCT.SquareDto();\n const square = await bitbybit.occt.shapes.wire.createSquareWire(squareOpt);\n const squareFillet = await bitbybit.occt.fillets.fillet2d({\n shape: square,\n radius: 0.25\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: squareFillet\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n const squareOpt = new Bit.Inputs.OCCT.SquareDto();\n const square = await bitbybit.occt.shapes.wire.createSquareWire(squareOpt);\n const squareFillet = await bitbybit.occt.fillets.fillet2d({\n shape: square,\n radius: 0.25\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: squareFillet\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Fillet All Corners of Wire"
/>
**Blockly Example: Fillet All Corners of a Wire**
10000100.24","version":"0.20.6","type":"blockly"}}
+ script={{"script":"10000100.24","version":"0.20.7","type":"blockly"}}
title="Fillet All Corners of Wire"
/>
**Rete Example: Fillet All Corners of a Wire**
diff --git a/docs/learn/code/common/occt/fillets/fillets-var-radius-on-spec-edges.mdx b/docs/learn/code/common/occt/fillets/fillets-var-radius-on-spec-edges.mdx
index 91187418..b7d5742e 100644
--- a/docs/learn/code/common/occt/fillets/fillets-var-radius-on-spec-edges.mdx
+++ b/docs/learn/code/common/occt/fillets/fillets-var-radius-on-spec-edges.mdx
@@ -31,7 +31,7 @@ The examples below demonstrate creating a solid box and then applying fillets wi
**TypeScript Example: Fillet Specific Edges with Variable Radii**
{\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const filleted = await bitbybit.occt.fillets.filletEdges({\n shape: box,\n radiusList: [1, 2, 0.3],\n indexes: [1, 2, 3]\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: filleted,\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const filleted = await bitbybit.occt.fillets.filletEdges({\n shape: box,\n radiusList: [1, 2, 0.3],\n indexes: [1, 2, 3]\n })\n\n bitbybit.draw.drawAnyAsync({\n entity: filleted,\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Variable Fillet Radius On Spec Edges"
/>
@@ -39,7 +39,7 @@ The examples below demonstrate creating a solid box and then applying fillets wi
**Blockly Example: Fillet Specific Edges with Variable Radii**
5810000120.3123","version":"0.20.6","type":"blockly"}}
+ script={{"script":"5810000120.3123","version":"0.20.7","type":"blockly"}}
title="Variable Fillet Radius On Spec Edges"
/>
@@ -47,7 +47,7 @@ The examples below demonstrate creating a solid box and then applying fillets wi
**Rete Example: Fillet Specific Edges with Variable Radii**
diff --git a/docs/learn/code/common/occt/operations/advanced-loft.md b/docs/learn/code/common/occt/operations/advanced-loft.md
index 59c8f2f9..02b56cba 100644
--- a/docs/learn/code/common/occt/operations/advanced-loft.md
+++ b/docs/learn/code/common/occt/operations/advanced-loft.md
@@ -45,21 +45,21 @@ Here's a breakdown of the process described:
nrCornerswire1wire2wire3nrCorners10151515030117910001000100010003wire1000010nrCorners31wire2030010nrCorners10.3wire3070010nrCorners60.5wire3wire2wire1FALSEFALSEFALSEFALSE10FALSE31e-7'approxChordLength'01000-300.01TRUE#cc33ccTRUE#ffffff2","version":"0.20.6","type":"blockly"}}
+ script={{"script":"nrCornerswire1wire2wire3nrCorners10151515030117910001000100010003wire1000010nrCorners31wire2030010nrCorners10.3wire3070010nrCorners60.5wire3wire2wire1FALSEFALSEFALSEFALSE10FALSE31e-7'approxChordLength'01000-300.01TRUE#cc33ccTRUE#ffffff2","version":"0.20.7","type":"blockly"}}
title="Advanced Loft Operation"
/>
{\n\n // --- 1. Camera Configuration ---\n // Create a new configuration object for the scene's Arc Rotate Camera.\n const arcCameraOptions = new CameraConfigurationDto();\n // Set the camera's position in 3D space (x, y, z).\n arcCameraOptions.position = [15, 15, 15];\n // Set the point the camera will look at.\n arcCameraOptions.lookAt = [0, 3, 0];\n // Apply these settings to the active camera in the scene.\n scene.adjustActiveArcRotateCamera(arcCameraOptions);\n\n // Define the number of corners for the polygonal profiles.\n const nrCorners = 10;\n\n // --- 2. Create the First Profile (Bottom) ---\n // Create a DTO to define an n-sided polygon wire.\n const ngonOpt = new NGonWireDto();\n ngonOpt.nrCorners = nrCorners;\n ngonOpt.radius = 3;\n // Asynchronously create the first polygon wire shape at the default center [0,0,0].\n const wire1 = await wire.createNGonWire(ngonOpt);\n\n // Create a DTO for a 2D fillet operation to round the corners of a wire.\n const filletOpt = new FilletDto();\n filletOpt.radius = 0.3; // The radius of the rounded corners.\n filletOpt.shape = wire1; // Specify that the fillet should be applied to wire1.\n // Asynchronously apply the fillet and store the new, smoothed wire.\n const filletedWire1 = await fillets.fillet2d(filletOpt);\n\n // --- 3. Create the Second Profile (Middle) ---\n // Reuse the ngonOpt DTO but modify its properties for the next shape.\n ngonOpt.center = [0, 3, 0]; // Move the center up along the Y-axis.\n ngonOpt.radius = 1; // Make this polygon smaller.\n const wire2 = await wire.createNGonWire(ngonOpt);\n\n // Reuse the filletOpt DTO to apply the same fillet radius to the new wire.\n filletOpt.shape = wire2;\n const filletedWire2 = await fillets.fillet2d(filletOpt);\n\n // --- 4. Create the Third Profile (Top) ---\n // Reuse and modify the DTOs again for the third and final profile.\n ngonOpt.center = [0, 7, 0]; // Move this one even higher.\n ngonOpt.radius = 6; // Make this polygon the largest.\n const wire3 = await wire.createNGonWire(ngonOpt);\n\n // Use a larger fillet radius for this larger wire.\n filletOpt.radius = 0.5;\n filletOpt.shape = wire3;\n const filletedWire3 = await fillets.fillet2d(filletOpt);\n\n // --- 5. Perform the Loft Operation ---\n // A loft creates a 3D solid by connecting a series of 2D profiles.\n const loftAdvancedOptions = new LoftAdvancedDto();\n // Specify a single point where the loft should begin, creating a pointed top.\n loftAdvancedOptions.startVertex = [0, 10, 0];\n // Specify a single point where the loft should end, creating a pointed bottom.\n loftAdvancedOptions.endVertex = [0, -3, 0];\n // Provide the array of profiles to connect. The order matters.\n loftAdvancedOptions.shapes = [filletedWire3, filletedWire2, filletedWire1];\n // Asynchronously execute the loft operation to create the final 3D shape.\n const loftedShape = await operations.loftAdvanced(loftAdvancedOptions)\n\n // --- 6. Draw the Final Shape ---\n // Create a DTO to define how the shape should be drawn.\n const drawOptions = new DrawOcctShapeSimpleOptions();\n // Set the color of the shape's faces to magenta.\n drawOptions.faceColour = \"#ff00ff\";\n\n // Call the generic drawing function to render the OCCT shape in the scene.\n bitbybit.draw.drawAnyAsync({\n entity: loftedShape, // The shape to draw.\n options: drawOptions // The drawing options to apply.\n });\n\n}\n\n// Execute the main function to start the script.\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"\n// Import DTOs for configuring various operations. DTOs are objects used to pass data.\n// Import camera configuration for setting up the scene view.\nconst { CameraConfigurationDto } = Bit.Inputs.BabylonScene;\n// Import DTOs for OpenCASCADE (OCCT) geometric modeling: creating polygons, fillets, and lofts.\nconst { NGonWireDto, FilletDto, LoftAdvancedDto } = Bit.Inputs.OCCT;\n// Import DTO for specifying drawing options, like color and opacity.\nconst { DrawOcctShapeSimpleOptions } = Bit.Inputs.Draw;\n// Import a specific type for an OCCT wire, ensuring type safety in our code.\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\n\n// Destructure the bitbybit API to get direct access to its main modules.\n// 'scene' provides access to Babylon.js scene controls.\nconst { scene } = bitbybit.babylon;\n// 'wire', 'fillets', and 'operations' are part of the OCCT module for creating and manipulating shapes.\nconst { wire } = bitbybit.occt.shapes;\nconst { fillets, operations } = bitbybit.occt;\n\n// Define an asynchronous function to execute the main logic.\n// Using async/await is necessary because geometry creation and drawing are non-blocking operations.\nconst start = async () => {\n\n // --- 1. Camera Configuration ---\n // Create a new configuration object for the scene's Arc Rotate Camera.\n const arcCameraOptions = new CameraConfigurationDto();\n // Set the camera's position in 3D space (x, y, z).\n arcCameraOptions.position = [15, 15, 15];\n // Set the point the camera will look at.\n arcCameraOptions.lookAt = [0, 3, 0];\n // Apply these settings to the active camera in the scene.\n scene.adjustActiveArcRotateCamera(arcCameraOptions);\n\n // Define the number of corners for the polygonal profiles.\n const nrCorners = 10;\n\n // --- 2. Create the First Profile (Bottom) ---\n // Create a DTO to define an n-sided polygon wire.\n const ngonOpt = new NGonWireDto();\n ngonOpt.nrCorners = nrCorners;\n ngonOpt.radius = 3;\n // Asynchronously create the first polygon wire shape at the default center [0,0,0].\n const wire1 = await wire.createNGonWire(ngonOpt);\n\n // Create a DTO for a 2D fillet operation to round the corners of a wire.\n const filletOpt = new FilletDto();\n filletOpt.radius = 0.3; // The radius of the rounded corners.\n filletOpt.shape = wire1; // Specify that the fillet should be applied to wire1.\n // Asynchronously apply the fillet and store the new, smoothed wire.\n const filletedWire1 = await fillets.fillet2d(filletOpt);\n\n // --- 3. Create the Second Profile (Middle) ---\n // Reuse the ngonOpt DTO but modify its properties for the next shape.\n ngonOpt.center = [0, 3, 0]; // Move the center up along the Y-axis.\n ngonOpt.radius = 1; // Make this polygon smaller.\n const wire2 = await wire.createNGonWire(ngonOpt);\n\n // Reuse the filletOpt DTO to apply the same fillet radius to the new wire.\n filletOpt.shape = wire2;\n const filletedWire2 = await fillets.fillet2d(filletOpt);\n\n // --- 4. Create the Third Profile (Top) ---\n // Reuse and modify the DTOs again for the third and final profile.\n ngonOpt.center = [0, 7, 0]; // Move this one even higher.\n ngonOpt.radius = 6; // Make this polygon the largest.\n const wire3 = await wire.createNGonWire(ngonOpt);\n\n // Use a larger fillet radius for this larger wire.\n filletOpt.radius = 0.5;\n filletOpt.shape = wire3;\n const filletedWire3 = await fillets.fillet2d(filletOpt);\n\n // --- 5. Perform the Loft Operation ---\n // A loft creates a 3D solid by connecting a series of 2D profiles.\n const loftAdvancedOptions = new LoftAdvancedDto();\n // Specify a single point where the loft should begin, creating a pointed top.\n loftAdvancedOptions.startVertex = [0, 10, 0];\n // Specify a single point where the loft should end, creating a pointed bottom.\n loftAdvancedOptions.endVertex = [0, -3, 0];\n // Provide the array of profiles to connect. The order matters.\n loftAdvancedOptions.shapes = [filletedWire3, filletedWire2, filletedWire1];\n // Asynchronously execute the loft operation to create the final 3D shape.\n const loftedShape = await operations.loftAdvanced(loftAdvancedOptions)\n\n // --- 6. Draw the Final Shape ---\n // Create a DTO to define how the shape should be drawn.\n const drawOptions = new DrawOcctShapeSimpleOptions();\n // Set the color of the shape's faces to magenta.\n drawOptions.faceColour = \"#ff00ff\";\n\n // Call the generic drawing function to render the OCCT shape in the scene.\n bitbybit.draw.drawAnyAsync({\n entity: loftedShape, // The shape to draw.\n options: drawOptions // The drawing options to apply.\n });\n\n}\n\n// Execute the main function to start the script.\nstart();","version":"0.20.7","type":"typescript"}}
title="Advanced Loft Operation"
/>
diff --git a/docs/learn/code/common/occt/operations/extrusions.md b/docs/learn/code/common/occt/operations/extrusions.md
index 538ad4fa..c74a59b1 100644
--- a/docs/learn/code/common/occt/operations/extrusions.md
+++ b/docs/learn/code/common/occt/operations/extrusions.md
@@ -35,21 +35,21 @@ By understanding extrusion, you gain a powerful tool for your 3D modeling toolki
heightheight40000107740FALSE0.50height0","version":"0.20.6","type":"blockly"}}
+ script={{"script":"heightheight40000107740FALSE0.50height0","version":"0.20.7","type":"blockly"}}
title="Extrude the wire into shell kind of shape"
/>
{\n\n // Define a constant 'height' for the extrusion operation.\n const height = 4;\n\n // Create a new StarDto instance to configure the properties of a star-shaped wire.\n const starOpt = new StarDto();\n // Set the inner radius of the star.\n starOpt.innerRadius = 4;\n // Set the outer radius of the star.\n starOpt.outerRadius = 7;\n // Asynchronously create the star-shaped wire using the configured options.\n // The 'await' keyword pauses execution until the wire creation is complete.\n // Bitbybit runs such CAD operations in the worker thread, which doesn't block UI\n // and is usually faster.\n const star = await wire.createStarWire(starOpt);\n\n // Create a new FilletDto instance to configure a 2D fillet operation.\n // The generic type specifies that this fillet will be applied to a wire.\n const filletOpt = new FilletDto();\n // Set the shape to be filleted to the previously created star wire.\n filletOpt.shape = star;\n // Set the radius for the fillet (rounding of corners).\n filletOpt.radius = 0.5;\n // Asynchronously apply the 2D fillet to the star wire.\n const roundedStar = await fillets.fillet2d(filletOpt);\n\n // Create a new ExtrudeDto instance to configure an extrusion operation.\n // The generic type specifies that a wire will be extruded.\n const extrudeOpt = new ExtrudeDto();\n // Set the shape to be extruded to the previously created rounded star wire.\n extrudeOpt.shape = roundedStar;\n // Set the direction and magnitude of the extrusion as a 3D vector [x, y, z].\n // Here, it extrudes along the Y-axis by the value of 'height'.\n extrudeOpt.direction = [0, height, 0];\n // Asynchronously perform the extrusion operation on the rounded star wire.\n const extrudedRoundStar = await operations.extrude(extrudeOpt);\n\n // Asynchronously draw the final extruded shape in the 3D scene.\n // 'entity' specifies the shape to be drawn.\n bitbybit.draw.drawAnyAsync({ entity: extrudedRoundStar });\n\n}\n\n// Call the 'start' function to execute the script.\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"// Import the 'wire' module for creating wire shapes from the OCCT (OpenCASCADE Technology) library.\nconst { wire } = bitbybit.occt.shapes;\n// Import 'fillets' and 'operations' modules for performing filleting and extrusion operations on OCCT shapes.\nconst { fillets, operations } = bitbybit.occt;\n// Import Data Transfer Objects (DTOs) for configuring star creation, filleting, and extrusion.\n// DTOs are used to pass parameters to the respective functions.\nconst { StarDto, FilletDto, ExtrudeDto } = Bit.Inputs.OCCT;\n// Define a type alias for a pointer to a TopoDS_Wire, which is an OCCT data structure representing a wire.\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\n\n// Define an asynchronous function named 'start' which will contain the main logic for creating and drawing the shape.\n// The 'async' keyword allows the use of 'await' for operations that might take time, like geometry creation.\nconst start = async () => {\n\n // Define a constant 'height' for the extrusion operation.\n const height = 4;\n\n // Create a new StarDto instance to configure the properties of a star-shaped wire.\n const starOpt = new StarDto();\n // Set the inner radius of the star.\n starOpt.innerRadius = 4;\n // Set the outer radius of the star.\n starOpt.outerRadius = 7;\n // Asynchronously create the star-shaped wire using the configured options.\n // The 'await' keyword pauses execution until the wire creation is complete.\n // Bitbybit runs such CAD operations in the worker thread, which doesn't block UI\n // and is usually faster.\n const star = await wire.createStarWire(starOpt);\n\n // Create a new FilletDto instance to configure a 2D fillet operation.\n // The generic type specifies that this fillet will be applied to a wire.\n const filletOpt = new FilletDto();\n // Set the shape to be filleted to the previously created star wire.\n filletOpt.shape = star;\n // Set the radius for the fillet (rounding of corners).\n filletOpt.radius = 0.5;\n // Asynchronously apply the 2D fillet to the star wire.\n const roundedStar = await fillets.fillet2d(filletOpt);\n\n // Create a new ExtrudeDto instance to configure an extrusion operation.\n // The generic type specifies that a wire will be extruded.\n const extrudeOpt = new ExtrudeDto();\n // Set the shape to be extruded to the previously created rounded star wire.\n extrudeOpt.shape = roundedStar;\n // Set the direction and magnitude of the extrusion as a 3D vector [x, y, z].\n // Here, it extrudes along the Y-axis by the value of 'height'.\n extrudeOpt.direction = [0, height, 0];\n // Asynchronously perform the extrusion operation on the rounded star wire.\n const extrudedRoundStar = await operations.extrude(extrudeOpt);\n\n // Asynchronously draw the final extruded shape in the 3D scene.\n // 'entity' specifies the shape to be drawn.\n bitbybit.draw.drawAnyAsync({ entity: extrudedRoundStar });\n\n}\n\n// Call the 'start' function to execute the script.\nstart();","version":"0.20.7","type":"typescript"}}
title="Extrude the wire into shell kind of shape"
/>
@@ -69,21 +69,21 @@ In the following examples, we first construct a complex wire, then create a plan
heightheight4000010070000100520FALSEFALSETRUETRUE0height0","version":"0.20.6","type":"blockly"}}
+ script={{"script":"heightheight4000010070000100520FALSEFALSETRUETRUE0height0","version":"0.20.7","type":"blockly"}}
title="Extrude the face into solid shape"
/>
{\n\n const height = 4;\n\n const heartOpt = new Heart2DDto();\n heartOpt.sizeApprox = 7;\n const heart1 = await wire.createHeartWire(heartOpt);\n\n heartOpt.sizeApprox = 5;\n const heart2 = await wire.createHeartWire(heartOpt);\n\n const zigZagOpt = new ZigZagBetweenTwoWiresDto(heart1, heart2, 31);\n const zigZagWire = await wire.createZigZagBetweenTwoWires(zigZagOpt);\n\n const faceFromWireOpt = new FaceFromWireDto(zigZagWire, true);\n const zigZagFace = await face.createFaceFromWire(faceFromWireOpt);\n \n const extrudeOpt = new ExtrudeDto();\n extrudeOpt.shape = zigZagFace;\n extrudeOpt.direction = [0, height, 0];\n const extrudedZigZag = await operations.extrude(extrudeOpt);\n\n bitbybit.draw.drawAnyAsync({ entity: extrudedZigZag });\n\n}\n\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const { wire, face } = bitbybit.occt.shapes;\nconst { fillets, operations } = bitbybit.occt;\nconst { FilletDto, ExtrudeDto, Heart2DDto, ZigZagBetweenTwoWiresDto, FaceFromWireDto } = Bit.Inputs.OCCT;\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\ntype TopoDSFacePointer = Bit.Inputs.OCCT.TopoDSFacePointer;\nconst start = async () => {\n\n const height = 4;\n\n const heartOpt = new Heart2DDto();\n heartOpt.sizeApprox = 7;\n const heart1 = await wire.createHeartWire(heartOpt);\n\n heartOpt.sizeApprox = 5;\n const heart2 = await wire.createHeartWire(heartOpt);\n\n const zigZagOpt = new ZigZagBetweenTwoWiresDto(heart1, heart2, 31);\n const zigZagWire = await wire.createZigZagBetweenTwoWires(zigZagOpt);\n\n const faceFromWireOpt = new FaceFromWireDto(zigZagWire, true);\n const zigZagFace = await face.createFaceFromWire(faceFromWireOpt);\n \n const extrudeOpt = new ExtrudeDto();\n extrudeOpt.shape = zigZagFace;\n extrudeOpt.direction = [0, height, 0];\n const extrudedZigZag = await operations.extrude(extrudeOpt);\n\n bitbybit.draw.drawAnyAsync({ entity: extrudedZigZag });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
title="Extrude the face into solid shape"
/>
diff --git a/docs/learn/code/common/occt/operations/offset-operations.md b/docs/learn/code/common/occt/operations/offset-operations.md
new file mode 100644
index 00000000..994ba8f0
--- /dev/null
+++ b/docs/learn/code/common/occt/operations/offset-operations.md
@@ -0,0 +1,205 @@
+---
+sidebar_position: 2
+title: Offset Operations
+sidebar_label: Offset Operations
+description: Learn how to create offset shapes using various offset operations in OCCT - from simple wire and face offsets to advanced thick solids.
+tags: [code, occt, rete, blockly, typescript]
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import BitByBitRenderCanvas from '@site/src/components/BitByBitRenderCanvas';
+
+
+
+## Understanding Offset Operations
+
+Offset operations are essential tools in 3D modeling that allow you to create new shapes by expanding or contracting existing ones by a specified distance. Think of it like inflating or deflating a balloon - the shape maintains its general form but becomes larger or smaller. These operations are particularly useful for creating wall thicknesses, generating borders, or preparing shapes for manufacturing processes where material thickness is crucial.
+
+In OCCT (OpenCascade Technology), there are several types of offset operations, each suited for different scenarios:
+
+* **Basic Offset**: Simple expansion or contraction of wires, edges, and faces
+* **Advanced Offset**: Provides additional control over corner treatments and edge handling
+* **3D Wire Offset**: Creates offset paths in 3D space along a specified direction
+* **Thick Solid Creation**: Transforms shells and faces into volumetric solids with specified wall thickness
+
+Understanding these operations will give you powerful tools for creating complex geometries from simple profiles.
+
+## Basic Wire Offset
+
+The most common offset operation involves creating an offset version of a 2D wire (a closed or open curve). This operation moves all points of the wire outward (positive offset) or inward (negative offset) by the specified distance, maintaining the original shape's topology.
+
+Key parameters for wire offset include:
+
+* **Shape**: The wire or edge to be offset
+* **Distance**: How far to offset (positive = outward, negative = inward)
+* **Tolerance**: Precision for the offset calculation
+* **Face** (optional): A reference face to define the offset plane
+
+
+
+
+
+
+ hexagonoffsetDistanceoffsetShapehexagon00001046offsetDistance1.2offsetShapehexagonoffsetDistance0.1hexagon#00ff004offsetShape#ff00004","version":"0.20.7","type":"blockly"}}
+ title="Basic Wire Offset Operation"
+ />
+
+
+ {\n\n // Define the offset distance - positive values expand the shape, negative values contract it\n const offsetDistance = 1.2;\n\n // Create a new NGonWireDto instance to configure a hexagonal wire\n const hexagonOpt = new Bit.Inputs.OCCT.NGonWireDto();\n // Set the center point of the polygon\n hexagonOpt.center = [0, 0, 0];\n // Set the direction vector (normal to the plane of the polygon)\n hexagonOpt.direction = [0, 1, 0];\n // Set the radius from center to vertices\n hexagonOpt.radius = 4;\n // Set the number of corners (6 for hexagon)\n hexagonOpt.nrCorners = 6;\n \n // Create the hexagonal wire\n const hexagon = await wire.createNGonWire(hexagonOpt);\n\n // Create a new OffsetDto instance to configure the offset operation\n const offsetOpt = new OffsetDto();\n // Set the shape to be offset\n offsetOpt.shape = hexagon;\n // Set the offset distance (positive = outward, negative = inward)\n offsetOpt.distance = offsetDistance;\n // Set the tolerance for the offset calculation\n offsetOpt.tolerance = 0.1;\n \n // Perform the offset operation\n const offsetShape = await operations.offset(offsetOpt);\n\n // Draw both the original and offset shapes with different colors for comparison\n const originalOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n originalOptions.edgeWidth = 4;\n originalOptions.edgeColour = \"#00ff00\"; // Green for original\n \n const offsetOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n offsetOptions.edgeWidth = 4;\n offsetOptions.edgeColour = \"#ff0000\"; // Red for offset\n \n bitbybit.draw.drawAnyAsync({ entity: hexagon, options: originalOptions });\n bitbybit.draw.drawAnyAsync({ entity: offsetShape, options: offsetOptions });\n\n}\n\n// Call the 'start' function to execute the script\nstart();","version":"0.20.7","type":"typescript"}}
+ title="Basic Wire Offset Operation"
+ />
+
+
+
+## Advanced Offset with Join Types
+
+The advanced offset operation provides additional control over how corners and edges are handled during the offset process. This is particularly important when dealing with complex shapes where the default offset behavior might not produce the desired results.
+
+Advanced offset parameters include:
+
+* **Join Type**: Controls how corners are treated (arc, intersection, or tangent)
+* **Remove Internal Edges**: Option to clean up internal edges in the result
+* **All basic offset parameters**: Shape, distance, tolerance, and optional face
+
+The join types available are:
+- **Arc**: Creates rounded corners (default)
+- **Intersection**: Creates sharp corners by extending edges until they intersect
+- **Tangent**: Creates beveled corners with tangent transitions
+
+
+
+
+
+
+ starWireoffsetDistanceoffsetShapestarWire000010531.50FALSEoffsetDistance0.8offsetShapestarWireoffsetDistance0.1intersectionFALSEstarWire#00ff004offsetShape#ff00004","version":"0.20.7","type":"blockly"}}
+ title="Advanced Offset with Join Type Control"
+ />
+
+
+ {\n\n // Define the offset distance\n const offsetDistance = 0.8;\n\n // Create a star-shaped wire for demonstration\n const starOpt = new StarDto();\n starOpt.center = [0, 0, 0];\n starOpt.direction = [0, 1, 0];\n starOpt.numRays = 5;\n starOpt.outerRadius = 3;\n starOpt.innerRadius = 1.5;\n \n const starWire = await wire.createStarWire(starOpt);\n\n // Create an advanced offset with specific join type\n const offsetAdvOpt = new OffsetAdvancedDto();\n offsetAdvOpt.shape = starWire;\n offsetAdvOpt.distance = offsetDistance;\n offsetAdvOpt.tolerance = 0.1;\n // Set join type to 'intersection' for sharp corners\n // Other options: 'arc' (rounded), 'tangent' (beveled)\n offsetAdvOpt.joinType = Bit.Inputs.OCCT.joinTypeEnum.intersection;\n offsetAdvOpt.removeIntEdges = false;\n \n const offsetShape = await operations.offsetAdv(offsetAdvOpt);\n\n // Draw both shapes with different colors for comparison\n const originalOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n originalOptions.edgeWidth = 4;\n originalOptions.edgeColour = \"#00ff00\"; // Green for original\n \n const offsetOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n offsetOptions.edgeWidth = 4;\n offsetOptions.edgeColour = \"#ff0000\"; // Red for offset\n \n bitbybit.draw.drawAnyAsync({ entity: starWire, options: originalOptions });\n bitbybit.draw.drawAnyAsync({ entity: offsetShape, options: offsetOptions });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
+ title="Advanced Offset with Join Type Control"
+ />
+
+
+
+## Creating Thick Solids
+
+One of the most practical applications of offset operations is creating thick solids from shells or faces. This operation is commonly used in manufacturing and architectural modeling where you need to give thickness to what would otherwise be infinitely thin surfaces.
+
+The thick solid operation takes a shell (collection of connected faces) or a face and creates a volumetric solid by offsetting the surface inward or outward by a specified distance. This is particularly useful for:
+
+- Creating wall thicknesses in architectural models
+- Adding material thickness to sheet metal parts
+- Converting surface models to solid models for 3D printing
+
+
+
+
+
+
+ circleWirecircularFacethicknessthickSolidcircleWire0000103circularFacecircleWireTRUEthickness0.5thickSolidcircularFacethicknesstranslatedSolidthickSolid010circularFace#00ff004translatedSolid#ff00004","version":"0.20.7","type":"blockly"}}
+ title="Creating Thick Solid from Face"
+ />
+
+
+ {\n\n // Define the thickness for the solid\n const thickness = 0.5;\n\n // Step 1: Create a circular wire\n const circleOpt = new CircleDto();\n circleOpt.center = [0, 0, 0];\n circleOpt.direction = [0, 1, 0];\n circleOpt.radius = 3;\n \n const circleWire = await wire.createCircleWire(circleOpt);\n\n // Step 2: Convert the wire to a face\n const faceOpt = new FaceFromWireDto();\n faceOpt.shape = circleWire;\n faceOpt.planar = true;\n \n const circularFace = await face.createFaceFromWire(faceOpt);\n\n // Step 3: Create a thick solid from the face\n const thickSolidOpt = new ThisckSolidSimpleDto();\n thickSolidOpt.shape = circularFace;\n // Positive offset creates thickness in the direction of the face normal\n thickSolidOpt.offset = thickness;\n \n const thickSolid = await operations.makeThickSolidSimple(thickSolidOpt);\n\n // Step 4: Translate the thick solid upwards to make the original face visible\n const translationOpt = new TranslateDto();\n translationOpt.shape = thickSolid;\n translationOpt.translation = [0, 1, 0]; // Move up by 1 unit\n \n const translatedSolid = await transforms.translate(translationOpt);\n\n // Draw both the original face and resulting thick solid with different colors for comparison\n const originalOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n originalOptions.edgeWidth = 4;\n originalOptions.edgeColour = \"#00ff00\"; // Green for original\n \n const thickSolidOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n thickSolidOptions.edgeWidth = 4;\n thickSolidOptions.edgeColour = \"#ff0000\"; // Red for thick solid\n \n bitbybit.draw.drawAnyAsync({ entity: circularFace, options: originalOptions });\n bitbybit.draw.drawAnyAsync({ entity: translatedSolid, options: thickSolidOptions });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
+ title="Creating Thick Solid from Face"
+ />
+
+
+
+## 3D Wire Offset
+
+The 3D wire offset operation is useful when you need to create an offset path in three-dimensional space along a specific direction. This operation is particularly valuable for creating toolpaths, creating parallel curves in 3D space, or generating support structures.
+
+This operation works by:
+1. Extruding the input wire in the specified direction
+2. Creating a thick solid from the extrusion
+3. Extracting the offset edges from specific faces of the thick solid
+4. Combining these edges back into a wire or returning them as individual edges
+
+
+
+
+
+
+ curvedWireoffsetDistanceextrusionDirectionoffset3DWirecurvedWire0002124-11623FALSEoffsetDistance0.5extrusionDirection010offset3DWirecurvedWireextrusionDirectionoffsetDistancecurvedWire#00ff004offset3DWire#ff00004","version":"0.20.7","type":"blockly"}}
+ title="3D Wire Offset Operation"
+ />
+
+
+ {\n\n // Define parameters for the 3D offset\n const offsetDistance = 0.5;\n const extrusionDirection = [0, 1, 0]; // Y-axis direction\n\n // Step 1: Create a curved 3D wire using B-spline\n const curveOpt = new BSplineDto();\n // Define control points for a truly 3D curve with varying Y coordinates\n curveOpt.points = [\n [0, 0, 0], // Start point\n [2, 1, 2], // First control point (elevated in Y)\n [4, -1, 1], // Second control point (lowered in Y)\n [6, 2, 3] // End point (elevated in Y and Z)\n ];\n curveOpt.closed = false;\n \n const curvedWire = await wire.createBSpline(curveOpt);\n\n // Step 2: Create 3D offset of the wire\n const offset3DOpt = new Offset3DWireDto();\n offset3DOpt.shape = curvedWire;\n // Direction for the temporary extrusion used in the offset calculation\n offset3DOpt.direction = extrusionDirection as Bit.Inputs.Base.Point3;\n // Distance to offset the wire\n offset3DOpt.offset = offsetDistance;\n \n const offset3DWire = await operations.offset3DWire(offset3DOpt);\n\n // Draw both the original and offset wires with different colors for comparison\n const originalOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n originalOptions.edgeWidth = 4;\n originalOptions.edgeColour = \"#00ff00\"; // Green for original\n \n const offsetOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n offsetOptions.edgeWidth = 4;\n offsetOptions.edgeColour = \"#ff0000\"; // Red for offset\n \n bitbybit.draw.drawAnyAsync({ entity: curvedWire, options: originalOptions });\n bitbybit.draw.drawAnyAsync({ entity: offset3DWire, options: offsetOptions });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
+ title="3D Wire Offset Operation"
+ />
+
+
+
+## Practical Applications and Tips
+
+Offset operations are incredibly versatile and have numerous practical applications:
+
+### Manufacturing and Design
+- **Wall Thickness**: Creating walls with specific thickness for 3D printing or manufacturing
+- **Clearance Gaps**: Adding clearance around parts for assembly
+- **Tool Paths**: Generating machining paths at specific distances from part edges
+
+### Architecture and Construction
+- **Building Walls**: Converting floor plan outlines into walls with thickness
+- **Insulation Layers**: Adding insulation thickness to building components
+- **Structural Elements**: Creating beams and columns with proper cross-sections
+
+### Important Considerations
+
+When working with offset operations, keep these points in mind:
+
+1. **Tolerance Settings**: Use appropriate tolerance values based on your model scale and precision requirements
+2. **Join Types**: Choose the right join type for your application - arc for smooth corners, intersection for sharp edges
+3. **Self-Intersections**: Complex shapes may create self-intersections when offset; consider using smaller offset distances or simplifying the geometry
+4. **Performance**: Large offset distances on complex geometries can be computationally expensive
+5. **Direction Matters**: For thick solids, positive offsets typically go in the direction of the surface normal
+
+### Best Practices
+
+- Start with simple shapes to understand the behavior before applying to complex geometries
+- Use visualization to verify results, especially with complex corner treatments
+- Consider the manufacturing constraints when setting offset distances
+- Test different join types to achieve the desired aesthetic and functional results
+
+With these offset operations, you now have powerful tools for creating sophisticated 3D models with proper thickness and spacing considerations. These operations form the foundation for many advanced modeling workflows in mechanical design, architecture, and manufacturing.
diff --git a/docs/learn/code/common/occt/operations/rotated-extrusions.md b/docs/learn/code/common/occt/operations/rotated-extrusions.md
index 08205cba..10d77303 100644
--- a/docs/learn/code/common/occt/operations/rotated-extrusions.md
+++ b/docs/learn/code/common/occt/operations/rotated-extrusions.md
@@ -34,21 +34,21 @@ In the examples below, we will demonstrate how to create a simple solid 3D helic
130000104360TRUE","version":"0.20.6","type":"blockly"}}
+ script={{"script":"130000104360TRUE","version":"0.20.7","type":"blockly"}}
title="Extrude the wire into shell kind of shape"
/>
{\n\n const recOpt = new Bit.Inputs.OCCT.RectangleDto(1, 3);\n const rectangle = await bitbybit.occt.shapes.wire.createRectangleWire(recOpt);\n const rotatedExtrudeOpt = new Bit.Inputs.OCCT.RotationExtrudeDto(rectangle, 4);\n const rotatedExtrude = await bitbybit.occt.operations.rotatedExtrude(rotatedExtrudeOpt)\n\n bitbybit.draw.drawAnyAsync({ entity: rotatedExtrude });\n\n}\n\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const recOpt = new Bit.Inputs.OCCT.RectangleDto(1, 3);\n const rectangle = await bitbybit.occt.shapes.wire.createRectangleWire(recOpt);\n const rotatedExtrudeOpt = new Bit.Inputs.OCCT.RotationExtrudeDto(rectangle, 4);\n const rotatedExtrude = await bitbybit.occt.operations.rotatedExtrude(rotatedExtrudeOpt)\n\n bitbybit.draw.drawAnyAsync({ entity: rotatedExtrude });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
title="Extrude the wire into shell kind of shape"
/>
@@ -62,21 +62,21 @@ When the profile is further from the center it will form a helix like shape. Thi
pointPromisespointsngonRotationPromisesi3050300150117910001000100010003pointPromises00001061012FALSETRUEpointspointPromisesngonRotationPromisesipointsINSERTLASTngonRotationPromisesi01061.530270TRUEngonRotationPromises","version":"0.20.6","type":"blockly"}}
+ script={{"script":"pointPromisespointsngonRotationPromisesi3050300150117910001000100010003pointPromises00001061012FALSETRUEpointspointPromisesngonRotationPromisesipointsINSERTLASTngonRotationPromisesi01061.530270TRUEngonRotationPromises","version":"0.20.7","type":"blockly"}}
title="Extrude the wire into shell kind of shape"
/>
{\n\n // Adjust the default camera position to face the object\n const cameraOptions = new CameraConfigurationDto();\n cameraOptions.position = [30, 50, 50];\n cameraOptions.lookAt = [0, 15, 0];\n scene.adjustActiveArcRotateCamera(cameraOptions);\n\n // This ellipse will be used to derive origins for ngons on the ground plane\n const ellipseOptions = new EllipseDto();\n ellipseOptions.radiusMinor = 6;\n ellipseOptions.radiusMajor = 10;\n const ellipse = await wire.createEllipseWire(ellipseOptions);\n\n // We divide the wire into 12 segments and return the points\n const divideOptions = new DivideDto(ellipse);\n divideOptions.removeEndPoint = true;\n divideOptions.nrOfDivisions = 12;\n const points = await wire.divideWireByEqualDistanceToPoints(divideOptions);\n\n // Create ngons on these points\n const ngonOptions = new NGonWireDto();\n ngonOptions.radius = 1.5;\n const ngonPromises = points.map(point => {\n ngonOptions.center = point;\n return wire.createNGonWire(ngonOptions);\n });\n\n const ngons = await Promise.all(ngonPromises);\n\n // Form rotated extrusions on all of the points\n const rotatedExtrudeOptions = new RotationExtrudeDto();\n rotatedExtrudeOptions.angle = 270;\n rotatedExtrudeOptions.height = 30;\n const rotatedExtrusionPromises = ngons.map(ngon => {\n rotatedExtrudeOptions.shape = ngon;\n return operations.rotatedExtrude(rotatedExtrudeOptions);\n });\n\n const rotatedExtrusions = await Promise.all(rotatedExtrusionPromises);\n\n // Compounding multiple shapes will generally deliver much better rendering performance\n // as it will form a single mesh for all of the geometries involved in compound\n const compoundOptions = new CompoundShapesDto(rotatedExtrusions);\n const ngonCompound = await compound.makeCompound(compoundOptions);\n\n // As a last step we draw the ngon with default occt settings (defualt because we omit specifying options property)\n bitbybit.draw.drawAnyAsync({ entity: ngonCompound });\n\n}\n\n// Let's not forget to execute the start function, otherwise nothing will happen.\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"// These destructured imports are optional, but convenient later on - option DTO's are classes\nconst { EllipseDto, RotationExtrudeDto, DivideDto, NGonWireDto, CompoundShapesDto } = Bit.Inputs.OCCT;\nconst { CameraConfigurationDto } = Bit.Inputs.BabylonScene;\n// These are parts of the bitbybit API that will be used in the script\nconst { wire, compound } = bitbybit.occt.shapes;\nconst { operations } = bitbybit.occt;\nconst { scene } = bitbybit.babylon;\n// Types need to be destructured one by one\ntype TopoDSWirePointer = Bit.Inputs.OCCT.TopoDSWirePointer;\n\n// Async definition of the start function where we can await on asynchronous CAD algorithms running inside the web workers\nconst start = async () => {\n\n // Adjust the default camera position to face the object\n const cameraOptions = new CameraConfigurationDto();\n cameraOptions.position = [30, 50, 50];\n cameraOptions.lookAt = [0, 15, 0];\n scene.adjustActiveArcRotateCamera(cameraOptions);\n\n // This ellipse will be used to derive origins for ngons on the ground plane\n const ellipseOptions = new EllipseDto();\n ellipseOptions.radiusMinor = 6;\n ellipseOptions.radiusMajor = 10;\n const ellipse = await wire.createEllipseWire(ellipseOptions);\n\n // We divide the wire into 12 segments and return the points\n const divideOptions = new DivideDto(ellipse);\n divideOptions.removeEndPoint = true;\n divideOptions.nrOfDivisions = 12;\n const points = await wire.divideWireByEqualDistanceToPoints(divideOptions);\n\n // Create ngons on these points\n const ngonOptions = new NGonWireDto();\n ngonOptions.radius = 1.5;\n const ngonPromises = points.map(point => {\n ngonOptions.center = point;\n return wire.createNGonWire(ngonOptions);\n });\n\n const ngons = await Promise.all(ngonPromises);\n\n // Form rotated extrusions on all of the points\n const rotatedExtrudeOptions = new RotationExtrudeDto();\n rotatedExtrudeOptions.angle = 270;\n rotatedExtrudeOptions.height = 30;\n const rotatedExtrusionPromises = ngons.map(ngon => {\n rotatedExtrudeOptions.shape = ngon;\n return operations.rotatedExtrude(rotatedExtrudeOptions);\n });\n\n const rotatedExtrusions = await Promise.all(rotatedExtrusionPromises);\n\n // Compounding multiple shapes will generally deliver much better rendering performance\n // as it will form a single mesh for all of the geometries involved in compound\n const compoundOptions = new CompoundShapesDto(rotatedExtrusions);\n const ngonCompound = await compound.makeCompound(compoundOptions);\n\n // As a last step we draw the ngon with default occt settings (defualt because we omit specifying options property)\n bitbybit.draw.drawAnyAsync({ entity: ngonCompound });\n\n}\n\n// Let's not forget to execute the start function, otherwise nothing will happen.\nstart();","version":"0.20.7","type":"typescript"}}
title="Extrude the wire into shell kind of shape"
/>
diff --git a/docs/learn/code/common/occt/operations/simple-loft.md b/docs/learn/code/common/occt/operations/simple-loft.md
index 88c664d7..e5feabbd 100644
--- a/docs/learn/code/common/occt/operations/simple-loft.md
+++ b/docs/learn/code/common/occt/operations/simple-loft.md
@@ -37,21 +37,21 @@ In this tutorial, we'll walk through the process of creating a simple lofted sha
ellipse1ellipse2ellipse3ellipsesloftellipse100001048ellipse203001014ellipse307001026ellipsesellipse1ellipse2ellipse3loftellipsesFALSEloft0.001TRUE#6600ccTRUE#ffffff2","version":"0.20.6","type":"blockly"}}
+ script={{"script":"ellipse1ellipse2ellipse3ellipsesloftellipse100001048ellipse203001014ellipse307001026ellipsesellipse1ellipse2ellipse3loftellipsesFALSEloft0.001TRUE#6600ccTRUE#ffffff2","version":"0.20.7","type":"blockly"}}
title="Simple Loft Operation"
/>
{\n\n // Create an instance of EllipseDto to define the properties of the first ellipse.\n const ellipseOpt = new EllipseDto();\n // Set the minor radius of the ellipse.\n ellipseOpt.radiusMinor = 4;\n // Set the major radius of the ellipse.\n ellipseOpt.radiusMajor = 8;\n // Create the first elliptical wire. The center defaults to [0,0,0] and direction to [0,1,0] if not specified.\n // 'await' is used because shape creation is an asynchronous operation.\n const ellipse1 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the second ellipse.\n // Set the center of the second ellipse.\n ellipseOpt.center = [0, 3, 0];\n // Set the minor radius for the second ellipse.\n ellipseOpt.radiusMinor = 1;\n // Set the major radius for the second ellipse.\n ellipseOpt.radiusMajor = 4;\n // Create the second elliptical wire with the updated options.\n const ellipse2 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the third ellipse.\n // Set the center of the third ellipse.\n ellipseOpt.center = [0, 7, 0];\n // Set the minor radius for the third ellipse.\n ellipseOpt.radiusMinor = 2;\n // Set the major radius for the third ellipse.\n ellipseOpt.radiusMajor = 6;\n // Create the third elliptical wire with the updated options.\n const ellipse3 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Create an instance of LoftDto to define the parameters for the loft operation.\n // The generic type TopoDSShapePointer indicates the type of shapes to be lofted.\n const loftOpt = new LoftDto();\n // Assign an array of the created ellipse wires to the 'shapes' property of loftOpt.\n // These are the profiles that will be connected by the loft.\n loftOpt.shapes = [ellipse1, ellipse2, ellipse3];\n // Perform the loft operation using the defined options.\n // This will create a surface (or shell) connecting the three ellipses.\n // 'makeSolid' defaults to false, creating a shell.\n const loft = await operations.loft(loftOpt);\n\n // Create an instance of DrawOcctShapeSimpleOptions to define how the lofted shape will be displayed.\n const drawOpt = new DrawOcctShapeSimpleOptions();\n // Set the precision for drawing the shape. This affects the tessellation quality.\n drawOpt.precision = 0.001;\n // Set the color of the faces of the lofted shape.\n drawOpt.faceColour = \"#ff00ff\"; // Magenta\n // Draw the lofted shape asynchronously using the specified entity and drawing options.\n draw.drawAnyAsync({ entity: loft, options: drawOpt });\n\n}\n\n// Call the start function to execute the script.\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"// Import necessary modules from the bitbybit library.\n// 'operations' and 'shapes' are for OpenCascade Technology (OCCT) functionalities like lofting and creating wires.\nconst { operations, shapes } = bitbybit.occt;\n// 'draw' module is used for rendering shapes on the canvas.\nconst { draw } = bitbybit;\n// Import Data Transfer Objects (DTOs) for defining OCCT inputs.\n// 'EllipseDto' for creating ellipses, 'LoftDto' for loft operation parameters.\nconst { EllipseDto, LoftDto } = Bit.Inputs.OCCT;\n// Import DTO for drawing options.\nconst { DrawOcctShapeSimpleOptions } = Bit.Inputs.Draw;\n// Define a type alias for OCCT shape pointers for better readability.\ntype TopoDSShapePointer = Bit.Inputs.OCCT.TopoDSShapePointer;\n\n// Define an asynchronous function 'start' which will contain the main logic.\nconst start = async () => {\n\n // Create an instance of EllipseDto to define the properties of the first ellipse.\n const ellipseOpt = new EllipseDto();\n // Set the minor radius of the ellipse.\n ellipseOpt.radiusMinor = 4;\n // Set the major radius of the ellipse.\n ellipseOpt.radiusMajor = 8;\n // Create the first elliptical wire. The center defaults to [0,0,0] and direction to [0,1,0] if not specified.\n // 'await' is used because shape creation is an asynchronous operation.\n const ellipse1 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the second ellipse.\n // Set the center of the second ellipse.\n ellipseOpt.center = [0, 3, 0];\n // Set the minor radius for the second ellipse.\n ellipseOpt.radiusMinor = 1;\n // Set the major radius for the second ellipse.\n ellipseOpt.radiusMajor = 4;\n // Create the second elliptical wire with the updated options.\n const ellipse2 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Modify the ellipseOpt for the third ellipse.\n // Set the center of the third ellipse.\n ellipseOpt.center = [0, 7, 0];\n // Set the minor radius for the third ellipse.\n ellipseOpt.radiusMinor = 2;\n // Set the major radius for the third ellipse.\n ellipseOpt.radiusMajor = 6;\n // Create the third elliptical wire with the updated options.\n const ellipse3 = await shapes.wire.createEllipseWire(ellipseOpt);\n\n // Create an instance of LoftDto to define the parameters for the loft operation.\n // The generic type TopoDSShapePointer indicates the type of shapes to be lofted.\n const loftOpt = new LoftDto();\n // Assign an array of the created ellipse wires to the 'shapes' property of loftOpt.\n // These are the profiles that will be connected by the loft.\n loftOpt.shapes = [ellipse1, ellipse2, ellipse3];\n // Perform the loft operation using the defined options.\n // This will create a surface (or shell) connecting the three ellipses.\n // 'makeSolid' defaults to false, creating a shell.\n const loft = await operations.loft(loftOpt);\n\n // Create an instance of DrawOcctShapeSimpleOptions to define how the lofted shape will be displayed.\n const drawOpt = new DrawOcctShapeSimpleOptions();\n // Set the precision for drawing the shape. This affects the tessellation quality.\n drawOpt.precision = 0.001;\n // Set the color of the faces of the lofted shape.\n drawOpt.faceColour = \"#ff00ff\"; // Magenta\n // Draw the lofted shape asynchronously using the specified entity and drawing options.\n draw.drawAnyAsync({ entity: loft, options: drawOpt });\n\n}\n\n// Call the start function to execute the script.\nstart();","version":"0.20.7","type":"typescript"}}
title="Simple Loft Operation"
/>
diff --git a/docs/learn/code/common/occt/operations/thick-solids.md b/docs/learn/code/common/occt/operations/thick-solids.md
new file mode 100644
index 00000000..be797edf
--- /dev/null
+++ b/docs/learn/code/common/occt/operations/thick-solids.md
@@ -0,0 +1,115 @@
+---
+sidebar_position: 3
+title: Thick Solids from Complex Faces
+sidebar_label: Thick Solids
+description: Learn how to create thick solids from complex lofted surfaces using OCCT operations - from curved wire interpolation to volumetric solid creation.
+tags: [code, occt, rete, blockly, typescript]
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import BitByBitRenderCanvas from '@site/src/components/BitByBitRenderCanvas';
+
+
+
+# Thick Solids from Complex Faces
+
+Thick solids are powerful 3D modeling features that create volumetric objects by adding thickness to planar or curved faces. While simple circular or rectangular faces are common starting points, thick solids truly shine when working with complex, curved surfaces created through advanced operations like lofting.
+
+## Understanding Thick Solids
+
+A thick solid operation takes a face (planar or curved) and extrudes it in the direction of its surface normal(s) to create a solid with the specified thickness. This operation is particularly useful for:
+
+- **Shell structures**: Creating hollow objects with consistent wall thickness
+- **Architectural elements**: Building walls, roofs, and structural components
+- **Mechanical parts**: Designing brackets, housings, and enclosures
+- **Organic shapes**: Creating complex curved objects with controlled thickness
+
+## Complex Face Creation Through Lofting
+
+To demonstrate the versatility of thick solids, we'll create a complex curved face using the **loft operation**. Lofting creates a smooth surface between multiple cross-sectional curves, allowing us to build sophisticated organic shapes.
+
+### The Process
+
+1. **Create Multiple Curved Cross-Sections**: Use interpolation algorithms to create smooth curves through defined points
+2. **Loft Between Curves**: Generate a complex surface that smoothly transitions between the cross-sections
+3. **Apply Thick Solid**: Add uniform thickness to create a 3D solid
+
+### Convex vs Concave Considerations
+
+Thick solid operations work on both:
+- **Convex faces**: Outward-curving surfaces (like the outside of a sphere)
+- **Concave faces**: Inward-curving surfaces (like the inside of a bowl)
+
+The algorithm automatically determines the correct direction for thickness application based on the face normals.
+
+## Practical Applications
+
+This technique is invaluable for:
+- **Product Design**: Creating ergonomic handles, grips, and curved components
+- **Architecture**: Designing complex roof structures and curved walls
+- **Art and Sculpture**: Building organic, flowing forms
+- **Engineering**: Developing aerodynamic shapes and fluid-flow components
+
+## Interactive Examples
+
+The following examples demonstrate creating thick solids from complex lofted surfaces, showing how sophisticated 3D geometry can emerge from simple point-based definitions.
+
+
+
+
+
+
+ bottomPointsmiddlePointstopPointsbottomWiremiddleWiretopWirewireListloftSurfacethickSolidtranslatedSolidthicknessoffsetVectorsurfaceOptionssolidOptionsbottomPoints-30-2-10000110030-2middlePoints-22-1-0.521.50220.521.522-1topPoints-1.540-0.540.50410.540.51.540bottomWirebottomPointsFALSE0.1middleWiremiddlePointsFALSE0.1topWiretopPointsFALSE0.1wireListbottomWiremiddleWiretopWireloftSurfacewireListFALSEthickness0.1thickSolidloftSurfacethicknessoffsetVector003translatedSolidthickSolidoffsetVectorsurfaceOptions0.01TRUE#00ff00TRUE#ffffff2solidOptions0.01TRUE#ff6600TRUE#ffffff2loftSurfacesurfaceOptionstranslatedSolidsolidOptions","version":"0.20.7","type":"blockly"}}
+ title="Thick Solid from Lofted Surface (Blockly)"
+ />
+
+
+ {\n\n // Define points for bottom curve (wave-like pattern)\n const bottomPoints = [\n [-3, 0, -2],\n [-1, 0, 0],\n [0, 0, 1],\n [1, 0, 0],\n [3, 0, -2]\n ] as Point3[];\n\n // Define points for middle curve (elevated and more curved)\n const middlePoints = [\n [-2, 2, -1],\n [-0.5, 2, 1.5],\n [0, 2, 2],\n [0.5, 2, 1.5],\n [2, 2, -1]\n ] as Point3[];\n\n // Define points for top curve (simpler, less curved)\n const topPoints = [\n [-1.5, 4, 0],\n [-0.5, 4, 0.5],\n [0, 4, 1],\n [0.5, 4, 0.5],\n [1.5, 4, 0]\n ] as Point3[];\n\n // Create interpolated wires from points\n const bottomWireOpt = new InterpolationDto();\n bottomWireOpt.points = bottomPoints;\n bottomWireOpt.periodic = false;\n bottomWireOpt.tolerance = 0.1;\n const bottomWire = await wire.interpolatePoints(bottomWireOpt);\n\n const middleWireOpt = new InterpolationDto();\n middleWireOpt.points = middlePoints;\n middleWireOpt.periodic = false;\n middleWireOpt.tolerance = 0.1;\n const middleWire = await wire.interpolatePoints(middleWireOpt);\n\n const topWireOpt = new InterpolationDto();\n topWireOpt.points = topPoints;\n topWireOpt.periodic = false;\n topWireOpt.tolerance = 0.1;\n const topWire = await wire.interpolatePoints(topWireOpt);\n\n // Create lofted surface from the three wires\n const loftOpt = new LoftDto();\n loftOpt.shapes = [bottomWire, middleWire, topWire];\n loftOpt.makeSolid = false;\n const loftSurface = await operations.loft(loftOpt);\n\n // Create thick solid from the lofted surface\n const thickness = 0.1;\n const thickSolidOpt = new ThisckSolidSimpleDto();\n thickSolidOpt.shape = loftSurface;\n thickSolidOpt.offset = thickness;\n const thickSolid = await operations.makeThickSolidSimple(thickSolidOpt);\n\n // Translate the thick solid for better visualization\n const offsetVector = [0, 0, 3] as Vector3;\n const translateOpt = new TranslateDto();\n translateOpt.shape = thickSolid;\n translateOpt.translation = offsetVector;\n const translatedSolid = await transforms.translate(translateOpt);\n\n // Create drawing options for the original surface (green)\n const surfaceOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n surfaceOptions.precision = 0.01;\n surfaceOptions.drawFaces = true;\n surfaceOptions.faceColour = \"#00ff00\";\n surfaceOptions.drawEdges = true;\n surfaceOptions.edgeColour = \"#ffffff\";\n surfaceOptions.edgeWidth = 2;\n\n // Create drawing options for the thick solid (orange)\n const solidOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n solidOptions.precision = 0.01;\n solidOptions.drawFaces = true;\n solidOptions.faceColour = \"#ff6600\";\n solidOptions.drawEdges = true;\n solidOptions.edgeColour = \"#ffffff\";\n solidOptions.edgeWidth = 2;\n\n // Draw both the original lofted surface and the thick solid\n bitbybit.draw.drawAnyAsync({ entity: loftSurface, options: surfaceOptions });\n bitbybit.draw.drawAnyAsync({ entity: translatedSolid, options: solidOptions });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
+ title="Thick Solid from Lofted Surface"
+ />
+
+
+
+## Key Learning Points
+
+### Design Considerations
+
+When working with thick solids from complex faces:
+
+1. **Surface Continuity**: Ensure your lofted surface has smooth transitions to avoid artifacts in the thick solid
+2. **Thickness Distribution**: The algorithm maintains consistent thickness perpendicular to the surface
+3. **Self-Intersections**: Complex shapes may create self-intersecting geometry; consider your design carefully
+4. **Normal Direction**: The thickness direction is determined automatically by face normals
+
+### Advanced Techniques
+
+- **Multi-Surface Lofting**: Create even more complex shapes by lofting between numerous cross-sections
+- **Hybrid Operations**: Combine with other OCCT operations like fillets, chamfers, or boolean operations
+
+### Performance Tips
+
+- **Point Density**: Balance curve smoothness with computational efficiency
+- **Surface Complexity**: More complex lofted surfaces require more processing time
+- **Memory Usage**: Large thick solids can consume significant memory resources
+
+## Summary
+
+Thick solids from complex lofted faces represent one of the most powerful techniques in 3D modeling. By combining:
+- **Interpolated curves** for smooth cross-sections
+- **Loft operations** for complex surface generation
+- **Thick solid operations** for volumetric creation
+
+You can create sophisticated 3D geometry that would be difficult or impossible to achieve through simple primitive operations. This approach bridges the gap between mathematical precision and organic design freedom.
diff --git a/docs/learn/code/common/occt/operations/wire-offset-multiple.md b/docs/learn/code/common/occt/operations/wire-offset-multiple.md
new file mode 100644
index 00000000..d39f0972
--- /dev/null
+++ b/docs/learn/code/common/occt/operations/wire-offset-multiple.md
@@ -0,0 +1,62 @@
+---
+sidebar_position: 4
+title: Multiple Wire Offsets
+sidebar_label: Wire Offset Multiple
+description: Learn how to create multiple parallel offsets from a single open wire using OCCT operations for various design and manufacturing applications.
+tags: [code, occt, rete, blockly, typescript]
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import BitByBitRenderCanvas from '@site/src/components/BitByBitRenderCanvas';
+
+
+
+# Multiple Wire Offsets
+
+Multiple wire offsetting creates a series of parallel curves at specified distances from an original open wire. This technique generates multiple paths that maintain the same general shape as the original while being displaced perpendicular to the wire direction. The operation is useful for various applications including toolpath generation, pattern creation, and design iterations where you need parallel geometric elements.
+
+The process involves creating an initial open wire through point interpolation, then systematically generating offset curves at incrementally increasing distances. Each offset curve preserves the original wire's character while providing controlled spacing for your specific application needs.
+
+## Interactive Example
+
+The following example demonstrates creating multiple offset curves from a single interpolated wire, showing how a simple reference path can generate a family of parallel curves.
+
+
+
+
+
+
+
+
+controlPointsbaseWirestepoverDistanceoffset1offset2offset3baseStyleoffset1Styleoffset2Styleoffset3StylecontrolPoints-40-2-202001203400stepoverDistance0.5baseWirecontrolPointsFALSE0.01offset1baseWirestepoverDistance0.01offset2baseWireMULTIPLYstepoverDistance20.01offset3baseWireMULTIPLYstepoverDistance30.01baseStyle0.01FALSETRUE#00ff004offset1Style0.01FALSETRUE#ff99003offset2Style0.01FALSETRUE#ff66003offset3Style0.01FALSETRUE#ff33003baseWirebaseStyleoffset1offset1Styleoffset2offset2Styleoffset3offset3Style","version":"0.20.7","type":"blockly"}}
+ title="Multiple Wire Offsets"
+ />
+
+
+
+ {\n\n // Define the stepover distance for CNC toolpaths\n const stepoverDistance = 0.5;\n\n // Step 1: Define control points for the base toolpath\n const points = [\n [-4, 0, -2],\n [-2, 0, 2],\n [0, 0, 1],\n [2, 0, 3],\n [4, 0, 0]\n ] as Point3[];\n\n // Step 2: Create base wire through interpolation\n const interpolationOpt = new InterpolationDto();\n interpolationOpt.points = points;\n interpolationOpt.periodic = false;\n interpolationOpt.tolerance = 0.01;\n \n const baseWire = await wire.interpolatePoints(interpolationOpt);\n\n // Step 3: Create multiple offset toolpaths\n // First offset\n const offset1Opt = new OffsetDto();\n offset1Opt.shape = baseWire;\n offset1Opt.distance = stepoverDistance;\n offset1Opt.tolerance = 0.01;\n \n const offset1 = await operations.offset(offset1Opt);\n\n // Second offset\n const offset2Opt = new OffsetDto();\n offset2Opt.shape = baseWire;\n offset2Opt.distance = stepoverDistance * 2;\n offset2Opt.tolerance = 0.01;\n \n const offset2 = await operations.offset(offset2Opt);\n\n // Third offset\n const offset3Opt = new OffsetDto();\n offset3Opt.shape = baseWire;\n offset3Opt.distance = stepoverDistance * 3;\n offset3Opt.tolerance = 0.01;\n \n const offset3 = await operations.offset(offset3Opt);\n\n // Step 4: Visualize all toolpaths with different colors\n // Base wire (green - reference path)\n const baseOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n baseOptions.edgeWidth = 4;\n baseOptions.edgeColour = \"#00ff00\"; // Green\n baseOptions.drawFaces = false;\n \n // Offset 1 (orange)\n const offset1Options = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n offset1Options.edgeWidth = 3;\n offset1Options.edgeColour = \"#ff9900\"; // Orange\n offset1Options.drawFaces = false;\n \n // Offset 2 (red-orange)\n const offset2Options = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n offset2Options.edgeWidth = 3;\n offset2Options.edgeColour = \"#ff6600\"; // Red-orange\n offset2Options.drawFaces = false;\n \n // Offset 3 (red)\n const offset3Options = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n offset3Options.edgeWidth = 3;\n offset3Options.edgeColour = \"#ff3300\"; // Red\n offset3Options.drawFaces = false;\n \n // Draw all toolpaths\n bitbybit.draw.drawAnyAsync({ entity: baseWire, options: baseOptions });\n bitbybit.draw.drawAnyAsync({ entity: offset1, options: offset1Options });\n bitbybit.draw.drawAnyAsync({ entity: offset2, options: offset2Options });\n bitbybit.draw.drawAnyAsync({ entity: offset3, options: offset3Options });\n\n}\n\nstart();","version":"0.20.7","type":"typescript"}}
+ title="Multiple Wire Offsets"
+ />
+
+
+
+## Understanding the Workflow
+
+The multiple wire offset workflow demonstrates a practical approach to generating parallel curves. You start by defining control points that establish the desired path geometry, then create a smooth interpolated wire that serves as your reference curve. Each offset operation takes this base wire and creates a new curve at a specified distance, with the distance typically calculated as multiples of a base offset value.
+
+The stepover distance parameter controls the spacing between parallel curves and can be adjusted based on your specific requirements. In the example, we use multiples of 0.5 units to create three additional curves, each progressively further from the original. The visualization uses different colors to clearly distinguish between the base curve and its offsets, making it easy to understand the relationship between all generated elements.
+
+This technique provides a foundation for various applications where parallel geometric elements are needed, from manufacturing processes to architectural design patterns. The consistent spacing and predictable geometric relationships make it particularly valuable for systematic design approaches where precision and repeatability are important.
diff --git a/docs/learn/code/common/occt/shapes/edge/edge-indexes.mdx b/docs/learn/code/common/occt/shapes/edge/edge-indexes.mdx
index 1ae32618..e39c5a46 100644
--- a/docs/learn/code/common/occt/shapes/edge/edge-indexes.mdx
+++ b/docs/learn/code/common/occt/shapes/edge/edge-indexes.mdx
@@ -42,21 +42,21 @@ Below are examples in TypeScript, Blockly, and Rete that demonstrate creating a
**TypeScript Example: Drawing Edge Indexes**
{\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const drawOpt = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOpt.drawEdgeIndexes = true;\n drawOpt.faceOpacity = 0.3;\n drawOpt.edgeOpacity = 0.3;\n drawOpt.edgeIndexHeight = 0.24\n\n bitbybit.draw.drawAnyAsync({\n entity: box,\n options: drawOpt\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const boxOpt = new Bit.Inputs.OCCT.BoxDto();\n boxOpt.width = 5;\n boxOpt.length = 8;\n boxOpt.height = 10;\n const box = await bitbybit.occt.shapes.solid.createBox(boxOpt);\n\n const drawOpt = new Bit.Inputs.Draw.DrawOcctShapeOptions();\n drawOpt.drawEdgeIndexes = true;\n drawOpt.faceOpacity = 0.3;\n drawOpt.edgeOpacity = 0.3;\n drawOpt.edgeIndexHeight = 0.24\n\n bitbybit.draw.drawAnyAsync({\n entity: box,\n options: drawOpt\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Edge Indexing"
/>
**Blockly Example: Drawing Edge Indexes**
58100000.30.3#ffffff#ff00002TRUETRUE0.01TRUE0.24#ff00ffFALSE0.06#0000ff","version":"0.20.6","type":"blockly"}}
+ script={{"script":"58100000.30.3#ffffff#ff00002TRUETRUE0.01TRUE0.24#ff00ffFALSE0.06#0000ff","version":"0.20.7","type":"blockly"}}
title="Edge Indexing"
/>
**Rete Example: Drawing Edge Indexes**
diff --git a/docs/learn/getting-started/basics/assets/local/gltf.mdx b/docs/learn/getting-started/basics/assets/local/gltf.mdx
index 0ed278bc..26703fbf 100644
--- a/docs/learn/getting-started/basics/assets/local/gltf.mdx
+++ b/docs/learn/getting-started/basics/assets/local/gltf.mdx
@@ -59,7 +59,7 @@ Your Rete graph should now look similar to the setup in the embedded editor belo
**Rete Editor Example:**
@@ -101,7 +101,7 @@ After assembling the blocks, click "Run". You should see the BoomBox model.
**Blockly Editor Example:**
TRUEBoomBoxFALSE","version":"0.20.6","type":"blockly"}}
+ script={{"script":"TRUEBoomBoxFALSE","version":"0.20.7","type":"blockly"}}
title="Bitbybit Blockly Editor - Using Local glTF Asset"
description="Upload local asset from tutorial named accordingly and it will appear in 3D scene after you hit run."
/>
@@ -126,7 +126,7 @@ Here's the example code, which should be fairly self-explanatory for those famil
**TypeScript Editor Example:**
{\n bitbybit.babylon.scene.useRightHandedSystem({\n use: true,\n });\n const file = await bitbybit.asset.getLocalFile({\n fileName: \"BoomBox\"\n }) as File;\n await bitbybit.babylon.io.loadAssetIntoScene({\n assetFile: file,\n hidden: false\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n bitbybit.babylon.scene.useRightHandedSystem({\n use: true,\n });\n const file = await bitbybit.asset.getLocalFile({\n fileName: \"BoomBox\"\n }) as File;\n await bitbybit.babylon.io.loadAssetIntoScene({\n assetFile: file,\n hidden: false\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Bitbybit Blockly Editor - Using Local glTF Asset"
description="Upload local asset from tutorial named accordingly and it will appear in 3D scene after you hit run."
/>
diff --git a/docs/learn/getting-started/basics/assets/local/step.mdx b/docs/learn/getting-started/basics/assets/local/step.mdx
index d67fc086..09114a6a 100644
--- a/docs/learn/getting-started/basics/assets/local/step.mdx
+++ b/docs/learn/getting-started/basics/assets/local/step.mdx
@@ -54,7 +54,7 @@ That's it! Your Rete graph should be set up. It might take a moment for the Kuka
**Rete Editor Example:**
@@ -95,7 +95,7 @@ After assembling the blocks, click "Run".
**Blockly Editor Example:**
KukaRobotTRUE","version":"0.20.6","type":"blockly"}}
+ script={{"script":"KukaRobotTRUE","version":"0.20.7","type":"blockly"}}
title="Bitbybit Blockly Editor - Using Local STEP Asset"
description="Upload local asset from tutorial named accordingly and it will appear in 3D scene after you hit run."
/>
@@ -122,7 +122,7 @@ Here's an example of how to do that:
**TypeScript Editor Example:**
{\n\n const file = await bitbybit.asset.getLocalFile({\n fileName: \"KukaRobot\"\n }) as File;\n\n const shape = await bitbybit.occt.io.loadSTEPorIGES({\n assetFile: file,\n adjustZtoY: true,\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: shape\n })\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n\n const file = await bitbybit.asset.getLocalFile({\n fileName: \"KukaRobot\"\n }) as File;\n\n const shape = await bitbybit.occt.io.loadSTEPorIGES({\n assetFile: file,\n adjustZtoY: true,\n });\n\n bitbybit.draw.drawAnyAsync({\n entity: shape\n })\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Bitbybit TypeScript Editor - Using Local STEP Asset"
description="Upload local asset from tutorial named accordingly and it will appear in 3D scene after you hit run."
/>
diff --git a/docs/learn/getting-started/blockly/hello-world.mdx b/docs/learn/getting-started/blockly/hello-world.mdx
index d196e77d..d92465a4 100644
--- a/docs/learn/getting-started/blockly/hello-world.mdx
+++ b/docs/learn/getting-started/blockly/hello-world.mdx
@@ -56,7 +56,7 @@ Your setup should resemble this interactive example:
Hello World!'Aboreto''Regular'1.50.20000010'leftTop'","version":"0.20.6","type":"blockly"}}
+ script={{"script":"Hello World!'Aboreto''Regular'1.50.20000010'leftTop'","version":"0.20.7","type":"blockly"}}
title="Draw 3D Text"
description="Draws the text on the screen."
/>
@@ -88,7 +88,7 @@ After completing these steps, your Blockly script should look similar to this:
40040010100.450.50.5FALSE#ffffff#ffffffHello World!'Roboto''Regular'1.50.2-9000000-1'centerBottom'","version":"0.20.6","type":"blockly"}}
+ script={{"script":"40040010100.450.50.5FALSE#ffffff#ffffffHello World!'Roboto''Regular'1.50.2-9000000-1'centerBottom'","version":"0.20.7","type":"blockly"}}
title="Draw 3D text and grid"
description="Draws 3D text and the grid on the screen. Text is placed in better orientation."
/>
diff --git a/docs/learn/getting-started/blockly/parametric-cube.mdx b/docs/learn/getting-started/blockly/parametric-cube.mdx
index 7638ced0..3d53a204 100644
--- a/docs/learn/getting-started/blockly/parametric-cube.mdx
+++ b/docs/learn/getting-started/blockly/parametric-cube.mdx
@@ -69,7 +69,7 @@ Your Blockly workspace should now look something like this interactive example:
sizesize3size000","version":"0.20.6","type":"blockly"}}
+ script={{"script":"sizesize3size000","version":"0.20.7","type":"blockly"}}
title="Parametric cube example"
description="Draws the parametrically controlled cube."
/>
diff --git a/docs/learn/getting-started/rete/hello-world.mdx b/docs/learn/getting-started/rete/hello-world.mdx
index 7e2c8433..20e72293 100644
--- a/docs/learn/getting-started/rete/hello-world.mdx
+++ b/docs/learn/getting-started/rete/hello-world.mdx
@@ -41,7 +41,7 @@ If you've done it correctly, your canvas should have the "Draw Grid Mesh" compon
@@ -79,7 +79,7 @@ The setup should resemble this:
@@ -109,7 +109,7 @@ Here's the final result you should aim for:
diff --git a/docs/learn/getting-started/rete/parametric-cube.mdx b/docs/learn/getting-started/rete/parametric-cube.mdx
index ba6584b9..19cbf1a2 100644
--- a/docs/learn/getting-started/rete/parametric-cube.mdx
+++ b/docs/learn/getting-started/rete/parametric-cube.mdx
@@ -44,7 +44,7 @@ We'll use the OpenCascade Technology (OCCT) geometry kernel to create our cube.
@@ -69,7 +69,7 @@ If you've connected them correctly, your setup should resemble the following int
diff --git a/docs/learn/getting-started/typescript/hello-world.mdx b/docs/learn/getting-started/typescript/hello-world.mdx
index d63679a9..f08b0f73 100644
--- a/docs/learn/getting-started/typescript/hello-world.mdx
+++ b/docs/learn/getting-started/typescript/hello-world.mdx
@@ -26,7 +26,7 @@ Check out the script below:
{\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Draw the grid"
description="Draws the grid mesh with lines in 3D space."
/>
@@ -51,7 +51,7 @@ The script below shows a working example. We've set the `rotation` to -90 degree
{\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n\n const textOpt = new Bit.Advanced.Text3D.Text3DDto();\n textOpt.text = \"Hello World!\";\n textOpt.rotation = -90;\n textOpt.originAlignment = Bit.Advanced.Text3D.recAlignmentEnum.centerBottom;\n textOpt.direction = [0, 0, -1];\n const text3D = await bitbybit.advanced.text3d.create(textOpt);\n\n bitbybit.draw.drawAnyAsync({\n entity: text3D\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n const gridOptions = new Bit.Inputs.Draw.SceneDrawGridMeshDto();\n bitbybit.draw.drawGridMesh(gridOptions);\n\n const textOpt = new Bit.Advanced.Text3D.Text3DDto();\n textOpt.text = \"Hello World!\";\n textOpt.rotation = -90;\n textOpt.originAlignment = Bit.Advanced.Text3D.recAlignmentEnum.centerBottom;\n textOpt.direction = [0, 0, -1];\n const text3D = await bitbybit.advanced.text3d.create(textOpt);\n\n bitbybit.draw.drawAnyAsync({\n entity: text3D\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Draw the text & grid"
description="Draws the grid mesh with text in 3D space."
/>
diff --git a/docs/learn/getting-started/typescript/how-to-code-in-monaco.md b/docs/learn/getting-started/typescript/how-to-code-in-monaco.md
index c6acf4bd..58d05e19 100644
--- a/docs/learn/getting-started/typescript/how-to-code-in-monaco.md
+++ b/docs/learn/getting-started/typescript/how-to-code-in-monaco.md
@@ -197,7 +197,7 @@ start();
{\n // Step 3a: Create input objects (DTOs) and set their properties for a cube\n const cubeOptions = new CubeDto(); // Instantiate the DTO\n cubeOptions.size = 6; // Set the cube's size\n // Call the bitbybit function to create the cube, awaiting its promise\n const cube: TopoDSShapePointer = await solid.createCube(cubeOptions);\n\n // Step 3b: Create input objects (DTOs) for a sphere\n const sphereOptions = new SphereDto();\n sphereOptions.radius = 3;\n sphereOptions.center = [3, 3, -3]; // Define center as [x, y, z] coordinates\n const sphere: TopoDSShapePointer = await solid.createSphere(sphereOptions);\n\n // Step 4: Perform geometric operations\n // Example: Boolean difference (subtract sphere from cube)\n const diffOptions = new DifferenceDto(); // Generic type for the shapes involved\n diffOptions.shape = cube; // The base shape\n diffOptions.shapes = [sphere]; // An array of shapes to subtract\n const diff: TopoDSShapePointer = await booleans.difference(diffOptions);\n\n // Example: Apply fillets (round edges) to the result of the difference\n const roundingOptions = new FilletDto();\n roundingOptions.shape = diff; // The shape to fillet\n roundingOptions.radius = 1; // The radius of the fillet\n // Note: Some operations might have specific methods like 'filletEdges' for common tasks\n const solidRoundedCorners: TopoDSShapePointer = await fillets.filletEdges(roundingOptions);\n\n // Step 5: Visualize the result in the 3D viewer\n // Prepare drawing options to customize appearance\n const occtDrawOptions = new DrawOcctShapeOptions();\n occtDrawOptions.faceColour = \"#0000ff\"; // Blue faces\n occtDrawOptions.edgeColour = \"#ff00ff\"; // Magenta edges\n occtDrawOptions.edgeWidth = 5; // Width of the edges\n occtDrawOptions.precision = 0.001; // Rendering precision for complex shapes (lower is finer)\n // Draw the final shape. 'drawAnyAsync' is a versatile function for drawing various entity types.\n draw.drawAnyAsync({ entity: solidRoundedCorners, options: occtDrawOptions });\n\n // Step 6: (Optional) Adjust scene elements like lighting for better visualization\n const dirLight = new DirectionalLightDto();\n dirLight.shadowGeneratorMapSize = 2000; // Higher values for better shadow quality\n dirLight.intensity = 3; // Light intensity\n scene.drawDirectionalLight(dirLight); // Adds or updates a directional light in the scene\n\n // Step 7: (Optional) Export your model to common CAD file formats\n // Export as STEP file (a common format for solid models)\n const stepExportOptions = new SaveStepDto();\n stepExportOptions.shape = solidRoundedCorners;\n stepExportOptions.adjustYtoZ = true; // Optional: Adjusts coordinate system (Y-up to Z-up) if needed\n stepExportOptions.fileName = \"cube_with_sphere_cutout.step\";\n stepExportOptions.tryDownload = true; // Attempts to trigger a browser download of the file\n await io.saveShapeSTEP(stepExportOptions); // Use the destructured 'io'\n\n // Export as STL file (a common format for 3D printing)\n const stlExportOptions = new SaveStlDto();\n stlExportOptions.shape = solidRoundedCorners;\n stlExportOptions.adjustYtoZ = true;\n stlExportOptions.fileName = \"cube_with_sphere_cutout.stl\";\n stlExportOptions.precision = 0.001; // Affects STL mesh quality (smaller values for finer mesh)\n stlExportOptions.tryDownload = true;\n await io.saveShapeStl(stlExportOptions); // Use the destructured 'io'\n};\n\n// Step 8: Call the start function to execute your script\nstart();","version":"0.20.6","type":"typescript"}}
+ script={{"script":"// Step 1: (Optional but Recommended) Destructure for convenience\n// This makes your code less verbose and easier to read.\nconst { solid } = bitbybit.occt.shapes;\nconst { booleans, fillets, io } = bitbybit.occt; // Added 'io' for export functions\nconst { draw } = bitbybit;\nconst { scene } = bitbybit.babylon;\n\n// Step 2: Import type definitions for input objects and shapes\n// This enables type checking and autocompletion.\ntype TopoDSShapePointer = Bit.Inputs.OCCT.TopoDSShapePointer; // Represents an OCCT shape\n\nconst { CubeDto, SphereDto, FilletDto, DifferenceDto, SaveStepDto, SaveStlDto } = Bit.Inputs.OCCT;\nconst DrawOcctShapeOptions = Bit.Inputs.Draw.DrawOcctShapeOptions;\nconst DirectionalLightDto = Bit.Inputs.BabylonScene.DirectionalLightDto;\n\n// Step 3: Define your main logic within an async function\nconst start = async () => {\n // Step 3a: Create input objects (DTOs) and set their properties for a cube\n const cubeOptions = new CubeDto(); // Instantiate the DTO\n cubeOptions.size = 6; // Set the cube's size\n // Call the bitbybit function to create the cube, awaiting its promise\n const cube: TopoDSShapePointer = await solid.createCube(cubeOptions);\n\n // Step 3b: Create input objects (DTOs) for a sphere\n const sphereOptions = new SphereDto();\n sphereOptions.radius = 3;\n sphereOptions.center = [3, 3, -3]; // Define center as [x, y, z] coordinates\n const sphere: TopoDSShapePointer = await solid.createSphere(sphereOptions);\n\n // Step 4: Perform geometric operations\n // Example: Boolean difference (subtract sphere from cube)\n const diffOptions = new DifferenceDto(); // Generic type for the shapes involved\n diffOptions.shape = cube; // The base shape\n diffOptions.shapes = [sphere]; // An array of shapes to subtract\n const diff: TopoDSShapePointer = await booleans.difference(diffOptions);\n\n // Example: Apply fillets (round edges) to the result of the difference\n const roundingOptions = new FilletDto();\n roundingOptions.shape = diff; // The shape to fillet\n roundingOptions.radius = 1; // The radius of the fillet\n // Note: Some operations might have specific methods like 'filletEdges' for common tasks\n const solidRoundedCorners: TopoDSShapePointer = await fillets.filletEdges(roundingOptions);\n\n // Step 5: Visualize the result in the 3D viewer\n // Prepare drawing options to customize appearance\n const occtDrawOptions = new DrawOcctShapeOptions();\n occtDrawOptions.faceColour = \"#0000ff\"; // Blue faces\n occtDrawOptions.edgeColour = \"#ff00ff\"; // Magenta edges\n occtDrawOptions.edgeWidth = 5; // Width of the edges\n occtDrawOptions.precision = 0.001; // Rendering precision for complex shapes (lower is finer)\n // Draw the final shape. 'drawAnyAsync' is a versatile function for drawing various entity types.\n draw.drawAnyAsync({ entity: solidRoundedCorners, options: occtDrawOptions });\n\n // Step 6: (Optional) Adjust scene elements like lighting for better visualization\n const dirLight = new DirectionalLightDto();\n dirLight.shadowGeneratorMapSize = 2000; // Higher values for better shadow quality\n dirLight.intensity = 3; // Light intensity\n scene.drawDirectionalLight(dirLight); // Adds or updates a directional light in the scene\n\n // Step 7: (Optional) Export your model to common CAD file formats\n // Export as STEP file (a common format for solid models)\n const stepExportOptions = new SaveStepDto();\n stepExportOptions.shape = solidRoundedCorners;\n stepExportOptions.adjustYtoZ = true; // Optional: Adjusts coordinate system (Y-up to Z-up) if needed\n stepExportOptions.fileName = \"cube_with_sphere_cutout.step\";\n stepExportOptions.tryDownload = true; // Attempts to trigger a browser download of the file\n await io.saveShapeSTEP(stepExportOptions); // Use the destructured 'io'\n\n // Export as STL file (a common format for 3D printing)\n const stlExportOptions = new SaveStlDto();\n stlExportOptions.shape = solidRoundedCorners;\n stlExportOptions.adjustYtoZ = true;\n stlExportOptions.fileName = \"cube_with_sphere_cutout.stl\";\n stlExportOptions.precision = 0.001; // Affects STL mesh quality (smaller values for finer mesh)\n stlExportOptions.tryDownload = true;\n await io.saveShapeStl(stlExportOptions); // Use the destructured 'io'\n};\n\n// Step 8: Call the start function to execute your script\nstart();","version":"0.20.7","type":"typescript"}}
title="Create And Download STEP & STL 3D Models"
description="Contains example code that can be executed directly inside the editor by clicking Run button."
/>
diff --git a/docs/learn/getting-started/typescript/parametric-cube.mdx b/docs/learn/getting-started/typescript/parametric-cube.mdx
index 5dcf4ec6..84de087e 100644
--- a/docs/learn/getting-started/typescript/parametric-cube.mdx
+++ b/docs/learn/getting-started/typescript/parametric-cube.mdx
@@ -35,7 +35,7 @@ The script shown in the editor below is fairly straightforward, but let's break
{\n const size = 10;\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = size;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n\n bitbybit.draw.drawAnyAsync({\n entity: cube\n });\n}\n\nstart();\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"const start = async () => {\n const size = 10;\n const cubeOptions = new Bit.Inputs.OCCT.CubeDto();\n cubeOptions.size = size;\n const cube = await bitbybit.occt.shapes.solid.createCube(cubeOptions);\n\n bitbybit.draw.drawAnyAsync({\n entity: cube\n });\n}\n\nstart();\n","version":"0.20.7","type":"typescript"}}
title="Draw the grid"
description="Draws the grid mesh with lines in 3D space."
/>
diff --git a/docs/learn/runners/intro-blockly.mdx b/docs/learn/runners/intro-blockly.mdx
index 6b72c1d6..46931d93 100644
--- a/docs/learn/runners/intro-blockly.mdx
+++ b/docs/learn/runners/intro-blockly.mdx
@@ -48,7 +48,7 @@ The following Bitbybit Blockly script is the visual program we'll be creating. T
sizecubeMeshsizesizesizesize1cubeMeshsize0000.40.005TRUE#000099TRUE#ffffff1cubeMeshcubeMesh","version":"0.20.6","type":"blockly"}}
+ script={{"script":"sizecubeMeshsizesizesizesize1cubeMeshsize0000.40.005TRUE#000099TRUE#ffffff1cubeMeshcubeMesh","version":"0.20.7","type":"blockly"}}
title="Bitbybit Blockly Editor - Simple Cube for Runner Tutorial"
description="Draws 3D Cube and controls its size via inputs coming from external executing program"
/>
@@ -68,7 +68,7 @@ Below are the `index.html` and `script.js` files you would use on StackBlitz or
-
+
diff --git a/docs/learn/runners/intro-rete.mdx b/docs/learn/runners/intro-rete.mdx
index 25f90094..39288234 100644
--- a/docs/learn/runners/intro-rete.mdx
+++ b/docs/learn/runners/intro-rete.mdx
@@ -51,7 +51,7 @@ The following Bitbybit Rete script is the visual program we'll be creating. The
diff --git a/docs/learn/runners/intro-typescript.mdx b/docs/learn/runners/intro-typescript.mdx
index 9066feda..e70d57ee 100644
--- a/docs/learn/runners/intro-typescript.mdx
+++ b/docs/learn/runners/intro-typescript.mdx
@@ -46,7 +46,7 @@ The following is the Bitbybit TypeScript script we'll be creating. The JavaScrip
{\n const cube = await occt.shapes.solid.createCube({\n size: inputs.size,\n center: [0, 0, 0],\n });\n const filletCube = await occt.fillets.filletEdges({\n shape: cube,\n radius: 0.4\n });\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#0000ff\";\n drawOptions.edgeWidth = 1;\n drawOptions.precision = 0.005;\n const cubeMesh = await bitbybit.draw.drawAnyAsync({\n entity: filletCube,\n options: drawOptions,\n });\n return { cubeMesh };\n}\n\nconst runnerOutput = start();\nBit.setBitbybitRunnerResult(runnerOutput);\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"type Inputs = {\n size: number;\n}\n\nBit.mockBitbybitRunnerInputs({ size: 1 });\nconst inputs: Inputs = Bit.getBitbybitRunnerInputs();\n\nconst { occt } = bitbybit;\n\nconst start = async () => {\n const cube = await occt.shapes.solid.createCube({\n size: inputs.size,\n center: [0, 0, 0],\n });\n const filletCube = await occt.fillets.filletEdges({\n shape: cube,\n radius: 0.4\n });\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#0000ff\";\n drawOptions.edgeWidth = 1;\n drawOptions.precision = 0.005;\n const cubeMesh = await bitbybit.draw.drawAnyAsync({\n entity: filletCube,\n options: drawOptions,\n });\n return { cubeMesh };\n}\n\nconst runnerOutput = start();\nBit.setBitbybitRunnerResult(runnerOutput);\n","version":"0.20.7","type":"typescript"}}
title="Bitbybit TypeScript Editor - Simple Cube for Runner Tutorial"
description="Draws 3D Cube and controls its size via inputs coming from external executing program"
/>
diff --git a/docs/learn/runners/intro.mdx b/docs/learn/runners/intro.mdx
index c2d0170c..887c3f97 100644
--- a/docs/learn/runners/intro.mdx
+++ b/docs/learn/runners/intro.mdx
@@ -587,8 +587,8 @@ function hideSpinner() {
diff --git a/docs/learn/runners/live-examples/configurable-cad-part.mdx b/docs/learn/runners/live-examples/configurable-cad-part.mdx
index 5f4a1ba2..aff97798 100644
--- a/docs/learn/runners/live-examples/configurable-cad-part.mdx
+++ b/docs/learn/runners/live-examples/configurable-cad-part.mdx
@@ -30,7 +30,7 @@ Below is an interactive preview of the Rete visual program. Notice how this scri
diff --git a/docs/learn/runners/table-configurator-blockly.mdx b/docs/learn/runners/table-configurator-blockly.mdx
index 5e371a57..e0ec77a5 100644
--- a/docs/learn/runners/table-configurator-blockly.mdx
+++ b/docs/learn/runners/table-configurator-blockly.mdx
@@ -46,7 +46,7 @@ The following Bitbybit Blockly script is the visual program that defines the log
widthlengthlegHeightheighthalfLegheightthicknesshalfThicknesswidthOffsetlengthOffsetlegShapecompoundShapetable'clearSky'10000.10.7-100-100-1003#ffffff#ffffff1024TRUE0legHeightMINUSheightthicknesshalfLegheightDIVIDElegHeight2halfThicknessDIVIDEthickness2widthOffsetMINUSDIVIDEwidth2halfThicknesslengthOffsetMINUSDIVIDElength2halfThicknesslegShapethicknessthicknesslegHeight000compoundShapewidthlengththickness0MINUSheighthalfThickness0legShapewidthOffsethalfLegheightlengthOffsetlegShapeNEGwidthOffsethalfLegheightlengthOffsetlegShapewidthOffsethalfLegheightNEGlengthOffsetlegShapeNEGwidthOffsethalfLegheightNEGlengthOffset2000010tablecompoundShape0.01TRUE#999999TRUE#ffffff1tabletablesetupParamsDescribe this function...widthwidthlengthlengthheightheightthicknessthicknesswidthwidth1lengthlength1heightheight0.5thicknessthickness0.05","version":"0.20.6","type":"blockly"}}
+ script={{"script":"widthlengthlegHeightheighthalfLegheightthicknesshalfThicknesswidthOffsetlengthOffsetlegShapecompoundShapetable'clearSky'10000.10.7-100-100-1003#ffffff#ffffff1024TRUE0legHeightMINUSheightthicknesshalfLegheightDIVIDElegHeight2halfThicknessDIVIDEthickness2widthOffsetMINUSDIVIDEwidth2halfThicknesslengthOffsetMINUSDIVIDElength2halfThicknesslegShapethicknessthicknesslegHeight000compoundShapewidthlengththickness0MINUSheighthalfThickness0legShapewidthOffsethalfLegheightlengthOffsetlegShapeNEGwidthOffsethalfLegheightlengthOffsetlegShapewidthOffsethalfLegheightNEGlengthOffsetlegShapeNEGwidthOffsethalfLegheightNEGlengthOffset2000010tablecompoundShape0.01TRUE#999999TRUE#ffffff1tabletablesetupParamsDescribe this function...widthwidthlengthlengthheightheightthicknessthicknesswidthwidth1lengthlength1heightheight0.5thicknessthickness0.05","version":"0.20.7","type":"blockly"}}
title="Bitbybit Blockly Editor - Simple Cube for Runner Tutorial"
description="Draws 3D Table and controls its size via inputs coming from external executing program"
/>
@@ -66,7 +66,7 @@ Below are the `index.html` and `script.js` files you would use on StackBlitz or
-
+
diff --git a/docs/learn/runners/table-configurator-rete.mdx b/docs/learn/runners/table-configurator-rete.mdx
index 0a643f4c..1f0dc346 100644
--- a/docs/learn/runners/table-configurator-rete.mdx
+++ b/docs/learn/runners/table-configurator-rete.mdx
@@ -46,7 +46,7 @@ The following Bitbybit Rete script is the visual program that defines the logic
diff --git a/docs/learn/runners/table-configurator-typescript.mdx b/docs/learn/runners/table-configurator-typescript.mdx
index 50a2f2b1..543c618e 100644
--- a/docs/learn/runners/table-configurator-typescript.mdx
+++ b/docs/learn/runners/table-configurator-typescript.mdx
@@ -51,7 +51,7 @@ The following Bitbybit TypeScript script is the program that defines the logic f
{\n\n const skyboxOptions = new Bit.Inputs.BabylonScene.SkyboxDto();\n skyboxOptions.skybox = Bit.Inputs.Base.skyboxEnum.clearSky;\n bitbybit.babylon.scene.enableSkybox(skyboxOptions);\n\n const lightOptions = new Bit.Inputs.BabylonScene.DirectionalLightDto();\n lightOptions.intensity = 3;\n bitbybit.babylon.scene.drawDirectionalLight(lightOptions);\n\n const tableTopShape = await solid.createBox({\n width: inputs.width,\n length: inputs.length,\n height: inputs.thickness,\n center: [0, inputs.height - halfThickness, 0],\n });\n\n const leg1Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [widthOffset, halfLegHeight, lengthOffset],\n });\n const leg2Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [-widthOffset, halfLegHeight, lengthOffset],\n });\n const leg3Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [widthOffset, halfLegHeight, -lengthOffset],\n });\n const leg4Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [-widthOffset, halfLegHeight, -lengthOffset],\n });\n\n const groundShape = await face.createCircleFace({\n radius: 2,\n center: [0, 0, 0],\n direction: [0, 1, 0]\n });\n\n const compoundShape = await compound.makeCompound({\n shapes: [tableTopShape, leg1Shape, leg2Shape, leg3Shape, leg4Shape, groundShape],\n });\n\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#555577\";\n drawOptions.edgeWidth = 1;\n const table = await bitbybit.draw.drawAnyAsync({ entity: compoundShape, options: drawOptions });\n return { table };\n}\n\nconst runnerOutput = start();\nBit.setBitbybitRunnerResult(runnerOutput);\n","version":"0.20.6","type":"typescript"}}
+ script={{"script":"type Inputs = {\n width: number;\n length: number;\n height: number;\n thickness: number;\n};\n\nconst defaultValues: Inputs = {\n width: 1,\n length: 1,\n height: 0.5,\n thickness: 0.05,\n};\n\nBit.mockBitbybitRunnerInputs(defaultValues);\nconst inputs: Inputs = Bit.getBitbybitRunnerInputs();\n\nconst { solid, compound, face } = bitbybit.occt.shapes;\n\nconst legHeight = inputs.height - inputs.thickness;\nconst halfLegHeight = legHeight / 2;\nconst halfThickness = inputs.thickness / 2;\nconst widthOffset = inputs.width / 2 - halfThickness;\nconst lengthOffset = inputs.length / 2 - halfThickness;\n\n\nconst start = async () => {\n\n const skyboxOptions = new Bit.Inputs.BabylonScene.SkyboxDto();\n skyboxOptions.skybox = Bit.Inputs.Base.skyboxEnum.clearSky;\n bitbybit.babylon.scene.enableSkybox(skyboxOptions);\n\n const lightOptions = new Bit.Inputs.BabylonScene.DirectionalLightDto();\n lightOptions.intensity = 3;\n bitbybit.babylon.scene.drawDirectionalLight(lightOptions);\n\n const tableTopShape = await solid.createBox({\n width: inputs.width,\n length: inputs.length,\n height: inputs.thickness,\n center: [0, inputs.height - halfThickness, 0],\n });\n\n const leg1Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [widthOffset, halfLegHeight, lengthOffset],\n });\n const leg2Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [-widthOffset, halfLegHeight, lengthOffset],\n });\n const leg3Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [widthOffset, halfLegHeight, -lengthOffset],\n });\n const leg4Shape = await solid.createBox({\n width: inputs.thickness,\n length: inputs.thickness,\n height: legHeight,\n center: [-widthOffset, halfLegHeight, -lengthOffset],\n });\n\n const groundShape = await face.createCircleFace({\n radius: 2,\n center: [0, 0, 0],\n direction: [0, 1, 0]\n });\n\n const compoundShape = await compound.makeCompound({\n shapes: [tableTopShape, leg1Shape, leg2Shape, leg3Shape, leg4Shape, groundShape],\n });\n\n const drawOptions = new Bit.Inputs.Draw.DrawOcctShapeSimpleOptions();\n drawOptions.faceColour = \"#555577\";\n drawOptions.edgeWidth = 1;\n const table = await bitbybit.draw.drawAnyAsync({ entity: compoundShape, options: drawOptions });\n return { table };\n}\n\nconst runnerOutput = start();\nBit.setBitbybitRunnerResult(runnerOutput);\n","version":"0.20.7","type":"typescript"}}
title="Bitbybit TypeScript Editor - 3D Table Configurator"
description="Draws 3D Table and controls its size via inputs coming from external executing program"
/>
diff --git a/examples/angular/babylonjs/laptop-holder/package-lock.json b/examples/angular/babylonjs/laptop-holder/package-lock.json
index 8cbf6be5..a43b0780 100644
--- a/examples/angular/babylonjs/laptop-holder/package-lock.json
+++ b/examples/angular/babylonjs/laptop-holder/package-lock.json
@@ -17,7 +17,7 @@
"@angular/platform-browser": "13.3.0",
"@angular/platform-browser-dynamic": "13.3.0",
"@angular/router": "13.3.0",
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"rxjs": "7.5.5",
"tslib": "2.3.1",
"zone.js": "0.11.5"
@@ -2331,15 +2331,15 @@
}
},
"node_modules/@babylonjs/core": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.26.2.tgz",
- "integrity": "sha512-wzAm6l/StYBIZQdXLrXKg8YmexeQCsLPWgC6K8ypitKnpjuztbEdaXhwvlpLyeE8ammF6ZsQlPzODMfawDwAHg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.29.1.tgz",
+ "integrity": "sha512-hZZjiR1FvfWN/Mg07Bo/pzLKfkGYMCMnPsq1ic5UngAvfeVcNmK70l18/2iQlBrC94uSrMeMtCVY6cPxHWKsgg==",
"license": "Apache-2.0"
},
"node_modules/@babylonjs/gui": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.26.2.tgz",
- "integrity": "sha512-hyT1lyFaYfQBdWdbyFj7H5xlhJOcTxXi8oOMGE3Qqg6Ib2RTiUBQZ+QHf1eNzy29WsW3KOQ4lrYVMm1p/cLVfg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.29.1.tgz",
+ "integrity": "sha512-z115xTfoNc8t2MkDkeTOg+Fk8FdNNMj/EtWYzXnjO2HS3cSixM/ZawA4MgEqhWOvEmODKBJKvFokxPLaPSRZiQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0"
@@ -2354,9 +2354,9 @@
}
},
"node_modules/@babylonjs/loaders": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.26.2.tgz",
- "integrity": "sha512-Me/bhbbeqGvuX4+UsIP3p4kmPCBrKB1iZJh1bYG5/bk8VQA0R4teOu5nQ/Y4lfYjdVtfDDm/UfeRPKPv3Pd0Kg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.29.1.tgz",
+ "integrity": "sha512-tBJv24VAdZW30BYxvwrMERDLHnxBjnC68NrMmb66B9Hs7sEl+e59nluEc2zpSSQVtdY8P8+c9F+LbqqliQLuwA==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -2364,18 +2364,18 @@
}
},
"node_modules/@babylonjs/materials": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.26.2.tgz",
- "integrity": "sha512-/fp8CxH+frcXaPHL7o2JlDvlHrmU0qKRVy6R+HejofVa8cvMMbZkUZJ9MTZdQZGCeEm58DfDbx4SrVDTZtRp5w==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.29.1.tgz",
+ "integrity": "sha512-bJZPDOfm1IWMMPEUTD416z8/dGpQ3mb0xF543cyEKNuZfiofpvxm6/3jF3SKf9PAVi5+hTgsRI9isCkoVehiYQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.6.0"
}
},
"node_modules/@babylonjs/serializers": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.26.2.tgz",
- "integrity": "sha512-qAyb58bJALeQxomgCBFUky9OPgCKavzUtWgYw5AoKioMkFXKZEvWPvEmAlqCU9ZJfJUsaA4l2EvR3SX8+0I7yQ==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.29.1.tgz",
+ "integrity": "sha512-t7aNW5rh3LXBGeD8KfeEG0s5mzOsqgWHJ+VXQtb9lPkpnSeNj2nl7yY2QuRUuapNITJhvlee2J61CRIdyWNPfg==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -2383,49 +2383,49 @@
}
},
"node_modules/@bitbybit-dev/babylonjs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.6.tgz",
- "integrity": "sha512-npnhjj3JiAyKgtS5fnuSxnKBPIjIkkWCcIP+6NfFyO1yFk8s68bm1LTkYgBnhCIS51tXIFwJ4WLDmjqHRtw8OA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.7.tgz",
+ "integrity": "sha512-PjjAZj5Ovdj0qHkh6EE89fhWReGBZ7M7ymJrQuVmhVKjLoKWd86Wn1in61JLoCJfwFUDvPw6I3NWn9yETMO62g==",
"license": "MIT",
"dependencies": {
- "@babylonjs/core": "8.26.2",
- "@babylonjs/gui": "8.26.2",
+ "@babylonjs/core": "8.29.1",
+ "@babylonjs/gui": "8.29.1",
"@babylonjs/havok": "1.3.10",
- "@babylonjs/loaders": "8.26.2",
- "@babylonjs/materials": "8.26.2",
- "@babylonjs/serializers": "8.26.2",
- "@bitbybit-dev/core": "0.20.6",
+ "@babylonjs/loaders": "8.29.1",
+ "@babylonjs/materials": "8.29.1",
+ "@babylonjs/serializers": "8.29.1",
+ "@bitbybit-dev/core": "0.20.7",
"earcut": "2.2.3"
}
},
"node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
"node_modules/@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"node_modules/@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -2434,50 +2434,50 @@
}
},
"node_modules/@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"license": "MIT",
"dependencies": {
"manifold-3d": "3.0.0"
}
},
"node_modules/@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"node_modules/@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
@@ -3688,9 +3688,9 @@
}
},
"node_modules/babylonjs-gltf2interface": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.26.2.tgz",
- "integrity": "sha512-ByWxrtoyE0LalDiJ/rtuqy6h3tWApJ42uVNwCNuuBHyHZE6Hh6U1k6LW4uQxeppfXQWvRRGzEpkmlftttAS58Q==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.29.1.tgz",
+ "integrity": "sha512-H3wfdujcU+sEirffc55ucZyaH15+x4q+woem7QuabdcqN18ShPYedcDTl6kyuMjsDF3O6UA0z7VxyG60mA1pJg==",
"license": "Apache-2.0",
"peer": true
},
@@ -13719,14 +13719,14 @@
}
},
"@babylonjs/core": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.26.2.tgz",
- "integrity": "sha512-wzAm6l/StYBIZQdXLrXKg8YmexeQCsLPWgC6K8ypitKnpjuztbEdaXhwvlpLyeE8ammF6ZsQlPzODMfawDwAHg=="
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.29.1.tgz",
+ "integrity": "sha512-hZZjiR1FvfWN/Mg07Bo/pzLKfkGYMCMnPsq1ic5UngAvfeVcNmK70l18/2iQlBrC94uSrMeMtCVY6cPxHWKsgg=="
},
"@babylonjs/gui": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.26.2.tgz",
- "integrity": "sha512-hyT1lyFaYfQBdWdbyFj7H5xlhJOcTxXi8oOMGE3Qqg6Ib2RTiUBQZ+QHf1eNzy29WsW3KOQ4lrYVMm1p/cLVfg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.29.1.tgz",
+ "integrity": "sha512-z115xTfoNc8t2MkDkeTOg+Fk8FdNNMj/EtWYzXnjO2HS3cSixM/ZawA4MgEqhWOvEmODKBJKvFokxPLaPSRZiQ==",
"requires": {}
},
"@babylonjs/havok": {
@@ -13738,63 +13738,63 @@
}
},
"@babylonjs/loaders": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.26.2.tgz",
- "integrity": "sha512-Me/bhbbeqGvuX4+UsIP3p4kmPCBrKB1iZJh1bYG5/bk8VQA0R4teOu5nQ/Y4lfYjdVtfDDm/UfeRPKPv3Pd0Kg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.29.1.tgz",
+ "integrity": "sha512-tBJv24VAdZW30BYxvwrMERDLHnxBjnC68NrMmb66B9Hs7sEl+e59nluEc2zpSSQVtdY8P8+c9F+LbqqliQLuwA==",
"requires": {}
},
"@babylonjs/materials": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.26.2.tgz",
- "integrity": "sha512-/fp8CxH+frcXaPHL7o2JlDvlHrmU0qKRVy6R+HejofVa8cvMMbZkUZJ9MTZdQZGCeEm58DfDbx4SrVDTZtRp5w==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.29.1.tgz",
+ "integrity": "sha512-bJZPDOfm1IWMMPEUTD416z8/dGpQ3mb0xF543cyEKNuZfiofpvxm6/3jF3SKf9PAVi5+hTgsRI9isCkoVehiYQ==",
"requires": {}
},
"@babylonjs/serializers": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.26.2.tgz",
- "integrity": "sha512-qAyb58bJALeQxomgCBFUky9OPgCKavzUtWgYw5AoKioMkFXKZEvWPvEmAlqCU9ZJfJUsaA4l2EvR3SX8+0I7yQ==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.29.1.tgz",
+ "integrity": "sha512-t7aNW5rh3LXBGeD8KfeEG0s5mzOsqgWHJ+VXQtb9lPkpnSeNj2nl7yY2QuRUuapNITJhvlee2J61CRIdyWNPfg==",
"requires": {}
},
"@bitbybit-dev/babylonjs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.6.tgz",
- "integrity": "sha512-npnhjj3JiAyKgtS5fnuSxnKBPIjIkkWCcIP+6NfFyO1yFk8s68bm1LTkYgBnhCIS51tXIFwJ4WLDmjqHRtw8OA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.7.tgz",
+ "integrity": "sha512-PjjAZj5Ovdj0qHkh6EE89fhWReGBZ7M7ymJrQuVmhVKjLoKWd86Wn1in61JLoCJfwFUDvPw6I3NWn9yETMO62g==",
"requires": {
- "@babylonjs/core": "8.26.2",
- "@babylonjs/gui": "8.26.2",
+ "@babylonjs/core": "8.29.1",
+ "@babylonjs/gui": "8.29.1",
"@babylonjs/havok": "1.3.10",
- "@babylonjs/loaders": "8.26.2",
- "@babylonjs/materials": "8.26.2",
- "@babylonjs/serializers": "8.26.2",
- "@bitbybit-dev/core": "0.20.6",
+ "@babylonjs/loaders": "8.29.1",
+ "@babylonjs/materials": "8.29.1",
+ "@babylonjs/serializers": "8.29.1",
+ "@bitbybit-dev/core": "0.20.7",
"earcut": "2.2.3"
}
},
"@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q=="
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g=="
},
"@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
- "requires": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
+ "requires": {
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"requires": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -13803,45 +13803,45 @@
}
},
"@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"requires": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"requires": {
"manifold-3d": "3.0.0"
}
},
"@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"requires": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"requires": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"requires": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
@@ -14847,9 +14847,9 @@
}
},
"babylonjs-gltf2interface": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.26.2.tgz",
- "integrity": "sha512-ByWxrtoyE0LalDiJ/rtuqy6h3tWApJ42uVNwCNuuBHyHZE6Hh6U1k6LW4uQxeppfXQWvRRGzEpkmlftttAS58Q==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.29.1.tgz",
+ "integrity": "sha512-H3wfdujcU+sEirffc55ucZyaH15+x4q+woem7QuabdcqN18ShPYedcDTl6kyuMjsDF3O6UA0z7VxyG60mA1pJg==",
"peer": true
},
"balanced-match": {
diff --git a/examples/angular/babylonjs/laptop-holder/package.json b/examples/angular/babylonjs/laptop-holder/package.json
index f4f3a4f2..b35797a5 100644
--- a/examples/angular/babylonjs/laptop-holder/package.json
+++ b/examples/angular/babylonjs/laptop-holder/package.json
@@ -10,7 +10,7 @@
},
"private": true,
"dependencies": {
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"@angular/animations": "13.3.0",
"@angular/common": "13.3.0",
"@angular/compiler": "13.3.0",
diff --git a/examples/angular/threejs/simple/package-lock.json b/examples/angular/threejs/simple/package-lock.json
index ea07ddf7..bf8fd374 100644
--- a/examples/angular/threejs/simple/package-lock.json
+++ b/examples/angular/threejs/simple/package-lock.json
@@ -17,7 +17,7 @@
"@angular/platform-browser": "13.3.0",
"@angular/platform-browser-dynamic": "13.3.0",
"@angular/router": "13.3.0",
- "@bitbybit-dev/threejs": "0.20.6",
+ "@bitbybit-dev/threejs": "0.20.7",
"rxjs": "7.5.5",
"tslib": "2.3.1",
"zone.js": "0.11.5"
@@ -2330,44 +2330,34 @@
"node": ">=6.9.0"
}
},
- "node_modules/@bitbybit-dev/threejs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.6.tgz",
- "integrity": "sha512-b7XdWXGmDZM7NhgU5XDErRAwI94VqBL1CDYSOYailnpZOXPp/QNHXZkOSg+zElUMWP8iTYptpzgVoTqmHlxEwg==",
- "license": "MIT",
- "dependencies": {
- "@bitbybit-dev/core": "0.20.6",
- "three": "0.179.1"
- }
- },
- "node_modules/@bitbybit-dev/threejs/node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "node_modules/@bitbybit-dev/base": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
- "node_modules/@bitbybit-dev/threejs/node_modules/@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
+ "node_modules/@bitbybit-dev/core": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
- "node_modules/@bitbybit-dev/threejs/node_modules/@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "node_modules/@bitbybit-dev/jscad": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -2375,54 +2365,64 @@
"@jscad/stl-serializer": "2.1.18"
}
},
- "node_modules/@bitbybit-dev/threejs/node_modules/@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "node_modules/@bitbybit-dev/jscad-worker": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
- "node_modules/@bitbybit-dev/threejs/node_modules/@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "node_modules/@bitbybit-dev/manifold": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"license": "MIT",
"dependencies": {
"manifold-3d": "3.0.0"
}
},
- "node_modules/@bitbybit-dev/threejs/node_modules/@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "node_modules/@bitbybit-dev/manifold-worker": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
- "node_modules/@bitbybit-dev/threejs/node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "node_modules/@bitbybit-dev/occt": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
- "node_modules/@bitbybit-dev/threejs/node_modules/@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "node_modules/@bitbybit-dev/occt-worker": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
+ "node_modules/@bitbybit-dev/threejs": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.7.tgz",
+ "integrity": "sha512-sa/PHehdMQ/vDsacuvrsD5tkwnAnpviQAEC9Jr+ng2YDswAGGdUc7Gq5ITlxNMx1/9lhuXEwGGDGYIhAHXyj0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@bitbybit-dev/core": "0.20.7",
+ "three": "0.180.0"
+ }
+ },
"node_modules/@cspotcode/source-map-consumer": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
@@ -2528,6 +2528,7 @@
"version": "2.1.12",
"resolved": "https://registry.npmjs.org/@jscad/3mf-serializer/-/3mf-serializer-2.1.12.tgz",
"integrity": "sha512-+rxAIKIHCpaplupwwsdXtG1IdimPXFFB45nrjy6gdFHi36bEQW6y/RQD/ngenRiKnYSxu7/M0LatHcjve8z64A==",
+ "license": "MIT",
"dependencies": {
"@jscad/array-utils": "2.1.4",
"@jscad/modeling": "2.12.3",
@@ -2538,12 +2539,14 @@
"node_modules/@jscad/array-utils": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@jscad/array-utils/-/array-utils-2.1.4.tgz",
- "integrity": "sha512-c31r4zSKsE+4Xfwk2V8monDA0hx5G89QGzaakWVUvuGNowYS9WSsYCwHiTIXodjR+HEnDu4okQ7k/whmP0Ne2g=="
+ "integrity": "sha512-c31r4zSKsE+4Xfwk2V8monDA0hx5G89QGzaakWVUvuGNowYS9WSsYCwHiTIXodjR+HEnDu4okQ7k/whmP0Ne2g==",
+ "license": "MIT"
},
"node_modules/@jscad/dxf-serializer": {
"version": "2.1.18",
"resolved": "https://registry.npmjs.org/@jscad/dxf-serializer/-/dxf-serializer-2.1.18.tgz",
"integrity": "sha512-T5Qe2jbEphcWAk7GaOY8PCMD4DPhTm6gWk/MPJCExphhnUwJqcU/1RiMb5hiD+N6hHzmlxD59I8QTjlp9LbLSA==",
+ "license": "MIT",
"dependencies": {
"@jscad/array-utils": "2.1.4",
"@jscad/modeling": "2.12.3"
@@ -2552,17 +2555,20 @@
"node_modules/@jscad/io-utils": {
"version": "2.0.28",
"resolved": "https://registry.npmjs.org/@jscad/io-utils/-/io-utils-2.0.28.tgz",
- "integrity": "sha512-spXh37wAgmwjKztoH/HANLgImcqRHX5+H/cRIxPfpqDIWvu7I5bRg2ZTwh25SYlKIzxPk4qX5Nu7Ax5+Kg+QXQ=="
+ "integrity": "sha512-spXh37wAgmwjKztoH/HANLgImcqRHX5+H/cRIxPfpqDIWvu7I5bRg2ZTwh25SYlKIzxPk4qX5Nu7Ax5+Kg+QXQ==",
+ "license": "MIT"
},
"node_modules/@jscad/modeling": {
"version": "2.12.3",
"resolved": "https://registry.npmjs.org/@jscad/modeling/-/modeling-2.12.3.tgz",
- "integrity": "sha512-DnAacXq3zhlYWIixGlFD7RMpgZAMuCaMZNQov0NaoFfs2GaBuTC5eqkqKcEVbhEerBmTllbjjF5IXjJMt9jcOA=="
+ "integrity": "sha512-DnAacXq3zhlYWIixGlFD7RMpgZAMuCaMZNQov0NaoFfs2GaBuTC5eqkqKcEVbhEerBmTllbjjF5IXjJMt9jcOA==",
+ "license": "MIT"
},
"node_modules/@jscad/stl-serializer": {
"version": "2.1.18",
"resolved": "https://registry.npmjs.org/@jscad/stl-serializer/-/stl-serializer-2.1.18.tgz",
"integrity": "sha512-pz++TRjHI7jBPnnxQUi4B/uYUG3yCDsKlw8+xL2kumwjb+auc6Ng6Rnr/GqUTkgHrnGut08wg/8AekyWjvBwYg==",
+ "license": "MIT",
"dependencies": {
"@jscad/array-utils": "2.1.4",
"@jscad/modeling": "2.12.3"
@@ -2572,6 +2578,7 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz",
"integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==",
+ "license": "MIT",
"engines": {
"node": ">= 10.16.0"
},
@@ -2583,6 +2590,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz",
"integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==",
+ "license": "MIT",
"engines": {
"node": ">= 10.16.0"
},
@@ -3688,6 +3696,7 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "license": "MIT",
"optional": true,
"dependencies": {
"file-uri-to-path": "1.0.0"
@@ -5865,7 +5874,8 @@
"node_modules/fflate": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz",
- "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw=="
+ "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==",
+ "license": "MIT"
},
"node_modules/figures": {
"version": "3.2.0",
@@ -5969,6 +5979,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "license": "MIT",
"optional": true
},
"node_modules/fill-range": {
@@ -7263,6 +7274,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz",
"integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==",
+ "license": "MIT",
"engines": {
"node": ">= 10.16.0"
}
@@ -7340,6 +7352,7 @@
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.1.0.tgz",
"integrity": "sha512-gHfV1IYqH8uJHYVTs8BJX1XKy2/rR93+f8QQi0xhx95aCiXn1ettYAd5T+7FU6wfqyDoX/wy0pm/fL3jOKJ9Lg==",
+ "license": "MIT",
"dependencies": {
"@jsep-plugin/assignment": "^1.2.1",
"@jsep-plugin/regex": "^1.0.3",
@@ -7915,7 +7928,8 @@
"node_modules/manifold-3d": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/manifold-3d/-/manifold-3d-3.0.0.tgz",
- "integrity": "sha512-6XxRf5LH4s7WIlRrvtzLMg+CHio5TznIE0w0PU/Ad8IzD36QLjb64QdSeQp9ISrk4tGtIqVAycevpPe1ExGTKg=="
+ "integrity": "sha512-6XxRf5LH4s7WIlRrvtzLMg+CHio5TznIE0w0PU/Ad8IzD36QLjb64QdSeQp9ISrk4tGtIqVAycevpPe1ExGTKg==",
+ "license": "Apache-2.0"
},
"node_modules/media-typer": {
"version": "0.3.0",
@@ -8232,6 +8246,7 @@
"version": "2.23.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz",
"integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==",
+ "license": "MIT",
"optional": true
},
"node_modules/nanoid": {
@@ -8749,6 +8764,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/onml/-/onml-1.2.0.tgz",
"integrity": "sha512-olqYAg18XoHAhm7tK9DdBCOVdts70DGmMgCNLOWyqZokht2utgGSKBB4JHi6pBZpmioAhcYlxK+91L3tsrz+GA==",
+ "license": "MIT",
"dependencies": {
"sax": "^1.2.1"
}
@@ -11157,9 +11173,9 @@
"dev": true
},
"node_modules/three": {
- "version": "0.179.1",
- "resolved": "https://registry.npmjs.org/three/-/three-0.179.1.tgz",
- "integrity": "sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==",
+ "version": "0.180.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.180.0.tgz",
+ "integrity": "sha512-o+qycAMZrh+TsE01GqWUxUIKR1AL0S8pq7zDkYOQw8GqfX8b8VoCKYUoHbhiX5j+7hr8XsuHDVU6+gkQJQKg9w==",
"license": "MIT"
},
"node_modules/through": {
@@ -11497,6 +11513,7 @@
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/verb-nurbs-web/-/verb-nurbs-web-2.1.3.tgz",
"integrity": "sha512-2PvI2bx7dn0r3kWtk+JuDIDZ+p7I5Piu8y6/ZNhUVpilOyHKK1nNzLHtgown+dFOmBnKnuAKIMh1xn/5kzrxZA==",
+ "license": "MIT",
"optionalDependencies": {
"webworker-threads": "^0.7.12"
}
@@ -11847,6 +11864,7 @@
"resolved": "https://registry.npmjs.org/webworker-threads/-/webworker-threads-0.7.17.tgz",
"integrity": "sha512-Y2w2aXBbDLk9IzTEb9u+MsODC3s4YlGI7g4h0t+1OAwIO8yBI9rQL35ZYlyayiCuWu1dZMH/P7kGU8OwW7YsyA==",
"hasInstallScript": true,
+ "license": "(MIT AND Apache-2.0)",
"optional": true,
"dependencies": {
"bindings": "^1.3.0",
@@ -13631,90 +13649,88 @@
"to-fast-properties": "^2.0.0"
}
},
+ "@bitbybit-dev/base": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g=="
+ },
+ "@bitbybit-dev/core": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
+ "requires": {
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
+ "jsonpath-plus": "10.1.0",
+ "rxjs": "7.5.5",
+ "verb-nurbs-web": "2.1.3"
+ }
+ },
+ "@bitbybit-dev/jscad": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
+ "requires": {
+ "@bitbybit-dev/base": "0.20.7",
+ "@jscad/3mf-serializer": "2.1.12",
+ "@jscad/dxf-serializer": "2.1.18",
+ "@jscad/io-utils": "2.0.28",
+ "@jscad/modeling": "2.12.3",
+ "@jscad/stl-serializer": "2.1.18"
+ }
+ },
+ "@bitbybit-dev/jscad-worker": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
+ "requires": {
+ "@bitbybit-dev/jscad": "0.20.7",
+ "rxjs": "7.5.5"
+ }
+ },
+ "@bitbybit-dev/manifold": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
+ "requires": {
+ "manifold-3d": "3.0.0"
+ }
+ },
+ "@bitbybit-dev/manifold-worker": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
+ "requires": {
+ "@bitbybit-dev/manifold": "0.20.7",
+ "rxjs": "7.5.5"
+ }
+ },
+ "@bitbybit-dev/occt": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
+ "requires": {
+ "@bitbybit-dev/base": "0.20.7"
+ }
+ },
+ "@bitbybit-dev/occt-worker": {
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
+ "requires": {
+ "@bitbybit-dev/occt": "0.20.7",
+ "rxjs": "7.5.5"
+ }
+ },
"@bitbybit-dev/threejs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.6.tgz",
- "integrity": "sha512-b7XdWXGmDZM7NhgU5XDErRAwI94VqBL1CDYSOYailnpZOXPp/QNHXZkOSg+zElUMWP8iTYptpzgVoTqmHlxEwg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.7.tgz",
+ "integrity": "sha512-sa/PHehdMQ/vDsacuvrsD5tkwnAnpviQAEC9Jr+ng2YDswAGGdUc7Gq5ITlxNMx1/9lhuXEwGGDGYIhAHXyj0w==",
"requires": {
- "@bitbybit-dev/core": "0.20.6",
- "three": "0.179.1"
- },
- "dependencies": {
- "@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q=="
- },
- "@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
- "requires": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
- "jsonpath-plus": "10.1.0",
- "rxjs": "7.5.5",
- "verb-nurbs-web": "2.1.3"
- }
- },
- "@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
- "requires": {
- "@bitbybit-dev/base": "0.20.6",
- "@jscad/3mf-serializer": "2.1.12",
- "@jscad/dxf-serializer": "2.1.18",
- "@jscad/io-utils": "2.0.28",
- "@jscad/modeling": "2.12.3",
- "@jscad/stl-serializer": "2.1.18"
- }
- },
- "@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
- "requires": {
- "@bitbybit-dev/jscad": "0.20.6",
- "rxjs": "7.5.5"
- }
- },
- "@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
- "requires": {
- "manifold-3d": "3.0.0"
- }
- },
- "@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
- "requires": {
- "@bitbybit-dev/manifold": "0.20.6",
- "rxjs": "7.5.5"
- }
- },
- "@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
- "requires": {
- "@bitbybit-dev/base": "0.20.6"
- }
- },
- "@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
- "requires": {
- "@bitbybit-dev/occt": "0.20.6",
- "rxjs": "7.5.5"
- }
- }
+ "@bitbybit-dev/core": "0.20.7",
+ "three": "0.180.0"
}
},
"@cspotcode/source-map-consumer": {
@@ -20247,9 +20263,9 @@
"dev": true
},
"three": {
- "version": "0.179.1",
- "resolved": "https://registry.npmjs.org/three/-/three-0.179.1.tgz",
- "integrity": "sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw=="
+ "version": "0.180.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.180.0.tgz",
+ "integrity": "sha512-o+qycAMZrh+TsE01GqWUxUIKR1AL0S8pq7zDkYOQw8GqfX8b8VoCKYUoHbhiX5j+7hr8XsuHDVU6+gkQJQKg9w=="
},
"through": {
"version": "2.3.8",
diff --git a/examples/angular/threejs/simple/package.json b/examples/angular/threejs/simple/package.json
index 468a0896..6876deea 100644
--- a/examples/angular/threejs/simple/package.json
+++ b/examples/angular/threejs/simple/package.json
@@ -10,7 +10,7 @@
},
"private": true,
"dependencies": {
- "@bitbybit-dev/threejs": "0.20.6",
+ "@bitbybit-dev/threejs": "0.20.7",
"@angular/animations": "13.3.0",
"@angular/common": "13.3.0",
"@angular/compiler": "13.3.0",
diff --git a/examples/angular/threejs/vite-basic-example/package-lock.json b/examples/angular/threejs/vite-basic-example/package-lock.json
index 49cd091d..f8372cbf 100644
--- a/examples/angular/threejs/vite-basic-example/package-lock.json
+++ b/examples/angular/threejs/vite-basic-example/package-lock.json
@@ -13,7 +13,7 @@
"@angular/forms": "^20.0.0",
"@angular/platform-browser": "^20.0.0",
"@angular/router": "^20.0.0",
- "@bitbybit-dev/threejs": "0.20.6",
+ "@bitbybit-dev/threejs": "0.20.7",
"rxjs": "7.5.5",
"tslib": "^2.5.0",
"zone.js": "~0.15.0"
@@ -929,33 +929,33 @@
}
},
"node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
"node_modules/@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"node_modules/@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -964,61 +964,61 @@
}
},
"node_modules/@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"license": "MIT",
"dependencies": {
"manifold-3d": "3.0.0"
}
},
"node_modules/@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"node_modules/@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/threejs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.6.tgz",
- "integrity": "sha512-b7XdWXGmDZM7NhgU5XDErRAwI94VqBL1CDYSOYailnpZOXPp/QNHXZkOSg+zElUMWP8iTYptpzgVoTqmHlxEwg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.7.tgz",
+ "integrity": "sha512-sa/PHehdMQ/vDsacuvrsD5tkwnAnpviQAEC9Jr+ng2YDswAGGdUc7Gq5ITlxNMx1/9lhuXEwGGDGYIhAHXyj0w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/core": "0.20.6",
- "three": "0.179.1"
+ "@bitbybit-dev/core": "0.20.7",
+ "three": "0.180.0"
}
},
"node_modules/@dimforge/rapier3d-compat": {
@@ -8111,9 +8111,9 @@
"license": "ISC"
},
"node_modules/three": {
- "version": "0.179.1",
- "resolved": "https://registry.npmjs.org/three/-/three-0.179.1.tgz",
- "integrity": "sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==",
+ "version": "0.180.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.180.0.tgz",
+ "integrity": "sha512-o+qycAMZrh+TsE01GqWUxUIKR1AL0S8pq7zDkYOQw8GqfX8b8VoCKYUoHbhiX5j+7hr8XsuHDVU6+gkQJQKg9w==",
"license": "MIT"
},
"node_modules/tinyglobby": {
diff --git a/examples/angular/threejs/vite-basic-example/package.json b/examples/angular/threejs/vite-basic-example/package.json
index 07308b27..ea60e452 100644
--- a/examples/angular/threejs/vite-basic-example/package.json
+++ b/examples/angular/threejs/vite-basic-example/package.json
@@ -14,7 +14,7 @@
"@angular/forms": "^20.0.0",
"@angular/platform-browser": "^20.0.0",
"@angular/router": "^20.0.0",
- "@bitbybit-dev/threejs": "0.20.6",
+ "@bitbybit-dev/threejs": "0.20.7",
"rxjs": "7.5.5",
"tslib": "^2.5.0",
"zone.js": "~0.15.0"
diff --git a/examples/angular/threejs/vite-basic-example/src/workers/manifold.worker.ts b/examples/angular/threejs/vite-basic-example/src/workers/manifold.worker.ts
index 6512b09d..40119847 100644
--- a/examples/angular/threejs/vite-basic-example/src/workers/manifold.worker.ts
+++ b/examples/angular/threejs/vite-basic-example/src/workers/manifold.worker.ts
@@ -7,7 +7,7 @@ import Module from "manifold-3d";
const init = async () => {
const wasm = await Module({
locateFile: () => {
- return "https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.6/wasm/manifold.cc2ddd38.wasm";
+ return "https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.7/wasm/manifold.cc2ddd38.wasm";
},
});
wasm.setup();
diff --git a/examples/nextjs/babylonjs/simple/package-lock.json b/examples/nextjs/babylonjs/simple/package-lock.json
index 7d36c1da..fd8a5ad4 100644
--- a/examples/nextjs/babylonjs/simple/package-lock.json
+++ b/examples/nextjs/babylonjs/simple/package-lock.json
@@ -8,7 +8,7 @@
"name": "simple",
"version": "0.1.0",
"dependencies": {
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"file-loader": "6.2.0",
"next": "15.0.1",
"react": "19.0.0-rc-69d4b800-20241021",
@@ -38,15 +38,15 @@
}
},
"node_modules/@babylonjs/core": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.26.2.tgz",
- "integrity": "sha512-wzAm6l/StYBIZQdXLrXKg8YmexeQCsLPWgC6K8ypitKnpjuztbEdaXhwvlpLyeE8ammF6ZsQlPzODMfawDwAHg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.29.1.tgz",
+ "integrity": "sha512-hZZjiR1FvfWN/Mg07Bo/pzLKfkGYMCMnPsq1ic5UngAvfeVcNmK70l18/2iQlBrC94uSrMeMtCVY6cPxHWKsgg==",
"license": "Apache-2.0"
},
"node_modules/@babylonjs/gui": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.26.2.tgz",
- "integrity": "sha512-hyT1lyFaYfQBdWdbyFj7H5xlhJOcTxXi8oOMGE3Qqg6Ib2RTiUBQZ+QHf1eNzy29WsW3KOQ4lrYVMm1p/cLVfg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.29.1.tgz",
+ "integrity": "sha512-z115xTfoNc8t2MkDkeTOg+Fk8FdNNMj/EtWYzXnjO2HS3cSixM/ZawA4MgEqhWOvEmODKBJKvFokxPLaPSRZiQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0"
@@ -61,9 +61,9 @@
}
},
"node_modules/@babylonjs/loaders": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.26.2.tgz",
- "integrity": "sha512-Me/bhbbeqGvuX4+UsIP3p4kmPCBrKB1iZJh1bYG5/bk8VQA0R4teOu5nQ/Y4lfYjdVtfDDm/UfeRPKPv3Pd0Kg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.29.1.tgz",
+ "integrity": "sha512-tBJv24VAdZW30BYxvwrMERDLHnxBjnC68NrMmb66B9Hs7sEl+e59nluEc2zpSSQVtdY8P8+c9F+LbqqliQLuwA==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -71,18 +71,18 @@
}
},
"node_modules/@babylonjs/materials": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.26.2.tgz",
- "integrity": "sha512-/fp8CxH+frcXaPHL7o2JlDvlHrmU0qKRVy6R+HejofVa8cvMMbZkUZJ9MTZdQZGCeEm58DfDbx4SrVDTZtRp5w==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.29.1.tgz",
+ "integrity": "sha512-bJZPDOfm1IWMMPEUTD416z8/dGpQ3mb0xF543cyEKNuZfiofpvxm6/3jF3SKf9PAVi5+hTgsRI9isCkoVehiYQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.6.0"
}
},
"node_modules/@babylonjs/serializers": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.26.2.tgz",
- "integrity": "sha512-qAyb58bJALeQxomgCBFUky9OPgCKavzUtWgYw5AoKioMkFXKZEvWPvEmAlqCU9ZJfJUsaA4l2EvR3SX8+0I7yQ==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.29.1.tgz",
+ "integrity": "sha512-t7aNW5rh3LXBGeD8KfeEG0s5mzOsqgWHJ+VXQtb9lPkpnSeNj2nl7yY2QuRUuapNITJhvlee2J61CRIdyWNPfg==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -90,49 +90,49 @@
}
},
"node_modules/@bitbybit-dev/babylonjs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.6.tgz",
- "integrity": "sha512-npnhjj3JiAyKgtS5fnuSxnKBPIjIkkWCcIP+6NfFyO1yFk8s68bm1LTkYgBnhCIS51tXIFwJ4WLDmjqHRtw8OA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.7.tgz",
+ "integrity": "sha512-PjjAZj5Ovdj0qHkh6EE89fhWReGBZ7M7ymJrQuVmhVKjLoKWd86Wn1in61JLoCJfwFUDvPw6I3NWn9yETMO62g==",
"license": "MIT",
"dependencies": {
- "@babylonjs/core": "8.26.2",
- "@babylonjs/gui": "8.26.2",
+ "@babylonjs/core": "8.29.1",
+ "@babylonjs/gui": "8.29.1",
"@babylonjs/havok": "1.3.10",
- "@babylonjs/loaders": "8.26.2",
- "@babylonjs/materials": "8.26.2",
- "@babylonjs/serializers": "8.26.2",
- "@bitbybit-dev/core": "0.20.6",
+ "@babylonjs/loaders": "8.29.1",
+ "@babylonjs/materials": "8.29.1",
+ "@babylonjs/serializers": "8.29.1",
+ "@bitbybit-dev/core": "0.20.7",
"earcut": "2.2.3"
}
},
"node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
"node_modules/@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"node_modules/@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -141,50 +141,50 @@
}
},
"node_modules/@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"license": "MIT",
"dependencies": {
"manifold-3d": "3.0.0"
}
},
"node_modules/@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"node_modules/@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
@@ -1773,9 +1773,9 @@
}
},
"node_modules/babylonjs-gltf2interface": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.26.2.tgz",
- "integrity": "sha512-ByWxrtoyE0LalDiJ/rtuqy6h3tWApJ42uVNwCNuuBHyHZE6Hh6U1k6LW4uQxeppfXQWvRRGzEpkmlftttAS58Q==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.29.1.tgz",
+ "integrity": "sha512-H3wfdujcU+sEirffc55ucZyaH15+x4q+woem7QuabdcqN18ShPYedcDTl6kyuMjsDF3O6UA0z7VxyG60mA1pJg==",
"license": "Apache-2.0",
"peer": true
},
diff --git a/examples/nextjs/babylonjs/simple/package.json b/examples/nextjs/babylonjs/simple/package.json
index 0e59c6b0..4fea21ac 100644
--- a/examples/nextjs/babylonjs/simple/package.json
+++ b/examples/nextjs/babylonjs/simple/package.json
@@ -9,7 +9,7 @@
"lint": "next lint"
},
"dependencies": {
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"react": "19.0.0-rc-69d4b800-20241021",
"react-dom": "19.0.0-rc-69d4b800-20241021",
"next": "15.0.1",
diff --git a/examples/node/basic/package-lock.json b/examples/node/basic/package-lock.json
index 1ba7423a..255bf496 100644
--- a/examples/node/basic/package-lock.json
+++ b/examples/node/basic/package-lock.json
@@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "^0.20.6"
+ "@bitbybit-dev/occt": "^0.20.7"
},
"devDependencies": {
"concurrently": "^7.6.0",
@@ -34,18 +34,18 @@
}
},
"node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
"node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"node_modules/ansi-regex": {
diff --git a/examples/node/basic/package.json b/examples/node/basic/package.json
index 8eaf7f6f..8ee43a3d 100644
--- a/examples/node/basic/package.json
+++ b/examples/node/basic/package.json
@@ -15,7 +15,7 @@
"node": ">=20.19.4"
},
"dependencies": {
- "@bitbybit-dev/occt": "^0.20.6"
+ "@bitbybit-dev/occt": "^0.20.7"
},
"devDependencies": {
"extensionless": "1.9.9",
diff --git a/examples/node/express-app/package-lock.json b/examples/node/express-app/package-lock.json
index 852d70ca..8f0b801a 100644
--- a/examples/node/express-app/package-lock.json
+++ b/examples/node/express-app/package-lock.json
@@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/core": "0.20.6",
+ "@bitbybit-dev/core": "0.20.7",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
"express": "^4.18.2",
@@ -23,6 +23,9 @@
"extensionless": "1.9.9",
"nodemon": "^2.0.20",
"typescript": "^4.9.4"
+ },
+ "engines": {
+ "node": ">=20.19.4"
}
},
"node_modules/@babel/runtime": {
@@ -38,33 +41,33 @@
}
},
"node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
"node_modules/@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"node_modules/@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -73,50 +76,50 @@
}
},
"node_modules/@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"license": "MIT",
"dependencies": {
"manifold-3d": "3.0.0"
}
},
"node_modules/@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"node_modules/@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
@@ -1850,30 +1853,30 @@
}
},
"@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q=="
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g=="
},
"@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
- "requires": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
+ "requires": {
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"requires": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -1882,45 +1885,45 @@
}
},
"@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"requires": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"requires": {
"manifold-3d": "3.0.0"
}
},
"@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"requires": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"requires": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"requires": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
diff --git a/examples/node/express-app/package.json b/examples/node/express-app/package.json
index fda3b760..0e1ca9c6 100644
--- a/examples/node/express-app/package.json
+++ b/examples/node/express-app/package.json
@@ -11,7 +11,7 @@
"author": "Bit By Bit Developers",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/core": "0.20.6",
+ "@bitbybit-dev/core": "0.20.7",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
"express": "^4.18.2",
diff --git a/examples/nuxt/babylonjs/basic/package-lock.json b/examples/nuxt/babylonjs/basic/package-lock.json
index c83ef517..52cd5c7d 100644
--- a/examples/nuxt/babylonjs/basic/package-lock.json
+++ b/examples/nuxt/babylonjs/basic/package-lock.json
@@ -8,7 +8,7 @@
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"@pinia/nuxt": "^0.5.4",
"nuxt": "^3.13.0",
"pinia": "^2.2.2",
@@ -486,15 +486,15 @@
}
},
"node_modules/@babylonjs/core": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.26.2.tgz",
- "integrity": "sha512-wzAm6l/StYBIZQdXLrXKg8YmexeQCsLPWgC6K8ypitKnpjuztbEdaXhwvlpLyeE8ammF6ZsQlPzODMfawDwAHg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.29.1.tgz",
+ "integrity": "sha512-hZZjiR1FvfWN/Mg07Bo/pzLKfkGYMCMnPsq1ic5UngAvfeVcNmK70l18/2iQlBrC94uSrMeMtCVY6cPxHWKsgg==",
"license": "Apache-2.0"
},
"node_modules/@babylonjs/gui": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.26.2.tgz",
- "integrity": "sha512-hyT1lyFaYfQBdWdbyFj7H5xlhJOcTxXi8oOMGE3Qqg6Ib2RTiUBQZ+QHf1eNzy29WsW3KOQ4lrYVMm1p/cLVfg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.29.1.tgz",
+ "integrity": "sha512-z115xTfoNc8t2MkDkeTOg+Fk8FdNNMj/EtWYzXnjO2HS3cSixM/ZawA4MgEqhWOvEmODKBJKvFokxPLaPSRZiQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0"
@@ -509,9 +509,9 @@
}
},
"node_modules/@babylonjs/loaders": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.26.2.tgz",
- "integrity": "sha512-Me/bhbbeqGvuX4+UsIP3p4kmPCBrKB1iZJh1bYG5/bk8VQA0R4teOu5nQ/Y4lfYjdVtfDDm/UfeRPKPv3Pd0Kg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.29.1.tgz",
+ "integrity": "sha512-tBJv24VAdZW30BYxvwrMERDLHnxBjnC68NrMmb66B9Hs7sEl+e59nluEc2zpSSQVtdY8P8+c9F+LbqqliQLuwA==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -519,18 +519,18 @@
}
},
"node_modules/@babylonjs/materials": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.26.2.tgz",
- "integrity": "sha512-/fp8CxH+frcXaPHL7o2JlDvlHrmU0qKRVy6R+HejofVa8cvMMbZkUZJ9MTZdQZGCeEm58DfDbx4SrVDTZtRp5w==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.29.1.tgz",
+ "integrity": "sha512-bJZPDOfm1IWMMPEUTD416z8/dGpQ3mb0xF543cyEKNuZfiofpvxm6/3jF3SKf9PAVi5+hTgsRI9isCkoVehiYQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.6.0"
}
},
"node_modules/@babylonjs/serializers": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.26.2.tgz",
- "integrity": "sha512-qAyb58bJALeQxomgCBFUky9OPgCKavzUtWgYw5AoKioMkFXKZEvWPvEmAlqCU9ZJfJUsaA4l2EvR3SX8+0I7yQ==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.29.1.tgz",
+ "integrity": "sha512-t7aNW5rh3LXBGeD8KfeEG0s5mzOsqgWHJ+VXQtb9lPkpnSeNj2nl7yY2QuRUuapNITJhvlee2J61CRIdyWNPfg==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -538,49 +538,49 @@
}
},
"node_modules/@bitbybit-dev/babylonjs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.6.tgz",
- "integrity": "sha512-npnhjj3JiAyKgtS5fnuSxnKBPIjIkkWCcIP+6NfFyO1yFk8s68bm1LTkYgBnhCIS51tXIFwJ4WLDmjqHRtw8OA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.7.tgz",
+ "integrity": "sha512-PjjAZj5Ovdj0qHkh6EE89fhWReGBZ7M7ymJrQuVmhVKjLoKWd86Wn1in61JLoCJfwFUDvPw6I3NWn9yETMO62g==",
"license": "MIT",
"dependencies": {
- "@babylonjs/core": "8.26.2",
- "@babylonjs/gui": "8.26.2",
+ "@babylonjs/core": "8.29.1",
+ "@babylonjs/gui": "8.29.1",
"@babylonjs/havok": "1.3.10",
- "@babylonjs/loaders": "8.26.2",
- "@babylonjs/materials": "8.26.2",
- "@babylonjs/serializers": "8.26.2",
- "@bitbybit-dev/core": "0.20.6",
+ "@babylonjs/loaders": "8.29.1",
+ "@babylonjs/materials": "8.29.1",
+ "@babylonjs/serializers": "8.29.1",
+ "@bitbybit-dev/core": "0.20.7",
"earcut": "2.2.3"
}
},
"node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
"node_modules/@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"node_modules/@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -589,50 +589,50 @@
}
},
"node_modules/@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"license": "MIT",
"dependencies": {
"manifold-3d": "3.0.0"
}
},
"node_modules/@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"node_modules/@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
@@ -3028,9 +3028,9 @@
"integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg=="
},
"node_modules/babylonjs-gltf2interface": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.26.2.tgz",
- "integrity": "sha512-ByWxrtoyE0LalDiJ/rtuqy6h3tWApJ42uVNwCNuuBHyHZE6Hh6U1k6LW4uQxeppfXQWvRRGzEpkmlftttAS58Q==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.29.1.tgz",
+ "integrity": "sha512-H3wfdujcU+sEirffc55ucZyaH15+x4q+woem7QuabdcqN18ShPYedcDTl6kyuMjsDF3O6UA0z7VxyG60mA1pJg==",
"license": "Apache-2.0",
"peer": true
},
diff --git a/examples/nuxt/babylonjs/basic/package.json b/examples/nuxt/babylonjs/basic/package.json
index ff0d3b5d..87689997 100644
--- a/examples/nuxt/babylonjs/basic/package.json
+++ b/examples/nuxt/babylonjs/basic/package.json
@@ -11,7 +11,7 @@
"postinstall": "nuxt prepare"
},
"dependencies": {
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"@pinia/nuxt": "^0.5.4",
"nuxt": "^3.13.0",
"pinia": "^2.2.2",
diff --git a/examples/react/babylonjs/cup/package-lock.json b/examples/react/babylonjs/cup/package-lock.json
index 0534cd29..19809344 100644
--- a/examples/react/babylonjs/cup/package-lock.json
+++ b/examples/react/babylonjs/cup/package-lock.json
@@ -8,7 +8,7 @@
"name": "cup",
"version": "0.1.0",
"dependencies": {
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"@emotion/react": "11.9.0",
"@emotion/styled": "11.8.1",
"@mui/icons-material": "5.6.2",
@@ -1809,15 +1809,15 @@
}
},
"node_modules/@babylonjs/core": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.26.2.tgz",
- "integrity": "sha512-wzAm6l/StYBIZQdXLrXKg8YmexeQCsLPWgC6K8ypitKnpjuztbEdaXhwvlpLyeE8ammF6ZsQlPzODMfawDwAHg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.29.1.tgz",
+ "integrity": "sha512-hZZjiR1FvfWN/Mg07Bo/pzLKfkGYMCMnPsq1ic5UngAvfeVcNmK70l18/2iQlBrC94uSrMeMtCVY6cPxHWKsgg==",
"license": "Apache-2.0"
},
"node_modules/@babylonjs/gui": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.26.2.tgz",
- "integrity": "sha512-hyT1lyFaYfQBdWdbyFj7H5xlhJOcTxXi8oOMGE3Qqg6Ib2RTiUBQZ+QHf1eNzy29WsW3KOQ4lrYVMm1p/cLVfg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.29.1.tgz",
+ "integrity": "sha512-z115xTfoNc8t2MkDkeTOg+Fk8FdNNMj/EtWYzXnjO2HS3cSixM/ZawA4MgEqhWOvEmODKBJKvFokxPLaPSRZiQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0"
@@ -1832,9 +1832,9 @@
}
},
"node_modules/@babylonjs/loaders": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.26.2.tgz",
- "integrity": "sha512-Me/bhbbeqGvuX4+UsIP3p4kmPCBrKB1iZJh1bYG5/bk8VQA0R4teOu5nQ/Y4lfYjdVtfDDm/UfeRPKPv3Pd0Kg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.29.1.tgz",
+ "integrity": "sha512-tBJv24VAdZW30BYxvwrMERDLHnxBjnC68NrMmb66B9Hs7sEl+e59nluEc2zpSSQVtdY8P8+c9F+LbqqliQLuwA==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -1842,18 +1842,18 @@
}
},
"node_modules/@babylonjs/materials": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.26.2.tgz",
- "integrity": "sha512-/fp8CxH+frcXaPHL7o2JlDvlHrmU0qKRVy6R+HejofVa8cvMMbZkUZJ9MTZdQZGCeEm58DfDbx4SrVDTZtRp5w==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.29.1.tgz",
+ "integrity": "sha512-bJZPDOfm1IWMMPEUTD416z8/dGpQ3mb0xF543cyEKNuZfiofpvxm6/3jF3SKf9PAVi5+hTgsRI9isCkoVehiYQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.6.0"
}
},
"node_modules/@babylonjs/serializers": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.26.2.tgz",
- "integrity": "sha512-qAyb58bJALeQxomgCBFUky9OPgCKavzUtWgYw5AoKioMkFXKZEvWPvEmAlqCU9ZJfJUsaA4l2EvR3SX8+0I7yQ==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.29.1.tgz",
+ "integrity": "sha512-t7aNW5rh3LXBGeD8KfeEG0s5mzOsqgWHJ+VXQtb9lPkpnSeNj2nl7yY2QuRUuapNITJhvlee2J61CRIdyWNPfg==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -1866,49 +1866,49 @@
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
},
"node_modules/@bitbybit-dev/babylonjs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.6.tgz",
- "integrity": "sha512-npnhjj3JiAyKgtS5fnuSxnKBPIjIkkWCcIP+6NfFyO1yFk8s68bm1LTkYgBnhCIS51tXIFwJ4WLDmjqHRtw8OA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.7.tgz",
+ "integrity": "sha512-PjjAZj5Ovdj0qHkh6EE89fhWReGBZ7M7ymJrQuVmhVKjLoKWd86Wn1in61JLoCJfwFUDvPw6I3NWn9yETMO62g==",
"license": "MIT",
"dependencies": {
- "@babylonjs/core": "8.26.2",
- "@babylonjs/gui": "8.26.2",
+ "@babylonjs/core": "8.29.1",
+ "@babylonjs/gui": "8.29.1",
"@babylonjs/havok": "1.3.10",
- "@babylonjs/loaders": "8.26.2",
- "@babylonjs/materials": "8.26.2",
- "@babylonjs/serializers": "8.26.2",
- "@bitbybit-dev/core": "0.20.6",
+ "@babylonjs/loaders": "8.29.1",
+ "@babylonjs/materials": "8.29.1",
+ "@babylonjs/serializers": "8.29.1",
+ "@bitbybit-dev/core": "0.20.7",
"earcut": "2.2.3"
}
},
"node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
"node_modules/@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"node_modules/@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -1917,50 +1917,50 @@
}
},
"node_modules/@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"license": "MIT",
"dependencies": {
"manifold-3d": "3.0.0"
}
},
"node_modules/@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"node_modules/@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
@@ -5694,9 +5694,9 @@
}
},
"node_modules/babylonjs-gltf2interface": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.26.2.tgz",
- "integrity": "sha512-ByWxrtoyE0LalDiJ/rtuqy6h3tWApJ42uVNwCNuuBHyHZE6Hh6U1k6LW4uQxeppfXQWvRRGzEpkmlftttAS58Q==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.29.1.tgz",
+ "integrity": "sha512-H3wfdujcU+sEirffc55ucZyaH15+x4q+woem7QuabdcqN18ShPYedcDTl6kyuMjsDF3O6UA0z7VxyG60mA1pJg==",
"license": "Apache-2.0",
"peer": true
},
@@ -19074,14 +19074,14 @@
}
},
"@babylonjs/core": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.26.2.tgz",
- "integrity": "sha512-wzAm6l/StYBIZQdXLrXKg8YmexeQCsLPWgC6K8ypitKnpjuztbEdaXhwvlpLyeE8ammF6ZsQlPzODMfawDwAHg=="
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.29.1.tgz",
+ "integrity": "sha512-hZZjiR1FvfWN/Mg07Bo/pzLKfkGYMCMnPsq1ic5UngAvfeVcNmK70l18/2iQlBrC94uSrMeMtCVY6cPxHWKsgg=="
},
"@babylonjs/gui": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.26.2.tgz",
- "integrity": "sha512-hyT1lyFaYfQBdWdbyFj7H5xlhJOcTxXi8oOMGE3Qqg6Ib2RTiUBQZ+QHf1eNzy29WsW3KOQ4lrYVMm1p/cLVfg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.29.1.tgz",
+ "integrity": "sha512-z115xTfoNc8t2MkDkeTOg+Fk8FdNNMj/EtWYzXnjO2HS3cSixM/ZawA4MgEqhWOvEmODKBJKvFokxPLaPSRZiQ==",
"requires": {}
},
"@babylonjs/havok": {
@@ -19093,21 +19093,21 @@
}
},
"@babylonjs/loaders": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.26.2.tgz",
- "integrity": "sha512-Me/bhbbeqGvuX4+UsIP3p4kmPCBrKB1iZJh1bYG5/bk8VQA0R4teOu5nQ/Y4lfYjdVtfDDm/UfeRPKPv3Pd0Kg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.29.1.tgz",
+ "integrity": "sha512-tBJv24VAdZW30BYxvwrMERDLHnxBjnC68NrMmb66B9Hs7sEl+e59nluEc2zpSSQVtdY8P8+c9F+LbqqliQLuwA==",
"requires": {}
},
"@babylonjs/materials": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.26.2.tgz",
- "integrity": "sha512-/fp8CxH+frcXaPHL7o2JlDvlHrmU0qKRVy6R+HejofVa8cvMMbZkUZJ9MTZdQZGCeEm58DfDbx4SrVDTZtRp5w==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.29.1.tgz",
+ "integrity": "sha512-bJZPDOfm1IWMMPEUTD416z8/dGpQ3mb0xF543cyEKNuZfiofpvxm6/3jF3SKf9PAVi5+hTgsRI9isCkoVehiYQ==",
"requires": {}
},
"@babylonjs/serializers": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.26.2.tgz",
- "integrity": "sha512-qAyb58bJALeQxomgCBFUky9OPgCKavzUtWgYw5AoKioMkFXKZEvWPvEmAlqCU9ZJfJUsaA4l2EvR3SX8+0I7yQ==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.29.1.tgz",
+ "integrity": "sha512-t7aNW5rh3LXBGeD8KfeEG0s5mzOsqgWHJ+VXQtb9lPkpnSeNj2nl7yY2QuRUuapNITJhvlee2J61CRIdyWNPfg==",
"requires": {}
},
"@bcoe/v8-coverage": {
@@ -19116,45 +19116,45 @@
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
},
"@bitbybit-dev/babylonjs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.6.tgz",
- "integrity": "sha512-npnhjj3JiAyKgtS5fnuSxnKBPIjIkkWCcIP+6NfFyO1yFk8s68bm1LTkYgBnhCIS51tXIFwJ4WLDmjqHRtw8OA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.7.tgz",
+ "integrity": "sha512-PjjAZj5Ovdj0qHkh6EE89fhWReGBZ7M7ymJrQuVmhVKjLoKWd86Wn1in61JLoCJfwFUDvPw6I3NWn9yETMO62g==",
"requires": {
- "@babylonjs/core": "8.26.2",
- "@babylonjs/gui": "8.26.2",
+ "@babylonjs/core": "8.29.1",
+ "@babylonjs/gui": "8.29.1",
"@babylonjs/havok": "1.3.10",
- "@babylonjs/loaders": "8.26.2",
- "@babylonjs/materials": "8.26.2",
- "@babylonjs/serializers": "8.26.2",
- "@bitbybit-dev/core": "0.20.6",
+ "@babylonjs/loaders": "8.29.1",
+ "@babylonjs/materials": "8.29.1",
+ "@babylonjs/serializers": "8.29.1",
+ "@bitbybit-dev/core": "0.20.7",
"earcut": "2.2.3"
}
},
"@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q=="
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g=="
},
"@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
- "requires": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
+ "requires": {
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"requires": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -19163,45 +19163,45 @@
}
},
"@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"requires": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"requires": {
"manifold-3d": "3.0.0"
}
},
"@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"requires": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"requires": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"requires": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
@@ -21830,9 +21830,9 @@
}
},
"babylonjs-gltf2interface": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.26.2.tgz",
- "integrity": "sha512-ByWxrtoyE0LalDiJ/rtuqy6h3tWApJ42uVNwCNuuBHyHZE6Hh6U1k6LW4uQxeppfXQWvRRGzEpkmlftttAS58Q==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.29.1.tgz",
+ "integrity": "sha512-H3wfdujcU+sEirffc55ucZyaH15+x4q+woem7QuabdcqN18ShPYedcDTl6kyuMjsDF3O6UA0z7VxyG60mA1pJg==",
"peer": true
},
"balanced-match": {
diff --git a/examples/react/babylonjs/cup/package.json b/examples/react/babylonjs/cup/package.json
index a090cac9..e9cbac32 100644
--- a/examples/react/babylonjs/cup/package.json
+++ b/examples/react/babylonjs/cup/package.json
@@ -4,7 +4,7 @@
"private": true,
"homepage": "https://app-store.bitbybit.dev/cup",
"dependencies": {
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"@emotion/react": "11.9.0",
"@emotion/styled": "11.8.1",
"web-ifc": "0.0.68",
diff --git a/examples/react/babylonjs/laptop-holder/package-lock.json b/examples/react/babylonjs/laptop-holder/package-lock.json
index 250064d8..8d7a7c21 100644
--- a/examples/react/babylonjs/laptop-holder/package-lock.json
+++ b/examples/react/babylonjs/laptop-holder/package-lock.json
@@ -8,7 +8,7 @@
"name": "laptop-holder",
"version": "0.1.0",
"dependencies": {
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"@emotion/react": "11.9.0",
"@emotion/styled": "11.8.1",
"@mui/icons-material": "5.6.2",
@@ -1847,15 +1847,15 @@
}
},
"node_modules/@babylonjs/core": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.26.2.tgz",
- "integrity": "sha512-wzAm6l/StYBIZQdXLrXKg8YmexeQCsLPWgC6K8ypitKnpjuztbEdaXhwvlpLyeE8ammF6ZsQlPzODMfawDwAHg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.29.1.tgz",
+ "integrity": "sha512-hZZjiR1FvfWN/Mg07Bo/pzLKfkGYMCMnPsq1ic5UngAvfeVcNmK70l18/2iQlBrC94uSrMeMtCVY6cPxHWKsgg==",
"license": "Apache-2.0"
},
"node_modules/@babylonjs/gui": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.26.2.tgz",
- "integrity": "sha512-hyT1lyFaYfQBdWdbyFj7H5xlhJOcTxXi8oOMGE3Qqg6Ib2RTiUBQZ+QHf1eNzy29WsW3KOQ4lrYVMm1p/cLVfg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.29.1.tgz",
+ "integrity": "sha512-z115xTfoNc8t2MkDkeTOg+Fk8FdNNMj/EtWYzXnjO2HS3cSixM/ZawA4MgEqhWOvEmODKBJKvFokxPLaPSRZiQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0"
@@ -1870,9 +1870,9 @@
}
},
"node_modules/@babylonjs/loaders": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.26.2.tgz",
- "integrity": "sha512-Me/bhbbeqGvuX4+UsIP3p4kmPCBrKB1iZJh1bYG5/bk8VQA0R4teOu5nQ/Y4lfYjdVtfDDm/UfeRPKPv3Pd0Kg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.29.1.tgz",
+ "integrity": "sha512-tBJv24VAdZW30BYxvwrMERDLHnxBjnC68NrMmb66B9Hs7sEl+e59nluEc2zpSSQVtdY8P8+c9F+LbqqliQLuwA==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -1880,18 +1880,18 @@
}
},
"node_modules/@babylonjs/materials": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.26.2.tgz",
- "integrity": "sha512-/fp8CxH+frcXaPHL7o2JlDvlHrmU0qKRVy6R+HejofVa8cvMMbZkUZJ9MTZdQZGCeEm58DfDbx4SrVDTZtRp5w==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.29.1.tgz",
+ "integrity": "sha512-bJZPDOfm1IWMMPEUTD416z8/dGpQ3mb0xF543cyEKNuZfiofpvxm6/3jF3SKf9PAVi5+hTgsRI9isCkoVehiYQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.6.0"
}
},
"node_modules/@babylonjs/serializers": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.26.2.tgz",
- "integrity": "sha512-qAyb58bJALeQxomgCBFUky9OPgCKavzUtWgYw5AoKioMkFXKZEvWPvEmAlqCU9ZJfJUsaA4l2EvR3SX8+0I7yQ==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.29.1.tgz",
+ "integrity": "sha512-t7aNW5rh3LXBGeD8KfeEG0s5mzOsqgWHJ+VXQtb9lPkpnSeNj2nl7yY2QuRUuapNITJhvlee2J61CRIdyWNPfg==",
"license": "Apache-2.0",
"peerDependencies": {
"@babylonjs/core": "^8.0.0",
@@ -1904,49 +1904,49 @@
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
},
"node_modules/@bitbybit-dev/babylonjs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.6.tgz",
- "integrity": "sha512-npnhjj3JiAyKgtS5fnuSxnKBPIjIkkWCcIP+6NfFyO1yFk8s68bm1LTkYgBnhCIS51tXIFwJ4WLDmjqHRtw8OA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.7.tgz",
+ "integrity": "sha512-PjjAZj5Ovdj0qHkh6EE89fhWReGBZ7M7ymJrQuVmhVKjLoKWd86Wn1in61JLoCJfwFUDvPw6I3NWn9yETMO62g==",
"license": "MIT",
"dependencies": {
- "@babylonjs/core": "8.26.2",
- "@babylonjs/gui": "8.26.2",
+ "@babylonjs/core": "8.29.1",
+ "@babylonjs/gui": "8.29.1",
"@babylonjs/havok": "1.3.10",
- "@babylonjs/loaders": "8.26.2",
- "@babylonjs/materials": "8.26.2",
- "@babylonjs/serializers": "8.26.2",
- "@bitbybit-dev/core": "0.20.6",
+ "@babylonjs/loaders": "8.29.1",
+ "@babylonjs/materials": "8.29.1",
+ "@babylonjs/serializers": "8.29.1",
+ "@bitbybit-dev/core": "0.20.7",
"earcut": "2.2.3"
}
},
"node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
"node_modules/@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"node_modules/@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -1955,50 +1955,50 @@
}
},
"node_modules/@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"license": "MIT",
"dependencies": {
"manifold-3d": "3.0.0"
}
},
"node_modules/@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"node_modules/@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
@@ -5400,9 +5400,9 @@
}
},
"node_modules/babylonjs-gltf2interface": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.26.2.tgz",
- "integrity": "sha512-ByWxrtoyE0LalDiJ/rtuqy6h3tWApJ42uVNwCNuuBHyHZE6Hh6U1k6LW4uQxeppfXQWvRRGzEpkmlftttAS58Q==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.29.1.tgz",
+ "integrity": "sha512-H3wfdujcU+sEirffc55ucZyaH15+x4q+woem7QuabdcqN18ShPYedcDTl6kyuMjsDF3O6UA0z7VxyG60mA1pJg==",
"license": "Apache-2.0",
"peer": true
},
@@ -18179,14 +18179,14 @@
}
},
"@babylonjs/core": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.26.2.tgz",
- "integrity": "sha512-wzAm6l/StYBIZQdXLrXKg8YmexeQCsLPWgC6K8ypitKnpjuztbEdaXhwvlpLyeE8ammF6ZsQlPzODMfawDwAHg=="
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.29.1.tgz",
+ "integrity": "sha512-hZZjiR1FvfWN/Mg07Bo/pzLKfkGYMCMnPsq1ic5UngAvfeVcNmK70l18/2iQlBrC94uSrMeMtCVY6cPxHWKsgg=="
},
"@babylonjs/gui": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.26.2.tgz",
- "integrity": "sha512-hyT1lyFaYfQBdWdbyFj7H5xlhJOcTxXi8oOMGE3Qqg6Ib2RTiUBQZ+QHf1eNzy29WsW3KOQ4lrYVMm1p/cLVfg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.29.1.tgz",
+ "integrity": "sha512-z115xTfoNc8t2MkDkeTOg+Fk8FdNNMj/EtWYzXnjO2HS3cSixM/ZawA4MgEqhWOvEmODKBJKvFokxPLaPSRZiQ==",
"requires": {}
},
"@babylonjs/havok": {
@@ -18198,21 +18198,21 @@
}
},
"@babylonjs/loaders": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.26.2.tgz",
- "integrity": "sha512-Me/bhbbeqGvuX4+UsIP3p4kmPCBrKB1iZJh1bYG5/bk8VQA0R4teOu5nQ/Y4lfYjdVtfDDm/UfeRPKPv3Pd0Kg==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.29.1.tgz",
+ "integrity": "sha512-tBJv24VAdZW30BYxvwrMERDLHnxBjnC68NrMmb66B9Hs7sEl+e59nluEc2zpSSQVtdY8P8+c9F+LbqqliQLuwA==",
"requires": {}
},
"@babylonjs/materials": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.26.2.tgz",
- "integrity": "sha512-/fp8CxH+frcXaPHL7o2JlDvlHrmU0qKRVy6R+HejofVa8cvMMbZkUZJ9MTZdQZGCeEm58DfDbx4SrVDTZtRp5w==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.29.1.tgz",
+ "integrity": "sha512-bJZPDOfm1IWMMPEUTD416z8/dGpQ3mb0xF543cyEKNuZfiofpvxm6/3jF3SKf9PAVi5+hTgsRI9isCkoVehiYQ==",
"requires": {}
},
"@babylonjs/serializers": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.26.2.tgz",
- "integrity": "sha512-qAyb58bJALeQxomgCBFUky9OPgCKavzUtWgYw5AoKioMkFXKZEvWPvEmAlqCU9ZJfJUsaA4l2EvR3SX8+0I7yQ==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.29.1.tgz",
+ "integrity": "sha512-t7aNW5rh3LXBGeD8KfeEG0s5mzOsqgWHJ+VXQtb9lPkpnSeNj2nl7yY2QuRUuapNITJhvlee2J61CRIdyWNPfg==",
"requires": {}
},
"@bcoe/v8-coverage": {
@@ -18221,45 +18221,45 @@
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
},
"@bitbybit-dev/babylonjs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.6.tgz",
- "integrity": "sha512-npnhjj3JiAyKgtS5fnuSxnKBPIjIkkWCcIP+6NfFyO1yFk8s68bm1LTkYgBnhCIS51tXIFwJ4WLDmjqHRtw8OA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/babylonjs/-/babylonjs-0.20.7.tgz",
+ "integrity": "sha512-PjjAZj5Ovdj0qHkh6EE89fhWReGBZ7M7ymJrQuVmhVKjLoKWd86Wn1in61JLoCJfwFUDvPw6I3NWn9yETMO62g==",
"requires": {
- "@babylonjs/core": "8.26.2",
- "@babylonjs/gui": "8.26.2",
+ "@babylonjs/core": "8.29.1",
+ "@babylonjs/gui": "8.29.1",
"@babylonjs/havok": "1.3.10",
- "@babylonjs/loaders": "8.26.2",
- "@babylonjs/materials": "8.26.2",
- "@babylonjs/serializers": "8.26.2",
- "@bitbybit-dev/core": "0.20.6",
+ "@babylonjs/loaders": "8.29.1",
+ "@babylonjs/materials": "8.29.1",
+ "@babylonjs/serializers": "8.29.1",
+ "@bitbybit-dev/core": "0.20.7",
"earcut": "2.2.3"
}
},
"@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q=="
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g=="
},
"@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
- "requires": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
+ "requires": {
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"requires": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -18268,45 +18268,45 @@
}
},
"@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"requires": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"requires": {
"manifold-3d": "3.0.0"
}
},
"@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"requires": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"requires": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"requires": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
@@ -20738,9 +20738,9 @@
}
},
"babylonjs-gltf2interface": {
- "version": "8.26.2",
- "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.26.2.tgz",
- "integrity": "sha512-ByWxrtoyE0LalDiJ/rtuqy6h3tWApJ42uVNwCNuuBHyHZE6Hh6U1k6LW4uQxeppfXQWvRRGzEpkmlftttAS58Q==",
+ "version": "8.29.1",
+ "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.29.1.tgz",
+ "integrity": "sha512-H3wfdujcU+sEirffc55ucZyaH15+x4q+woem7QuabdcqN18ShPYedcDTl6kyuMjsDF3O6UA0z7VxyG60mA1pJg==",
"peer": true
},
"balanced-match": {
diff --git a/examples/react/babylonjs/laptop-holder/package.json b/examples/react/babylonjs/laptop-holder/package.json
index a2d8a14a..c89410c9 100644
--- a/examples/react/babylonjs/laptop-holder/package.json
+++ b/examples/react/babylonjs/laptop-holder/package.json
@@ -16,7 +16,7 @@
"react-scripts": "5.0.1",
"typescript": "^4.6.2",
"web-vitals": "^2.1.4",
- "@bitbybit-dev/babylonjs": "0.20.6",
+ "@bitbybit-dev/babylonjs": "0.20.7",
"file-loader": "6.2.0",
"@mui/icons-material": "5.6.2",
"@mui/material": "5.6.4",
diff --git a/examples/react/threejs/vase/package-lock.json b/examples/react/threejs/vase/package-lock.json
index d293470f..b7ed0c9a 100644
--- a/examples/react/threejs/vase/package-lock.json
+++ b/examples/react/threejs/vase/package-lock.json
@@ -9,7 +9,7 @@
"version": "0.1.0",
"dependencies": {
"@babel/plugin-proposal-private-property-in-object": "7.21.11",
- "@bitbybit-dev/threejs": "0.20.6",
+ "@bitbybit-dev/threejs": "0.20.7",
"@emotion/react": "11.11.0",
"@emotion/styled": "11.11.0",
"@mui/icons-material": "5.11.16",
@@ -1995,33 +1995,33 @@
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
},
"node_modules/@bitbybit-dev/base": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.6.tgz",
- "integrity": "sha512-JDUekYVTBzuMXFxSYRSN2QK5oFaEx58LIA1DP9wholAIrYP0y0b+zqrIvsWEHFt/ZfG7c3OmxiMqoKYUEEVg2Q==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.7.tgz",
+ "integrity": "sha512-GZ8NhT+I/SQOh0816t6tuQvN05aH0Li8TKwtR+cNKBH+dcgNVqMp6VOcg4Ann6/F2SDiasJspVmAtE78TwCg3g==",
"license": "MIT"
},
"node_modules/@bitbybit-dev/core": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.6.tgz",
- "integrity": "sha512-1vYe7QFm8E13SuvFd65ZOqEEKQz7avLuNWDHGeod4Fbd47XdWoQq4Q5hNGl9Qbe4y4PQkD01RUKTUSDfUt2mqw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.7.tgz",
+ "integrity": "sha512-t6g5Jh9A8bTI6cdyVqjKmyEU/JpToNbqkzPx7iOSLS2gsQ6hsnS3qQFJgL1HX0DejqvVSH9KmAbF7RWUyMyDgA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
- "@bitbybit-dev/jscad-worker": "0.20.6",
- "@bitbybit-dev/manifold-worker": "0.20.6",
- "@bitbybit-dev/occt-worker": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
+ "@bitbybit-dev/jscad-worker": "0.20.7",
+ "@bitbybit-dev/manifold-worker": "0.20.7",
+ "@bitbybit-dev/occt-worker": "0.20.7",
"jsonpath-plus": "10.1.0",
"rxjs": "7.5.5",
"verb-nurbs-web": "2.1.3"
}
},
"node_modules/@bitbybit-dev/jscad": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.6.tgz",
- "integrity": "sha512-VmvqJSJpJQjNP5HrRgQELRmmBlGsqiFdboY4eEeisw0FFgenbosdU7pldBAdLHmlqKQhWvyu03lz/I83U7kxNg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.7.tgz",
+ "integrity": "sha512-WVp6SaSSux7Cd7e1vU+wLwOi6QhqpKyPgQR1lFrnkwy8iv5BdnXwYTCmd7RmY1jYIHc9Xv7QMFWet6VD8F/77w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6",
+ "@bitbybit-dev/base": "0.20.7",
"@jscad/3mf-serializer": "2.1.12",
"@jscad/dxf-serializer": "2.1.18",
"@jscad/io-utils": "2.0.28",
@@ -2030,61 +2030,61 @@
}
},
"node_modules/@bitbybit-dev/jscad-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.6.tgz",
- "integrity": "sha512-Al1ODd7t8ehUZtdq2P2FhNvgo/+KrAtUAJSAWJy58eq522BLyEmWaxcx+7ozQwebPXgT/nuh4Xhiu3zrbOt8bw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.7.tgz",
+ "integrity": "sha512-/iWUVc/QnW5p5V+YcJTW5UXU98Ou1LEexyu21ZTb3yKjB2KZF35RYFjOQ2M5SFUfNnyqWHSJZ6JuXjCAx9sjsw==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/jscad": "0.20.6",
+ "@bitbybit-dev/jscad": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/manifold": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.6.tgz",
- "integrity": "sha512-S9x2SV9kC8Va+JmnIpbE/2xiva8VckdcWCauXK65D1i/QJ+EX8XZxdMtujhVaw5kW60FEhnTEjfwbfh/sjqEAg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.7.tgz",
+ "integrity": "sha512-PbtZhjkmzxDK6zyezIIgQG4GWXxC+S5R+UyNFrFkGA5zkH29e9LKdst+j7+8ElfZQIdEi/Rc+orWAtZo5Wntfw==",
"license": "MIT",
"dependencies": {
"manifold-3d": "3.0.0"
}
},
"node_modules/@bitbybit-dev/manifold-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.6.tgz",
- "integrity": "sha512-9Mvju+3YswNgAju6WyyhZhXzSoDtAB8BUdUZW7EJcl/kBqyPtDsfqr7y175nw/eA4BQRdYUd+s6QIfxpOC8thQ==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.7.tgz",
+ "integrity": "sha512-LbayLKzNclMP75UD1KRQJ201KJkJvd0p+ir3U4CfPQLsKYMPNMq6BwIta8U73ZBqb75IV8yxH1yveGCcf7PzZQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/manifold": "0.20.6",
+ "@bitbybit-dev/manifold": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/occt": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.6.tgz",
- "integrity": "sha512-1+5oFNSmBz8l0Ct0ciSUdoWC6jy1DW24SaCynHhjxz3J7Q1ka0m1G8o6VnFw/Rs/94Zg1+h0p/MOZ/TYV2xNoA==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.7.tgz",
+ "integrity": "sha512-f2dRg4NWhXqX3iLxvXBFOVg0v2oN5ryuvipFPCNhw8BckPKx31TwZKaTA49b/Q7a8lRUoft/nb9WlKGHFrYjoA==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/base": "0.20.6"
+ "@bitbybit-dev/base": "0.20.7"
}
},
"node_modules/@bitbybit-dev/occt-worker": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.6.tgz",
- "integrity": "sha512-rz1TOpSaf8xmp9vDe9fKnp+fAALuzF3tpm7HvenwuP/1xMcvN3YDhdi4Fei/OTMNHDWsSO5RGIA2nVnL7M0KKw==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.7.tgz",
+ "integrity": "sha512-phh+AT3Idj5TOAyflnC+7gakdIFDGkIbctu+9pbKePyuuIq9AVsu6aqvl4475nR8KMJrqM0dXUs6GafhsjlxvQ==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/occt": "0.20.6",
+ "@bitbybit-dev/occt": "0.20.7",
"rxjs": "7.5.5"
}
},
"node_modules/@bitbybit-dev/threejs": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.6.tgz",
- "integrity": "sha512-b7XdWXGmDZM7NhgU5XDErRAwI94VqBL1CDYSOYailnpZOXPp/QNHXZkOSg+zElUMWP8iTYptpzgVoTqmHlxEwg==",
+ "version": "0.20.7",
+ "resolved": "https://registry.npmjs.org/@bitbybit-dev/threejs/-/threejs-0.20.7.tgz",
+ "integrity": "sha512-sa/PHehdMQ/vDsacuvrsD5tkwnAnpviQAEC9Jr+ng2YDswAGGdUc7Gq5ITlxNMx1/9lhuXEwGGDGYIhAHXyj0w==",
"license": "MIT",
"dependencies": {
- "@bitbybit-dev/core": "0.20.6",
- "three": "0.179.1"
+ "@bitbybit-dev/core": "0.20.7",
+ "three": "0.180.0"
}
},
"node_modules/@csstools/normalize.css": {
@@ -17106,9 +17106,10 @@
}
},
"node_modules/three": {
- "version": "0.179.1",
- "resolved": "https://registry.npmjs.org/three/-/three-0.179.1.tgz",
- "integrity": "sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw=="
+ "version": "0.180.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.180.0.tgz",
+ "integrity": "sha512-o+qycAMZrh+TsE01GqWUxUIKR1AL0S8pq7zDkYOQw8GqfX8b8VoCKYUoHbhiX5j+7hr8XsuHDVU6+gkQJQKg9w==",
+ "license": "MIT"
},
"node_modules/throat": {
"version": "6.0.2",
diff --git a/examples/react/threejs/vase/package.json b/examples/react/threejs/vase/package.json
index 64b6421a..6ec5e228 100644
--- a/examples/react/threejs/vase/package.json
+++ b/examples/react/threejs/vase/package.json
@@ -4,7 +4,7 @@
"private": true,
"homepage": "https://app-store.bitbybit.dev/bitbybit-threejs",
"dependencies": {
- "@bitbybit-dev/threejs": "0.20.6",
+ "@bitbybit-dev/threejs": "0.20.7",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "14.0.0",
"@testing-library/user-event": "14.4.3",
diff --git a/examples/runner/babylon/full/inline-include/index.html b/examples/runner/babylon/full/inline-include/index.html
index 012a6be6..c6b83ddc 100644
--- a/examples/runner/babylon/full/inline-include/index.html
+++ b/examples/runner/babylon/full/inline-include/index.html
@@ -34,7 +34,7 @@
// This function simply outputs the script that was exported from the Rete editor by clicking "Export to Runner" and selecting Minify option.
function exportedScript() {
- return '{\"type\":\"rete\",\"version\":\"0.20.6\",\"script\":\"!async function(e,t,s,n,r){let a={};a={x:[0],y:[0],z:[1],...a};const o=[{result:e.HS.executeBasedOnType(a,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let i={};i={text:[\\"[true,false]\\"],...i};const c=[{result:e.HS.executeBasedOnType(i,!1,(e=>t.json.parse(e))),transformers:[]}];let p={};p={text:[\\"[false,true]\\"],...p};const u=[{result:e.HS.executeBasedOnType(p,!1,(e=>t.json.parse(e))),transformers:[]}],l=[{result:[5],transformers:[]}];let d={};d={x:[1],y:[0],z:[0],...d};const m=[{result:e.HS.executeBasedOnType(d,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}],y=[{result:[12],transformers:[]}],S=[{result:[7],transformers:[]}];let H={};H={x:[0],y:[1],z:[0],...H};const f=[{result:e.HS.executeBasedOnType(H,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let h={};h={x:[0],y:[0],z:[1],...h};const x=[{result:e.HS.executeBasedOnType(h,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let v={};v={number:[.4],...v};const O=[{result:e.HS.executeBasedOnType(v,!1,(e=>t.math.number(e))),transformers:[]}];let I={};I={x:[0],y:[0],z:[-1],...I};const L=[{result:e.HS.executeBasedOnType(I,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let B={};B={x:[0],y:[0],z:[-2],...B};const w=[{result:e.HS.executeBasedOnType(B,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let T={};T={x:[0],y:[0],z:[1],...T};const g=[{result:e.HS.executeBasedOnType(T,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let A={};A={x:[0],y:[1.5],z:[0],...A};const E=[{result:e.HS.executeBasedOnType(A,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let b={};b={...{faceOpacity:[.5],edgeOpacity:[.5],edgeColour:[\\"#000000\\"],faceColour:[\\"#212121\\"],vertexColour:[\\"#ff00ff\\"],faceMaterial:[void 0],edgeWidth:[2],vertexSize:[.03],drawEdges:[!0],drawFaces:[!0],drawVertices:[!1],precision:[.02],drawEdgeIndexes:[!1],edgeIndexHeight:[.06],edgeIndexColour:[\\"ff00ff\\"],drawFaceIndexes:[!1],faceIndexHeight:[.06],faceIndexColour:[\\"#0000ff\\"]},...b};const z=[{result:e.HS.executeBasedOnType(b,!1,(e=>t.draw.optionsOcctShape(e))),transformers:[]}];let W={};W={name:[\\"Custom Material\\"],baseColor:[\\"#9c9cba\\"],emissiveColor:[\\"#000000\\"],metallic:[.9],roughness:[.1],alpha:[1],backFaceCulling:[!1],zOffset:[2],...W};const C=[{result:e.HS.executeBasedOnType(W,!1,(e=>t.babylon.material.pbrMetallicRoughness.create(e))),transformers:[]}];let P={};P={x:[0],y:[0],z:[-1],...P};const X=[{result:e.HS.executeBasedOnType(P,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Y={};Y={x:[0],y:[0],z:[-1.5],...Y};const Z=[{result:e.HS.executeBasedOnType(Y,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let N={};N={x:[0],y:[0],z:[1],...N};const k=[{result:e.HS.executeBasedOnType(N,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let M={};M={skybox:[\\"city\\"],size:[1e3],blur:[.4],environmentIntensity:[.4],...M};e.HS.executeBasedOnType(M,!1,(e=>t.babylon.scene.enableSkybox(e)));let F={number:[{result:[20],transformers:[]}]};e.HS.updateListInputs(F),F={number:[20],...F};const D=[{result:e.HS.executeBasedOnType(F,!1,(e=>t.math.number(e))),transformers:[]}];let R={};R.y=y,e.HS.updateListInputs(R),R={x:[0],y:[0],z:[0],...R};const j=[{result:e.HS.executeBasedOnType(R,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let q={};q.item=y,e.HS.updateListInputs(q),q={...q};const V=[{result:q.item}];let G={};G.first=S,e.HS.updateListInputs(G),G={first:[1],second:[-2],operation:[\\"divide\\"],...G};const J=[{result:e.HS.executeBasedOnType(G,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let K={};K.first=S,e.HS.updateListInputs(K),K={first:[1],second:[-4],operation:[\\"divide\\"],...K};const Q=[{result:e.HS.executeBasedOnType(K,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let U={};U.first=y,U.second=O,e.HS.updateListInputs(U),U={first:[1],second:[.4],operation:[\\"add\\"],...U};const $=[{result:e.HS.executeBasedOnType(U,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let _={};_.item=S,e.HS.updateListInputs(_),_={..._};const ee=[{result:_.item}],te={faceOpacity:[1],edgeOpacity:[1],edgeColour:[\\"#1c1c1c\\"],faceColour:[\\"#bdbdbd\\"],vertexColour:[\\"#ff00ff\\"],faceMaterial:[void 0],edgeWidth:[2],vertexSize:[.03],drawEdges:[!0],drawFaces:[!0],drawVertices:[!1],precision:[.01],drawEdgeIndexes:[!1],edgeIndexHeight:[.06],edgeIndexColour:[\\"ff00ff\\"],drawFaceIndexes:[!1],faceIndexHeight:[.06],faceIndexColour:[\\"#0000ff\\"]};let se={};se.faceMaterial=C,e.HS.updateListInputs(se),se={...te,...se};const ne=[{result:e.HS.executeBasedOnType(se,!1,(e=>t.draw.optionsOcctShape(e))),transformers:[]}];let re={};re.center=Z,re.direction=X,e.HS.updateListInputs(re),re={radius:[3],height:[1.9],center:[[0,0,0]],direction:[[0,1,0]],...re};const ae=[{result:await e.HS.executeBasedOnTypeAsync(re,!1,(e=>t.occt.shapes.solid.createCylinder(e))),transformers:[]}];let oe={};oe.y=$,e.HS.updateListInputs(oe),oe={x:[0],y:[12],z:[0],...oe};const ie=[{result:e.HS.executeBasedOnType(oe,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let ce={};ce.first=D,e.HS.updateListInputs(ce),ce={first:[1],second:[3],operation:[\\"multiply\\"],...ce};const pe=[{result:e.HS.executeBasedOnType(ce,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let ue={};ue.first=V,ue.second=O,e.HS.updateListInputs(ue),ue={first:[1],second:[.4],operation:[\\"add\\"],...ue};const le=[{result:e.HS.executeBasedOnType(ue,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let de={};de.first=V,de.second=O,e.HS.updateListInputs(de),de={first:[1],second:[.4],operation:[\\"subtract\\"],...de};const me=[{result:e.HS.executeBasedOnType(de,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let ye={};ye.first=ee,e.HS.updateListInputs(ye),ye={first:[1],second:[-.2],operation:[\\"multiply\\"],...ye};const Se=[{result:e.HS.executeBasedOnType(ye,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let He={};He.second=D,e.HS.updateListInputs(He),He={first:[360],second:[1],operation:[\\"divide\\"],...He};const fe=[{result:e.HS.executeBasedOnType(He,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}],he={shape:[void 0],radius:[.3],radiusList:[void 0],indexes:[void 0]};let xe={};xe.shape=ae,e.HS.updateListInputs(xe),xe={...he,...xe};const ve=[{result:await e.HS.executeBasedOnTypeAsync(xe,!1,(e=>t.occt.fillets.filletEdges(e))),transformers:[]}];let Oe={};Oe.start=L,Oe.end=ie,e.HS.updateListInputs(Oe),Oe={start:[[0,0,0]],end:[[0,1,0]],...Oe};const Ie=[{result:await e.HS.executeBasedOnTypeAsync(Oe,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];let Le={};Le.second=pe,e.HS.updateListInputs(Le),Le={first:[360],second:[1],operation:[\\"divide\\"],...Le};const Be=[{result:e.HS.executeBasedOnType(Le,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let we={};we.start=w,we.end=ie,e.HS.updateListInputs(we),we={start:[[0,0,0]],end:[[0,1,0]],...we};const Te=[{result:await e.HS.executeBasedOnTypeAsync(we,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];let ge={};ge.y=le,e.HS.updateListInputs(ge),ge={x:[0],y:[0],z:[.05],...ge};const Ae=[{result:e.HS.executeBasedOnType(ge,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Ee={};Ee.y=me,Ee.z=Q,e.HS.updateListInputs(Ee),Ee={x:[0],y:[0],z:[-1],...Ee};const be=[{result:e.HS.executeBasedOnType(Ee,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let ze={};ze.y=me,ze.z=J,e.HS.updateListInputs(ze),ze={x:[0],y:[0],z:[0],...ze};const We=[{result:e.HS.executeBasedOnType(ze,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Ce={};Ce.z=Se,e.HS.updateListInputs(Ce),Ce={x:[0],y:[0],z:[0],...Ce};const Pe=[{result:e.HS.executeBasedOnType(Ce,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Xe={};Xe.step=fe,e.HS.updateListInputs(Xe),Xe={step:[.1],min:[0],max:[360],...Xe};const Ye=e.HS.executeBasedOnType(Xe,!1,(e=>t.vector.span(e))),Ze=[];for(let e=0;e<1;e++)Ze.push({type:\\"flat\\"});const Ne=[{result:Ye,transformers:Ze}];let ke={};ke.first=Se,e.HS.updateListInputs(ke),ke={first:[2],second:[-2],operation:[\\"multiply\\"],...ke};e.HS.executeBasedOnType(ke,!1,(e=>t.math.twoNrOperation(e)));let Me={};Me.listElements=ve,e.HS.updateListInputs(Me),Me={...Me};const Fe=[{result:[Me.listElements?Me.listElements:[]]}],De={shape:[void 0],axis:[[0,0,1]],angle:[0]};let Re={};Re.shape=Ie,Re.axis=o,Re.angle=Be,e.HS.updateListInputs(Re),Re={...De,...Re};const je=[{result:await e.HS.executeBasedOnTypeAsync(Re,!1,(e=>t.occt.transforms.rotate(e))),transformers:[]}];let qe={};qe.first=Be,e.HS.updateListInputs(qe),qe={first:[1],second:[.4],operation:[\\"multiply\\"],...qe};const Ve=[{result:e.HS.executeBasedOnType(qe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Ge={};Ge.first=Be,e.HS.updateListInputs(Ge),Ge={first:[1],second:[.6],operation:[\\"multiply\\"],...Ge};const Je=[{result:e.HS.executeBasedOnType(Ge,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Ke={};Ke.listElements=[Ae[0],j[0],be[0],We[0]],e.HS.updateListInputs(Ke),Ke={...Ke};const Qe=[{result:[Ke.listElements?Ke.listElements:[]]}];let Ue={};Ue.item=Ne,e.HS.updateListInputs(Ue),Ue={...Ue};const $e=[{result:Ue.item}],_e={shape:[void 0],nrOfDivisions:[11],removeStartPoint:[!1],removeEndPoint:[!1]};let et={};et.shape=je,et.nrOfDivisions=l,e.HS.updateListInputs(et),et={..._e,...et};const tt=[{result:await e.HS.executeBasedOnTypeAsync(et,!1,(e=>t.occt.shapes.wire.divideWireByEqualDistanceToPoints(e))),transformers:[]}],st={shape:[void 0],axis:[[0,0,1]],angle:[0]};let nt={};nt.shape=Te,nt.axis=o,nt.angle=[Ve[0],Je[0]],e.HS.updateListInputs(nt),nt={...st,...nt};const rt=[{result:await e.HS.executeBasedOnTypeAsync(nt,!1,(e=>t.occt.transforms.rotate(e))),transformers:[]}];let at={};at.number=Ve,e.HS.updateListInputs(at),at={number:[1],operation:[\\"negate\\"],...at};const ot=[{result:e.HS.executeBasedOnType(at,!1,(e=>t.math.oneNrOperation(e))),transformers:[]}],it={points:[void 0]};let ct={};ct.points=Qe,e.HS.updateListInputs(ct),ct={...it,...ct};const pt=[{result:await e.HS.executeBasedOnTypeAsync(ct,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];e.HS.drawNodeMeshes(pt,t);const ut={list:[void 0],pattern:[[!0,!0,!1]]};let lt={};lt.list=tt,lt.pattern=u,e.HS.updateListInputs(lt),lt={...ut,...lt};const dt=[{result:e.HS.executeBasedOnType(lt,!0,(e=>t.lists.getByPattern(e))),transformers:[]}];let mt={};mt.listElements=rt,e.HS.updateListInputs(mt),mt={...mt};const yt=[{result:[mt.listElements?mt.listElements:[]]}],St={shape:[void 0],origin:[[0,0,0]],direction:[[0,0,1]]};let Ht={};Ht.shape=pt,Ht.origin=We,Ht.direction=f,e.HS.updateListInputs(Ht),Ht={...St,...Ht};const ft=[{result:await e.HS.executeBasedOnTypeAsync(Ht,!1,(e=>t.occt.transforms.mirror(e))),transformers:[]}],ht={shape:[void 0]};let xt={};xt.shape=pt,e.HS.updateListInputs(xt),xt={...ht,...xt};const vt=await e.HS.executeBasedOnTypeAsync(xt,!1,(e=>t.occt.shapes.edge.getCornerPointsOfEdgesForShape(e))),Ot=[];for(let e=0;e<1;e++)Ot.push({type:\\"flat\\"});const It=[{result:vt,transformers:Ot}],Lt={list:[void 0],index:[0],clone:[!0]};let Bt={};Bt.list=yt,e.HS.updateListInputs(Bt),Bt={...Lt,...Bt};const wt=[{result:e.HS.executeBasedOnType(Bt,!1,(e=>t.lists.getItem(e))),transformers:[]}],Tt={shape:[void 0]};let gt={};gt.shape=ft,e.HS.updateListInputs(gt),gt={...Tt,...gt};const At=[{result:await e.HS.executeBasedOnTypeAsync(gt,!1,(e=>t.occt.shapes.edge.getCornerPointsOfEdgesForShape(e))),transformers:[]}],Et={shape:[void 0],nrOfDivisions:[11],removeStartPoint:[!1],removeEndPoint:[!1]};let bt={};bt.shape=wt,bt.nrOfDivisions=l,e.HS.updateListInputs(bt),bt={...Et,...bt};const zt=[{result:await e.HS.executeBasedOnTypeAsync(bt,!1,(e=>t.occt.shapes.wire.divideWireByEqualDistanceToPoints(e))),transformers:[]}],Wt={list:[void 0],index:[3],clone:[!0]};let Ct={};Ct.list=At,e.HS.updateListInputs(Ct),Ct={...Wt,...Ct};const Pt=[{result:e.HS.executeBasedOnType(Ct,!1,(e=>t.lists.removeItemAtIndex(e))),transformers:[]}],Xt={list:[void 0],pattern:[[!0,!0,!1]]};let Yt={};Yt.list=zt,Yt.pattern=c,e.HS.updateListInputs(Yt),Yt={...Xt,...Yt};const Zt=[{result:e.HS.executeBasedOnType(Yt,!1,(e=>t.lists.getByPattern(e))),transformers:[]}],Nt={list:[void 0],clone:[!0]};let kt={};kt.list=Pt,e.HS.updateListInputs(kt),kt={...Nt,...kt};const Mt=e.HS.executeBasedOnType(kt,!1,(e=>t.lists.reverse(e))),Ft=[];for(let e=0;e<1;e++)Ft.push({type:\\"flat\\"});const Dt=[{result:Mt,transformers:Ft}];let Rt={};Rt.listElements=[Zt[0],dt[0]],e.HS.updateListInputs(Rt),Rt={...Rt};const jt=[{result:[Rt.listElements?Rt.listElements:[]]}];let qt={};qt.listElements=[It[0],Dt[0]],e.HS.updateListInputs(qt),qt={...qt};const Vt=[{result:[qt.listElements?qt.listElements:[]]}],Gt={list:[void 0],clone:[!0]};let Jt={};Jt.list=jt,e.HS.updateListInputs(Jt),Jt={...Gt,...Jt};const Kt=e.HS.executeBasedOnType(Jt,!1,(e=>t.lists.flipLists(e))),Qt=[];for(let e=0;e<2;e++)Qt.push({type:\\"flat\\"});const Ut=[{result:Kt,transformers:Qt}],$t={points:[void 0]};let _t={};_t.points=Vt,e.HS.updateListInputs(_t),_t={...$t,..._t};const es=[{result:await e.HS.executeBasedOnTypeAsync(_t,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];let ts={};ts.listElements=Ut,e.HS.updateListInputs(ts),ts={...ts};const ss=[{result:[ts.listElements?ts.listElements:[]]}],ns={shape:[void 0],radius:[.3],radiusList:[void 0],indexes:[void 0]};let rs={};rs.shape=es,e.HS.updateListInputs(rs),rs={...ns,...rs};const as=[{result:await e.HS.executeBasedOnTypeAsync(rs,!1,(e=>t.occt.fillets.fillet2d(e))),transformers:[]}],os={points:[void 0]};let is={};is.points=ss,e.HS.updateListInputs(is),is={...os,...is};const cs=[{result:await e.HS.executeBasedOnTypeAsync(is,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}],ps={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let us={};us.shape=as,us.direction=x,e.HS.updateListInputs(us),us={...ps,...us};const ls=[{result:await e.HS.executeBasedOnTypeAsync(us,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],ds={shape:[void 0]};let ms={};ms.shape=as,e.HS.updateListInputs(ms),ms={...ds,...ms};const ys=[{result:await e.HS.executeBasedOnTypeAsync(ms,!1,(e=>t.occt.shapes.wire.startPointOnWire(e))),transformers:[]}],Ss={shape:[void 0]};let Hs={};Hs.shape=as,e.HS.updateListInputs(Hs),Hs={...Ss,...Hs};const fs=[{result:await e.HS.executeBasedOnTypeAsync(Hs,!1,(e=>t.occt.shapes.wire.endPointOnWire(e))),transformers:[]}],hs={shape:[void 0]};let xs={};xs.shape=as,e.HS.updateListInputs(xs),xs={...hs,...xs};const vs=[{result:await e.HS.executeBasedOnTypeAsync(xs,!1,(e=>t.occt.shapes.wire.closeOpenWire(e))),transformers:[]}],Os={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let Is={};Is.shape=vs,Is.direction=x,e.HS.updateListInputs(Is),Is={...Os,...Is};const Ls=[{result:await e.HS.executeBasedOnTypeAsync(Is,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],Bs={shape:[void 0],radius:[1],radiusList:[void 0],indexes:[void 0],direction:[[0,1,0]]};let ws={};ws.shape=cs,ws.direction=g,e.HS.updateListInputs(ws),ws={...Bs,...ws};const Ts=[{result:await e.HS.executeBasedOnTypeAsync(ws,!1,(e=>t.occt.fillets.fillet3DWire(e))),transformers:[]}],gs={shape:[void 0],face:[void 0],distance:[-.2],tolerance:[.1]};let As={};As.shape=ls,e.HS.updateListInputs(As),As={...gs,...As};const Es=[{result:await e.HS.executeBasedOnTypeAsync(As,!1,(e=>t.occt.operations.offset(e))),transformers:[]}],bs={shape:[void 0],index:[0]};let zs={};zs.shape=ls,e.HS.updateListInputs(zs),zs={...bs,...zs};const Ws=[{result:await e.HS.executeBasedOnTypeAsync(zs,!1,(e=>t.occt.shapes.wire.getWire(e))),transformers:[]}];let Cs={};Cs.item=ys,e.HS.updateListInputs(Cs),Cs={...Cs};const Ps=[{result:Cs.item}];let Xs={};Xs.item=fs,e.HS.updateListInputs(Xs),Xs={...Xs};const Ys=[{result:Xs.item}];let Zs={};Zs.start=fs,Zs.end=ys,e.HS.updateListInputs(Zs),Zs={start:[[0,0,0]],end:[[0,1,0]],...Zs};const Ns=[{result:await e.HS.executeBasedOnTypeAsync(Zs,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];e.HS.drawNodeMeshes(Ns,t);const ks={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let Ms={};Ms.shape=Ts,Ms.angle=ot,Ms.direction=o,e.HS.updateListInputs(Ms),Ms={...ks,...Ms};const Fs=[{result:await e.HS.executeBasedOnTypeAsync(Ms,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],Ds={shape:[void 0]};let Rs={};Rs.shape=Ls,e.HS.updateListInputs(Rs),Rs={...Ds,...Rs};const js=[{result:await e.HS.executeBasedOnTypeAsync(Rs,!1,(e=>t.occt.shapes.solid.fromClosedShell(e))),transformers:[]}],qs={shape:[void 0],index:[1]};let Vs={};Vs.shape=Ws,e.HS.updateListInputs(Vs),Vs={...qs,...Vs};const Gs=[{result:await e.HS.executeBasedOnTypeAsync(Vs,!1,(e=>t.occt.shapes.edge.getEdge(e))),transformers:[]}],Js={shape:[void 0],index:[0]};let Ks={};Ks.shape=Es,e.HS.updateListInputs(Ks),Ks={...Js,...Ks};const Qs=[{result:await e.HS.executeBasedOnTypeAsync(Ks,!1,(e=>t.occt.shapes.wire.getWire(e))),transformers:[]}],Us={shape:[void 0],translation:[[0,0,0]]};let $s={};$s.shape=Ns,$s.translation=E,e.HS.updateListInputs($s),$s={...Us,...$s};const _s=[{result:await e.HS.executeBasedOnTypeAsync($s,!1,(e=>t.occt.transforms.translate(e))),transformers:[]}],en={shape:[void 0],direction:[[0,1,0]]};let tn={};tn.shape=Fs,tn.direction=Pe,e.HS.updateListInputs(tn),tn={...en,...tn};const sn=[{result:await e.HS.executeBasedOnTypeAsync(tn,!1,(e=>t.occt.operations.extrude(e))),transformers:[]}];let nn={};nn.listElements=js,e.HS.updateListInputs(nn),nn={...nn};const rn=[{result:[nn.listElements?nn.listElements:[]]}],an={shape:[void 0],index:[1]};let on={};on.shape=Qs,e.HS.updateListInputs(on),on={...an,...on};const cn=[{result:await e.HS.executeBasedOnTypeAsync(on,!1,(e=>t.occt.shapes.edge.getEdge(e))),transformers:[]}];let pn={};pn.listElements=Gs,e.HS.updateListInputs(pn),pn={...pn};const un=[{result:[pn.listElements?pn.listElements:[]]}],ln={shape:[void 0]};let dn={};dn.shape=_s,e.HS.updateListInputs(dn),dn={...ln,...dn};const mn=[{result:await e.HS.executeBasedOnTypeAsync(dn,!1,(e=>t.occt.shapes.wire.startPointOnWire(e))),transformers:[]}],yn={shape:[void 0]};let Sn={};Sn.shape=_s,e.HS.updateListInputs(Sn),Sn={...yn,...Sn};const Hn=[{result:await e.HS.executeBasedOnTypeAsync(Sn,!1,(e=>t.occt.shapes.wire.endPointOnWire(e))),transformers:[]}],fn={shapes:[void 0]};let hn={};hn.shapes=un,e.HS.updateListInputs(hn),hn={...fn,...hn};const xn=[{result:await e.HS.executeBasedOnTypeAsync(hn,!1,(e=>t.occt.shapes.wire.combineEdgesAndWiresIntoAWire(e))),transformers:[]}];let vn={};vn.listElements=cn,e.HS.updateListInputs(vn),vn={...vn};const On=[{result:[vn.listElements?vn.listElements:[]]}],In={shape:[void 0],shapes:[void 0],keepEdges:[!1]};let Ln={};Ln.shape=sn,Ln.shapes=Fe,e.HS.updateListInputs(Ln),Ln={...In,...Ln};const Bn=[{result:await e.HS.executeBasedOnTypeAsync(Ln,!1,(e=>t.occt.booleans.difference(e))),transformers:[]}];let wn={};wn.item=Hn,e.HS.updateListInputs(wn),wn={...wn};const Tn=[{result:wn.item}];let gn={};gn.item=mn,e.HS.updateListInputs(gn),gn={...gn};const An=[{result:gn.item}],En={shape:[void 0],shapes:[void 0],keepEdges:[!1]};let bn={};bn.shape=Bn,bn.shapes=rn,e.HS.updateListInputs(bn),bn={...En,...bn};const zn=[{result:await e.HS.executeBasedOnTypeAsync(bn,!1,(e=>t.occt.booleans.difference(e))),transformers:[]}],Wn={shapes:[void 0]};let Cn={};Cn.shapes=On,e.HS.updateListInputs(Cn),Cn={...Wn,...Cn};const Pn=[{result:await e.HS.executeBasedOnTypeAsync(Cn,!1,(e=>t.occt.shapes.wire.combineEdgesAndWiresIntoAWire(e))),transformers:[]}];let Xn={};Xn.listElements=[Ps[0],Tn[0],An[0],Ys[0]],e.HS.updateListInputs(Xn),Xn={...Xn};const Yn=[{result:[Xn.listElements?Xn.listElements:[]]}],Zn={shape:[void 0],origin:[[0,0,0]],normal:[[0,0,1]]};let Nn={};Nn.shape=zn,Nn.normal=m,e.HS.updateListInputs(Nn),Nn={...Zn,...Nn};const kn=[{result:await e.HS.executeBasedOnTypeAsync(Nn,!1,(e=>t.occt.transforms.mirrorAlongNormal(e))),transformers:[]}];let Mn={};Mn.listElements=[xn[0],Pn[0]],e.HS.updateListInputs(Mn),Mn={...Mn};const Fn=[{result:[Mn.listElements?Mn.listElements:[]]}],Dn={points:[void 0]};let Rn={};Rn.points=Yn,e.HS.updateListInputs(Rn),Rn={...Dn,...Rn};const jn=[{result:await e.HS.executeBasedOnTypeAsync(Rn,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];let qn={};qn.listElements=[kn[0],zn[0]],e.HS.updateListInputs(qn),qn={...qn};const Vn=[{result:[qn.listElements?qn.listElements:[]]}],Gn={shapes:[void 0],makeSolid:[!1]};let Jn={};Jn.shapes=Fn,e.HS.updateListInputs(Jn),Jn={...Gn,...Jn};const Kn=[{result:await e.HS.executeBasedOnTypeAsync(Jn,!1,(e=>t.occt.operations.loft(e))),transformers:[]}],Qn={shape:[void 0],radius:[.5],radiusList:[void 0],indexes:[void 0]};let Un={};Un.shape=jn,e.HS.updateListInputs(Un),Un={...Qn,...Un};const $n=[{result:await e.HS.executeBasedOnTypeAsync(Un,!1,(e=>t.occt.fillets.fillet2d(e))),transformers:[]}],_n={shapes:[void 0]};let er={};er.shapes=Vn,e.HS.updateListInputs(er),er={..._n,...er};const tr=[{result:await e.HS.executeBasedOnTypeAsync(er,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}],sr={shape:[void 0],origin:[[0,0,0]],direction:[[0,0,1]]};let nr={};nr.shape=Kn,nr.origin=We,nr.direction=f,e.HS.updateListInputs(nr),nr={...sr,...nr};const rr=[{result:await e.HS.executeBasedOnTypeAsync(nr,!1,(e=>t.occt.transforms.mirror(e))),transformers:[]}],ar={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let or={};or.shape=$n,or.direction=x,e.HS.updateListInputs(or),or={...ar,...or};const ir=[{result:await e.HS.executeBasedOnTypeAsync(or,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}];let cr={};cr.listElements=[ls[0],Es[0],Kn[0],rr[0]],e.HS.updateListInputs(cr),cr={...cr};const pr=[{result:[cr.listElements?cr.listElements:[]]}],ur={shape:[void 0],offset:[-.1]};let lr={};lr.shape=ir,e.HS.updateListInputs(lr),lr={...ur,...lr};const dr=[{result:await e.HS.executeBasedOnTypeAsync(lr,!1,(e=>t.occt.operations.makeThickSolidSimple(e))),transformers:[]}],mr={shape:[void 0],angle:[0],center:[[0,0,0]],axis:[[0,0,1]]};let yr={};yr.shape=tr,yr.angle=$e,yr.axis=k,e.HS.updateListInputs(yr),yr={...mr,...yr};const Sr=[{result:await e.HS.executeBasedOnTypeAsync(yr,!1,(e=>t.occt.transforms.rotateAroundCenter(e))),transformers:[]}],Hr={shapes:[void 0],tolerance:[1e-7]};let fr={};fr.shapes=pr,e.HS.updateListInputs(fr),fr={...Hr,...fr};const hr=[{result:await e.HS.executeBasedOnTypeAsync(fr,!1,(e=>t.occt.shapes.shell.sewFaces(e))),transformers:[]}],xr={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let vr={};vr.entity=dr,vr.options=z,e.HS.updateListInputs(vr),vr={...xr,...vr};await e.HS.executeBasedOnTypeAsync(vr,!1,(e=>t.draw.drawAnyAsync(e)));let Or={};Or.listElements=Sr,e.HS.updateListInputs(Or),Or={...Or};const Ir=[{result:[Or.listElements?Or.listElements:[]]}],Lr={shapes:[void 0]};let Br={};Br.shapes=Ir,e.HS.updateListInputs(Br),Br={...Lr,...Br};const wr=[{result:await e.HS.executeBasedOnTypeAsync(Br,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}];let Tr={};Tr.listElements=[hr[0],ve[0],wr[0]],e.HS.updateListInputs(Tr),Tr={...Tr};const gr=[{result:[Tr.listElements?Tr.listElements:[]]}],Ar={shapes:[void 0]};let Er={};Er.shapes=gr,e.HS.updateListInputs(Er),Er={...Ar,...Er};const br=[{result:await e.HS.executeBasedOnTypeAsync(Er,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}],zr={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let Wr={};Wr.entity=br,Wr.options=ne,e.HS.updateListInputs(Wr),Wr={...zr,...Wr};await e.HS.executeBasedOnTypeAsync(Wr,!1,(e=>t.draw.drawAnyAsync(e)))}(BitByBit,bitbybit,bitbybitRunnerResult,bitbybitRunnerInputs,Bit);\"}'
+ return '{\"type\":\"rete\",\"version\":\"0.20.7\",\"script\":\"!async function(e,t,s,n,r){let a={};a={x:[0],y:[0],z:[1],...a};const o=[{result:e.HS.executeBasedOnType(a,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let i={};i={text:[\\"[true,false]\\"],...i};const c=[{result:e.HS.executeBasedOnType(i,!1,(e=>t.json.parse(e))),transformers:[]}];let p={};p={text:[\\"[false,true]\\"],...p};const u=[{result:e.HS.executeBasedOnType(p,!1,(e=>t.json.parse(e))),transformers:[]}],l=[{result:[5],transformers:[]}];let d={};d={x:[1],y:[0],z:[0],...d};const m=[{result:e.HS.executeBasedOnType(d,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}],y=[{result:[12],transformers:[]}],S=[{result:[7],transformers:[]}];let H={};H={x:[0],y:[1],z:[0],...H};const f=[{result:e.HS.executeBasedOnType(H,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let h={};h={x:[0],y:[0],z:[1],...h};const x=[{result:e.HS.executeBasedOnType(h,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let v={};v={number:[.4],...v};const O=[{result:e.HS.executeBasedOnType(v,!1,(e=>t.math.number(e))),transformers:[]}];let I={};I={x:[0],y:[0],z:[-1],...I};const L=[{result:e.HS.executeBasedOnType(I,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let B={};B={x:[0],y:[0],z:[-2],...B};const w=[{result:e.HS.executeBasedOnType(B,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let T={};T={x:[0],y:[0],z:[1],...T};const g=[{result:e.HS.executeBasedOnType(T,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let A={};A={x:[0],y:[1.5],z:[0],...A};const E=[{result:e.HS.executeBasedOnType(A,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let b={};b={...{faceOpacity:[.5],edgeOpacity:[.5],edgeColour:[\\"#000000\\"],faceColour:[\\"#212121\\"],vertexColour:[\\"#ff00ff\\"],faceMaterial:[void 0],edgeWidth:[2],vertexSize:[.03],drawEdges:[!0],drawFaces:[!0],drawVertices:[!1],precision:[.02],drawEdgeIndexes:[!1],edgeIndexHeight:[.06],edgeIndexColour:[\\"ff00ff\\"],drawFaceIndexes:[!1],faceIndexHeight:[.06],faceIndexColour:[\\"#0000ff\\"]},...b};const z=[{result:e.HS.executeBasedOnType(b,!1,(e=>t.draw.optionsOcctShape(e))),transformers:[]}];let W={};W={name:[\\"Custom Material\\"],baseColor:[\\"#9c9cba\\"],emissiveColor:[\\"#000000\\"],metallic:[.9],roughness:[.1],alpha:[1],backFaceCulling:[!1],zOffset:[2],...W};const C=[{result:e.HS.executeBasedOnType(W,!1,(e=>t.babylon.material.pbrMetallicRoughness.create(e))),transformers:[]}];let P={};P={x:[0],y:[0],z:[-1],...P};const X=[{result:e.HS.executeBasedOnType(P,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Y={};Y={x:[0],y:[0],z:[-1.5],...Y};const Z=[{result:e.HS.executeBasedOnType(Y,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let N={};N={x:[0],y:[0],z:[1],...N};const k=[{result:e.HS.executeBasedOnType(N,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let M={};M={skybox:[\\"city\\"],size:[1e3],blur:[.4],environmentIntensity:[.4],...M};e.HS.executeBasedOnType(M,!1,(e=>t.babylon.scene.enableSkybox(e)));let F={number:[{result:[20],transformers:[]}]};e.HS.updateListInputs(F),F={number:[20],...F};const D=[{result:e.HS.executeBasedOnType(F,!1,(e=>t.math.number(e))),transformers:[]}];let R={};R.y=y,e.HS.updateListInputs(R),R={x:[0],y:[0],z:[0],...R};const j=[{result:e.HS.executeBasedOnType(R,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let q={};q.item=y,e.HS.updateListInputs(q),q={...q};const V=[{result:q.item}];let G={};G.first=S,e.HS.updateListInputs(G),G={first:[1],second:[-2],operation:[\\"divide\\"],...G};const J=[{result:e.HS.executeBasedOnType(G,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let K={};K.first=S,e.HS.updateListInputs(K),K={first:[1],second:[-4],operation:[\\"divide\\"],...K};const Q=[{result:e.HS.executeBasedOnType(K,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let U={};U.first=y,U.second=O,e.HS.updateListInputs(U),U={first:[1],second:[.4],operation:[\\"add\\"],...U};const $=[{result:e.HS.executeBasedOnType(U,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let _={};_.item=S,e.HS.updateListInputs(_),_={..._};const ee=[{result:_.item}],te={faceOpacity:[1],edgeOpacity:[1],edgeColour:[\\"#1c1c1c\\"],faceColour:[\\"#bdbdbd\\"],vertexColour:[\\"#ff00ff\\"],faceMaterial:[void 0],edgeWidth:[2],vertexSize:[.03],drawEdges:[!0],drawFaces:[!0],drawVertices:[!1],precision:[.01],drawEdgeIndexes:[!1],edgeIndexHeight:[.06],edgeIndexColour:[\\"ff00ff\\"],drawFaceIndexes:[!1],faceIndexHeight:[.06],faceIndexColour:[\\"#0000ff\\"]};let se={};se.faceMaterial=C,e.HS.updateListInputs(se),se={...te,...se};const ne=[{result:e.HS.executeBasedOnType(se,!1,(e=>t.draw.optionsOcctShape(e))),transformers:[]}];let re={};re.center=Z,re.direction=X,e.HS.updateListInputs(re),re={radius:[3],height:[1.9],center:[[0,0,0]],direction:[[0,1,0]],...re};const ae=[{result:await e.HS.executeBasedOnTypeAsync(re,!1,(e=>t.occt.shapes.solid.createCylinder(e))),transformers:[]}];let oe={};oe.y=$,e.HS.updateListInputs(oe),oe={x:[0],y:[12],z:[0],...oe};const ie=[{result:e.HS.executeBasedOnType(oe,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let ce={};ce.first=D,e.HS.updateListInputs(ce),ce={first:[1],second:[3],operation:[\\"multiply\\"],...ce};const pe=[{result:e.HS.executeBasedOnType(ce,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let ue={};ue.first=V,ue.second=O,e.HS.updateListInputs(ue),ue={first:[1],second:[.4],operation:[\\"add\\"],...ue};const le=[{result:e.HS.executeBasedOnType(ue,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let de={};de.first=V,de.second=O,e.HS.updateListInputs(de),de={first:[1],second:[.4],operation:[\\"subtract\\"],...de};const me=[{result:e.HS.executeBasedOnType(de,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let ye={};ye.first=ee,e.HS.updateListInputs(ye),ye={first:[1],second:[-.2],operation:[\\"multiply\\"],...ye};const Se=[{result:e.HS.executeBasedOnType(ye,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let He={};He.second=D,e.HS.updateListInputs(He),He={first:[360],second:[1],operation:[\\"divide\\"],...He};const fe=[{result:e.HS.executeBasedOnType(He,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}],he={shape:[void 0],radius:[.3],radiusList:[void 0],indexes:[void 0]};let xe={};xe.shape=ae,e.HS.updateListInputs(xe),xe={...he,...xe};const ve=[{result:await e.HS.executeBasedOnTypeAsync(xe,!1,(e=>t.occt.fillets.filletEdges(e))),transformers:[]}];let Oe={};Oe.start=L,Oe.end=ie,e.HS.updateListInputs(Oe),Oe={start:[[0,0,0]],end:[[0,1,0]],...Oe};const Ie=[{result:await e.HS.executeBasedOnTypeAsync(Oe,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];let Le={};Le.second=pe,e.HS.updateListInputs(Le),Le={first:[360],second:[1],operation:[\\"divide\\"],...Le};const Be=[{result:e.HS.executeBasedOnType(Le,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let we={};we.start=w,we.end=ie,e.HS.updateListInputs(we),we={start:[[0,0,0]],end:[[0,1,0]],...we};const Te=[{result:await e.HS.executeBasedOnTypeAsync(we,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];let ge={};ge.y=le,e.HS.updateListInputs(ge),ge={x:[0],y:[0],z:[.05],...ge};const Ae=[{result:e.HS.executeBasedOnType(ge,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Ee={};Ee.y=me,Ee.z=Q,e.HS.updateListInputs(Ee),Ee={x:[0],y:[0],z:[-1],...Ee};const be=[{result:e.HS.executeBasedOnType(Ee,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let ze={};ze.y=me,ze.z=J,e.HS.updateListInputs(ze),ze={x:[0],y:[0],z:[0],...ze};const We=[{result:e.HS.executeBasedOnType(ze,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Ce={};Ce.z=Se,e.HS.updateListInputs(Ce),Ce={x:[0],y:[0],z:[0],...Ce};const Pe=[{result:e.HS.executeBasedOnType(Ce,!1,(e=>t.vector.vectorXYZ(e))),transformers:[]}];let Xe={};Xe.step=fe,e.HS.updateListInputs(Xe),Xe={step:[.1],min:[0],max:[360],...Xe};const Ye=e.HS.executeBasedOnType(Xe,!1,(e=>t.vector.span(e))),Ze=[];for(let e=0;e<1;e++)Ze.push({type:\\"flat\\"});const Ne=[{result:Ye,transformers:Ze}];let ke={};ke.first=Se,e.HS.updateListInputs(ke),ke={first:[2],second:[-2],operation:[\\"multiply\\"],...ke};e.HS.executeBasedOnType(ke,!1,(e=>t.math.twoNrOperation(e)));let Me={};Me.listElements=ve,e.HS.updateListInputs(Me),Me={...Me};const Fe=[{result:[Me.listElements?Me.listElements:[]]}],De={shape:[void 0],axis:[[0,0,1]],angle:[0]};let Re={};Re.shape=Ie,Re.axis=o,Re.angle=Be,e.HS.updateListInputs(Re),Re={...De,...Re};const je=[{result:await e.HS.executeBasedOnTypeAsync(Re,!1,(e=>t.occt.transforms.rotate(e))),transformers:[]}];let qe={};qe.first=Be,e.HS.updateListInputs(qe),qe={first:[1],second:[.4],operation:[\\"multiply\\"],...qe};const Ve=[{result:e.HS.executeBasedOnType(qe,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Ge={};Ge.first=Be,e.HS.updateListInputs(Ge),Ge={first:[1],second:[.6],operation:[\\"multiply\\"],...Ge};const Je=[{result:e.HS.executeBasedOnType(Ge,!1,(e=>t.math.twoNrOperation(e))),transformers:[]}];let Ke={};Ke.listElements=[Ae[0],j[0],be[0],We[0]],e.HS.updateListInputs(Ke),Ke={...Ke};const Qe=[{result:[Ke.listElements?Ke.listElements:[]]}];let Ue={};Ue.item=Ne,e.HS.updateListInputs(Ue),Ue={...Ue};const $e=[{result:Ue.item}],_e={shape:[void 0],nrOfDivisions:[11],removeStartPoint:[!1],removeEndPoint:[!1]};let et={};et.shape=je,et.nrOfDivisions=l,e.HS.updateListInputs(et),et={..._e,...et};const tt=[{result:await e.HS.executeBasedOnTypeAsync(et,!1,(e=>t.occt.shapes.wire.divideWireByEqualDistanceToPoints(e))),transformers:[]}],st={shape:[void 0],axis:[[0,0,1]],angle:[0]};let nt={};nt.shape=Te,nt.axis=o,nt.angle=[Ve[0],Je[0]],e.HS.updateListInputs(nt),nt={...st,...nt};const rt=[{result:await e.HS.executeBasedOnTypeAsync(nt,!1,(e=>t.occt.transforms.rotate(e))),transformers:[]}];let at={};at.number=Ve,e.HS.updateListInputs(at),at={number:[1],operation:[\\"negate\\"],...at};const ot=[{result:e.HS.executeBasedOnType(at,!1,(e=>t.math.oneNrOperation(e))),transformers:[]}],it={points:[void 0]};let ct={};ct.points=Qe,e.HS.updateListInputs(ct),ct={...it,...ct};const pt=[{result:await e.HS.executeBasedOnTypeAsync(ct,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];e.HS.drawNodeMeshes(pt,t);const ut={list:[void 0],pattern:[[!0,!0,!1]]};let lt={};lt.list=tt,lt.pattern=u,e.HS.updateListInputs(lt),lt={...ut,...lt};const dt=[{result:e.HS.executeBasedOnType(lt,!0,(e=>t.lists.getByPattern(e))),transformers:[]}];let mt={};mt.listElements=rt,e.HS.updateListInputs(mt),mt={...mt};const yt=[{result:[mt.listElements?mt.listElements:[]]}],St={shape:[void 0],origin:[[0,0,0]],direction:[[0,0,1]]};let Ht={};Ht.shape=pt,Ht.origin=We,Ht.direction=f,e.HS.updateListInputs(Ht),Ht={...St,...Ht};const ft=[{result:await e.HS.executeBasedOnTypeAsync(Ht,!1,(e=>t.occt.transforms.mirror(e))),transformers:[]}],ht={shape:[void 0]};let xt={};xt.shape=pt,e.HS.updateListInputs(xt),xt={...ht,...xt};const vt=await e.HS.executeBasedOnTypeAsync(xt,!1,(e=>t.occt.shapes.edge.getCornerPointsOfEdgesForShape(e))),Ot=[];for(let e=0;e<1;e++)Ot.push({type:\\"flat\\"});const It=[{result:vt,transformers:Ot}],Lt={list:[void 0],index:[0],clone:[!0]};let Bt={};Bt.list=yt,e.HS.updateListInputs(Bt),Bt={...Lt,...Bt};const wt=[{result:e.HS.executeBasedOnType(Bt,!1,(e=>t.lists.getItem(e))),transformers:[]}],Tt={shape:[void 0]};let gt={};gt.shape=ft,e.HS.updateListInputs(gt),gt={...Tt,...gt};const At=[{result:await e.HS.executeBasedOnTypeAsync(gt,!1,(e=>t.occt.shapes.edge.getCornerPointsOfEdgesForShape(e))),transformers:[]}],Et={shape:[void 0],nrOfDivisions:[11],removeStartPoint:[!1],removeEndPoint:[!1]};let bt={};bt.shape=wt,bt.nrOfDivisions=l,e.HS.updateListInputs(bt),bt={...Et,...bt};const zt=[{result:await e.HS.executeBasedOnTypeAsync(bt,!1,(e=>t.occt.shapes.wire.divideWireByEqualDistanceToPoints(e))),transformers:[]}],Wt={list:[void 0],index:[3],clone:[!0]};let Ct={};Ct.list=At,e.HS.updateListInputs(Ct),Ct={...Wt,...Ct};const Pt=[{result:e.HS.executeBasedOnType(Ct,!1,(e=>t.lists.removeItemAtIndex(e))),transformers:[]}],Xt={list:[void 0],pattern:[[!0,!0,!1]]};let Yt={};Yt.list=zt,Yt.pattern=c,e.HS.updateListInputs(Yt),Yt={...Xt,...Yt};const Zt=[{result:e.HS.executeBasedOnType(Yt,!1,(e=>t.lists.getByPattern(e))),transformers:[]}],Nt={list:[void 0],clone:[!0]};let kt={};kt.list=Pt,e.HS.updateListInputs(kt),kt={...Nt,...kt};const Mt=e.HS.executeBasedOnType(kt,!1,(e=>t.lists.reverse(e))),Ft=[];for(let e=0;e<1;e++)Ft.push({type:\\"flat\\"});const Dt=[{result:Mt,transformers:Ft}];let Rt={};Rt.listElements=[Zt[0],dt[0]],e.HS.updateListInputs(Rt),Rt={...Rt};const jt=[{result:[Rt.listElements?Rt.listElements:[]]}];let qt={};qt.listElements=[It[0],Dt[0]],e.HS.updateListInputs(qt),qt={...qt};const Vt=[{result:[qt.listElements?qt.listElements:[]]}],Gt={list:[void 0],clone:[!0]};let Jt={};Jt.list=jt,e.HS.updateListInputs(Jt),Jt={...Gt,...Jt};const Kt=e.HS.executeBasedOnType(Jt,!1,(e=>t.lists.flipLists(e))),Qt=[];for(let e=0;e<2;e++)Qt.push({type:\\"flat\\"});const Ut=[{result:Kt,transformers:Qt}],$t={points:[void 0]};let _t={};_t.points=Vt,e.HS.updateListInputs(_t),_t={...$t,..._t};const es=[{result:await e.HS.executeBasedOnTypeAsync(_t,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];let ts={};ts.listElements=Ut,e.HS.updateListInputs(ts),ts={...ts};const ss=[{result:[ts.listElements?ts.listElements:[]]}],ns={shape:[void 0],radius:[.3],radiusList:[void 0],indexes:[void 0]};let rs={};rs.shape=es,e.HS.updateListInputs(rs),rs={...ns,...rs};const as=[{result:await e.HS.executeBasedOnTypeAsync(rs,!1,(e=>t.occt.fillets.fillet2d(e))),transformers:[]}],os={points:[void 0]};let is={};is.points=ss,e.HS.updateListInputs(is),is={...os,...is};const cs=[{result:await e.HS.executeBasedOnTypeAsync(is,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}],ps={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let us={};us.shape=as,us.direction=x,e.HS.updateListInputs(us),us={...ps,...us};const ls=[{result:await e.HS.executeBasedOnTypeAsync(us,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],ds={shape:[void 0]};let ms={};ms.shape=as,e.HS.updateListInputs(ms),ms={...ds,...ms};const ys=[{result:await e.HS.executeBasedOnTypeAsync(ms,!1,(e=>t.occt.shapes.wire.startPointOnWire(e))),transformers:[]}],Ss={shape:[void 0]};let Hs={};Hs.shape=as,e.HS.updateListInputs(Hs),Hs={...Ss,...Hs};const fs=[{result:await e.HS.executeBasedOnTypeAsync(Hs,!1,(e=>t.occt.shapes.wire.endPointOnWire(e))),transformers:[]}],hs={shape:[void 0]};let xs={};xs.shape=as,e.HS.updateListInputs(xs),xs={...hs,...xs};const vs=[{result:await e.HS.executeBasedOnTypeAsync(xs,!1,(e=>t.occt.shapes.wire.closeOpenWire(e))),transformers:[]}],Os={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let Is={};Is.shape=vs,Is.direction=x,e.HS.updateListInputs(Is),Is={...Os,...Is};const Ls=[{result:await e.HS.executeBasedOnTypeAsync(Is,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],Bs={shape:[void 0],radius:[1],radiusList:[void 0],indexes:[void 0],direction:[[0,1,0]]};let ws={};ws.shape=cs,ws.direction=g,e.HS.updateListInputs(ws),ws={...Bs,...ws};const Ts=[{result:await e.HS.executeBasedOnTypeAsync(ws,!1,(e=>t.occt.fillets.fillet3DWire(e))),transformers:[]}],gs={shape:[void 0],face:[void 0],distance:[-.2],tolerance:[.1]};let As={};As.shape=ls,e.HS.updateListInputs(As),As={...gs,...As};const Es=[{result:await e.HS.executeBasedOnTypeAsync(As,!1,(e=>t.occt.operations.offset(e))),transformers:[]}],bs={shape:[void 0],index:[0]};let zs={};zs.shape=ls,e.HS.updateListInputs(zs),zs={...bs,...zs};const Ws=[{result:await e.HS.executeBasedOnTypeAsync(zs,!1,(e=>t.occt.shapes.wire.getWire(e))),transformers:[]}];let Cs={};Cs.item=ys,e.HS.updateListInputs(Cs),Cs={...Cs};const Ps=[{result:Cs.item}];let Xs={};Xs.item=fs,e.HS.updateListInputs(Xs),Xs={...Xs};const Ys=[{result:Xs.item}];let Zs={};Zs.start=fs,Zs.end=ys,e.HS.updateListInputs(Zs),Zs={start:[[0,0,0]],end:[[0,1,0]],...Zs};const Ns=[{result:await e.HS.executeBasedOnTypeAsync(Zs,!1,(e=>t.occt.shapes.wire.createLineWire(e))),transformers:[]}];e.HS.drawNodeMeshes(Ns,t);const ks={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let Ms={};Ms.shape=Ts,Ms.angle=ot,Ms.direction=o,e.HS.updateListInputs(Ms),Ms={...ks,...Ms};const Fs=[{result:await e.HS.executeBasedOnTypeAsync(Ms,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}],Ds={shape:[void 0]};let Rs={};Rs.shape=Ls,e.HS.updateListInputs(Rs),Rs={...Ds,...Rs};const js=[{result:await e.HS.executeBasedOnTypeAsync(Rs,!1,(e=>t.occt.shapes.solid.fromClosedShell(e))),transformers:[]}],qs={shape:[void 0],index:[1]};let Vs={};Vs.shape=Ws,e.HS.updateListInputs(Vs),Vs={...qs,...Vs};const Gs=[{result:await e.HS.executeBasedOnTypeAsync(Vs,!1,(e=>t.occt.shapes.edge.getEdge(e))),transformers:[]}],Js={shape:[void 0],index:[0]};let Ks={};Ks.shape=Es,e.HS.updateListInputs(Ks),Ks={...Js,...Ks};const Qs=[{result:await e.HS.executeBasedOnTypeAsync(Ks,!1,(e=>t.occt.shapes.wire.getWire(e))),transformers:[]}],Us={shape:[void 0],translation:[[0,0,0]]};let $s={};$s.shape=Ns,$s.translation=E,e.HS.updateListInputs($s),$s={...Us,...$s};const _s=[{result:await e.HS.executeBasedOnTypeAsync($s,!1,(e=>t.occt.transforms.translate(e))),transformers:[]}],en={shape:[void 0],direction:[[0,1,0]]};let tn={};tn.shape=Fs,tn.direction=Pe,e.HS.updateListInputs(tn),tn={...en,...tn};const sn=[{result:await e.HS.executeBasedOnTypeAsync(tn,!1,(e=>t.occt.operations.extrude(e))),transformers:[]}];let nn={};nn.listElements=js,e.HS.updateListInputs(nn),nn={...nn};const rn=[{result:[nn.listElements?nn.listElements:[]]}],an={shape:[void 0],index:[1]};let on={};on.shape=Qs,e.HS.updateListInputs(on),on={...an,...on};const cn=[{result:await e.HS.executeBasedOnTypeAsync(on,!1,(e=>t.occt.shapes.edge.getEdge(e))),transformers:[]}];let pn={};pn.listElements=Gs,e.HS.updateListInputs(pn),pn={...pn};const un=[{result:[pn.listElements?pn.listElements:[]]}],ln={shape:[void 0]};let dn={};dn.shape=_s,e.HS.updateListInputs(dn),dn={...ln,...dn};const mn=[{result:await e.HS.executeBasedOnTypeAsync(dn,!1,(e=>t.occt.shapes.wire.startPointOnWire(e))),transformers:[]}],yn={shape:[void 0]};let Sn={};Sn.shape=_s,e.HS.updateListInputs(Sn),Sn={...yn,...Sn};const Hn=[{result:await e.HS.executeBasedOnTypeAsync(Sn,!1,(e=>t.occt.shapes.wire.endPointOnWire(e))),transformers:[]}],fn={shapes:[void 0]};let hn={};hn.shapes=un,e.HS.updateListInputs(hn),hn={...fn,...hn};const xn=[{result:await e.HS.executeBasedOnTypeAsync(hn,!1,(e=>t.occt.shapes.wire.combineEdgesAndWiresIntoAWire(e))),transformers:[]}];let vn={};vn.listElements=cn,e.HS.updateListInputs(vn),vn={...vn};const On=[{result:[vn.listElements?vn.listElements:[]]}],In={shape:[void 0],shapes:[void 0],keepEdges:[!1]};let Ln={};Ln.shape=sn,Ln.shapes=Fe,e.HS.updateListInputs(Ln),Ln={...In,...Ln};const Bn=[{result:await e.HS.executeBasedOnTypeAsync(Ln,!1,(e=>t.occt.booleans.difference(e))),transformers:[]}];let wn={};wn.item=Hn,e.HS.updateListInputs(wn),wn={...wn};const Tn=[{result:wn.item}];let gn={};gn.item=mn,e.HS.updateListInputs(gn),gn={...gn};const An=[{result:gn.item}],En={shape:[void 0],shapes:[void 0],keepEdges:[!1]};let bn={};bn.shape=Bn,bn.shapes=rn,e.HS.updateListInputs(bn),bn={...En,...bn};const zn=[{result:await e.HS.executeBasedOnTypeAsync(bn,!1,(e=>t.occt.booleans.difference(e))),transformers:[]}],Wn={shapes:[void 0]};let Cn={};Cn.shapes=On,e.HS.updateListInputs(Cn),Cn={...Wn,...Cn};const Pn=[{result:await e.HS.executeBasedOnTypeAsync(Cn,!1,(e=>t.occt.shapes.wire.combineEdgesAndWiresIntoAWire(e))),transformers:[]}];let Xn={};Xn.listElements=[Ps[0],Tn[0],An[0],Ys[0]],e.HS.updateListInputs(Xn),Xn={...Xn};const Yn=[{result:[Xn.listElements?Xn.listElements:[]]}],Zn={shape:[void 0],origin:[[0,0,0]],normal:[[0,0,1]]};let Nn={};Nn.shape=zn,Nn.normal=m,e.HS.updateListInputs(Nn),Nn={...Zn,...Nn};const kn=[{result:await e.HS.executeBasedOnTypeAsync(Nn,!1,(e=>t.occt.transforms.mirrorAlongNormal(e))),transformers:[]}];let Mn={};Mn.listElements=[xn[0],Pn[0]],e.HS.updateListInputs(Mn),Mn={...Mn};const Fn=[{result:[Mn.listElements?Mn.listElements:[]]}],Dn={points:[void 0]};let Rn={};Rn.points=Yn,e.HS.updateListInputs(Rn),Rn={...Dn,...Rn};const jn=[{result:await e.HS.executeBasedOnTypeAsync(Rn,!1,(e=>t.occt.shapes.wire.createPolylineWire(e))),transformers:[]}];let qn={};qn.listElements=[kn[0],zn[0]],e.HS.updateListInputs(qn),qn={...qn};const Vn=[{result:[qn.listElements?qn.listElements:[]]}],Gn={shapes:[void 0],makeSolid:[!1]};let Jn={};Jn.shapes=Fn,e.HS.updateListInputs(Jn),Jn={...Gn,...Jn};const Kn=[{result:await e.HS.executeBasedOnTypeAsync(Jn,!1,(e=>t.occt.operations.loft(e))),transformers:[]}],Qn={shape:[void 0],radius:[.5],radiusList:[void 0],indexes:[void 0]};let Un={};Un.shape=jn,e.HS.updateListInputs(Un),Un={...Qn,...Un};const $n=[{result:await e.HS.executeBasedOnTypeAsync(Un,!1,(e=>t.occt.fillets.fillet2d(e))),transformers:[]}],_n={shapes:[void 0]};let er={};er.shapes=Vn,e.HS.updateListInputs(er),er={..._n,...er};const tr=[{result:await e.HS.executeBasedOnTypeAsync(er,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}],sr={shape:[void 0],origin:[[0,0,0]],direction:[[0,0,1]]};let nr={};nr.shape=Kn,nr.origin=We,nr.direction=f,e.HS.updateListInputs(nr),nr={...sr,...nr};const rr=[{result:await e.HS.executeBasedOnTypeAsync(nr,!1,(e=>t.occt.transforms.mirror(e))),transformers:[]}],ar={shape:[void 0],angle:[360],direction:[[0,1,0]],copy:[!1]};let or={};or.shape=$n,or.direction=x,e.HS.updateListInputs(or),or={...ar,...or};const ir=[{result:await e.HS.executeBasedOnTypeAsync(or,!1,(e=>t.occt.operations.revolve(e))),transformers:[]}];let cr={};cr.listElements=[ls[0],Es[0],Kn[0],rr[0]],e.HS.updateListInputs(cr),cr={...cr};const pr=[{result:[cr.listElements?cr.listElements:[]]}],ur={shape:[void 0],offset:[-.1]};let lr={};lr.shape=ir,e.HS.updateListInputs(lr),lr={...ur,...lr};const dr=[{result:await e.HS.executeBasedOnTypeAsync(lr,!1,(e=>t.occt.operations.makeThickSolidSimple(e))),transformers:[]}],mr={shape:[void 0],angle:[0],center:[[0,0,0]],axis:[[0,0,1]]};let yr={};yr.shape=tr,yr.angle=$e,yr.axis=k,e.HS.updateListInputs(yr),yr={...mr,...yr};const Sr=[{result:await e.HS.executeBasedOnTypeAsync(yr,!1,(e=>t.occt.transforms.rotateAroundCenter(e))),transformers:[]}],Hr={shapes:[void 0],tolerance:[1e-7]};let fr={};fr.shapes=pr,e.HS.updateListInputs(fr),fr={...Hr,...fr};const hr=[{result:await e.HS.executeBasedOnTypeAsync(fr,!1,(e=>t.occt.shapes.shell.sewFaces(e))),transformers:[]}],xr={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let vr={};vr.entity=dr,vr.options=z,e.HS.updateListInputs(vr),vr={...xr,...vr};await e.HS.executeBasedOnTypeAsync(vr,!1,(e=>t.draw.drawAnyAsync(e)));let Or={};Or.listElements=Sr,e.HS.updateListInputs(Or),Or={...Or};const Ir=[{result:[Or.listElements?Or.listElements:[]]}],Lr={shapes:[void 0]};let Br={};Br.shapes=Ir,e.HS.updateListInputs(Br),Br={...Lr,...Br};const wr=[{result:await e.HS.executeBasedOnTypeAsync(Br,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}];let Tr={};Tr.listElements=[hr[0],ve[0],wr[0]],e.HS.updateListInputs(Tr),Tr={...Tr};const gr=[{result:[Tr.listElements?Tr.listElements:[]]}],Ar={shapes:[void 0]};let Er={};Er.shapes=gr,e.HS.updateListInputs(Er),Er={...Ar,...Er};const br=[{result:await e.HS.executeBasedOnTypeAsync(Er,!1,(e=>t.occt.shapes.compound.makeCompound(e))),transformers:[]}],zr={entity:[void 0],options:[void 0],babylonMesh:[void 0]};let Wr={};Wr.entity=br,Wr.options=ne,e.HS.updateListInputs(Wr),Wr={...zr,...Wr};await e.HS.executeBasedOnTypeAsync(Wr,!1,(e=>t.draw.drawAnyAsync(e)))}(BitByBit,bitbybit,bitbybitRunnerResult,bitbybitRunnerInputs,Bit);\"}'
};