Initialisierung des GIT-Repositorys
This commit is contained in:
commit
9de0171fc5
|
@ -0,0 +1,2 @@
|
|||
*.o
|
||||
*.a
|
|
@ -0,0 +1,22 @@
|
|||
COMPILER = g++
|
||||
OBJECTS = emath.o emath_opengl.o glcolor.o gldrawhelper.o glfontengine.o glrect.o gltexture.o matrix.o quaternion.o rotationsmatrix.o glgui/glgui.a
|
||||
VERSION = 0.0.1
|
||||
|
||||
|
||||
sgllib: $(OBJECTS)
|
||||
|
||||
sglar: $(OBJECTS)
|
||||
rm -f sgllib.a
|
||||
ar rfc sgllib.a $(OBJECTS)
|
||||
|
||||
%.o: %.cpp %.h
|
||||
$(COMPILER) -c `sdl-config --cflags` $<
|
||||
|
||||
|
||||
glgui/glgui.a:
|
||||
cd glgui; $(MAKE);
|
||||
|
||||
clean:
|
||||
rm -f $(OBJECTS)
|
||||
cd glgui; $(MAKE) clean
|
||||
@echo Done cleaning...
|
|
@ -0,0 +1,243 @@
|
|||
#include "emath.h"
|
||||
|
||||
Punkt3D::Punkt3D() {
|
||||
x = y = z = 0.0f;
|
||||
}
|
||||
|
||||
Punkt3D::Punkt3D(float _x, float _y, float _z) {
|
||||
set(_x, _y, _z);
|
||||
}
|
||||
|
||||
void Punkt3D::set(float _x, float _y, float _z) {
|
||||
x = _x;
|
||||
y = _y;
|
||||
z = _z;
|
||||
}
|
||||
|
||||
float Punkt3D::abs() {
|
||||
return sqrt(x*x+y*y+z*z);
|
||||
}
|
||||
|
||||
Punkt3D Punkt3D::kreuzprodukt(const Punkt3D &b) {
|
||||
Punkt3D erg;
|
||||
erg.x = y*b.z - z*b.y;
|
||||
erg.y = z*b.x - x*b.z;
|
||||
erg.z = x*b.y - y*b.x;
|
||||
|
||||
return erg;
|
||||
}
|
||||
|
||||
void Punkt3D::normalize() {
|
||||
float a = abs();
|
||||
x /= a;
|
||||
y /= a;
|
||||
z /= a;
|
||||
}
|
||||
|
||||
Punkt3D Punkt3D::getNormalized() {
|
||||
Punkt3D ret(*this);
|
||||
ret.normalize();
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool Punkt3D::isNormalized() {
|
||||
return (abs()==1);
|
||||
}
|
||||
|
||||
float Punkt3D::calcAngle(Punkt3D b) {
|
||||
if(abs()*b.abs()==0.0f)
|
||||
return 0.0f;
|
||||
return rad2deg(std::acos(((*this)*b)/(abs()*b.abs())));
|
||||
}
|
||||
|
||||
Punkt3D Punkt3D::getOrtographic() {
|
||||
Punkt3D erg;
|
||||
if(!x) {
|
||||
erg.x = 0.0f;
|
||||
erg.y = z;
|
||||
erg.z = -y;
|
||||
} else if(!y) {
|
||||
erg.x = z;
|
||||
erg.y = 0;
|
||||
erg.z = -x;
|
||||
} else {
|
||||
// z, oder genereller fall
|
||||
erg.x = y;
|
||||
erg.y = -x;
|
||||
erg.z = 0.0f;
|
||||
}
|
||||
return erg;
|
||||
}
|
||||
|
||||
void Punkt3D::print(std::string coordname) {
|
||||
if(coordname!="")
|
||||
coordname.append(" ");
|
||||
std::cout << coordname << "Coord: (" << x << ", " << y << ", " << z << ")" << std::endl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Punkt3D Punkt3D::operator+(const Punkt3D &b) {
|
||||
Punkt3D c;
|
||||
c.x = x + b.x;
|
||||
c.y = y + b.y;
|
||||
c.z = z + b.z;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
Punkt3D Punkt3D::operator-(const Punkt3D &b) {
|
||||
Punkt3D c;
|
||||
c.x = x - b.x;
|
||||
c.y = y - b.y;
|
||||
c.z = z - b.z;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
Punkt3D& Punkt3D::operator+=(const Punkt3D &b) {
|
||||
x += b.x;
|
||||
y += b.y;
|
||||
z += b.z;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
Punkt3D& Punkt3D::operator-=(const Punkt3D &b) {
|
||||
x -= b.x;
|
||||
y -= b.y;
|
||||
z -= b.z;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
Punkt3D Punkt3D::operator+(const float &_m) {
|
||||
return Punkt3D(x+_m, y+_m, z+_m);
|
||||
}
|
||||
|
||||
Punkt3D Punkt3D::operator-(const float &_m) {
|
||||
return Punkt3D(x-_m, y-_m, z-_m);
|
||||
}
|
||||
|
||||
Punkt3D Punkt3D::operator*(const float &_m) {
|
||||
return Punkt3D(x*_m, y*_m, z*_m);
|
||||
}
|
||||
|
||||
Punkt3D Punkt3D::operator/(const float &_m) {
|
||||
return Punkt3D(x/_m, y/_m, z/_m);
|
||||
}
|
||||
|
||||
Punkt3D& Punkt3D::operator+=(const float &_m) {
|
||||
x += _m;
|
||||
y += _m;
|
||||
z += _m;
|
||||
return *this;
|
||||
}
|
||||
Punkt3D& Punkt3D::operator-=(const float &_m) {
|
||||
x -= _m;
|
||||
y -= _m;
|
||||
z -= _m;
|
||||
return *this;
|
||||
}
|
||||
Punkt3D& Punkt3D::operator*=(const float &_m) {
|
||||
x *= _m;
|
||||
y *= _m;
|
||||
z *= _m;
|
||||
return *this;
|
||||
}
|
||||
Punkt3D& Punkt3D::operator/=(const float &_m) {
|
||||
x /= _m;
|
||||
y /= _m;
|
||||
z /= _m;
|
||||
return *this;
|
||||
}
|
||||
|
||||
float Punkt3D::operator*(const Punkt3D& _m) {
|
||||
return x * _m.x + y * _m.y + z * _m.z;
|
||||
}
|
||||
|
||||
Punkt3D Punkt3D::operator-() {
|
||||
return Punkt3D(-x, -y, -z);
|
||||
}
|
||||
|
||||
bool Punkt3D::operator==(const Punkt3D& b) {
|
||||
return ( x==b.x && y==b.y && z==b.z);
|
||||
}
|
||||
bool Punkt3D::operator!=(const Punkt3D& b) {
|
||||
return !(*this==b);
|
||||
}
|
||||
// Freunde
|
||||
|
||||
Punkt3D operator+(const float& _m, const Punkt3D& b) {
|
||||
return Punkt3D(b.x+_m, b.y+_m, b.z+_m);
|
||||
}
|
||||
|
||||
Punkt3D operator-(const float& _m, const Punkt3D& b) {
|
||||
return Punkt3D(b.x-_m, b.y-_m, b.z-_m);
|
||||
}
|
||||
|
||||
Punkt3D operator*(const float& _m, const Punkt3D& b) {
|
||||
return Punkt3D(b.x*_m, b.y*_m, b.z*_m);
|
||||
}
|
||||
|
||||
Punkt3D operator/(const float& _m, const Punkt3D& b) {
|
||||
return Punkt3D(b.x/_m, b.y/_m, b.z/_m);
|
||||
}
|
||||
|
||||
float abs(Punkt3D p) {
|
||||
return p.abs();
|
||||
}
|
||||
|
||||
// OpenGL Funktionen für Punkt3D
|
||||
|
||||
void glVertex3f(Punkt3D p) {
|
||||
glVertex3f(p.x, p.y, p.z);
|
||||
}
|
||||
|
||||
void glTranslatef(Punkt3D p) {
|
||||
glTranslatef(p.x, p.y, p.z);
|
||||
}
|
||||
|
||||
void glNormal(Punkt3D p) {
|
||||
glNormal3f(p.x, p.y, p.z);
|
||||
}
|
||||
|
||||
void glRotatef(float deg, Punkt3D vec) {
|
||||
glRotatef(deg, vec.x, vec.y, vec.z);
|
||||
}
|
||||
|
||||
// Trigonometrische Funktionen
|
||||
|
||||
float deg2rad(float deg) {
|
||||
return (deg/180.0f)*3.1415926535897932384626433f;
|
||||
}
|
||||
|
||||
float rad2deg(float rad) {
|
||||
return (rad/3.1415926535897932384626433f)*180.0f;
|
||||
}
|
||||
|
||||
float ssin(float c) {
|
||||
int t=(int)c;
|
||||
if(t!=c)
|
||||
return sin(deg2rad(c));
|
||||
t = t % 360;
|
||||
if(t<0)
|
||||
t = 360 + t;
|
||||
switch(t) {
|
||||
case 0:
|
||||
return 0.0f;
|
||||
case 90:
|
||||
return 1.0f;
|
||||
case 180:
|
||||
return 0.0f;
|
||||
case 270:
|
||||
return -1.0f;
|
||||
default:
|
||||
// std::cout << "ssin sollte keinen defaultwert zurückliefern. c=" << c << ", t=" << t << std::endl;
|
||||
return sin(deg2rad(c));
|
||||
}
|
||||
}
|
||||
|
||||
float scos(float c) {
|
||||
return ssin(c+90.0f);
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
#ifndef __EMATH_H
|
||||
#define __EMATH_H
|
||||
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <SDL_opengl.h>
|
||||
|
||||
class Punkt3D {
|
||||
public:
|
||||
Punkt3D();
|
||||
Punkt3D(float, float, float);
|
||||
|
||||
float x, y, z;
|
||||
|
||||
void set(float, float, float);
|
||||
float abs();
|
||||
Punkt3D kreuzprodukt(const Punkt3D&);
|
||||
void normalize();
|
||||
Punkt3D getNormalized();
|
||||
bool isNormalized();
|
||||
float calcAngle(Punkt3D);
|
||||
Punkt3D getOrtographic();
|
||||
|
||||
void print(std::string="");
|
||||
|
||||
|
||||
// Operatoren
|
||||
Punkt3D operator+(const Punkt3D&);
|
||||
Punkt3D operator-(const Punkt3D&);
|
||||
Punkt3D& operator+=(const Punkt3D&);
|
||||
Punkt3D& operator-=(const Punkt3D&);
|
||||
|
||||
Punkt3D operator+(const float&);
|
||||
Punkt3D operator-(const float&);
|
||||
Punkt3D operator*(const float&);
|
||||
Punkt3D operator/(const float&);
|
||||
Punkt3D& operator+=(const float&);
|
||||
Punkt3D& operator-=(const float&);
|
||||
Punkt3D& operator*=(const float&);
|
||||
Punkt3D& operator/=(const float&);
|
||||
|
||||
float operator*(const Punkt3D&);
|
||||
|
||||
Punkt3D operator-();
|
||||
|
||||
bool operator==(const Punkt3D&);
|
||||
bool operator!=(const Punkt3D&);
|
||||
|
||||
friend Punkt3D operator+(const float&, const Punkt3D&);
|
||||
friend Punkt3D operator-(const float&, const Punkt3D&);
|
||||
friend Punkt3D operator*(const float&, const Punkt3D&);
|
||||
friend Punkt3D operator/(const float&, const Punkt3D&);
|
||||
};
|
||||
|
||||
float abs(Punkt3D);
|
||||
|
||||
// OpenGL-Funktionen für Punkt3D
|
||||
|
||||
void glVertex3f(Punkt3D);
|
||||
void glTranslatef(Punkt3D);
|
||||
void glNormal3f(Punkt3D);
|
||||
|
||||
void glRotatef(float, Punkt3D);
|
||||
|
||||
float deg2rad(float deg);
|
||||
float rad2deg(float rad);
|
||||
|
||||
|
||||
|
||||
// *grml* scheiss cmath-sinus
|
||||
float ssin(float);
|
||||
float scos(float);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,46 @@
|
|||
#include "emath_opengl.h"
|
||||
|
||||
void rotFrom2VecTo2Vec(Punkt3D a, Punkt3D b, Punkt3D c, Punkt3D d, Punkt3D *rvec, float *rvecdeg, Punkt3D *rvec2, float *rvecdeg2) {
|
||||
Punkt3D rotvec, rotvec2, nullvec;
|
||||
float rotvecdeg = 0.0f, rotvecdeg2 = 0.0f;
|
||||
|
||||
rotvec = a.kreuzprodukt(b);
|
||||
rotvecdeg = a.calcAngle(b);
|
||||
if(std::abs(rotvecdeg)==180.0f) {
|
||||
rotvec = a.getOrtographic();
|
||||
}
|
||||
|
||||
if(rotvec==nullvec) {
|
||||
rotvec.set(1.0f, 0.0f, 0.0f);
|
||||
rotvecdeg = 0.0f;
|
||||
}
|
||||
|
||||
Rotationsmatrix rotnobj(rotvec, -rotvecdeg);
|
||||
c = Rotationsmatrix(rotvec, rotvecdeg) * c;
|
||||
|
||||
rotvec2 = c.kreuzprodukt(d);
|
||||
rotvecdeg2 = c.calcAngle(d);
|
||||
if(std::abs(rotvecdeg2)==180.0f) {
|
||||
rotvec2 = b;
|
||||
}
|
||||
|
||||
if(rotvec2==nullvec) {
|
||||
rotvec2.set(1.0f, 0.0f, 0.0f);
|
||||
rotvecdeg2 = 0.0f;
|
||||
}
|
||||
|
||||
rotvec2 = rotnobj * rotvec2;
|
||||
|
||||
*rvec = rotvec;
|
||||
*rvecdeg = rotvecdeg;
|
||||
*rvec2 = rotvec2;
|
||||
*rvecdeg2 = rotvecdeg2;
|
||||
}
|
||||
|
||||
void rotFrom2VecTo2Vec(Punkt3D a, Punkt3D b, Punkt3D c, Punkt3D d) {
|
||||
Punkt3D rvec, rvec2;
|
||||
float rvecdeg, rvecdeg2;
|
||||
rotFrom2VecTo2Vec(a, b, c, d, &rvec, &rvecdeg, &rvec2, &rvecdeg2);
|
||||
glRotatef(rvecdeg, rvec);
|
||||
glRotatef(rvecdeg2, rvec2);
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#ifndef __EMATH_OPENGL
|
||||
#define __EMATH_OPENGL
|
||||
|
||||
#include <cmath>
|
||||
#include "emath.h"
|
||||
#include "rotationsmatrix.h"
|
||||
#include <SDL_opengl.h>
|
||||
|
||||
void rotFrom2VecTo2Vec(Punkt3D a, Punkt3D b, Punkt3D c, Punkt3D d, Punkt3D *, float *, Punkt3D *, float *);
|
||||
void rotFrom2VecTo2Vec(Punkt3D a, Punkt3D b, Punkt3D c, Punkt3D d);
|
||||
#endif
|
|
@ -0,0 +1,30 @@
|
|||
#include "glcolor.h"
|
||||
|
||||
GLColor::GLColor() {
|
||||
set(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
setalpha = true;
|
||||
}
|
||||
|
||||
GLColor::GLColor(const SDL_Color &c) {
|
||||
set(c.r/255.0f, c.g/255.0f, c.b/255.0f);
|
||||
setalpha = true;
|
||||
}
|
||||
|
||||
void GLColor::set(float _r, float _g, float _b, float _a) {
|
||||
r = _r;
|
||||
g = _g;
|
||||
b = _b;
|
||||
a = _a;
|
||||
}
|
||||
|
||||
SDL_Color GLColor::getSDLColor() {
|
||||
SDL_Color c = {(Uint8)(r*255.0f), (Uint8)(g*255), (Uint8)(b*255), (Uint8)(a*255)};
|
||||
}
|
||||
|
||||
void glColorGLC(GLColor c) {
|
||||
if(c.setalpha) {
|
||||
glColor4f(c.r, c.g, c.b, c.a);
|
||||
} else {
|
||||
glColor3f(c.r, c.g, c.b);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
#ifndef __GLCOLOR_H
|
||||
#define __GLCOLOR_H
|
||||
|
||||
#include <SDL.h>
|
||||
#include <SDL_opengl.h>
|
||||
|
||||
class GLColor {
|
||||
public:
|
||||
float r, g, b, a;
|
||||
bool setalpha;
|
||||
|
||||
|
||||
GLColor();
|
||||
GLColor(const SDL_Color&);
|
||||
|
||||
void set(float _r, float _g, float _b, float _a=1.0f);
|
||||
SDL_Color getSDLColor();
|
||||
};
|
||||
|
||||
void glColorGLC(GLColor c);
|
||||
// a) setalpha entscheiden lassen
|
||||
// b) zwei funktionen, eine setzt alpha mit in richtung 3f, 4f..
|
||||
|
||||
#endif
|
|
@ -0,0 +1,24 @@
|
|||
#include "gldrawhelper.h"
|
||||
|
||||
void GLDrawSDLRect(SDL_Rect *rect, GLRect *tex) {
|
||||
GLRect tmptex;
|
||||
if(tex) {
|
||||
tmptex = *tex;
|
||||
} else {
|
||||
tmptex.set(0.0f, 0.0f, 1.0f, 1.0f);
|
||||
}
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(tmptex.x, tmptex.y);
|
||||
glVertex2i(rect->x, rect->y+rect->h);
|
||||
|
||||
glTexCoord2f(tmptex.x+tmptex.w, tmptex.y);
|
||||
glVertex2i(rect->x+rect->w, rect->y+rect->h);
|
||||
|
||||
glTexCoord2f(tmptex.x+tmptex.w, tmptex.y+tmptex.h);
|
||||
glVertex2i(rect->x+rect->w, rect->y);
|
||||
|
||||
glTexCoord2f(tmptex.x, tmptex.y+tmptex.h);
|
||||
glVertex2i(rect->x, rect->y);
|
||||
glEnd();
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef __GLDRAWHELPER_H
|
||||
#define __GLDRAWHELPER_H
|
||||
|
||||
#include <SDL.h>
|
||||
#include <SDL_opengl.h>
|
||||
|
||||
#include "glrect.h"
|
||||
|
||||
void GLDrawSDLRect(SDL_Rect *rect, GLRect *tex=0);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,231 @@
|
|||
#include "glfontengine.h"
|
||||
|
||||
|
||||
bool GLFontEngine::addFont(std::string fontfile, std::string fontname) {
|
||||
GLFont *tmp = new GLFont(fontfile, 0.685f);
|
||||
if(!tmp->font->isLoaded()) {
|
||||
delete(tmp);
|
||||
std::cerr << fontfile << " konnte als Font nicht geladen werden" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
fontpool[fontname] = tmp;
|
||||
return false;
|
||||
}
|
||||
|
||||
void GLFontEngine::quit() {
|
||||
for(std::map<std::string, GLFont*>::iterator iter = fontpool.begin(); iter != fontpool.end(); iter++) {
|
||||
delete(iter->second); // unloaded texture.. der dtor
|
||||
fontpool.erase(iter);
|
||||
}
|
||||
}
|
||||
|
||||
void GLFontEngine::prepare2DbyPushingMatrix() {
|
||||
const SDL_Surface *screen = SDL_GetVideoSurface();
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
glOrtho(0, screen->w, screen->h, 0, -1, 1);
|
||||
// glOrtho(0, 640, 480, 0, -1, 1);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
||||
void GLFontEngine::regain3DbyPoppingMatrix() {
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPopMatrix();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
void GLFontEngine::paintSDLRect(SDL_Rect r) {
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0.0f, 1.0f);
|
||||
glVertex2i(r.x, r.y);
|
||||
|
||||
glTexCoord2f(0.0f, 0.0f);
|
||||
glVertex2i(r.x, r.y+r.h);
|
||||
|
||||
glTexCoord2f(1.0f, 0.0f);
|
||||
glVertex2i(r.x+r.w, r.y+r.h);
|
||||
|
||||
glTexCoord2f(1.0f, 1.0f);
|
||||
glVertex2i(r.x+r.w, r.y);
|
||||
|
||||
glEnd();
|
||||
}
|
||||
|
||||
GLFontEngine::GLFontEngine() {
|
||||
init();
|
||||
fontloaded = fontSelect("");
|
||||
}
|
||||
|
||||
GLFontEngine::GLFontEngine(std::string fontstr) {
|
||||
init();
|
||||
fontloaded = fontSelect(fontstr);
|
||||
}
|
||||
|
||||
void GLFontEngine::init() {
|
||||
// r = g = b = a = 1.0f;
|
||||
fsize = 16;
|
||||
}
|
||||
|
||||
void GLFontEngine::setColor(float _r, float _g, float _b, float _a) {
|
||||
// r = _r;
|
||||
// g = _g;
|
||||
// b = _b;
|
||||
// a = _a;
|
||||
col.set(_r, _g, _b, _a);
|
||||
}
|
||||
|
||||
void GLFontEngine::setColor(GLColor c) {
|
||||
col = c;
|
||||
}
|
||||
|
||||
bool GLFontEngine::fontSelect(std::string fontstr) {
|
||||
if(fontpool.size()==0) {
|
||||
fontloaded = false;
|
||||
return false;
|
||||
}
|
||||
fontloaded = true; // fontstr oder fallbackfont
|
||||
if(fontpool[fontstr])
|
||||
font = fontpool[fontstr];
|
||||
else {
|
||||
//fallbackfont - ersten aus der liste
|
||||
font = (fontpool.begin())->second;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void GLFontEngine::renderText(std::string text, SDL_Rect pos) {
|
||||
renderLine(text, pos);
|
||||
}
|
||||
|
||||
void GLFontEngine::renderLine(std::string text, SDL_Rect pos) {
|
||||
// glColor4f(r, g, b, a);
|
||||
glColorGLC(col);
|
||||
|
||||
if(fontloaded) {
|
||||
font->font->selectTexture();
|
||||
|
||||
float step = pos.w / (float)text.length();
|
||||
float tex_x, tex_y;
|
||||
float tex_len = (1.0f/16.0f);
|
||||
|
||||
for(unsigned int i=0; i<text.length(); i++) {
|
||||
int ch = text[i];
|
||||
if(ch<0) {
|
||||
ch += 256; // char geht wohl in machen fällen nur von -128 bis +127
|
||||
}
|
||||
// std::cout << (int)text[i] << " ";
|
||||
tex_x = ((ch-1)%16 / 16.0f);
|
||||
tex_y = 1.0f-(floor((ch-1)/16) / 16.0f)-tex_len;
|
||||
|
||||
// std::cout << text[i] << " == " << tex_x << ", " << tex_y << std::endl;
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(tex_x, tex_y+tex_len);
|
||||
glVertex2f(pos.x+i*step, pos.y);
|
||||
|
||||
glTexCoord2f(tex_x, tex_y);
|
||||
glVertex2f(pos.x+i*step, pos.y+pos.h);
|
||||
|
||||
glTexCoord2f(tex_x+tex_len, tex_y);
|
||||
glVertex2f(pos.x+(i+1)*step, pos.y+pos.h);
|
||||
|
||||
glTexCoord2f(tex_x+tex_len, tex_y+tex_len);
|
||||
glVertex2f(pos.x+(i+1)*step, pos.y);
|
||||
glEnd();
|
||||
}
|
||||
// std::cout << std::endl;
|
||||
} else {
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2f(pos.x, pos.y);
|
||||
glVertex2f(pos.x+pos.w, pos.y);
|
||||
glVertex2f(pos.x+pos.w, pos.y+pos.h);
|
||||
glVertex2f(pos.x, pos.y+pos.h);
|
||||
glEnd();
|
||||
}
|
||||
}
|
||||
|
||||
void GLFontEngine::renderLine(std::string str, int x, int y, bool center, SDL_Rect *rendered_to) {
|
||||
SDL_Rect m = { x, y, getTextWidth(str), fsize};
|
||||
if(center)
|
||||
m.x = m.x - m.w/2;
|
||||
|
||||
renderLine(str, m);
|
||||
|
||||
if(rendered_to)
|
||||
*rendered_to = m;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void GLFontEngine::renderLines(std::string str, int x, int y, bool center, SDL_Rect *rendered_to, int wrap, int paintbackground) {
|
||||
if(wrap) {
|
||||
// \n einfügen, wenns zu groß ist
|
||||
for(unsigned int i=0, a=0; i<str.length(); i++, a++) {
|
||||
if(str[i]!='\n') {
|
||||
if(a*font->charwidth*fsize>wrap) {
|
||||
str.insert(i, "\n");
|
||||
}
|
||||
} else {
|
||||
a=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(paintbackground) {
|
||||
std::cout << "Paint Background implementieren.. ;) " << std::endl;
|
||||
}
|
||||
|
||||
SDL_Rect m;
|
||||
int strlpos;
|
||||
int max_width = 0;
|
||||
int linecount = 0;
|
||||
std::string rstr;
|
||||
|
||||
while(str!="") {
|
||||
|
||||
if((strlpos = str.find('\n'))!=std::string::npos) {
|
||||
|
||||
rstr = str.substr(0, strlpos);
|
||||
str = str.substr(strlpos+1);
|
||||
} else {
|
||||
rstr = str;
|
||||
str = "";
|
||||
}
|
||||
renderLine(rstr, x, y+(int)(1.1*linecount*fsize), center, &m);
|
||||
|
||||
max_width = std::max(max_width, (int)m.w);
|
||||
linecount++;
|
||||
}
|
||||
|
||||
if(rendered_to) {
|
||||
m.w = max_width;
|
||||
m.y = y;
|
||||
*rendered_to = m;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void GLFontEngine::setSize(int s) {
|
||||
fsize = s;
|
||||
}
|
||||
|
||||
int GLFontEngine::getSize() {
|
||||
return fsize;
|
||||
}
|
||||
|
||||
void GLFontEngine::getSDLRect(const std::string &str, SDL_Rect *r) {
|
||||
r->w = getTextWidth(str);
|
||||
r->h = getSize();
|
||||
}
|
||||
|
||||
int GLFontEngine::getTextWidth(const std::string &moep) {
|
||||
return (int)(moep.length()*font->charwidth*fsize);
|
||||
}
|
||||
|
||||
std::map<std::string, GLFont*> GLFontEngine::fontpool;
|
|
@ -0,0 +1,70 @@
|
|||
#ifndef __GLFONTENGINE_H
|
||||
#define __GLFONTENGINE_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <cmath>
|
||||
|
||||
|
||||
#include <SDL.h>
|
||||
#include <SDL_opengl.h>
|
||||
#include "gltexture.h"
|
||||
#include "glcolor.h"
|
||||
|
||||
class GLFont {
|
||||
public:
|
||||
GLFont(std::string fontfile, float cwdth) {
|
||||
charwidth = cwdth;
|
||||
font = new GLTexture(fontfile);
|
||||
}
|
||||
~GLFont() {
|
||||
delete(font);
|
||||
}
|
||||
GLTexture* font;
|
||||
float charwidth;
|
||||
};
|
||||
|
||||
class GLFontEngine {
|
||||
private:
|
||||
static std::map<std::string, GLFont*> fontpool;
|
||||
|
||||
GLFont *font;
|
||||
bool fontloaded;
|
||||
GLColor col;
|
||||
// float r, g, b, a;
|
||||
int fsize;
|
||||
|
||||
void init();
|
||||
public:
|
||||
static bool addFont(std::string fontfile, std::string fontname);
|
||||
static void quit();
|
||||
|
||||
static void prepare2DbyPushingMatrix();
|
||||
static void regain3DbyPoppingMatrix();
|
||||
static void paintSDLRect(SDL_Rect);
|
||||
|
||||
GLFontEngine();
|
||||
GLFontEngine(std::string);
|
||||
bool fontSelect(std::string);
|
||||
void setColor(float, float, float, float=1.0f);
|
||||
void setColor(GLColor);
|
||||
|
||||
void renderText(std::string, SDL_Rect); // wrapper
|
||||
// void renderText(std::string, int x, int y, *SDL_Rect=0, bool center=false);
|
||||
// void renderLines(std::string, int x, int y,
|
||||
|
||||
void renderLine(std::string, SDL_Rect);
|
||||
void renderLine(std::string, int x, int y, bool center=false, SDL_Rect *rendered_to=0);
|
||||
void renderLines(std::string, int x, int y, bool center=false, SDL_Rect *rendered_to=0, int wrap=0, int paintbackground=0);
|
||||
|
||||
void setSize(int);
|
||||
int getSize();
|
||||
void getSDLRect(const std::string&, SDL_Rect*);
|
||||
int getTextWidth(const std::string&);
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,12 @@
|
|||
# COMPILER = g++
|
||||
OBJECTS = button.o object.o textlabel.o window.o
|
||||
|
||||
glguilib: $(OBJECTS)
|
||||
rm glgui.a -f
|
||||
ar rfc glgui.a $(OBJECTS)
|
||||
|
||||
%.o: %.cpp %.h
|
||||
$(COMPILER) -c `sdl-config --cflags` $<
|
||||
|
||||
clean:
|
||||
rm -f $(OBJECTS)
|
|
@ -0,0 +1,18 @@
|
|||
#include "button.h"
|
||||
|
||||
GLGuiButton::GLGuiButton(int _eventid, int _x, int _y, bool _center, int _wrap) : GLGuiTextLabel(_x, _y, _center, _wrap) {
|
||||
highlightable = true;
|
||||
clickable = true;
|
||||
eventid = _eventid;
|
||||
highlightcol.set(1.0f, 0.0f, 0.0f, 1.0f);
|
||||
}
|
||||
GLGuiButton::GLGuiButton(int _eventid, std::string str, int _x, int _y, bool _center, int _wrap) : GLGuiTextLabel(str, _x, _y, _center, _wrap){
|
||||
highlightable = true;
|
||||
clickable = true;
|
||||
eventid = _eventid;
|
||||
highlightcol.set(1.0f, 0.0f, 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
void GLGuiButton::onMouseOver(int m_x, int m_y) {
|
||||
// Längste stelle finden, dann collision
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
#ifndef __GLGUIBUTTON_H
|
||||
#define __GLGUIBUTTON_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <SDL/SDL.h>
|
||||
#include <SDL/SDL_opengl.h>
|
||||
|
||||
#include "textlabel.h"
|
||||
|
||||
#define GLGUI_BUTTONDOWN SDL_USEREVENT+10
|
||||
|
||||
class GLGuiButton : public GLGuiTextLabel {
|
||||
protected:
|
||||
int eventid;
|
||||
GLColor highlightcol;
|
||||
|
||||
public:
|
||||
GLGuiButton(int _eventid, int _x, int _y, bool _center=false, int _wrap=0);
|
||||
GLGuiButton(int _eventid, std::string str, int _x, int _y, bool _center=false, int _wrap=0);
|
||||
|
||||
void setHighlightColor();
|
||||
|
||||
void onMouseOver(int m_x, int m_y);
|
||||
void onMouseClick(int m_x, int m_y);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,7 @@
|
|||
#include "object.h"
|
||||
|
||||
GLGuiObject::GLGuiObject() {
|
||||
highlightable = false;
|
||||
clickable = false;
|
||||
keyboardable = false;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef __GLGUIOBJECT_H
|
||||
#define __GLGUIOBJECT_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <SDL/SDL.h>
|
||||
#include <SDL/SDL_opengl.h>
|
||||
|
||||
class GLGuiObject {
|
||||
protected:
|
||||
SDL_Rect pos;
|
||||
bool highlightable, clickable, keyboardable;
|
||||
public:
|
||||
GLGuiObject();
|
||||
virtual ~GLGuiObject() { };
|
||||
|
||||
virtual void render()=0;
|
||||
|
||||
// Optionen
|
||||
bool isHighlightable() { return highlightable; };
|
||||
bool isClickable() { return clickable; };
|
||||
bool isKeyboardable() { return keyboardable; };
|
||||
|
||||
virtual void onMouseOver(int m_x, int m_y) { };
|
||||
virtual void onMouseClick(int m_x, int m_y, int m_button) { };
|
||||
virtual void onKeyboardInput(char c) { };
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,37 @@
|
|||
#include "textlabel.h"
|
||||
|
||||
GLGuiTextLabel::GLGuiTextLabel(int _x, int _y, bool _center, int _wrap) {
|
||||
setPos(_x, _y);
|
||||
center = _center;
|
||||
wrap = _wrap;
|
||||
col.set(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
|
||||
GLGuiTextLabel::GLGuiTextLabel(std::string str, int _x, int _y, bool _center, int _wrap) {
|
||||
setPos(_x, _y);
|
||||
center = _center;
|
||||
wrap = _wrap;
|
||||
setText(str);
|
||||
col.set(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
|
||||
void GLGuiTextLabel::setText(std::string str) {
|
||||
text = str;
|
||||
}
|
||||
|
||||
void GLGuiTextLabel::setColor(GLColor c) {
|
||||
col = c;
|
||||
}
|
||||
|
||||
void GLGuiTextLabel::setPos(int _x, int _y) {
|
||||
x = _x;
|
||||
y = _y;
|
||||
}
|
||||
|
||||
void GLGuiTextLabel::render() {
|
||||
glColorGLC(col);
|
||||
|
||||
GLFontEngine::prepare2DbyPushingMatrix();
|
||||
fontengine.renderLines(text, x, y, center, 0, wrap, 0);
|
||||
GLFontEngine::regain3DbyPoppingMatrix();
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef __GLGUITEXTLABEL_H
|
||||
#define __GLGUITEXTLABEL_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <SDL/SDL.h>
|
||||
#include <SDL/SDL_opengl.h>
|
||||
|
||||
#include "object.h"
|
||||
#include "../glcolor.h"
|
||||
#include "../glfontengine.h"
|
||||
|
||||
class GLGuiTextLabel : public GLGuiObject{
|
||||
protected:
|
||||
GLFontEngine fontengine;
|
||||
std::string text;
|
||||
|
||||
GLColor col;
|
||||
int x, y;
|
||||
bool center;
|
||||
int wrap;
|
||||
public:
|
||||
GLGuiTextLabel(int _x, int _y, bool _center=false, int _wrap=0);
|
||||
GLGuiTextLabel(std::string, int _x, int _y, bool _center=false, int _wrap=0);
|
||||
|
||||
void setText(std::string str);
|
||||
void setColor(GLColor);
|
||||
void setPos(int _x, int _y);
|
||||
virtual void render();
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,39 @@
|
|||
#include "window.h"
|
||||
|
||||
GLGuiWindow::GLGuiWindow(SDL_Rect _pos, GLColor _bgcolor) {
|
||||
pos = _pos;
|
||||
bgcolor = _bgcolor;
|
||||
}
|
||||
|
||||
void GLGuiWindow::addItem(GLGuiObject *gobj) {
|
||||
// Objekt wird in delete gelöscht
|
||||
items.push_back(gobj);
|
||||
if(gobj->isHighlightable())
|
||||
highlightable.push_back(gobj);
|
||||
if(gobj->isClickable())
|
||||
clickable.push_back(gobj);
|
||||
if(gobj->isKeyboardable())
|
||||
keyboardable.push_back(gobj);
|
||||
|
||||
}
|
||||
|
||||
void GLGuiWindow::render() {
|
||||
if(renderbackground) {
|
||||
glColorGLC(bgcolor);
|
||||
GLDrawSDLRect(&pos);
|
||||
}
|
||||
|
||||
for(unsigned int i=0; i<items.size(); i++) {
|
||||
items[i]->render();
|
||||
}
|
||||
}
|
||||
|
||||
SDL_Rect GLGuiWindow::getPos() {
|
||||
return pos;
|
||||
}
|
||||
|
||||
GLGuiWindow::~GLGuiWindow() {
|
||||
for(unsigned int i=0; i<items.size(); i++) {
|
||||
delete(items[i]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
#ifndef __GLGUIWINDOW_H
|
||||
#define __GLGUIWINDOW_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <SDL/SDL.h>
|
||||
#include <SDL/SDL_opengl.h>
|
||||
|
||||
#include "../glcolor.h"
|
||||
#include "../gldrawhelper.h"
|
||||
#include "object.h"
|
||||
|
||||
|
||||
class GLGuiWindow : public GLGuiObject {
|
||||
private:
|
||||
bool renderbackground;
|
||||
SDL_Rect pos;
|
||||
GLColor bgcolor;
|
||||
|
||||
std::vector<GLGuiObject*> items;
|
||||
|
||||
std::vector<GLGuiObject*> highlightable;
|
||||
std::vector<GLGuiObject*> clickable;
|
||||
std::vector<GLGuiObject*> keyboardable;
|
||||
public:
|
||||
GLGuiWindow(SDL_Rect _pos, GLColor _bgcolor);
|
||||
~GLGuiWindow();
|
||||
|
||||
void addItem(GLGuiObject*);
|
||||
SDL_Rect getPos();
|
||||
void render();
|
||||
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,35 @@
|
|||
#include "glrect.h"
|
||||
|
||||
GLRect::GLRect() {
|
||||
set(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
|
||||
GLRect::GLRect(float _x, float _y, float _w, float _h) {
|
||||
set(_x, _y, _w, _h);
|
||||
}
|
||||
|
||||
GLRect::GLRect(const SDL_Rect &r) {
|
||||
set(r.x, r.y, r.w, r.h);
|
||||
}
|
||||
|
||||
void GLRect::set(float _x, float _y, float _w, float _h) {
|
||||
x = _x;
|
||||
y = _y;
|
||||
w = _w;
|
||||
h = _h;
|
||||
}
|
||||
|
||||
void GLRect::setPoint(float _x, float _y) {
|
||||
x = _x;
|
||||
y = _y;
|
||||
}
|
||||
|
||||
void GLRect::setDim(float _w, float _h) {
|
||||
w = _w;
|
||||
h = _h;
|
||||
}
|
||||
|
||||
SDL_Rect GLRect::getSDLRect() {
|
||||
SDL_Rect tmp = {(Uint8)x, (Uint8)y, (Uint8)w, (Uint8)h};
|
||||
return tmp;
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef __GLRECT_H
|
||||
#define __GLRECT_H
|
||||
|
||||
#include <SDL.h>
|
||||
|
||||
class GLRect {
|
||||
public:
|
||||
float x, y;
|
||||
float w, h;
|
||||
|
||||
GLRect();
|
||||
GLRect(float, float, float, float);
|
||||
GLRect(const SDL_Rect&);
|
||||
|
||||
void set(float, float, float, float);
|
||||
void setPoint(float, float);
|
||||
void setDim(float, float);
|
||||
SDL_Rect getSDLRect();
|
||||
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,172 @@
|
|||
#include "gltexture.h"
|
||||
|
||||
GLTexture::GLTexture() {
|
||||
init();
|
||||
alltextures.push_back(this);
|
||||
}
|
||||
|
||||
GLTexture::GLTexture(std::string fname, GLint _minfilter, GLint _magfilter, GLint _wraps, GLint _wrapt) {
|
||||
init();
|
||||
setParameter(_minfilter, _magfilter, _wraps, _wrapt);
|
||||
loadImage(fname);
|
||||
|
||||
alltextures.push_back(this);
|
||||
}
|
||||
|
||||
GLTexture::GLTexture(SDL_Surface *srfc) {
|
||||
init();
|
||||
loadSurface(srfc);
|
||||
}
|
||||
|
||||
void GLTexture::init() {
|
||||
loaded = false;
|
||||
texconverted = false;
|
||||
keepsurface = false;
|
||||
donotreload = false;
|
||||
|
||||
minfilter = GL_LINEAR;
|
||||
magfilter = GL_LINEAR;
|
||||
|
||||
wraps = GL_REPEAT;
|
||||
wrapt = GL_REPEAT;
|
||||
|
||||
tex = 0;
|
||||
width = height = 0;
|
||||
}
|
||||
|
||||
bool GLTexture::loadLocalSurface() {
|
||||
if(!texconverted)
|
||||
convertLocalSurface();
|
||||
|
||||
width = tex->w;
|
||||
height = tex->h;
|
||||
|
||||
glGenTextures(1, &texint);
|
||||
glBindTexture(GL_TEXTURE_2D, texint);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilter);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magfilter);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wraps);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapt);
|
||||
|
||||
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, width, height, GL_BGRA, GL_UNSIGNED_BYTE, tex->pixels);
|
||||
|
||||
loaded = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void GLTexture::convertLocalSurface() {
|
||||
tex = SDL_DisplayFormatAlpha(tex);
|
||||
mirrorSurfaceMiddleX(tex);
|
||||
|
||||
texconverted = true;
|
||||
}
|
||||
|
||||
bool GLTexture::loadImage(std::string fname) {
|
||||
if(isLoaded())
|
||||
unloadTexture();
|
||||
filename = fname;
|
||||
tex = IMG_Load(filename.c_str());
|
||||
|
||||
if(!tex) {
|
||||
std::cerr << "Textur konnte nicht geladen werden: " << filename << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ret = loadLocalSurface();
|
||||
keepsurface = false;
|
||||
SDL_FreeSurface(tex);
|
||||
tex = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool GLTexture::loadSurface(SDL_Surface *srfc, bool noreloading) {
|
||||
if(isLoaded())
|
||||
unloadTexture();
|
||||
if(filename!="")
|
||||
filename = "";
|
||||
|
||||
tex = srfc;
|
||||
|
||||
keepsurface = true;
|
||||
donotreload = noreloading;
|
||||
|
||||
return loadLocalSurface();
|
||||
}
|
||||
|
||||
bool GLTexture::selectTexture() {
|
||||
if(!loaded) {
|
||||
std::cerr << "Textur wurde nicht geladen: " << filename << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, texint);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void GLTexture::unloadTexture() {
|
||||
glDeleteTextures(1, &texint);
|
||||
|
||||
loaded = false;
|
||||
// Entweder tex == image, wurde schon gelöscht oder wir müssen es nich löschen
|
||||
|
||||
}
|
||||
|
||||
bool GLTexture::setParameter(GLint _minfilter, GLint _magfilter, GLint _wraps, GLint _wrapt) {
|
||||
if(_minfilter!=0)
|
||||
minfilter = _minfilter;
|
||||
if(_magfilter!=0)
|
||||
magfilter = _magfilter;
|
||||
if(_wraps!=0)
|
||||
wraps = _wraps;
|
||||
if(_wrapt!=0)
|
||||
wrapt = _wrapt;
|
||||
|
||||
if(!loaded)
|
||||
return true;
|
||||
|
||||
if(keepsurface&&tex!=0) {
|
||||
unloadTexture();
|
||||
return loadLocalSurface();
|
||||
} else if(filename!="") {
|
||||
return loadImage("filename");
|
||||
} else {
|
||||
// keine datei, kein surface
|
||||
unloadTexture();
|
||||
std::cerr << "Couldn't reload GLTexture " << this << "- No surface, no file!" << std::endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int GLTexture::getW() {
|
||||
return width;
|
||||
}
|
||||
|
||||
int GLTexture::getH() {
|
||||
return height;
|
||||
}
|
||||
|
||||
bool GLTexture::isLoaded() {
|
||||
return loaded;
|
||||
}
|
||||
|
||||
void GLTexture::reloadAll() {
|
||||
for(unsigned int i=0; i<alltextures.size(); i++)
|
||||
alltextures[i]->setParameter();
|
||||
}
|
||||
|
||||
GLTexture::~GLTexture() {
|
||||
if(isLoaded())
|
||||
unloadTexture();
|
||||
|
||||
for(unsigned int i=0; i<alltextures.size(); i++) {
|
||||
if(alltextures[i]==this) {
|
||||
alltextures.erase(alltextures.begin()+i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<GLTexture*> GLTexture::alltextures;
|
|
@ -0,0 +1,63 @@
|
|||
#ifndef __GLTEXTUR_H
|
||||
#define __GLTEXTUR_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <SDL.h>
|
||||
#include <SDL_image.h>
|
||||
#include <SDL_opengl.h>
|
||||
#include "sdlfuncs.h"
|
||||
|
||||
class GLTexture {
|
||||
private:
|
||||
GLuint texint;
|
||||
SDL_Surface *tex;
|
||||
int width, height;
|
||||
|
||||
std::string filename; // wenn von datei geladen
|
||||
|
||||
// Parameter
|
||||
GLint minfilter;
|
||||
GLint magfilter;
|
||||
GLint wraps;
|
||||
GLint wrapt;
|
||||
|
||||
bool loaded;
|
||||
bool texconverted;
|
||||
bool keepsurface;
|
||||
bool donotreload;
|
||||
|
||||
void init();
|
||||
bool loadLocalSurface();
|
||||
void convertLocalSurface();
|
||||
|
||||
static std::vector<GLTexture*> alltextures;
|
||||
protected:
|
||||
GLTexture(SDL_Surface*);
|
||||
bool loadSurface(SDL_Surface*, bool = false);
|
||||
public:
|
||||
static void reloadAll();
|
||||
|
||||
GLTexture();
|
||||
GLTexture(std::string, GLint=GL_LINEAR, GLint=GL_LINEAR, GLint=GL_REPEAT, GLint=GL_REPEAT);
|
||||
~GLTexture();
|
||||
|
||||
//load
|
||||
|
||||
bool loadImage(std::string);
|
||||
|
||||
bool selectTexture();
|
||||
void unloadTexture();
|
||||
bool setParameter(GLint=0, GLint=0, GLint=0, GLint=0);
|
||||
inline bool select() { return selectTexture(); }
|
||||
|
||||
int getW();
|
||||
int getH();
|
||||
|
||||
|
||||
|
||||
bool isLoaded();
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,177 @@
|
|||
#define VERSION "0.2.2 DEV"
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include <SDL.h>
|
||||
#include <SDL_opengl.h>
|
||||
|
||||
#include "gltexture.h"
|
||||
#include "glfontengine.h"
|
||||
|
||||
// #define GL_DEBUG_MOVEMENT false
|
||||
|
||||
void setupGL();
|
||||
void resizeOpenGLWindow(int, int, float=1.0f, float=100.0f);
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
std::cout << "ARGV: " << argv[0] << std::endl;
|
||||
//Vars
|
||||
SDL_Surface *screen;
|
||||
bool quit = false;
|
||||
SDL_Event event;
|
||||
int w_width = 640;
|
||||
int w_height = 480;
|
||||
int w_bbp = 32;
|
||||
float znear = 1.0f;
|
||||
float zfar = 100.0f;
|
||||
|
||||
if(SDL_Init(SDL_INIT_VIDEO)<0) {
|
||||
std::cerr << "Konnte SDL nicht initialisieren" << SDL_GetError() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Setting video mode
|
||||
int videoFlags;
|
||||
const SDL_VideoInfo *videoInfo;
|
||||
|
||||
videoInfo = SDL_GetVideoInfo();
|
||||
|
||||
if(!videoInfo) {
|
||||
std::cerr << "Video query failed: " << SDL_GetError() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
videoFlags = SDL_OPENGL;
|
||||
videoFlags |= SDL_GL_DOUBLEBUFFER;
|
||||
videoFlags |= SDL_HWPALETTE;
|
||||
videoFlags |= SDL_RESIZABLE;
|
||||
if(videoInfo->hw_available)
|
||||
videoFlags |= SDL_HWSURFACE;
|
||||
else
|
||||
videoFlags |= SDL_SWSURFACE;
|
||||
if(videoInfo->blit_hw)
|
||||
videoFlags |= SDL_HWACCEL;
|
||||
|
||||
// videoFlags |=SDL_FULLSCREEN;
|
||||
|
||||
// SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
|
||||
// SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );
|
||||
// SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
|
||||
// SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
|
||||
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
|
||||
|
||||
if(!(screen = SDL_SetVideoMode(w_width, w_height, w_bbp, videoFlags))) {
|
||||
std::cerr << "Kein SDL-Screen verfügbar: " << SDL_GetError() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
|
||||
|
||||
SDL_WM_SetCaption("GLGui Test, 0);
|
||||
|
||||
// blank screen
|
||||
// SDL_FillRect(screen, 0, SDL_MapRGBA(screen->format, 0, 0, 0, 0));
|
||||
|
||||
// GL Optionen
|
||||
setupGL();
|
||||
|
||||
resizeOpenGLWindow(w_width, w_height, znear, zfar);
|
||||
|
||||
// Keyrepeat, falls benötigt auskommentieren
|
||||
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
|
||||
|
||||
// Fontengine initliaisieren, für alle die Fonts brauchen
|
||||
GLFontEngine::addFont("font_big_better_alpha.png", "default");
|
||||
|
||||
// Programmvariablen
|
||||
Snake3D snake3d;
|
||||
|
||||
//movement & keyboardcontrol
|
||||
Uint8 *keys = SDL_GetKeyState(NULL);;
|
||||
SDLKey tkey;
|
||||
typedef enum { move_up=0, move_down, move_left, move_right} nummovekeys;
|
||||
SDLKey movekeys[4];
|
||||
|
||||
bool pause = true;
|
||||
bool blend = false;
|
||||
bool extralines = false;
|
||||
bool fullscreen = false;
|
||||
|
||||
// splash screen
|
||||
bool splashscreen = true;
|
||||
snake3d.pause(true);
|
||||
SDL_Rect splashpos = { 40, 40, screen->w -80, 310 };
|
||||
GLFontEngine fontengine("default");
|
||||
|
||||
#ifdef GL_DEBUG_MOVEMENT
|
||||
movekeys[move_up] = SDLK_i;
|
||||
movekeys[move_down] = SDLK_k;
|
||||
movekeys[move_left] = SDLK_j;
|
||||
movekeys[move_right] = SDLK_l;
|
||||
#else
|
||||
movekeys[move_up] = SDLK_UP;
|
||||
movekeys[move_down] = SDLK_DOWN;
|
||||
movekeys[move_left] = SDLK_LEFT;
|
||||
movekeys[move_right] = SDLK_RIGHT;
|
||||
#endif
|
||||
|
||||
while(!quit) {
|
||||
if(SDL_PollEvent(&event)) {
|
||||
switch(event.type) {
|
||||
case SDL_QUIT:
|
||||
quit = true;
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
keys = SDL_GetKeyState(NULL);
|
||||
tkey = event.key.keysym.sym;
|
||||
|
||||
break;
|
||||
case SDL_KEYUP:
|
||||
keys = SDL_GetKeyState(NULL);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
|
||||
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
glLoadIdentity();
|
||||
|
||||
SDL_Delay(10);
|
||||
}
|
||||
|
||||
}
|
||||
GLFontEngine::quit();
|
||||
SDL_Quit();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void setupGL() {
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
glClearDepth(1.0f);
|
||||
glDepthFunc(GL_LEQUAL);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glShadeModel(GL_SMOOTH);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
||||
// glBlendFunc(GL_SRC_COLOR,GL_DST_COLOR);
|
||||
|
||||
// glBlendFunc(GL_DST_COLOR, GL_SRC_ALPHA);
|
||||
// glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
|
||||
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
||||
glEnable(GL_ALPHA_TEST);
|
||||
glAlphaFunc(GL_GREATER, 0.1);
|
||||
}
|
||||
|
||||
void resizeOpenGLWindow(int width, int height, float znear, float zfar) {
|
||||
if(height==0)
|
||||
height = 1;
|
||||
|
||||
glViewport(0, 0, (GLsizei)width, (GLsizei)height);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, znear, zfar);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
#include "matrix.h"
|
||||
|
||||
Matrix::Matrix(int _m, int _n) {
|
||||
m = _m;
|
||||
n = _n;
|
||||
allocate();
|
||||
}
|
||||
|
||||
Matrix::Matrix(int _m, int _n, const float **src) {
|
||||
m = _m;
|
||||
n = _n;
|
||||
allocate();
|
||||
copyFromSource(src);
|
||||
}
|
||||
|
||||
Matrix::Matrix(Punkt3D d) {
|
||||
m = 3;
|
||||
n = 1;
|
||||
allocate();
|
||||
c[0][0] = d.x;
|
||||
c[1][0] = d.y;
|
||||
c[2][0] = d.z;
|
||||
}
|
||||
|
||||
Matrix::Matrix(const Matrix& mat) {
|
||||
m = mat.m;
|
||||
n = mat.n;
|
||||
allocate();
|
||||
copyFromSource(mat.getMatrix());
|
||||
}
|
||||
|
||||
void Matrix::allocate() {
|
||||
c = new float*[m];
|
||||
for(int i=0; i<m; i++) {
|
||||
c[i] = new float[n];
|
||||
for(int t=0; t<n; t++)
|
||||
c[i][t] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void Matrix::copyFromSource(const float** src) {
|
||||
for(int i=0; i<m; i++) {
|
||||
for(int t=0; t<n; t++)
|
||||
c[i][t] = src[i][t];
|
||||
}
|
||||
}
|
||||
|
||||
const float **Matrix::getMatrix() const {
|
||||
return (const float**)c;
|
||||
}
|
||||
|
||||
bool Matrix::set(float d, int _m, int _n) {
|
||||
if(_m>=m||_n>=n)
|
||||
return false;
|
||||
c[_m][_n] = d;
|
||||
return true;
|
||||
}
|
||||
|
||||
Matrix Matrix::operator*(const Matrix &d) {
|
||||
|
||||
if(n!=d.m)
|
||||
return Matrix(1,1);
|
||||
Matrix erg(m, d.n);
|
||||
|
||||
|
||||
for(int a=0; a<m; a++) {
|
||||
for(int b=0; b<d.n; b++) {
|
||||
float zerg = 0.0f;
|
||||
for(int _c=0; _c<n; _c++) {
|
||||
zerg += c[a][_c] * d.c[_c][b];
|
||||
}
|
||||
erg.c[a][b] = zerg;
|
||||
}
|
||||
}
|
||||
|
||||
return erg;
|
||||
}
|
||||
|
||||
Matrix& Matrix::operator=(const Matrix& mat) {
|
||||
if(mat.m<=m&&mat.n<=n) {
|
||||
copyFromSource(mat.getMatrix());
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Matrix Matrix::operator+(const float &f) {
|
||||
// Matrix tmp(*this);
|
||||
// for(int i=0; i<m; i++) {
|
||||
// for(int j=0; j<n; j++) {
|
||||
// tmp.c[i][j] += f;
|
||||
// }
|
||||
// }
|
||||
// return tmp;
|
||||
// }
|
||||
//
|
||||
// Matrix Matrix::operator-(const float &f) {
|
||||
// Matrix tmp(*this);
|
||||
// for(int i=0; i<m; i++) {
|
||||
// for(int j=0; j<n; j++) {
|
||||
// tmp.c[i][j] -= f;
|
||||
// }
|
||||
// }
|
||||
// return tmp;
|
||||
// }
|
||||
//
|
||||
// Matrix Matrix::operator*(const float &f) {
|
||||
// Matrix tmp(*this);
|
||||
// for(int i=0; i<m; i++) {
|
||||
// for(int j=0; j<n; j++) {
|
||||
// tmp.c[i][j] *= f;
|
||||
// }
|
||||
// }
|
||||
// return tmp;
|
||||
// }
|
||||
//
|
||||
// Matrix Matrix::operator/(const float &f) {
|
||||
// Matrix tmp(*this);
|
||||
// for(int i=0; i<m; i++) {
|
||||
// for(int j=0; j<n; j++) {
|
||||
// tmp.c[i][j] /= f;
|
||||
// }
|
||||
// }
|
||||
// return tmp;
|
||||
// }
|
||||
|
||||
int Matrix::getM() const {
|
||||
return m;
|
||||
}
|
||||
|
||||
int Matrix::getN() const {
|
||||
return n;
|
||||
}
|
||||
|
||||
void Matrix::print(std::string s) const {
|
||||
std::cout << "Matrix " << s << "(" << m << "," << n << ")" << std::endl;
|
||||
for(int a=0; a<m; a++) {
|
||||
for(int b=0; b<n; b++) {
|
||||
std::cout << std::setw(10) << c[a][b];
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
Matrix::~Matrix() {
|
||||
for(int i=0; i<m; i++) {
|
||||
delete[](c[i]);
|
||||
}
|
||||
delete[](c);
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
#ifndef __MATRIX_H
|
||||
#define __MATRIX_H
|
||||
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
|
||||
#include "emath.h"
|
||||
|
||||
class Matrix {
|
||||
protected:
|
||||
float **c;
|
||||
int m, n;
|
||||
|
||||
void allocate();
|
||||
void copyFromSource(const float**);
|
||||
public:
|
||||
Matrix(int, int);
|
||||
Matrix(int, int, const float**);
|
||||
Matrix(Punkt3D);
|
||||
Matrix(const Matrix&);
|
||||
~Matrix();
|
||||
|
||||
const float **getMatrix() const;
|
||||
bool set(float, int, int);
|
||||
int getM() const;
|
||||
int getN() const;
|
||||
|
||||
Matrix operator*(const Matrix&);
|
||||
Matrix& operator=(const Matrix&);
|
||||
|
||||
// Matrix operator+(const float&);
|
||||
// Matrix operator-(const float&);
|
||||
// Matrix operator*(const float&);
|
||||
// Matrix operator/(const float&);
|
||||
|
||||
void print(std::string="") const;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,77 @@
|
|||
#include "quaternion.h"
|
||||
|
||||
Quaternion::Quaternion() {
|
||||
w = 1.0f;
|
||||
x = y = z = 0.0f;
|
||||
}
|
||||
|
||||
void Quaternion::createFromRotation(float deg, float _x, float _y, float _z) {
|
||||
float tmpres = sin(deg2rad(deg) / 2.0f);
|
||||
|
||||
w = cos(deg2rad(deg) / 2.0f);
|
||||
x = _x * tmpres;
|
||||
y = _y * tmpres;
|
||||
z = _z * tmpres;
|
||||
}
|
||||
|
||||
Quaternion Quaternion::operator*(const Quaternion &q) {
|
||||
Quaternion ret;
|
||||
|
||||
ret.w = w*q.w - x*q.x - y*q.y - z*q.z;
|
||||
ret.x = w*q.x + x*q.w + y*q.z - z*q.y;
|
||||
ret.y = w*q.y + y*q.w + z*q.x - x*q.z;
|
||||
ret.z = w*q.z + z*q.w + x*q.y - y*q.x;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Quaternion::createGlMatrix(GLfloat *matrix) {
|
||||
if(!matrix)
|
||||
return;
|
||||
|
||||
matrix[0] = 1.0f - 2.0f * ( y*y + z*z);
|
||||
matrix[1] = 2.0f * ( x*y + z*w);
|
||||
matrix[2] = 2.0f * ( x*z - y*w);
|
||||
matrix[3] = 0.0f;
|
||||
|
||||
matrix[4] = 2.0f * ( x*y - z*w);
|
||||
matrix[5] = 1.0f - 2.0f * ( x*x + z*z);
|
||||
matrix[6] = 2.0f * ( z*y + x*w);
|
||||
matrix[7] = 0.0f;
|
||||
|
||||
matrix[8] = 2.0f * ( x*z + y*w);
|
||||
matrix[9] = 2.0f * ( y*z - x*w);
|
||||
matrix[10] = 1.0f - 2.0f * ( x*x + y*y);
|
||||
matrix[11] = 0.0f;
|
||||
|
||||
matrix[12] = 0.0f;
|
||||
matrix[13] = 0.0f;
|
||||
matrix[14] = 0.0f;
|
||||
matrix[15] = 1.0f;
|
||||
|
||||
}
|
||||
|
||||
Punkt3D Quaternion::getDirectionVector() {
|
||||
GLfloat matrix[16];
|
||||
createGlMatrix(matrix);
|
||||
|
||||
return getDirectionVector(matrix);
|
||||
}
|
||||
|
||||
Punkt3D Quaternion::getDirectionVector(GLfloat *matrix) {
|
||||
if(!matrix)
|
||||
return Punkt3D();
|
||||
Punkt3D tmp;
|
||||
|
||||
tmp.x = matrix[8];
|
||||
tmp.y = matrix[9];
|
||||
tmp.z = matrix[10];
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
void glMultMatrixf(Quaternion q) {
|
||||
GLfloat matrix[16];
|
||||
q.createGlMatrix(matrix);
|
||||
glMultMatrixf(matrix);
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
#ifndef __QUATERNION_H
|
||||
#define __QUATERNION_H
|
||||
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <SDL_opengl.h>
|
||||
|
||||
#include "emath.h"
|
||||
|
||||
class Quaternion {
|
||||
private:
|
||||
float w;
|
||||
float x,y,z;
|
||||
public:
|
||||
Quaternion();
|
||||
void createFromRotation(float, float, float, float);
|
||||
|
||||
|
||||
void createGlMatrix(GLfloat*);
|
||||
Punkt3D getDirectionVector();
|
||||
Punkt3D getDirectionVector(GLfloat*);
|
||||
|
||||
Quaternion operator*(const Quaternion&);
|
||||
|
||||
|
||||
};
|
||||
|
||||
void glMultMatrixf(Quaternion);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,91 @@
|
|||
#include "rotationsmatrix.h"
|
||||
|
||||
Rotationsmatrix::Rotationsmatrix() : Matrix(3,3) {
|
||||
set(x_axis, 0.0f);
|
||||
}
|
||||
|
||||
Rotationsmatrix::Rotationsmatrix(axis _ax, float _deg) : Matrix(3,3) {
|
||||
set(_ax, _deg);
|
||||
}
|
||||
|
||||
Rotationsmatrix::Rotationsmatrix(Punkt3D _rotvec, float _deg) : Matrix(3,3) {
|
||||
set(_rotvec, _deg);
|
||||
}
|
||||
|
||||
void Rotationsmatrix::set(Punkt3D _rotvec, float _deg) {
|
||||
rotvec = _rotvec;
|
||||
rotvec.normalize();
|
||||
deg = _deg;
|
||||
initRot();
|
||||
}
|
||||
|
||||
void Rotationsmatrix::set(axis _ax, float _deg) {
|
||||
deg = _deg;
|
||||
|
||||
switch(_ax) {
|
||||
case x_axis:
|
||||
rotvec.set(1.0f, 0.0f, 0.0f);
|
||||
break;
|
||||
case y_axis:
|
||||
rotvec.set(0.0f, 1.0f, 0.0f);
|
||||
break;
|
||||
case z_axis:
|
||||
rotvec.set(0.0f, 0.0f, 1.0f);
|
||||
break;
|
||||
}
|
||||
initRot();
|
||||
}
|
||||
|
||||
void Rotationsmatrix::set(float _deg) {
|
||||
deg = _deg;
|
||||
initRot();
|
||||
}
|
||||
|
||||
void Rotationsmatrix::initRot() {
|
||||
c[0][0] = scos(deg) + pow(rotvec.x,2.0f) * (1 - scos(deg));
|
||||
c[0][1] = rotvec.x * rotvec.y * (1 - scos(deg)) - rotvec.z * ssin(deg);
|
||||
c[0][2] = rotvec.x * rotvec.z * (1 - scos(deg)) + rotvec.y * ssin(deg);
|
||||
|
||||
c[1][0] = rotvec.y * rotvec.x * (1 - scos(deg)) + rotvec.z * ssin(deg);
|
||||
c[1][1] = scos(deg) + pow(rotvec.y,2.0f) * (1 - scos(deg));
|
||||
c[1][2] = rotvec.y * rotvec.z * (1 - scos(deg)) - rotvec.x * ssin(deg);
|
||||
|
||||
c[2][0] = rotvec.z * rotvec.x * (1 - scos(deg)) - rotvec.y * ssin(deg);
|
||||
c[2][1] = rotvec.z * rotvec.y * (1 - scos(deg)) + rotvec.x * ssin(deg);
|
||||
c[2][2] = scos(deg) + pow(rotvec.z,2.0f) * (1 - scos(deg));
|
||||
}
|
||||
|
||||
Punkt3D Rotationsmatrix::operator*(const Punkt3D &p) {
|
||||
Matrix erg(3,1);
|
||||
Punkt3D erg2;
|
||||
|
||||
erg = (((Matrix*)(this))->operator*(Matrix(p)));
|
||||
|
||||
const float **mat = erg.getMatrix();
|
||||
erg2.set(mat[0][0], mat[1][0], mat[2][0]);
|
||||
|
||||
return erg2;
|
||||
}
|
||||
|
||||
Rotationsmatrix Rotationsmatrix::operator*(const Rotationsmatrix &p) {
|
||||
Matrix m(3, 3);
|
||||
Rotationsmatrix rotmat;
|
||||
m = ((Matrix)(*this) * (Matrix)p);
|
||||
const float **mat = m.getMatrix();
|
||||
rotmat.c[0][0] = mat[0][0];
|
||||
rotmat.c[0][1] = mat[0][1];
|
||||
rotmat.c[0][2] = mat[0][2];
|
||||
rotmat.c[1][0] = mat[1][0];
|
||||
rotmat.c[1][1] = mat[1][1];
|
||||
rotmat.c[1][2] = mat[1][2];
|
||||
rotmat.c[2][0] = mat[2][0];
|
||||
rotmat.c[2][1] = mat[2][1];
|
||||
rotmat.c[2][2] = mat[2][2];
|
||||
|
||||
return rotmat;
|
||||
}
|
||||
|
||||
|
||||
Rotationsmatrix::~Rotationsmatrix() {
|
||||
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
#ifndef __ROTATIONSMATRIX_H
|
||||
#define __ROTATIONSMATRIX_H
|
||||
|
||||
#include <cmath>
|
||||
#include "emath.h"
|
||||
#include "matrix.h"
|
||||
|
||||
enum axis { x_axis=0, y_axis, z_axis };
|
||||
|
||||
class Rotationsmatrix : public Matrix {
|
||||
private:
|
||||
float deg;
|
||||
Punkt3D rotvec;
|
||||
|
||||
void initRot();
|
||||
public:
|
||||
Rotationsmatrix();
|
||||
Rotationsmatrix(axis, float);
|
||||
Rotationsmatrix(Punkt3D, float);
|
||||
~Rotationsmatrix();
|
||||
|
||||
void set(float);
|
||||
void set(axis, float);
|
||||
void set(Punkt3D, float);
|
||||
|
||||
Punkt3D operator*(const Punkt3D&);
|
||||
Rotationsmatrix operator*(const Rotationsmatrix&);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,82 @@
|
|||
#include "sdlfuncs.h"
|
||||
|
||||
Uint32 getPixel(SDL_Surface *surface, int x, int y)
|
||||
{
|
||||
int bpp = surface->format->BytesPerPixel;
|
||||
/* Here p is the address to the pixel we want to retrieve */
|
||||
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
|
||||
|
||||
switch(bpp) {
|
||||
case 1:
|
||||
return *p;
|
||||
|
||||
case 2:
|
||||
return *(Uint16 *)p;
|
||||
|
||||
case 3:
|
||||
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
|
||||
return p[0] << 16 | p[1] << 8 | p[2];
|
||||
else
|
||||
return p[0] | p[1] << 8 | p[2] << 16;
|
||||
|
||||
case 4:
|
||||
return *(Uint32 *)p;
|
||||
|
||||
default:
|
||||
return 0; /* shouldn't happen, but avoids warnings */
|
||||
}
|
||||
}
|
||||
|
||||
void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
|
||||
{
|
||||
int bpp = surface->format->BytesPerPixel;
|
||||
/* Here p is the address to the pixel we want to set */
|
||||
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
|
||||
|
||||
switch(bpp) {
|
||||
case 1:
|
||||
*p = pixel;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
*(Uint16 *)p = pixel;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
|
||||
p[0] = (pixel >> 16) & 0xff;
|
||||
p[1] = (pixel >> 8) & 0xff;
|
||||
p[2] = pixel & 0xff;
|
||||
} else {
|
||||
p[0] = pixel & 0xff;
|
||||
p[1] = (pixel >> 8) & 0xff;
|
||||
p[2] = (pixel >> 16) & 0xff;
|
||||
}
|
||||
break;
|
||||
|
||||
case 4:
|
||||
*(Uint32 *)p = pixel;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void swapPixel(SDL_Surface *surface, int x1, int y1, int x2, int y2) {
|
||||
Uint32 a,b;
|
||||
a = getPixel(surface, x1, y1);
|
||||
b = getPixel(surface, x2, y2);
|
||||
|
||||
setPixel(surface, x1, y1, b);
|
||||
setPixel(surface, x2, y2, a);
|
||||
}
|
||||
|
||||
void mirrorSurfaceMiddleX(SDL_Surface *surface) {
|
||||
SDL_LockSurface(surface);
|
||||
int upto = surface->h / 2;
|
||||
|
||||
for(int i=0; i<upto; i++) {
|
||||
for(int x=0; x<surface->w; x++) {
|
||||
swapPixel(surface, x, i, x, surface->h-1-i);
|
||||
}
|
||||
}
|
||||
SDL_UnlockSurface(surface);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef __SDLFUNCS_H
|
||||
#define __SDLFUNCS_H
|
||||
|
||||
#include <iostream>
|
||||
#include <SDL.h>
|
||||
|
||||
Uint32 getPixel(SDL_Surface *surface, int x, int y);
|
||||
void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
|
||||
void swapPixel(SDL_Surface *surface, int x1, int y1, int x2, int y2);
|
||||
void mirrorSurfaceMiddleX(SDL_Surface *surface);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue