root / trunk / web / dojo / dojox / gfx3d / object.js @ 12
History | View | Annotate | Download (18.3 KB)
| 1 |
/*
|
|---|---|
| 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.object"]){ |
| 9 |
dojo._hasResource["dojox.gfx3d.object"]=true; |
| 10 |
dojo.provide("dojox.gfx3d.object");
|
| 11 |
dojo.require("dojox.gfx");
|
| 12 |
dojo.require("dojox.gfx3d.lighting");
|
| 13 |
dojo.require("dojox.gfx3d.scheduler");
|
| 14 |
dojo.require("dojox.gfx3d.vector");
|
| 15 |
dojo.require("dojox.gfx3d.gradient");
|
| 16 |
var out=function(o,x){ |
| 17 |
if(arguments.length>1){ |
| 18 |
o=x; |
| 19 |
} |
| 20 |
var e={};
|
| 21 |
for(var i in o){ |
| 22 |
if(i in e){ |
| 23 |
continue;
|
| 24 |
} |
| 25 |
} |
| 26 |
}; |
| 27 |
dojo.declare("dojox.gfx3d.Object",null,{constructor:function(){ |
| 28 |
this.object=null; |
| 29 |
this.matrix=null; |
| 30 |
this.cache=null; |
| 31 |
this.renderer=null; |
| 32 |
this.parent=null; |
| 33 |
this.strokeStyle=null; |
| 34 |
this.fillStyle=null; |
| 35 |
this.shape=null; |
| 36 |
},setObject:function(_1){ |
| 37 |
this.object=dojox.gfx.makeParameters(this.object,_1); |
| 38 |
return this; |
| 39 |
},setTransform:function(_2){ |
| 40 |
this.matrix=dojox.gfx3d.matrix.clone(_2?dojox.gfx3d.matrix.normalize(_2):dojox.gfx3d.identity,true); |
| 41 |
return this; |
| 42 |
},applyRightTransform:function(_3){ |
| 43 |
return _3?this.setTransform([this.matrix,_3]):this; |
| 44 |
},applyLeftTransform:function(_4){ |
| 45 |
return _4?this.setTransform([_4,this.matrix]):this; |
| 46 |
},applyTransform:function(_5){ |
| 47 |
return _5?this.setTransform([this.matrix,_5]):this; |
| 48 |
},setFill:function(_6){ |
| 49 |
this.fillStyle=_6;
|
| 50 |
return this; |
| 51 |
},setStroke:function(_7){ |
| 52 |
this.strokeStyle=_7;
|
| 53 |
return this; |
| 54 |
},toStdFill:function(_8,_9){ |
| 55 |
return (this.fillStyle&&typeof this.fillStyle["type"]!="undefined")?_8[this.fillStyle.type](_9,this.fillStyle.finish,this.fillStyle.color):this.fillStyle; |
| 56 |
},invalidate:function(){ |
| 57 |
this.renderer.addTodo(this); |
| 58 |
},destroy:function(){ |
| 59 |
if(this.shape){ |
| 60 |
var p=this.shape.getParent(); |
| 61 |
if(p){
|
| 62 |
p.remove(this.shape);
|
| 63 |
} |
| 64 |
this.shape=null; |
| 65 |
} |
| 66 |
},render:function(_a){ |
| 67 |
throw "Pure virtual function, not implemented"; |
| 68 |
},draw:function(_b){ |
| 69 |
throw "Pure virtual function, not implemented"; |
| 70 |
},getZOrder:function(){ |
| 71 |
return 0; |
| 72 |
},getOutline:function(){ |
| 73 |
return null; |
| 74 |
}}); |
| 75 |
dojo.declare("dojox.gfx3d.Scene",dojox.gfx3d.Object,{constructor:function(){ |
| 76 |
this.objects=[];
|
| 77 |
this.todos=[];
|
| 78 |
this.schedule=dojox.gfx3d.scheduler.zOrder;
|
| 79 |
this._draw=dojox.gfx3d.drawer.conservative;
|
| 80 |
},setFill:function(_c){ |
| 81 |
this.fillStyle=_c;
|
| 82 |
dojo.forEach(this.objects,function(_d){ |
| 83 |
_d.setFill(_c); |
| 84 |
}); |
| 85 |
return this; |
| 86 |
},setStroke:function(_e){ |
| 87 |
this.strokeStyle=_e;
|
| 88 |
dojo.forEach(this.objects,function(_f){ |
| 89 |
_f.setStroke(_e); |
| 90 |
}); |
| 91 |
return this; |
| 92 |
},render:function(_10,_11){ |
| 93 |
var m=dojox.gfx3d.matrix.multiply(_10,this.matrix); |
| 94 |
if(_11){
|
| 95 |
this.todos=this.objects; |
| 96 |
} |
| 97 |
dojo.forEach(this.todos,function(_12){ |
| 98 |
_12.render(m,_11); |
| 99 |
}); |
| 100 |
},draw:function(_13){ |
| 101 |
this.objects=this.schedule(this.objects); |
| 102 |
this._draw(this.todos,this.objects,this.renderer); |
| 103 |
},addTodo:function(_14){ |
| 104 |
if(dojo.every(this.todos,function(_15){ |
| 105 |
return _15!=_14;
|
| 106 |
})){
|
| 107 |
this.todos.push(_14);
|
| 108 |
this.invalidate();
|
| 109 |
} |
| 110 |
},invalidate:function(){ |
| 111 |
this.parent.addTodo(this); |
| 112 |
},getZOrder:function(){ |
| 113 |
var _16=0; |
| 114 |
dojo.forEach(this.objects,function(_17){ |
| 115 |
_16+=_17.getZOrder(); |
| 116 |
}); |
| 117 |
return (this.objects.length>1)?_16/this.objects.length:0; |
| 118 |
}}); |
| 119 |
dojo.declare("dojox.gfx3d.Edges",dojox.gfx3d.Object,{constructor:function(){ |
| 120 |
this.object=dojo.clone(dojox.gfx3d.defaultEdges);
|
| 121 |
},setObject:function(_18,_19){ |
| 122 |
this.object=dojox.gfx.makeParameters(this.object,(_18 instanceof Array)?{points:_18,style:_19}:_18); |
| 123 |
return this; |
| 124 |
},getZOrder:function(){ |
| 125 |
var _1a=0; |
| 126 |
dojo.forEach(this.cache,function(_1b){ |
| 127 |
_1a+=_1b.z; |
| 128 |
}); |
| 129 |
return (this.cache.length>1)?_1a/this.cache.length:0; |
| 130 |
},render:function(_1c){ |
| 131 |
var m=dojox.gfx3d.matrix.multiply(_1c,this.matrix); |
| 132 |
this.cache=dojo.map(this.object.points,function(_1d){ |
| 133 |
return dojox.gfx3d.matrix.multiplyPoint(m,_1d);
|
| 134 |
}); |
| 135 |
},draw:function(){ |
| 136 |
var c=this.cache; |
| 137 |
if(this.shape){ |
| 138 |
this.shape.setShape(""); |
| 139 |
}else{
|
| 140 |
this.shape=this.renderer.createPath(); |
| 141 |
} |
| 142 |
var p=this.shape.setAbsoluteMode("absolute"); |
| 143 |
if(this.object.style=="strip"||this.object.style=="loop"){ |
| 144 |
p.moveTo(c[0].x,c[0].y); |
| 145 |
dojo.forEach(c.slice(1),function(_1e){ |
| 146 |
p.lineTo(_1e.x,_1e.y); |
| 147 |
}); |
| 148 |
if(this.object.style=="loop"){ |
| 149 |
p.closePath(); |
| 150 |
} |
| 151 |
}else{
|
| 152 |
for(var i=0;i<this.cache.length;){ |
| 153 |
p.moveTo(c[i].x,c[i].y); |
| 154 |
i++; |
| 155 |
p.lineTo(c[i].x,c[i].y); |
| 156 |
i++; |
| 157 |
} |
| 158 |
} |
| 159 |
p.setStroke(this.strokeStyle);
|
| 160 |
}}); |
| 161 |
dojo.declare("dojox.gfx3d.Orbit",dojox.gfx3d.Object,{constructor:function(){ |
| 162 |
this.object=dojo.clone(dojox.gfx3d.defaultOrbit);
|
| 163 |
},render:function(_1f){ |
| 164 |
var m=dojox.gfx3d.matrix.multiply(_1f,this.matrix); |
| 165 |
var _20=[0,Math.PI/4,Math.PI/3]; |
| 166 |
var _21=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center); |
| 167 |
var _22=dojo.map(_20,function(_23){ |
| 168 |
return {x:this.center.x+this.radius*Math.cos(_23),y:this.center.y+this.radius*Math.sin(_23),z:this.center.z}; |
| 169 |
},this.object);
|
| 170 |
_22=dojo.map(_22,function(_24){
|
| 171 |
return dojox.gfx3d.matrix.multiplyPoint(m,_24);
|
| 172 |
}); |
| 173 |
var _25=dojox.gfx3d.vector.normalize(_22);
|
| 174 |
_22=dojo.map(_22,function(_26){
|
| 175 |
return dojox.gfx3d.vector.substract(_26,_21);
|
| 176 |
}); |
| 177 |
var A={xx:_22[0].x*_22[0].y,xy:_22[0].y*_22[0].y,xz:1,yx:_22[1].x*_22[1].y,yy:_22[1].y*_22[1].y,yz:1,zx:_22[2].x*_22[2].y,zy:_22[2].y*_22[2].y,zz:1,dx:0,dy:0,dz:0}; |
| 178 |
var B=dojo.map(_22,function(_27){ |
| 179 |
return -Math.pow(_27.x,2); |
| 180 |
}); |
| 181 |
var X=dojox.gfx3d.matrix.multiplyPoint(dojox.gfx3d.matrix.invert(A),B[0],B[1],B[2]); |
| 182 |
var _28=Math.atan2(X.x,1-X.y)/2; |
| 183 |
var _29=dojo.map(_22,function(_2a){ |
| 184 |
return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_28),_2a.x,_2a.y);
|
| 185 |
}); |
| 186 |
var a=Math.pow(_29[0].x,2); |
| 187 |
var b=Math.pow(_29[0].y,2); |
| 188 |
var c=Math.pow(_29[1].x,2); |
| 189 |
var d=Math.pow(_29[1].y,2); |
| 190 |
var rx=Math.sqrt((a*d-b*c)/(d-b));
|
| 191 |
var ry=Math.sqrt((a*d-b*c)/(a-c));
|
| 192 |
this.cache={cx:_21.x,cy:_21.y,rx:rx,ry:ry,theta:_28,normal:_25}; |
| 193 |
},draw:function(_2b){ |
| 194 |
if(this.shape){ |
| 195 |
this.shape.setShape(this.cache); |
| 196 |
}else{
|
| 197 |
this.shape=this.renderer.createEllipse(this.cache); |
| 198 |
} |
| 199 |
this.shape.applyTransform(dojox.gfx.matrix.rotateAt(this.cache.theta,this.cache.cx,this.cache.cy)).setStroke(this.strokeStyle).setFill(this.toStdFill(_2b,this.cache.normal)); |
| 200 |
}}); |
| 201 |
dojo.declare("dojox.gfx3d.Path3d",dojox.gfx3d.Object,{constructor:function(){ |
| 202 |
this.object=dojo.clone(dojox.gfx3d.defaultPath3d);
|
| 203 |
this.segments=[];
|
| 204 |
this.absolute=true; |
| 205 |
this.last={};
|
| 206 |
this.path=""; |
| 207 |
},_collectArgs:function(_2c,_2d){ |
| 208 |
for(var i=0;i<_2d.length;++i){ |
| 209 |
var t=_2d[i];
|
| 210 |
if(typeof (t)=="boolean"){ |
| 211 |
_2c.push(t?1:0); |
| 212 |
}else{
|
| 213 |
if(typeof (t)=="number"){ |
| 214 |
_2c.push(t); |
| 215 |
}else{
|
| 216 |
if(t instanceof Array){ |
| 217 |
this._collectArgs(_2c,t);
|
| 218 |
}else{
|
| 219 |
if("x" in t&&"y" in t){ |
| 220 |
_2c.push(t.x); |
| 221 |
_2c.push(t.y); |
| 222 |
} |
| 223 |
} |
| 224 |
} |
| 225 |
} |
| 226 |
} |
| 227 |
},_validSegments:{m:3,l:3,z:0},_pushSegment:function(_2e,_2f){ |
| 228 |
var _30=this._validSegments[_2e.toLowerCase()],_31; |
| 229 |
if(typeof (_30)=="number"){ |
| 230 |
if(_30){
|
| 231 |
if(_2f.length>=_30){
|
| 232 |
_31={action:_2e,args:_2f.slice(0,_2f.length-_2f.length%_30)};
|
| 233 |
this.segments.push(_31);
|
| 234 |
} |
| 235 |
}else{
|
| 236 |
_31={action:_2e,args:[]};
|
| 237 |
this.segments.push(_31);
|
| 238 |
} |
| 239 |
} |
| 240 |
},moveTo:function(){ |
| 241 |
var _32=[];
|
| 242 |
this._collectArgs(_32,arguments); |
| 243 |
this._pushSegment(this.absolute?"M":"m",_32); |
| 244 |
return this; |
| 245 |
},lineTo:function(){ |
| 246 |
var _33=[];
|
| 247 |
this._collectArgs(_33,arguments); |
| 248 |
this._pushSegment(this.absolute?"L":"l",_33); |
| 249 |
return this; |
| 250 |
},closePath:function(){ |
| 251 |
this._pushSegment("Z",[]); |
| 252 |
return this; |
| 253 |
},render:function(_34){ |
| 254 |
var m=dojox.gfx3d.matrix.multiply(_34,this.matrix); |
| 255 |
var _35=""; |
| 256 |
var _36=this._validSegments; |
| 257 |
dojo.forEach(this.segments,function(_37){ |
| 258 |
_35+=_37.action; |
| 259 |
for(var i=0;i<_37.args.length;i+=_36[_37.action.toLowerCase()]){ |
| 260 |
var pt=dojox.gfx3d.matrix.multiplyPoint(m,_37.args[i],_37.args[i+1],_37.args[i+2]); |
| 261 |
_35+=" "+pt.x+" "+pt.y; |
| 262 |
} |
| 263 |
}); |
| 264 |
this.cache=_35;
|
| 265 |
},_draw:function(){ |
| 266 |
return this.parent.createPath(this.cache); |
| 267 |
}}); |
| 268 |
dojo.declare("dojox.gfx3d.Triangles",dojox.gfx3d.Object,{constructor:function(){ |
| 269 |
this.object=dojo.clone(dojox.gfx3d.defaultTriangles);
|
| 270 |
},setObject:function(_38,_39){ |
| 271 |
if(_38 instanceof Array){ |
| 272 |
this.object=dojox.gfx.makeParameters(this.object,{points:_38,style:_39}); |
| 273 |
}else{
|
| 274 |
this.object=dojox.gfx.makeParameters(this.object,_38); |
| 275 |
} |
| 276 |
return this; |
| 277 |
},render:function(_3a){ |
| 278 |
var m=dojox.gfx3d.matrix.multiply(_3a,this.matrix); |
| 279 |
var c=dojo.map(this.object.points,function(_3b){ |
| 280 |
return dojox.gfx3d.matrix.multiplyPoint(m,_3b);
|
| 281 |
}); |
| 282 |
this.cache=[];
|
| 283 |
var _3c=c.slice(0,2); |
| 284 |
var _3d=c[0]; |
| 285 |
if(this.object.style=="strip"){ |
| 286 |
dojo.forEach(c.slice(2),function(_3e){ |
| 287 |
_3c.push(_3e); |
| 288 |
_3c.push(_3c[0]);
|
| 289 |
this.cache.push(_3c);
|
| 290 |
_3c=_3c.slice(1,3); |
| 291 |
},this);
|
| 292 |
}else{
|
| 293 |
if(this.object.style=="fan"){ |
| 294 |
dojo.forEach(c.slice(2),function(_3f){ |
| 295 |
_3c.push(_3f); |
| 296 |
_3c.push(_3d); |
| 297 |
this.cache.push(_3c);
|
| 298 |
_3c=[_3d,_3f]; |
| 299 |
},this);
|
| 300 |
}else{
|
| 301 |
for(var i=0;i<c.length;){ |
| 302 |
this.cache.push([c[i],c[i+1],c[i+2],c[i]]); |
| 303 |
i+=3;
|
| 304 |
} |
| 305 |
} |
| 306 |
} |
| 307 |
},draw:function(_40){ |
| 308 |
this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){ |
| 309 |
return it;
|
| 310 |
}); |
| 311 |
if(this.shape){ |
| 312 |
this.shape.clear();
|
| 313 |
}else{
|
| 314 |
this.shape=this.renderer.createGroup(); |
| 315 |
} |
| 316 |
dojo.forEach(this.cache,function(_41){ |
| 317 |
this.shape.createPolyline(_41).setStroke(this.strokeStyle).setFill(this.toStdFill(_40,dojox.gfx3d.vector.normalize(_41))); |
| 318 |
},this);
|
| 319 |
},getZOrder:function(){ |
| 320 |
var _42=0; |
| 321 |
dojo.forEach(this.cache,function(_43){ |
| 322 |
_42+=(_43[0].z+_43[1].z+_43[2].z)/3; |
| 323 |
}); |
| 324 |
return (this.cache.length>1)?_42/this.cache.length:0; |
| 325 |
}}); |
| 326 |
dojo.declare("dojox.gfx3d.Quads",dojox.gfx3d.Object,{constructor:function(){ |
| 327 |
this.object=dojo.clone(dojox.gfx3d.defaultQuads);
|
| 328 |
},setObject:function(_44,_45){ |
| 329 |
this.object=dojox.gfx.makeParameters(this.object,(_44 instanceof Array)?{points:_44,style:_45}:_44); |
| 330 |
return this; |
| 331 |
},render:function(_46){ |
| 332 |
var m=dojox.gfx3d.matrix.multiply(_46,this.matrix),i; |
| 333 |
var c=dojo.map(this.object.points,function(_47){ |
| 334 |
return dojox.gfx3d.matrix.multiplyPoint(m,_47);
|
| 335 |
}); |
| 336 |
this.cache=[];
|
| 337 |
if(this.object.style=="strip"){ |
| 338 |
var _48=c.slice(0,2); |
| 339 |
for(i=2;i<c.length;){ |
| 340 |
_48=_48.concat([c[i],c[i+1],_48[0]]); |
| 341 |
this.cache.push(_48);
|
| 342 |
_48=_48.slice(2,4); |
| 343 |
i+=2;
|
| 344 |
} |
| 345 |
}else{
|
| 346 |
for(i=0;i<c.length;){ |
| 347 |
this.cache.push([c[i],c[i+1],c[i+2],c[i+3],c[i]]); |
| 348 |
i+=4;
|
| 349 |
} |
| 350 |
} |
| 351 |
},draw:function(_49){ |
| 352 |
this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){ |
| 353 |
return it;
|
| 354 |
}); |
| 355 |
if(this.shape){ |
| 356 |
this.shape.clear();
|
| 357 |
}else{
|
| 358 |
this.shape=this.renderer.createGroup(); |
| 359 |
} |
| 360 |
for(var x=0;x<this.cache.length;x++){ |
| 361 |
this.shape.createPolyline(this.cache[x]).setStroke(this.strokeStyle).setFill(this.toStdFill(_49,dojox.gfx3d.vector.normalize(this.cache[x]))); |
| 362 |
} |
| 363 |
},getZOrder:function(){ |
| 364 |
var _4a=0; |
| 365 |
for(var x=0;x<this.cache.length;x++){ |
| 366 |
var i=this.cache[x]; |
| 367 |
_4a+=(i[0].z+i[1].z+i[2].z+i[3].z)/4; |
| 368 |
} |
| 369 |
return (this.cache.length>1)?_4a/this.cache.length:0; |
| 370 |
}}); |
| 371 |
dojo.declare("dojox.gfx3d.Polygon",dojox.gfx3d.Object,{constructor:function(){ |
| 372 |
this.object=dojo.clone(dojox.gfx3d.defaultPolygon);
|
| 373 |
},setObject:function(_4b){ |
| 374 |
this.object=dojox.gfx.makeParameters(this.object,(_4b instanceof Array)?{path:_4b}:_4b); |
| 375 |
return this; |
| 376 |
},render:function(_4c){ |
| 377 |
var m=dojox.gfx3d.matrix.multiply(_4c,this.matrix); |
| 378 |
this.cache=dojo.map(this.object.path,function(_4d){ |
| 379 |
return dojox.gfx3d.matrix.multiplyPoint(m,_4d);
|
| 380 |
}); |
| 381 |
this.cache.push(this.cache[0]); |
| 382 |
},draw:function(_4e){ |
| 383 |
if(this.shape){ |
| 384 |
this.shape.setShape({points:this.cache}); |
| 385 |
}else{
|
| 386 |
this.shape=this.renderer.createPolyline({points:this.cache}); |
| 387 |
} |
| 388 |
this.shape.setStroke(this.strokeStyle).setFill(this.toStdFill(_4e,dojox.gfx3d.matrix.normalize(this.cache))); |
| 389 |
},getZOrder:function(){ |
| 390 |
var _4f=0; |
| 391 |
for(var x=0;x<this.cache.length;x++){ |
| 392 |
_4f+=this.cache[x].z;
|
| 393 |
} |
| 394 |
return (this.cache.length>1)?_4f/this.cache.length:0; |
| 395 |
},getOutline:function(){ |
| 396 |
return this.cache.slice(0,3); |
| 397 |
}}); |
| 398 |
dojo.declare("dojox.gfx3d.Cube",dojox.gfx3d.Object,{constructor:function(){ |
| 399 |
this.object=dojo.clone(dojox.gfx3d.defaultCube);
|
| 400 |
this.polygons=[];
|
| 401 |
},setObject:function(_50){ |
| 402 |
this.object=dojox.gfx.makeParameters(this.object,_50); |
| 403 |
},render:function(_51){ |
| 404 |
var a=this.object.top; |
| 405 |
var g=this.object.bottom; |
| 406 |
var b={x:g.x,y:a.y,z:a.z}; |
| 407 |
var c={x:g.x,y:g.y,z:a.z}; |
| 408 |
var d={x:a.x,y:g.y,z:a.z}; |
| 409 |
var e={x:a.x,y:a.y,z:g.z}; |
| 410 |
var f={x:g.x,y:a.y,z:g.z}; |
| 411 |
var h={x:a.x,y:g.y,z:g.z}; |
| 412 |
var _52=[a,b,c,d,e,f,g,h];
|
| 413 |
var m=dojox.gfx3d.matrix.multiply(_51,this.matrix); |
| 414 |
var p=dojo.map(_52,function(_53){ |
| 415 |
return dojox.gfx3d.matrix.multiplyPoint(m,_53);
|
| 416 |
}); |
| 417 |
a=p[0];
|
| 418 |
b=p[1];
|
| 419 |
c=p[2];
|
| 420 |
d=p[3];
|
| 421 |
e=p[4];
|
| 422 |
f=p[5];
|
| 423 |
g=p[6];
|
| 424 |
h=p[7];
|
| 425 |
this.cache=[[a,b,c,d,a],[e,f,g,h,e],[a,d,h,e,a],[d,c,g,h,d],[c,b,f,g,c],[b,a,e,f,b]];
|
| 426 |
},draw:function(_54){ |
| 427 |
this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){ |
| 428 |
return it;
|
| 429 |
}); |
| 430 |
var _55=this.cache.slice(3); |
| 431 |
if(this.shape){ |
| 432 |
this.shape.clear();
|
| 433 |
}else{
|
| 434 |
this.shape=this.renderer.createGroup(); |
| 435 |
} |
| 436 |
for(var x=0;x<_55.length;x++){ |
| 437 |
this.shape.createPolyline(_55[x]).setStroke(this.strokeStyle).setFill(this.toStdFill(_54,dojox.gfx3d.vector.normalize(_55[x]))); |
| 438 |
} |
| 439 |
},getZOrder:function(){ |
| 440 |
var top=this.cache[0][0]; |
| 441 |
var _56=this.cache[1][2]; |
| 442 |
return (top.z+_56.z)/2; |
| 443 |
}}); |
| 444 |
dojo.declare("dojox.gfx3d.Cylinder",dojox.gfx3d.Object,{constructor:function(){ |
| 445 |
this.object=dojo.clone(dojox.gfx3d.defaultCylinder);
|
| 446 |
},render:function(_57){ |
| 447 |
var m=dojox.gfx3d.matrix.multiply(_57,this.matrix); |
| 448 |
var _58=[0,Math.PI/4,Math.PI/3]; |
| 449 |
var _59=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center); |
| 450 |
var _5a=dojo.map(_58,function(_5b){ |
| 451 |
return {x:this.center.x+this.radius*Math.cos(_5b),y:this.center.y+this.radius*Math.sin(_5b),z:this.center.z}; |
| 452 |
},this.object);
|
| 453 |
_5a=dojo.map(_5a,function(_5c){
|
| 454 |
return dojox.gfx3d.vector.substract(dojox.gfx3d.matrix.multiplyPoint(m,_5c),_59);
|
| 455 |
}); |
| 456 |
var A={xx:_5a[0].x*_5a[0].y,xy:_5a[0].y*_5a[0].y,xz:1,yx:_5a[1].x*_5a[1].y,yy:_5a[1].y*_5a[1].y,yz:1,zx:_5a[2].x*_5a[2].y,zy:_5a[2].y*_5a[2].y,zz:1,dx:0,dy:0,dz:0}; |
| 457 |
var B=dojo.map(_5a,function(_5d){ |
| 458 |
return -Math.pow(_5d.x,2); |
| 459 |
}); |
| 460 |
var X=dojox.gfx3d.matrix.multiplyPoint(dojox.gfx3d.matrix.invert(A),B[0],B[1],B[2]); |
| 461 |
var _5e=Math.atan2(X.x,1-X.y)/2; |
| 462 |
var _5f=dojo.map(_5a,function(_60){ |
| 463 |
return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_5e),_60.x,_60.y);
|
| 464 |
}); |
| 465 |
var a=Math.pow(_5f[0].x,2); |
| 466 |
var b=Math.pow(_5f[0].y,2); |
| 467 |
var c=Math.pow(_5f[1].x,2); |
| 468 |
var d=Math.pow(_5f[1].y,2); |
| 469 |
var rx=Math.sqrt((a*d-b*c)/(d-b));
|
| 470 |
var ry=Math.sqrt((a*d-b*c)/(a-c));
|
| 471 |
if(rx<ry){
|
| 472 |
var t=rx;
|
| 473 |
rx=ry; |
| 474 |
ry=t; |
| 475 |
_5e-=Math.PI/2;
|
| 476 |
} |
| 477 |
var top=dojox.gfx3d.matrix.multiplyPoint(m,dojox.gfx3d.vector.sum(this.object.center,{x:0,y:0,z:this.object.height})); |
| 478 |
var _61=this.fillStyle.type=="constant"?this.fillStyle.color:dojox.gfx3d.gradient(this.renderer.lighting,this.fillStyle,this.object.center,this.object.radius,Math.PI,2*Math.PI,m); |
| 479 |
if(isNaN(rx)||isNaN(ry)||isNaN(_5e)){
|
| 480 |
rx=this.object.radius,ry=0,_5e=0; |
| 481 |
} |
| 482 |
this.cache={center:_59,top:top,rx:rx,ry:ry,theta:_5e,gradient:_61}; |
| 483 |
},draw:function(){ |
| 484 |
var c=this.cache,v=dojox.gfx3d.vector,m=dojox.gfx.matrix,_62=[c.center,c.top],_63=v.substract(c.top,c.center); |
| 485 |
if(v.dotProduct(_63,this.renderer.lighting.incident)>0){ |
| 486 |
_62=[c.top,c.center]; |
| 487 |
_63=v.substract(c.center,c.top); |
| 488 |
} |
| 489 |
var _64=this.renderer.lighting[this.fillStyle.type](_63,this.fillStyle.finish,this.fillStyle.color),d=Math.sqrt(Math.pow(c.center.x-c.top.x,2)+Math.pow(c.center.y-c.top.y,2)); |
| 490 |
if(this.shape){ |
| 491 |
this.shape.clear();
|
| 492 |
}else{
|
| 493 |
this.shape=this.renderer.createGroup(); |
| 494 |
} |
| 495 |
this.shape.createPath("").moveTo(0,-c.rx).lineTo(d,-c.rx).lineTo(d,c.rx).lineTo(0,c.rx).arcTo(c.ry,c.rx,0,true,true,0,-c.rx).setFill(c.gradient).setStroke(this.strokeStyle).setTransform([m.translate(_62[0]),m.rotate(Math.atan2(_62[1].y-_62[0].y,_62[1].x-_62[0].x))]); |
| 496 |
if(c.rx>0&&c.ry>0){ |
| 497 |
this.shape.createEllipse({cx:_62[1].x,cy:_62[1].y,rx:c.rx,ry:c.ry}).setFill(_64).setStroke(this.strokeStyle).applyTransform(m.rotateAt(c.theta,_62[1])); |
| 498 |
} |
| 499 |
}}); |
| 500 |
dojo.declare("dojox.gfx3d.Viewport",dojox.gfx.Group,{constructor:function(){ |
| 501 |
this.dimension=null; |
| 502 |
this.objects=[];
|
| 503 |
this.todos=[];
|
| 504 |
this.renderer=this; |
| 505 |
this.schedule=dojox.gfx3d.scheduler.zOrder;
|
| 506 |
this.draw=dojox.gfx3d.drawer.conservative;
|
| 507 |
this.deep=false; |
| 508 |
this.lights=[];
|
| 509 |
this.lighting=null; |
| 510 |
},setCameraTransform:function(_65){ |
| 511 |
this.camera=dojox.gfx3d.matrix.clone(_65?dojox.gfx3d.matrix.normalize(_65):dojox.gfx3d.identity,true); |
| 512 |
this.invalidate();
|
| 513 |
return this; |
| 514 |
},applyCameraRightTransform:function(_66){ |
| 515 |
return _66?this.setCameraTransform([this.camera,_66]):this; |
| 516 |
},applyCameraLeftTransform:function(_67){ |
| 517 |
return _67?this.setCameraTransform([_67,this.camera]):this; |
| 518 |
},applyCameraTransform:function(_68){ |
| 519 |
return this.applyCameraRightTransform(_68); |
| 520 |
},setLights:function(_69,_6a,_6b){ |
| 521 |
this.lights=(_69 instanceof Array)?{sources:_69,ambient:_6a,specular:_6b}:_69; |
| 522 |
var _6c={x:0,y:0,z:1}; |
| 523 |
this.lighting=new dojox.gfx3d.lighting.Model(_6c,this.lights.sources,this.lights.ambient,this.lights.specular); |
| 524 |
this.invalidate();
|
| 525 |
return this; |
| 526 |
},addLights:function(_6d){ |
| 527 |
return this.setLights(this.lights.sources.concat(_6d)); |
| 528 |
},addTodo:function(_6e){ |
| 529 |
if(dojo.every(this.todos,function(_6f){ |
| 530 |
return _6f!=_6e;
|
| 531 |
})){
|
| 532 |
this.todos.push(_6e);
|
| 533 |
} |
| 534 |
},invalidate:function(){ |
| 535 |
this.deep=true; |
| 536 |
this.todos=this.objects; |
| 537 |
},setDimensions:function(dim){ |
| 538 |
if(dim){
|
| 539 |
var w=dojo.isString(dim.width)?parseInt(dim.width):dim.width;
|
| 540 |
var h=dojo.isString(dim.height)?parseInt(dim.height):dim.height;
|
| 541 |
var trs=this.rawNode.style; |
| 542 |
trs.height=h; |
| 543 |
trs.width=w; |
| 544 |
this.dimension={width:w,height:h}; |
| 545 |
}else{
|
| 546 |
this.dimension=null; |
| 547 |
} |
| 548 |
},render:function(){ |
| 549 |
if(!this.todos.length){ |
| 550 |
return;
|
| 551 |
} |
| 552 |
var m=dojox.gfx3d.matrix;
|
| 553 |
for(var x=0;x<this.todos.length;x++){ |
| 554 |
this.todos[x].render(dojox.gfx3d.matrix.normalize([m.cameraRotateXg(180),m.cameraTranslate(0,this.dimension.height,0),this.camera]),this.deep); |
| 555 |
} |
| 556 |
this.objects=this.schedule(this.objects); |
| 557 |
this.draw(this.todos,this.objects,this); |
| 558 |
this.todos=[];
|
| 559 |
this.deep=false; |
| 560 |
}}); |
| 561 |
dojox.gfx3d.Viewport.nodeType=dojox.gfx.Group.nodeType; |
| 562 |
dojox.gfx3d._creators={createEdges:function(_70,_71){
|
| 563 |
return this.create3DObject(dojox.gfx3d.Edges,_70,_71); |
| 564 |
},createTriangles:function(_72,_73){ |
| 565 |
return this.create3DObject(dojox.gfx3d.Triangles,_72,_73); |
| 566 |
},createQuads:function(_74,_75){ |
| 567 |
return this.create3DObject(dojox.gfx3d.Quads,_74,_75); |
| 568 |
},createPolygon:function(_76){ |
| 569 |
return this.create3DObject(dojox.gfx3d.Polygon,_76); |
| 570 |
},createOrbit:function(_77){ |
| 571 |
return this.create3DObject(dojox.gfx3d.Orbit,_77); |
| 572 |
},createCube:function(_78){ |
| 573 |
return this.create3DObject(dojox.gfx3d.Cube,_78); |
| 574 |
},createCylinder:function(_79){ |
| 575 |
return this.create3DObject(dojox.gfx3d.Cylinder,_79); |
| 576 |
},createPath3d:function(_7a){ |
| 577 |
return this.create3DObject(dojox.gfx3d.Path3d,_7a); |
| 578 |
},createScene:function(){ |
| 579 |
return this.create3DObject(dojox.gfx3d.Scene); |
| 580 |
},create3DObject:function(_7b,_7c,_7d){ |
| 581 |
var obj=new _7b(); |
| 582 |
this.adopt(obj);
|
| 583 |
if(_7c){
|
| 584 |
obj.setObject(_7c,_7d); |
| 585 |
} |
| 586 |
return obj;
|
| 587 |
},adopt:function(obj){ |
| 588 |
obj.renderer=this.renderer;
|
| 589 |
obj.parent=this;
|
| 590 |
this.objects.push(obj);
|
| 591 |
this.addTodo(obj);
|
| 592 |
return this; |
| 593 |
},abandon:function(obj,_7e){ |
| 594 |
for(var i=0;i<this.objects.length;++i){ |
| 595 |
if(this.objects[i]==obj){ |
| 596 |
this.objects.splice(i,1); |
| 597 |
} |
| 598 |
} |
| 599 |
obj.parent=null;
|
| 600 |
return this; |
| 601 |
},setScheduler:function(_7f){ |
| 602 |
this.schedule=_7f;
|
| 603 |
},setDrawer:function(_80){ |
| 604 |
this.draw=_80;
|
| 605 |
}}; |
| 606 |
dojo.extend(dojox.gfx3d.Viewport,dojox.gfx3d._creators); |
| 607 |
dojo.extend(dojox.gfx3d.Scene,dojox.gfx3d._creators); |
| 608 |
delete dojox.gfx3d._creators;
|
| 609 |
dojo.extend(dojox.gfx.Surface,{createViewport:function(){
|
| 610 |
var _81=this.createObject(dojox.gfx3d.Viewport,null,true); |
| 611 |
_81.setDimensions(this.getDimensions());
|
| 612 |
return _81;
|
| 613 |
}}); |
| 614 |
} |