Hello Sandy 3D :)
package
{
import flash.display.*;
import flash.filters.*;
import flash.geom.*;
import sandy.core.data.*;
import sandy.core.scenegraph.*;
import sandy.core.*;
import sandy.extrusion.data.*;
import sandy.extrusion.*;
import sandy.materials.*;
import sandy.materials.attributes.*;
import sandy.primitive.*;
import sandy.*;
[SWF(width="465", height="465", backgroundColor="#000000", frameRate="20")]
public class FlashTest extends Sprite
{
private var red:BitmapMaterial;
private var scene:Scene3D;
private var stuff:TransformGroup;
public function FlashTest () {
scene = new Scene3D ("scene", this, new Camera3D (465, 465), new Group ("root"));
scene.camera.z = -1000; stuff = new TransformGroup ("stuff"); scene.root.addChild (stuff);
// get the logo
var logo:Bitmap = Logo.GetBitmap (); logo.y = 465 - 19; addChild (logo);
// make materials
red = new BitmapMaterial (makeSeamlessTextureFromLogo (logo),
new MaterialAttributes (new VertexNormalAttributes (50, 5, 0x007F00)));
var ph:PhongAttributes = new PhongAttributes (true);
ph.specular = 2; ph.gloss = 5; ph.onlySpecular = true;
var yel:ColorMaterial = new ColorMaterial (0xFFFFAF, 1,
new MaterialAttributes (ph)); yel.lightingEnable = true;
// glowing sphere
var radius:Number = 100;
var sphere:Sphere = new Sphere ("sphere", radius);
sphere.appearance = new Appearance (yel);
sphere.container.filters = [ new GlowFilter (0xFFFFAF, 1, 160, 160, 1) ];
stuff.addChild (sphere);
// make... emm... things
var profile:Polygon2D = new Polygon2D (
[new Point (-10, -5), new Point (+10, -5), new Point (0, +10)]);
for (var i:int = 0; i < 6; i++) {
var thing:Curve3D = new Curve3D;
var up:Point3D = new Point3D (0, 1, 0);
var t:Point3D = new Point3D (r(), r(), r());
var len:Number = 0.5 * (1 + Math.random ());
for (var j:int = 0; j < 4; j++) {
// randomize direction
var k:Number = 0.1 * (1.5 * j + 1);
t.x += k * r(); t.y += k * r(); t.z += k * r(); t.normalize ();
thing.t.push (t.clone ());
// progressive position
var v:Point3D = t.clone (); v.scale (radius * (0.9 + len * j));
thing.v.push (v);
// select any normal vector
var n:Point3D = up.cross (t); n.normalize ();
thing.n.push (n);
// scale
thing.s.push (3 - j);
}
var ext:Extrusion = new Extrusion ("thing" + i, profile, thing.toSections (), false, false);
ext.appearance = new Appearance (red); stuff.addChild (ext);
}
// spin it
addEventListener ("enterFrame", loop);
}
private var tw:Number = 1, th:Number = 3, tu:Number = 0, tv:Number = 0;
private function loop (e:*):void {
tv -= 0.05; if (tv < -1) tv += 1;
red.setTiling (tw, th, tu, tv);
stuff.rotateY += 2; scene.render();
}
private function makeSeamlessTextureFromLogo (logo:Bitmap):BitmapData {
var pattern:BitmapData = new BitmapData (22, 19 * 2 - 1, false, 0);
pattern.draw (logo.bitmapData, new Matrix (+1, 0, 0, +1, -100));
pattern.draw (logo.bitmapData, new Matrix (-1, 0, 0, -1, +363.5, 19 * 2 - 1));
return pattern;
}
private function r ():Number {
var v:Number = 0; while (v == 0) v = Math.random () - Math.random (); return v;
}
}
}