/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.gfx3d.object"]){
dojo._hasResource["dojox.gfx3d.object"]=true;
dojo.provide("dojox.gfx3d.object");
dojo.require("dojox.gfx");
dojo.require("dojox.gfx3d.lighting");
dojo.require("dojox.gfx3d.scheduler");
dojo.require("dojox.gfx3d.vector");
dojo.require("dojox.gfx3d.gradient");
var out=function(o,x){
if(arguments.length>1){
o=x;
}
var e={};
for(var i in o){
if(i in e){
continue;
}
}
};
dojo.declare("dojox.gfx3d.Object",null,{constructor:function(){
this.object=null;
this.matrix=null;
this.cache=null;
this.renderer=null;
this.parent=null;
this.strokeStyle=null;
this.fillStyle=null;
this.shape=null;
},setObject:function(_1){
this.object=dojox.gfx.makeParameters(this.object,_1);
return this;
},setTransform:function(_2){
this.matrix=dojox.gfx3d.matrix.clone(_2?dojox.gfx3d.matrix.normalize(_2):dojox.gfx3d.identity,true);
return this;
},applyRightTransform:function(_3){
return _3?this.setTransform([this.matrix,_3]):this;
},applyLeftTransform:function(_4){
return _4?this.setTransform([_4,this.matrix]):this;
},applyTransform:function(_5){
return _5?this.setTransform([this.matrix,_5]):this;
},setFill:function(_6){
this.fillStyle=_6;
return this;
},setStroke:function(_7){
this.strokeStyle=_7;
return this;
},toStdFill:function(_8,_9){
return (this.fillStyle&&typeof this.fillStyle["type"]!="undefined")?_8[this.fillStyle.type](_9,this.fillStyle.finish,this.fillStyle.color):this.fillStyle;
},invalidate:function(){
this.renderer.addTodo(this);
},destroy:function(){
if(this.shape){
var p=this.shape.getParent();
if(p){
p.remove(this.shape);
}
this.shape=null;
}
},render:function(_a){
throw "Pure virtual function, not implemented";
},draw:function(_b){
throw "Pure virtual function, not implemented";
},getZOrder:function(){
return 0;
},getOutline:function(){
return null;
}});
dojo.declare("dojox.gfx3d.Scene",dojox.gfx3d.Object,{constructor:function(){
this.objects=[];
this.todos=[];
this.schedule=dojox.gfx3d.scheduler.zOrder;
this._draw=dojox.gfx3d.drawer.conservative;
},setFill:function(_c){
this.fillStyle=_c;
dojo.forEach(this.objects,function(_d){
_d.setFill(_c);
});
return this;
},setStroke:function(_e){
this.strokeStyle=_e;
dojo.forEach(this.objects,function(_f){
_f.setStroke(_e);
});
return this;
},render:function(_10,_11){
var m=dojox.gfx3d.matrix.multiply(_10,this.matrix);
if(_11){
this.todos=this.objects;
}
dojo.forEach(this.todos,function(_12){
_12.render(m,_11);
});
},draw:function(_13){
this.objects=this.schedule(this.objects);
this._draw(this.todos,this.objects,this.renderer);
},addTodo:function(_14){
if(dojo.every(this.todos,function(_15){
return _15!=_14;
})){
this.todos.push(_14);
this.invalidate();
}
},invalidate:function(){
this.parent.addTodo(this);
},getZOrder:function(){
var _16=0;
dojo.forEach(this.objects,function(_17){
_16+=_17.getZOrder();
});
return (this.objects.length>1)?_16/this.objects.length:0;
}});
dojo.declare("dojox.gfx3d.Edges",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultEdges);
},setObject:function(_18,_19){
this.object=dojox.gfx.makeParameters(this.object,(_18 instanceof Array)?{points:_18,style:_19}:_18);
return this;
},getZOrder:function(){
var _1a=0;
dojo.forEach(this.cache,function(_1b){
_1a+=_1b.z;
});
return (this.cache.length>1)?_1a/this.cache.length:0;
},render:function(_1c){
var m=dojox.gfx3d.matrix.multiply(_1c,this.matrix);
this.cache=dojo.map(this.object.points,function(_1d){
return dojox.gfx3d.matrix.multiplyPoint(m,_1d);
});
},draw:function(){
var c=this.cache;
if(this.shape){
this.shape.setShape("");
}else{
this.shape=this.renderer.createPath();
}
var p=this.shape.setAbsoluteMode("absolute");
if(this.object.style=="strip"||this.object.style=="loop"){
p.moveTo(c[0].x,c[0].y);
dojo.forEach(c.slice(1),function(_1e){
p.lineTo(_1e.x,_1e.y);
});
if(this.object.style=="loop"){
p.closePath();
}
}else{
for(var i=0;i<this.cache.length;){
p.moveTo(c[i].x,c[i].y);
i++;
p.lineTo(c[i].x,c[i].y);
i++;
}
}
p.setStroke(this.strokeStyle);
}});
dojo.declare("dojox.gfx3d.Orbit",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultOrbit);
},render:function(_1f){
var m=dojox.gfx3d.matrix.multiply(_1f,this.matrix);
var _20=[0,Math.PI/4,Math.PI/3];
var _21=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center);
var _22=dojo.map(_20,function(_23){
return {x:this.center.x+this.radius*Math.cos(_23),y:this.center.y+this.radius*Math.sin(_23),z:this.center.z};
},this.object);
_22=dojo.map(_22,function(_24){
return dojox.gfx3d.matrix.multiplyPoint(m,_24);
});
var _25=dojox.gfx3d.vector.normalize(_22);
_22=dojo.map(_22,function(_26){
return dojox.gfx3d.vector.substract(_26,_21);
});
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};
var B=dojo.map(_22,function(_27){
return -Math.pow(_27.x,2);
});
var X=dojox.gfx3d.matrix.multiplyPoint(dojox.gfx3d.matrix.invert(A),B[0],B[1],B[2]);
var _28=Math.atan2(X.x,1-X.y)/2;
var _29=dojo.map(_22,function(_2a){
return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_28),_2a.x,_2a.y);
});
var a=Math.pow(_29[0].x,2);
var b=Math.pow(_29[0].y,2);
var c=Math.pow(_29[1].x,2);
var d=Math.pow(_29[1].y,2);
var rx=Math.sqrt((a*d-b*c)/(d-b));
var ry=Math.sqrt((a*d-b*c)/(a-c));
this.cache={cx:_21.x,cy:_21.y,rx:rx,ry:ry,theta:_28,normal:_25};
},draw:function(_2b){
if(this.shape){
this.shape.setShape(this.cache);
}else{
this.shape=this.renderer.createEllipse(this.cache);
}
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));
}});
dojo.declare("dojox.gfx3d.Path3d",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultPath3d);
this.segments=[];
this.absolute=true;
this.last={};
this.path="";
},_collectArgs:function(_2c,_2d){
for(var i=0;i<_2d.length;++i){
var t=_2d[i];
if(typeof (t)=="boolean"){
_2c.push(t?1:0);
}else{
if(typeof (t)=="number"){
_2c.push(t);
}else{
if(t instanceof Array){
this._collectArgs(_2c,t);
}else{
if("x" in t&&"y" in t){
_2c.push(t.x);
_2c.push(t.y);
}
}
}
}
}
},_validSegments:{m:3,l:3,z:0},_pushSegment:function(_2e,_2f){
var _30=this._validSegments[_2e.toLowerCase()],_31;
if(typeof (_30)=="number"){
if(_30){
if(_2f.length>=_30){
_31={action:_2e,args:_2f.slice(0,_2f.length-_2f.length%_30)};
this.segments.push(_31);
}
}else{
_31={action:_2e,args:[]};
this.segments.push(_31);
}
}
},moveTo:function(){
var _32=[];
this._collectArgs(_32,arguments);
this._pushSegment(this.absolute?"M":"m",_32);
return this;
},lineTo:function(){
var _33=[];
this._collectArgs(_33,arguments);
this._pushSegment(this.absolute?"L":"l",_33);
return this;
},closePath:function(){
this._pushSegment("Z",[]);
return this;
},render:function(_34){
var m=dojox.gfx3d.matrix.multiply(_34,this.matrix);
var _35="";
var _36=this._validSegments;
dojo.forEach(this.segments,function(_37){
_35+=_37.action;
for(var i=0;i<_37.args.length;i+=_36[_37.action.toLowerCase()]){
var pt=dojox.gfx3d.matrix.multiplyPoint(m,_37.args[i],_37.args[i+1],_37.args[i+2]);
_35+=" "+pt.x+" "+pt.y;
}
});
this.cache=_35;
},_draw:function(){
return this.parent.createPath(this.cache);
}});
dojo.declare("dojox.gfx3d.Triangles",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultTriangles);
},setObject:function(_38,_39){
if(_38 instanceof Array){
this.object=dojox.gfx.makeParameters(this.object,{points:_38,style:_39});
}else{
this.object=dojox.gfx.makeParameters(this.object,_38);
}
return this;
},render:function(_3a){
var m=dojox.gfx3d.matrix.multiply(_3a,this.matrix);
var c=dojo.map(this.object.points,function(_3b){
return dojox.gfx3d.matrix.multiplyPoint(m,_3b);
});
this.cache=[];
var _3c=c.slice(0,2);
var _3d=c[0];
if(this.object.style=="strip"){
dojo.forEach(c.slice(2),function(_3e){
_3c.push(_3e);
_3c.push(_3c[0]);
this.cache.push(_3c);
_3c=_3c.slice(1,3);
},this);
}else{
if(this.object.style=="fan"){
dojo.forEach(c.slice(2),function(_3f){
_3c.push(_3f);
_3c.push(_3d);
this.cache.push(_3c);
_3c=[_3d,_3f];
},this);
}else{
for(var i=0;i<c.length;){
this.cache.push([c[i],c[i+1],c[i+2],c[i]]);
i+=3;
}
}
}
},draw:function(_40){
this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){
return it;
});
if(this.shape){
this.shape.clear();
}else{
this.shape=this.renderer.createGroup();
}
dojo.forEach(this.cache,function(_41){
this.shape.createPolyline(_41).setStroke(this.strokeStyle).setFill(this.toStdFill(_40,dojox.gfx3d.vector.normalize(_41)));
},this);
},getZOrder:function(){
var _42=0;
dojo.forEach(this.cache,function(_43){
_42+=(_43[0].z+_43[1].z+_43[2].z)/3;
});
return (this.cache.length>1)?_42/this.cache.length:0;
}});
dojo.declare("dojox.gfx3d.Quads",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultQuads);
},setObject:function(_44,_45){
this.object=dojox.gfx.makeParameters(this.object,(_44 instanceof Array)?{points:_44,style:_45}:_44);
return this;
},render:function(_46){
var m=dojox.gfx3d.matrix.multiply(_46,this.matrix),i;
var c=dojo.map(this.object.points,function(_47){
return dojox.gfx3d.matrix.multiplyPoint(m,_47);
});
this.cache=[];
if(this.object.style=="strip"){
var _48=c.slice(0,2);
for(i=2;i<c.length;){
_48=_48.concat([c[i],c[i+1],_48[0]]);
this.cache.push(_48);
_48=_48.slice(2,4);
i+=2;
}
}else{
for(i=0;i<c.length;){
this.cache.push([c[i],c[i+1],c[i+2],c[i+3],c[i]]);
i+=4;
}
}
},draw:function(_49){
this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){
return it;
});
if(this.shape){
this.shape.clear();
}else{
this.shape=this.renderer.createGroup();
}
for(var x=0;x<this.cache.length;x++){
this.shape.createPolyline(this.cache[x]).setStroke(this.strokeStyle).setFill(this.toStdFill(_49,dojox.gfx3d.vector.normalize(this.cache[x])));
}
},getZOrder:function(){
var _4a=0;
for(var x=0;x<this.cache.length;x++){
var i=this.cache[x];
_4a+=(i[0].z+i[1].z+i[2].z+i[3].z)/4;
}
return (this.cache.length>1)?_4a/this.cache.length:0;
}});
dojo.declare("dojox.gfx3d.Polygon",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultPolygon);
},setObject:function(_4b){
this.object=dojox.gfx.makeParameters(this.object,(_4b instanceof Array)?{path:_4b}:_4b);
return this;
},render:function(_4c){
var m=dojox.gfx3d.matrix.multiply(_4c,this.matrix);
this.cache=dojo.map(this.object.path,function(_4d){
return dojox.gfx3d.matrix.multiplyPoint(m,_4d);
});
this.cache.push(this.cache[0]);
},draw:function(_4e){
if(this.shape){
this.shape.setShape({points:this.cache});
}else{
this.shape=this.renderer.createPolyline({points:this.cache});
}
this.shape.setStroke(this.strokeStyle).setFill(this.toStdFill(_4e,dojox.gfx3d.matrix.normalize(this.cache)));
},getZOrder:function(){
var _4f=0;
for(var x=0;x<this.cache.length;x++){
_4f+=this.cache[x].z;
}
return (this.cache.length>1)?_4f/this.cache.length:0;
},getOutline:function(){
return this.cache.slice(0,3);
}});
dojo.declare("dojox.gfx3d.Cube",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultCube);
this.polygons=[];
},setObject:function(_50){
this.object=dojox.gfx.makeParameters(this.object,_50);
},render:function(_51){
var a=this.object.top;
var g=this.object.bottom;
var b={x:g.x,y:a.y,z:a.z};
var c={x:g.x,y:g.y,z:a.z};
var d={x:a.x,y:g.y,z:a.z};
var e={x:a.x,y:a.y,z:g.z};
var f={x:g.x,y:a.y,z:g.z};
var h={x:a.x,y:g.y,z:g.z};
var _52=[a,b,c,d,e,f,g,h];
var m=dojox.gfx3d.matrix.multiply(_51,this.matrix);
var p=dojo.map(_52,function(_53){
return dojox.gfx3d.matrix.multiplyPoint(m,_53);
});
a=p[0];
b=p[1];
c=p[2];
d=p[3];
e=p[4];
f=p[5];
g=p[6];
h=p[7];
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]];
},draw:function(_54){
this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){
return it;
});
var _55=this.cache.slice(3);
if(this.shape){
this.shape.clear();
}else{
this.shape=this.renderer.createGroup();
}
for(var x=0;x<_55.length;x++){
this.shape.createPolyline(_55[x]).setStroke(this.strokeStyle).setFill(this.toStdFill(_54,dojox.gfx3d.vector.normalize(_55[x])));
}
},getZOrder:function(){
var top=this.cache[0][0];
var _56=this.cache[1][2];
return (top.z+_56.z)/2;
}});
dojo.declare("dojox.gfx3d.Cylinder",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultCylinder);
},render:function(_57){
var m=dojox.gfx3d.matrix.multiply(_57,this.matrix);
var _58=[0,Math.PI/4,Math.PI/3];
var _59=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center);
var _5a=dojo.map(_58,function(_5b){
return {x:this.center.x+this.radius*Math.cos(_5b),y:this.center.y+this.radius*Math.sin(_5b),z:this.center.z};
},this.object);
_5a=dojo.map(_5a,function(_5c){
return dojox.gfx3d.vector.substract(dojox.gfx3d.matrix.multiplyPoint(m,_5c),_59);
});
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};
var B=dojo.map(_5a,function(_5d){
return -Math.pow(_5d.x,2);
});
var X=dojox.gfx3d.matrix.multiplyPoint(dojox.gfx3d.matrix.invert(A),B[0],B[1],B[2]);
var _5e=Math.atan2(X.x,1-X.y)/2;
var _5f=dojo.map(_5a,function(_60){
return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_5e),_60.x,_60.y);
});
var a=Math.pow(_5f[0].x,2);
var b=Math.pow(_5f[0].y,2);
var c=Math.pow(_5f[1].x,2);
var d=Math.pow(_5f[1].y,2);
var rx=Math.sqrt((a*d-b*c)/(d-b));
var ry=Math.sqrt((a*d-b*c)/(a-c));
if(rx<ry){
var t=rx;
rx=ry;
ry=t;
_5e-=Math.PI/2;
}
var top=dojox.gfx3d.matrix.multiplyPoint(m,dojox.gfx3d.vector.sum(this.object.center,{x:0,y:0,z:this.object.height}));
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);
if(isNaN(rx)||isNaN(ry)||isNaN(_5e)){
rx=this.object.radius,ry=0,_5e=0;
}
this.cache={center:_59,top:top,rx:rx,ry:ry,theta:_5e,gradient:_61};
},draw:function(){
var c=this.cache,v=dojox.gfx3d.vector,m=dojox.gfx.matrix,_62=[c.center,c.top],_63=v.substract(c.top,c.center);
if(v.dotProduct(_63,this.renderer.lighting.incident)>0){
_62=[c.top,c.center];
_63=v.substract(c.center,c.top);
}
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));
if(this.shape){
this.shape.clear();
}else{
this.shape=this.renderer.createGroup();
}
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))]);
if(c.rx>0&&c.ry>0){
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]));
}
}});
dojo.declare("dojox.gfx3d.Viewport",dojox.gfx.Group,{constructor:function(){
this.dimension=null;
this.objects=[];
this.todos=[];
this.renderer=this;
this.schedule=dojox.gfx3d.scheduler.zOrder;
this.draw=dojox.gfx3d.drawer.conservative;
this.deep=false;
this.lights=[];
this.lighting=null;
},setCameraTransform:function(_65){
this.camera=dojox.gfx3d.matrix.clone(_65?dojox.gfx3d.matrix.normalize(_65):dojox.gfx3d.identity,true);
this.invalidate();
return this;
},applyCameraRightTransform:function(_66){
return _66?this.setCameraTransform([this.camera,_66]):this;
},applyCameraLeftTransform:function(_67){
return _67?this.setCameraTransform([_67,this.camera]):this;
},applyCameraTransform:function(_68){
return this.applyCameraRightTransform(_68);
},setLights:function(_69,_6a,_6b){
this.lights=(_69 instanceof Array)?{sources:_69,ambient:_6a,specular:_6b}:_69;
var _6c={x:0,y:0,z:1};
this.lighting=new dojox.gfx3d.lighting.Model(_6c,this.lights.sources,this.lights.ambient,this.lights.specular);
this.invalidate();
return this;
},addLights:function(_6d){
return this.setLights(this.lights.sources.concat(_6d));
},addTodo:function(_6e){
if(dojo.every(this.todos,function(_6f){
return _6f!=_6e;
})){
this.todos.push(_6e);
}
},invalidate:function(){
this.deep=true;
this.todos=this.objects;
},setDimensions:function(dim){
if(dim){
var w=dojo.isString(dim.width)?parseInt(dim.width):dim.width;
var h=dojo.isString(dim.height)?parseInt(dim.height):dim.height;
var trs=this.rawNode.style;
trs.height=h;
trs.width=w;
this.dimension={width:w,height:h};
}else{
this.dimension=null;
}
},render:function(){
if(!this.todos.length){
return;
}
var m=dojox.gfx3d.matrix;
for(var x=0;x<this.todos.length;x++){
this.todos[x].render(dojox.gfx3d.matrix.normalize([m.cameraRotateXg(180),m.cameraTranslate(0,this.dimension.height,0),this.camera]),this.deep);
}
this.objects=this.schedule(this.objects);
this.draw(this.todos,this.objects,this);
this.todos=[];
this.deep=false;
}});
dojox.gfx3d.Viewport.nodeType=dojox.gfx.Group.nodeType;
dojox.gfx3d._creators={createEdges:function(_70,_71){
return this.create3DObject(dojox.gfx3d.Edges,_70,_71);
},createTriangles:function(_72,_73){
return this.create3DObject(dojox.gfx3d.Triangles,_72,_73);
},createQuads:function(_74,_75){
return this.create3DObject(dojox.gfx3d.Quads,_74,_75);
},createPolygon:function(_76){
return this.create3DObject(dojox.gfx3d.Polygon,_76);
},createOrbit:function(_77){
return this.create3DObject(dojox.gfx3d.Orbit,_77);
},createCube:function(_78){
return this.create3DObject(dojox.gfx3d.Cube,_78);
},createCylinder:function(_79){
return this.create3DObject(dojox.gfx3d.Cylinder,_79);
},createPath3d:function(_7a){
return this.create3DObject(dojox.gfx3d.Path3d,_7a);
},createScene:function(){
return this.create3DObject(dojox.gfx3d.Scene);
},create3DObject:function(_7b,_7c,_7d){
var obj=new _7b();
this.adopt(obj);
if(_7c){
obj.setObject(_7c,_7d);
}
return obj;
},adopt:function(obj){
obj.renderer=this.renderer;
obj.parent=this;
this.objects.push(obj);
this.addTodo(obj);
return this;
},abandon:function(obj,_7e){
for(var i=0;i<this.objects.length;++i){
if(this.objects[i]==obj){
this.objects.splice(i,1);
}
}
obj.parent=null;
return this;
},setScheduler:function(_7f){
this.schedule=_7f;
},setDrawer:function(_80){
this.draw=_80;
}};
dojo.extend(dojox.gfx3d.Viewport,dojox.gfx3d._creators);
dojo.extend(dojox.gfx3d.Scene,dojox.gfx3d._creators);
delete dojox.gfx3d._creators;
dojo.extend(dojox.gfx.Surface,{createViewport:function(){
var _81=this.createObject(dojox.gfx3d.Viewport,null,true);
_81.setDimensions(this.getDimensions());
return _81;
}});
}
