Example #1
0
        private protected static Vector2F CalcScale(Matrix44F transform)
        {
            var sx = new Vector3F(transform[0, 0], transform[0, 1], transform[0, 2]).Length;
            var sy = new Vector3F(transform[1, 0], transform[1, 1], transform[1, 2]).Length;

            return(new Vector2F(sx, sy));
        }
Example #2
0
        private void UpdateSizeBox()
        {
            var points = new Vector2F[4];

            var origin = -_TransformNode.CenterPosition * _TransformNode.Scale;

            points[0] = origin;
            points[1] = origin + new Vector2F(_TransformNode.ContentSize.X, 0) * _TransformNode.Scale;
            points[2] = origin + _TransformNode.ContentSize * _TransformNode.Scale;
            points[3] = origin + new Vector2F(0, _TransformNode.ContentSize.Y) * _TransformNode.Scale;

            var mat = _TransformNode.GetAncestorSpecificNode <TransformNode>()?.InheritedTransform ?? Matrix44F.Identity;

            mat = mat * Matrix44F.GetTranslation2D(_TransformNode.Position) * Matrix44F.GetRotationZ(MathHelper.DegreeToRadian(_TransformNode.Angle));
            for (int i = 0; i < points.Length; i++)
            {
                var vector = mat.Transform3D(new Vector3F(points[i].X, points[i].Y, 0));
                points[i] = new Vector2F(vector.X, vector.Y);
            }

            for (int i = 0; i < points.Length; i++)
            {
                var point1 = points[i];
                var point2 = points[(i + 1) % points.Length];

                SetLine(_SizeBoxLines[i], point1, point2, new Color(255, 128, 0));
            }
        }
        private void UpdateSizeBox()
        {
            var points = new Vector2F[4];

            var offset
                = ((AnchorTransformerNode.Parent?.GetAncestorSpecificNode <TransformNode>()?.Transfomer as AnchorTransformerNode)?.Size ?? default) * AnchorTransformerNode.AnchorMin;
            var origin = -AnchorTransformerNode.CenterPosition;

            points[0] = origin;
            points[1] = origin + new Vector2F(AnchorTransformerNode.Size.X, 0);
            points[2] = origin + AnchorTransformerNode.Size;
            points[3] = origin + new Vector2F(0, AnchorTransformerNode.Size.Y);

            var mat = AnchorTransformerNode.Parent.GetAncestorSpecificNode <TransformNode>()?.InheritedTransform ?? Matrix44F.Identity;

            mat = mat * Matrix44F.GetTranslation2D(offset + AnchorTransformerNode.Position) * Matrix44F.GetRotationZ(MathHelper.DegreeToRadian(AnchorTransformerNode.Angle));
            for (int i = 0; i < points.Length; i++)
            {
                var vector = mat.Transform3D(new Vector3F(points[i].X, points[i].Y, 0));
                points[i] = new Vector2F(vector.X, vector.Y);
            }

            for (int i = 0; i < points.Length; i++)
            {
                var point1 = points[i];
                var point2 = points[(i + 1) % points.Length];

                SetLine(_SizeBoxLines[i], point1, point2, new Color(255, 128, 0));
            }
        }
        private void UpdateAnchor()
        {
            var points = new Vector2F[2];

            var offset
                = ((AnchorTransformerNode.Parent?.GetAncestorSpecificNode <TransformNode>()?.Transfomer as AnchorTransformerNode)?.Size ?? default) * AnchorTransformerNode.AnchorMin;

            points[0] = -AnchorTransformerNode.Position;
            points[1] = AnchorTransformerNode.Size * (new Vector2F(1, 1) - AnchorTransformerNode.Pivot) + AnchorTransformerNode.RightBottom;

            var mat = AnchorTransformerNode.Parent.GetAncestorSpecificNode <TransformNode>()?.InheritedTransform ?? Matrix44F.Identity;

            mat = mat * Matrix44F.GetTranslation2D(offset + AnchorTransformerNode.Position) * Matrix44F.GetRotationZ(MathHelper.DegreeToRadian(AnchorTransformerNode.Angle));

            var horizon  = new Vector2F(-8, 0);
            var vertical = new Vector2F(0, -8);

            for (int i = 0; i < points.Length; i++)
            {
                var point1 = points[i] + horizon * MathF.Pow(-1, i);
                var point2 = points[i] + vertical * MathF.Pow(-1, i);

                var vector = mat.Transform3D(new Vector3F(points[i].X, points[i].Y, 0));
                points[i] = new Vector2F(vector.X, vector.Y);

                vector = mat.Transform3D(new Vector3F(point1.X, point1.Y, 0));
                point1 = new Vector2F(vector.X, vector.Y);

                vector = mat.Transform3D(new Vector3F(point2.X, point2.Y, 0));
                point2 = new Vector2F(vector.X, vector.Y);

                SetLine(_AnchorLines[i * 2], points[i], point1, new Color(255, 255, 255));
                SetLine(_AnchorLines[i * 2 + 1], points[i], point2, new Color(255, 255, 255));
            }
        }
Example #5
0
        /// <summary>
        /// Transformを計算します。
        /// </summary>
        /// <param name="position">座標</param>
        /// <param name="angle">角度(弧度法)</param>
        /// <param name="scale">拡大率</param>
        /// <returns></returns>
        internal static Matrix44F CalcTransform(Vector2F position, float angle, Vector2F scale)
        {
            var matPosition = Matrix44F.GetTranslation2D(position);
            var matRotate   = Matrix44F.GetRotationZ(angle);
            var matScale    = Matrix44F.GetScale2D(scale);

            return(matPosition * matRotate * matScale);
            // NOTE: 一気に計算したほうがよさそう
        }
Example #6
0
        /// <summary>
        /// <see cref="Matrix44F"/>から2次元座標,拡大率,角度を算出します。
        /// </summary>
        /// <param name="transform">計算元となる4x4行列</param>
        /// <param name="absolutePosition">出力される座標</param>
        /// <param name="scale">出力される拡大率</param>
        /// <param name="angle">出力される角度(度数法)</param>
        public static void CalcFromTransform2D(Matrix44F transform, out Vector2F absolutePosition, out Vector2F scale, out float angle)
        {
            absolutePosition = new Vector2F(transform[0, 3], transform[1, 3]);
            var sx = new Vector3F(transform[0, 0], transform[1, 0], transform[2, 0]).Length;
            var sy = new Vector3F(transform[0, 1], transform[1, 1], transform[2, 1]).Length;

            scale      = new Vector2F(sx, sy);
            transform *= Matrix44F.GetScale2D(new Vector2F(sx == 0 ? 1f : (1f / sx), sy == 0 ? 1f : (1f / sy)));
            angle      = new Vector2F(transform[0, 0], transform[1, 0]).Degree;
        }
Example #7
0
        /// <summary>
        /// <see cref="Matrix44F"/>から3次元座標,拡大率,角度を算出します。
        /// </summary>
        /// <param name="transform">計算元となる4x4行列</param>
        /// <param name="absolutePosition">出力される座標</param>
        /// <param name="scale">出力される拡大率</param>
        /// <param name="rotation">出力される回転行列</param>
        public static void CalcFromTransform3D(Matrix44F transform, out Vector3F absolutePosition, out Vector3F scale, out Matrix44F rotation)
        {
            absolutePosition = new Vector3F(transform[0, 3], transform[1, 3], transform[2, 3]);
            var sx = new Vector3F(transform[0, 0], transform[1, 0], transform[2, 0]).Length;
            var sy = new Vector3F(transform[0, 1], transform[1, 1], transform[2, 1]).Length;
            var sz = new Vector3F(transform[0, 2], transform[1, 2], transform[2, 2]).Length;

            scale     = new Vector3F(sx, sy, sz);
            transform = Matrix44F.GetTranslation3D(-absolutePosition) * transform;
            rotation  = transform * Matrix44F.GetScale3D(new Vector3F(sx == 0 ? 1f : (1f / sx), sy == 0 ? 1f : (1f / sy), sz == 0 ? 1f : (1f / sz)));
        }
Example #8
0
 private void SetMatrix44FPrivate(string key, Matrix44F value, bool assign)
 {
     if (key == null)
     {
         throw new ArgumentNullException(nameof(key), "引数がnullです");
     }
     if (assign)
     {
         matrixes[key] = value;
     }
     cbg_Material_SetMatrix44F(selfPtr, key, value);
 }
Example #9
0
 /// <summary>
 /// 指定した名前を持つ<see cref="Matrix44F"/>の値を設定します。
 /// </summary>
 /// <param name="key">検索する<see cref="Matrix44F"/>のインスタンスの名前</param>
 /// <param name="value">設定する<see cref="Matrix44F"/>のインスタンスの値</param>
 /// <exception cref="ArgumentNullException"><paramref name="key"/>がnull</exception>
 public void SetMatrix44F(string key, Matrix44F value)
 {
     SetMatrix44FPrivate(key, value, true);
 }