root / trunk / web / dojo / dojox / gfx3d / lighting.js @ 10
History | View | Annotate | Download (6.51 KB)
| 1 | 9 | andrej.cim | /*
|
|---|---|---|---|
| 2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
| 3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
| 4 | see: http://dojotoolkit.org/license for details
|
||
| 5 | */
|
||
| 6 | |||
| 7 | |||
| 8 | if(!dojo._hasResource["dojox.gfx3d.lighting"]){ |
||
| 9 | dojo._hasResource["dojox.gfx3d.lighting"]=true; |
||
| 10 | dojo.provide("dojox.gfx3d.lighting");
|
||
| 11 | dojo.require("dojox.gfx._base");
|
||
| 12 | (function(){
|
||
| 13 | var _1=dojox.gfx3d.lighting;
|
||
| 14 | dojo.mixin(dojox.gfx3d.lighting,{black:function(){
|
||
| 15 | return {r:0,g:0,b:0,a:1}; |
||
| 16 | },white:function(){ |
||
| 17 | return {r:1,g:1,b:1,a:1}; |
||
| 18 | },toStdColor:function(c){ |
||
| 19 | c=dojox.gfx.normalizeColor(c); |
||
| 20 | return {r:c.r/255,g:c.g/255,b:c.b/255,a:c.a}; |
||
| 21 | },fromStdColor:function(c){ |
||
| 22 | return new dojo.Color([Math.round(255*c.r),Math.round(255*c.g),Math.round(255*c.b),c.a]); |
||
| 23 | },scaleColor:function(s,c){ |
||
| 24 | return {r:s*c.r,g:s*c.g,b:s*c.b,a:s*c.a}; |
||
| 25 | },addColor:function(a,b){ |
||
| 26 | return {r:a.r+b.r,g:a.g+b.g,b:a.b+b.b,a:a.a+b.a}; |
||
| 27 | },multiplyColor:function(a,b){ |
||
| 28 | return {r:a.r*b.r,g:a.g*b.g,b:a.b*b.b,a:a.a*b.a}; |
||
| 29 | },saturateColor:function(c){ |
||
| 30 | return {r:c.r<0?0:c.r>1?1:c.r,g:c.g<0?0:c.g>1?1:c.g,b:c.b<0?0:c.b>1?1:c.b,a:c.a<0?0:c.a>1?1:c.a}; |
||
| 31 | },mixColor:function(c1,c2,s){ |
||
| 32 | return _1.addColor(_1.scaleColor(s,c1),_1.scaleColor(1-s,c2)); |
||
| 33 | },diff2Color:function(c1,c2){ |
||
| 34 | var r=c1.r-c2.r;
|
||
| 35 | var g=c1.g-c2.g;
|
||
| 36 | var b=c1.b-c2.b;
|
||
| 37 | var a=c1.a-c2.a;
|
||
| 38 | return r*r+g*g+b*b+a*a;
|
||
| 39 | },length2Color:function(c){ |
||
| 40 | return c.r*c.r+c.g*c.g+c.b*c.b+c.a*c.a;
|
||
| 41 | },dot:function(a,b){ |
||
| 42 | return a.x*b.x+a.y*b.y+a.z*b.z;
|
||
| 43 | },scale:function(s,v){ |
||
| 44 | return {x:s*v.x,y:s*v.y,z:s*v.z}; |
||
| 45 | },add:function(a,b){ |
||
| 46 | return {x:a.x+b.x,y:a.y+b.y,z:a.z+b.z}; |
||
| 47 | },saturate:function(v){ |
||
| 48 | return Math.min(Math.max(v,0),1); |
||
| 49 | },length:function(v){ |
||
| 50 | return Math.sqrt(dojox.gfx3d.lighting.dot(v,v));
|
||
| 51 | },normalize:function(v){ |
||
| 52 | return _1.scale(1/_1.length(v),v); |
||
| 53 | },faceforward:function(n,i){ |
||
| 54 | var p=dojox.gfx3d.lighting;
|
||
| 55 | var s=p.dot(i,n)<0?1:-1; |
||
| 56 | return p.scale(s,n);
|
||
| 57 | },reflect:function(i,n){ |
||
| 58 | var p=dojox.gfx3d.lighting;
|
||
| 59 | return p.add(i,p.scale(-2*p.dot(i,n),n)); |
||
| 60 | },diffuse:function(_2,_3){ |
||
| 61 | var c=_1.black();
|
||
| 62 | for(var i=0;i<_3.length;++i){ |
||
| 63 | var l=_3[i],d=_1.dot(_1.normalize(l.direction),_2);
|
||
| 64 | c=_1.addColor(c,_1.scaleColor(d,l.color)); |
||
| 65 | } |
||
| 66 | return _1.saturateColor(c);
|
||
| 67 | },specular:function(_4,v,_5,_6){ |
||
| 68 | var c=_1.black();
|
||
| 69 | for(var i=0;i<_6.length;++i){ |
||
| 70 | var l=_6[i],h=_1.normalize(_1.add(_1.normalize(l.direction),v)),s=Math.pow(Math.max(0,_1.dot(_4,h)),1/_5); |
||
| 71 | c=_1.addColor(c,_1.scaleColor(s,l.color)); |
||
| 72 | } |
||
| 73 | return _1.saturateColor(c);
|
||
| 74 | },phong:function(_7,v,_8,_9){ |
||
| 75 | _7=_1.normalize(_7); |
||
| 76 | var c=_1.black();
|
||
| 77 | for(var i=0;i<_9.length;++i){ |
||
| 78 | var l=_9[i],r=_1.reflect(_1.scale(-1,_1.normalize(v)),_7),s=Math.pow(Math.max(0,_1.dot(r,_1.normalize(l.direction))),_8); |
||
| 79 | c=_1.addColor(c,_1.scaleColor(s,l.color)); |
||
| 80 | } |
||
| 81 | return _1.saturateColor(c);
|
||
| 82 | }}); |
||
| 83 | dojo.declare("dojox.gfx3d.lighting.Model",null,{constructor:function(_a,_b,_c,_d){ |
||
| 84 | this.incident=_1.normalize(_a);
|
||
| 85 | this.lights=[];
|
||
| 86 | for(var i=0;i<_b.length;++i){ |
||
| 87 | var l=_b[i];
|
||
| 88 | this.lights.push({direction:_1.normalize(l.direction),color:_1.toStdColor(l.color)}); |
||
| 89 | } |
||
| 90 | this.ambient=_1.toStdColor(_c.color?_c.color:"white"); |
||
| 91 | this.ambient=_1.scaleColor(_c.intensity,this.ambient); |
||
| 92 | this.ambient=_1.scaleColor(this.ambient.a,this.ambient); |
||
| 93 | this.ambient.a=1; |
||
| 94 | this.specular=_1.toStdColor(_d?_d:"white"); |
||
| 95 | this.specular=_1.scaleColor(this.specular.a,this.specular); |
||
| 96 | this.specular.a=1; |
||
| 97 | this.npr_cool={r:0,g:0,b:0.4,a:1}; |
||
| 98 | this.npr_warm={r:0.4,g:0.4,b:0.2,a:1}; |
||
| 99 | this.npr_alpha=0.2; |
||
| 100 | this.npr_beta=0.6; |
||
| 101 | this.npr_scale=0.6; |
||
| 102 | },constant:function(_e,_f,_10){ |
||
| 103 | _10=_1.toStdColor(_10); |
||
| 104 | var _11=_10.a,_12=_1.scaleColor(_11,_10);
|
||
| 105 | _12.a=_11; |
||
| 106 | return _1.fromStdColor(_1.saturateColor(_12));
|
||
| 107 | },matte:function(_13,_14,_15){ |
||
| 108 | if(typeof _14=="string"){ |
||
| 109 | _14=_1.finish[_14]; |
||
| 110 | } |
||
| 111 | _15=_1.toStdColor(_15); |
||
| 112 | _13=_1.faceforward(_1.normalize(_13),this.incident);
|
||
| 113 | var _16=_1.scaleColor(_14.Ka,this.ambient),_17=_1.saturate(-4*_1.dot(_13,this.incident)),_18=_1.scaleColor(_17*_14.Kd,_1.diffuse(_13,this.lights)),_19=_1.scaleColor(_15.a,_1.multiplyColor(_15,_1.addColor(_16,_18))); |
||
| 114 | _19.a=_15.a; |
||
| 115 | return _1.fromStdColor(_1.saturateColor(_19));
|
||
| 116 | },metal:function(_1a,_1b,_1c){ |
||
| 117 | if(typeof _1b=="string"){ |
||
| 118 | _1b=_1.finish[_1b]; |
||
| 119 | } |
||
| 120 | _1c=_1.toStdColor(_1c); |
||
| 121 | _1a=_1.faceforward(_1.normalize(_1a),this.incident);
|
||
| 122 | var v=_1.scale(-1,this.incident),_1d,_1e,_1f=_1.scaleColor(_1b.Ka,this.ambient),_20=_1.saturate(-4*_1.dot(_1a,this.incident)); |
||
| 123 | if("phong" in _1b){ |
||
| 124 | _1d=_1.scaleColor(_20*_1b.Ks*_1b.phong,_1.phong(_1a,v,_1b.phong_size,this.lights));
|
||
| 125 | }else{
|
||
| 126 | _1d=_1.scaleColor(_20*_1b.Ks,_1.specular(_1a,v,_1b.roughness,this.lights));
|
||
| 127 | } |
||
| 128 | _1e=_1.scaleColor(_1c.a,_1.addColor(_1.multiplyColor(_1c,_1f),_1.multiplyColor(this.specular,_1d)));
|
||
| 129 | _1e.a=_1c.a; |
||
| 130 | return _1.fromStdColor(_1.saturateColor(_1e));
|
||
| 131 | },plastic:function(_21,_22,_23){ |
||
| 132 | if(typeof _22=="string"){ |
||
| 133 | _22=_1.finish[_22]; |
||
| 134 | } |
||
| 135 | _23=_1.toStdColor(_23); |
||
| 136 | _21=_1.faceforward(_1.normalize(_21),this.incident);
|
||
| 137 | var v=_1.scale(-1,this.incident),_24,_25,_26=_1.scaleColor(_22.Ka,this.ambient),_27=_1.saturate(-4*_1.dot(_21,this.incident)),_28=_1.scaleColor(_27*_22.Kd,_1.diffuse(_21,this.lights)); |
||
| 138 | if("phong" in _22){ |
||
| 139 | _24=_1.scaleColor(_27*_22.Ks*_22.phong,_1.phong(_21,v,_22.phong_size,this.lights));
|
||
| 140 | }else{
|
||
| 141 | _24=_1.scaleColor(_27*_22.Ks,_1.specular(_21,v,_22.roughness,this.lights));
|
||
| 142 | } |
||
| 143 | _25=_1.scaleColor(_23.a,_1.addColor(_1.multiplyColor(_23,_1.addColor(_26,_28)),_1.multiplyColor(this.specular,_24)));
|
||
| 144 | _25.a=_23.a; |
||
| 145 | return _1.fromStdColor(_1.saturateColor(_25));
|
||
| 146 | },npr:function(_29,_2a,_2b){ |
||
| 147 | if(typeof _2a=="string"){ |
||
| 148 | _2a=_1.finish[_2a]; |
||
| 149 | } |
||
| 150 | _2b=_1.toStdColor(_2b); |
||
| 151 | _29=_1.faceforward(_1.normalize(_29),this.incident);
|
||
| 152 | var _2c=_1.scaleColor(_2a.Ka,this.ambient),_2d=_1.saturate(-4*_1.dot(_29,this.incident)),_2e=_1.scaleColor(_2d*_2a.Kd,_1.diffuse(_29,this.lights)),_2f=_1.scaleColor(_2b.a,_1.multiplyColor(_2b,_1.addColor(_2c,_2e))),_30=_1.addColor(this.npr_cool,_1.scaleColor(this.npr_alpha,_2f)),_31=_1.addColor(this.npr_warm,_1.scaleColor(this.npr_beta,_2f)),d=(1+_1.dot(this.incident,_29))/2,_2f=_1.scaleColor(this.npr_scale,_1.addColor(_2f,_1.mixColor(_30,_31,d))); |
||
| 153 | _2f.a=_2b.a; |
||
| 154 | return _1.fromStdColor(_1.saturateColor(_2f));
|
||
| 155 | }}); |
||
| 156 | })(); |
||
| 157 | dojox.gfx3d.lighting.finish={defaults:{Ka:0.1,Kd:0.6,Ks:0,roughness:0.05},dull:{Ka:0.1,Kd:0.6,Ks:0.5,roughness:0.15},shiny:{Ka:0.1,Kd:0.6,Ks:1,roughness:0.001},glossy:{Ka:0.1,Kd:0.6,Ks:1,roughness:0.0001},phong_dull:{Ka:0.1,Kd:0.6,Ks:0.5,phong:0.5,phong_size:1},phong_shiny:{Ka:0.1,Kd:0.6,Ks:1,phong:1,phong_size:200},phong_glossy:{Ka:0.1,Kd:0.6,Ks:1,phong:1,phong_size:300},luminous:{Ka:1,Kd:0,Ks:0,roughness:0.05},metalA:{Ka:0.35,Kd:0.3,Ks:0.8,roughness:1/20},metalB:{Ka:0.3,Kd:0.4,Ks:0.7,roughness:1/60},metalC:{Ka:0.25,Kd:0.5,Ks:0.8,roughness:1/80},metalD:{Ka:0.15,Kd:0.6,Ks:0.8,roughness:1/100},metalE:{Ka:0.1,Kd:0.7,Ks:0.8,roughness:1/120}};
|
||
| 158 | } |