@@ -40,12 +40,12 @@ DebugFps::DebugFps(int x, int y) | |||
for (int i = 0; i < 5; i ++) | |||
{ | |||
data->lines[i] = new Text(NULL, "gfx/font/ascii.png"); | |||
data->lines[i]->SetPos(int3(x, y + (i ? 8 : 0) + 16 * i, 0)); | |||
data->lines[i]->SetPos(vec3i(x, y + (i ? 8 : 0) + 16 * i, 0)); | |||
Ticker::Ref(data->lines[i]); | |||
} | |||
#else | |||
data->lines[0] = new Text(NULL, "gfx/font/ascii.png"); | |||
data->lines[0]->SetPos(int3(x, y, 100)); | |||
data->lines[0]->SetPos(vec3i(x, y, 100)); | |||
Ticker::Ref(data->lines[0]); | |||
#endif | |||
} | |||
@@ -29,10 +29,10 @@ class EmitterData | |||
private: | |||
int tiler; | |||
float3 gravity; | |||
vec3 gravity; | |||
int particles[MAX_PARTICLES]; | |||
float3 positions[MAX_PARTICLES]; | |||
float3 velocities[MAX_PARTICLES]; | |||
vec3 positions[MAX_PARTICLES]; | |||
vec3 velocities[MAX_PARTICLES]; | |||
int nparticles; | |||
}; | |||
@@ -40,7 +40,7 @@ private: | |||
* Public Emitter class | |||
*/ | |||
Emitter::Emitter(int tiler, float3 gravity) | |||
Emitter::Emitter(int tiler, vec3 gravity) | |||
: data(new EmitterData()) | |||
{ | |||
data->tiler = tiler; | |||
@@ -77,7 +77,7 @@ void Emitter::TickDraw(float deltams) | |||
data->positions[i].z, 0); | |||
} | |||
void Emitter::AddParticle(int id, float3 pos, float3 vel) | |||
void Emitter::AddParticle(int id, vec3 pos, vec3 vel) | |||
{ | |||
if (data->nparticles >= EmitterData::MAX_PARTICLES) | |||
return; | |||
@@ -23,10 +23,10 @@ class EmitterData; | |||
class Emitter : public Entity | |||
{ | |||
public: | |||
Emitter(int tiler, float3 gravity); | |||
Emitter(int tiler, vec3 gravity); | |||
virtual ~Emitter(); | |||
void AddParticle(int id, float3 pos, float3 vel); | |||
void AddParticle(int id, vec3 pos, vec3 vel); | |||
protected: | |||
virtual void TickGame(float deltams); | |||
@@ -28,7 +28,7 @@ class FontData | |||
private: | |||
char *name; | |||
int tiler; | |||
int2 size; | |||
vec2i size; | |||
}; | |||
/* | |||
@@ -64,7 +64,7 @@ char const *Font::GetName() | |||
return data->name; | |||
} | |||
void Font::Print(int3 pos, char const *str) | |||
void Font::Print(vec3i pos, char const *str) | |||
{ | |||
Scene *scene = Scene::GetDefault(); | |||
@@ -80,7 +80,7 @@ void Font::Print(int3 pos, char const *str) | |||
} | |||
} | |||
int2 Font::GetSize() const | |||
vec2i Font::GetSize() const | |||
{ | |||
return data->size; | |||
} | |||
@@ -33,8 +33,8 @@ protected: | |||
public: | |||
/* New methods */ | |||
void Print(int3 pos, char const *str); | |||
int2 GetSize() const; | |||
void Print(vec3i pos, char const *str); | |||
vec2i GetSize() const; | |||
private: | |||
FontData *data; | |||
@@ -37,8 +37,8 @@ public: | |||
{ } | |||
private: | |||
int2 mouse; | |||
int3 buttons; | |||
vec2i mouse; | |||
vec3i buttons; | |||
static int const MAX_ENTITIES = 100; | |||
WorldEntity *entities[MAX_ENTITIES]; | |||
@@ -53,10 +53,10 @@ static InputData * const data = &inputdata; | |||
* Public Input class | |||
*/ | |||
float2 Input::GetAxis(int axis) | |||
vec2 Input::GetAxis(int axis) | |||
{ | |||
float invsqrt2 = sqrtf(0.5f); | |||
float2 f; | |||
vec2 f; | |||
/* Simulate a joystick using the keyboard. This SDL call is free. */ | |||
Uint8 *keystate = SDL_GetKeyState(NULL); | |||
@@ -70,12 +70,12 @@ float2 Input::GetAxis(int axis) | |||
return f; | |||
} | |||
int2 Input::GetMousePos() | |||
vec2i Input::GetMousePos() | |||
{ | |||
return data->mouse; | |||
} | |||
int3 Input::GetMouseButtons() | |||
vec3i Input::GetMouseButtons() | |||
{ | |||
return data->buttons; | |||
} | |||
@@ -101,7 +101,7 @@ void Input::UntrackMouse(WorldEntity *e) | |||
} | |||
} | |||
void Input::SetMousePos(int2 coord) | |||
void Input::SetMousePos(vec2i coord) | |||
{ | |||
data->mouse = coord; | |||
@@ -123,7 +123,7 @@ void Input::SetMousePos(int2 coord) | |||
{ | |||
if (data->entities[n] == best) | |||
{ | |||
data->entities[n]->mousepos = (int2)((int3)coord - best->bbox[0]); | |||
data->entities[n]->mousepos = (vec2i)((vec3i)coord - best->bbox[0]); | |||
if (best != data->lastfocus) | |||
data->entities[n]->pressed = data->buttons; | |||
else | |||
@@ -131,7 +131,7 @@ void Input::SetMousePos(int2 coord) | |||
} | |||
else | |||
{ | |||
data->entities[n]->mousepos = int2(-1); | |||
data->entities[n]->mousepos = vec2i(-1); | |||
/* FIXME */ | |||
data->entities[n]->released = 0; | |||
data->entities[n]->pressed = 0; | |||
@@ -24,16 +24,16 @@ class Input | |||
{ | |||
public: | |||
/* These methods are general queries */ | |||
static float2 GetAxis(int axis); | |||
static int2 GetMousePos(); | |||
static int3 GetMouseButtons(); | |||
static vec2 GetAxis(int axis); | |||
static vec2i GetMousePos(); | |||
static vec3i GetMouseButtons(); | |||
/* Entities can subscribe to events */ | |||
static void TrackMouse(WorldEntity *e); | |||
static void UntrackMouse(WorldEntity *e); | |||
/* These methods are called by the underlying input listeners */ | |||
static void SetMousePos(int2 coord); | |||
static void SetMousePos(vec2i coord); | |||
static void SetMouseButton(int index); | |||
static void UnsetMouseButton(int index); | |||
}; | |||
@@ -27,7 +27,7 @@ static inline float det3(float a, float b, float c, | |||
+ c * (d * h - g * e); | |||
} | |||
static inline float cofact3(float4x4 const &mat, int i, int j) | |||
static inline float cofact3(mat4 const &mat, int i, int j) | |||
{ | |||
return det3(mat[(i + 1) & 3][(j + 1) & 3], | |||
mat[(i + 2) & 3][(j + 1) & 3], | |||
@@ -40,7 +40,7 @@ static inline float cofact3(float4x4 const &mat, int i, int j) | |||
mat[(i + 3) & 3][(j + 3) & 3]) * (((i + j) & 1) ? -1.0f : 1.0f); | |||
} | |||
template<> float float4x4::det() const | |||
template<> float mat4::det() const | |||
{ | |||
float ret = 0; | |||
for (int n = 0; n < 4; n++) | |||
@@ -48,9 +48,9 @@ template<> float float4x4::det() const | |||
return ret; | |||
} | |||
template<> float4x4 float4x4::invert() const | |||
template<> mat4 mat4::invert() const | |||
{ | |||
float4x4 ret; | |||
mat4 ret; | |||
float d = det(); | |||
if (d) | |||
{ | |||
@@ -62,14 +62,14 @@ template<> float4x4 float4x4::invert() const | |||
return ret; | |||
} | |||
template<> float4x4 float4x4::ortho(float left, float right, float bottom, | |||
float top, float near, float far) | |||
template<> mat4 mat4::ortho(float left, float right, float bottom, | |||
float top, float near, float far) | |||
{ | |||
float invrl = (right != left) ? 1.0f / (right - left) : 0.0f; | |||
float invtb = (top != bottom) ? 1.0f / (top - bottom) : 0.0f; | |||
float invfn = (far != near) ? 1.0f / (far - near) : 0.0f; | |||
float4x4 ret(0.0f); | |||
mat4 ret(0.0f); | |||
ret[0][0] = 2.0f * invrl; | |||
ret[1][1] = 2.0f * invtb; | |||
ret[2][2] = -2.0f * invfn; | |||
@@ -80,14 +80,14 @@ template<> float4x4 float4x4::ortho(float left, float right, float bottom, | |||
return ret; | |||
} | |||
template<> float4x4 float4x4::frustum(float left, float right, float bottom, | |||
float top, float near, float far) | |||
template<> mat4 mat4::frustum(float left, float right, float bottom, | |||
float top, float near, float far) | |||
{ | |||
float invrl = (right != left) ? 1.0f / (right - left) : 0.0f; | |||
float invtb = (top != bottom) ? 1.0f / (top - bottom) : 0.0f; | |||
float invfn = (far != near) ? 1.0f / (far - near) : 0.0f; | |||
float4x4 ret(0.0f); | |||
mat4 ret(0.0f); | |||
ret[0][0] = 2.0f * near * invrl; | |||
ret[1][1] = 2.0f * near * invtb; | |||
ret[2][0] = (right + left) * invrl; | |||
@@ -98,8 +98,8 @@ template<> float4x4 float4x4::frustum(float left, float right, float bottom, | |||
return ret; | |||
} | |||
template<> float4x4 float4x4::perspective(float theta, float width, | |||
float height, float near, float far) | |||
template<> mat4 mat4::perspective(float theta, float width, | |||
float height, float near, float far) | |||
{ | |||
float t1 = tanf(theta / 2.0f); | |||
float t2 = t1 * height / width; | |||
@@ -107,16 +107,16 @@ template<> float4x4 float4x4::perspective(float theta, float width, | |||
return frustum(-near * t1, near * t1, -near * t2, near * t2, near, far); | |||
} | |||
template<> float4x4 float4x4::translate(float x, float y, float z) | |||
template<> mat4 mat4::translate(float x, float y, float z) | |||
{ | |||
float4x4 ret(1.0f); | |||
mat4 ret(1.0f); | |||
ret[3][0] = x; | |||
ret[3][1] = y; | |||
ret[3][2] = z; | |||
return ret; | |||
} | |||
template<> float4x4 float4x4::rotate(float theta, float x, float y, float z) | |||
template<> mat4 mat4::rotate(float theta, float x, float y, float z) | |||
{ | |||
float st = sinf(theta); | |||
float ct = cosf(theta); | |||
@@ -131,7 +131,7 @@ template<> float4x4 float4x4::rotate(float theta, float x, float y, float z) | |||
float mty = (1.0f - ct) * y; | |||
float mtz = (1.0f - ct) * z; | |||
float4x4 ret(1.0f); | |||
mat4 ret(1.0f); | |||
ret[0][0] = x * mtx + ct; | |||
ret[0][1] = x * mty + st * z; | |||
@@ -278,15 +278,5 @@ template <typename T> struct Mat4 | |||
typedef Mat4<float> mat4; | |||
typedef Mat4<int> mat4i; | |||
/* Aliases for deprecated stuff */ | |||
typedef Vec2<float> float2; | |||
typedef Vec2<int> int2; | |||
typedef Vec3<float> float3; | |||
typedef Vec3<int> int3; | |||
typedef Vec4<float> float4; | |||
typedef Vec4<int> int4; | |||
typedef Mat4<float> float4x4; | |||
typedef Mat4<int> int4x4; | |||
#endif // __DH_MATRIX_H__ | |||
@@ -38,7 +38,7 @@ struct Tile | |||
#if LOL_EXPERIMENTAL | |||
extern Shader *stdshader; | |||
#endif | |||
extern float4x4 projection_matrix, view_matrix, model_matrix; | |||
extern mat4 projection_matrix, view_matrix, model_matrix; | |||
/* | |||
* Scene implementation class | |||
@@ -136,15 +136,15 @@ void Scene::Render() // XXX: rename to Blit() | |||
qsort(data->tiles, data->ntiles, sizeof(Tile), SceneData::Compare); | |||
// XXX: debug stuff | |||
model_matrix = float4x4::translate(320.0f, 240.0f, 0.0f); | |||
model_matrix *= float4x4::rotate(-data->angle, 1.0f, 0.0f, 0.0f); | |||
model_matrix = mat4::translate(320.0f, 240.0f, 0.0f); | |||
model_matrix *= mat4::rotate(-data->angle, 1.0f, 0.0f, 0.0f); | |||
#if 0 | |||
static float f = 0.0f; | |||
f += 0.01f; | |||
model_matrix *= float4x4::rotate(0.1f * sinf(f), 1.0f, 0.0f, 0.0f); | |||
model_matrix *= float4x4::rotate(0.3f * cosf(f), 0.0f, 0.0f, 1.0f); | |||
model_matrix *= mat4::rotate(0.1f * sinf(f), 1.0f, 0.0f, 0.0f); | |||
model_matrix *= mat4::rotate(0.3f * cosf(f), 0.0f, 0.0f, 1.0f); | |||
#endif | |||
model_matrix *= float4x4::translate(-320.0f, -240.0f, 0.0f); | |||
model_matrix *= mat4::translate(-320.0f, -240.0f, 0.0f); | |||
// XXX: end of debug stuff | |||
#if LOL_EXPERIMENTAL | |||
@@ -48,7 +48,7 @@ void SdlInput::TickGame(float deltams) | |||
Entity::TickGame(deltams); | |||
/* Handle mouse input */ | |||
int2 mouse; | |||
vec2i mouse; | |||
if (SDL_GetAppState() & SDL_APPMOUSEFOCUS) | |||
{ | |||
SDL_GetMouseState(&mouse.x, &mouse.y); | |||
@@ -29,7 +29,7 @@ class TextData | |||
private: | |||
int font, align, length; | |||
char *text; | |||
int3 pos; | |||
vec3i pos; | |||
}; | |||
/* | |||
@@ -42,7 +42,7 @@ Text::Text(char const *text, char const *font) | |||
data->font = Forge::Register(font); | |||
data->text = text ? strdup(text) : NULL; | |||
data->length = text ? strlen(text) : 0; | |||
data->pos = int3(0, 0, 0); | |||
data->pos = vec3i(0, 0, 0); | |||
drawgroup = DRAWGROUP_HUD; | |||
} | |||
@@ -65,7 +65,7 @@ void Text::SetInt(int val) | |||
data->length = strlen(text); | |||
} | |||
void Text::SetPos(int3 pos) | |||
void Text::SetPos(vec3i pos) | |||
{ | |||
data->pos = pos; | |||
} | |||
@@ -82,7 +82,7 @@ void Text::TickDraw(float deltams) | |||
if (data->text) | |||
{ | |||
Font *font = Forge::GetFont(data->font); | |||
int3 delta = 0; | |||
vec3i delta = 0; | |||
if (data->align == ALIGN_RIGHT) | |||
delta.x -= data->length * font->GetSize().x; | |||
else if (data->align == ALIGN_CENTER) | |||
@@ -28,7 +28,7 @@ public: | |||
void SetText(char const *text); | |||
void SetInt(int val); | |||
void SetPos(int3 pos); | |||
void SetPos(vec3i pos); | |||
void SetAlign(int align); | |||
enum | |||
@@ -45,7 +45,7 @@ static TilerData * const data = &tilerdata; | |||
* Public Tiler class | |||
*/ | |||
int Tiler::Register(char const *path, int2 size, int2 count, float dilate) | |||
int Tiler::Register(char const *path, vec2i size, vec2i count, float dilate) | |||
{ | |||
int id = data->tilesets.MakeSlot(path); | |||
@@ -67,7 +67,7 @@ void Tiler::Deregister(int id) | |||
data->tilesets.RemoveSlot(id - 1); /* ID 0 is for the empty tileset */ | |||
} | |||
int2 Tiler::GetSize(int id) | |||
vec2i Tiler::GetSize(int id) | |||
{ | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id - 1); | |||
#if !LOL_RELEASE | |||
@@ -80,7 +80,7 @@ int2 Tiler::GetSize(int id) | |||
return tileset->GetSize(); | |||
} | |||
int2 Tiler::GetCount(int id) | |||
vec2i Tiler::GetCount(int id) | |||
{ | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id - 1); | |||
#if !LOL_RELEASE | |||
@@ -22,11 +22,12 @@ | |||
class Tiler | |||
{ | |||
public: | |||
static int Register(char const *path, int2 size, int2 count, float dilate); | |||
static int Register(char const *path, vec2i size, vec2i count, | |||
float dilate); | |||
static void Deregister(int id); | |||
static int2 GetSize(int id); | |||
static int2 GetCount(int id); | |||
static vec2i GetSize(int id); | |||
static vec2i GetCount(int id); | |||
static void Bind(uint32_t code); | |||
static void BlitTile(uint32_t code, int x, int y, int z, int o, | |||
float *vertex, float *texture); | |||
@@ -42,7 +42,7 @@ class TileSetData | |||
private: | |||
char *name, *path; | |||
int *tiles, ntiles; | |||
int2 size, count; | |||
vec2i size, count; | |||
float dilate, tx, ty; | |||
SDL_Surface *img; | |||
@@ -53,7 +53,7 @@ private: | |||
* Public TileSet class | |||
*/ | |||
TileSet::TileSet(char const *path, int2 size, int2 count, float dilate) | |||
TileSet::TileSet(char const *path, vec2i size, vec2i count, float dilate) | |||
: data(new TileSetData()) | |||
{ | |||
data->name = (char *)malloc(10 + strlen(path) + 1); | |||
@@ -80,7 +80,7 @@ TileSet::TileSet(char const *path, int2 size, int2 count, float dilate) | |||
if (count.i > 0 && count.j > 0) | |||
{ | |||
data->count = count; | |||
data->size = int2(data->img->w, data->img->h) / count; | |||
data->size = vec2i(data->img->w, data->img->h) / count; | |||
} | |||
else | |||
{ | |||
@@ -157,12 +157,12 @@ char const *TileSet::GetName() | |||
return data->name; | |||
} | |||
int2 TileSet::GetSize() const | |||
vec2i TileSet::GetSize() const | |||
{ | |||
return data->size; | |||
} | |||
int2 TileSet::GetCount() const | |||
vec2i TileSet::GetCount() const | |||
{ | |||
return data->count; | |||
} | |||
@@ -28,7 +28,7 @@ class TileSetData; | |||
class TileSet : public Entity | |||
{ | |||
public: | |||
TileSet(char const *path, int2 size, int2 count, float dilate); | |||
TileSet(char const *path, vec2i size, vec2i count, float dilate); | |||
virtual ~TileSet(); | |||
protected: | |||
@@ -38,8 +38,8 @@ protected: | |||
public: | |||
/* New methods */ | |||
int2 GetSize() const; | |||
int2 GetCount() const; | |||
vec2i GetSize() const; | |||
vec2i GetCount() const; | |||
void Bind(); | |||
void BlitTile(uint32_t id, int x, int y, int z, int o, | |||
float *vertex, float *texture); | |||
@@ -31,7 +31,7 @@ | |||
#if LOL_EXPERIMENTAL | |||
Shader *stdshader; | |||
#endif | |||
float4x4 projection_matrix, view_matrix, model_matrix; | |||
mat4 projection_matrix, view_matrix, model_matrix; | |||
#if LOL_EXPERIMENTAL | |||
static char const *vertexshader = | |||
@@ -92,7 +92,7 @@ void Video::SetFov(float theta) | |||
{ | |||
#undef near /* Fuck Microsoft */ | |||
#undef far /* Fuck Microsoft again */ | |||
float4x4 proj; | |||
mat4 proj; | |||
float width = GetWidth(); | |||
float height = GetHeight(); | |||
@@ -103,7 +103,7 @@ void Video::SetFov(float theta) | |||
if (theta < 1e-4f) | |||
{ | |||
/* The easy way: purely orthogonal projection. */ | |||
proj = float4x4::ortho(0, width, 0, height, near, far); | |||
proj = mat4::ortho(0, width, 0, height, near, far); | |||
} | |||
else | |||
{ | |||
@@ -123,14 +123,14 @@ void Video::SetFov(float theta) | |||
near = 1.0f; | |||
} | |||
proj = float4x4::frustum(-near * t1, near * t1, | |||
-near * t2, near * t2, near, far) | |||
* float4x4::translate(-0.5f * width, -0.5f * height, -dist); | |||
proj = mat4::frustum(-near * t1, near * t1, | |||
-near * t2, near * t2, near, far) | |||
* mat4::translate(-0.5f * width, -0.5f * height, -dist); | |||
} | |||
#if LOL_EXPERIMENTAL | |||
projection_matrix = proj; | |||
view_matrix = float4x4(1.0f); | |||
view_matrix = mat4(1.0f); | |||
#else | |||
glMatrixMode(GL_PROJECTION); | |||
glLoadIdentity(); | |||
@@ -21,14 +21,14 @@ | |||
class WorldEntity : public Entity | |||
{ | |||
public: | |||
float3 position; | |||
float3 rotation; | |||
float3 velocity; | |||
float3 bbox[2]; | |||
int2 mousepos; | |||
int3 mousebuttons; | |||
int3 pressed, clicked, released; | |||
vec3 position; | |||
vec3 rotation; | |||
vec3 velocity; | |||
vec3 bbox[2]; | |||
vec2i mousepos; | |||
vec3i mousebuttons; | |||
vec3i pressed, clicked, released; | |||
protected: | |||
WorldEntity(); | |||
@@ -32,15 +32,15 @@ public: | |||
void setUp() | |||
{ | |||
identity = float4x4(1.0f); | |||
triangular = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f), | |||
float4(7.0f, 2.0f, 0.0f, 0.0f), | |||
float4(1.0f, 5.0f, 3.0f, 0.0f), | |||
float4(8.0f, 9.0f, 2.0f, 4.0f)); | |||
invertible = float4x4(float4( 1.0f, 1.0f, 2.0f, -1.0f), | |||
float4(-2.0f, -1.0f, -2.0f, 2.0f), | |||
float4( 4.0f, 2.0f, 5.0f, -4.0f), | |||
float4( 5.0f, -3.0f, -7.0f, -6.0f)); | |||
identity = mat4(1.0f); | |||
triangular = mat4(vec4(1.0f, 0.0f, 0.0f, 0.0f), | |||
vec4(7.0f, 2.0f, 0.0f, 0.0f), | |||
vec4(1.0f, 5.0f, 3.0f, 0.0f), | |||
vec4(8.0f, 9.0f, 2.0f, 4.0f)); | |||
invertible = mat4(vec4( 1.0f, 1.0f, 2.0f, -1.0f), | |||
vec4(-2.0f, -1.0f, -2.0f, 2.0f), | |||
vec4( 4.0f, 2.0f, 5.0f, -4.0f), | |||
vec4( 5.0f, -3.0f, -7.0f, -6.0f)); | |||
} | |||
void tearDown() {} | |||
@@ -55,9 +55,9 @@ public: | |||
void test_mat_mul() | |||
{ | |||
float4x4 m0 = identity; | |||
float4x4 m1 = identity; | |||
float4x4 m2 = m0 * m1; | |||
mat4 m0 = identity; | |||
mat4 m1 = identity; | |||
mat4 m2 = m0 * m1; | |||
CPPUNIT_ASSERT(m2[0][0] == 1.0f); | |||
CPPUNIT_ASSERT(m2[1][0] == 0.0f); | |||
@@ -82,10 +82,10 @@ public: | |||
void test_mat_inv() | |||
{ | |||
float4x4 m0 = invertible; | |||
float4x4 m1 = m0.invert(); | |||
mat4 m0 = invertible; | |||
mat4 m1 = m0.invert(); | |||
float4x4 m2 = m0 * m1; | |||
mat4 m2 = m0 * m1; | |||
CPPUNIT_ASSERT(m2[0][0] == 1.0f); | |||
CPPUNIT_ASSERT(m2[1][0] == 0.0f); | |||
@@ -109,7 +109,7 @@ public: | |||
} | |||
private: | |||
float4x4 triangular, identity, invertible; | |||
mat4 triangular, identity, invertible; | |||
}; | |||
CPPUNIT_TEST_SUITE_REGISTRATION(MatrixTest); | |||