mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-04 09:00:44 +00:00
Paint custom render widgets properly without output, recreate as needed
This commit is contained in:
@@ -29,7 +29,18 @@
|
||||
|
||||
CustomPaintWidget::CustomPaintWidget(QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
m_Ctx = NULL;
|
||||
m_Output = NULL;
|
||||
setAttribute(Qt::WA_OpaquePaintEvent);
|
||||
setAttribute(Qt::WA_PaintOnScreen);
|
||||
setMouseTracking(true);
|
||||
}
|
||||
|
||||
CustomPaintWidget::CustomPaintWidget(CaptureContext *c, QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
m_Ctx = c;
|
||||
m_Output = NULL;
|
||||
setAttribute(Qt::WA_OpaquePaintEvent);
|
||||
setAttribute(Qt::WA_PaintOnScreen);
|
||||
setMouseTracking(true);
|
||||
}
|
||||
@@ -65,14 +76,30 @@ void CustomPaintWidget::keyPressEvent(QKeyEvent *e)
|
||||
|
||||
void CustomPaintWidget::paintEvent(QPaintEvent *e)
|
||||
{
|
||||
if(m_Output)
|
||||
if(m_Ctx)
|
||||
{
|
||||
m_Ctx->Renderer()->AsyncInvoke([this](IReplayRenderer *r) { m_Output->Display(); });
|
||||
if(m_Output != NULL)
|
||||
m_Ctx->Renderer()->AsyncInvoke([this](IReplayRenderer *r) { m_Output->Display(); });
|
||||
}
|
||||
else if(m_Dark == m_Light)
|
||||
{
|
||||
QPainter p(this);
|
||||
p.fillRect(rect(), m_Dark);
|
||||
}
|
||||
else
|
||||
{
|
||||
int numX = (int)ceil((float)rect().width() / 64.0f);
|
||||
int numY = (int)ceil((float)rect().height() / 64.0f);
|
||||
|
||||
QPainter p(this);
|
||||
p.setBrush(QBrush(Qt::black));
|
||||
p.drawRect(rect());
|
||||
for(int x = 0; x < numX; x++)
|
||||
{
|
||||
for(int y = 0; y < numY; y++)
|
||||
{
|
||||
QColor &col = ((x % 2) == (y % 2)) ? m_Dark : m_Light;
|
||||
|
||||
p.fillRect(QRect(x * 64, y * 64, 64, 64), col);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,13 +35,22 @@ private:
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit CustomPaintWidget(QWidget *parent = 0);
|
||||
explicit CustomPaintWidget(CaptureContext *c, QWidget *parent = 0);
|
||||
~CustomPaintWidget();
|
||||
|
||||
void SetOutput(CaptureContext *c, IReplayOutput *out)
|
||||
// this is needed to solve a chicken-and-egg problem. We need to recreate the widget
|
||||
// whenever we go from custom rendering to painting (e.g. log loaded or closed). But
|
||||
// we need the widget to have been recreated before we create the output, so we can
|
||||
// pass in the winId.
|
||||
// So we go by whether or not we have a CaptureContext * and go on faith that the
|
||||
// output will be set before any painting work has to happen.
|
||||
void setOutput(IReplayOutput *out) { m_Output = out; }
|
||||
void setColours(QColor dark, QColor light)
|
||||
{
|
||||
m_Ctx = c;
|
||||
m_Output = out;
|
||||
m_Dark = dark;
|
||||
m_Light = light;
|
||||
}
|
||||
|
||||
signals:
|
||||
void clicked(QMouseEvent *e);
|
||||
void mouseMove(QMouseEvent *e);
|
||||
@@ -60,7 +69,9 @@ public slots:
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *e);
|
||||
QPaintEngine *paintEngine() const { return NULL; }
|
||||
QPaintEngine *paintEngine() const { return m_Ctx ? NULL : QWidget::paintEngine(); }
|
||||
CaptureContext *m_Ctx;
|
||||
IReplayOutput *m_Output;
|
||||
QColor m_Dark;
|
||||
QColor m_Light;
|
||||
};
|
||||
|
||||
@@ -31,7 +31,15 @@ ResourcePreview::ResourcePreview(CaptureContext *c, IReplayOutput *output, QWidg
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
ui->thumbnail->SetOutput(c, output);
|
||||
CustomPaintWidget *thumb = new CustomPaintWidget(c, this);
|
||||
thumb->setOutput(output);
|
||||
thumb->setObjectName(ui->thumbnail->objectName());
|
||||
thumb->setSizePolicy(ui->thumbnail->sizePolicy());
|
||||
thumb->setMinimumSize(QSize(0, 0));
|
||||
|
||||
delete ui->thumbnail;
|
||||
ui->thumbnail = thumb;
|
||||
ui->gridLayout->addWidget(ui->thumbnail, 0, 0, 1, 2);
|
||||
|
||||
QPalette Pal(ui->slotLabel->palette());
|
||||
|
||||
|
||||
@@ -43,13 +43,13 @@ ThumbnailStrip::~ThumbnailStrip()
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void ThumbnailStrip::AddPreview(ResourcePreview *prev)
|
||||
void ThumbnailStrip::addThumb(ResourcePreview *prev)
|
||||
{
|
||||
layout->addWidget(prev);
|
||||
m_Thumbnails.push_back(prev);
|
||||
}
|
||||
|
||||
void ThumbnailStrip::ClearThumbnails()
|
||||
void ThumbnailStrip::clearThumbs()
|
||||
{
|
||||
for(ResourcePreview *p : m_Thumbnails)
|
||||
{
|
||||
@@ -62,7 +62,7 @@ void ThumbnailStrip::ClearThumbnails()
|
||||
|
||||
void ThumbnailStrip::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
RefreshLayout();
|
||||
refreshLayout();
|
||||
}
|
||||
|
||||
void ThumbnailStrip::mousePressEvent(QMouseEvent *event)
|
||||
@@ -72,10 +72,10 @@ void ThumbnailStrip::mousePressEvent(QMouseEvent *event)
|
||||
|
||||
void ThumbnailStrip::showEvent(QShowEvent *event)
|
||||
{
|
||||
RefreshLayout();
|
||||
refreshLayout();
|
||||
}
|
||||
|
||||
void ThumbnailStrip::RefreshLayout()
|
||||
void ThumbnailStrip::refreshLayout()
|
||||
{
|
||||
QRect avail = geometry();
|
||||
avail.adjust(6, 6, -6, -6);
|
||||
|
||||
@@ -43,11 +43,11 @@ public:
|
||||
explicit ThumbnailStrip(QWidget *parent = 0);
|
||||
~ThumbnailStrip();
|
||||
|
||||
void AddPreview(ResourcePreview *prev);
|
||||
void addThumb(ResourcePreview *prev);
|
||||
|
||||
void ClearThumbnails();
|
||||
const QVector<ResourcePreview *> &GetThumbs() { return m_Thumbnails; }
|
||||
void RefreshLayout();
|
||||
void clearThumbs();
|
||||
const QVector<ResourcePreview *> &thumbs() { return m_Thumbnails; }
|
||||
void refreshLayout();
|
||||
|
||||
signals:
|
||||
void mouseClick(QMouseEvent *event);
|
||||
|
||||
@@ -318,9 +318,6 @@ TextureViewer::TextureViewer(CaptureContext *ctx, QWidget *parent)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
ui->render->SetOutput(m_Ctx, NULL);
|
||||
ui->pixelContext->SetOutput(m_Ctx, NULL);
|
||||
|
||||
m_Ctx->AddLogViewer(this);
|
||||
|
||||
memset(&m_TexDisplay, 0, sizeof(m_TexDisplay));
|
||||
@@ -330,18 +327,6 @@ TextureViewer::TextureViewer(CaptureContext *ctx, QWidget *parent)
|
||||
|
||||
on_checkerBack_clicked();
|
||||
|
||||
QWidget *renderContainer = ui->renderContainer;
|
||||
|
||||
QObject::connect(ui->render, &CustomPaintWidget::clicked, this, &TextureViewer::render_mouseClick);
|
||||
QObject::connect(ui->render, &CustomPaintWidget::mouseMove, this, &TextureViewer::render_mouseMove);
|
||||
QObject::connect(ui->render, &CustomPaintWidget::mouseWheel, this,
|
||||
&TextureViewer::render_mouseWheel);
|
||||
QObject::connect(ui->render, &CustomPaintWidget::resize, this, &TextureViewer::render_resize);
|
||||
QObject::connect(ui->render, &CustomPaintWidget::keyPress, this, &TextureViewer::render_keyPress);
|
||||
|
||||
QObject::connect(ui->pixelContext, &CustomPaintWidget::keyPress, this,
|
||||
&TextureViewer::render_keyPress);
|
||||
|
||||
QObject::connect(ui->zoomOption->lineEdit(), &QLineEdit::returnPressed, this,
|
||||
&TextureViewer::zoomOption_returnPressed);
|
||||
|
||||
@@ -367,6 +352,8 @@ TextureViewer::TextureViewer(CaptureContext *ctx, QWidget *parent)
|
||||
QObject::connect(ui->customShader, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
|
||||
&TextureViewer::channelsWidget_selected);
|
||||
|
||||
QWidget *renderContainer = ui->renderContainer;
|
||||
|
||||
ui->dockarea->addToolWindow(ui->renderContainer, ToolWindowManager::EmptySpace);
|
||||
ui->dockarea->setToolWindowProperties(renderContainer, ToolWindowManager::DisallowUserDocking |
|
||||
ToolWindowManager::HideCloseButton |
|
||||
@@ -1331,13 +1318,13 @@ ResourcePreview *TextureViewer::UI_CreateThumbnail(ThumbnailStrip *strip)
|
||||
QObject::connect(prev, &ResourcePreview::clicked, this, &TextureViewer::thumb_clicked);
|
||||
|
||||
prev->setActive(false);
|
||||
strip->AddPreview(prev);
|
||||
strip->addThumb(prev);
|
||||
return prev;
|
||||
}
|
||||
|
||||
void TextureViewer::UI_CreateThumbnails()
|
||||
{
|
||||
if(!ui->outputThumbs->GetThumbs().isEmpty())
|
||||
if(!ui->outputThumbs->thumbs().isEmpty())
|
||||
return;
|
||||
|
||||
// these will expand, but we make sure that there is a good set reserved
|
||||
@@ -1519,9 +1506,9 @@ void TextureViewer::InitStageResourcePreviews(ShaderStageType stage,
|
||||
|
||||
ResourcePreview *prev = NULL;
|
||||
|
||||
if(prevIndex < prevs->GetThumbs().size())
|
||||
if(prevIndex < prevs->thumbs().size())
|
||||
{
|
||||
prev = prevs->GetThumbs()[prevIndex];
|
||||
prev = prevs->thumbs()[prevIndex];
|
||||
|
||||
// don't use it if we're not actually going to show it
|
||||
if(!show && !prev->isActive())
|
||||
@@ -1551,10 +1538,10 @@ void TextureViewer::thumb_clicked(QMouseEvent *e)
|
||||
|
||||
Following follow = prev->property("f").value<Following>();
|
||||
|
||||
for(ResourcePreview *p : ui->outputThumbs->GetThumbs())
|
||||
for(ResourcePreview *p : ui->outputThumbs->thumbs())
|
||||
p->setSelected(false);
|
||||
|
||||
for(ResourcePreview *p : ui->inputThumbs->GetThumbs())
|
||||
for(ResourcePreview *p : ui->inputThumbs->thumbs())
|
||||
p->setSelected(false);
|
||||
|
||||
m_Following = follow;
|
||||
@@ -1829,8 +1816,50 @@ void TextureViewer::on_renderVScroll_valueChanged(int position)
|
||||
ScrollUpdateScrollbars = true;
|
||||
}
|
||||
|
||||
void TextureViewer::UI_RecreatePanels()
|
||||
{
|
||||
CaptureContext *ctx = m_Ctx;
|
||||
|
||||
// while a log is loaded, pass NULL into the widget
|
||||
if(!ctx->LogLoaded())
|
||||
ctx = NULL;
|
||||
|
||||
{
|
||||
CustomPaintWidget *render = new CustomPaintWidget(ctx, ui->renderContainer);
|
||||
render->setObjectName(ui->render->objectName());
|
||||
render->setSizePolicy(ui->render->sizePolicy());
|
||||
delete ui->render;
|
||||
ui->render = render;
|
||||
ui->gridLayout->addWidget(render, 1, 0, 1, 1);
|
||||
}
|
||||
|
||||
{
|
||||
CustomPaintWidget *pixelContext = new CustomPaintWidget(ctx, ui->pixelContextLayout);
|
||||
pixelContext->setObjectName(ui->pixelContext->objectName());
|
||||
pixelContext->setSizePolicy(ui->pixelContext->sizePolicy());
|
||||
delete ui->pixelContext;
|
||||
ui->pixelContext = pixelContext;
|
||||
ui->pixelcontextgrid->addWidget(pixelContext, 0, 0, 1, 2);
|
||||
}
|
||||
|
||||
ui->render->setColours(darkBack, lightBack);
|
||||
ui->pixelContext->setColours(darkBack, lightBack);
|
||||
|
||||
QObject::connect(ui->render, &CustomPaintWidget::clicked, this, &TextureViewer::render_mouseClick);
|
||||
QObject::connect(ui->render, &CustomPaintWidget::mouseMove, this, &TextureViewer::render_mouseMove);
|
||||
QObject::connect(ui->render, &CustomPaintWidget::mouseWheel, this,
|
||||
&TextureViewer::render_mouseWheel);
|
||||
QObject::connect(ui->render, &CustomPaintWidget::resize, this, &TextureViewer::render_resize);
|
||||
QObject::connect(ui->render, &CustomPaintWidget::keyPress, this, &TextureViewer::render_keyPress);
|
||||
|
||||
QObject::connect(ui->pixelContext, &CustomPaintWidget::keyPress, this,
|
||||
&TextureViewer::render_keyPress);
|
||||
}
|
||||
|
||||
void TextureViewer::OnLogfileLoaded()
|
||||
{
|
||||
UI_RecreatePanels();
|
||||
|
||||
WId renderID = ui->render->winId();
|
||||
WId contextID = ui->pixelContext->winId();
|
||||
|
||||
@@ -1845,7 +1874,8 @@ void TextureViewer::OnLogfileLoaded()
|
||||
|
||||
m_Output->SetPixelContext(m_Ctx->m_CurWinSystem, m_Ctx->FillWindowingData(contextID));
|
||||
|
||||
ui->render->SetOutput(m_Ctx, m_Output);
|
||||
ui->render->setOutput(m_Output);
|
||||
ui->pixelContext->setOutput(m_Output);
|
||||
|
||||
OutputConfig c = {eOutputType_TexDisplay};
|
||||
m_Output->SetOutputConfig(c);
|
||||
@@ -1855,7 +1885,10 @@ void TextureViewer::OnLogfileLoaded()
|
||||
void TextureViewer::OnLogfileClosed()
|
||||
{
|
||||
m_Output = NULL;
|
||||
ui->render->SetOutput(m_Ctx, NULL);
|
||||
|
||||
UI_RecreatePanels();
|
||||
|
||||
ui->inputThumbs->clearThumbs();
|
||||
|
||||
m_TextureSettings.clear();
|
||||
|
||||
@@ -1887,8 +1920,8 @@ void TextureViewer::OnEventSelected(uint32_t eventID)
|
||||
{
|
||||
ResourcePreview *prev;
|
||||
|
||||
if(outIndex < ui->outputThumbs->GetThumbs().size())
|
||||
prev = ui->outputThumbs->GetThumbs()[outIndex];
|
||||
if(outIndex < ui->outputThumbs->thumbs().size())
|
||||
prev = ui->outputThumbs->thumbs()[outIndex];
|
||||
else
|
||||
prev = UI_CreateThumbnail(ui->outputThumbs);
|
||||
|
||||
@@ -1906,8 +1939,8 @@ void TextureViewer::OnEventSelected(uint32_t eventID)
|
||||
{
|
||||
ResourcePreview *prev;
|
||||
|
||||
if(outIndex < ui->outputThumbs->GetThumbs().size())
|
||||
prev = ui->outputThumbs->GetThumbs()[outIndex];
|
||||
if(outIndex < ui->outputThumbs->thumbs().size())
|
||||
prev = ui->outputThumbs->thumbs()[outIndex];
|
||||
else
|
||||
prev = UI_CreateThumbnail(ui->outputThumbs);
|
||||
|
||||
@@ -1951,7 +1984,7 @@ void TextureViewer::OnEventSelected(uint32_t eventID)
|
||||
}
|
||||
|
||||
// hide others
|
||||
const QVector<ResourcePreview *> &outThumbs = ui->outputThumbs->GetThumbs();
|
||||
const QVector<ResourcePreview *> &outThumbs = ui->outputThumbs->thumbs();
|
||||
|
||||
for(; outIndex < outThumbs.size(); outIndex++)
|
||||
{
|
||||
@@ -1961,9 +1994,9 @@ void TextureViewer::OnEventSelected(uint32_t eventID)
|
||||
prev->setSelected(false);
|
||||
}
|
||||
|
||||
ui->outputThumbs->RefreshLayout();
|
||||
ui->outputThumbs->refreshLayout();
|
||||
|
||||
const QVector<ResourcePreview *> &inThumbs = ui->inputThumbs->GetThumbs();
|
||||
const QVector<ResourcePreview *> &inThumbs = ui->inputThumbs->thumbs();
|
||||
|
||||
for(; inIndex < inThumbs.size(); inIndex++)
|
||||
{
|
||||
@@ -1973,7 +2006,7 @@ void TextureViewer::OnEventSelected(uint32_t eventID)
|
||||
prev->setSelected(false);
|
||||
}
|
||||
|
||||
ui->inputThumbs->RefreshLayout();
|
||||
ui->inputThumbs->refreshLayout();
|
||||
|
||||
INVOKE_MEMFN(RT_UpdateAndDisplay);
|
||||
|
||||
@@ -2014,6 +2047,9 @@ void TextureViewer::setPersistData(const QVariant &persistData)
|
||||
m_TexDisplay.lightBackgroundColour =
|
||||
FloatVector(lightBack.redF(), lightBack.greenF(), lightBack.blueF(), 1.0f);
|
||||
|
||||
ui->render->setColours(darkBack, lightBack);
|
||||
ui->pixelContext->setColours(darkBack, lightBack);
|
||||
|
||||
ui->dockarea->restoreState(state);
|
||||
}
|
||||
|
||||
@@ -2168,6 +2204,9 @@ void TextureViewer::on_backcolorPick_clicked()
|
||||
|
||||
darkBack = lightBack = col;
|
||||
|
||||
ui->render->setColours(darkBack, lightBack);
|
||||
ui->pixelContext->setColours(darkBack, lightBack);
|
||||
|
||||
ui->backcolorPick->setChecked(true);
|
||||
ui->checkerBack->setChecked(false);
|
||||
|
||||
@@ -2196,6 +2235,9 @@ void TextureViewer::on_checkerBack_clicked()
|
||||
int(m_TexDisplay.lightBackgroundColour.y * 255.0f),
|
||||
int(m_TexDisplay.lightBackgroundColour.z * 255.0f));
|
||||
|
||||
ui->render->setColours(darkBack, lightBack);
|
||||
ui->pixelContext->setColours(darkBack, lightBack);
|
||||
|
||||
INVOKE_MEMFN(RT_UpdateAndDisplay);
|
||||
|
||||
if(m_Output == NULL)
|
||||
|
||||
@@ -170,6 +170,8 @@ private:
|
||||
void RT_PickHoverAndUpdate(IReplayRenderer *);
|
||||
void RT_UpdateAndDisplay(IReplayRenderer *);
|
||||
|
||||
void UI_RecreatePanels();
|
||||
|
||||
void UI_UpdateStatusText();
|
||||
void UI_UpdateTextureDetails();
|
||||
void UI_OnTextureSelectionChanged(bool newdraw);
|
||||
|
||||
@@ -932,9 +932,6 @@
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
@@ -1094,16 +1091,16 @@
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>CustomPaintWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>Widgets/CustomPaintWidget.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>ToolWindowManager</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>ToolWindowManager.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>CustomPaintWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>Widgets/CustomPaintWidget.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>ThumbnailStrip</class>
|
||||
<extends>QWidget</extends>
|
||||
|
||||
Reference in New Issue
Block a user