Copy vector and matrix structs from OpenTK and cleanup

I managed to trim the > 5000 LOC of the original 4 files down to 400 LOC \o/
This commit is contained in:
YoshiRulz 2021-03-18 12:34:17 +10:00 committed by James Groom
parent 337b054042
commit f36fc654ca
20 changed files with 455 additions and 65 deletions

View File

@ -3,8 +3,6 @@
using System;
using System.Drawing.Imaging;
using OpenTK;
using sd = System.Drawing;
namespace BizHawk.Bizware.BizwareGL
@ -16,21 +14,15 @@ namespace BizHawk.Bizware.BizwareGL
Owner = gl;
}
private readonly OpenTK.Graphics.Color4[] CornerColors =
{
new OpenTK.Graphics.Color4(1.0f,1.0f,1.0f,1.0f),
new OpenTK.Graphics.Color4(1.0f,1.0f,1.0f,1.0f),
new OpenTK.Graphics.Color4(1.0f,1.0f,1.0f,1.0f),
new OpenTK.Graphics.Color4(1.0f,1.0f,1.0f,1.0f)
};
private readonly Vector4[] CornerColors = { new(1.0f, 1.0f, 1.0f, 1.0f), new(1.0f, 1.0f, 1.0f, 1.0f), new(1.0f, 1.0f, 1.0f, 1.0f), new(1.0f, 1.0f, 1.0f, 1.0f) };
public void SetCornerColor(int which, OpenTK.Graphics.Color4 color)
public void SetCornerColor(int which, Vector4 color)
{
CornerColors[which] = color;
}
/// <exception cref="ArgumentException"><paramref name="colors"/> does not have exactly <c>4</c> elements</exception>
public void SetCornerColors(OpenTK.Graphics.Color4[] colors)
public void SetCornerColors(Vector4[] colors)
{
Flush(); //don't really need to flush with current implementation. we might as well roll modulate color into it too.
if (colors.Length != 4) throw new ArgumentException("array must be size 4", nameof(colors));

View File

@ -4,7 +4,6 @@
using System;
using System.Diagnostics;
using OpenTK;
using sd = System.Drawing;
@ -49,19 +48,16 @@ namespace BizHawk.Bizware.BizwareGL
CurrPipeline = DefaultPipeline = Owner.CreatePipeline(VertexLayout, vs, ps, true, "xgui");
}
private readonly OpenTK.Graphics.Color4[] CornerColors = new OpenTK.Graphics.Color4[4] {
new OpenTK.Graphics.Color4(1.0f,1.0f,1.0f,1.0f),new OpenTK.Graphics.Color4(1.0f,1.0f,1.0f,1.0f),new OpenTK.Graphics.Color4(1.0f,1.0f,1.0f,1.0f),new OpenTK.Graphics.Color4(1.0f,1.0f,1.0f,1.0f)
};
private readonly Vector4[] CornerColors = { new(1.0f, 1.0f, 1.0f, 1.0f), new(1.0f, 1.0f, 1.0f, 1.0f), new(1.0f, 1.0f, 1.0f, 1.0f), new(1.0f, 1.0f, 1.0f, 1.0f) };
public void SetCornerColor(int which, OpenTK.Graphics.Color4 color)
public void SetCornerColor(int which, Vector4 color)
{
Flush(); //don't really need to flush with current implementation. we might as well roll modulate color into it too.
CornerColors[which] = color;
}
/// <exception cref="ArgumentException"><paramref name="colors"/> does not have exactly <c>4</c> elements</exception>
public void SetCornerColors(OpenTK.Graphics.Color4[] colors)
public void SetCornerColors(Vector4[] colors)
{
Flush(); //don't really need to flush with current implementation. we might as well roll modulate color into it too.
if (colors.Length != 4) throw new ArgumentException("array must be size 4", nameof(colors));
@ -243,10 +239,10 @@ namespace BizHawk.Bizware.BizwareGL
else { v0 = art.v0; v1 = art.v1; }
float[] data = new float[32] {
x,y, u0,v0, CornerColors[0].R, CornerColors[0].G, CornerColors[0].B, CornerColors[0].A,
x+art.Width,y, u1,v0, CornerColors[1].R, CornerColors[1].G, CornerColors[1].B, CornerColors[1].A,
x,y+art.Height, u0,v1, CornerColors[2].R, CornerColors[2].G, CornerColors[2].B, CornerColors[2].A,
x+art.Width,y+art.Height, u1,v1, CornerColors[3].R, CornerColors[3].G, CornerColors[3].B, CornerColors[3].A,
x,y, u0,v0, CornerColors[0].X, CornerColors[0].Y, CornerColors[0].Z, CornerColors[0].W,
x+art.Width,y, u1,v0, CornerColors[1].X, CornerColors[1].Y, CornerColors[1].Z, CornerColors[1].W,
x,y+art.Height, u0,v1, CornerColors[2].X, CornerColors[2].Y, CornerColors[2].Z, CornerColors[2].W,
x+art.Width,y+art.Height, u1,v1, CornerColors[3].X, CornerColors[3].Y, CornerColors[3].Z, CornerColors[3].W,
};
Texture2d tex = art.BaseTexture;
@ -295,34 +291,34 @@ namespace BizHawk.Bizware.BizwareGL
pData[1] = y;
pData[2] = u0;
pData[3] = v0;
pData[4] = CornerColors[0].R;
pData[5] = CornerColors[0].G;
pData[6] = CornerColors[0].B;
pData[7] = CornerColors[0].A;
pData[4] = CornerColors[0].X;
pData[5] = CornerColors[0].Y;
pData[6] = CornerColors[0].Z;
pData[7] = CornerColors[0].W;
pData[8] = x + w;
pData[9] = y;
pData[10] = u1;
pData[11] = v0;
pData[12] = CornerColors[1].R;
pData[13] = CornerColors[1].G;
pData[14] = CornerColors[1].B;
pData[15] = CornerColors[1].A;
pData[12] = CornerColors[1].X;
pData[13] = CornerColors[1].Y;
pData[14] = CornerColors[1].Z;
pData[15] = CornerColors[1].W;
pData[16] = x;
pData[17] = y + h;
pData[18] = u0;
pData[19] = v1;
pData[20] = CornerColors[2].R;
pData[21] = CornerColors[2].G;
pData[22] = CornerColors[2].B;
pData[23] = CornerColors[2].A;
pData[20] = CornerColors[2].X;
pData[21] = CornerColors[2].Y;
pData[22] = CornerColors[2].Z;
pData[23] = CornerColors[2].W;
pData[24] = x + w;
pData[25] = y + h;
pData[26] = u1;
pData[27] = v1;
pData[28] = CornerColors[3].R;
pData[29] = CornerColors[3].G;
pData[30] = CornerColors[3].B;
pData[31] = CornerColors[3].A;
pData[28] = CornerColors[3].X;
pData[29] = CornerColors[3].Y;
pData[30] = CornerColors[3].Z;
pData[31] = CornerColors[3].W;
Owner.BindArrayData(pData);
Owner.DrawArrays(PrimitiveType.TriangleStrip, 0, 4);

View File

@ -2,8 +2,6 @@ using System;
using System.IO;
using System.Drawing;
using OpenTK;
namespace BizHawk.Bizware.BizwareGL
{

View File

@ -24,7 +24,7 @@ namespace BizHawk.Bizware.BizwareGL
/// <summary>
/// draws the specified Art resource with the specified offset. This could be tricky if youve applied other rotate or scale transforms first.
/// </summary>
void Draw(Art art, OpenTK.Vector2 pos);
void Draw(Art art, Vector2 pos);
/// <summary>
/// draws the specified Art resource with the specified offset. This could be tricky if youve applied other rotate or scale transforms first.
@ -83,12 +83,14 @@ namespace BizHawk.Bizware.BizwareGL
/// <summary>
/// Sets the specified corner color (for the gradient effect)
/// </summary>
void SetCornerColor(int which, OpenTK.Graphics.Color4 color);
/// <remarks>(x, y, z, w) is (r, g, b, a)</remarks>
void SetCornerColor(int which, Vector4 color);
/// <summary>
/// Sets all four corner colors at once
/// </summary>
void SetCornerColors(OpenTK.Graphics.Color4[] colors);
/// <remarks>(x, y, z, w) is (r, g, b, a)</remarks>
void SetCornerColors(Vector4[] colors);
/// <summary>
/// Restores the pipeline to the default

View File

@ -1,8 +1,6 @@
using System.Drawing;
using System.Collections.Generic;
using OpenTK;
namespace BizHawk.Bizware.BizwareGL
{
//note: the sense of these matrices, as well as pre- and post- multiplying may be all mixed up.
@ -67,9 +65,9 @@ namespace BizHawk.Bizware.BizwareGL
public void Pop() { Top = stack.Pop(); IsDirty = true; }
public void Push() { stack.Push(Top); IsDirty = true; }
public void RotateAxis(Vector3 axisRotation, float angle) { PostMultiplyMatrix(Matrix4.CreateFromAxisAngle(axisRotation, angle)); IsDirty = true; }
public void RotateAxis(Vector3 axisRotation, float angle) { PostMultiplyMatrix(Matrix4.CreateFromAxisAngle(in axisRotation, angle)); IsDirty = true; }
public void Scale(Vector3 scale) { PostMultiplyMatrix(Matrix4.CreateScale(scale)); IsDirty = true; }
public void Scale(Vector3 scale) { PostMultiplyMatrix(Matrix4.CreateScale(in scale)); IsDirty = true; }
public void Scale(Vector2 scale) { PostMultiplyMatrix(Matrix4.CreateScale(scale.X, scale.Y, 1)); IsDirty = true; }
public void Scale(float x, float y, float z) { PostMultiplyMatrix(Matrix4.CreateScale(x, y, z)); IsDirty = true; }
public void Scale(float ratio) { Scale(ratio, ratio, ratio); IsDirty = true; }
@ -81,7 +79,7 @@ namespace BizHawk.Bizware.BizwareGL
public void RotateZ(float degrees) { PostMultiplyMatrix(Matrix4.CreateRotationZ(DegreesToRadians(degrees))); IsDirty = true; }
public void Translate(Vector2 v) { Translate(v.X, v.Y, 0); IsDirty = true; }
public void Translate(Vector3 trans) { PostMultiplyMatrix(Matrix4.CreateTranslation(trans)); IsDirty = true; }
public void Translate(Vector3 trans) { PostMultiplyMatrix(Matrix4.CreateTranslation(in trans)); IsDirty = true; }
public void Translate(float x, float y, float z) { PostMultiplyMatrix(Matrix4.CreateTranslation(x, y, z)); IsDirty = true; }
public void Translate(float x, float y) { Translate(x, y, 0); IsDirty = true; }
public void Translate(Point pt) { Translate(pt.X, pt.Y, 0); IsDirty = true; }

View File

@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
using OpenTK;
namespace BizHawk.Bizware.BizwareGL
{
/// <summary>

View File

@ -1,8 +1,6 @@
using System;
using System.Drawing;
using OpenTK;
namespace BizHawk.Bizware.BizwareGL
{
/// <summary>

View File

@ -0,0 +1,321 @@
using System;
namespace BizHawk.Bizware.BizwareGL
{
public struct Matrix4
{
public static readonly Matrix4 Identity = new(new(1.0f, 0.0f, 0.0f, 0.0f), new(0.0f, 1.0f, 0.0f, 0.0f), new(0.0f, 0.0f, 1.0f, 0.0f), new(0.0f, 0.0f, 0.0f, 1.0f));
public static bool AreEqual(in Matrix4 a, in Matrix4 b) => Vector4.AreEqual(in a.Row0, in b.Row0) && Vector4.AreEqual(in a.Row1, in b.Row1) && Vector4.AreEqual(in a.Row2, in b.Row2) && Vector4.AreEqual(in a.Row3, in b.Row3);
/// <returns>a <see cref="Matrix4"/> representing a rotation of <paramref name="angle"/> radians CCW around the given <paramref name="axis"/></returns>
public static Matrix4 CreateFromAxisAngle(in Vector3 axis, float angle)
{
var num0 = (float) (1.0 / Math.Sqrt(axis.X * (double) axis.X + axis.Y * (double) axis.Y + axis.Z * (double) axis.Z));
var x = axis.X * num0;
var y = axis.Y * num0;
var z = axis.Z * num0;
var num1 = (float) Math.Cos(-(double) angle);
var num2 = (float) Math.Sin(-(double) angle);
var num3 = 1.0f - num1;
var num4 = num3 * x * x;
var num5 = num3 * x * y;
var num6 = num3 * x * z;
var num7 = num3 * y * y;
var num8 = num3 * y * z;
var num9 = num3 * z * z;
var num10 = num2 * x;
var num11 = num2 * y;
var num12 = num2 * z;
return new(
new(num4 + num1, num5 - num12, num6 + num11, 0.0f),
new(num5 + num12, num7 + num1, num8 - num10, 0.0f),
new(num6 - num11, num8 + num10, num9 + num1, 0.0f),
new(0.0f, 0.0f, 0.0f, 1.0f));
}
/// <returns>a <see cref="Matrix4"/> representing a rotation of <paramref name="angle"/> radians CCW around the X-axis</returns>
public static Matrix4 CreateRotationX(float angle)
{
var num1 = (float) Math.Cos(angle);
var num2 = (float) Math.Sin(angle);
var result = Identity; // copy
result.Row1.Y = num1;
result.Row1.Z = num2;
result.Row2.Y = -num2;
result.Row2.Z = num1;
return result;
}
/// <returns>a <see cref="Matrix4"/> representing a rotation of <paramref name="angle"/> radians CCW around the Y-axis</returns>
public static Matrix4 CreateRotationY(float angle)
{
var num1 = (float) Math.Cos(angle);
var num2 = (float) Math.Sin(angle);
var result = Identity; // copy
result.Row0.X = num1;
result.Row0.Z = -num2;
result.Row2.X = num2;
result.Row2.Z = num1;
return result;
}
/// <returns>a <see cref="Matrix4"/> representing a rotation of <paramref name="angle"/> radians CCW around the Z-axis</returns>
public static Matrix4 CreateRotationZ(float angle)
{
var num1 = (float) Math.Cos(angle);
var num2 = (float) Math.Sin(angle);
var result = Identity; // copy
result.Row0.X = num1;
result.Row0.Y = num2;
result.Row1.X = -num2;
result.Row1.Y = num1;
return result;
}
/// <returns>a <see cref="Matrix4"/> representing a scaling</returns>
public static Matrix4 CreateScale(float x, float y, float z)
{
var result = Identity; // copy
result.Row0.X = x;
result.Row1.Y = y;
result.Row2.Z = z;
return result;
}
/// <returns>a <see cref="Matrix4"/> representing a scaling</returns>
public static Matrix4 CreateScale(in Vector3 scale)
{
var result = Identity; // copy
result.Row0.X = scale.X;
result.Row1.Y = scale.Y;
result.Row2.Z = scale.Z;
return result;
}
/// <returns>a <see cref="Matrix4"/> representing a translation</returns>
public static Matrix4 CreateTranslation(float x, float y, float z)
{
var result = Identity; // copy
result.Row3.X = x;
result.Row3.Y = y;
result.Row3.Z = z;
return result;
}
/// <returns>a <see cref="Matrix4"/> representing a translation</returns>
public static Matrix4 CreateTranslation(in Vector3 vector)
{
var result = Identity; // copy
result.Row3.X = vector.X;
result.Row3.Y = vector.Y;
result.Row3.Z = vector.Z;
return result;
}
private static float GetDeterminant(in Matrix4 m)
{
var x1 = (double) m.Row0.X;
var y1 = (double) m.Row0.Y;
var z1 = (double) m.Row0.Z;
var w1 = (double) m.Row0.W;
var x2 = (double) m.Row1.X;
var y2 = (double) m.Row1.Y;
var z2 = (double) m.Row1.Z;
var w2 = (double) m.Row1.W;
var x3 = (double) m.Row2.X;
var y3 = (double) m.Row2.Y;
var z3 = (double) m.Row2.Z;
var w3 = (double) m.Row2.W;
var x4 = (double) m.Row3.X;
var y4 = (double) m.Row3.Y;
var z4 = (double) m.Row3.Z;
var w4 = (double) m.Row3.W;
return (float) (x1 * y2 * z3 * w4
- x1 * y2 * w3 * z4
+ x1 * z2 * w3 * y4
- x1 * z2 * y3 * w4
+ x1 * w2 * y3 * z4
- x1 * w2 * z3 * y4
- y1 * z2 * w3 * x4
+ y1 * z2 * x3 * w4
- y1 * w2 * x3 * z4
+ y1 * w2 * z3 * x4
- y1 * x2 * z3 * w4
+ y1 * x2 * w3 * z4
+ z1 * w2 * x3 * y4
- z1 * w2 * y3 * x4
+ z1 * x2 * y3 * w4
- z1 * x2 * w3 * y4
+ z1 * y2 * w3 * x4
- z1 * y2 * x3 * w4
- w1 * x2 * y3 * z4
+ w1 * x2 * z3 * y4
- w1 * y2 * z3 * x4
+ w1 * y2 * x3 * z4
- w1 * z2 * x3 * y4
+ w1 * z2 * y3 * x4);
}
private static unsafe Matrix4 Invert(in Matrix4 mat)
{
var pDbTemp = stackalloc double[16];
fixed (Matrix4* pMatIn = &mat)
{
var pFlIn = (float*) pMatIn;
for (var i = 0; i < 16; i++) pDbTemp[i] = pFlIn[i];
}
Matrix4 result = new();
ref var refResult = ref result;
fixed (Matrix4* pMatOut = &refResult)
{
var pFlOut = (float*) pMatOut;
pFlOut[0] = (float) (pDbTemp[5] * pDbTemp[10] * pDbTemp[15] - pDbTemp[5] * pDbTemp[11] * pDbTemp[14] - pDbTemp[9] * pDbTemp[6] * pDbTemp[15] + pDbTemp[9] * pDbTemp[7] * pDbTemp[14] + pDbTemp[13] * pDbTemp[6] * pDbTemp[11] - pDbTemp[13] * pDbTemp[7] * pDbTemp[10]);
pFlOut[4] = (float) (-pDbTemp[4] * pDbTemp[10] * pDbTemp[15] + pDbTemp[4] * pDbTemp[11] * pDbTemp[14] + pDbTemp[8] * pDbTemp[6] * pDbTemp[15] - pDbTemp[8] * pDbTemp[7] * pDbTemp[14] - pDbTemp[12] * pDbTemp[6] * pDbTemp[11] + pDbTemp[12] * pDbTemp[7] * pDbTemp[10]);
pFlOut[8] = (float) (pDbTemp[4] * pDbTemp[9] * pDbTemp[15] - pDbTemp[4] * pDbTemp[11] * pDbTemp[13] - pDbTemp[8] * pDbTemp[5] * pDbTemp[15] + pDbTemp[8] * pDbTemp[7] * pDbTemp[13] + pDbTemp[12] * pDbTemp[5] * pDbTemp[11] - pDbTemp[12] * pDbTemp[7] * pDbTemp[9]);
pFlOut[12] = (float) (-pDbTemp[4] * pDbTemp[9] * pDbTemp[14] + pDbTemp[4] * pDbTemp[10] * pDbTemp[13] + pDbTemp[8] * pDbTemp[5] * pDbTemp[14] - pDbTemp[8] * pDbTemp[6] * pDbTemp[13] - pDbTemp[12] * pDbTemp[5] * pDbTemp[10] + pDbTemp[12] * pDbTemp[6] * pDbTemp[9]);
pFlOut[1] = (float) (-pDbTemp[1] * pDbTemp[10] * pDbTemp[15] + pDbTemp[1] * pDbTemp[11] * pDbTemp[14] + pDbTemp[9] * pDbTemp[2] * pDbTemp[15] - pDbTemp[9] * pDbTemp[3] * pDbTemp[14] - pDbTemp[13] * pDbTemp[2] * pDbTemp[11] + pDbTemp[13] * pDbTemp[3] * pDbTemp[10]);
pFlOut[5] = (float) (pDbTemp[0] * pDbTemp[10] * pDbTemp[15] - pDbTemp[0] * pDbTemp[11] * pDbTemp[14] - pDbTemp[8] * pDbTemp[2] * pDbTemp[15] + pDbTemp[8] * pDbTemp[3] * pDbTemp[14] + pDbTemp[12] * pDbTemp[2] * pDbTemp[11] - pDbTemp[12] * pDbTemp[3] * pDbTemp[10]);
pFlOut[9] = (float) (-pDbTemp[0] * pDbTemp[9] * pDbTemp[15] + pDbTemp[0] * pDbTemp[11] * pDbTemp[13] + pDbTemp[8] * pDbTemp[1] * pDbTemp[15] - pDbTemp[8] * pDbTemp[3] * pDbTemp[13] - pDbTemp[12] * pDbTemp[1] * pDbTemp[11] + pDbTemp[12] * pDbTemp[3] * pDbTemp[9]);
pFlOut[13] = (float) (pDbTemp[0] * pDbTemp[9] * pDbTemp[14] - pDbTemp[0] * pDbTemp[10] * pDbTemp[13] - pDbTemp[8] * pDbTemp[1] * pDbTemp[14] + pDbTemp[8] * pDbTemp[2] * pDbTemp[13] + pDbTemp[12] * pDbTemp[1] * pDbTemp[10] - pDbTemp[12] * pDbTemp[2] * pDbTemp[9]);
pFlOut[2] = (float) (pDbTemp[1] * pDbTemp[6] * pDbTemp[15] - pDbTemp[1] * pDbTemp[7] * pDbTemp[14] - pDbTemp[5] * pDbTemp[2] * pDbTemp[15] + pDbTemp[5] * pDbTemp[3] * pDbTemp[14] + pDbTemp[13] * pDbTemp[2] * pDbTemp[7] - pDbTemp[13] * pDbTemp[3] * pDbTemp[6]);
pFlOut[6] = (float) (-pDbTemp[0] * pDbTemp[6] * pDbTemp[15] + pDbTemp[0] * pDbTemp[7] * pDbTemp[14] + pDbTemp[4] * pDbTemp[2] * pDbTemp[15] - pDbTemp[4] * pDbTemp[3] * pDbTemp[14] - pDbTemp[12] * pDbTemp[2] * pDbTemp[7] + pDbTemp[12] * pDbTemp[3] * pDbTemp[6]);
pFlOut[10] = (float) (pDbTemp[0] * pDbTemp[5] * pDbTemp[15] - pDbTemp[0] * pDbTemp[7] * pDbTemp[13] - pDbTemp[4] * pDbTemp[1] * pDbTemp[15] + pDbTemp[4] * pDbTemp[3] * pDbTemp[13] + pDbTemp[12] * pDbTemp[1] * pDbTemp[7] - pDbTemp[12] * pDbTemp[3] * pDbTemp[5]);
pFlOut[14] = (float) (-pDbTemp[0] * pDbTemp[5] * pDbTemp[14] + pDbTemp[0] * pDbTemp[6] * pDbTemp[13] + pDbTemp[4] * pDbTemp[1] * pDbTemp[14] - pDbTemp[4] * pDbTemp[2] * pDbTemp[13] - pDbTemp[12] * pDbTemp[1] * pDbTemp[6] + pDbTemp[12] * pDbTemp[2] * pDbTemp[5]);
pFlOut[3] = (float) (-pDbTemp[1] * pDbTemp[6] * pDbTemp[11] + pDbTemp[1] * pDbTemp[7] * pDbTemp[10] + pDbTemp[5] * pDbTemp[2] * pDbTemp[11] - pDbTemp[5] * pDbTemp[3] * pDbTemp[10] - pDbTemp[9] * pDbTemp[2] * pDbTemp[7] + pDbTemp[9] * pDbTemp[3] * pDbTemp[6]);
pFlOut[7] = (float) (pDbTemp[0] * pDbTemp[6] * pDbTemp[11] - pDbTemp[0] * pDbTemp[7] * pDbTemp[10] - pDbTemp[4] * pDbTemp[2] * pDbTemp[11] + pDbTemp[4] * pDbTemp[3] * pDbTemp[10] + pDbTemp[8] * pDbTemp[2] * pDbTemp[7] - pDbTemp[8] * pDbTemp[3] * pDbTemp[6]);
pFlOut[11] = (float) (-pDbTemp[0] * pDbTemp[5] * pDbTemp[11] + pDbTemp[0] * pDbTemp[7] * pDbTemp[9] + pDbTemp[4] * pDbTemp[1] * pDbTemp[11] - pDbTemp[4] * pDbTemp[3] * pDbTemp[9] - pDbTemp[8] * pDbTemp[1] * pDbTemp[7] + pDbTemp[8] * pDbTemp[3] * pDbTemp[5]);
pFlOut[15] = (float) (pDbTemp[0] * pDbTemp[5] * pDbTemp[10] - pDbTemp[0] * pDbTemp[6] * pDbTemp[9] - pDbTemp[4] * pDbTemp[1] * pDbTemp[10] + pDbTemp[4] * pDbTemp[2] * pDbTemp[9] + pDbTemp[8] * pDbTemp[1] * pDbTemp[6] - pDbTemp[8] * pDbTemp[2] * pDbTemp[5]);
var num1 = (float) (pDbTemp[0] * pFlOut[0] + pDbTemp[1] * pFlOut[4] + pDbTemp[2] * pFlOut[8] + pDbTemp[3] * pFlOut[12]);
if (num1 == 0.0f) throw new InvalidOperationException("Matrix is singular and cannot be inverted.");
var num2 = 1.0f / num1;
for (var i = 0; i < 16; i++) pFlOut[i] *= num2;
}
return result;
}
public static Matrix4 Transpose(in Matrix4 mat) => new(
new(mat.Row0.X, mat.Row1.X, mat.Row2.X, mat.Row3.X),
new(mat.Row0.Y, mat.Row1.Y, mat.Row2.Y, mat.Row3.Y),
new(mat.Row0.Z, mat.Row1.Z, mat.Row2.Z, mat.Row3.Z),
new(mat.Row0.W, mat.Row1.W, mat.Row2.W, mat.Row3.W));
public static bool operator ==(in Matrix4 a, in Matrix4 b) => AreEqual(in a, in b);
public static bool operator !=(in Matrix4 a, in Matrix4 b) => !AreEqual(in a, in b);
/// <summary>Matrix multiplication</summary>
/// <param name="left">left-hand operand</param>
/// <param name="right">right-hand operand</param>
/// <returns>A new Matrix4 which holds the result of the multiplication</returns>
public static Matrix4 operator *(in Matrix4 left, in Matrix4 right)
{
var x1 = (double) left.Row0.X;
var y1 = (double) left.Row0.Y;
var z1 = (double) left.Row0.Z;
var w1 = (double) left.Row0.W;
var x2 = (double) left.Row1.X;
var y2 = (double) left.Row1.Y;
var z2 = (double) left.Row1.Z;
var w2 = (double) left.Row1.W;
var x3 = (double) left.Row2.X;
var y3 = (double) left.Row2.Y;
var z3 = (double) left.Row2.Z;
var w3 = (double) left.Row2.W;
var x4 = (double) left.Row3.X;
var y4 = (double) left.Row3.Y;
var z4 = (double) left.Row3.Z;
var w4 = (double) left.Row3.W;
var x5 = (double) right.Row0.X;
var y5 = (double) right.Row0.Y;
var z5 = (double) right.Row0.Z;
var w5 = (double) right.Row0.W;
var x6 = (double) right.Row1.X;
var y6 = (double) right.Row1.Y;
var z6 = (double) right.Row1.Z;
var w6 = (double) right.Row1.W;
var x7 = (double) right.Row2.X;
var y7 = (double) right.Row2.Y;
var z7 = (double) right.Row2.Z;
var w7 = (double) right.Row2.W;
var x8 = (double) right.Row3.X;
var y8 = (double) right.Row3.Y;
var z8 = (double) right.Row3.Z;
var w8 = (double) right.Row3.W;
Matrix4 result;
result.Row0.X = (float) (x1 * x5 + y1 * x6 + z1 * x7 + w1 * x8);
result.Row0.Y = (float) (x1 * y5 + y1 * y6 + z1 * y7 + w1 * y8);
result.Row0.Z = (float) (x1 * z5 + y1 * z6 + z1 * z7 + w1 * z8);
result.Row0.W = (float) (x1 * w5 + y1 * w6 + z1 * w7 + w1 * w8);
result.Row1.X = (float) (x2 * x5 + y2 * x6 + z2 * x7 + w2 * x8);
result.Row1.Y = (float) (x2 * y5 + y2 * y6 + z2 * y7 + w2 * y8);
result.Row1.Z = (float) (x2 * z5 + y2 * z6 + z2 * z7 + w2 * z8);
result.Row1.W = (float) (x2 * w5 + y2 * w6 + z2 * w7 + w2 * w8);
result.Row2.X = (float) (x3 * x5 + y3 * x6 + z3 * x7 + w3 * x8);
result.Row2.Y = (float) (x3 * y5 + y3 * y6 + z3 * y7 + w3 * y8);
result.Row2.Z = (float) (x3 * z5 + y3 * z6 + z3 * z7 + w3 * z8);
result.Row2.W = (float) (x3 * w5 + y3 * w6 + z3 * w7 + w3 * w8);
result.Row3.X = (float) (x4 * x5 + y4 * x6 + z4 * x7 + w4 * x8);
result.Row3.Y = (float) (x4 * y5 + y4 * y6 + z4 * y7 + w4 * y8);
result.Row3.Z = (float) (x4 * z5 + y4 * z6 + z4 * z7 + w4 * z8);
result.Row3.W = (float) (x4 * w5 + y4 * w6 + z4 * w7 + w4 * w8);
return result;
}
/// <returns><paramref name="vec"/> transformed by <paramref name="mat"/></returns>
public static Vector4 operator *(in Vector4 vec, in Matrix4 mat) => new(
(float) (vec.X * (double) mat.Row0.X + vec.Y * (double) mat.Row1.X + vec.Z * (double) mat.Row2.X + vec.W * (double) mat.Row3.X),
(float) (vec.X * (double) mat.Row0.Y + vec.Y * (double) mat.Row1.Y + vec.Z * (double) mat.Row2.Y + vec.W * (double) mat.Row3.Y),
(float) (vec.X * (double) mat.Row0.Z + vec.Y * (double) mat.Row1.Z + vec.Z * (double) mat.Row2.Z + vec.W * (double) mat.Row3.Z),
(float) (vec.X * (double) mat.Row0.W + vec.Y * (double) mat.Row1.W + vec.Z * (double) mat.Row2.W + vec.W * (double) mat.Row3.W));
/// <summary>Top row of the matrix.</summary>
public Vector4 Row0;
/// <summary>2nd row of the matrix.</summary>
public Vector4 Row1;
/// <summary>3rd row of the matrix.</summary>
public Vector4 Row2;
/// <summary>Bottom row of the matrix.</summary>
public Vector4 Row3;
/// <param name="row0">Top row of the matrix.</param>
/// <param name="row1">Second row of the matrix.</param>
/// <param name="row2">Third row of the matrix.</param>
/// <param name="row3">Bottom row of the matrix.</param>
public Matrix4(Vector4 row0, Vector4 row1, Vector4 row2, Vector4 row3)
{
Row0 = row0;
Row1 = row1;
Row2 = row2;
Row3 = row3;
}
public unsafe float this[int rowIndex, int columnIndex]
{
readonly get
{
var i = rowIndex * 4 + columnIndex;
if (i < 0 || 15 < i) throw new IndexOutOfRangeException($"no such element m[{rowIndex}, {columnIndex}] of {nameof(Matrix4)}");
fixed (Matrix4* p = &this) return ((float*) p)[i];
}
set
{
var i = rowIndex * 4 + columnIndex;
if (i < 0 || 15 < i) throw new IndexOutOfRangeException($"no such element m[{rowIndex}, {columnIndex}] of {nameof(Matrix4)}");
fixed (Matrix4* p = &this) ((float*) p)[i] = value;
}
}
/// <returns>an inverted copy of this instance, or an identical copy if it is singular</returns>
public readonly Matrix4 Inverted() => GetDeterminant(in this) == 0.0f ? this : Invert(in this);
public override readonly bool Equals(object obj) => obj is Matrix4 other && AreEqual(in this, in other);
public override readonly int GetHashCode() => ((Row0.GetHashCode() * 397 ^ Row1.GetHashCode()) * 397 ^ Row2.GetHashCode()) * 397 ^ Row3.GetHashCode();
public override readonly string ToString() => string.Join("\n", Row0, Row1, Row2, Row3);
}
}

View File

@ -0,0 +1,29 @@
namespace BizHawk.Bizware.BizwareGL
{
public struct Vector2
{
public static bool AreEqual(in Vector2 a, in Vector2 b) => a.X == b.X && a.Y == b.Y;
public static bool operator ==(in Vector2 a, in Vector2 b) => AreEqual(in a, in b);
public static bool operator !=(in Vector2 a, in Vector2 b) => !AreEqual(in a, in b);
public static Vector2 operator +(in Vector2 left, in Vector2 right) => new(left.X + right.X, left.Y + right.Y);
public float X;
public float Y;
public Vector2(float x, float y)
{
X = x;
Y = y;
}
public override readonly bool Equals(object obj) => obj is Vector2 other && AreEqual(in this, in other);
public override readonly int GetHashCode() => X.GetHashCode() * 397 ^ Y.GetHashCode();
public override readonly string ToString() => $"({X}, {Y})";
}
}

View File

@ -0,0 +1,30 @@
namespace BizHawk.Bizware.BizwareGL
{
public readonly struct Vector3
{
public static bool AreEqual(in Vector3 a, in Vector3 b) => a.X == b.X && a.Y == b.Y && a.Z == b.Z;
public static bool operator ==(in Vector3 a, in Vector3 b) => AreEqual(in a, in b);
public static bool operator !=(in Vector3 a, in Vector3 b) => !AreEqual(in a, in b);
public readonly float X;
public readonly float Y;
public readonly float Z;
public Vector3(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
public override readonly bool Equals(object obj) => obj is Vector3 other && AreEqual(in this, in other);
public override readonly int GetHashCode() => (X.GetHashCode() * 397 ^ Y.GetHashCode()) * 397 ^ Z.GetHashCode();
public override readonly string ToString() => $"({X}, {Y}, {Z})";
}
}

View File

@ -0,0 +1,33 @@
namespace BizHawk.Bizware.BizwareGL
{
public struct Vector4
{
public static bool AreEqual(in Vector4 a, in Vector4 b) => a.X == b.X && a.Y == b.Y && a.Z == b.Z && a.W == b.W;
public static bool operator ==(in Vector4 a, in Vector4 b) => AreEqual(in a, in b);
public static bool operator !=(in Vector4 a, in Vector4 b) => !AreEqual(in a, in b);
public float X;
public float Y;
public float Z;
public float W;
public Vector4(float x, float y, float z, float w)
{
X = x;
Y = y;
Z = z;
W = w;
}
public override readonly bool Equals(object obj) => obj is Vector4 other && AreEqual(in this, in other);
public override readonly int GetHashCode() => ((X.GetHashCode() * 397 ^ Y.GetHashCode()) * 397 ^ Z.GetHashCode()) * 397 ^ W.GetHashCode();
public override readonly string ToString() => $"({X}, {Y}, {Z}, {W})";
}
}

View File

@ -6,7 +6,6 @@ using System.Threading;
using BizHawk.Bizware.BizwareGL;
using SlimDX.Direct3D9;
using OpenTK;
using PrimitiveType = SlimDX.Direct3D9.PrimitiveType;
using sd = System.Drawing;
@ -23,7 +22,7 @@ namespace BizHawk.Bizware.DirectX
private static Direct3D _d3d;
internal Device Dev;
private readonly INativeWindow _offscreenNativeWindow;
private readonly OpenTK.INativeWindow _offscreenNativeWindow;
// rendering state
private IntPtr _pVertexData;
@ -42,7 +41,7 @@ namespace BizHawk.Bizware.DirectX
OpenTKConfigurator.EnsureConfigurated();
// make an 'offscreen context' so we can at least do things without having to create a window
_offscreenNativeWindow = new NativeWindow { ClientSize = new Size(8, 8) };
_offscreenNativeWindow = new OpenTK.NativeWindow { ClientSize = new Size(8, 8) };
CreateDevice();
CreateRenderStates();

View File

@ -4,7 +4,7 @@ namespace BizHawk.Bizware.DirectX
{
internal static class Extensions
{
public static Matrix ToSlimDXMatrix(this OpenTK.Matrix4 m, bool transpose)
public static Matrix ToSlimDXMatrix(this BizwareGL.Matrix4 m, bool transpose)
{
Matrix ret = new()
{
@ -17,8 +17,8 @@ namespace BizHawk.Bizware.DirectX
return transpose ? Matrix.Transpose(ret) : ret;
}
public static Vector2 ToSlimDXVector2(this OpenTK.Vector2 v) => new(v.X, v.Y);
public static Vector2 ToSlimDXVector2(this BizwareGL.Vector2 v) => new(v.X, v.Y);
public static Vector4 ToSlimDXVector4(this OpenTK.Vector4 v) => new(v.X, v.Y, v.Z, v.W);
public static Vector4 ToSlimDXVector4(this BizwareGL.Vector4 v) => new(v.X, v.Y, v.Z, v.W);
}
}

View File

@ -4,7 +4,6 @@ using System.Drawing;
using BizHawk.Client.Common.Filters;
using BizHawk.Bizware.BizwareGL;
using OpenTK;
namespace BizHawk.Client.Common.FilterManager
{

View File

@ -3,7 +3,6 @@ using System.Drawing;
using BizHawk.Client.Common.FilterManager;
using BizHawk.Bizware.BizwareGL;
using OpenTK;
// Here's how to make a filter:
// 1. Reset your state entirely in Initialize().

View File

@ -4,7 +4,6 @@ using BizHawk.Client.Common.FilterManager;
using BizHawk.Emulation.Cores.Consoles.Nintendo.NDS;
using BizHawk.Bizware.BizwareGL;
using OpenTK;
namespace BizHawk.Client.Common.Filters
{

View File

@ -10,7 +10,6 @@ using System.Drawing;
using BizHawk.Client.Common.FilterManager;
using BizHawk.Bizware.BizwareGL;
using OpenTK;
namespace BizHawk.Client.Common.Filters
{

View File

@ -21,8 +21,6 @@ using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Sony.PSX;
using BizHawk.Emulation.Cores.Consoles.Nintendo.NDS;
using OpenTK;
namespace BizHawk.Client.EmuHawk
{
/// <summary>

View File

@ -1,7 +1,6 @@
using System;
using System.IO;
using System.Drawing;
using OpenTK;
using BizHawk.Bizware.BizwareGL;

View File

@ -22,10 +22,13 @@ using BlendEquationMode = OpenTK.Graphics.OpenGL.BlendEquationMode;
using BlendingFactorDest = OpenTK.Graphics.OpenGL.BlendingFactorDest;
using BlendingFactorSrc = OpenTK.Graphics.OpenGL.BlendingFactorSrc;
using ClearBufferMask = OpenTK.Graphics.OpenGL.ClearBufferMask;
using Matrix4 = BizHawk.Bizware.BizwareGL.Matrix4;
using PrimitiveType = OpenTK.Graphics.OpenGL.PrimitiveType;
using sd = System.Drawing;
using sdi = System.Drawing.Imaging;
using swf = System.Windows.Forms;
using Vector2 = BizHawk.Bizware.BizwareGL.Vector2;
using Vector4 = BizHawk.Bizware.BizwareGL.Vector4;
using VertexAttribPointerType = OpenTK.Graphics.OpenGL.VertexAttribPointerType;
namespace BizHawk.Client.EmuHawk