From c9aa11c9e3b7e283948edfc8100a45e25ac46072 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Mon, 31 Oct 2011 08:19:15 +0000 Subject: [PATCH] test: start writing tutorials and other shit. --- .gitignore | 3 + configure.ac | 2 + test/Makefile.am | 2 +- test/tutorial/Makefile.am | 23 +++++ test/tutorial/tut01.cpp | 124 ++++++++++++++++++++++++ test/tutorial/tut02.cpp | 196 ++++++++++++++++++++++++++++++++++++++ test/xolotl/Makefile.am | 17 ++++ test/xolotl/xolotl.cpp | 78 +++++++++++++++ test/xolotl/xolotl.h | 58 +++++++++++ 9 files changed, 502 insertions(+), 1 deletion(-) create mode 100644 test/tutorial/Makefile.am create mode 100644 test/tutorial/tut01.cpp create mode 100644 test/tutorial/tut02.cpp create mode 100644 test/xolotl/Makefile.am create mode 100644 test/xolotl/xolotl.cpp create mode 100644 test/xolotl/xolotl.h diff --git a/.gitignore b/.gitignore index f0d32f94..308a9efd 100644 --- a/.gitignore +++ b/.gitignore @@ -56,11 +56,14 @@ deushax/deushax deushax/editor monsterz/monsterz test/testsuite +test/tutorial/tut01 +test/tutorial/tut02 test/benchsuite test/quad test/sandbox test/math/pi test/math/poly test/math/remez +test/xolotl/xolotl tools/make-font # Our data diff --git a/configure.ac b/configure.ac index c418729d..ba2e44a8 100644 --- a/configure.ac +++ b/configure.ac @@ -327,6 +327,8 @@ AC_CONFIG_FILES( src/Makefile test/Makefile test/math/Makefile + test/tutorial/Makefile + test/xolotl/Makefile gfx/Makefile gfx/font/Makefile tools/Makefile diff --git a/test/Makefile.am b/test/Makefile.am index 78038571..d86c00a0 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = math +SUBDIRS = math tutorial xolotl AM_CPPFLAGS = -I$(top_srcdir)/src diff --git a/test/tutorial/Makefile.am b/test/tutorial/Makefile.am new file mode 100644 index 00000000..ae422f37 --- /dev/null +++ b/test/tutorial/Makefile.am @@ -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 + diff --git a/test/tutorial/tut01.cpp b/test/tutorial/tut01.cpp new file mode 100644 index 00000000..aff014e7 --- /dev/null +++ b/test/tutorial/tut01.cpp @@ -0,0 +1,124 @@ +// +// Lol Engine - Triangle tutorial +// +// Copyright: (c) 2011 Sam Hocevar +// 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 +#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; +} + diff --git a/test/tutorial/tut02.cpp b/test/tutorial/tut02.cpp new file mode 100644 index 00000000..8bbd25e2 --- /dev/null +++ b/test/tutorial/tut02.cpp @@ -0,0 +1,196 @@ +// +// Lol Engine - Cube tutorial +// +// Copyright: (c) 2011 Sam Hocevar +// 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 +#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; +} + diff --git a/test/xolotl/Makefile.am b/test/xolotl/Makefile.am new file mode 100644 index 00000000..e186fdbe --- /dev/null +++ b/test/xolotl/Makefile.am @@ -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 + diff --git a/test/xolotl/xolotl.cpp b/test/xolotl/xolotl.cpp new file mode 100644 index 00000000..c486fb7e --- /dev/null +++ b/test/xolotl/xolotl.cpp @@ -0,0 +1,78 @@ +// +// Lol Engine - Xolotl algorithm test +// +// Copyright: (c) 2011 Soren Renner +// (c) 2011 Sam Hocevar +// 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 +#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; +} + diff --git a/test/xolotl/xolotl.h b/test/xolotl/xolotl.h new file mode 100644 index 00000000..23371d8b --- /dev/null +++ b/test/xolotl/xolotl.h @@ -0,0 +1,58 @@ +// +// Lol Engine - Xolotl algorithm test +// +// Copyright: (c) 2011 Soren Renner +// (c) 2011 Sam Hocevar +// 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 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; +}; +