diff --git a/ClassicalSharp/Entities/Components/PhysicsComponent.cs b/ClassicalSharp/Entities/Components/PhysicsComponent.cs
index e72818a03..e5dee8aa9 100644
--- a/ClassicalSharp/Entities/Components/PhysicsComponent.cs
+++ b/ClassicalSharp/Entities/Components/PhysicsComponent.cs
@@ -300,7 +300,8 @@ namespace ClassicalSharp.Entities {
if (dist < 0.002f || dist > 1f) continue; // TODO: range needs to be lower?
Vector3 dir = Vector3.Normalize(dX, 0, dZ);
- entity.Velocity -= dir * (1 - dist) / 32f; // TODO: should be 24/25
+ float pushStrength = (1 - dist) / 32f; // TODO: should be 24/25
+ entity.Velocity -= dir * pushStrength;
}
}
}
diff --git a/src/Client/Client.vcxproj b/src/Client/Client.vcxproj
index 7b8583892..ecc15ef4f 100644
--- a/src/Client/Client.vcxproj
+++ b/src/Client/Client.vcxproj
@@ -240,7 +240,6 @@
-
@@ -298,7 +297,6 @@
-
diff --git a/src/Client/Client.vcxproj.filters b/src/Client/Client.vcxproj.filters
index 365d8f888..587b5ca64 100644
--- a/src/Client/Client.vcxproj.filters
+++ b/src/Client/Client.vcxproj.filters
@@ -171,9 +171,6 @@
Header Files\Blocks
-
- Header Files\Math
-
Header Files\2D\Utils
@@ -395,9 +392,6 @@
Source Files\Blocks
-
- Source Files\Math
-
Source Files\2D\Utils
diff --git a/src/Client/Entity.h b/src/Client/Entity.h
index 2d49b2ba6..f35f1a2a9 100644
--- a/src/Client/Entity.h
+++ b/src/Client/Entity.h
@@ -6,7 +6,6 @@
#include "Vectors.h"
#include "AABB.h"
#include "GraphicsEnums.h"
-#include "Matrix.h"
#include "GameStructs.h"
/* Represents an in-game entity.
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
diff --git a/src/Client/EntityComponents.c b/src/Client/EntityComponents.c
index 61942e141..db55e58e9 100644
--- a/src/Client/EntityComponents.c
+++ b/src/Client/EntityComponents.c
@@ -12,6 +12,7 @@
#include "GraphicsAPI.h"
#include "GraphicsCommon.h"
#include "ModelCache.h"
+#include "Searcher.h"
#define ANIM_MAX_ANGLE (110 * MATH_DEG2RAD)
#define ANIM_ARM_MAX (60.0f * MATH_DEG2RAD)
@@ -577,23 +578,23 @@ bool ShadowComponent_GetBlocks(Entity* entity, Vector3I* coords, Real32 x, Real3
return true;
}
-#define size 128
-#define half (size / 2)
+#define sh_size 128
+#define sh_half (sh_size / 2)
void ShadowComponent_MakeTex(void) {
- UInt8 pixels[Bitmap_DataSize(size, size)];
- Bitmap bmp; Bitmap_Create(&bmp, size, size, pixels);
+ UInt8 pixels[Bitmap_DataSize(sh_size, sh_size)];
+ Bitmap bmp; Bitmap_Create(&bmp, sh_size, sh_size, pixels);
- UInt32 inPix = PackedCol_ARGB(0, 0, 0, 200);
+ UInt32 inPix = PackedCol_ARGB(0, 0, 0, 200);
UInt32 outPix = PackedCol_ARGB(0, 0, 0, 0);
UInt32 x, y;
- for (y = 0; y < size; y++) {
+ for (y = 0; y < sh_size; y++) {
UInt32* row = Bitmap_GetRow(&bmp, y);
- for (x = 0; x < size; x++) {
+ for (x = 0; x < sh_size; x++) {
Real64 dist =
- (half - (x + 0.5)) * (half - (x + 0.5)) +
- (half - (y + 0.5)) * (half - (y + 0.5));
- row[x] = dist < half * half ? inPix : outPix;
+ (sh_half - (x + 0.5)) * (sh_half - (x + 0.5)) +
+ (sh_half - (y + 0.5)) * (sh_half - (y + 0.5));
+ row[x] = dist < sh_half * sh_half ? inPix : outPix;
}
}
ShadowComponent_ShadowTex = Gfx_CreateTexture(&bmp, false, false);
@@ -660,4 +661,4 @@ void ShadowComponent_Draw(Entity* entity) {
UInt32 vCount = (UInt32)(ptr - vertices) / VertexP3fT2fC4b_Size;
GfxCommon_UpdateDynamicVb_IndexedTris(vb, vertices, vCount);
-}
+}
\ No newline at end of file
diff --git a/src/Client/EnvRenderer.c b/src/Client/EnvRenderer.c
index 15b54a5db..b1da35ada 100644
--- a/src/Client/EnvRenderer.c
+++ b/src/Client/EnvRenderer.c
@@ -4,7 +4,7 @@
#include "GraphicsEnums.h"
#include "Funcs.h"
#include "GraphicsAPI.h"
-#include "Matrix.h"
+#include "Vectors.h"
#include "AABB.h"
#include "Block.h"
#include "Platform.h"
diff --git a/src/Client/ExtMath.h b/src/Client/ExtMath.h
index 654a416ac..49920ba30 100644
--- a/src/Client/ExtMath.h
+++ b/src/Client/ExtMath.h
@@ -30,25 +30,17 @@
#define Math_Sqrt(x) sqrtf(x)
#define Math_Mod(x, y) fmodf(x, y)
-/* Integer floor of a floating-point value. */
Int32 Math_Floor(Real32 value);
-/* Integer ceiling of a floating-point value. */
Int32 Math_Ceil(Real32 value);
-/* Log base 2 of given value. */
Int32 Math_Log2(Int32 value);
-/* Performs rounding upwards integer division.*/
Int32 Math_CeilDiv(Int32 a, Int32 b);
-/* Returns sign of the given value. */
Int32 Math_Sign(Real32 value);
-/* Performs linear interpolation between two values. */
Real32 Math_Lerp(Real32 a, Real32 b, Real32 t);
/* Linearly interpolates between a given angle range, adjusting if necessary. */
Real32 Math_LerpAngle(Real32 leftAngle, Real32 rightAngle, Real32 t);
-/* Returns the next highest power of 2 that is greater or equal to the given value. */
Int32 Math_NextPowOf2(Int32 value);
-/* Returns whether the given value is a power of 2. */
bool Math_IsPowOf2(Int32 value);
/* Returns the number of vertices needed to subdivide a quad. */
diff --git a/src/Client/FrustumCulling.h b/src/Client/FrustumCulling.h
index 51f695c20..d76016813 100644
--- a/src/Client/FrustumCulling.h
+++ b/src/Client/FrustumCulling.h
@@ -1,6 +1,6 @@
#ifndef CC_FRUSTUMCULLING_H
#define CC_FRUSTUMCULLING_H
-#include "Matrix.h"
+#include "Vectors.h"
#include "Typedefs.h"
/* Implements frustum culling of bounding spheres.
Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
diff --git a/src/Client/GraphicsAPI.h b/src/Client/GraphicsAPI.h
index 01d45f622..8781095ac 100644
--- a/src/Client/GraphicsAPI.h
+++ b/src/Client/GraphicsAPI.h
@@ -4,7 +4,7 @@
#include "Bitmap.h"
#include "PackedCol.h"
#include "String.h"
-#include "Matrix.h"
+#include "Vectors.h"
#include "Game.h"
#include "GraphicsEnums.h"
#include "GameStructs.h"
diff --git a/src/Client/HeldBlockRenderer.c b/src/Client/HeldBlockRenderer.c
index 89fd4356d..8a6de976a 100644
--- a/src/Client/HeldBlockRenderer.c
+++ b/src/Client/HeldBlockRenderer.c
@@ -1,6 +1,5 @@
#include "HeldBlockRenderer.h"
#include "Block.h"
-#include "Matrix.h"
#include "Game.h"
#include "Inventory.h"
#include "GraphicsAPI.h"
diff --git a/src/Client/IsometricDrawer.c b/src/Client/IsometricDrawer.c
index 62bcb98dd..4995683f7 100644
--- a/src/Client/IsometricDrawer.c
+++ b/src/Client/IsometricDrawer.c
@@ -2,7 +2,6 @@
#include "Drawer.h"
#include "GraphicsCommon.h"
#include "GraphicsAPI.h"
-#include "Matrix.h"
#include "PackedCol.h"
#include "ExtMath.h"
#include "Block.h"
diff --git a/src/Client/Matrix.c b/src/Client/Matrix.c
deleted file mode 100644
index 86dff0589..000000000
--- a/src/Client/Matrix.c
+++ /dev/null
@@ -1,137 +0,0 @@
-#include "Matrix.h"
-#include "ExtMath.h"
-#include "Vectors.h"
-
-Matrix Matrix_Identity = {
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f
-};
-
-/* Transposed, copied from https://open.gl/transformations */
-
-void Matrix_RotateX(Matrix* result, Real32 angle) {
- Real32 cosA = Math_Cos(angle), sinA = Math_Sin(angle);
- *result = Matrix_Identity;
- result->Row1.Y = cosA; result->Row1.Z = sinA;
- result->Row2.Y = -sinA; result->Row2.Z = cosA;
-}
-
-void Matrix_RotateY(Matrix* result, Real32 angle) {
- Real32 cosA = Math_Cos(angle), sinA = Math_Sin(angle);
- *result = Matrix_Identity;
- result->Row1.X = cosA; result->Row1.Z = -sinA;
- result->Row2.X = sinA; result->Row2.Z = cosA;
-}
-
-void Matrix_RotateZ(Matrix* result, Real32 angle) {
- Real32 cosA = Math_Cos(angle), sinA = Math_Sin(angle);
- *result = Matrix_Identity;
- result->Row1.X = cosA; result->Row1.Y = sinA;
- result->Row2.X = -sinA; result->Row2.Y = cosA;
-}
-
-void Matrix_Translate(Matrix* result, Real32 x, Real32 y, Real32 z) {
- *result = Matrix_Identity;
- result->Row3.X = x;
- result->Row3.Y = y;
- result->Row3.Z = z;
-}
-
-void Matrix_Scale(Matrix* result, Real32 x, Real32 y, Real32 z) {
- *result = Matrix_Identity;
- result->Row0.X = x;
- result->Row1.Y = y;
- result->Row2.Z = z;
-}
-
-void Matrix_Mul(Matrix* result, Matrix* left, Matrix* right) {
- /* Originally from http://www.edais.co.uk/blog/?p=27 */
- Real32
- lM11 = left->Row0.X, lM12 = left->Row0.Y, lM13 = left->Row0.Z, lM14 = left->Row0.W,
- lM21 = left->Row1.X, lM22 = left->Row1.Y, lM23 = left->Row1.Z, lM24 = left->Row1.W,
- lM31 = left->Row2.X, lM32 = left->Row2.Y, lM33 = left->Row2.Z, lM34 = left->Row2.W,
- lM41 = left->Row3.X, lM42 = left->Row3.Y, lM43 = left->Row3.Z, lM44 = left->Row3.W,
-
- rM11 = right->Row0.X, rM12 = right->Row0.Y, rM13 = right->Row0.Z, rM14 = right->Row0.W,
- rM21 = right->Row1.X, rM22 = right->Row1.Y, rM23 = right->Row1.Z, rM24 = right->Row1.W,
- rM31 = right->Row2.X, rM32 = right->Row2.Y, rM33 = right->Row2.Z, rM34 = right->Row2.W,
- rM41 = right->Row3.X, rM42 = right->Row3.Y, rM43 = right->Row3.Z, rM44 = right->Row3.W;
-
- result->Row0.X = (((lM11 * rM11) + (lM12 * rM21)) + (lM13 * rM31)) + (lM14 * rM41);
- result->Row0.Y = (((lM11 * rM12) + (lM12 * rM22)) + (lM13 * rM32)) + (lM14 * rM42);
- result->Row0.Z = (((lM11 * rM13) + (lM12 * rM23)) + (lM13 * rM33)) + (lM14 * rM43);
- result->Row0.W = (((lM11 * rM14) + (lM12 * rM24)) + (lM13 * rM34)) + (lM14 * rM44);
-
- result->Row1.X = (((lM21 * rM11) + (lM22 * rM21)) + (lM23 * rM31)) + (lM24 * rM41);
- result->Row1.Y = (((lM21 * rM12) + (lM22 * rM22)) + (lM23 * rM32)) + (lM24 * rM42);
- result->Row1.Z = (((lM21 * rM13) + (lM22 * rM23)) + (lM23 * rM33)) + (lM24 * rM43);
- result->Row1.W = (((lM21 * rM14) + (lM22 * rM24)) + (lM23 * rM34)) + (lM24 * rM44);
-
- result->Row2.X = (((lM31 * rM11) + (lM32 * rM21)) + (lM33 * rM31)) + (lM34 * rM41);
- result->Row2.Y = (((lM31 * rM12) + (lM32 * rM22)) + (lM33 * rM32)) + (lM34 * rM42);
- result->Row2.Z = (((lM31 * rM13) + (lM32 * rM23)) + (lM33 * rM33)) + (lM34 * rM43);
- result->Row2.W = (((lM31 * rM14) + (lM32 * rM24)) + (lM33 * rM34)) + (lM34 * rM44);
-
- result->Row3.X = (((lM41 * rM11) + (lM42 * rM21)) + (lM43 * rM31)) + (lM44 * rM41);
- result->Row3.Y = (((lM41 * rM12) + (lM42 * rM22)) + (lM43 * rM32)) + (lM44 * rM42);
- result->Row3.Z = (((lM41 * rM13) + (lM42 * rM23)) + (lM43 * rM33)) + (lM44 * rM43);
- result->Row3.W = (((lM41 * rM14) + (lM42 * rM24)) + (lM43 * rM34)) + (lM44 * rM44);
-}
-
-
-
-void Matrix_Orthographic(Matrix* result, Real32 width, Real32 height, Real32 zNear, Real32 zFar) {
- Matrix_OrthographicOffCenter(result, -width * 0.5f, width * 0.5f, -height * 0.5f, height * 0.5f, zNear, zFar);
-}
-
-void Matrix_OrthographicOffCenter(Matrix* result, Real32 left, Real32 right, Real32 bottom, Real32 top, Real32 zNear, Real32 zFar) {
- /* Transposed, sourced from https://msdn.microsoft.com/en-us/library/dd373965(v=vs.85).aspx */
- *result = Matrix_Identity;
-
- result->Row0.X = 2.0f / (right - left);
- result->Row1.Y = 2.0f / (top - bottom);
- result->Row2.Z = -2.0f / (zFar - zNear);
-
- result->Row3.X = -(right + left) / (right - left);
- result->Row3.Y = -(top + bottom) / (top - bottom);
- result->Row3.Z = -(zFar + zNear) / (zFar - zNear);
-}
-
-void Matrix_PerspectiveFieldOfView(Matrix* result, Real32 fovy, Real32 aspect, Real32 zNear, Real32 zFar) {
- Real32 c = zNear * Math_Tan(0.5f * fovy);
- Matrix_PerspectiveOffCenter(result, -c * aspect, c * aspect, -c, c, zNear, zFar);
-}
-
-void Matrix_PerspectiveOffCenter(Matrix* result, Real32 left, Real32 right, Real32 bottom, Real32 top, Real32 zNear, Real32 zFar) {
- /* Transposed, sourced from https://msdn.microsoft.com/en-us/library/dd373537(v=vs.85).aspx */
- *result = Matrix_Identity;
-
- result->Row0.X = (2.0f * zNear) / (right - left);
- result->Row1.Y = (2.0f * zNear) / (top - bottom);
- result->Row3.Z = -(2.0f * zFar * zNear) / (zFar - zNear);
-
- result->Row2.X = (right + left) / (right - left);
- result->Row2.Y = (top + bottom) / (top - bottom);
- result->Row2.Z = -(zFar + zNear) / (zFar - zNear);
- result->Row2.W = -1.0f;
-}
-
-
-void Matrix_LookAt(Matrix* result, Vector3 eye, Vector3 target, Vector3 up) {
- /* Transposed, sourced from https://msdn.microsoft.com/en-us/library/windows/desktop/bb281711(v=vs.85).aspx */
- Vector3 x, y, z;
- Vector3_Subtract(&z, &eye, &target); Vector3_Normalize(&z, &z);
- Vector3_Cross(&x, &up, &z); Vector3_Normalize(&x, &x);
- Vector3_Cross(&y, &z, &x); Vector3_Normalize(&y, &y);
-
- result->Row0.X = x.X; result->Row0.Y = y.X; result->Row0.Z = z.X; result->Row0.W = 0.0f;
- result->Row1.X = x.Y; result->Row1.Y = y.Y; result->Row1.Z = z.Y; result->Row1.W = 0.0f;
- result->Row2.X = x.Z; result->Row2.Y = y.Z; result->Row2.Z = z.Z; result->Row2.W = 0.0f;
-
- result->Row3.X = -Vector3_Dot(&x, &eye);
- result->Row3.Y = -Vector3_Dot(&y, &eye);
- result->Row3.Z = -Vector3_Dot(&z, &eye);
- result->Row3.W = 1.0f;
-}
\ No newline at end of file
diff --git a/src/Client/Matrix.h b/src/Client/Matrix.h
deleted file mode 100644
index 2ea7bceec..000000000
--- a/src/Client/Matrix.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef CC_MATRIX_H
-#define CC_MATRIX_H
-#include "Typedefs.h"
-/* Represents a 4 by 4 matrix.
- Copyright 2017 ClassicalSharp | Licensed under BSD-3
-*/
-
-/* forward declaration */
-typedef struct Vector3_ Vector3;
-
-typedef struct Vector4_ { Real32 X, Y, Z, W; } Vector4;
-typedef struct Matrix_ { Vector4 Row0, Row1, Row2, Row3; } Matrix;
-extern Matrix Matrix_Identity;
-
-void Matrix_RotateX(Matrix* result, Real32 angle);
-void Matrix_RotateY(Matrix* result, Real32 angle);
-void Matrix_RotateZ(Matrix* result, Real32 angle);
-void Matrix_Translate(Matrix* result, Real32 x, Real32 y, Real32 z);
-void Matrix_Scale(Matrix* result, Real32 x, Real32 y, Real32 z);
-
-#define Matrix_MulBy(dst, right) Matrix_Mul(dst, dst, right)
-void Matrix_Mul(Matrix* result, Matrix* left, Matrix* right);
-
-void Matrix_Orthographic(Matrix* result, Real32 width, Real32 height, Real32 zNear, Real32 zFar);
-void Matrix_OrthographicOffCenter(Matrix* result, Real32 left, Real32 right, Real32 bottom, Real32 top, Real32 zNear, Real32 zFar);
-void Matrix_PerspectiveFieldOfView(Matrix* result, Real32 fovy, Real32 aspect, Real32 zNear, Real32 zFar);
-void Matrix_PerspectiveOffCenter(Matrix* result, Real32 left, Real32 right, Real32 bottom, Real32 top, Real32 zNear, Real32 zFar);
-void Matrix_LookAt(Matrix* result, Vector3 eye, Vector3 target, Vector3 up);
-#endif
\ No newline at end of file
diff --git a/src/Client/Particle.c b/src/Client/Particle.c
index af718bf81..8880f6265 100644
--- a/src/Client/Particle.c
+++ b/src/Client/Particle.c
@@ -3,7 +3,6 @@
#include "World.h"
#include "ExtMath.h"
#include "Lighting.h"
-#include "Matrix.h"
#include "Entity.h"
#include "Random.h"
#include "TerrainAtlas.h"
diff --git a/src/Client/Vectors.c b/src/Client/Vectors.c
index 02cd0372a..c2f7962d1 100644
--- a/src/Client/Vectors.c
+++ b/src/Client/Vectors.c
@@ -31,59 +31,30 @@ Real32 Vector3_LengthSquared(Vector3* v) {
return v->X * v->X + v->Y * v->Y + v->Z * v->Z;
}
-#define Vec3_Add(result, a, b)\
-result->X = a->X + b->X;\
-result->Y = a->Y + b->Y;\
-result->Z = a->Z + b->Z;
+void Vector3_Add(Vector3* result, Vector3* a, Vector3* b) {
+ result->X = a->X + b->X; result->Y = a->Y + b->Y; result->Z = a->Z + b->Z;
+}
-void Vector3_Add(Vector3* result, Vector3* a, Vector3* b) { Vec3_Add(result, a, b); }
-void Vector3I_Add(Vector3I* result, Vector3I* a, Vector3I* b) { Vec3_Add(result, a, b); }
void Vector3_Add1(Vector3* result, Vector3* a, Real32 b) {
- result->X = a->X + b;
- result->Y = a->Y + b;
- result->Z = a->Z + b;
+ result->X = a->X + b; result->Y = a->Y + b; result->Z = a->Z + b;
}
-#define Vec3_Sub(result, a, b)\
-result->X = a->X - b->X;\
-result->Y = a->Y - b->Y;\
-result->Z = a->Z - b->Z;
+void Vector3_Subtract(Vector3* result, Vector3* a, Vector3* b) {
+ result->X = a->X - b->X; result->Y = a->Y - b->Y; result->Z = a->Z - b->Z;
+}
-void Vector3_Subtract(Vector3* result, Vector3* a, Vector3* b) { Vec3_Sub(result, a, b); }
-void Vector3I_Subtract(Vector3I* result, Vector3I* a, Vector3I* b) { Vec3_Sub(result, a, b); }
+void Vector3_Multiply1(Vector3* result, Vector3* a, Real32 scale) {
+ result->X = a->X * scale; result->Y = a->Y * scale; result->Z = a->Z * scale;
+}
-#define Vec3_Mul1(result, a, scale)\
-result->X = a->X * scale;\
-result->Y = a->Y * scale;\
-result->Z = a->Z * scale;
-
-void Vector3_Multiply1(Vector3* result, Vector3* a, Real32 scale) { Vec3_Mul1(result, a, scale); }
-void Vector3I_Multiply1(Vector3I* result, Vector3I* a, Int32 scale) { Vec3_Mul1(result, a, scale); }
void Vector3_Multiply3(Vector3* result, Vector3* a, Vector3* scale) {
- result->X = a->X * scale->X;
- result->Y = a->Y * scale->Y;
- result->Z = a->Z * scale->Z;
+ result->X = a->X * scale->X; result->Y = a->Y * scale->Y; result->Z = a->Z * scale->Z;
}
-void Vector3_Divide1(Vector3* result, Vector3* a, Real32 scale) {
- Vector3_Multiply1(result, a, 1.0f / scale);
+void Vector3_Negate(Vector3* result, Vector3* a) {
+ result->X = -a->X; result->Y = -a->Y; result->Z = -a->Z;
}
-void Vector3_Divide3(Vector3* result, Vector3* a, Vector3* scale) {
- result->X = a->X / scale->X;
- result->Y = a->Y / scale->Y;
- result->Z = a->Z / scale->Z;
-}
-
-#define Vec3_Negate(result, a)\
-result->X = -a->X;\
-result->Y = -a->Y;\
-result->Z = -a->Z;
-
-void Vector3_Negate(Vector3* result, Vector3* a) { Vec3_Negate(result, a); }
-void Vector3I_Negate(Vector3I* result, Vector3I* a) { Vec3_Negate(result, a); }
-
-
void Vector3_Lerp(Vector3* result, Vector3* a, Vector3* b, Real32 blend) {
result->X = blend * (b->X - a->X) + a->X;
result->Y = blend * (b->Y - a->Y) + a->Y;
@@ -166,27 +137,19 @@ bool Vector3I_NotEquals(Vector3I* a, Vector3I* b) { return Vec3_NE(a, b); }
void Vector3I_Floor(Vector3I* result, Vector3* a) {
- result->X = Math_Floor(a->X);
- result->Y = Math_Floor(a->Y);
- result->Z = Math_Floor(a->Z);
+ result->X = Math_Floor(a->X); result->Y = Math_Floor(a->Y); result->Z = Math_Floor(a->Z);
}
void Vector3I_ToVector3(Vector3* result, Vector3I* a) {
- result->X = (Real32)a->X;
- result->Y = (Real32)a->Y;
- result->Z = (Real32)a->Z;
+ result->X = (Real32)a->X; result->Y = (Real32)a->Y; result->Z = (Real32)a->Z;
}
void Vector3I_Min(Vector3I* result, Vector3I* a, Vector3I* b) {
- result->X = min(a->X, b->X);
- result->Y = min(a->Y, b->Y);
- result->Z = min(a->Z, b->Z);
+ result->X = min(a->X, b->X); result->Y = min(a->Y, b->Y); result->Z = min(a->Z, b->Z);
}
void Vector3I_Max(Vector3I* result, Vector3I* a, Vector3I* b) {
- result->X = max(a->X, b->X);
- result->Y = max(a->Y, b->Y);
- result->Z = max(a->Z, b->Z);
+ result->X = max(a->X, b->X); result->Y = max(a->Y, b->Y); result->Z = max(a->Z, b->Z);
}
@@ -200,4 +163,132 @@ Vector3 Vector3_GetDirVector(Real32 yawRad, Real32 pitchRad) {
void Vector3_GetHeading(Vector3 dir, Real32* yaw, Real32* pitch) {
*pitch = Math_Asin(-dir.Y);
*yaw = Math_Atan2(dir.X, -dir.Z);
+}
+
+
+Matrix Matrix_Identity = {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f
+};
+
+/* Transposed, source https://open.gl/transformations */
+
+void Matrix_RotateX(Matrix* result, Real32 angle) {
+ Real32 cosA = Math_Cos(angle), sinA = Math_Sin(angle);
+ *result = Matrix_Identity;
+ result->Row1.Y = cosA; result->Row1.Z = sinA;
+ result->Row2.Y = -sinA; result->Row2.Z = cosA;
+}
+
+void Matrix_RotateY(Matrix* result, Real32 angle) {
+ Real32 cosA = Math_Cos(angle), sinA = Math_Sin(angle);
+ *result = Matrix_Identity;
+ result->Row1.X = cosA; result->Row1.Z = -sinA;
+ result->Row2.X = sinA; result->Row2.Z = cosA;
+}
+
+void Matrix_RotateZ(Matrix* result, Real32 angle) {
+ Real32 cosA = Math_Cos(angle), sinA = Math_Sin(angle);
+ *result = Matrix_Identity;
+ result->Row1.X = cosA; result->Row1.Y = sinA;
+ result->Row2.X = -sinA; result->Row2.Y = cosA;
+}
+
+void Matrix_Translate(Matrix* result, Real32 x, Real32 y, Real32 z) {
+ *result = Matrix_Identity;
+ result->Row3.X = x; result->Row3.Y = y; result->Row3.Z = z;
+}
+
+void Matrix_Scale(Matrix* result, Real32 x, Real32 y, Real32 z) {
+ *result = Matrix_Identity;
+ result->Row0.X = x; result->Row1.Y = y; result->Row2.Z = z;
+}
+
+void Matrix_Mul(Matrix* result, Matrix* left, Matrix* right) {
+ /* Originally from http://www.edais.co.uk/blog/?p=27 */
+ Real32
+ lM11 = left->Row0.X, lM12 = left->Row0.Y, lM13 = left->Row0.Z, lM14 = left->Row0.W,
+ lM21 = left->Row1.X, lM22 = left->Row1.Y, lM23 = left->Row1.Z, lM24 = left->Row1.W,
+ lM31 = left->Row2.X, lM32 = left->Row2.Y, lM33 = left->Row2.Z, lM34 = left->Row2.W,
+ lM41 = left->Row3.X, lM42 = left->Row3.Y, lM43 = left->Row3.Z, lM44 = left->Row3.W,
+
+ rM11 = right->Row0.X, rM12 = right->Row0.Y, rM13 = right->Row0.Z, rM14 = right->Row0.W,
+ rM21 = right->Row1.X, rM22 = right->Row1.Y, rM23 = right->Row1.Z, rM24 = right->Row1.W,
+ rM31 = right->Row2.X, rM32 = right->Row2.Y, rM33 = right->Row2.Z, rM34 = right->Row2.W,
+ rM41 = right->Row3.X, rM42 = right->Row3.Y, rM43 = right->Row3.Z, rM44 = right->Row3.W;
+
+ result->Row0.X = (((lM11 * rM11) + (lM12 * rM21)) + (lM13 * rM31)) + (lM14 * rM41);
+ result->Row0.Y = (((lM11 * rM12) + (lM12 * rM22)) + (lM13 * rM32)) + (lM14 * rM42);
+ result->Row0.Z = (((lM11 * rM13) + (lM12 * rM23)) + (lM13 * rM33)) + (lM14 * rM43);
+ result->Row0.W = (((lM11 * rM14) + (lM12 * rM24)) + (lM13 * rM34)) + (lM14 * rM44);
+
+ result->Row1.X = (((lM21 * rM11) + (lM22 * rM21)) + (lM23 * rM31)) + (lM24 * rM41);
+ result->Row1.Y = (((lM21 * rM12) + (lM22 * rM22)) + (lM23 * rM32)) + (lM24 * rM42);
+ result->Row1.Z = (((lM21 * rM13) + (lM22 * rM23)) + (lM23 * rM33)) + (lM24 * rM43);
+ result->Row1.W = (((lM21 * rM14) + (lM22 * rM24)) + (lM23 * rM34)) + (lM24 * rM44);
+
+ result->Row2.X = (((lM31 * rM11) + (lM32 * rM21)) + (lM33 * rM31)) + (lM34 * rM41);
+ result->Row2.Y = (((lM31 * rM12) + (lM32 * rM22)) + (lM33 * rM32)) + (lM34 * rM42);
+ result->Row2.Z = (((lM31 * rM13) + (lM32 * rM23)) + (lM33 * rM33)) + (lM34 * rM43);
+ result->Row2.W = (((lM31 * rM14) + (lM32 * rM24)) + (lM33 * rM34)) + (lM34 * rM44);
+
+ result->Row3.X = (((lM41 * rM11) + (lM42 * rM21)) + (lM43 * rM31)) + (lM44 * rM41);
+ result->Row3.Y = (((lM41 * rM12) + (lM42 * rM22)) + (lM43 * rM32)) + (lM44 * rM42);
+ result->Row3.Z = (((lM41 * rM13) + (lM42 * rM23)) + (lM43 * rM33)) + (lM44 * rM43);
+ result->Row3.W = (((lM41 * rM14) + (lM42 * rM24)) + (lM43 * rM34)) + (lM44 * rM44);
+}
+
+void Matrix_Orthographic(Matrix* result, Real32 width, Real32 height, Real32 zNear, Real32 zFar) {
+ Matrix_OrthographicOffCenter(result, -width * 0.5f, width * 0.5f, -height * 0.5f, height * 0.5f, zNear, zFar);
+}
+
+void Matrix_OrthographicOffCenter(Matrix* result, Real32 left, Real32 right, Real32 bottom, Real32 top, Real32 zNear, Real32 zFar) {
+ /* Transposed, source https://msdn.microsoft.com/en-us/library/dd373965(v=vs.85).aspx */
+ *result = Matrix_Identity;
+
+ result->Row0.X = 2.0f / (right - left);
+ result->Row1.Y = 2.0f / (top - bottom);
+ result->Row2.Z = -2.0f / (zFar - zNear);
+
+ result->Row3.X = -(right + left) / (right - left);
+ result->Row3.Y = -(top + bottom) / (top - bottom);
+ result->Row3.Z = -(zFar + zNear) / (zFar - zNear);
+}
+
+void Matrix_PerspectiveFieldOfView(Matrix* result, Real32 fovy, Real32 aspect, Real32 zNear, Real32 zFar) {
+ Real32 c = zNear * Math_Tan(0.5f * fovy);
+ Matrix_PerspectiveOffCenter(result, -c * aspect, c * aspect, -c, c, zNear, zFar);
+}
+
+void Matrix_PerspectiveOffCenter(Matrix* result, Real32 left, Real32 right, Real32 bottom, Real32 top, Real32 zNear, Real32 zFar) {
+ /* Transposed, source https://msdn.microsoft.com/en-us/library/dd373537(v=vs.85).aspx */
+ *result = Matrix_Identity;
+
+ result->Row0.X = (2.0f * zNear) / (right - left);
+ result->Row1.Y = (2.0f * zNear) / (top - bottom);
+ result->Row3.Z = -(2.0f * zFar * zNear) / (zFar - zNear);
+
+ result->Row2.X = (right + left) / (right - left);
+ result->Row2.Y = (top + bottom) / (top - bottom);
+ result->Row2.Z = -(zFar + zNear) / (zFar - zNear);
+ result->Row2.W = -1.0f;
+}
+
+void Matrix_LookAt(Matrix* result, Vector3 eye, Vector3 target, Vector3 up) {
+ /* Transposed, source https://msdn.microsoft.com/en-us/library/windows/desktop/bb281711(v=vs.85).aspx */
+ Vector3 x, y, z;
+ Vector3_Subtract(&z, &eye, &target); Vector3_Normalize(&z, &z);
+ Vector3_Cross(&x, &up, &z); Vector3_Normalize(&x, &x);
+ Vector3_Cross(&y, &z, &x); Vector3_Normalize(&y, &y);
+
+ result->Row0.X = x.X; result->Row0.Y = y.X; result->Row0.Z = z.X; result->Row0.W = 0.0f;
+ result->Row1.X = x.Y; result->Row1.Y = y.Y; result->Row1.Z = z.Y; result->Row1.W = 0.0f;
+ result->Row2.X = x.Z; result->Row2.Y = y.Z; result->Row2.Z = z.Z; result->Row2.W = 0.0f;
+
+ result->Row3.X = -Vector3_Dot(&x, &eye);
+ result->Row3.Y = -Vector3_Dot(&y, &eye);
+ result->Row3.Z = -Vector3_Dot(&z, &eye);
+ result->Row3.W = 1.0f;
}
\ No newline at end of file
diff --git a/src/Client/Vectors.h b/src/Client/Vectors.h
index ecc97e7f2..062a7536d 100644
--- a/src/Client/Vectors.h
+++ b/src/Client/Vectors.h
@@ -1,15 +1,16 @@
#ifndef CC_VECTORS_H
#define CC_VECTORS_H
#include "Typedefs.h"
-#include "Matrix.h"
-#include "Compiler.h"
-/* Represents 2, 3 dimensional vectors.
+/* Represents 2, 3 dimensional vectors, and 4 x 4 matrix.
Copyright 2017 ClassicalSharp | Licensed under BSD-3
*/
typedef struct Vector2_ { Real32 X, Y; } Vector2;
typedef struct Vector3_ { Real32 X, Y, Z; } Vector3;
typedef struct Vector3I_ { Int32 X, Y, Z; } Vector3I;
+typedef struct Vector4_ { Real32 X, Y, Z, W; } Vector4;
+typedef struct Matrix_ { Vector4 Row0, Row1, Row2, Row3; } Matrix;
+extern Matrix Matrix_Identity;
Vector2 Vector2_Create2(Real32 x, Real32 y);
Vector3 Vector3_Create1(Real32 value);
@@ -28,39 +29,25 @@ Real32 Vector3_LengthSquared(Vector3* v);
#define Vector3_One VECTOR3_CONST(1.0f, 1.0f, 1.0f)
void Vector3_Add(Vector3* result, Vector3* a, Vector3* b);
-void Vector3I_Add(Vector3I* result, Vector3I* a, Vector3I* b);
void Vector3_Add1(Vector3* result, Vector3* a, Real32 b);
void Vector3_Subtract(Vector3* result, Vector3* a, Vector3* b);
-void Vector3I_Subtract(Vector3I* result, Vector3I* a, Vector3I* b);
void Vector3_Multiply1(Vector3* result, Vector3* a, Real32 scale);
-void Vector3I_Multiply1(Vector3I* result, Vector3I* a, Int32 scale);
void Vector3_Multiply3(Vector3* result, Vector3* a, Vector3* scale);
-void Vector3_Divide1(Vector3* result, Vector3* a, Real32 scale);
-void Vector3_Divide3(Vector3* result, Vector3* a, Vector3* scale);
void Vector3_Negate(Vector3* result, Vector3* a);
-void Vector3I_Negate(Vector3I* result, Vector3I* a);
void Vector3_Lerp(Vector3* result, Vector3* a, Vector3* b, Real32 blend);
Real32 Vector3_Dot(Vector3* left, Vector3* right);
void Vector3_Cross(Vector3* result, Vector3* a, Vector3* b);
void Vector3_Normalize(Vector3* result, Vector3* a);
-/* Transforms a vector by the given matrix. */
void Vector3_Transform(Vector3* result, Vector3* a, Matrix* mat);
-/* Transforms a vector consisting of only a X component by the given matrix. */
void Vector3_TransformX(Vector3* result, Real32 x, Matrix* mat);
-/* Transforms a vector consisting of only a Y component by the given matrix. */
void Vector3_TransformY(Vector3* result, Real32 y, Matrix* mat);
-/* Transforms a vector consisting of only a Z component by the given matrix. */
void Vector3_TransformZ(Vector3* result, Real32 z, Matrix* mat);
-/* Rotates the given 3D coordinates around the x axis. */
Vector3 Vector3_RotateX(Vector3 v, Real32 angle);
-/* Rotates the given 3D coordinates around the y axis. */
Vector3 Vector3_RotateY(Vector3 v, Real32 angle);
-/* Rotates the given 3D coordinates around the y axis. */
Vector3 Vector3_RotateY3(Real32 x, Real32 y, Real32 z, Real32 angle);
-/* Rotates the given 3D coordinates around the z axis. */
Vector3 Vector3_RotateZ(Vector3 v, Real32 angle);
bool Vector3_Equals(Vector3* a, Vector3* b);
@@ -68,11 +55,8 @@ bool Vector3_NotEquals(Vector3* a, Vector3* b);
bool Vector3I_Equals(Vector3I* a, Vector3I* b);
bool Vector3I_NotEquals(Vector3I* a, Vector3I* b);
-/* Returns a vector such that each component is floor of input floating-point component.*/
void Vector3I_Floor(Vector3I* result, Vector3* a);
-/* Returns a vector with the integer components converted to floating-point components.*/
void Vector3I_ToVector3(Vector3* result, Vector3I* a);
-
void Vector3I_Min(Vector3I* result, Vector3I* a, Vector3I* b);
void Vector3I_Max(Vector3I* result, Vector3I* a, Vector3I* b);
@@ -81,4 +65,20 @@ Vector3 Vector3_GetDirVector(Real32 yawRad, Real32 pitchRad);
/* Returns the yaw and pitch of the given direction vector.
NOTE: This is not an identity function. Returned pitch is always within [-90, 90] degrees.*/
void Vector3_GetHeading(Vector3 dir, Real32* yawRad, Real32* pitchRad);
+
+
+void Matrix_RotateX(Matrix* result, Real32 angle);
+void Matrix_RotateY(Matrix* result, Real32 angle);
+void Matrix_RotateZ(Matrix* result, Real32 angle);
+void Matrix_Translate(Matrix* result, Real32 x, Real32 y, Real32 z);
+void Matrix_Scale(Matrix* result, Real32 x, Real32 y, Real32 z);
+
+#define Matrix_MulBy(dst, right) Matrix_Mul(dst, dst, right)
+void Matrix_Mul(Matrix* result, Matrix* left, Matrix* right);
+
+void Matrix_Orthographic(Matrix* result, Real32 width, Real32 height, Real32 zNear, Real32 zFar);
+void Matrix_OrthographicOffCenter(Matrix* result, Real32 left, Real32 right, Real32 bottom, Real32 top, Real32 zNear, Real32 zFar);
+void Matrix_PerspectiveFieldOfView(Matrix* result, Real32 fovy, Real32 aspect, Real32 zNear, Real32 zFar);
+void Matrix_PerspectiveOffCenter(Matrix* result, Real32 left, Real32 right, Real32 bottom, Real32 top, Real32 zNear, Real32 zFar);
+void Matrix_LookAt(Matrix* result, Vector3 eye, Vector3 target, Vector3 up);
#endif
\ No newline at end of file