windmill-gint/src/camera.cpp

197 lines
5.0 KiB
C++

#include "camera.hpp"
//-----------------------------------------------------------------------------
// CAMERA
//-----------------------------------------------------------------------------
Camera::Camera()
{
x = 0;
y = 0;
z = 0;
yaw = 0;
pitch = 0;
fov = 50;
near = 1;
far = 1000;
float fov_rad = to_rad(fov);
scale_coef = 64 * near * tanf(fov_rad);
cos_fov = SCALE_AI * cosf(fov_rad);
//sin_fov = SCALE_AI * sinf(fov_rad);
sin_fov = sinf(fov_rad);
cos_fov_square = cosf(fov_rad) * cosf(fov_rad);
//near_coef = - far / float(far - near);
//far_coef = - far * near * 128 / (far - near);
}
//-----------------------------------------------------------------------------
// SET
//-----------------------------------------------------------------------------
void Camera::set(float _x, float _y, float _z, float _yaw, float _pitch)
{
x = _x;
y = _y;
z = _z;
yaw = to_rad(_yaw);
pitch = to_rad(_pitch);
}
void Camera::set(Camera* _camera)
{
x = _camera->x;
y = _camera->y;
z = _camera->z;
yaw = _camera->yaw;
pitch = _camera->pitch;
}
//-----------------------------------------------------------------------------
// UPDATE_CAMERA
//-----------------------------------------------------------------------------
void Camera::update()
{
if (look_at_duration)
{
yaw = (yaw * (look_at_duration - 1) + look_at_yaw) / look_at_duration;
look_at_duration -= 1;
}
cos_yaw = cosf(yaw);
sin_yaw = sinf(yaw);
cos_pitch = cosf(pitch);
sin_pitch = sinf(pitch);
//nx = SCALE_AI * cos_pitch * cos_yaw;
//ny = SCALE_AI * cos_pitch * sin_yaw;
//nz = SCALE_AI * sin_pitch;
nx = cos_pitch * cos_yaw;
ny = cos_pitch * sin_yaw;
nz = sin_pitch;
// a1 a2 a3
// a4 a5 a6
// a7 a8 a9
a1 = SCALE_AI * cos_pitch * cos_yaw;
a2 = SCALE_AI * cos_pitch * sin_yaw;
a3 = SCALE_AI * sin_pitch;
a4 = SCALE_AI * -sin_yaw;
a5 = SCALE_AI * cos_yaw;
a6 = SCALE_AI * 0;
a7 = SCALE_AI * -sin_pitch * cos_yaw;
a8 = SCALE_AI * sin_pitch * -sin_yaw;
a9 = SCALE_AI * cos_pitch;
}
//-----------------------------------------------------------------------------
// NORMAL_VECTOR
//-----------------------------------------------------------------------------
void Camera::direction_vector(float* _x, float* _y)
{
*_x = cos_yaw;
*_y = sin_yaw;
}
//-----------------------------------------------------------------------------
// MOVE_FRONT (valeur positive signifie devant)
//-----------------------------------------------------------------------------
void Camera::move_front(float value)
{
x += value * cosf(yaw);
y -= value * sinf(yaw);
}
//-----------------------------------------------------------------------------
// MOVE_SIDE (valeur positive signifie à droite)
//-----------------------------------------------------------------------------
void Camera::move_side(float value)
{
x -= value * sinf(yaw);
y -= value * cosf(yaw);
}
//-----------------------------------------------------------------------------
// MOVE_ALTITUDE (valeur positive signifie en haut)
//-----------------------------------------------------------------------------
void Camera::move_altitude(float value)
{
z += value;
}
//-----------------------------------------------------------------------------
// TURN_YAW (valeur positive signifie a gauche)
//-----------------------------------------------------------------------------
void Camera::turn_yaw(float value)
{
yaw += to_rad(value);
}
//-----------------------------------------------------------------------------
// TURN_PITCH (valeur positive signifie en haut)
//-----------------------------------------------------------------------------
void Camera::turn_pitch(float value)
{
pitch += to_rad(value);
}
//-----------------------------------------------------------------------------
// SET_YAW (valeur positive signifie a gauche)
//-----------------------------------------------------------------------------
void Camera::set_yaw(float value)
{
yaw = to_rad(value);
}
//-----------------------------------------------------------------------------
// SET_PITCH (valeur positive signifie en haut)
//-----------------------------------------------------------------------------
void Camera::set_pitch(float value)
{
pitch = to_rad(value);
}
//-----------------------------------------------------------------------------
// LOOK_AT
//-----------------------------------------------------------------------------
void Camera::look_at(float look_at_x, float look_at_y, float look_at_z, float duration)
{
look_at_yaw = 0;//atan2f(look_at_y - y, look_at_x - x);
//look_at_pitch = atan2(look_at_z - z, look_at_x - x);
// calcule de sqrt ??
look_at_duration = duration;
}
/*
//-----------------------------------------------------------------------------
// MIN
//-----------------------------------------------------------------------------
int Camera::min(int a, int b)
{
return (a < b) ? a : b;
}
//-----------------------------------------------------------------------------
// MAX
//-----------------------------------------------------------------------------
int Camera::max(int a, int b)
{
return (a > b) ? a : b;
}
*/