[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