RpClump *CClumpModelInfo::CreateInstance() { if (GetRwObject() == NULL) { return NULL; } AddRef(); RpClump *pCloned = RpClumpClone((RpClump*)GetRwObject()); RpAtomic *pFirst = GetFirstAtomic(pCloned); if (pFirst) { if(RpSkinGeometryGetSkin(pFirst->geometry) != NULL) { if(!dwUnknownFlag10) { RpHAnimHierarchy *pHAnim = GetAnimHierarchyFromClump(pCloned); RpClumpForAllAtomics(pCloned, SetAtomicHAnimHierarchyCB, pHAnim); RtAnimAnimation *pAnim = RpAnimBlendCreateAnimationForHierarchy(pHAnim); RtAnimInterpolatorSetCurrentAnim(pHAnim->currentAnim, pAnim); pHAnim->flags = rpHANIMHIERARCHYUPDATEMODELLINGMATRICES | rpHANIMHIERARCHYUPDATELTMS; } } } if (GetIsRoad()) { RpAnimBlendClumpInit(pCloned); CAnimBlendHierarchy *pAnim = CAnimManager::GetAnimationByID(GetHashKey(), &CAnimManager::AnimBlocks[m_AnimId]); if (pAnim) { CAnimManager::BlendAnimation(pCloned, pAnim, 2, 1.0f); } } RemoveRef(); return pCloned; }
bool CFileLoader::LoadAtomicFile(RwStream* stream, uint32_t modelIndex) { CAtomicModelInfo* info = CModelInfo::GetModelInfo(modelIndex)->AsAtomicModelInfoPtr(); v4 = 0; if (info && info->flags & 0x8000) { v4 = 1; CVehicleModelInfo::UseCommonVehicleTexDicationary(); } if (RwStreamFindChunk(stream, 16, NULL, NULL)) { RpClump* read = RpClumpStreamRead(stream); if (!read) { if (v4) { CVehicleModelInfo::StopUsingCommonVehicleTexDicationary(); } return false; } relatedModelIndex = modelIndex; RpClumpForAllAtomics(read, SetRelatedModelInfoCB, read); RpClumpDestroy(read); } if (!info->GetRwObject()) { return false; } if (v4) { CVehicleModelInfo::StopUsingCommonVehicleTexDicationary(); } return true; }
void* CPedModelInfo::SetClump(RpClump* clump) { CClumpModelInfo::SetClump(clump); CClumpModelInfo::SetFrameIds(&m_pPedIds); if (!m_hitColModel) { CreateHitColModelSkinned(clump); } RpClumpForAllAtomics((RpClump*)GetRwObject(), CClumpModelInfo::SetAtomicRendererCB, CVisibilityPlugins::RenderPedCB); return (void*)GetAnimHierarchyFromClump(clump); }
bool CFileLoader::LoadClumpFile(RwStream *stream, size_t model_id) { char v2; // bl@1 int v3; // ebp@1 CVehicleModelInfo *v4; // esi@1 RpClump *v5; // ebx@2 RwFrame *v6; // ebp@2 RpClump *v7; // eax@3 RpClump *v8; // esi@3 RwFrame *v9; // eax@4 RpClump *v11; // edi@10 CVehicleModelInfo *v12; // [sp+10h] [bp+10h]@1 v3 = model_id; CVehicleModelInfo* v12 = static_cast<CVehicleModelInfo*>(CModelInfo::GetModelInfo(model_id)); v4 = v12; v2 = (unsigned __int8)v12->__parent.__parent.__vmt->getType(v12) == 6; if ( HIBYTE(v12->__parent.__parent.flags) & 2 ) { v5 = (RpClump *)RpClumpCreate(); v6 = RwFrameCreate(); v5->object.parent = v6; if ( !v7ed2d0(stream, 16, 0, 0) ) { LABEL_6: ((void (__thiscall *)(CVehicleModelInfo *, RpClump *))v4->__parent.__parent.__vmt[1]._m04)(v4, v5); return 1; } while ( 1 ) { v7 = RpClumpStreamRead(stream); v8 = v7; if ( !v7 ) return 0; v9 = _rwFrameCloneAndLinkClones(v7->object.parent); v7f0b00(v6, v9); RpClumpForAllAtomics(v8, (int (__cdecl *)(_DWORD, _DWORD))dummy_537290, v5); RpClumpDestroy(v8); if ( !v7ed2d0(stream, 16, 0, 0) ) { v4 = v12; goto LABEL_6; } } } if ( !v7ed2d0(stream, 16, 0, 0) ) return 0; if ( v2 ) { CCollisionPlugin__SetModelInfo(&v12->__parent.__parent); CVehicleModelInfo__UseCommonVehicleTexDicationary(); } v11 = RpClumpStreamRead(stream); if ( v2 ) { CCollisionPlugin__SetModelInfo(0); restoreTextureFindCallback(); } if ( !v11 ) return 0; ((void (__thiscall *)(CVehicleModelInfo *, RpClump *))v12->__parent.__parent.__vmt[1]._m04)(v12, v11); if ( v3 == 508 ) v12->ucDoorCount = 2; return 1; }