From 624c7aaaf192f2e87081a241123a8507a4718ba3 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Thu, 29 Jun 2023 10:11:19 +1000 Subject: Move lighting calculation to separate thread --- source/base/StarCellularLighting.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'source/base/StarCellularLighting.cpp') 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 CellularLightingCalculator::calculateAsync() { + return ThreadFunction([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"), -- cgit v1.2.3