diff --git a/src/main.c b/src/main.c index c803734..00f6962 100644 --- a/src/main.c +++ b/src/main.c @@ -474,14 +474,18 @@ void init() { float speed = 10.0f; // 1 unit per second float last_position = 0.0f; - float cam_speed = 10.0f; // 1 unit per sec - float cam_yaw_speed = 3.5f; // 3.5 degrees per second + float cam_speed = 30.0f; // 1 unit per sec + float cam_yaw_speed = 1.0f; // 3.5 degrees per second vec3_t cam_pos = { 0.0f, 20.0f, 150.0f }; // don't start at zero, or we will be too close float cam_yaw = 0.0f; // y-rotation in degrees - float cam_pitch = 0.0f; - mat4_t T = mat4_make_translation(-cam_pos.x, -cam_pos.y, -cam_pos.z); - mat4_t R = mat4_make_rotation_y(-cam_yaw); - mat4_t view_mat = mat4_mul_mat4(R, T); + float cam_pitch = 45.0f; + + // TODO: fix issues with initial view matrix and view_matrix when camera is moved + //mat4_t T = mat4_make_translation(-cam_pos.x, -cam_pos.y, -cam_pos.z); + //mat4_t R = mat4_make_rotation_y(-cam_yaw); + //mat4_t view_mat = mat4_mul_mat4(R, T); + + /* // projection matrix variables @@ -505,9 +509,33 @@ void init() { 0.0f, 0.0f, Pz, 0.0f };*/ + float yaw_rad = TO_RAD(cam_yaw); + float pitch_rad = TO_RAD(cam_pitch); + + vec3_t cam_front; + cam_front.x = cosf(yaw_rad) * cosf(pitch_rad); + cam_front.y = sinf(pitch_rad); + cam_front.z = sinf(yaw_rad) * cosf(pitch_rad); + + vec3_normalize(&cam_front); + + vec3_t world_up = { 0.0f, 1.0f, 0.0f }; + + vec3_t cam_right = vec3_cross(cam_front, world_up); + vec3_normalize(&cam_right); + + vec3_t cam_up = vec3_cross(cam_right, cam_front); + vec3_normalize(&cam_up); + + mat4_t view_mat = mat4_look_at( + cam_pos.x, cam_pos.y, cam_pos.z, + cam_pos.x + cam_front.x, cam_pos.y + cam_front.y, cam_pos.z + cam_front.z, + cam_up.x, cam_up.y, cam_up.z + ); + float fov_radians = 67.0f * ONE_DEG_IN_RAD; - mat4_t projection = mat4_make_perspective(fov_radians, (float)width / (float)height, 0.1f, 1000.0f); + mat4_t projection = mat4_make_perspective(fov_radians, (float)width / (float)height, 0.1f, 5000.0f); //mat4_t rotation_correction = mat4_make_rotation_x(TO_RAD(-90.0f)); @@ -566,8 +594,8 @@ void init() { glUniformMatrix4fv(matrix_location, 1, GL_FALSE, final_matrix.m); }*/ - float yaw_rad = TO_RAD(cam_yaw); - float pitch_rad = TO_RAD(cam_pitch); + yaw_rad = TO_RAD(cam_yaw); + pitch_rad = TO_RAD(cam_pitch); vec3_t cam_front; cam_front.x = cosf(yaw_rad) * cosf(pitch_rad); @@ -686,8 +714,10 @@ void init() { } if (glfwGetKey (window, GLFW_KEY_DOWN)) { cam_pitch -= cam_yaw_speed * elapsed_seconds; + cam_moved = true; } + if (cam_pitch > 89.0f) { cam_pitch = 89.0f; } diff --git a/src/renderer/mesh.c b/src/renderer/mesh.c index a434127..7d6aa3c 100644 --- a/src/renderer/mesh.c +++ b/src/renderer/mesh.c @@ -27,14 +27,20 @@ GroupMesh create_mesh_from_group(const WMOGroupData* group, const WMORootData* r const C3Vector* normals = (const C3Vector*)group->monr_data_ptr; const C2Vector* texCoords = (const C2Vector*)group->motv_data_ptr; + // TODO: double check if we need the offset here, I believe its GLfloat offset_x = group->header.boundingBox.min[0]; GLfloat offset_y = group->header.boundingBox.min[1]; GLfloat offset_z = group->header.boundingBox.min[2]; for (size_t i = 0; i < num_vertices; i++) { - float wx = positions[i].x + offset_x; - float wy = positions[i].y + offset_y; - float wz = positions[i].z + offset_z; + //float wx = positions[i].x + offset_x; + //float wy = positions[i].y + offset_y; + //float wz = positions[i].z + offset_z; + + float wx = positions[i].x; + float wy = positions[i].y; + float wz = positions[i].z; + vertices[i].position.x = wx; vertices[i].position.y = wy;