group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
HitscanEffect.hpp
Go to the documentation of this file.
1
3
4#pragma once
5
8
9#include <glm/glm.hpp>
10#include <vector>
11
33{
34public:
38 void update(float dt, glm::vec3 camForward);
39
45 void spawn(glm::vec3 origin, glm::vec3 hitPos, WeaponType wt, glm::vec3 camForward);
46
49 [[nodiscard]] const ArcVertex* arcData() const { return arcVerts_.data(); }
50
53 [[nodiscard]] uint32_t arcCount() const { return static_cast<uint32_t>(arcVerts_.size()); }
54
57 [[nodiscard]] uint32_t activeBeamCount() const;
58
59 // Legacy API compatibility -- beam quad pool not used; everything is arc verts.
60 [[nodiscard]] const HitscanBeam* beamData() const { return nullptr; }
61 [[nodiscard]] uint32_t beamCount() const { return 0; }
62
63private:
64 // Tuning constants
65 static constexpr int k_maxBeams = 4;
66 static constexpr int k_bezierSegs = 32;
67 static constexpr int k_branchSegs = 7;
68 static constexpr int k_maxBranches = 5;
69 static constexpr float k_beamLifetime = 0.22f;
70 static constexpr float k_interpDuration = 0.08f;
71
72 // Internal data structures
73
75 struct Branch
76 {
77 float tStart;
78 float length;
79 float angle;
80 float seed;
81 };
82
84 struct ReturnStroke
85 {
86 float fireAt = 0.f;
87 float seed = 0.f;
88 bool fired = false;
89 };
90
92 struct BezierBeam
93 {
94 glm::vec3 origin, hitPos;
95
96 // Cubic Bezier CPs -- interpolated from prev -> curr over k_interpDuration.
97 glm::vec3 cp1Curr, cp2Curr;
98 glm::vec3 cp1Prev, cp2Prev;
99 float interpT = 1.f;
100
101 // fBm animation time (accumulates each frame).
102 float time = 0.f;
103 float noiseSeed = 0.f;
104 float warpSeed = 0.f;
105
106 Branch branches[k_maxBranches]{};
107 int branchCount = 0;
108 float branchTimer = 0.f;
109 static constexpr float k_branchRetime = 0.045f;
110
111 ReturnStroke returnStrokes[3]{};
112
113 float lifetime = 0.f;
114 bool active = false;
115 };
116
117 BezierBeam beams_[k_maxBeams]{};
118 std::vector<ArcVertex> arcVerts_;
119
120 // Helpers
121
123 static glm::vec3 evalBezier(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2, glm::vec3 p3, float t);
124
126 static glm::vec3 evalBezierTangent(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2, glm::vec3 p3, float t);
127
129 static void randomizeCP(glm::vec3 origin, glm::vec3 hitPos, glm::vec3 camForward, glm::vec3& cp1, glm::vec3& cp2);
130
132 static void rerandomizeBranches(BezierBeam& beam, glm::vec3 camForward);
133
139 void appendArcStrip(const std::vector<glm::vec3>& pts, float radius, glm::vec4 color, glm::vec3 camForward);
140};
GPU-uploadable particle structs for all effect categories.
Projectile component and weapon/surface type enumerations.
WeaponType
Weapon type — determines tracer style, damage, sound, and impact effects.
Definition Projectile.hpp:11
Hitscan energy beam using fBm (fractional Brownian motion) path deviation.
Definition HitscanEffect.hpp:33
const ArcVertex * arcData() const
Get pointer to the arc vertex array for GPU upload.
Definition HitscanEffect.hpp:49
void update(float dt, glm::vec3 camForward)
Update all active beams, rebuilding arc vertex data each frame.
Definition HitscanEffect.cpp:236
uint32_t activeBeamCount() const
Get the number of active beams.
Definition HitscanEffect.cpp:394
uint32_t beamCount() const
Definition HitscanEffect.hpp:61
void spawn(glm::vec3 origin, glm::vec3 hitPos, WeaponType wt, glm::vec3 camForward)
Fire a beam.
Definition HitscanEffect.cpp:189
const HitscanBeam * beamData() const
Definition HitscanEffect.hpp:60
uint32_t arcCount() const
Get the number of arc vertices currently generated.
Definition HitscanEffect.hpp:53
Lightning arc vertex (pre-expanded triangle strip, uploaded as flat stream).
Definition ParticleTypes.hpp:58
Hitscan energy beam (main glowing quad).
Definition ParticleTypes.hpp:46