| 338 | } |
| 339 | |
| 340 | udword Opcode13Pint::BatchRaycasts(PintSQThreadContext context, udword nb, PintRaycastHit* dest, const PintRaycastData* raycasts) |
| 341 | { |
| 342 | AllocSwitch _; |
| 343 | |
| 344 | ASSERT(mSceneTree); |
| 345 | |
| 346 | if(mSceneTree) |
| 347 | { |
| 348 | SQThreadContext* C = (SQThreadContext*)context; |
| 349 | Container& mBoxIndices = C->mBoxIndices; |
| 350 | |
| 351 | RayCollider SceneRC; |
| 352 | SceneRC.SetFirstContact(false); |
| 353 | SceneRC.SetTemporalCoherence(false); |
| 354 | SceneRC.SetPrimitiveTests(true); |
| 355 | |
| 356 | CollisionFace Memory; |
| 357 | CollisionFaces CF; |
| 358 | CF.InitSharedBuffers(sizeof(CollisionFace)/sizeof(udword), (udword*)&Memory); |
| 359 | |
| 360 | RayCollider RC; |
| 361 | RC.SetFirstContact(false); |
| 362 | RC.SetTemporalCoherence(false); |
| 363 | RC.SetPrimitiveTests(true); |
| 364 | RC.SetCulling(true); |
| 365 | RC.SetClosestHit(true); |
| 366 | RC.SetDestination(&CF); |
| 367 | |
| 368 | udword NbHits = 0; |
| 369 | while(nb--) |
| 370 | { |
| 371 | const Ray& CurrentRay = *reinterpret_cast<const Ray*>(&raycasts->mOrigin.x); |
| 372 | |
| 373 | SceneRC.SetMaxDist(raycasts->mMaxDist); |
| 374 | mBoxIndices.Reset(); |
| 375 | if(SceneRC.Collide(CurrentRay, mSceneTree, mBoxIndices)) |
| 376 | { |
| 377 | const OpcodeActor* TouchedActor = null; |
| 378 | CollisionFace Hit; |
| 379 | Hit.mDistance = raycasts->mMaxDist; |
| 380 | |
| 381 | udword NbMeshes = mBoxIndices.GetNbEntries(); |
| 382 | for(udword i=0;i<NbMeshes;i++) |
| 383 | { |
| 384 | const OpcodeActor* Actor = (const OpcodeActor*)mActors.GetEntries()[mBoxIndices[i]]; |
| 385 | const OpcodeMesh* Mesh = Actor->mMesh; |
| 386 | |
| 387 | RC.SetMaxDist(Hit.mDistance); |
| 388 | Memory.mDistance = MAX_FLOAT; |
| 389 | if(RC.Collide(CurrentRay, Mesh->mModel, &Actor->mMeshTM/*, udword* cache=null*/)) |
| 390 | { |
| 391 | if(Memory.mDistance<Hit.mDistance) |
| 392 | { |
| 393 | Hit = Memory; |
| 394 | TouchedActor = Actor; |
| 395 | } |
| 396 | } |
| 397 | } |
nothing calls this directly
no test coverage detected