| 978 | } |
| 979 | |
| 980 | inline Vec3fa derivBezier(const ISPCHairSet* mesh, const unsigned int primID, const float t, const float time) |
| 981 | { |
| 982 | Vec3fa p00, p01, p02, p03; |
| 983 | const int i = mesh->hairs[primID].vertex; |
| 984 | |
| 985 | if (mesh->numTimeSteps == 1) |
| 986 | { |
| 987 | p00 = mesh->positions[0][i+0]; |
| 988 | p01 = mesh->positions[0][i+1]; |
| 989 | p02 = mesh->positions[0][i+2]; |
| 990 | p03 = mesh->positions[0][i+3]; |
| 991 | } |
| 992 | else |
| 993 | { |
| 994 | float f = mesh->numTimeSteps*time; |
| 995 | int itime = clamp((int)floor(f),0,(int)mesh->numTimeSteps-2); |
| 996 | float t1 = f-itime; |
| 997 | float t0 = 1.0f-t1; |
| 998 | const Vec3fa a0 = mesh->positions[itime+0][i+0]; |
| 999 | const Vec3fa a1 = mesh->positions[itime+0][i+1]; |
| 1000 | const Vec3fa a2 = mesh->positions[itime+0][i+2]; |
| 1001 | const Vec3fa a3 = mesh->positions[itime+0][i+3]; |
| 1002 | const Vec3fa b0 = mesh->positions[itime+1][i+0]; |
| 1003 | const Vec3fa b1 = mesh->positions[itime+1][i+1]; |
| 1004 | const Vec3fa b2 = mesh->positions[itime+1][i+2]; |
| 1005 | const Vec3fa b3 = mesh->positions[itime+1][i+3]; |
| 1006 | p00 = t0*a0 + t1*b0; |
| 1007 | p01 = t0*a1 + t1*b1; |
| 1008 | p02 = t0*a2 + t1*b2; |
| 1009 | p03 = t0*a3 + t1*b3; |
| 1010 | } |
| 1011 | |
| 1012 | const float t0 = 1.0f - t, t1 = t; |
| 1013 | const Vec3fa p10 = p00 * t0 + p01 * t1; |
| 1014 | const Vec3fa p11 = p01 * t0 + p02 * t1; |
| 1015 | const Vec3fa p12 = p02 * t0 + p03 * t1; |
| 1016 | const Vec3fa p20 = p10 * t0 + p11 * t1; |
| 1017 | const Vec3fa p21 = p11 * t0 + p12 * t1; |
| 1018 | //const Vec3fa p30 = p20 * t0 + p21 * t1; |
| 1019 | return Vec3fa(3.0f*(p21-p20)); |
| 1020 | } |
| 1021 | |
| 1022 | inline Vec3fa derivHermite(const ISPCHairSet* mesh, const unsigned int primID, const float u, const float time) |
| 1023 | { |
no test coverage detected