diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-29 10:11:19 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-29 10:11:19 +1000 |
commit | 624c7aaaf192f2e87081a241123a8507a4718ba3 (patch) | |
tree | a54b09902da8d724f3ba740a215fd53d8a861fd9 /source/base/StarCellularLighting.cpp | |
parent | 9d67cda97fc327ca3c53e044a897fbfb196104c4 (diff) |
Move lighting calculation to separate thread
Diffstat (limited to 'source/base/StarCellularLighting.cpp')
-rw-r--r-- | source/base/StarCellularLighting.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/source/base/StarCellularLighting.cpp b/source/base/StarCellularLighting.cpp index c29e78e..0578961 100644 --- a/source/base/StarCellularLighting.cpp +++ b/source/base/StarCellularLighting.cpp @@ -94,6 +94,39 @@ void CellularLightingCalculator::calculate(Image& output) { } } +void CellularLightingCalculator::setupImage(Image& image, PixelFormat format) const { + Vec2S arrayMin = Vec2S(m_queryRegion.min() - m_calculationRegion.min()); + Vec2S arrayMax = Vec2S(m_queryRegion.max() - m_calculationRegion.min()); + + image.reset(arrayMax[0] - arrayMin[0], arrayMax[1] - arrayMin[1], format); +} + +ThreadFunction<Image> CellularLightingCalculator::calculateAsync() { + return ThreadFunction<Image>([this]() { + Vec2S arrayMin = Vec2S(m_queryRegion.min() - m_calculationRegion.min()); + Vec2S arrayMax = Vec2S(m_queryRegion.max() - m_calculationRegion.min()); + + if (m_monochrome) + m_lightArray.right().calculate(arrayMin[0], arrayMin[1], arrayMax[0], arrayMax[1]); + else + m_lightArray.left().calculate(arrayMin[0], arrayMin[1], arrayMax[0], arrayMax[1]); + + Image output; + setupImage(output, PixelFormat::RGB24); + + for (size_t x = arrayMin[0]; x < arrayMax[0]; ++x) { + for (size_t y = arrayMin[1]; y < arrayMax[1]; ++y) { + if (m_monochrome) + output.set24(x - arrayMin[0], y - arrayMin[1], Color::grayf(m_lightArray.right().getLight(x, y)).toRgb()); + else + output.set24(x - arrayMin[0], y - arrayMin[1], Color::v3fToByte(m_lightArray.left().getLight(x, y))); + } + } + + return output; + }, "CellularLightingCalculator Thread"); +} + void CellularLightIntensityCalculator::setParameters(Json const& config) { m_lightArray.setParameters( config.getInt("spreadPasses"), |