[Sandy] [sandy commit] r190 - in trunk/sandy/as2/trunk/sources/sandy: core core/light primitive skin util
codesite-noreply@google.com
codesite-noreply at google.com
Sat Apr 21 11:32:01 EDT 2007
Author: marvotron
Date: Sat Apr 21 08:31:44 2007
New Revision: 190
Added:
trunk/sandy/as2/trunk/sources/sandy/util/ColorUtil.as
Modified:
trunk/sandy/as2/trunk/sources/sandy/core/Object3D.as
trunk/sandy/as2/trunk/sources/sandy/core/World3D.as
trunk/sandy/as2/trunk/sources/sandy/core/light/Light3D.as
trunk/sandy/as2/trunk/sources/sandy/primitive/Box.as
trunk/sandy/as2/trunk/sources/sandy/skin/MixedSkin.as
trunk/sandy/as2/trunk/sources/sandy/skin/MovieSkin.as
trunk/sandy/as2/trunk/sources/sandy/skin/PrelitTextureSkin.as
trunk/sandy/as2/trunk/sources/sandy/skin/SimpleColorSkin.as
trunk/sandy/as2/trunk/sources/sandy/skin/TextureSkin.as
Log:
New, switchable lighting model.
Modified: trunk/sandy/as2/trunk/sources/sandy/core/Object3D.as
==============================================================================
--- trunk/sandy/as2/trunk/sources/sandy/core/Object3D.as (original)
+++ trunk/sandy/as2/trunk/sources/sandy/core/Object3D.as Sat Apr 21 08:31:44 2007
@@ -277,7 +277,7 @@
_sb.addEventListener( SkinEvent.onUpdateEVENT, this, __onSkinUpdated );
_sb.addEventListener( SkinEvent.onInitEVENT, this, __onSkinInited );
//
- __updateTextureMatrices(_sb);
+ __updateTextureMatrices( _sb );
//
_needRedraw = true;
return true;
Modified: trunk/sandy/as2/trunk/sources/sandy/core/World3D.as
==============================================================================
--- trunk/sandy/as2/trunk/sources/sandy/core/World3D.as (original)
+++ trunk/sandy/as2/trunk/sources/sandy/core/World3D.as Sat Apr 21 08:31:44 2007
@@ -66,6 +66,11 @@
public static var onContainerCreatedEVENT:EventType = new EventType( 'onContainerCreated' );
/**
+ * Flag to control lighting model. If true then lit objects have full range from black to white.
+ * If its false (the default) they just range from black to their normal appearance.
*/
+ public static var GO_BRIGHT:Boolean = false;
+
+ /**
* Private Constructor.
*
* <p>You can have only one World3D</p>
Modified: trunk/sandy/as2/trunk/sources/sandy/core/light/Light3D.as
==============================================================================
--- trunk/sandy/as2/trunk/sources/sandy/core/light/Light3D.as (original)
+++ trunk/sandy/as2/trunk/sources/sandy/core/light/Light3D.as Sat Apr 21 08:31:44 2007
@@ -35,8 +35,9 @@
*/
public static var onLightUpdatedEVENT:EventType = new EventType( 'onLightUpdated' );
- /*
+ /**
* Maximum value accepted. If the default value (150) seems too big or too small for you, you can change it.
+ * But be aware that the actual lighting calculations are normalised i.e. 0 -> MAX_POWER becomes 0 -> 1
*/
public static var MAX_POWER:Number = 150;
Modified: trunk/sandy/as2/trunk/sources/sandy/primitive/Box.as
==============================================================================
--- trunk/sandy/as2/trunk/sources/sandy/primitive/Box.as (original)
+++ trunk/sandy/as2/trunk/sources/sandy/primitive/Box.as Sat Apr 21 08:31:44 2007
@@ -221,7 +221,6 @@
var skin:Skin = skins[skinIndex];
aFaces[n].setSkin(skin);
}
-
_needRedraw = true;
}
Modified: trunk/sandy/as2/trunk/sources/sandy/skin/MixedSkin.as
==============================================================================
--- trunk/sandy/as2/trunk/sources/sandy/skin/MixedSkin.as (original)
+++ trunk/sandy/as2/trunk/sources/sandy/skin/MixedSkin.as Sat Apr 21 08:31:44 2007
@@ -22,6 +22,7 @@
import sandy.skin.Skin;
import sandy.skin.SkinType;
import sandy.util.NumberUtil;
+import sandy.util.ColorUtil;
import sandy.skin.BasicSkin;
/**
@@ -135,23 +136,23 @@
mc.filters = _filters;
// --
var col:Number = _colorBkg;
+
if( _useLight )
{
- var lightStrength:Number = World3D.getInstance().getLight().calculate(face.createNormale()) +
- World3D.getInstance().getAmbientLight();
- // --
- var r:Number = ( col >> 16 )& 0xFF;
- var g:Number = ( col >> 8 ) & 0xFF;
- var b:Number = ( col ) & 0xFF;
- // --
- r = NumberUtil.constrain( r*(lightStrength), 0, 255 );
- g = NumberUtil.constrain( g*(lightStrength), 0, 255 );
- b = NumberUtil.constrain( b*(lightStrength), 0, 255 );
- // --
- col = r << 16 | g << 8 | b;
+ if(World3D.GO_BRIGHT)
+ {
+ var lightStrength:Number = World3D.getInstance().getLight().calculate(face.createNormale()) +
+ World3D.getInstance().getAmbientLight();
+ col = ColorUtil.calculateLitColour(col, lightStrength);
+ }
+ else
+ {
+ col = computeColor1(col, face);
+ }
}
mc.lineStyle( _thickness, _colorLine, _alphaLine );
mc.beginFill( col , _alphaBkg );
+
}
/**
@@ -162,8 +163,25 @@
public function end( f:IPolygon, mc:MovieClip ):Void
{
mc.endFill();
+ mc.lineStyle(0,0,0);
}
-
+
+ private function computeColor1( col:Number,face:IPolygon ):Number
+ {
+ var lightStrength:Number = World3D.getInstance().getLight().calculate(face.createNormale()) +
+ World3D.getInstance().getAmbientLight();
+ // --
+ var r:Number = ( col >> 16 )& 0xFF;
+ var g:Number = ( col >> 8 ) & 0xFF;
+ var b:Number = ( col ) & 0xFF;
+ // --
+ r = NumberUtil.constrain( r*lightStrength, 0, 255 );
+ g = NumberUtil.constrain( g*lightStrength, 0, 255 );
+ b = NumberUtil.constrain( b*lightStrength, 0, 255 );
+ // --
+ return (r << 16 | g << 8 | b);
+ }
+
public function toString( Void ):String
{
return 'sandy.skin.MixedSkin' ;
Modified: trunk/sandy/as2/trunk/sources/sandy/skin/MovieSkin.as
==============================================================================
--- trunk/sandy/as2/trunk/sources/sandy/skin/MovieSkin.as (original)
+++ trunk/sandy/as2/trunk/sources/sandy/skin/MovieSkin.as Sat Apr 21 08:31:44 2007
@@ -300,18 +300,35 @@
return r;
}
- private function __getBrightnessTransform( scale:Number ) : Array
+ /**
+ * Creates a brightness transformation matrix according to the supplied brightness level.
+ * If the World3D.GO_BRIGHT flag is set then the rgb offsets are used (5th column)
+ * If the flag is not set then the rgb scaling components are used instead.
*/
+ private function __getBrightnessTransform( brightness:Number ) : Array
{
- var s = scale;
- var o:Number = 0;
- //
- return new Array
- (
- s , 0.0 , 0.0 , 0.0 , o,
- 0.0 , s , 0.0 , 0.0 , o,
- 0.0 , 0.0 , s , 0.0 , o,
- 0.0 , 0.0 , 0.0 , 1.0 , o
- );
+ if(World3D.GO_BRIGHT)
+ {
+ var o:Number = (brightness * 512) - 256;
+ return new Array
+ (
+ 1 , 0.0 , 0.0 , 0.0 , o,
+ 0.0 , 1 , 0.0 , 0.0 , o,
+ 0.0 , 0.0 , 1 , 0.0 , o,
+ 0.0 , 0.0 , 0.0 , 1.0 , 1
+ );
+ }
+ else
+ {
+ var s:Number = brightness;
+ return new Array
+ (
+ s , 0.0 , 0.0 , 0.0 , 0,
+ 0.0 , s , 0.0 , 0.0 , 0,
+ 0.0 , 0.0 , s , 0.0 , 0,
+ 0.0 , 0.0 , 0.0 , 1.0 , 0
+ );
+
+ }
}
private function onLoadStart (target:MovieClip):Void
@@ -339,7 +356,6 @@
_mc._visible = false;
_initialized = true;
_animated = target._totalframes > 1;
- // _eOnUpdate.needsTextureUpdate = true;
setAnimateUpdate(_animate && _animated);
//broadcastEvent(_eOnUpdate);
broadcastEvent(_eOnInit);
Modified: trunk/sandy/as2/trunk/sources/sandy/skin/PrelitTextureSkin.as
==============================================================================
--- trunk/sandy/as2/trunk/sources/sandy/skin/PrelitTextureSkin.as (original)
+++ trunk/sandy/as2/trunk/sources/sandy/skin/PrelitTextureSkin.as Sat Apr 21 08:31:44 2007
@@ -65,10 +65,12 @@
public function updateTextures( t:BitmapData ):Void
{
texture = t;
+ var offsetMax = World3D.GO_BRIGHT ? 512 : 256;
+
for(var n=0;n<_textureCount;n++)
{
_tmp = t.clone();
- var off:Number = (n * (255 / _textureCount)) - 255;
+ var off:Number = (n * (offsetMax / (_textureCount-1))) - 256;
_tmp.colorTransform(_tmp.rectangle, new ColorTransform(1, 1, 1, 1, off, off, off, 0));
_prelit[n] = _tmp;
Modified: trunk/sandy/as2/trunk/sources/sandy/skin/SimpleColorSkin.as
==============================================================================
--- trunk/sandy/as2/trunk/sources/sandy/skin/SimpleColorSkin.as (original)
+++ trunk/sandy/as2/trunk/sources/sandy/skin/SimpleColorSkin.as Sat Apr 21 08:31:44 2007
@@ -23,6 +23,7 @@
import sandy.skin.SkinType;
import sandy.skin.BasicSkin;
import sandy.util.NumberUtil;
+import sandy.util.ColorUtil;
/**
* SimpleColorSkin
@@ -99,18 +100,27 @@
var col:Number = _color;
if( _useLight )
{
- var lightStrength:Number = World3D.getInstance().getLight().calculate(face.createNormale()) +
- World3D.getInstance().getAmbientLight();
- // --
- var r:Number = ( col >> 16 )& 0xFF;
- var g:Number = ( col >> 8 ) & 0xFF;
- var b:Number = ( col ) & 0xFF;
- // --
- r = NumberUtil.constrain( r*(lightStrength), 0, 255 );
- g = NumberUtil.constrain( g*(lightStrength), 0, 255 );
- b = NumberUtil.constrain( b*(lightStrength), 0, 255 );
- // --
- col = r << 16 | g << 8 | b;
+ if(World3D.GO_BRIGHT)
+ {
+ var lightStrength:Number = World3D.getInstance().getLight().calculate(face.createNormale()) +
+ World3D.getInstance().getAmbientLight();
+ col = ColorUtil.calculateLitColour(col, lightStrength);
+ }
+ else
+ {
+ var lightStrength:Number = World3D.getInstance().getLight().calculate(face.createNormale()) +
+ World3D.getInstance().getAmbientLight();
+ // --
+ var r:Number = ( col >> 16 )& 0xFF;
+ var g:Number = ( col >> 8 ) & 0xFF;
+ var b:Number = ( col ) & 0xFF;
+ // --
+ r = NumberUtil.constrain( r*lightStrength, 0, 255 );
+ g = NumberUtil.constrain( g*lightStrength, 0, 255 );
+ b = NumberUtil.constrain( b*lightStrength, 0, 255 );
+ // --
+ col = r << 16 | g << 8 | b;
+ }
}
mc.beginFill( col, _alpha );
}
Modified: trunk/sandy/as2/trunk/sources/sandy/skin/TextureSkin.as
==============================================================================
--- trunk/sandy/as2/trunk/sources/sandy/skin/TextureSkin.as (original)
+++ trunk/sandy/as2/trunk/sources/sandy/skin/TextureSkin.as Sat Apr 21 08:31:44 2007
@@ -182,23 +182,31 @@
}
}
- /**
- *
- * @param
- * @return
- */
- private function __getBrightnessTransform( scale:Number ) : Array
+ private function __getBrightnessTransform( brightness:Number ) : Array
{
- var s = scale;
- var o:Number = 0;
- //
- return new Array
- (
- s , 0.0 , 0.0 , 0.0 , o,
- 0.0 , s , 0.0 , 0.0 , o,
- 0.0 , 0.0 , s , 0.0 , o,
- 0.0 , 0.0 , 0.0 , 1.0 , o
- );
+ if(World3D.GO_BRIGHT)
+ {
+ var o:Number = (brightness * 512) - 256;
+ return new Array
+ (
+ 1 , 0.0 , 0.0 , 0.0 , o,
+ 0.0 , 1 , 0.0 , 0.0 , o,
+ 0.0 , 0.0 , 1 , 0.0 , o,
+ 0.0 , 0.0 , 0.0 , 1.0 , 0
+ );
+ }
+ else
+ {
+ var s:Number = brightness;
+ return new Array
+ (
+ s , 0.0 , 0.0 , 0.0 , 0,
+ 0.0 , s , 0.0 , 0.0 , 0,
+ 0.0 , 0.0 , s , 0.0 , 0,
+ 0.0 , 0.0 , 0.0 , 1.0 , 0
+ );
+
+ }
}
/**
Added: trunk/sandy/as2/trunk/sources/sandy/util/ColorUtil.as
==============================================================================
--- (empty file)
+++ trunk/sandy/as2/trunk/sources/sandy/util/ColorUtil.as Sat Apr 21 08:31:44 2007
@@ -0,0 +1,116 @@
+class sandy.util.ColorUtil
+{
+ /**
+ * Calculate the colour for a particular lighting strength.
+ * This converts the supplied pre-multiplied RGB colour into HSL
+ * then modifies the L according to the light strength.
+ * The result is then mapped back into the RGB space.
*/
+ public static function calculateLitColour(col:Number, lightStrength:Number):Number
+ {
+ var r:Number = ( col >> 16 )& 0xFF;
+ var g:Number = ( col >> 8 ) & 0xFF;
+ var b:Number = ( col ) & 0xFF;
+
+ // divide by 256
+ r *= 0.00390625;
+ g *= 0.00390625;
+ b *= 0.00390625;
+
+ var min, mid, max, delta;
+ var l, s, h, F, n = 0;
+
+ var a:Array = [r,g,b];
+ a.sort();
+
+ min = a[0];
+ mid = a[1];
+ max = a[2];
+
+ var range:Number = max - min;
+
+ l = (min + max) * 0.5;
+
+ if (l == 0)
+ {
+ s = 1;
+ }
+ else
+ {
+ delta = range * 0.5;
+
+ if (l < 0.5)
+ {
+ s = delta / l;
+ }
+ else
+ {
+ s = delta / (1 - l);
+ }
+
+ if (range != 0)
+ {
+ while (true)
+ {
+ if (r == max)
+ {
+ if (b == min) n = 0; else n = 5;
+ break;
+ }
+
+ if (g == max)
+ {
+ if (b == min) n = 1; else n = 2;
+ break;
+ }
+
+ if (r == min) n = 3; else n = 4;
+ break;
+ }
+
+ if ((n % 2) == 0)
+ {
+ F = mid - min;
+ }
+ else
+ {
+ F = max - mid;
+ }
+
+ F = F / range;
+ h = 60 * (n + F);
+ }
+ }
+
+ if (lightStrength < 0.5)
+ {
+ delta = s * lightStrength;
+ }
+ else
+ {
+ delta = s * (1 - lightStrength);
+ }
+
+ min = lightStrength - delta;
+ max = lightStrength + delta;
+
+ n = Math.floor(h / 60);
+ F = (h - n*60) * delta / 30;
+ n %= 6;
+
+ var mu:Number = min + F;
+ var md:Number = max - F;
+
+ switch (n)
+ {
+ case 0: r = max; g= mu; b= min; break;
+ case 1: r = md; g= max; b= min; break;
+ case 2: r = min; g= max; b= mu; break;
+ case 3: r = min; g= md; b= max; break;
+ case 4: r = mu; g= min; b= max; break;
+ case 5: r = max; g= min; b= md; break;
+ }
+
+ return ((r * 256) << 16 | (g * 256) << 8 | (b * 256));
+ }
+
+}
\ No newline at end of file
More information about the Sandy
mailing list