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.
Defaults 1.
         */
        public function get segmentsH():Number
        {
                return _segmentsH;
        }

        public function set segmentsH(val:Number):void
        {
                if (_segmentsH == val)
                        return;

                _segmentsH = val;
                _primitiveDirty = true;
        }

                /**
                 * Defines the number of vertical segments that make up the 
cube.
Defaults 1.
                 */
                public function get segmentsD():Number
                {
                        return _segmentsD;
                }

                public function set segmentsD(val:Number):void
                {
                        if (_segmentsD == val)
                                return;

                        _segmentsD = val;
                        _primitiveDirty = true;
                }

                /**
         * Defines the face materials of the cube.
         */
        public function get cubeMaterials():CubeMaterialsData
        {
                return _cubeMaterials;
        }

        public function set cubeMaterials(val:CubeMaterialsData):void
        {
                if (_cubeMaterials == val)
                        return;

                if (_cubeMaterials)
                        
_cubeMaterials.addOnMaterialChange(onCubeMaterialChange);

                _cubeMaterials = val;

                _cubeMaterials.addOnMaterialChange(onCubeMaterialChange);
        }
                /**
                 * Creates a new <code>Cube</code> object.
                 *
                 * @param       init                    [optional]      An 
initialisation object for specifying
default instance properties.
                 * Properties of the init object: width, height, depth, 
segmentsH,
segmentsW, flip, map6, material or faces (as CubeMaterialsData)
                 */
        public function Cube(init:Object = null)
        {
            super(init);
            _width  = ini.getNumber("width",  100, {min:0});
            _height = ini.getNumber("height", 100, {min:0});
            _depth  = ini.getNumber("depth",  100, {min:0});
                        _flip = ini.getBoolean("flip", false);
            _cubeMaterials  = ini.getCubeMaterials("faces");
                        _segmentsW = ini.getInt("segmentsW", 1, {min:1});
            _segmentsH = ini.getInt("segmentsH", 1, {min:1});
                        _segmentsD = ini.getInt("segmentsD", 1, {min:1});
                        _mappingType = ini.getString("mappingType",
CubeMappingType.NORMAL);

                        if (!_cubeMaterials)
                                _cubeMaterials  = 
ini.getCubeMaterials("cubeMaterials");

                        if (!_cubeMaterials)
                                _cubeMaterials = new CubeMaterialsData();

                        
_cubeMaterials.addOnMaterialChange(onCubeMaterialChange);

                        type = "Cube";
                        url = "primitive";
        }
    }
}

Reply via email to