| 256 | private: |
| 257 | |
| 258 | __forceinline AffineSpace3ff l2w(size_t i, size_t itime) const { |
| 259 | if (l2w_buf[itime].getFormat() == RTC_FORMAT_FLOAT4X4_COLUMN_MAJOR) { |
| 260 | return *(AffineSpace3ff*)(l2w_buf[itime].getPtr(i)); |
| 261 | } |
| 262 | else if(l2w_buf[itime].getFormat() == RTC_FORMAT_QUATERNION_DECOMPOSITION) { |
| 263 | AffineSpace3ff transform; |
| 264 | QuaternionDecomposition* qd = (QuaternionDecomposition*)l2w_buf[itime].getPtr(i); |
| 265 | transform.l.vx.x = qd->scale_x; |
| 266 | transform.l.vy.y = qd->scale_y; |
| 267 | transform.l.vz.z = qd->scale_z; |
| 268 | transform.l.vy.x = qd->skew_xy; |
| 269 | transform.l.vz.x = qd->skew_xz; |
| 270 | transform.l.vz.y = qd->skew_yz; |
| 271 | transform.l.vx.y = qd->translation_x; |
| 272 | transform.l.vx.z = qd->translation_y; |
| 273 | transform.l.vy.z = qd->translation_z; |
| 274 | transform.p.x = qd->shift_x; |
| 275 | transform.p.y = qd->shift_y; |
| 276 | transform.p.z = qd->shift_z; |
| 277 | // normalize quaternion |
| 278 | Quaternion3f q(qd->quaternion_r, qd->quaternion_i, qd->quaternion_j, qd->quaternion_k); |
| 279 | q = normalize(q); |
| 280 | transform.l.vx.w = q.i; |
| 281 | transform.l.vy.w = q.j; |
| 282 | transform.l.vz.w = q.k; |
| 283 | transform.p.w = q.r; |
| 284 | return transform; |
| 285 | } |
| 286 | else if (l2w_buf[itime].getFormat() == RTC_FORMAT_FLOAT3X4_COLUMN_MAJOR) { |
| 287 | AffineSpace3f* l2w = reinterpret_cast<AffineSpace3f*>(l2w_buf[itime].getPtr(i)); |
| 288 | return AffineSpace3ff(*l2w); |
| 289 | } |
| 290 | else if (l2w_buf[itime].getFormat() == RTC_FORMAT_FLOAT3X4_ROW_MAJOR) { |
| 291 | float* data = reinterpret_cast<float*>(l2w_buf[itime].getPtr(i)); |
| 292 | AffineSpace3f l2w; |
| 293 | l2w.l.vx.x = data[0]; l2w.l.vy.x = data[1]; l2w.l.vz.x = data[2]; l2w.p.x = data[3]; |
| 294 | l2w.l.vx.y = data[4]; l2w.l.vy.y = data[5]; l2w.l.vz.y = data[6]; l2w.p.y = data[7]; |
| 295 | l2w.l.vx.z = data[8]; l2w.l.vy.z = data[9]; l2w.l.vz.z = data[10]; l2w.p.z = data[11]; |
| 296 | return l2w; |
| 297 | } |
| 298 | assert(false); |
| 299 | return AffineSpace3ff(); |
| 300 | } |
| 301 | |
| 302 | inline AffineSpace3ff l2w(size_t i) const { |
| 303 | return l2w(i, 0); |