Skip to content

Commit

Permalink
Convert to THREE.Points
Browse files Browse the repository at this point in the history
  • Loading branch information
WestLangley committed Oct 27, 2018
1 parent c0dbf05 commit 5e23ac5
Showing 1 changed file with 81 additions and 18 deletions.
99 changes: 81 additions & 18 deletions examples/webgl_points_waves.html
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,36 @@
<script src="js/WebGL.js"></script>
<script src="js/libs/stats.min.js"></script>

<script type="x-shader/x-vertex" id="vertexshader">

attribute float scale;

void main() {

vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );

gl_PointSize = scale * ( 300.0 / - mvPosition.z );

gl_Position = projectionMatrix * mvPosition;

}

</script>

<script type="x-shader/x-fragment" id="fragmentshader">

uniform vec3 color;

void main() {

if ( length( gl_PointCoord - vec2( 0.5, 0.5 ) ) > 0.475 ) discard;

gl_FragColor = vec4( color, 1.0 );

}

</script>

<script>

if ( WEBGL.isWebGLAvailable() === false ) {
Expand All @@ -53,7 +83,7 @@
var container, stats;
var camera, scene, renderer;

var particles, particle, count = 0;
var particles, count = 0;

var mouseX = 0, mouseY = 0;

Expand All @@ -73,30 +103,54 @@

scene = new THREE.Scene();

particles = new Array();

var material = new THREE.SpriteMaterial( {
//

map: new THREE.TextureLoader().load( 'textures/sprites/circle.png' ),
var numParticles = AMOUNTX * AMOUNTY;

} );
var positions = new Float32Array( numParticles * 3 );
var scales = new Float32Array( numParticles );

var i = 0;
var i = 0, j = 0;

for ( var ix = 0; ix < AMOUNTX; ix ++ ) {

for ( var iy = 0; iy < AMOUNTY; iy ++ ) {

particle = particles[ i ++ ] = new THREE.Sprite( material );
particle.position.x = ix * SEPARATION - ( ( AMOUNTX * SEPARATION ) / 2 );
particle.position.z = iy * SEPARATION - ( ( AMOUNTY * SEPARATION ) / 2 );
scene.add( particle );
positions[ i ] = ix * SEPARATION - ( ( AMOUNTX * SEPARATION ) / 2 ); // x
positions[ i + 1 ] = 0; // y
positions[ i + 2 ] = iy * SEPARATION - ( ( AMOUNTY * SEPARATION ) / 2 ); // z

scales[ j ] = 1;

i += 3;
j ++;

}

}

renderer = new THREE.WebGLRenderer();
var geometry = new THREE.BufferGeometry();
geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
geometry.addAttribute( 'scale', new THREE.BufferAttribute( scales, 1 ) );

var material = new THREE.ShaderMaterial( {

uniforms: {
color: { value: new THREE.Color( 0xffffff ) },
},
vertexShader: document.getElementById( 'vertexshader' ).textContent,
fragmentShader: document.getElementById( 'fragmentshader' ).textContent

} );

//

particles = new THREE.Points( geometry, material );
scene.add( particles );

//

renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
container.appendChild( renderer.domElement );
Expand Down Expand Up @@ -178,22 +232,31 @@
camera.position.y += ( - mouseY - camera.position.y ) * .05;
camera.lookAt( scene.position );

var i = 0;
var positions = particles.geometry.attributes.position.array;
var scales = particles.geometry.attributes.scale.array;

var i = 0, j = 0;

for ( var ix = 0; ix < AMOUNTX; ix ++ ) {

for ( var iy = 0; iy < AMOUNTY; iy ++ ) {

particle = particles[ i ++ ];
particle.position.y = ( Math.sin( ( ix + count ) * 0.3 ) * 50 ) +
( Math.sin( ( iy + count ) * 0.5 ) * 50 );
particle.scale.x = particle.scale.y = ( Math.sin( ( ix + count ) * 0.3 ) + 1 ) * 4 +
( Math.sin( ( iy + count ) * 0.5 ) + 1 ) * 4;
positions[ i + 1 ] = ( Math.sin( ( ix + count ) * 0.3 ) * 50 ) +
( Math.sin( ( iy + count ) * 0.5 ) * 50 );

scales[ j ] = ( Math.sin( ( ix + count ) * 0.3 ) + 1 ) * 8 +
( Math.sin( ( iy + count ) * 0.5 ) + 1 ) * 8;

i += 3;
j ++;

}

}

particles.geometry.attributes.position.needsUpdate = true;
particles.geometry.attributes.scale.needsUpdate = true;

renderer.render( scene, camera );

count += 0.1;
Expand Down

0 comments on commit 5e23ac5

Please sign in to comment.