|
@@ -6710,6 +6710,7 @@ function WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {
|
|
|
uvScale: gl.getUniformLocation( program, 'uvScale' ),
|
|
|
|
|
|
rotation: gl.getUniformLocation( program, 'rotation' ),
|
|
|
+ center: gl.getUniformLocation( program, 'center' ),
|
|
|
scale: gl.getUniformLocation( program, 'scale' ),
|
|
|
|
|
|
color: gl.getUniformLocation( program, 'color' ),
|
|
@@ -6826,6 +6827,7 @@ function WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {
|
|
|
// render all sprites
|
|
|
|
|
|
var scale = [];
|
|
|
+ var center = [];
|
|
|
|
|
|
for ( var i = 0, l = sprites.length; i < l; i ++ ) {
|
|
|
|
|
@@ -6844,6 +6846,9 @@ function WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {
|
|
|
scale[ 0 ] = spriteScale.x;
|
|
|
scale[ 1 ] = spriteScale.y;
|
|
|
|
|
|
+ center[ 0 ] = sprite.center.x - 0.5;
|
|
|
+ center[ 1 ] = sprite.center.y - 0.5;
|
|
|
+
|
|
|
var fogType = 0;
|
|
|
|
|
|
if ( scene.fog && material.fog ) {
|
|
@@ -6875,6 +6880,7 @@ function WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {
|
|
|
gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );
|
|
|
|
|
|
gl.uniform1f( uniforms.rotation, material.rotation );
|
|
|
+ gl.uniform2fv( uniforms.center, center );
|
|
|
gl.uniform2fv( uniforms.scale, scale );
|
|
|
|
|
|
state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );
|
|
@@ -6914,6 +6920,7 @@ function WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {
|
|
|
'uniform mat4 modelViewMatrix;',
|
|
|
'uniform mat4 projectionMatrix;',
|
|
|
'uniform float rotation;',
|
|
|
+ 'uniform vec2 center;',
|
|
|
'uniform vec2 scale;',
|
|
|
'uniform vec2 uvOffset;',
|
|
|
'uniform vec2 uvScale;',
|
|
@@ -6928,7 +6935,7 @@ function WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {
|
|
|
|
|
|
' vUV = uvOffset + uv * uvScale;',
|
|
|
|
|
|
- ' vec2 alignedPosition = position * scale;',
|
|
|
+ ' vec2 alignedPosition = ( position - center ) * scale;',
|
|
|
|
|
|
' vec2 rotatedPosition;',
|
|
|
' rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',
|
|
@@ -7926,6 +7933,107 @@ Object.assign( Box3.prototype, {
|
|
|
|
|
|
},
|
|
|
|
|
|
+ intersectsTriangle: ( function () {
|
|
|
+
|
|
|
+ // triangle centered vertices
|
|
|
+ var v0 = new Vector3();
|
|
|
+ var v1 = new Vector3();
|
|
|
+ var v2 = new Vector3();
|
|
|
+
|
|
|
+ // triangle edge vectors
|
|
|
+ var f0 = new Vector3();
|
|
|
+ var f1 = new Vector3();
|
|
|
+ var f2 = new Vector3();
|
|
|
+
|
|
|
+ var testAxis = new Vector3();
|
|
|
+
|
|
|
+ var center = new Vector3();
|
|
|
+ var extents = new Vector3();
|
|
|
+
|
|
|
+ var triangleNormal = new Vector3();
|
|
|
+
|
|
|
+ function satForAxes( axes ) {
|
|
|
+
|
|
|
+ var i, j;
|
|
|
+
|
|
|
+ for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) {
|
|
|
+
|
|
|
+ testAxis.fromArray( axes, i );
|
|
|
+ // project the aabb onto the seperating axis
|
|
|
+ var r = extents.x * Math.abs( testAxis.x ) + extents.y * Math.abs( testAxis.y ) + extents.z * Math.abs( testAxis.z );
|
|
|
+ // project all 3 vertices of the triangle onto the seperating axis
|
|
|
+ var p0 = v0.dot( testAxis );
|
|
|
+ var p1 = v1.dot( testAxis );
|
|
|
+ var p2 = v2.dot( testAxis );
|
|
|
+ // actual test, basically see if either of the most extreme of the triangle points intersects r
|
|
|
+ if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {
|
|
|
+
|
|
|
+ // points of the projected triangle are outside the projected half-length of the aabb
|
|
|
+ // the axis is seperating and we can exit
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return function intersectsTriangle( triangle ) {
|
|
|
+
|
|
|
+ if ( this.isEmpty() ) {
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // compute box center and extents
|
|
|
+ this.getCenter( center );
|
|
|
+ extents.subVectors( this.max, center );
|
|
|
+
|
|
|
+ // translate triangle to aabb origin
|
|
|
+ v0.subVectors( triangle.a, center );
|
|
|
+ v1.subVectors( triangle.b, center );
|
|
|
+ v2.subVectors( triangle.c, center );
|
|
|
+
|
|
|
+ // compute edge vectors for triangle
|
|
|
+ f0.subVectors( v1, v0 );
|
|
|
+ f1.subVectors( v2, v1 );
|
|
|
+ f2.subVectors( v0, v2 );
|
|
|
+
|
|
|
+ // test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb
|
|
|
+ // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation
|
|
|
+ // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)
|
|
|
+ var axes = [
|
|
|
+ 0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y,
|
|
|
+ f0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x,
|
|
|
+ - f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0
|
|
|
+ ];
|
|
|
+ if ( ! satForAxes( axes ) ) {
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // test 3 face normals from the aabb
|
|
|
+ axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];
|
|
|
+ if ( ! satForAxes( axes ) ) {
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // finally testing the face normal of the triangle
|
|
|
+ // use already existing triangle edge vectors here
|
|
|
+ triangleNormal.crossVectors( f0, f1 );
|
|
|
+ axes = [ triangleNormal.x, triangleNormal.y, triangleNormal.z ];
|
|
|
+ return satForAxes( axes );
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ } )(),
|
|
|
+
|
|
|
clampPoint: function ( point, optionalTarget ) {
|
|
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
@@ -15315,6 +15423,12 @@ Object.assign( Triangle.prototype, {
|
|
|
|
|
|
},
|
|
|
|
|
|
+ intersectsBox: function ( box ) {
|
|
|
+
|
|
|
+ return box.intersectsTriangle( this );
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
closestPointToPoint: function () {
|
|
|
|
|
|
var plane = new Plane();
|
|
@@ -21809,7 +21923,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
state.setPolygonOffset( false );
|
|
|
|
|
|
- scene.onAfterRender( _this, scene, camera, renderTarget );
|
|
|
+ scene.onAfterRender( _this, scene, camera );
|
|
|
|
|
|
if ( vr.enabled ) {
|
|
|
|
|
@@ -23353,6 +23467,8 @@ function Sprite( material ) {
|
|
|
|
|
|
this.material = ( material !== undefined ) ? material : new SpriteMaterial();
|
|
|
|
|
|
+ this.center = new Vector2( 0.5, 0.5 );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
@@ -23398,8 +23514,19 @@ Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
|
|
return new this.constructor( this.material ).copy( this );
|
|
|
|
|
|
+ },
|
|
|
+
|
|
|
+ copy: function ( source ) {
|
|
|
+
|
|
|
+ Object3D.prototype.copy.call( this, source );
|
|
|
+
|
|
|
+ if ( source.center !== undefined ) this.center.copy( source.center );
|
|
|
+
|
|
|
+ return this;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+
|
|
|
} );
|
|
|
|
|
|
/**
|
|
@@ -37358,8 +37485,7 @@ function createPath( char, divisions, scale, offsetX, offsetY, data ) {
|
|
|
|
|
|
var path = new ShapePath();
|
|
|
|
|
|
- var pts = [];
|
|
|
- var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;
|
|
|
+ var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;
|
|
|
|
|
|
if ( glyph.o ) {
|
|
|
|
|
@@ -37398,17 +37524,6 @@ function createPath( char, divisions, scale, offsetX, offsetY, data ) {
|
|
|
|
|
|
path.quadraticCurveTo( cpx1, cpy1, cpx, cpy );
|
|
|
|
|
|
- laste = pts[ pts.length - 1 ];
|
|
|
-
|
|
|
- if ( laste ) {
|
|
|
-
|
|
|
- cpx0 = laste.x;
|
|
|
- cpy0 = laste.y;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
break;
|
|
|
|
|
|
case 'b': // bezierCurveTo
|
|
@@ -37422,17 +37537,6 @@ function createPath( char, divisions, scale, offsetX, offsetY, data ) {
|
|
|
|
|
|
path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );
|
|
|
|
|
|
- laste = pts[ pts.length - 1 ];
|
|
|
-
|
|
|
- if ( laste ) {
|
|
|
-
|
|
|
- cpx0 = laste.x;
|
|
|
- cpy0 = laste.y;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
break;
|
|
|
|
|
|
}
|