@@ -34,7 +34,8 @@ class DebugRecordData | |||
private: | |||
char const *path; | |||
int width, height, fps; | |||
vec2i size; | |||
int fps; | |||
#if defined USE_PIPI | |||
pipi_sequence_t *sequence; | |||
#endif | |||
@@ -50,8 +51,7 @@ DebugRecord::DebugRecord(char const *path, float fps) | |||
Ticker::StartRecording(); | |||
data->path = strdup(path); | |||
data->width = 0; | |||
data->height = 0; | |||
data->size = 0; | |||
data->fps = (int)(fps + 0.5f); | |||
#if defined USE_PIPI | |||
data->sequence = NULL; | |||
@@ -69,19 +69,17 @@ void DebugRecord::TickDraw(float deltams) | |||
{ | |||
Entity::TickDraw(deltams); | |||
int width = Video::GetWidth(); | |||
int height = Video::GetHeight(); | |||
vec2i size = Video::GetSize(); | |||
if (data->width != width || data->height != height) | |||
if (data->size != size) | |||
{ | |||
data->width = width; | |||
data->height = height; | |||
data->size = size; | |||
#if defined USE_PIPI | |||
if (data->sequence) | |||
pipi_close_sequence(data->sequence); | |||
data->sequence = pipi_open_sequence(data->path, width, height, | |||
data->sequence = pipi_open_sequence(data->path, size.x, size.y, | |||
1 /* RGB */, data->fps, | |||
1, 1, 60 * 1024 * 1024); | |||
#endif | |||
@@ -90,9 +88,9 @@ void DebugRecord::TickDraw(float deltams) | |||
#if defined USE_PIPI | |||
if (data->sequence) | |||
{ | |||
uint32_t *buffer = new uint32_t[width * height]; | |||
uint32_t *buffer = new uint32_t[size.x * size.y]; | |||
Video::Capture(buffer); | |||
pipi_feed_sequence(data->sequence, (uint8_t *)buffer, width, height); | |||
pipi_feed_sequence(data->sequence, (uint8_t *)buffer, size.x, size.y); | |||
delete[] buffer; | |||
} | |||
#endif | |||
@@ -149,7 +149,7 @@ EglApp::EglApp(char const *title, vec2i res, float fps) : | |||
/* Initialise everything */ | |||
Ticker::Setup(fps); | |||
Video::Setup(gwa.width, gwa.height); | |||
Video::Setup(vec2i(gwa.width, gwa.height)); | |||
Audio::Setup(2); | |||
#endif | |||
} | |||
@@ -64,7 +64,7 @@ SdlApp::SdlApp(char const *title, vec2i res, float fps) : | |||
/* Initialise everything */ | |||
Ticker::Setup(fps); | |||
Video::Setup(video->w, video->h); | |||
Video::Setup(vec2i(video->w, video->h)); | |||
Audio::Setup(2); | |||
#endif | |||
} | |||
@@ -55,7 +55,7 @@ void SdlInput::TickGame(float deltams) | |||
if (SDL_GetAppState() & SDL_APPMOUSEFOCUS) | |||
{ | |||
SDL_GetMouseState(&mouse.x, &mouse.y); | |||
mouse.y = Video::GetHeight() - 1 - mouse.y; | |||
mouse.y = Video::GetSize().y - 1 - mouse.y; | |||
} | |||
else | |||
mouse.x = mouse.y = -1; | |||
@@ -96,8 +96,8 @@ static char const *fragmentshader = | |||
" float dy3 = mod(floor(gl_FragCoord.y * 0.25), 2.0);\n" | |||
" float t3 = mod(3.0 * dx3 + 2.0 * dy3, 4.0);\n" | |||
" float t1 = (1.0 + 16.0 * t1 + 4.0 * t2 + t3) / 65.0;\n" | |||
" float t2 = t1; | |||
" float t3 = t1; | |||
" float t2 = t1;\n" | |||
" float t3 = t1;\n" | |||
#else | |||
" float rand = sin(gl_FragCoord.x * 1.23456) * 123.456\n" | |||
" + cos(gl_FragCoord.y * 2.34567) * 789.012;\n" | |||
@@ -122,13 +122,13 @@ static char const *fragmentshader = | |||
* Public Video class | |||
*/ | |||
void Video::Setup(int width, int height) | |||
void Video::Setup(vec2i size) | |||
{ | |||
/* Initialise OpenGL */ | |||
glViewport(0, 0, width, height); | |||
glViewport(0, 0, size.x, size.y); | |||
#if defined ANDROID_NDK | |||
saved_viewport = vec2i(width, height); | |||
saved_viewport = vec2i(size.x, size.y); | |||
#endif | |||
glClearColor(0.1f, 0.2f, 0.3f, 0.0f); | |||
@@ -148,21 +148,19 @@ void Video::SetFov(float theta) | |||
#undef far /* Fuck Microsoft again */ | |||
mat4 proj; | |||
float width = GetWidth(); | |||
float height = GetHeight(); | |||
float near = -width - height; | |||
float far = width + height; | |||
vec2 size = GetSize(); | |||
float near = -size.x - size.y; | |||
float far = size.x + size.y; | |||
#if defined ANDROID_NDK | |||
width = 640.0f; | |||
height = 480.0f; | |||
size = vec(640.0f, 480.0f); | |||
#endif | |||
/* Set the projection matrix */ | |||
if (theta < 1e-4f) | |||
{ | |||
/* The easy way: purely orthogonal projection. */ | |||
proj_matrix = mat4::ortho(0, width, 0, height, near, far); | |||
proj_matrix = mat4::ortho(0, size.x, 0, size.y, near, far); | |||
} | |||
else | |||
{ | |||
@@ -170,8 +168,8 @@ void Video::SetFov(float theta) | |||
* approaches zero. This view ensures that the z=0 plane fills | |||
* the screen. */ | |||
float t1 = tanf(theta / 2); | |||
float t2 = t1 * height / width; | |||
float dist = (float)width / (2.0f * t1); | |||
float t2 = t1 * size.y / size.y; | |||
float dist = size.x / (2.0f * t1); | |||
near += dist; | |||
far += dist; | |||
@@ -184,7 +182,7 @@ void Video::SetFov(float theta) | |||
proj_matrix = mat4::frustum(-near * t1, near * t1, | |||
-near * t2, near * t2, near, far) | |||
* mat4::translate(-0.5f * width, -0.5f * height, -dist); | |||
* mat4::translate(-0.5f * size.x, -0.5f * size.y, -dist); | |||
} | |||
view_matrix = mat4(1.0f); | |||
@@ -207,7 +205,8 @@ void Video::SetDepth(bool set) | |||
void Video::Clear() | |||
{ | |||
glViewport(0, 0, GetWidth(), GetHeight()); | |||
vec2i size = GetSize(); | |||
glViewport(0, 0, size.x, size.y); | |||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | |||
SetFov(0.0f); | |||
@@ -255,15 +254,5 @@ vec2i Video::GetSize() | |||
#endif | |||
} | |||
int Video::GetWidth() | |||
{ | |||
return GetSize().x; | |||
} | |||
int Video::GetHeight() | |||
{ | |||
return GetSize().y; | |||
} | |||
} /* namespace lol */ | |||
@@ -25,15 +25,13 @@ namespace lol | |||
class Video | |||
{ | |||
public: | |||
static void Setup(int width, int height); | |||
static void Setup(vec2i size); | |||
static void Destroy(); | |||
static void SetFov(float theta); | |||
static void SetDepth(bool set); | |||
static void Clear(); | |||
static void Capture(uint32_t *buffer); | |||
static vec2i GetSize(); | |||
static int GetWidth(); | |||
static int GetHeight(); | |||
}; | |||
} /* namespace lol */ | |||