mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-17 17:43:52 +00:00
feat(animation): 452 named constants, 30-phase character animation state machine
Add animation_ids.hpp/cpp with all 452 WoW animation ID constants (anim::STAND, anim::RUN, anim::FIRE_BOW, ... anim::FLY_BACKWARDS, etc.), nameFromId() O(1) lookup, and flyVariant() compact 218-element ground→FLY_* resolver. Expand AnimationController into a full state machine with 20+ named states: spell cast (directed→omni→cast fallback chain, instant one-shot release), hit reactions (WOUND/CRIT/DODGE/BLOCK/SHIELD_BLOCK), stun, wounded idle, stealth animation substitution, loot, fishing channel, sit/sleep/kneel down→loop→up transitions, sheathe/unsheathe combat enter/exit, ranged weapons (BOW/GUN/CROSSBOW/THROWN with reload states), game object OPEN/CLOSE/DESTROY, vehicle enter/exit, mount flight directionals (FLY_LEFT/RIGHT/UP/DOWN/BACKWARDS), emote state variants, off-hand/pierce/dual-wield alternation, NPC birth/spawn/drown/rise, sprint aura override, totem idle, NPC greeting/farewell. Add spell_defines.hpp with SpellEffect (~45 constants) and SpellMissInfo (12 constants) namespaces; replace all magic numbers in spell_handler.cpp. Add GAMEOBJECT_BYTES_1 to update field table (all 4 expansion JSONs) and wire GameObjectStateCallback. Add DBC cross-validation on world entry. Expand tools/_ANIM_NAMES from ~35 to 452 entries in m2_viewer.py and asset_pipeline_gui.py. Add tests/test_animation_ids.cpp. Bug fixes included: - Stand state 1 was animating READY_2H(27) — fixed to SITTING(97) - Spell casts ended freeze-frame — add one-shot release animation - NPC 2H swing probe chain missing ATTACK_2H_LOOSE (polearm/staff) - Chair sits (states 2/4/5/6) incorrectly played floor-sit transition - STOP(3) used for all spell casts — replaced with model-aware chain
This commit is contained in:
parent
d54e262048
commit
e58f9b4b40
59 changed files with 3903 additions and 483 deletions
|
|
@ -176,7 +176,7 @@ void main() {
|
|||
if (proj.x >= 0.0 && proj.x <= 1.0 &&
|
||||
proj.y >= 0.0 && proj.y <= 1.0 &&
|
||||
proj.z >= 0.0 && proj.z <= 1.0) {
|
||||
float bias = max(0.0005 * (1.0 - dot(norm, ldir)), 0.00005);
|
||||
float bias = max(0.0005 * (1.0 - abs(dot(norm, ldir))), 0.00005);
|
||||
shadow = sampleShadowPCF(uShadowMap, vec3(proj.xy, proj.z - bias));
|
||||
}
|
||||
shadow = mix(1.0, shadow, shadowParams.y);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ layout(set = 0, binding = 0) uniform PerFrame {
|
|||
vec4 shadowParams;
|
||||
};
|
||||
|
||||
// Phase 2.1: Per-draw push constants (batch-level data only)
|
||||
// Per-draw push constants (batch-level data only)
|
||||
layout(push_constant) uniform Push {
|
||||
int texCoordSet; // UV set index (0 or 1)
|
||||
int isFoliage; // Foliage wind animation flag
|
||||
|
|
@ -24,7 +24,7 @@ layout(set = 2, binding = 0) readonly buffer BoneSSBO {
|
|||
mat4 bones[];
|
||||
};
|
||||
|
||||
// Phase 2.1: Per-instance data read via gl_InstanceIndex (GPU instancing)
|
||||
// Per-instance data read via gl_InstanceIndex (GPU instancing)
|
||||
struct InstanceData {
|
||||
mat4 model;
|
||||
vec2 uvOffset;
|
||||
|
|
@ -51,7 +51,7 @@ layout(location = 4) out float ModelHeight;
|
|||
layout(location = 5) out float vFadeAlpha;
|
||||
|
||||
void main() {
|
||||
// Phase 2.1: Fetch per-instance data from SSBO
|
||||
// Fetch per-instance data from SSBO
|
||||
int instIdx = push.instanceDataOffset + gl_InstanceIndex;
|
||||
mat4 model = instanceData[instIdx].model;
|
||||
vec2 uvOff = instanceData[instIdx].uvOffset;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#version 450
|
||||
|
||||
// Phase 2.3: GPU Frustum Culling for M2 doodads
|
||||
// GPU Frustum Culling for M2 doodads
|
||||
// Each compute thread tests one M2 instance against 6 frustum planes.
|
||||
// Input: per-instance bounding sphere + flags.
|
||||
// Output: uint visibility array (1 = visible, 0 = culled).
|
||||
|
|
|
|||
|
|
@ -116,8 +116,8 @@ void main() {
|
|||
vec4 lsPos = lightSpaceMatrix * vec4(biasedPos, 1.0);
|
||||
vec3 proj = lsPos.xyz / lsPos.w;
|
||||
proj.xy = proj.xy * 0.5 + 0.5;
|
||||
if (proj.x >= 0.0 && proj.x <= 1.0 && proj.y >= 0.0 && proj.y <= 1.0 && proj.z <= 1.0) {
|
||||
float bias = 0.0002;
|
||||
if (proj.x >= 0.0 && proj.x <= 1.0 && proj.y >= 0.0 && proj.y <= 1.0 && proj.z >= 0.0 && proj.z <= 1.0) {
|
||||
float bias = max(0.0005 * (1.0 - abs(dot(norm, ldir))), 0.00005);
|
||||
shadow = sampleShadowPCF(uShadowMap, vec3(proj.xy, proj.z - bias));
|
||||
shadow = mix(1.0, shadow, shadowParams.y);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ void main() {
|
|||
if (proj.x >= 0.0 && proj.x <= 1.0 &&
|
||||
proj.y >= 0.0 && proj.y <= 1.0 &&
|
||||
proj.z >= 0.0 && proj.z <= 1.0) {
|
||||
float bias = max(0.0005 * (1.0 - dot(norm, ldir)), 0.00005);
|
||||
float bias = max(0.0005 * (1.0 - abs(dot(norm, ldir))), 0.00005);
|
||||
shadow = sampleShadowPCF(uShadowMap, vec3(proj.xy, proj.z - bias));
|
||||
}
|
||||
shadow = mix(1.0, shadow, shadowParams.y);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue