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; }
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; }
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)); }
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()); }