| 2555 | : VerifyApplication::IntersectTest(name,isa,imode,ivariant,VerifyApplication::TEST_SHOULD_PASS), sflags(sflags), quality(quality) {} |
| 2556 | |
| 2557 | VerifyApplication::TestReturnValue run(VerifyApplication* state, bool silent) |
| 2558 | { |
| 2559 | std::string cfg = state->rtcore + ",isa="+stringOfISA(isa); |
| 2560 | RTCDeviceRef device = rtcNewDevice(cfg.c_str()); |
| 2561 | errorHandler(nullptr,rtcGetDeviceError(device)); |
| 2562 | |
| 2563 | Vec3f vertices[5] = { |
| 2564 | Vec3f(0.0f,0.0f,0.0f), |
| 2565 | Vec3f(1.0f,0.0f,0.0f), |
| 2566 | Vec3f(1.0f,1.0f,0.0f), |
| 2567 | Vec3f(0.0f,1.0f,0.0f), |
| 2568 | Vec3f(zero) // dummy vertex for 16 byte padding |
| 2569 | }; |
| 2570 | int quads[4] = { |
| 2571 | 0,1,2,3 |
| 2572 | }; |
| 2573 | RTCSceneRef scene = rtcNewScene(device); |
| 2574 | rtcSetSceneFlags(scene,sflags.sflags); |
| 2575 | rtcSetSceneBuildQuality(scene,sflags.qflags); |
| 2576 | |
| 2577 | RTCGeometry geom = rtcNewGeometry (device, RTC_GEOMETRY_TYPE_QUAD); |
| 2578 | rtcSetGeometryBuildQuality(geom, quality); |
| 2579 | rtcSetSharedGeometryBuffer(geom, RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, vertices , 0, sizeof(Vec3f), 4); |
| 2580 | rtcSetSharedGeometryBuffer(geom, RTC_BUFFER_TYPE_INDEX , 0, RTC_FORMAT_UINT4, quads, 0, 4*sizeof(int), 1); |
| 2581 | rtcCommitGeometry(geom); |
| 2582 | rtcAttachGeometry(scene,geom); |
| 2583 | rtcReleaseGeometry(geom); |
| 2584 | rtcCommitScene (scene); |
| 2585 | AssertNoError(device); |
| 2586 | |
| 2587 | float u[256], v[256]; |
| 2588 | RTCRayHit rays[256]; |
| 2589 | for (size_t i=0; i<256; i++) |
| 2590 | { |
| 2591 | u[i] = random_float(); |
| 2592 | v[i] = random_float(); |
| 2593 | if (u[i] < 0.001f || v[i] < 0.001f || u[i] > 0.999f || v[i] > 0.999f) { u[i] = 0.333f; v[i] = 0.333f; } // avoid hitting edges |
| 2594 | Vec3fa from(0.0f,0.0f,-1.0f); |
| 2595 | Vec3fa to = vertices[0] + u[i]*(vertices[1]-vertices[0]) + v[i]*(vertices[3]-vertices[0]); |
| 2596 | rays[i] = makeRay(from,to-from); |
| 2597 | } |
| 2598 | IntersectWithMode(imode,ivariant,scene,rays,256); |
| 2599 | |
| 2600 | for (size_t i=0; i<256; i++) |
| 2601 | { |
| 2602 | if (!(ivariant & VARIANT_INTERSECT)) |
| 2603 | { |
| 2604 | if (rays[i].ray.tfar != float(neg_inf)) return VerifyApplication::FAILED; |
| 2605 | continue; |
| 2606 | } |
| 2607 | if (rays[i].hit.primID != 0) return VerifyApplication::FAILED; |
| 2608 | if (abs(rays[i].hit.u - u[i]) > 16.0f*float(ulp)) return VerifyApplication::FAILED; |
| 2609 | if (abs(rays[i].hit.v - v[i]) > 16.0f*float(ulp)) return VerifyApplication::FAILED; |
| 2610 | if (abs(rays[i].ray.tfar - 1.0f) > 16.0f*float(ulp)) return VerifyApplication::FAILED; |
| 2611 | |
| 2612 | const Vec3fa org(rays[i].ray.org_x,rays[i].ray.org_y,rays[i].ray.org_z); |
| 2613 | const Vec3fa dir(rays[i].ray.dir_x,rays[i].ray.dir_y,rays[i].ray.dir_z); |
| 2614 | const Vec3fa ht = org + rays[i].ray.tfar*dir; |
nothing calls this directly
no test coverage detected