Files
2026-05-09 22:10:40 -07:00

405 lines
10 KiB
C++

// BSP_Envelopes.cpp
//
#include "precompiled.h"
#include "BSE_Envelope.h"
/*
==========================
rvEnvParms::GetMinMax
==========================
*/
bool rvEnvParms::GetMinMax(float& min, float& max)
{
bool result = false; // al
if (mTable)
{
min = mTable->GetMinValue();
result = true;
max = mTable->GetMaxValue();
}
else
{
min = 0.0;
max = 0.0;
result = false;
}
return result;
}
/*
==========================
rvEnvParms::Init
==========================
*/
void rvEnvParms::Init(void)
{
mTable = 0;
mIsCount = 1;
mFastLookUp = 0;
mEnvOffset.z = 0.0;
mEnvOffset.y = 0.0;
mEnvOffset.x = 0.0;
mRate.x = 1.0;
mRate.y = 1.0;
mRate.z = 1.0;
}
/*
==========================
rvEnvParms::Compare
==========================
*/
bool rvEnvParms::Compare(const rvEnvParms& comp) const
{
return this->mTable == comp.mTable
&& this->mIsCount == comp.mIsCount
&& this->mRate.x == comp.mRate.x
&& this->mRate.y == comp.mRate.y
&& this->mRate.z == comp.mRate.z
&& this->mEnvOffset.x == comp.mEnvOffset.x
&& this->mEnvOffset.y == comp.mEnvOffset.y
&& this->mEnvOffset.z == comp.mEnvOffset.z;
}
/*
==========================
rvEnvParms::operator=
==========================
*/
void rvEnvParms::operator=(const rvEnvParms& copy)
{
if (this == &copy) {
return;
}
mTable = copy.mTable;
mIsCount = copy.mIsCount;
mStatic = copy.mStatic;
mFastLookUp = copy.mFastLookUp;
mEnvOffset = copy.mEnvOffset;
mRate = copy.mRate;
}
void rvEnvParms::CalcRate(float* rate, float duration, int count)
{
if (!rate || count <= 0) {
return;
}
const float safeDuration = Max(0.002f, duration);
for (int i = 0; i < count; ++i) {
rate[i] = mIsCount ? (rate[i] / safeDuration) : rate[i];
}
}
void rvEnvParms::Evaluate3(const float time, const float* start, const float* rate, const float* end, float* dest)
{
if (!start || !rate || !end || !dest) {
return;
}
if (mTable) {
const float tx = rate[0] * time + mEnvOffset.x;
const float ty = rate[1] * time + mEnvOffset.y;
const float tz = rate[2] * time + mEnvOffset.z;
const float vx = mTable->TableLookup(tx);
const float vy = mTable->TableLookup(ty);
const float vz = mTable->TableLookup(tz);
dest[0] = (end[0] - start[0]) * vx + start[0];
dest[1] = (end[1] - start[1]) * vy + start[1];
dest[2] = (end[2] - start[2]) * vz + start[2];
}
else {
dest[0] = start[0];
dest[1] = start[1];
dest[2] = start[2];
}
}
void rvEnvParms::Evaluate(class rvEnvParms1Particle& env, float time, float oneOverDuration, float* dest)
{
if (!dest) {
return;
}
if (mTable) {
float rate = mRate.x;
if (mIsCount) {
rate *= oneOverDuration;
}
const float lookup = rate * time + mEnvOffset.x;
const float value = mTable->TableLookup(lookup);
*dest = (env.mEnd - env.mStart) * value + env.mStart;
}
else {
*dest = env.mStart;
}
}
void rvEnvParms::Evaluate(class rvEnvParms2Particle& env, float time, float oneOverDuration, float* dest)
{
const idDeclTable* v6; // ecx
float rate_4; // [esp+14h] [ebp-8h]
float rate_4a; // [esp+14h] [ebp-8h]
float v9; // [esp+18h] [ebp-4h]
float timea; // [esp+24h] [ebp+8h]
float timeb; // [esp+24h] [ebp+8h]
float result; // [esp+28h] [ebp+Ch]
float resulta; // [esp+28h] [ebp+Ch]
float resultb; // [esp+28h] [ebp+Ch]
float resultc; // [esp+28h] [ebp+Ch]
if (this->mFastLookUp)
{
rate_4 = this->mRate.x;
if (this->mIsCount)
rate_4 = rate_4 * oneOverDuration;
timea = rate_4 * time + this->mEnvOffset.x;
result = mTable->TableLookup(timea);
*dest = env.mStart.x + (env.mEnd.x - env.mStart.x) * result;
dest[1] = result * (env.mEnd.y - env.mStart.y) + env.mStart.y;
}
else
{
v6 = this->mTable;
if (this->mTable)
{
rate_4a = this->mRate.x;
v9 = this->mRate.y;
if (this->mIsCount)
{
rate_4a = rate_4a * oneOverDuration;
v9 = oneOverDuration * v9;
}
resulta = rate_4a * time + this->mEnvOffset.x;
resultb = v6->TableLookup(resulta);// ((double(__stdcall*)(_DWORD))v6->TableLookup)(LODWORD(resulta));
*dest = (env.mEnd.x - env.mStart.x) * resultb + env.mStart.x;
timeb = v9 * time + this->mEnvOffset.y;
resultc = mTable->TableLookup(timeb); //((double(__stdcall*)(_DWORD))this->mTable->TableLookup)(LODWORD(timeb));
dest[1] = (env.mEnd.y - env.mStart.y) * resultc + env.mStart.y;
}
else
{
*dest = env.mStart.x;
dest[1] = env.mStart.y;
}
}
}
void rvEnvParms::Evaluate(class rvEnvParms3Particle& env, float time, float oneOverDuration, float* dest)
{
const idDeclTable* v6; // ecx
float v8; // [esp+18h] [ebp-10h]
float v9; // [esp+1Ch] [ebp-Ch]
float v10; // [esp+20h] [ebp-8h]
float v11; // [esp+24h] [ebp-4h]
float enva; // [esp+2Ch] [ebp+4h]
float timea; // [esp+30h] [ebp+8h]
float timeb; // [esp+30h] [ebp+8h]
float result; // [esp+34h] [ebp+Ch]
float resulta; // [esp+34h] [ebp+Ch]
float resultb; // [esp+34h] [ebp+Ch]
float resultc; // [esp+34h] [ebp+Ch]
float resultd; // [esp+34h] [ebp+Ch]
if (this->mFastLookUp)
{
v8 = this->mRate.x;
if (this->mIsCount)
v8 = v8 * oneOverDuration;
timea = v8 * time + this->mEnvOffset.x;
result = this->mTable->TableLookup(timea);
*dest = env.mStart.x + (env.mEnd.x - env.mStart.x) * result;
dest[1] = (env.mEnd.y - env.mStart.y) * result + env.mStart.y;
dest[2] = result * (env.mEnd.z - env.mStart.z) + env.mStart.z;
}
else
{
v6 = this->mTable;
if (this->mTable)
{
v9 = this->mRate.x;
v10 = this->mRate.y;
v11 = this->mRate.z;
if (this->mIsCount)
{
v9 = v9 * oneOverDuration;
v10 = v10 * oneOverDuration;
v11 = oneOverDuration * v11;
}
resulta = v9 * time + this->mEnvOffset.x;
resultb = v6->TableLookup(resulta);
*dest = (env.mEnd.x - env.mStart.x) * resultb + env.mStart.x;
enva = v10 * time + this->mEnvOffset.y;
resultc = this->mTable->TableLookup(enva);
dest[1] = (env.mEnd.y - env.mStart.y) * resultc + env.mStart.y;
timeb = v11 * time + this->mEnvOffset.z;
resultd = this->mTable->TableLookup(timeb);
dest[2] = (env.mEnd.z - env.mStart.z) * resultd + env.mStart.z;
}
else
{
*dest = env.mStart.x;
dest[1] = env.mStart.y;
dest[2] = env.mStart.z;
}
}
}
void rvEnvParms::Finalize(void)
{
bool v1; // zf
v1 = this->mTable == 0;
this->mFastLookUp = 0;
if (!v1)
this->mFastLookUp = this->mRate.y == this->mRate.x
&& this->mRate.z == this->mRate.x
&& this->mEnvOffset.y == this->mEnvOffset.x
&& this->mEnvOffset.z == this->mEnvOffset.x;
}
void rvEnvParms1::Init(const rvEnvParms& copy, float duration) {
mTable = copy.mTable;
mEnvOffset = copy.mEnvOffset.x;
mStart = 0.0f;
mEnd = 0.0f;
mRate = copy.mRate.x;
}
void rvEnvParms1::Evaluate(const float time, float* dest) {
if (!dest) {
return;
}
if (mTable) {
const float value = mTable->TableLookup(mRate * time + mEnvOffset);
*dest = mStart + (mEnd - mStart) * value;
}
else {
*dest = mStart;
}
}
void rvEnvParms2::Init(const rvEnvParms& copy, float duration) {
mTable = copy.mTable;
mEnvOffset.Set(copy.mEnvOffset.x, copy.mEnvOffset.y);
mFastLookup = (copy.mRate.x == copy.mRate.y) && (copy.mEnvOffset.x == copy.mEnvOffset.y);
mStart.Zero();
mEnd.Zero();
mRate.Set(copy.mRate.x, copy.mRate.y);
}
void rvEnvParms2::Evaluate(const float time, float* dest) {
if (!dest) {
return;
}
if (mTable) {
if (mFastLookup) {
const float value = mTable->TableLookup(mRate.x * time + mEnvOffset.x);
dest[0] = mStart.x + (mEnd.x - mStart.x) * value;
dest[1] = mStart.y + (mEnd.y - mStart.y) * value;
}
else {
const float valueX = mTable->TableLookup(mRate.x * time + mEnvOffset.x);
const float valueY = mTable->TableLookup(mRate.y * time + mEnvOffset.y);
dest[0] = mStart.x + (mEnd.x - mStart.x) * valueX;
dest[1] = mStart.y + (mEnd.y - mStart.y) * valueY;
}
}
else {
dest[0] = mStart.x;
dest[1] = mStart.y;
}
}
void rvEnvParms3::Init(const rvEnvParms& copy, float duration) {
mTable = copy.mTable;
mEnvOffset = copy.mEnvOffset;
mFastLookup = (copy.mRate.x == copy.mRate.y) && (copy.mRate.x == copy.mRate.z) && (copy.mEnvOffset.x == copy.mEnvOffset.y) && (copy.mEnvOffset.x == copy.mEnvOffset.z);
mStart.Zero();
mEnd.Zero();
mRate = copy.mRate;
}
void rvEnvParms3::Evaluate(const float time, float* dest) {
if (!dest) {
return;
}
if (mTable) {
if (mFastLookup) {
const float value = mTable->TableLookup(mRate.x * time + mEnvOffset.x);
dest[0] = mStart.x + (mEnd.x - mStart.x) * value;
dest[1] = mStart.y + (mEnd.y - mStart.y) * value;
dest[2] = mStart.z + (mEnd.z - mStart.z) * value;
}
else {
const float valueX = mTable->TableLookup(mRate.x * time + mEnvOffset.x);
const float valueY = mTable->TableLookup(mRate.y * time + mEnvOffset.y);
const float valueZ = mTable->TableLookup(mRate.z * time + mEnvOffset.z);
dest[0] = mStart.x + (mEnd.x - mStart.x) * valueX;
dest[1] = mStart.y + (mEnd.y - mStart.y) * valueY;
dest[2] = mStart.z + (mEnd.z - mStart.z) * valueZ;
}
}
else {
dest[0] = mStart.x;
dest[1] = mStart.y;
dest[2] = mStart.z;
}
}
void rvEnvParms1Particle::Init(const rvEnvParms& copy, float duration) {
mStart = 0.0f;
mEnd = 0.0f;
}
void rvEnvParms1Particle::Evaluate(const rvEnvParms& params, const float time, float oneOverDuration, float* dest) {
const_cast<rvEnvParms&>(params).Evaluate(*this, time, oneOverDuration, dest);
}
void rvEnvParms2Particle::Init(const rvEnvParms& copy, float duration) {
mStart.Zero();
mEnd.Zero();
}
void rvEnvParms2Particle::Evaluate(const rvEnvParms& params, const float time, float oneOverDuration, float* dest) {
const_cast<rvEnvParms&>(params).Evaluate(*this, time, oneOverDuration, dest);
}
void rvEnvParms3Particle::Init(const rvEnvParms& copy, float duration) {
mStart.Zero();
mEnd.Zero();
}
void rvEnvParms3Particle::Evaluate(const rvEnvParms& params, const float time, float oneOverDuration, float* dest) {
const_cast<rvEnvParms&>(params).Evaluate(*this, time, oneOverDuration, dest);
}
void rvEnvParms3Particle::Rotate(const rvAngles& angles)
{
this->mStart.x = angles.pitch + this->mStart.x;
this->mStart.y = angles.yaw + this->mStart.y;
this->mStart.z = angles.roll + this->mStart.z;
this->mEnd.x = angles.pitch + this->mEnd.x;
this->mEnd.y = this->mEnd.y + angles.yaw;
this->mEnd.z = angles.roll + this->mEnd.z;
}
void rvEnvParms::SetDefaultType()
{
if (!this->mTable)
{
this->mTable = (const idDeclTable*)declManager->FindType(
DECL_TABLE,
"linear",
1);
this->mIsCount = 1;
this->mFastLookUp = 1;
}
}