Files
SingularityViewer/indra/newview/llviewerpartsim.h
2011-08-30 01:05:59 -05:00

210 lines
5.8 KiB
C++

/**
* @file llviewerpartsim.h
* @brief LLViewerPart class header file
*
* $LicenseInfo:firstyear=2003&license=viewergpl$
*
* Copyright (c) 2003-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_LLVIEWERPARTSIM_H
#define LL_LLVIEWERPARTSIM_H
#include "lldarrayptr.h"
#include "llframetimer.h"
#include "llpointer.h"
#include "llpartdata.h"
#include "llviewerpartsource.h"
class LLViewerTexture;
class LLViewerPart;
class LLViewerRegion;
class LLViewerTexture;
class LLVOPartGroup;
typedef void (*LLVPCallback)(LLViewerPart &part, const F32 dt);
///////////////////
//
// An individual particle
//
class LLViewerPart : public LLPartData
{
public:
~LLViewerPart();
public:
LLViewerPart();
void init(LLPointer<LLViewerPartSource> sourcep, LLViewerTexture *imagep, LLVPCallback cb);
U32 mPartID; // Particle ID used primarily for moving between groups
F32 mLastUpdateTime; // Last time the particle was updated
F32 mSkipOffset; // Offset against current group mSkippedTime
LLVPCallback mVPCallback; // Callback function for more complicated behaviors
LLPointer<LLViewerPartSource> mPartSourcep; // Particle source used for this object
// Current particle state (possibly used for rendering)
LLPointer<LLViewerTexture> mImagep;
LLVector3 mPosAgent;
LLVector3 mVelocity;
LLVector3 mAccel;
LLColor4 mColor;
LLVector2 mScale;
static U32 sNextPartID;
};
class LLViewerPartGroup
{
public:
LLViewerPartGroup(const LLVector3 &center,
const F32 box_radius,
bool hud);
virtual ~LLViewerPartGroup();
void cleanup();
BOOL addPart(LLViewerPart* part, const F32 desired_size = -1.f);
void updateParticles(const F32 lastdt);
BOOL posInGroup(const LLVector3 &pos, const F32 desired_size = -1.f);
void shift(const LLVector3 &offset);
typedef std::vector<LLViewerPart*> part_list_t;
part_list_t mParticles;
const LLVector3 &getCenterAgent() const { return mCenterAgent; }
S32 getCount() const { return (S32) mParticles.size(); }
LLViewerRegion *getRegion() const { return mRegionp; }
void removeParticlesByID(const U32 source_id);
LLPointer<LLVOPartGroup> mVOPartGroupp;
BOOL mUniformParticles;
U32 mID;
F32 mSkippedTime;
bool mHud;
protected:
LLVector3 mCenterAgent;
F32 mBoxRadius;
LLVector3 mMinObjPos;
LLVector3 mMaxObjPos;
LLViewerRegion *mRegionp;
};
class LLViewerPartSim : public LLSingleton<LLViewerPartSim>
{
public:
LLViewerPartSim();
virtual ~LLViewerPartSim(){}
void destroyClass();
typedef std::vector<LLViewerPartGroup *> group_list_t;
typedef std::vector<LLPointer<LLViewerPartSource> > source_list_t;
void shift(const LLVector3 &offset);
void updateSimulation();
void addPartSource(LLPointer<LLViewerPartSource> sourcep);
void cleanupRegion(LLViewerRegion *regionp);
BOOL shouldAddPart(); // Just decides whether this particle should be added or not (for particle count capping)
F32 maxRate() // Return maximum particle generation rate
{
if (sParticleCount >= MAX_PART_COUNT)
{
return 1.f;
}
if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
{
return (((F32)sParticleCount/(F32)sMaxParticleCount)-PART_THROTTLE_THRESHOLD)*PART_THROTTLE_RESCALE;
}
return 0.f;
}
F32 getRefRate() { return sParticleAdaptiveRate; }
F32 getBurstRate() {return sParticleBurstRate; }
void addPart(LLViewerPart* part);
void updatePartBurstRate() ;
void clearParticlesByID(const U32 system_id);
void clearParticlesByOwnerID(const LLUUID& task_id);
void removeLastCreatedSource();
const source_list_t* getParticleSystemList() const { return &mViewerPartSources; }
friend class LLViewerPartGroup;
BOOL aboveParticleLimit() const { return sParticleCount > sMaxParticleCount; }
static void setMaxPartCount(const S32 max_parts) { sMaxParticleCount = max_parts; }
static S32 getMaxPartCount() { return sMaxParticleCount; }
static void incPartCount(const S32 count) { sParticleCount += count; }
static void decPartCount(const S32 count) { sParticleCount -= count; }
U32 mID;
protected:
LLViewerPartGroup *createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size, bool hud);
LLViewerPartGroup *put(LLViewerPart* part);
group_list_t mViewerPartGroups;
source_list_t mViewerPartSources;
LLFrameTimer mSimulationTimer;
static S32 sMaxParticleCount;
static S32 sParticleCount;
static F32 sParticleAdaptiveRate;
static F32 sParticleBurstRate;
static const S32 MAX_PART_COUNT;
static const F32 PART_THROTTLE_THRESHOLD;
static const F32 PART_THROTTLE_RESCALE;
static const F32 PART_ADAPT_RATE_MULT;
static const F32 PART_ADAPT_RATE_MULT_RECIP;
//debug use only
public:
static S32 sParticleCount2;
static void checkParticleCount(U32 size = 0) ;
};
#endif // LL_LLVIEWERPARTSIM_H