OLD | NEW |
| (Empty) |
1 var tdl=tdl||{};var goog=goog||{};if(!window.Int32Array){window.Int32Array=funct
ion(){};window.Float32Array=function(){};window.Uint16Array=function(){};} | |
2 goog.typedef=true;tdl.global=this;tdl.BROWSER_ONLY=true;tdl.provided_=[];tdl.pro
vide=function(name){if(tdl.getObjectByName(name)&&!tdl.implicitNamespaces_[name]
){throw'Namespace "'+name+'" already declared.';} | |
3 var namespace=name;while((namespace=namespace.substring(0,namespace.lastIndexOf(
'.')))){tdl.implicitNamespaces_[namespace]=true;} | |
4 tdl.exportPath_(name);tdl.provided_.push(name);};tdl.implicitNamespaces_={};tdl.
exportPath_=function(name,opt_object,opt_objectToExportTo){var parts=name.split(
'.');var cur=opt_objectToExportTo||tdl.global;var part;if(!(parts[0]in cur)&&cur
.execScript){cur.execScript('var '+parts[0]);} | |
5 while(parts.length&&(part=parts.shift())){if(!parts.length&&tdl.isDef(opt_object
)){cur[part]=opt_object;}else if(cur[part]){cur=cur[part];}else{cur=cur[part]={}
;}}};tdl.getObjectByName=function(name,opt_obj){var parts=name.split('.');var cu
r=opt_obj||tdl.global;for(var pp=0;pp<parts.length;++pp){var part=parts[pp];if(c
ur[part]){cur=cur[part];}else{return null;}} | |
6 return cur;};tdl.require=function(rule){var dummy=document.getElementsByTagName(
'script').length;if(tdl.getObjectByName(rule)){return;} | |
7 var path=tdl.getPathFromRule_(rule);if(path){tdl.included_[path]=true;tdl.writeS
cripts_();}else{throw new Error('tdl.require could not find: '+rule);}};tdl.base
Path='';tdl.included_={};tdl.dependencies_={visited:{},written:{}};tdl.findBaseP
ath_=function(){var doc=tdl.global.document;if(typeof doc=='undefined'){return;} | |
8 if(tdl.global.BASE_PATH){tdl.basePath=tdl.global.BASE_PATH;return;}else{tdl.glob
al.BASE_PATH=null;} | |
9 var expectedBase='tdl/base.js';var scripts=doc.getElementsByTagName('script');fo
r(var script,i=0;script=scripts[i];i++){var src=script.src;var l=src.length;if(s
rc.substr(l-expectedBase.length)==expectedBase){tdl.basePath=src.substr(0,l-expe
ctedBase.length);return;}}};tdl.writeScriptTag_=function(src){var doc=tdl.global
.document;if(typeof doc!='undefined'&&!tdl.dependencies_.written[src]){tdl.depen
dencies_.written[src]=true;var html='<script type="text/javascript" src="'+ | |
10 src+'"></'+'script>' | |
11 doc.write(html);}};tdl.writeScripts_=function(){var scripts=[];var seenScript={}
;var deps=tdl.dependencies_;function visitNode(path){if(path in deps.written){re
turn;} | |
12 if(path in deps.visited){if(!(path in seenScript)){seenScript[path]=true;scripts
.push(path);} | |
13 return;} | |
14 deps.visited[path]=true;if(!(path in seenScript)){seenScript[path]=true;scripts.
push(path);}} | |
15 for(var path in tdl.included_){if(!deps.written[path]){visitNode(path);}} | |
16 for(var i=0;i<scripts.length;i++){if(scripts[i]){tdl.writeScriptTag_(tdl.basePat
h+scripts[i]);}else{throw Error('Undefined script input');}}};tdl.getPathFromRul
e_=function(rule){var parts=rule.split('.');return parts.join('/')+'.js';};tdl.f
indBasePath_();tdl.isDef=function(val){return typeof val!='undefined';};tdl.expo
rtSymbol=function(publicPath,object,opt_objectToExportTo){tdl.exportPath_(public
Path,object,opt_objectToExportTo);};tdl.provide('tdl.base');tdl.base=tdl.base||{
};tdl.base.isArray=function(value){var valueAsObject=(value);return typeof(value
)==='object'&&value!==null&&'length'in valueAsObject&&'splice'in valueAsObject;}
;tdl.base.maybeDeobfuscateFunctionName_=function(name){return name;};tdl.base.in
herit=function(subClass,superClass){var TmpClass=function(){};TmpClass.prototype
=superClass.prototype;subClass.prototype=new TmpClass();};tdl.base.parseErrorSta
ck=function(excp){var stack=[];var name;var line;if(!excp||!excp.stack){return s
tack;} | |
17 var stacklist=excp.stack.split('\n');for(var i=0;i<stacklist.length-1;i++){var f
ramedata=stacklist[i];name=framedata.match(/^([a-zA-Z0-9_$]*)/)[1];if(name){name
=tdl.base.maybeDeobfuscateFunctionName_(name);}else{name='anonymous';} | |
18 var result=framedata.match(/(.*:[0-9]+)$/);line=result&&result[1];if(!line){line
='(unknown)';} | |
19 stack[stack.length]=name+' : '+line} | |
20 var omitRegexp=/^anonymous :/;while(stack.length&&omitRegexp.exec(stack[stack.le
ngth-1])){stack.length=stack.length-1;} | |
21 return stack;};tdl.base.getFunctionName=function(aFunction){var regexpResult=aFu
nction.toString().match(/function(\s*)(\w*)/);if(regexpResult&RexpResult.length>
=2&RexpResult[2]){return tdl.base.maybeDeobfuscateFunctionName_(regexpResult[2])
;} | |
22 return'anonymous';};tdl.base.formatErrorStack=function(stack){var result='';for(
var i=0;i<stack.length;i++){result+='> '+stack[i]+'\n';} | |
23 return result;};tdl.base.getStackTrace=function(stripCount){var result='';if(typ
eof(arguments.caller)!='undefined'){for(var a=arguments.caller;a!=null;a=a.calle
r){result+='> '+tdl.base.getFunctionName(a.callee)+'\n';if(a.caller==a){result+=
'*';break;}}}else{var testExcp;try{eval('var var;');}catch(testExcp){var stack=t
dl.base.parseErrorStack(testExcp);result+=tdl.base.formatErrorStack(stack.slice(
3+stripCount,stack.length));}} | |
24 return result;};tdl.base.IsMSIE=function(){var ua=navigator.userAgent.toLowerCas
e();var msie=/msie/.test(ua)&&!/opera/.test(ua);return msie;};tdl.provide('tdl.s
tring');tdl.string=tdl.string||{};tdl.string.endsWith=function(haystack,needle){
return haystack.substr(haystack.length-needle.length)===needle;};tdl.string.star
tsWith=function(haystack,needle){return haystack.substr(0,needle.length)===needl
e;};tdl.string.argsToString=function(args){var lastArgWasNumber=false;var numArg
s=args.length;var strs=[];for(var ii=0;ii<numArgs;++ii){var arg=args[ii];if(arg=
==undefined){strs.push('undefined');}else if(typeof arg=='number'){if(lastArgWas
Number){strs.push(", ");} | |
25 if(arg==Math.floor(arg)){strs.push(arg.toFixed(0));}else{strs.push(arg.toFixed(3
));} | |
26 lastArgWasNumber=true;}else if(window.Float32Array&&arg instanceof Float32Array)
{strs.push(tdl.string.argsToString(arg));}else{strs.push(arg.toString());lastArg
WasNumber=false;}} | |
27 return strs.join("");};tdl.string.objToString=function(obj,opt_prefix){var strs=
[];function objToString(obj,opt_prefix){opt_prefix=opt_prefix||"";if(typeof obj=
='object'){if(obj.length!==undefined){for(var ii=0;ii<obj.length;++ii){objToStri
ng(obj[ii],opt_prefix+"["+ii+"]");}}else{for(var name in obj){objToString(obj[na
me],opt_prefix+"."+name);}}}else{strs.push(tdl.string.argsToString([opt_prefix,"
: ",obj]));}} | |
28 objToString(obj);return strs.join("\n");};tdl.provide('tdl.log');tdl.require('td
l.string');tdl.log=tdl.log||{};tdl.log=function(){var str=tdl.string.argsToStrin
g(arguments);if(window.console&&window.console.log){window.console.log(str);}els
e if(window.dump){window.dump(str+"\n");}};tdl.error=function(){var str=tdl.stri
ng.argsToString(arguments);if(window.console){if(window.console.error){window.co
nsole.error(str);}else if(window.console.log){window.console.log(str);}else if(w
indow.dump){window.dump(str+"\n");}}};tdl.dumpObj=function(obj,opt_prefix){tdl.l
og(tdl.string.objToString(obj,opt_prefix));};tdl.provide('tdl.buffers');tdl.buff
ers=tdl.buffers||{};tdl.buffers.Buffer=function(array,opt_target){var target=opt
_target||gl.ARRAY_BUFFER;var buf=gl.createBuffer();this.target=target;this.buf=b
uf;this.set(array);this.numComponents_=array.numComponents;this.numElements_=arr
ay.numElements;this.totalComponents_=this.numComponents_*this.numElements_;if(ar
ray.buffer instanceof Float32Array){this.type_=gl.FLOAT;this.normalize_=false;}e
lse if(array.buffer instanceof Uint8Array){this.type_=gl.UNSIGNED_BYTE;this.norm
alize_=true;}else if(array.buffer instanceof Int8Array){this.type_=gl.BYTE;this.
normalize_=true;}else if(array.buffer instanceof Uint16Array){this.type_=gl.UNSI
GNED_SHORT;this.normalize_=true;}else if(array.buffer instanceof Int16Array){thi
s.type_=gl.SHORT;this.normalize_=true;}else{throw("unhandled type:"+(typeof arra
y.buffer));}};tdl.buffers.Buffer.prototype.set=function(array){gl.bindBuffer(thi
s.target,this.buf);gl.bufferData(this.target,array.buffer,gl.STATIC_DRAW);} | |
29 tdl.buffers.Buffer.prototype.type=function(){return this.type_;};tdl.buffers.Buf
fer.prototype.numComponents=function(){return this.numComponents_;};tdl.buffers.
Buffer.prototype.numElements=function(){return this.numElements_;};tdl.buffers.B
uffer.prototype.totalComponents=function(){return this.totalComponents_;};tdl.bu
ffers.Buffer.prototype.buffer=function(){return this.buf;};tdl.buffers.Buffer.pr
ototype.stride=function(){return 0;};tdl.buffers.Buffer.prototype.normalize=func
tion(){return this.normalize_;} | |
30 tdl.buffers.Buffer.prototype.offset=function(){return 0;};tdl.provide('tdl.fast'
);tdl.fast=tdl.fast||{};if(!window.Float32Array){window.Float32Array=function(){
};} | |
31 tdl.fast.temp0v3_=new Float32Array(3);tdl.fast.temp1v3_=new Float32Array(3);tdl.
fast.temp2v3_=new Float32Array(3);tdl.fast.temp0v4_=new Float32Array(4);tdl.fast
.temp1v4_=new Float32Array(4);tdl.fast.temp2v4_=new Float32Array(4);tdl.fast.tem
p0m4_=new Float32Array(16);tdl.fast.temp1m4_=new Float32Array(16);tdl.fast.temp2
m4_=new Float32Array(16);tdl.fast.matrix4=tdl.fast.matrix4||{};tdl.fast.rowMajor
=tdl.fast.rowMajor||{};tdl.fast.columnMajor=tdl.fast.columnMajor||{};tdl.fast.Ve
ctor2=goog.typedef;tdl.fast.Vector3=goog.typedef;tdl.fast.Vector4=goog.typedef;t
dl.fast.Vector=goog.typedef;tdl.fast.Matrix2=goog.typedef;tdl.fast.Matrix3=goog.
typedef;tdl.fast.Matrix4=goog.typedef;tdl.fast.Matrix=goog.typedef;tdl.fast.addV
ector=function(dst,a,b){var aLength=a.length;for(var i=0;i<aLength;++i) | |
32 dst[i]=a[i]+b[i];return dst;};tdl.fast.subVector=function(dst,a,b){var aLength=a
.length;for(var i=0;i<aLength;++i) | |
33 dst[i]=a[i]-b[i];return dst;};tdl.fast.lerpVector=function(dst,a,b,t){var aLengt
h=a.length;for(var i=0;i<aLength;++i) | |
34 dst[i]=(1-t)*a[i]+t*b[i];return dst;};tdl.fast.divVectorScalar=function(dst,v,k)
{var vLength=v.length;for(var i=0;i<vLength;++i) | |
35 dst[i]=v[i]/k;return dst;};tdl.fast.cross=function(dst,a,b){dst[0]=a[1]*b[2]-a[2
]*b[1];dst[1]=a[2]*b[0]-a[0]*b[2];dst[2]=a[0]*b[1]-a[1]*b[0];return dst;};tdl.fa
st.dot=function(a,b){return(a[0]*b[0])+(a[1]*b[1])+(a[2]*b[2]);};tdl.fast.normal
ize=function(dst,a){var n=0.0;var aLength=a.length;for(var i=0;i<aLength;++i) | |
36 n+=a[i]*a[i];n=Math.sqrt(n);if(n>0.00001){for(var i=0;i<aLength;++i) | |
37 dst[i]=a[i]/n;}else{for(var i=0;i<aLength;++i) | |
38 dst[i]=0;} | |
39 return dst;};tdl.fast.negativeVector=function(dst,v){var vLength=v.length;for(va
r i=0;i<vLength;++i){dst[i]=-v[i];} | |
40 return dst;};tdl.fast.negativeMatrix=function(dst,v){var vLength=v.length;for(va
r i=0;i<vLength;++i){dst[i]=-v[i];} | |
41 return dst;};tdl.fast.copyVector=function(dst,v){dst.set(v);return dst;};tdl.fas
t.copyMatrix=function(dst,m){dst.set(m);return dst;};tdl.fast.mulScalarVector=fu
nction(dst,k,v){var vLength=v.length;for(var i=0;i<vLength;++i){dst[i]=k*v[i];} | |
42 return dst;};tdl.fast.mulVectorScalar=function(dst,v,k){return tdl.fast.mulScala
rVector(dst,k,v);};tdl.fast.mulScalarMatrix=function(dst,k,m){var mLength=m.leng
th;for(var i=0;i<mLength;++i){dst[i]=k*m[i];} | |
43 return dst;};tdl.fast.mulMatrixScalar=function(dst,m,k){return tdl.fast.mulScala
rMatrix(dst,k,m);};tdl.fast.mulVectorVector=function(dst,a,b){var aLength=a.leng
th;for(var i=0;i<aLength;++i) | |
44 dst[i]=a[i]*b[i];return dst;};tdl.fast.divVectorVector=function(dst,a,b){var aLe
ngth=a.length;for(var i=0;i<aLength;++i) | |
45 dst[i]=a[i]/b[i];return dst;};tdl.fast.rowMajor.mulVectorMatrix4=function(dst,v,
m){for(var i=0;i<4;++i){dst[i]=0.0;for(var j=0;j<4;++j) | |
46 dst[i]+=v[j]*m[j*4+i];} | |
47 return dst;};tdl.fast.columnMajor.mulVectorMatrix4=function(dst,v,m){var mLength
=m.length;var vLength=v.length;for(var i=0;i<4;++i){dst[i]=0.0;var col=i*4;for(v
ar j=0;j<4;++j) | |
48 dst[i]+=v[j]*m[col+j];} | |
49 return dst;};tdl.fast.mulVectorMatrix4=null;tdl.fast.rowMajor.mulMatrix4Vector=f
unction(dst,m,v){for(var i=0;i<4;++i){dst[i]=0.0;var row=i*4;for(var j=0;j<4;++j
) | |
50 dst[i]+=m[row+j]*v[j];} | |
51 return dst;};tdl.fast.columnMajor.mulMatrix4Vector=function(dst,m,v){for(var i=0
;i<4;++i){dst[i]=0.0;for(var j=0;j<4;++j) | |
52 dst[i]+=v[j]*m[j*4+i];} | |
53 return dst;};tdl.fast.mulMatrix4Vector=null;tdl.fast.rowMajor.mulMatrixMatrix3=f
unction(dst,a,b){var a00=a[0];var a01=a[1];var a02=a[2];var a10=a[3+0];var a11=a
[3+1];var a12=a[3+2];var a20=a[6+0];var a21=a[6+1];var a22=a[6+2];var b00=b[0];v
ar b01=b[1];var b02=b[2];var b10=b[3+0];var b11=b[3+1];var b12=b[3+2];var b20=b[
6+0];var b21=b[6+1];var b22=b[6+2];dst[0]=a00*b00+a01*b10+a02*b20;dst[1]=a00*b01
+a01*b11+a02*b21;dst[2]=a00*b02+a01*b12+a02*b22;dst[3]=a10*b00+a11*b10+a12*b20;d
st[4]=a10*b01+a11*b11+a12*b21;dst[5]=a10*b02+a11*b12+a12*b22;dst[6]=a20*b00+a21*
b10+a22*b20;dst[7]=a20*b01+a21*b11+a22*b21;dst[8]=a20*b02+a21*b12+a22*b22;return
dst;};tdl.fast.columnMajor.mulMatrixMatrix3=function(dst,a,b){var a00=a[0];var
a01=a[1];var a02=a[2];var a10=a[3+0];var a11=a[3+1];var a12=a[3+2];var a20=a[6+0
];var a21=a[6+1];var a22=a[6+2];var b00=b[0];var b01=b[1];var b02=b[2];var b10=b
[3+0];var b11=b[3+1];var b12=b[3+2];var b20=b[6+0];var b21=b[6+1];var b22=b[6+2]
;dst[0]=a00*b00+a10*b01+a20*b02;dst[1]=a01*b00+a11*b01+a21*b02;dst[2]=a02*b00+a1
2*b01+a22*b02;dst[3]=a00*b10+a10*b11+a20*b12;dst[4]=a01*b10+a11*b11+a21*b12;dst[
5]=a02*b10+a12*b11+a22*b12;dst[6]=a00*b20+a10*b21+a20*b22;dst[7]=a01*b20+a11*b21
+a21*b22;dst[8]=a02*b20+a12*b21+a22*b22;return dst;};tdl.fast.mulMatrixMatrix3=n
ull;tdl.fast.rowMajor.mulMatrixMatrix4=function(dst,a,b){var a00=a[0];var a01=a[
1];var a02=a[2];var a03=a[3];var a10=a[4+0];var a11=a[4+1];var a12=a[4+2];var a1
3=a[4+3];var a20=a[8+0];var a21=a[8+1];var a22=a[8+2];var a23=a[8+3];var a30=a[1
2+0];var a31=a[12+1];var a32=a[12+2];var a33=a[12+3];var b00=b[0];var b01=b[1];v
ar b02=b[2];var b03=b[3];var b10=b[4+0];var b11=b[4+1];var b12=b[4+2];var b13=b[
4+3];var b20=b[8+0];var b21=b[8+1];var b22=b[8+2];var b23=b[8+3];var b30=b[12+0]
;var b31=b[12+1];var b32=b[12+2];var b33=b[12+3];dst[0]=a00*b00+a01*b10+a02*b20+
a03*b30;dst[1]=a00*b01+a01*b11+a02*b21+a03*b31;dst[2]=a00*b02+a01*b12+a02*b22+a0
3*b32;dst[3]=a00*b03+a01*b13+a02*b23+a03*b33;dst[4]=a10*b00+a11*b10+a12*b20+a13*
b30;dst[5]=a10*b01+a11*b11+a12*b21+a13*b31;dst[6]=a10*b02+a11*b12+a12*b22+a13*b3
2;dst[7]=a10*b03+a11*b13+a12*b23+a13*b33;dst[8]=a20*b00+a21*b10+a22*b20+a23*b30;
dst[9]=a20*b01+a21*b11+a22*b21+a23*b31;dst[10]=a20*b02+a21*b12+a22*b22+a23*b32;d
st[11]=a20*b03+a21*b13+a22*b23+a23*b33;dst[12]=a30*b00+a31*b10+a32*b20+a33*b30;d
st[13]=a30*b01+a31*b11+a32*b21+a33*b31;dst[14]=a30*b02+a31*b12+a32*b22+a33*b32;d
st[15]=a30*b03+a31*b13+a32*b23+a33*b33;return dst;};tdl.fast.columnMajor.mulMatr
ixMatrix4=function(dst,a,b){var a00=a[0];var a01=a[1];var a02=a[2];var a03=a[3];
var a10=a[4+0];var a11=a[4+1];var a12=a[4+2];var a13=a[4+3];var a20=a[8+0];var a
21=a[8+1];var a22=a[8+2];var a23=a[8+3];var a30=a[12+0];var a31=a[12+1];var a32=
a[12+2];var a33=a[12+3];var b00=b[0];var b01=b[1];var b02=b[2];var b03=b[3];var
b10=b[4+0];var b11=b[4+1];var b12=b[4+2];var b13=b[4+3];var b20=b[8+0];var b21=b
[8+1];var b22=b[8+2];var b23=b[8+3];var b30=b[12+0];var b31=b[12+1];var b32=b[12
+2];var b33=b[12+3];dst[0]=a00*b00+a10*b01+a20*b02+a30*b03;dst[1]=a01*b00+a11*b0
1+a21*b02+a31*b03;dst[2]=a02*b00+a12*b01+a22*b02+a32*b03;dst[3]=a03*b00+a13*b01+
a23*b02+a33*b03;dst[4]=a00*b10+a10*b11+a20*b12+a30*b13;dst[5]=a01*b10+a11*b11+a2
1*b12+a31*b13;dst[6]=a02*b10+a12*b11+a22*b12+a32*b13;dst[7]=a03*b10+a13*b11+a23*
b12+a33*b13;dst[8]=a00*b20+a10*b21+a20*b22+a30*b23;dst[9]=a01*b20+a11*b21+a21*b2
2+a31*b23;dst[10]=a02*b20+a12*b21+a22*b22+a32*b23;dst[11]=a03*b20+a13*b21+a23*b2
2+a33*b23;dst[12]=a00*b30+a10*b31+a20*b32+a30*b33;dst[13]=a01*b30+a11*b31+a21*b3
2+a31*b33;dst[14]=a02*b30+a12*b31+a22*b32+a32*b33;dst[15]=a03*b30+a13*b31+a23*b3
2+a33*b33;return dst;};tdl.fast.mulMatrixMatrix4=null;tdl.fast.rowMajor.column4=
function(dst,m,j){for(var i=0;i<4;++i){dst[i]=m[i*4+j];} | |
54 return dst;};tdl.fast.columnMajor.column4=function(dst,m,j){var off=j*4;dst[0]=m
[off+0];dst[1]=m[off+1];dst[2]=m[off+2];dst[3]=m[off+3];return dst;};tdl.fast.co
lumn4=null;tdl.fast.rowMajor.row4=function(dst,m,i){var off=i*4;dst[0]=m[off+0];
dst[1]=m[off+1];dst[2]=m[off+2];dst[3]=m[off+3];return dst;};tdl.fast.columnMajo
r.row4=function(dst,m,i){for(var j=0;j<4;++j){dst[j]=m[j*4+i];} | |
55 return dst;};tdl.fast.row4=null;tdl.fast.identity4=function(dst){dst[0]=1;dst[1]
=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[1
0]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst;};tdl.fast.tra
nspose4=function(dst,m){var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m
03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];
var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*
4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];dst[0]=m00;dst[1]=m10;ds
t[2]=m20;dst[3]=m30;dst[4]=m01;dst[5]=m11;dst[6]=m21;dst[7]=m31;dst[8]=m02;dst[9
]=m12;dst[10]=m22;dst[11]=m32;dst[12]=m03;dst[13]=m13;dst[14]=m23;dst[15]=m33;re
turn dst;};tdl.fast.inverse4=function(dst,m){var m00=m[0*4+0];var m01=m[0*4+1];v
ar m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4
+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=
m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];var
tmp_0=m22*m33;var tmp_1=m32*m23;var tmp_2=m12*m33;var tmp_3=m32*m13;var tmp_4=m
12*m23;var tmp_5=m22*m13;var tmp_6=m02*m33;var tmp_7=m32*m03;var tmp_8=m02*m23;v
ar tmp_9=m22*m03;var tmp_10=m02*m13;var tmp_11=m12*m03;var tmp_12=m20*m31;var tm
p_13=m30*m21;var tmp_14=m10*m31;var tmp_15=m30*m11;var tmp_16=m10*m21;var tmp_17
=m20*m11;var tmp_18=m00*m31;var tmp_19=m30*m01;var tmp_20=m00*m21;var tmp_21=m20
*m01;var tmp_22=m00*m11;var tmp_23=m10*m01;var t0=(tmp_0*m11+tmp_3*m21+tmp_4*m31
)- | |
56 (tmp_1*m11+tmp_2*m21+tmp_5*m31);var t1=(tmp_1*m01+tmp_6*m21+tmp_9*m31)- | |
57 (tmp_0*m01+tmp_7*m21+tmp_8*m31);var t2=(tmp_2*m01+tmp_7*m11+tmp_10*m31)- | |
58 (tmp_3*m01+tmp_6*m11+tmp_11*m31);var t3=(tmp_5*m01+tmp_8*m11+tmp_11*m21)- | |
59 (tmp_4*m01+tmp_9*m11+tmp_10*m21);var d=1.0/(m00*t0+m10*t1+m20*t2+m30*t3);dst[0]=
d*t0;dst[1]=d*t1;dst[2]=d*t2;dst[3]=d*t3;dst[4]=d*((tmp_1*m10+tmp_2*m20+tmp_5*m3
0)- | |
60 (tmp_0*m10+tmp_3*m20+tmp_4*m30));dst[5]=d*((tmp_0*m00+tmp_7*m20+tmp_8*m30)- | |
61 (tmp_1*m00+tmp_6*m20+tmp_9*m30));dst[6]=d*((tmp_3*m00+tmp_6*m10+tmp_11*m30)- | |
62 (tmp_2*m00+tmp_7*m10+tmp_10*m30));dst[7]=d*((tmp_4*m00+tmp_9*m10+tmp_10*m20)- | |
63 (tmp_5*m00+tmp_8*m10+tmp_11*m20));dst[8]=d*((tmp_12*m13+tmp_15*m23+tmp_16*m33)- | |
64 (tmp_13*m13+tmp_14*m23+tmp_17*m33));dst[9]=d*((tmp_13*m03+tmp_18*m23+tmp_21*m33)
- | |
65 (tmp_12*m03+tmp_19*m23+tmp_20*m33));dst[10]=d*((tmp_14*m03+tmp_19*m13+tmp_22*m33
)- | |
66 (tmp_15*m03+tmp_18*m13+tmp_23*m33));dst[11]=d*((tmp_17*m03+tmp_20*m13+tmp_23*m23
)- | |
67 (tmp_16*m03+tmp_21*m13+tmp_22*m23));dst[12]=d*((tmp_14*m22+tmp_17*m32+tmp_13*m12
)- | |
68 (tmp_16*m32+tmp_12*m12+tmp_15*m22));dst[13]=d*((tmp_20*m32+tmp_12*m02+tmp_19*m22
)- | |
69 (tmp_18*m22+tmp_21*m32+tmp_13*m02));dst[14]=d*((tmp_18*m12+tmp_23*m32+tmp_15*m02
)- | |
70 (tmp_22*m32+tmp_14*m02+tmp_19*m12));dst[15]=d*((tmp_22*m22+tmp_16*m02+tmp_21*m12
)- | |
71 (tmp_20*m12+tmp_23*m22+tmp_17*m02));return dst;};tdl.fast.matrix4.inverse=functi
on(dst,m){return tdl.fast.inverse4(dst,m);};tdl.fast.matrix4.mul=function(dst,a,
b){return tdl.fast.mulMatrixMatrix4(dst,a,b);};tdl.fast.matrix4.copy=function(ds
t,m){return tdl.fast.copyMatrix(dst,m);};tdl.fast.matrix4.setTranslation=functio
n(a,v){a[12]=v[0];a[13]=v[1];a[14]=v[2];a[15]=1;return a;};tdl.fast.matrix4.getT
ranslation=function(dst,m){dst[0]=m[12];dst[1]=m[13];dst[2]=m[14];return dst;};t
dl.fast.matrix4.identity=function(dst){return tdl.fast.identity4(dst);};tdl.fast
.matrix4.getAxis=function(dst,m,axis){var off=axis*4;dst[0]=m[off+0];dst[1]=m[of
f+1];dst[2]=m[off+2];return dst;};tdl.fast.matrix4.perspective=function(dst,angl
e,aspect,near,far){var f=Math.tan(Math.PI*0.5-0.5*angle);var rangeInv=1.0/(near-
far);dst[0]=f/aspect;dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=f;dst[6]=0;dst[7
]=0;dst[8]=0;dst[9]=0;dst[10]=(near+far)*rangeInv;dst[11]=-1;dst[12]=0;dst[13]=0
;dst[14]=near*far*rangeInv*2;dst[15]=0;return dst;};tdl.fast.matrix4.ortho=funct
ion(dst,left,right,bottom,top,near,far){dst[0]=2/(right-left);dst[1]=0;dst[2]=0;
dst[3]=0;dst[4]=0;dst[5]=2/(top-bottom);dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[
10]=-1/(far-near);dst[11]=0;dst[12]=(right+left)/(left-right);dst[13]=(top+botto
m)/(bottom-top);dst[14]=-near/(near-far);dst[15]=1;return dst;} | |
72 tdl.fast.matrix4.frustum=function(dst,left,right,bottom,top,near,far){var dx=(ri
ght-left);var dy=(top-bottom);var dz=(near-far);dst[0]=2*near/dx;dst[1]=0;dst[2]
=0;dst[3]=0;dst[4]=0;dst[5]=2*near/dy;dst[6]=0;dst[7]=0;dst[8]=(left+right)/dx;d
st[9]=(top+bottom)/dy;dst[10]=far/dz;dst[11]=-1;dst[12]=0;dst[13]=0;dst[14]=near
*far/dz;dst[15]=0;return dst;};tdl.fast.matrix4.lookAt=function(dst,eye,target,u
p){var t0=tdl.fast.temp0v3_;var t1=tdl.fast.temp1v3_;var t2=tdl.fast.temp2v3_;va
r vz=tdl.fast.normalize(t0,tdl.fast.subVector(t0,eye,target));var vx=tdl.fast.no
rmalize(t1,tdl.fast.cross(t1,up,vz));var vy=tdl.fast.cross(t2,vz,vx);dst[0]=vx[0
];dst[1]=vy[0];dst[2]=vz[0];dst[3]=0;dst[4]=vx[1];dst[5]=vy[1];dst[6]=vz[1];dst[
7]=0;dst[8]=vx[2];dst[9]=vy[2];dst[10]=vz[2];dst[11]=0;dst[12]=-tdl.fast.dot(vx,
eye);dst[13]=-tdl.fast.dot(vy,eye);dst[14]=-tdl.fast.dot(vz,eye);dst[15]=1;retur
n dst;};tdl.fast.matrix4.cameraLookAt=function(dst,eye,target,up){var t0=tdl.fas
t.temp0v3_;var t1=tdl.fast.temp1v3_;var t2=tdl.fast.temp2v3_;var vz=tdl.fast.nor
malize(t0,tdl.fast.subVector(t0,eye,target));var vx=tdl.fast.normalize(t1,tdl.fa
st.cross(t1,up,vz));var vy=tdl.fast.cross(t2,vz,vx);dst[0]=vx[0];dst[1]=vx[1];ds
t[2]=vx[2];dst[3]=0;dst[4]=vy[0];dst[5]=vy[1];dst[6]=vy[2];dst[7]=0;dst[8]=vz[0]
;dst[9]=vz[1];dst[10]=vz[2];dst[11]=0;dst[12]=eye[0];dst[13]=eye[1];dst[14]=eye[
2];dst[15]=1;return dst;};tdl.fast.matrix4.translation=function(dst,v){dst[0]=1;
dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0
;dst[10]=1;dst[11]=0;dst[12]=v[0];dst[13]=v[1];dst[14]=v[2];dst[15]=1;return dst
;};tdl.fast.matrix4.translate=function(m,v){var v0=v[0];var v1=v[1];var v2=v[2];
var m00=m[0];var m01=m[1];var m02=m[2];var m03=m[3];var m10=m[1*4+0];var m11=m[1
*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m2
2=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];v
ar m33=m[3*4+3];m[12]=m00*v0+m10*v1+m20*v2+m30;m[13]=m01*v0+m11*v1+m21*v2+m31;m[
14]=m02*v0+m12*v1+m22*v2+m32;m[15]=m03*v0+m13*v1+m23*v2+m33;return m;};tdl.fast.
matrix4.transpose=tdl.fast.transpose4;tdl.fast.matrix4.rotationX=function(dst,an
gle){var c=Math.cos(angle);var s=Math.sin(angle);dst[0]=1;dst[1]=0;dst[2]=0;dst[
3]=0;dst[4]=0;dst[5]=c;dst[6]=s;dst[7]=0;dst[8]=0;dst[9]=-s;dst[10]=c;dst[11]=0;
dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst;};tdl.fast.matrix4.rotateX=fu
nction(m,angle){var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m20=m[8]
;var m21=m[9];var m22=m[10];var m23=m[11];var c=Math.cos(angle);var s=Math.sin(a
ngle);m[4]=c*m10+s*m20;m[5]=c*m11+s*m21;m[6]=c*m12+s*m22;m[7]=c*m13+s*m23;m[8]=c
*m20-s*m10;m[9]=c*m21-s*m11;m[10]=c*m22-s*m12;m[11]=c*m23-s*m13;return m;};tdl.f
ast.matrix4.rotationY=function(dst,angle){var c=Math.cos(angle);var s=Math.sin(a
ngle);dst[0]=c;dst[1]=0;dst[2]=-s;dst[3]=0;dst[4]=0;dst[5]=1;dst[6]=0;dst[7]=0;d
st[8]=s;dst[9]=0;dst[10]=c;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;ret
urn dst;};tdl.fast.matrix4.rotateY=function(m,angle){var m00=m[0*4+0];var m01=m[
0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m
22=m[2*4+2];var m23=m[2*4+3];var c=Math.cos(angle);var s=Math.sin(angle);m[0]=c*
m00-s*m20;m[1]=c*m01-s*m21;m[2]=c*m02-s*m22;m[3]=c*m03-s*m23;m[8]=c*m20+s*m00;m[
9]=c*m21+s*m01;m[10]=c*m22+s*m02;m[11]=c*m23+s*m03;return m;};tdl.fast.matrix4.r
otationZ=function(dst,angle){var c=Math.cos(angle);var s=Math.sin(angle);dst[0]=
c;dst[1]=s;dst[2]=0;dst[3]=0;dst[4]=-s;dst[5]=c;dst[6]=0;dst[7]=0;dst[8]=0;dst[9
]=0;dst[10]=1;dst[11]=0;dst[12]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst;};tdl
.fast.matrix4.rotateZ=function(m,angle){var m00=m[0*4+0];var m01=m[0*4+1];var m0
2=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];v
ar m13=m[1*4+3];var c=Math.cos(angle);var s=Math.sin(angle);m[0]=c*m00+s*m10;m[1
]=c*m01+s*m11;m[2]=c*m02+s*m12;m[3]=c*m03+s*m13;m[4]=c*m10-s*m00;m[5]=c*m11-s*m0
1;m[6]=c*m12-s*m02;m[7]=c*m13-s*m03;return m;};tdl.fast.matrix4.axisRotation=fun
ction(dst,axis,angle){var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(
x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angl
e);var s=Math.sin(angle);var oneMinusCosine=1-c;dst[0]=xx+(1-xx)*c;dst[1]=x*y*on
eMinusCosine+z*s;dst[2]=x*z*oneMinusCosine-y*s;dst[3]=0;dst[4]=x*y*oneMinusCosin
e-z*s;dst[5]=yy+(1-yy)*c;dst[6]=y*z*oneMinusCosine+x*s;dst[7]=0;dst[8]=x*z*oneMi
nusCosine+y*s;dst[9]=y*z*oneMinusCosine-x*s;dst[10]=zz+(1-zz)*c;dst[11]=0;dst[12
]=0;dst[13]=0;dst[14]=0;dst[15]=1;return dst;};tdl.fast.matrix4.axisRotate=funct
ion(m,axis,angle){var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+
y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angle);v
ar s=Math.sin(angle);var oneMinusCosine=1-c;var r00=xx+(1-xx)*c;var r01=x*y*oneM
inusCosine+z*s;var r02=x*z*oneMinusCosine-y*s;var r10=x*y*oneMinusCosine-z*s;var
r11=yy+(1-yy)*c;var r12=y*z*oneMinusCosine+x*s;var r20=x*z*oneMinusCosine+y*s;v
ar r21=y*z*oneMinusCosine-x*s;var r22=zz+(1-zz)*c;var m00=m[0];var m01=m[1];var
m02=m[2];var m03=m[3];var m10=m[4];var m11=m[5];var m12=m[6];var m13=m[7];var m2
0=m[8];var m21=m[9];var m22=m[10];var m23=m[11];var m30=m[12];var m31=m[13];var
m32=m[14];var m33=m[15];m[0]=r00*m00+r01*m10+r02*m20;m[1]=r00*m01+r01*m11+r02*m2
1;m[2]=r00*m02+r01*m12+r02*m22;m[3]=r00*m03+r01*m13+r02*m23;m[4]=r10*m00+r11*m10
+r12*m20;m[5]=r10*m01+r11*m11+r12*m21;m[6]=r10*m02+r11*m12+r12*m22;m[7]=r10*m03+
r11*m13+r12*m23;m[8]=r20*m00+r21*m10+r22*m20;m[9]=r20*m01+r21*m11+r22*m21;m[10]=
r20*m02+r21*m12+r22*m22;m[11]=r20*m03+r21*m13+r22*m23;return m;};tdl.fast.matrix
4.scaling=function(dst,v){dst[0]=v[0];dst[1]=0;dst[2]=0;dst[3]=0;dst[4]=0;dst[5]
=v[1];dst[6]=0;dst[7]=0;dst[8]=0;dst[9]=0;dst[10]=v[2];dst[11]=0;dst[12]=0;dst[1
3]=0;dst[14]=0;dst[15]=1;return dst;};tdl.fast.matrix4.scale=function(m,v){var v
0=v[0];var v1=v[1];var v2=v[2];m[0]=v0*m[0*4+0];m[1]=v0*m[0*4+1];m[2]=v0*m[0*4+2
];m[3]=v0*m[0*4+3];m[4]=v1*m[1*4+0];m[5]=v1*m[1*4+1];m[6]=v1*m[1*4+2];m[7]=v1*m[
1*4+3];m[8]=v2*m[2*4+0];m[9]=v2*m[2*4+1];m[10]=v2*m[2*4+2];m[11]=v2*m[2*4+3];ret
urn m;};tdl.fast.installRowMajorFunctions=function(){for(var f in tdl.fast.rowMa
jor){tdl.fast[f]=tdl.fast.rowMajor[f];}};tdl.fast.installColumnMajorFunctions=fu
nction(){for(var f in tdl.fast.columnMajor){tdl.fast[f]=tdl.fast.columnMajor[f];
}};tdl.fast.installRowMajorFunctions();tdl.provide('tdl.math');tdl.math=tdl.math
||{};tdl.math.randomSeed_=0;tdl.math.RANDOM_RANGE_=Math.pow(2,32);tdl.math.matri
x4=tdl.math.matrix4||{};tdl.math.rowMajor=tdl.math.rowMajor||{};tdl.math.columnM
ajor=tdl.math.columnMajor||{};tdl.math.Vector2=goog.typedef;tdl.math.Vector3=goo
g.typedef;tdl.math.Vector4=goog.typedef;tdl.math.Vector=goog.typedef;tdl.math.Ma
trix1=goog.typedef;tdl.math.Matrix2=goog.typedef;tdl.math.Matrix3=goog.typedef;t
dl.math.Matrix4=goog.typedef;tdl.math.Matrix=goog.typedef;tdl.math.pseudoRandom=
function(){var math=tdl.math;return(math.randomSeed_=(134775813*math.randomSeed_
+1)%math.RANDOM_RANGE_)/math.RANDOM_RANGE_;};tdl.math.resetPseudoRandom=function
(){tdl.math.randomSeed_=0;};tdl.math.randomInt=function(n){return Math.min(Math.
floor(Math.random()*n),n-1);} | |
73 tdl.math.degToRad=function(degrees){return degrees*Math.PI/180;};tdl.math.radToD
eg=function(radians){return radians*180/Math.PI;};tdl.math.lerpScalar=function(a
,b,t){return(1-t)*a+t*b;};tdl.math.addVector=function(a,b){var r=[];var aLength=
a.length;for(var i=0;i<aLength;++i) | |
74 r[i]=a[i]+b[i];return r;};tdl.math.subVector=function(a,b){var r=[];var aLength=
a.length;for(var i=0;i<aLength;++i) | |
75 r[i]=a[i]-b[i];return r;};tdl.math.lerpVector=function(a,b,t){var r=[];var aLeng
th=a.length;for(var i=0;i<aLength;++i) | |
76 r[i]=(1-t)*a[i]+t*b[i];return r;};tdl.math.modClamp=function(v,range,opt_rangeSt
art){var start=opt_rangeStart||0;if(range<0.00001){return start;} | |
77 v-=start;if(v<0){v-=Math.floor(v/range)*range;}else{v=v%range;} | |
78 return v+start;};tdl.math.lerpCircular=function(a,b,t,range){a=tdl.math.modClamp
(a,range);b=tdl.math.modClamp(b,range);var delta=b-a;if(Math.abs(delta)>range*0.
5){if(delta>0){b-=range;}else{b+=range;}} | |
79 return tdl.math.modClamp(tdl.math.lerpScalar(a,b,t),range);};tdl.math.lerpRadian
=function(a,b,t){return tdl.math.lerpCircular(a,b,t,Math.PI*2);};tdl.math.divVec
torScalar=function(v,k){var r=[];var vLength=v.length;for(var i=0;i<vLength;++i) | |
80 r[i]=v[i]/k;return r;};tdl.math.dot=function(a,b){var r=0.0;var aLength=a.length
;for(var i=0;i<aLength;++i) | |
81 r+=a[i]*b[i];return r;};tdl.math.cross=function(a,b){return[a[1]*b[2]-a[2]*b[1],
a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]];};tdl.math.length=function(a){var r=0.0
;var aLength=a.length;for(var i=0;i<aLength;++i) | |
82 r+=a[i]*a[i];return Math.sqrt(r);};tdl.math.lengthSquared=function(a){var r=0.0;
var aLength=a.length;for(var i=0;i<aLength;++i) | |
83 r+=a[i]*a[i];return r;};tdl.math.distance=function(a,b){var r=0.0;var aLength=a.
length;for(var i=0;i<aLength;++i){var t=a[i]-b[i];r+=t*t;} | |
84 return Math.sqrt(r);};tdl.math.distanceSquared=function(a,b){var r=0.0;var aLeng
th=a.length;for(var i=0;i<aLength;++i){var t=a[i]-b[i];r+=t*t;} | |
85 return r;};tdl.math.normalize=function(a){var r=[];var n=0.0;var aLength=a.lengt
h;for(var i=0;i<aLength;++i) | |
86 n+=a[i]*a[i];n=Math.sqrt(n);if(n>0.00001){for(var i=0;i<aLength;++i) | |
87 r[i]=a[i]/n;}else{r=[0,0,0];} | |
88 return r;};tdl.math.addMatrix=function(a,b){var r=[];var aLength=a.length;var a0
Length=a[0].length;for(var i=0;i<aLength;++i){var row=[];var ai=a[i];var bi=b[i]
;for(var j=0;j<a0Length;++j) | |
89 row[j]=ai[j]+bi[j];r[i]=row;} | |
90 return r;};tdl.math.subMatrix=function(a,b){var r=[];var aLength=a.length;var a0
Length=a[0].length;for(var i=0;i<aLength;++i){var row=[];var ai=a[i];var bi=b[i]
;for(var j=0;j<a0Length;++j) | |
91 row[j]=ai[j]-bi[j];r[i]=row;} | |
92 return r;};tdl.math.lerpMatrix=function(a,b,t){var r=[];var aLength=a.length;for
(var i=0;i<aLength;++i){r[i]=(1-t)*a[i]+t*b[i];} | |
93 return r;};tdl.math.divMatrixScalar=function(m,k){var r=[];var mLength=m.length;
for(var i=0;i<mLength;++i){r[i]=m[i]/k;} | |
94 return r;};tdl.math.negativeScalar=function(a){return-a;};tdl.math.negativeVecto
r=function(v){var r=[];var vLength=v.length;for(var i=0;i<vLength;++i){r[i]=-v[i
];} | |
95 return r;};tdl.math.negativeMatrix=function(m){var r=[];var mLength=m.length;for
(var i=0;i<mLength;++i){r[i]=-m[i];} | |
96 return r;};tdl.math.copyScalar=function(a){return a;};tdl.math.copyVector=functi
on(v){var r=[];for(var i=0;i<v.length;i++) | |
97 r[i]=v[i];return r;};tdl.math.copyMatrix=function(m){var r=[];var mLength=m.leng
th;for(var i=0;i<mLength;++i){r[i]=m[i];} | |
98 return r;};tdl.math.mulScalarScalar=function(a,b){return a*b;};tdl.math.mulScala
rVector=function(k,v){var r=[];var vLength=v.length;for(var i=0;i<vLength;++i){r
[i]=k*v[i];} | |
99 return r;};tdl.math.mulVectorScalar=function(v,k){return tdl.math.mulScalarVecto
r(k,v);};tdl.math.mulScalarMatrix=function(k,m){var r=[];var mLength=m.length;fo
r(var i=0;i<mLength;++i){r[i]=k*m[i];} | |
100 return r;};tdl.math.mulMatrixScalar=function(m,k){return tdl.math.mulScalarMatri
x(k,m);};tdl.math.mulVectorVector=function(a,b){var r=[];var aLength=a.length;fo
r(var i=0;i<aLength;++i) | |
101 r[i]=a[i]*b[i];return r;};tdl.math.divVectorVector=function(a,b){var r=[];var aL
ength=a.length;for(var i=0;i<aLength;++i) | |
102 r[i]=a[i]/b[i];return r;};tdl.math.rowMajor.mulVectorMatrix4=function(v,m){var r
=[];for(var i=0;i<4;++i){r[i]=0.0;for(var j=0;j<4;++j) | |
103 r[i]+=v[j]*m[j*4+i];} | |
104 return r;};tdl.math.columnMajor.mulVectorMatrix=function(v,m){var r=[];for(var i
=0;i<4;++i){r[i]=0.0;for(var j=0;j<4;++j) | |
105 r[i]+=v[j]*r[i*4+j];} | |
106 return r;};tdl.math.mulVectorMatrix=null;tdl.math.rowMajor.mulMatrixVector=funct
ion(m,v){var r=[];for(var i=0;i<4;++i){r[i]=0.0;for(var j=0;j<4;++j) | |
107 r[i]+=m[i*4+j]*v[j];} | |
108 return r;};tdl.math.columnMajor.mulMatrixVector=function(m,v){var r=[];for(var i
=0;i<4;++i){r[i]=0.0;for(var j=0;j<4;++j) | |
109 r[i]+=v[j]*m[j*4+i];} | |
110 return r;};tdl.math.mulMatrixVector=null;tdl.math.rowMajor.mulMatrixMatrix2=func
tion(a,b){var a00=a[0*2+0];var a01=a[0*2+1];var a10=a[1*2+0];var a11=a[1*2+1];va
r b00=b[0*2+0];var b01=b[0*2+1];var b10=b[1*2+0];var b11=b[1*2+1];return[a00*b00
+a01*b10,a00*b01+a01*b11,a10*b00+a11*b10,a10*b01+a11*b11];};tdl.math.columnMajor
.mulMatrixMatrix2=function(a,b){var a00=a[0*2+0];var a01=a[0*2+1];var a10=a[1*2+
0];var a11=a[1*2+1];var b00=b[0*2+0];var b01=b[0*2+1];var b10=b[1*2+0];var b11=b
[1*2+1];return[a00*b00+a10*b01,a01*b00+a11*b01,a00*b10+a10*b11,a01*b10+a11*b11];
};tdl.math.mulMatrixMatrix2=null;tdl.math.rowMajor.mulMatrixMatrix3=function(a,b
){var a00=a[0*3+0];var a01=a[0*3+1];var a02=a[0*3+2];var a10=a[1*3+0];var a11=a[
1*3+1];var a12=a[1*3+2];var a20=a[2*3+0];var a21=a[2*3+1];var a22=a[2*3+2];var b
00=b[0*3+0];var b01=b[0*3+1];var b02=b[0*3+2];var b10=b[1*3+0];var b11=b[1*3+1];
var b12=b[1*3+2];var b20=b[2*3+0];var b21=b[2*3+1];var b22=b[2*3+2];return[a00*b
00+a01*b10+a02*b20,a00*b01+a01*b11+a02*b21,a00*b02+a01*b12+a02*b22,a10*b00+a11*b
10+a12*b20,a10*b01+a11*b11+a12*b21,a10*b02+a11*b12+a12*b22,a20*b00+a21*b10+a22*b
20,a20*b01+a21*b11+a22*b21,a20*b02+a21*b12+a22*b22];};tdl.math.columnMajor.mulMa
trixMatrix3=function(a,b){var a00=a[0*3+0];var a01=a[0*3+1];var a02=a[0*3+2];var
a10=a[1*3+0];var a11=a[1*3+1];var a12=a[1*3+2];var a20=a[2*3+0];var a21=a[2*3+1
];var a22=a[2*3+2];var b00=b[0*3+0];var b01=b[0*3+1];var b02=b[0*3+2];var b10=b[
1*3+0];var b11=b[1*3+1];var b12=b[1*3+2];var b20=b[2*3+0];var b21=b[2*3+1];var b
22=b[2*3+2];return[a00*b00+a10*b01+a20*b02,a01*b00+a11*b01+a21*b02,a02*b00+a12*b
01+a22*b02,a00*b10+a10*b11+a20*b12,a01*b10+a11*b11+a21*b12,a02*b10+a12*b11+a22*b
12,a00*b20+a10*b21+a20*b22,a01*b20+a11*b21+a21*b22,a02*b20+a12*b21+a22*b22];};td
l.math.mulMatrixMatrix3=null;tdl.math.rowMajor.mulMatrixMatrix4=function(a,b){va
r a00=a[0*4+0];var a01=a[0*4+1];var a02=a[0*4+2];var a03=a[0*4+3];var a10=a[1*4+
0];var a11=a[1*4+1];var a12=a[1*4+2];var a13=a[1*4+3];var a20=a[2*4+0];var a21=a
[2*4+1];var a22=a[2*4+2];var a23=a[2*4+3];var a30=a[3*4+0];var a31=a[3*4+1];var
a32=a[3*4+2];var a33=a[3*4+3];var b00=b[0*4+0];var b01=b[0*4+1];var b02=b[0*4+2]
;var b03=b[0*4+3];var b10=b[1*4+0];var b11=b[1*4+1];var b12=b[1*4+2];var b13=b[1
*4+3];var b20=b[2*4+0];var b21=b[2*4+1];var b22=b[2*4+2];var b23=b[2*4+3];var b3
0=b[3*4+0];var b31=b[3*4+1];var b32=b[3*4+2];var b33=b[3*4+3];return[a00*b00+a01
*b10+a02*b20+a03*b30,a00*b01+a01*b11+a02*b21+a03*b31,a00*b02+a01*b12+a02*b22+a03
*b32,a00*b03+a01*b13+a02*b23+a03*b33,a10*b00+a11*b10+a12*b20+a13*b30,a10*b01+a11
*b11+a12*b21+a13*b31,a10*b02+a11*b12+a12*b22+a13*b32,a10*b03+a11*b13+a12*b23+a13
*b33,a20*b00+a21*b10+a22*b20+a23*b30,a20*b01+a21*b11+a22*b21+a23*b31,a20*b02+a21
*b12+a22*b22+a23*b32,a20*b03+a21*b13+a22*b23+a23*b33,a30*b00+a31*b10+a32*b20+a33
*b30,a30*b01+a31*b11+a32*b21+a33*b31,a30*b02+a31*b12+a32*b22+a33*b32,a30*b03+a31
*b13+a32*b23+a33*b33];};tdl.math.columnMajor.mulMatrixMatrix4=function(a,b){var
a00=a[0*4+0];var a01=a[0*4+1];var a02=a[0*4+2];var a03=a[0*4+3];var a10=a[1*4+0]
;var a11=a[1*4+1];var a12=a[1*4+2];var a13=a[1*4+3];var a20=a[2*4+0];var a21=a[2
*4+1];var a22=a[2*4+2];var a23=a[2*4+3];var a30=a[3*4+0];var a31=a[3*4+1];var a3
2=a[3*4+2];var a33=a[3*4+3];var b00=b[0*4+0];var b01=b[0*4+1];var b02=b[0*4+2];v
ar b03=b[0*4+3];var b10=b[1*4+0];var b11=b[1*4+1];var b12=b[1*4+2];var b13=b[1*4
+3];var b20=b[2*4+0];var b21=b[2*4+1];var b22=b[2*4+2];var b23=b[2*4+3];var b30=
b[3*4+0];var b31=b[3*4+1];var b32=b[3*4+2];var b33=b[3*4+3];return[a00*b00+a10*b
01+a20*b02+a30*b03,a01*b00+a11*b01+a21*b02+a31*b03,a02*b00+a12*b01+a22*b02+a32*b
03,a03*b00+a13*b01+a23*b02+a33*b03,a00*b10+a10*b11+a20*b12+a30*b13,a01*b10+a11*b
11+a21*b12+a31*b13,a02*b10+a12*b11+a22*b12+a32*b13,a03*b10+a13*b11+a23*b12+a33*b
13,a00*b20+a10*b21+a20*b22+a30*b23,a01*b20+a11*b21+a21*b22+a31*b23,a02*b20+a12*b
21+a22*b22+a32*b23,a03*b20+a13*b21+a23*b22+a33*b23,a00*b30+a10*b31+a20*b32+a30*b
33,a01*b30+a11*b31+a21*b32+a31*b33,a02*b30+a12*b31+a22*b32+a32*b33,a03*b30+a13*b
31+a23*b32+a33*b33];};tdl.math.mulMatrixMatrix4=null;tdl.math.rowMajor.mulMatrix
Matrix=function(a,b){var r=[];for(var i=0;i<4;++i){for(var j=0;j<4;++j){r[i*4+j]
=0.0;for(var k=0;k<4;++k) | |
111 r[i*4+j]+=a[i*4+k]*b[k*4+j];}} | |
112 return r;};tdl.math.columnMajor.mulMatrixMatrix=function(a,b){var r=[];for(var i
=0;i<4;++i){for(var j=0;j<4;++j){r[i*4+j]=0.0;for(var k=0;k<4;++k) | |
113 r[i*4+j]+=b[i*4+k]*a[k*4+j];}} | |
114 return r;};tdl.math.mulMatrixMatrix=null;tdl.math.rowMajor.column=function(m,j){
var r=[];for(var i=0;i<4;++i){r[i]=m[i*4+j];} | |
115 return r;};tdl.math.columnMajor.column=function(m,j){var r=[];for(var i=0;i<4;++
i){r[i]=m[j*4+i];} | |
116 return r;};tdl.math.column=null;tdl.math.rowMajor.row=function(m,i){var r=[];for
(var j=0;j<4;++j){r[i]=m[i*4+j];} | |
117 return r;};tdl.math.columnMajor.row=function(m,i,opt_size){opt_size=opt_size||4;
var r=[];for(var j=0;j<opt_size;++j){r[j]=m[j*opt_size+i];} | |
118 return r;};tdl.math.row=null;tdl.math.transpose=function(m){var r=[];var m00=m[0
*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m1
1=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];v
ar m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4
+2];var m33=m[3*4+3];r[0]=m00;r[1]=m10;r[2]=m20;r[3]=m30;r[4]=m01;r[5]=m11;r[6]=
m21;r[7]=m31;r[8]=m02;r[9]=m12;r[10]=m22;r[11]=m32;r[12]=m03;r[13]=m13;r[14]=m23
;r[15]=m33;return r;};tdl.math.trace=function(m){var r=0.0;for(var i=0;i<4;++i) | |
119 r+=m[i*4+i];return r;};tdl.math.det1=function(m){return m[0];};tdl.math.det2=fun
ction(m){return m[0*2+0]*m[1*2+1]-m[0*2+1]*m[1*2+0];};tdl.math.det3=function(m){
return m[2*3+2]*(m[0*3+0]*m[1*3+1]-m[0*3+1]*m[1*3+0])- | |
120 m[2*3+1]*(m[0*3+0]*m[1*3+2]-m[0*3+2]*m[1*3+0])+ | |
121 m[2*3+0]*(m[0*3+1]*m[1*3+2]-m[0*3+2]*m[1*3+1]);};tdl.math.det4=function(m){var t
01=m[0*4+0]*m[1*4+1]-m[0*4+1]*m[1*4+0];var t02=m[0*4+0]*m[1*4+2]-m[0*4+2]*m[1*4+
0];var t03=m[0*4+0]*m[1*4+3]-m[0*4+3]*m[1*4+0];var t12=m[0*4+1]*m[1*4+2]-m[0*4+2
]*m[1*4+1];var t13=m[0*4+1]*m[1*4+3]-m[0*4+3]*m[1*4+1];var t23=m[0*4+2]*m[1*4+3]
-m[0*4+3]*m[1*4+2];return m[3*4+3]*(m[2*4+2]*t01-m[2*4+1]*t02+m[2*4+0]*t12)- | |
122 m[3*4+2]*(m[2*4+3]*t01-m[2*4+1]*t03+m[2*4+0]*t13)+ | |
123 m[3*4+1]*(m[2*4+3]*t02-m[2*4+2]*t03+m[2*4+0]*t23)- | |
124 m[3*4+0]*(m[2*4+3]*t12-m[2*4+2]*t13+m[2*4+1]*t23);};tdl.math.inverse1=function(m
){return[[1.0/m[0]]];};tdl.math.inverse2=function(m){var d=1.0/(m[0*2+0]*m[1*2+1
]-m[0*2+1]*m[1*2+0]);return[d*m[1*2+1],-d*m[0*2+1],-d*m[1*2+0],d*m[0*2+0]];};tdl
.math.inverse3=function(m){var t00=m[1*3+1]*m[2*3+2]-m[1*3+2]*m[2*3+1];var t10=m
[0*3+1]*m[2*3+2]-m[0*3+2]*m[2*3+1];var t20=m[0*3+1]*m[1*3+2]-m[0*3+2]*m[1*3+1];v
ar d=1.0/(m[0*3+0]*t00-m[1*3+0]*t10+m[2*3+0]*t20);return[d*t00,-d*t10,d*t20,-d*(
m[1*3+0]*m[2*3+2]-m[1*3+2]*m[2*3+0]),d*(m[0*3+0]*m[2*3+2]-m[0*3+2]*m[2*3+0]),-d*
(m[0*3+0]*m[1*3+2]-m[0*3+2]*m[1*3+0]),d*(m[1*3+0]*m[2*3+1]-m[1*3+1]*m[2*3+0]),-d
*(m[0*3+0]*m[2*3+1]-m[0*3+1]*m[2*3+0]),d*(m[0*3+0]*m[1*3+1]-m[0*3+1]*m[1*3+0])];
};tdl.math.inverse4=function(m){var tmp_0=m[2*4+2]*m[3*4+3];var tmp_1=m[3*4+2]*m
[2*4+3];var tmp_2=m[1*4+2]*m[3*4+3];var tmp_3=m[3*4+2]*m[1*4+3];var tmp_4=m[1*4+
2]*m[2*4+3];var tmp_5=m[2*4+2]*m[1*4+3];var tmp_6=m[0*4+2]*m[3*4+3];var tmp_7=m[
3*4+2]*m[0*4+3];var tmp_8=m[0*4+2]*m[2*4+3];var tmp_9=m[2*4+2]*m[0*4+3];var tmp_
10=m[0*4+2]*m[1*4+3];var tmp_11=m[1*4+2]*m[0*4+3];var tmp_12=m[2*4+0]*m[3*4+1];v
ar tmp_13=m[3*4+0]*m[2*4+1];var tmp_14=m[1*4+0]*m[3*4+1];var tmp_15=m[3*4+0]*m[1
*4+1];var tmp_16=m[1*4+0]*m[2*4+1];var tmp_17=m[2*4+0]*m[1*4+1];var tmp_18=m[0*4
+0]*m[3*4+1];var tmp_19=m[3*4+0]*m[0*4+1];var tmp_20=m[0*4+0]*m[2*4+1];var tmp_2
1=m[2*4+0]*m[0*4+1];var tmp_22=m[0*4+0]*m[1*4+1];var tmp_23=m[1*4+0]*m[0*4+1];va
r t0=(tmp_0*m[1*4+1]+tmp_3*m[2*4+1]+tmp_4*m[3*4+1])- | |
125 (tmp_1*m[1*4+1]+tmp_2*m[2*4+1]+tmp_5*m[3*4+1]);var t1=(tmp_1*m[0*4+1]+tmp_6*m[2*
4+1]+tmp_9*m[3*4+1])- | |
126 (tmp_0*m[0*4+1]+tmp_7*m[2*4+1]+tmp_8*m[3*4+1]);var t2=(tmp_2*m[0*4+1]+tmp_7*m[1*
4+1]+tmp_10*m[3*4+1])- | |
127 (tmp_3*m[0*4+1]+tmp_6*m[1*4+1]+tmp_11*m[3*4+1]);var t3=(tmp_5*m[0*4+1]+tmp_8*m[1
*4+1]+tmp_11*m[2*4+1])- | |
128 (tmp_4*m[0*4+1]+tmp_9*m[1*4+1]+tmp_10*m[2*4+1]);var d=1.0/(m[0*4+0]*t0+m[1*4+0]*
t1+m[2*4+0]*t2+m[3*4+0]*t3);return[d*t0,d*t1,d*t2,d*t3,d*((tmp_1*m[1*4+0]+tmp_2*
m[2*4+0]+tmp_5*m[3*4+0])- | |
129 (tmp_0*m[1*4+0]+tmp_3*m[2*4+0]+tmp_4*m[3*4+0])),d*((tmp_0*m[0*4+0]+tmp_7*m[2*4+0
]+tmp_8*m[3*4+0])- | |
130 (tmp_1*m[0*4+0]+tmp_6*m[2*4+0]+tmp_9*m[3*4+0])),d*((tmp_3*m[0*4+0]+tmp_6*m[1*4+0
]+tmp_11*m[3*4+0])- | |
131 (tmp_2*m[0*4+0]+tmp_7*m[1*4+0]+tmp_10*m[3*4+0])),d*((tmp_4*m[0*4+0]+tmp_9*m[1*4+
0]+tmp_10*m[2*4+0])- | |
132 (tmp_5*m[0*4+0]+tmp_8*m[1*4+0]+tmp_11*m[2*4+0])),d*((tmp_12*m[1*4+3]+tmp_15*m[2*
4+3]+tmp_16*m[3*4+3])- | |
133 (tmp_13*m[1*4+3]+tmp_14*m[2*4+3]+tmp_17*m[3*4+3])),d*((tmp_13*m[0*4+3]+tmp_18*m[
2*4+3]+tmp_21*m[3*4+3])- | |
134 (tmp_12*m[0*4+3]+tmp_19*m[2*4+3]+tmp_20*m[3*4+3])),d*((tmp_14*m[0*4+3]+tmp_19*m[
1*4+3]+tmp_22*m[3*4+3])- | |
135 (tmp_15*m[0*4+3]+tmp_18*m[1*4+3]+tmp_23*m[3*4+3])),d*((tmp_17*m[0*4+3]+tmp_20*m[
1*4+3]+tmp_23*m[2*4+3])- | |
136 (tmp_16*m[0*4+3]+tmp_21*m[1*4+3]+tmp_22*m[2*4+3])),d*((tmp_14*m[2*4+2]+tmp_17*m[
3*4+2]+tmp_13*m[1*4+2])- | |
137 (tmp_16*m[3*4+2]+tmp_12*m[1*4+2]+tmp_15*m[2*4+2])),d*((tmp_20*m[3*4+2]+tmp_12*m[
0*4+2]+tmp_19*m[2*4+2])- | |
138 (tmp_18*m[2*4+2]+tmp_21*m[3*4+2]+tmp_13*m[0*4+2])),d*((tmp_18*m[1*4+2]+tmp_23*m[
3*4+2]+tmp_15*m[0*4+2])- | |
139 (tmp_22*m[3*4+2]+tmp_14*m[0*4+2]+tmp_19*m[1*4+2])),d*((tmp_22*m[2*4+2]+tmp_16*m[
0*4+2]+tmp_21*m[1*4+2])- | |
140 (tmp_20*m[1*4+2]+tmp_23*m[2*4+2]+tmp_17*m[0*4+2]))];};tdl.math.codet=function(a,
x,y){var size=4;var b=[];var ai=0;for(var bi=0;bi<size-1;++bi){if(ai==x) | |
141 ai++;var aj=0;for(var bj=0;bj<size-1;++bj){if(aj==y) | |
142 aj++;b[bi*4+bj]=a[ai*4+aj];aj++;} | |
143 ai++;} | |
144 return tdl.math.det(b);};tdl.math.det=function(m){var d=4;if(d<=4){return tdl.ma
th['det'+d](m);} | |
145 var r=0.0;var sign=1;var row=m[0];var mLength=m.length;for(var y=0;y<mLength;y++
){r+=sign*row[y]*tdl.math.codet(m,0,y);sign*=-1;} | |
146 return r;};tdl.math.inverse=function(m){var d=4;if(d<=4){return tdl.math['invers
e'+d](m);} | |
147 var r=[];var size=m.length;for(var j=0;j<size;++j){r[j]=[];for(var i=0;i<size;++
i) | |
148 r[j][i]=((i+j)%2?-1:1)*tdl.math.codet(m,i,j);} | |
149 return tdl.math.divMatrixScalar(r,tdl.math.det(m));};tdl.math.orthonormalize=fun
ction(m){};tdl.math.matrix4.inverse=function(m){return tdl.math.inverse4(m);};td
l.math.matrix4.mul=function(a,b){return tdl.math.mulMatrixMatrix4(a,b);};tdl.mat
h.matrix4.det=function(m){return tdl.math.det4(m);};tdl.math.matrix4.copy=functi
on(m){return tdl.math.copyMatrix(m);};tdl.math.matrix4.transpose=tdl.math.transp
ose;tdl.math.matrix4.setUpper3x3=function(a,b){a[0*4+0]=b[0*3+0];a[0*4+1]=b[0*3+
1];a[0*4+2]=b[0*3+2];a[1*4+0]=b[1*3+0];a[1*4+1]=b[1*3+1];a[1*4+2]=b[1*3+2];a[2*4
+0]=b[2*3+0];a[2*4+1]=b[2*3+1];a[2*4+2]=b[2*3+2];return a;};tdl.math.matrix4.get
Upper3x3=function(m){return[m[0*4+0],m[0*4+1],m[0*4+2],m[1*4+0],m[1*4+1],m[1*4+2
],m[2*4+0],m[2*4+1],m[2*4+2]];};tdl.math.matrix4.setTranslation=function(a,v){a[
12]=v[0];a[13]=v[1];a[14]=v[2];a[15]=1;return a;};tdl.math.matrix4.getTranslatio
n=function(m){return[m[12],m[13],m[14],m[15]];};tdl.math.matrix4.transformPoint=
function(m,v){var v0=v[0];var v1=v[1];var v2=v[2];var d=v0*m[0*4+3]+v1*m[1*4+3]+
v2*m[2*4+3]+m[3*4+3];return[(v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0]+m[3*4+0])/d,(v0
*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1]+m[3*4+1])/d,(v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+
2]+m[3*4+2])/d];};tdl.math.matrix4.transformVector4=function(m,v){var v0=v[0];va
r v1=v[1];var v2=v[2];var v3=v[3];return[v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0]+v3*
m[3*4+0],v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1]+v3*m[3*4+1],v0*m[0*4+2]+v1*m[1*4+2]
+v2*m[2*4+2]+v3*m[3*4+2],v0*m[0*4+3]+v1*m[1*4+3]+v2*m[2*4+3]+v3*m[3*4+3]];};tdl.
math.matrix4.transformDirection=function(m,v){var v0=v[0];var v1=v[1];var v2=v[2
];return[v0*m[0*4+0]+v1*m[1*4+0]+v2*m[2*4+0],v0*m[0*4+1]+v1*m[1*4+1]+v2*m[2*4+1]
,v0*m[0*4+2]+v1*m[1*4+2]+v2*m[2*4+2]];};tdl.math.matrix4.transformNormal=functio
n(m,v){var mi=tdl.math.inverse4(m);var v0=v[0];var v1=v[1];var v2=v[2];return[v0
*mi[0*4+0]+v1*mi[0*4+1]+v2*mi[0*4+2],v0*mi[1*4+0]+v1*mi[1*4+1]+v2*mi[1*4+2],v0*m
i[2*4+0]+v1*mi[2*4+1]+v2*mi[2*4+2]];};tdl.math.matrix4.identity=function(){retur
n[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];};tdl.math.matrix4.setIdentity=function(m){fo
r(var i=0;i<4;i++){for(var j=0;j<4;j++){if(i==j){m[i*4+j]=1;}else{m[i*4+j]=0;}}} | |
150 return m;};tdl.math.matrix4.perspective=function(angle,aspect,near,far){var f=Ma
th.tan(0.5*(Math.PI-angle));var range=near-far;return[f/aspect,0,0,0,0,f,0,0,0,0
,far/range,-1,0,0,near*far/range,0];};tdl.math.matrix4.orthographic=function(lef
t,right,bottom,top,near,far){return[2/(right-left),0,0,0,0,2/(top-bottom),0,0,0,
0,1/(near-far),0,(left+right)/(left-right),(bottom+top)/(bottom-top),near/(near-
far),1];};tdl.math.matrix4.frustum=function(left,right,bottom,top,near,far){var
dx=(right-left);var dy=(top-bottom);var dz=(near-far);return[2*near/dx,0,0,0,0,2
*near/dy,0,0,(left+right)/dx,(top+bottom)/dy,far/dz,-1,0,0,near*far/dz,0];};tdl.
math.matrix4.lookAt=function(eye,target,up){return tdl.math.inverse(tdl.math.mat
rix4.cameraLookAt(eye,target,up));};tdl.math.matrix4.cameraLookAt=function(eye,t
arget,up){var vz=tdl.math.normalize(tdl.math.subVector(eye,target));var vx=tdl.m
ath.normalize(tdl.math.cross(up,vz));var vy=tdl.math.cross(vz,vx);return tdl.mat
h.inverse([vx[0],vx[1],vx[2],0,vy[0],vy[1],vy[2],0,vz[0],vz[1],vz[2],0,-tdl.math
.dot(vx,eye),-tdl.math.dot(vy,eye),-tdl.math.dot(vz,eye),1]);};tdl.math.matrix4.
composition=function(a,b){var a00=a[0*4+0];var a01=a[0*4+1];var a02=a[0*4+2];var
a03=a[0*4+3];var a10=a[1*4+0];var a11=a[1*4+1];var a12=a[1*4+2];var a13=a[1*4+3
];var a20=a[2*4+0];var a21=a[2*4+1];var a22=a[2*4+2];var a23=a[2*4+3];var a30=a[
3*4+0];var a31=a[3*4+1];var a32=a[3*4+2];var a33=a[3*4+3];var b00=b[0*4+0];var b
01=b[0*4+1];var b02=b[0*4+2];var b03=b[0*4+3];var b10=b[1*4+0];var b11=b[1*4+1];
var b12=b[1*4+2];var b13=b[1*4+3];var b20=b[2*4+0];var b21=b[2*4+1];var b22=b[2*
4+2];var b23=b[2*4+3];var b30=b[3*4+0];var b31=b[3*4+1];var b32=b[3*4+2];var b33
=b[3*4+3];return[a00*b00+a10*b01+a20*b02+a30*b03,a01*b00+a11*b01+a21*b02+a31*b03
,a02*b00+a12*b01+a22*b02+a32*b03,a03*b00+a13*b01+a23*b02+a33*b03,a00*b10+a10*b11
+a20*b12+a30*b13,a01*b10+a11*b11+a21*b12+a31*b13,a02*b10+a12*b11+a22*b12+a32*b13
,a03*b10+a13*b11+a23*b12+a33*b13,a00*b20+a10*b21+a20*b22+a30*b23,a01*b20+a11*b21
+a21*b22+a31*b23,a02*b20+a12*b21+a22*b22+a32*b23,a03*b20+a13*b21+a23*b22+a33*b23
,a00*b30+a10*b31+a20*b32+a30*b33,a01*b30+a11*b31+a21*b32+a31*b33,a02*b30+a12*b31
+a22*b32+a32*b33,a03*b30+a13*b31+a23*b32+a33*b33];};tdl.math.matrix4.compose=fun
ction(a,b){var a00=a[0*4+0];var a01=a[0*4+1];var a02=a[0*4+2];var a03=a[0*4+3];v
ar a10=a[1*4+0];var a11=a[1*4+1];var a12=a[1*4+2];var a13=a[1*4+3];var a20=a[2*4
+0];var a21=a[2*4+1];var a22=a[2*4+2];var a23=a[2*4+3];var a30=a[3*4+0];var a31=
a[3*4+1];var a32=a[3*4+2];var a33=a[3*4+3];var b00=b[0*4+0];var b01=b[0*4+1];var
b02=b[0*4+2];var b03=b[0*4+3];var b10=b[1*4+0];var b11=b[1*4+1];var b12=b[1*4+2
];var b13=b[1*4+3];var b20=b[2*4+0];var b21=b[2*4+1];var b22=b[2*4+2];var b23=b[
2*4+3];var b30=b[3*4+0];var b31=b[3*4+1];var b32=b[3*4+2];var b33=b[3*4+3];a[0]=
a00*b00+a10*b01+a20*b02+a30*b03;a[1]=a01*b00+a11*b01+a21*b02+a31*b03;a[2]=a02*b0
0+a12*b01+a22*b02+a32*b03;a[3]=a03*b00+a13*b01+a23*b02+a33*b03;a[4]=a00*b10+a10*
b11+a20*b12+a30*b13;a[5]=a01*b10+a11*b11+a21*b12+a31*b13;a[6]=a02*b10+a12*b11+a2
2*b12+a32*b13;a[7]=a03*b10+a13*b11+a23*b12+a33*b13;a[8]=a00*b20+a10*b21+a20*b22+
a30*b23;a[9]=a01*b20+a11*b21+a21*b22+a31*b23;a[10]=a02*b20+a12*b21+a22*b22+a32*b
23;a[11]=a03*b20+a13*b21+a23*b22+a33*b23;a[12]=a00*b30+a10*b31+a20*b32+a30*b33;a
[13]=a01*b30+a11*b31+a21*b32+a31*b33;a[14]=a02*b30+a12*b31+a22*b32+a32*b33;a[15]
=a03*b30+a13*b31+a23*b32+a33*b33;return a;};tdl.math.matrix4.translation=functio
n(v){return[1,0,0,0,0,1,0,0,0,0,1,0,v[0],v[1],v[2],1];};tdl.math.matrix4.transla
te=function(m,v){var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*
4+3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20
=m[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];va
r m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];var v0=v[0];var v1=v[1];var v2=
v[2];m[12]=m00*v0+m10*v1+m20*v2+m30;m[13]=m01*v0+m11*v1+m21*v2+m31;m[14]=m02*v0+
m12*v1+m22*v2+m32;m[15]=m03*v0+m13*v1+m23*v2+m33;return m;};tdl.math.matrix4.sca
ling=function(v){return[v[0],0,0,0,0,v[1],0,0,0,0,v[2],0,0,0,0,1];};tdl.math.mat
rix4.scale=function(m,v){var v0=v[0];var v1=v[1];var v2=v[2];m[0]=v0*m[0*4+0];m[
1]=v0*m[0*4+1];m[2]=v0*m[0*4+2];m[3]=v0*m[0*4+3];m[4]=v1*m[1*4+0];m[5]=v1*m[1*4+
1];m[6]=v1*m[1*4+2];m[7]=v1*m[1*4+3];m[8]=v2*m[2*4+0];m[9]=v2*m[2*4+1];m[10]=v2*
m[2*4+2];m[11]=v2*m[2*4+3];return m;};tdl.math.matrix4.rotationX=function(angle)
{var c=Math.cos(angle);var s=Math.sin(angle);return[1,0,0,0,0,c,s,0,0,-s,c,0,0,0
,0,1];};tdl.math.matrix4.rotateX=function(m,angle){var m10=m[1*4+0];var m11=m[1*
4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m22
=m[2*4+2];var m23=m[2*4+3];var c=Math.cos(angle);var s=Math.sin(angle);m[4]=c*m1
0+s*m20;m[5]=c*m11+s*m21;m[6]=c*m12+s*m22;m[7]=c*m13+s*m23;m[8]=c*m20-s*m10;m[9]
=c*m21-s*m11;m[10]=c*m22-s*m12;m[11]=c*m23-s*m13;return m;};tdl.math.matrix4.rot
ationY=function(angle){var c=Math.cos(angle);var s=Math.sin(angle);return[c,0,-s
,0,0,1,0,0,s,0,c,0,0,0,0,1];};tdl.math.matrix4.rotateY=function(m,angle){var m00
=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m20=m[2*4+0];va
r m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var c=Math.cos(angle);var s=Mat
h.sin(angle);m[0]=c*m00-s*m20;m[1]=c*m01-s*m21;m[2]=c*m02-s*m22;m[3]=c*m03-s*m23
;m[8]=c*m20+s*m00;m[9]=c*m21+s*m01;m[10]=c*m22+s*m02;m[11]=c*m23+s*m03;return m;
};tdl.math.matrix4.rotationZ=function(angle){var c=Math.cos(angle);var s=Math.si
n(angle);return[c,s,0,0,-s,c,0,0,0,0,1,0,0,0,0,1];};tdl.math.matrix4.rotateZ=fun
ction(m,angle){var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+
3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var c=Mat
h.cos(angle);var s=Math.sin(angle);m[0]=c*m00+s*m10;m[1]=c*m01+s*m11;m[2]=c*m02+
s*m12;m[3]=c*m03+s*m13;m[4]=c*m10-s*m00;m[5]=c*m11-s*m01;m[6]=c*m12-s*m02;m[7]=c
*m13-s*m03;return m;};tdl.math.matrix4.rotationZYX=function(v){var sinx=Math.sin
(v[0]);var cosx=Math.cos(v[0]);var siny=Math.sin(v[1]);var cosy=Math.cos(v[1]);v
ar sinz=Math.sin(v[2]);var cosz=Math.cos(v[2]);var coszsiny=cosz*siny;var sinzsi
ny=sinz*siny;return[cosz*cosy,sinz*cosy,-siny,0,coszsiny*sinx-sinz*cosx,sinzsiny
*sinx+cosz*cosx,cosy*sinx,0,coszsiny*cosx+sinz*sinx,sinzsiny*cosx-cosz*sinx,cosy
*cosx,0,0,0,0,1];};tdl.math.matrix4.rotateZYX=function(m,v){var sinX=Math.sin(v[
0]);var cosX=Math.cos(v[0]);var sinY=Math.sin(v[1]);var cosY=Math.cos(v[1]);var
sinZ=Math.sin(v[2]);var cosZ=Math.cos(v[2]);var cosZSinY=cosZ*sinY;var sinZSinY=
sinZ*sinY;var r00=cosZ*cosY;var r01=sinZ*cosY;var r02=-sinY;var r10=cosZSinY*sin
X-sinZ*cosX;var r11=sinZSinY*sinX+cosZ*cosX;var r12=cosY*sinX;var r20=cosZSinY*c
osX+sinZ*sinX;var r21=sinZSinY*cosX-cosZ*sinX;var r22=cosY*cosX;var m00=m[0*4+0]
;var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+3];var m10=m[1*4+0];var m11=m[1
*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m[2*4+0];var m21=m[2*4+1];var m2
2=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var m31=m[3*4+1];var m32=m[3*4+2];v
ar m33=m[3*4+3];m[0]=r00*m00+r01*m10+r02*m20;m[1]=r00*m01+r01*m11+r02*m21;m[2]=r
00*m02+r01*m12+r02*m22;m[3]=r00*m03+r01*m13+r02*m23;m[4]=r10*m00+r11*m10+r12*m20
;m[5]=r10*m01+r11*m11+r12*m21;m[6]=r10*m02+r11*m12+r12*m22;m[7]=r10*m03+r11*m13+
r12*m23;m[8]=r20*m00+r21*m10+r22*m20;m[9]=r20*m01+r21*m11+r22*m21;m[10]=r20*m02+
r21*m12+r22*m22;m[11]=r20*m03+r21*m13+r22*m23;return m;};tdl.math.matrix4.axisRo
tation=function(axis,angle){var x=axis[0];var y=axis[1];var z=axis[2];var n=Math
.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.co
s(angle);var s=Math.sin(angle);var oneMinusCosine=1-c;return[xx+(1-xx)*c,x*y*one
MinusCosine+z*s,x*z*oneMinusCosine-y*s,0,x*y*oneMinusCosine-z*s,yy+(1-yy)*c,y*z*
oneMinusCosine+x*s,0,x*z*oneMinusCosine+y*s,y*z*oneMinusCosine-x*s,zz+(1-zz)*c,0
,0,0,0,1];};tdl.math.matrix4.axisRotate=function(m,axis,angle){var x=axis[0];var
y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;
var yy=y*y;var zz=z*z;var c=Math.cos(angle);var s=Math.sin(angle);var oneMinusCo
sine=1-c;var r00=xx+(1-xx)*c;var r01=x*y*oneMinusCosine+z*s;var r02=x*z*oneMinus
Cosine-y*s;var r10=x*y*oneMinusCosine-z*s;var r11=yy+(1-yy)*c;var r12=y*z*oneMin
usCosine+x*s;var r20=x*z*oneMinusCosine+y*s;var r21=y*z*oneMinusCosine-x*s;var r
22=zz+(1-zz)*c;var m00=m[0*4+0];var m01=m[0*4+1];var m02=m[0*4+2];var m03=m[0*4+
3];var m10=m[1*4+0];var m11=m[1*4+1];var m12=m[1*4+2];var m13=m[1*4+3];var m20=m
[2*4+0];var m21=m[2*4+1];var m22=m[2*4+2];var m23=m[2*4+3];var m30=m[3*4+0];var
m31=m[3*4+1];var m32=m[3*4+2];var m33=m[3*4+3];m[0]=r00*m00+r01*m10+r02*m20;m[1]
=r00*m01+r01*m11+r02*m21;m[2]=r00*m02+r01*m12+r02*m22;m[3]=r00*m03+r01*m13+r02*m
23;m[4]=r10*m00+r11*m10+r12*m20;m[5]=r10*m01+r11*m11+r12*m21;m[6]=r10*m02+r11*m1
2+r12*m22;m[7]=r10*m03+r11*m13+r12*m23;m[8]=r20*m00+r21*m10+r22*m20;m[9]=r20*m01
+r21*m11+r22*m21;m[10]=r20*m02+r21*m12+r22*m22;m[11]=r20*m03+r21*m13+r22*m23;ret
urn m;};tdl.math.installRowMajorFunctions=function(){for(var f in tdl.math.rowMa
jor){tdl.math[f]=tdl.math.rowMajor[f];}};tdl.math.installColumnMajorFunctions=fu
nction(){for(var f in tdl.math.columnMajor){tdl.math[f]=tdl.math.columnMajor[f];
}};tdl.math.installErrorCheckFunctions=function(){for(var f in tdl.math.errorChe
ck){tdl.math[f]=tdl.math.errorCheck[f];}};tdl.math.installErrorCheckFreeFunction
s=function(){for(var f in tdl.math.errorCheckFree){tdl.math[f]=tdl.math.errorChe
ckFree[f];}} | |
151 tdl.math.installRowMajorFunctions();tdl.math.installErrorCheckFunctions();tdl.pr
ovide('tdl.misc');tdl.require('tdl.log');tdl.misc=tdl.misc||{};tdl.misc.applyUrl
Settings=function(obj,opt_argumentName){var argumentName=opt_argumentName||'sett
ings';try{var s=window.location.href;var q=s.indexOf("?");var e=s.indexOf("#");i
f(e<0){e=s.length;} | |
152 var query=s.substring(q+1,e);var pairs=query.split("&");for(var ii=0;ii<pairs.le
ngth;++ii){var keyValue=pairs[ii].split("=");var key=keyValue[0];var value=decod
eURIComponent(keyValue[1]);switch(key){case argumentName:var settings=eval("("+v
alue+")");tdl.misc.copyProperties(settings,obj);break;}}}catch(e){tdl.error(e);t
dl.error("settings:",settings);return;}};tdl.misc.copyProperties=function(obj,ds
t){for(var name in obj){var value=obj[name];if(value instanceof Array){var newDs
t=dst[name];if(!newDst){newDst=[];dst[name]=newDst;} | |
153 tdl.misc.copyProperties(value,newDst);}else if(typeof value=='object'){var newDs
t=dst[name];if(!newDst){newDst={};dst[name]=newDst;} | |
154 tdl.misc.copyProperties(value,newDst);}else{dst[name]=value;}}};tdl.provide('tdl
.models');tdl.require('tdl.buffers');tdl.models=tdl.models||{};tdl.models.Model=
function(program,arrays,textures,opt_mode){this.buffers={};this.setBuffers(array
s);var textureUnits={} | |
155 var unit=0;for(var texture in program.textures){textureUnits[texture]=unit++;} | |
156 this.mode=(opt_mode===undefined)?gl.TRIANGLES:opt_mode;this.textures=textures;th
is.textureUnits=textureUnits;this.setProgram(program);} | |
157 tdl.models.Model.prototype.setProgram=function(program){this.program=program;} | |
158 tdl.models.Model.prototype.setBuffer=function(name,array){var target=(name=='ind
ices')?gl.ELEMENT_ARRAY_BUFFER:gl.ARRAY_BUFFER;var b=this.buffers[name];if(!b){b
=new tdl.buffers.Buffer(array,target);}else{b.set(array);} | |
159 this.buffers[name]=b;};tdl.models.Model.prototype.setBuffers=function(arrays){fo
r(var name in arrays){this.setBuffer(name,arrays[name]);}};tdl.models.Model.prot
otype.applyUniforms_=function(opt_uniforms){if(opt_uniforms){var program=this.pr
ogram;for(var uniform in opt_uniforms){program.setUniform(uniform,opt_uniforms[u
niform]);}}};tdl.models.Model.prototype.drawPrep=function(){var program=this.pro
gram;var buffers=this.buffers;var textures=this.textures;program.use();for(var b
uffer in buffers){var b=buffers[buffer];if(buffer=='indices'){gl.bindBuffer(gl.E
LEMENT_ARRAY_BUFFER,b.buffer());}else{var attrib=program.attrib[buffer];if(attri
b){attrib(b);}}} | |
160 this.applyUniforms_(textures);for(var ii=0;ii<arguments.length;++ii){this.applyU
niforms_(arguments[ii]);}};tdl.models.Model.prototype.draw=function(){for(var ii
=0;ii<arguments.length;++ii){this.applyUniforms_(arguments[ii]);} | |
161 var buffers=this.buffers;gl.drawElements(this.mode,buffers.indices.totalComponen
ts(),gl.UNSIGNED_SHORT,0);};tdl.provide('tdl.primitives');tdl.require('tdl.math'
);tdl.require('tdl.log');tdl.primitives=tdl.primitives||{};tdl.primitives.Attrib
Buffer=function(numComponents,numElements,opt_type){opt_type=opt_type||'Float32A
rray';var type=window[opt_type];if(numElements.length){this.buffer=new type(numE
lements);numElements=this.buffer.length/numComponents;this.cursor=numElements;}e
lse{this.buffer=new type(numComponents*numElements);this.cursor=0;} | |
162 this.numComponents=numComponents;this.numElements=numElements;this.type=opt_type
;};tdl.primitives.AttribBuffer.prototype.stride=function(){return 0;};tdl.primit
ives.AttribBuffer.prototype.offset=function(){return 0;};tdl.primitives.AttribBu
ffer.prototype.getElement=function(index){var offset=index*this.numComponents;va
r value=[];for(var ii=0;ii<this.numComponents;++ii){value.push(this.buffer[offse
t+ii]);} | |
163 return value;};tdl.primitives.AttribBuffer.prototype.setElement=function(index,v
alue){var offset=index*this.numComponents;for(var ii=0;ii<this.numComponents;++i
i){this.buffer[offset+ii]=value[ii];}};tdl.primitives.AttribBuffer.prototype.clo
ne=function(){var copy=new tdl.primitives.AttribBuffer(this.numComponents,this.n
umElements,this.type);copy.pushArray(this);return copy;} | |
164 tdl.primitives.AttribBuffer.prototype.push=function(value){this.setElement(this.
cursor++,value);};tdl.primitives.AttribBuffer.prototype.pushArray=function(array
){for(var ii=0;ii<array.numElements;++ii){this.push(array.getElement(ii));}};tdl
.primitives.AttribBuffer.prototype.pushArrayWithOffset=function(array,offset){fo
r(var ii=0;ii<array.numElements;++ii){var elem=array.getElement(ii);for(var jj=0
;jj<offset.length;++jj){elem[jj]+=offset[jj];} | |
165 this.push(elem);}};tdl.primitives.AttribBuffer.prototype.computeExtents=function
(){var numElements=this.numElements;var numComponents=this.numComponents;var min
Extent=this.getElement(0);var maxExtent=this.getElement(0);for(var ii=1;ii<numEl
ements;++ii){var element=this.getElement(ii);for(var jj=0;jj<numComponents;++jj)
{minExtent[jj]=Math.min(minExtent[jj],element[jj]);maxExtent[jj]=Math.max(maxExt
ent[jj],element[jj]);}} | |
166 return{min:minExtent,max:maxExtent};};tdl.primitives.mulComponents=function(arra
y,multiplier){var numElements=array.numElements;var numComponents=array.numCompo
nents;for(var ii=0;ii<numElements;++ii){var element=array.getElement(ii);for(var
jj=0;jj<numComponents;++jj){element[jj]*=multiplier[jj];} | |
167 array.setElement(ii,element);}};tdl.primitives.reorientPositions=function(array,
matrix){var math=tdl.math;var numElements=array.numElements;for(var ii=0;ii<numE
lements;++ii){array.setElement(ii,math.matrix4.transformPoint(matrix,array.getEl
ement(ii)));}};tdl.primitives.reorientNormals=function(array,matrix){var math=td
l.math;var numElements=array.numElements;for(var ii=0;ii<numElements;++ii){array
.setElement(ii,math.matrix4.transformNormal(matrix,array.getElement(ii)));}};tdl
.primitives.reorientDirections=function(array,matrix){var math=tdl.math;var numE
lements=array.numElements;for(var ii=0;ii<numElements;++ii){array.setElement(ii,
math.matrix4.transformDirection(matrix,array.getElement(ii)));}};tdl.primitives.
reorient=function(arrays,matrix){for(var array in arrays){if(array.match(/^posit
ion/)){tdl.primitives.reorientPositions(arrays[array],matrix);}else if(array.mat
ch(/^normal/)){tdl.primitives.reorientNormals(arrays[array],matrix);}else if(arr
ay.match(/^tangent/)||array.match(/^binormal/)){tdl.primitives.reorientDirection
s(arrays[array],matrix);}}};tdl.primitives.createTangentsAndBinormals=function(p
ositionArray,normalArray,normalMapUVArray,triangles){var math=tdl.math;var tange
ntFrames={};function roundVector(v){return[Math.round(v[0]),Math.round(v[1]),Mat
h.round(v[2])];} | |
168 function tangentFrameKey(position,normal){return roundVector(math.mulVectorScala
r(position,100))+','+ | |
169 roundVector(math.mulVectorScalar(normal,100));} | |
170 function addTangentFrame(position,normal,tangent,binormal){var key=tangentFrameK
ey(position,normal);var frame=tangentFrames[key];if(!frame){frame=[[0,0,0],[0,0,
0]];} | |
171 frame[0]=math.addVector(frame[0],tangent);frame[1]=math.addVector(frame[1],binor
mal);tangentFrames[key]=frame;} | |
172 function getTangentFrame(position,normal){var key=tangentFrameKey(position,norma
l);return tangentFrames[key];} | |
173 var numTriangles=triangles.numElements;for(var triangleIndex=0;triangleIndex<num
Triangles;++triangleIndex){var vertexIndices=triangles.getElement(triangleIndex)
;var uvs=[];var positions=[];var normals=[];for(var i=0;i<3;++i){var vertexIndex
=vertexIndices[i];uvs[i]=normalMapUVArray.getElement(vertexIndex);positions[i]=p
ositionArray.getElement(vertexIndex);normals[i]=normalArray.getElement(vertexInd
ex);} | |
174 var tangent=[0,0,0];var binormal=[0,0,0];for(var axis=0;axis<3;++axis){var edge1
=[positions[1][axis]-positions[0][axis],uvs[1][0]-uvs[0][0],uvs[1][1]-uvs[0][1]]
;var edge2=[positions[2][axis]-positions[0][axis],uvs[2][0]-uvs[0][0],uvs[2][1]-
uvs[0][1]];var edgeCross=math.normalize(math.cross(edge1,edge2));if(edgeCross[0]
==0){edgeCross[0]=1;} | |
175 tangent[axis]=-edgeCross[1]/edgeCross[0];binormal[axis]=-edgeCross[2]/edgeCross[
0];} | |
176 var tangentLength=math.length(tangent);if(tangentLength>0.00001){tangent=math.mu
lVectorScalar(tangent,1/tangentLength);} | |
177 var binormalLength=math.length(binormal);if(binormalLength>0.00001){binormal=mat
h.mulVectorScalar(binormal,1/binormalLength);} | |
178 for(var i=0;i<3;++i){addTangentFrame(positions[i],normals[i],tangent,binormal);}
} | |
179 var numVertices=positionArray.numElements;var tangents=new tdl.primitives.Attrib
Buffer(3,numVertices);var binormals=new tdl.primitives.AttribBuffer(3,numVertice
s);for(var vertexIndex=0;vertexIndex<numVertices;++vertexIndex){var position=pos
itionArray.getElement(vertexIndex);var normal=normalArray.getElement(vertexIndex
);var frame=getTangentFrame(position,normal);var tangent=frame[0];tangent=math.s
ubVector(tangent,math.mulVectorScalar(normal,math.dot(normal,tangent)));var tang
entLength=math.length(tangent);if(tangentLength>0.00001){tangent=math.mulVectorS
calar(tangent,1/tangentLength);} | |
180 var binormal=frame[1];binormal=math.subVector(binormal,math.mulVectorScalar(tang
ent,math.dot(tangent,binormal)));binormal=math.subVector(binormal,math.mulVector
Scalar(normal,math.dot(normal,binormal)));var binormalLength=math.length(binorma
l);if(binormalLength>0.00001){binormal=math.mulVectorScalar(binormal,1/binormalL
ength);} | |
181 tangents.push(tangent);binormals.push(binormal);} | |
182 return{tangent:tangents,binormal:binormals};};tdl.primitives.addTangentsAndBinor
mals=function(arrays){var bn=tdl.primitives.createTangentsAndBinormals(arrays.po
sition,arrays.normal,arrays.texCoord,arrays.indices);arrays.tangent=bn.tangent;a
rrays.binormal=bn.binormal;return arrays;};tdl.primitives.clone=function(arrays)
{var newArrays={};for(var array in arrays){newArrays[array]=arrays[array].clone(
);} | |
183 return newArrays;};tdl.primitives.concat=function(arrayOfArrays){var names={};va
r baseName;for(var ii=0;ii<arrayOfArrays.length;++ii){var arrays=arrayOfArrays[i
i];for(var name in arrays){if(!names[name]){names[name]=[];} | |
184 if(!baseName&&name!='indices'){baseName=name;} | |
185 var array=arrays[name];names[name].push(array.numElements);}} | |
186 var base=names[baseName];var newArrays={};for(var name in names){var numElements
=0;var numComponents;var type;for(var ii=0;ii<arrayOfArrays.length;++ii){var arr
ays=arrayOfArrays[ii];var array=arrays[name];numElements+=array.numElements;numC
omponents=array.numComponents;type=array.type;} | |
187 var newArray=new tdl.primitives.AttribBuffer(numComponents,numElements,type);var
baseIndex=0;for(var ii=0;ii<arrayOfArrays.length;++ii){var arrays=arrayOfArrays
[ii];var array=arrays[name];if(name=='indices'){newArray.pushArrayWithOffset(arr
ay,[baseIndex,baseIndex,baseIndex]);baseIndex+=base[ii];}else{newArray.pushArray
(array);}} | |
188 newArrays[name]=newArray;} | |
189 return newArrays;};tdl.primitives.applyPlanarUVMapping=function(positions,texCoo
rds){var extents=positions.computeExtents();var ranges=tdl.math.subVector(extent
s.max,extents.min);var numElements=positions.numElements;for(var ii=0;ii<numElem
ents;++ii){var position=positions.getElement(ii);var u=(position[0]-extents.min[
0])/ranges[0];var v=(position[2]-extents.min[2])/ranges[2];texCoords.setElement(
ii,[u,v]);}};tdl.primitives.createSphere=function(radius,subdivisionsAxis,subdiv
isionsHeight,opt_startLatitudeInRadians,opt_endLatitudeInRadians,opt_startLongit
udeInRadians,opt_endLongitudeInRadians){if(subdivisionsAxis<=0||subdivisionsHeig
ht<=0){throw Error('subdivisionAxis and subdivisionHeight must be > 0');} | |
190 var math=tdl.math;opt_startLatitudeInRadians=opt_startLatitudeInRadians||0;opt_e
ndLatitudeInRadians=opt_endLatitudeInRadians||Math.PI;opt_startLongitudeInRadian
s=opt_startLongitudeInRadians||0;opt_endLongitudeInRadians=opt_endLongitudeInRad
ians||(Math.PI*2);var latRange=opt_endLatitudeInRadians-opt_startLatitudeInRadia
ns;var longRange=opt_endLongitudeInRadians-opt_startLongitudeInRadians;var numVe
rtices=(subdivisionsAxis+1)*(subdivisionsHeight+1);var positions=new tdl.primiti
ves.AttribBuffer(3,numVertices);var normals=new tdl.primitives.AttribBuffer(3,nu
mVertices);var texCoords=new tdl.primitives.AttribBuffer(2,numVertices);for(var
y=0;y<=subdivisionsHeight;y++){for(var x=0;x<=subdivisionsAxis;x++){var u=x/subd
ivisionsAxis;var v=y/subdivisionsHeight;var theta=longRange*u;var phi=latRange*v
;var sinTheta=Math.sin(theta);var cosTheta=Math.cos(theta);var sinPhi=Math.sin(p
hi);var cosPhi=Math.cos(phi);var ux=cosTheta*sinPhi;var uy=cosPhi;var uz=sinThet
a*sinPhi;positions.push([radius*ux,radius*uy,radius*uz]);normals.push([ux,uy,uz]
);texCoords.push([u,v]);}} | |
191 var numVertsAround=subdivisionsAxis+1;var indices=new tdl.primitives.AttribBuffe
r(3,subdivisionsAxis*subdivisionsHeight*2,'Uint16Array');for(var x=0;x<subdivisi
onsAxis;x++){for(var y=0;y<subdivisionsHeight;y++){indices.push([(y+0)*numVertsA
round+x,(y+0)*numVertsAround+x+1,(y+1)*numVertsAround+x]);indices.push([(y+1)*nu
mVertsAround+x,(y+0)*numVertsAround+x+1,(y+1)*numVertsAround+x+1]);}} | |
192 return{position:positions,normal:normals,texCoord:texCoords,indices:indices};};t
dl.primitives.createPlane=function(width,depth,subdivisionsWidth,subdivisionsDep
th){if(subdivisionsWidth<=0||subdivisionsDepth<=0){throw Error('subdivisionWidth
and subdivisionDepth must be > 0');} | |
193 var math=tdl.math;var numVertices=(subdivisionsWidth+1)*(subdivisionsDepth+1);va
r positions=new tdl.primitives.AttribBuffer(3,numVertices);var normals=new tdl.p
rimitives.AttribBuffer(3,numVertices);var texCoords=new tdl.primitives.AttribBuf
fer(2,numVertices);for(var z=0;z<=subdivisionsDepth;z++){for(var x=0;x<=subdivis
ionsWidth;x++){var u=x/subdivisionsWidth;var v=z/subdivisionsDepth;positions.pus
h([width*u-width*0.5,0,depth*v-depth*0.5]);normals.push([0,1,0]);texCoords.push(
[u,v]);}} | |
194 var numVertsAcross=subdivisionsWidth+1;var indices=new tdl.primitives.AttribBuff
er(3,subdivisionsWidth*subdivisionsDepth*2,'Uint16Array');for(var z=0;z<subdivis
ionsDepth;z++){for(var x=0;x<subdivisionsWidth;x++){indices.push([(z+0)*numVerts
Across+x,(z+1)*numVertsAcross+x,(z+0)*numVertsAcross+x+1]);indices.push([(z+1)*n
umVertsAcross+x,(z+1)*numVertsAcross+x+1,(z+0)*numVertsAcross+x+1]);}} | |
195 return{position:positions,normal:normals,texCoord:texCoords,indices:indices};};t
dl.primitives.CUBE_FACE_INDICES_=[[3,7,5,1],[6,2,0,4],[6,7,3,2],[0,1,5,4],[7,6,4
,5],[2,3,1,0],];tdl.primitives.createCube=function(size){var k=size/2;var corner
Vertices=[[-k,-k,-k],[+k,-k,-k],[-k,+k,-k],[+k,+k,-k],[-k,-k,+k],[+k,-k,+k],[-k,
+k,+k],[+k,+k,+k]];var faceNormals=[[+1,+0,+0],[-1,+0,+0],[+0,+1,+0],[+0,-1,+0],
[+0,+0,+1],[+0,+0,-1]];var uvCoords=[[1,0],[0,0],[0,1],[1,1]];var numVertices=6*
4;var positions=new tdl.primitives.AttribBuffer(3,numVertices);var normals=new t
dl.primitives.AttribBuffer(3,numVertices);var texCoords=new tdl.primitives.Attri
bBuffer(2,numVertices);var indices=new tdl.primitives.AttribBuffer(3,6*2,'Uint16
Array');for(var f=0;f<6;++f){var faceIndices=tdl.primitives.CUBE_FACE_INDICES_[f
];for(var v=0;v<4;++v){var position=cornerVertices[faceIndices[v]];var normal=fa
ceNormals[f];var uv=uvCoords[v];positions.push(position);normals.push(normal);te
xCoords.push(uv);} | |
196 var offset=4*f;indices.push([offset+0,offset+1,offset+2]);indices.push([offset+0
,offset+2,offset+3]);} | |
197 return{position:positions,normal:normals,texCoord:texCoords,indices:indices};};t
dl.provide('tdl.programs');tdl.require('tdl.log');tdl.require('tdl.string');tdl.
programs=tdl.programs||{};tdl.programs.programDB={};tdl.programs.shaderDB={};tdl
.programs.loadProgramFromScriptTags=function(vertexShaderId,fragmentShaderId){va
r vertElem=document.getElementById(vertexShaderId);var fragElem=document.getElem
entById(fragmentShaderId);if(!vertElem){throw("Can't find vertex program tag: "+
vertexShaderId);} | |
198 if(!fragElem){throw("Can't find fragment program tag: "+fragmentShaderId);} | |
199 return tdl.programs.loadProgram(document.getElementById(vertexShaderId).text,doc
ument.getElementById(fragmentShaderId).text);};tdl.programs.loadProgram=function
(vertexShader,fragmentShader){var id=vertexShader+fragmentShader;var program=tdl
.programs.programDB[id];if(program){return program;} | |
200 try{program=new tdl.programs.Program(vertexShader,fragmentShader);}catch(e){tdl.
error(e);return null;} | |
201 tdl.programs.programDB[id]=program;return program;};tdl.programs.Program=functio
n(vertexShader,fragmentShader){var loadShader=function(gl,shaderSource,shaderTyp
e){var id=shaderSource+shaderType;var shader=gl.createShader(shaderType);if(shad
er==null){throw("*** Error: unable to create shader '"+shaderSource+"'");} | |
202 gl.shaderSource(shader,shaderSource);gl.compileShader(shader);var compiled=gl.ge
tShaderParameter(shader,gl.COMPILE_STATUS);if(!compiled){tdl.programs.lastError=
gl.getShaderInfoLog(shader);gl.deleteShader(shader);throw("*** Error compiling s
hader :"+tdl.programs.lastError);} | |
203 tdl.programs.shaderDB[id]=shader;return shader;} | |
204 var loadProgram=function(gl,vertexShader,fragmentShader){var vs;var fs;var progr
am;try{vs=loadShader(gl,vertexShader,gl.VERTEX_SHADER);fs=loadShader(gl,fragment
Shader,gl.FRAGMENT_SHADER);program=gl.createProgram();gl.attachShader(program,vs
);gl.attachShader(program,fs);linkProgram(gl,program);}catch(e){if(vs){gl.delete
Shader(vs)} | |
205 if(fs){gl.deleteShader(fs)} | |
206 if(program){gl.deleteShader(program)} | |
207 throw(e);} | |
208 return program;};var linkProgram=function(gl,program){gl.linkProgram(program);va
r linked=gl.getProgramParameter(program,gl.LINK_STATUS);if(!linked){tdl.programs
.lastError=gl.getProgramInfoLog(program);throw("*** Error in program linking:"+t
dl.programs.lastError);}};var program=loadProgram(gl,vertexShader,fragmentShader
);if(!program){throw("could not compile program");} | |
209 function flatten(array){var flat=[];for(var i=0,l=array.length;i<l;i++){var type
=Object.prototype.toString.call(array[i]).split(' ').pop().split(']').shift().to
LowerCase();if(type){flat=flat.concat(/^(array|collection|arguments|object)$/.te
st(type)?flatten(array[i]):array[i]);}} | |
210 return flat;} | |
211 var attribs={};var attribLocs={};function createAttribSetter(info,index){if(info
.size!=1){throw("arrays of attribs not handled");} | |
212 return function(b){gl.bindBuffer(gl.ARRAY_BUFFER,b.buffer());gl.enableVertexAttr
ibArray(index);gl.vertexAttribPointer(index,b.numComponents(),b.type(),b.normali
ze(),b.stride(),b.offset());};} | |
213 var numAttribs=gl.getProgramParameter(program,gl.ACTIVE_ATTRIBUTES);for(var ii=0
;ii<numAttribs;++ii){var info=gl.getActiveAttrib(program,ii);var name=info.name;
if(tdl.string.endsWith(name,"[0]")){name=name.substr(0,name.length-3);} | |
214 var index=gl.getAttribLocation(program,info.name);attribs[name]=createAttribSett
er(info,index);attribLocs[name]=index} | |
215 var numUniforms=gl.getProgramParameter(program,gl.ACTIVE_UNIFORMS);var uniforms=
{};var textureUnit=0;function createUniformSetter(info){var loc=gl.getUniformLoc
ation(program,info.name);var type=info.type;if(info.size>1&&tdl.string.endsWith(
info.name,"[0]")){if(type==gl.FLOAT) | |
216 return function(v){gl.uniform1fv(loc,v);};if(type==gl.FLOAT_VEC2) | |
217 return function(v){gl.uniform2fv(loc,v);};if(type==gl.FLOAT_VEC3) | |
218 return function(v){gl.uniform3fv(loc,v);};if(type==gl.FLOAT_VEC4) | |
219 return function(v){gl.uniform4fv(loc,v);};if(type==gl.INT) | |
220 return function(v){gl.uniform1iv(loc,v);};if(type==gl.INT_VEC2) | |
221 return function(v){gl.uniform2iv(loc,v);};if(type==gl.INT_VEC3) | |
222 return function(v){gl.uniform3iv(loc,v);};if(type==gl.INT_VEC4) | |
223 return function(v){gl.uniform4iv(loc,v);};if(type==gl.BOOL) | |
224 return function(v){gl.uniform1iv(loc,v);};if(type==gl.BOOL_VEC2) | |
225 return function(v){gl.uniform2iv(loc,v);};if(type==gl.BOOL_VEC3) | |
226 return function(v){gl.uniform3iv(loc,v);};if(type==gl.BOOL_VEC4) | |
227 return function(v){gl.uniform4iv(loc,v);};if(type==gl.FLOAT_MAT2) | |
228 return function(v){gl.uniformMatrix2fv(loc,false,v);};if(type==gl.FLOAT_MAT3) | |
229 return function(v){gl.uniformMatrix3fv(loc,false,v);};if(type==gl.FLOAT_MAT4) | |
230 return function(v){gl.uniformMatrix4fv(loc,false,v);};if(type==gl.SAMPLER_2D||ty
pe==gl.SAMPLER_CUBE){var units=[];for(var ii=0;ii<info.size;++ii){units.push(tex
tureUnit++);} | |
231 return function(units){return function(v){gl.uniform1iv(loc,units);v.bindToUnit(
units);};}(units);} | |
232 throw("unknown type: 0x"+type.toString(16));}else{if(type==gl.FLOAT) | |
233 return function(v){gl.uniform1f(loc,v);};if(type==gl.FLOAT_VEC2) | |
234 return function(v){gl.uniform2fv(loc,v);};if(type==gl.FLOAT_VEC3) | |
235 return function(v){gl.uniform3fv(loc,v);};if(type==gl.FLOAT_VEC4) | |
236 return function(v){gl.uniform4fv(loc,v);};if(type==gl.INT) | |
237 return function(v){gl.uniform1i(loc,v);};if(type==gl.INT_VEC2) | |
238 return function(v){gl.uniform2iv(loc,v);};if(type==gl.INT_VEC3) | |
239 return function(v){gl.uniform3iv(loc,v);};if(type==gl.INT_VEC4) | |
240 return function(v){gl.uniform4iv(loc,v);};if(type==gl.BOOL) | |
241 return function(v){gl.uniform1i(loc,v);};if(type==gl.BOOL_VEC2) | |
242 return function(v){gl.uniform2iv(loc,v);};if(type==gl.BOOL_VEC3) | |
243 return function(v){gl.uniform3iv(loc,v);};if(type==gl.BOOL_VEC4) | |
244 return function(v){gl.uniform4iv(loc,v);};if(type==gl.FLOAT_MAT2) | |
245 return function(v){gl.uniformMatrix2fv(loc,false,v);};if(type==gl.FLOAT_MAT3) | |
246 return function(v){gl.uniformMatrix3fv(loc,false,v);};if(type==gl.FLOAT_MAT4) | |
247 return function(v){gl.uniformMatrix4fv(loc,false,v);};if(type==gl.SAMPLER_2D||ty
pe==gl.SAMPLER_CUBE){return function(unit){return function(v){gl.uniform1i(loc,u
nit);v.bindToUnit(unit);};}(textureUnit++);} | |
248 throw("unknown type: 0x"+type.toString(16));}} | |
249 var textures={};for(var ii=0;ii<numUniforms;++ii){var info=gl.getActiveUniform(p
rogram,ii);name=info.name;if(tdl.string.endsWith(name,"[0]")){name=name.substr(0
,name.length-3);} | |
250 var setter=createUniformSetter(info);uniforms[name]=setter;if(info.type==gl.SAMP
LER_2D||info.type==gl.SAMPLER_CUBE){textures[name]=setter;}} | |
251 this.textures=textures;this.program=program;this.attrib=attribs;this.attribLoc=a
ttribLocs;this.uniform=uniforms;};tdl.programs.Program.prototype.use=function(){
gl.useProgram(this.program);};tdl.programs.Program.prototype.setUniform=function
(uniform,value){var func=this.uniform[uniform];if(func){func(value);}};tdl.provi
de('tdl.shader');tdl.shader=tdl.shader||{};tdl.shader.loadFromScriptNodes=functi
on(gl,vertexScriptName,fragmentScriptName){var vertexScript=document.getElementB
yId(vertexScriptName);var fragmentScript=document.getElementById(fragmentScriptN
ame);if(!vertexScript||!fragmentScript) | |
252 return null;return new tdl.shader.Shader(gl,vertexScript.text,fragmentScript.tex
t);} | |
253 tdl.shader.glslNameToJs_=function(name){return name.replace(/_(.)/g,function(_,p
1){return p1.toUpperCase();});} | |
254 tdl.shader.Shader=function(gl,vertex,fragment){this.program=gl.createProgram();t
his.gl=gl;var vs=this.loadShader(this.gl.VERTEX_SHADER,vertex);if(vs==null){retu
rn;} | |
255 this.gl.attachShader(this.program,vs);this.gl.deleteShader(vs);var fs=this.loadS
hader(this.gl.FRAGMENT_SHADER,fragment);if(fs==null){return;} | |
256 this.gl.attachShader(this.program,fs);this.gl.deleteShader(fs);this.gl.linkProgr
am(this.program);this.gl.useProgram(this.program);var linked=this.gl.getProgramP
arameter(this.program,this.gl.LINK_STATUS);if(!linked){var infoLog=this.gl.getPr
ogramInfoLog(this.program);tdl.error("Error linking program:\n"+infoLog);this.gl
.deleteProgram(this.program);this.program=null;return;} | |
257 var re=/(uniform|attribute)\s+\S+\s+(\S+)\s*;/g;var match=null;while((match=re.e
xec(vertex+'\n'+fragment))!=null){var glslName=match[2];var jsName=tdl.shader.gl
slNameToJs_(glslName);var loc=-1;if(match[1]=="uniform"){this[jsName+"Loc"]=this
.getUniform(glslName);}else if(match[1]=="attribute"){this[jsName+"Loc"]=this.ge
tAttribute(glslName);} | |
258 if(loc>=0){this[jsName+"Loc"]=loc;}}} | |
259 tdl.shader.Shader.prototype.bind=function(){this.gl.useProgram(this.program);} | |
260 tdl.shader.Shader.prototype.loadShader=function(type,shaderSrc){var shader=this.
gl.createShader(type);if(shader==null){return null;} | |
261 this.gl.shaderSource(shader,shaderSrc);this.gl.compileShader(shader);if(!this.gl
.getShaderParameter(shader,this.gl.COMPILE_STATUS)){var infoLog=this.gl.getShade
rInfoLog(shader);tdl.error("Error compiling shader:\n"+infoLog);this.gl.deleteSh
ader(shader);return null;} | |
262 return shader;} | |
263 tdl.shader.Shader.prototype.getAttribute=function(name){return this.gl.getAttrib
Location(this.program,name);};tdl.shader.Shader.prototype.getUniform=function(na
me){return this.gl.getUniformLocation(this.program,name);} | |
264 tdl.provide('tdl.textures');tdl.textures=tdl.textures||{};tdl.textures.textureDB
={};tdl.textures.loadTexture=function(arg,opt_flipY,opt_callback){var texture=td
l.textures.textureDB[arg.toString()];if(texture){return texture;} | |
265 if(typeof arg=='string'){texture=new tdl.textures.Texture2D(arg,opt_flipY,opt_ca
llback);}else if(arg.length==4&&typeof arg[0]=='number'){texture=new tdl.texture
s.SolidTexture(arg);}else if((arg.length==1||arg.length==6)&&typeof arg[0]=='str
ing'){texture=new tdl.textures.CubeMap(arg);}else if(arg.tagName=='CANVAS'||arg.
tagName=='IMG'){texture=new tdl.textures.Texture2D(arg,opt_flipY);}else if(arg.w
idth){texture=new tdl.textures.ColorTexture2D(arg);}else{throw"bad args";} | |
266 tdl.textures.textureDB[arg.toString()]=texture;return texture;};tdl.textures.Tex
ture=function(target){this.target=target;this.texture=gl.createTexture();this.pa
rams={};};tdl.textures.Texture.prototype.setParameter=function(pname,value){this
.params[pname]=value;gl.bindTexture(this.target,this.texture);gl.texParameteri(t
his.target,pname,value);};tdl.textures.Texture.prototype.recoverFromLostContext=
function(){this.texture=gl.createTexture();gl.bindTexture(this.target,this.textu
re);for(var pname in this.params){gl.texParameteri(this.target,pname,this.params
[pname]);}};tdl.textures.SolidTexture=function(color){tdl.textures.Texture.call(
this,gl.TEXTURE_2D);this.color=color.slice(0,4);this.uploadTexture();};tdl.base.
inherit(tdl.textures.SolidTexture,tdl.textures.Texture);tdl.textures.SolidTextur
e.prototype.uploadTexture=function(){gl.bindTexture(gl.TEXTURE_2D,this.texture);
var pixel=new Uint8Array(this.color);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,1,1,0
,gl.RGBA,gl.UNSIGNED_BYTE,pixel);};tdl.textures.SolidTexture.prototype.recoverFr
omLostContext=function(){tdl.textures.Texture.recoverFromLostContext.call(this);
this.uploadTexture();};tdl.textures.SolidTexture.prototype.bindToUnit=function(u
nit){gl.activeTexture(gl.TEXTURE0+unit);gl.bindTexture(gl.TEXTURE_2D,this.textur
e);};tdl.textures.ColorTexture=function(data,opt_format,opt_type){tdl.textures.T
exture.call(this,gl.TEXTURE_2D);this.format=opt_format||gl.RGBA;this.type=opt_ty
pe||gl.UNSIGNED_BYTE;if(data.pixels instanceof Array){data.pixels=new Uint8Array
(data.pixels);} | |
267 this.data=data;this.uploadTexture();};tdl.base.inherit(tdl.textures.ColorTexture
,tdl.textures.Texture);tdl.textures.ColorTexture.prototype.uploadTexture=functio
n(){gl.bindTexture(gl.TEXTURE_2D,this.texture);gl.pixelStorei(gl.UNPACK_FLIP_Y_W
EBGL,false);gl.texImage2D(gl.TEXTURE_2D,0,this.format,this.data.width,this.data.
height,0,this.format,this.type,this.data.pixels);};tdl.textures.ColorTexture.pro
totype.recoverFromLostContext=function(){tdl.textures.Texture.recoverFromLostCon
text.call(this);this.uploadTexture();};tdl.textures.ColorTexture.prototype.bindT
oUnit=function(unit){gl.activeTexture(gl.TEXTURE0+unit);gl.bindTexture(gl.TEXTUR
E_2D,this.texture);};tdl.textures.Texture2D=function(url,opt_flipY,opt_callback)
{tdl.textures.Texture.call(this,gl.TEXTURE_2D);this.flipY=opt_flipY||false;var t
hat=this;var img | |
268 if(typeof url!=='string'){img=url;this.loaded=true;if(opt_callback){opt_callback
();}}else{img=document.createElement('img');img.onload=function(){that.updateTex
ture();if(opt_callback){opt_callback();}};img.onerror=function(){tdl.log("could
not load image: ",url);};} | |
269 this.img=img;this.uploadTexture();if(!this.loaded){img.src=url;}};tdl.base.inher
it(tdl.textures.Texture2D,tdl.textures.Texture);tdl.textures.isPowerOf2=function
(value){return(value&(value-1))==0;};tdl.textures.Texture2D.prototype.uploadText
ure=function(){gl.bindTexture(gl.TEXTURE_2D,this.texture);gl.texParameteri(gl.TE
XTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR_MIPMAP_LINEAR);gl.texParameteri(gl.TEXT
URE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);if(this.loaded){gl.pixelStorei(gl.UNPACK
_FLIP_Y_WEBGL,this.flipY);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIG
NED_BYTE,this.img);if(tdl.textures.isPowerOf2(this.img.width)&&tdl.textures.isPo
werOf2(this.img.height)){gl.generateMipmap(gl.TEXTURE_2D);}else{this.setParamete
r(gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);this.setParameter(gl.TEXTURE_WRAP_T,gl.CLA
MP_TO_EDGE);this.setParameter(gl.TEXTURE_MIN_FILTER,gl.LINEAR);}}else{var pixel=
new Uint8Array([255,255,255,255]);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,1,1,0,gl
.RGBA,gl.UNSIGNED_BYTE,pixel);}};tdl.textures.Texture2D.prototype.updateTexture=
function(){this.loaded=true;this.uploadTexture();};tdl.textures.Texture2D.protot
ype.recoverFromLostContext=function(){tdl.textures.Texture.recoverFromLostContex
t.call(this);this.uploadTexture();};tdl.textures.Texture2D.prototype.bindToUnit=
function(unit){gl.activeTexture(gl.TEXTURE0+unit);gl.bindTexture(gl.TEXTURE_2D,t
his.texture);};tdl.textures.ExternalTexture=function(type){tdl.textures.Texture.
call(this,type);this.type=type;};tdl.base.inherit(tdl.textures.ExternalTexture,t
dl.textures.Texture);tdl.textures.ExternalTexture.prototype.recoverFromLostConte
xt=function(){};tdl.textures.ExternalTexture.prototype.bindToUnit=function(unit)
{gl.activeTexture(gl.TEXTURE0+unit);gl.bindTexture(this.type,this.texture);} | |
270 tdl.textures.ExternalTexture2D=function(){tdl.textures.ExternalTexture.call(this
,gl.TEXTURE_2D);};tdl.base.inherit(tdl.textures.ExternalTexture2D,tdl.textures.E
xternalTexture);tdl.textures.CubeMap=function(urls){tdl.textures.Texture.call(th
is,gl.TEXTURE_CUBE_MAP);if(!tdl.textures.CubeMap.faceTargets){tdl.textures.CubeM
ap.faceTargets=[gl.TEXTURE_CUBE_MAP_POSITIVE_X,gl.TEXTURE_CUBE_MAP_NEGATIVE_X,gl
.TEXTURE_CUBE_MAP_POSITIVE_Y,gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,gl.TEXTURE_CUBE_MAP_
POSITIVE_Z,gl.TEXTURE_CUBE_MAP_NEGATIVE_Z];tdl.textures.CubeMap.offsets=[[0,1],[
2,1],[1,0],[1,2],[1,1],[3,1]];} | |
271 var faceTargets=tdl.textures.CubeMap.faceTargets;gl.bindTexture(gl.TEXTURE_CUBE_
MAP,this.texture);this.setParameter(gl.TEXTURE_MAG_FILTER,gl.LINEAR);this.setPar
ameter(gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);this.setParameter(gl.TEXTURE_WRAP_T,g
l.CLAMP_TO_EDGE);this.faces=[];if(!urls.length){this.numUrls=0;this.size=urls;}e
lse{this.numUrls=urls.length;var that=this;for(var ff=0;ff<urls.length;++ff){var
face={};this.faces[ff]=face;var img=document.createElement('img');face.img=img;
img.onload=function(faceIndex){return function(){that.updateTexture(faceIndex);}
}(ff);img.onerror=function(url){return function(){tdl.log("could not load image:
",url);}}(urls[ff]);img.src=urls[ff];}} | |
272 this.uploadTextures();};tdl.base.inherit(tdl.textures.CubeMap,tdl.textures.Textu
re);tdl.textures.CubeMap.prototype.loaded=function(){for(var ff=0;ff<this.faces.
length;++ff){if(!this.faces[ff].loaded){return false;}} | |
273 return true;};tdl.textures.CubeMap.prototype.uploadTextures=function(){var allFa
cesLoaded=this.loaded();var faceTargets=tdl.textures.CubeMap.faceTargets;for(var
faceIndex=0;faceIndex<6;++faceIndex){var uploaded=false;var target=faceTargets[
faceIndex];if(this.faces.length){var face=this.faces[Math.min(this.faces.length-
1,faceIndex)];gl.bindTexture(gl.TEXTURE_CUBE_MAP,this.texture);if(allFacesLoaded
){gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,false);if(this.faces.length==6){gl.texIm
age2D(target,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,face.img);}else{var canvas=docum
ent.createElement('canvas');var width=face.img.width/4;var height=face.img.heigh
t/3;canvas.width=width;canvas.height=height;var ctx=canvas.getContext("2d");var
sx=tdl.textures.CubeMap.offsets[faceIndex][0]*width;var sy=tdl.textures.CubeMap.
offsets[faceIndex][1]*height;ctx.drawImage(face.img,sx,sy,width,height,0,0,width
,height);gl.texImage2D(target,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,canvas);} | |
274 uploaded=true;}} | |
275 if(!uploaded){var pixel=new Uint8Array([100,100,255,255]);gl.texImage2D(target,0
,gl.RGBA,1,1,0,gl.RGBA,gl.UNSIGNED_BYTE,pixel);}} | |
276 var genMips=false;if(this.faces.length){var faceImg=this.faces[0].img;if(this.fa
ces.length==6){genMips=tdl.textures.isPowerOf2(faceImg.width)&&tdl.textures.isPo
werOf2(faceImg.height);}else{genMips=tdl.textures.isPowerOf2(faceImg.width/4)&&t
dl.textures.isPowerOf2(faceImg.height/3);}} | |
277 if(genMips){gl.generateMipmap(gl.TEXTURE_CUBE_MAP);this.setParameter(gl.TEXTURE_
MIN_FILTER,gl.LINEAR_MIPMAP_LINEAR);}else{this.setParameter(gl.TEXTURE_MIN_FILTE
R,gl.LINEAR);}};tdl.textures.CubeMap.prototype.recoverFromLostContext=function()
{tdl.textures.Texture.recoverFromLostContext.call(this);this.uploadTextures();};
tdl.textures.CubeMap.prototype.updateTexture=function(faceIndex){var face=this.f
aces[faceIndex];face.loaded=true;var loaded=this.loaded();if(loaded){this.upload
Textures();}};tdl.textures.CubeMap.prototype.bindToUnit=function(unit){gl.active
Texture(gl.TEXTURE0+unit);gl.bindTexture(gl.TEXTURE_CUBE_MAP,this.texture);};tdl
.provide('tdl.webgl');tdl.require('tdl.log');tdl.require('tdl.misc');tdl.webgl=t
dl.webgl||{};tdl.webgl.makeFailHTML=function(msg){return''+'<table style="backgr
ound-color: #8CE; width: 100%; height: 100%;"><tr>'+'<td align="center">'+'<div
style="display: table-cell; vertical-align: middle;">'+'<div style="">'+msg+'</d
iv>'+'</div>'+'</td></tr></table>';};tdl.webgl.GET_A_WEBGL_BROWSER=''+'This page
requires a browser that supports WebGL.<br/>'+'<a href="http://get.webgl.org">C
lick here to upgrade your browser.</a>';tdl.webgl.OTHER_PROBLEM=''+"It does not
appear your computer supports WebGL.<br/>"+'<a href="http://get.webgl.org/troubl
eshooting/">Click here for more information.</a>';tdl.webgl.setupWebGL=function(
canvas,opt_attribs,opt_onError){function handleCreationError(msg){var container=
canvas.parentNode;if(container){var str=window.WebGLRenderingContext?tdl.webgl.O
THER_PROBLEM:tdl.webgl.GET_A_WEBGL_BROWSER;if(msg){str+="<br/><br/>Status: "+msg
;} | |
278 container.innerHTML=tdl.webgl.makeFailHTML(str);}};opt_onError=opt_onError||hand
leCreationError;if(canvas.addEventListener){canvas.addEventListener("webglcontex
tcreationerror",function(event){opt_onError(event.statusMessage);},false);} | |
279 var context=tdl.webgl.create3DContext(canvas,opt_attribs);if(!context){if(!windo
w.WebGLRenderingContext){opt_onError("");}} | |
280 return context;};tdl.webgl.create3DContext=function(canvas,opt_attribs){if(opt_a
ttribs===undefined){opt_attribs={};tdl.misc.applyUrlSettings(opt_attribs,'webgl'
);} | |
281 var names=["webgl","experimental-webgl","webkit-3d","moz-webgl"];var context=nul
l;for(var ii=0;ii<names.length;++ii){try{context=canvas.getContext(names[ii],opt
_attribs);}catch(e){} | |
282 if(context){break;}} | |
283 if(context){if(!tdl.webgl.glEnums){tdl.webgl.init(context);} | |
284 function returnFalse(){return false;} | |
285 canvas.onselectstart=returnFalse;canvas.onmousedown=returnFalse;} | |
286 return context;} | |
287 tdl.webgl.glValidEnumContexts={'enable':{0:true},'disable':{0:true},'getParamete
r':{0:true},'drawArrays':{0:true},'drawElements':{0:true,2:true},'createShader':
{0:true},'getShaderParameter':{1:true},'getProgramParameter':{1:true},'getVertex
Attrib':{1:true},'vertexAttribPointer':{2:true},'bindTexture':{0:true},'activeTe
xture':{0:true},'getTexParameter':{0:true,1:true},'texParameterf':{0:true,1:true
},'texParameteri':{0:true,1:true,2:true},'texImage2D':{0:true,2:true,6:true,7:tr
ue},'texSubImage2D':{0:true,6:true,7:true},'copyTexImage2D':{0:true,2:true},'cop
yTexSubImage2D':{0:true},'generateMipmap':{0:true},'bindBuffer':{0:true},'buffer
Data':{0:true,2:true},'bufferSubData':{0:true},'getBufferParameter':{0:true,1:tr
ue},'pixelStorei':{0:true,1:true},'readPixels':{4:true,5:true},'bindRenderbuffer
':{0:true},'bindFramebuffer':{0:true},'checkFramebufferStatus':{0:true},'framebu
fferRenderbuffer':{0:true,1:true,2:true},'framebufferTexture2D':{0:true,1:true,2
:true},'getFramebufferAttachmentParameter':{0:true,1:true,2:true},'getRenderbuff
erParameter':{0:true,1:true},'renderbufferStorage':{0:true,1:true},'clear':{0:tr
ue},'depthFunc':{0:true},'blendFunc':{0:true,1:true},'blendFuncSeparate':{0:true
,1:true,2:true,3:true},'blendEquation':{0:true},'blendEquationSeparate':{0:true,
1:true},'stencilFunc':{0:true},'stencilFuncSeparate':{0:true,1:true},'stencilMas
kSeparate':{0:true},'stencilOp':{0:true,1:true,2:true},'stencilOpSeparate':{0:tr
ue,1:true,2:true,3:true},'cullFace':{0:true},'frontFace':{0:true}};tdl.webgl.glE
nums=null;tdl.webgl.init=function(ctx){if(tdl.webgl.glEnums==null){tdl.webgl.glE
nums={};for(var propertyName in ctx){if(typeof ctx[propertyName]=='number'){tdl.
webgl.glEnums[ctx[propertyName]]=propertyName;}}}};tdl.webgl.checkInit=function(
){if(tdl.webgl.glEnums==null){throw'tdl.webgl.init(ctx) not called';}};tdl.webgl
.mightBeEnum=function(value){tdl.webgl.checkInit();return(tdl.webgl.glEnums[valu
e]!==undefined);} | |
288 tdl.webgl.glEnumToString=function(value){tdl.webgl.checkInit();if(value===undefi
ned){return"undefined";} | |
289 var name=tdl.webgl.glEnums[value];return(name!==undefined)?name:("*UNKNOWN WebGL
ENUM (0x"+value.toString(16)+")");};tdl.webgl.glFunctionArgToString=function(fu
nctionName,argumentIndex,value){var funcInfo=tdl.webgl.glValidEnumContexts[funct
ionName];if(funcInfo!==undefined){if(funcInfo[argumentIndex]){return tdl.webgl.g
lEnumToString(value);}} | |
290 if(value===null){return"null";}else if(value===undefined){return"undefined";}els
e{return value.toString();}};tdl.webgl.glFunctionArgsToString=function(functionN
ame,args){var argStr="";for(var ii=0;ii<args.length;++ii){argStr+=((ii==0)?'':',
')+ | |
291 tdl.webgl.glFunctionArgToString(functionName,ii,args[ii]);} | |
292 return argStr;};tdl.webgl.makeDebugContext=function(ctx,opt_onErrorFunc,opt_onFu
nc){tdl.webgl.init(ctx);opt_onErrorFunc=opt_onErrorFunc||function(err,functionNa
me,args){tdl.error("WebGL error "+tdl.webgl.glEnumToString(err)+" in "+ | |
293 functionName+"("+tdl.webgl.glFunctionArgsToString(functionName,args)+")");};var
glErrorShadow={};function makeErrorWrapper(ctx,functionName){return function(){i
f(opt_onFunc){opt_onFunc(functionName,arguments);} | |
294 try{var result=ctx[functionName].apply(ctx,arguments);}catch(e){opt_onErrorFunc(
ctx.NO_ERROR,functionName,arguments);throw(e);} | |
295 var err=ctx.getError();if(err!=0){glErrorShadow[err]=true;opt_onErrorFunc(err,fu
nctionName,arguments);} | |
296 return result;};} | |
297 var wrapper={};for(var propertyName in ctx){if(typeof ctx[propertyName]=='functi
on'){wrapper[propertyName]=makeErrorWrapper(ctx,propertyName);}else{wrapper[prop
ertyName]=ctx[propertyName];}} | |
298 wrapper.getError=function(){for(var err in glErrorShadow){if(glErrorShadow[err])
{glErrorShadow[err]=false;return err;}} | |
299 return ctx.NO_ERROR;};return wrapper;};tdl.webgl.requestAnimationFrame=function(
callback,element){if(!tdl.webgl.requestAnimationFrameImpl_){tdl.webgl.requestAni
mationFrameImpl_=function(){var functionNames=["requestAnimationFrame","webkitRe
questAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequ
estAnimationFrame"];for(var jj=0;jj<functionNames.length;++jj){var functionName=
functionNames[jj];if(window[functionName]){tdl.log("using ",functionName);return
function(name){return function(callback,element){window[name].call(window,callb
ack,element);};}(functionName);}} | |
300 tdl.log("using window.setTimeout");return function(callback,element){window.setT
imeout(callback,1000/70);};}();} | |
301 tdl.webgl.requestAnimationFrameImpl_(callback,element);}; | |
OLD | NEW |