| @@ -56,11 +56,14 @@ deushax/deushax | |||||
| deushax/editor | deushax/editor | ||||
| monsterz/monsterz | monsterz/monsterz | ||||
| test/testsuite | test/testsuite | ||||
| test/tutorial/tut01 | |||||
| test/tutorial/tut02 | |||||
| test/benchsuite | test/benchsuite | ||||
| test/quad | test/quad | ||||
| test/sandbox | test/sandbox | ||||
| test/math/pi | test/math/pi | ||||
| test/math/poly | test/math/poly | ||||
| test/math/remez | test/math/remez | ||||
| test/xolotl/xolotl | |||||
| tools/make-font | tools/make-font | ||||
| # Our data | # Our data | ||||
| @@ -327,6 +327,8 @@ AC_CONFIG_FILES( | |||||
| src/Makefile | src/Makefile | ||||
| test/Makefile | test/Makefile | ||||
| test/math/Makefile | test/math/Makefile | ||||
| test/tutorial/Makefile | |||||
| test/xolotl/Makefile | |||||
| gfx/Makefile | gfx/Makefile | ||||
| gfx/font/Makefile | gfx/font/Makefile | ||||
| tools/Makefile | tools/Makefile | ||||
| @@ -1,5 +1,5 @@ | |||||
| SUBDIRS = math | |||||
| SUBDIRS = math tutorial xolotl | |||||
| AM_CPPFLAGS = -I$(top_srcdir)/src | AM_CPPFLAGS = -I$(top_srcdir)/src | ||||
| @@ -0,0 +1,23 @@ | |||||
| AM_CPPFLAGS = -I$(top_srcdir)/src | |||||
| all-local: $(noinst_PROGRAMS) | |||||
| test x$(MAKE_FSELF) = xno || make_fself tut01$(EXEEXT) tut01.self | |||||
| test x$(MAKE_FSELF) = xno || make_fself tut02$(EXEEXT) tut01.self | |||||
| CLEANFILES = $(noinst_PROGRAMS:%$(EXEEXT)=%.self) \ | |||||
| $(noinst_PROGRAMS:%$(EXEEXT)=%.elf) \ | |||||
| $(noinst_PROGRAMS:%$(EXEEXT)=%.exe) | |||||
| noinst_PROGRAMS = tut01 tut02 | |||||
| tut01_SOURCES = tut01.cpp | |||||
| tut01_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ | |||||
| tut01_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ | |||||
| tut01_DEPENDENCIES = $(top_builddir)/src/liblol.a | |||||
| tut02_SOURCES = tut02.cpp | |||||
| tut02_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ | |||||
| tut02_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ | |||||
| tut02_DEPENDENCIES = $(top_builddir)/src/liblol.a | |||||
| @@ -0,0 +1,124 @@ | |||||
| // | |||||
| // Lol Engine - Triangle tutorial | |||||
| // | |||||
| // Copyright: (c) 2011 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||||
| // | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include "core.h" | |||||
| #include "lolgl.h" | |||||
| #include "loldebug.h" | |||||
| using namespace std; | |||||
| using namespace lol; | |||||
| #if USE_SDL && defined __APPLE__ | |||||
| # include <SDL_main.h> | |||||
| #endif | |||||
| #if defined _WIN32 | |||||
| # undef main /* FIXME: still needed? */ | |||||
| #endif | |||||
| class Triangle : public WorldEntity | |||||
| { | |||||
| public: | |||||
| Triangle() | |||||
| { | |||||
| m_vertices[0] = vec2( 0.0, 0.8); | |||||
| m_vertices[1] = vec2(-0.8, -0.8); | |||||
| m_vertices[2] = vec2( 0.8, -0.8); | |||||
| } | |||||
| virtual void TickDraw(float deltams) | |||||
| { | |||||
| WorldEntity::TickDraw(deltams); | |||||
| if (!m_ready) | |||||
| { | |||||
| m_shader = Shader::Create( | |||||
| "#version 120\n" | |||||
| "attribute vec2 coord2d;" | |||||
| "void main(void) {" | |||||
| " gl_Position = vec4(coord2d, 0.0, 1.0);" | |||||
| "}", | |||||
| "#version 120\n" | |||||
| "void main(void) {" | |||||
| " gl_FragColor[0] = 0.0;" | |||||
| " gl_FragColor[1] = 0.0;" | |||||
| " gl_FragColor[2] = 1.0;" | |||||
| "}"); | |||||
| m_attrib = m_shader->GetAttribLocation("coord2d"); | |||||
| m_ready = true; | |||||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| /* Method 1: store vertex buffer on the GPU memory */ | |||||
| glGenBuffers(1, &m_vbo); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertices), m_vertices, | |||||
| GL_STATIC_DRAW); | |||||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| /* Method 2: upload vertex information at each frame */ | |||||
| #else | |||||
| #endif | |||||
| /* FIXME: this object never cleans up */ | |||||
| } | |||||
| m_shader->Bind(); | |||||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||||
| glEnableVertexAttribArray(m_attrib); | |||||
| glVertexAttribPointer(m_attrib, 2, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| /* Never used for now */ | |||||
| glEnableVertexAttribArray(m_attrib); | |||||
| glVertexAttribPointer(m_attrib, 2, GL_FLOAT, GL_FALSE, 0, m_vertices); | |||||
| #else | |||||
| glEnableClientState(GL_VERTEX_ARRAY); | |||||
| glVertexPointer(3, GL_FLOAT, 0, m_vertices); | |||||
| #endif | |||||
| glDrawArrays(GL_TRIANGLES, 0, 3); | |||||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| glDisableVertexAttribArray(m_attrib); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, 0); | |||||
| #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| /* Never used for now */ | |||||
| glDisableVertexAttribArray(m_attrib); | |||||
| #else | |||||
| glDisableClientState(GL_VERTEX_ARRAY); | |||||
| #endif | |||||
| } | |||||
| private: | |||||
| vec2 m_vertices[3]; | |||||
| Shader *m_shader; | |||||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| GLuint m_vbo; | |||||
| #endif | |||||
| int m_attrib; | |||||
| bool m_ready; | |||||
| }; | |||||
| int main() | |||||
| { | |||||
| Application app("Tutorial 1: Triangle", ivec2(640, 480), 60.0f); | |||||
| new DebugFps(5, 5); | |||||
| new Triangle(); | |||||
| app.Run(); | |||||
| return EXIT_SUCCESS; | |||||
| } | |||||
| @@ -0,0 +1,196 @@ | |||||
| // | |||||
| // Lol Engine - Cube tutorial | |||||
| // | |||||
| // Copyright: (c) 2011 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||||
| // | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include "core.h" | |||||
| #include "lolgl.h" | |||||
| #include "loldebug.h" | |||||
| using namespace std; | |||||
| using namespace lol; | |||||
| #if USE_SDL && defined __APPLE__ | |||||
| # include <SDL_main.h> | |||||
| #endif | |||||
| #if defined _WIN32 | |||||
| # undef main /* FIXME: still needed? */ | |||||
| #endif | |||||
| class Cube : public WorldEntity | |||||
| { | |||||
| public: | |||||
| Cube() | |||||
| { | |||||
| /* Front */ | |||||
| m_vertices[0] = vec3(-1.0, -1.0, 1.0); | |||||
| m_vertices[1] = vec3( 1.0, -1.0, 1.0); | |||||
| m_vertices[2] = vec3( 1.0, 1.0, 1.0); | |||||
| m_vertices[3] = vec3(-1.0, 1.0, 1.0); | |||||
| /* Back */ | |||||
| m_vertices[4] = vec3(-1.0, -1.0, -1.0); | |||||
| m_vertices[5] = vec3( 1.0, -1.0, -1.0); | |||||
| m_vertices[6] = vec3( 1.0, 1.0, -1.0); | |||||
| m_vertices[7] = vec3(-1.0, 1.0, -1.0); | |||||
| m_colors[0] = vec3(1.0, 0.0, 0.0); | |||||
| m_colors[1] = vec3(0.0, 1.0, 0.0); | |||||
| m_colors[2] = vec3(0.0, 0.0, 1.0); | |||||
| m_colors[3] = vec3(1.0, 1.0, 1.0); | |||||
| m_colors[4] = vec3(1.0, 0.0, 0.0); | |||||
| m_colors[5] = vec3(0.0, 1.0, 0.0); | |||||
| m_colors[6] = vec3(0.0, 0.0, 1.0); | |||||
| m_colors[7] = vec3(1.0, 1.0, 1.0); | |||||
| m_indices[0] = i16vec3(0, 1, 2); | |||||
| m_indices[1] = i16vec3(2, 3, 0); | |||||
| m_indices[2] = i16vec3(1, 5, 6); | |||||
| m_indices[3] = i16vec3(6, 2, 1); | |||||
| m_indices[4] = i16vec3(7, 6, 5); | |||||
| m_indices[5] = i16vec3(5, 4, 7); | |||||
| m_indices[6] = i16vec3(4, 0, 3); | |||||
| m_indices[7] = i16vec3(3, 7, 4); | |||||
| m_indices[8] = i16vec3(4, 5, 1); | |||||
| m_indices[9] = i16vec3(1, 0, 4); | |||||
| m_indices[10] = i16vec3(3, 2, 6); | |||||
| m_indices[11] = i16vec3(6, 7, 3); | |||||
| } | |||||
| virtual void TickGame(float deltams) | |||||
| { | |||||
| real x(4.08f); x.print(); | |||||
| WorldEntity::TickGame(deltams); | |||||
| m_angle += deltams; | |||||
| vec3 axis_y(0, 1, 0); | |||||
| mat4 anim = mat4::rotate(m_angle * 0.0001f, axis_y); | |||||
| mat4 model = mat4::translate(vec3(0, 0, -4)); | |||||
| mat4 view = mat4::lookat(vec3(0, 2, 0), vec3(0, 0, -4), vec3(0, 1, 0)); | |||||
| mat4 proj = mat4::perspective(M_PI / 4, 640.0f, 480.0f, -10.0f, 10.0f); | |||||
| anim = mat4(1.0f); | |||||
| model = mat4(1.0f); | |||||
| view = mat4(1.0f); | |||||
| m_matrix = proj * view * model * anim; | |||||
| proj.printf(); | |||||
| view.printf(); | |||||
| model.printf(); | |||||
| anim.printf(); | |||||
| printf("\n"); | |||||
| m_matrix.printf(); | |||||
| printf("\n"); | |||||
| m_vertices[0].printf(); | |||||
| (m_matrix * vec4(m_vertices[0], 1)).printf(); | |||||
| printf("\n"); | |||||
| } | |||||
| virtual void TickDraw(float deltams) | |||||
| { | |||||
| WorldEntity::TickDraw(deltams); | |||||
| if (!m_ready) | |||||
| { | |||||
| m_shader = Shader::Create( | |||||
| "#version 120\n" | |||||
| "attribute vec3 coord3d;" | |||||
| "attribute vec3 v_color;" | |||||
| "uniform mat4 mvp;" | |||||
| "varying vec3 f_color;" | |||||
| "void main(void) {" | |||||
| " gl_Position = mvp * vec4(coord3d, 1.0);" | |||||
| " f_color = v_color;" | |||||
| "}", | |||||
| "#version 120\n" | |||||
| "varying vec3 f_color;" | |||||
| "void main(void) {" | |||||
| " gl_FragColor = vec4(f_color, 1.0);" | |||||
| " gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);" | |||||
| "}"); | |||||
| m_coord = m_shader->GetAttribLocation("coord3d"); | |||||
| m_color = m_shader->GetAttribLocation("v_color"); | |||||
| m_mvp = m_shader->GetUniformLocation("mvp"); | |||||
| m_ready = true; | |||||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| /* Method 1: store vertex buffer on the GPU memory */ | |||||
| glGenBuffers(1, &m_vbo); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertices), m_vertices, | |||||
| GL_STATIC_DRAW); | |||||
| glGenBuffers(1, &m_cbo); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, m_cbo); | |||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(m_colors), m_colors, | |||||
| GL_STATIC_DRAW); | |||||
| glGenBuffers(1, &m_ibo); | |||||
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); | |||||
| glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(m_indices), m_indices, | |||||
| GL_STATIC_DRAW); | |||||
| #else | |||||
| #endif | |||||
| /* FIXME: this object never cleans up */ | |||||
| } | |||||
| m_shader->Bind(); | |||||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| glEnableVertexAttribArray(m_coord); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, m_vbo); | |||||
| glVertexAttribPointer(m_coord, 3, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glEnableVertexAttribArray(m_color); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, m_cbo); | |||||
| glVertexAttribPointer(m_color, 3, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); | |||||
| int size; | |||||
| glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); | |||||
| glDrawElements(GL_TRIANGLES, size / sizeof(GLushort), GL_UNSIGNED_SHORT, 0); | |||||
| glDisableVertexAttribArray(m_coord); | |||||
| glDisableVertexAttribArray(m_color); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, 0); | |||||
| #else | |||||
| glEnableClientState(GL_VERTEX_ARRAY); | |||||
| glVertexPointer(3, GL_FLOAT, 0, m_vertices); | |||||
| glDisableClientState(GL_VERTEX_ARRAY); | |||||
| #endif | |||||
| } | |||||
| private: | |||||
| float m_angle; | |||||
| mat4 m_matrix; | |||||
| vec3 m_vertices[8]; | |||||
| vec3 m_colors[8]; | |||||
| i16vec3 m_indices[12]; | |||||
| Shader *m_shader; | |||||
| #if !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ | |||||
| GLuint m_vbo, m_cbo, m_ibo; | |||||
| #endif | |||||
| int m_coord, m_color, m_mvp; | |||||
| bool m_ready; | |||||
| }; | |||||
| int main() | |||||
| { | |||||
| Application app("Tutorial 2: Cube", ivec2(640, 480), 60.0f); | |||||
| new DebugFps(5, 5); | |||||
| new Cube(); | |||||
| app.Run(); | |||||
| return EXIT_SUCCESS; | |||||
| } | |||||
| @@ -0,0 +1,17 @@ | |||||
| AM_CPPFLAGS = -I$(top_srcdir)/src | |||||
| all-local: $(noinst_PROGRAMS) | |||||
| test x$(MAKE_FSELF) = xno || make_fself xolotl$(EXEEXT) xolotl.self | |||||
| CLEANFILES = $(noinst_PROGRAMS:%$(EXEEXT)=%.self) \ | |||||
| $(noinst_PROGRAMS:%$(EXEEXT)=%.elf) \ | |||||
| $(noinst_PROGRAMS:%$(EXEEXT)=%.exe) | |||||
| noinst_PROGRAMS = xolotl | |||||
| xolotl_SOURCES = xolotl.cpp xolotl.h | |||||
| xolotl_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ | |||||
| xolotl_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ | |||||
| xolotl_DEPENDENCIES = $(top_builddir)/src/liblol.a | |||||
| @@ -0,0 +1,78 @@ | |||||
| // | |||||
| // Lol Engine - Xolotl algorithm test | |||||
| // | |||||
| // Copyright: (c) 2011 Soren Renner | |||||
| // (c) 2011 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||||
| // | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include "core.h" | |||||
| #include "lolgl.h" | |||||
| #include "loldebug.h" | |||||
| using namespace std; | |||||
| using namespace lol; | |||||
| #if USE_SDL && defined __APPLE__ | |||||
| # include <SDL_main.h> | |||||
| #endif | |||||
| #if defined _WIN32 | |||||
| # undef main /* FIXME: still needed? */ | |||||
| #endif | |||||
| #include "xolotl.h" | |||||
| class Xolotl : public WorldEntity | |||||
| { | |||||
| public: | |||||
| Xolotl() | |||||
| { | |||||
| for(int i = 0; i < 2000; i++) { | |||||
| float x = (i - 1000.0) / 100.0; | |||||
| graph[i].x = x; | |||||
| graph[i].y = sin(x * 10.0) / (1.0 + x * x); | |||||
| } | |||||
| } | |||||
| virtual ~Xolotl() | |||||
| { | |||||
| } | |||||
| virtual char const *GetName() { return "Xolotl"; } | |||||
| virtual void TickGame(float deltams) | |||||
| { | |||||
| } | |||||
| virtual void TickDraw(float deltams) | |||||
| { | |||||
| } | |||||
| private: | |||||
| vec2 graph[2000]; | |||||
| }; | |||||
| int main() | |||||
| { | |||||
| Application app("Xolotl", ivec2(640, 480), 60.0f); | |||||
| /* Register some debug stuff */ | |||||
| new DebugFps(5, 5); | |||||
| Cell<3> c; | |||||
| app.Run(); | |||||
| return EXIT_SUCCESS; | |||||
| } | |||||
| @@ -0,0 +1,58 @@ | |||||
| // | |||||
| // Lol Engine - Xolotl algorithm test | |||||
| // | |||||
| // Copyright: (c) 2011 Soren Renner | |||||
| // (c) 2011 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||||
| // | |||||
| using namespace lol; | |||||
| struct Voxel | |||||
| { | |||||
| bool passable, lock, copymarker; | |||||
| struct Voxel *imposter; | |||||
| }; | |||||
| struct MSV : public Voxel | |||||
| { | |||||
| }; | |||||
| struct Ray | |||||
| { | |||||
| float theta, phi; | |||||
| vec3 origin, xyz, dxyz, ddxyz, lxyz, popdelta; | |||||
| struct Voxel *terminalvoxel; | |||||
| bool terminate; | |||||
| ivec3 counter; | |||||
| int scale; | |||||
| float length; | |||||
| bool di, dj, dk, changed, traced, far; | |||||
| int face; | |||||
| vec3 normal, bloxnorm, corner; | |||||
| int dtl; | |||||
| }; | |||||
| template <int M> struct Cell : public MSV | |||||
| { | |||||
| Voxel blox[M * M * M]; | |||||
| vec3 bloxnorm[M * M * M]; | |||||
| int m; | |||||
| void Serp(Voxel v, Voxel w) | |||||
| { | |||||
| for (int i = 0; i < M; i++) | |||||
| for (int j = 0; j < M; j++) | |||||
| for (int k = 0; k < M; k++) | |||||
| if ((i == M_2) + (j == M_2) + (k == M_2) >= 2) | |||||
| blox[(i * M + j) * M + k] = v; | |||||
| else | |||||
| blox[(i * M + j) * M + k] = w; | |||||
| } | |||||
| static const int M_2 = M / 2; | |||||
| }; | |||||