@guinetik/gcanvas 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/release.yaml +70 -0
- package/.jshintrc +4 -0
- package/.vscode/settings.json +22 -0
- package/CLAUDE.md +310 -0
- package/blackhole.jpg +0 -0
- package/demo.png +0 -0
- package/demos/CNAME +1 -0
- package/demos/animations.html +31 -0
- package/demos/basic.html +38 -0
- package/demos/baskara.html +31 -0
- package/demos/bezier.html +35 -0
- package/demos/beziersignature.html +29 -0
- package/demos/blackhole.html +28 -0
- package/demos/blob.html +35 -0
- package/demos/demos.css +289 -0
- package/demos/easing.html +28 -0
- package/demos/events.html +195 -0
- package/demos/fluent.html +647 -0
- package/demos/fractals.html +36 -0
- package/demos/genart.html +26 -0
- package/demos/gendream.html +26 -0
- package/demos/group.html +36 -0
- package/demos/home.html +587 -0
- package/demos/index.html +364 -0
- package/demos/isometric.html +34 -0
- package/demos/js/animations.js +452 -0
- package/demos/js/basic.js +204 -0
- package/demos/js/baskara.js +751 -0
- package/demos/js/bezier.js +692 -0
- package/demos/js/beziersignature.js +241 -0
- package/demos/js/blackhole/accretiondisk.obj.js +379 -0
- package/demos/js/blackhole/blackhole.obj.js +318 -0
- package/demos/js/blackhole/index.js +409 -0
- package/demos/js/blackhole/particle.js +56 -0
- package/demos/js/blackhole/starfield.obj.js +218 -0
- package/demos/js/blob.js +2263 -0
- package/demos/js/easing.js +477 -0
- package/demos/js/fluent.js +183 -0
- package/demos/js/fractals.js +931 -0
- package/demos/js/fractalworker.js +93 -0
- package/demos/js/genart.js +268 -0
- package/demos/js/gendream.js +209 -0
- package/demos/js/group.js +140 -0
- package/demos/js/info-toggle.js +25 -0
- package/demos/js/isometric.js +863 -0
- package/demos/js/kerr.js +1556 -0
- package/demos/js/lavalamp.js +590 -0
- package/demos/js/layout.js +354 -0
- package/demos/js/mondrian.js +285 -0
- package/demos/js/opacity.js +275 -0
- package/demos/js/painter.js +484 -0
- package/demos/js/particles-showcase.js +514 -0
- package/demos/js/particles.js +299 -0
- package/demos/js/patterns.js +397 -0
- package/demos/js/penrose/artifact.js +69 -0
- package/demos/js/penrose/blackhole.js +121 -0
- package/demos/js/penrose/constants.js +73 -0
- package/demos/js/penrose/game.js +943 -0
- package/demos/js/penrose/lore.js +278 -0
- package/demos/js/penrose/penrosescene.js +892 -0
- package/demos/js/penrose/ship.js +216 -0
- package/demos/js/penrose/sounds.js +211 -0
- package/demos/js/penrose/voidparticle.js +55 -0
- package/demos/js/penrose/voidscene.js +258 -0
- package/demos/js/penrose/voidship.js +144 -0
- package/demos/js/penrose/wormhole.js +46 -0
- package/demos/js/pipeline.js +555 -0
- package/demos/js/scene.js +304 -0
- package/demos/js/scenes.js +320 -0
- package/demos/js/schrodinger.js +410 -0
- package/demos/js/schwarzschild.js +1023 -0
- package/demos/js/shapes.js +628 -0
- package/demos/js/space/alien.js +171 -0
- package/demos/js/space/boom.js +98 -0
- package/demos/js/space/boss.js +353 -0
- package/demos/js/space/buff.js +73 -0
- package/demos/js/space/bullet.js +102 -0
- package/demos/js/space/constants.js +85 -0
- package/demos/js/space/game.js +1884 -0
- package/demos/js/space/hud.js +112 -0
- package/demos/js/space/laserbeam.js +179 -0
- package/demos/js/space/lightning.js +277 -0
- package/demos/js/space/minion.js +192 -0
- package/demos/js/space/missile.js +212 -0
- package/demos/js/space/player.js +430 -0
- package/demos/js/space/powerup.js +90 -0
- package/demos/js/space/starfield.js +58 -0
- package/demos/js/space/starpower.js +90 -0
- package/demos/js/spacetime.js +559 -0
- package/demos/js/svgtween.js +204 -0
- package/demos/js/tde/accretiondisk.js +418 -0
- package/demos/js/tde/blackhole.js +219 -0
- package/demos/js/tde/blackholescene.js +209 -0
- package/demos/js/tde/config.js +59 -0
- package/demos/js/tde/index.js +695 -0
- package/demos/js/tde/jets.js +290 -0
- package/demos/js/tde/lensedstarfield.js +147 -0
- package/demos/js/tde/tdestar.js +317 -0
- package/demos/js/tde/tidalstream.js +356 -0
- package/demos/js/tde_old/blackhole.obj.js +354 -0
- package/demos/js/tde_old/debris.obj.js +791 -0
- package/demos/js/tde_old/flare.obj.js +239 -0
- package/demos/js/tde_old/index.js +448 -0
- package/demos/js/tde_old/star.obj.js +812 -0
- package/demos/js/tiles.js +312 -0
- package/demos/js/tweendemo.js +79 -0
- package/demos/js/visibility.js +102 -0
- package/demos/kerr.html +28 -0
- package/demos/lavalamp.html +27 -0
- package/demos/layouts.html +37 -0
- package/demos/logo.svg +4 -0
- package/demos/loop.html +84 -0
- package/demos/mondrian.html +32 -0
- package/demos/og_image.png +0 -0
- package/demos/opacity.html +36 -0
- package/demos/painter.html +39 -0
- package/demos/particles-showcase.html +28 -0
- package/demos/particles.html +24 -0
- package/demos/patterns.html +33 -0
- package/demos/penrose-game.html +31 -0
- package/demos/pipeline.html +737 -0
- package/demos/scene.html +33 -0
- package/demos/scenes.html +96 -0
- package/demos/schrodinger.html +27 -0
- package/demos/schwarzschild.html +27 -0
- package/demos/shapes.html +16 -0
- package/demos/space.html +85 -0
- package/demos/spacetime.html +27 -0
- package/demos/svgtween.html +29 -0
- package/demos/tde.html +28 -0
- package/demos/tiles.html +28 -0
- package/demos/transforms.html +400 -0
- package/demos/tween.html +45 -0
- package/demos/visibility.html +33 -0
- package/disk_example.png +0 -0
- package/docs/README.md +222 -0
- package/docs/concepts/architecture-overview.md +204 -0
- package/docs/concepts/lifecycle.md +255 -0
- package/docs/concepts/rendering-pipeline.md +279 -0
- package/docs/concepts/tde-zorder.md +106 -0
- package/docs/concepts/two-layer-architecture.md +229 -0
- package/docs/getting-started/first-game.md +354 -0
- package/docs/getting-started/hello-world.md +269 -0
- package/docs/getting-started/installation.md +157 -0
- package/docs/modules/collision/README.md +453 -0
- package/docs/modules/fluent/README.md +1075 -0
- package/docs/modules/game/README.md +303 -0
- package/docs/modules/isometric-camera.md +210 -0
- package/docs/modules/isometric.md +275 -0
- package/docs/modules/painter/README.md +328 -0
- package/docs/modules/particle/README.md +559 -0
- package/docs/modules/shapes/README.md +221 -0
- package/docs/modules/shapes/base/euclidian.md +123 -0
- package/docs/modules/shapes/base/geometry2d.md +204 -0
- package/docs/modules/shapes/base/renderable.md +215 -0
- package/docs/modules/shapes/base/shape.md +262 -0
- package/docs/modules/shapes/base/transformable.md +243 -0
- package/docs/modules/shapes/hierarchy.md +218 -0
- package/docs/modules/state/README.md +577 -0
- package/docs/modules/util/README.md +99 -0
- package/docs/modules/util/camera3d.md +412 -0
- package/docs/modules/util/scene3d.md +395 -0
- package/index.html +17 -0
- package/jsdoc.json +50 -0
- package/package.json +55 -0
- package/readme.md +599 -0
- package/scripts/build-demo.js +69 -0
- package/scripts/bundle4llm.js +276 -0
- package/scripts/clearconsole.js +48 -0
- package/src/collision/collision-system.js +332 -0
- package/src/collision/collision.js +303 -0
- package/src/collision/index.js +10 -0
- package/src/fluent/fluent-game.js +430 -0
- package/src/fluent/fluent-go.js +1060 -0
- package/src/fluent/fluent-layer.js +152 -0
- package/src/fluent/fluent-scene.js +291 -0
- package/src/fluent/index.js +98 -0
- package/src/fluent/sketch.js +380 -0
- package/src/game/game.js +467 -0
- package/src/game/index.js +49 -0
- package/src/game/objects/go.js +220 -0
- package/src/game/objects/imagego.js +30 -0
- package/src/game/objects/index.js +54 -0
- package/src/game/objects/isometric-scene.js +260 -0
- package/src/game/objects/layoutscene.js +549 -0
- package/src/game/objects/scene.js +175 -0
- package/src/game/objects/scene3d.js +118 -0
- package/src/game/objects/text.js +221 -0
- package/src/game/objects/wrapper.js +232 -0
- package/src/game/pipeline.js +243 -0
- package/src/game/ui/button.js +396 -0
- package/src/game/ui/cursor.js +93 -0
- package/src/game/ui/fps.js +91 -0
- package/src/game/ui/index.js +5 -0
- package/src/game/ui/togglebutton.js +93 -0
- package/src/game/ui/tooltip.js +249 -0
- package/src/index.js +25 -0
- package/src/io/events.js +20 -0
- package/src/io/index.js +86 -0
- package/src/io/input.js +70 -0
- package/src/io/keys.js +152 -0
- package/src/io/mouse.js +61 -0
- package/src/io/touch.js +39 -0
- package/src/logger/debugtab.js +138 -0
- package/src/logger/index.js +3 -0
- package/src/logger/loggable.js +47 -0
- package/src/logger/logger.js +113 -0
- package/src/math/complex.js +37 -0
- package/src/math/constants.js +1 -0
- package/src/math/fractal.js +1271 -0
- package/src/math/gr.js +201 -0
- package/src/math/heat.js +202 -0
- package/src/math/index.js +12 -0
- package/src/math/noise.js +433 -0
- package/src/math/orbital.js +191 -0
- package/src/math/patterns.js +1339 -0
- package/src/math/penrose.js +259 -0
- package/src/math/quantum.js +115 -0
- package/src/math/random.js +195 -0
- package/src/math/tensor.js +1009 -0
- package/src/mixins/anchor.js +131 -0
- package/src/mixins/draggable.js +72 -0
- package/src/mixins/index.js +2 -0
- package/src/motion/bezier.js +132 -0
- package/src/motion/bounce.js +58 -0
- package/src/motion/easing.js +349 -0
- package/src/motion/float.js +130 -0
- package/src/motion/follow.js +125 -0
- package/src/motion/hop.js +52 -0
- package/src/motion/index.js +82 -0
- package/src/motion/motion.js +1124 -0
- package/src/motion/orbit.js +49 -0
- package/src/motion/oscillate.js +39 -0
- package/src/motion/parabolic.js +141 -0
- package/src/motion/patrol.js +147 -0
- package/src/motion/pendulum.js +48 -0
- package/src/motion/pulse.js +88 -0
- package/src/motion/shake.js +83 -0
- package/src/motion/spiral.js +144 -0
- package/src/motion/spring.js +150 -0
- package/src/motion/swing.js +47 -0
- package/src/motion/tween.js +92 -0
- package/src/motion/tweenetik.js +139 -0
- package/src/motion/waypoint.js +210 -0
- package/src/painter/index.js +8 -0
- package/src/painter/painter.colors.js +331 -0
- package/src/painter/painter.effects.js +230 -0
- package/src/painter/painter.img.js +229 -0
- package/src/painter/painter.js +295 -0
- package/src/painter/painter.lines.js +189 -0
- package/src/painter/painter.opacity.js +41 -0
- package/src/painter/painter.shapes.js +277 -0
- package/src/painter/painter.text.js +273 -0
- package/src/particle/emitter.js +124 -0
- package/src/particle/index.js +11 -0
- package/src/particle/particle-system.js +322 -0
- package/src/particle/particle.js +71 -0
- package/src/particle/updaters.js +170 -0
- package/src/shapes/arc.js +43 -0
- package/src/shapes/arrow.js +33 -0
- package/src/shapes/bezier.js +42 -0
- package/src/shapes/circle.js +62 -0
- package/src/shapes/clouds.js +56 -0
- package/src/shapes/cone.js +219 -0
- package/src/shapes/cross.js +70 -0
- package/src/shapes/cube.js +244 -0
- package/src/shapes/cylinder.js +254 -0
- package/src/shapes/diamond.js +48 -0
- package/src/shapes/euclidian.js +111 -0
- package/src/shapes/figure.js +115 -0
- package/src/shapes/geometry.js +220 -0
- package/src/shapes/group.js +375 -0
- package/src/shapes/heart.js +42 -0
- package/src/shapes/hexagon.js +26 -0
- package/src/shapes/image.js +192 -0
- package/src/shapes/index.js +111 -0
- package/src/shapes/line.js +29 -0
- package/src/shapes/pattern.js +90 -0
- package/src/shapes/pin.js +44 -0
- package/src/shapes/poly.js +31 -0
- package/src/shapes/prism.js +226 -0
- package/src/shapes/rect.js +35 -0
- package/src/shapes/renderable.js +333 -0
- package/src/shapes/ring.js +26 -0
- package/src/shapes/roundrect.js +95 -0
- package/src/shapes/shape.js +117 -0
- package/src/shapes/slice.js +26 -0
- package/src/shapes/sphere.js +314 -0
- package/src/shapes/sphere3d.js +537 -0
- package/src/shapes/square.js +15 -0
- package/src/shapes/star.js +99 -0
- package/src/shapes/svg.js +408 -0
- package/src/shapes/text.js +553 -0
- package/src/shapes/traceable.js +83 -0
- package/src/shapes/transform.js +357 -0
- package/src/shapes/transformable.js +172 -0
- package/src/shapes/triangle.js +26 -0
- package/src/sound/index.js +17 -0
- package/src/sound/sound.js +473 -0
- package/src/sound/synth.analyzer.js +149 -0
- package/src/sound/synth.effects.js +207 -0
- package/src/sound/synth.envelope.js +59 -0
- package/src/sound/synth.js +229 -0
- package/src/sound/synth.musical.js +160 -0
- package/src/sound/synth.noise.js +85 -0
- package/src/sound/synth.oscillators.js +293 -0
- package/src/state/index.js +10 -0
- package/src/state/state-machine.js +371 -0
- package/src/util/camera3d.js +438 -0
- package/src/util/index.js +6 -0
- package/src/util/isometric-camera.js +235 -0
- package/src/util/layout.js +317 -0
- package/src/util/position.js +147 -0
- package/src/util/tasks.js +47 -0
- package/src/util/zindex.js +287 -0
- package/src/webgl/index.js +9 -0
- package/src/webgl/shaders/sphere-shaders.js +994 -0
- package/src/webgl/webgl-renderer.js +388 -0
- package/tde.png +0 -0
- package/test/math/orbital.test.js +61 -0
- package/test/math/tensor.test.js +114 -0
- package/test/particle/emitter.test.js +204 -0
- package/test/particle/particle-system.test.js +310 -0
- package/test/particle/particle.test.js +116 -0
- package/test/particle/updaters.test.js +386 -0
- package/test/setup.js +120 -0
- package/test/shapes/euclidian.test.js +44 -0
- package/test/shapes/geometry.test.js +86 -0
- package/test/shapes/group.test.js +86 -0
- package/test/shapes/rectangle.test.js +64 -0
- package/test/shapes/transform.test.js +379 -0
- package/test/util/camera3d.test.js +428 -0
- package/test/util/scene3d.test.js +352 -0
- package/types/collision.d.ts +249 -0
- package/types/common.d.ts +155 -0
- package/types/game.d.ts +497 -0
- package/types/index.d.ts +309 -0
- package/types/io.d.ts +188 -0
- package/types/logger.d.ts +127 -0
- package/types/math.d.ts +268 -0
- package/types/mixins.d.ts +92 -0
- package/types/motion.d.ts +678 -0
- package/types/painter.d.ts +378 -0
- package/types/shapes.d.ts +864 -0
- package/types/sound.d.ts +672 -0
- package/types/state.d.ts +251 -0
- package/types/util.d.ts +253 -0
- package/vite.config.js +50 -0
- package/vitest.config.js +13 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZOrderedCollection - A component for managing child objects with z-ordering.
|
|
3
|
+
* Can be composed into any class that needs child management capabilities.
|
|
4
|
+
*/
|
|
5
|
+
export class ZOrderedCollection {
|
|
6
|
+
/**
|
|
7
|
+
* @param {Object} [options] - Configuration options
|
|
8
|
+
* @param {boolean} [options.sortByZIndex=true] - Whether to use z-index sorting instead of array order
|
|
9
|
+
*/
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
this.children = [];
|
|
12
|
+
this.sortByZIndex = options.sortByZIndex || true;
|
|
13
|
+
this._zOrderDirty = false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Add a child object to the collection
|
|
18
|
+
* @param {Object} child - Child object to add
|
|
19
|
+
* @returns {Object} The added child
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Add a child object to the collection
|
|
23
|
+
* @param {Object} child - Child object to add
|
|
24
|
+
* @returns {Object} The added child
|
|
25
|
+
*/
|
|
26
|
+
add(child) {
|
|
27
|
+
if (this.children.includes(child)) {
|
|
28
|
+
console.warn("Object is already in this collection");
|
|
29
|
+
return child;
|
|
30
|
+
}
|
|
31
|
+
this.children.push(child);
|
|
32
|
+
child.parent = this._owner || this;
|
|
33
|
+
// Mark z-order as dirty if using z-index sorting
|
|
34
|
+
if (this.sortByZIndex) {
|
|
35
|
+
this._zOrderDirty = true;
|
|
36
|
+
// Only set default zIndex if not already defined
|
|
37
|
+
// This allows users to set zIndex before or after add()
|
|
38
|
+
if (child.zIndex === undefined || child.zIndex === null) {
|
|
39
|
+
child.zIndex = this.children.length - 1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return child;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Remove a child from the collection
|
|
47
|
+
* @param {Object} child - Child to remove
|
|
48
|
+
* @returns {boolean} Whether removal was successful
|
|
49
|
+
*/
|
|
50
|
+
remove(child) {
|
|
51
|
+
const index = this.children.indexOf(child);
|
|
52
|
+
if (index !== -1) {
|
|
53
|
+
this.children.splice(index, 1);
|
|
54
|
+
child.parent = null;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Clear all children from the collection
|
|
62
|
+
*/
|
|
63
|
+
clear() {
|
|
64
|
+
this.children.forEach((child) => {
|
|
65
|
+
child.parent = null;
|
|
66
|
+
});
|
|
67
|
+
this.children = [];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Brings a child to the front (end of the array or highest z-index)
|
|
72
|
+
* @param {Object} child - The child to bring to the front
|
|
73
|
+
*/
|
|
74
|
+
bringToFront(child) {
|
|
75
|
+
const index = this.children.indexOf(child);
|
|
76
|
+
if (index === -1) {
|
|
77
|
+
// If not in array, just add it
|
|
78
|
+
this.add(child);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (this.sortByZIndex) {
|
|
83
|
+
// Check if already at the front
|
|
84
|
+
let isAlreadyHighest = true;
|
|
85
|
+
|
|
86
|
+
for (const obj of this.children) {
|
|
87
|
+
if (obj === child) continue;
|
|
88
|
+
|
|
89
|
+
if ((obj.zIndex || 0) >= (child.zIndex || 0)) {
|
|
90
|
+
isAlreadyHighest = false;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (!isAlreadyHighest) {
|
|
96
|
+
// Instead of incrementing, we'll use a new highest value
|
|
97
|
+
// and then normalize all z-indices
|
|
98
|
+
child.zIndex = Number.MAX_SAFE_INTEGER;
|
|
99
|
+
this._zOrderDirty = true;
|
|
100
|
+
|
|
101
|
+
// Normalize z-indices if they're getting too large
|
|
102
|
+
this._normalizeZIndices();
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
// Move to end without removing and re-adding
|
|
106
|
+
// Only if not already at the end
|
|
107
|
+
if (index !== this.children.length - 1) {
|
|
108
|
+
this.children.splice(index, 1);
|
|
109
|
+
this.children.push(child);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Send a child to the back (start of the array or lowest z-index)
|
|
116
|
+
* @param {Object} child - The child to send to the back
|
|
117
|
+
*/
|
|
118
|
+
sendToBack(child) {
|
|
119
|
+
const index = this.children.indexOf(child);
|
|
120
|
+
if (index === -1) {
|
|
121
|
+
// If not in array, add it at the beginning
|
|
122
|
+
this.children.unshift(child);
|
|
123
|
+
child.parent = this._owner || this;
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (this.sortByZIndex) {
|
|
128
|
+
// Check if already at the back
|
|
129
|
+
let isAlreadyLowest = true;
|
|
130
|
+
|
|
131
|
+
for (const obj of this.children) {
|
|
132
|
+
if (obj === child) continue;
|
|
133
|
+
|
|
134
|
+
if ((obj.zIndex || 0) <= (child.zIndex || 0)) {
|
|
135
|
+
isAlreadyLowest = false;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (!isAlreadyLowest) {
|
|
141
|
+
// Give it the minimum value
|
|
142
|
+
child.zIndex = Number.MIN_SAFE_INTEGER;
|
|
143
|
+
this._zOrderDirty = true;
|
|
144
|
+
|
|
145
|
+
// Normalize z-indices if needed
|
|
146
|
+
this._normalizeZIndices();
|
|
147
|
+
}
|
|
148
|
+
} else {
|
|
149
|
+
// Move to beginning without removing and re-adding
|
|
150
|
+
// Only if not already at the beginning
|
|
151
|
+
if (index !== 0) {
|
|
152
|
+
this.children.splice(index, 1);
|
|
153
|
+
this.children.unshift(child);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Move a child one position forward in the z-order
|
|
160
|
+
* @param {Object} child - The child to move forward
|
|
161
|
+
*/
|
|
162
|
+
bringForward(child) {
|
|
163
|
+
const index = this.children.indexOf(child);
|
|
164
|
+
if (index === -1 || index === this.children.length - 1) return;
|
|
165
|
+
|
|
166
|
+
if (this.sortByZIndex) {
|
|
167
|
+
// Sort objects by z-index
|
|
168
|
+
const sorted = [...this.children].sort(
|
|
169
|
+
(a, b) => (a.zIndex || 0) - (b.zIndex || 0)
|
|
170
|
+
);
|
|
171
|
+
const currentIndex = sorted.indexOf(child);
|
|
172
|
+
|
|
173
|
+
if (currentIndex < sorted.length - 1) {
|
|
174
|
+
const nextObj = sorted[currentIndex + 1];
|
|
175
|
+
const nextZIndex = nextObj.zIndex || 0;
|
|
176
|
+
const currentZIndex = child.zIndex || 0;
|
|
177
|
+
|
|
178
|
+
// Place it halfway between current and next object
|
|
179
|
+
// if there's space, otherwise swap the z-indices
|
|
180
|
+
if (nextZIndex - currentZIndex > 1) {
|
|
181
|
+
child.zIndex =
|
|
182
|
+
currentZIndex + Math.floor((nextZIndex - currentZIndex) / 2);
|
|
183
|
+
} else {
|
|
184
|
+
// Swap z-indices
|
|
185
|
+
child.zIndex = nextZIndex;
|
|
186
|
+
nextObj.zIndex = currentZIndex;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
this._zOrderDirty = true;
|
|
190
|
+
|
|
191
|
+
// Check for normalization
|
|
192
|
+
this._normalizeZIndices();
|
|
193
|
+
}
|
|
194
|
+
} else {
|
|
195
|
+
// Swap with the next object
|
|
196
|
+
const temp = this.children[index + 1];
|
|
197
|
+
this.children[index + 1] = child;
|
|
198
|
+
this.children[index] = temp;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Move a child one position backward in the z-order
|
|
204
|
+
* @param {Object} child - The child to move backward
|
|
205
|
+
*/
|
|
206
|
+
sendBackward(child) {
|
|
207
|
+
const index = this.children.indexOf(child);
|
|
208
|
+
if (index <= 0) return;
|
|
209
|
+
|
|
210
|
+
if (this.sortByZIndex) {
|
|
211
|
+
// Sort objects by z-index
|
|
212
|
+
const sorted = [...this.children].sort(
|
|
213
|
+
(a, b) => (a.zIndex || 0) - (b.zIndex || 0)
|
|
214
|
+
);
|
|
215
|
+
const currentIndex = sorted.indexOf(child);
|
|
216
|
+
|
|
217
|
+
if (currentIndex > 0) {
|
|
218
|
+
const prevObj = sorted[currentIndex - 1];
|
|
219
|
+
const prevZIndex = prevObj.zIndex || 0;
|
|
220
|
+
const currentZIndex = child.zIndex || 0;
|
|
221
|
+
|
|
222
|
+
// Place it halfway between current and previous object
|
|
223
|
+
// if there's space, otherwise swap the z-indices
|
|
224
|
+
if (currentZIndex - prevZIndex > 1) {
|
|
225
|
+
child.zIndex =
|
|
226
|
+
prevZIndex + Math.floor((currentZIndex - prevZIndex) / 2);
|
|
227
|
+
} else {
|
|
228
|
+
// Swap z-indices
|
|
229
|
+
child.zIndex = prevZIndex;
|
|
230
|
+
prevObj.zIndex = currentZIndex;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
this._zOrderDirty = true;
|
|
234
|
+
|
|
235
|
+
// Check for normalization
|
|
236
|
+
this._normalizeZIndices();
|
|
237
|
+
}
|
|
238
|
+
} else {
|
|
239
|
+
// Swap with the previous object
|
|
240
|
+
const temp = this.children[index - 1];
|
|
241
|
+
this.children[index - 1] = child;
|
|
242
|
+
this.children[index] = temp;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Normalizes all z-indices to use smaller numbers
|
|
248
|
+
* while preserving the same order
|
|
249
|
+
* @private
|
|
250
|
+
*/
|
|
251
|
+
_normalizeZIndices() {
|
|
252
|
+
// Only normalize if we have objects with z-indices
|
|
253
|
+
if (this.children.length <= 1) return;
|
|
254
|
+
|
|
255
|
+
// Check if normalization is needed (z-indices exceeding 1000 or below -1000)
|
|
256
|
+
const needsNormalization = this.children.some(
|
|
257
|
+
(obj) => (obj.zIndex || 0) > 1000 || (obj.zIndex || 0) < -1000
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
if (needsNormalization) {
|
|
261
|
+
// Sort by current z-index
|
|
262
|
+
const sorted = [...this.children].sort(
|
|
263
|
+
(a, b) => (a.zIndex || 0) - (b.zIndex || 0)
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
// Reassign z-indices in increments of 10
|
|
267
|
+
sorted.forEach((obj, i) => {
|
|
268
|
+
obj.zIndex = i * 10;
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
//console.log("Z-indices normalized");
|
|
272
|
+
this._zOrderDirty = true;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Sort the children by z-index if needed before rendering
|
|
278
|
+
* @returns {Array} The sorted or original children array
|
|
279
|
+
*/
|
|
280
|
+
getSortedChildren() {
|
|
281
|
+
if (this.sortByZIndex && this._zOrderDirty) {
|
|
282
|
+
this.children.sort((a, b) => (a.zIndex || 0) - (b.zIndex || 0));
|
|
283
|
+
this._zOrderDirty = false;
|
|
284
|
+
}
|
|
285
|
+
return this.children;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebGL Module for gcanvas
|
|
3
|
+
*
|
|
4
|
+
* Provides optional WebGL rendering capabilities for enhanced visual effects.
|
|
5
|
+
* This is an opt-in feature - shapes default to Canvas 2D rendering.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { WebGLRenderer } from "./webgl-renderer.js";
|
|
9
|
+
export { SPHERE_SHADERS } from "./shaders/sphere-shaders.js";
|