/*************************************************************************** sq_glparts.cpp - description ------------------- begin : ??? ??? 13 2007 copyright : (C) 2007 by Baryshev Dmitry email : ksquirrel.iv@gmail.com ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "sq_glparts.h" #include "sq_library.h" #include /* ***************************************************************************************** */ Parts::Parts() : w(0), h(0), realw(0), realh(0), m_parts(0), buffer(0) {} Part::Part() : x1(0), y1(0), x2(0), y2(0), tex(0), list(0) {} /* ***************************************************************************************** */ memoryPart::memoryPart(const int sz) : m_size(sz), m_data(0) {} memoryPart::~memoryPart() { del(); } void memoryPart::create() { m_data = new RGBA [m_size]; // if(m_data) // memset(m_data, 0, m_size * sizeof(RGBA)); } // Delete textures and display lists. void Parts::removeParts() { if(!m_parts.empty()) { int toy = tilesy.size(); int toxy = tilesx.size() * toy; for(int z = 0;z < toxy;z++) glDeleteTextures(1, &m_parts[z].tex); glDeleteLists(m_parts[0].list, toy); m_parts.clear(); } } // Create parts: generate textures and display lists. bool Parts::makeParts() { int z; int toy = tilesy.size(); GLuint base = glGenLists(toy); if(!base) return false; Part pt; int tox = tilesx.size(); int toxy = tox * toy; for(z = 0;z < toxy;z++) { glGenTextures(1, &pt.tex); m_parts.push_back(pt); } // calculate display list's id for(z = 0;z < toy;z++) m_parts[z * tox].list = base + z; return true; } // Calculate coordinates for textures void Parts::computeCoords() { Part *p; int index = 0; float X, Y; Y = (float)h / 2.0; int tlsy = tilesy.size(); int tlsx = tilesx.size(); for(int y = 0;y < tlsy;y++) { X = -(float)w / 2.0; for(int x = 0;x < tlsx;x++) { p = &m_parts[index]; p->x1 = X; p->y1 = Y; p->x2 = X + tilesx[x]; p->y2 = Y - tilesy[y]; p->tx1 = 0.0; p->tx2 = 1.0; p->ty1 = 0.0; p->ty2 = 1.0; index++; X += tilesx[x]; } Y -= tilesy[y]; } } /* ***************************************************************************************** */ Tab::Tab() { empty(); } Tab::~Tab() {} void Tab::clearParts() { if(broken) return; std::vector::iterator itEnd = parts.end(); for(std::vector::iterator it = parts.begin();it != itEnd;++it) { // delete textures and memory buffers (*it).removeParts(); (*it).deleteBuffer(); } parts.clear(); finfo.image.clear(); finfo.meta.clear(); } void Tab::removeParts() { if(broken) return; std::vector::iterator itEnd = parts.end(); for(std::vector::iterator it = parts.begin();it != itEnd;++it) (*it).removeParts(); } void Tab::remakeParts() { if(broken) return; std::vector::iterator itEnd = parts.end(); for(std::vector::iterator it = parts.begin();it != itEnd;++it) { (*it).makeParts(); (*it).computeCoords(); } } void Tab::empty() { nullMatrix(); orient = -1; rotate = 0; fmt_size = 0; lib = 0; codeK = 0; current = 0; curangle = 0; total = 0; sx = sy = sw = sh = 0; elapsed = 0; wm = TQWMatrix(); glselection = -1; srect = TQRect(); manualBlocked = false; isflippedV = isflippedH = false; broken = false; m_original = KURL(); File = TQString(); m_File = TQString(); quickImageInfo = TQString(); fmt_ext = TQString(); } void Tab::nullMatrix() { for(int i = 0;i < 12;i++) matrix[i] = (GLfloat)(i % 5 == 0); }