diff --git a/src/away3d/entities/SegmentSet.as b/src/away3d/entities/SegmentSet.as index 74285cae3..36afa1365 100644 --- a/src/away3d/entities/SegmentSet.as +++ b/src/away3d/entities/SegmentSet.as @@ -1,4 +1,4 @@ -package away3d.entities +package away3d.entities { import away3d.arcane; import away3d.animators.IAnimator; @@ -14,6 +14,7 @@ import away3d.primitives.LineSegment; import away3d.primitives.data.Segment; import away3d.library.assets.AssetType; + import flash.display.BlendMode; import flash.display3D.Context3D; import flash.display3D.Context3DVertexBufferFormat; @@ -53,6 +54,7 @@ _segments = new Dictionary(); material = new SegmentMaterial(); + material.blendMode = BlendMode.LAYER; } /** @@ -248,7 +250,10 @@ var startR:Number = segment._startR, startG:Number = segment._startG, startB:Number = segment._startB; var endR:Number = segment._endR, endG:Number = segment._endG, endB:Number = segment._endB; var index:uint = segment.index; - var t:Number = segment.thickness; + var st:Number = segment.startThickness; + var et:Number = segment.endThickness; + var sa:Number = segment.startAlpha; + var ea:Number = segment.endAlpha; var subSet:SubSet = _subSets[segment.subSetIndex]; var vertices:Vector. = subSet.vertices; @@ -259,11 +264,11 @@ vertices[index++] = endX; vertices[index++] = endY; vertices[index++] = endZ; - vertices[index++] = t; + vertices[index++] = st; vertices[index++] = startR; vertices[index++] = startG; vertices[index++] = startB; - vertices[index++] = 1; + vertices[index++] = sa; vertices[index++] = endX; vertices[index++] = endY; @@ -271,11 +276,11 @@ vertices[index++] = startX; vertices[index++] = startY; vertices[index++] = startZ; - vertices[index++] = -t; + vertices[index++] = -et; vertices[index++] = endR; vertices[index++] = endG; vertices[index++] = endB; - vertices[index++] = 1; + vertices[index++] = ea; vertices[index++] = startX; vertices[index++] = startY; @@ -283,11 +288,11 @@ vertices[index++] = endX; vertices[index++] = endY; vertices[index++] = endZ; - vertices[index++] = -t; + vertices[index++] = -st; vertices[index++] = startR; vertices[index++] = startG; vertices[index++] = startB; - vertices[index++] = 1; + vertices[index++] = sa; vertices[index++] = endX; vertices[index++] = endY; @@ -295,11 +300,11 @@ vertices[index++] = startX; vertices[index++] = startY; vertices[index++] = startZ; - vertices[index++] = t; + vertices[index++] = et; vertices[index++] = endR; vertices[index++] = endG; vertices[index++] = endB; - vertices[index++] = 1; + vertices[index++] = ea; subSet.vertexBufferDirty = true; diff --git a/src/away3d/materials/SegmentMaterial.as b/src/away3d/materials/SegmentMaterial.as index b475487b8..3280bb62e 100644 --- a/src/away3d/materials/SegmentMaterial.as +++ b/src/away3d/materials/SegmentMaterial.as @@ -2,6 +2,7 @@ package away3d.materials { import away3d.arcane; import away3d.materials.passes.SegmentPass; + import flash.display.BlendMode; use namespace arcane; @@ -26,6 +27,13 @@ package away3d.materials bothSides = true; addPass(_screenPass = new SegmentPass(thickness)); _screenPass.material = this; + blendMode = BlendMode.NORMAL; + } + + override public function set blendMode(value:String):void + { + super.blendMode = value; + _screenPass.setBlendMode(value); } } } diff --git a/src/away3d/primitives/data/Segment.as b/src/away3d/primitives/data/Segment.as index 0308e27b6..4f877b42e 100644 --- a/src/away3d/primitives/data/Segment.as +++ b/src/away3d/primitives/data/Segment.as @@ -10,7 +10,8 @@ package away3d.primitives.data public class Segment { arcane var _segmentsBase:SegmentSet; - arcane var _thickness:Number; + arcane var _startThickness:Number; + arcane var _endThickness:Number; arcane var _start:Vector3D; arcane var _end:Vector3D; arcane var _startR:Number; @@ -24,13 +25,16 @@ package away3d.primitives.data private var _subSetIndex:int = -1; private var _startColor:uint; private var _endColor:uint; + private var _startAlpha:Number; + private var _endAlpha:Number; public function Segment(start:Vector3D, end:Vector3D, anchor:Vector3D, colorStart:uint = 0x333333, colorEnd:uint = 0x333333, thickness:Number = 1):void { // TODO: not yet used: for CurveSegment support anchor = null; - _thickness = thickness*.5; + _startThickness = thickness*.5; + _endThickness = thickness*.5; // TODO: add support for curve using anchor v1 // Prefer removing v1 from this, and make Curve a separate class extending Segment? (- David) _start = start; @@ -39,20 +43,24 @@ package away3d.primitives.data endColor = colorEnd; } - public function updateSegment(start:Vector3D, end:Vector3D, anchor:Vector3D, colorStart:uint = 0x333333, colorEnd:uint = 0x333333, thickness:Number = 1):void + public function updateSegment(start:Vector3D, end:Vector3D, anchor:Vector3D, colorStart:uint = 0x333333, colorEnd:uint = 0x333333, startThickness:Number = 1, endThickness:Number = NaN, alphaStart:Number = 1, alphaEnd:Number = 1):void { // TODO: not yet used: for CurveSegment support anchor = null; _start = start; _end = end; + _startAlpha = alphaStart; + _endAlpha = alphaEnd; + if (_startColor != colorStart) startColor = colorStart; if (_endColor != colorEnd) endColor = colorEnd; - _thickness = thickness*.5; + _startThickness = startThickness*.5; + _endThickness = (isNaN(endThickness) ? startThickness : endThickness) *.5; update(); } @@ -84,17 +92,37 @@ package away3d.primitives.data update(); } - /** - * Defines the ending vertex. - */ public function get thickness():Number { - return _thickness*2; + return _startThickness*2; } public function set thickness(value:Number):void { - _thickness = value*.5; + _startThickness = value*.5; + _endThickness = value*.5; + update(); + } + + public function get startThickness():Number + { + return _startThickness*2; + } + + public function set startThickness(value:Number):void + { + _startThickness = value*.5; + update(); + } + + public function get endThickness():Number + { + return _endThickness*2; + } + + public function set endThickness(value:Number):void + { + _endThickness = value*.5; update(); } @@ -136,6 +164,30 @@ package away3d.primitives.data update(); } + public function get startAlpha():Number + { + return _startAlpha; + } + + public function set startAlpha(value:Number):void + { + _startAlpha = value; + + update(); + } + + public function get endAlpha():Number + { + return _endAlpha; + } + + public function set endAlpha(value:Number):void + { + _endAlpha = value; + + update(); + } + public function dispose():void { _start = null;