using System; using System.Collections.Generic; using System.Linq; using System.Text; using Blacklight.Core; using Blacklight.Core.Drawables; using Blacklight.Core.Cameras; using Azimuth; using Annulus.CSG; using Annulus; using Polygon = Blacklight.Core.Drawables.Polygon; namespace Blacklight.Testbed { public class World { Blacklight.Core.Cameras.MicroscopeCamera camera = null; Scene scene = new Scene(); Cel cel = new Cel(); Collage collage = new Collage(); SpriteSheet sheet; Sprite sprite; QuadraticBezierTriangle bezierTriangle; ClosedQuadraticBezierCurve closedBezierCurve; WindowHandle viewport = null; public World() {} public void Setup() { scene = new Scene(); cel = new Cel(); collage = new Collage(); scene.Cels.Add(cel); cel.AddEntity(collage); AffineMatrix transform; AffineMatrix rotateBy45degrees = new AffineMatrix(Math.PI / 2, Vector.Zero); { var primitive = new Arrow(5, 2); primitive.InsideColor = new Blacklight.Core.Color(0.66, 0.77, 0.5); primitive.ShellColor = new Blacklight.Core.Color(0.33, 0.35, 0.5); primitive.ShellModelSpaceThickness = 0; primitive.ShellPixelThickness = 3; transform = new AffineMatrix(.7, new Vector(100, 100), 10); transform = rotateBy45degrees * transform; collage.AddChild(primitive, transform); } { var primitive = new Rectangle(); primitive.InsideColor = new Blacklight.Core.Color(1, 0, 0.5); primitive.ShellColor = new Blacklight.Core.Color(0, 1, 0.5); primitive.ShellModelSpaceThickness = 0.1; primitive.ShellPixelThickness = 3; transform = new AffineMatrix(.7, new Vector(50, 50), 10); transform.M00 *= 1.112233; transform.M01 *= 3; transform.M10 *= 4; transform.M11 *= 10; transform = rotateBy45degrees * transform; collage.AddChild(primitive, transform); } { var primitive = new Rectangle(); primitive.InsideColor = new Blacklight.Core.Color(1, 0, 0.5); primitive.ShellColor = new Blacklight.Core.Color(0, 1, 0.5); primitive.ShellPixelThickness = 20; transform = new AffineMatrix(.7, new Vector(-150, -150), 10); transform.M00 *= 1.112233; transform.M01 *= 3; transform.M10 *= 4; transform.M11 *= 10; transform = rotateBy45degrees * transform; collage.AddChild(primitive, transform); } { var primitive = new Ellipse(); primitive.InsideColor = new Blacklight.Core.Color(1, 0, 0.5); primitive.ShellColor = new Blacklight.Core.Color(0, 1, 0.5); //primitive.ShellModelSpaceThickness = 0.1; primitive.ShellPixelThickness = 2; transform = new AffineMatrix(0, new Vector(50, -200), 10); //transform.M00 *= 1.001; //transform.M10 *= 2; //transform.M01 *= 0.3; //transform.M11 *= 0.3; /*transform.M00 *= 1.112233; transform.M01 *= 3; transform.M10 *= 4; transform.M11 *= 10;*/ //transform = rotateBy45degrees * transform; collage.AddChild(primitive, transform); } { var primitive = new Ellipse(); primitive.InsideColor = new Blacklight.Core.Color(1, 0, 0, 1); primitive.ShellColor = new Blacklight.Core.Color(0, 1, 0.5); primitive.ShellPixelThickness = 2; //primitive.ShellModelSpaceThickness = 0.1; transform = new AffineMatrix(.7, new Vector(50, -400), 10); transform.M00 *= 1.112233; transform.M01 *= 3; transform.M10 *= 4; transform.M11 *= 10; transform = rotateBy45degrees * transform; collage.AddChild(primitive, transform); } { const int levels = 31; ulong runningSum = 0; const ulong divisor = 0x1 << (levels / 2); int j = levels - 1; for (int i = levels / 2; i >= -levels / 2; --i, --j) { ulong currentLevel = (ulong)(0x1 << j); double radius = (double)(currentLevel) / (double)(divisor); var primitive = new Ellipse(); primitive.InsideColor = new Blacklight.Core.Color(1, 1, 0, 0.5); primitive.ShellColor = new Blacklight.Core.Color(0, 1, 1, 0.5); //primitive.ShellPixelThickness = ; primitive.ShellModelSpaceThickness = 0.5; transform = new AffineMatrix(0, new Vector(250 + (double)runningSum / (double)divisor + radius, 150), radius); collage.AddChild(primitive, transform); runningSum += 2 * currentLevel; } } // Test polygon if(true) { var vertices = new PerforatedPolygon(new SimplePolygon(new Vector[] { new Vector(-2, 3), new Vector(2, 3), new Vector(2, -3), new Vector(-2, -3), }), new SimplePolygon[] { new SimplePolygon(new Vector[] { new Vector(1, 1), new Vector(1, 2), new Vector(-1, 2), new Vector(-1, 1), }), new SimplePolygon(new Vector[] { new Vector(1, -2), new Vector(1, -1), new Vector(-1, -1), new Vector(-1, -2), })}); { Polygon poly = new Polygon(vertices); var primitive = poly; primitive.InsideColor = new Blacklight.Core.Color(1, 0, 0); primitive.ShellColor = new Blacklight.Core.Color(0, 1, 0); primitive.ShellPixelThickness = 3; primitive.ShellModelSpaceThickness = 0; transform = new AffineMatrix(0.7, new Vector(0, 0), 10); collage.AddChild(primitive, transform); } } { sprite = new Sprite { Sheet = sheet, Frame = new System.Drawing.Point((frameCounter++ / 100) % 10, 0), }; transform = new AffineMatrix(0, new Vector(-100, 0), 50); collage.AddChild(sprite, transform); } { bezierTriangle = new QuadraticBezierTriangle { InsideColor = new Blacklight.Core.Color(1, 1, 1), ShellColor = new Blacklight.Core.Color(0, 0, 0), VertexA = new Vector(0, 0), VertexB = new Vector(-10, 10), VertexC = new Vector(10, 0), }; transform = new AffineMatrix(0, new Vector(-50, 0), 1); collage.AddChild(bezierTriangle, transform); } { closedBezierCurve = new ClosedQuadraticBezierCurve(new Vector[] { new Vector(0, 0), new Vector(-5, 0), new Vector(-10, 10), new Vector(0, 7), new Vector(10, 10), new Vector(5, -5), }); closedBezierCurve.InsideColor = new Blacklight.Core.Color(1, 0.75, 1); closedBezierCurve.ShellColor = new Blacklight.Core.Color(0, 0, 0, 1); transform = new AffineMatrix(0, new Vector(-50, -25), 2); collage.AddChild(closedBezierCurve, transform); } } private int frameCounter = 0; public void BindToViewport(ViewportControl control) { this.viewport = control.DrawableSurface; this.camera = control.Camera; var assembly = System.Reflection.Assembly.GetExecutingAssembly(); using (var stream = assembly.GetManifestResourceStream("Blacklight.Testbed.rogueSheet.png")) { sheet = viewport.CreateSpriteSheet(stream, new System.Drawing.Size(32, 32), borderSize: 0); } Setup(); viewport.Invalidated += delegate(object sender, EventArgs e) { DrawScene(); }; } public void DrawScene() { sprite.Frame = new System.Drawing.Point(frameCounter++ / 4 % 10, 0); viewport.DrawScene(scene, camera); } } }