diff options
Diffstat (limited to 'src/modelinfo')
-rw-r--r-- | src/modelinfo/BaseModelInfo.cpp | 16 | ||||
-rw-r--r-- | src/modelinfo/BaseModelInfo.h | 40 | ||||
-rw-r--r-- | src/modelinfo/ClumpModelInfo.cpp | 57 | ||||
-rw-r--r-- | src/modelinfo/ClumpModelInfo.h | 14 | ||||
-rw-r--r-- | src/modelinfo/MloModelInfo.cpp | 39 | ||||
-rw-r--r-- | src/modelinfo/MloModelInfo.h | 14 | ||||
-rw-r--r-- | src/modelinfo/ModelIndices.h | 198 | ||||
-rw-r--r-- | src/modelinfo/ModelInfo.cpp | 77 | ||||
-rw-r--r-- | src/modelinfo/ModelInfo.h | 14 | ||||
-rw-r--r-- | src/modelinfo/PedModelInfo.cpp | 302 | ||||
-rw-r--r-- | src/modelinfo/PedModelInfo.h | 34 | ||||
-rw-r--r-- | src/modelinfo/SimpleModelInfo.cpp | 49 | ||||
-rw-r--r-- | src/modelinfo/SimpleModelInfo.h | 17 | ||||
-rw-r--r-- | src/modelinfo/TimeModelInfo.h | 3 | ||||
-rw-r--r-- | src/modelinfo/VehicleModelInfo.cpp | 272 | ||||
-rw-r--r-- | src/modelinfo/VehicleModelInfo.h | 42 | ||||
-rw-r--r-- | src/modelinfo/WeaponModelInfo.cpp | 55 | ||||
-rw-r--r-- | src/modelinfo/WeaponModelInfo.h | 22 | ||||
-rw-r--r-- | src/modelinfo/XtraCompsModelInfo.h | 12 |
19 files changed, 609 insertions, 668 deletions
diff --git a/src/modelinfo/BaseModelInfo.cpp b/src/modelinfo/BaseModelInfo.cpp index a2779107..31bb2500 100644 --- a/src/modelinfo/BaseModelInfo.cpp +++ b/src/modelinfo/BaseModelInfo.cpp @@ -4,12 +4,14 @@ #include "TxdStore.h" #include "2dEffect.h" #include "BaseModelInfo.h" +#include "ModelInfo.h" +//--MIAMI: file done CBaseModelInfo::CBaseModelInfo(ModelInfoType type) { m_colModel = nil; - m_twodEffects = nil; + m_2dEffectsID = -1; m_objectId = -1; m_refCount = 0; m_txdSlot = -1; @@ -23,7 +25,7 @@ CBaseModelInfo::Shutdown(void) { DeleteCollisionModel(); DeleteRwObject(); - m_twodEffects = nil; + m_2dEffectsID = -1; m_num2dEffects = 0; m_txdSlot = -1; } @@ -76,17 +78,17 @@ CBaseModelInfo::RemoveTexDictionaryRef(void) void CBaseModelInfo::Init2dEffects(void) { - m_twodEffects = nil; + m_2dEffectsID = -1; m_num2dEffects = 0; } void CBaseModelInfo::Add2dEffect(C2dEffect *fx) { - if(m_twodEffects) + if(m_2dEffectsID >= 0) m_num2dEffects++; else{ - m_twodEffects = fx; + m_2dEffectsID = CModelInfo::Get2dEffectStore().getIndex(fx); m_num2dEffects = 1; } } @@ -94,8 +96,8 @@ CBaseModelInfo::Add2dEffect(C2dEffect *fx) C2dEffect* CBaseModelInfo::Get2dEffect(int n) { - if(m_twodEffects) - return &m_twodEffects[n]; + if(m_2dEffectsID >= 0) + return CModelInfo::Get2dEffectStore().getItem(m_2dEffectsID+n); else return nil; } diff --git a/src/modelinfo/BaseModelInfo.h b/src/modelinfo/BaseModelInfo.h index 783f871f..e7dd9e4b 100644 --- a/src/modelinfo/BaseModelInfo.h +++ b/src/modelinfo/BaseModelInfo.h @@ -2,18 +2,20 @@ #include "Collision.h" -#define MAX_MODEL_NAME (24) +#define MAX_MODEL_NAME (21) enum ModelInfoType : uint8 { - MITYPE_NA = 0, - MITYPE_SIMPLE = 1, - MITYPE_MLO = 2, - MITYPE_TIME = 3, - MITYPE_CLUMP = 4, - MITYPE_VEHICLE = 5, - MITYPE_PED = 6, - MITYPE_XTRACOMPS = 7, + MITYPE_NA, + MITYPE_SIMPLE, + MITYPE_MLO, // unused but still in enum + MITYPE_TIME, + MITYPE_WEAPON, + MITYPE_CLUMP, + MITYPE_VEHICLE, + MITYPE_PED, + MITYPE_XTRACOMPS, // unused but still in enum + MITYPE_HAND // xbox and mobile }; VALIDATE_SIZE(ModelInfoType, 1); @@ -23,14 +25,14 @@ class CBaseModelInfo { protected: char m_name[MAX_MODEL_NAME]; + ModelInfoType m_type; + uint8 m_num2dEffects; + bool m_bOwnsColModel; CColModel *m_colModel; - C2dEffect *m_twodEffects; + int16 m_2dEffectsID; int16 m_objectId; uint16 m_refCount; int16 m_txdSlot; - ModelInfoType m_type; - uint8 m_num2dEffects; - bool m_bOwnsColModel; public: CBaseModelInfo(ModelInfoType type); @@ -40,13 +42,15 @@ public: virtual RwObject *CreateInstance(RwMatrix *) = 0; virtual RwObject *CreateInstance(void) = 0; virtual RwObject *GetRwObject(void) = 0; + virtual void SetAnimFile(const char *file) {} + virtual void ConvertAnimFileIndex(void) {} + virtual int GetAnimFileIndex(void) { return -1; } // one day it becomes virtual ModelInfoType GetModelType() const { return m_type; } - bool IsSimple(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME; } - bool IsClump(void) { return m_type == MITYPE_CLUMP || m_type == MITYPE_PED || m_type == MITYPE_VEHICLE || - m_type == MITYPE_MLO || m_type == MITYPE_XTRACOMPS; // unused but what the heck - } + bool IsBuilding(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME; } + bool IsSimple(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME || m_type == MITYPE_WEAPON; } + bool IsClump(void) { return m_type == MITYPE_CLUMP || m_type == MITYPE_PED || m_type == MITYPE_VEHICLE; } char *GetName(void) { return m_name; } void SetName(const char *name) { strncpy(m_name, name, MAX_MODEL_NAME); } void SetColModel(CColModel *col, bool owns = false){ @@ -69,5 +73,3 @@ public: uint8 GetNum2dEffects() const { return m_num2dEffects; } uint16 GetNumRefs() const { return m_refCount; } }; - -VALIDATE_SIZE(CBaseModelInfo, 0x30); diff --git a/src/modelinfo/ClumpModelInfo.cpp b/src/modelinfo/ClumpModelInfo.cpp index ccfcd304..82241d04 100644 --- a/src/modelinfo/ClumpModelInfo.cpp +++ b/src/modelinfo/ClumpModelInfo.cpp @@ -5,6 +5,9 @@ #include "NodeName.h" #include "VisibilityPlugins.h" #include "ModelInfo.h" +#include "AnimManager.h" + +//--MIAMI: file done void CClumpModelInfo::DeleteRwObject(void) @@ -13,17 +16,17 @@ CClumpModelInfo::DeleteRwObject(void) RpClumpDestroy(m_clump); m_clump = nil; RemoveTexDictionaryRef(); + if(GetAnimFileIndex() != -1) + CAnimManager::RemoveAnimBlockRef(GetAnimFileIndex()); } } -#ifdef PED_SKIN static RpAtomic* SetHierarchyForSkinAtomic(RpAtomic *atomic, void *data) { RpSkinAtomicSetHAnimHierarchy(atomic, (RpHAnimHierarchy*)data); return nil; } -#endif RwObject* CClumpModelInfo::CreateInstance(void) @@ -31,24 +34,17 @@ CClumpModelInfo::CreateInstance(void) if(m_clump == nil) return nil; RpClump *clone = RpClumpClone(m_clump); -#ifdef PED_SKIN if(IsClumpSkinned(clone)){ RpHAnimHierarchy *hier; RpHAnimAnimation *anim; hier = GetAnimHierarchyFromClump(clone); assert(hier); - // This seems dangerous as only the first atomic will get a hierarchy - // can we guarantee this if hands and head are also in the clump? RpClumpForAllAtomics(clone, SetHierarchyForSkinAtomic, hier); anim = HAnimAnimationCreateForHierarchy(hier); RpHAnimHierarchySetCurrentAnim(hier, anim); RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS)); - // the rest is xbox only: - // RpSkinGetNumBones(RpSkinGeometryGetSkin(RpAtomicGetGeometry(IsClumpSkinned(clone)))); - RpHAnimHierarchyUpdateMatrices(hier); } -#endif return (RwObject*)clone; } @@ -76,31 +72,19 @@ CClumpModelInfo::SetClump(RpClump *clump) m_clump = clump; CVisibilityPlugins::SetClumpModelInfo(m_clump, this); AddTexDictionaryRef(); - RpClumpForAllAtomics(clump, SetAtomicRendererCB, nil); - - // TODO: also set for player? - if(strncmp(GetName(), "playerh", 8) == 0) - RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); + if(GetAnimFileIndex() != -1) + CAnimManager::AddAnimBlockRef(GetAnimFileIndex()); -#ifdef PED_SKIN if(IsClumpSkinned(clump)){ int i; RpHAnimHierarchy *hier; RpAtomic *skinAtomic; RpSkin *skin; - // mobile: -// hier = nil; -// RwFrameForAllChildren(RpClumpGetFrame(clump), GetHierarchyFromChildNodesCB, &hier); -// assert(hier); -// RpClumpForAllAtomics(clump, SetHierarchyForSkinAtomic, hier); -// skinAtomic = GetFirstAtomic(clump); - - // xbox: hier = GetAnimHierarchyFromClump(clump); assert(hier); - RpSkinAtomicSetHAnimHierarchy(IsClumpSkinned(clump), hier); - skinAtomic = IsClumpSkinned(clump); + RpClumpForAllAtomics(clump, SetHierarchyForSkinAtomic, hier); + skinAtomic = GetFirstAtomic(clump); assert(skinAtomic); skin = RpSkinGeometryGetSkin(RpAtomicGetGeometry(skinAtomic)); @@ -115,7 +99,27 @@ CClumpModelInfo::SetClump(RpClump *clump) } RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS)); } -#endif +} + +void +CClumpModelInfo::SetAnimFile(const char *file) +{ + if(strcasecmp(file, "null") == 0) + return; + + m_animFileName = new char[strlen(file)+1]; + strcpy(m_animFileName, file); +} + +void +CClumpModelInfo::ConvertAnimFileIndex(void) +{ + if(m_animFileIndex != -1){ + // we have a string pointer in that union + int32 index = CAnimManager::GetAnimationBlockIndex(m_animFileName); + delete[] m_animFileName; + m_animFileIndex = index; + } } void @@ -147,6 +151,7 @@ CClumpModelInfo::FindFrameFromIdCB(RwFrame *frame, void *data) return assoc->frame ? nil : frame; } +//--MIAMI: unused RwFrame* CClumpModelInfo::FindFrameFromNameCB(RwFrame *frame, void *data) { diff --git a/src/modelinfo/ClumpModelInfo.h b/src/modelinfo/ClumpModelInfo.h index 58b6de11..0113d340 100644 --- a/src/modelinfo/ClumpModelInfo.h +++ b/src/modelinfo/ClumpModelInfo.h @@ -30,9 +30,13 @@ class CClumpModelInfo : public CBaseModelInfo { public: RpClump *m_clump; + union { + int32 m_animFileIndex; + char *m_animFileName; + }; - CClumpModelInfo(void) : CBaseModelInfo(MITYPE_CLUMP) {} - CClumpModelInfo(ModelInfoType id) : CBaseModelInfo(id) {} + CClumpModelInfo(void) : CBaseModelInfo(MITYPE_CLUMP) { m_animFileIndex = -1; } + CClumpModelInfo(ModelInfoType id) : CBaseModelInfo(id) { m_animFileIndex = -1; } ~CClumpModelInfo() {} void DeleteRwObject(void); RwObject *CreateInstance(void); @@ -40,6 +44,9 @@ public: RwObject *GetRwObject(void) { return (RwObject*)m_clump; } virtual void SetClump(RpClump *); + virtual void SetAnimFile(const char *file); + virtual void ConvertAnimFileIndex(void); + virtual int GetAnimFileIndex(void) { return m_animFileIndex; } static RpAtomic *SetAtomicRendererCB(RpAtomic *atomic, void *data); void SetFrameIds(RwObjectNameIdAssocation *assocs); @@ -50,5 +57,4 @@ public: static RwFrame *FillFrameArrayCB(RwFrame *frame, void *data); static RwFrame *GetFrameFromId(RpClump *clump, int32 id); }; - -VALIDATE_SIZE(CClumpModelInfo, 0x34); +//static_assert(sizeof(CClumpModelInfo) == 0x34, "CClumpModelInfo: error"); diff --git a/src/modelinfo/MloModelInfo.cpp b/src/modelinfo/MloModelInfo.cpp deleted file mode 100644 index 7535e6c5..00000000 --- a/src/modelinfo/MloModelInfo.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "common.h" - -#include "VisibilityPlugins.h" -#include "ModelInfo.h" - -void -CMloModelInfo::ConstructClump() -{ - m_clump = RpClumpCreate(); - RwFrame *mainFrame = RwFrameCreate(); - RwFrameSetIdentity(mainFrame); - RpClumpSetFrame(m_clump, mainFrame); - - for (int i = firstInstance; i < lastInstance; i++) { - int modelId = CModelInfo::GetMloInstanceStore().store[i].m_modelIndex; - RwMatrix *attMat = CModelInfo::GetMloInstanceStore().store[i].GetMatrix().m_attachment; - CSimpleModelInfo *minfo = (CSimpleModelInfo*)CModelInfo::GetModelInfo(modelId); - - if (minfo->m_atomics[0] != nil) { - RpAtomic *newAtomic = RpAtomicClone(minfo->m_atomics[0]); - RwFrame *newFrame = RwFrameCreate(); - if (newAtomic != nil && newFrame != nil) { - *RwFrameGetMatrix(newFrame) = *attMat; - RpAtomicSetFrame(newAtomic, newFrame); - RwFrameAddChild(mainFrame, newFrame); - RpClumpAddAtomic(m_clump, newAtomic); - } else { - debug("Failed to allocate memory while creating template MLO.\n"); - } - } - } - - if (RpClumpGetNumAtomics(m_clump) != 0) { - CVisibilityPlugins::SetClumpModelInfo(m_clump, this); - } else { - RpClumpDestroy(m_clump); - m_clump = nil; - } -}
\ No newline at end of file diff --git a/src/modelinfo/MloModelInfo.h b/src/modelinfo/MloModelInfo.h deleted file mode 100644 index d4344706..00000000 --- a/src/modelinfo/MloModelInfo.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "ClumpModelInfo.h" - -class CMloModelInfo : public CClumpModelInfo -{ -public: - float field_34; // draw distance? - int firstInstance; - int lastInstance; -public: - CMloModelInfo(void) : CClumpModelInfo(MITYPE_MLO) {} - void ConstructClump(); -};
\ No newline at end of file diff --git a/src/modelinfo/ModelIndices.h b/src/modelinfo/ModelIndices.h index cc6ed25c..21362c54 100644 --- a/src/modelinfo/ModelIndices.h +++ b/src/modelinfo/ModelIndices.h @@ -1,5 +1,7 @@ #pragma once +#include "ModelInfo.h" + #define MODELINDICES \ X("fire_hydrant", MI_FIRE_HYDRANT, 0x5F5A00) \ X("bagelstnd02", MI_BAGELSTAND2, 0x5F59FC) \ @@ -47,37 +49,37 @@ X("package1", MI_COLLECTABLE1, 0x5F5A04) \ X("Money", MI_MONEY, 0x5F5A08) \ X("barrel1", MI_CARMINE, 0x5F5A0C) \ - X("oddjgaragdoor", MI_GARAGEDOOR1, 0x5F5A10) \ - X("bombdoor", MI_GARAGEDOOR2, 0x5F5A14) \ - X("door_bombshop", MI_GARAGEDOOR3, 0x5F5A18) \ - X("vheistlocdoor", MI_GARAGEDOOR4, 0x5F5A1C) \ - X("door2_garage", MI_GARAGEDOOR5, 0x5F5A20) \ - X("ind_slidedoor", MI_GARAGEDOOR6, 0x5F5A24) \ - X("bankjobdoor", MI_GARAGEDOOR7, 0x5F5A28) \ - X("door_jmsgrage", MI_GARAGEDOOR9, 0x5F5A2C) \ - X("jamesgrge_kb", MI_GARAGEDOOR10, 0x5F5A30) \ - X("door_sfehousegrge", MI_GARAGEDOOR11, 0x5F5A34) \ - X("shedgaragedoor", MI_GARAGEDOOR12, 0x5F5A38) \ - X("door4_garage", MI_GARAGEDOOR13, 0x5F5A3C) \ - X("door_col_compnd_01", MI_GARAGEDOOR14, 0x5F5A40) \ - X("door_col_compnd_02", MI_GARAGEDOOR15, 0x5F5A44) \ - X("door_col_compnd_03", MI_GARAGEDOOR16, 0x5F5A48) \ - X("door_col_compnd_04", MI_GARAGEDOOR17, 0x5F5A4C) \ - X("door_col_compnd_05", MI_GARAGEDOOR18, 0x5F5A50) \ - X("impex_door", MI_GARAGEDOOR19, 0x5F5A54) \ - X("SalvGarage", MI_GARAGEDOOR20, 0x5F5A58) \ - X("door3_garage", MI_GARAGEDOOR21, 0x5F5A5C) \ - X("leveldoor2", MI_GARAGEDOOR22, 0x5F5A60) \ - X("double_garage_dr", MI_GARAGEDOOR23, 0x5F5A64) \ - X("amcogaragedoor", MI_GARAGEDOOR24, 0x5F5A68) \ - X("towergaragedoor1", MI_GARAGEDOOR25, 0x5F5A6C) \ - X("towergaragedoor2", MI_GARAGEDOOR26, 0x5F5A70) \ - X("towergaragedoor3", MI_GARAGEDOOR27, 0x5F5A74) \ - X("plysve_gragedoor", MI_GARAGEDOOR28, 0x5F5A78) \ - X("impexpsubgrgdoor", MI_GARAGEDOOR29, 0x5F5A7C) \ - X("Sub_sprayshopdoor", MI_GARAGEDOOR30, 0x5F5A80) \ - X("ind_plyrwoor", MI_GARAGEDOOR31, 0x5F5A84) \ - X("8ballsuburbandoor", MI_GARAGEDOOR32, 0x5F5A88) \ + /*X("oddjgaragdoor", MI_GARAGEDOOR1, 0x5F5A10)*/ \ + X("dk_paynspraydoor", MI_GARAGEDOOR2, 0x5F5A14) \ + X("dk_waretankdoor1", MI_GARAGEDOOR3, 0x5F5A18) \ + X("hav_garagedoor1", MI_GARAGEDOOR4, 0x5F5A1C) \ + X("hav_garagedoor02", MI_GARAGEDOOR5, 0x5F5A20) \ + X("hav_garagedoor03", MI_GARAGEDOOR6, 0x5F5A24) \ + X("hav_garagedoor04", MI_GARAGEDOOR7, 0x5F5A28) \ + X("lh_showdoor03", MI_GARAGEDOOR9, 0x5F5A2C) \ + X("lh_showdoor1", MI_GARAGEDOOR10, 0x5F5A30) \ + X("lhtankdoor", MI_GARAGEDOOR11, 0x5F5A34) \ + X("nbtgardoor", MI_GARAGEDOOR12, 0x5F5A38) \ + X("dk_camjonesdoor", MI_GARAGEDOOR13, 0x5F5A3C) \ + X("nbtgardoor02", MI_GARAGEDOOR14, 0x5F5A40) \ + X("dt_savedra", MI_GARAGEDOOR15, 0x5F5A44) \ + X("dt_savedrb", MI_GARAGEDOOR16, 0x5F5A48) \ + /*X("dk_bombdoor", MI_GARAGEDOOR17, 0x5F5A4C)*/ \ + X("dk_bombdoor", MI_GARAGEDOOR18, 0x5F5A50) \ + X("haiwshpnsdoor", MI_GARAGEDOOR19, 0x5F5A54) \ + X("wshpnsdoor", MI_GARAGEDOOR20, 0x5F5A58) \ + X("nbecpnsdoor", MI_GARAGEDOOR21, 0x5F5A5C) \ + X("nbtgardoor03", MI_GARAGEDOOR22, 0x5F5A60) \ + X("dt_savedrc", MI_GARAGEDOOR23, 0x5F5A64) \ + X("dt_savedrd", MI_GARAGEDOOR24, 0x5F5A68) \ + X("man_frntstepGD", MI_GARAGEDOOR25, 0x5F5A6C) \ + X("svegrgedoor", MI_GARAGEDOOR26, 0x5F5A70) \ + /*X("towergaragedoor3", MI_GARAGEDOOR27, 0x5F5A74)*/ \ + /*X("plysve_gragedoor", MI_GARAGEDOOR28, 0x5F5A78)*/ \ + /*X("impexpsubgrgdoor", MI_GARAGEDOOR29, 0x5F5A7C)*/ \ + /*X("Sub_sprayshopdoor", MI_GARAGEDOOR30, 0x5F5A80)*/ \ + /*X("ind_plyrwoor", MI_GARAGEDOOR31, 0x5F5A84)*/ \ + /*X("8ballsuburbandoor", MI_GARAGEDOOR32, 0x5F5A88)*/ \ X("barrel2", MI_NAUTICALMINE, 0x5F5A8C) \ X("crushercrush", MI_CRUSHERBODY, 0x5F5A90) \ X("crushertop", MI_CRUSHERLID, 0x5F5A94) \ @@ -174,6 +176,21 @@ enum MI_MEDIC, MI_FIREMAN, MI_MALE01, + + MI_TAXI_D = 28, // HMOCA + MI_GANG01 = 83, // CBa + MI_VICE1 = 97, + MI_VICE2, + MI_VICE3, + MI_VICE4, + MI_VICE5, + MI_VICE6, + MI_VICE7, + MI_VICE8, + MI_WFYG2 = 106, // last regular ped + MI_SPECIAL01 = 109, + MI_SPECIAL21 = 129, +/* MI_TAXI_D, MI_PIMP, MI_GANG01, @@ -254,21 +271,22 @@ enum MI_BUSKER3, MI_BUSKER4, // three more peds possible +*/ - MI_FIRST_VEHICLE = 90, + MI_FIRST_VEHICLE = 130, MI_LANDSTAL = MI_FIRST_VEHICLE, MI_IDAHO, MI_STINGER, MI_LINERUN, MI_PEREN, MI_SENTINEL, - MI_PATRIOT, + MI_RIO, MI_FIRETRUCK, MI_TRASH, MI_STRETCH, MI_MANANA, MI_INFERNUS, - MI_BLISTA, + MI_VOODOO, MI_PONY, MI_MULE, MI_CHEETAH, @@ -277,11 +295,11 @@ enum MI_MOONBEAM, MI_ESPERANT, MI_TAXI, - MI_KURUMA, + MI_WASHING, MI_BOBCAT, MI_MRWHOOP, MI_BFINJECT, - MI_CORPSE, + MI_HUNTER, MI_POLICE, MI_ENFORCER, MI_SECURICA, @@ -290,40 +308,84 @@ enum MI_BUS, MI_RHINO, MI_BARRACKS, - MI_TRAIN, + MI_CUBAN, MI_CHOPPER, - MI_DODO, + MI_ANGEL, MI_COACH, MI_CABBIE, MI_STALLION, MI_RUMPO, MI_RCBANDIT, - MI_BELLYUP, - MI_MRWONGS, - MI_MAFIA, - MI_YARDIE, - MI_YAKUZA, - MI_DIABLOS, - MI_COLUMB , - MI_HOODS, + MI_ROMERO, + MI_PACKER, + MI_SENTXS, + MI_ADMIRAL, + MI_SQUALO, + MI_SEASPAR, + MI_PIZZABOY, + MI_GANGBUR, MI_AIRTRAIN, MI_DEADDODO, MI_SPEEDER, MI_REEFER, - MI_PANLANT, + MI_TROPIC, MI_FLATBED, MI_YANKEE, - MI_ESCAPE, - MI_BORGNINE, - MI_TOYZ, - MI_GHOST, - - // leftovers on PC - MI_MIAMI_RCBARON = 154, - MI_MIAMI_RCRAIDER = 155, - MI_MIAMI_SPARROW = 159, + MI_CADDY, + MI_ZEBRA, + MI_TOPFUN, + MI_SKIMMER, + MI_PCJ600, + MI_FAGGIO, + MI_FREEWAY, + MI_RCBARON, + MI_RCRAIDER, + MI_GLENDALE, + MI_OCEANIC, + MI_SANCHEZ, + MI_SPARROW, + MI_PATRIOT, + MI_LOVEFIST, + MI_COASTG, + MI_DINGHY, + MI_HERMES, + MI_SABRE, + MI_SABRETUR, + MI_PHEONIX, + MI_WALTON, + MI_REGINA, + MI_COMET, + MI_DELUXO, + MI_BURRITO, + MI_SPAND, + MI_MARQUIS, + MI_BAGGAGE, + MI_KAUFMAN, + MI_MAVERICK, + MI_VCNMAV, + MI_RANCHER, + MI_FBIRANCH, + MI_VIRGO, + MI_GREENWOO, + MI_JETMAX, + MI_HOTRING, + MI_SANDKING, + MI_BLISTAC, + MI_POLMAV, + MI_BOXVILLE, + MI_BENSON, + MI_MESA, + MI_RCGOBLIN, + MI_HOTRINA, + MI_HOTRINB, + MI_BLOODRA, + MI_BLOODRB, + MI_VICECHEE, + // HACK + MI_TRAIN = -1, + MI_DODO = -2, - MI_GRENADE = 170, + MI_GRENADE = 258, MI_AK47, MI_BASEBALL_BAT, MI_COLT, @@ -338,13 +400,13 @@ enum MI_BOMB, MI_FINGERS, - MI_CUTOBJ01 = 185, + MI_CUTOBJ01 = 295, MI_CUTOBJ02, MI_CUTOBJ03, MI_CUTOBJ04, MI_CUTOBJ05, - MI_CAR_DOOR = 190, + MI_CAR_DOOR = 240, MI_CAR_BUMPER, MI_CAR_PANEL, MI_CAR_BONNET, @@ -353,10 +415,10 @@ enum MI_BODYPARTA, MI_BODYPARTB, - MI_AIRTRAIN_VLO = 198, - MI_LOPOLYGUY, + MI_AIRTRAIN_VLO = 257, +// MI_LOPOLYGUY, - NUM_DEFAULT_MODELS + NUM_DEFAULT_MODELS = 300 // MIAMI }; enum{ @@ -371,14 +433,8 @@ void TestModelIndices(void); inline bool IsGlass(int16 id) { - return id == MI_GLASS1 || - id == MI_GLASS2 || - id == MI_GLASS3 || - id == MI_GLASS4 || - id == MI_GLASS5 || - id == MI_GLASS6 || - id == MI_GLASS7 || - id == MI_GLASS8; + CSimpleModelInfo *mi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(id); + return mi->IsBuilding() && (mi->m_isCodeGlass || mi->m_isArtistGlass); } inline bool @@ -398,6 +454,7 @@ IsBodyPart(int16 id) } // This is bad and should perhaps not be used +/* inline bool IsBoatModel(int16 id) { @@ -406,6 +463,7 @@ IsBoatModel(int16 id) id == MI_SPEEDER || id == MI_GHOST; } +*/ inline bool IsPedModel(int16 id) diff --git a/src/modelinfo/ModelInfo.cpp b/src/modelinfo/ModelInfo.cpp index da09bdfa..3dc048c9 100644 --- a/src/modelinfo/ModelInfo.cpp +++ b/src/modelinfo/ModelInfo.cpp @@ -8,13 +8,11 @@ CBaseModelInfo *CModelInfo::ms_modelInfoPtrs[MODELINFOSIZE]; CStore<CSimpleModelInfo, SIMPLEMODELSIZE> CModelInfo::ms_simpleModelStore; -CStore<CMloModelInfo, MLOMODELSIZE> CModelInfo::ms_mloModelStore; -CStore<CInstance, MLOINSTANCESIZE> CModelInfo::ms_mloInstanceStore; CStore<CTimeModelInfo, TIMEMODELSIZE> CModelInfo::ms_timeModelStore; +CStore<CWeaponModelInfo, WEAPONMODELSIZE> CModelInfo::ms_weaponModelStore; CStore<CClumpModelInfo, CLUMPMODELSIZE> CModelInfo::ms_clumpModelStore; CStore<CPedModelInfo, PEDMODELSIZE> CModelInfo::ms_pedModelStore; CStore<CVehicleModelInfo, VEHICLEMODELSIZE> CModelInfo::ms_vehicleModelStore; -CStore<CXtraCompsModelInfo, XTRACOMPSMODELSIZE> CModelInfo::ms_xtraCompsModelStore; CStore<C2dEffect, TWODFXSIZE> CModelInfo::ms_2dEffectStore; void @@ -26,11 +24,9 @@ CModelInfo::Initialise(void) for(i = 0; i < MODELINFOSIZE; i++) ms_modelInfoPtrs[i] = nil; ms_2dEffectStore.clear(); - ms_mloInstanceStore.clear(); - ms_xtraCompsModelStore.clear(); ms_simpleModelStore.clear(); ms_timeModelStore.clear(); - ms_mloModelStore.clear(); + ms_weaponModelStore.clear(); ms_clumpModelStore.clear(); ms_pedModelStore.clear(); ms_vehicleModelStore.clear(); @@ -90,29 +86,23 @@ CModelInfo::ShutDown(void) int i; for(i = 0; i < ms_simpleModelStore.allocPtr; i++) ms_simpleModelStore.store[i].Shutdown(); - for(i = 0; i < ms_mloInstanceStore.allocPtr; i++) - ms_mloInstanceStore.store[i].Shutdown(); for(i = 0; i < ms_timeModelStore.allocPtr; i++) ms_timeModelStore.store[i].Shutdown(); + for(i = 0; i < ms_weaponModelStore.allocPtr; i++) + ms_weaponModelStore.store[i].Shutdown(); for(i = 0; i < ms_clumpModelStore.allocPtr; i++) ms_clumpModelStore.store[i].Shutdown(); for(i = 0; i < ms_vehicleModelStore.allocPtr; i++) ms_vehicleModelStore.store[i].Shutdown(); for(i = 0; i < ms_pedModelStore.allocPtr; i++) ms_pedModelStore.store[i].Shutdown(); - for(i = 0; i < ms_xtraCompsModelStore.allocPtr; i++) - ms_xtraCompsModelStore.store[i].Shutdown(); - for(i = 0; i < ms_mloInstanceStore.allocPtr; i++) - ms_mloInstanceStore.store[i].Shutdown(); for(i = 0; i < ms_2dEffectStore.allocPtr; i++) ms_2dEffectStore.store[i].Shutdown(); ms_2dEffectStore.clear(); ms_simpleModelStore.clear(); - ms_mloInstanceStore.clear(); - ms_mloModelStore.clear(); - ms_xtraCompsModelStore.clear(); ms_timeModelStore.clear(); + ms_weaponModelStore.clear(); ms_pedModelStore.clear(); ms_clumpModelStore.clear(); ms_vehicleModelStore.clear(); @@ -128,23 +118,21 @@ CModelInfo::AddSimpleModel(int id) return modelinfo; } -CMloModelInfo * -CModelInfo::AddMloModel(int id) +CTimeModelInfo* +CModelInfo::AddTimeModel(int id) { - CMloModelInfo *modelinfo; - modelinfo = CModelInfo::ms_mloModelStore.alloc(); + CTimeModelInfo *modelinfo; + modelinfo = CModelInfo::ms_timeModelStore.alloc(); CModelInfo::ms_modelInfoPtrs[id] = modelinfo; - modelinfo->m_clump = nil; - modelinfo->firstInstance = 0; - modelinfo->lastInstance = 0; + modelinfo->Init(); return modelinfo; } -CTimeModelInfo* -CModelInfo::AddTimeModel(int id) +CWeaponModelInfo* +CModelInfo::AddWeaponModel(int id) { - CTimeModelInfo *modelinfo; - modelinfo = CModelInfo::ms_timeModelStore.alloc(); + CWeaponModelInfo *modelinfo; + modelinfo = CModelInfo::ms_weaponModelStore.alloc(); CModelInfo::ms_modelInfoPtrs[id] = modelinfo; modelinfo->Init(); return modelinfo; @@ -200,6 +188,18 @@ CModelInfo::GetModelInfo(const char *name, int *id) return nil; } +CBaseModelInfo* +CModelInfo::GetModelInfo(const char *name, int minIndex, int maxIndex) +{ + CBaseModelInfo *modelinfo; + for(int i = minIndex; i <= maxIndex; i++){ + modelinfo = CModelInfo::ms_modelInfoPtrs[i]; + if(modelinfo && !CGeneral::faststricmp(modelinfo->GetName(), name)) + return modelinfo; + } + return nil; +} + bool CModelInfo::IsBoatModel(int32 id) { @@ -214,28 +214,11 @@ CModelInfo::IsBikeModel(int32 id) ((CVehicleModelInfo*)GetModelInfo(id))->m_vehicleType == VEHICLE_TYPE_BIKE; } -void -CModelInfo::RemoveColModelsFromOtherLevels(eLevelName level) -{ - int i; - CBaseModelInfo *mi; - CColModel *colmodel; - - for(i = 0; i < MODELINFOSIZE; i++){ - mi = GetModelInfo(i); - if(mi){ - colmodel = mi->GetColModel(); - if(colmodel && colmodel->level != LEVEL_NONE && colmodel->level != level) - colmodel->RemoveCollisionVolumes(); - } - } -} - -void -CModelInfo::ConstructMloClumps() +bool +CModelInfo::IsCarModel(int32 id) { - for (int i = 0; i < ms_mloModelStore.allocPtr; i++) - ms_mloModelStore.store[i].ConstructClump(); + return GetModelInfo(id)->GetModelType() == MITYPE_VEHICLE && + ((CVehicleModelInfo*)GetModelInfo(id))->m_vehicleType == VEHICLE_TYPE_CAR; } void diff --git a/src/modelinfo/ModelInfo.h b/src/modelinfo/ModelInfo.h index 65cfa4e7..a24ba797 100644 --- a/src/modelinfo/ModelInfo.h +++ b/src/modelinfo/ModelInfo.h @@ -3,49 +3,45 @@ #include "2dEffect.h" #include "BaseModelInfo.h" #include "SimpleModelInfo.h" -#include "MloModelInfo.h" #include "TimeModelInfo.h" +#include "WeaponModelInfo.h" #include "ClumpModelInfo.h" #include "PedModelInfo.h" #include "VehicleModelInfo.h" -#include "XtraCompsModelInfo.h" #include "Instance.h" class CModelInfo { static CBaseModelInfo *ms_modelInfoPtrs[MODELINFOSIZE]; static CStore<CSimpleModelInfo, SIMPLEMODELSIZE> ms_simpleModelStore; - static CStore<CMloModelInfo, MLOMODELSIZE> ms_mloModelStore; - static CStore<CInstance, MLOINSTANCESIZE> ms_mloInstanceStore; static CStore<CTimeModelInfo, TIMEMODELSIZE> ms_timeModelStore; + static CStore<CWeaponModelInfo, WEAPONMODELSIZE> ms_weaponModelStore; static CStore<CClumpModelInfo, CLUMPMODELSIZE> ms_clumpModelStore; static CStore<CPedModelInfo, PEDMODELSIZE> ms_pedModelStore; static CStore<CVehicleModelInfo, VEHICLEMODELSIZE> ms_vehicleModelStore; static CStore<C2dEffect, TWODFXSIZE> ms_2dEffectStore; - static CStore<CXtraCompsModelInfo, XTRACOMPSMODELSIZE> ms_xtraCompsModelStore; public: static void Initialise(void); static void ShutDown(void); static CSimpleModelInfo *AddSimpleModel(int id); - static CMloModelInfo *AddMloModel(int id); static CTimeModelInfo *AddTimeModel(int id); + static CWeaponModelInfo *AddWeaponModel(int id); static CClumpModelInfo *AddClumpModel(int id); static CPedModelInfo *AddPedModel(int id); static CVehicleModelInfo *AddVehicleModel(int id); static CStore<C2dEffect, TWODFXSIZE> &Get2dEffectStore(void) { return ms_2dEffectStore; } - static CStore<CInstance, MLOINSTANCESIZE> &GetMloInstanceStore(void) { return ms_mloInstanceStore; } static CBaseModelInfo *GetModelInfo(const char *name, int *id); static CBaseModelInfo *GetModelInfo(int id){ return ms_modelInfoPtrs[id]; } + static CBaseModelInfo *GetModelInfo(const char *name, int minIndex, int maxIndex); static bool IsBoatModel(int32 id); static bool IsBikeModel(int32 id); - static void RemoveColModelsFromOtherLevels(eLevelName level); - static void ConstructMloClumps(); + static bool IsCarModel(int32 id); static void ReInit2dEffects(); }; diff --git a/src/modelinfo/PedModelInfo.cpp b/src/modelinfo/PedModelInfo.cpp index 47080e23..57176561 100644 --- a/src/modelinfo/PedModelInfo.cpp +++ b/src/modelinfo/PedModelInfo.cpp @@ -9,33 +9,18 @@ #include "VisibilityPlugins.h" #include "ModelInfo.h" +//--MIAMI: file done + void CPedModelInfo::DeleteRwObject(void) { + CClumpModelInfo::DeleteRwObject(); if(m_hitColModel) delete m_hitColModel; m_hitColModel = nil; -#ifdef PED_SKIN - RwFrame *frame; - if(m_head){ - frame = RpAtomicGetFrame(m_head); - RpAtomicDestroy(m_head); - RwFrameDestroy(frame); - } - if(m_lhand){ - frame = RpAtomicGetFrame(m_lhand); - RpAtomicDestroy(m_lhand); - RwFrameDestroy(frame); - } - if(m_rhand){ - frame = RpAtomicGetFrame(m_rhand); - RpAtomicDestroy(m_rhand); - RwFrameDestroy(frame); - } -#endif - CClumpModelInfo::DeleteRwObject(); // PC calls this first } +// leftover... RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[PED_NODE_MAX] = { { "Smid", PED_MID, 0, }, // that is strange... { "Shead", PED_HEAD, 0, }, @@ -51,131 +36,16 @@ RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[PED_NODE_MAX] = { { nil, 0, 0, }, }; -#ifdef PED_SKIN -struct LimbCBarg -{ - CPedModelInfo *mi; - RpClump *clump; - int32 frameIDs[3]; -}; - -RpAtomic* -CPedModelInfo::findLimbsCb(RpAtomic *atomic, void *data) -{ - LimbCBarg *limbs = (LimbCBarg*)data; - RwFrame *frame = RpAtomicGetFrame(atomic); - const char *name = GetFrameNodeName(frame); - if(CGeneral::faststricmp(name, "Shead01") == 0){ - limbs->frameIDs[0] = RpHAnimFrameGetID(frame); - limbs->mi->m_head = atomic; - RpClumpRemoveAtomic(limbs->clump, atomic); - RwFrameRemoveChild(frame); - }else if(CGeneral::faststricmp(name, "SLhand01") == 0){ - limbs->frameIDs[1] = RpHAnimFrameGetID(frame); - limbs->mi->m_lhand = atomic; - RpClumpRemoveAtomic(limbs->clump, atomic); - RwFrameRemoveChild(frame); - }else if(CGeneral::faststricmp(name, "SRhand01") == 0){ - limbs->frameIDs[2] = RpHAnimFrameGetID(frame); - limbs->mi->m_rhand = atomic; - RpClumpRemoveAtomic(limbs->clump, atomic); - RwFrameRemoveChild(frame); - } - return atomic; -} -#endif - void CPedModelInfo::SetClump(RpClump *clump) { -#ifdef PED_SKIN - - // CB has to be set here before atomics are detached from clump - if(strncmp(GetName(), "player", 7) == 0) - RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); - if(IsClumpSkinned(clump)){ - LimbCBarg limbs = { this, clump, { 0, 0, 0 } }; - RpClumpForAllAtomics(clump, findLimbsCb, &limbs); - } - CClumpModelInfo::SetClump(clump); - SetFrameIds(m_pPedIds); - if(m_hitColModel == nil && !IsClumpSkinned(clump)) - CreateHitColModel(); - // And again because CClumpModelInfo resets it - if(strncmp(GetName(), "player", 7) == 0) - RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); - else if(IsClumpSkinned(clump)) - // skinned peds have no low detail version, so they don't have the right render Cb - RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedCB); -#else CClumpModelInfo::SetClump(clump); - SetFrameIds(m_pPedIds); + SetFrameIds(m_pPedIds); // not needed in VC actually if(m_hitColModel == nil) - CreateHitColModel(); - if(strncmp(GetName(), "player", 7) == 0) + CreateHitColModelSkinned(clump); + RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedCB); + if(strcmp(GetName(), "player") == 0) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); -#endif -} - -RpAtomic* -CountAtomicsCB(RpAtomic *atomic, void *data) -{ - (*(int32*)data)++; - return atomic; -} - -RpAtomic* -GetAtomicListCB(RpAtomic *atomic, void *data) -{ - **(RpAtomic***)data = atomic; - (*(RpAtomic***)data)++; - return atomic; -} - -RwFrame* -FindPedFrameFromNameCB(RwFrame *frame, void *data) -{ - RwObjectNameAssociation *assoc = (RwObjectNameAssociation*)data; - - if(CGeneral::faststricmp(GetFrameNodeName(frame)+1, assoc->name+1)){ - RwFrameForAllChildren(frame, FindPedFrameFromNameCB, assoc); - return assoc->frame ? nil : frame; - }else{ - assoc->frame = frame; - return nil; - } -} - -void -CPedModelInfo::SetLowDetailClump(RpClump *lodclump) -{ - RpAtomic *atomics[16]; - RpAtomic **pAtm; - int32 numAtm, numLodAtm; - int i; - RwObjectNameAssociation assoc; - - numAtm = 0; - numLodAtm = 0; - RpClumpForAllAtomics(m_clump, CountAtomicsCB, &numAtm); // actually unused - RpClumpForAllAtomics(lodclump, CountAtomicsCB, &numLodAtm); - - RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedHiDetailCB); - RpClumpForAllAtomics(lodclump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedLowDetailCB); - - pAtm = atomics; - RpClumpForAllAtomics(lodclump, GetAtomicListCB, &pAtm); - - for(i = 0; i < numLodAtm; i++){ - assoc.name = GetFrameNodeName(RpAtomicGetFrame(atomics[i])); - assoc.frame = nil; - RwFrameForAllChildren(RpClumpGetFrame(m_clump), FindPedFrameFromNameCB, &assoc); - if(assoc.frame){ - RpAtomicSetFrame(atomics[i], assoc.frame); - RpClumpRemoveAtomic(lodclump, atomics[i]); - RpClumpAddAtomic(m_clump, atomics[i]); - } - } } struct ColNodeInfo @@ -187,126 +57,20 @@ struct ColNodeInfo float radius; }; -#define NUMPEDINFONODES 8 +#define NUMPEDINFONODES 10 ColNodeInfo m_pColNodeInfos[NUMPEDINFONODES] = { - { nil, PED_HEAD, PEDPIECE_HEAD, 0.0f, 0.05f, 0.2f }, - { "Storso", 0, PEDPIECE_TORSO, 0.0f, 0.15f, 0.2f }, - { "Storso", 0, PEDPIECE_TORSO, 0.0f, -0.05f, 0.3f }, - { nil, PED_MID, PEDPIECE_MID, 0.0f, -0.07f, 0.3f }, - { nil, PED_UPPERARML, PEDPIECE_LEFTARM, 0.07f, -0.1f, 0.2f }, - { nil, PED_UPPERARMR, PEDPIECE_RIGHTARM, -0.07f, -0.1f, 0.2f }, - { "Slowerlegl", 0, PEDPIECE_LEFTLEG, 0.0f, 0.07f, 0.25f }, - { nil, PED_LOWERLEGR, PEDPIECE_RIGHTLEG, 0.0f, 0.07f, 0.25f }, + { nil, PED_HEAD, PEDPIECE_HEAD, 0.0f, 0.05f, 0.15f }, + { nil, PED_MID, PEDPIECE_TORSO, 0.0f, 0.15f, 0.2f }, + { nil, PED_MID, PEDPIECE_TORSO, 0.0f, -0.05f, 0.25f }, + { nil, PED_MID, PEDPIECE_MID, 0.0f, -0.25f, 0.25f }, + { nil, PED_UPPERARML, PEDPIECE_LEFTARM, 0.03f, -0.05f, 0.16f }, + { nil, PED_UPPERARMR, PEDPIECE_RIGHTARM, -0.03f, -0.05f, 0.16f }, + { nil, PED_LOWERLEGL, PEDPIECE_LEFTLEG, 0.0f, 0.15f, 0.2f }, + { nil, PED_LOWERLEGR, PEDPIECE_RIGHTLEG, 0.0f, 0.15f, 0.2f }, + { nil, PED_FOOTL, PEDPIECE_LEFTLEG, 0.0f, 0.15f, 0.15f }, + { nil, PED_FOOTR, PEDPIECE_RIGHTLEG, 0.0f, 0.15f, 0.15f }, }; -RwObject* -FindHeadRadiusCB(RwObject *object, void *data) -{ - RpAtomic *atomic = (RpAtomic*)object; - *(float*)data = RpAtomicGetBoundingSphere(atomic)->radius; - return nil; -} - -void -CPedModelInfo::CreateHitColModel(void) -{ - RwObjectNameAssociation nameAssoc; - RwObjectIdAssociation idAssoc; - CVector center; - RwFrame *nodeFrame; - CColModel *colmodel = new CColModel; - CColSphere *spheres = (CColSphere*)RwMalloc(NUMPEDINFONODES*sizeof(CColSphere)); - RwFrame *root = RpClumpGetFrame(m_clump); - RwMatrix *mat = RwMatrixCreate(); - for(int i = 0; i < NUMPEDINFONODES; i++){ - nodeFrame = nil; - if(m_pColNodeInfos[i].name){ - nameAssoc.name = m_pColNodeInfos[i].name; - nameAssoc.frame = nil; - RwFrameForAllChildren(root, FindFrameFromNameCB, &nameAssoc); - nodeFrame = nameAssoc.frame; - }else{ - idAssoc.id = m_pColNodeInfos[i].pedNode; - idAssoc.frame = nil; - RwFrameForAllChildren(root, FindFrameFromIdCB, &idAssoc); - nodeFrame = idAssoc.frame; - } - if(nodeFrame){ - float radius = m_pColNodeInfos[i].radius; - if(m_pColNodeInfos[i].pieceType == PEDPIECE_HEAD) - RwFrameForAllObjects(nodeFrame, FindHeadRadiusCB, &radius); - RwMatrixTransform(mat, RwFrameGetMatrix(nodeFrame), rwCOMBINEREPLACE); - const char *name = GetFrameNodeName(nodeFrame); - for(nodeFrame = RwFrameGetParent(nodeFrame); - nodeFrame; - nodeFrame = RwFrameGetParent(nodeFrame)){ - name = GetFrameNodeName(nodeFrame); - RwMatrixTransform(mat, RwFrameGetMatrix(nodeFrame), rwCOMBINEPOSTCONCAT); - if(RwFrameGetParent(nodeFrame) == root) - break; - } - center.x = mat->pos.x + m_pColNodeInfos[i].x; - center.y = mat->pos.y + 0.0f; - center.z = mat->pos.z + m_pColNodeInfos[i].z; - spheres[i].Set(radius, center, SURFACE_FLESH, m_pColNodeInfos[i].pieceType); - } - } - RwMatrixDestroy(mat); - colmodel->spheres = spheres; - colmodel->numSpheres = NUMPEDINFONODES; - center.x = center.y = center.z = 0.0f; - colmodel->boundingSphere.Set(2.0f, center, 0, 0); - CVector min, max; - min.x = min.y = -0.5f; - min.z = -1.2f; - max.x = max.y = 0.5f; - max.z = 1.2f; - colmodel->boundingBox.Set(min, max, 0, 0); - colmodel->level = LEVEL_NONE; - m_hitColModel = colmodel; -} - -CColModel* -CPedModelInfo::AnimatePedColModel(CColModel* colmodel, RwFrame* frame) -{ - RwObjectNameAssociation nameAssoc; - RwObjectIdAssociation idAssoc; - RwMatrix* mat = RwMatrixCreate(); - CColSphere* spheres = colmodel->spheres; - - for (int i = 0; i < NUMPEDINFONODES; i++) { - RwFrame* f = nil; - if (m_pColNodeInfos[i].name) { - nameAssoc.name = m_pColNodeInfos[i].name; - nameAssoc.frame = nil; - RwFrameForAllChildren(frame, FindFrameFromNameCB, &nameAssoc); - f = nameAssoc.frame; - } - else { - idAssoc.id = m_pColNodeInfos[i].pedNode; - idAssoc.frame = nil; - RwFrameForAllChildren(frame, FindFrameFromIdCB, &idAssoc); - f = idAssoc.frame; - } - if (f) { - RwMatrixCopy(mat, RwFrameGetMatrix(f)); - - for (f = RwFrameGetParent(f); f; f = RwFrameGetParent(f)) { - RwMatrixTransform(mat, RwFrameGetMatrix(f), rwCOMBINEPOSTCONCAT); - if (RwFrameGetParent(f) == frame) - break; - } - - spheres[i].center.x = mat->pos.x + m_pColNodeInfos[i].x; - spheres[i].center.y = mat->pos.y + 0.0f; - spheres[i].center.z = mat->pos.z + m_pColNodeInfos[i].z; - } - } - - return colmodel; -} - -#ifdef PED_SKIN void CPedModelInfo::CreateHitColModelSkinned(RpClump *clump) { @@ -339,13 +103,13 @@ CPedModelInfo::CreateHitColModelSkinned(RpClump *clump) colmodel->spheres = spheres; colmodel->numSpheres = NUMPEDINFONODES; center.x = center.y = center.z = 0.0f; - colmodel->boundingSphere.Set(2.0f, center, 0, 0); + colmodel->boundingSphere.Set(2.0f, center); CVector min, max; min.x = min.y = -0.5f; min.z = -1.2f; max.x = max.y = 0.5f; max.z = 1.2f; - colmodel->boundingBox.Set(min, max, 0, 0); + colmodel->boundingBox.Set(min, max); colmodel->level = LEVEL_NONE; m_hitColModel = colmodel; } @@ -382,4 +146,26 @@ CPedModelInfo::AnimatePedColModelSkinned(RpClump *clump) return m_hitColModel; } -#endif +CColModel* +CPedModelInfo::AnimatePedColModelSkinnedWorld(RpClump *clump) +{ + if(m_hitColModel == nil) + CreateHitColModelSkinned(clump); + CColSphere *spheres = m_hitColModel->spheres; + RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(clump); + RwMatrix *mat; + + for(int i = 0; i < NUMPEDINFONODES; i++){ + int id = ConvertPedNode2BoneTag(m_pColNodeInfos[i].pedNode); + int idx = RpHAnimIDGetIndex(hier, id); + + mat = &RpHAnimHierarchyGetMatrixArray(hier)[idx]; + RwV3d pos = { 0.0f, 0.0f, 0.0f }; + RwV3dTransformPoints(&pos, &pos, 1, mat); + + spheres[i].center.x = pos.x + m_pColNodeInfos[i].x; + spheres[i].center.y = pos.y + 0.0f; + spheres[i].center.z = pos.z + m_pColNodeInfos[i].z; + } + return m_hitColModel; +} diff --git a/src/modelinfo/PedModelInfo.h b/src/modelinfo/PedModelInfo.h index 52f75894..e878a59b 100644 --- a/src/modelinfo/PedModelInfo.h +++ b/src/modelinfo/PedModelInfo.h @@ -5,8 +5,8 @@ #include "PedStats.h" enum PedNode { - PED_TORSO, - PED_MID, // Smid on PS2/PC, Storso on mobile/xbox + PED_TORSO = 0, // has no bone! + PED_MID, PED_HEAD, PED_UPPERARML, PED_UPPERARMR, @@ -17,7 +17,15 @@ enum PedNode { PED_FOOTL, PED_FOOTR, PED_LOWERLEGR, - PED_NODE_MAX// Not valid: PED_LOWERLEGL + PED_LOWERLEGL, + + PED_FOREARML, + PED_FOREARMR, + PED_CLAVICLEL, + PED_CLAVICLER, + PED_NECK, + + PED_NODE_MAX }; class CPedModelInfo : public CClumpModelInfo @@ -28,11 +36,7 @@ public: ePedStats m_pedStatType; uint32 m_carsCanDrive; CColModel *m_hitColModel; -#ifdef PED_SKIN - RpAtomic *m_head; - RpAtomic *m_lhand; - RpAtomic *m_rhand; -#endif + int8 radio1, radio2; static RwObjectNameIdAssocation m_pPedIds[PED_NODE_MAX]; @@ -41,20 +45,8 @@ public: void DeleteRwObject(void); void SetClump(RpClump *); - void SetLowDetailClump(RpClump*); - void CreateHitColModel(void); void CreateHitColModelSkinned(RpClump *clump); CColModel *GetHitColModel(void) { return m_hitColModel; } - static CColModel *AnimatePedColModel(CColModel* colmodel, RwFrame* frame); CColModel *AnimatePedColModelSkinned(RpClump *clump); - -#ifdef PED_SKIN - static RpAtomic *findLimbsCb(RpAtomic *atomic, void *data); - RpAtomic *getHead(void) { return m_head; } - RpAtomic *getLeftHand(void) { return m_lhand; } - RpAtomic *getRightHand(void) { return m_rhand; } -#endif + CColModel *AnimatePedColModelSkinnedWorld(RpClump *clump); }; -#ifndef PED_SKIN -VALIDATE_SIZE(CPedModelInfo, 0x48); -#endif
\ No newline at end of file diff --git a/src/modelinfo/SimpleModelInfo.cpp b/src/modelinfo/SimpleModelInfo.cpp index a781cf58..a7e6d56c 100644 --- a/src/modelinfo/SimpleModelInfo.cpp +++ b/src/modelinfo/SimpleModelInfo.cpp @@ -3,6 +3,9 @@ #include "General.h" #include "Camera.h" #include "ModelInfo.h" +#include "AnimManager.h" + +//--MIAMI: file done #define LOD_DISTANCE (300.0f) @@ -18,6 +21,8 @@ CSimpleModelInfo::DeleteRwObject(void) RwFrameDestroy(f); m_atomics[i] = nil; RemoveTexDictionaryRef(); + if(GetAnimFileIndex() != -1) + CAnimManager::RemoveAnimBlockRef(GetAnimFileIndex()); } } @@ -55,7 +60,7 @@ CSimpleModelInfo::Init(void) m_atomics[2] = nil; m_numAtomics = 0; m_firstDamaged = 0; - m_normalCull = 0; + m_wetRoadReflection = 0; m_isDamaged = 0; m_isBigBuilding = 0; m_noFade = 0; @@ -64,6 +69,10 @@ CSimpleModelInfo::Init(void) m_isSubway = 0; m_ignoreLight = 0; m_noZwrite = 0; + m_noShadows = 0; + m_ignoreDrawDist = 0; + m_isCodeGlass = 0; + m_isArtistGlass = 0; } void @@ -71,10 +80,14 @@ CSimpleModelInfo::SetAtomic(int n, RpAtomic *atomic) { AddTexDictionaryRef(); m_atomics[n] = atomic; - if(m_ignoreLight){ - RpGeometry *geo = RpAtomicGetGeometry(atomic); + if(GetAnimFileIndex() != -1) + CAnimManager::AddAnimBlockRef(GetAnimFileIndex()); + RpGeometry *geo = RpAtomicGetGeometry(atomic); + if(m_ignoreLight) RpGeometrySetFlags(geo, RpGeometryGetFlags(geo) & ~rpGEOMETRYLIGHT); - } + if(RpGeometryGetFlags(geo) & rpGEOMETRYNORMALS && + RpGeometryGetNumTriangles(geo) > 200) + debug("%s has %d polys\n", m_name, RpGeometryGetNumTriangles(geo)); } void @@ -130,12 +143,20 @@ CSimpleModelInfo::GetAtomicFromDistance(float dist) return nil; } +RpAtomic* +CSimpleModelInfo::GetFirstAtomicFromDistance(float dist) +{ + if(dist < m_lodDistances[0] * TheCamera.LODDistMultiplier) + return m_atomics[0]; + return nil; +} + void -CSimpleModelInfo::FindRelatedModel(void) +CSimpleModelInfo::FindRelatedModel(int32 minID, int32 maxID) { int i; CBaseModelInfo *mi; - for(i = 0; i < MODELINFOSIZE; i++){ + for(i = minID; i <= maxID; i++){ mi = CModelInfo::GetModelInfo(i); if(mi && mi != this && !CGeneral::faststrcmp(GetName()+3, mi->GetName()+3)){ @@ -146,17 +167,23 @@ CSimpleModelInfo::FindRelatedModel(void) } } +#define NEAR_DRAW_DIST 0.0f // 100.0f in liberty city + void -CSimpleModelInfo::SetupBigBuilding(void) +CSimpleModelInfo::SetupBigBuilding(int32 minID, int32 maxID) { CSimpleModelInfo *related; if(m_lodDistances[0] > LOD_DISTANCE && GetRelatedModel() == nil){ m_isBigBuilding = 1; - FindRelatedModel(); + FindRelatedModel(minID, maxID); related = GetRelatedModel(); - if(related) + if(related){ m_lodDistances[2] = related->GetLargestLodDistance()/TheCamera.LODDistMultiplier; - else - m_lodDistances[2] = 100.0f; + if(m_drawLast){ + m_drawLast = false; + debug("%s was draw last\n", GetName()); + } + }else + m_lodDistances[2] = NEAR_DRAW_DIST; } } diff --git a/src/modelinfo/SimpleModelInfo.h b/src/modelinfo/SimpleModelInfo.h index ee63f24b..55d6149c 100644 --- a/src/modelinfo/SimpleModelInfo.h +++ b/src/modelinfo/SimpleModelInfo.h @@ -14,15 +14,22 @@ public: uint16 m_firstDamaged : 2; // 0: no damage model // 1: 1 and 2 are damage models // 2: 2 is damage model - uint16 m_normalCull : 1; + uint16 m_wetRoadReflection : 1; uint16 m_isDamaged : 1; + uint16 m_isBigBuilding : 1; uint16 m_noFade : 1; uint16 m_drawLast : 1; uint16 m_additive : 1; + uint16 m_isSubway : 1; uint16 m_ignoreLight : 1; uint16 m_noZwrite : 1; + uint16 m_noShadows : 1; + + uint16 m_ignoreDrawDist : 1; + uint16 m_isCodeGlass : 1; + uint16 m_isArtistGlass : 1; CSimpleModelInfo(void) : CBaseModelInfo(MITYPE_SIMPLE) {} CSimpleModelInfo(ModelInfoType id) : CBaseModelInfo(id) {} @@ -40,8 +47,9 @@ public: float GetNearDistance(void); float GetLargestLodDistance(void); RpAtomic *GetAtomicFromDistance(float dist); - void FindRelatedModel(void); - void SetupBigBuilding(void); + RpAtomic *GetFirstAtomicFromDistance(float dist); + void FindRelatedModel(int32 minID, int32 maxID); + void SetupBigBuilding(int32 minID, int32 maxID); void SetNumAtomics(int n) { m_numAtomics = n; } CSimpleModelInfo *GetRelatedModel(void){ @@ -49,5 +57,4 @@ public: void SetRelatedModel(CSimpleModelInfo *m){ m_atomics[2] = (RpAtomic*)m; } }; - -VALIDATE_SIZE(CSimpleModelInfo, 0x4C); +//static_assert(sizeof(CSimpleModelInfo) == 0x4C, "CSimpleModelInfo: error"); diff --git a/src/modelinfo/TimeModelInfo.h b/src/modelinfo/TimeModelInfo.h index 73b6ab26..6e3c64fb 100644 --- a/src/modelinfo/TimeModelInfo.h +++ b/src/modelinfo/TimeModelInfo.h @@ -17,5 +17,4 @@ public: void SetOtherTimeModel(int32 other) { m_otherTimeModelID = other; } CTimeModelInfo *FindOtherTimeModel(void); }; - -VALIDATE_SIZE(CTimeModelInfo, 0x58); +//static_assert(sizeof(CTimeModelInfo) == 0x58, "CTimeModelInfo: error"); diff --git a/src/modelinfo/VehicleModelInfo.cpp b/src/modelinfo/VehicleModelInfo.cpp index d64146d7..a10073e4 100644 --- a/src/modelinfo/VehicleModelInfo.cpp +++ b/src/modelinfo/VehicleModelInfo.cpp @@ -16,12 +16,14 @@ #include "Train.h" #include "Plane.h" #include "Heli.h" +#include "Bike.h" #include "ModelIndices.h" #include "ModelInfo.h" +//--MIAMI: done + int8 CVehicleModelInfo::ms_compsToUse[2] = { -2, -2 }; int8 CVehicleModelInfo::ms_compsUsed[2]; -RwTexture *CVehicleModelInfo::ms_pEnvironmentMaps[NUM_VEHICLE_ENVMAPS]; RwRGBA CVehicleModelInfo::ms_vehicleColourTable[256]; RwTexture *CVehicleModelInfo::ms_colourTextureTable[256]; @@ -81,9 +83,13 @@ RwObjectNameIdAssocation carIds[] = { }; RwObjectNameIdAssocation boatIds[] = { - { "boat_moving_hi", BOAT_MOVING, VEHICLE_FLAG_COLLAPSE }, - { "boat_rudder_hi", BOAT_RUDDER, VEHICLE_FLAG_COLLAPSE }, - { "windscreen", BOAT_WINDSCREEN, VEHICLE_FLAG_WINDSCREEN | VEHICLE_FLAG_COLLAPSE }, + { "boat_moving_hi", BOAT_MOVING, 0 }, + { "boat_rudder_hi", BOAT_RUDDER, 0 }, + { "boat_flap_left", BOAT_FLAP_LEFT, 0 }, + { "boat_flap_right", BOAT_FLAP_RIGHT, 0 }, + { "boat_rearflap_left", BOAT_REARFLAP_LEFT, 0 }, + { "boat_rearflap_right", BOAT_REARFLAP_RIGHT, 0 }, + { "windscreen_hi_ok", BOAT_WINDSCREEN, VEHICLE_FLAG_WINDSCREEN | VEHICLE_FLAG_DRAWLAST }, { "ped_frontseat", BOAT_POS_FRONTSEAT, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, { nil, 0, 0 } }; @@ -120,16 +126,18 @@ RwObjectNameIdAssocation planeIds[] = { }; RwObjectNameIdAssocation bikeIds[] = { - { "chassis_dummy", 1, 0 }, - { "forks_front", 2, 0 }, - { "forks_rear", 3, 0 }, - { "wheel_front", 4, 0 }, - { "wheel_rear", 5, 0 }, - { "mudguard", 6, 0 }, - { "ped_frontseat", 2, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "headlights", 0, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "taillights", 1, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, - { "exhaust", 9, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, + { "chassis_dummy", BIKE_CHASSIS, 0 }, + { "forks_front", BIKE_FORKS_FRONT, 0 }, + { "forks_rear", BIKE_FORKS_REAR, 0 }, + { "wheel_front", BIKE_WHEEL_FRONT, 0 }, + { "wheel_rear", BIKE_WHEEL_REAR, 0 }, + { "mudguard", BIKE_MUDGUARD, 0 }, + { "handlebars", BIKE_HANDLEBARS, 0 }, + { "ped_frontseat", BIKE_POS_FRONTSEAT, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, + { "ped_backseat", BIKE_POS_BACKSEAT, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, + { "headlights", BIKE_POS_HEADLIGHTS, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, + { "taillights", BIKE_POS_TAILLIGHTS, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, + { "exhaust", BIKE_POS_EXHAUST, VEHICLE_FLAG_POS | CLUMP_FLAG_NO_HIERID }, { "extra1", 0, VEHICLE_FLAG_DRAWLAST | VEHICLE_FLAG_COMP | CLUMP_FLAG_NO_HIERID }, { "extra2", 0, VEHICLE_FLAG_DRAWLAST | VEHICLE_FLAG_COMP | CLUMP_FLAG_NO_HIERID }, { "extra3", 0, VEHICLE_FLAG_DRAWLAST | VEHICLE_FLAG_COMP | CLUMP_FLAG_NO_HIERID }, @@ -148,6 +156,8 @@ RwObjectNameIdAssocation *CVehicleModelInfo::ms_vehicleDescs[] = { bikeIds }; +bool gbBlackCars; +bool gbPinkCars; CVehicleModelInfo::CVehicleModelInfo(void) : CClumpModelInfo(MITYPE_VEHICLE) @@ -159,6 +169,7 @@ CVehicleModelInfo::CVehicleModelInfo(void) m_positions[i].z = 0.0f; } m_numColours = 0; + m_animFileIndex = -1; } void @@ -228,10 +239,30 @@ CVehicleModelInfo::SetClump(RpClump *clump) SetFrameIds(ms_vehicleDescs[m_vehicleType]); PreprocessHierarchy(); FindEditableMaterialList(); - m_envMap = nil; SetEnvironmentMap(); } +void +CVehicleModelInfo::SetAnimFile(const char *file) +{ + if(strcasecmp(file, "null") == 0) + return; + + m_animFileName = new char[strlen(file)+1]; + strcpy(m_animFileName, file); +} + +void +CVehicleModelInfo::ConvertAnimFileIndex(void) +{ + if(m_animFileIndex != -1){ + // we have a string pointer in that union + int32 index = CAnimManager::GetAnimationBlockIndex(m_animFileName); + delete[] m_animFileName; + m_animFileIndex = index; + } +} + RwFrame* CVehicleModelInfo::CollapseFramesCB(RwFrame *frame, void *data) { @@ -384,30 +415,68 @@ CVehicleModelInfo::SetAtomicRendererCB_Boat(RpAtomic *atomic, void *data) RpAtomic* CVehicleModelInfo::SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data) { - CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); + char *name; + + name = GetFrameNodeName(RpAtomicGetFrame(atomic)); + if(strncmp(name, "toprotor", 8) == 0) + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleRotorAlphaCB); + else if(strncmp(name, "rearrotor", 9) == 0) + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleTailRotorAlphaCB); + else + CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); + return atomic; +} + +RpAtomic* +CVehicleModelInfo::SetAtomicRendererCB_RealHeli(RpAtomic *atomic, void *data) +{ + RpClump *clump; + char *name; + bool alpha; + + clump = (RpClump*)data; + name = GetFrameNodeName(RpAtomicGetFrame(atomic)); + alpha = false; + RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), HasAlphaMaterialCB, &alpha); + if(strncmp(name, "toprotor", 8) == 0) + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleRotorAlphaCB); + else if(strncmp(name, "rearrotor", 9) == 0) + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleTailRotorAlphaCB); + else if(strstr(name, "_hi") || strncmp(name, "extra", 5) == 0){ + if(alpha || strncmp(name, "windscreen", 10) == 0) + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailAlphaCB); + else + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailCB); + }else if(strstr(name, "_lo")){ + RpClumpRemoveAtomic(clump, atomic); + RpAtomicDestroy(atomic); + return atomic; // BUG: not done by gta + }else if(strstr(name, "_vlo")) + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleReallyLowDetailCB); + else + CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); + HideDamagedAtomicCB(atomic, nil); return atomic; } void CVehicleModelInfo::SetAtomicRenderCallbacks(void) { - switch(m_vehicleType){ - case VEHICLE_TYPE_TRAIN: +#ifdef GTA_TRAIN + if(m_vehicleType == VEHICLE_TYPE_TRAIN) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Train, nil); - break; - case VEHICLE_TYPE_HELI: + else +#endif + if(m_vehicleType == VEHICLE_TYPE_HELI) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Heli, nil); - break; - case VEHICLE_TYPE_PLANE: + else if(m_vehicleType == VEHICLE_TYPE_PLANE) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_BigVehicle, nil); - break; - case VEHICLE_TYPE_BOAT: + else if(m_vehicleType == VEHICLE_TYPE_BOAT) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Boat, m_clump); - break; - default: + else if(mod_HandlingManager.GetHandlingData((eHandlingId)m_handlingId)->Flags & HANDLING_IS_HELI) + RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_RealHeli, m_clump); + else RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, m_clump); - break; - } } RwObject* @@ -604,6 +673,13 @@ ChooseComponent(int32 rule, int32 comps) // only valid in rain n = CGeneral::GetRandomNumberInRange(0, CountCompsInRule(comps)); return COMPRULE_COMPN(comps, n); + case 3: + n = CGeneral::GetRandomNumberInRange(0, 1+CountCompsInRule(comps)); + if(n != 0) + return COMPRULE_COMPN(comps, n-1); + return -1; + case 4: + return CGeneral::GetRandomNumberInRange(0, 5); } return -1; } @@ -730,6 +806,9 @@ CVehicleModelInfo::GetEditableMaterialListCB(RpAtomic *atomic, void *data) return atomic; } +static int maxFirstMaterials; +static int maxSecondMaterials; + void CVehicleModelInfo::FindEditableMaterialList(void) { @@ -744,6 +823,8 @@ CVehicleModelInfo::FindEditableMaterialList(void) GetEditableMaterialListCB(m_comps[i], &cbdata); m_materials1[cbdata.numMats1] = nil; m_materials2[cbdata.numMats2] = nil; + maxFirstMaterials = Max(maxFirstMaterials, cbdata.numMats1); + maxSecondMaterials = Max(maxSecondMaterials, cbdata.numMats2); m_currentColour1 = -1; m_currentColour2 = -1; } @@ -752,35 +833,26 @@ void CVehicleModelInfo::SetVehicleColour(uint8 c1, uint8 c2) { RwRGBA col, *colp; - RwTexture *coltex; RpMaterial **matp; if(c1 != m_currentColour1){ col = ms_vehicleColourTable[c1]; - coltex = ms_colourTextureTable[c1]; for(matp = m_materials1; *matp; matp++){ - if(RpMaterialGetTexture(*matp) && RwTextureGetName(RpMaterialGetTexture(*matp))[0] != '@'){ - colp = (RwRGBA*)RpMaterialGetColor(*matp); // get rid of const - colp->red = col.red; - colp->green = col.green; - colp->blue = col.blue; - }else - RpMaterialSetTexture(*matp, coltex); + colp = (RwRGBA*)RpMaterialGetColor(*matp); // get rid of const + colp->red = col.red; + colp->green = col.green; + colp->blue = col.blue; } m_currentColour1 = c1; } if(c2 != m_currentColour2){ col = ms_vehicleColourTable[c2]; - coltex = ms_colourTextureTable[c2]; for(matp = m_materials2; *matp; matp++){ - if(RpMaterialGetTexture(*matp) && RwTextureGetName(RpMaterialGetTexture(*matp))[0] != '@'){ - colp = (RwRGBA*)RpMaterialGetColor(*matp); // get rid of const - colp->red = col.red; - colp->green = col.green; - colp->blue = col.blue; - }else - RpMaterialSetTexture(*matp, coltex); + colp = (RwRGBA*)RpMaterialGetColor(*matp); // get rid of const + colp->red = col.red; + colp->green = col.green; + colp->blue = col.blue; } m_currentColour2 = c2; } @@ -789,9 +861,12 @@ CVehicleModelInfo::SetVehicleColour(uint8 c1, uint8 c2) void CVehicleModelInfo::ChooseVehicleColour(uint8 &col1, uint8 &col2) { - if(m_numColours == 0){ + if(m_numColours == 0 || gbBlackCars){ col1 = 0; col2 = 0; + }else if(gbPinkCars){ + col1 = 68; + col2 = 68; }else{ m_lastColorVariation = (m_lastColorVariation+1) % m_numColours; col1 = m_colours1[m_lastColorVariation]; @@ -814,18 +889,27 @@ CVehicleModelInfo::AvoidSameVehicleColour(uint8 *col1, uint8 *col2) { int i, n; - if(m_numColours > 1) - for(i = 0; i < 8; i++){ - if(*col1 != m_lastColour1 || *col2 != m_lastColour2) - break; - n = CGeneral::GetRandomNumberInRange(0, m_numColours); - *col1 = m_colours1[n]; - *col2 = m_colours2[n]; - } - m_lastColour1 = *col1; - m_lastColour2 = *col2; + if(gbBlackCars){ + *col1 = 0; + *col2 = 0; + }else if(gbPinkCars){ + *col1 = 68; + *col2 = 68; + }else{ + if(m_numColours > 1) + for(i = 0; i < 8; i++){ + if(*col1 != m_lastColour1 || *col2 != m_lastColour2) + break; + n = CGeneral::GetRandomNumberInRange(0, m_numColours); + *col1 = m_colours1[n]; + *col2 = m_colours2[n]; + } + m_lastColour1 = *col1; + m_lastColour2 = *col2; + } } +//--MIAMI: unused RwTexture* CreateCarColourTexture(uint8 r, uint8 g, uint8 b) { @@ -925,7 +1009,6 @@ CVehicleModelInfo::LoadVehicleColours(void) ms_vehicleColourTable[numCols].green = g; ms_vehicleColourTable[numCols].blue = b; ms_vehicleColourTable[numCols].alpha = 0xFF; - ms_colourTextureTable[numCols] = CreateCarColourTexture(r, g, b); numCols++; }else if(section == CARS){ n = sscanf(&line[start], // BUG: games doesn't add start @@ -960,38 +1043,33 @@ CVehicleModelInfo::DeleteVehicleColourTextures(void) for(i = 0; i < 256; i++){ if(ms_colourTextureTable[i]){ RwTextureDestroy(ms_colourTextureTable[i]); -#ifdef GTA3_1_1_PATCH ms_colourTextureTable[i] = nil; -#endif } } } RpMaterial* -CVehicleModelInfo::HasSpecularMaterialCB(RpMaterial *material, void *data) +CVehicleModelInfo::GetMatFXEffectMaterialCB(RpMaterial *material, void *data) { - if(RpMaterialGetSurfaceProperties(material)->specular <= 0.0f) + if(RpMatFXMaterialGetEffects(material) == rpMATFXEFFECTNULL) return material; - *(bool*)data = true; + *(int*)data = RpMatFXMaterialGetEffects(material); return nil; } RpMaterial* -CVehicleModelInfo::SetEnvironmentMapCB(RpMaterial *material, void *data) +CVehicleModelInfo::SetDefaultEnvironmentMapCB(RpMaterial *material, void *data) { - float spec; - - spec = RpMaterialGetSurfaceProperties(material)->specular; - if(spec <= 0.0f) - RpMatFXMaterialSetEffects(material, rpMATFXEFFECTNULL); - else{ + if(RpMatFXMaterialGetEffects(material) == rpMATFXEFFECTENVMAP){ + RpMatFXMaterialSetEnvMapFrame(material, pMatFxIdentityFrame); if(RpMaterialGetTexture(material) == nil) RpMaterialSetTexture(material, gpWhiteTexture); RpMatFXMaterialSetEffects(material, rpMATFXEFFECTENVMAP); #ifndef PS2_MATFX - spec *= 0.5f; // Tone down a bit for PC + float coef = RpMatFXMaterialGetEnvMapCoefficient(material); + coef *= 0.25f; // Tone down a bit for PC + RpMatFXMaterialSetEnvMapCoefficient(material, coef); #endif - RpMatFXMaterialSetupEnvMap(material, (RwTexture*)data, pMatFxIdentityFrame, false, spec); } return material; } @@ -999,17 +1077,15 @@ CVehicleModelInfo::SetEnvironmentMapCB(RpMaterial *material, void *data) RpAtomic* CVehicleModelInfo::SetEnvironmentMapCB(RpAtomic *atomic, void *data) { - bool hasSpec; + int fx; RpGeometry *geo; geo = RpAtomicGetGeometry(atomic); - hasSpec = 0; - RpGeometryForAllMaterials(geo, HasSpecularMaterialCB, &hasSpec); - if(hasSpec){ - RpGeometryForAllMaterials(geo, SetEnvironmentMapCB, data); - RpGeometrySetFlags(geo, RpGeometryGetFlags(geo) | rpGEOMETRYMODULATEMATERIALCOLOR); + fx = 0; + RpGeometryForAllMaterials(geo, GetMatFXEffectMaterialCB, &fx); + if(fx != rpMATFXEFFECTNULL){ RpMatFXAtomicEnableEffects(atomic); - // PS2 sets of PS2Manager lighting CB here + RpGeometryForAllMaterials(geo, SetDefaultEnvironmentMapCB, data); } return atomic; } @@ -1021,44 +1097,29 @@ CVehicleModelInfo::SetEnvironmentMap(void) int32 i; if(pMatFxIdentityFrame == nil){ + RwV3d axis = { 1.0f, 0.0f, 0.0f }; pMatFxIdentityFrame = RwFrameCreate(); - RwMatrixSetIdentity(RwFrameGetMatrix(pMatFxIdentityFrame)); + RwMatrixRotate(RwFrameGetMatrix(pMatFxIdentityFrame), &axis, 60.0f, rwCOMBINEREPLACE); RwFrameUpdateObjects(pMatFxIdentityFrame); RwFrameGetLTM(pMatFxIdentityFrame); } - if(m_envMap != ms_pEnvironmentMaps[0]){ - m_envMap = ms_pEnvironmentMaps[0]; - RpClumpForAllAtomics(m_clump, SetEnvironmentMapCB, m_envMap); - if(m_wheelId != -1){ - wheelmi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(m_wheelId); - for(i = 0; i < wheelmi->m_numAtomics; i++) - SetEnvironmentMapCB(wheelmi->m_atomics[i], m_envMap); - } + RpClumpForAllAtomics(m_clump, SetEnvironmentMapCB, nil); + if(m_wheelId != -1){ + wheelmi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(m_wheelId); + for(i = 0; i < wheelmi->m_numAtomics; i++) + SetEnvironmentMapCB(wheelmi->m_atomics[i], nil); } } void CVehicleModelInfo::LoadEnvironmentMaps(void) { - const char *texnames[] = { - "reflection01", // only one used - "reflection02", - "reflection03", - "reflection04", - "reflection05", - "reflection06", - }; int32 txdslot; - int32 i; txdslot = CTxdStore::FindTxdSlot("particle"); CTxdStore::PushCurrentTxd(); CTxdStore::SetCurrentTxd(txdslot); - for(i = 0; i < NUM_VEHICLE_ENVMAPS; i++){ - ms_pEnvironmentMaps[i] = RwTextureRead(texnames[i], nil); - RwTextureSetFilterMode(ms_pEnvironmentMaps[i], rwFILTERLINEAR); - } if(gpWhiteTexture == nil){ gpWhiteTexture = RwTextureRead("white", nil); RwTextureGetName(gpWhiteTexture)[0] = '@'; @@ -1070,14 +1131,8 @@ CVehicleModelInfo::LoadEnvironmentMaps(void) void CVehicleModelInfo::ShutdownEnvironmentMaps(void) { - int32 i; - - // ignoring "initialised" as that's a PS2 thing only RwTextureDestroy(gpWhiteTexture); gpWhiteTexture = nil; - for(i = 0; i < NUM_VEHICLE_ENVMAPS; i++) - if(ms_pEnvironmentMaps[i]) - RwTextureDestroy(ms_pEnvironmentMaps[i]); RwFrameDestroy(pMatFxIdentityFrame); pMatFxIdentityFrame = nil; } @@ -1094,12 +1149,15 @@ CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(int id) case MI_FIRETRUCK: n = 2; break; + case MI_HUNTER: + n = 1; + break; default: n = ((CVehicleModelInfo*)CModelInfo::GetModelInfo(id))->m_numDoors; } if(n == 0) - return id == MI_RCBANDIT ? 0 : 1; + return id == MI_RCBANDIT || id == MI_PIZZABOY || id == MI_BAGGAGE ? 0 : 1; if(id == MI_COACH) return 8; diff --git a/src/modelinfo/VehicleModelInfo.h b/src/modelinfo/VehicleModelInfo.h index ba25d3cd..e71c9a77 100644 --- a/src/modelinfo/VehicleModelInfo.h +++ b/src/modelinfo/VehicleModelInfo.h @@ -3,10 +3,9 @@ #include "ClumpModelInfo.h" enum { - NUM_FIRST_MATERIALS = 26, - NUM_SECOND_MATERIALS = 26, + NUM_FIRST_MATERIALS = 24, + NUM_SECOND_MATERIALS = 20, NUM_VEHICLE_COLOURS = 8, - NUM_VEHICLE_ENVMAPS = 1 }; enum { @@ -44,17 +43,19 @@ class CVehicleModelInfo : public CClumpModelInfo public: uint8 m_lastColour1; uint8 m_lastColour2; - char m_gameName[32]; + char m_gameName[10]; int32 m_vehicleType; + float m_wheelScale; union { - int32 m_wheelId; - int32 m_planeLodId; + int16 m_wheelId; + int16 m_planeLodId; }; - float m_wheelScale; - int32 m_numDoors; - int32 m_handlingId; - int32 m_vehicleClass; - int32 m_level; + int16 m_handlingId; + int8 m_numDoors; + int8 m_vehicleClass; + int8 m_level; + int8 m_numComps; + int16 m_frequency; CVector m_positions[NUM_VEHICLE_POSITIONS]; uint32 m_compRules; float m_bikeSteerAngle; @@ -66,13 +67,15 @@ public: uint8 m_lastColorVariation; uint8 m_currentColour1; uint8 m_currentColour2; - RwTexture *m_envMap; RpAtomic *m_comps[6]; - int32 m_numComps; + // This is stupid, CClumpModelInfo already has it! + union { + int32 m_animFileIndex; + char *m_animFileName; + }; static int8 ms_compsToUse[2]; static int8 ms_compsUsed[2]; - static RwTexture *ms_pEnvironmentMaps[NUM_VEHICLE_ENVMAPS]; static RwRGBA ms_vehicleColourTable[256]; static RwTexture *ms_colourTextureTable[256]; static RwObjectNameIdAssocation *ms_vehicleDescs[NUM_VEHICLE_TYPES]; @@ -81,6 +84,9 @@ public: void DeleteRwObject(void); RwObject *CreateInstance(void); void SetClump(RpClump *); + void SetAnimFile(const char *file); + void ConvertAnimFileIndex(void); + int GetAnimFileIndex(void) { return m_animFileIndex; } static RwFrame *CollapseFramesCB(RwFrame *frame, void *data); static RwObject *MoveObjectsCB(RwObject *object, void *data); @@ -93,6 +99,7 @@ public: static RpAtomic *SetAtomicRendererCB_Train(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_Boat(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data); + static RpAtomic *SetAtomicRendererCB_RealHeli(RpAtomic *atomic, void *data); void SetAtomicRenderCallbacks(void); static RwObject *SetAtomicFlagCB(RwObject *object, void *data); @@ -114,8 +121,8 @@ public: static void DeleteVehicleColourTextures(void); static RpAtomic *SetEnvironmentMapCB(RpAtomic *atomic, void *data); - static RpMaterial *SetEnvironmentMapCB(RpMaterial *material, void *data); - static RpMaterial *HasSpecularMaterialCB(RpMaterial *material, void *data); + static RpMaterial *SetDefaultEnvironmentMapCB(RpMaterial *material, void *data); + static RpMaterial *GetMatFXEffectMaterialCB(RpMaterial *material, void *data); void SetEnvironmentMap(void); static void LoadEnvironmentMaps(void); static void ShutdownEnvironmentMaps(void); @@ -124,4 +131,5 @@ public: static void SetComponentsToUse(int8 c1, int8 c2) { ms_compsToUse[0] = c1; ms_compsToUse[1] = c2; } }; -VALIDATE_SIZE(CVehicleModelInfo, 0x1F8); +extern bool gbBlackCars; +extern bool gbPinkCars; diff --git a/src/modelinfo/WeaponModelInfo.cpp b/src/modelinfo/WeaponModelInfo.cpp new file mode 100644 index 00000000..2a79fada --- /dev/null +++ b/src/modelinfo/WeaponModelInfo.cpp @@ -0,0 +1,55 @@ +#include "common.h" + +#include "ModelInfo.h" +#include "AnimManager.h" +#include "VisibilityPlugins.h" + +//--MIAMI: file done + +void +CWeaponModelInfo::SetAnimFile(const char *file) +{ + if(strcasecmp(file, "null") == 0) + return; + + m_animFileName = new char[strlen(file)+1]; + strcpy(m_animFileName, file); +} + +void +CWeaponModelInfo::ConvertAnimFileIndex(void) +{ + if(m_animFileIndex != -1){ + // we have a string pointer in that union + int32 index = CAnimManager::GetAnimationBlockIndex(m_animFileName); + delete[] m_animFileName; + m_animFileIndex = index; + } +} + +void +CWeaponModelInfo::Init(void) +{ + CSimpleModelInfo::Init(); + SetWeaponInfo(0); +} + +void +CWeaponModelInfo::SetWeaponInfo(int32 weaponId) +{ + m_atomics[2] = (RpAtomic*)weaponId; +} + +int32 +CWeaponModelInfo::GetWeaponInfo(void) +{ + return (int32)(uintptr)m_atomics[2]; +} + +void +CWeaponModelInfo::SetAtomic(int n, RpAtomic *atomic) +{ + CSimpleModelInfo::SetAtomic(n, atomic); + CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderWeaponCB); +} + diff --git a/src/modelinfo/WeaponModelInfo.h b/src/modelinfo/WeaponModelInfo.h new file mode 100644 index 00000000..17e717db --- /dev/null +++ b/src/modelinfo/WeaponModelInfo.h @@ -0,0 +1,22 @@ +#pragma once + +#include "SimpleModelInfo.h" + +class CWeaponModelInfo : public CSimpleModelInfo +{ + union { + int32 m_animFileIndex; + char *m_animFileName; + }; +public: + CWeaponModelInfo(void) : CSimpleModelInfo(MITYPE_WEAPON) { m_animFileIndex = -1; } + + virtual void SetAnimFile(const char *file); + virtual void ConvertAnimFileIndex(void); + virtual int GetAnimFileIndex(void) { return m_animFileIndex; } + + void Init(void); + void SetWeaponInfo(int32 weaponId); + int32 GetWeaponInfo(void); + void SetAtomic(int n, RpAtomic *atomic); +}; diff --git a/src/modelinfo/XtraCompsModelInfo.h b/src/modelinfo/XtraCompsModelInfo.h deleted file mode 100644 index 9832399c..00000000 --- a/src/modelinfo/XtraCompsModelInfo.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "ClumpModelInfo.h" - -class CXtraCompsModelInfo : public CClumpModelInfo -{ - int field_34; -public: - CXtraCompsModelInfo(void) : CClumpModelInfo(MITYPE_XTRACOMPS) { field_34 = 0; } - void SetClump(RpClump*) {}; - void Shutdown(void) {}; -};
\ No newline at end of file |