public async Task ScaleAndRotateMaintainsCorrectAabb() { { // create a simple cube with translation var root = new Object3D(); var cube = await CubeObject3D.Create(20, 20, 20); cube.Matrix = Matrix4X4.CreateTranslation(50, 60, 10); root.Children.Add(cube); Assert.AreEqual(2, root.DescendantsAndSelf().Count()); var preScaleAabb = root.GetAxisAlignedBoundingBox(); // add a scale to it (that is not scaled) var scaleObject = new ScaleObject3D(cube); // ensure that the object did not move Assert.IsTrue(scaleObject.ScaleAbout.Equals(Vector3.Zero), "The objects have been moved to be scalling about 0."); Assert.AreEqual(4, root.DescendantsAndSelf().Count()); var postScaleAabb = root.GetAxisAlignedBoundingBox(); Assert.IsTrue(preScaleAabb.Equals(postScaleAabb, .001)); Assert.AreEqual(cube, scaleObject.UntransformedChildren.First(), "There is no undo buffer, there should not have been a clone"); var rotateScaleObject = new RotateObject3D_2(cube); // ensure that the object did not move Assert.AreEqual(6, root.DescendantsAndSelf().Count()); var postRotateScaleAabb = root.GetAxisAlignedBoundingBox(); Assert.IsTrue(preScaleAabb.Equals(postRotateScaleAabb, .001)); Assert.AreEqual(cube, rotateScaleObject.UntransformedChildren.First(), "There is no undo buffer, there should not have been a clone"); } }
public void ScaleObjectMantainsCorrectAabb() { // build cube with scale and undo { // create a simple cube with translation var root = new Object3D(); var cube = CubeObject3D.Create(20, 20, 20); cube.Matrix = Matrix4X4.CreateTranslation(50, 60, 10); root.Children.Add(cube); Assert.AreEqual(2, root.DescendantsAndSelf().Count()); var preScaleAabb = root.GetAxisAlignedBoundingBox(); var undoBuffer = new UndoBuffer(); // add a scale to it (that is not scaled) var scaleObject = new ScaleObject3D(); scaleObject.WrapItems(new IObject3D[] { cube }, undoBuffer); // ensure that the object did not move Assert.IsTrue(scaleObject.ScaleAbout.Equals(Vector3.Zero), "The objects have been moved to be scalling about 0."); Assert.AreEqual(4, root.DescendantsAndSelf().Count()); var postScaleAabb = root.GetAxisAlignedBoundingBox(); Assert.IsTrue(preScaleAabb.Equals(postScaleAabb, .001)); Assert.AreNotEqual(cube, scaleObject.UntransformedChildren.First(), "There is an undo buffer, there should have been a clone"); } // build cube with scale { // create a simple cube with translation var root = new Object3D(); var cube = CubeObject3D.Create(20, 20, 20); cube.Matrix = Matrix4X4.CreateTranslation(50, 60, 10); root.Children.Add(cube); Assert.AreEqual(2, root.DescendantsAndSelf().Count()); var preScaleAabb = root.GetAxisAlignedBoundingBox(); // add a scale to it (that is not scaled) var scaleObject = new ScaleObject3D(cube); // ensure that the object did not move Assert.IsTrue(scaleObject.ScaleAbout.Equals(Vector3.Zero), "The objects have been moved to be scalling about 0."); Assert.AreEqual(4, root.DescendantsAndSelf().Count()); var postScaleAabb = root.GetAxisAlignedBoundingBox(); Assert.IsTrue(preScaleAabb.Equals(postScaleAabb, .001)); Assert.AreEqual(cube, scaleObject.UntransformedChildren.First(), "There is no undo buffer, there should not have been a clone"); } }
public override Task Rebuild() { IObject3D cancerRibbonStl = Object3D.Load("Cancer_Ribbon.stl", CancellationToken.None); cancerRibbonStl = new RotateObject3D(cancerRibbonStl, MathHelper.DegreesToRadians(90)); var letterPrinter = new TypeFacePrinter(NameToWrite.ToUpper(), new StyledTypeFace(ApplicationController.GetTypeFace(Font), 12)); IObject3D nameMesh = new Object3D() { Mesh = VertexSourceToMesh.Extrude(letterPrinter, 5) }; AxisAlignedBoundingBox textBounds = nameMesh.GetAxisAlignedBoundingBox(); var textArea = new Vector2(25, 6); double scale = Math.Min(textArea.X / textBounds.XSize, textArea.Y / textBounds.YSize); nameMesh = new ScaleObject3D(nameMesh, scale, scale, 2 / textBounds.ZSize); nameMesh = new AlignObject3D(nameMesh, FaceAlign.Bottom | FaceAlign.Front, cancerRibbonStl, FaceAlign.Top | FaceAlign.Front, 0, 0, -1); nameMesh = new SetCenterObject3D(nameMesh, cancerRibbonStl.GetCenter(), true, false, false); nameMesh = new RotateObject3D(nameMesh, 0, 0, MathHelper.DegreesToRadians(50)); nameMesh = new TranslateObject3D(nameMesh, -37, -14, -1); // output two meshes for card holder and text this.Children.Modify(list => { list.Clear(); list.Add(cancerRibbonStl); list.Add(nameMesh); }); this.Mesh = null; this.Invalidate(InvalidateType.Children); return(Task.CompletedTask); }
public override async Task Rebuild() { this.DebugDepth("Rebuild"); using (RebuildLock()) { var currentAssetPath = ImageObject == null?AggContext.StaticData.ToAssetPath(Path.Combine("Images", "mh-logo.png")) : ImageObject.AssetPath; this.Children.Modify((list) => { list.Clear(); }); var imageObject = new ImageObject3D() { AssetPath = currentAssetPath, }; await imageObject.Rebuild(); this.Children.Add(imageObject); IObject3D logoBase = new CylinderObject3D(outerDiameter, 3, 60); IObject3D logoRing = new AlignObject3D(new RingObject3D(outerDiameter, innerDiameter, 2, 60), FaceAlign.Bottom, logoBase, FaceAlign.Top); IObject3D coinBlank = logoBase.Plus(logoRing); if (CreateHook) { var cube = await CubeObject3D.Create(4, 2, 4); IObject3D connect = logoBase.Plus(new AlignObject3D(cube, FaceAlign.Front | FaceAlign.Bottom, logoBase, FaceAlign.Back | FaceAlign.Bottom, 0, -.5)); IObject3D hook = logoBase.Plus(new AlignObject3D(new RingObject3D(10, 7, 5, 30), FaceAlign.Front | FaceAlign.Bottom, connect, FaceAlign.Back | FaceAlign.Bottom, 0, -.5)); coinBlank = coinBlank.Plus(connect); coinBlank = coinBlank.Plus(hook); } var imageToPath = new ImageToPathObject3D(); imageToPath.Children.Add(imageObject); await imageToPath.Rebuild(); var inputShape = imageToPath.VertexSource; if (Inflate != 0) { var bounds = inputShape.GetBounds(); var scale = Math.Max(bounds.Width, bounds.Height) / (17 * 4); inputShape = inputShape.Offset(Inflate * scale); } if (AlternateCentering) { inputShape = new VertexSourceApplyTransform(inputShape, GetCenteringTransformVisualCenter(inputShape, innerDiameter / 2)); } else { inputShape = new VertexSourceApplyTransform(inputShape, GetCenteringTransformExpandedToRadius(inputShape, innerDiameter / 2)); } if (ScalePercent != 100 && ScalePercent != 0) { inputShape = new VertexSourceApplyTransform(inputShape, Affine.NewScaling(ScalePercent / 100.0)); } if (NegativeSpace) { var disk = new Ellipse(0, 0, innerDiameter / 2 + .2, innerDiameter / 2 + .2) { ResolutionScale = 1000 }; inputShape = disk.Minus(inputShape); } imageToPath.VertexSource = inputShape; var pathExtrusion = new LinearExtrudeObject3D(); pathExtrusion.Children.Add(imageToPath); await pathExtrusion.Rebuild(); IObject3D extrusionObject = imageObject; var loadingScale = 32 / extrusionObject.XSize(); extrusionObject = new ScaleObject3D(extrusionObject, loadingScale, loadingScale, 1 / extrusionObject.ZSize()); extrusionObject = PlaceOnBase(logoBase, extrusionObject); this.Children.Add(coinBlank); this.Children.Add(extrusionObject); } Invalidate(InvalidateType.Mesh); }
public override async Task Rebuild() { using (RebuildLock()) { using (new CenterAndHeightMantainer(this)) { this.Children.Modify(list => { list.Clear(); }); var brailleLetter = new BrailleObject3D() { TextToEncode = Letter.ToString(), BaseHeight = BaseHeight, }; await brailleLetter.Rebuild(); this.Children.Add(brailleLetter); var textObject = new TextObject3D() { PointSize = 46, Color = Color.LightBlue, NameToWrite = Letter.ToString(), Height = BaseHeight }; await textObject.Rebuild(); IObject3D letterObject = new RotateObject3D_2(textObject, Vector3.UnitX, -90); await letterObject.Rebuild(); var scaleRatio = Math.Max(letterObject.XSize() / 17, letterObject.ZSize() / 17); if (scaleRatio > 1) { letterObject = new ScaleObject3D(letterObject, 1.0 / scaleRatio, 1, 1.0 / scaleRatio); } letterObject = new AlignObject3D(letterObject, FaceAlign.Bottom | FaceAlign.Front, brailleLetter, FaceAlign.Top | FaceAlign.Front, 0, 0, 3.5); letterObject = new SetCenterObject3D(letterObject, brailleLetter.GetCenter(), true, false, false); this.Children.Add(letterObject); var basePath = new RoundedRect(0, 0, 22, 34, 3) { ResolutionScale = 10 }; IObject3D basePlate = new Object3D() { Mesh = VertexSourceToMesh.Extrude(basePath, BaseHeight), Matrix = Matrix4X4.CreateRotationX(MathHelper.Tau / 4) }; basePlate = new AlignObject3D(basePlate, FaceAlign.Bottom | FaceAlign.Back, brailleLetter, FaceAlign.Bottom | FaceAlign.Back); basePlate = new SetCenterObject3D(basePlate, brailleLetter.GetCenter(), true, false, false); this.Children.Add(basePlate); IObject3D underline = await CubeObject3D.Create(basePlate.XSize(), .2, 1); underline = new AlignObject3D(underline, FaceAlign.Bottom, brailleLetter, FaceAlign.Top); underline = new AlignObject3D(underline, FaceAlign.Back | FaceAlign.Left, basePlate, FaceAlign.Front | FaceAlign.Left, 0, .01); this.Children.Add(underline); } } Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children)); }