mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-15 17:03:50 +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
|
|
@ -7,6 +7,17 @@
|
|||
namespace wowee {
|
||||
namespace rendering {
|
||||
|
||||
/// Ambient sound emitter type for doodad models (fire, water, etc.).
|
||||
enum class AmbientEmitterType : uint8_t {
|
||||
None = 0,
|
||||
FireplaceSmall = 1, ///< Small fire / campfire
|
||||
FireplaceLarge = 2, ///< Large brazier / bonfire
|
||||
Torch = 3, ///< Wall torch / standing torch
|
||||
Fountain = 4, ///< Fountain water loop
|
||||
Waterfall = 5, ///< Waterfall ambient
|
||||
Forge = 6, ///< Forge / anvil fire
|
||||
};
|
||||
|
||||
/**
|
||||
* Output of classifyM2Model(): all name/geometry-based flags for an M2 model.
|
||||
* Pure data — no Vulkan, GPU, or asset-manager dependencies.
|
||||
|
|
@ -25,6 +36,7 @@ struct M2ClassificationResult {
|
|||
|
||||
// --- Rendering / effect classification ---
|
||||
bool isFoliageLike = false; ///< Foliage or tree (wind sway, disabled animation)
|
||||
bool isSmallFoliage = false; ///< Small bush/grass/plant (skip during taxi/flight)
|
||||
bool isSpellEffect = false; ///< Spell effect / particle-dominated visual
|
||||
bool isLavaModel = false; ///< Lava surface (UV scroll animation)
|
||||
bool isInstancePortal = false; ///< Instance portal (additive, spin, no collision)
|
||||
|
|
@ -36,6 +48,12 @@ struct M2ClassificationResult {
|
|||
bool isGroundDetail = false; ///< Ground-clutter detail doodad (always non-blocking)
|
||||
bool isInvisibleTrap = false; ///< Event-object invisible trap (no render, no collision)
|
||||
bool isSmoke = false; ///< Smoke model (UV scroll animation)
|
||||
bool isWaterfall = false; ///< Waterfall model (ambient sound + splash particles)
|
||||
bool isBrazierOrFire = false; ///< Brazier / campfire / bonfire model
|
||||
bool isTorch = false; ///< Wall-mounted or standing torch
|
||||
|
||||
// --- Ambient emitter type (for sound system) ---
|
||||
AmbientEmitterType ambientEmitterType = AmbientEmitterType::None;
|
||||
|
||||
// --- Animation flags ---
|
||||
bool disableAnimation = false; ///< Keep visually stable (foliage, chest lids, etc.)
|
||||
|
|
@ -89,5 +107,18 @@ struct M2BatchTexClassification {
|
|||
*/
|
||||
M2BatchTexClassification classifyBatchTexture(const std::string& lowerTexKey);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Lightweight ambient emitter classification (name-only, no geometry needed)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Classify an M2 model path for ambient sound emitter type.
|
||||
* Faster than the full classifyM2Model() when only the emitter type is needed.
|
||||
*
|
||||
* @param lowerName Lowercased model path/name
|
||||
* @return AmbientEmitterType::None if the model is not an ambient emitter source
|
||||
*/
|
||||
AmbientEmitterType classifyAmbientEmitter(const std::string& lowerName);
|
||||
|
||||
} // namespace rendering
|
||||
} // namespace wowee
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue