1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
/*!
@file
@author Albert Semenov
@date 06/2008
*/
#include "Tesselator.h"
namespace demo
{
Tesselator::Tesselator() :
mCountX(64),
mCountY(64),
mLeft(0),
mTop(0),
mWidth(0),
mHeight(0)
{
}
size_t Tesselator::tesselation(
size_t _count,
MyGUI::VectorQuadData& _data,
MyGUI::ITexture* _texture,
const MyGUI::RenderTargetInfo& _info,
const MyGUI::IntCoord& _coord)
{
mLeft = ((_info.pixScaleX * (float)(_coord.left) + _info.hOffset) * 2) - 1;
mTop = -(((_info.pixScaleY * (float)(_coord.top) + _info.vOffset) * 2) - 1);
mWidth = (_info.pixScaleX * (float)_coord.width * 2);
mHeight = -(_info.pixScaleY * (float)_coord.height * 2);
size_t count = mCountX * mCountY;
if (_count == count) return count;
//
_data.resize(count);
float vertex_z = _info.maximumDepth;
float texture_u = (float)_coord.width / (float)_texture->getWidth();
float texture_v = (float)_coord.height / (float)_texture->getHeight();
for (int rx = 0; rx < mCountX + 1; rx++)
{
for (int ry = 0; ry < mCountY + 1; ry++)
{
MyGUI::FloatPoint point((float)rx / (float)mCountX, (float)ry / (float)mCountY);
float fx = mLeft + mWidth * point.left;
float fy = mTop + mHeight * point.top;
float u = texture_u * point.left;
float v = texture_v * point.top;
//if (_info.rttFlipY) v = 1 - v;
MyGUI::Vertex vertex;
vertex.set(fx, fy, vertex_z, u, v, 0xFFFFFFFF);
if (rx < mCountX && ry < mCountY)
{
_data[rx + ry* mCountX].vertex[MyGUI::QuadData::CornerLT] = vertex;
}
if (rx > 0 && ry > 0)
{
_data[(rx-1) + (ry-1)*mCountX].vertex[MyGUI::QuadData::CornerRB] = vertex;
}
if (rx > 0 && ry < mCountY)
{
_data[(rx-1) + ry* mCountX].vertex[MyGUI::QuadData::CornerRT] = vertex;
}
if (rx < mCountX && ry > 0)
{
_data[rx + (ry-1)*mCountX].vertex[MyGUI::QuadData::CornerLB] = vertex;
}
}
}
return count;
}
} // namespace MyGUI
|