public static SphereObject3D Create() { var item = new SphereObject3D(); item.Rebuild(null); return(item); }
public static async Task <SphereObject3D> Create() { var item = new SphereObject3D(); await item.Rebuild(); return(item); }
public TracedPositionObject3DControl(IObject3DControlContext context, IObject3D owner, Func <Vector3> getPosition, Action <Vector3> setPosition) { this.theme = ApplicationController.Instance.Theme; this.context = context; this.getPosition = getPosition; this.setPosition = setPosition; this.shape = PlatonicSolids.CreateCube(); this.shape = SphereObject3D.CreateSphere(1, 15, 10); collisionVolume = shape.CreateBVHData(); this.owner = owner; }
public override async Task Rebuild() { using (RebuildLock()) { using (new CenterAndHeightMaintainer(this)) { // validate the some of the values and store in user data if changed InnerDiameter = ValidateValue(InnerDiameter, "PipeWorksInnerDiameter", 15); OuterDiameter = ValidateValue(OuterDiameter, "PipeWorksOuterDiameter", 20); BottomReach = ValidateValue(BottomReach, "PipeWorksBottomReach", 30); FrontReach = ValidateValue(FrontReach, "PipeWorksFrontReach", 25); IObject3D bottomReach = new RotateObject3D(CreateReach(BottomReach, InnerDiameter), -MathHelper.Tau / 4); IObject3D frontReach = null; IObject3D elbowConnect = null; if (Angle < 90) { frontReach = bottomReach.Clone(); var translate = new Vector3(-OuterDiameter / 2, 0, 0); bottomReach.Translate(translate); frontReach = new RotateObject3D(frontReach, 0, 0, -MathHelper.DegreesToRadians(Angle)); translate = Vector3Ex.Transform(-translate, Matrix4X4.CreateRotationZ(MathHelper.DegreesToRadians(Angle))); frontReach.Translate(translate); var torus = new TorusObject3D(); using (torus.RebuildLock()) { torus.Advanced = true; torus.InnerDiameter = 0; OuterDiameter = OuterDiameter * 2; torus.RingSides = Sides; torus.Sides = Sides; torus.StartingAngle = Angle; torus.EndingAngle = 180; } torus.Invalidate(new InvalidateArgs(torus, InvalidateType.Properties)); elbowConnect = torus; } else if (Angle < 270) { bottomReach.Translate(0, -OuterDiameter / 2, 0); IObject3D reachConnect = await CylinderObject3D.Create(OuterDiameter, OuterDiameter, Sides, Alignment.Y); reachConnect = new AlignObject3D(reachConnect, FaceAlign.Front, bottomReach, FaceAlign.Back); reachConnect = new SetCenterObject3D(reachConnect, bottomReach.GetCenter(), true, false, true); bottomReach = bottomReach.Plus(reachConnect); frontReach = bottomReach.Clone(); frontReach = new RotateObject3D(frontReach, 0, 0, -MathHelper.DegreesToRadians(Angle)); elbowConnect = new SphereObject3D(OuterDiameter, Sides); } // output multiple meshes for pipe connector this.Children.Modify(list => { list.Clear(); list.Add(elbowConnect); list.Add(bottomReach); list.Add(frontReach); }); this.Color = Color.Transparent; this.Mesh = null; } } Invalidate(InvalidateType.Children); }