// // // Filename: BaseModelInfo.h // Creator: Adam Fowler // $Author: $ // $Date: $ // $Revision: $ // Description: Base class for all model info classes // // #ifndef INC_BASE_MODELINFO_H_ #define INC_BASE_MODELINFO_H_ #include "entity/archetype.h" #if !__SPU // C headers #include // Framework headers #include "entity/archetypemanager.h" #include "fwtl/assetstore.h" // Rage headers #include "fragment/drawable.h" #endif #include "cloth/clothmgr.h" #include "streaming/streamingmodule.h" #include "audio/gameobjects.h" #include "phbound/bound.h" #include "scene/2dEffect.h" #include "spatialdata/aabb.h" #include "Animation/AnimBones.h" #include "scene/lod/LodScale.h" #if !__SPU // Game headers #include "debug/Debug.h" #include "streaming/streamingrequest.h" #endif #include "modelinfo/modelinfo_channel.h" #if !defined(PPUVIRTUAL) #if __SPU #define PPUVIRTUAL #else #define PPUVIRTUAL virtual #endif #endif //forward definitions class CCustomShaderEffectBaseType; class gtaFragType; class CBuoyancyInfo; class CWaterSample; class CClothArchetype; namespace rage { class phArchetypeDamp; class phGlassInst; class rmcDrawable; class fwAssetLocation; }; // Possible model types enum ModelInfoType { MI_TYPE_NONE = AF_TYPE_USER, MI_TYPE_BASE, // 1 MI_TYPE_MLO, // 2 MI_TYPE_TIME, // 3 MI_TYPE_WEAPON, // 4 MI_TYPE_VEHICLE, // 5 MI_TYPE_PED, // 6 MI_TYPE_COMPOSITE, // 7 NUM_MI_TYPES, MI_HIGHEST_FACTORY_ID = NUM_MI_TYPES-1 }; // Extension types enum ExtensionType { // entity extensions EXT_TYPE_DOOR, EXT_TYPE_LIGHT, EXT_TYPE_SPAWN_POINT_OVERRIDE, EXT_TYPE_CLOTH_COLLISIONS, // archetype extensions EXT_TYPE_LADDER = 20, // avoiding overlap with MI_TYPES for now anyway... EXT_TYPE_PROCOBJ = 21, EXT_TYPE_EXPLOSION = 22, EXT_TYPE_PARTICLE = 23, EXT_TYPE_DECAL = 24, EXT_TYPE_WINDDISTURBANCE= 25, EXT_TYPE_LIGHTSHAFT = 26, EXT_TYPE_SCROLL = 27, EXT_TYPE_SPAWNPOINT = 28, EXT_TYPE_BUOYANCY = 29, EXT_TYPE_AUDIO = 30, EXT_TYPE_WORLDPOINT = 31, EXT_TYPE_EXPRESSION = 32, // Unused now: // EXT_TYPE_AVOIDANCE = 33, EXT_TYPE_AUDIO_COLLISIONS = 34, NUM_EXT_TYPES, EXT_HIGHEST_FACTORY_ID = NUM_EXT_TYPES-1 }; // Class prototypes class CTimeInfo; class C2dEffect; class CTunableObjectEntry; struct CAvoidancePointAttr; namespace rage { class phBound; class phBoundComposite; } // Flags as they're used on the tool side in CBaseArchetypeDef enum CBaseArchetypeDefLoadFlags { FLAG_WET_ROAD_REFLECTION = (1<<0),// JWR - this doesn't seem to be used FLAG_DONT_FADE = (1<<1),// JWR - this doesn't seem to be used FLAG_DRAW_LAST = (1<<2), FLAG_PROP_CLIMBABLE_BY_AI = (1<<3), FLAG_SUPPRESS_HD_TXDS = (1<<4), FLAG_IS_FIXED = (1<<5), FLAG_DONT_WRITE_ZBUFFER = (1<<6), FLAG_TOUGHFORBULLETS = (1<<7),// JWR - this doesn't seem to be used FLAG_IS_GENERIC = (1<<8),// JWR - this doesn't seem to be used FLAG_HAS_ANIM = (1<<9), FLAG_HAS_UVANIM = (1<<10), FLAG_SHADOW_ONLY = (1<<11), FLAG_DAMAGE_MODEL = (1<<12), FLAG_DONT_CAST_SHADOWS = (1<<13), FLAG_CAST_TEXTURE_SHADOWS = (1<<14), FLAG_DONT_COLLIDE_WITH_FLYER = (1<<15),// JWR - this doesn't seem to be used FLAG_IS_TREE = (1<<16), FLAG_IS_TYPE_OBJECT = (1<<17), FLAG_OVERRIDE_PHYSICS_BOUNDS = (1<<18), FLAG_AUTOSTART_ANIM = (1<<19), FLAG_HAS_PRE_REFLECTED_WATER_PROXY = (1<<20), FLAG_HAS_DRAWABLE_PROXY_FOR_WATER_REFLECTIONS = (1<<21), FLAG_DOES_NOT_PROVIDE_AI_COVER = (1<<22), FLAG_DOES_NOT_PROVIDE_PLAYER_COVER = (1<<23), FLAG_IS_LADDER_DEPRECATED = (1<<24), FLAG_HAS_CLOTH = (1<<25), FLAG_DOOR_PHYSICS = (1<<26), FLAG_IS_FIXED_FOR_NAVIGATION = (1<<27), FLAG_DONT_AVOID_BY_PEDS = (1<<28), FLAG_USE_AMBIENT_SCALE = (1<<29), FLAG_IS_DEBUG = (1<<30), FLAG_HAS_ALPHA_SHADOW = (1<<31) }; // base model flags enum { // From archetype.h //MODEL_HAS_LOADED = (1<<0), //MODEL_HAS_ANIMATION = (1<<1), //MODEL_DRAW_LAST = (1<<2) MODEL_DONT_WRITE_ZBUFFER = (1<<3), MODEL_IS_TYPE_OBJECT = (1<<4), // gets created as a CObject (replaced IS_DYNAMIC flag) MODEL_SHADOW_PROXY = (1<<5), MODEL_LOD = (1<<6), MODEL_SYNC_OBJ_IN_NET_GAME = (1<<7), MODEL_HD_TEX_CAPABLE = (1<<8), // model uses a txd which can be upgraded to HD MODEL_CARRY_SCRIPTED_RT = (1<<9), MODEL_HAS_ALPHA_SHADOW = (1<<10), MODEL_DOES_NOT_PROVIDE_PLAYER_COVER = (1<<11), MODEL_USE_AMBIENT_SCALE = (1<<12), MODEL_DONT_CAST_SHADOWS = (1<<13), MODEL_HAS_SPAWN_POINTS = (1<<14), MODEL_DOES_NOT_PROVIDE_AI_COVER = (1<<15), MODEL_IS_FIXED = (1<<16), // should be fixed in the world (i.e. infinite mass) MODEL_IS_TREE = (1<<17), MODEL_CLIMBABLE_BY_AI = (1<<18), // object doesn't break apart easily from bullet impacts MODEL_USES_DOOR_PHYSICS = (1<<19), MODEL_IS_FIXED_FOR_NAVIGATION = (1<<20), // object never moves for pathfinding purposes, even though it may fragment. Cut navmesh around it. MODEL_HAS_UVANIMATION = (1<<21), MODEL_NOT_AVOIDED_BY_PEDS = (1<<22), // never add this object into pathfinding system #if __BANK || (__WIN32PC && !__FINAL) MODEL_IS_PROP = (1<<23), #endif MODEL_OVERRIDE_PHYSICS_BOUNDS = (1<<24), MODEL_HAS_PRE_REFLECTED_WATER_PROXY = (1<<25), // bits 26 - 31 are used by special attributes, see below }; // special attributes. These are exclusive (only one of them can be set) enum { MODEL_ATTRIBUTE_NOTHING_SPECIAL = 0, MODEL_ATTRIBUTE_UNUSED1, MODEL_ATTRIBUTE_IS_LADDER, MODEL_ATTRIBUTE_IS_TRAFFIC_LIGHT, MODEL_ATTRIBUTE_IS_BENDABLE_PLANT, MODEL_ATTRIBUTE_IS_GARAGE_DOOR, MODEL_ATTRIBUTE_MLO_WATER_LEVEL, MODEL_ATTRIBUTE_IS_NORMAL_DOOR, MODEL_ATTRIBUTE_IS_SLIDING_DOOR, MODEL_ATTRIBUTE_IS_BARRIER_DOOR, MODEL_ATTRIBUTE_IS_SLIDING_DOOR_VERTICAL, MODEL_ATTRIBUTE_NOISY_BUSH, MODEL_ATTRIBUTE_IS_RAIL_CROSSING_DOOR, MODEL_ATTRIBUTE_NOISY_AND_DEFORMABLE_BUSH, MODEL_SINGLE_AXIS_ROTATION, MODEL_ATTRIBUTE_HAS_DYNAMIC_COVER_BOUND, MODEL_ATTRIBUTE_RUMBLE_ON_LIGHT_COLLISION_WITH_VEHICLE, MODEL_ATTRIBUTE_IS_RAIL_CROSSING_LIGHT, MODEL_ATTRIBUTE_UNUSED18, MODEL_ATTRIBUTE_UNUSED19, MODEL_ATTRIBUTE_UNUSED20, MODEL_ATTRIBUTE_UNUSED21, MODEL_ATTRIBUTE_UNUSED22, MODEL_ATTRIBUTE_UNUSED23, MODEL_ATTRIBUTE_UNUSED24, MODEL_ATTRIBUTE_UNUSED25, MODEL_ATTRIBUTE_UNUSED26, MODEL_ATTRIBUTE_IS_DEBUG, MODEL_ATTRIBUTE_RUBBISH, MODEL_ATTRIBUTE_RUBBISH_ONLY_ON_BIN_DAY, MODEL_ATTRIBUTE_CLOCK, MODEL_ATTRIBUTE_IS_TREE_DEPRECATED, // this is now a flag MODEL_ATTRIBUTE_IS_STREET_LIGHT, MODEL_ATTRIBUTE_COUNT }; CompileTimeAssert(MODEL_ATTRIBUTE_COUNT <= 64); // To reduce the space used up by the flags we have a list of // attributes that are exclusive (only one of these can be set) // These values take the following bits: 26 - 31 #define ATOMIC_L_BITSHIFT (26) #define ATOMIC_L_MASK (63U << ATOMIC_L_BITSHIFT) // vehicle upgrade flags #define MODEL_REPLACEMENT_UPGRADE (1<<24) #define MODEL_UPGRADE_ID_SHIFT (25) #define MODEL_UPGRADE_ID (0x7f<& effects) const; const atArray* Get2dEffectsNoLights(); const atArray* GetLightArray(); // Helper macros for getting the 2d effects array #define GET_2D_EFFECTS(pBaseModelInfo)\ C2dEffect *arrayContents[MAX_NUM_2DEFFECTS]; \ atUserArray a2dEffects(arrayContents,MAX_NUM_2DEFFECTS); \ pBaseModelInfo->Get2dEffects(a2dEffects); \ int numEffects = a2dEffects.GetCount(); #define GET_2D_EFFECTS_NOLIGHTS(pBaseModelInfo)\ const atArray* pa2dEffects = pBaseModelInfo->Get2dEffectsNoLights();\ int iNumEffects = pa2dEffects ? pa2dEffects->GetCount() : 0; s32 GetNum2dEffectsNoLights() const; void SetNum2dEffects(u32 numEffects); C2dEffect** GetNewEffect(); //Audio collision properties const ModelAudioCollisionSettings* GetAudioCollisionSettings(); void SetAudioCollisionSettings(const ModelAudioCollisionSettings * settings, u32 hash); virtual const u16* GetLodSkeletonMap() const { return m_lodSkelBoneMap; } virtual u16 GetLodSkeletonBoneNum() const { return m_lodSkelBoneNum; } void InitLodSkeletonMap(const crSkeletonData* skelData, const crSkeletonData* lodSkelData, const CBaseModelInfo* slodMI); void InitLodSkeletonMap(const crSkeletonData* skelData, const atArray& skinnedBones); void ShutdownLodSkeletonMap(); s32 GetLodSkeletonBoneIndex(s32 boneIndex); bool GetGeneratesWindAudio() const; // --- // drawable/fragtype funcs (mainly to add the shader effect & setup a ptr to the result) virtual void InitMasterDrawableData(u32 modelIdx); virtual void DeleteMasterDrawableData(); virtual void InitMasterFragData(u32 modelIdx); virtual void DeleteMasterFragData(); gtaFragType* GetFragType() const { return (gtaFragType *) fwArchetype::GetFragType(); } void SetDrawableDependenciesAsDirty(bool markTexDict = false); void BumpDrawableRefCount(); void ReleaseDrawable(); int GetDrawableRefCount(); // --- // time stuff virtual CTimeInfo* GetTimeInfo() {return NULL;} virtual s32 GetPropsFileIndex() const {return -1;} void SetPtFxAssetSlot(const s32 ptfxAssetSlot) {m_ptfxAssetSlot = (s16)ptfxAssetSlot;} inline s32 GetPtFxAssetSlot() const {return m_ptfxAssetSlot;} // Scriptid ( used for named rendertarget) void SetScriptId(unsigned int scriptId) { m_scriptId = scriptId; } u32 GetScriptId() { return m_scriptId; } // --- void CheckForHDTxdSlots(void); // check txd chain for this model & set HDTxd flag if any are found fwAssetLocation GetAssetLocation(void) const; // Expression sets. Get only, as it's currently only supported for certain types virtual fwMvExpressionSetId GetExpressionSet() const {return EXPRESSION_SET_ID_INVALID;} public: static phBound* GetLargestBoundFromComposite(phBoundComposite* pCompositeBound); inline CCustomShaderEffectBaseType* GetCustomShaderEffectType() const { return m_pShaderEffectType; } bool CreatePhysicsArchetype(); void DeletePhysicsArchetype(); void AddRefToDrawablePhysics(); void RemoveRefFromDrawablePhysics(); #if __BANK void ReloadWaterSamples(); #endif // __BANK protected: bool SetupCustomShaderEffects(); void DestroyCustomShaderEffects(); virtual void InitWaterSamples(); void DeleteWaterSamples(); #if NORTH_CLOTHS // This is for bendy plant stuff // This is NOT rage environment cloth void InitClothArchetype(); void DeleteClothArchetype(); #endif //NORTH_CLOTHS // Recursive function to generate water samples for an object static int GenerateWaterSamplesFromBoundR(CWaterSample* pWaterSamples,int nNumSamplesInArray,phBound* pBound, int iCurrentComponent); CCustomShaderEffectBaseType* m_pShaderEffectType; // +80 CBuoyancyInfo* m_pBuoyancyInfo; // +84 const ModelAudioCollisionSettings * m_AudioCollisionsOverride; // +88 u32 m_scriptId; // +92 u16* m_lodSkelBoneMap; // +96 u16 m_lodSkelBoneNum; // +100 s16 m_ptfxAssetSlot; // +102 u8 m_fxEntityFlags; // +104 u8 m_type : 5; // +105 u8 m_bHasPreRenderEffects : 1; u8 m_bHasDrawableProxyForWaterReflections : 1; u8 m_tbdGeneralFlag : 1; // these are really specific to CObjects so could be separated out into an extension in the future u32 m_bLeakObjectsIntentionally : 1; u32 m_bNeverDummy : 1; u32 m_tbdObjectFlags : 30; ////////////////////////////////////////////////////////////////////////// atArray* m_p2dEffectPtrs; static int g_wdcascade_TechniqueGroupId; static int g_wdcascade_shadowtexture_TechniqueGroupId; #if __DEV static bool ms_bPrintWaterSampleEvents; static u32 ms_nNumWaterSamplesInMemory; #endif }; #if !__SPU inline u32 CBaseModelInfo::GetAttributes() const { return ( (GetArchetypeFlags() & ATOMIC_L_MASK) >> ATOMIC_L_BITSHIFT); } //#include "system/findsize.h" //FindSize(CBaseModelInfo); // 112 //#include "system/findoffset.h" //FindOffset(CBaseModelInfo, m_pShaderEffectType); // 80 //FindOffset(CBaseModelInfo, m_pBuoyancyInfo); // 84 //FindOffset(CBaseModelInfo, m_audioCollisionSettings); // 88 //FindOffset(CBaseModelInfo, m_scriptId); // 92 //FindOffset(CBaseModelInfo, m_lodSkelBoneMap); // 96 //FindOffset(CBaseModelInfo, m_lodSkelBoneNum); // 100 //FindOffset(CBaseModelInfo, m_nAvoidancePoint2dEffect); // 102 //FindOffset(CBaseModelInfo, m_ptfxAssetSlot); // 104 //FindOffset(CBaseModelInfo, m_fxEntityFlags); // 106 //FindOffset(CBaseModelInfo, m_type); // 107 //FindOffset(CBaseModelInfo, m_p2dEffectPtrs); // 108 CompileTimeAssertSize( CBaseModelInfo, 112, 176 ); #endif //!__SPU... #endif // INC_BASE_MODELINFO_H_