You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ksquirrel/ksquirrel/sq_glparts.cpp

220 lines
4.7 KiB

/***************************************************************************
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 <ksquirrel-libs/fmt_codec_base.h>
/* ***************************************************************************************** */
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<Parts>::iterator itEnd = parts.end();
for(std::vector<Parts>::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<Parts>::iterator itEnd = parts.end();
for(std::vector<Parts>::iterator it = parts.begin();it != itEnd;++it)
(*it).removeParts();
}
void Tab::remakeParts()
{
if(broken) return;
std::vector<Parts>::iterator itEnd = parts.end();
for(std::vector<Parts>::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);
}