metaforce/Runtime/World/CFluidUVMotion.cpp

79 lines
2.4 KiB
C++
Raw Normal View History

2016-04-20 05:44:08 +00:00
#include "CFluidUVMotion.hpp"
2017-07-30 11:00:30 +00:00
#include "zeus/Math.hpp"
2016-04-20 05:44:08 +00:00
namespace urde
{
2017-08-13 07:56:35 +00:00
CFluidUVMotion::CFluidUVMotion(float timeToWrap, float orientation,
const CFluidUVMotion::SFluidLayerMotion& colorLayer,
const CFluidUVMotion::SFluidLayerMotion& pattern1Layer,
const CFluidUVMotion::SFluidLayerMotion& pattern2Layer)
: x4c_ooTimeToWrap(1.f / timeToWrap)
, x50_orientation(orientation)
2016-04-20 05:44:08 +00:00
{
x0_fluidLayers.resize(3);
2017-08-13 07:56:35 +00:00
x0_fluidLayers[0] = colorLayer;
x0_fluidLayers[1] = pattern1Layer;
x0_fluidLayers[2] = pattern2Layer;
2016-04-20 05:44:08 +00:00
}
2017-08-13 07:56:35 +00:00
CFluidUVMotion::CFluidUVMotion(float timeToWrap, float orientation)
: x4c_ooTimeToWrap(1.f / timeToWrap), x50_orientation(orientation)
{
x0_fluidLayers.resize(3);
x0_fluidLayers[0].x4_ooTimeToWrap = 0.001f;
x0_fluidLayers[1].x4_ooTimeToWrap = 0.33333334f;
x0_fluidLayers[2].x4_ooTimeToWrap = 0.2f;
x0_fluidLayers[2].x8_orientation = 0.78539819f;
}
2017-07-30 11:00:30 +00:00
2017-08-13 07:56:35 +00:00
void CFluidUVMotion::CalculateFluidTextureOffset(float t, float offsets[3][2]) const
2017-07-30 11:00:30 +00:00
{
2018-06-03 06:11:39 +00:00
float totalYOffset = t * x4c_ooTimeToWrap * std::cos(x50_orientation);
float totalXOffset = t * x4c_ooTimeToWrap * std::sin(x50_orientation);
2017-07-30 11:00:30 +00:00
for (u32 i = 0 ; i<x0_fluidLayers.size() ; ++i)
{
const SFluidLayerMotion& layer = x0_fluidLayers[i];
2017-08-13 07:56:35 +00:00
float speedT = t * layer.x4_ooTimeToWrap;
float cycleT = speedT - std::floor(speedT);
float localY;
float localX;
2017-07-30 11:00:30 +00:00
switch(layer.x0_motion)
{
2018-06-03 06:11:39 +00:00
case EFluidUVMotion::Linear:
{
localX = speedT;
localY = 0.f;
}
break;
case EFluidUVMotion::Circular:
{
2017-08-13 07:56:35 +00:00
float angle = (M_PIF * 2) * cycleT;
2018-06-03 06:11:39 +00:00
localY = layer.xc_magnitude * std::sin(angle);
localX = layer.xc_magnitude * std::cos(angle);
}
break;
2018-06-03 06:11:39 +00:00
case EFluidUVMotion::Oscillate:
{
2017-08-13 07:56:35 +00:00
localY = 0.f;
2018-06-03 06:11:39 +00:00
localX = layer.xc_magnitude * std::cos((M_PIF * 2) * cycleT);
}
break;
default:
2017-08-13 07:56:35 +00:00
localY = localX = 0.f;
2017-07-30 11:00:30 +00:00
break;
}
2018-06-03 06:11:39 +00:00
float x = localX * std::sin(layer.x8_orientation) +
localY * std::cos(layer.x8_orientation) + totalXOffset;
float y = localY * std::sin(layer.x8_orientation) +
localX * std::cos(layer.x8_orientation) + totalYOffset;
2017-08-13 07:56:35 +00:00
offsets[i][0] = x - std::floor(x);
offsets[i][1] = y - std::floor(y);
2017-07-30 11:00:30 +00:00
}
}
2016-04-20 05:44:08 +00:00
}