aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/math
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/math')
-rw-r--r--src/libjin/math/README.md1
-rw-r--r--src/libjin/math/je_bezier_curve.cpp0
-rw-r--r--src/libjin/math/je_bezier_curve.h17
-rw-r--r--src/libjin/math/je_constant.h10
-rw-r--r--src/libjin/math/je_ellipse.cpp0
-rw-r--r--src/libjin/math/je_ellipse.h0
-rw-r--r--src/libjin/math/je_math.h83
-rw-r--r--src/libjin/math/je_matrix.cpp194
-rw-r--r--src/libjin/math/je_matrix.h159
-rw-r--r--src/libjin/math/je_quad.h23
-rw-r--r--src/libjin/math/je_random.cpp52
-rw-r--r--src/libjin/math/je_random.h33
-rw-r--r--src/libjin/math/je_transform.cpp99
-rw-r--r--src/libjin/math/je_transform.h49
-rw-r--r--src/libjin/math/je_vector2.hpp63
-rw-r--r--src/libjin/math/je_vector3.hpp41
-rw-r--r--src/libjin/math/je_vector4.hpp45
17 files changed, 869 insertions, 0 deletions
diff --git a/src/libjin/math/README.md b/src/libjin/math/README.md
new file mode 100644
index 0000000..a096332
--- /dev/null
+++ b/src/libjin/math/README.md
@@ -0,0 +1 @@
+ļռΪJinEngineڴģ乲õ \ No newline at end of file
diff --git a/src/libjin/math/je_bezier_curve.cpp b/src/libjin/math/je_bezier_curve.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/libjin/math/je_bezier_curve.cpp
diff --git a/src/libjin/math/je_bezier_curve.h b/src/libjin/math/je_bezier_curve.h
new file mode 100644
index 0000000..6925baf
--- /dev/null
+++ b/src/libjin/math/je_bezier_curve.h
@@ -0,0 +1,17 @@
+#ifndef __JIN_BEZIER_CURVE_H__
+#define __JIN_BEZIER_CURVE_H__
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ class BezierCurve
+ {
+
+ };
+
+ } // namespace Math
+} // namespace JinEngine
+
+#endif \ No newline at end of file
diff --git a/src/libjin/math/je_constant.h b/src/libjin/math/je_constant.h
new file mode 100644
index 0000000..45577e7
--- /dev/null
+++ b/src/libjin/math/je_constant.h
@@ -0,0 +1,10 @@
+#ifndef __JE_MATH_CONSTANT_H__
+#define __JE_MATH_CONSTANT_H__
+
+#define PI 3.1415926f
+
+// int16 Χ
+#define INT16_RANGE_LEFT -32768
+#define INT16_RANGE_RIGHT 32767
+
+#endif \ No newline at end of file
diff --git a/src/libjin/math/je_ellipse.cpp b/src/libjin/math/je_ellipse.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/libjin/math/je_ellipse.cpp
diff --git a/src/libjin/math/je_ellipse.h b/src/libjin/math/je_ellipse.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/libjin/math/je_ellipse.h
diff --git a/src/libjin/math/je_math.h b/src/libjin/math/je_math.h
new file mode 100644
index 0000000..de57e36
--- /dev/null
+++ b/src/libjin/math/je_math.h
@@ -0,0 +1,83 @@
+#ifndef __JE_UTILS_MATH_H__
+#define __JE_UTILS_MATH_H__
+
+#include "je_constant.h"
+#include "je_matrix.h"
+#include "je_quad.h"
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ #ifdef min
+ #undef min
+ #endif // min
+ #ifdef max
+ #undef max
+ #endif // max
+
+ template<typename T>
+ inline T min(T a, T b)
+ {
+ return a < b ? a : b;
+ }
+
+ template<typename T>
+ inline T max(T a, T b)
+ {
+ return a > b ? a : b;
+ }
+
+ template<typename T>
+ inline T clamp(T a, T mi, T ma)
+ {
+ return min<T>(max<T>(a, mi), ma);
+ }
+
+ template<typename T>
+ inline bool within(T a, T mi, T ma)
+ {
+ return a >= mi && a <= ma;
+ }
+
+ template<typename T>
+ inline bool without(T a, T mi, T ma)
+ {
+ return a < mi || a > ma;
+ }
+
+ template<typename T>
+ inline T abs(T a)
+ {
+ return a > 0 ? a : -a;
+ }
+
+ template<typename T>
+ inline T lowerBound(T a, T lower)
+ {
+ return a < lower ? lower : a;
+ }
+
+ template<typename T>
+ inline T upperBound(T a, T upper)
+ {
+ return a > upper ? upper : a;
+ }
+
+ template<typename T>
+ inline T lerp(T a, T b, float t)
+ {
+ return a + t * (b - a);
+ }
+
+ inline float lerp(float a, float b, float f)
+ {
+ f = clamp<float>(f, 0, 1);
+ return a + f * (b - a);
+ }
+
+ } // namespace Math
+} // namespace JinEngine
+
+#endif // __JE_UTILS_MATH_H__
diff --git a/src/libjin/math/je_matrix.cpp b/src/libjin/math/je_matrix.cpp
new file mode 100644
index 0000000..bc1fcea
--- /dev/null
+++ b/src/libjin/math/je_matrix.cpp
@@ -0,0 +1,194 @@
+#include "je_matrix.h"
+
+#include <cstring> // memcpy
+#include <cmath>
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ const Matrix Matrix::Identity;
+
+ // | e0 e4 e8 e12 |
+ // | e1 e5 e9 e13 |
+ // | e2 e6 e10 e14 |
+ // | e3 e7 e11 e15 |
+
+ Matrix::Matrix()
+ {
+ setIdentity();
+ }
+
+ Matrix::~Matrix()
+ {
+ }
+
+ void Matrix::setOrtho(float l, float r, float b, float t, float n, float f)
+ {
+ setIdentity();
+ float w = r - l;
+ float h = t - b;
+ float z = f - n;
+ e[0] = 2 / w;
+ e[5] = 2 / h;
+ e[10] = -2 / z;
+ e[12] = -(r + l) / w;
+ e[13] = -(t + b) / h;
+ e[14] = -(f + n) / z;
+ e[15] = 1;
+ }
+
+ // | e0 e4 e8 e12 |
+ // | e1 e5 e9 e13 |
+ // | e2 e6 e10 e14 |
+ // | e3 e7 e11 e15 |
+ // | e0 e4 e8 e12 |
+ // | e1 e5 e9 e13 |
+ // | e2 e6 e10 e14 |
+ // | e3 e7 e11 e15 |
+
+ Matrix Matrix::operator * (const Matrix & m) const
+ {
+ Matrix t;
+
+ t.e[0] = (e[0] * m.e[0]) + (e[4] * m.e[1]) + (e[8] * m.e[2]) + (e[12] * m.e[3]);
+ t.e[4] = (e[0] * m.e[4]) + (e[4] * m.e[5]) + (e[8] * m.e[6]) + (e[12] * m.e[7]);
+ t.e[8] = (e[0] * m.e[8]) + (e[4] * m.e[9]) + (e[8] * m.e[10]) + (e[12] * m.e[11]);
+ t.e[12] = (e[0] * m.e[12]) + (e[4] * m.e[13]) + (e[8] * m.e[14]) + (e[12] * m.e[15]);
+
+ t.e[1] = (e[1] * m.e[0]) + (e[5] * m.e[1]) + (e[9] * m.e[2]) + (e[13] * m.e[3]);
+ t.e[5] = (e[1] * m.e[4]) + (e[5] * m.e[5]) + (e[9] * m.e[6]) + (e[13] * m.e[7]);
+ t.e[9] = (e[1] * m.e[8]) + (e[5] * m.e[9]) + (e[9] * m.e[10]) + (e[13] * m.e[11]);
+ t.e[13] = (e[1] * m.e[12]) + (e[5] * m.e[13]) + (e[9] * m.e[14]) + (e[13] * m.e[15]);
+
+ t.e[2] = (e[2] * m.e[0]) + (e[6] * m.e[1]) + (e[10] * m.e[2]) + (e[14] * m.e[3]);
+ t.e[6] = (e[2] * m.e[4]) + (e[6] * m.e[5]) + (e[10] * m.e[6]) + (e[14] * m.e[7]);
+ t.e[10] = (e[2] * m.e[8]) + (e[6] * m.e[9]) + (e[10] * m.e[10]) + (e[14] * m.e[11]);
+ t.e[14] = (e[2] * m.e[12]) + (e[6] * m.e[13]) + (e[10] * m.e[14]) + (e[14] * m.e[15]);
+
+ t.e[3] = (e[3] * m.e[0]) + (e[7] * m.e[1]) + (e[11] * m.e[2]) + (e[15] * m.e[3]);
+ t.e[7] = (e[3] * m.e[4]) + (e[7] * m.e[5]) + (e[11] * m.e[6]) + (e[15] * m.e[7]);
+ t.e[11] = (e[3] * m.e[8]) + (e[7] * m.e[9]) + (e[11] * m.e[10]) + (e[15] * m.e[11]);
+ t.e[15] = (e[3] * m.e[12]) + (e[7] * m.e[13]) + (e[11] * m.e[14]) + (e[15] * m.e[15]);
+
+ return t;
+ }
+
+ void Matrix::operator *= (const Matrix & m)
+ {
+ Matrix t = (*this) * m;
+ memcpy((void*)this->e, (void*)t.e, sizeof(float) * 16);
+ }
+
+ const float * Matrix::getElements() const
+ {
+ return e;
+ }
+
+ void Matrix::setIdentity()
+ {
+ memset(e, 0, sizeof(float) * 16);
+ e[0] = e[5] = e[10] = e[15] = 1;
+ }
+
+ void Matrix::setTranslation(float x, float y)
+ {
+ setIdentity();
+ e[12] = x;
+ e[13] = y;
+ }
+
+ void Matrix::setRotation(float rad)
+ {
+ setIdentity();
+ float c = cos(rad), s = sin(rad);
+ e[0] = c; e[4] = -s;
+ e[1] = s; e[5] = c;
+ }
+
+ void Matrix::setScale(float sx, float sy)
+ {
+ setIdentity();
+ e[0] = sx;
+ e[5] = sy;
+ }
+
+ void Matrix::setShear(float kx, float ky)
+ {
+ setIdentity();
+ e[1] = ky;
+ e[4] = kx;
+ }
+
+ void Matrix::setTransformation(float x, float y, float angle, float sx, float sy, float ox, float oy)
+ {
+ memset(e, 0, sizeof(float) * 16); // zero out matrix
+ float c = cos(angle), s = sin(angle);
+ // matrix multiplication carried out on paper:
+ // |1 x| |c -s | |sx | |1 -ox|
+ // | 1 y| |s c | | sy | | 1 -oy|
+ // | 1 | | 1 | | 1 | | 1 |
+ // | 1| | 1| | 1| | 1 |
+ // move rotate scale origin
+ e[10] = e[15] = 1.0f;
+ e[0] = c * sx ; // = a
+ e[1] = s * sx ; // = b
+ e[4] = - s * sy; // = c
+ e[5] = c * sy; // = d
+ e[12] = x - ox * e[0] - oy * e[4];
+ e[13] = y - ox * e[1] - oy * e[5];
+ }
+
+ void Matrix::translate(float x, float y)
+ {
+ Matrix t;
+ t.setTranslation(x, y);
+ this->operator *=(t);
+ }
+
+ void Matrix::rotate(float rad)
+ {
+ Matrix t;
+ t.setRotation(rad);
+ this->operator *=(t);
+ }
+
+ void Matrix::scale(float sx, float sy)
+ {
+ Matrix t;
+ t.setScale(sx, sy);
+ this->operator *=(t);
+ }
+
+ void Matrix::shear(float kx, float ky)
+ {
+ Matrix t;
+ t.setShear(kx, ky);
+ this->operator *=(t);
+ }
+
+ // | x |
+ // | y |
+ // | 0 |
+ // | 1 |
+ // | e0 e4 e8 e12 |
+ // | e1 e5 e9 e13 |
+ // | e2 e6 e10 e14 |
+ // | e3 e7 e11 e15 |
+
+ void Matrix::transform(vertex * dst, const vertex * src, int size) const
+ {
+ for (int i = 0; i<size; ++i)
+ {
+ // Store in temp variables in case src = dst
+ float x = (e[0] * src[i].x) + (e[4] * src[i].y) + (0) + (e[12]);
+ float y = (e[1] * src[i].x) + (e[5] * src[i].y) + (0) + (e[13]);
+
+ dst[i].x = x;
+ dst[i].y = y;
+ }
+ }
+
+ } // namespace Math
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/libjin/math/je_matrix.h b/src/libjin/math/je_matrix.h
new file mode 100644
index 0000000..bbc831d
--- /dev/null
+++ b/src/libjin/math/je_matrix.h
@@ -0,0 +1,159 @@
+#ifndef __JE_MATRIX_H__
+#define __JE_MATRIX_H__
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ struct vertex
+ {
+ unsigned char r, g, b, a;
+ float x, y;
+ float s, t;
+ };
+ ///
+ /// This class is the basis for all transformations in LOVE. Althought not
+ /// really needed for 2D, it contains 4x4 elements to be compatible with
+ /// OpenGL without conversions.
+ /// Ҫתõľ
+ /// https://blog.csdn.net/candycat1992/article/details/8830894
+ ///
+ class Matrix
+ {
+ private:
+
+ ///
+ /// | e0 e4 e8 e12 |
+ /// | e1 e5 e9 e13 |
+ /// | e2 e6 e10 e14 |
+ /// | e3 e7 e11 e15 |
+ ///
+ float e[16];
+
+ public:
+
+ static const Matrix Identity;
+
+ ///
+ /// Creates a new identity matrix.
+ ///
+ Matrix();
+
+ ///
+ /// Destructor.
+ ///
+ ~Matrix();
+
+ void setOrtho(float _left, float _right, float _bottom, float _top, float _near, float _far);
+
+ ///
+ /// Multiplies this Matrix with another Matrix, changing neither.
+ /// @param m The Matrix to multiply with this Matrix.
+ /// @return The combined matrix.
+ ///
+ Matrix operator * (const Matrix & m) const;
+
+ ///
+ /// Multiplies a Matrix into this Matrix.
+ /// @param m The Matrix to combine into this Matrix.
+ ///
+ void operator *= (const Matrix & m);
+
+ ///
+ /// Gets a pointer to the 16 array elements.
+ /// @return The array elements.
+ ///
+ const float* getElements() const;
+
+ ///
+ /// Resets this Matrix to the identity matrix.
+ ///
+ void setIdentity();
+
+ ///
+ /// Resets this Matrix to a translation.
+ /// @param x Translation along x-axis.
+ /// @param y Translation along y-axis.
+ ///
+ void setTranslation(float x, float y);
+
+ ///
+ /// Resets this Matrix to a rotation.
+ /// @param r The angle in radians.
+ ///
+ void setRotation(float r);
+
+ ///
+ /// Resets this Matrix to a scale transformation.
+ /// @param sx Scale factor along the x-axis.
+ /// @param sy Scale factor along the y-axis.
+ ///
+ void setScale(float sx, float sy);
+
+ ///
+ /// Resets this Matrix to a shear transformation.
+ /// @param kx Shear along x-axis.
+ /// @param ky Shear along y-axis.
+ ///
+ void setShear(float kx, float ky);
+
+ ///
+ /// Creates a transformation with a certain position, orientation, scale
+ /// and offset. Perfect for Drawables -- what a coincidence!
+ ///
+ /// @param x The translation along the x-axis.
+ /// @param y The translation along the y-axis.
+ /// @param angle The rotation (rad) around the center with offset (ox,oy).
+ /// @param sx Scale along x-axis.
+ /// @param sy Scale along y-axis.
+ /// @param ox The offset for rotation along the x-axis.
+ /// @param oy The offset for rotation along the y-axis.
+ /// @param kx Shear along x-axis
+ /// @param ky Shear along y-axis
+ ///
+ void setTransformation(float x, float y, float angle, float sx, float sy, float ox, float oy);
+
+ ///
+ /// Multiplies this Matrix with a translation.
+ /// @param x Translation along x-axis.
+ /// @param y Translation along y-axis.
+ ///
+ void translate(float x, float y);
+
+ ///
+ /// Multiplies this Matrix with a rotation.
+ /// @param r Angle in radians.
+ ///
+ void rotate(float r);
+
+ ///
+ /// Multiplies this Matrix with a scale transformation.
+ /// @param sx Scale factor along the x-axis.
+ /// @param sy Scale factor along the y-axis.
+ ///
+ void scale(float sx, float sy);
+
+ ///
+ /// Multiplies this Matrix with a shear transformation.
+ /// @param kx Shear along the x-axis.
+ /// @param ky Shear along the y-axis.
+ ///
+ void shear(float kx, float ky);
+
+ ///
+ /// Transforms an array of vertices by this Matrix. The sources and
+ /// destination arrays may be the same.
+ ///
+ /// @param dst Storage for the transformed vertices.
+ /// @param src The source vertices.
+ /// @param size The number of vertices.
+ ///
+ void transform(vertex * dst, const vertex * src, int size) const;
+
+ };
+
+ } // namespace Math
+} // namespace JinEngine
+
+#endif // __JE_MATRIX_H__
diff --git a/src/libjin/math/je_quad.h b/src/libjin/math/je_quad.h
new file mode 100644
index 0000000..8a7bd64
--- /dev/null
+++ b/src/libjin/math/je_quad.h
@@ -0,0 +1,23 @@
+#ifndef __JE_QUAD_H__
+#define __JE_QUAD_H__
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ ///
+ ///
+ ///
+ struct Quad
+ {
+ ///
+ ///
+ ///
+ float x, y, w, h;
+ };
+
+ } // namespace Math
+} // namespace JinEngine
+
+#endif // __JE_QUAD_H__
diff --git a/src/libjin/math/je_random.cpp b/src/libjin/math/je_random.cpp
new file mode 100644
index 0000000..216fd79
--- /dev/null
+++ b/src/libjin/math/je_random.cpp
@@ -0,0 +1,52 @@
+#include <math.h>
+#include "je_random.h"
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ RandomGenerator::RandomGenerator(uint32 seed)
+ : mSeed(seed)
+ {
+ }
+
+ uint32 RandomGenerator::rand()
+ {
+ unsigned int next = mSeed;
+ uint32 result;
+
+ next *= 1103515245;
+ next += 12345;
+ result = (unsigned int)(next / 65536) % 2048;
+
+ next *= 1103515245;
+ next += 12345;
+ result <<= 10;
+ result ^= (unsigned int)(next / 65536) % 1024;
+
+ next *= 1103515245;
+ next += 12345;
+ result <<= 10;
+ result ^= (unsigned int)(next / 65536) % 1024;
+
+ mSeed = next;
+
+ return result;
+ }
+
+ uint32 RandomGenerator::rand(uint32 min, uint32 max)
+ {
+ uint32 n = rand();
+ return n % (max - min + 1) + min;
+ }
+
+ float RandomGenerator::randf(float min, float max, int ac)
+ {
+ uint32 a = pow(10.f, ac);
+ uint32 n = rand(min*a, max*a);
+ return (float)n / a;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/src/libjin/math/je_random.h b/src/libjin/math/je_random.h
new file mode 100644
index 0000000..0f53155
--- /dev/null
+++ b/src/libjin/math/je_random.h
@@ -0,0 +1,33 @@
+#ifndef __JE_RANDOM_H__
+#define __JE_RANDOM_H__
+
+#include "../common/je_types.h"
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ ///
+ /// A random number generator.
+ ///
+ class RandomGenerator
+ {
+ public:
+ RandomGenerator(uint32 seed);
+
+ uint32 rand();
+
+ uint32 rand(uint32 min, uint32 max);
+
+ float randf(float min, float max, int ac);
+
+ private:
+ uint32 mSeed;
+
+ };
+
+ } // namespace Math
+} // namespace JinEngine
+
+#endif \ No newline at end of file
diff --git a/src/libjin/math/je_transform.cpp b/src/libjin/math/je_transform.cpp
new file mode 100644
index 0000000..c0676cb
--- /dev/null
+++ b/src/libjin/math/je_transform.cpp
@@ -0,0 +1,99 @@
+#include "je_transform.h"
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ Transform::Transform()
+ : mScale(1, 1)
+ , mPosition(0, 0)
+ , mOrigin(0, 0)
+ , mRotation(0)
+ {
+ }
+
+ void Transform::set(float x, float y, float sx, float sy, float r, float ox, float oy)
+ {
+ setPosition(x, y);
+ setScale(sx, sy);
+ setRotation(r);
+ setOrigin(ox, oy);
+ }
+
+ void Transform::setScale(float sx, float sy)
+ {
+ mScale.set(sx, sy);
+ }
+
+ Vector2<float> Transform::getScale() const
+ {
+ return mScale;
+ }
+
+ void Transform::scale(float sx, float sy)
+ {
+ mScale.x *= sx;
+ mScale.y *= sy;
+ }
+
+ void Transform::setPosition(const Vector2<float>& p)
+ {
+ setPosition(p.x, p.y);
+ }
+
+ void Transform::setPosition(float x, float y)
+ {
+ mPosition.set(x, y);
+ }
+
+ Vector2<float> Transform::getPosition() const
+ {
+ return mPosition;
+ }
+
+ void Transform::move(float x, float y)
+ {
+ mPosition.x += x;
+ mPosition.y += y;
+ }
+
+ void Transform::move(const Vector2<float>& v)
+ {
+ move(v.x, v.y);
+ }
+
+ void Transform::setOrigin(float x, float y)
+ {
+ mOrigin.set(x, y);
+ }
+
+ Vector2<float> Transform::getOrigin() const
+ {
+ return mOrigin;
+ }
+
+ void Transform::setRotation(float r)
+ {
+ mRotation = r;
+ }
+
+ float Transform::getRotation() const
+ {
+ return mRotation;
+ }
+
+ void Transform::rotate(float r)
+ {
+ mRotation += r;
+ }
+
+ Matrix Transform::getMatrix() const
+ {
+ Matrix m;
+ m.setTransformation(mPosition.x, mPosition.y, mRotation, mScale.x, mScale.y, mOrigin.x, mOrigin.y);
+ return m;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/src/libjin/math/je_transform.h b/src/libjin/math/je_transform.h
new file mode 100644
index 0000000..cb1f0ee
--- /dev/null
+++ b/src/libjin/math/je_transform.h
@@ -0,0 +1,49 @@
+#ifndef __JE_TRANSFORM_H__
+#define __JE_TRANSFORM_H__
+
+#include "je_matrix.h"
+#include "je_vector2.hpp"
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ class Transform
+ {
+ public:
+ Transform();
+
+ void set(float x, float y, float sx, float sy, float r, float ox, float oy);
+
+ void setScale(float sx, float sy);
+ Vector2<float> getScale() const;
+ void scale(float sx, float sy);
+
+ void setPosition(float x, float y);
+ void setPosition(const Vector2<float>& p);
+ Vector2<float> getPosition() const;
+ void move(float x, float y);
+ void move(const Vector2<float>& v);
+
+ void setOrigin(float x, float y);
+ Vector2<float> getOrigin() const;
+
+ void setRotation(float r);
+ float getRotation() const;
+ void rotate(float r);
+
+ Matrix getMatrix() const;
+
+ private:
+ Vector2<float> mScale;
+ Vector2<float> mPosition;
+ Vector2<float> mOrigin;
+ float mRotation;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/src/libjin/math/je_vector2.hpp b/src/libjin/math/je_vector2.hpp
new file mode 100644
index 0000000..b4cab44
--- /dev/null
+++ b/src/libjin/math/je_vector2.hpp
@@ -0,0 +1,63 @@
+#ifndef __JE_VECTOR_H__
+#define __JE_VECTOR_H__
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ template<typename T>
+ class Vector2
+ {
+ public:
+ Vector2()
+ {
+ data[0] = data[1] = 0;
+ }
+ Vector2(T _x, T _y)
+ {
+ data[0] = _x;
+ data[1] = _y;
+ }
+ Vector2(const Vector2<T>& v)
+ {
+ data[0] = v.data[0];
+ data[1] = v.data[1];
+ }
+
+ void operator = (const Vector2<T>& v)
+ {
+ data[0] = v.data[0];
+ data[1] = v.data[1];
+ }
+
+ Vector2<T> operator * (float n)
+ {
+ return Vector2<T>(data[0]*n, data[1]*n);
+ }
+
+ void operator +=(const Vector2<T> v)
+ {
+ data[0] += v.data[0];
+ data[1] += v.data[1];
+ }
+
+ void set(T _x, T _y)
+ {
+ data[0] = _x;
+ data[1] = _y;
+ }
+
+ T &x = data[0], &y = data[1]; // xy
+ T &w = data[0], &h = data[1]; // wh
+ T &colum = data[0], &row = data[1]; // colum row
+
+ private:
+ T data[2];
+
+ };
+
+ } // namespace Math
+} // namespace JinEngine
+
+#endif \ No newline at end of file
diff --git a/src/libjin/math/je_vector3.hpp b/src/libjin/math/je_vector3.hpp
new file mode 100644
index 0000000..fdab2d0
--- /dev/null
+++ b/src/libjin/math/je_vector3.hpp
@@ -0,0 +1,41 @@
+#ifndef __JE_VECTOR3_H__
+#define __JE_VECTOR3_H__
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ template<typename T>
+ class Vector3
+ {
+ public:
+ Vector3()
+ {
+ data[0] = data[1] = data[2] = 0;
+ }
+ Vector3(T _x, T _y, T _z)
+ {
+ data[0] = _x;
+ data[1] = _y;
+ data[2] = _z;
+ }
+ Vector3(const Vector3<T>& v)
+ {
+ data[0] = v.data[0];
+ data[1] = v.data[1];
+ data[2] = v.data[2];
+ }
+
+ T &x = data[0], &y = data[1], &z = data[2]; // xyz
+ T &r = data[0], &g = data[1], &b = data[2]; // rgb
+
+ private:
+ T data[3];
+
+ };
+
+ } // namespace Math
+} // namespace JinEngine
+
+#endif \ No newline at end of file
diff --git a/src/libjin/math/je_vector4.hpp b/src/libjin/math/je_vector4.hpp
new file mode 100644
index 0000000..5cd5b35
--- /dev/null
+++ b/src/libjin/math/je_vector4.hpp
@@ -0,0 +1,45 @@
+#ifndef __JE_VECTOR4_H__
+#define __JE_VECTOR4_H__
+
+namespace JinEngine
+{
+ namespace Math
+ {
+
+ template<typename T>
+ class Vector4
+ {
+ public:
+ Vector4()
+ {
+ data[0] = data[1] = data[2] = data[3] = 0;
+ }
+ Vector4(T _x, T _y, T _z, T _t)
+ {
+ data[0] = _x;
+ data[1] = _y;
+ data[2] = _z;
+ data[3] = _t;
+ }
+ Vector4(const Vector4<T>& v)
+ {
+ data[0] = v.data[0];
+ data[1] = v.data[1];
+ data[2] = v.data[2];
+ data[3] = v.data[3];
+ }
+
+ T &x = data[0], &y = data[1], &z = data[2], &t = data[3]; // xyzt
+ T &w = data[2], &h = data[3]; // xywh
+ T &r = data[0], &g = data[1], &b = data[2], &a = data[3]; // rgb
+ T &left = data[0], &right = data[1], &top = data[2], &bottom = data[3]; // lrtb
+
+ private:
+ T data[4];
+
+ };
+
+ } // namespace Math
+} // namespace JinEngine
+
+#endif \ No newline at end of file