#pragma once #include #include #include #include "math_types.h" #include "Globals.h" struct Camera { Vector3f eye; Vector3f poi; Vector3f up; float near; float far; float fov; bool orthographic; float width; float height; Matrix44f mtxProj; Matrix44f mtxView; Camera() : eye {5.f, 4.f, 5.f}, poi {0.f, 2.f, 0.f}, up {0.f, 1.f, 0.f}, near (0.1f), far (150.f), fov (60.f), orthographic (false), width (-1.f), height (-1.f), mtxProj ( 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f), mtxView ( 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f) {} void updateMatrices(); }; struct Light { Vector3f pos; Vector3f dir; float mtxView[16]; float mtxProj[16]; float mtxLight[16]; float mtxShadow[16]; float shadowMapBias; uint16_t shadowMapSize; bool enabled; float near; float far; float area; Light() : pos (Vector3f(0.f, 10.f, 10.f)), dir (Vector3f(-1.f, -1.f, -1.f)), mtxView { 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f }, mtxProj { 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f }, mtxShadow { 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f }, shadowMapBias (0.004f), shadowMapSize (2048), near (0.1f), far (100.f), area (10.f), enabled (false) { } }; struct Transform { Quaternion rotation = Quaternion (0.0f, 0.0f, 0.0f, 1.0f); Vector3f translation = Vector3f (0.0f, 0.0f, 0.0f); Vector3f scale = Vector3f (1.0f, 1.0f, 1.0f); Transform () {}; Transform ( const Vector3f &translation, const Quaternion &rotation, const Vector3f &scale) : translation(translation), rotation(rotation), scale(scale) {} Transform (const Matrix44f& mat) { fromMatrix(mat); } Matrix44f toMatrix() const { Matrix44f result; Matrix33f scale_mat ( scale[0], 0.0f, 0.0f, 0.0f, scale[1], 0.0f, 0.0f, 0.0f, scale[2] ); result.block<3,3>(0,0) = scale_mat * rotation.toMatrix(); result.block<1,3>(3,0) = translation.transpose(); result.block<3,1>(0,3) = Vector3f::Zero(); result(3,3) = 1.0f; return result; } void fromMatrix(const Matrix44f &matrix) { // Extract rotation matrix and the quaternion Matrix33f rot_matrix (matrix.block<3,3>(0,0)); Vector3f row0 = rot_matrix.block<1,3>(0,0).transpose(); Vector3f row1 = rot_matrix.block<1,3>(1,0).transpose(); Vector3f row2 = rot_matrix.block<1,3>(2,0).transpose(); scale.set( row0.norm(), row1.norm(), row2.norm() ); rot_matrix.block<1,3>(0,0) = (row0 / scale[0]).transpose(); rot_matrix.block<1,3>(1,0) = (row1 / scale[1]).transpose(); rot_matrix.block<1,3>(2,0) = (row2 / scale[2]).transpose(); rotation = Quaternion::fromMatrix(rot_matrix).normalize(); row0 = rot_matrix.block<1,3>(0,0).transpose(); row1 = rot_matrix.block<1,3>(1,0).transpose(); row2 = rot_matrix.block<1,3>(2,0).transpose(); Vector3f trans ( matrix(3,0), matrix(3,1), matrix(3,2) ); translation = trans; } Transform operator*(const Transform &other) const { Matrix44f this_mat (toMatrix()); Matrix44f other_mat (other.toMatrix()); return Transform(this_mat * other_mat); } Vector3f operator*(const Vector3f &vec) const { assert(false); return Vector3f::Zero(); } static Transform fromTrans( const Vector3f &translation ) { return Transform ( translation, Quaternion(0.0f, 0.0f, 0.0f, 1.0f), Vector3f(1.0f, 1.0f, 1.0f) ); } static Transform fromTransRot( const Vector3f &translation, const Quaternion &rotation ) { return Transform ( translation, rotation, Vector3f(1.0f, 1.0f, 1.0f) ); } static Transform fromTransRot( const Vector3f &translation, const Matrix33f &rotation ) { return Transform ( translation, Quaternion::fromMatrix(rotation), Vector3f(1.0f, 1.0f, 1.0f) ); } static Transform fromTransRotScale( const Vector3f &translation, const Quaternion &rotation, const Vector3f &scale ) { return Transform (translation, rotation, scale); } }; struct Renderer { bool initialized = false; uint32_t view_width = 1; uint32_t view_height = 1; std::vector cameras; Renderer() : initialized(false), view_width (0), view_height (0) { } void Initialize(int width, int height); void Shutdown(); void RenderGl(); void RenderGui(); void Resize (int width, int height); };