mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-08 18:13:52 +00:00
feat(rendering): implement spell visual effects with bone-tracked ribbons and particles
Add complete spell visual pipeline resolving the DBC chain (Spell → SpellVisual → SpellVisualKit → SpellVisualEffectName → M2) with precast/cast/impact phases, bone-attached positioning, and automatic dual-hand mirroring. Ribbon rendering fixes: - Parse visibility track as uint8 (was read as float, suppressing all ribbon edges due to ~1.4e-45 failing the >0.5 check) - Filter garbage emitters with bone=UINT_MAX unconditionally - Guard against NaN spine positions from corrupt bone data - Resolve ribbon textures via direct index, not textureLookup table - Fall back to bone 0 when ribbon bone index is out of range Particle rendering fixes: - Reduce spell particle scale from 5x to 1.5x (was oversized) - Exempt spell effect instances from position-based deduplication Spell handler integration: - Trigger precast visuals on SMSG_SPELL_START with server castTimeMs - Trigger cast/impact visuals on SMSG_SPELL_GO - Cancel precast visuals on cast interrupt/failure/movement M2 classifier expansion: - Add AmbientEmitterType enum for sound system integration - Add 20+ foliage tokens, 4 spell effect tokens, isSmallFoliage flag - Add markModelAsSpellEffect() to override disableAnimation DBC layouts: - Add SpellVisualID field to Spell.dbc for all expansion configs Signed-off-by: Pavel Okhlopkov <pavel.okhlopkov@flant.com>
This commit is contained in:
parent
0a33e3081c
commit
b79d9b8fea
18 changed files with 803 additions and 90 deletions
|
|
@ -46,7 +46,8 @@ uint32_t M2Renderer::createInstance(uint32_t modelId, const glm::vec3& position,
|
|||
|
||||
// Deduplicate: skip if same model already at nearly the same position.
|
||||
// Uses hash map for O(1) lookup instead of O(N) scan.
|
||||
if (!mdlRef.isGroundDetail) {
|
||||
// Spell effects are exempt — transient visuals must always create fresh instances.
|
||||
if (!mdlRef.isGroundDetail && !mdlRef.isSpellEffect) {
|
||||
DedupKey dk{modelId,
|
||||
static_cast<int32_t>(std::round(position.x * 10.0f)),
|
||||
static_cast<int32_t>(std::round(position.y * 10.0f)),
|
||||
|
|
@ -111,7 +112,8 @@ uint32_t M2Renderer::createInstance(uint32_t modelId, const glm::vec3& position,
|
|||
}
|
||||
|
||||
// Register in dedup map before pushing (uses original position, not ground-adjusted)
|
||||
if (!mdlRef.isGroundDetail) {
|
||||
// Spell effects are exempt from dedup tracking (transient, overlapping allowed).
|
||||
if (!mdlRef.isGroundDetail && !mdlRef.isSpellEffect) {
|
||||
DedupKey dk{modelId,
|
||||
static_cast<int32_t>(std::round(position.x * 10.0f)),
|
||||
static_cast<int32_t>(std::round(position.y * 10.0f)),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue