Changeset 648


Ignore:
Timestamp:
Feb 14, 2011, 2:26:40 AM (10 years ago)
Author:
sam
Message:

Add matrix determinant and inverse methods.

Location:
trunk
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/Makefile.am

    r631 r648  
    33
    44liblol_a_SOURCES = \
    5     core.h matrix.h tiler.cpp tiler.h dict.cpp dict.h audio.cpp audio.h \
    6     scene.cpp scene.h font.cpp font.h layer.cpp layer.h map.cpp map.h \
    7     entity.cpp entity.h ticker.cpp ticker.h tileset.cpp tileset.h \
    8     forge.cpp forge.h video.cpp video.h timer.cpp timer.h bitfield.h \
    9     profiler.cpp profiler.h input.h input.cpp world.cpp world.h \
    10     sample.cpp sample.h sampler.cpp sampler.h text.cpp text.h \
    11     emitter.cpp emitter.h numeric.h worldentity.cpp worldentity.h \
     5    core.h matrix.cpp matrix.h tiler.cpp tiler.h dict.cpp dict.h \
     6    audio.cpp audio.h scene.cpp scene.h font.cpp font.h layer.cpp layer.h \
     7    map.cpp map.h entity.cpp entity.h ticker.cpp ticker.h \
     8    tileset.cpp tileset.h forge.cpp forge.h video.cpp video.h \
     9    timer.cpp timer.h bitfield.h profiler.cpp profiler.h input.h input.cpp \
     10    world.cpp world.h sample.cpp sample.h sampler.cpp sampler.h \
     11    text.cpp text.h emitter.cpp emitter.h numeric.h \
     12    worldentity.cpp worldentity.h \
    1213    \
    1314    sdlinput.cpp sdlinput.h \
  • trunk/src/matrix.h

    r643 r648  
    176176GLOBALS(4)
    177177
    178 template <typename T> struct Vec4x4
    179 {
    180     inline Vec4x4() { }
    181     inline Vec4x4(T val) { v[0] = v[1] = v[2] = v[3] = val; }
    182     inline Vec4x4(Vec4<T> v0, Vec4<T> v1, Vec4<T> v2, Vec4<T> v3)
     178template <typename T> struct Mat4
     179{
     180    inline Mat4() { }
     181    inline Mat4(T val) { for (int i = 0; i < 4; i++) v[i] = val; }
     182    inline Mat4(Vec4<T> v0, Vec4<T> v1, Vec4<T> v2, Vec4<T> v3)
    183183        { v[0] = v0; v[1] = v1; v[2] = v2; v[3] = v3; }
    184184
     
    186186    inline Vec4<T> const& operator[](int n) const { return v[n]; }
    187187
    188     inline Vec4x4<T> operator +(Vec4x4<T> const val) const
    189     {
    190         Vec4x4<T> ret;
     188    static inline Mat4<T> identity()
     189    {
     190        Mat4<T> ret;
     191        for (int j = 0; j < 4; j++)
     192            for (int i = 0; i < 4; i++)
     193                ret[i][j] = i == j;
     194        return ret;
     195    }
     196
     197    T det() const;
     198    Mat4<T> invert() const;
     199
     200    inline Mat4<T> operator +(Mat4<T> const val) const
     201    {
     202        Mat4<T> ret;
    191203        for (int j = 0; j < 4; j++)
    192204            for (int i = 0; i < 4; i++)
     
    195207    }
    196208
    197     inline Vec4x4<T> operator -(Vec4x4<T> const val) const
    198     {
    199         Vec4x4<T> ret;
     209    inline Mat4<T> operator -(Mat4<T> const val) const
     210    {
     211        Mat4<T> ret;
    200212        for (int j = 0; j < 4; j++)
    201213            for (int i = 0; i < 4; i++)
     
    204216    }
    205217
    206     inline Vec4x4<T> operator *(Vec4x4<T> const val) const
    207     {
    208         Vec4x4<T> ret;
     218    inline Mat4<T> operator *(Mat4<T> const val) const
     219    {
     220        Mat4<T> ret;
    209221        for (int j = 0; j < 4; j++)
    210222            for (int i = 0; i < 4; i++)
     
    234246};
    235247
    236 typedef Vec4x4<float> float4x4;
    237 typedef Vec4x4<int> int4x4;
     248typedef Mat4<float> float4x4;
     249typedef Mat4<int> int4x4;
    238250
    239251#endif // __DH_MATRIX_H__
  • trunk/test/matrix.cpp

    r642 r648  
    2323{
    2424    CPPUNIT_TEST_SUITE(MatrixTest);
     25    CPPUNIT_TEST(test_mat_det);
    2526    CPPUNIT_TEST(test_mat_mul);
     27    CPPUNIT_TEST(test_mat_inv);
    2628    CPPUNIT_TEST_SUITE_END();
    2729
     
    2931    MatrixTest() : CppUnit::TestCase("Matrix Test") {}
    3032
    31     void setUp() {}
     33    void setUp()
     34    {
     35        identity = float4x4::identity();
     36        triangular = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f),
     37                              float4(7.0f, 2.0f, 0.0f, 0.0f),
     38                              float4(1.0f, 5.0f, 3.0f, 0.0f),
     39                              float4(8.0f, 9.0f, 2.0f, 4.0f));
     40        invertible = float4x4(float4( 1.0f,  1.0f,  2.0f, -1.0f),
     41                              float4(-2.0f, -1.0f, -2.0f,  2.0f),
     42                              float4( 4.0f,  2.0f,  5.0f, -4.0f),
     43                              float4( 5.0f, -3.0f, -7.0f, -6.0f));
     44    }
    3245
    3346    void tearDown() {}
    3447
     48    void test_mat_det()
     49    {
     50        float d1 = triangular.det();
     51        CPPUNIT_ASSERT(d1 == 24.0f);
     52        float d2 = invertible.det();
     53        CPPUNIT_ASSERT(d2 == -1.0f);
     54    }
     55
    3556    void test_mat_mul()
    3657    {
    37         float4 v0(1.0f, 0.0f, 0.0f, 0.0f);
    38         float4 v1(0.0f, 1.0f, 0.0f, 0.0f);
    39         float4 v2(0.0f, 0.0f, 1.0f, 0.0f);
    40         float4 v3(0.0f, 0.0f, 0.0f, 1.0f);
    41         float4x4 m0(v0, v1, v2, v3);
    42         float4x4 m1(v0, v1, v2, v3);
     58        float4x4 m0 = identity;
     59        float4x4 m1 = identity;
    4360        float4x4 m2 = m0 * m1;
    4461
    4562        CPPUNIT_ASSERT(m2[0][0] == 1.0f);
     63        CPPUNIT_ASSERT(m2[1][0] == 0.0f);
     64        CPPUNIT_ASSERT(m2[2][0] == 0.0f);
     65        CPPUNIT_ASSERT(m2[3][0] == 0.0f);
     66
     67        CPPUNIT_ASSERT(m2[0][1] == 0.0f);
    4668        CPPUNIT_ASSERT(m2[1][1] == 1.0f);
     69        CPPUNIT_ASSERT(m2[2][1] == 0.0f);
     70        CPPUNIT_ASSERT(m2[3][1] == 0.0f);
     71
     72        CPPUNIT_ASSERT(m2[0][2] == 0.0f);
     73        CPPUNIT_ASSERT(m2[1][2] == 0.0f);
    4774        CPPUNIT_ASSERT(m2[2][2] == 1.0f);
     75        CPPUNIT_ASSERT(m2[3][2] == 0.0f);
     76
     77        CPPUNIT_ASSERT(m2[0][3] == 0.0f);
     78        CPPUNIT_ASSERT(m2[1][3] == 0.0f);
     79        CPPUNIT_ASSERT(m2[2][3] == 0.0f);
    4880        CPPUNIT_ASSERT(m2[3][3] == 1.0f);
    4981    }
     82
     83    void test_mat_inv()
     84    {
     85        float4x4 m0 = invertible;
     86        float4x4 m1 = m0.invert();
     87
     88        float4x4 m2 = m0 * m1;
     89
     90        CPPUNIT_ASSERT(m2[0][0] == 1.0f);
     91        CPPUNIT_ASSERT(m2[1][0] == 0.0f);
     92        CPPUNIT_ASSERT(m2[2][0] == 0.0f);
     93        CPPUNIT_ASSERT(m2[3][0] == 0.0f);
     94
     95        CPPUNIT_ASSERT(m2[0][1] == 0.0f);
     96        CPPUNIT_ASSERT(m2[1][1] == 1.0f);
     97        CPPUNIT_ASSERT(m2[2][1] == 0.0f);
     98        CPPUNIT_ASSERT(m2[3][1] == 0.0f);
     99
     100        CPPUNIT_ASSERT(m2[0][2] == 0.0f);
     101        CPPUNIT_ASSERT(m2[1][2] == 0.0f);
     102        CPPUNIT_ASSERT(m2[2][2] == 1.0f);
     103        CPPUNIT_ASSERT(m2[3][2] == 0.0f);
     104
     105        CPPUNIT_ASSERT(m2[0][3] == 0.0f);
     106        CPPUNIT_ASSERT(m2[1][3] == 0.0f);
     107        CPPUNIT_ASSERT(m2[2][3] == 0.0f);
     108        CPPUNIT_ASSERT(m2[3][3] == 1.0f);
     109    }
     110
     111private:
     112    float4x4 triangular, identity, invertible;
    50113};
    51114
  • trunk/win32/deushax.vcxproj

    r614 r648  
    6262    <ClCompile Include="..\src\layer.cpp" />
    6363    <ClCompile Include="..\src\map.cpp" />
     64    <ClCompile Include="..\src\matrix.cpp" />
    6465    <ClCompile Include="..\src\profiler.cpp" />
    6566    <ClCompile Include="..\src\sample.cpp" />
  • trunk/win32/deushax.vcxproj.filters

    r312 r648  
    137137      <Filter>lolengine</Filter>
    138138    </ClCompile>
     139    <ClCompile Include="..\src\matrix.cpp">
     140      <Filter>lolengine</Filter>
     141    </ClCompile>
    139142    <ClCompile Include="..\src\profiler.cpp">
    140143      <Filter>lolengine</Filter>
  • trunk/win32/editor.vcxproj

    r614 r648  
    6262    <ClCompile Include="..\src\layer.cpp" />
    6363    <ClCompile Include="..\src\map.cpp" />
     64    <ClCompile Include="..\src\matrix.cpp" />
    6465    <ClCompile Include="..\src\profiler.cpp" />
    6566    <ClCompile Include="..\src\sample.cpp" />
  • trunk/win32/editor.vcxproj.filters

    r327 r648  
    137137      <Filter>lolengine</Filter>
    138138    </ClCompile>
     139    <ClCompile Include="..\src\matrix.cpp">
     140      <Filter>lolengine</Filter>
     141    </ClCompile>
    139142    <ClCompile Include="..\src\profiler.cpp">
    140143      <Filter>lolengine</Filter>
  • trunk/win32/monsterz.vcxproj

    r614 r648  
    7171    <ClCompile Include="..\src\layer.cpp" />
    7272    <ClCompile Include="..\src\map.cpp" />
     73    <ClCompile Include="..\src\matrix.cpp" />
    7374    <ClCompile Include="..\src\profiler.cpp" />
    7475    <ClCompile Include="..\src\sample.cpp" />
  • trunk/win32/monsterz.vcxproj.filters

    r352 r648  
    142142      <Filter>lolengine</Filter>
    143143    </ClCompile>
     144    <ClCompile Include="..\src\matrix.cpp">
     145      <Filter>lolengine</Filter>
     146    </ClCompile>
    144147    <ClCompile Include="..\src\profiler.cpp">
    145148      <Filter>lolengine</Filter>
Note: See TracChangeset for help on using the changeset viewer.