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 »
