MCPcopy Create free account
hub / github.com/StrongPC123/Far-Cry-1-Source-Full / CheckCollisions

Method CheckCollisions

CrySystem/ScriptObjectEntity.cpp:5067–5168  ·  view source on GitHub ↗

/////////////////////////////////////////////////////////////////////

Source from the content-addressed store, hash-verified

5065
5066//////////////////////////////////////////////////////////////////////////
5067int CScriptObjectEntity::CheckCollisions(IFunctionHandler *pH)
5068{
5069 assert(pH->GetParamCount()<=2);
5070 int iEntTypes = ent_sleeping_rigid|ent_rigid|ent_living, iCollTypes = -1;
5071 pH->GetParam(1,iEntTypes);
5072 pH->GetParam(2,iCollTypes);
5073
5074 IPhysicalEntity **ppEnts,*pEnt = m_pEntity->GetPhysics();
5075 if (pEnt)
5076 {
5077 int nEnts,i,nParts,nCont,nTotCont,nEntCont,nContactEnts;
5078 pe_params_bbox pbb;
5079 pe_params_foreign_data pfd;
5080 pe_status_pos sp[2];
5081 pe_params_part pp[2];
5082 geom_world_data gwd[2];
5083 intersection_params ip;
5084 geom_contact *pContacts;
5085 IEntity *pIEnt;
5086 _SmartScriptObject psoRes(m_pScriptSystem),psoContactList(m_pScriptSystem),psoEntList(m_pScriptSystem);
5087 IScriptObject *psoEnt,*psoNormals[32],*psoCenters[32],*psoContacts[32];
5088
5089 pEnt->GetParams(&pbb);
5090 pEnt->GetParams(&pfd);
5091 nParts = pEnt->GetStatus(&pe_status_nparts());
5092 pEnt->GetStatus(sp+0);
5093 ip.bNoAreaContacts = true;
5094 ip.vrel_min = 1E10f;
5095
5096 nEnts = m_pISystem->GetIPhysicalWorld()->GetEntitiesInBox(pbb.BBox[0],pbb.BBox[1],ppEnts,iEntTypes);
5097 nContactEnts = nTotCont = 0;
5098 for(i=0; i<nEnts; i++)
5099 if (ppEnts[i]!=pEnt && !(pfd.pForeignData && ppEnts[i]->GetForeignData(pfd.iForeignData)==pfd.pForeignData))
5100 {
5101 ppEnts[i]->GetStatus(sp+1);
5102 psoEnt = (pIEnt = (IEntity*)ppEnts[i]->GetForeignData()) ? pIEnt->GetScriptObject() : 0;
5103 nEntCont = 0;
5104
5105 for(pp[1].ipart=ppEnts[i]->GetStatus(&pe_status_nparts())-1; pp[1].ipart>=0; pp[1].ipart--)
5106 {
5107 MARK_UNUSED(pp[1].partid); ppEnts[i]->GetParams(pp+1);
5108 gwd[1].offset = sp[1].pos + sp[1].q*pp[1].pos;
5109 gwd[1].R = matrix3x3f(sp[1].q*pp[1].q);
5110 gwd[1].scale = pp[1].scale;
5111 for(pp[0].ipart=0; pp[0].ipart<nParts; pp[0].ipart++)
5112 {
5113 MARK_UNUSED(pp[0].partid); pEnt->GetParams(pp+0);
5114 if ((iCollTypes==-1 ? pp[0].flagsColliderOR : iCollTypes) & pp[1].flagsOR)
5115 {
5116 gwd[0].offset = sp[0].pos + sp[0].q*pp[0].pos;
5117 gwd[0].R = matrix3x3f(sp[0].q*pp[0].q);
5118 gwd[0].scale = pp[0].scale;
5119 for(nCont = pp[0].pPhysGeomProxy->pGeom->Intersect(pp[1].pPhysGeomProxy->pGeom, gwd+0,gwd+1, &ip, pContacts)-1;
5120 nCont>=0 && nTotCont<sizeof(psoContacts)/sizeof(psoContacts[0]); nCont--)
5121 {
5122 psoCenters[nTotCont] = m_pScriptSystem->CreateObject();
5123 psoCenters[nTotCont]->BeginSetGetChain();
5124 psoCenters[nTotCont]->SetValueChain("x",pContacts[nCont].center.x);

Callers

nothing calls this directly

Calls 15

GetEntitiesInBoxMethod · 0.80
GetIPhysicalWorldMethod · 0.80
BeginSetGetChainMethod · 0.80
SetValueChainMethod · 0.80
EndSetGetChainMethod · 0.80
SetToNullChainMethod · 0.80
SetAtMethod · 0.80
EndFunctionMethod · 0.80
GetParamCountMethod · 0.45
GetParamMethod · 0.45
GetPhysicsMethod · 0.45
GetParamsMethod · 0.45

Tested by

no test coverage detected