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.

300 lines
12 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/>.
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 plMaxNodeBase_inc
#define plMaxNodeBase_inc
#include "hsTypes.h"
#include "hsTemplates.h"
#include "max.h"
#include "hsMatrix44.h"
#include "hsColorRGBA.h"
#include "pnKeyedObject/plKey.h"
#include "plLoadMask.h"
class plLocation;
class plSceneObject;
class plModifier;
class plComponentBase;
class ISkin;
class plMaxNodeData;
class hsGMesh;
class plRenderLevel;
class plGeometrySpan;
class plSharedMesh;
class plMaxBoneMap;
//-------------------------------------------
// plMaxNodeBase
//-------------------------------------------
// CAREFUL! This class is different, it is derived from Max's INode (as you can see)
// But we can only add (NON Virtual) functions to plMaxNodeBase directly
// If you want some new Data members, you can add them by adding to the class
// plMaxNodeData This data is stored in each INode through some mechanisms supplied
// It would be nice of you to add GetFunctions for each new data member you add (see below)
//--------------------------------------------
// NOTE: an INode can be cast to a plMaxNodeBase, but currently it is the MakeSceneObject Pass which
// Adds the plMaxNodeData to the Node
//
// This class should only reference classes that are in the nucleus. Anything
// that needs more should go into plMaxNode
class plMaxNodeBase : public INode
{
public:
plMaxNodeData *GetMaxNodeData(); // perhaps with full getters and Setters, we can make this protected
void SetMaxNodeData(plMaxNodeData * pDat);
//------------------------------
// Get Data from MaxNodeData
//------------------------------
// If recalculate is true the cached value is ignored. (Useful in the SceneViewer)
hsBool CanConvert(bool recalculate=false);
plLocation GetLocation();
plKey GetKey();
plSceneObject* GetSceneObject();
hsBool GetForceLocal();
hsBool GetReverseSort();
hsBool GetSortAsOpaque();
hsBool GetRunTimeLight();
hsBool GetForceMatShade();
hsBool GetForceVisLOS();
hsBool GetEnviron();
hsBool GetEnvironOnly();
hsBool GetWaterDecEnv();
hsBool GetVS();
hsBool GetHasWaterHeight();
hsScalar GetWaterHeight();
hsBool GetSmoothAll();
hsBool GetForceSortable();
hsBool GetConcave();
hsBool GetCalcEdgeLens();
hsBool GetNoPreShade();
hsBool GetForcePreShade();
plKey GetRoomKey();
hsBool GetDrawable();
hsBool GetPhysical();
hsBool GetItinerant();
hsBool GetUnBounded();
hsBool GetDisableNormal();
UInt32 GetDecalLevel();
hsBool GetMovable();
hsBool GetNoShadow();
hsBool GetForceShadow();
hsBool GetAlphaTestHigh();
hsBool GetFilterInherit();
hsBool GetIsBarney();
hsBool GetNoSpanSort();
hsBool GetNoSpanReSort();
hsBool GetNoFaceSort();
hsBool GetNoDeferDraw();
hsBool GetBlendToFB();
hsBool GetForceMaterialCopy();
hsBool GetInstanced();
hsBool GetParticleRelated();
UInt32 GetSoundIdxCounter();
plSceneObject* GetAvatarSO();
BOOL HasFade();
Box3 GetFade();
hsBool GetDup2Sided();
hsBool GetRadiateNorms();
BOOL HasNormalChan();
int GetNormalChan();
BOOL GetGeoDice(int& maxFaces, float& maxSize, int& minFaces);
hsBool GetIsGUI();
plSharedMesh* GetSwappableGeom();
UInt32 GetSwappableGeomTarget();
plMaxBoneMap* GetBoneMap();
hsBool GetOverrideHighLevelSDL();
UInt8 GetAnimCompress();
hsScalar GetKeyReduceThreshold();
int NumRenderDependencies();
plMaxNodeBase* GetRenderDependency(int i);
int NumBones();
plMaxNodeBase* GetBone(int i);
//------------------------------
// Set Data from MaxNodeData
//------------------------------
void SetCanConvert(hsBool b);
void SetMesh(hsGMesh *p);
void SetRoomKey(plKey p);
void SetDrawable(hsBool b);
void SetPhysical(hsBool b);
void SetItinerant(hsBool b);
void SetUnBounded(hsBool b);
void SetDisableNormal(hsBool b);
void SetDecalLevel(UInt32 i);
void SetMovable(hsBool b);
void SetNoPreShade(hsBool b);
void SetForcePreShade(hsBool b);
void SetReverseSort(hsBool b);
void SetSortAsOpaque(hsBool b);
void SetVS(hsBool b);
void SetHasWaterHeight(hsBool b);
void SetWaterHeight(hsScalar h);
void SetSmoothAll(hsBool b);
void SetForceSortable(hsBool b);
void SetConcave(hsBool b);
void SetCalcEdgeLens(hsBool b);
void SetRunTimeLight(hsBool b);
void SetForceMatShade(hsBool b);
void SetForceVisLOS(hsBool b);
void SetEnviron(hsBool b);
void SetEnvironOnly(hsBool b);
void SetWaterDecEnv(hsBool b);
void SetForceLocal(hsBool b);
void SetIsBarney(hsBool b);
void SetForceShadow(hsBool b);
void SetAlphaTestHigh(hsBool b);
void SetFilterInherit(hsBool b);
void SetNoShadow(hsBool b);
void SetNoSpanSort(hsBool b);
void SetNoSpanReSort(hsBool b);
void SetNoFaceSort(hsBool b);
void SetNoDeferDraw(hsBool b);
void SetBlendToFB(hsBool b);
void SetForceMaterialCopy(hsBool b);
void SetInstanced(hsBool b);
void SetParticleRelated(hsBool b);
void SetSoundIdxCounter(UInt32 ctr);
void SetAvatarSO(plSceneObject *so);
void SetFade(const Box3& b);
void SetDup2Sided(hsBool b);
void SetRadiateNorms(hsBool b);
void SetNormalChan(int n);
void SetGeoDice(BOOL on, int maxFaces, float maxSize, int minFaces);
void SetIsGUI(hsBool b);
void SetSwappableGeom(plSharedMesh *sm);
void SetSwappableGeomTarget(UInt32 id);
void SetBoneMap(plMaxBoneMap *bones);
void SetOverrideHighLevelSDL(hsBool b);
void SetAnimCompress(UInt8 v);
void SetKeyReduceThreshold(hsScalar v);
hsBool AddRenderDependency(plMaxNodeBase* m);
hsBool RenderDependsOn(plMaxNodeBase* m);
void ClearRenderDependencies();
void AddBone(plMaxNodeBase* m);
void ClearBones();
// Dirty flags for SceneWatcher use
enum { kGeomDirty = 0x1, kMatDirty = 0x2, kAllDirty = 0xFF };
hsBool GetDirty(UInt8 i);
void SetDirty(UInt8 i, hsBool b);
plKey GetParentKey() { plMaxNodeBase *pPar = (plMaxNodeBase*)GetParentNode(); hsAssert(pPar, "No Parent"); return pPar->GetKey(); }
ISkin* FindSkinModifier(); // Returns the object's skin modifier if it has one, else nil
const plRenderLevel& GetRenderLevel(hsBool forBlend);
hsBool HasLoadMask();
plLoadMask GetLoadMask();
void AddLoadMask(const plLoadMask& m);
hsBool IsTMAnimated();
hsBool IsTMAnimatedRecur();
hsBool IsMovable(); // Checks to see whether this node will ever move in the scene
bool IsXRef(); // Returns true if object is an XRef or part of an XRef'd scene
//----------
// Component
//----------
hsBool IsComponent(Object *obj=nil); // Object pointer is only necessary for internal use,
hsBool IsExternComponent(Object *obj=nil);
plComponentBase *ConvertToComponent(); // Returns nil if node is not a component
// Normally you will only want the components that are attached to you
// because you are in their targets list. However, in some cases a
// component will want to know what other components are attached to it. In
// that case, set all to true, so that the attached components won't be
// verified to be in your target list.
UInt32 NumAttachedComponents(bool all=false);
plComponentBase *GetAttachedComponent(UInt32 i, bool all=false);
hsBool Contains(const Point3& worldPt); // is the world space point inside my (CONVEX) geometry or dummy box?
hsBool Contains(const Box3& bnd, const Matrix3& l2w); // is the box contained entirely inside my (CONVEX) geometry or dummy box?
hsScalar BoxVolume(const Box3& bnd, const Matrix3& l2w);
hsScalar RegionPriority(); // returns a dominance factor. If a point is in more than one environmental
// region, the region with highest priority wins.
Interface *GetInterface() { return ::GetCOREInterface(); }
static hsMatrix44 Matrix3ToMatrix44(const Matrix3& m3);
static Matrix3 Matrix44ToMatrix3(const hsMatrix44& m44);
// Don't use these two functions, they probably don't return what
// you think they do. See code comments.
Matrix3 GetWorldToParent(TimeValue t);
Matrix3 GetParentToWorld(TimeValue t);
hsMatrix44 GetLocalToParent44(TimeValue t = TimeValue(0));
hsMatrix44 GetParentToLocal44(TimeValue t = TimeValue(0));
hsMatrix44 GetLocalToWorld44(TimeValue t = TimeValue(0));
hsMatrix44 GetWorldToLocal44(TimeValue t = TimeValue(0));
hsMatrix44 GetOTM44(TimeValue t = TimeValue(0));
hsMatrix44 GetVertToLocal44(TimeValue t = TimeValue(0));
hsMatrix44 GetLocalToVert44(TimeValue t = TimeValue(0));
hsMatrix44 GetOBBToLocal44(TimeValue t = TimeValue(0));
hsMatrix44 GetLocalToOBB44(TimeValue t = TimeValue(0));
Matrix3 GetLocalToParent(TimeValue t = TimeValue(0));
Matrix3 GetParentToLocal(TimeValue t = TimeValue(0));
Matrix3 GetLocalToWorld(TimeValue t = TimeValue(0));
Matrix3 GetWorldToLocal(TimeValue t = TimeValue(0));
Matrix3 GetOTM(TimeValue t = TimeValue(0));
Matrix3 GetVertToLocal(TimeValue t = TimeValue(0));
Matrix3 GetLocalToVert(TimeValue t = TimeValue(0));
Matrix3 GetOBBToLocal(TimeValue t = TimeValue(0));
Matrix3 GetLocalToOBB(TimeValue t = TimeValue(0));
protected:
// AppDataChunk sub-chunk id's
enum
{
kPlasmaAgeChunk, // No longer in use, but cleared from old files
kPlasmaDistChunk, // No longer in use, but cleared from old files
kPlasmaRoomChunk, // No longer in use, but cleared from old files
kPlasmaMaxNodeDataChunk,
kPlasmaSceneViewerChunk,
kPlasmaLightChunk, // No longer in use, but cleared from old files
};
UInt8 *IGetSceneViewerChunk();
// Attempts to convert a RefMaker pointer to a component. Returns nil if it is not a component.
plComponentBase *IRefMakerToComponent(ReferenceMaker *maker, bool all);
UInt32 IGetMajorRenderLevel(hsBool forBlend);
UInt32 IGetMinorRenderLevel(hsBool forBlend);
hsBool IRenderLevelSet(hsBool forBlend);
void ISetRenderLevel(const plRenderLevel& l, hsBool forBlend);
const plRenderLevel& IGetRenderLevel(hsBool forBlend);
plRenderLevel ICalcRenderLevel(hsBool forBlend);
};
#endif //plMaxNodeBase_inc