diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e20344..2620af9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,3 +38,20 @@ set(SRCS ) add_library(hydra STATIC ${SRCS} ${PUBLIC_HEADERS}) + +if(COMMAND add_public_header) + add_public_header(include/aabb.h) + add_public_header(include/hitinfo.h) + add_public_header(include/hydra.h) + add_public_header(include/matrix2.h) + add_public_header(include/matrix2x3.h) + add_public_header(include/matrix4.h) + add_public_header(include/quaternion.h) + add_public_header(include/scalar.h) + add_public_header(include/triangle3.h) + add_public_header(include/vector2.h) + add_public_header(include/vector3.h) + add_public_header(include/vector4.h) + add_public_header(include/vector2i.h) + set(KRAKEN_PUBLIC_HEADERS "${KRAKEN_PUBLIC_HEADERS}" PARENT_SCOPE) +endif() diff --git a/include/matrix4.h b/include/matrix4.h index 374c0ea..28d8759 100644 --- a/include/matrix4.h +++ b/include/matrix4.h @@ -61,10 +61,11 @@ public: void init(); void init(float *pMat); - void init(const Vector3 &new_axis_x, const Vector3 &new_axis_y, const Vector3 &new_axis_z, const Vector3 &new_transform); - void init(const Matrix4 &m); + + static Matrix4 Create(float *pMat); + static Matrix4 Create(const Vector3 &new_axis_x, const Vector3 &new_axis_y, const Vector3 &new_axis_z, const Vector3 &new_transform); // Overload comparison operator bool operator==(const Matrix4 &m) const; diff --git a/include/triangle3.h b/include/triangle3.h index 7335167..f4ba658 100644 --- a/include/triangle3.h +++ b/include/triangle3.h @@ -43,6 +43,8 @@ public: void init(const Triangle3 &tri); void init(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3); + static Triangle3 Create(const Triangle3 &tri); + static Triangle3 Create(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3); Vector3 calculateNormal() const; diff --git a/src/aabb.cpp b/src/aabb.cpp index 2e769f4..64f53fe 100644 --- a/src/aabb.cpp +++ b/src/aabb.cpp @@ -261,7 +261,7 @@ bool AABB::intersectsRay(const Vector3 &v1, const Vector3 &dir) const maxT.init(); Vector3 coord; coord.init(); - double candidatePlane[3]; + float candidatePlane[3]; // Find candidate planes; this loop can be avoided if rays cast all from the eye(assume perpsective view) for (int i=0; i<3; i++) diff --git a/src/matrix4.cpp b/src/matrix4.cpp index eb552ff..7509ccd 100644 --- a/src/matrix4.cpp +++ b/src/matrix4.cpp @@ -63,6 +63,20 @@ void Matrix4::init(const Matrix4 &m) { memcpy(c, m.c, sizeof(float) * 16); } +Matrix4 Matrix4::Create(float *pMat) +{ + Matrix4 r; + r.init(pMat); + return r; +} + +Matrix4 Matrix4::Create(const Vector3 &new_axis_x, const Vector3 &new_axis_y, const Vector3 &new_axis_z, const Vector3 &new_transform) +{ + Matrix4 r; + r.init(new_axis_x, new_axis_y, new_axis_z, new_transform); + return r; +} + float *Matrix4::getPointer() { return c; } @@ -115,7 +129,7 @@ void Matrix4::perspective(float fov, float aspect, float nearz, float farz) { memset(c, 0, sizeof(float) * 16); - float range= tan(fov * 0.5) * nearz; + float range= tan(fov * 0.5f) * nearz; c[0] = (2 * nearz) / ((range * aspect) - (-range * aspect)); c[5] = (2 * nearz) / (2 * range); c[10] = -(farz + nearz) / (farz - nearz); @@ -287,7 +301,7 @@ bool Matrix4::invert() { return false; } - det = 1.0 / det; + det = 1.0f / det; for (i = 0; i < 16; i++) { c[i] = inv[i] * det; diff --git a/src/quaternion.cpp b/src/quaternion.cpp index f3c5d74..ba2a17b 100644 --- a/src/quaternion.cpp +++ b/src/quaternion.cpp @@ -139,20 +139,20 @@ Vector3 Quaternion::eulerXYZ() const { double a2 = 2 * (c[0] * c[2] - c[1] * c[3]); if(a2 <= -0.99999) { return Vector3::Create( - 2.0 * atan2(c[1], c[0]), + 2.0f * atan2(c[1], c[0]), -PI * 0.5f, 0 ); } else if(a2 >= 0.99999) { return Vector3::Create( - 2.0 * atan2(c[1], c[0]), + 2.0f * atan2(c[1], c[0]), PI * 0.5f, 0 ); } else { return Vector3::Create( atan2(2 * (c[0] * c[1] + c[2] * c[3]), (1 - 2 * (c[1] * c[1] + c[2] * c[2]))), - asin(a2), + asinf(a2), atan2(2 * (c[0] * c[3] + c[1] * c[2]), (1 - 2 * (c[2] * c[2] + c[3] * c[3]))) ); } @@ -326,17 +326,17 @@ Matrix4 Quaternion::rotationMatrix() const { // FINDME - Determine why the more optimal routine commented below wasn't working - matRotate.c[0] = 1.0 - 2.0 * (c[2] * c[2] + c[3] * c[3]); - matRotate.c[1] = 2.0 * (c[1] * c[2] - c[0] * c[3]); - matRotate.c[2] = 2.0 * (c[0] * c[2] + c[1] * c[3]); + matRotate.c[0] = 1.0f - 2.0f * (c[2] * c[2] + c[3] * c[3]); + matRotate.c[1] = 2.0f * (c[1] * c[2] - c[0] * c[3]); + matRotate.c[2] = 2.0f * (c[0] * c[2] + c[1] * c[3]); - matRotate.c[4] = 2.0 * (c[1] * c[2] + c[0] * c[3]); - matRotate.c[5] = 1.0 - 2.0 * (c[1] * c[1] + c[3] * c[3]); - matRotate.c[6] = 2.0 * (c[2] * c[3] - c[0] * c[1]); + matRotate.c[4] = 2.0f * (c[1] * c[2] + c[0] * c[3]); + matRotate.c[5] = 1.0f - 2.0f * (c[1] * c[1] + c[3] * c[3]); + matRotate.c[6] = 2.0f * (c[2] * c[3] - c[0] * c[1]); - matRotate.c[8] = 2.0 * (c[1] * c[3] - c[0] * c[2]); - matRotate.c[9] = 2.0 * (c[0] * c[1] + c[2] * c[3]); - matRotate.c[10] = 1.0 - 2.0 * (c[1] * c[1] + c[2] * c[2]); + matRotate.c[8] = 2.0f * (c[1] * c[3] - c[0] * c[2]); + matRotate.c[9] = 2.0f * (c[0] * c[1] + c[2] * c[3]); + matRotate.c[10] = 1.0f - 2.0f * (c[1] * c[1] + c[2] * c[2]); return matRotate; } @@ -367,13 +367,13 @@ Quaternion Quaternion::FromRotationMatrix(const Matrix4 &m) y = (m[1] + m[4]) / s; z = (m[2] + m[8]) / s; } else if (m[5] > m[10]) { - const float s = 2.0 * sqrt(1.0f + m[5] - m[0] - m[10]); + const float s = 2.0f * sqrt(1.0f + m[5] - m[0] - m[10]); w = (m[2] - m[8]) / s; x = (m[1] + m[4]) / s; y = 0.25f * s; z = (m[6] + m[9]) / s; } else { - const float s = 2.0 * sqrt(1.0f + m[10] - m[0] - m[5]); + const float s = 2.0f * sqrt(1.0f + m[10] - m[0] - m[5]); w = (m[4] - m[1]) / s; x = (m[2] + m[8]) / s; y = (m[6] + m[9]) / s; diff --git a/src/triangle3.cpp b/src/triangle3.cpp index 54ec129..59f6738 100644 --- a/src/triangle3.cpp +++ b/src/triangle3.cpp @@ -112,6 +112,19 @@ void Triangle3::init(const Triangle3 &tri) vert[2] = tri[2]; } +Triangle3 Triangle3::Create(const Triangle3 &tri) +{ + Triangle3 r; + r.init(tri); + return r; +} + +Triangle3 Triangle3::Create(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3) +{ + Triangle3 r; + r.init(v1, v2, v3); + return r; +} bool Triangle3::operator ==(const Triangle3& b) const {