blob: 749f369718080bc88aae4999bf9bded250b89b82 [file] [log] [blame]
/*
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(_5){
this.object=dojox.gfx.makeParameters(this.object,_5);
return this;
},setTransform:function(_6){
this.matrix=dojox.gfx3d.matrix.clone(_6?dojox.gfx3d.matrix.normalize(_6):dojox.gfx3d.identity,true);
return this;
},applyRightTransform:function(_7){
return _7?this.setTransform([this.matrix,_7]):this;
},applyLeftTransform:function(_8){
return _8?this.setTransform([_8,this.matrix]):this;
},applyTransform:function(_9){
return _9?this.setTransform([this.matrix,_9]):this;
},setFill:function(_a){
this.fillStyle=_a;
return this;
},setStroke:function(_b){
this.strokeStyle=_b;
return this;
},toStdFill:function(_c,_d){
return (this.fillStyle&&typeof this.fillStyle["type"]!="undefined")?_c[this.fillStyle.type](_d,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(_f){
throw "Pure virtual function, not implemented";
},draw:function(_10){
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(_11){
this.fillStyle=_11;
dojo.forEach(this.objects,function(_12){
_12.setFill(_11);
});
return this;
},setStroke:function(_13){
this.strokeStyle=_13;
dojo.forEach(this.objects,function(_14){
_14.setStroke(_13);
});
return this;
},render:function(_15,_16){
var m=dojox.gfx3d.matrix.multiply(_15,this.matrix);
if(_16){
this.todos=this.objects;
}
dojo.forEach(this.todos,function(_18){
_18.render(m,_16);
});
},draw:function(_19){
this.objects=this.schedule(this.objects);
this._draw(this.todos,this.objects,this.renderer);
},addTodo:function(_1a){
if(dojo.every(this.todos,function(_1b){
return _1b!=_1a;
})){
this.todos.push(_1a);
this.invalidate();
}
},invalidate:function(){
this.parent.addTodo(this);
},getZOrder:function(){
var _1c=0;
dojo.forEach(this.objects,function(_1d){
_1c+=_1d.getZOrder();
});
return (this.objects.length>1)?_1c/this.objects.length:0;
}});
dojo.declare("dojox.gfx3d.Edges",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultEdges);
},setObject:function(_1e,_1f){
this.object=dojox.gfx.makeParameters(this.object,(_1e instanceof Array)?{points:_1e,style:_1f}:_1e);
return this;
},getZOrder:function(){
var _20=0;
dojo.forEach(this.cache,function(_21){
_20+=_21.z;
});
return (this.cache.length>1)?_20/this.cache.length:0;
},render:function(_22){
var m=dojox.gfx3d.matrix.multiply(_22,this.matrix);
this.cache=dojo.map(this.object.points,function(_24){
return dojox.gfx3d.matrix.multiplyPoint(m,_24);
});
},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(_27){
p.lineTo(_27.x,_27.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(_29){
var m=dojox.gfx3d.matrix.multiply(_29,this.matrix);
var _2b=[0,Math.PI/4,Math.PI/3];
var _2c=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center);
var _2d=dojo.map(_2b,function(_2e){
return {x:this.center.x+this.radius*Math.cos(_2e),y:this.center.y+this.radius*Math.sin(_2e),z:this.center.z};
},this.object);
_2d=dojo.map(_2d,function(_2f){
return dojox.gfx3d.matrix.multiplyPoint(m,_2f);
});
var _30=dojox.gfx3d.vector.normalize(_2d);
_2d=dojo.map(_2d,function(_31){
return dojox.gfx3d.vector.substract(_31,_2c);
});
var A={xx:_2d[0].x*_2d[0].y,xy:_2d[0].y*_2d[0].y,xz:1,yx:_2d[1].x*_2d[1].y,yy:_2d[1].y*_2d[1].y,yz:1,zx:_2d[2].x*_2d[2].y,zy:_2d[2].y*_2d[2].y,zz:1,dx:0,dy:0,dz:0};
var B=dojo.map(_2d,function(_34){
return -Math.pow(_34.x,2);
});
var X=dojox.gfx3d.matrix.multiplyPoint(dojox.gfx3d.matrix.invert(A),B[0],B[1],B[2]);
var _36=Math.atan2(X.x,1-X.y)/2;
var _37=dojo.map(_2d,function(_38){
return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_36),_38.x,_38.y);
});
var a=Math.pow(_37[0].x,2);
var b=Math.pow(_37[0].y,2);
var c=Math.pow(_37[1].x,2);
var d=Math.pow(_37[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:_2c.x,cy:_2c.y,rx:rx,ry:ry,theta:_36,normal:_30};
},draw:function(_3f){
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(_3f,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(_40,_41){
for(var i=0;i<_41.length;++i){
var t=_41[i];
if(typeof (t)=="boolean"){
_40.push(t?1:0);
}else{
if(typeof (t)=="number"){
_40.push(t);
}else{
if(t instanceof Array){
this._collectArgs(_40,t);
}else{
if("x" in t&&"y" in t){
_40.push(t.x);
_40.push(t.y);
}
}
}
}
}
},_validSegments:{m:3,l:3,z:0},_pushSegment:function(_44,_45){
var _46=this._validSegments[_44.toLowerCase()],_47;
if(typeof (_46)=="number"){
if(_46){
if(_45.length>=_46){
_47={action:_44,args:_45.slice(0,_45.length-_45.length%_46)};
this.segments.push(_47);
}
}else{
_47={action:_44,args:[]};
this.segments.push(_47);
}
}
},moveTo:function(){
var _48=[];
this._collectArgs(_48,arguments);
this._pushSegment(this.absolute?"M":"m",_48);
return this;
},lineTo:function(){
var _49=[];
this._collectArgs(_49,arguments);
this._pushSegment(this.absolute?"L":"l",_49);
return this;
},closePath:function(){
this._pushSegment("Z",[]);
return this;
},render:function(_4a){
var m=dojox.gfx3d.matrix.multiply(_4a,this.matrix);
var _4c="";
var _4d=this._validSegments;
dojo.forEach(this.segments,function(_4e){
_4c+=_4e.action;
for(var i=0;i<_4e.args.length;i+=_4d[_4e.action.toLowerCase()]){
var pt=dojox.gfx3d.matrix.multiplyPoint(m,_4e.args[i],_4e.args[i+1],_4e.args[i+2]);
_4c+=" "+pt.x+" "+pt.y;
}
});
this.cache=_4c;
},_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(_51,_52){
if(_51 instanceof Array){
this.object=dojox.gfx.makeParameters(this.object,{points:_51,style:_52});
}else{
this.object=dojox.gfx.makeParameters(this.object,_51);
}
return this;
},render:function(_53){
var m=dojox.gfx3d.matrix.multiply(_53,this.matrix);
var c=dojo.map(this.object.points,function(_56){
return dojox.gfx3d.matrix.multiplyPoint(m,_56);
});
this.cache=[];
var _57=c.slice(0,2);
var _58=c[0];
if(this.object.style=="strip"){
dojo.forEach(c.slice(2),function(_59){
_57.push(_59);
_57.push(_57[0]);
this.cache.push(_57);
_57=_57.slice(1,3);
},this);
}else{
if(this.object.style=="fan"){
dojo.forEach(c.slice(2),function(_5a){
_57.push(_5a);
_57.push(_58);
this.cache.push(_57);
_57=[_58,_5a];
},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(_5c){
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(_5e){
this.shape.createPolyline(_5e).setStroke(this.strokeStyle).setFill(this.toStdFill(_5c,dojox.gfx3d.vector.normalize(_5e)));
},this);
},getZOrder:function(){
var _5f=0;
dojo.forEach(this.cache,function(_60){
_5f+=(_60[0].z+_60[1].z+_60[2].z)/3;
});
return (this.cache.length>1)?_5f/this.cache.length:0;
}});
dojo.declare("dojox.gfx3d.Quads",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultQuads);
},setObject:function(_61,_62){
this.object=dojox.gfx.makeParameters(this.object,(_61 instanceof Array)?{points:_61,style:_62}:_61);
return this;
},render:function(_63){
var m=dojox.gfx3d.matrix.multiply(_63,this.matrix),i;
var c=dojo.map(this.object.points,function(_67){
return dojox.gfx3d.matrix.multiplyPoint(m,_67);
});
this.cache=[];
if(this.object.style=="strip"){
var _68=c.slice(0,2);
for(i=2;i<c.length;){
_68=_68.concat([c[i],c[i+1],_68[0]]);
this.cache.push(_68);
_68=_68.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(_69){
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(_69,dojox.gfx3d.vector.normalize(this.cache[x])));
}
},getZOrder:function(){
var _6c=0;
for(var x=0;x<this.cache.length;x++){
var i=this.cache[x];
_6c+=(i[0].z+i[1].z+i[2].z+i[3].z)/4;
}
return (this.cache.length>1)?_6c/this.cache.length:0;
}});
dojo.declare("dojox.gfx3d.Polygon",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultPolygon);
},setObject:function(_6f){
this.object=dojox.gfx.makeParameters(this.object,(_6f instanceof Array)?{path:_6f}:_6f);
return this;
},render:function(_70){
var m=dojox.gfx3d.matrix.multiply(_70,this.matrix);
this.cache=dojo.map(this.object.path,function(_72){
return dojox.gfx3d.matrix.multiplyPoint(m,_72);
});
this.cache.push(this.cache[0]);
},draw:function(_73){
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(_73,dojox.gfx3d.matrix.normalize(this.cache)));
},getZOrder:function(){
var _74=0;
for(var x=0;x<this.cache.length;x++){
_74+=this.cache[x].z;
}
return (this.cache.length>1)?_74/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(_76){
this.object=dojox.gfx.makeParameters(this.object,_76);
},render:function(_77){
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 _80=[a,b,c,d,e,f,g,h];
var m=dojox.gfx3d.matrix.multiply(_77,this.matrix);
var p=dojo.map(_80,function(_83){
return dojox.gfx3d.matrix.multiplyPoint(m,_83);
});
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(_84){
this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){
return it;
});
var _86=this.cache.slice(3);
if(this.shape){
this.shape.clear();
}else{
this.shape=this.renderer.createGroup();
}
for(var x=0;x<_86.length;x++){
this.shape.createPolyline(_86[x]).setStroke(this.strokeStyle).setFill(this.toStdFill(_84,dojox.gfx3d.vector.normalize(_86[x])));
}
},getZOrder:function(){
var top=this.cache[0][0];
var _89=this.cache[1][2];
return (top.z+_89.z)/2;
}});
dojo.declare("dojox.gfx3d.Cylinder",dojox.gfx3d.Object,{constructor:function(){
this.object=dojo.clone(dojox.gfx3d.defaultCylinder);
},render:function(_8a){
var m=dojox.gfx3d.matrix.multiply(_8a,this.matrix);
var _8c=[0,Math.PI/4,Math.PI/3];
var _8d=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center);
var _8e=dojo.map(_8c,function(_8f){
return {x:this.center.x+this.radius*Math.cos(_8f),y:this.center.y+this.radius*Math.sin(_8f),z:this.center.z};
},this.object);
_8e=dojo.map(_8e,function(_90){
return dojox.gfx3d.vector.substract(dojox.gfx3d.matrix.multiplyPoint(m,_90),_8d);
});
var A={xx:_8e[0].x*_8e[0].y,xy:_8e[0].y*_8e[0].y,xz:1,yx:_8e[1].x*_8e[1].y,yy:_8e[1].y*_8e[1].y,yz:1,zx:_8e[2].x*_8e[2].y,zy:_8e[2].y*_8e[2].y,zz:1,dx:0,dy:0,dz:0};
var B=dojo.map(_8e,function(_93){
return -Math.pow(_93.x,2);
});
var X=dojox.gfx3d.matrix.multiplyPoint(dojox.gfx3d.matrix.invert(A),B[0],B[1],B[2]);
var _95=Math.atan2(X.x,1-X.y)/2;
var _96=dojo.map(_8e,function(_97){
return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_95),_97.x,_97.y);
});
var a=Math.pow(_96[0].x,2);
var b=Math.pow(_96[0].y,2);
var c=Math.pow(_96[1].x,2);
var d=Math.pow(_96[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;
_95-=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 _a0=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(_95)){
rx=this.object.radius,ry=0,_95=0;
}
this.cache={center:_8d,top:top,rx:rx,ry:ry,theta:_95,gradient:_a0};
},draw:function(){
var c=this.cache,v=dojox.gfx3d.vector,m=dojox.gfx.matrix,_a4=[c.center,c.top],_a5=v.substract(c.top,c.center);
if(v.dotProduct(_a5,this.renderer.lighting.incident)>0){
_a4=[c.top,c.center];
_a5=v.substract(c.center,c.top);
}
var _a6=this.renderer.lighting[this.fillStyle.type](_a5,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(_a4[0]),m.rotate(Math.atan2(_a4[1].y-_a4[0].y,_a4[1].x-_a4[0].x))]);
if(c.rx>0&&c.ry>0){
this.shape.createEllipse({cx:_a4[1].x,cy:_a4[1].y,rx:c.rx,ry:c.ry}).setFill(_a6).setStroke(this.strokeStyle).applyTransform(m.rotateAt(c.theta,_a4[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(_a8){
this.camera=dojox.gfx3d.matrix.clone(_a8?dojox.gfx3d.matrix.normalize(_a8):dojox.gfx3d.identity,true);
this.invalidate();
return this;
},applyCameraRightTransform:function(_a9){
return _a9?this.setCameraTransform([this.camera,_a9]):this;
},applyCameraLeftTransform:function(_aa){
return _aa?this.setCameraTransform([_aa,this.camera]):this;
},applyCameraTransform:function(_ab){
return this.applyCameraRightTransform(_ab);
},setLights:function(_ac,_ad,_ae){
this.lights=(_ac instanceof Array)?{sources:_ac,ambient:_ad,specular:_ae}:_ac;
var _af={x:0,y:0,z:1};
this.lighting=new dojox.gfx3d.lighting.Model(_af,this.lights.sources,this.lights.ambient,this.lights.specular);
this.invalidate();
return this;
},addLights:function(_b0){
return this.setLights(this.lights.sources.concat(_b0));
},addTodo:function(_b1){
if(dojo.every(this.todos,function(_b2){
return _b2!=_b1;
})){
this.todos.push(_b1);
}
},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(_b9,_ba){
return this.create3DObject(dojox.gfx3d.Edges,_b9,_ba);
},createTriangles:function(_bb,_bc){
return this.create3DObject(dojox.gfx3d.Triangles,_bb,_bc);
},createQuads:function(_bd,_be){
return this.create3DObject(dojox.gfx3d.Quads,_bd,_be);
},createPolygon:function(_bf){
return this.create3DObject(dojox.gfx3d.Polygon,_bf);
},createOrbit:function(_c0){
return this.create3DObject(dojox.gfx3d.Orbit,_c0);
},createCube:function(_c1){
return this.create3DObject(dojox.gfx3d.Cube,_c1);
},createCylinder:function(_c2){
return this.create3DObject(dojox.gfx3d.Cylinder,_c2);
},createPath3d:function(_c3){
return this.create3DObject(dojox.gfx3d.Path3d,_c3);
},createScene:function(){
return this.create3DObject(dojox.gfx3d.Scene);
},create3DObject:function(_c4,_c5,_c6){
var obj=new _c4();
this.adopt(obj);
if(_c5){
obj.setObject(_c5,_c6);
}
return obj;
},adopt:function(obj){
obj.renderer=this.renderer;
obj.parent=this;
this.objects.push(obj);
this.addTodo(obj);
return this;
},abandon:function(obj,_ca){
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(_cc){
this.schedule=_cc;
},setDrawer:function(_cd){
this.draw=_cd;
}};
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 _ce=this.createObject(dojox.gfx3d.Viewport,null,true);
_ce.setDimensions(this.getDimensions());
return _ce;
}});
}