mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-26 21:13:51 +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
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "pipeline/m2_loader.hpp"
|
||||
#include "pipeline/blp_loader.hpp"
|
||||
#include "rendering/m2_model_classifier.hpp"
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <vk_mem_alloc.h>
|
||||
#include <glm/glm.hpp>
|
||||
|
|
@ -78,11 +79,15 @@ struct M2ModelGPU {
|
|||
bool collisionTreeTrunk = false;
|
||||
bool collisionNoBlock = false;
|
||||
bool collisionStatue = false;
|
||||
bool isSmallFoliage = false; // Small foliage (bushes, grass, plants) - skip during taxi
|
||||
bool isInvisibleTrap = false; // Invisible trap objects (don't render, no collision)
|
||||
bool isGroundDetail = false; // Ground clutter/detail doodads (special fallback render path)
|
||||
bool isSmallFoliage = false; // Small foliage (bushes, grass, plants) - skip during taxi
|
||||
bool isInvisibleTrap = false; // Invisible trap objects (don't render, no collision)
|
||||
bool isGroundDetail = false; // Ground clutter/detail doodads (special fallback render path)
|
||||
bool isWaterVegetation = false; // Cattails, reeds, kelp etc. near water (insect spawning)
|
||||
bool isFireflyEffect = false; // Firefly/fireflies M2 (exempt from particle dampeners)
|
||||
bool isWaterfall = false; // Waterfall model (ambient sound + splash particles)
|
||||
bool isBrazierOrFire = false; // Brazier / campfire / bonfire model
|
||||
bool isTorch = false; // Wall-mounted or standing torch
|
||||
AmbientEmitterType ambientEmitterType = AmbientEmitterType::None;
|
||||
|
||||
// Collision mesh with spatial grid (from M2 bounding geometry)
|
||||
struct CollisionMesh {
|
||||
|
|
@ -282,6 +287,8 @@ public:
|
|||
|
||||
bool hasModel(uint32_t modelId) const;
|
||||
bool loadModel(const pipeline::M2Model& model, uint32_t modelId);
|
||||
/** Mark a loaded model as a spell effect (full-brightness particles, no collision). */
|
||||
void markModelAsSpellEffect(uint32_t modelId);
|
||||
|
||||
uint32_t createInstance(uint32_t modelId, const glm::vec3& position,
|
||||
const glm::vec3& rotation = glm::vec3(0.0f),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue