Exemplo n.º 1
0
        public void AttemptMissileLaunch(double currentTime)
        {
            if (health <= 0)
            {
                return;
            }

            double timeSinceLastFired = currentTime - timeLastFiredMissile;

            if (timeSinceLastFired > firingInterval)
            {
                timeLastFiredMissile = currentTime;
                // avoid duplicating costly math ops
                float shipDirection = ShipOrientation;
                float cos           = (float)Math.Cos(shipDirection);
                float sin           = (float)Math.Sin(shipDirection);

                var position = new CGPoint(Position.X + missileLaunchDistance * cos,
                                           Position.Y + missileLaunchDistance * sin);
                SKNode missile = NodeFactory.CreateMissileNode(this);
                missile.Position = position;
                Scene.AddChild(missile);

                missile.PhysicsBody.Velocity = PhysicsBody.Velocity;
                var vector = new CGVector(missileLaunchImpulse * cos, missileLaunchImpulse * sin);
                missile.PhysicsBody.ApplyImpulse(vector);
            }
        }
Exemplo n.º 2
0
        static CGVector InterpolatedNormalUnitVector(CGVector vector1, CGVector vector2)
        {
            var n1 = vector1.Normal();
            var n2 = vector2.Normal();

            var result = (n1.Add(n2))?.Normalize();

            if (result.HasValue)
            {
                return(result.Value);
            }

            // This means they resulted in a 0,0 vector,
            // in this case one of the incoming vectors is a good result.
            result = vector1.Normalize();
            if (result.HasValue)
            {
                return(result.Value);
            }

            result = vector2.Normalize();
            if (result.HasValue)
            {
                return(result.Value);
            }

            // This case should not happen.
            return(new CGVector(1, 0));
        }
Exemplo n.º 3
0
        public override void TouchesBegan(NSSet touches, UIEvent evt)
        {
            base.TouchesBegan(touches, evt);

            if (spiderView == null)
            {
                return;
            }

            var spiderTouchRadius   = spiderImage.Size.Width;
            var spiderTouchRadiusSq = spiderTouchRadius * spiderTouchRadius;

            foreach (UITouch touch in touches)
            {
                var position   = touch.LocationInView(this);
                var dx         = position.X - spiderView.Center.X;
                var dy         = position.Y - spiderView.Center.Y;
                var distanceSq = dx * dx + dy * dy;
                if (distanceSq < spiderTouchRadiusSq)
                {
                    var direction = new CGVector(anchorPoint.X - spiderView.Center.X, anchorPoint.Y - spiderView.Center.Y);
                    applyForce(direction, touch.Force);
                    break;
                }
            }
        }
        void AnimateMenu(MenuState newMenuState, float initialVelocity = 0.7f)
        {
            var initialVelocityVector = new CGVector(initialVelocity, 0f);
            var springParameters      = GetSpringTimingParameters(initialVelocityVector);
            var shouldMaximize        = newMenuState == MenuState.Open;

            menuAnimator = new UIViewPropertyAnimator(0, springParameters)
            {
                Interruptible = true,
            };

            menuAnimator.AddAnimations(() =>
            {
                menuViewController.View.Frame = new CGRect
                {
                    Location = new CGPoint
                    {
                        X = MenuDestinationXFromState(newMenuState),
                        Y = 0f,
                    },
                    Size = menuViewController.View.Frame.Size,
                };

                menuViewController.SetPercentMaximized(shouldMaximize ? 1 : 0);
                menuBackgroundView.Alpha = shouldMaximize ? 1 : 0;
            });

            menuAnimator.AddCompletion(pos => menuState = shouldMaximize ? MenuState.Open : MenuState.Closed);

            menuAnimator.StartAnimation();
        }
Exemplo n.º 5
0
        private void processAccelerometerData(CMAccelerometerData data, NSError error)
        {
            if (spiderView == null)
            {
                return;
            }

            var ax    = data.Acceleration.X;
            var ay    = data.Acceleration.Y;
            var angle = -(nfloat)Math.Atan2(ay, ax);

            gravity.Angle = angle;

            if (previousAcceleration.HasValue)
            {
                var dx = (nfloat)(ax - previousAcceleration.Value.X);
                var dy = (nfloat)(ay - previousAcceleration.Value.Y);

                var direction = new CGVector(dx, dy);
                var magnitude = (nfloat)Math.Sqrt(dx * dx + dy * dy);
                if (magnitude > 0.25f)
                {
                    applyForce(direction, magnitude);
                }
            }

            previousAcceleration = data.Acceleration;
        }
Exemplo n.º 6
0
        /// <summary>
        ///  Bullets Actions
        /// </summary>

        public CGVector GetRotation(CGVector vector, double angle)
        {
            var rotatedX = vector.dx * Math.Cos(angle) - vector.dy * Math.Sin(angle);
            var rotatedY = vector.dx * Math.Cos(angle) + vector.dy * Math.Cos(angle);

            return(new CGVector((nfloat)rotatedX, (nfloat)rotatedY));
        }
Exemplo n.º 7
0
        private void processAccelerometerData(CMAccelerometerData data, NSError error)
        {
            if (spiderView == null)
            {
                return;
            }

            var(ax, ay) = convertXYCoordinate(data.Acceleration.X, data.Acceleration.Y,
                                              UIApplication.SharedApplication.StatusBarOrientation);

            var angle = -(nfloat)Math.Atan2(ay, ax);

            gravity.Angle = angle;

            if (previousAcceleration.HasValue)
            {
                var(previousX, previousY) = convertXYCoordinate(previousAcceleration.Value.X,
                                                                previousAcceleration.Value.Y, UIApplication.SharedApplication.StatusBarOrientation);

                var dx = (nfloat)(ax - previousX);
                var dy = (nfloat)(ay - previousY);

                var direction = new CGVector(dx, dy);
                var magnitude = (nfloat)Math.Sqrt(dx * dx + dy * dy);
                if (magnitude > 0.25f)
                {
                    applyForce(direction, magnitude);
                }
            }

            previousAcceleration = data.Acceleration;
        }
Exemplo n.º 8
0
        private void applyForce(CGVector direction, nfloat magnitude)
        {
            var force = new UIPushBehavior(UIPushBehaviorMode.Instantaneous, spiderView);

            force.PushDirection = direction;
            force.Magnitude     = magnitude;
            spiderAnimator.AddBehavior(force);
        }
        public double InvLerp(CGPoint start, CGPoint end, CGPoint loc)
        {
            var a   = new CGVector(end.X - start.X, end.Y - start.Y);
            var b   = new CGVector(loc.X - start.X, loc.Y - start.Y);
            var dot = a.dx * b.dx + a.dy * b.dy;
            var len = Math.Sqrt(a.dx * a.dx + a.dy * a.dy);

            return(dot / len);
        }
Exemplo n.º 10
0
        public void ShootSpell(CGPoint position)
        {
            Cooldown = 100;
            var vector = new CGVector(position.X - Position.X, position.Y - Position.Y);


            var spell = ShotSprite.CreateShotAt(Position, SpellType.Enemy);

            Parent.AddChild(spell);
            spell.AttackByVector(vector);
            spell.ZRotation = (nfloat)Math.Atan2(vector.dy, vector.dx);
        }
Exemplo n.º 11
0
        public void ShootSpell(CGPoint position)
        {
            // Create vector of the movement
            var vector = new CGVector(position.X - Position.X, position.Y - Position.Y);

            // Create spell instance place it into the world and force it to attack
            var spell = ShotSprite.CreateShotAt(Position, SpellType.Hero);

            Parent.AddChild(spell);
            spell.AttackByVector(vector);
            spell.RunAction(SKAction.RepeatActionForever(SKAction.RotateByAngle((nfloat)6.28, 1)));
        }
        public override void AnimateTransition(IUIViewControllerContextTransitioning transitionContext)
        {
            var fromViewController = transitionContext.GetViewControllerForKey(UITransitionContext.FromViewControllerKey);
            var toViewController   = transitionContext.GetViewControllerForKey(UITransitionContext.ToViewControllerKey);

            UIView containerView = transitionContext.ContainerView;

            var fromView = transitionContext.GetViewFor(UITransitionContext.FromViewKey);
            var toView   = transitionContext.GetViewFor(UITransitionContext.ToViewKey);

            var fromFrame = transitionContext.GetInitialFrameForViewController(fromViewController);
            var toFrame   = transitionContext.GetFinalFrameForViewController(toViewController);

            var offset = new CGVector(0f, 0f);

            if (targetEdge == UIRectEdge.Left)
            {
                offset = new CGVector(-1f, 0f);
            }
            else if (targetEdge == UIRectEdge.Right)
            {
                offset = new CGVector(1f, 0f);
            }

            fromView.Frame = fromFrame;

            CGRect auxFrame = toFrame;

            auxFrame.Offset(toFrame.Width * offset.dx * -1f, toFrame.Height * offset.dy * -1f);
            toView.Frame = auxFrame;

            containerView.AddSubview(toView);

            var duration = TransitionDuration(transitionContext);

            UIView.Animate(duration, 0, UIViewAnimationOptions.TransitionNone, () => {
                var fromFrameAux = fromFrame;
                fromFrameAux.Offset(fromFrame.Width * offset.dx, fromFrame.Height * offset.dy);
                fromView.Frame = fromFrameAux;

                toView.Frame = toFrame;
            }, () => {
                transitionContext.CompleteTransition(!transitionContext.TransitionWasCancelled);
            }
                           );
        }
        void AnimatePullout(PulloutState newPulloutState, float initialVelocity = 0.7f, bool launchKeyboard = false)
        {
            var initialVelocityVector = new CGVector(0f, initialVelocity);

            var springParameters = GetSpringTimingParameters(initialVelocityVector);
            var destinationY     = PulloutDestinationYFromState(newPulloutState);

            pulloutAnimator = new UIViewPropertyAnimator(0, springParameters)
            {
                Interruptible = true,
            };

            pulloutAnimator.AddAnimations(() =>
            {
                mainPulloutView.Frame = new CGRect
                {
                    Location = new CGPoint
                    {
                        X = mainPulloutView.Frame.X,
                        Y = destinationY,
                    },
                    Size = mainPulloutView.Frame.Size,
                };

                mainPulloutView.SetPercentMaximized(newPulloutState == PulloutState.Maximized ? 1 : 0);
                mainPulloutView.SetPercentMinimized(newPulloutState == PulloutState.Neutral || newPulloutState == PulloutState.Maximized ? 0 : 1);

                pulloutBackgroundView.Alpha = newPulloutState == PulloutState.Maximized ? 1 : 0;
            });

            if (launchKeyboard)
            {
                mainPulloutView.LaunchKeyboard();
            }

            pulloutAnimator.AddCompletion(pos =>
            {
                pulloutState = newPulloutState;
                mainPulloutView.PulloutDidFinishAnimating(newPulloutState);
            });

            pulloutAnimator.StartAnimation();
        }
Exemplo n.º 14
0
        void LayoutIndicatorForAzimuthAngle(nfloat azimuthAngle, CGVector azimuthUnitVector, nfloat altitudeAngle, CALayer targetLineLayer, CALayer targetDotLayer)
        {
            var reticleBounds      = reticleLayer.Bounds;
            var centeringTransform = CGAffineTransform.MakeTranslation(reticleBounds.Width / 2f, reticleBounds.Height / 2f);

            var rotationTransform = CGAffineTransform.MakeRotation(azimuthAngle);

            // Draw the indicator opposite the azimuth by rotating pi radians, for easy visualization.
            rotationTransform = CGAffineTransform.Rotate(rotationTransform, NMath.PI);
            var altitudeRadius = (1f - altitudeAngle / NMath.PI / 2f) * radius;
            var lineTransform  = CGAffineTransform.MakeScale(altitudeRadius, 1);

            lineTransform = CGAffineTransform.Multiply(lineTransform, rotationTransform);
            lineTransform = CGAffineTransform.Multiply(lineTransform, centeringTransform);
            targetLineLayer.AffineTransform = lineTransform;

            var dotTransform = CGAffineTransform.MakeTranslation(-azimuthUnitVector.dx * altitudeRadius, -azimuthUnitVector.dy * altitudeRadius);

            dotTransform = CGAffineTransform.Multiply(dotTransform, centeringTransform);
            targetDotLayer.AffineTransform = dotTransform;
        }
Exemplo n.º 15
0
		static CGVector InterpolatedNormalUnitVector (CGVector vector1, CGVector vector2)
		{
			var n1 = vector1.Normal ();
			var n2 = vector2.Normal ();

			var result = (n1.Add (n2))?.Normalize ();
			if (result.HasValue)
				return result.Value;

			// This means they resulted in a 0,0 vector, 
			// in this case one of the incoming vectors is a good result.
			result = vector1.Normalize ();
			if (result.HasValue)
				return result.Value;

			result = vector2.Normalize ();
			if (result.HasValue)
				return result.Value;

			// This case should not happen.
			return new CGVector (1, 0);
		}
Exemplo n.º 16
0
 public static CGVector Apply(this CGVector vector, CGAffineTransform transform)
 {
     return(vector.CreatePoint().Apply(transform).CreateVector());
 }
Exemplo n.º 17
0
 public static CGPoint CreatePoint(this CGVector self)
 {
     return(new CGPoint(self.dx, self.dy));
 }
Exemplo n.º 18
0
        public void ToStringTest()
        {
            var vector = new CGVector((nfloat)1, (nfloat)2);

            Assert.AreEqual("{1, 2}", vector.ToString(), "ToString");
        }
Exemplo n.º 19
0
 public static nfloat Quadrance(this CGVector vector)
 {
     return(vector.dx * vector.dx + vector.dy * vector.dy);
 }
Exemplo n.º 20
0
        void SetupRings(int itemCount)
        {
            // Define some nice colors.
            var borderColorSelected = UIColor.FromHSBA(0.07f, 0.81f, 0.98f, 1).CGColor;
            var borderColorNormal   = UIColor.DarkGray.CGColor;
            var fillColorSelected   = UIColor.FromHSBA(0.07f, 0.21f, 0.98f, 1);
            var fillColorNormal     = UIColor.White;

            // We define generators to return closures which we use to define
            // the different states of our item ring views.
            Func <RingView, Action> selectedGenerator = (view) => () => {
                view.Layer.BorderColor = borderColorSelected;
                view.BackgroundColor   = fillColorSelected;
            };

            Func <RingView, Action> normalGenerator = (view) => () => {
                view.Layer.BorderColor = borderColorNormal;
                view.BackgroundColor   = fillColorNormal;
            };

            CGPoint startPosition = Bounds.GetCenter();
            Func <RingView, Action> locationNormalGenerator = (view) => () => {
                view.Center = startPosition;
                if (!view.Selected)
                {
                    view.Alpha = 0;
                }
            };

            Func <RingView, CGVector, Action> locationFanGenerator = (view, offset) => () => {
                view.Center = startPosition.Add(offset);
                view.Alpha  = 1;
            };

            // tau is a full circle in radians
            var tau = NMath.PI * 2;
            var absoluteRingSegment        = tau / 4;
            var requiredLengthPerRing      = RingRadius * 2 + 5;
            var totalRequiredCirlceSegment = requiredLengthPerRing * (itemCount - 1);
            var fannedControlRadius        = NMath.Max(requiredLengthPerRing, totalRequiredCirlceSegment / absoluteRingSegment);
            var normalDistance             = new CGVector(0, -fannedControlRadius);

            var scale = UIScreen.MainScreen.Scale;

            // Setup our item views.
            for (int index = 0; index < itemCount; index++)
            {
                var view = new RingView(Bounds);
                view.StateClosures [Selected] = selectedGenerator(view);
                view.StateClosures [Normal]   = normalGenerator(view);

                nfloat angle = index / (nfloat)(itemCount - 1) * absoluteRingSegment;
                var    fan   = normalDistance.Apply(MakeRotation(angle)).RoundTo(scale);
                view.StateClosures [LocationFan] = locationFanGenerator(view, fan);

                view.StateClosures [LocationOrigin] = locationNormalGenerator(view);
                AddSubview(view);
                RingViews.Add(view);

                var gr = new UITapGestureRecognizer(Tap);
                view.AddGestureRecognizer(gr);
            }

            // Setup the initial selection state.
            var rv = RingViews [0];

            AddSubview(rv);
            rv.Selected  = true;
            selectedView = rv;

            UpdateViews(animated: false);
        }
Exemplo n.º 21
0
		//public static void SetCenter (this CGRect rect)
		//{
		//	//origin = center - CGVector (dx: width, dy: height) / 2
		//}

		public static CGPoint Add (this CGPoint left, CGVector right)
		{
			return new CGPoint (left.X + right.dx, left.Y + right.dy);
		}
Exemplo n.º 22
0
        public static CGVector?Normal(this CGVector self)
        {
            bool isZero = (self.dx == 0 && self.dy == 0);

            return(isZero ? (CGVector?)null : new CGVector(-self.dy, self.dx));
        }
Exemplo n.º 23
0
 public static CGVector Mult(this CGVector left, nfloat right)
 {
     return(new CGVector(left.dx * right, left.dy * right));
 }
Exemplo n.º 24
0
 public static CGVector RoundTo(this CGVector self, nfloat scale)
 {
     return(new CGVector(NMath.Round(self.dx * scale) / scale,
                         NMath.Round(self.dy * scale) / scale));
 }
        float DistanceBetween(CGPoint p1, CGPoint p2)
        {
            var vector = new CGVector(p2.X - p1.X, p2.Y - p1.Y);

            return((float)Math.Sqrt(vector.dx * vector.dx + vector.dy * vector.dy));
        }
Exemplo n.º 26
0
        public CGVector GetAzimuthUnitVector()
        {
            var unitVector = new CGVector(1, 1);

            return(unitVector.Apply(MakeRotation(Azimuth.Value)));
        }
Exemplo n.º 27
0
        /// <summary>
        /// Point the sprite to move by the vector
        /// </summary>
        /// <param name="vector">Vector.</param>
        public void AttackByVector(CGVector vector)
        {
            var time = Math.Sqrt(Math.Pow(vector.dx, 2) + Math.Pow(vector.dy, 2)) / 300;

            RunAction(SKAction.RepeatActionForever(SKAction.MoveBy(vector, time)));
        }
Exemplo n.º 28
0
		void SetupRings (int itemCount)
		{
			// Define some nice colors.
			var borderColorSelected = UIColor.FromHSBA (0.07f, 0.81f, 0.98f, 1).CGColor;
			var borderColorNormal = UIColor.DarkGray.CGColor;
			var fillColorSelected = UIColor.FromHSBA (0.07f, 0.21f, 0.98f, 1);
			var fillColorNormal = UIColor.White;

			// We define generators to return closures which we use to define
			// the different states of our item ring views.
			Func<RingView, Action> selectedGenerator = (view) => () => {
				view.Layer.BorderColor = borderColorSelected;
				view.BackgroundColor = fillColorSelected;
			};

			Func<RingView, Action> normalGenerator = (view) => () => {
				view.Layer.BorderColor = borderColorNormal;
				view.BackgroundColor = fillColorNormal;
			};

			CGPoint startPosition = Bounds.GetCenter ();
			Func<RingView, Action> locationNormalGenerator = (view) => () => {
				view.Center = startPosition;
				if (!view.Selected)
					view.Alpha = 0;
			};

			Func<RingView, CGVector, Action> locationFanGenerator = (view, offset) => () => {
				view.Center = startPosition.Add (offset);
				view.Alpha = 1;
			};

			// tau is a full circle in radians
			var tau = NMath.PI * 2;
			var absoluteRingSegment = tau / 4;
			var requiredLengthPerRing = RingRadius * 2 + 5;
			var totalRequiredCirlceSegment = requiredLengthPerRing * (itemCount - 1);
			var fannedControlRadius = NMath.Max (requiredLengthPerRing, totalRequiredCirlceSegment / absoluteRingSegment);
			var normalDistance = new CGVector (0, -fannedControlRadius);

			var scale = UIScreen.MainScreen.Scale;

			// Setup our item views.
			for (int index = 0; index < itemCount; index++) {
				var view = new RingView (Bounds);
				view.StateClosures [Selected] = selectedGenerator (view);
				view.StateClosures [Normal] = normalGenerator (view);

				nfloat angle = index / (nfloat)(itemCount - 1) * absoluteRingSegment;
				var fan = normalDistance.Apply (MakeRotation (angle)).RoundTo (scale);
				view.StateClosures [LocationFan] = locationFanGenerator (view, fan);

				view.StateClosures [LocationOrigin] = locationNormalGenerator (view);
				AddSubview (view);
				RingViews.Add (view);

				var gr = new UITapGestureRecognizer (Tap);
				view.AddGestureRecognizer (gr);
			}

			// Setup the initial selection state.
			var rv = RingViews [0];
			AddSubview (rv);
			rv.Selected = true;
			selectedView = rv;

			UpdateViews (animated: false);
		}
Exemplo n.º 29
0
        // CGVector pointing in the same direction as self, with a length of 1.0 - or nil if the length is zero.
        public static CGVector?Normalize(this CGVector self)
        {
            var quadrance = self.Quadrance();

            return((quadrance > 0) ? self.Divide(NMath.Sqrt(quadrance)) : (CGVector?)null);
        }
Exemplo n.º 30
0
		public static CGVector? Add (this CGVector? left, CGVector? right)
		{
			if (!left.HasValue || !right.HasValue)
				return null;

			var l = left.Value;
			var r = right.Value;
			return new CGVector (l.dx + r.dx, l.dy + r.dy);
		}
Exemplo n.º 31
0
 public static CGVector Divide(this CGVector left, nfloat right)
 {
     return(new CGVector(left.dx / right, left.dy / right));
 }
 UISpringTimingParameters GetSpringTimingParameters(CGVector initialVelocity) => new UISpringTimingParameters(4.5f, 900f, 90f, initialVelocity);
Exemplo n.º 33
0
        public void AttemptMissileLaunch(double currentTime)
        {
            double timeSinceLastFired = currentTime - timeLastFiredMissile;
            if (timeSinceLastFired > firingInterval) {
                timeLastFiredMissile = currentTime;
                // avoid duplicating costly math ops
                float shipDirection = ShipOrientation;
                float cos = (float) Math.Cos (shipDirection);
                float sin = (float) Math.Sin (shipDirection);

                var position = new PointF (Position.X + missileLaunchDistance * cos,
                    Position.Y + missileLaunchDistance * sin);
                SKNode missile = new MissileNode (this, position);
                Scene.AddChild (missile);

                missile.PhysicsBody.Velocity = PhysicsBody.Velocity;
                var vector = new CGVector (missileLaunchImpulse * cos, missileLaunchImpulse * sin);
                missile.PhysicsBody.ApplyImpulse (vector);
            }
        }
Exemplo n.º 34
0
        //public static void SetCenter (this CGRect rect)
        //{
        //	//origin = center - CGVector (dx: width, dy: height) / 2
        //}

        public static CGPoint Add(this CGPoint left, CGVector right)
        {
            return(new CGPoint(left.X + right.dx, left.Y + right.dy));
        }
Exemplo n.º 35
0
		public static CGPoint Sub (this CGPoint left, CGVector right)
		{
			return new CGPoint (left.X - right.dx, left.Y - right.dy);
		}
Exemplo n.º 36
0
 public static CGPoint Sub(this CGPoint left, CGVector right)
 {
     return(new CGPoint(left.X - right.dx, left.Y - right.dy));
 }
Exemplo n.º 37
0
		public CGVector GetAzimuthUnitVector ()
		{
			var unitVector = new CGVector (1, 1);
			return unitVector.Apply (MakeRotation (Azimuth.Value));
		}
Exemplo n.º 38
0
		void LayoutIndicatorForAzimuthAngle (nfloat azimuthAngle, CGVector azimuthUnitVector, nfloat altitudeAngle, CALayer targetLineLayer, CALayer targetDotLayer)
		{
			var reticleBounds = reticleLayer.Bounds;
			var centeringTransform = CGAffineTransform.MakeTranslation (reticleBounds.Width / 2f, reticleBounds.Height / 2f);

			var rotationTransform = CGAffineTransform.MakeRotation (azimuthAngle);

			// Draw the indicator opposite the azimuth by rotating pi radians, for easy visualization.
			rotationTransform = CGAffineTransform.Rotate (rotationTransform, NMath.PI);
			var altitudeRadius = (1f - altitudeAngle / NMath.PI / 2f) * radius;
			var lineTransform = CGAffineTransform.MakeScale (altitudeRadius, 1);

			lineTransform = CGAffineTransform.Multiply (lineTransform, rotationTransform);
			lineTransform = CGAffineTransform.Multiply (lineTransform, centeringTransform);
			targetLineLayer.AffineTransform = lineTransform;

			var dotTransform = CGAffineTransform.MakeTranslation (-azimuthUnitVector.dx * altitudeRadius, -azimuthUnitVector.dy * altitudeRadius);
			dotTransform = CGAffineTransform.Multiply (dotTransform, centeringTransform);
			targetDotLayer.AffineTransform = dotTransform;
		}