SVN commit 891000 by chuet: moved the textures management in another class, using an abstract class as interface for more versatility. Modified the pong in order to use this new system (not finished) M +6 -1 CMakeLists.txt M +3 -2 examples/kglpong/ball.cpp M +2 -2 examples/kglpong/ball.h M +9 -1 examples/kglpong/pongengine.cpp M +3 -1 examples/kglpong/racket.cpp M examples/kglpong/sprites/ball.png M +2 -16 kglanimitem.cpp M +1 -1 kglanimitem.h M +5 -30 kglengine2d.cpp M +4 -8 kglengine2d.h M +8 -4 kglintro.cpp M +1 -1 kglitem.cpp M +1 -1 kglitem.h M +2 -7 kglparticlesitem.cpp M +2 -2 kglparticlesitem.h M +3 -11 kglspriteitem.cpp M +1 -1 kglspriteitem.h --- trunk/playground/games/KGLEngineRefactoring/CMakeLists.txt #890999:891000 @@ -34,6 +34,8 @@ glpoint.cpp kgamekey.cpp kglgraphicsconfig.cpp + kglbasictexturemanager.cpp + kglenhancedtexturemanager.cpp kglintro.cpp ) @@ -54,7 +56,7 @@ target_link_libraries(kglengine ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ${X11_Xrandr_LIB} ${X11_LIBRARY} ) add_subdirectory(tests) -add_subdirectory(examples) +#add_subdirectory(examples) ########### INSTALL FILES ############### install(TARGETS kglengine ${INSTALL_TARGETS_DEFAULT_ARGS} ) @@ -75,5 +77,8 @@ kglphysicsitem.h kglspriteitem.h kglintro.h + kgltexturemanager.h + kglbasictexturemanager.h + kglenhancedtexturemanager.h #ui_kglgraphicsconfig.h DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel) --- trunk/playground/games/KGLEngineRefactoring/examples/kglpong/ball.cpp #890999:891000 @@ -25,7 +25,7 @@ #include "kglparticlesitem.h" Ball::Ball() -:KGLAnimItem(QString("sprites/ball.png"), Ball::staticMetaObject.className(), 4, 1000) +:KGLSpriteItem(KGLEngine2d::getInstance()->textureManager()->getTexture("ball.svg"), Ball::staticMetaObject.className()) { // KGLParticlesItem* particles = new KGLParticlesItem("sprites/partLine.png", 5); // particles->setAngleSpan(360); @@ -43,7 +43,6 @@ //============================================================================== void Ball::collidingWith(const SET_COLLIDABLE_ITEMS &items) { - SET_COLLIDABLE_ITEMS::iterator it = items.begin(); while(it != items.end()) { @@ -61,7 +60,9 @@ //particles->setDirection(m_position+m_speed); } if((*it)->typeName() == GOAL_TYPE) + { emit(enterGoal(((*it)->position().x() > 0) ? 1 : 2)); + } ++it; } } --- trunk/playground/games/KGLEngineRefactoring/examples/kglpong/ball.h #890999:891000 @@ -21,12 +21,12 @@ #ifndef KGL_BALL_H #define KGL_BALL_H -#include "kglanimitem.h" +#include "kglspriteitem.h" const QString WALL_TYPE = "01Wall"; const QString GOAL_TYPE = "04Goal"; -class Ball : public KGLAnimItem +class Ball : public KGLSpriteItem { Q_OBJECT public: --- trunk/playground/games/KGLEngineRefactoring/examples/kglpong/pongengine.cpp #890999:891000 @@ -18,6 +18,7 @@ * Boston, MA 02110-1301, USA. */ +#include "kglenhancedtexturemanager.h" #include "pongengine.h" #include "ball.h" #include "racket.h" @@ -46,6 +47,8 @@ // intro->scale(0.5); // addGLItem(intro); + m_textureManager = new KGLEnhancedTextureManager("/home/packadal/Skuld/workspace/kglengine/examples/kglpong/sprites/"); + setWidth(640); setHeight(480); const double wallThickness = 10; @@ -66,7 +69,12 @@ player2Goal->setColor(Qt::black); addGLItem(player2Goal); - KGLSpriteItem *background = new KGLSpriteItem("sprites/wall.png", "00background"); + QImage i("sprites/wall.png"); + + KGLEngine2d::getInstance()->textureManager()->addTexture(i, "wall"); + GLint wall = KGLEngine2d::getInstance()->textureManager()->getTexture("wall"); + + KGLSpriteItem *background = new KGLSpriteItem(wall, "00background"); background->setPosition(-background->center()); addGLItem(background); --- trunk/playground/games/KGLEngineRefactoring/examples/kglpong/racket.cpp #890999:891000 @@ -20,12 +20,14 @@ #include "racket.h" +#include "kglengine2d.h" + #include const QString WALL_TYPE = "01Wall"; Racket::Racket() -:KGLSpriteItem("sprites/bar.png", Racket::staticMetaObject.className()) +:KGLSpriteItem(KGLEngine2d::getInstance()->textureManager()->getTexture("bar.png"), Racket::staticMetaObject.className(), KGLEngine2d::getInstance()->textureManager()->getTextureDim("bar.png")) { m_timeLine = new QTimeLine(2000); m_timeLine->setFrameRange(0, 255); --- trunk/playground/games/KGLEngineRefactoring/kglanimitem.cpp #890999:891000 @@ -26,7 +26,7 @@ #include #include -KGLAnimItem::KGLAnimItem(const QString &texFile, const QString &typeName, const int &nbFrame, const int &duration, const QSizeF &dim) : +KGLAnimItem::KGLAnimItem(const GLint &texture, const QString &typeName, const int &nbFrame, const int &duration, const QSizeF &dim) : KGLItem(typeName) { m_timeLine = new QTimeLine(duration, this); @@ -35,21 +35,7 @@ m_timeLine->setFrameRange(0, nbFrame); m_timeLine->setDuration(duration); - if(dim.isNull()) - { - const QImage q(texFile); - const RECT r(0, 0, q.width(), q.height() / nbFrame); - // init(r, POINT(1, 1./nbFrame)); - const float pal = 13 / nbFrame; - addPoint(new GLPoint(0, 0, Qt::white, QPointF(0, 0))); - addPoint(new GLPoint(0, q.height(), Qt::white, QPointF(0, pal))); - addPoint(new GLPoint(q.width(), q.height(), Qt::white, QPointF(1, pal))); - addPoint(new GLPoint(q.width(), 0, Qt::white, QPointF(1, 0))); - } - else - init(RECT(0, 0, dim.width(), dim.height())); - - GLint texture = (texFile == "" ? -1 : KGLEngine2d::getInstance()->addTexture(texFile)); + init(RECT(0, 0, dim.width(), dim.height())); setTexture(texture); connect(m_timeLine, SIGNAL(frameChanged(int)), this, SLOT(createFrame(int))); --- trunk/playground/games/KGLEngineRefactoring/kglanimitem.h #890999:891000 @@ -31,7 +31,7 @@ { Q_OBJECT public: - explicit KGLAnimItem(const QString &texFile, const QString &typeName = KGLAnimItem::staticMetaObject.className(), const int &nbFrame = 2, const int &duration = 500, + explicit KGLAnimItem(const GLint &texture, const QString &typeName = KGLAnimItem::staticMetaObject.className(), const int &nbFrame = 2, const int &duration = 500, const QSizeF &dim = QSizeF(0.5, 0.5)); // inline QTimeLine* timeLine() { return m_timeLine; } --- trunk/playground/games/KGLEngineRefactoring/kglengine2d.cpp #890999:891000 @@ -22,6 +22,8 @@ #include "kglengine2d.h" +#include "kglbasictexturemanager.h" + #include #include @@ -54,6 +56,8 @@ m_physics = new KGLPhysicsEngine(); m_keyEvents = new KGameKey(); + m_textureManager = new KGLBasicTextureManager(); + setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); @@ -77,9 +81,7 @@ delete (*it++); mapIt++; } - map::iterator texIt = m_textureMap.begin(); - while(texIt != m_textureMap.end()) - deleteTexture((*texIt++).second); + delete m_textureManager; } //=========================================== @@ -297,33 +299,6 @@ } //=============================================================== -GLint KGLEngine2d::addTexture(const QString &path) -{ - map::iterator it = m_textureMap.find(path); - GLint res = 0; - //if the texture isn't already there, we add it - if(it == m_textureMap.end()) - { - QFile file(path); - if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - cout << "cant find texture: " << qPrintable(path) << endl; - // KMessageBox::error(0,"cant find texture: "+path); - return res = 0; - } - else - { - QImage pic(path); - res = bindTexture(pic); - m_textureMap[path] = res; - } - } - //if it's here we simply return it - else - res = (*it).second; - return res; -} - void KGLEngine2d::addTriggers() { //TODO update them according to the fact an item is not collidable by default, or remove them compltetely --- trunk/playground/games/KGLEngineRefactoring/kglengine2d.h #890999:891000 @@ -29,6 +29,7 @@ #include #include +#include "kgltexturemanager.h" #include "kgltextitem.h" #include "kglspriteitem.h" #include "kgamekey.h" @@ -117,7 +118,7 @@ inline void setWallpaper(const QString &file) { - texWallpaper = bindTexture(QPixmap(file)); + texWallpaper = bindTexture(QImage(file)); } inline void setWallpaper(GLuint tex) { @@ -158,11 +159,7 @@ return m_keyEvents; } - inline GLint texture(const QString &id) - { - return m_textureMap[id]; - } - GLint addTexture(const QString &path); + KGLTextureManager* textureManager() { return m_textureManager; } static KGLEngine2d* getInstance(int w = 640, int h = 480, int rateFrame = 10, QWidget* parent = 0) { @@ -246,6 +243,7 @@ std::map > m_collisionRules; KGLPhysicsEngine* m_physics; + KGLTextureManager* m_textureManager; static KGLEngine2d* m_engine; float m_width, m_height; float m_hwidth, m_hheight; @@ -265,8 +263,6 @@ bool hasRepere; bool hasFps; - - std::map m_textureMap; }; #endif //KGLENGINE2D_H --- trunk/playground/games/KGLEngineRefactoring/kglintro.cpp #890999:891000 @@ -33,17 +33,21 @@ m_timer = new QTimer; m_timer->start(10); - m_gear = new KGLSpriteItem(":gear.png", typeName, POINT(0.5, 0.5)); + /* + QImage gear(":gear.png"); + QImage title(":title.png"); + + m_gear = new KGLSpriteItem(gear, typeName, POINT(0.5, 0.5)); m_gear->scale(0.8); - m_gear2 = new KGLSpriteItem(":gear.png", typeName, POINT(0.5, 0.5)); + m_gear2 = new KGLSpriteItem(gear, typeName, POINT(0.5, 0.5)); m_gear2->scale(0.6); m_gear2->setPosition(0.28, 0.28); m_gear2->rotate(90); - m_title = new KGLSpriteItem(":title.png", typeName, POINT(1.5, 0.25)); + m_title = new KGLSpriteItem(title, typeName, POINT(1.5, 0.25)); m_title->setPosition(0.5, 0); - +*/ addChild(m_gear); addChild(m_gear2); addChild(m_title); --- trunk/playground/games/KGLEngineRefactoring/kglitem.cpp #890999:891000 @@ -277,7 +277,7 @@ // applyMatrix(item->matrix()); } -void KGLItem::addParticlesEffect(const QString& texture, int nbParticles) +void KGLItem::addParticlesEffect(const GLint& texture, int nbParticles) { m_particles = new KGLParticlesItem(texture, nbParticles); KGLEngine2d::getInstance()->addGLItem(m_particles); --- trunk/playground/games/KGLEngineRefactoring/kglitem.h #890999:891000 @@ -146,7 +146,7 @@ QPointF transform(QPointF p) const; QRectF transform(QRectF r) const; - void addParticlesEffect(const QString&, int); + void addParticlesEffect(const GLint&, int); Q_SIGNALS: void colliding(PhysicsItem*); --- trunk/playground/games/KGLEngineRefactoring/kglparticlesitem.cpp #890999:891000 @@ -27,14 +27,14 @@ #include -KGLParticlesItem::KGLParticlesItem(const QString &texFile, int nbParticules) : +KGLParticlesItem::KGLParticlesItem(const GLint &texture, int nbParticules) : KGLItem(KGLParticlesItem::staticMetaObject.className()) { m_angleSpan = 360; m_speed = 0.001; m_alphaStep = 0.001; m_pointSize = 20; - m_texture = KGLEngine2d::getInstance()->addTexture(texFile); + m_texture = texture; m_modeRandom = true; m_finish = false; m_repeat = true; @@ -126,8 +126,3 @@ glPopMatrix(); } } - -void KGLParticlesItem::setTexture(const QString& newText) -{ - m_texture = KGLEngine2d::getInstance()->addTexture(newText); -} --- trunk/playground/games/KGLEngineRefactoring/kglparticlesitem.h #890999:891000 @@ -32,7 +32,7 @@ class KGLParticlesItem: public KGLItem { public: - explicit KGLParticlesItem(const QString &texFile, int nbParticules = 10); + explicit KGLParticlesItem(const GLint &texture, int nbParticules = 10); virtual void draw(); inline void setNbParticles(uint nb) @@ -84,7 +84,7 @@ m_finish = false; m_count = 0; } - void setTexture(const QString&); + inline void setTexture(const GLint &texture) { m_texture = texture; } inline bool isFinished() { --- trunk/playground/games/KGLEngineRefactoring/kglspriteitem.cpp #890999:891000 @@ -25,19 +25,11 @@ #include -KGLSpriteItem::KGLSpriteItem(const QString &texFile, const QString &typeName, const POINT &dim, const POINT &pos, const POINT &trepeat) : +KGLSpriteItem::KGLSpriteItem(const GLint &texture, const QString &typeName, const POINT &dim, const POINT &pos, const POINT &trepeat) : KGLItem(typeName) { - if(dim.isNull()) - { - QImage q(texFile); - init(RECT(pos.x(), pos.y(), q.width(), q.height()), trepeat); - } - else - init(RECT(pos.x(), pos.y(), dim.x(), dim.y()), trepeat); - - GLint texture = (texFile == "" ? -1 : KGLEngine2d::getInstance()->addTexture(texFile)); - setTexture(texture); + init(RECT(pos.x(), pos.y(), dim.x(), dim.y()), trepeat); + m_texture = texture; } //====================================================================== --- trunk/playground/games/KGLEngineRefactoring/kglspriteitem.h #890999:891000 @@ -28,7 +28,7 @@ class KGLSpriteItem: public KGLItem { public: - explicit KGLSpriteItem(const QString &texFile = "", const QString &typeName = KGLSpriteItem::staticMetaObject.className(), const POINT &dim = POINT(0, 0), + explicit KGLSpriteItem(const GLint &texture = 0, const QString &typeName = KGLSpriteItem::staticMetaObject.className(), const POINT &dim = POINT(1, 1), const POINT &pos = POINT(0, 0), const POINT &trepeat = POINT(1, 1)); };