summary refs log tree commit diff
path: root/src/Vectors.h
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2024-06-16 10:35:45 +0300
committerWlodekM <[email protected]>2024-06-16 10:35:45 +0300
commitabef6da56913f1c55528103e60a50451a39628b1 (patch)
treeb3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Vectors.h
initial commit
Diffstat (limited to 'src/Vectors.h')
-rw-r--r--src/Vectors.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/Vectors.h b/src/Vectors.h
new file mode 100644
index 0000000..dd0a1b3
--- /dev/null
+++ b/src/Vectors.h
@@ -0,0 +1,137 @@
+#ifndef CC_VECTORS_H
+#define CC_VECTORS_H
+#include "Core.h"
+#include "Constants.h"
+/* 
+Represents 2 and 3 component vectors, and 4 x 4 matrix
+  Frustum culling sourced from http://www.crownandcutlass.com/features/technicaldetails/frustum.html
+Copyright 2014-2023 ClassiCube | Licensed under BSD-3
+*/
+
+/* 2 component vector (2D vector) */
+typedef struct Vec2_ { float x, y; } Vec2;
+/* 3 component vector (3D vector) */
+typedef struct Vec3_ { float x, y, z; } Vec3;
+/* 3 component vector (3D integer vector) */
+typedef struct IVec3_ { int x, y, z; } IVec3;
+/* 4 component vector */
+struct Vec4 { float x, y, z, w; };
+/* 4x4 matrix. (for vertex transformations) */
+struct Matrix { struct Vec4 row1, row2, row3, row4; };
+
+#define Matrix_IdentityValue \
+{ \
+	{ 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 }  \
+}
+
+/* Identity matrix. (A * Identity = A) */
+extern const struct Matrix Matrix_Identity;
+
+/* Returns a vector with all components set to Int32_MaxValue. */
+static CC_INLINE IVec3 IVec3_MaxValue(void) {
+	IVec3 v = { Int32_MaxValue, Int32_MaxValue, Int32_MaxValue }; return v;
+}
+static CC_INLINE Vec3 Vec3_BigPos(void) {
+	Vec3 v = { 1e25f, 1e25f, 1e25f }; return v;
+}
+
+static CC_INLINE Vec3 Vec3_Create3(float x, float y, float z) {
+	Vec3 v; v.x = x; v.y = y; v.z = z; return v;
+}
+
+/* Sets the X, Y, and Z components of a 3D vector */
+#define Vec3_Set(v, xVal, yVal, zVal) (v).x = xVal; (v).y = yVal; (v).z = zVal;
+/* Whether all components of a 3D vector are 0 */
+#define Vec3_IsZero(v) ((v).x == 0 && (v).y == 0 && (v).z == 0)
+
+/* Returns the squared length of the vector. */
+/* Squared length can be used for comparison, to avoid a costly sqrt() */
+/* However, you must sqrt() this when adding lengths. */
+static CC_INLINE float Vec3_LengthSquared(const Vec3* v) {
+	return v->x * v->x + v->y * v->y + v->z * v->z;
+}
+/* Adds components of two vectors together. */
+static CC_INLINE void Vec3_Add(Vec3* result, const Vec3* a, const Vec3* b) {
+	result->x = a->x + b->x; result->y = a->y + b->y; result->z = a->z + b->z;
+}
+/* Adds a value to each component of a vector. */
+static CC_INLINE void Vec3_Add1(Vec3* result, const Vec3* a, float b) {
+	result->x = a->x + b; result->y = a->y + b; result->z = a->z + b;
+}
+/* Subtracts components of two vectors from each other. */
+static CC_INLINE void Vec3_Sub(Vec3* result, const Vec3* a, const Vec3* b) {
+	result->x = a->x - b->x; result->y = a->y - b->y; result->z = a->z - b->z;
+}
+/* Mulitplies each component of a vector by a value. */
+static CC_INLINE void Vec3_Mul1(Vec3* result, const Vec3* a, float b) {
+	result->x = a->x * b; result->y = a->y * b; result->z = a->z * b;
+}
+/* Multiplies components of two vectors together. */
+static CC_INLINE void Vec3_Mul3(Vec3* result, const Vec3* a, const Vec3* b) {
+	result->x = a->x * b->x; result->y = a->y * b->y; result->z = a->z * b->z;
+}
+/* Negates the components of a vector. */
+static CC_INLINE void Vec3_Negate(Vec3* result, Vec3* a) {
+	result->x = -a->x; result->y = -a->y; result->z = -a->z;
+}
+
+#define Vec3_AddBy(dst, value) Vec3_Add(dst, dst, value)
+#define Vec3_SubBy(dst, value) Vec3_Sub(dst, dst, value)
+#define Vec3_Mul1By(dst, value) Vec3_Mul1(dst, dst, value)
+#define Vec3_Mul3By(dst, value) Vec3_Mul3(dst, dst, value)
+
+/* Linearly interpolates components of two vectors. */
+void Vec3_Lerp(Vec3* result, const Vec3* a, const Vec3* b, float blend);
+/* Scales all components of a vector to lie in [-1, 1] */
+void Vec3_Normalise(Vec3* v);
+
+/* Transforms a vector by the given matrix. */
+void Vec3_Transform(Vec3* result, const Vec3* a, const struct Matrix* mat);
+/* Same as Vec3_Transform, but faster since X and Z are assumed as 0. */
+void Vec3_TransformY(Vec3* result, float y, const struct Matrix* mat);
+
+Vec3 Vec3_RotateX(Vec3 v, float angle);
+Vec3 Vec3_RotateY(Vec3 v, float angle);
+Vec3 Vec3_RotateY3(float x, float y, float z, float angle);
+Vec3 Vec3_RotateZ(Vec3 v, float angle);
+
+/* Whether all of the components of the two vectors are equal. */
+static CC_INLINE cc_bool Vec3_Equals(const Vec3* a, const Vec3* b) {
+	return a->x == b->x && a->y == b->y && a->z == b->z;
+}
+
+void IVec3_Floor(IVec3* result, const Vec3* a);
+void IVec3_ToVec3(Vec3* result, const IVec3* a);
+void IVec3_Min(IVec3* result, const IVec3* a, const IVec3* b);
+void IVec3_Max(IVec3* result, const IVec3* a, const IVec3* b);
+
+/* Returns a normalised vector facing in the direction described by the given yaw and pitch. */
+Vec3 Vec3_GetDirVector(float yawRad, float 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 Vec3_GetHeading(Vector3 dir, float* yawRad, float* pitchRad);*/
+
+/* Returns a matrix representing a counter-clockwise rotation around X axis. */
+CC_API void Matrix_RotateX(struct Matrix* result, float angle);
+/* Returns a matrix representing a counter-clockwise rotation around Y axis. */
+CC_API void Matrix_RotateY(struct Matrix* result, float angle);
+/* Returns a matrix representing a counter-clockwise rotation around Z axis. */
+CC_API void Matrix_RotateZ(struct Matrix* result, float angle);
+/* Returns a matrix representing a translation to the given coordinates. */
+CC_API void Matrix_Translate(struct Matrix* result, float x, float y, float z);
+/* Returns a matrix representing a scaling by the given factors. */
+CC_API void Matrix_Scale(struct Matrix* result, float x, float y, float z);
+
+#define Matrix_MulBy(dst, right) Matrix_Mul(dst, dst, right)
+/* Multiplies two matrices together. */
+/* NOTE: result can be the same pointer as left or right. */
+CC_API void Matrix_Mul(struct Matrix* result, const struct Matrix* left, const struct Matrix* right);
+
+void Matrix_LookRot(struct Matrix* result, Vec3 pos, Vec2 rot);
+
+cc_bool FrustumCulling_SphereInFrustum(float x, float y, float z, float radius);
+void FrustumCulling_CalcFrustumEquations(struct Matrix* projection, struct Matrix* modelView);
+#endif