| 1066 | } |
| 1067 | |
| 1068 | inline Vec3fa derivBSpline(const ISPCHairSet* mesh, const unsigned int primID, const float t, const float time) |
| 1069 | { |
| 1070 | Vec3fa p00, p01, p02, p03; |
| 1071 | const int i = mesh->hairs[primID].vertex; |
| 1072 | |
| 1073 | if (mesh->numTimeSteps == 1) |
| 1074 | { |
| 1075 | p00 = mesh->positions[0][i+0]; |
| 1076 | p01 = mesh->positions[0][i+1]; |
| 1077 | p02 = mesh->positions[0][i+2]; |
| 1078 | p03 = mesh->positions[0][i+3]; |
| 1079 | } |
| 1080 | else |
| 1081 | { |
| 1082 | float f = mesh->numTimeSteps*time; |
| 1083 | int itime = clamp((int)floor(f),0,(int)mesh->numTimeSteps-2); |
| 1084 | float t1 = f-itime; |
| 1085 | float t0 = 1.0f-t1; |
| 1086 | const Vec3fa a0 = mesh->positions[itime+0][i+0]; |
| 1087 | const Vec3fa a1 = mesh->positions[itime+0][i+1]; |
| 1088 | const Vec3fa a2 = mesh->positions[itime+0][i+2]; |
| 1089 | const Vec3fa a3 = mesh->positions[itime+0][i+3]; |
| 1090 | const Vec3fa b0 = mesh->positions[itime+1][i+0]; |
| 1091 | const Vec3fa b1 = mesh->positions[itime+1][i+1]; |
| 1092 | const Vec3fa b2 = mesh->positions[itime+1][i+2]; |
| 1093 | const Vec3fa b3 = mesh->positions[itime+1][i+3]; |
| 1094 | p00 = t0*a0 + t1*b0; |
| 1095 | p01 = t0*a1 + t1*b1; |
| 1096 | p02 = t0*a2 + t1*b2; |
| 1097 | p03 = t0*a3 + t1*b3; |
| 1098 | } |
| 1099 | |
| 1100 | const float t0 = 1.0f - t, t1 = t; |
| 1101 | const float n0 = -0.5f*t1*t1; |
| 1102 | const float n1 = -0.5f*t0*t0 - 2.0f*(t0*t1); |
| 1103 | const float n2 = 0.5f*t1*t1 + 2.0f*(t1*t0); |
| 1104 | const float n3 = 0.5f*t0*t0; |
| 1105 | return Vec3fa(n0*p00 + n1*p01 + n2*p02 + n3*p03); |
| 1106 | } |
| 1107 | |
| 1108 | void postIntersectGeometry(const TutorialData& data, const Ray& ray, DifferentialGeometry& dg, ISPCGeometry* geometry, int& materialID) |
| 1109 | { |
no test coverage detected