mirror of
https://github.com/0TheSpy/Seaside.git
synced 2025-01-07 10:03:29 +08:00
289 lines
7.4 KiB
C
289 lines
7.4 KiB
C
#ifndef PARTICLE_UTIL_H
|
|
#define PARTICLE_UTIL_H
|
|
|
|
#include "IMesh.h"
|
|
#include "particledraw.h"
|
|
#include "particlemgr.h"
|
|
#include "cdll_client_int.h"
|
|
#include "timedevent.h"
|
|
|
|
|
|
|
|
inline float FLerp(float minVal, float maxVal, float t)
|
|
{
|
|
return minVal + (maxVal - minVal) * t;
|
|
}
|
|
|
|
inline Vector VecLerp(const Vector& minVal, const Vector& maxVal, float t)
|
|
{
|
|
return minVal + (maxVal - minVal) * t;
|
|
}
|
|
|
|
inline float FRand(float minVal, float maxVal)
|
|
{
|
|
return minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal);
|
|
}
|
|
|
|
inline void PhysicallySimulate(Vector& pos, Vector& velocity, const Vector& acceleration, const float fTimeDelta)
|
|
{
|
|
pos = pos + (velocity + (acceleration * fTimeDelta * 0.5f)) * fTimeDelta;
|
|
velocity = velocity + acceleration * fTimeDelta;
|
|
}
|
|
|
|
|
|
inline Vector GetGravityVector()
|
|
{
|
|
return Vector(0, 0, -150);
|
|
}
|
|
|
|
|
|
inline void RenderParticle_Color255SizeSpecularTCoord3(
|
|
ParticleDraw* pDraw,
|
|
const Vector& pos,
|
|
const Vector& color,
|
|
const float alpha,
|
|
const float size,
|
|
const unsigned char* specular,
|
|
const float tCoord
|
|
)
|
|
{
|
|
if (alpha < 0.5f)
|
|
return;
|
|
|
|
CMeshBuilder* pBuilder = pDraw->GetMeshBuilder();
|
|
if (!pBuilder)
|
|
return;
|
|
|
|
unsigned char ubColor[4];
|
|
ubColor[0] = (unsigned char)RoundFloatToInt(color.x);
|
|
ubColor[1] = (unsigned char)RoundFloatToInt(color.y);
|
|
ubColor[2] = (unsigned char)RoundFloatToInt(color.z);
|
|
ubColor[3] = (unsigned char)RoundFloatToInt(alpha);
|
|
|
|
pBuilder->Position3f(pos.x - size, pos.y - size, pos.z);
|
|
pBuilder->Color4ubv(ubColor);
|
|
pBuilder->TexCoord3f(0, pDraw->m_pSubTexture->m_tCoordMins[0], pDraw->m_pSubTexture->m_tCoordMaxs[1], tCoord);
|
|
pBuilder->Specular3ubv(specular);
|
|
pBuilder->AdvanceVertex();
|
|
|
|
pBuilder->Position3f(pos.x - size, pos.y + size, pos.z);
|
|
pBuilder->Color4ubv(ubColor);
|
|
pBuilder->TexCoord3f(0, pDraw->m_pSubTexture->m_tCoordMins[0], pDraw->m_pSubTexture->m_tCoordMins[1], tCoord);
|
|
pBuilder->Specular3ubv(specular);
|
|
pBuilder->AdvanceVertex();
|
|
|
|
pBuilder->Position3f(pos.x + size, pos.y + size, pos.z);
|
|
pBuilder->Color4ubv(ubColor);
|
|
pBuilder->TexCoord3f(0, pDraw->m_pSubTexture->m_tCoordMaxs[0], pDraw->m_pSubTexture->m_tCoordMins[1], tCoord);
|
|
pBuilder->Specular3ubv(specular);
|
|
pBuilder->AdvanceVertex();
|
|
|
|
pBuilder->Position3f(pos.x + size, pos.y - size, pos.z);
|
|
pBuilder->Color4ubv(ubColor);
|
|
pBuilder->TexCoord3f(0, pDraw->m_pSubTexture->m_tCoordMaxs[0], pDraw->m_pSubTexture->m_tCoordMaxs[1], tCoord);
|
|
pBuilder->Specular3ubv(specular);
|
|
pBuilder->AdvanceVertex();
|
|
}
|
|
|
|
|
|
inline void RenderParticle_Color255Size(
|
|
ParticleDraw* pDraw,
|
|
const Vector& pos,
|
|
const Vector& color,
|
|
const float alpha,
|
|
const float size)
|
|
{
|
|
if (alpha < 0.5f)
|
|
return;
|
|
|
|
CMeshBuilder* pBuilder = pDraw->GetMeshBuilder();
|
|
if (!pBuilder)
|
|
return;
|
|
|
|
unsigned char ubColor[4];
|
|
ubColor[0] = (unsigned char)RoundFloatToInt(color.x);
|
|
ubColor[1] = (unsigned char)RoundFloatToInt(color.y);
|
|
ubColor[2] = (unsigned char)RoundFloatToInt(color.z);
|
|
ubColor[3] = (unsigned char)RoundFloatToInt(alpha);
|
|
|
|
pBuilder->Position3f(pos.x - size, pos.y - size, pos.z);
|
|
pBuilder->Color4ubv(ubColor);
|
|
pBuilder->TexCoord2f(0, pDraw->m_pSubTexture->m_tCoordMins[0], pDraw->m_pSubTexture->m_tCoordMaxs[1]);
|
|
pBuilder->AdvanceVertex();
|
|
|
|
pBuilder->Position3f(pos.x - size, pos.y + size, pos.z);
|
|
pBuilder->Color4ubv(ubColor);
|
|
pBuilder->TexCoord2f(0, pDraw->m_pSubTexture->m_tCoordMins[0], pDraw->m_pSubTexture->m_tCoordMins[1]);
|
|
pBuilder->AdvanceVertex();
|
|
|
|
pBuilder->Position3f(pos.x + size, pos.y + size, pos.z);
|
|
pBuilder->Color4ubv(ubColor);
|
|
pBuilder->TexCoord2f(0, pDraw->m_pSubTexture->m_tCoordMaxs[0], pDraw->m_pSubTexture->m_tCoordMins[1]);
|
|
pBuilder->AdvanceVertex();
|
|
|
|
pBuilder->Position3f(pos.x + size, pos.y - size, pos.z);
|
|
pBuilder->Color4ubv(ubColor);
|
|
pBuilder->TexCoord2f(0, pDraw->m_pSubTexture->m_tCoordMaxs[0], pDraw->m_pSubTexture->m_tCoordMaxs[1]);
|
|
pBuilder->AdvanceVertex();
|
|
}
|
|
|
|
|
|
inline void RenderParticle_Color255SizeNormal(
|
|
ParticleDraw* pDraw,
|
|
const Vector& pos,
|
|
const Vector& color,
|
|
const float alpha,
|
|
const float size,
|
|
const Vector& vNormal)
|
|
{
|
|
if (alpha < 0.5f)
|
|
return;
|
|
|
|
CMeshBuilder* pBuilder = pDraw->GetMeshBuilder();
|
|
if (!pBuilder)
|
|
return;
|
|
|
|
unsigned char ubColor[4];
|
|
ubColor[0] = (unsigned char)RoundFloatToInt(color.x);
|
|
ubColor[1] = (unsigned char)RoundFloatToInt(color.y);
|
|
ubColor[2] = (unsigned char)RoundFloatToInt(color.z);
|
|
ubColor[3] = (unsigned char)RoundFloatToInt(alpha);
|
|
|
|
}
|
|
|
|
|
|
inline void RenderParticle_Color255SizeNormalAngle(
|
|
ParticleDraw* pDraw,
|
|
const Vector& pos,
|
|
const Vector& color,
|
|
const float alpha,
|
|
const float size,
|
|
const Vector& vNormal,
|
|
const float angle)
|
|
{
|
|
if (alpha < 0.5f)
|
|
return;
|
|
|
|
CMeshBuilder* pBuilder = pDraw->GetMeshBuilder();
|
|
if (!pBuilder)
|
|
return;
|
|
|
|
unsigned char ubColor[4];
|
|
ubColor[0] = (unsigned char)RoundFloatToInt(color.x);
|
|
ubColor[1] = (unsigned char)RoundFloatToInt(color.y);
|
|
ubColor[2] = (unsigned char)RoundFloatToInt(color.z);
|
|
ubColor[3] = (unsigned char)RoundFloatToInt(alpha);
|
|
|
|
float ca = (float)cos(angle);
|
|
float sa = (float)sin(angle);
|
|
|
|
}
|
|
|
|
|
|
inline void RenderParticle_ColorSize(
|
|
ParticleDraw* pDraw,
|
|
const Vector& pos,
|
|
const Vector& color,
|
|
const float alpha,
|
|
const float size
|
|
)
|
|
{
|
|
if (alpha < 0.001f)
|
|
return;
|
|
|
|
CMeshBuilder* pBuilder = pDraw->GetMeshBuilder();
|
|
if (!pBuilder)
|
|
return;
|
|
|
|
unsigned char ubColor[4];
|
|
ubColor[0] = (unsigned char)RoundFloatToInt(color.x * 254.9f);
|
|
ubColor[1] = (unsigned char)RoundFloatToInt(color.y * 254.9f);
|
|
ubColor[2] = (unsigned char)RoundFloatToInt(color.z * 254.9f);
|
|
ubColor[3] = (unsigned char)RoundFloatToInt(alpha * 254.9f);
|
|
|
|
}
|
|
|
|
|
|
inline void RenderParticle_ColorSizeAngle(
|
|
ParticleDraw* pDraw,
|
|
const Vector& pos,
|
|
const Vector& color,
|
|
const float alpha,
|
|
const float size,
|
|
const float angle)
|
|
{
|
|
if (alpha < 0.001f)
|
|
return;
|
|
|
|
CMeshBuilder* pBuilder = pDraw->GetMeshBuilder();
|
|
if (!pBuilder)
|
|
return;
|
|
|
|
unsigned char ubColor[4];
|
|
ubColor[0] = (unsigned char)RoundFloatToInt(color.x * 254.9f);
|
|
ubColor[1] = (unsigned char)RoundFloatToInt(color.y * 254.9f);
|
|
ubColor[2] = (unsigned char)RoundFloatToInt(color.z * 254.9f);
|
|
ubColor[3] = (unsigned char)RoundFloatToInt(alpha * 254.9f);
|
|
|
|
float sa, ca;
|
|
SinCos(angle, &sa, &ca);
|
|
|
|
}
|
|
|
|
inline void RenderParticle_ColorSizeAngles(
|
|
ParticleDraw* pDraw,
|
|
const Vector& pos,
|
|
const Vector& color,
|
|
const float alpha,
|
|
const float size,
|
|
const QAngle& angles)
|
|
{
|
|
if (alpha < 0.001f)
|
|
return;
|
|
|
|
CMeshBuilder* pBuilder = pDraw->GetMeshBuilder();
|
|
if (!pBuilder)
|
|
return;
|
|
|
|
unsigned char ubColor[4];
|
|
ubColor[0] = (unsigned char)RoundFloatToInt(color.x * 254.9f);
|
|
ubColor[1] = (unsigned char)RoundFloatToInt(color.y * 254.9f);
|
|
ubColor[2] = (unsigned char)RoundFloatToInt(color.z * 254.9f);
|
|
ubColor[3] = (unsigned char)RoundFloatToInt(alpha * 254.9f);
|
|
|
|
Vector vNorm, vWidth, vHeight;
|
|
AngleVectors(angles, &vNorm, &vWidth, &vHeight);
|
|
|
|
Vector vVertex = pos;
|
|
}
|
|
|
|
inline float GetAlphaDistanceFade(
|
|
const Vector& pos,
|
|
const float fadeNearDist,
|
|
const float fadeFarDist)
|
|
{
|
|
if (-pos.z > fadeFarDist)
|
|
{
|
|
return 1;
|
|
}
|
|
else if (-pos.z > fadeNearDist)
|
|
{
|
|
return (-pos.z - fadeNearDist) / (fadeFarDist - fadeNearDist);
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
inline Vector WorldGetLightForPoint(const Vector& vPos, bool bClamp)
|
|
{
|
|
#if defined(PARTICLEPROTOTYPE_APP)
|
|
return Vector(1, 1, 1);
|
|
#else
|
|
return engine->GetLightForPoint(vPos, bClamp);
|
|
#endif
|
|
}
|
|
|
|
#endif |