| @@ -30,6 +30,17 @@ using namespace lol; | |||||
| # include <direct.h> | # include <direct.h> | ||||
| #endif | #endif | ||||
| #ifdef __CELLOS_LV2__ | |||||
| static GLint const INTERNAL_FORMAT = GL_ARGB_SCE; | |||||
| static GLenum const TEXTURE_FORMAT = GL_BGRA; | |||||
| static GLenum const TEXTURE_TYPE = GL_UNSIGNED_INT_8_8_8_8_REV; | |||||
| #else | |||||
| /* Seems efficient for little endian textures */ | |||||
| static GLint const INTERNAL_FORMAT = GL_RGBA; | |||||
| static GLenum const TEXTURE_FORMAT = GL_BGRA; | |||||
| static GLenum const TEXTURE_TYPE = GL_UNSIGNED_INT_8_8_8_8_REV; | |||||
| #endif | |||||
| class Fractal : public WorldEntity | class Fractal : public WorldEntity | ||||
| { | { | ||||
| public: | public: | ||||
| @@ -135,7 +146,7 @@ public: | |||||
| f64cmplx oldcenter = m_center; | f64cmplx oldcenter = m_center; | ||||
| double oldradius = m_radius; | double oldradius = m_radius; | ||||
| #ifdef __CELLOS_LV2__ | #ifdef __CELLOS_LV2__ | ||||
| m_radius *= pow(2.0, -deltams * 0.0005); | |||||
| m_radius *= pow(2.0, -deltams * 0.00005); | |||||
| m_center = f64cmplx(0.001643721971153, 0.822467633298876); | m_center = f64cmplx(0.001643721971153, 0.822467633298876); | ||||
| #else | #else | ||||
| double zoom = pow(2.0, (buttons[0] ? -deltams : deltams) * 0.0025); | double zoom = pow(2.0, (buttons[0] ? -deltams : deltams) * 0.0025); | ||||
| @@ -177,12 +188,14 @@ public: | |||||
| if (m_dirty[m_frame]) | if (m_dirty[m_frame]) | ||||
| { | { | ||||
| double const maxsqlen = 1024; | |||||
| double const k1 = 1.0 / (1 << 10) / log2(maxsqlen); | |||||
| m_dirty[m_frame]--; | m_dirty[m_frame]--; | ||||
| for (int j = ((m_frame + 1) % 4) / 2; j < m_size.y; j += 2) | for (int j = ((m_frame + 1) % 4) / 2; j < m_size.y; j += 2) | ||||
| for (int i = m_frame % 2; i < m_size.x; i += 2) | for (int i = m_frame % 2; i < m_size.x; i += 2) | ||||
| { | { | ||||
| double const maxsqlen = 1024; | |||||
| f64cmplx z0 = m_center + TexelToWorldOffset(ivec2(i, j)); | f64cmplx z0 = m_center + TexelToWorldOffset(ivec2(i, j)); | ||||
| f64cmplx r0 = z0; | f64cmplx r0 = z0; | ||||
| @@ -206,7 +219,7 @@ public: | |||||
| /* Approximate log(sqrt(n))/log(sqrt(maxsqlen)) */ | /* Approximate log(sqrt(n))/log(sqrt(maxsqlen)) */ | ||||
| union { double n; uint64_t x; } u = { n }; | union { double n; uint64_t x; } u = { n }; | ||||
| double k = (u.x >> 42) - (((1 << 10) - 1) << 10); | double k = (u.x >> 42) - (((1 << 10) - 1) << 10); | ||||
| k *= 1.0 / (1 << 10) / log2(maxsqlen); | |||||
| k *= k1; | |||||
| /* Approximate log2(k) in [1,2]. */ | /* Approximate log2(k) in [1,2]. */ | ||||
| f += (- 0.344847817623168308695977510213252644185 * k | f += (- 0.344847817623168308695977510213252644185 * k | ||||
| @@ -253,8 +266,13 @@ public: | |||||
| * so that we can upload four different subimages each frame. */ | * so that we can upload four different subimages each frame. */ | ||||
| glGenTextures(1, &m_texid); | glGenTextures(1, &m_texid); | ||||
| glBindTexture(GL_TEXTURE_2D, m_texid); | glBindTexture(GL_TEXTURE_2D, m_texid); | ||||
| glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_size.x / 2, m_size.y * 2, | |||||
| 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, m_pixels); | |||||
| glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, | |||||
| m_size.x / 2, m_size.y * 2, 0, | |||||
| TEXTURE_FORMAT, TEXTURE_TYPE, m_pixels); | |||||
| #if !defined __CELLOS_LV2__ | |||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_ALLOCATION_HINT_SCE, | |||||
| GL_TEXTURE_TILED_GPU_SCE); | |||||
| #endif | |||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | ||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | ||||
| @@ -411,7 +429,7 @@ public: | |||||
| glTexSubImage2D(GL_TEXTURE_2D, 0, 0, m_frame * m_size.y / 2, | glTexSubImage2D(GL_TEXTURE_2D, 0, 0, m_frame * m_size.y / 2, | ||||
| m_size.x / 2, m_size.y / 2, | m_size.x / 2, m_size.y / 2, | ||||
| GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, | |||||
| TEXTURE_FORMAT, TEXTURE_TYPE, | |||||
| m_pixels + m_size.x * m_size.y / 4 * m_frame); | m_pixels + m_size.x * m_size.y / 4 * m_frame); | ||||
| } | } | ||||
| @@ -422,7 +440,7 @@ if (0) for (int i = 0; i < 4; i++) | |||||
| { | { | ||||
| glTexSubImage2D(GL_TEXTURE_2D, 0, 0, i * m_size.y / 2, | glTexSubImage2D(GL_TEXTURE_2D, 0, 0, i * m_size.y / 2, | ||||
| m_size.x / 2, m_size.y / 2, | m_size.x / 2, m_size.y / 2, | ||||
| GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, | |||||
| TEXTURE_FORMAT, TEXTURE_TYPE, | |||||
| m_pixels + m_size.x * m_size.y / 4 * m_frame); | m_pixels + m_size.x * m_size.y / 4 * m_frame); | ||||
| } | } | ||||
| } | } | ||||