Exemple #1
0
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);
}
Exemple #2
0
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();

}