group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
ViewmodelConfig.hpp
Go to the documentation of this file.
1
3
4#pragma once
5
8
9#include <array>
10#include <cstddef>
11#include <glm/vec3.hpp>
12
15{
16 float scale;
18 float yawOffset, pitchOffset, rollOffset; // degrees
19};
20
28{
32 float spineBendMultiplier = 1.0f;
36 float hipLeanMultiplier = 0.1f;
39 float recoilKickRad = 0.06f;
40};
41
47{
48 glm::vec3 offset{0.0f};
49 glm::vec3 rotationDegrees{0.0f};
50};
51
52inline constexpr std::size_t kHandFingerMountCount = 5;
53inline constexpr std::array<const char*, kHandFingerMountCount> kHandFingerMountNames{
54 "Thumb", "Index", "Middle", "Ring", "Pinky"};
55
58{
59 glm::vec3 shoulderOffset{0.0f};
60 glm::vec3 elbowOffset{0.0f};
62 std::array<HandMountPoint, kHandFingerMountCount> fingers{};
63};
64
72
75{
76 glm::vec3 scale{1.0f};
77 glm::vec3 translation{0.0f};
78 float yawOffset = 0.0f;
79 float pitchOffset = 0.0f;
80 float rollOffset = 0.0f;
81 float spinDegreesPerSecond = 45.0f;
82 float bobAmplitude = 6.0f;
83 float bobHz = 0.6f;
84};
85
88{
89 const char* filename;
90 bool flipUVs;
91};
92
95{
96 float pitchKick = 3.0f;
97 float pushBack = 2.0f;
98 float rollKick = 1.0f;
99 float recoverySpeed = 12.0f;
100};
101
104{
105 static constexpr std::array<ViewmodelParams, kRenderableWeaponTypeCount> k_params{{
106 // Rifle — existing tuning
107 {.scale = 10.0f,
108 .forward = 18.0f,
109 .right = 8.0f,
110 .down = -4.0f,
111 .yawOffset = 0.0f,
112 .pitchOffset = -1.0f,
113 .rollOffset = 0.0f},
114 // Rocket — fallback to rifle tuning
115 {.scale = 39.0f,
116 .forward = 7.0f,
117 .right = 27.0f,
118 .down = 77.5f,
119 .yawOffset = 0.0f,
120 .pitchOffset = 0.0f,
121 .rollOffset = 0.0f},
122 // RailGun — marksman
123 {.scale = 20.0f,
124 .forward = 45.0f,
125 .right = 27.0f,
126 .down = 27.0f,
127 .yawOffset = 0.0f,
128 .pitchOffset = 0.0f,
129 .rollOffset = 0.0f},
130 // EnergyGun
131 {.scale = 20.0f,
132 .forward = 65.0f,
133 .right = 35.0f,
134 .down = 24.0f,
135 .yawOffset = 0.0f,
136 .pitchOffset = 0.0f,
137 .rollOffset = 0.0f},
138 // Shotgun
139 {.scale = 75.0f,
140 .forward = 54.5f,
141 .right = 38.5f,
142 .down = 24.0f,
143 .yawOffset = 180.0f,
144 .pitchOffset = 0.0f,
145 .rollOffset = 0.0f},
146 }};
147
148 return k_params[static_cast<std::size_t>(type)];
149}
150
153{
154 static const std::array<ThirdPersonWeaponParams, kRenderableWeaponTypeCount> k_params{{
155 // Rifle — middleweight, full spine bend, moderate recoil.
156 {.spineBendMultiplier = 1.0f, .hipLeanMultiplier = 0.1f, .recoilKickRad = 0.05f},
157 // Rocket launcher — heavy, slower upper-body response, big kick.
158 {.spineBendMultiplier = 0.65f, .hipLeanMultiplier = 0.06f, .recoilKickRad = 0.18f},
159 // RailGun / charge rifle — heavy precision rifle, slower bend, rifle-ish kick.
160 {.spineBendMultiplier = 0.85f, .hipLeanMultiplier = 0.08f, .recoilKickRad = 0.07f},
161 // EnergyGun — light pistol, fast spine bend, gentle kick.
162 {.spineBendMultiplier = 1.0f, .hipLeanMultiplier = 0.1f, .recoilKickRad = 0.03f},
163 // Shotgun — copies EnergyGun (same mesh); heavier kick.
164 {.spineBendMultiplier = 1.0f, .hipLeanMultiplier = 0.1f, .recoilKickRad = 0.12f},
165 }};
166
167 return k_params[static_cast<std::size_t>(type)];
168}
169
182{
183 using BoneAngles = std::array<glm::vec3, kArmHoldBoneCount>;
184
185 // Shared finger curl (right = trigger hand, left = support hand wrapping the
186 // foregrip). (pitch, yaw, roll) degrees; layout matches GripPose::index.
187 static const std::array<glm::vec3, kGripPoseJointCount> k_rightFingers{{
188 {30.0f, 20.0f, 0.0f}, {35.0f, 0.0f, 0.0f}, {25.0f, 0.0f, 0.0f}, {10.0f, 0.0f, 0.0f}, // thumb
189 {25.0f, 0.0f, 0.0f}, {40.0f, 0.0f, 0.0f}, {35.0f, 0.0f, 0.0f}, {15.0f, 0.0f, 0.0f}, // index
190 {55.0f, 0.0f, 0.0f}, {75.0f, 0.0f, 0.0f}, {70.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}, // middle
191 {60.0f, 0.0f, 0.0f}, {80.0f, 0.0f, 0.0f}, {70.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}, // ring
192 {60.0f, 0.0f, 0.0f}, {80.0f, 0.0f, 0.0f}, {70.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}, // pinky
193 }};
194 static const std::array<glm::vec3, kGripPoseJointCount> k_leftFingers{{
195 {35.0f, -20.0f, 0.0f}, {40.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}, {10.0f, 0.0f, 0.0f}, // thumb
196 {65.0f, 0.0f, 0.0f}, {80.0f, 0.0f, 0.0f}, {70.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}, // index
197 {70.0f, 0.0f, 0.0f}, {85.0f, 0.0f, 0.0f}, {70.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}, // middle
198 {70.0f, 0.0f, 0.0f}, {85.0f, 0.0f, 0.0f}, {70.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}, // ring
199 {65.0f, 0.0f, 0.0f}, {85.0f, 0.0f, 0.0f}, {70.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}, // pinky
200 }};
201
202 auto make = [&](glm::vec3 offset, float scale, BoneAngles right, BoneAngles left, float yawDeg = 0.0f) {
204 p.spineOffset = offset;
205 p.spineRotation = glm::angleAxis(glm::radians(yawDeg), glm::vec3(0.0f, 1.0f, 0.0f));
206 p.scale = scale;
207 p.rightArm.boneAngles = right;
208 p.leftArm.boneAngles = left;
209 p.rightArm.fingerAngles = k_rightFingers;
210 p.leftArm.fingerAngles = k_leftFingers;
211 return p;
212 };
213
214 static const std::array<WeaponHoldPose, kRenderableWeaponTypeCount> k_params{{
215 // Rifle
216 make({-21.0f, 23.5f, 66.25f},
217 39.4f,
218 {{{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 44.0f}, {-107.0f, -7.0f, 13.0f}, {-1.0f, 24.0f, -41.0f}}},
219 {{{24.0f, 0.0f, 0.0f}, {36.0f, 0.0f, 48.0f}, {71.0f, -3.0f, 6.0f}, {-11.0f, -46.0f, -23.0f}}}),
220 // Rocket launcher
221 make({-21.0f, -28.25f, 28.75f},
222 39.4f,
223 {{{0.0f, 0.0f, 0.0f}, {0.0f, 42.0f, 18.0f}, {-155.0f, 4.0f, 9.0f}, {6.0f, 106.0f, -62.0f}}},
224 {{{24.0f, 0.0f, 0.0f}, {40.0f, -16.0f, 46.0f}, {103.0f, -3.0f, 5.0f}, {-6.0f, -57.0f, -41.0f}}}),
225 // RailGun / charge rifle
226 make({-21.0f, -18.0f, 66.25f},
227 39.4f,
228 {{{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 44.0f}, {-107.0f, -7.0f, 13.0f}, {-1.0f, 24.0f, -41.0f}}},
229 {{{24.0f, 0.0f, 0.0f}, {36.0f, 0.0f, 48.0f}, {71.0f, -3.0f, 6.0f}, {-11.0f, -46.0f, -23.0f}}}),
230 // EnergyGun
231 make({-21.0f, 3.25f, 80.0f},
232 22.9f,
233 {{{0.0f, -14.0f, 0.0f}, {0.0f, 0.0f, 35.0f}, {-120.0f, 5.0f, 7.0f}, {13.0f, 53.0f, -27.0f}}},
234 {{{24.0f, 0.0f, 0.0f}, {36.0f, 0.0f, 48.0f}, {71.0f, -3.0f, 6.0f}, {-11.0f, -123.0f, -21.0f}}}),
235 // Shotgun
236 make({-21.0f, -7.75f, 80.0f},
237 75.0f,
238 {{{0.0f, -14.0f, 0.0f}, {0.0f, 0.0f, 35.0f}, {-120.0f, 5.0f, 7.0f}, {13.0f, 53.0f, -27.0f}}},
239 {{{24.0f, 0.0f, 0.0f}, {36.0f, 0.0f, 48.0f}, {71.0f, -3.0f, 6.0f}, {-11.0f, -123.0f, -21.0f}}},
240 180.0f),
241 }};
242
243 return k_params[static_cast<std::size_t>(type)];
244}
245
248{
249 // Rifle defaults are the only hand-tuned first-person arm set. Every
250 // other weapon reuses them until per-weapon tuning lands.
251 static constexpr FirstPersonHandMountParams k_rifleFirstPerson{
252 .rightArm = {.shoulderOffset = {20.0f, -22.0f, -38.0f},
253 .elbowOffset = {14.0f, -12.0f, -22.0f},
254 .palm = {.offset = {2.5f, -4.0f, -7.0f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
255 .fingers = {{
256 {.offset = {0.5f, -2.8f, -5.0f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
257 {.offset = {1.0f, -2.0f, -3.5f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
258 {.offset = {2.0f, -2.3f, -4.0f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
259 {.offset = {3.0f, -2.6f, -4.5f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
260 {.offset = {4.0f, -2.9f, -5.0f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
261 }}},
262 .leftArm = {.shoulderOffset = {-28.0f, -23.0f, -24.0f},
263 .elbowOffset = {-20.0f, -13.0f, -4.0f},
264 .palm = {.offset = {-8.0f, -4.5f, 13.0f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
265 .fingers = {{
266 {.offset = {-6.0f, -3.2f, 10.5f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
267 {.offset = {-8.5f, -2.2f, 15.0f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
268 {.offset = {-8.0f, -2.4f, 16.0f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
269 {.offset = {-7.2f, -2.8f, 16.2f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
270 {.offset = {-6.5f, -3.2f, 15.6f}, .rotationDegrees = {0.0f, 0.0f, 0.0f}},
271 }}},
272 .scale = 45.0f};
273 static const std::array<FirstPersonHandMountParams, kRenderableWeaponTypeCount> k_params{{
274 // Rifle
275 k_rifleFirstPerson,
276 // Rocket — rifle defaults until tuned.
277 k_rifleFirstPerson,
278 // RailGun / charge rifle — rifle defaults until tuned.
279 k_rifleFirstPerson,
280 // EnergyGun — rifle defaults until tuned.
281 k_rifleFirstPerson,
282 // Shotgun — rifle defaults until tuned.
283 k_rifleFirstPerson,
284 }};
285
286 return k_params[static_cast<std::size_t>(type)];
287}
288
291{
292 static const WeaponSpawnerModelParams k_grenadeParams{
293 .scale = {20.0f, 20.0f, 20.0f},
294 .translation = {0.0f, 10.0f, 0.0f},
295 .yawOffset = 0.0f,
296 .pitchOffset = 0.0f,
297 .rollOffset = 0.0f,
298 .spinDegreesPerSecond = 45.0f,
299 .bobAmplitude = 6.0f,
300 .bobHz = 0.6f,
301 };
302 if (type == WeaponType::HEGrenade || type == WeaponType::Molotov || type == WeaponType::Sticky) {
303 return k_grenadeParams;
304 }
305
306 static const std::array<WeaponSpawnerModelParams, kRenderableWeaponTypeCount> k_params{{
307 // Rifle
308 {.scale = {16.0f, 16.0f, 16.0f},
309 .translation = {0.0f, 16.0f, 0.0f},
310 .yawOffset = 0.0f,
311 .pitchOffset = 0.0f,
312 .rollOffset = 0.0f,
313 .spinDegreesPerSecond = 45.0f,
314 .bobAmplitude = 6.0f,
315 .bobHz = 0.6f},
316 // Rocket
317 {.scale = {15.0f, 15.0f, 15.0f},
318 .translation = {0.0f, -25.0f, -4.0f},
319 .yawOffset = 0.0f,
320 .pitchOffset = 0.0f,
321 .rollOffset = 0.0f,
322 .spinDegreesPerSecond = 45.0f,
323 .bobAmplitude = 6.0f,
324 .bobHz = 0.6f},
325 // RailGun
326 {.scale = {15.0f, 15.0f, 15.0f},
327 .translation = {0.0f, -5.0f, 0.0f},
328 .yawOffset = 0.0f,
329 .pitchOffset = 0.0f,
330 .rollOffset = 0.0f,
331 .spinDegreesPerSecond = 45.0f,
332 .bobAmplitude = 6.0f,
333 .bobHz = 0.6f},
334 // EnergyGun
335 {.scale = {10.0f, 10.0f, 10.0f},
336 .translation = {0.0f, 2.0f, 0.0f},
337 .yawOffset = 0.0f,
338 .pitchOffset = 0.0f,
339 .rollOffset = 0.0f,
340 .spinDegreesPerSecond = 45.0f,
341 .bobAmplitude = 6.0f,
342 .bobHz = 0.6f},
343 // Shotgun
344 {.scale = {30.0f, 30.0f, 30.0f},
345 .translation = {0.0f, 2.0f, 0.0f},
346 .yawOffset = 0.0f,
347 .pitchOffset = 0.0f,
348 .rollOffset = 0.0f,
349 .spinDegreesPerSecond = 45.0f,
350 .bobAmplitude = 6.0f,
351 .bobHz = 0.6f},
352 }};
353
354 return k_params[static_cast<std::size_t>(type)];
355}
356
359{
360 static constexpr std::array<WeaponModelInfo, kRenderableWeaponTypeCount> k_infos{{
361 {.filename = "assault_rifle.glb", .flipUVs = true},
362 {.filename = "rocket_launcher.glb", .flipUVs = true},
363 {.filename = "rail_gun.glb", .flipUVs = true},
364 {.filename = "energy_gun.glb", .flipUVs = true},
365 {.filename = "shotgun.glb", .flipUVs = true},
366 }};
367 return k_infos[static_cast<std::size_t>(type)];
368}
369
372{
373 static constexpr std::array<RecoilParams, kRenderableWeaponTypeCount> k_params{{
374 // Rifle
375 {.pitchKick = -2.0f, .pushBack = 6.0f, .rollKick = 0.5f, .recoverySpeed = 14.0f},
376 // Rocket
377 {.pitchKick = -3.0f, .pushBack = 16.5f, .rollKick = 2.0f, .recoverySpeed = 6.0f},
378 // RailGun
379 {.pitchKick = -6.0f, .pushBack = 11.0f, .rollKick = 1.0f, .recoverySpeed = 6.0f},
380 // EnergyGun
381 {.pitchKick = 6.0f, .pushBack = 4.0f, .rollKick = 1.5f, .recoverySpeed = 7.0f},
382 // Shotgun
383 {.pitchKick = 9.0f, .pushBack = 6.0f, .rollKick = 1.0f, .recoverySpeed = 5.0f},
384 }};
385
386 return k_params[static_cast<std::size_t>(type)];
387}
Projectile component and weapon/surface type enumerations.
constexpr std::size_t kHandFingerMountCount
Definition ViewmodelConfig.hpp:52
constexpr std::array< const char *, kHandFingerMountCount > kHandFingerMountNames
Definition ViewmodelConfig.hpp:53
const ThirdPersonWeaponParams & getThirdPersonWeaponParams(WeaponType type)
Returns third-person procedural/scale params for a weapon type.
Definition ViewmodelConfig.hpp:152
const FirstPersonHandMountParams & getFirstPersonHandMountParams(WeaponType type)
Returns first-person-only arm controls for a weapon type.
Definition ViewmodelConfig.hpp:247
const RecoilParams & getRecoilParams(WeaponType type)
Returns visual recoil params for a weapon type.
Definition ViewmodelConfig.hpp:371
const ViewmodelParams & getViewmodelParams(WeaponType type)
Returns viewmodel positioning params for a weapon type.
Definition ViewmodelConfig.hpp:103
const WeaponSpawnerModelParams & getWeaponSpawnerModelParams(WeaponType type)
Returns world weapon pickup/spawner model params for a weapon type.
Definition ViewmodelConfig.hpp:290
const WeaponHoldPose & getWeaponHoldPose(WeaponType type)
Returns the default third-person FK hold pose for a weapon type.
Definition ViewmodelConfig.hpp:181
WeaponModelInfo getWeaponModelInfo(WeaponType type)
Returns the GLB filename and load flags for a weapon type.
Definition ViewmodelConfig.hpp:358
Authored per-weapon third-person hold pose (FK weapon-hold rewrite).
WeaponType
Weapon type — determines tracer style, damage, sound, and impact effects.
Definition WeaponState.hpp:12
@ Sticky
Sticks to first surface or player; guaranteed kill when stuck to a player.
Definition WeaponState.hpp:20
@ HEGrenade
Bouncy grenade with 3s fuse, lethal explosion + big knockback.
Definition WeaponState.hpp:18
@ Molotov
Impact-detonate, leaves a fire field (damage over time).
Definition WeaponState.hpp:19
std::array< glm::vec3, kArmHoldBoneCount > boneAngles
Definition WeaponHoldPose.hpp:51
std::array< glm::vec3, kGripPoseJointCount > fingerAngles
Definition WeaponHoldPose.hpp:52
First-person arm controls, independent from third-person weapon grips.
Definition ViewmodelConfig.hpp:58
glm::vec3 shoulderOffset
Definition ViewmodelConfig.hpp:59
std::array< HandMountPoint, kHandFingerMountCount > fingers
Palm-local child offsets.
Definition ViewmodelConfig.hpp:62
glm::vec3 elbowOffset
Definition ViewmodelConfig.hpp:60
HandMountPoint palm
Weapon-local hard anchor for the hand.
Definition ViewmodelConfig.hpp:61
Per-weapon first-person shoulder/elbow/palm/finger target data.
Definition ViewmodelConfig.hpp:67
FirstPersonArmMountSet leftArm
Definition ViewmodelConfig.hpp:69
float scale
Definition ViewmodelConfig.hpp:70
FirstPersonArmMountSet rightArm
Definition ViewmodelConfig.hpp:68
A weapon-local grip point for either hand.
Definition ViewmodelConfig.hpp:47
glm::vec3 rotationDegrees
Definition ViewmodelConfig.hpp:49
glm::vec3 offset
Definition ViewmodelConfig.hpp:48
Visual recoil params per weapon type (viewmodel-only, does not affect aim).
Definition ViewmodelConfig.hpp:95
float rollKick
Degrees of random roll kick per shot.
Definition ViewmodelConfig.hpp:98
float recoverySpeed
Spring decay rate (higher = snappier recovery).
Definition ViewmodelConfig.hpp:99
float pitchKick
Degrees of upward pitch kick per shot.
Definition ViewmodelConfig.hpp:96
float pushBack
Quake units of backward push per shot.
Definition ViewmodelConfig.hpp:97
Per-weapon procedural-overlay + scale params for the third-person body.
Definition ViewmodelConfig.hpp:28
float spineBendMultiplier
Per-weapon-class scaler on the Phase F procedural spine bend (1.0 = full, heavier weapons get less so...
Definition ViewmodelConfig.hpp:32
float recoilKickRad
Per-weapon-class recoil kick magnitude in radians, applied additively to the spine bend when the play...
Definition ViewmodelConfig.hpp:39
float hipLeanMultiplier
Per-weapon-class hip-lean coupling: pelvis pitch (radians) per radian of aim pitch,...
Definition ViewmodelConfig.hpp:36
First-person viewmodel positioning/rotation params per weapon type.
Definition ViewmodelConfig.hpp:15
float yawOffset
Definition ViewmodelConfig.hpp:18
float forward
Definition ViewmodelConfig.hpp:17
float scale
Definition ViewmodelConfig.hpp:16
float rollOffset
Definition ViewmodelConfig.hpp:18
float right
Definition ViewmodelConfig.hpp:17
float pitchOffset
Definition ViewmodelConfig.hpp:18
float down
Definition ViewmodelConfig.hpp:17
Authored per-weapon third-person hold pose (see file header).
Definition WeaponHoldPose.hpp:57
ArmHoldPose rightArm
Definition WeaponHoldPose.hpp:61
glm::vec3 spineOffset
Spine2-local weapon translation (rig/model units).
Definition WeaponHoldPose.hpp:58
ArmHoldPose leftArm
Definition WeaponHoldPose.hpp:62
glm::quat spineRotation
Spine2-local weapon rotation.
Definition WeaponHoldPose.hpp:59
float scale
Weapon mesh scale.
Definition WeaponHoldPose.hpp:60
Asset filename + load flags for a weapon model.
Definition ViewmodelConfig.hpp:88
const char * filename
Definition ViewmodelConfig.hpp:89
bool flipUVs
Definition ViewmodelConfig.hpp:90
World weapon spawner model params.
Definition ViewmodelConfig.hpp:75
float bobAmplitude
Definition ViewmodelConfig.hpp:82
float bobHz
Definition ViewmodelConfig.hpp:83
float pitchOffset
Definition ViewmodelConfig.hpp:79
float spinDegreesPerSecond
Definition ViewmodelConfig.hpp:81
glm::vec3 scale
Definition ViewmodelConfig.hpp:76
float yawOffset
Definition ViewmodelConfig.hpp:78
glm::vec3 translation
Definition ViewmodelConfig.hpp:77
float rollOffset
Definition ViewmodelConfig.hpp:80