@@ -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); | ||||