Browse Source

hold Matrix4 elements in double precision until uploaded to GL

foijord 8 years ago
parent
commit
08ecb86e01
4 changed files with 23 additions and 20 deletions
  1. 8 7
      build/three.js
  2. 8 7
      build/three.module.js
  3. 4 4
      src/math/Matrix4.js
  4. 3 2
      src/renderers/webgl/WebGLUniforms.js

+ 8 - 7
build/three.js

@@ -3343,14 +3343,14 @@
 
 
 	function Matrix4() {
 	function Matrix4() {
 
 
-		this.elements = new Float32Array( [
+		this.elements = [
 
 
 			1, 0, 0, 0,
 			1, 0, 0, 0,
 			0, 1, 0, 0,
 			0, 1, 0, 0,
 			0, 0, 1, 0,
 			0, 0, 1, 0,
 			0, 0, 0, 1
 			0, 0, 0, 1
 
 
-		] );
+		];
 
 
 		if ( arguments.length > 0 ) {
 		if ( arguments.length > 0 ) {
 
 
@@ -3402,7 +3402,7 @@
 
 
 		copy: function ( m ) {
 		copy: function ( m ) {
 
 
-			this.elements.set( m.elements );
+			this.elements = m.emements.slice();
 
 
 			return this;
 			return this;
 
 
@@ -4130,7 +4130,7 @@
 
 
 				// scale the rotation part
 				// scale the rotation part
 
 
-				matrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()
+				matrix.elements = this.elements.slice(); // at this point matrix is incomplete so we can't use .copy()
 
 
 				var invSX = 1 / sx;
 				var invSX = 1 / sx;
 				var invSY = 1 / sy;
 				var invSY = 1 / sy;
@@ -4482,8 +4482,9 @@
 
 
 	function setValue4fm( gl, v ) {
 	function setValue4fm( gl, v ) {
 
 
-		gl.uniformMatrix4fv( this.addr, false, v.elements || v );
-
+		if ( v.elements === undefined ) { gl.uniformMatrix4fv( this.addr, false, v ); }
+		else { gl.uniformMatrix4fv( this.addr, false, new Float32Array(v.elements) ); }
+		
 	}
 	}
 
 
 	// Single texture (2D / Cube)
 	// Single texture (2D / Cube)
@@ -4770,7 +4771,7 @@
 
 
 		var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
 		var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
 
 
-		for ( var i = 0; i !== n; ++ i ) {
+		for ( var i = 0; i < n; ++ i ) {
 
 
 			var info = gl.getActiveUniform( program, i ),
 			var info = gl.getActiveUniform( program, i ),
 				path = info.name,
 				path = info.name,

+ 8 - 7
build/three.module.js

@@ -3337,14 +3337,14 @@ Vector3.prototype = {
 
 
 function Matrix4() {
 function Matrix4() {
 
 
-	this.elements = new Float32Array( [
+	this.elements = [
 
 
 		1, 0, 0, 0,
 		1, 0, 0, 0,
 		0, 1, 0, 0,
 		0, 1, 0, 0,
 		0, 0, 1, 0,
 		0, 0, 1, 0,
 		0, 0, 0, 1
 		0, 0, 0, 1
 
 
-	] );
+	];
 
 
 	if ( arguments.length > 0 ) {
 	if ( arguments.length > 0 ) {
 
 
@@ -3396,7 +3396,7 @@ Matrix4.prototype = {
 
 
 	copy: function ( m ) {
 	copy: function ( m ) {
 
 
-		this.elements.set( m.elements );
+		this.elements = m.emements.slice();
 
 
 		return this;
 		return this;
 
 
@@ -4124,7 +4124,7 @@ Matrix4.prototype = {
 
 
 			// scale the rotation part
 			// scale the rotation part
 
 
-			matrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()
+			matrix.elements = this.elements.slice(); // at this point matrix is incomplete so we can't use .copy()
 
 
 			var invSX = 1 / sx;
 			var invSX = 1 / sx;
 			var invSY = 1 / sy;
 			var invSY = 1 / sy;
@@ -4476,8 +4476,9 @@ function setValue3fm( gl, v ) {
 
 
 function setValue4fm( gl, v ) {
 function setValue4fm( gl, v ) {
 
 
-	gl.uniformMatrix4fv( this.addr, false, v.elements || v );
-
+	if ( v.elements === undefined ) { gl.uniformMatrix4fv( this.addr, false, v ); }
+	else { gl.uniformMatrix4fv( this.addr, false, new Float32Array(v.elements) ); }
+	
 }
 }
 
 
 // Single texture (2D / Cube)
 // Single texture (2D / Cube)
@@ -4764,7 +4765,7 @@ function WebGLUniforms( gl, program, renderer ) {
 
 
 	var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
 	var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
 
 
-	for ( var i = 0; i !== n; ++ i ) {
+	for ( var i = 0; i < n; ++ i ) {
 
 
 		var info = gl.getActiveUniform( program, i ),
 		var info = gl.getActiveUniform( program, i ),
 			path = info.name,
 			path = info.name,

+ 4 - 4
src/math/Matrix4.js

@@ -16,14 +16,14 @@ import { Vector3 } from './Vector3';
 
 
 function Matrix4() {
 function Matrix4() {
 
 
-	this.elements = new Float32Array( [
+	this.elements = [
 
 
 		1, 0, 0, 0,
 		1, 0, 0, 0,
 		0, 1, 0, 0,
 		0, 1, 0, 0,
 		0, 0, 1, 0,
 		0, 0, 1, 0,
 		0, 0, 0, 1
 		0, 0, 0, 1
 
 
-	] );
+	];
 
 
 	if ( arguments.length > 0 ) {
 	if ( arguments.length > 0 ) {
 
 
@@ -75,7 +75,7 @@ Matrix4.prototype = {
 
 
 	copy: function ( m ) {
 	copy: function ( m ) {
 
 
-		this.elements.set( m.elements );
+		this.elements = m.emements.slice();
 
 
 		return this;
 		return this;
 
 
@@ -803,7 +803,7 @@ Matrix4.prototype = {
 
 
 			// scale the rotation part
 			// scale the rotation part
 
 
-			matrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()
+			matrix.elements = this.elements.slice(); // at this point matrix is incomplete so we can't use .copy()
 
 
 			var invSX = 1 / sx;
 			var invSX = 1 / sx;
 			var invSY = 1 / sy;
 			var invSY = 1 / sy;

+ 3 - 2
src/renderers/webgl/WebGLUniforms.js

@@ -179,8 +179,9 @@ function setValue3fm( gl, v ) {
 
 
 function setValue4fm( gl, v ) {
 function setValue4fm( gl, v ) {
 
 
-	gl.uniformMatrix4fv( this.addr, false, v.elements || v );
-
+	if ( v.elements === undefined ) { gl.uniformMatrix4fv( this.addr, false, v ); }
+	else { gl.uniformMatrix4fv( this.addr, false, new Float32Array(v.elements) ); }
+	
 }
 }
 
 
 // Single texture (2D / Cube)
 // Single texture (2D / Cube)