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:
parent
337b054042
commit
f36fc654ca
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -2,8 +2,6 @@ using System;
|
|||
using System.IO;
|
||||
using System.Drawing;
|
||||
|
||||
using OpenTK;
|
||||
|
||||
namespace BizHawk.Bizware.BizwareGL
|
||||
{
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using OpenTK;
|
||||
|
||||
namespace BizHawk.Bizware.BizwareGL
|
||||
{
|
||||
/// <summary>
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
using System;
|
||||
using System.Drawing;
|
||||
|
||||
using OpenTK;
|
||||
|
||||
namespace BizHawk.Bizware.BizwareGL
|
||||
{
|
||||
/// <summary>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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})";
|
||||
}
|
||||
}
|
|
@ -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})";
|
||||
}
|
||||
}
|
|
@ -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})";
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ using System.Drawing;
|
|||
using BizHawk.Client.Common.Filters;
|
||||
|
||||
using BizHawk.Bizware.BizwareGL;
|
||||
using OpenTK;
|
||||
|
||||
namespace BizHawk.Client.Common.FilterManager
|
||||
{
|
||||
|
|
|
@ -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().
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -10,7 +10,6 @@ using System.Drawing;
|
|||
using BizHawk.Client.Common.FilterManager;
|
||||
|
||||
using BizHawk.Bizware.BizwareGL;
|
||||
using OpenTK;
|
||||
|
||||
namespace BizHawk.Client.Common.Filters
|
||||
{
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using OpenTK;
|
||||
|
||||
using BizHawk.Bizware.BizwareGL;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue