Changeset 1056


Ignore:
Timestamp:
Nov 8, 2011, 1:40:28 AM (11 years ago)
Author:
sam
Message:

tutorial: properly implement continuous color in the Mandelbrot viewer.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/tutorial/tut03.cpp

    r1055 r1056  
    4545    {
    4646        delete m_pixels;
     47    }
     48
     49    virtual void TickGame(float deltams)
     50    {
     51        WorldEntity::TickGame(deltams);
     52
     53        m_angle += deltams * 0.0005f;
     54
     55        cmplx r0(cosf(m_angle), sinf(m_angle));
     56        for (int j = 0; j < m_size.y; j++)
     57        for (int i = 0; i < m_size.x; i++)
     58        {
     59            float const maxlen = 128.0f;
     60            int const maxiter = 20;
     61
     62            cmplx x0(4.0f / m_size.x * i - 2.5f, 3.0f / m_size.y * j - 1.5f);
     63            cmplx r = x0;
     64            cmplx z;
     65            int iter = maxiter;
     66            for (z = r; iter && z.sqlen() < maxlen * maxlen; z = z * z + r)
     67                --iter;
     68
     69            float f = iter;
     70            float n = z.len();
     71            f += logf(logf(n) / logf(maxlen)) / logf(2.0f);
     72
     73            if (iter)
     74            {
     75                uint8_t red = 255 - f * 11;
     76                uint8_t green = 255 - f * 11;
     77                uint8_t blue = (f * 23 > 255) ? 511 - f * 23 : 255;
     78                m_pixels[j * m_size.x + i] = u8vec4(red, green, blue, 0);
     79            }
     80            else
     81            {
     82                m_pixels[j * m_size.x + i] = u8vec4(0, 0, 0, 0);
     83            }
     84        }
    4785    }
    4886
     
    116154        }
    117155
    118         m_angle += deltams * 0.0001f;
    119 
    120         cmplx r0(cosf(m_angle), 0.5f * sinf(m_angle));
    121         for (int j = 0; j < m_size.y; j++)
    122         for (int i = 0; i < m_size.x; i++)
    123         {
    124             cmplx x0(4.0f / m_size.x * i - 2.5f, 3.0f / m_size.y * j - 1.5f);
    125             cmplx r = x0 * r0;
    126             cmplx z;
    127             int iter = 20;
    128             for (z = r; iter && z.sqlen() < 4.0f; z = z * z + r)
    129                 --iter;
    130 
    131             float f = iter;
    132             float n = z.sqlen();
    133             if (n > 36.0f)
    134                 f += 2.0f;
    135             if (n > 16.0f)
    136                 f += 1.0f + (n - 16.0f) / 20.0f;
    137             else if (n > 4.0f)
    138                 f += (n - 4.0f) / 12.0f;
    139 
    140             if (iter)
    141             {
    142                 uint8_t red = 255 - f * 11;
    143                 uint8_t green = 255 - f * 11;
    144                 uint8_t blue = (f * 23 > 255) ? 511 - f * 23 : 255;
    145                 //uint8_t blue = f * 36 < 255 ? f * 36 : 255;
    146                 m_pixels[j * m_size.x + i] = u8vec4(red, green, blue, 0);
    147             }
    148             else
    149             {
    150                 m_pixels[j * m_size.x + i] = u8vec4(0, 0, 0, 0);
    151             }
    152         }
    153 
    154156        glEnable(GL_TEXTURE_2D);
    155157        glBindTexture(GL_TEXTURE_2D, m_texid);
Note: See TracChangeset for help on using the changeset viewer.