You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
292 lines
11 KiB
292 lines
11 KiB
/*==LICENSE==* |
|
|
|
CyanWorlds.com Engine - MMOG client, server and tools |
|
Copyright (C) 2011 Cyan Worlds, Inc. |
|
|
|
This program is free software: you can redistribute it and/or modify |
|
it under the terms of the GNU General Public License as published by |
|
the Free Software Foundation, either version 3 of the License, or |
|
(at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
Additional permissions under GNU GPL version 3 section 7 |
|
|
|
If you modify this Program, or any covered work, by linking or |
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
|
(or a modified version of those libraries), |
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
|
licensors of this Program grant you additional |
|
permission to convey the resulting work. Corresponding Source for a |
|
non-source form of such a combination shall include the source code for |
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
|
work. |
|
|
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
|
or by snail mail at: |
|
Cyan Worlds, Inc. |
|
14617 N Newport Hwy |
|
Mead, WA 99021 |
|
|
|
*==LICENSE==*/ |
|
|
|
#ifndef plDynaDecalMgr_inc |
|
#define plDynaDecalMgr_inc |
|
|
|
#include "pnNetCommon/plSynchedObject.h" |
|
#include "hsTemplates.h" |
|
#include "hsGeometry3.h" |
|
#include "hsMatrix44.h" |
|
#include "hsStlUtils.h" |
|
|
|
|
|
class plParticleSystem; |
|
|
|
class plPrintShape; |
|
class plDynaDecalEnableMsg; |
|
class plDynaDecal; |
|
class plDrawableSpans; |
|
class plGBufferGroup; |
|
class plIcicle; |
|
class hsGMaterial; |
|
class plBitmap; |
|
class plMipmap; |
|
class plSceneObject; |
|
class plArmatureMod; |
|
|
|
class hsStream; |
|
class hsResMgr; |
|
class plMessage; |
|
|
|
class plCutter; |
|
class plCutoutPoly; |
|
class plFlatGridMesh; |
|
|
|
class plDrawVisList; |
|
class plRenderLevel; |
|
|
|
class plAccessSpan; |
|
class plAuxSpan; |
|
class plDecalVtxFormat; |
|
|
|
class plPipeline; |
|
|
|
// plDynaDecalInfo - information we store specific to what we've |
|
// done about a specific avatar part or scene object. |
|
class plDynaDecalInfo |
|
{ |
|
public: |
|
enum |
|
{ |
|
kNone = 0x0, |
|
kImmersed = 0x1, |
|
kActive = 0x2 |
|
}; |
|
|
|
plKey fKey; |
|
|
|
double fLastTime; |
|
hsPoint3 fLastPos; |
|
double fWetTime; |
|
float fWetLength; |
|
uint32_t fFlags; |
|
|
|
plDynaDecalInfo& Init(const plKey& key); |
|
}; |
|
|
|
typedef std::map< uintptr_t, plDynaDecalInfo, std::less<uintptr_t> > plDynaDecalMap; |
|
|
|
// plDynaDecalMgr |
|
// Primary responsibilities: |
|
// Allocation of adequate buffer space in plGBufferGroup |
|
// Setup of decal materials |
|
// Allocation of auxSpans |
|
// Receive lists of polys, translate into drawable tris |
|
// Create DynaDecals and destroy them when they expire. |
|
// Assign vertex and index subsets to DynaDecals |
|
// Call Update on DynaDecals |
|
class plDynaDecalMgr : public plSynchedObject |
|
{ |
|
public: |
|
enum DynaRefType |
|
{ |
|
kRefMatPreShade, |
|
kRefMatRTShade, |
|
kRefTarget, |
|
kRefAvatar, |
|
kRefPartyObject, |
|
kRefParticles, |
|
kRefNextAvailable = 10 |
|
}; |
|
protected: |
|
static hsBool fDisableAccumulate; |
|
static hsBool fDisableUpdate; |
|
|
|
plDynaDecalMap fDecalMap; |
|
|
|
hsTArray<plDynaDecal*> fDecals; |
|
|
|
hsTArray<plGBufferGroup*> fGroups; |
|
|
|
plCutter* fCutter; |
|
|
|
hsTArray<plAuxSpan*> fAuxSpans; |
|
|
|
hsGMaterial* fMatPreShade; |
|
hsGMaterial* fMatRTShade; |
|
|
|
hsTArray<plSceneObject*> fTargets; |
|
|
|
hsTArray<plSceneObject*> fPartyObjects; |
|
hsTArray<plParticleSystem*> fParticles; |
|
|
|
float fPartyTime; |
|
|
|
uint16_t fMaxNumVerts; |
|
uint16_t fMaxNumIdx; |
|
|
|
uint32_t fWaitOnEnable; |
|
|
|
float fWetLength; |
|
float fRampEnd; |
|
float fDecayStart; |
|
float fLifeSpan; |
|
float fIntensity; |
|
|
|
float fGridSizeU; |
|
float fGridSizeV; |
|
|
|
hsVector3 fScale; |
|
|
|
// some temp calculated stuff |
|
float fInitAtten; |
|
// These 4 are in normalized units [0..1], not feet. |
|
float fMinDepth; |
|
float fMinDepthRange; |
|
float fMaxDepth; |
|
float fMaxDepthRange; |
|
|
|
hsTArray<uint32_t> fPartIDs; |
|
hsTArray<plKey> fNotifies; |
|
|
|
const plPrintShape* IGetPrintShape(const plKey& objKey) const; |
|
const plPrintShape* IGetPrintShape(plArmatureMod* avMod, uint32_t id) const; |
|
|
|
virtual hsBool IHandleEnableMsg(const plDynaDecalEnableMsg* enaMsg); |
|
void INotifyActive(plDynaDecalInfo& info, const plKey& armKey, uint32_t id) const; |
|
void INotifyInactive(plDynaDecalInfo& info, const plKey& armKey, uint32_t id) const; |
|
hsBool IWetParts(const plDynaDecalEnableMsg* enaMsg); |
|
hsBool IWetPart(uint32_t id, const plDynaDecalEnableMsg* enaMsg); |
|
void IWetInfo(plDynaDecalInfo& info, const plDynaDecalEnableMsg* enaMsg) const; |
|
float IHowWet(plDynaDecalInfo& info, double t) const; |
|
plDynaDecalInfo& IGetDecalInfo(uintptr_t id, const plKey& key); |
|
void IRemoveDecalInfo(uint32_t id); |
|
void IRemoveDecalInfos(const plKey& key); |
|
|
|
hsGMaterial* ISetAuxMaterial(plAuxSpan* aux, hsGMaterial* mat, hsBool rtLit); |
|
void IAllocAuxSpan(plAuxSpan* aux, uint32_t maxNumVerts, uint32_t maxNumIdx); |
|
plAuxSpan* IGetAuxSpan(plDrawableSpans* targ, int iSpan, hsGMaterial* mat, uint16_t numVerts, uint16_t numIdx); |
|
hsBool IMakeAuxRefs(plPipeline* pipe); |
|
|
|
uint16_t* IGetBaseIdxPtr(const plAuxSpan* auxSpan) const; |
|
plDecalVtxFormat* IGetBaseVtxPtr(const plAuxSpan* auxSpan) const; |
|
|
|
virtual int INewDecal() = 0; |
|
plDynaDecal* IInitDecal(plAuxSpan* aux, double t, uint16_t numVerts, uint16_t numIdx); |
|
void IKillDecal(int i); |
|
void IUpdateDecals(double t); |
|
|
|
void ICountIncoming(hsTArray<plCutoutPoly>& src, uint16_t& numVerts, uint16_t& numIdx) const; |
|
hsBool IConvertPolysColor(plAuxSpan* auxSpan, plDynaDecal* decal, hsTArray<plCutoutPoly>& src); |
|
hsBool IConvertPolysAlpha(plAuxSpan* auxSpan, plDynaDecal* decal, hsTArray<plCutoutPoly>& src); |
|
hsBool IConvertPolysVS(plAuxSpan* auxSpan, plDynaDecal* decal, hsTArray<plCutoutPoly>& src); |
|
hsBool IConvertPolys(plAuxSpan* auxSpan, plDynaDecal* decal, hsTArray<plCutoutPoly>& src); |
|
hsBool IProcessPolys(plDrawableSpans* targ, int iSpan, double t, hsTArray<plCutoutPoly>& src); |
|
hsBool IHitTestPolys(hsTArray<plCutoutPoly>& src) const; |
|
|
|
hsBool IProcessGrid(plDrawableSpans* targ, int iSpan, hsGMaterial* mat, double t, const plFlatGridMesh& grid); |
|
hsBool IConvertFlatGrid(plAuxSpan* auxSpan, plDynaDecal* decal, const plFlatGridMesh& grid) const; |
|
hsBool ICutoutGrid(plDrawableSpans* drawable, int iSpan, hsGMaterial* mat, double secs); |
|
hsBool IHitTestFlatGrid(const plFlatGridMesh& grid) const; |
|
|
|
hsBool ICutoutList(hsTArray<plDrawVisList>& drawVis, double secs); |
|
hsBool ICutoutObject(plSceneObject* so, double secs); |
|
hsBool ICutoutTargets(double secs); |
|
|
|
void ISetDepthFalloff(); // Sets from current cutter settings. |
|
|
|
virtual void ICutoutCallback(const hsTArray<plCutoutPoly>& cutouts, hsBool hasWaterHeight=false, float waterHeight=0.f); |
|
|
|
hsGMaterial* IConvertToEnvMap(hsGMaterial* mat, plBitmap* envMap); |
|
|
|
virtual void SetKey(plKey k); |
|
|
|
hsVector3 IReflectDir(hsVector3 dir) const; |
|
hsMatrix44 IL2WFromHit(hsPoint3 pos, hsVector3 dir) const; |
|
hsVector3 IRandomUp(hsVector3 dir) const; |
|
void IGetParticles(); |
|
|
|
public: |
|
|
|
plDynaDecalMgr(); |
|
virtual ~plDynaDecalMgr(); |
|
|
|
CLASSNAME_REGISTER( plDynaDecalMgr ); |
|
GETINTERFACE_ANY( plDynaDecalMgr, plSynchedObject ); |
|
|
|
virtual void Read(hsStream* stream, hsResMgr* mgr); |
|
virtual void Write(hsStream* stream, hsResMgr* mgr); |
|
|
|
virtual hsBool MsgReceive(plMessage* msg); |
|
|
|
// This is public, because you need to call it after creating |
|
// a DynaDecalMgr on the fly. It's normally called on Read(). |
|
void InitAuxSpans(); |
|
|
|
void SetScale(const hsVector3& v) { fScale = v; } |
|
const hsVector3& GetScale() const { return fScale; } |
|
|
|
void SetWaitOnEnable(hsBool on) { fWaitOnEnable = on; } |
|
hsBool GetWaitOnEnable() const { return fWaitOnEnable; } |
|
|
|
void SetWetLength(float f) { fWetLength = f; } |
|
void SetRampEnd(float f) { fRampEnd = f; } |
|
void SetDecayStart(float f) { fDecayStart = f; } |
|
void SetLifeSpan(float f) { fLifeSpan = f; } |
|
void SetIntensity(float f) { fIntensity = f; } |
|
float GetWetLength() const { return fWetLength; } |
|
float GetRampEnd() const { return fRampEnd; } |
|
float GetDecayStart() const { return fDecayStart; } |
|
float GetLifeSpan() const { return fLifeSpan; } |
|
float GetIntensity() const { return fIntensity; } |
|
|
|
void SetPartyTime(float secs) { fPartyTime = secs; } // Duration of particle spewage |
|
float GetPartyTime() const { return fPartyTime; } |
|
|
|
void ConvertToEnvMap(plBitmap* envMap); |
|
const plMipmap* GetMipmap() const; |
|
|
|
void AddNotify(const plKey& k) { fNotifies.Append(k); } |
|
uint32_t GetNumNotifies() const { return fNotifies.GetCount(); } |
|
const plKey& GetNotify(int i) const { return fNotifies[i]; } |
|
|
|
static void SetDisableAccumulate(hsBool on) { fDisableAccumulate = on; } |
|
static void ToggleDisableAccumulate() { fDisableAccumulate = !fDisableAccumulate; } |
|
static hsBool GetDisableAccumulate() { return fDisableAccumulate; } |
|
|
|
static void SetDisableUpdate(hsBool on) { fDisableUpdate = on; } |
|
static void ToggleDisableUpdate() { fDisableUpdate = !fDisableUpdate; } |
|
static hsBool GetDisableUpdate() { return fDisableUpdate; } |
|
}; |
|
|
|
#endif // plDynaDecalMgr_inc
|
|
|