| 82 | } |
| 83 | |
| 84 | __forceinline void eval(const float u, const float v, |
| 85 | Vec3fa* P, Vec3fa* dPdu, Vec3fa* dPdv, Vec3fa* ddPdudu, Vec3fa* ddPdvdv, Vec3fa* ddPdudv, |
| 86 | const float dscale = 1.0f) const |
| 87 | { |
| 88 | __aligned(64) Vec3fa f_m[2][2]; extract_f_m(f_m); |
| 89 | if (P) { |
| 90 | *P = GregoryPatch3fa::eval(*(Vec3fa_4x4*)&matrix,f_m,u,v); |
| 91 | } |
| 92 | if (dPdu) { |
| 93 | assert(dPdu); *dPdu = GregoryPatch3fa::eval_du(*(Vec3fa_4x4*)&matrix,f_m,u,v)*dscale; |
| 94 | assert(dPdv); *dPdv = GregoryPatch3fa::eval_dv(*(Vec3fa_4x4*)&matrix,f_m,u,v)*dscale; |
| 95 | } |
| 96 | if (ddPdudu) { |
| 97 | assert(ddPdudu); *ddPdudu = GregoryPatch3fa::eval_dudu(*(Vec3fa_4x4*)&matrix,f_m,u,v)*sqr(dscale); |
| 98 | assert(ddPdvdv); *ddPdvdv = GregoryPatch3fa::eval_dvdv(*(Vec3fa_4x4*)&matrix,f_m,u,v)*sqr(dscale); |
| 99 | assert(ddPdudv); *ddPdudv = GregoryPatch3fa::eval_dudv(*(Vec3fa_4x4*)&matrix,f_m,u,v)*sqr(dscale); |
| 100 | } |
| 101 | } |
| 102 | |
| 103 | template<typename vbool, typename vfloat> |
| 104 | __forceinline void eval(const vbool& valid, const vfloat& uu, const vfloat& vv, float* P, float* dPdu, float* dPdv, const float dscale, const size_t dstride, const size_t N) const |