-- Leo's gemini proxy

-- Connecting to git.thebackupbox.net:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

repo: janusweb
action: commit
revision:
path_from:
revision_from: bbc73612f00db013f59e09757431555586a0e73a:
path_to:
revision_to:

git.thebackupbox.net

janusweb

git://git.thebackupbox.net/janusweb

commit bbc73612f00db013f59e09757431555586a0e73a
Author: James Baicoianu <james_github@baicoianu.com>
Date:   Tue Jul 23 12:11:54 2019 -0700

    Support for depth_write/depth_Test, per-particle color, opacity, and size.

diff --git a/scripts/janusparticle.js b/scripts/janusparticle.js

index ab14abaec457b2765e63c9187e284c49d0e2e841..

index ..7e5f326929a7a94cc5b499e5f005192662a68ebe 100644

--- a/scripts/janusparticle.js
+++ b/scripts/janusparticle.js
@@ -1,4 +1,30 @@
 elation.require(['janusweb.janusbase'], function() {
+
+  let shaderdef = {
+    vertex: `
+      attribute float size;
+      attribute vec4 customColor;
+      varying vec4 vColor;
+      void main() {
+        vColor = customColor;
+        vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
+        gl_PointSize = size * ( 300.0 / -mvPosition.z );
+        gl_Position = projectionMatrix * mvPosition;
+      }
+    `,
+    fragment: `
+      uniform vec3 color;
+      uniform sampler2D texture;
+      varying vec4 vColor;
+      void main() {
+        gl_FragColor = vec4( color * vColor.rgb, vColor.a );
+        #ifdef USE_MAP
+          gl_FragColor = gl_FragColor * texture2D( texture, gl_PointCoord );
+        #endif
+      }
+    `
+  };
+
   elation.component.add('engine.things.janusparticle', function() {
     this.postinit = function() {
       elation.engine.things.janusparticle.extendclass.postinit.call(this);
@@ -26,6 +52,8 @@ elation.require(['janusweb.janusbase'], function() {
         refreshrate: { type: 'int', default: 30 },
         blend_src: { type: 'string', default: 'src_alpha', set: this.updateMaterial },
         blend_dest: { type: 'string', default: 'one_minus_src_alpha', set: this.updateMaterial },
+        depthwrite: { type: 'bool', default: false },
+        depthtest: { type: 'bool', default: true },
       });
       this.particles = [];
       this.emitted = 0;
@@ -59,7 +87,7 @@ elation.require(['janusweb.janusbase'], function() {
           if (asset.loaded) {
             this.loaded = true;
           } else {
-            elation.events.add(asset, 'asset_load_complete', elation.bind(this, function() { this.loaded = true; this.createParticles(); this.start(); }));
+            elation.events.add(asset, 'asset_load_complete', elation.bind(this, function() { this.loaded = true; this.createParticles(false); this.start(); }));
           }
         }
       } else {
@@ -71,6 +99,7 @@ elation.require(['janusweb.janusbase'], function() {
         this.start();
       }

+/*
       var mat = new THREE.PointsMaterial({
         //color: this.color,
         map: texture,
@@ -81,9 +110,30 @@ elation.require(['janusweb.janusbase'], function() {
         //blending: THREE.AdditiveBlending,
         vertexColors: THREE.VertexColors
       });
+*/
+      let shaderdefines = {};
+      if (texture) {
+        shaderdefines.USE_MAP = 1;
+      }
+      var mat = new THREE.ShaderMaterial( {
+        uniforms: {
+          color: { value: new THREE.Color( 0xffffff ) },
+          texture: { value: texture },
+        },
+        defines: shaderdefines,
+        vertexShader: shaderdef.vertex,
+        fragmentShader: shaderdef.fragment,
+        //blending: THREE.AdditiveBlending,
+        transparent: true,
+        alphaTest: .001,
+        depthWrite: this.depthwrite,
+        depthTest: this.depthtest,
+      } );
+
       this.material = mat;
       this.scale.set(1,1,1);
       var obj = new THREE.Points(geo, mat);
+      if (this.renderorder) obj.renderOrder = this.renderorder;
       return obj;
     }
     this.updateGeometry = function() {
@@ -119,8 +169,10 @@ elation.require(['janusweb.janusbase'], function() {
       this.properties.particle_vel.copy(this.properties.velocity);
       this.properties.velocity.set(0,0,0); // FIXME - hack to override "vel" property mapping
     }
-    this.createParticles = function() {
-      this.particles = [];
+    this.createParticles = function(reset=true) {
+      if (reset) {
+        this.particles = [];
+      }

       if (this.emitmesh && !this.emitpoints) {
         this.extractEmitPoints(this.emitmesh);
@@ -129,26 +181,33 @@ elation.require(['janusweb.janusbase'], function() {
       var geo = this.geometry;
       var count = this.count;
       var position = (geo.attributes.position && geo.attributes.position.count == count ? geo.attributes.position.array : new Float32Array(count * 3));
-      var color = (geo.attributes.color && geo.attributes.color.count == count ? geo.attributes.color.array : new Float32Array(count * 3));
+      var color = (geo.attributes.customColor && geo.attributes.customColor.count == count ? geo.attributes.customColor.array : new Float32Array(count * 4));
+      var size = (geo.attributes.size && geo.attributes.size.count == count ? geo.attributes.size.array : new Float32Array(count));

       for (var i = 0; i < count; i++) {
-        var point = this.createPoint();
-        this.resetPoint(point);
-
+        var point = this.particles[i];
+        if (reset || !point) {
+          point = this.createPoint();
+          this.resetPoint(point);
+          this.particles[i] = point;
+        }
         //this.geometry.vertices[i] = point.pos;
-        this.particles[i] = point;

         position[i*3] = point.pos.x;
         position[i*3+1] = point.pos.y;
         position[i*3+2] = point.pos.z;

-        color[i*3] = point.color.r;
-        color[i*3+1] = point.color.g;
-        color[i*3+2] = point.color.b;
+        color[i*4] = point.color.r;
+        color[i*4+1] = point.color.g;
+        color[i*4+2] = point.color.b;
+        color[i*4+3] = point.opacity;
+
+        size[i] = point.size;
       }

       geo.addAttribute('position', new THREE.BufferAttribute(position, 3));
-      geo.addAttribute('color', new THREE.BufferAttribute(color, 3));
+      geo.addAttribute('customColor', new THREE.BufferAttribute(color, 4));
+      geo.addAttribute('size', new THREE.BufferAttribute(size, 1));

       this.created = true;
       this.emitted = 0;
@@ -161,7 +220,7 @@ elation.require(['janusweb.janusbase'], function() {
       var geo = this.geometry;
       var count = this.count;
       var position = geo.attributes.position;
-      var color = geo.attributes.color;
+      var color = geo.attributes.customColor;

       for (var i = 0; i < count; i++) {
         var point = this.particles[i];
@@ -171,9 +230,10 @@ elation.require(['janusweb.janusbase'], function() {
         position[i*3+1] = point.pos.y;
         position[i*3+2] = point.pos.z;

-        color[i*3] = point.color.r;
-        color[i*3+1] = point.color.g;
-        color[i*3+2] = point.color.b;
+        color[i*4] = point.color.r;
+        color[i*4+1] = point.color.g;
+        color[i*4+2] = point.color.b;
+        color[i*4+3] = point.opacity;
       }
     }
     this.updateParticles = function(ev) {
@@ -191,7 +251,7 @@ elation.require(['janusweb.janusbase'], function() {
       if (count <= 0) return;

       if (count != this.particles.length) {
-        this.createParticles();
+        this.createParticles(false);
       }
       for (var i = 0; i < count; i++) {
         var idx = (i + startpoint) % count;
@@ -227,7 +287,7 @@ elation.require(['janusweb.janusbase'], function() {
       }

       this.geometry.attributes.position.needsUpdate = true;
-      this.geometry.attributes.color.needsUpdate = true;
+      this.geometry.attributes.customColor.needsUpdate = true;
     }
     this.updateBoundingSphere = function(vec) {
       if (this.objects['3d']) {
@@ -250,6 +310,8 @@ elation.require(['janusweb.janusbase'], function() {
         scale: new THREE.Vector3(1,1,1),
         color: new THREE.Color(255, 255, 255),
         rand_col: new THREE.Color(0, 0, 0),
+        size: this.particle_scale.x,
+        opacity: 1,
         active: 0,
         start: 0,
         end: 0
@@ -265,16 +327,21 @@ elation.require(['janusweb.janusbase'], function() {
         point.pos.add(tmpvec);

         var pos = this.geometry.attributes.position.array,
-            color = this.geometry.attributes.color.array,
+            color = this.geometry.attributes.customColor.array,
+            size = this.geometry.attributes.size.array,
             offset = idx * 3;

         pos[offset] = point.pos.x;
         pos[offset+1] = point.pos.y;
         pos[offset+2] = point.pos.z;

-        color[offset] = point.color.r;
-        color[offset+1] = point.color.g;
-        color[offset+2] = point.color.b;
+        color[idx*4] = point.color.r;
+        color[idx*4+1] = point.color.g;
+        color[idx*4+2] = point.color.b;
+        color[idx*4+3] = point.opacity;
+
+        size[idx] = point.size;
+        this.updateBoundingSphere(point.pos);
       }
     })();
     this.resetPoint = function(point, idx) {
@@ -296,7 +363,8 @@ elation.require(['janusweb.janusbase'], function() {
           col = point.color,
           rand_vel = this.properties.rand_vel,
           rand_accel = this.properties.rand_accel,
-          rand_col = this.properties.rand_col;
+          rand_col = this.properties.rand_col,
+          rand_scale = this.properties.rand_scale;

       vel.copy(this.properties.particle_vel);
       accel.copy(this.properties.particle_accel);
@@ -318,19 +386,22 @@ elation.require(['janusweb.janusbase'], function() {
         col.g += rand * rand_col.y;
         col.b += rand * rand_col.z;
       }
-
+      point.size = this.particle_scale.x + randomInRange(rand_scale.x);
       if (this.geometry.attributes.position) {
         var pos = this.geometry.attributes.position.array,
-            color = this.geometry.attributes.color.array;
+            color = this.geometry.attributes.customColor.array,
+            size = this.geometry.attributes.size.array;

         pos[idx*3] = pointpos.x;
         pos[idx*3+1] = pointpos.y;
         pos[idx*3+2] = pointpos.z;

-        color[idx*3] = point.color.r;
-        color[idx*3+1] = point.color.g;
-        color[idx*3+2] = point.color.b;
+        color[idx*4] = point.color.r;
+        color[idx*4+1] = point.color.g;
+        color[idx*4+2] = point.color.b;
+        color[idx*4+3] = point.opacity;

+        size[idx] = point.size;
         this.updateBoundingSphere(pointpos);
       }
     }
@@ -356,13 +427,15 @@ elation.require(['janusweb.janusbase'], function() {
       }
     }
     this.start = function() {
-      if (!this.created || this.count >= this.particles.length) {
+      if (!this.created || (this.count > this.particles.length)) {
         this.createParticles();
       } else {
+/*
         for (var i = 0; i < this.particles.length; i++) {
           this.particles[i].active = 0;
         }
         this.resetParticles();
+*/
       }
       this.currentpoint = 0;
       if (this.started) {
@@ -394,24 +467,28 @@ elation.require(['janusweb.janusbase'], function() {
           emitter_scale:  [ 'property', 'emitter_scale'],
           emitter_pos:  [ 'property', 'emitter_pos'],
           opacity:  [ 'property', 'opacity'],
+          depthwrite:  [ 'property', 'depthwrite'],
+          depthtest:  [ 'property', 'depthtest'],
           play:  [ 'function', 'start'],
         };
       }
       return this._proxyobject;
     }
-    this.setPoint = function(pointnum, newpos, newvel, newaccel, newcol) {
+    this.setPoint = function(pointnum, newpos, newvel, newaccel, newcol, newsize, newopacity=1) {
       var offset = pointnum * 3;

       var point = this.particles[pointnum];
       if (!point) {
         point = this.createPoint();
+        point.active = 1;
         this.particles[pointnum] = point;
       }

       point.active = 1;

       var pos = this.geometry.attributes.position.array,
-          color = this.geometry.attributes.color.array;
+          color = this.geometry.attributes.customColor.array,
+          size = this.geometry.attributes.size.array;

       if (newpos) {
         point.pos.copy(newpos);
@@ -434,6 +511,26 @@ elation.require(['janusweb.janusbase'], function() {

       if (newcol) {
         point.color.setRGB(newcol.x, newcol.y, newcol.z);
+
+        color[pointnum*4    ] = newcol.x;
+        color[pointnum*4 + 1] = newcol.y;
+        color[pointnum*4 + 2] = newcol.z;
+        color[pointnum*4 + 3] = elation.utils.any(point.opacity, this.opacity, 1);
+
+        this.geometry.attributes.customColor.needsUpdate = true;
+      }
+      if (newsize) {
+        point.size = newsize;
+        size[pointnum] = newsize;
+
+        this.geometry.attributes.size.needsUpdate = true;
+      }
+      point.opacity = newopacity;
+
+      if (pointnum >= this.count) {
+        this.count = this.particles.length;
+        this.createParticles(false);
+        this.updateParticles();
       }
     }
   }, elation.engine.things.janusbase);

-----END OF PAGE-----

-- Response ended

-- Page fetched on Sun Jun 2 14:44:38 2024