|
|
@ -439,14 +439,57 @@ void UpdateCamera(Camera *camera) |
|
|
|
if (CAMERA.angle.y > CAMERA_FIRST_PERSON_MIN_CLAMP*DEG2RAD) CAMERA.angle.y = CAMERA_FIRST_PERSON_MIN_CLAMP*DEG2RAD; |
|
|
|
else if (CAMERA.angle.y < CAMERA_FIRST_PERSON_MAX_CLAMP*DEG2RAD) CAMERA.angle.y = CAMERA_FIRST_PERSON_MAX_CLAMP*DEG2RAD; |
|
|
|
|
|
|
|
// Recalculate camera target considering translation and rotation |
|
|
|
Matrix translation = MatrixTranslate(0, 0, (CAMERA.targetDistance/CAMERA_FREE_PANNING_DIVIDER)); |
|
|
|
Matrix rotation = MatrixRotateXYZ((Vector3){ PI*2 - CAMERA.angle.y, PI*2 - CAMERA.angle.x, 0 }); |
|
|
|
Matrix transform = MatrixMultiply(translation, rotation); |
|
|
|
|
|
|
|
camera->target.x = camera->position.x - transform.m12; |
|
|
|
camera->target.y = camera->position.y - transform.m13; |
|
|
|
camera->target.z = camera->position.z - transform.m14; |
|
|
|
// Calculate translation matrix |
|
|
|
Matrix matTranslation = { 1.0f, 0.0f, 0.0f, 0.0f, |
|
|
|
0.0f, 1.0f, 0.0f, 0.0f, |
|
|
|
0.0f, 0.0f, 1.0f, (CAMERA.targetDistance/CAMERA_FREE_PANNING_DIVIDER), |
|
|
|
0.0f, 0.0f, 0.0f, 1.0f }; |
|
|
|
|
|
|
|
// Calculate rotation matrix |
|
|
|
Matrix matRotation = { 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 }; |
|
|
|
|
|
|
|
float cosz = cosf(0.0f); |
|
|
|
float sinz = sinf(0.0f); |
|
|
|
float cosy = cosf(-(PI*2 - CAMERA.angle.x)); |
|
|
|
float siny = sinf(-(PI*2 - CAMERA.angle.x)); |
|
|
|
float cosx = cosf(-(PI*2 - CAMERA.angle.y)); |
|
|
|
float sinx = sinf(-(PI*2 - CAMERA.angle.y)); |
|
|
|
|
|
|
|
matRotation.m0 = cosz*cosy; |
|
|
|
matRotation.m4 = (cosz*siny*sinx) - (sinz*cosx); |
|
|
|
matRotation.m8 = (cosz*siny*cosx) + (sinz*sinx); |
|
|
|
matRotation.m1 = sinz*cosy; |
|
|
|
matRotation.m5 = (sinz*siny*sinx) + (cosz*cosx); |
|
|
|
matRotation.m9 = (sinz*siny*cosx) - (cosz*sinx); |
|
|
|
matRotation.m2 = -siny; |
|
|
|
matRotation.m6 = cosy*sinx; |
|
|
|
matRotation.m10= cosy*cosx; |
|
|
|
|
|
|
|
// Multiply translation and rotation matrices |
|
|
|
Matrix matTransform = { 0 }; |
|
|
|
matTransform.m0 = matTranslation.m0*matRotation.m0 + matTranslation.m1*matRotation.m4 + matTranslation.m2*matRotation.m8 + matTranslation.m3*matRotation.m12; |
|
|
|
matTransform.m1 = matTranslation.m0*matRotation.m1 + matTranslation.m1*matRotation.m5 + matTranslation.m2*matRotation.m9 + matTranslation.m3*matRotation.m13; |
|
|
|
matTransform.m2 = matTranslation.m0*matRotation.m2 + matTranslation.m1*matRotation.m6 + matTranslation.m2*matRotation.m10 + matTranslation.m3*matRotation.m14; |
|
|
|
matTransform.m3 = matTranslation.m0*matRotation.m3 + matTranslation.m1*matRotation.m7 + matTranslation.m2*matRotation.m11 + matTranslation.m3*matRotation.m15; |
|
|
|
matTransform.m4 = matTranslation.m4*matRotation.m0 + matTranslation.m5*matRotation.m4 + matTranslation.m6*matRotation.m8 + matTranslation.m7*matRotation.m12; |
|
|
|
matTransform.m5 = matTranslation.m4*matRotation.m1 + matTranslation.m5*matRotation.m5 + matTranslation.m6*matRotation.m9 + matTranslation.m7*matRotation.m13; |
|
|
|
matTransform.m6 = matTranslation.m4*matRotation.m2 + matTranslation.m5*matRotation.m6 + matTranslation.m6*matRotation.m10 + matTranslation.m7*matRotation.m14; |
|
|
|
matTransform.m7 = matTranslation.m4*matRotation.m3 + matTranslation.m5*matRotation.m7 + matTranslation.m6*matRotation.m11 + matTranslation.m7*matRotation.m15; |
|
|
|
matTransform.m8 = matTranslation.m8*matRotation.m0 + matTranslation.m9*matRotation.m4 + matTranslation.m10*matRotation.m8 + matTranslation.m11*matRotation.m12; |
|
|
|
matTransform.m9 = matTranslation.m8*matRotation.m1 + matTranslation.m9*matRotation.m5 + matTranslation.m10*matRotation.m9 + matTranslation.m11*matRotation.m13; |
|
|
|
matTransform.m10 = matTranslation.m8*matRotation.m2 + matTranslation.m9*matRotation.m6 + matTranslation.m10*matRotation.m10 + matTranslation.m11*matRotation.m14; |
|
|
|
matTransform.m11 = matTranslation.m8*matRotation.m3 + matTranslation.m9*matRotation.m7 + matTranslation.m10*matRotation.m11 + matTranslation.m11*matRotation.m15; |
|
|
|
matTransform.m12 = matTranslation.m12*matRotation.m0 + matTranslation.m13*matRotation.m4 + matTranslation.m14*matRotation.m8 + matTranslation.m15*matRotation.m12; |
|
|
|
matTransform.m13 = matTranslation.m12*matRotation.m1 + matTranslation.m13*matRotation.m5 + matTranslation.m14*matRotation.m9 + matTranslation.m15*matRotation.m13; |
|
|
|
matTransform.m14 = matTranslation.m12*matRotation.m2 + matTranslation.m13*matRotation.m6 + matTranslation.m14*matRotation.m10 + matTranslation.m15*matRotation.m14; |
|
|
|
matTransform.m15 = matTranslation.m12*matRotation.m3 + matTranslation.m13*matRotation.m7 + matTranslation.m14*matRotation.m11 + matTranslation.m15*matRotation.m15; |
|
|
|
|
|
|
|
camera->target.x = camera->position.x - matTransform.m12; |
|
|
|
camera->target.y = camera->position.y - matTransform.m13; |
|
|
|
camera->target.z = camera->position.z - matTransform.m14; |
|
|
|
|
|
|
|
// If movement detected (some key pressed), increase swinging |
|
|
|
for (int i = 0; i < 6; i++) if (direction[i]) { swingCounter++; break; } |
|
|
|