Exemple #1
0
        public void Matrix23()
        {
            string fs =
                @"#version 330

                  uniform mat2x3 exampleMat23;
                  out vec3 FragColor;

                  void main()
                  {
                      FragColor = vec3(exampleMat23[0].z, exampleMat23[1].x, 0.0);
                  }";

            using (GraphicsWindow window = Device.CreateWindow(1, 1))
                using (Framebuffer framebuffer = TestUtility.CreateFramebuffer(window.Context))
                    using (ShaderProgram sp = Device.CreateShaderProgram(ShaderSources.PassThroughVertexShader(), fs))
                        using (VertexArray va = TestUtility.CreateVertexArray(window.Context, sp.VertexAttributes["position"].Location))
                        {
                            Matrix23 <float> m23 = new Matrix23 <float>(
                                0.0f, 1.0f,
                                0.0f, 0.0f,
                                1.0f, 0.0f);
                            Uniform <Matrix23 <float> > exampleMat23 = (Uniform <Matrix23 <float> >)sp.Uniforms["exampleMat23"];
                            Assert.AreEqual("exampleMat23", exampleMat23.Name);
                            Assert.AreEqual(UniformType.FloatMatrix23, exampleMat23.Datatype);
                            Assert.AreEqual(new Matrix23 <float>(), exampleMat23.Value);
                            exampleMat23.Value = m23;
                            Assert.AreEqual(m23, exampleMat23.Value);

                            window.Context.Framebuffer = framebuffer;
                            window.Context.Draw(PrimitiveType.Points, 0, 1, new DrawState(TestUtility.CreateRenderStateWithoutDepthTest(), sp, va), new SceneState());
                            TestUtility.ValidateColor(framebuffer.ColorAttachments[0], 255, 255, 0);
                        }
        }
 internal UniformFloatMatrix23GL3x(string name, int location, ICleanableObserver observer)
     : base(name, UniformType.FloatMatrix23)
 {
     _location = location;
     _value    = new Matrix23 <float>();
     _dirty    = true;
     _observer = observer;
     _observer.NotifyDirty(this);
 }
        public void Construct1()
        {
            Matrix23<double> m = new Matrix23<double>(1.0);

            for (int i = 0; i < m.NumberOfComponents; ++i)
            {
                Assert.AreEqual(1.0, m.ReadOnlyColumnMajorValues[0], 1e-14);
            }
        }
        public void DoubleToFloat()
        {
            Matrix23<double> m = new Matrix23<double>(
                1.0, 2.0,
                3.0, 4.0,
                5.0, 6.0);

            Matrix23<float> mf = Matrix23<double>.DoubleToFloat(m);

            Assert.AreEqual(1.0f, mf.Column0Row0, 1e-7);
            Assert.AreEqual(2.0f, mf.Column1Row0, 1e-7);
            Assert.AreEqual(3.0f, mf.Column0Row1, 1e-7);
            Assert.AreEqual(4.0f, mf.Column1Row1, 1e-7);
            Assert.AreEqual(5.0f, mf.Column0Row2, 1e-7);
            Assert.AreEqual(6.0f, mf.Column1Row2, 1e-7);
        }
            // a*bで初期化
            public Matrix23(ref Matrix23 a, ref Matrix33 b)
            {
                var t00 = (a.m00 * b.m00) + (a.m01 * b.m10) + (a.m02 * b.m20);
                var t01 = (a.m00 * b.m01) + (a.m01 * b.m11) + (a.m02 * b.m21);
                var t02 = (a.m00 * b.m02) + (a.m01 * b.m12) + (a.m02 * b.m22);

                var t10 = (a.m10 * b.m00) + (a.m11 * b.m10) + (a.m12 * b.m20);
                var t11 = (a.m10 * b.m01) + (a.m11 * b.m11) + (a.m12 * b.m21);
                var t12 = (a.m10 * b.m02) + (a.m11 * b.m12) + (a.m12 * b.m22);

                m00 = t00;
                m01 = t01;
                m02 = t02;
                m10 = t10;
                m11 = t11;
                m12 = t12;
            }
Exemple #6
0
        protected void DrawTag(Renderer renderer, Graphics graphics, string tag)
        {
            var d          = 2 * Radius;
            var gTransform = graphics.Transform;

            graphics.ResetTransform();
            var pos    = Location;
            var offset = new Vector2(d, -d);

            offset.Rotate(-renderer.Turn);
            pos += offset;
            pos  = Matrix23.FromColumns(gTransform.Elements) * pos;
            graphics.DrawString(tag, renderer.Font,
                                Selected ? Root.Scene.Brushes.SelectedName : Root.Scene.Brushes.Name, (float)pos.X, (float)pos.Y);
            graphics.Flush();
            graphics.Transform = gTransform;
        }
        void CreatePositionToTexcoordTransform()
        {
            if (_sprite == null)
            {
                return;
            }

            /*
             * UVと位置の関係を求めるために、位置にある行列を乗ずるとアトラス内のUVになる、
             * というような「ある行列」を求める。
             * 3頂点の位置p0,p1,p2及びUVt0,t1,t2を列ベクタとして並べ、行列P及びTを作る。
             * 「ある行列」をXとする。すると、T=XP
             * 要素ごとに書けば以下のようになる
             |t0x t1x t2x|   |m00 m01 m02| |p0x p1x p2x|
             |t0y t1y t2y| = |m10 m11 m12| |p0y p1y p2y|
             |1     1   1|   |  0   0   1| |  1   1   1|
             *
             * ここで、右からPの逆行列P^を乗ずれば、TP^=XPP^=Xとなり、Xが求まる
             */
            int i0, i1, i2;

            SelectIndependentVertices(out i0, out i1, out i2, _sprite.vertices);
            var matT = new Matrix23(ref _sprite.uv[i0], ref _sprite.uv[i1], ref _sprite.uv[i2]);                   // T
            var matP = new Matrix33(ref _sprite.vertices[i0], ref _sprite.vertices[i1], ref _sprite.vertices[i2]); // P

            if (!matP.Invert())                                                                                    // 三角形が縮退していて逆行列を作れない
            {
                return;
            }
            var spriteRect   = _sprite.rect;
            var spriteWidth  = spriteRect.width;
            var spriteHeight = spriteRect.height;

            matT.Multiply(ref matP); // matTにTP^=Xが入った
            matT.Scale(              // さらにスプライトの頂点座標をワールドからスプライト内座標に変換する
                spriteWidth / _sprite.pixelsPerUnit,
                spriteHeight / _sprite.pixelsPerUnit);
            matT.Translate(             // ピボット分ずらし
                -_sprite.pivot.x / spriteWidth,
                -_sprite.pivot.y / spriteHeight);
            _positionToTexcoordTransform = matT;
        }
Exemple #8
0
        public override void Draw(Renderer renderer, Graphics graphics)
        {
            base.Draw(renderer, graphics);
            var center = OBBox.WorldCenter;

            //var invScale = 1/renderer.Scale;
            //var d = (float)(2*Radius*invScale);
            //var r = d/2;
            if ((Selected || Highlighted || Root.Scene.Options.ShowNames) && !string.IsNullOrEmpty(Name))
            {
                var gTransform = graphics.Transform;
                graphics.ResetTransform();
                var myTransform = Matrix23.FromColumns(gTransform.Elements);
                var pos         = myTransform * center;
                var str         = Name;
                graphics.DrawString(str, renderer.Font, Brushes.Yellow, (float)pos.X, (float)pos.Y);
                graphics.Flush();
                graphics.Transform = gTransform;
            }
        }
        public void Construct2()
        {
            Matrix23<double> m = new Matrix23<double>(
                1.0, 2.0,
                3.0, 4.0,
                5.0, 6.0);

            Assert.AreEqual(1.0, m.Column0Row0);
            Assert.AreEqual(2.0, m.Column1Row0);
            Assert.AreEqual(3.0, m.Column0Row1);
            Assert.AreEqual(4.0, m.Column1Row1);
            Assert.AreEqual(5.0, m.Column0Row2);
            Assert.AreEqual(6.0, m.Column1Row2);

            Assert.AreEqual(1.0, m.ReadOnlyColumnMajorValues[0]);
            Assert.AreEqual(3.0, m.ReadOnlyColumnMajorValues[1]);
            Assert.AreEqual(5.0, m.ReadOnlyColumnMajorValues[2]);
            Assert.AreEqual(2.0, m.ReadOnlyColumnMajorValues[3]);
            Assert.AreEqual(4.0, m.ReadOnlyColumnMajorValues[4]);
            Assert.AreEqual(6.0, m.ReadOnlyColumnMajorValues[5]);
        }
        public void Equals()
        {
            Matrix23<double> a = new Matrix23<double>(
                1.0, 2.0,
                3.0, 4.0,
                5.0, 6.0);
            Matrix23<double> b = new Matrix23<double>(0.0);
            Matrix23<double> c = new Matrix23<double>(
                1.0, 2.0,
                3.0, 4.0,
                5.0, 6.0);

            Assert.IsTrue(a.Equals(c));
            Assert.IsTrue(c.Equals(a));
            Assert.IsTrue(a == c);
            Assert.IsTrue(c == a);
            Assert.IsFalse(c != a);
            Assert.IsFalse(c != a);
            Assert.IsFalse(a.Equals(b));
            Assert.IsFalse(b.Equals(a));
            Assert.IsFalse(a == b);
            Assert.IsFalse(b == a);
            Assert.IsTrue(a != b);
            Assert.IsTrue(b != a);

            object objA = a;
            object objB = b;
            object objC = c;

            Assert.IsTrue(a.Equals(objA));
            Assert.IsTrue(a.Equals(objC));
            Assert.IsFalse(a.Equals(objB));

            Assert.IsTrue(objA.Equals(objC));
            Assert.IsFalse(objA.Equals(objB));

            Assert.IsFalse(a.Equals(null));
            Assert.IsFalse(a.Equals(5));
        }
Exemple #11
0
        public void Matrix23()
        {
            string fs =
                @"#version 330

                  uniform mat2x3 exampleMat23;
                  out vec3 FragColor;

                  void main()
                  {
                      FragColor = vec3(exampleMat23[0].z, exampleMat23[1].x, 0.0);
                  }";

            using (GraphicsWindow window = Device.CreateWindow(1, 1))
            using (Framebuffer framebuffer = TestUtility.CreateFramebuffer(window.Context))
            using (ShaderProgram sp = Device.CreateShaderProgram(ShaderSources.PassThroughVertexShader(), fs))
            using (VertexArray va = TestUtility.CreateVertexArray(window.Context, sp.VertexAttributes["position"].Location))
            {
                Matrix23<float> m23 = new Matrix23<float>(
                        0.0f, 1.0f,
                        0.0f, 0.0f,
                        1.0f, 0.0f);
                Uniform<Matrix23<float>> exampleMat23 = (Uniform<Matrix23<float>>)sp.Uniforms["exampleMat23"];
                Assert.AreEqual("exampleMat23", exampleMat23.Name);
                Assert.AreEqual(UniformType.FloatMatrix23, exampleMat23.Datatype);
                Assert.AreEqual(new Matrix23<float>(), exampleMat23.Value);
                exampleMat23.Value = m23;
                Assert.AreEqual(m23, exampleMat23.Value);

                window.Context.Framebuffer = framebuffer;
                window.Context.Draw(PrimitiveType.Points, 0, 1, new DrawState(TestUtility.CreateRenderStateWithoutDepthTest(), sp, va), new SceneState());
                TestUtility.ValidateColor(framebuffer.ColorAttachments[0], 255, 255, 0);
            }
        }
        public void TestGetHashCode()
        {
            Matrix23<double> a = new Matrix23<double>(
                1.0, 2.0,
                3.0, 4.0,
                5.0, 6.0);
            Matrix23<double> b = new Matrix23<double>(0.0);
            Matrix23<double> c = new Matrix23<double>(
                1.0, 2.0,
                3.0, 4.0,
                5.0, 6.0);

            Assert.AreEqual(a.GetHashCode(), c.GetHashCode());
            Assert.AreNotEqual(a.GetHashCode(), b.GetHashCode());
        }