| @@ -37,7 +37,7 @@ public: | |||
| { | |||
| m_size = size; | |||
| m_pixels = new u8vec4[size.x * size.y]; | |||
| m_angle = 0.0f; | |||
| m_time = 0.0f; | |||
| m_ready = false; | |||
| } | |||
| @@ -50,33 +50,50 @@ public: | |||
| { | |||
| WorldEntity::TickGame(deltams); | |||
| m_angle += deltams * 0.0005f; | |||
| m_time += deltams * 0.0005f; | |||
| f64cmplx center(0.001643721971153, 0.822467633298876); | |||
| //f64cmplx center(0.28693186889504513, 0.014286693904085048); | |||
| double radius = 8.0 * pow(2.0, -m_time); | |||
| double step = radius / (m_size.x > m_size.y ? m_size.x : m_size.y); | |||
| cmplx r0(cosf(m_angle), 0.8f * sinf(m_angle)); | |||
| for (int j = 0; j < m_size.y; j++) | |||
| for (int i = 0; i < m_size.x; i++) | |||
| { | |||
| float const maxlen = 32.0f; | |||
| double const maxlen = 32; | |||
| int const colors = 16; | |||
| int const maxiter = 30; | |||
| int const maxiter = 200; | |||
| f64cmplx delta(i - m_size.x / 2, j - m_size.y / 2); | |||
| cmplx x0(4.0f / m_size.x * i - 2.0f, 3.0f / m_size.y * j - 1.5f); | |||
| cmplx r = x0 * r0; | |||
| cmplx z; | |||
| f64cmplx z0 = center + step * delta; | |||
| f64cmplx r0 = z0; | |||
| //f64cmplx r0(0.28693186889504513, 0.014286693904085048); | |||
| //f64cmplx r0(-0.824,0.1711); | |||
| //f64cmplx r0(0.001643721971153, 0.822467633298876); | |||
| f64cmplx z; | |||
| int iter = maxiter; | |||
| for (z = r; iter && z.sqlen() < maxlen * maxlen; z = z * z + r) | |||
| for (z = z0; iter && z.sqlen() < maxlen * maxlen; z = z * z + r0) | |||
| --iter; | |||
| float f = iter % colors; | |||
| float n = z.len(); | |||
| f += logf(logf(n) / logf(maxlen)) / logf(2.0f); | |||
| double f = iter; | |||
| double n = z.sqlen(); | |||
| /* Approximate log2(x) with x-1 because x is in [1,2]. */ | |||
| f += (log(n) * 0.5f / log(maxlen)) - 1.0f; | |||
| if (iter) | |||
| { | |||
| uint8_t red = 255 - f * (255.0f / (colors + 1)); | |||
| uint8_t green = 255 - f * (255.0f / (colors + 1)); | |||
| uint8_t blue = (f * 512.0f / (colors + 1) > 255) | |||
| ? 511 - (f * 512.0f / (colors + 1)) : 255; | |||
| double r = fmod(f, (double)colors); | |||
| if (r > (double)colors / 2) r = (double)colors - r; | |||
| double g = fmod(f * 1.3 + 4.0f, (double)colors); | |||
| if (g > (double)colors / 2) g = (double)colors - g; | |||
| double b = fmod(f * 1.7 - 8.0f, (double)colors); | |||
| if (b > (double)colors / 2) b = (double)colors - b; | |||
| uint8_t red = 255 - r * (255.0f / (colors + 1)); | |||
| uint8_t green = 255 - g * (255.0f / (colors + 1)); | |||
| uint8_t blue = 255 - b * (255.0f / (colors + 1)); | |||
| m_pixels[j * m_size.x + i] = u8vec4(red, green, blue, 0); | |||
| } | |||
| else | |||
| @@ -92,12 +109,12 @@ public: | |||
| static float const vertices[] = | |||
| { | |||
| -1.0f, -1.0f, | |||
| 1.0f, -1.0f, | |||
| 1.0f, 1.0f, | |||
| 1.0f, 1.0f, | |||
| -1.0f, 1.0f, | |||
| -1.0f, -1.0f, | |||
| -1.0f, -1.0f, | |||
| 1.0f, -1.0f, | |||
| 1.0f, 1.0f, | |||
| }; | |||
| static float const texcoords[] = | |||
| @@ -231,7 +248,7 @@ private: | |||
| GLuint m_tco; | |||
| #endif | |||
| int m_vertexattrib, m_texattrib; | |||
| float m_angle; | |||
| float m_time; | |||
| bool m_ready; | |||
| }; | |||
| @@ -244,7 +261,7 @@ int main() | |||
| Application app("Tutorial 3: Fractal", ivec2(640, 480), 60.0f); | |||
| new DebugFps(5, 5); | |||
| new Fractal(ivec2(640, 480)); | |||
| new Fractal(ivec2(1280, 960)); | |||
| app.Run(); | |||