| @@ -17,6 +17,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "debugfps.h" | #include "debugfps.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -18,6 +18,8 @@ | |||||
| #include "lolgl.h" | #include "lolgl.h" | ||||
| #include "loldebug.h" | #include "loldebug.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -159,6 +161,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| attr_col = data->shader->GetAttribLocation("in_Color"); | attr_col = data->shader->GetAttribLocation("in_Color"); | ||||
| attr_tex = data->shader->GetAttribLocation("in_TexCoord"); | attr_tex = data->shader->GetAttribLocation("in_TexCoord"); | ||||
| #if !defined __CELLOS_LV2__ | |||||
| glEnableVertexAttribArray(attr_pos); | glEnableVertexAttribArray(attr_pos); | ||||
| glEnableVertexAttribArray(attr_col); | glEnableVertexAttribArray(attr_col); | ||||
| glEnableVertexAttribArray(attr_tex); | glEnableVertexAttribArray(attr_tex); | ||||
| @@ -184,6 +187,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glDisableVertexAttribArray(attr_pos); | glDisableVertexAttribArray(attr_pos); | ||||
| glDisableVertexAttribArray(attr_col); | glDisableVertexAttribArray(attr_col); | ||||
| glDisableVertexAttribArray(attr_tex); | glDisableVertexAttribArray(attr_tex); | ||||
| #endif | |||||
| } | } | ||||
| DebugQuad::~DebugQuad() | DebugQuad::~DebugQuad() | ||||
| @@ -21,6 +21,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "debugrecord.h" | #include "debugrecord.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -24,6 +24,8 @@ | |||||
| #include "lolgl.h" | #include "lolgl.h" | ||||
| #include "debugsphere.h" | #include "debugsphere.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -17,6 +17,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "debugstats.h" | #include "debugstats.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -21,6 +21,8 @@ | |||||
| # define strcasecmp _stricmp | # define strcasecmp _stricmp | ||||
| #endif | #endif | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -12,11 +12,13 @@ | |||||
| # include "config.h" | # include "config.h" | ||||
| #endif | #endif | ||||
| #include <string.h> | |||||
| #include <stdio.h> | |||||
| #include <cstring> | |||||
| #include <cstdio> | |||||
| #include "core.h" | #include "core.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -26,6 +26,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -16,6 +16,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -35,6 +35,9 @@ | |||||
| # if defined __APPLE__ && defined __MACH__ | # if defined __APPLE__ && defined __MACH__ | ||||
| # include <OpenGLES/ES2/gl.h> | # include <OpenGLES/ES2/gl.h> | ||||
| # include <OpenGLES/ES2/glext.h> | # include <OpenGLES/ES2/glext.h> | ||||
| # elif defined __CELLOS_LV2__ | |||||
| # include <PSGL/psgl.h> | |||||
| # include <PSGL/psglu.h> | |||||
| # else | # else | ||||
| # include <GLES2/gl2.h> | # include <GLES2/gl2.h> | ||||
| # include <GLES2/gl2ext.h> | # include <GLES2/gl2ext.h> | ||||
| @@ -20,6 +20,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -17,6 +17,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -113,7 +113,7 @@ namespace lol | |||||
| \ | \ | ||||
| inline float len() const \ | inline float len() const \ | ||||
| { \ | { \ | ||||
| return sqrtf((float)sqlen()); \ | |||||
| return std::sqrtf((float)sqlen()); \ | |||||
| } | } | ||||
| template <typename T> struct Vec2; | template <typename T> struct Vec2; | ||||
| @@ -26,7 +26,7 @@ namespace lol | |||||
| /* Random float value */ | /* Random float value */ | ||||
| static inline float RandF() | static inline float RandF() | ||||
| { | { | ||||
| return (float)rand() / RAND_MAX; | |||||
| return (float)std::rand() / RAND_MAX; | |||||
| } | } | ||||
| static inline float RandF(float val) | static inline float RandF(float val) | ||||
| @@ -0,0 +1,128 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-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 | |||||
| #if defined __CELLOS_LV2__ | |||||
| # include <sys/spu_initialize.h> | |||||
| # include <sys/paths.h> /* SYS_HOST_ROOT */ | |||||
| # include <cell/sysmodule.h> | |||||
| # include <PSGL/psgl.h> | |||||
| #endif | |||||
| #include "core.h" | |||||
| #include "lolgl.h" | |||||
| #include "ps3app.h" | |||||
| namespace lol | |||||
| { | |||||
| /* | |||||
| * PS3 App implementation class | |||||
| */ | |||||
| class Ps3AppData | |||||
| { | |||||
| friend class Ps3App; | |||||
| private: | |||||
| #if defined __CELLOS_LV2__ | |||||
| static void SysCallBack(uint64_t status, uint64_t param, void *data) | |||||
| { | |||||
| if (status == CELL_SYSUTIL_REQUEST_EXITGAME) | |||||
| Ticker::Shutdown(); | |||||
| } | |||||
| #endif | |||||
| }; | |||||
| /* | |||||
| * Public Ps3App class | |||||
| */ | |||||
| Ps3App::Ps3App(char const *title, vec2i res, float fps) : | |||||
| data(new Ps3AppData()) | |||||
| { | |||||
| #if defined __CELLOS_LV2__ | |||||
| sys_spu_initialize(6, 1); | |||||
| /* FIXME: we should check for CELL_SYSMODULE_ERROR_UNKNOWN and others, | |||||
| * but what could we do anyway? */ | |||||
| cellSysmoduleLoadModule(CELL_SYSMODULE_GCM_SYS); | |||||
| cellSysmoduleLoadModule(CELL_SYSMODULE_FS); | |||||
| cellSysmoduleLoadModule(CELL_SYSMODULE_USBD); | |||||
| cellSysmoduleLoadModule(CELL_SYSMODULE_IO); | |||||
| cellSysutilRegisterCallback(0, Ps3AppData::SysCallBack, NULL); | |||||
| PSGLinitOptions psglio = | |||||
| { | |||||
| enable: PSGL_INIT_MAX_SPUS | PSGL_INIT_INITIALIZE_SPUS | |||||
| | PSGL_INIT_HOST_MEMORY_SIZE, | |||||
| maxSPUs: 1, | |||||
| initializeSPUs: false, | |||||
| persistentMemorySize: 0, | |||||
| transientMemorySize: 0, | |||||
| errorConsole: 0, | |||||
| fifoSize: 0, | |||||
| hostMemorySize: 128 * 1024 * 1024, | |||||
| }; | |||||
| psglInit(&psglio); | |||||
| PSGLdevice* psgl = psglCreateDeviceAuto(GL_ARGB_SCE, GL_DEPTH_COMPONENT24, | |||||
| GL_MULTISAMPLING_4X_SQUARE_ROTATED_SCE); | |||||
| GLuint w, h; | |||||
| psglGetDeviceDimensions(psgl, &w, &h); | |||||
| PSGLcontext *ctx = psglCreateContext(); | |||||
| psglMakeCurrent(ctx, psgl); | |||||
| psglLoadShaderLibrary(REMOTE_PATH "/shaders.bin"); | |||||
| psglResetCurrentContext(); | |||||
| /* Initialise everything */ | |||||
| Ticker::Setup(fps); | |||||
| Video::Setup(res); | |||||
| Audio::Setup(2); | |||||
| #endif | |||||
| } | |||||
| void Ps3App::Run() | |||||
| { | |||||
| while (!Ticker::Finished()) | |||||
| { | |||||
| /* Tick the game */ | |||||
| Ticker::TickGame(); | |||||
| /* Tick the renderer, show the frame and clamp to desired framerate. */ | |||||
| Ticker::TickDraw(); | |||||
| #if defined __CELLOS_LV2__ | |||||
| psglSwap(); | |||||
| /* Check if exit callback was called */ | |||||
| cellSysutilCheckCallback(); | |||||
| #endif | |||||
| Ticker::ClampFps(); | |||||
| } | |||||
| } | |||||
| Ps3App::~Ps3App() | |||||
| { | |||||
| #if defined __CELLOS_LV2__ | |||||
| glFinish(); | |||||
| #endif | |||||
| delete data; | |||||
| } | |||||
| } /* namespace lol */ | |||||
| @@ -0,0 +1,41 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-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. | |||||
| // | |||||
| // | |||||
| // The Ps3App class | |||||
| // ---------------- | |||||
| // | |||||
| #if !defined __LOL_PS3APP_H__ | |||||
| #define __LOL_PS3APP_H__ | |||||
| #include "matrix.h" | |||||
| namespace lol | |||||
| { | |||||
| class Ps3AppData; | |||||
| class Ps3App | |||||
| { | |||||
| public: | |||||
| Ps3App(char const *title, vec2i res, float fps); | |||||
| virtual ~Ps3App(); | |||||
| void Run(); | |||||
| private: | |||||
| Ps3AppData *data; | |||||
| }; | |||||
| } /* namespace lol */ | |||||
| #endif // __LOL_PS3APP_H__ | |||||
| @@ -24,6 +24,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -157,11 +157,13 @@ void Scene::Render() // XXX: rename to Blit() | |||||
| attr_pos = stdshader->GetAttribLocation("in_Position"); | attr_pos = stdshader->GetAttribLocation("in_Position"); | ||||
| attr_tex = stdshader->GetAttribLocation("in_TexCoord"); | attr_tex = stdshader->GetAttribLocation("in_TexCoord"); | ||||
| #if !defined __CELLOS_LV2__ // Use cgGetNamedParameter etc. | |||||
| stdshader->Bind(); | stdshader->Bind(); | ||||
| uni_mat = stdshader->GetUniformLocation("model_matrix"); | uni_mat = stdshader->GetUniformLocation("model_matrix"); | ||||
| glUniformMatrix4fv(uni_mat, 1, GL_FALSE, &model_matrix[0][0]); | glUniformMatrix4fv(uni_mat, 1, GL_FALSE, &model_matrix[0][0]); | ||||
| uni_tex = stdshader->GetUniformLocation("in_Texture"); | uni_tex = stdshader->GetUniformLocation("in_Texture"); | ||||
| glUniform1i(uni_tex, 0); | glUniform1i(uni_tex, 0); | ||||
| #endif | |||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glEnable(GL_DEPTH_TEST); | glEnable(GL_DEPTH_TEST); | ||||
| @@ -208,6 +210,7 @@ void Scene::Render() // XXX: rename to Blit() | |||||
| #if defined HAVE_GL_2X | #if defined HAVE_GL_2X | ||||
| glBindVertexArray(data->vao); | glBindVertexArray(data->vao); | ||||
| #endif | #endif | ||||
| #if !defined __CELLOS_LV2__ // Use cgGLEnableClientState etc. | |||||
| glEnableVertexAttribArray(attr_pos); | glEnableVertexAttribArray(attr_pos); | ||||
| glEnableVertexAttribArray(attr_tex); | glEnableVertexAttribArray(attr_tex); | ||||
| @@ -220,6 +223,7 @@ void Scene::Render() // XXX: rename to Blit() | |||||
| glBufferData(GL_ARRAY_BUFFER, 12 * (n - i) * sizeof(GLfloat), | glBufferData(GL_ARRAY_BUFFER, 12 * (n - i) * sizeof(GLfloat), | ||||
| texture, GL_STATIC_DRAW); | texture, GL_STATIC_DRAW); | ||||
| glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, 0); | glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, 0); | ||||
| #endif | |||||
| /* Draw arrays */ | /* Draw arrays */ | ||||
| glDrawArrays(GL_TRIANGLES, 0, (n - i) * 6); | glDrawArrays(GL_TRIANGLES, 0, (n - i) * 6); | ||||
| @@ -227,8 +231,10 @@ void Scene::Render() // XXX: rename to Blit() | |||||
| #if defined HAVE_GL_2X | #if defined HAVE_GL_2X | ||||
| glBindVertexArray(0); | glBindVertexArray(0); | ||||
| #endif | #endif | ||||
| #if !defined __CELLOS_LV2__ // Use cgGLEnableClientState etc. | |||||
| glDisableVertexAttribArray(attr_pos); | glDisableVertexAttribArray(attr_pos); | ||||
| glDisableVertexAttribArray(attr_tex); | glDisableVertexAttribArray(attr_tex); | ||||
| #endif | |||||
| free(vertex); | free(vertex); | ||||
| free(texture); | free(texture); | ||||
| @@ -79,6 +79,7 @@ Shader::Shader(char const *vert, char const *frag) | |||||
| char buf[4096]; | char buf[4096]; | ||||
| GLsizei len; | GLsizei len; | ||||
| #if !defined __CELLOS_LV2__ | |||||
| data->vert_crc = Hash::Crc32(vert); | data->vert_crc = Hash::Crc32(vert); | ||||
| data->vert_id = glCreateShader(GL_VERTEX_SHADER); | data->vert_id = glCreateShader(GL_VERTEX_SHADER); | ||||
| glShaderSource(data->vert_id, 1, &vert, NULL); | glShaderSource(data->vert_id, 1, &vert, NULL); | ||||
| @@ -103,31 +104,48 @@ Shader::Shader(char const *vert, char const *frag) | |||||
| glLinkProgram(data->prog_id); | glLinkProgram(data->prog_id); | ||||
| glValidateProgram(data->prog_id); | glValidateProgram(data->prog_id); | ||||
| #endif | |||||
| } | } | ||||
| int Shader::GetAttribLocation(char const *attr) const | int Shader::GetAttribLocation(char const *attr) const | ||||
| { | { | ||||
| #if defined __CELLOS_LV2__ | |||||
| return 0; | |||||
| #else | |||||
| return glGetAttribLocation(data->prog_id, attr); | return glGetAttribLocation(data->prog_id, attr); | ||||
| #endif | |||||
| } | } | ||||
| int Shader::GetUniformLocation(char const *uni) const | int Shader::GetUniformLocation(char const *uni) const | ||||
| { | { | ||||
| #if defined __CELLOS_LV2__ | |||||
| return 0; | |||||
| #else | |||||
| return glGetUniformLocation(data->prog_id, uni); | return glGetUniformLocation(data->prog_id, uni); | ||||
| #endif | |||||
| } | } | ||||
| void Shader::Bind() const | void Shader::Bind() const | ||||
| { | { | ||||
| #if defined __CELLOS_LV2__ | |||||
| ; | |||||
| #else | |||||
| glUseProgram(data->prog_id); | glUseProgram(data->prog_id); | ||||
| #endif | |||||
| } | } | ||||
| Shader::~Shader() | Shader::~Shader() | ||||
| { | { | ||||
| #if defined __CELLOS_LV2__ | |||||
| ; | |||||
| #else | |||||
| glDetachShader(data->prog_id, data->vert_id); | glDetachShader(data->prog_id, data->vert_id); | ||||
| glDetachShader(data->prog_id, data->frag_id); | glDetachShader(data->prog_id, data->frag_id); | ||||
| glDeleteShader(data->vert_id); | glDeleteShader(data->vert_id); | ||||
| glDeleteShader(data->frag_id); | glDeleteShader(data->frag_id); | ||||
| glDeleteProgram(data->prog_id); | glDeleteProgram(data->prog_id); | ||||
| delete data; | delete data; | ||||
| #endif | |||||
| } | } | ||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| @@ -18,6 +18,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -25,6 +25,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "lolgl.h" | #include "lolgl.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -21,6 +21,10 @@ | |||||
| #elif defined _WIN32 | #elif defined _WIN32 | ||||
| # define WIN32_LEAN_AND_MEAN | # define WIN32_LEAN_AND_MEAN | ||||
| # include <windows.h> | # include <windows.h> | ||||
| #elif defined __CELLOS_LV2__ | |||||
| # include <sys/sys_time.h> | |||||
| # include <sys/timer.h> | |||||
| # include <sys/time_util.h> | |||||
| #else | #else | ||||
| # include <SDL.h> | # include <SDL.h> | ||||
| #endif | #endif | ||||
| @@ -48,6 +52,9 @@ private: | |||||
| QueryPerformanceFrequency(&tmp); | QueryPerformanceFrequency(&tmp); | ||||
| ms_per_cycle = 1e3f / tmp.QuadPart; | ms_per_cycle = 1e3f / tmp.QuadPart; | ||||
| QueryPerformanceCounter(&cycles0); | QueryPerformanceCounter(&cycles0); | ||||
| #elif defined __CELLOS_LV2__ | |||||
| ms_per_cycle = 1e3f / sys_time_get_timebase_frequency(); | |||||
| SYS_TIMEBASE_GET(cycles0); | |||||
| #else | #else | ||||
| SDL_Init(SDL_INIT_TIMER); | SDL_Init(SDL_INIT_TIMER); | ||||
| ticks0 = SDL_GetTicks(); | ticks0 = SDL_GetTicks(); | ||||
| @@ -76,6 +83,15 @@ private: | |||||
| towait = deltams - ret; | towait = deltams - ret; | ||||
| if (towait > 5e-4f) | if (towait > 5e-4f) | ||||
| Sleep((int)(towait + 0.5f)); | Sleep((int)(towait + 0.5f)); | ||||
| #elif defined __CELLOS_LV2__ | |||||
| uint64_t cycles; | |||||
| SYS_TIMEBASE_GET(cycles); | |||||
| ret = ms_per_cycle * cycles; | |||||
| if (update) | |||||
| cycles0 = cycles; | |||||
| towait = deltams - ret; | |||||
| if (towait > 0.0f) | |||||
| sys_timer_usleep((int)(towait * 1e3f)); | |||||
| #else | #else | ||||
| /* The crappy SDL fallback */ | /* The crappy SDL fallback */ | ||||
| Uint32 ticks = SDL_GetTicks(); | Uint32 ticks = SDL_GetTicks(); | ||||
| @@ -94,6 +110,9 @@ private: | |||||
| #elif defined _WIN32 | #elif defined _WIN32 | ||||
| float ms_per_cycle; | float ms_per_cycle; | ||||
| LARGE_INTEGER cycles0; | LARGE_INTEGER cycles0; | ||||
| #elif defined __CELLOS_LV2__ | |||||
| float ms_per_cycle; | |||||
| uint64_t cycles0; | |||||
| #else | #else | ||||
| Uint32 ticks0; | Uint32 ticks0; | ||||
| #endif | #endif | ||||
| @@ -22,6 +22,8 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "lolgl.h" | #include "lolgl.h" | ||||
| using namespace std; | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -188,11 +190,13 @@ void Video::SetFov(float theta) | |||||
| view_matrix = mat4(1.0f); | view_matrix = mat4(1.0f); | ||||
| stdshader->Bind(); /* Required on GLES 2.x? */ | stdshader->Bind(); /* Required on GLES 2.x? */ | ||||
| #if !defined __CELLOS_LV2__ // Use cgGetNamedParameter etc. | |||||
| GLuint uni; | GLuint uni; | ||||
| uni = stdshader->GetUniformLocation("proj_matrix"); | uni = stdshader->GetUniformLocation("proj_matrix"); | ||||
| glUniformMatrix4fv(uni, 1, GL_FALSE, &proj_matrix[0][0]); | glUniformMatrix4fv(uni, 1, GL_FALSE, &proj_matrix[0][0]); | ||||
| uni = stdshader->GetUniformLocation("view_matrix"); | uni = stdshader->GetUniformLocation("view_matrix"); | ||||
| glUniformMatrix4fv(uni, 1, GL_FALSE, &view_matrix[0][0]); | glUniformMatrix4fv(uni, 1, GL_FALSE, &view_matrix[0][0]); | ||||
| #endif | |||||
| } | } | ||||
| void Video::SetDepth(bool set) | void Video::SetDepth(bool set) | ||||
| @@ -220,7 +224,13 @@ void Video::Destroy() | |||||
| void Video::Capture(uint32_t *buffer) | void Video::Capture(uint32_t *buffer) | ||||
| { | { | ||||
| GLint v[4]; | GLint v[4]; | ||||
| #if defined __CELLOS_LV2__ | |||||
| // FIXME: use psglCreateDeviceAuto && psglGetDeviceDimensions | |||||
| v[2] = 1920; | |||||
| v[3] = 1080; | |||||
| #else | |||||
| glGetIntegerv(GL_VIEWPORT, v); | glGetIntegerv(GL_VIEWPORT, v); | ||||
| #endif | |||||
| int width = v[2], height = v[3]; | int width = v[2], height = v[3]; | ||||
| #if defined HAVE_GL_2X | #if defined HAVE_GL_2X | ||||
| @@ -247,6 +257,9 @@ vec2i Video::GetSize() | |||||
| { | { | ||||
| #if defined ANDROID_NDK | #if defined ANDROID_NDK | ||||
| return saved_viewport; | return saved_viewport; | ||||
| #elif defined __CELLOS_LV2__ | |||||
| // FIXME: use psglCreateDeviceAuto && psglGetDeviceDimensions | |||||
| return vec2i(1920, 1080); | |||||
| #else | #else | ||||
| GLint v[4]; | GLint v[4]; | ||||
| glGetIntegerv(GL_VIEWPORT, v); | glGetIntegerv(GL_VIEWPORT, v); | ||||