@@ -24,11 +24,11 @@ class Triangle : public WorldEntity | |||||
{ | { | ||||
public: | public: | ||||
Triangle() | Triangle() | ||||
: m_vertices({ vec2( 0.0, 0.8), | |||||
vec2(-0.8, -0.8), | |||||
vec2( 0.8, -0.8) }), | |||||
m_ready(false) | |||||
{ | { | ||||
m_vertices << vec2( 0.0, 0.8); | |||||
m_vertices << vec2(-0.8, -0.8); | |||||
m_vertices << vec2( 0.8, -0.8); | |||||
m_ready = false; | |||||
} | } | ||||
virtual void TickDraw(float seconds, Scene &scene) | virtual void TickDraw(float seconds, Scene &scene) | ||||
@@ -24,32 +24,25 @@ class Cube : public WorldEntity | |||||
{ | { | ||||
public: | public: | ||||
Cube() | Cube() | ||||
: m_angle(0), | |||||
m_mesh({ /* Front vertices/colors */ | |||||
{ vec3(-1.0, -1.0, 1.0), vec3(1.0, 0.0, 1.0) }, | |||||
{ vec3( 1.0, -1.0, 1.0), vec3(0.0, 1.0, 0.0) }, | |||||
{ vec3( 1.0, 1.0, 1.0), vec3(1.0, 0.5, 0.0) }, | |||||
{ vec3(-1.0, 1.0, 1.0), vec3(1.0, 1.0, 0.0) }, | |||||
/* Back */ | |||||
{ vec3(-1.0, -1.0, -1.0), vec3(1.0, 0.0, 0.0) }, | |||||
{ vec3( 1.0, -1.0, -1.0), vec3(0.0, 0.5, 0.0) }, | |||||
{ vec3( 1.0, 1.0, -1.0), vec3(0.0, 0.5, 1.0) }, | |||||
{ vec3(-1.0, 1.0, -1.0), vec3(0.0, 0.0, 1.0) } }), | |||||
m_lines_indices({ 0, 1, 1, 2, 2, 3, 3, 0, | |||||
4, 5, 5, 6, 6, 7, 7, 4, | |||||
0, 4, 1, 5, 2, 6, 3, 7, }), | |||||
m_faces_indices({ 0, 1, 2, 2, 3, 0, 1, 5, 6, 6, 2, 1, | |||||
7, 6, 5, 5, 4, 7, 4, 0, 3, 3, 7, 4, | |||||
4, 5, 1, 1, 0, 4, 3, 2, 6, 6, 7, 3, }), | |||||
m_ready(false) | |||||
{ | { | ||||
m_angle = 0; | |||||
/* Front vertices/colors */ | |||||
m_mesh.Push(vec3(-1.0, -1.0, 1.0), vec3(1.0, 0.0, 1.0)); | |||||
m_mesh.Push(vec3( 1.0, -1.0, 1.0), vec3(0.0, 1.0, 0.0)); | |||||
m_mesh.Push(vec3( 1.0, 1.0, 1.0), vec3(1.0, 0.5, 0.0)); | |||||
m_mesh.Push(vec3(-1.0, 1.0, 1.0), vec3(1.0, 1.0, 0.0)); | |||||
/* Back */ | |||||
m_mesh.Push(vec3(-1.0, -1.0, -1.0), vec3(1.0, 0.0, 0.0)); | |||||
m_mesh.Push(vec3( 1.0, -1.0, -1.0), vec3(0.0, 0.5, 0.0)); | |||||
m_mesh.Push(vec3( 1.0, 1.0, -1.0), vec3(0.0, 0.5, 1.0)); | |||||
m_mesh.Push(vec3(-1.0, 1.0, -1.0), vec3(0.0, 0.0, 1.0)); | |||||
m_faces_indices << 0 << 1 << 2 << 2 << 3 << 0; | |||||
m_faces_indices << 1 << 5 << 6 << 6 << 2 << 1; | |||||
m_faces_indices << 7 << 6 << 5 << 5 << 4 << 7; | |||||
m_faces_indices << 4 << 0 << 3 << 3 << 7 << 4; | |||||
m_faces_indices << 4 << 5 << 1 << 1 << 0 << 4; | |||||
m_faces_indices << 3 << 2 << 6 << 6 << 7 << 3; | |||||
m_lines_indices << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 0; | |||||
m_lines_indices << 4 << 5 << 5 << 6 << 6 << 7 << 7 << 4; | |||||
m_lines_indices << 0 << 4 << 1 << 5 << 2 << 6 << 3 << 7; | |||||
m_ready = false; | |||||
} | } | ||||
virtual void TickGame(float seconds) | virtual void TickGame(float seconds) | ||||
@@ -23,17 +23,16 @@ LOLFX_RESOURCE_DECLARE(03_noise); | |||||
class NoiseDemo : public WorldEntity | class NoiseDemo : public WorldEntity | ||||
{ | { | ||||
public: | public: | ||||
NoiseDemo() : | |||||
NoiseDemo() | |||||
: m_vertices({ vec2(-1.0, 1.0), | |||||
vec2(-1.0, -1.0), | |||||
vec2( 1.0, -1.0), | |||||
vec2(-1.0, 1.0), | |||||
vec2( 1.0, -1.0), | |||||
vec2( 1.0, 1.0), }), | |||||
m_time(0.0), | m_time(0.0), | ||||
m_ready(false) | m_ready(false) | ||||
{ | { | ||||
m_vertices << vec2(-1.0, 1.0); | |||||
m_vertices << vec2(-1.0, -1.0); | |||||
m_vertices << vec2( 1.0, -1.0); | |||||
m_vertices << vec2(-1.0, 1.0); | |||||
m_vertices << vec2( 1.0, -1.0); | |||||
m_vertices << vec2( 1.0, 1.0); | |||||
m_ready = false; | |||||
} | } | ||||
virtual void TickDraw(float seconds, Scene &scene) | virtual void TickDraw(float seconds, Scene &scene) | ||||
@@ -25,23 +25,17 @@ LOLFX_RESOURCE_DECLARE(04_texture); | |||||
class TextureDemo : public WorldEntity | class TextureDemo : public WorldEntity | ||||
{ | { | ||||
public: | public: | ||||
TextureDemo() : | |||||
TextureDemo() | |||||
: m_vertices({ vec2(-1.0, 1.0), | |||||
vec2(-1.0, -1.0), | |||||
vec2( 1.0, -1.0), | |||||
vec2(-1.0, 1.0), | |||||
vec2( 1.0, -1.0), | |||||
vec2( 1.0, 1.0), }), | |||||
m_frames(0), | m_frames(0), | ||||
m_ready(false) | m_ready(false) | ||||
{ | { | ||||
m_vertices << vec2(-1.0, 1.0); | |||||
m_vertices << vec2(-1.0, -1.0); | |||||
m_vertices << vec2( 1.0, -1.0); | |||||
m_vertices << vec2(-1.0, 1.0); | |||||
m_vertices << vec2( 1.0, -1.0); | |||||
m_vertices << vec2( 1.0, 1.0); | |||||
m_heightmap = new uint8_t[TEXTURE_WIDTH * 1]; | |||||
} | |||||
virtual ~TextureDemo() | |||||
{ | |||||
delete m_heightmap; | |||||
m_heightmap.Resize(TEXTURE_WIDTH * 1); | |||||
} | } | ||||
virtual void TickGame(float seconds) | virtual void TickGame(float seconds) | ||||
@@ -50,16 +44,16 @@ public: | |||||
/* Generate a new heightmap at the beginning */ | /* Generate a new heightmap at the beginning */ | ||||
if (m_frames == 0) | if (m_frames == 0) | ||||
memset(m_heightmap, 255, TEXTURE_WIDTH); | |||||
memset(m_heightmap.Data(), 255, m_heightmap.Bytes()); | |||||
/* Scroll left */ | /* Scroll left */ | ||||
for (int i = 0; i < TEXTURE_WIDTH - 1; i++) | |||||
for (int i = 0; i < m_heightmap.Count() - 1; i++) | |||||
m_heightmap[i] = m_heightmap[i + 1]; | m_heightmap[i] = m_heightmap[i + 1]; | ||||
int height = m_heightmap[TEXTURE_WIDTH - 1]; | |||||
int height = m_heightmap.Last(); | |||||
height = (height + 127 + 40 * lol::sin(m_frames * 0.03) + rand() % 97 - 38) / 2; | height = (height + 127 + 40 * lol::sin(m_frames * 0.03) + rand() % 97 - 38) / 2; | ||||
height = std::max(15, std::min(height, 240)); | height = std::max(15, std::min(height, 240)); | ||||
m_heightmap[TEXTURE_WIDTH - 1] = height; | |||||
m_heightmap.Last() = height; | |||||
/* Update frame counter */ | /* Update frame counter */ | ||||
++m_frames; | ++m_frames; | ||||
@@ -91,7 +85,7 @@ public: | |||||
} | } | ||||
/* Send new heightmap to GPU */ | /* Send new heightmap to GPU */ | ||||
m_texture->SetData(m_heightmap); | |||||
m_texture->SetData(m_heightmap.Data()); | |||||
m_shader->Bind(); | m_shader->Bind(); | ||||
m_shader->SetUniform(m_texture_uni, m_texture->GetTextureUniform(), 0); | m_shader->SetUniform(m_texture_uni, m_texture->GetTextureUniform(), 0); | ||||
@@ -109,7 +103,7 @@ private: | |||||
ShaderUniform m_texture_uni; | ShaderUniform m_texture_uni; | ||||
VertexDeclaration *m_vdecl; | VertexDeclaration *m_vdecl; | ||||
VertexBuffer *m_vbo; | VertexBuffer *m_vbo; | ||||
uint8_t *m_heightmap; | |||||
Array<uint8_t> m_heightmap; | |||||
int m_frames; | int m_frames; | ||||
bool m_ready; | bool m_ready; | ||||
}; | }; | ||||
@@ -57,8 +57,8 @@ array2d<float> Image::HalftoneKernel(ivec2 size) | |||||
for (int y = 0; y < size.y; y++) | for (int y = 0; y < size.y; y++) | ||||
for (int x = 0; x < size.x; x++) | for (int x = 0; x < size.x; x++) | ||||
{ | { | ||||
float dx = 2.f * x / size.x - 0.5f; | |||||
float dy = 2.f * (y + 0.07f) / size.y - 0.5f; | |||||
float dx = 2.f * (x + 0.02f) / size.x - 0.5f; | |||||
float dy = 2.f * (y + 0.03f) / size.y - 0.5f; | |||||
bool flip = false; | bool flip = false; | ||||
if (dx > 0.5f) | if (dx > 0.5f) | ||||
{ | { | ||||
@@ -207,7 +207,7 @@ array2d<float> Image::NormalizeKernel(array2d<float> const &kernel) | |||||
{ | { | ||||
int x = tmp[n].x; | int x = tmp[n].x; | ||||
int y = tmp[n].y; | int y = tmp[n].y; | ||||
dst[x][y] = (float)(n + 1) * epsilon; | |||||
dst[x][y] = (n + 1.f) * epsilon; | |||||
} | } | ||||
return dst; | return dst; | ||||
@@ -215,138 +215,58 @@ array2d<float> Image::NormalizeKernel(array2d<float> const &kernel) | |||||
array2d<float> Image::EdiffKernel(EdiffAlgorithm algorithm) | array2d<float> Image::EdiffKernel(EdiffAlgorithm algorithm) | ||||
{ | { | ||||
array2d<float> ret; | |||||
switch(algorithm) | |||||
switch (algorithm) | |||||
{ | { | ||||
case EdiffAlgorithm::FloydSteinberg: | case EdiffAlgorithm::FloydSteinberg: | ||||
ret.SetSize(ivec2(3, 2)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 1., 7./16, | |||||
3./16, 5./16, 1./16, | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 1.f, 7.f/16, }, | |||||
{ 3.f/16, 5.f/16, 1.f/16, }, }; | |||||
case EdiffAlgorithm::JaJuNi: | case EdiffAlgorithm::JaJuNi: | ||||
ret.SetSize(ivec2(5, 3)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 0., 1., 7./48, 5./48, | |||||
3./48, 5./48, 7./48, 5./48, 3./48, | |||||
1./48, 3./48, 5./48, 3./48, 1./48, | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 0.f, 1.f, 7.f/48, 5.f/48, }, | |||||
{ 3.f/48, 5.f/48, 7.f/48, 5.f/48, 3.f/48, }, | |||||
{ 1.f/48, 3.f/48, 5.f/48, 3.f/48, 1.f/48, }, }; | |||||
case EdiffAlgorithm::Atkinson: | case EdiffAlgorithm::Atkinson: | ||||
ret.SetSize(ivec2(4, 3)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 1., 1./8, 1./8, | |||||
1./8, 1./8, 1./8, 0., | |||||
0., 1./8, 0., 0., | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 1.f, 1.f/8, 1.f/8, }, | |||||
{ 1.f/8, 1.f/8, 1.f/8, 0.f, }, | |||||
{ 0.f, 1.f/8, 0.f, 0.f, }, }; | |||||
case EdiffAlgorithm::Fan: | case EdiffAlgorithm::Fan: | ||||
ret.SetSize(ivec2(4, 2)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 0., 1., 7./16, | |||||
1./16, 3./16, 5./16, 0., | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 0.f, 1.f, 7.f/16, }, | |||||
{ 1.f/16, 3.f/16, 5.f/16, 0.f, }, }; | |||||
case EdiffAlgorithm::ShiauFan: | case EdiffAlgorithm::ShiauFan: | ||||
ret.SetSize(ivec2(4, 2)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 0., 1., 1./2, | |||||
1./8, 1./8, 1./4, 0., | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 0.f, 1.f, 1.f/2, }, | |||||
{ 1.f/8, 1.f/8, 1.f/4, 0.f, }, }; | |||||
case EdiffAlgorithm::ShiauFan2: | case EdiffAlgorithm::ShiauFan2: | ||||
ret.SetSize(ivec2(5, 2)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 0., 0., 1., 1./2, | |||||
1./16, 1./16, 1./8, 1./4, 0., | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 0.f, 0.f, 1.f, 1.f/2, }, | |||||
{ 1.f/16, 1.f/16, 1.f/8, 1.f/4, 0.f, }, }; | |||||
case EdiffAlgorithm::Stucki: | case EdiffAlgorithm::Stucki: | ||||
ret.SetSize(ivec2(5, 3)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 0., 1., 8./42, 4./42, | |||||
2./42, 4./42, 8./42, 4./42, 2./42, | |||||
1./42, 2./42, 4./42, 2./42, 1./42, | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 0.f, 1.f, 8.f/42, 4.f/42, }, | |||||
{ 2.f/42, 4.f/42, 8.f/42, 4.f/42, 2.f/42, }, | |||||
{ 1.f/42, 2.f/42, 4.f/42, 2.f/42, 1.f/42, }, }; | |||||
case EdiffAlgorithm::Burkes: | case EdiffAlgorithm::Burkes: | ||||
ret.SetSize(ivec2(5, 2)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 0., 1., 4./16, 2./16, | |||||
1./16, 2./16, 4./16, 2./16, 1./16, | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 0.f, 1.f, 4.f/16, 2.f/16, }, | |||||
{ 1.f/16, 2.f/16, 4.f/16, 2.f/16, 1.f/16, }, }; | |||||
case EdiffAlgorithm::Sierra: | case EdiffAlgorithm::Sierra: | ||||
ret.SetSize(ivec2(5, 3)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 0., 1., 5./32, 3./32, | |||||
2./32, 4./32, 5./32, 4./32, 2./32, | |||||
0., 2./32, 3./32, 2./32, 0., | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 0.f, 1.f, 5.f/32, 3.f/32, }, | |||||
{ 2.f/32, 4.f/32, 5.f/32, 4.f/32, 2.f/32, }, | |||||
{ 0.f, 2.f/32, 3.f/32, 2.f/32, 0.f, }, }; | |||||
case EdiffAlgorithm::Sierra2: | case EdiffAlgorithm::Sierra2: | ||||
ret.SetSize(ivec2(5, 2)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 0., 1., 4./16, 3./16, | |||||
1./16, 2./16, 3./16, 2./16, 1./16, | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 0.f, 1.f, 4.f/16, 3.f/16, }, | |||||
{ 1.f/16, 2.f/16, 3.f/16, 2.f/16, 1.f/16, }, }; | |||||
case EdiffAlgorithm::Lite: | case EdiffAlgorithm::Lite: | ||||
ret.SetSize(ivec2(3, 2)); | |||||
{ | |||||
static float const myker[] = | |||||
{ | |||||
0., 1., 1./2, | |||||
1./4, 1./4, 0., | |||||
}; | |||||
memcpy(&ret[0][0], myker, sizeof(myker)); | |||||
} | |||||
return ret; | |||||
return { { 0.f, 1.f, 1.f/2, }, | |||||
{ 1.f/4, 1.f/4, 0.f, }, }; | |||||
} | } | ||||
return ret; | |||||
return { { 1.f } }; | |||||
} | } | ||||
/* Any standard deviation below this value will be rounded up, in order | /* Any standard deviation below this value will be rounded up, in order | ||||