106 lines
2.9 KiB
C++
106 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include "idlib/math/vector.h"
|
|
|
|
class idDeclRibbon;
|
|
class idMaterial;
|
|
class idRenderModelBeam;
|
|
|
|
enum ribbonState_t : int {
|
|
RIBBON_ACTIVE = 0,
|
|
RIBBON_DEACTIVATING = 1,
|
|
RIBBON_INACTIVE = 2
|
|
};
|
|
|
|
struct idRibbonParameters {
|
|
const idMaterial* material;
|
|
int duration;
|
|
float maxLength;
|
|
float fadeInFraction;
|
|
float fadeOutFraction;
|
|
idVec3 gravity;
|
|
idVec3 velocity;
|
|
float startWidth;
|
|
float endWidth;
|
|
idVec4 color;
|
|
bool viewOriented;
|
|
bool reorientNodes;
|
|
bool textureRepeat;
|
|
bool textureRepeatStretch;
|
|
float textureTMin;
|
|
float textureTMax;
|
|
float nodeSubdivision;
|
|
float minNodeDistance;
|
|
float helixRotationScale;
|
|
float helixRadius;
|
|
float helixVelocity;
|
|
idVec2 helixDistortion0;
|
|
idVec2 helixDistortion1;
|
|
float turbulenceFrequency;
|
|
float turbulenceMagnitude;
|
|
float turbulenceVelocity;
|
|
idVec4 turbulenceMagic;
|
|
};
|
|
|
|
class alignas(4) idRibbon {
|
|
public:
|
|
static constexpr int MAX_NODES = 128;
|
|
|
|
struct ribbonNode_t {
|
|
idVec3 origin;
|
|
idVec3 origin2;
|
|
idVec3 velocity;
|
|
idVec3 orientVec;
|
|
idVec4 color;
|
|
int spawnTime;
|
|
float nodeLength;
|
|
};
|
|
|
|
explicit idRibbon(const idDeclRibbon* decl);
|
|
|
|
void StartRibbon(int time, const idVec3& origin);
|
|
void StopRibbon() {
|
|
if (ribbonState == RIBBON_ACTIVE) ribbonState = RIBBON_DEACTIVATING;
|
|
}
|
|
void UpdatePosition(int currentTime, const idVec3& origin,
|
|
const idMat3& axis, const idVec3& velocity, const idVec4& color);
|
|
void UpdatePosition(int currentTime, const idVec3& origin,
|
|
const idVec3& origin2, const idMat3& axis,
|
|
const idVec3& velocity, const idVec4& color);
|
|
void UpdateGeometry(int currentTime, idRenderModelBeam* beamModel,
|
|
const idMat3& viewAxis, const idVec3& viewOrigin);
|
|
void RemoveOldNodes(int currentTime);
|
|
int GetRemainingTime(int currentTime) const;
|
|
|
|
ribbonState_t ribbonState;
|
|
idVec3 spawnOrg;
|
|
int spawnTime;
|
|
int numActiveNodes;
|
|
int currHeadIdx;
|
|
float startVariance;
|
|
int prevTime;
|
|
idVec3 prevOrigin;
|
|
idVec3 prevOrigin2;
|
|
const idDeclRibbon* ribbonDecl;
|
|
idVec4 globalColor;
|
|
ribbonNode_t ribbonNodes[MAX_NODES];
|
|
bool explicitDefineBothEdges;
|
|
|
|
private:
|
|
void ResetNodes();
|
|
void AddNode(int currentTime, const idVec3& origin,
|
|
const idVec3& origin2, const idMat3& axis,
|
|
const idVec3& velocity, const idVec4& color);
|
|
void CalcTurbulence(const idVec3& origin, const idMat3& axis,
|
|
idVec3& turbulence) const;
|
|
void CalcHelix(int currentTime, const idVec3& origin,
|
|
const idMat3& axis, const idVec3& velocity, idVec3& helix) const;
|
|
};
|
|
|
|
static_assert(sizeof(idRibbon::ribbonNode_t) == 72,
|
|
"Recovered ribbon node ABI changed");
|
|
#if defined(_WIN32) && !defined(_WIN64)
|
|
static_assert(sizeof(idRibbon) == 9300,
|
|
"Recovered idRibbon ABI changed");
|
|
#endif
|