|
|
@@ -30,6 +30,17 @@ using namespace lol; |
|
|
|
# include <direct.h> |
|
|
|
#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 |
|
|
|
{ |
|
|
|
public: |
|
|
@@ -135,7 +146,7 @@ public: |
|
|
|
f64cmplx oldcenter = m_center; |
|
|
|
double oldradius = m_radius; |
|
|
|
#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); |
|
|
|
#else |
|
|
|
double zoom = pow(2.0, (buttons[0] ? -deltams : deltams) * 0.0025); |
|
|
@@ -177,12 +188,14 @@ public: |
|
|
|
|
|
|
|
if (m_dirty[m_frame]) |
|
|
|
{ |
|
|
|
double const maxsqlen = 1024; |
|
|
|
double const k1 = 1.0 / (1 << 10) / log2(maxsqlen); |
|
|
|
|
|
|
|
m_dirty[m_frame]--; |
|
|
|
|
|
|
|
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) |
|
|
|
{ |
|
|
|
double const maxsqlen = 1024; |
|
|
|
|
|
|
|
f64cmplx z0 = m_center + TexelToWorldOffset(ivec2(i, j)); |
|
|
|
f64cmplx r0 = z0; |
|
|
@@ -206,7 +219,7 @@ public: |
|
|
|
/* Approximate log(sqrt(n))/log(sqrt(maxsqlen)) */ |
|
|
|
union { double n; uint64_t x; } u = { n }; |
|
|
|
double k = (u.x >> 42) - (((1 << 10) - 1) << 10); |
|
|
|
k *= 1.0 / (1 << 10) / log2(maxsqlen); |
|
|
|
k *= k1; |
|
|
|
|
|
|
|
/* Approximate log2(k) in [1,2]. */ |
|
|
|
f += (- 0.344847817623168308695977510213252644185 * k |
|
|
@@ -253,8 +266,13 @@ public: |
|
|
|
* so that we can upload four different subimages each frame. */ |
|
|
|
glGenTextures(1, &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_MIN_FILTER, GL_NEAREST); |
|
|
|
|
|
|
@@ -411,7 +429,7 @@ public: |
|
|
|
|
|
|
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, m_frame * 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); |
|
|
|
} |
|
|
|
|
|
|
@@ -422,7 +440,7 @@ if (0) for (int i = 0; i < 4; i++) |
|
|
|
{ |
|
|
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, i * 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); |
|
|
|
} |
|
|
|
} |
|
|
|