2016-02-06 00:34:40 +00:00
|
|
|
#include "CUVElement.hpp"
|
|
|
|
|
2016-02-28 06:55:05 +00:00
|
|
|
/* Documentation at: http://www.metroid2002.com/retromodding/wiki/Particle_Script#UV_Elements */
|
|
|
|
|
2016-03-04 23:04:53 +00:00
|
|
|
namespace urde
|
2016-02-06 00:34:40 +00:00
|
|
|
{
|
|
|
|
|
2018-09-20 18:17:09 +00:00
|
|
|
CUVEAnimTexture::CUVEAnimTexture(TToken<CTexture>&& tex, std::unique_ptr<CIntElement>&& tileW,
|
|
|
|
std::unique_ptr<CIntElement>&& tileH, std::unique_ptr<CIntElement>&& strideW,
|
|
|
|
std::unique_ptr<CIntElement>&& strideH, std::unique_ptr<CIntElement>&& cycleFrames,
|
|
|
|
bool loop)
|
|
|
|
: x4_tex(std::move(tex)), x24_loop(loop), x28_cycleFrames(std::move(cycleFrames))
|
2016-02-06 00:34:40 +00:00
|
|
|
{
|
2018-09-20 18:17:09 +00:00
|
|
|
tileW->GetValue(0, x10_tileW);
|
|
|
|
tileH->GetValue(0, x14_tileH);
|
|
|
|
strideW->GetValue(0, x18_strideW);
|
|
|
|
strideH->GetValue(0, x1c_strideH);
|
2016-02-06 00:34:40 +00:00
|
|
|
|
2016-02-08 05:10:17 +00:00
|
|
|
int width = x4_tex.GetObj()->GetWidth();
|
|
|
|
int height = x4_tex.GetObj()->GetHeight();
|
2016-02-06 00:34:40 +00:00
|
|
|
float widthF = width;
|
|
|
|
float heightF = height;
|
|
|
|
int xTiles = std::max(1, width / x18_strideW);
|
|
|
|
int yTiles = std::max(1, height / x1c_strideH);
|
|
|
|
x20_tiles = xTiles * yTiles;
|
|
|
|
x2c_uvElems.reserve(x20_tiles);
|
|
|
|
for (int y=yTiles-1 ; y>=0 ; --y)
|
|
|
|
{
|
|
|
|
for (int x=0 ; x<xTiles ; ++x)
|
|
|
|
{
|
|
|
|
int px = x18_strideW * x;
|
|
|
|
int px2 = px + x10_tileW;
|
|
|
|
int py = x1c_strideH * y;
|
2016-02-06 07:31:53 +00:00
|
|
|
int py2 = py + x14_tileH;
|
2016-02-06 00:34:40 +00:00
|
|
|
x2c_uvElems.push_back({px / widthF, py / heightF, px2 / widthF, py2 / heightF});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CUVEAnimTexture::GetValueUV(int frame, SUVElementSet& valOut) const
|
|
|
|
{
|
|
|
|
int cv;
|
2016-02-29 03:03:11 +00:00
|
|
|
x28_cycleFrames->GetValue(frame, cv);
|
2016-02-06 00:34:40 +00:00
|
|
|
float cvf = cv / float(x20_tiles);
|
|
|
|
cvf = frame / cvf;
|
|
|
|
|
|
|
|
int tile = cvf;
|
|
|
|
if (x24_loop)
|
|
|
|
{
|
|
|
|
if (cvf >= x20_tiles)
|
|
|
|
tile = int(cvf) % x20_tiles;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (cvf >= x20_tiles)
|
|
|
|
tile = x20_tiles - 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
valOut = x2c_uvElems[tile];
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|