Changeset 1044


Ignore:
Timestamp:
Oct 31, 2011, 5:51:25 PM (9 years ago)
Author:
gary
Message:

core: fix bugs in mat4::lookat() and mat4::perspective(), and ensure these
function use degrees rather than radians.

Location:
trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/matrix.cpp

    r1041 r1044  
    1313#endif
    1414
     15#if defined WIN32 && !defined _XBOX
     16#   define _USE_MATH_DEFINES /* for M_PI */
     17#   define WIN32_LEAN_AND_MEAN
     18#   include <windows.h>
     19#   undef near /* Fuck Microsoft */
     20#   undef far /* Fuck Microsoft again */
     21#endif
     22
     23#include <cmath> /* for M_PI */
    1524#include <cstdlib> /* free() */
    1625#include <cstring> /* strdup() */
     
    4756template<> vec2 normalize(vec2 v)
    4857{
    49     float norm = v.sqlen();
     58    float norm = v.len();
    5059    if (!norm)
    5160        return vec2(0);
     
    5564template<> vec3 normalize(vec3 v)
    5665{
    57     float norm = v.sqlen();
     66    float norm = v.len();
    5867    if (!norm)
    5968        return vec3(0);
     
    6372template<> vec4 normalize(vec4 v)
    6473{
    65     float norm = v.sqlen();
     74    float norm = v.len();
    6675    if (!norm)
    6776        return vec4(0);
     
    189198#endif
    190199
     200template<> mat4 mat4::translate(float x, float y, float z)
     201{
     202    mat4 ret(1.0f);
     203    ret[3][0] = x;
     204    ret[3][1] = y;
     205    ret[3][2] = z;
     206    return ret;
     207}
     208
     209template<> mat4 mat4::translate(vec3 v)
     210{
     211    return translate(v.x, v.y, v.z);
     212}
     213
     214template<> mat4 mat4::rotate(float angle, float x, float y, float z)
     215{
     216    angle *= (M_PI / 180.0f);
     217
     218    float st = sinf(angle);
     219    float ct = cosf(angle);
     220
     221    float len = sqrtf(x * x + y * y + z * z);
     222    float invlen = len ? 1.0f / len : 0.0f;
     223    x *= invlen;
     224    y *= invlen;
     225    z *= invlen;
     226
     227    float mtx = (1.0f - ct) * x;
     228    float mty = (1.0f - ct) * y;
     229    float mtz = (1.0f - ct) * z;
     230
     231    mat4 ret(1.0f);
     232
     233    ret[0][0] = x * mtx + ct;
     234    ret[0][1] = x * mty + st * z;
     235    ret[0][2] = x * mtz - st * y;
     236
     237    ret[1][0] = y * mtx - st * z;
     238    ret[1][1] = y * mty + ct;
     239    ret[1][2] = y * mtz + st * x;
     240
     241    ret[2][0] = z * mtx + st * y;
     242    ret[2][1] = z * mty - st * x;
     243    ret[2][2] = z * mtz + ct;
     244
     245    return ret;
     246}
     247
     248template<> mat4 mat4::rotate(float angle, vec3 v)
     249{
     250    return rotate(angle, v.x, v.y, v.z);
     251}
     252
     253template<> mat4 mat4::lookat(vec3 eye, vec3 center, vec3 up)
     254{
     255    vec3 v3 = normalize(eye - center);
     256    vec3 v2 = normalize(up);
     257    vec3 v1 = normalize(cross(v2, v3));
     258    v2 = cross(v3, v1);
     259
     260    mat4 orient(1.0f);
     261    orient[0][0] = v1.x;
     262    orient[0][1] = v2.x;
     263    orient[0][2] = v3.x;
     264    orient[1][0] = v1.y;
     265    orient[1][1] = v2.y;
     266    orient[1][2] = v3.y;
     267    orient[2][0] = v1.z;
     268    orient[2][1] = v2.z;
     269    orient[2][2] = v3.z;
     270
     271    return orient * mat4::translate(-eye);
     272}
     273
    191274template<> mat4 mat4::ortho(float left, float right, float bottom,
    192275                            float top, float near, float far)
     
    225308}
    226309
    227 template<> mat4 mat4::translate(float x, float y, float z)
    228 {
    229     mat4 ret(1.0f);
    230     ret[3][0] = x;
    231     ret[3][1] = y;
    232     ret[3][2] = z;
    233     return ret;
    234 }
    235 
    236 template<> mat4 mat4::translate(vec3 v)
    237 {
    238     return translate(v.x, v.y, v.z);
    239 }
    240 
    241 template<> mat4 mat4::lookat(vec3 eye, vec3 center, vec3 up)
    242 {
    243     vec3 f = normalize(center - eye);
    244     vec3 u = normalize(up);
    245     vec3 s = normalize(cross(f, u));
    246     u = cross(s, f);
    247 
    248     mat4 ret(1.0f);
    249     ret[0][0] = s.x;
    250     ret[0][1] = s.y;
    251     ret[0][2] = s.z;
    252     ret[1][0] = u.x;
    253     ret[1][1] = u.y;
    254     ret[1][2] = u.z;
    255     ret[2][0] =-f.x;
    256     ret[2][1] =-f.y;
    257     ret[2][2] =-f.z;
    258     return ret * mat4::translate(-eye);
    259 }
    260 
    261 template<> mat4 mat4::perspective(float theta, float width,
     310template<> mat4 mat4::perspective(float fov_y, float width,
    262311                                  float height, float near, float far)
    263312{
    264     float t1 = tanf(theta * 0.5f);
    265     float t2 = t1 * height / width;
     313    fov_y *= (M_PI / 180.0f);
     314
     315    float t2 = tanf(fov_y * 0.5f);
     316    float t1 = t2 * width / height;
    266317
    267318    return frustum(-near * t1, near * t1, -near * t2, near * t2, near, far);
    268319}
    269320
    270 template<> mat4 mat4::rotate(float theta, float x, float y, float z)
    271 {
    272     float st = sinf(theta);
    273     float ct = cosf(theta);
    274 
    275     float len = sqrtf(x * x + y * y + z * z);
    276     float invlen = len ? 1.0f / len : 0.0f;
    277     x *= invlen;
    278     y *= invlen;
    279     z *= invlen;
    280 
    281     float mtx = (1.0f - ct) * x;
    282     float mty = (1.0f - ct) * y;
    283     float mtz = (1.0f - ct) * z;
    284 
    285     mat4 ret(1.0f);
    286 
    287     ret[0][0] = x * mtx + ct;
    288     ret[0][1] = x * mty + st * z;
    289     ret[0][2] = x * mtz - st * y;
    290 
    291     ret[1][0] = y * mtx - st * z;
    292     ret[1][1] = y * mty + ct;
    293     ret[1][2] = y * mtz + st * x;
    294 
    295     ret[2][0] = z * mtx + st * y;
    296     ret[2][1] = z * mty - st * x;
    297     ret[2][2] = z * mtz + ct;
    298 
    299     return ret;
    300 }
    301 
    302 template<> mat4 mat4::rotate(float theta, vec3 v)
    303 {
    304     return rotate(theta, v.x, v.y, v.z);
    305 }
    306 
    307321} /* namespace lol */
    308322
  • trunk/src/matrix.h

    r1041 r1044  
    359359    Mat4<T> invert() const;
    360360
     361    /* Helpers for transformation matrices */
     362    static Mat4<T> translate(T x, T y, T z);
     363    static Mat4<T> translate(Vec3<T> v);
     364    static Mat4<T> rotate(T angle, T x, T y, T z);
     365    static Mat4<T> rotate(T angle, Vec3<T> v);
     366
     367    static inline Mat4<T> translate(Mat4<T> mat, Vec3<T> v)
     368    {
     369        return translate(v) * mat;
     370    }
     371
     372    static inline Mat4<T> rotate(Mat4<T> mat, T angle, Vec3<T> v)
     373    {
     374        return rotate(angle, v) * mat;
     375    }
     376
     377    /* Helpers for view matrices */
     378    static Mat4<T> lookat(Vec3<T> eye, Vec3<T> center, Vec3<T> up);
     379
     380    /* Helpers for projection matrices */
    361381    static Mat4<T> ortho(T left, T right, T bottom, T top, T near, T far);
    362382    static Mat4<T> frustum(T left, T right, T bottom, T top, T near, T far);
    363     static Mat4<T> lookat(Vec3<T> eye, Vec3<T> center, Vec3<T> up);
    364     static Mat4<T> perspective(T theta, T width, T height, T near, T far);
    365     static Mat4<T> translate(T x, T y, T z);
    366     static Mat4<T> translate(Vec3<T> v);
    367     static Mat4<T> rotate(T theta, T x, T y, T z);
    368     static Mat4<T> rotate(T theta, Vec3<T> v);
     383    static Mat4<T> perspective(T fov_y, T width, T height, T near, T far);
    369384
    370385    void printf() const;
  • trunk/src/scene.cpp

    r1042 r1044  
    288288    static float f = 0.0f;
    289289    f += 0.01f;
    290     data->model_matrix *= mat4::rotate(0.1f * sinf(f), 1.0f, 0.0f, 0.0f);
    291     data->model_matrix *= mat4::rotate(0.3f * cosf(f), 0.0f, 0.0f, 1.0f);
     290    data->model_matrix *= mat4::rotate(6.0f * sinf(f), 1.0f, 0.0f, 0.0f);
     291    data->model_matrix *= mat4::rotate(17.0f * cosf(f), 0.0f, 0.0f, 1.0f);
    292292#endif
    293293    data->model_matrix *= mat4::translate(-320.0f, -240.0f, 0.0f);
  • trunk/src/video.cpp

    r968 r1044  
    1818#   define WIN32_LEAN_AND_MEAN
    1919#   include <windows.h>
     20#   undef near /* Fuck Microsoft */
     21#   undef far /* Fuck Microsoft again */
    2022#endif
    2123
     
    8082void Video::SetFov(float theta)
    8183{
    82 #undef near /* Fuck Microsoft */
    83 #undef far /* Fuck Microsoft again */
    8484    vec2 size = GetSize();
    8585    float near = -size.x - size.y;
Note: See TracChangeset for help on using the changeset viewer.