| @@ -17,6 +17,8 @@ | |||
| #include "core.h" | |||
| #include "debugfps.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -18,6 +18,8 @@ | |||
| #include "lolgl.h" | |||
| #include "loldebug.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -159,6 +161,7 @@ void DebugQuad::TickDraw(float deltams) | |||
| attr_col = data->shader->GetAttribLocation("in_Color"); | |||
| attr_tex = data->shader->GetAttribLocation("in_TexCoord"); | |||
| #if !defined __CELLOS_LV2__ | |||
| glEnableVertexAttribArray(attr_pos); | |||
| glEnableVertexAttribArray(attr_col); | |||
| glEnableVertexAttribArray(attr_tex); | |||
| @@ -184,6 +187,7 @@ void DebugQuad::TickDraw(float deltams) | |||
| glDisableVertexAttribArray(attr_pos); | |||
| glDisableVertexAttribArray(attr_col); | |||
| glDisableVertexAttribArray(attr_tex); | |||
| #endif | |||
| } | |||
| DebugQuad::~DebugQuad() | |||
| @@ -21,6 +21,8 @@ | |||
| #include "core.h" | |||
| #include "debugrecord.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -24,6 +24,8 @@ | |||
| #include "lolgl.h" | |||
| #include "debugsphere.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -17,6 +17,8 @@ | |||
| #include "core.h" | |||
| #include "debugstats.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -21,6 +21,8 @@ | |||
| # define strcasecmp _stricmp | |||
| #endif | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -12,11 +12,13 @@ | |||
| # include "config.h" | |||
| #endif | |||
| #include <string.h> | |||
| #include <stdio.h> | |||
| #include <cstring> | |||
| #include <cstdio> | |||
| #include "core.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -26,6 +26,8 @@ | |||
| #include "core.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -16,6 +16,8 @@ | |||
| #include "core.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -35,6 +35,9 @@ | |||
| # if defined __APPLE__ && defined __MACH__ | |||
| # include <OpenGLES/ES2/gl.h> | |||
| # include <OpenGLES/ES2/glext.h> | |||
| # elif defined __CELLOS_LV2__ | |||
| # include <PSGL/psgl.h> | |||
| # include <PSGL/psglu.h> | |||
| # else | |||
| # include <GLES2/gl2.h> | |||
| # include <GLES2/gl2ext.h> | |||
| @@ -20,6 +20,8 @@ | |||
| #include "core.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -17,6 +17,8 @@ | |||
| #include "core.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -113,7 +113,7 @@ namespace lol | |||
| \ | |||
| inline float len() const \ | |||
| { \ | |||
| return sqrtf((float)sqlen()); \ | |||
| return std::sqrtf((float)sqlen()); \ | |||
| } | |||
| template <typename T> struct Vec2; | |||
| @@ -26,7 +26,7 @@ namespace lol | |||
| /* Random float value */ | |||
| static inline float RandF() | |||
| { | |||
| return (float)rand() / RAND_MAX; | |||
| return (float)std::rand() / RAND_MAX; | |||
| } | |||
| 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" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -157,11 +157,13 @@ void Scene::Render() // XXX: rename to Blit() | |||
| attr_pos = stdshader->GetAttribLocation("in_Position"); | |||
| attr_tex = stdshader->GetAttribLocation("in_TexCoord"); | |||
| #if !defined __CELLOS_LV2__ // Use cgGetNamedParameter etc. | |||
| stdshader->Bind(); | |||
| uni_mat = stdshader->GetUniformLocation("model_matrix"); | |||
| glUniformMatrix4fv(uni_mat, 1, GL_FALSE, &model_matrix[0][0]); | |||
| uni_tex = stdshader->GetUniformLocation("in_Texture"); | |||
| glUniform1i(uni_tex, 0); | |||
| #endif | |||
| glEnable(GL_TEXTURE_2D); | |||
| glEnable(GL_DEPTH_TEST); | |||
| @@ -208,6 +210,7 @@ void Scene::Render() // XXX: rename to Blit() | |||
| #if defined HAVE_GL_2X | |||
| glBindVertexArray(data->vao); | |||
| #endif | |||
| #if !defined __CELLOS_LV2__ // Use cgGLEnableClientState etc. | |||
| glEnableVertexAttribArray(attr_pos); | |||
| glEnableVertexAttribArray(attr_tex); | |||
| @@ -220,6 +223,7 @@ void Scene::Render() // XXX: rename to Blit() | |||
| glBufferData(GL_ARRAY_BUFFER, 12 * (n - i) * sizeof(GLfloat), | |||
| texture, GL_STATIC_DRAW); | |||
| glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, 0); | |||
| #endif | |||
| /* Draw arrays */ | |||
| glDrawArrays(GL_TRIANGLES, 0, (n - i) * 6); | |||
| @@ -227,8 +231,10 @@ void Scene::Render() // XXX: rename to Blit() | |||
| #if defined HAVE_GL_2X | |||
| glBindVertexArray(0); | |||
| #endif | |||
| #if !defined __CELLOS_LV2__ // Use cgGLEnableClientState etc. | |||
| glDisableVertexAttribArray(attr_pos); | |||
| glDisableVertexAttribArray(attr_tex); | |||
| #endif | |||
| free(vertex); | |||
| free(texture); | |||
| @@ -79,6 +79,7 @@ Shader::Shader(char const *vert, char const *frag) | |||
| char buf[4096]; | |||
| GLsizei len; | |||
| #if !defined __CELLOS_LV2__ | |||
| data->vert_crc = Hash::Crc32(vert); | |||
| data->vert_id = glCreateShader(GL_VERTEX_SHADER); | |||
| glShaderSource(data->vert_id, 1, &vert, NULL); | |||
| @@ -103,31 +104,48 @@ Shader::Shader(char const *vert, char const *frag) | |||
| glLinkProgram(data->prog_id); | |||
| glValidateProgram(data->prog_id); | |||
| #endif | |||
| } | |||
| int Shader::GetAttribLocation(char const *attr) const | |||
| { | |||
| #if defined __CELLOS_LV2__ | |||
| return 0; | |||
| #else | |||
| return glGetAttribLocation(data->prog_id, attr); | |||
| #endif | |||
| } | |||
| int Shader::GetUniformLocation(char const *uni) const | |||
| { | |||
| #if defined __CELLOS_LV2__ | |||
| return 0; | |||
| #else | |||
| return glGetUniformLocation(data->prog_id, uni); | |||
| #endif | |||
| } | |||
| void Shader::Bind() const | |||
| { | |||
| #if defined __CELLOS_LV2__ | |||
| ; | |||
| #else | |||
| glUseProgram(data->prog_id); | |||
| #endif | |||
| } | |||
| Shader::~Shader() | |||
| { | |||
| #if defined __CELLOS_LV2__ | |||
| ; | |||
| #else | |||
| glDetachShader(data->prog_id, data->vert_id); | |||
| glDetachShader(data->prog_id, data->frag_id); | |||
| glDeleteShader(data->vert_id); | |||
| glDeleteShader(data->frag_id); | |||
| glDeleteProgram(data->prog_id); | |||
| delete data; | |||
| #endif | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -18,6 +18,8 @@ | |||
| #include "core.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -25,6 +25,8 @@ | |||
| #include "core.h" | |||
| #include "lolgl.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -21,6 +21,10 @@ | |||
| #elif defined _WIN32 | |||
| # define WIN32_LEAN_AND_MEAN | |||
| # include <windows.h> | |||
| #elif defined __CELLOS_LV2__ | |||
| # include <sys/sys_time.h> | |||
| # include <sys/timer.h> | |||
| # include <sys/time_util.h> | |||
| #else | |||
| # include <SDL.h> | |||
| #endif | |||
| @@ -48,6 +52,9 @@ private: | |||
| QueryPerformanceFrequency(&tmp); | |||
| ms_per_cycle = 1e3f / tmp.QuadPart; | |||
| QueryPerformanceCounter(&cycles0); | |||
| #elif defined __CELLOS_LV2__ | |||
| ms_per_cycle = 1e3f / sys_time_get_timebase_frequency(); | |||
| SYS_TIMEBASE_GET(cycles0); | |||
| #else | |||
| SDL_Init(SDL_INIT_TIMER); | |||
| ticks0 = SDL_GetTicks(); | |||
| @@ -76,6 +83,15 @@ private: | |||
| towait = deltams - ret; | |||
| if (towait > 5e-4f) | |||
| 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 | |||
| /* The crappy SDL fallback */ | |||
| Uint32 ticks = SDL_GetTicks(); | |||
| @@ -94,6 +110,9 @@ private: | |||
| #elif defined _WIN32 | |||
| float ms_per_cycle; | |||
| LARGE_INTEGER cycles0; | |||
| #elif defined __CELLOS_LV2__ | |||
| float ms_per_cycle; | |||
| uint64_t cycles0; | |||
| #else | |||
| Uint32 ticks0; | |||
| #endif | |||
| @@ -22,6 +22,8 @@ | |||
| #include "core.h" | |||
| #include "lolgl.h" | |||
| using namespace std; | |||
| namespace lol | |||
| { | |||
| @@ -188,11 +190,13 @@ void Video::SetFov(float theta) | |||
| view_matrix = mat4(1.0f); | |||
| stdshader->Bind(); /* Required on GLES 2.x? */ | |||
| #if !defined __CELLOS_LV2__ // Use cgGetNamedParameter etc. | |||
| GLuint uni; | |||
| uni = stdshader->GetUniformLocation("proj_matrix"); | |||
| glUniformMatrix4fv(uni, 1, GL_FALSE, &proj_matrix[0][0]); | |||
| uni = stdshader->GetUniformLocation("view_matrix"); | |||
| glUniformMatrix4fv(uni, 1, GL_FALSE, &view_matrix[0][0]); | |||
| #endif | |||
| } | |||
| void Video::SetDepth(bool set) | |||
| @@ -220,7 +224,13 @@ void Video::Destroy() | |||
| void Video::Capture(uint32_t *buffer) | |||
| { | |||
| GLint v[4]; | |||
| #if defined __CELLOS_LV2__ | |||
| // FIXME: use psglCreateDeviceAuto && psglGetDeviceDimensions | |||
| v[2] = 1920; | |||
| v[3] = 1080; | |||
| #else | |||
| glGetIntegerv(GL_VIEWPORT, v); | |||
| #endif | |||
| int width = v[2], height = v[3]; | |||
| #if defined HAVE_GL_2X | |||
| @@ -247,6 +257,9 @@ vec2i Video::GetSize() | |||
| { | |||
| #if defined ANDROID_NDK | |||
| return saved_viewport; | |||
| #elif defined __CELLOS_LV2__ | |||
| // FIXME: use psglCreateDeviceAuto && psglGetDeviceDimensions | |||
| return vec2i(1920, 1080); | |||
| #else | |||
| GLint v[4]; | |||
| glGetIntegerv(GL_VIEWPORT, v); | |||