diff --git a/GUI/View/Realspace/RealspaceBuilder.cpp b/GUI/View/Realspace/RealspaceBuilder.cpp index 18185e49d59e0b7987ca198c3f98e6f7b5fb2816..e83e609cc45044b50b68c2f792d9ab1851c73e16 100644 --- a/GUI/View/Realspace/RealspaceBuilder.cpp +++ b/GUI/View/Realspace/RealspaceBuilder.cpp @@ -94,17 +94,24 @@ std::unique_ptr<const double2d_t> layerRoughnessMap(const LayerItem& layerItem, const SceneGeometry& sceneGeometry, int seed) { std::unique_ptr<const double2d_t> result; + std::unique_ptr<AutoCorrModel> autoCorr; + std::unique_ptr<InterlayerModel> interlayer; - if (const auto* br = dynamic_cast<const BasicRoughnessItem*>(layerItem.certainRoughness())) { - BasicAutoCorr autoCorr(br->sigma().dVal(), br->hurst().dVal(), - br->lateralCorrelationLength().dVal()); - auto roughness = - LayerRoughness(&autoCorr, br->certainInterlayerModel()->createModel().release()); - int n = sceneGeometry.numRoughnessPointsAlongAxis; - double L = 2 * sceneGeometry.layerSize; - auto rmap = RoughnessMap(n, n, L, L, &roughness, seed); // seed < 0 ==> random every time - result.reset(new double2d_t(rmap.generateMap())); - } + if (const RoughnessItem* r = layerItem.certainRoughness()) + interlayer = r->certainInterlayerModel()->createModel(); + + if (const auto* br = dynamic_cast<const BasicRoughnessItem*>(layerItem.certainRoughness())) + autoCorr = std::make_unique<BasicAutoCorr>(br->sigma().dVal(), br->hurst().dVal(), + br->lateralCorrelationLength().dVal()); + + auto roughness = LayerRoughness(autoCorr.get(), interlayer.get()); + if (roughness.sigma() == 0) + return result; + + int n = sceneGeometry.numRoughnessPointsAlongAxis; + double L = 2 * sceneGeometry.layerSize; + auto rmap = RoughnessMap(n, n, L, L, &roughness, seed); // seed < 0 ==> random every time + result.reset(new double2d_t(rmap.generateMap())); return result; }