#ifndef __emeraldboobutils_h #define __emeraldboobutils_h #include #include #include "stdtypes.h" #include "v3math.h" #include "llquaternion.h" struct EmeraldGlobalBoobConfig { bool enabled; F32 mass; F32 hardness; F32 zMax; F32 velMin; F32 velMax; F32 zInfluence; F32 friction; F32 XYInfluence; EmeraldGlobalBoobConfig() : enabled(false), mass(6.4f), hardness(0.67f), zMax(1.29f), velMin(0.0027f*0.017f), velMax(0.0027f), zInfluence(0.0f), friction(0.35f), XYInfluence(0.3f) { } }; std::ostream &operator<<(std::ostream &os, const EmeraldGlobalBoobConfig &v); struct EmeraldAvatarLocalBoobConfig { F32 actualBoobGrav; F32 boobSize; EmeraldAvatarLocalBoobConfig() : actualBoobGrav(0.0f), boobSize(0.0f) { } bool operator==(const EmeraldAvatarLocalBoobConfig &other) const { return actualBoobGrav == other.actualBoobGrav && boobSize == other.boobSize; } }; std::ostream &operator<<(std::ostream &os, const EmeraldAvatarLocalBoobConfig &v); struct EmeraldBoobBounceState; struct EmeraldBoobState { F32 boobGrav; LLVector3 chestPosition; LLQuaternion chestRotation; F32 elapsedTime; F32 frameDuration; LLVector3 chestDisplacement; LLVector3 localChestDisplacement; std::list bounceStates; EmeraldBoobState() : boobGrav(0.0f), chestPosition(0.0f,0.0f,0.0f), chestRotation(0.0f,0.0f,0.0f,1.0f), elapsedTime(0.0f), frameDuration(0.0f), chestDisplacement(0.0f,0.0f,0.0f), localChestDisplacement(0.0f,0.0f,0.0f) { } bool operator==(const EmeraldBoobState &other) const { return boobGrav == other.boobGrav && chestPosition == other.chestPosition && chestRotation == other.chestRotation && elapsedTime == other.elapsedTime && frameDuration == other.frameDuration && chestDisplacement == other.chestDisplacement && localChestDisplacement == other.localChestDisplacement && bounceStates == other.bounceStates; } }; std::ostream &operator<<(std::ostream &os, const EmeraldBoobState &v); struct EmeraldBoobInputs { LLVector3 chestPosition; LLQuaternion chestRotation; F32 elapsedTime; EmeraldBoobInputs() : chestPosition(0.0f,0.0f,0.0f), chestRotation(0.0f,0.0f,0.0f,1.0f), elapsedTime(0.0f) { } bool operator==(const EmeraldBoobInputs &other) const { return chestPosition == other.chestPosition && chestRotation == other.chestRotation && elapsedTime == other.elapsedTime; } }; std::ostream &operator<<(std::ostream &os, const EmeraldBoobInputs &v); struct EmeraldBoobBounceState { F32 bounceStart; F32 bounceStartAmplitude; F32 bounceStartFrameDuration; EmeraldBoobBounceState() : bounceStart(0.0f), bounceStartAmplitude(0.0f), bounceStartFrameDuration(0.0f) { }; bool operator==(const EmeraldBoobBounceState &other) const { return bounceStart == other.bounceStart && bounceStartAmplitude == other.bounceStartAmplitude && bounceStartFrameDuration == other.bounceStartFrameDuration; } }; std::ostream &operator<<(std::ostream &os, const EmeraldBoobBounceState &v); struct EmeraldBoobUtils { public: static EmeraldBoobState idleUpdate(const EmeraldGlobalBoobConfig &config, const EmeraldAvatarLocalBoobConfig &localConfig, const EmeraldBoobState &oldState, const EmeraldBoobInputs &inputs); static F32 convertMass(F32 displayMass); static F32 convertHardness(F32 displayHardness); static F32 convertVelMax(F32 displayVelMax); static F32 convertFriction(F32 displayFriction); static F32 convertVelMin(F32 displayVelMin); }; #endif