Hi Mirko,

I just put your class in and it works perfect for what I need!!
Legend!

Jonathan

On May 28, 6:05 am, Mirko <[email protected]> wrote:
> I run into the same problem.
> Here comes a fixed class which work for me.
> Hope it helps you too
>
> package away3d.primitives
> {
>         import away3d.arcane;
>         import away3d.core.base.*;
>         import away3d.core.utils.*;
>         import away3d.events.*;
>         import away3d.materials.*;
>         import away3d.primitives.data.*;
>
>         use namespace arcane;
>
>     /**
>     * Creates a 3d Cube primitive.
>     */
>     public class Cube extends AbstractPrimitive
>     {
>         private var _width:Number;
>         private var _height:Number;
>         private var _depth:Number;
>                 private var _segmentsW:int;
>         private var _segmentsH:int;
>                 private var _segmentsD:int;
>                 private var _flip:Boolean;
>         private var _cubeMaterials:CubeMaterialsData;
>         private var _leftFaces:Array;
>         private var _rightFaces:Array;
>         private var _bottomFaces:Array;
>         private var _topFaces:Array;
>         private var _frontFaces:Array;
>         private var _backFaces:Array;
>         private var _cubeFaceArray:Array;
>                 private var _mappingType:String;
>                 private var _dbv:Array;
>                 private var _dbu:Array;
>
>                 private var _pixelBorder:int = 0;
>                 private var _varr:Array = [];
>                 private var _uvarr:Array = [];
>
>         private function onCubeMaterialChange(event:MaterialEvent):void
>         {
>                 switch (event.extra) {
>                         case "left":
>                                 _cubeFaceArray = _leftFaces;
>                                 break;
>                         case "right":
>                                 _cubeFaceArray = _rightFaces;
>                                 break;
>                         case "bottom":
>                                 _cubeFaceArray = _bottomFaces;
>                                 break;
>                         case "top":
>                                 _cubeFaceArray = _topFaces;
>                                 break;
>                         case "front":
>                                 _cubeFaceArray = _frontFaces;
>                                 break;
>                         case "back":
>                                 _cubeFaceArray = _backFaces;
>                 }
>                 for each (var _cubeFace:Face in _cubeFaceArray)
>                         _cubeFace.material = event.material as Material;
>         }
>
>                 private function makeVertex(x:Number, y:Number, 
> z:Number):Vertex
>                 {
>                         for(var i:int = 0;i<_dbv.length; ++i)
>                                 if( _dbv[i].x == x && _dbv[i].y == y && 
> _dbv[i].z == z)
>                                         return _dbv[i];
>
>                         var v:Vertex = createVertex(x, y, z);
>                         _dbv[_dbv.length] = v;
>
>                         return v;
>                 }
>
>                 private function makeUV(u:Number, v:Number):UV
>                 {
>                         for(var i:int = 0;i<_dbu.length; ++i)
>                                 if( _dbu[i].u == u && _dbu[i].v == v)
>                                         return _dbu[i];
>
>                         var uv:UV = createUV(u,v);
>                         _dbu[_dbu.length] = uv;
>
>                         return uv;
>                 }
>
>                 private function buildFaces(a:int, b:int, c:int, d:int,
> mat:Material, back:Boolean, cubeFace:String):void {
>                         var uva:UV = _uvarr[a];
>                         var uvb:UV = _uvarr[b];
>                         var uvc:UV = _uvarr[c];
>                         var uvd:UV = _uvarr[d];
>
>                         var va:Vertex = _varr[a];
>                         var vb:Vertex = _varr[b];
>                         var vc:Vertex = _varr[c];
>                         var vd:Vertex = _varr[d];
>
>                         var faces:Array = [];
>
>                         if(_flip || back) {
>                                 faces.push(createFace(va,vb,vc, mat, uva, 
> uvb, uvc ));
>                                 faces.push(createFace(va,vc,vd, mat, uva, 
> uvc, uvd));
>                         } else {
>                                 faces.push(createFace(vb,va,vc, mat, uvb, 
> uva, uvc ));
>                                 faces.push(createFace(vc,va,vd, mat, uvc, 
> uva, uvd));
>                         }
>                         for each (var face:Face in faces) {
>                 switch (cubeFace) {
>                     case "left":
>                         _leftFaces.push(face);
>                         break;
>                     case "right":
>                         _rightFaces.push(face);
>                         break;
>                     case "bottom":
>                         _bottomFaces.push(face);
>                         break;
>                     case "top":
>                         _topFaces.push(face);
>                         break;
>                     case "front":
>                         _frontFaces.push(face);
>                         break;
>                     case "back":
>                         _backFaces.push(face);
>                 }
>                 addFace(face);
>             }
>
>                 }
>
>                 /**
>                  * @inheritDoc
>                  */
>         protected override function buildPrimitive():void
>         {
>                         super.buildPrimitive();
>
>                         _leftFaces = [];
>                         _rightFaces = [];
>                         _bottomFaces = [];
>                         _topFaces = [];
>                         _frontFaces = [];
>                         _backFaces = [];
>
>                         var i:int;
>                         var j:int;
>
>                         var udelta:Number = _pixelBorder/600;
>                         var vdelta:Number = _pixelBorder/400;
>
>                         var a:int;
>                         var b:int;
>                         var c:int;
>                         var d:int;
>                         var inc:int = 0;
>
>                         _dbv = [];
>                         _dbu = [];
>                         _varr = [];
>                         _uvarr = [];
>
>                         if (material is BitmapMaterial) {
>                                 var bMaterial:BitmapMaterial = material as 
> BitmapMaterial;
>                                 udelta = _pixelBorder/bMaterial.width;
>                                 vdelta = _pixelBorder/bMaterial.height;
>                         }
>
>                         for (i = 0; i <= _segmentsW; i++) {
>                                 for (j = 0; j <= _segmentsH; j++) {
>
>                                         //create front/back
>                                         _varr.push( makeVertex(_width/2 - 
> i*_width/_segmentsW, _height/2
> - j*_height/_segmentsH, -_depth/2) );
>                                         _varr.push( makeVertex(_width/2 - 
> i*_width/_segmentsW, _height/2
> - j*_height/_segmentsH, _depth/2) );
>                                         if (_mappingType == 
> CubeMappingType.NORMAL) {
>                                                 _uvarr.push( makeUV(1 - 
> i/_segmentsW, 1 - j/_segmentsH));
>                                                 _uvarr.push( 
> makeUV(i/_segmentsW, 1 - j/_segmentsH));
>                                         } else {
>                                                 _uvarr.push( makeUV(2/3 - 
> udelta - i*(1 - 6*udelta)/
> (3*_segmentsW), 1 - vdelta - j*(1 - 4*vdelta)/(2*_segmentsH)) );
>                                                 _uvarr.push( makeUV(udelta + 
> i*(1 - 6*udelta)/(3*_segmentsW),
> 1/2 - vdelta - j*(1 - 4*vdelta)/(2*_segmentsH)) );
>                                         }
>
>                                         if (i && j) {
>                                                 a = 2*((_segmentsH+1)*i + j);
>                                                 b = 2*((_segmentsH+1)*i + j - 
> 1);
>                                                 c = 2*((_segmentsH+1)*(i - 1) 
> + j - 1);
>                                                 d = 2*((_segmentsH+1)*(i - 1) 
> + j);
>
>                                                 buildFaces(a, b, c, d, 
> _cubeMaterials.front, false, "front");
>                                                 buildFaces(a+1, b+1, c+1, 
> d+1, _cubeMaterials.back, true,
> "back");
>                                         }
>                                 }
>                         }
>
>                         inc += 2*(_segmentsW + 1)*(_segmentsH + 1);
>
>                         for (i = 0; i <= _segmentsW; i++) {
>                                 for (j = 0; j <= _segmentsD; j++) {
>
>                                         //create top/bottom
>                                         _varr.push( makeVertex(_width/2 - 
> i*_width/_segmentsW, -_height/
> 2, -_depth/2 + j*_depth/_segmentsD) );
>                                         _varr.push( makeVertex(_width/2 - 
> i*_width/_segmentsW, _height/2,
> -_depth/2 + j*_depth/_segmentsD) );
>
>                                         if (_mappingType == 
> CubeMappingType.NORMAL) {
>                                                 _uvarr.push( 
> makeUV(j/_segmentsW, 1 - i/_segmentsD));
>                                                 _uvarr.push( 
> makeUV(j/_segmentsW, i/_segmentsD));
>                                         } else {
>                                                 _uvarr.push( makeUV(1 - 
> udelta - j*(1 - 6*udelta)/
> (3*_segmentsW), vdelta + i*(1 - 4*vdelta)/(2*_segmentsD)) );
>                                                 _uvarr.push( makeUV(2/3 - 
> udelta - j*(1 - 6*udelta)/
> (3*_segmentsW), 1/2 - vdelta - i*(1 - 4*vdelta)/(2*_segmentsD)) );
>                                         }
>
>                                         if (i && j) {
>                                                 a = inc + 2*((_segmentsD + 
> 1)*i + j);
>                                                 b = inc + 2*((_segmentsD + 
> 1)*i + j - 1);
>                                                 c = inc + 2*((_segmentsD + 
> 1)*(i - 1) + j - 1);
>                                                 d = inc + 2*((_segmentsD + 
> 1)*(i - 1) + j);
>
>                                                 buildFaces(a, b, c, d, 
> _cubeMaterials.top, false, "top");
>                                                 buildFaces(a+1, b+1, c+1, 
> d+1, _cubeMaterials.bottom, true,
> "bottom");
>                                         }
>                                 }
>                         }
>
>                         inc += 2*(_segmentsW + 1)*(_segmentsD + 1);
>
>                         for (i = 0; i <= _segmentsH; i++) {
>                                 for (j = 0; j <= _segmentsD; j++) {
>
>                                         //create left/right
>                                         _varr.push( makeVertex(_width/2, 
> _height/2 - i*_height/
> _segmentsH, -_depth/2 + j*_depth/_segmentsD) );
>                                         _varr.push( makeVertex(-_width/2, 
> _height/2 - i*_height/
> _segmentsH, -_depth/2 + j*_depth/_segmentsD) );
>
>                                         if (_mappingType == 
> CubeMappingType.NORMAL) {
>                                                 _uvarr.push( 
> makeUV(j/_segmentsH, 1 - i/_segmentsD));
>                                                 _uvarr.push( makeUV(1 - 
> j/_segmentsH, 1 - i/_segmentsD));
>                                         } else {
>                                                 _uvarr.push( makeUV(2/3 + 
> udelta + j*(1 - 6*udelta)/
> (3*_segmentsH), 1 - vdelta - i*(1 - 4*vdelta)/(2*_segmentsD)) );
>                                                 _uvarr.push( makeUV(1/3 - 
> udelta - j*(1 - 6*udelta)/
> (3*_segmentsH), 1 - vdelta - i*(1 - 4*vdelta)/(2*_segmentsD)) );
>                                         }
>
>                                         if (i && j) {
>                                                 a = inc + 2*((_segmentsD + 
> 1)*i + j);
>                                                 b = inc + 2*((_segmentsD + 
> 1)*i + j - 1);
>                                                 c = inc + 2*((_segmentsD + 
> 1)*(i - 1) + j - 1);
>                                                 d = inc + 2*((_segmentsD + 
> 1)*(i - 1) + j);
>
>                                                 buildFaces(a, b, c, d, 
> _cubeMaterials.left, false, "left");
>                                                 buildFaces(a+1, b+1, c+1, 
> d+1, _cubeMaterials.right, true,
> "right");
>                                         }
>                                 }
>                         }
>         }
>
>         /**
>          * Defines the width of the cube. Defaults to 100.
>          */
>         public function get width():Number
>         {
>                 return _width;
>         }
>
>         public function set width(val:Number):void
>         {
>                 if (_width == val)
>                         return;
>
>                 _width = val;
>                 _primitiveDirty = true;
>         }
>
>         /**
>          * Defines the height of the cube. Defaults to 100.
>          */
>         public function get height():Number
>         {
>                 return _height;
>         }
>
>         public function set height(val:Number):void
>         {
>                 if (_height == val)
>                         return;
>
>                 _height = val;
>                 _primitiveDirty = true;
>         }
>
>         /**
>          * Defines the depth of the cube. Defaults to 100.
>          */
>         public function get depth():Number
>         {
>                 return _depth;
>         }
>
>         public function set depth(val:Number):void
>         {
>                 if (_depth == val)
>                         return;
>
>                 _depth = val;
>                 _primitiveDirty = true;
>         }
>
>                 /**
>          * Defines the number of horizontal segments that make up the
> cube. Defaults 1.
>          */
>         public function get segmentsW():Number
>         {
>                 return _segmentsW;
>         }
>
>         public function set segmentsW(val:Number):void
>         {
>                 if (_segmentsW == val)
>                         return;
>
>                 _segmentsW = val;
>                 _primitiveDirty = true;
>         }
>
>                 /**
>          * Defines if the cube should use a single (3 cols/2 rows) map
> spreaded over the whole cube.
>                  * topleft: left, topcenter:front, topright:right
>                  * downleft:back, downcenter:top, downright: bottom
>                  * Default is false.
>          */
>         public function get mappingType():String
>         {
>                 return _mappingType;
>         }
>
>         public function set mappingType(val:String):void
>         {
>                 if (_mappingType == val)
>                         return;
>
>                 _mappingType = val;
>                 _primitiveDirty = true;
>         }
>
>                 /**
>          * Defines if the cube faces should be reversed, like a skybox.
> Default is false.
>          */
>         public function get flip():Boolean
>         {
>                 return _flip;
>         }
>
>         public function set flip(b:Boolean):void
>         {
>                 _flip = b;
>         }
>
>         /**
>          * Defines the number of vertical segments that make up the cube.
> ...
>
> read more »

Reply via email to