/////////////////////////////////////////////////////////////////////
| 5065 | |
| 5066 | ////////////////////////////////////////////////////////////////////////// |
| 5067 | int 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); |
nothing calls this directly
no test coverage detected