| 31 | } |
| 32 | |
| 33 | void Camera::commit() |
| 34 | { |
| 35 | motionTransform.readParams(*this); |
| 36 | |
| 37 | // "parse" the general expected parameters |
| 38 | pos = getParam<vec3f>("position", vec3f(0.f)); |
| 39 | dir = getParam<vec3f>("direction", vec3f(0.f, 0.f, 1.f)); |
| 40 | up = getParam<vec3f>("up", vec3f(0.f, 1.f, 0.f)); |
| 41 | nearClip = std::max(getParam<float>("nearClip", 1e-6f), 0.f); |
| 42 | imageStart = getParam<vec2f>("imageStart", vec2f(0.f)); |
| 43 | imageEnd = getParam<vec2f>("imageEnd", vec2f(1.f)); |
| 44 | shutter = getParam<range1f>("shutter", range1f(0.5f, 0.5f)); |
| 45 | clamp(shutter.lower); |
| 46 | clamp(shutter.upper); |
| 47 | if (shutter.lower > shutter.upper) |
| 48 | shutter.lower = shutter.upper; |
| 49 | shutterType = |
| 50 | (OSPShutterType)getParam<uint32_t>("shutterType", OSP_SHUTTER_GLOBAL); |
| 51 | rollingShutterDuration = clamp( |
| 52 | getParam<float>("rollingShutterDuration", 0.0f), 0.0f, shutter.size()); |
| 53 | |
| 54 | if (motionTransform.motionBlur || motionTransform.quaternion) { |
| 55 | // create dummy RTCGeometry for transform interpolation or conversion |
| 56 | if (!embreeGeometry) { |
| 57 | embreeGeometry = rtcNewGeometry( |
| 58 | getISPCDevice().getEmbreeDevice(), RTC_GEOMETRY_TYPE_INSTANCE); |
| 59 | embreeScene = rtcNewScene(getISPCDevice().getEmbreeDevice()); |
| 60 | rtcAttachGeometryByID(embreeScene, embreeGeometry, 0); |
| 61 | } |
| 62 | |
| 63 | motionTransform.setEmbreeTransform(embreeGeometry); |
| 64 | |
| 65 | if (shutter.lower == shutter.upper || !motionTransform.motionBlur) { |
| 66 | // directly interpolate to single shutter time |
| 67 | rtcGetGeometryTransformFromScene(embreeScene, |
| 68 | 0, |
| 69 | shutter.lower, |
| 70 | RTC_FORMAT_FLOAT3X4_COLUMN_MAJOR, |
| 71 | &motionTransform.transform); |
| 72 | motionTransform.motionBlur = false; |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | if (!motionTransform.motionBlur) { |
| 77 | if (embreeGeometry) { |
| 78 | rtcReleaseGeometry(embreeGeometry); |
| 79 | embreeGeometry = nullptr; |
| 80 | rtcReleaseScene(embreeScene); |
| 81 | embreeScene = nullptr; |
| 82 | } |
| 83 | |
| 84 | // apply transform right away |
| 85 | pos = xfmPoint(motionTransform.transform, pos); |
| 86 | dir = normalize(xfmVector(motionTransform.transform, dir)); |
| 87 | up = normalize(xfmVector(motionTransform.transform, up)); |
| 88 | } |
| 89 | |
| 90 | if (shutterType != OSP_SHUTTER_GLOBAL) { // rolling shutter |
nothing calls this directly
no test coverage detected