[2197] | 1 | #include "dxstdafx.h" |
---|
| 2 | #include "Sphere.hpp" |
---|
| 3 | |
---|
| 4 | bool Sphere::intersectBackSide (const Ray& ray, float& depth, float rayMin, float rayMax) |
---|
| 5 | { |
---|
| 6 | lastTestedRayId = ray.id; |
---|
| 7 | lastTestedRayResult.isIntersect = false; |
---|
| 8 | Vector diff = (ray.origin - centre); |
---|
| 9 | float b = 2.0f * (ray.dir * diff); |
---|
| 10 | float c = diff * diff - radius * radius; |
---|
| 11 | |
---|
| 12 | float discriminant = b * b - 4.0f * c; |
---|
| 13 | if(discriminant < 0.0f) |
---|
| 14 | return false; |
---|
| 15 | else |
---|
| 16 | { |
---|
| 17 | depth = (-b + sqrtf(discriminant)) * 0.5f; |
---|
| 18 | lastTestedRayResult.isIntersect = true; |
---|
| 19 | lastTestedRayResult.depth = depth; |
---|
| 20 | lastTestedRayResult.material = this->material; |
---|
| 21 | if(ray.isShadowRay) return true; |
---|
| 22 | lastTestedRayResult.point = ray.origin + ray.dir * depth; |
---|
| 23 | lastTestedRayResult.normal.setDifference(lastTestedRayResult.point, centre); |
---|
| 24 | lastTestedRayResult.normal *= 1.0f / radius; |
---|
| 25 | lastTestedRayResult.object = this; |
---|
| 26 | return true; |
---|
| 27 | } |
---|
| 28 | } |
---|
| 29 | |
---|
| 30 | bool Sphere::intersect (const Ray& ray, float& depth, float rayMin, float rayMax) |
---|
| 31 | { |
---|
| 32 | lastTestedRayId = ray.id; |
---|
| 33 | lastTestedRayResult.isIntersect = false; |
---|
| 34 | Vector diff = (ray.origin - centre); |
---|
| 35 | float b = 2.0f * (ray.dir * diff); |
---|
| 36 | float c = diff * diff - radius * radius; |
---|
| 37 | |
---|
| 38 | float discriminant = b * b - 4.0f * c; |
---|
| 39 | if(discriminant < 0.0f) |
---|
| 40 | return false; |
---|
| 41 | else |
---|
| 42 | { |
---|
| 43 | depth = (-b - sqrtf(discriminant)) * 0.5f; |
---|
| 44 | lastTestedRayResult.isIntersect = true; |
---|
| 45 | lastTestedRayResult.depth = depth; |
---|
| 46 | lastTestedRayResult.material = this->material; |
---|
| 47 | if(ray.isShadowRay) return true; |
---|
| 48 | lastTestedRayResult.point = ray.origin + ray.dir * depth; |
---|
| 49 | lastTestedRayResult.normal.setDifference(lastTestedRayResult.point, centre); |
---|
| 50 | lastTestedRayResult.normal *= 1.0f / radius; |
---|
| 51 | lastTestedRayResult.object = this; |
---|
| 52 | return true; |
---|
| 53 | } |
---|
| 54 | } |
---|