Changeset 1921


Ignore:
Timestamp:
Sep 16, 2012, 6:48:19 PM (7 years ago)
Author:
sam
Message:

tutorial: flatten the fractal computation loop, and avoid the use of
new/delete when our arrays will do.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tutorial/11_fractal.cpp

    r1893 r1921  
    8181        m_oldmouse = ivec2(0, 0);
    8282
    83         m_pixels = new u8vec4[m_size.x * m_size.y];
    84         m_tmppixels = new u8vec4[m_size.x / 2 * m_size.y / 2];
     83        m_pixels.Resize(m_size.x * m_size.y);
    8584        m_frame = -1;
    8685        m_slices = 4;
     
    105104        m_drag = false;
    106105
    107         m_palette = new u8vec4[(MAX_ITERATIONS + 1) * PALETTE_STEP];
    108106        for (int i = 0; i < (MAX_ITERATIONS + 1) * PALETTE_STEP; i++)
    109107        {
     
    126124            uint8_t blue = b * 255.99f;
    127125#if defined __CELLOS_LV2__ || defined _XBOX
    128             m_palette[i] = u8vec4(255, red, green, blue);
     126            m_palette.Push(u8vec4(255, red, green, blue));
    129127#elif defined __native_client__
    130             m_palette[i] = u8vec4(red, green, blue, 255);
    131 #else
    132             m_palette[i] = u8vec4(blue, green, red, 255);
     128            m_palette.Push(u8vec4(red, green, blue, 255));
     129#else
     130            m_palette.Push(u8vec4(blue, green, red, 255));
    133131#endif
    134132        }
     
    175173        Ticker::Unref(m_zoomtext);
    176174#endif
    177         delete m_pixels;
    178         delete m_tmppixels;
    179         delete m_palette;
    180175    }
    181176
     
    362357        if (jmax > m_size.y)
    363358            jmax = m_size.y;
    364         u8vec4 *m_pixelstart = m_pixels
     359        u8vec4 *m_pixelstart = &m_pixels[0]
    365360                             + m_size.x * (m_size.y / 4 * m_frame + line / 4);
    366361
     
    370365        for (int i = m_frame % 2; i < m_size.x; i += 2)
    371366        {
     367            double xr, yr, x0, y0, x1, y1, x2, y2, x3, y3;
    372368            dcmplx z0 = c + TexelToWorldOffset(ivec2(i, j));
    373             dcmplx z1, z2, z3, r0 = z0;
    374369            //dcmplx r0(0.28693186889504513, 0.014286693904085048);
    375370            //dcmplx r0(0.001643721971153, 0.822467633298876);
     
    377372            //dcmplx r0(-0.79192956889854, -0.14632423080102);
    378373            //dcmplx r0(0.3245046418497685, 0.04855101129280834);
     374            dcmplx r0 = z0;
     375
     376            x0 = z0.x; y0 = z0.y;
     377            xr = r0.x; yr = r0.y;
     378
    379379            int iter = MAX_ITERATIONS - 4;
    380380            for (;;)
     
    382382                /* Unroll the loop: tests are more expensive to do at each
    383383                 * iteration than the few extra multiplications. */
    384                 z1 = z0 * z0 + r0;
    385                 z2 = z1 * z1 + r0;
    386                 z3 = z2 * z2 + r0;
    387                 z0 = z3 * z3 + r0;
    388                 if (sqlength(z0) >= maxsqlen)
     384                x1 = x0 * x0 - y0 * y0 + xr;
     385                y1 = x0 * y0 + x0 * y0 + yr;
     386                x2 = x1 * x1 - y1 * y1 + xr;
     387                y2 = x1 * y1 + x1 * y1 + yr;
     388                x3 = x2 * x2 - y2 * y2 + xr;
     389                y3 = x2 * y2 + x2 * y2 + yr;
     390                x0 = x3 * x3 - y3 * y3 + xr;
     391                y0 = x3 * y3 + x3 * y3 + yr;
     392
     393                if (x0 * x0 + y0 * y0 >= maxsqlen)
    389394                    break;
    390395                iter -= 4;
     
    395400            if (iter)
    396401            {
    397                 double n = sqlength(z0);
    398 
    399                 if (sqlength(z1) >= maxsqlen) { iter += 3; n = sqlength(z1); }
    400                 else if (sqlength(z2) >= maxsqlen) { iter += 2; n = sqlength(z2); }
    401                 else if (sqlength(z3) >= maxsqlen) { iter += 1; n = sqlength(z3); }
     402                double n = x0 * x0 + y0 * y0;
     403
     404                if (x1 * x1 + y1 * y1 >= maxsqlen)
     405                {
     406                    iter += 3; n = x1 * x1 + y1 * y1;
     407                }
     408                else if (x2 * x2 + y2 * y2 >= maxsqlen)
     409                {
     410                    iter += 2; n = x2 * x2 + y2 * y2;
     411                }
     412                else if (x3 * x3 + y3 * y3 >= maxsqlen)
     413                {
     414                    iter += 1; n = x3 * x3 + y3 * y3;
     415                }
    402416
    403417                if (n > maxsqlen * maxsqlen)
     
    461475            glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT,
    462476                         m_size.x / 2, m_size.y * 2, 0,
    463                          TEXTURE_FORMAT, TEXTURE_TYPE, m_pixels);
     477                         TEXTURE_FORMAT, TEXTURE_TYPE, &m_pixels[0]);
    464478#   if defined __CELLOS_LV2__
    465479            /* We need this hint because by default the storage type is
     
    543557            glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT,
    544558                         m_size.x / 2, m_size.y * 2, 0,
    545                          TEXTURE_FORMAT, TEXTURE_TYPE, m_pixels);
     559                         TEXTURE_FORMAT, TEXTURE_TYPE, &m_pixels[0]);
    546560#else
    547561            glTexSubImage2D(GL_TEXTURE_2D, 0, 0, m_frame * m_size.y / 2,
    548562                            m_size.x / 2, m_size.y / 2,
    549563                            TEXTURE_FORMAT, TEXTURE_TYPE,
    550                             m_pixels + m_size.x * m_size.y / 4 * m_frame);
     564                            &m_pixels[m_size.x * m_size.y / 4 * m_frame]);
    551565#endif
    552566        }
     
    578592    double m_window2world;
    579593    dvec2 m_texel2world;
    580     u8vec4 *m_pixels, *m_tmppixels, *m_palette;
     594    Array<u8vec4> m_pixels, m_palette;
    581595
    582596    Shader *m_shader;
     
    615629int main(int argc, char **argv)
    616630{
    617     Application app("Tutorial 3: Fractal", ivec2(640, 480), 60.0f);
     631    ivec2 window_size(640, 480);
     632
     633    Application app("Tutorial 3: Fractal", window_size, 60.0f);
    618634
    619635#if defined _MSC_VER && !defined _XBOX
     
    624640
    625641    new DebugFps(5, 5);
    626     new Fractal(ivec2(640, 480));
     642    new Fractal(window_size);
    627643    //new DebugRecord("fractalol.ogm", 60.0f);
    628644
Note: See TracChangeset for help on using the changeset viewer.