From aa5b77f65b5d80d9b9e8c6b34b071a99ebb69678 Mon Sep 17 00:00:00 2001 From: STEINNI Date: Mon, 17 Nov 2025 17:19:35 +0000 Subject: [PATCH] Three 160, importmap only towards CDN, no more Sparc imports for Three components, kicke outdated outliner, replaced by custom simpler highliter --- app/assets/images/Logo-Emergence-bck.png | Bin 0 -> 42842 bytes app/assets/sfx/intro.js | 6 +- .../editors/EditorsController.json | 5 +- app/controllers/live/DashboardsController.js | 5 +- .../live/DashboardsController.json | 5 +- app/controllers/system/systemController.json | 3 - app/helpers/helpers3D.module.js | 100 ++++++++++++------ app/thirdparty/buildoz/buildoz.js | 8 +- app/views/editors/KeyframeView.html | 12 ++- app/views/editors/KeyframeView.js | 32 +++--- .../editors/modules/agentPreview.module.js | 2 +- app/views/editors/modules/kfArena.module.js | 27 +++-- index.html | 17 ++- 13 files changed, 135 insertions(+), 87 deletions(-) create mode 100644 app/assets/images/Logo-Emergence-bck.png diff --git a/app/assets/images/Logo-Emergence-bck.png b/app/assets/images/Logo-Emergence-bck.png new file mode 100644 index 0000000000000000000000000000000000000000..6d777cf65cc3d9608298d1f51581ec2e8766cd52 GIT binary patch literal 42842 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

XqL9&cr+kvR1y_kCY^db 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 { new THREE.TextureLoader() .setPath('/app/assets/images/') - .load('Logo-Emergence.png', resolve, undefined, reject) + .load('Logo-Emergence-bck.png', resolve, undefined, reject) }) @@ -135,7 +135,7 @@ class Intro{ attenuationColor: new THREE.Color(0x88ffcc), attenuationDistance: 2, color: 0x88ffcc, - depthWrite: false, + depthWrite: true, depthTest: true, transparent: true, }) @@ -221,7 +221,7 @@ class Intro{ } if (!this.planeEE) { const geo = new THREE.PlaneGeometry(planeWidth, planeHeight) - this.matEE = new THREE.MeshBasicMaterial({ map: this.backgroundTextureEE, transparent: false, alphaTest: 0.001, depthWrite:true, depthTest:true }) + this.matEE = new THREE.MeshBasicMaterial({ map: this.backgroundTextureEE, transparent: false, depthWrite:true, depthTest:true }) this.matEE.defines = this.matEE.defines || {} this.matEE.defines.USE_UV = "" this.matEE.onBeforeCompile = shader => { diff --git a/app/controllers/editors/EditorsController.json b/app/controllers/editors/EditorsController.json index 67ddfbb..a8fab88 100644 --- a/app/controllers/editors/EditorsController.json +++ b/app/controllers/editors/EditorsController.json @@ -31,10 +31,7 @@ "/helpers/validators", "/helpers/activeAttributes", "/helpers/helpers3D.module", - "/helpers/formBuilder", - "/thirdparty/Three/three.module", - "/thirdparty/Three/OrbitControls.module", - "/thirdparty/Three/tween.module" + "/helpers/formBuilder" ], "assets": { "styles": [ diff --git a/app/controllers/live/DashboardsController.js b/app/controllers/live/DashboardsController.js index ba19c32..b01d8d0 100644 --- a/app/controllers/live/DashboardsController.js +++ b/app/controllers/live/DashboardsController.js @@ -4,6 +4,7 @@ class DashboardsController extends WindozController { super(params) this.arenaConfig = app.Assets.Store.json.arenaConfig this.eventsMapping = app.Assets.Store.json.eventsMapping + console.log('=============>DashboardsController constructor') } @@ -16,7 +17,7 @@ class DashboardsController extends WindozController { const models = { agents : new AgentsModel('/agents') } - +console.log('=============>spaceViewer 0') const ttb = new app.LoadedModules.Threetobus({ eventsMapping: this.eventsMapping, sceneSize: this.arenaConfig.arenaSize, @@ -34,7 +35,7 @@ class DashboardsController extends WindozController { //TODO: eventsMapping: address child by suffix in assignations - +console.log('=============>spaceViewer 1') this.loadWindow( 'visualisers/SpaceView', { diff --git a/app/controllers/live/DashboardsController.json b/app/controllers/live/DashboardsController.json index f4bf03c..16f9af9 100644 --- a/app/controllers/live/DashboardsController.json +++ b/app/controllers/live/DashboardsController.json @@ -22,10 +22,7 @@ "/helpers/basicDialogs", "/helpers/validators", "/helpers/activeAttributes", - "/helpers/helpers3D.module", - "/thirdparty/Three/three.module", - "/thirdparty/Three/OrbitControls.module", - "/thirdparty/Three/tween.module", + "/helpers/helpers3D.module", "/thirdparty/Threetobus/threetobus.module" ], "assets": { diff --git a/app/controllers/system/systemController.json b/app/controllers/system/systemController.json index 0dfb6bd..92f9085 100755 --- a/app/controllers/system/systemController.json +++ b/app/controllers/system/systemController.json @@ -45,9 +45,6 @@ "json": [ { "id": "user-roles", "name": "global/user-roles.json" }, { "id": "user-messages", "name": "system/user-messages.json" } - ], - "html": [ - { "id":"toto", "name": "toto.html"} ] } } \ No newline at end of file diff --git a/app/helpers/helpers3D.module.js b/app/helpers/helpers3D.module.js index 200f0f4..32570de 100644 --- a/app/helpers/helpers3D.module.js +++ b/app/helpers/helpers3D.module.js @@ -1,9 +1,10 @@ -import * as THREE from '/app/thirdparty/Three/three.module.js' -import { EffectComposer } from '/app/thirdparty/Three/postprocessing/EffectComposer.module.js' -import { RenderPass } from '/app/thirdparty/Three/postprocessing/RenderPass.module.js' -import { OutlinePass } from '/app/thirdparty/Three/postprocessing/OutlinePass.module.js' -import { ShaderPass } from '/app/thirdparty/Three/postprocessing/ShaderPass.module.js' -import { GammaCorrectionShader } from '/app/thirdparty/Three/shaders/GammaCorrectionShader.module.js' +import * as THREE from 'three' +// import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.module.js' +// import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.module.js' +// import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.module.js' +// import { ShaderPass } from 'three/examples/jsm/shaders/GammaCorrectionShader.module.js' +// import { GammaCorrectionShader } from 'three/examples/jsm/shaders/GammaCorrectionShader.module.js' + if(!app.helpers) app.helpers = {} /** @@ -75,10 +76,6 @@ app.helpers.helpers3D = { // 2️. Update camera aspect ratio this.camera.aspect = width / height this.camera.updateProjectionMatrix() - - // 3️. Update postprocessing chain - if (this.composer) this.composer.setSize(width, height) - if (this.outlinePass) this.outlinePass.setSize(width, height) } return needResize }, @@ -122,32 +119,71 @@ app.helpers.helpers3D = { const top = center.clone().addScaledVector(up, height / 2 + offset) return top }, + - init3DHighlighter(options){ - if (!this.composer) { - this.composer = new EffectComposer(this.renderer) - this.composer.addPass(new RenderPass(this.scene, this.camera)) - } - - if (!this.outlinePass) { - this.outlinePass = new OutlinePass( - new THREE.Vector2(this.canvasEl.innerWidth, this.canvasEl.innerHeight), - this.scene, this.camera - ) + outlineMaterial: new THREE.MeshBasicMaterial({ + color: 0xffff00, + side: THREE.BackSide, + transparent: true, + opacity: 0.5, + depthTest: true, + depthWrite: false, + stencilWrite: true, + stencilFunc: THREE.AlwaysStencilFunc, + stencilRef: 1, + stencilMask: 0xff, + stencilFail: THREE.KeepStencilOp, + stencilZFail: THREE.KeepStencilOp, + stencilZPass: THREE.ReplaceStencilOp + }), - this.outlinePass.edgeStrength = options.edgeStrength || 3 - this.outlinePass.visibleEdgeColor.set(options.visibleEdgeColor || 0xffffff) - this.outlinePass.edgeGlow = options.edgeGlow || 0 - this.outlinePass.edgeThickness = options.edgeThickness || 1 - this.outlinePass.pulsePeriod = options.pulsePeriod || 0 + normalStencilMat: new THREE.MeshBasicMaterial({ + color: 0xffffff, + stencilWrite: true, + stencilRef: 0, + stencilFunc: THREE.NotEqualStencilFunc, + stencilFail: THREE.KeepStencilOp, + stencilZFail: THREE.KeepStencilOp, + stencilZPass: THREE.KeepStencilOp + }), - this.composer.addPass(this.outlinePass) - this.highlighted3DObjects = [] - this.outlinePass.selectedObjects = this.highlighted3DObjects + highlight3DObj(obj, scene) { + // Scaled up Mesh to stencil + obj.traverse(child => { + if (child.isMesh) { + const inflated = new THREE.Mesh(child.geometry, this.outlineMaterial) + inflated.position.copy(child.getWorldPosition(new THREE.Vector3())) + inflated.quaternion.copy(child.getWorldQuaternion(new THREE.Quaternion())) + inflated.scale.copy(child.getWorldScale(new THREE.Vector3())).multiplyScalar(1.05) - this.composer.addPass(new ShaderPass(GammaCorrectionShader)) - } - + scene.add(inflated) + child._outlineMesh = inflated + } + }) + + // Normal Mesh render only if stencil != 1 + obj.traverse(child => { + if (child.isMesh) { + child._savedMaterial = child.material + child.material = this.normalStencilMat + } + }) + }, + + clearHighlight3DObj(obj,scene) { + obj.traverse(child => { + if (child._outlineMesh) { + scene.remove(child._outlineMesh) + child._outlineMesh.geometry.dispose() + child._outlineMesh.material.dispose() + delete child._outlineMesh + } + + if (child._savedMaterial) { + child.material = child._savedMaterial + delete child._savedMaterial + } + }) }, makePivotAtGeomCenter(object, scene) { diff --git a/app/thirdparty/buildoz/buildoz.js b/app/thirdparty/buildoz/buildoz.js index 1539cf0..6107f78 100644 --- a/app/thirdparty/buildoz/buildoz.js +++ b/app/thirdparty/buildoz/buildoz.js @@ -260,10 +260,8 @@ class BZslidePane extends Buildoz { } this.dragMove = this.dragMove.bind(this) this.dragEnd = this.dragEnd.bind(this) - this._observer = new MutationObserver(muts => { // Fill with innerHTML or other DOM manip should not allow coating to be removed - console.log('mutation...') - this.coat() - }) + // Fill with innerHTML or other DOM manip should not allow coating to be removed + this._observer = new MutationObserver(muts => { this.coat() }) } connectedCallback(){ @@ -277,7 +275,7 @@ class BZslidePane extends Buildoz { this._observer.disconnect() } - coat(){ console.log('coat') + coat(){ if(this.handle && this.querySelector(this.dispatchEvent.handle)) return this._observer.disconnect() if(this.querySelector(this.dispatchEvent.handle)) this.querySelector(this.dispatchEvent.handle).remove() diff --git a/app/views/editors/KeyframeView.html b/app/views/editors/KeyframeView.html index 54f52a8..bb3e84f 100644 --- a/app/views/editors/KeyframeView.html +++ b/app/views/editors/KeyframeView.html @@ -122,7 +122,17 @@

- + +
+
+ JS 3D Console. for help, type "help" +
+
+ + +
+
+
diff --git a/app/views/editors/KeyframeView.js b/app/views/editors/KeyframeView.js index d295aa8..6634c56 100644 --- a/app/views/editors/KeyframeView.js +++ b/app/views/editors/KeyframeView.js @@ -63,17 +63,22 @@ class KeyframeView extends WindozDomContent { this.outputs.btnSaveKF.disabled = true this.outputs.kfName.addEventListener('keyup', this.updateKfButtons.bind(this)) this.currentlySelectedAid = null - this.output('console',` -
-
- JS 3D Console. for help, type "help" -
-
- - -
-
- `) + // this.output('console',` + //
+ //
+ // JS 3D Console. for help, type "help" + //
+ //
+ // + // + //
+ //
+ // `) + + } + + async execCommand(event){ + console.log('cmd:', this.ouputs.caommands) } async onChangeAgent(event){ @@ -86,7 +91,6 @@ class KeyframeView extends WindozDomContent { this.currentAgentType = await this.models.agents.getProperties(this.outputs.agentsSelector.value) this.fillAgentProperties('', this.currentAgentType.atp_props) // Deselect any on-scene selection - this.kfArena.highlighted3DObjects.length = 0 this.currentlySelectedAid = null } } @@ -105,13 +109,13 @@ class KeyframeView extends WindozDomContent { onclickAgent(obj3D){ const aid = obj3D.name - this.kfArena.highlighted3DObjects.length = 0 //truncate but keep the ref ! if(this.currentlySelectedAid == aid){ // Deselect + this.kfArena.clearHighlight3DObj(obj3D, this.kfArena.scene) this.currentlySelectedAid = null } else { // Select this.currentlySelectedAid = aid if(this.kfArena.agents[aid]) { - this.kfArena.highlighted3DObjects.push(obj3D) + this.kfArena.highlight3DObj(obj3D, this.kfArena.scene) this.fillAgentProperties(aid, this.kfArena.agents[aid].props, this.kfArena.agents[aid].values) this.notUserChange = true this.outputs.agentsSelector.value = this.kfArena.agents[aid].type diff --git a/app/views/editors/modules/agentPreview.module.js b/app/views/editors/modules/agentPreview.module.js index 02367da..233a41d 100644 --- a/app/views/editors/modules/agentPreview.module.js +++ b/app/views/editors/modules/agentPreview.module.js @@ -1,4 +1,4 @@ -import * as THREE from '/app/thirdparty/Three/three.module.js' +import * as THREE from 'three' //'/app/thirdparty/Three/three.module.js' export class AgentPreview{ diff --git a/app/views/editors/modules/kfArena.module.js b/app/views/editors/modules/kfArena.module.js index 34faa54..53b2435 100644 --- a/app/views/editors/modules/kfArena.module.js +++ b/app/views/editors/modules/kfArena.module.js @@ -1,6 +1,6 @@ -import * as THREE from '/app/thirdparty/Three/three.module.js' -import { OrbitControls } from '/app/thirdparty/Three/OrbitControls.module.js' -import * as TWEEN from '/app/thirdparty/Three/tween.module.js' +import * as THREE from 'three' // '/app/thirdparty/Three/three.module.js' +import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js' // '/app/thirdparty/Three/OrbitControls.module.js' +import * as TWEEN from 'three/examples/jsm/libs/tween.module.js' //'/app/thirdparty/Three/tween.module.js' export class kfArena{ @@ -56,15 +56,13 @@ export class kfArena{ this.axes.layers.set(2) this.scene.add(this.axes) - this.renderer = new THREE.WebGLRenderer({ antialias: true, canvas: this.canvasEl }) - this.init3DHighlighter({ - edgeStrength: 3, - visibleEdgeColor: 0xffff00, - edgeGlow: 1, - edgeThickness: 4, - pulsePeriod: 2, - }) - this.canvasEl.addEventListener('click', this.onSceneClick.bind(this)) + this.renderer = new THREE.WebGLRenderer({ antialias: true, canvas: this.canvasEl, stencil: true }) + // this.renderer.physicallyCorrectLights = true + // this.renderer.outputColorSpace = THREE.SRGBColorSpace + // this.renderer.toneMapping = THREE.ACESFilmicToneMapping + // this.renderer.toneMappingExposure = 1 + + this.canvasEl.addEventListener('click', this.onSceneClick.bind(this)) } startRendering(){ @@ -74,9 +72,8 @@ export class kfArena{ render() { TWEEN.update() - this.resizeRendererToDisplaySize() - if(this.composer) this.composer.render() - else this.renderer.render(this.scene, this.camera) + const resized = this.resizeRendererToDisplaySize() + this.renderer.render(this.scene, this.camera) requestAnimationFrame(this.render.bind(this)) } diff --git a/index.html b/index.html index 91d3afa..7b3eea1 100644 --- a/index.html +++ b/index.html @@ -8,14 +8,25 @@ + +