Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
Archivo: Ped.cpp Proyecto: aap/iii_anim
void
CPed::SetModelIndex(int id)
{
	this->CEntity::SetModelIndex(id);
	RpAnimBlendClumpInit(this->clump);
	RpAnimBlendClumpFillFrameArray(this->clump, this->frames);
	CPedModelInfo *pedinfo = (CPedModelInfo*)CModelInfo::ms_modelInfoPtrs[this->nModelIndex];
	this->SetPedStats(pedinfo->pedStats);
	this->headingRate = this->pedStats[8];
	this->animGroup = pedinfo->animGroup;
	CAnimManager::AddAnimation(this->clump, this->animGroup, 3);
	CAnimBlendClumpData *clumpData = *RWPLUGINOFFSET(CAnimBlendClumpData*, clump, ClumpOffset);
	clumpData->pedPosition = &this->vecAnimMoveDelta;
	if(pedinfo->hitColModel == NULL)
		pedinfo->CreateHitColModelSkinned(this->clump);
	if(!IsClumpSkinned(clump))
		AttachRimPipeToRwObject((RwObject*)clump);
}
Ejemplo n.º 3
0
void
CAnimManager::LoadAnimFiles(void)
{
	CAnimManager::LoadAnimFile("ANIM\\PED.IFP");
	void *mem = gta_nw(sizeof(CAnimBlendAssocGroup) * 25 + 8);
	CAnimManager::ms_aAnimAssocGroups = (CAnimBlendAssocGroup *)construct_array(
		mem, &CAnimBlendAssocGroup::ctor, &CAnimBlendAssocGroup::dtor,
		sizeof(CAnimBlendAssocGroup), 25);

	for(int i = 0; i < 25; i++){
		void *model = CModelInfo::ms_modelInfoPtrs[CAnimManager::ms_aAnimAssocDefinitions[i].modelIndex];
		// wtf?
		//((void (__thiscall*)(void*)) (*(void***)model)[5])(model);	// no-op
		// CClumpModelInfo::CreateInstance()
		RpClump *clump = ((RpClump* (__thiscall*)(void*)) (*(void***)model)[3])(model);
		RpAnimBlendClumpInit(clump);
		CAnimBlendAssocGroup *group = &CAnimManager::ms_aAnimAssocGroups[i];
		AnimAssocDefinition *def = &CAnimManager::ms_aAnimAssocDefinitions[i];
		group->CreateAssociations(def->blockName, clump, def->animNames, def->animCount);
		for(int j = 0; j < group->numAssociations; j++)
			group->GetAnimation(def->animInfoList[j].animId)->flags |= def->animInfoList[j].flags;
		RpClumpDestroy(clump);
	}
}