diff --git a/README.md b/README.md index 4ed6b2e..e9e9bb0 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,25 @@ -

Three.ez

-

- - - Simplify your three.js application development with three.ez! -

- -[![three.ez on npm](https://img.shields.io/npm/v/@three.ez/main.svg?logo=npm&label=NPM+package&color=ligthgeen)](https://www.npmjs.com/package/@three.ez/main) -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=agargaro_three.ez&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=agargaro_three.ez) -[![DeepScan grade](https://deepscan.io/api/teams/21196/projects/25445/branches/796375/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=21196&pid=25445&bid=796375) -![GitHub Repo stars](https://img.shields.io/github/stars/agargaro/three.ez?style=flat&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyBoZWlnaHQ9IjgwMHB4IiB3aWR0aD0iODAwcHgiIHZlcnNpb249IjEuMSIgaWQ9IkNhcGFfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgDQoJIHZpZXdCb3g9IjAgMCA0Ny45NCA0Ny45NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cGF0aCBzdHlsZT0iZmlsbDp3aGl0ZTsiIGQ9Ik0yNi4yODUsMi40ODZsNS40MDcsMTAuOTU2YzAuMzc2LDAuNzYyLDEuMTAzLDEuMjksMS45NDQsMS40MTJsMTIuMDkxLDEuNzU3DQoJYzIuMTE4LDAuMzA4LDIuOTYzLDIuOTEsMS40MzEsNC40MDNsLTguNzQ5LDguNTI4Yy0wLjYwOCwwLjU5My0wLjg4NiwxLjQ0OC0wLjc0MiwyLjI4NWwyLjA2NSwxMi4wNDINCgljMC4zNjIsMi4xMDktMS44NTIsMy43MTctMy43NDYsMi43MjJsLTEwLjgxNC01LjY4NWMtMC43NTItMC4zOTUtMS42NTEtMC4zOTUtMi40MDMsMGwtMTAuODE0LDUuNjg1DQoJYy0xLjg5NCwwLjk5Ni00LjEwOC0wLjYxMy0zLjc0Ni0yLjcyMmwyLjA2NS0xMi4wNDJjMC4xNDQtMC44MzctMC4xMzQtMS42OTItMC43NDItMi4yODVsLTguNzQ5LTguNTI4DQoJYy0xLjUzMi0xLjQ5NC0wLjY4Ny00LjA5NiwxLjQzMS00LjQwM2wxMi4wOTEtMS43NTdjMC44NDEtMC4xMjIsMS41NjgtMC42NSwxLjk0NC0xLjQxMmw1LjQwNy0xMC45NTYNCglDMjIuNjAyLDAuNTY3LDI1LjMzOCwwLjU2NywyNi4yODUsMi40ODZ6Ii8+DQo8L3N2Zz4=) -[![BundlePhobia](https://badgen.net/bundlephobia/min/@three.ez/main)](https://bundlephobia.com/package/@three.ez/main) -[![Discord conversation](https://img.shields.io/discord/1150091562227859457.svg?logo=discord&logoColor=fff&label=Discord&color=7389d8)](https://discord.gg/MVTwrdX3JM) - +

Three.ez - Main

+

+ Simplify your three.js application development with three.ez! +

+ + + + [![Discord](https://img.shields.io/badge/chat-discord-blue?style=flat&logo=discord)](https://discord.gg/MVTwrdX3JM) + [![npm](https://img.shields.io/npm/v/@three.ez/main)](https://www.npmjs.com/package/@three.ez/main) + [![Stars](https://badgen.net/github/stars/agargaro/three.ez)](https://github.com/agargaro/three.ez) + [![BundlePhobia](https://badgen.net/bundlephobia/min/@three.ez/main)](https://bundlephobia.com/package/@three.ez/main) + [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=agargaro_three.ez&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=agargaro_three.ez) + [![DeepScan grade](https://deepscan.io/api/teams/21196/projects/25445/branches/796375/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=21196&pid=25445&bid=796375) + +

+ See also:
+ three.ez/instanced-mesh - alternative InstancedMesh with enhanced features for performance and usability +

- - -

- - With three.ez, turn complexity into creativity. This lightweight yet powerful - library allows you to make the most of Three.js with a reduced learning curve, making the creation of interactive 3D scenes a breeze. Perfect for developers of all levels. - -

- - -Extend the functionalities of `Object3D` and `Scene` classes, making their usage more straightforward, and introduce utility classes. - -The **only** one dependency is `three.js r151+`. +Simplifies the most common operations of `three.js` applications, extends the functionalities of `Object3D` and `Scene` classes, making their usage more straightforward, and introduce utility classes. ```typescript import { Scene, Mesh, BoxGeometry, MeshNormalMaterial } from 'three'; @@ -43,24 +32,84 @@ box.on(['pointerover', 'pointerout'], (e) => box.scale.setScalar(e.type === 'poi const scene = new Scene().add(box); const main = new Main(); // init inside the renderer, and handle events, resize, etc -main.createView({ scene, camera: new PerspectiveCameraAuto(70).translateZ(1) }); // create the view to be rendered +main.createView({ scene, camera: new PerspectiveCameraAuto().translateZ(10) }); // create the view to be rendered ``` -## ✅ Why three.ez? +## Related libraries + +## 🧑‍💻 Live examples + +These examples use `vite`, and some mobile devices may run out of memory. + +[Examples Collection](https://stackblitz.com/@agargaro/collections/three-ez) + +- [Template](https://stackblitz.com/edit/three-ez-template?file=src%2Fmain.ts) +— [Template Extended](https://stackblitz.com/edit/three-ez-template-extended?file=src%2Fmain.ts) +— [Template No Vite](https://stackblitz.com/edit/three-ez-template-no-vite?file=index.ts) +- [Smart Rendering](https://stackblitz.com/edit/three-ez-smart-rendering?file=src%2Fmain.ts) +- [Multiple Views](https://stackblitz.com/edit/three-ez-multiple-views?file=src%2Fmain.ts) +— [Multiple Views Wireframe](https://stackblitz.com/edit/three-ez-multiple-views-wireframe?file=src%2Fmain.ts) +— [Multiple Views Switch](https://stackblitz.com/edit/three-ez-multiple-views-switch?file=src%2Fmain.ts) +- [Asset Management](https://stackblitz.com/edit/three-ez-asset-management?file=src%2Fmain.ts) +- [Binding](https://stackblitz.com/edit/three-ez-binding?file=src%2Fmain.ts) +— [Binding Collisions](https://stackblitz.com/edit/three-ez-binding-collisions?file=src%2Fmain.ts) +- [Events](https://stackblitz.com/edit/three-ez-events?file=src%2Fmain.ts) +— [Click On Scene To Add Box](https://stackblitz.com/edit/three-ez-click-on-scene-to-add-box?file=src%2Fmain.ts) +- [Focus](https://stackblitz.com/edit/three-ez-focus?file=src%2Fmain.ts) +— [Focus Outline (post-processing)](https://stackblitz.com/edit/three-ez-focus-outline?file=src%2Fmain.ts) +- [Drag & Drop](https://stackblitz.com/edit/three-ez-drag-drop?file=src%2Fmain.ts) +— [LOD Draggable](https://stackblitz.com/edit/three-ez-lod-draggable?file=src%2Fmain.ts) +— [Drag Limits](https://stackblitz.com/edit/three-ez-drag-limits?file=src%2Fmain.ts) +- [Continuous Raycasting](https://stackblitz.com/edit/three-ez-continuous-raycasting?file=src%2Fmain.ts) +- [Hitbox](https://stackblitz.com/edit/three-ez-hitbox?file=src%2Fmain.ts) +- [Tweening](https://stackblitz.com/edit/three-ez-tweening?file=src%2Fmain.ts) +— [Tweening Custom Progress](https://stackblitz.com/edit/three-ez-tweening-custom-progress?file=src%2Fmain.ts) +- [InstancedMeshEntity](https://stackblitz.com/edit/three-ez-instancedmeshentity?file=src%2Fmain.ts) +— [InstancedMeshEntity Performance](https://stackblitz.com/edit/three-ez-instancedmeshentity-performance?file=src%2Fmain.ts) +- [Draggable Box OrbitControls](https://stackblitz.com/edit/three-ez-draggable-box-orbitcontrols?file=src%2Fmain.ts) +- [Textbox (troika-three-text)](https://stackblitz.com/edit/three-ez-textbox?file=src%2Fmain.ts) +- [Bubble Refraction](https://stackblitz.com/edit/three-ez-bubble-refraction?file=src%2Fmain.ts,src%2Ftext.ts,src%2Fparticles.ts,src%2Fbubble.ts,src%2FbubbleMaterial.ts,src%2Fscene.ts) + +## 📚 Documentation + +The tutorial is available [here](https://agargaro.github.io/three.ez/docs/tutorial) *(work in progress)*.
+The API documentation is available [here](https://agargaro.github.io/three.ez/docs/api). + +## ⬇️ Installation + +You can install it via npm using the following command: + +```bash +npm install @three.ez/main +``` + +Or can import it from CDN: + +```html + +``` + +## ❔ Questions? + +Need help? Join us on [Discord](https://discord.gg/MVTwrdX3JM) or open an issue on GitHub. + +## ⭐ Like it? -- Program the logic of your `Object3D` more quickly and intuitively -- Less code and cleaner -- Streamlined rendering -- Declarative and imperative programming -- Compatible with your three.js code and external libraries -- Easy to learn -- High performance +If you like this project, please leave a star. Thank you! ❤️ -## 🔑 Key Features +## 🚀 Features -### ✨ [Event Programming](https://stackblitz.com/edit/three-ez-events?file=src%2Fmain.ts) +### Event programming -Add interactions to `Object3D` through programmable events, similar to `DOM events`, including a propagation system.
+Add interactions to `Object3D` through programmable events, similar to `DOM events`, including a propagation system.
See events list here: [Interaction](https://agargaro.github.io/three.ez/docs/tutorial/events/interaction), [Miscellaneous](https://agargaro.github.io/three.ez/docs/tutorial/events/misc), [Update](https://agargaro.github.io/three.ez/docs/tutorial/events/update). ```typescript @@ -70,7 +119,7 @@ box.on('animate', (e) => console.log('animate')); box.on('positionchange', () => console.log('position changed')); ``` -### 🔥 Drag and Drop +### Drag and drop Integrate drag and drop functionality. The drag is cancelled by pressing *ESC*. @@ -84,7 +133,7 @@ const plane = new Mesh(geometry, material); plane.on('drop', (e) => console.log(`obj dropped on this: ${e.relatedTarget}`)); ``` -### 🚀 Focus and Blur +### Focus and blur Enhance interactivity with focus and blur events. @@ -95,7 +144,7 @@ box.on('focus', (e) => console.log('focused')); box.on('blur', (e) => console.log('focus lost')); ``` -### 🏅 [Object3D Property Binding](https://agargaro.github.io/three.ez/docs/tutorial/binding) +### Object3D property binding Streamline the management of `Object3D` properties. @@ -104,9 +153,9 @@ const box = new Mesh(geometry, material); box.bindProperty('visible', () => box.parent?.enabled); ``` -### ✂️ Automatic Resize Handling +### Automatic resize handling -Automatically resizes the `Renderer`, `Camera`, and `EffectComposer`.
+Automatically resizes the `Renderer`, `Camera`, and `EffectComposer`.
Utilize the `viewportResize` event to easily set the resolution for custom shaders. ```typescript @@ -114,9 +163,9 @@ const line = new Line2(geometry, material); line.on('viewportresize', (e) => material.resolution.set(e.width, e.height)); ``` -### 💡 [Smart Rendering](https://agargaro.github.io/three.ez/docs/tutorial/rendering/smart-rendering) +### Smart rendering -Optimize performance by rendering frames only when necessary, reducing computational overhead.
+Optimize performance by rendering frames only when necessary, reducing computational overhead.
Automatically identifies changes in *position, scale, rotation, visibility, focus, blurring and addition or removal of objects*. ```typescript @@ -130,7 +179,7 @@ box.material.color.set('yellow'); box.needsRender = true; // necessary because color change cannot be automatically detected ``` -### 🏆 [Simplified Multiple Rendering](https://agargaro.github.io/three.ez/docs/tutorial/rendering/multiple-rendering) +### Simplified multiple rendering Effortlessly manage rendering for multiple scenes or viewports within a single canvas. @@ -140,7 +189,7 @@ main.createView({ scene, camera, viewport: { left: 0, bottom: 0, width: 0.5, hei main.createView({ scene, camera, viewport: { left: 0.5, bottom: 0, width: 0.5, height: 1 } }); ``` -### 🛠️ [Asset Management](https://agargaro.github.io/three.ez/docs/tutorial/asset-management) +### Asset management Efficiently load and preload the assets for your 3D projects. @@ -170,7 +219,7 @@ const main = new Main(); const soldier = new Soldier(); ``` -### 🎥 Tweening +### Tweening Create smooth animations effortlessly with built-in tweening. @@ -184,9 +233,9 @@ new Tween(box) .start(); ``` -### ⚙️ Raycasting Customisable +### Raycasting customisable -Choose between continuous or mouse movement-based raycasting, optimizing intersection operations.
+Choose between continuous or mouse movement-based raycasting, optimizing intersection operations.
Set which objects to intersect from the main raycasting. ```typescript @@ -197,7 +246,7 @@ const box = new Mesh(geometry, material); box.interceptByRaycaster = false; // default is true ``` -### 🎯 Hitbox Functionality +### Hitbox functionality Leverage hitboxes for customized intersections or simplified calculations. @@ -206,25 +255,6 @@ const ring = new Mesh(new RingGeometry(1, 1.5), new MeshBasicMaterial()); ring.hitboxes = [new Hitbox(new CircleGeometry(1.5))]; // intercept also inside the ring ``` -### 💯 Simplified InstancedMesh - -Manage `InstancedMesh` instances with the ease of working with `Object3D`, simplifying creation and manipulation, including frustum culling. - -```typescript -const myInstancedMesh = new InstancedMesh2(geometry, material, count, (obj, index) => { - obj.position.x += index; - obj.scale.setScalar(2); - obj.quaternion.random(); - obj.forceUpdateMatrix(); -}); - -// How to handle instances -myInstancedMesh.instances[0].visible = false; -myInstancedMesh.instances[1].draggable = true; -myInstancedMesh.instances[2].rotateOnWorldAxis(xAxis, Math.PI); -myInstancedMesh.instances[2].updateMatrix(); -``` - ### 🔍 Query Find and select `Object3D` using powerful query selectors. @@ -238,77 +268,3 @@ scene.querySelectorAll('Group .even'); // Selects all Object3D with 'even' tag t scene.querySelectorAll('Group > .even'); // Selects all direct children with 'even' tag under a 'Group'. scene.querySelectorAll('Mesh, SkinnedMesh'); // Selects all meshes and skinned meshes in the scene. ``` - -## ⬇️ Installation - -You can install it via npm using the following command: - -```bash -npm install @three.ez/main -``` - -Or can import it from CDN: - -```html - -``` - -## 🧑‍💻 Live Examples - -These examples use `vite`, and some mobile devices may run out of memory. However, there is one example without it. - -[Examples Collection](https://stackblitz.com/@agargaro/collections/three-ez) - -- [Template](https://stackblitz.com/edit/three-ez-template?file=src%2Fmain.ts) -— [Template Extended](https://stackblitz.com/edit/three-ez-template-extended?file=src%2Fmain.ts) -— [Template No Vite](https://stackblitz.com/edit/three-ez-template-no-vite?file=index.ts) -- [Smart Rendering](https://stackblitz.com/edit/three-ez-smart-rendering?file=src%2Fmain.ts) -- [Multiple Views](https://stackblitz.com/edit/three-ez-multiple-views?file=src%2Fmain.ts) -— [Multiple Views Wireframe](https://stackblitz.com/edit/three-ez-multiple-views-wireframe?file=src%2Fmain.ts) -— [Multiple Views Switch](https://stackblitz.com/edit/three-ez-multiple-views-switch?file=src%2Fmain.ts) -- [Asset Management](https://stackblitz.com/edit/three-ez-asset-management?file=src%2Fmain.ts) -- [Binding](https://stackblitz.com/edit/three-ez-binding?file=src%2Fmain.ts) -— [Binding Collisions](https://stackblitz.com/edit/three-ez-binding-collisions?file=src%2Fmain.ts) -- [Events](https://stackblitz.com/edit/three-ez-events?file=src%2Fmain.ts) -— [Click On Scene To Add Box](https://stackblitz.com/edit/three-ez-click-on-scene-to-add-box?file=src%2Fmain.ts) -- [Focus](https://stackblitz.com/edit/three-ez-focus?file=src%2Fmain.ts) -— [Focus Outline (post-processing)](https://stackblitz.com/edit/three-ez-focus-outline?file=src%2Fmain.ts) -- [Drag & Drop](https://stackblitz.com/edit/three-ez-drag-drop?file=src%2Fmain.ts) -— [LOD Draggable](https://stackblitz.com/edit/three-ez-lod-draggable?file=src%2Fmain.ts) -— [Drag Limits](https://stackblitz.com/edit/three-ez-drag-limits?file=src%2Fmain.ts) -- [Continuous Raycasting](https://stackblitz.com/edit/three-ez-continuous-raycasting?file=src%2Fmain.ts) -- [Hitbox](https://stackblitz.com/edit/three-ez-hitbox?file=src%2Fmain.ts) -- [Tweening](https://stackblitz.com/edit/three-ez-tweening?file=src%2Fmain.ts) -— [Tweening Custom Progress](https://stackblitz.com/edit/three-ez-tweening-custom-progress?file=src%2Fmain.ts) -- [InstancedMeshEntity](https://stackblitz.com/edit/three-ez-instancedmeshentity?file=src%2Fmain.ts) -— [InstancedMeshEntity Performance](https://stackblitz.com/edit/three-ez-instancedmeshentity-performance?file=src%2Fmain.ts) -- [Draggable Box OrbitControls](https://stackblitz.com/edit/three-ez-draggable-box-orbitcontrols?file=src%2Fmain.ts) -- [Textbox (troika-three-text)](https://stackblitz.com/edit/three-ez-textbox?file=src%2Fmain.ts) -- [Bubble Refraction](https://stackblitz.com/edit/three-ez-bubble-refraction?file=src%2Fmain.ts,src%2Ftext.ts,src%2Fparticles.ts,src%2Fbubble.ts,src%2FbubbleMaterial.ts,src%2Fscene.ts) - -## 📚 Documentation - -The tutorial is available [here](https://agargaro.github.io/three.ez/docs/tutorial) *(work in progress)*.
-The API documentation is available [here](https://agargaro.github.io/three.ez/docs/api). - -## 🤝 Contributing - -Any help is highly appreciated. If you would like to contribute to this package or report problems, feel free to open a bug or pull request. - -## ❔ Questions? - -If you have questions or need assistance, you can ask on our [discord server](https://discord.gg/MVTwrdX3JM). - -## ⭐ Like it? - -If you find this project helpful, I would greatly appreciate it if you could leave a star on this repository!
-This helps me know that you appreciate my work and encourages me to continue improving it.
-Thank you so much for your support! 🌟 diff --git a/public/banner.jpg b/public/banner.jpg new file mode 100644 index 0000000..2b46681 Binary files /dev/null and b/public/banner.jpg differ