bool do_tesselate_face( const Face &F, tesscb_estimator* cb_E, int &max_id ) { if (F.CalcArea()<EPS_L) return false;//continue; max_id = cb_E(&F); if (max_id<0) return false;//continue; // nothing selected return true; }
void CDeflector::OA_Export() { if (UVpolys.empty()) return; // Correct normal // (semi-proportional to pixel density) FPU::m64r (); Fvector tN; tN.set (0,0,0); float density = 0; float fcount = 0; for (UVIt it = UVpolys.begin(); it!=UVpolys.end(); it++) { Face *F = it->owner; Fvector SN; SN.set (F->N); SN.mul (1+EPS*F->CalcArea()); tN.add (SN); density += F->Shader().lm_density; fcount += 1.f; } if (tN.magnitude()>EPS_S && _valid(tN)) normal.set(tN).normalize(); else clMsg("* ERROR: Internal precision error in CDeflector::OA_Export"); density /= fcount; // Orbitrary Oriented Ortho - Projection Fmatrix mView; Fvector at,from,up,right,y; at.set (0,0,0); from.add (at,normal); y.set (0,1,0); if (_abs(normal.y)>.99f) y.set(1,0,0); right.crossproduct(y,normal); right.normalize_safe(); up.crossproduct(normal,right); up.normalize_safe(); mView.build_camera(from,at,up); Fbox bb; bb.invalidate(); for (UVIt it = UVpolys.begin(); it!=UVpolys.end(); it++) { UVtri *T = &*it; Face *F = T->owner; Fvector P; // projected for (int i=0; i<3; i++) { mView.transform_tiny (P,F->v[i]->P); T->uv[i].set (P.x,P.y); bb.modify (F->v[i]->P); } } bb.getsphere(Sphere.P,Sphere.R); // UV rect Fvector2 min,max,size; GetRect (min,max); size.sub (max,min); // Surface u32 dwWidth = iCeil(size.x*g_params.m_lm_pixels_per_meter*density+.5f); clamp(dwWidth, 1u,512u-2*BORDER); u32 dwHeight = iCeil(size.y*g_params.m_lm_pixels_per_meter*density+.5f); clamp(dwHeight,1u,512u-2*BORDER); layer.create (dwWidth,dwHeight); }