void BaseRenderer::renderTiledContent(TileRenderInfo& renderInfo) { const bool visualIndicator = TilesManager::instance()->getShowVisualIndicator(); const SkSize& tileSize = renderInfo.tileSize; SkCanvas canvas; setupCanvas(renderInfo, &canvas); if (!canvas.getDevice()) { // TODO: consider ALOGE ALOGV("Error: No Device"); return; } double before; if (visualIndicator) { canvas.save(); before = currentTimeMS(); } canvas.translate(-renderInfo.x * tileSize.width(), -renderInfo.y * tileSize.height()); canvas.scale(renderInfo.scale, renderInfo.scale); if (renderInfo.tilePainter == NULL) { ALOGV("Error: No tilePainter"); return; } renderInfo.tilePainter->paint(&canvas); if (renderInfo.baseTile && renderInfo.baseTile->backTexture()) checkForPureColor(renderInfo, &canvas); else renderInfo.isPureColor = false; if (visualIndicator) { double after = currentTimeMS(); canvas.restore(); unsigned int updateCount = renderInfo.tilePainter->getUpdateCount() & UPDATE_COUNT_MASK; const int color = updateCount & UPDATE_COUNT_ALPHA_MASK; // only color the invalidated area SkPaint paint; paint.setARGB(color, 0, 255, 0); SkIRect rect; rect.set(0, 0, tileSize.width(), tileSize.height()); canvas.drawIRect(rect, paint); drawTileInfo(&canvas, renderInfo, updateCount, after - before); // paint the tile boundaries paint.setARGB(64, 255, 0, 0); paint.setStrokeWidth(3); canvas.drawLine(0, 0, tileSize.width(), tileSize.height(), paint); paint.setARGB(64, 0, 255, 0); canvas.drawLine(0, tileSize.height(), tileSize.width(), 0, paint); paint.setARGB(128, 0, 0, 255); canvas.drawLine(tileSize.width(), 0, tileSize.width(), tileSize.height(), paint); } renderingComplete(renderInfo, &canvas); }
void WhittedRenderer::render(Scene* scene) { if (m_viewer) connect(m_viewer, &HdrViewer::clicked, this, &WhittedRenderer::onPicked); // TODO: this stuff should go to the base class qDebug() << Q_FUNC_INFO; qDebug() << "Rendering with" << m_hwThreadCount << "threads"; m_activeCamera = scene->activeCamera(); m_shapes.clear(); m_shapes = scene->gatherShapes(); m_lights.clear(); m_lights = scene->gatherLights(); qDebug() << "Rendering" << m_shapes.count() << "shapes with" << m_lights.count() << "lights"; if (m_activeCamera->fov() <=0) { qCritical() << "Active camera has invalid fov"; return; } if (m_buffer) delete m_buffer; m_buffer = new float[m_renderedWidth * m_renderedHeight * 3]; emit renderingStarted(); do { qDebug() << "Starting new frame" << scene->time(); QElapsedTimer elapsed; elapsed.start(); QElapsedTimer gridTime; gridTime.start(); if (m_grid) delete m_grid; m_grid = new RegularGrid(); m_grid->initialize(m_shapes); qDebug() << "Generated acceleration structure in" << gridTime.elapsed() << "ms"; auto pool = QThreadPool::globalInstance(); for (int i=0; i < m_hwThreadCount; i++) { WhittedRunnable* runnable = new WhittedRunnable(this, i, m_hwThreadCount); runnable->setAutoDelete(true); pool->start(runnable); } // TODO: write a thread pool that sends a signal when job is complete while (!pool->waitForDone(25)) { qApp->processEvents(); } qDebug() << "Frame complete in:" << elapsed.elapsed() << "ms"; emit frameComplete(); qApp->processEvents(); } while(scene->advanceFrame()); emit renderingComplete(); }