@@ -156,7 +156,9 @@ float SubdivShape::MaxEdgeScreenSize(const Camera *camera, ExtTriangleMesh *srcM
156
156
157
157
static Far::TopologyRefiner * createFarTopologyRefiner (const ExtTriangleMesh*);
158
158
159
- ExtTriangleMesh *SubdivShape::ApplySubdiv (ExtTriangleMesh *srcMesh, const u_int maxLevel) {
159
+ ExtTriangleMesh *SubdivShape::ApplySubdiv (
160
+ ExtTriangleMesh *srcMesh, const u_int maxLevel, const bool adaptive
161
+ ) {
160
162
// --------------------------------------------------------------------------
161
163
// Check data
162
164
// --------------------------------------------------------------------------
@@ -174,10 +176,17 @@ ExtTriangleMesh *SubdivShape::ApplySubdiv(ExtTriangleMesh *srcMesh, const u_int
174
176
// Set-up refiner
175
177
std::unique_ptr<Far::TopologyRefiner> refiner (createFarTopologyRefiner (srcMesh));
176
178
177
- // Uniformly refine the topology up to 'maxlevel'
178
- Far::TopologyRefiner::UniformOptions refiner_options (maxLevel);
179
- refiner_options.fullTopologyInLastLevel = true ;
180
- refiner->RefineUniform (refiner_options);
179
+ // Refine the topology up to 'maxlevel'
180
+ if (adaptive) {
181
+ SDL_LOG (" Subdiv - Refining (adaptive)" );
182
+ Far::TopologyRefiner::AdaptiveOptions refiner_options (maxLevel);
183
+ refiner->RefineAdaptive (refiner_options);
184
+ } else {
185
+ SDL_LOG (" Subdiv - Refining (uniform)" );
186
+ Far::TopologyRefiner::UniformOptions refiner_options (maxLevel);
187
+ refiner_options.fullTopologyInLastLevel = true ;
188
+ refiner->RefineUniform (refiner_options);
189
+ }
181
190
182
191
Far::TopologyLevel const & refFirstLevel = refiner->GetLevel (0 );
183
192
Far::TopologyLevel const & refLastLevel = refiner->GetLevel (maxLevel);
@@ -412,7 +421,7 @@ ExtTriangleMesh *SubdivShape::ApplySubdiv(ExtTriangleMesh *srcMesh, const u_int
412
421
}
413
422
414
423
SubdivShape::SubdivShape (const Camera *camera, ExtTriangleMesh *srcMesh,
415
- const u_int maxLevel, const float maxEdgeScreenSize) {
424
+ const u_int maxLevel, const float maxEdgeScreenSize, const bool adaptive ) {
416
425
const double startTime = WallClockTime ();
417
426
418
427
if ((maxEdgeScreenSize > 0 .f ) && !camera)
@@ -433,7 +442,7 @@ SubdivShape::SubdivShape(const Camera *camera, ExtTriangleMesh *srcMesh,
433
442
break ;
434
443
435
444
// Subdivide by one level and re-try
436
- ExtTriangleMesh *newMesh = ApplySubdiv (mesh, 1 );
445
+ ExtTriangleMesh *newMesh = ApplySubdiv (mesh, 1 , adaptive );
437
446
SDL_LOG (" Subdivided shape step #" << i << " from " << mesh->GetTotalTriangleCount () << " to " << newMesh->GetTotalTriangleCount () << " faces" );
438
447
439
448
// Replace old mesh with new one
@@ -443,7 +452,7 @@ SubdivShape::SubdivShape(const Camera *camera, ExtTriangleMesh *srcMesh,
443
452
} else {
444
453
SDL_LOG (" Subdividing shape " << srcMesh->GetName () << " at level: " << maxLevel);
445
454
446
- mesh = ApplySubdiv (srcMesh, maxLevel);
455
+ mesh = ApplySubdiv (srcMesh, maxLevel, adaptive );
447
456
}
448
457
} else {
449
458
// Nothing to do, just make a copy
0 commit comments