Stub out BufferViewer UI controls, and make camera control properly

This commit is contained in:
baldurk
2017-01-25 20:13:40 +00:00
parent 82068eeab8
commit e6295fa309
5 changed files with 1144 additions and 226 deletions
+5
View File
@@ -80,6 +80,11 @@ void CustomPaintWidget::keyPressEvent(QKeyEvent *e)
emit keyPress(e);
}
void CustomPaintWidget::keyReleaseEvent(QKeyEvent *e)
{
emit keyRelease(e);
}
void CustomPaintWidget::paintEvent(QPaintEvent *e)
{
if(m_Ctx)
+2
View File
@@ -58,6 +58,7 @@ signals:
void resize(QResizeEvent *e);
void mouseWheel(QWheelEvent *e);
void keyPress(QKeyEvent *e);
void keyRelease(QKeyEvent *e);
private:
void mousePressEvent(QMouseEvent *e) override;
@@ -66,6 +67,7 @@ private:
void wheelEvent(QWheelEvent *e) override;
void resizeEvent(QResizeEvent *e) override;
void keyPressEvent(QKeyEvent *e) override;
void keyReleaseEvent(QKeyEvent *e) override;
public slots:
+368 -111
View File
@@ -25,8 +25,278 @@
#include "BufferViewer.h"
#include <QFontDatabase>
#include <QMouseEvent>
#include <QTimer>
#include "ui_BufferViewer.h"
class CameraWrapper
{
public:
virtual bool Update(QRect winSize) = 0;
virtual Camera *camera() = 0;
virtual void MouseWheel(QWheelEvent *e) = 0;
virtual void MouseClick(QMouseEvent *e) { m_DragStartPos = e->pos(); }
virtual void MouseMove(QMouseEvent *e)
{
if(e->buttons() & Qt::LeftButton)
{
if(m_DragStartPos.x() < 0)
{
m_DragStartPos = e->pos();
}
m_DragStartPos = e->pos();
}
else
{
m_DragStartPos = QPoint(-1, -1);
}
}
virtual void KeyUp(QKeyEvent *e)
{
if(e->key() == Qt::Key_A || e->key() == Qt::Key_D)
setMove(Direction::Horiz, 0);
if(e->key() == Qt::Key_Q || e->key() == Qt::Key_E)
setMove(Direction::Vert, 0);
if(e->key() == Qt::Key_W || e->key() == Qt::Key_S)
setMove(Direction::Fwd, 0);
if(e->modifiers() && Qt::ShiftModifier)
m_CurrentSpeed = 3.0f;
else
m_CurrentSpeed = 1.0f;
}
virtual void KeyDown(QKeyEvent *e)
{
if(e->key() == Qt::Key_W)
setMove(Direction::Fwd, 1);
if(e->key() == Qt::Key_S)
setMove(Direction::Fwd, -1);
if(e->key() == Qt::Key_Q)
setMove(Direction::Vert, 1);
if(e->key() == Qt::Key_E)
setMove(Direction::Vert, -1);
if(e->key() == Qt::Key_D)
setMove(Direction::Horiz, 1);
if(e->key() == Qt::Key_A)
setMove(Direction::Horiz, -1);
if(e->modifiers() && Qt::ShiftModifier)
m_CurrentSpeed = 3.0f;
else
m_CurrentSpeed = 1.0f;
}
float SpeedMultiplier = 0.05f;
protected:
enum class Direction
{
Fwd,
Horiz,
Vert,
Num
};
int move(Direction dir) { return m_CurrentMove[(int)dir]; }
float currentSpeed() { return m_CurrentSpeed * SpeedMultiplier; }
QPoint dragStartPos() { return m_DragStartPos; }
private:
float m_CurrentSpeed = 1.0f;
int m_CurrentMove[(int)Direction::Num] = {0, 0, 0};
void setMove(Direction dir, int val) { m_CurrentMove[(int)dir] = val; }
QPoint m_DragStartPos = QPoint(-1, -1);
};
class ArcballWrapper : public CameraWrapper
{
public:
ArcballWrapper() { m_Cam = Camera_InitArcball(); }
~ArcballWrapper() { Camera_Shutdown(m_Cam); }
Camera *camera() override { return m_Cam; }
void Reset(FloatVector pos, float dist)
{
Camera_ResetArcball(m_Cam);
setLookAtPos(pos);
SetDistance(dist);
}
void SetDistance(float dist)
{
m_Distance = qAbs(dist);
Camera_SetArcballDistance(m_Cam, m_Distance);
}
bool Update(QRect size) override
{
m_WinSize = size;
return false;
}
void MouseWheel(QWheelEvent *e) override
{
float mod = (1.0f - e->delta() / 2500.0f);
SetDistance(qMax(1e-6f, m_Distance * mod));
}
void MouseMove(QMouseEvent *e) override
{
if(dragStartPos().x() > 0)
{
if(e->buttons() == Qt::MiddleButton ||
(e->buttons() == Qt::LeftButton && e->modifiers() & Qt::AltModifier))
{
float xdelta = (float)(e->pos().x() - dragStartPos().x()) / 300.0f;
float ydelta = (float)(e->pos().y() - dragStartPos().y()) / 300.0f;
xdelta *= qMax(1.0f, m_Distance);
ydelta *= qMax(1.0f, m_Distance);
FloatVector pos, fwd, right, up;
Camera_GetBasis(m_Cam, &pos, &fwd, &right, &up);
m_LookAt.x -= right.x * xdelta;
m_LookAt.y -= right.y * xdelta;
m_LookAt.z -= right.z * xdelta;
m_LookAt.x += up.x * ydelta;
m_LookAt.y += up.y * ydelta;
m_LookAt.z += up.z * ydelta;
Camera_SetPosition(m_Cam, m_LookAt.x, m_LookAt.y, m_LookAt.z);
}
else if(e->buttons() == Qt::LeftButton)
{
RotateArcball(dragStartPos(), e->pos());
}
}
CameraWrapper::MouseMove(e);
}
FloatVector lookAtPos() { return m_LookAt; }
void setLookAtPos(const FloatVector &v)
{
m_LookAt = v;
Camera_SetPosition(m_Cam, v.x, v.y, v.z);
}
private:
Camera *m_Cam;
QRect m_WinSize;
float m_Distance = 10.0f;
FloatVector m_LookAt;
void RotateArcball(QPoint from, QPoint to)
{
float ax = ((float)from.x() / (float)m_WinSize.width()) * 2.0f - 1.0f;
float ay = ((float)from.y() / (float)m_WinSize.height()) * 2.0f - 1.0f;
float bx = ((float)to.x() / (float)m_WinSize.width()) * 2.0f - 1.0f;
float by = ((float)to.y() / (float)m_WinSize.height()) * 2.0f - 1.0f;
// this isn't a 'true arcball' but it handles extreme aspect ratios
// better. We basically 'centre' around the from point always being
// 0,0 (straight out of the screen) as if you're always dragging
// the arcball from the middle, and just use the relative movement
int minDimension = qMin(m_WinSize.width(), m_WinSize.height());
ax = ay = 0;
bx = ((float)(to.x() - from.x()) / (float)minDimension) * 2.0f;
by = ((float)(to.y() - from.y()) / (float)minDimension) * 2.0f;
ay = -ay;
by = -by;
Camera_RotateArcball(m_Cam, ax, ay, bx, by);
}
};
class FlycamWrapper : public CameraWrapper
{
public:
FlycamWrapper() { m_Cam = Camera_InitFPSLook(); }
~FlycamWrapper() { Camera_Shutdown(m_Cam); }
Camera *camera() override { return m_Cam; }
void Reset(FloatVector pos)
{
m_Position = pos;
m_Rotation = FloatVector();
Camera_SetPosition(m_Cam, m_Position.x, m_Position.y, m_Position.z);
Camera_SetFPSRotation(m_Cam, m_Rotation.x, m_Rotation.y, m_Rotation.z);
}
bool Update(QRect size) override
{
FloatVector pos, fwd, right, up;
Camera_GetBasis(m_Cam, &pos, &fwd, &right, &up);
float speed = currentSpeed();
int horizMove = move(CameraWrapper::Direction::Horiz);
if(horizMove)
{
m_Position.x += right.x * speed * (float)horizMove;
m_Position.y += right.y * speed * (float)horizMove;
m_Position.z += right.z * speed * (float)horizMove;
}
int vertMove = move(CameraWrapper::Direction::Vert);
if(vertMove)
{
// this makes less intuitive sense, instead go 'absolute' up
// m_Position.x += up.x * speed * (float)vertMove;
// m_Position.y += up.y * speed * (float)vertMove;
// m_Position.z += up.z * speed * (float)vertMove;
m_Position.y += speed * (float)vertMove;
}
int fwdMove = move(CameraWrapper::Direction::Fwd);
if(fwdMove)
{
m_Position.x += fwd.x * speed * (float)fwdMove;
m_Position.y += fwd.y * speed * (float)fwdMove;
m_Position.z += fwd.z * speed * (float)fwdMove;
}
if(horizMove || vertMove || fwdMove)
{
Camera_SetPosition(m_Cam, m_Position.x, m_Position.y, m_Position.z);
return true;
}
return false;
}
void MouseWheel(QWheelEvent *e) override {}
void MouseMove(QMouseEvent *e) override
{
if(dragStartPos().x() > 0 && e->buttons() == Qt::LeftButton)
{
m_Rotation.y -= (float)(e->pos().x() - dragStartPos().x()) / 300.0f;
m_Rotation.x -= (float)(e->pos().y() - dragStartPos().y()) / 300.0f;
Camera_SetFPSRotation(m_Cam, m_Rotation.x, m_Rotation.y, m_Rotation.z);
}
CameraWrapper::MouseMove(e);
}
private:
Camera *m_Cam;
FloatVector m_Position, m_Rotation;
};
struct BufferData
{
BufferData()
@@ -224,13 +494,68 @@ BufferViewer::BufferViewer(CaptureContext *ctx, QWidget *parent)
ui->vsinData->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
ui->vsoutData->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
ui->gsoutData->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
ui->formatSpecifier->setVisible(false);
ui->cameraControlsGroup->setVisible(false);
ui->outputTabs->setWindowTitle(tr("Preview"));
ui->dockarea->addToolWindow(ui->outputTabs, ToolWindowManager::EmptySpace);
ui->dockarea->setToolWindowProperties(ui->outputTabs, ToolWindowManager::HideCloseButton);
ui->vsinData->setWindowTitle(tr("VS Input"));
ui->dockarea->addToolWindow(
ui->vsinData, ToolWindowManager::AreaReference(ToolWindowManager::TopOf,
ui->dockarea->areaOf(ui->outputTabs), 0.5f));
ui->dockarea->setToolWindowProperties(ui->vsinData, ToolWindowManager::HideCloseButton);
ui->vsoutData->setWindowTitle(tr("VS Output"));
ui->dockarea->addToolWindow(
ui->vsoutData, ToolWindowManager::AreaReference(ToolWindowManager::RightOf,
ui->dockarea->areaOf(ui->vsinData), 0.5f));
ui->dockarea->setToolWindowProperties(ui->vsoutData, ToolWindowManager::HideCloseButton);
ui->gsoutData->setWindowTitle(tr("GS/DS Output"));
ui->dockarea->addToolWindow(
ui->gsoutData, ToolWindowManager::AreaReference(ToolWindowManager::AddTo,
ui->dockarea->areaOf(ui->vsoutData), 0.5f));
ui->dockarea->setToolWindowProperties(ui->gsoutData, ToolWindowManager::HideCloseButton);
ToolWindowManager::raiseToolWindow(ui->vsoutData);
ui->dockarea->setAllowFloatingWindow(false);
ui->dockarea->setRubberBandLineWidth(50);
QVBoxLayout *vertical = new QVBoxLayout(this);
vertical->setSpacing(3);
vertical->setContentsMargins(0, 0, 0, 0);
vertical->addWidget(ui->meshToolbar);
vertical->addWidget(ui->dockarea);
ui->controlType->addItems({tr("Arcball"), tr("WASD")});
ui->controlType->adjustSize();
ui->drawRange->addItems({tr("Only this draw"), tr("Show previous instances"),
tr("Show all instances"), tr("Show whole pass")});
ui->drawRange->adjustSize();
ui->solidShading->addItems({tr("None"), tr("Solid Colour"), tr("Flat Shaded"), tr("Secondary")});
ui->solidShading->adjustSize();
m_ModelVSIn = new BufferItemModel(ui->vsinData, this);
m_ModelVSOut = new BufferItemModel(ui->vsoutData, this);
// m_ModelGSOut = new BufferItemModel(ui->gsoutData, this);
m_ModelGSOut = new BufferItemModel(ui->gsoutData, this);
m_Flycam = new FlycamWrapper();
m_Arcball = new ArcballWrapper();
m_CurrentCamera = m_Arcball;
m_Arcball->Reset(FloatVector(), 10.0f);
m_Flycam->Reset(FloatVector());
m_ConfigVSIn.type = eMeshDataStage_VSIn;
m_ConfigVSIn.cam = Camera_InitArcball();
m_ConfigVSIn.ortho = false;
m_ConfigVSIn.showPrevInstances = false;
m_ConfigVSIn.showAllInstances = false;
@@ -242,16 +567,10 @@ BufferViewer::BufferViewer(CaptureContext *ctx, QWidget *parent)
memset(&m_ConfigVSIn.position, 0, sizeof(m_ConfigVSIn.position));
memset(&m_ConfigVSIn.second, 0, sizeof(m_ConfigVSIn.second));
m_CamDist = 10.0f;
Camera_SetArcballDistance(m_ConfigVSIn.cam, m_CamDist);
m_ConfigVSIn.position.showAlpha = false;
m_ConfigVSOut = m_ConfigVSIn;
m_ConfigVSOut.cam = Camera_InitFPSLook();
m_curConfig = &m_ConfigVSIn;
ui->outputTabs->setCurrentIndex(0);
@@ -260,6 +579,12 @@ BufferViewer::BufferViewer(CaptureContext *ctx, QWidget *parent)
QObject::connect(ui->vsoutData->selectionModel(), &QItemSelectionModel::selectionChanged, this,
&BufferViewer::data_selected);
QTimer *renderTimer = new QTimer(this);
QObject::connect(renderTimer, &QTimer::timeout, this, &BufferViewer::render_timer);
renderTimer->setSingleShot(false);
renderTimer->setInterval(1000);
renderTimer->start();
Reset();
}
@@ -270,8 +595,8 @@ BufferViewer::~BufferViewer()
for(auto vb : m_ModelVSIn->buffers)
delete[] vb.data;
Camera_Shutdown(m_ConfigVSIn.cam);
Camera_Shutdown(m_ConfigVSOut.cam);
delete m_Arcball;
delete m_Flycam;
m_Ctx->windowClosed(this);
m_Ctx->RemoveLogViewer(this);
@@ -308,7 +633,7 @@ void BufferViewer::OnEventChanged(uint32_t eventID)
{
m_ModelVSIn->beginReset();
m_ModelVSOut->beginReset();
// m_ModelGSOut->beginReset();
m_ModelGSOut->beginReset();
// this doesn't account for sign characters
m_ModelVSIn->componentWidth = 0;
@@ -368,11 +693,6 @@ void BufferViewer::OnEventChanged(uint32_t eventID)
uint64_t ioffset = 0;
m_Ctx->CurPipelineState.GetIBuffer(ib, ioffset);
m_CamDist = 10.0f;
Camera_ResetArcball(m_ConfigVSIn.cam);
Camera_SetArcballDistance(m_ConfigVSIn.cam, m_CamDist);
m_ConfigVSIn.fov = 90.0f;
m_ConfigVSIn.aspect =
m_Ctx->CurPipelineState.GetViewport(0).width / m_Ctx->CurPipelineState.GetViewport(0).height;
@@ -482,11 +802,6 @@ void BufferViewer::OnEventChanged(uint32_t eventID)
m_ConfigVSOut.aspect = m_ConfigVSIn.aspect;
m_ConfigVSOut.highlightVert = m_ConfigVSIn.highlightVert;
Camera_SetPosition(m_ConfigVSOut.cam, 0.0f, 0.0f, 0.0f);
Camera_SetFPSRotation(m_ConfigVSOut.cam, 0.0f, 0.0f, 0.0f);
m_pos = FloatVector();
m_rot = FloatVector();
m_Ctx->Renderer()->AsyncInvoke([this, draw, vbs, ib, ioffset](IReplayRenderer *r) {
rdctype::array<byte> idata;
@@ -650,16 +965,16 @@ void BufferViewer::OnEventChanged(uint32_t eventID)
GUIInvoke::call([this] {
m_ModelVSIn->endReset();
m_ModelVSOut->endReset();
ui->vsinData->resizeColumnsToContents();
ui->vsoutData->resizeColumnsToContents();
// ui->vsinData->resizeColumnsToContents();
// ui->vsoutData->resizeColumnsToContents();
});
});
}
void BufferViewer::on_outputTabs_currentChanged(int index)
{
ui->render->parentWidget()->layout()->removeWidget(ui->render);
ui->outputTabs->widget(index)->layout()->addWidget(ui->render);
ui->renderContainer->parentWidget()->layout()->removeWidget(ui->renderContainer);
ui->outputTabs->widget(index)->layout()->addWidget(ui->renderContainer);
if(index == 0)
m_curConfig = &m_ConfigVSIn;
@@ -674,55 +989,11 @@ void BufferViewer::render_mouseMove(QMouseEvent *e)
if(!m_Ctx->LogLoaded())
return;
QPoint curpos = e->pos();
if(e->buttons() & Qt::LeftButton)
{
if(m_PrevPos != QPoint())
{
if(m_curConfig == &m_ConfigVSIn)
{
float ax = ((float)m_PrevPos.x() / (float)ui->render->rect().width()) * 2.0f - 1.0f;
float ay = ((float)m_PrevPos.y() / (float)ui->render->rect().height()) * 2.0f - 1.0f;
float bx = ((float)curpos.x() / (float)ui->render->rect().width()) * 2.0f - 1.0f;
float by = ((float)curpos.y() / (float)ui->render->rect().height()) * 2.0f - 1.0f;
// this isn't a 'true arcball' but it handles extreme aspect ratios
// better. We basically 'centre' around the from point always being
// 0,0 (straight out of the screen) as if you're always dragging
// the arcball from the middle, and just use the relative movement
int minDimension = qMin(ui->render->rect().width(), ui->render->rect().height());
ax = ay = 0;
bx = ((float)(curpos.x() - m_PrevPos.x()) / (float)minDimension) * 2.0f;
by = ((float)(curpos.y() - m_PrevPos.y()) / (float)minDimension) * 2.0f;
ay = -ay;
by = -by;
Camera_RotateArcball(m_curConfig->cam, ax, ay, bx, by);
}
else
{
m_rot.y -= (float)(curpos.x() - m_PrevPos.x()) / 300.0f;
m_rot.x -= (float)(curpos.y() - m_PrevPos.y()) / 300.0f;
Camera_SetFPSRotation(m_curConfig->cam, m_rot.x, m_rot.y, m_rot.z);
}
}
m_PrevPos = curpos;
}
else
{
m_PrevPos = QPoint();
}
if(m_CurrentCamera)
m_CurrentCamera->MouseMove(e);
if(e->buttons() & Qt::RightButton)
{
render_clicked(e);
return;
}
INVOKE_MEMFN(RT_UpdateAndDisplay);
}
@@ -732,8 +1003,6 @@ void BufferViewer::render_clicked(QMouseEvent *e)
if(!m_Ctx->LogLoaded())
return;
ui->render->setFocus();
QPoint curpos = e->pos();
if((e->buttons() & Qt::RightButton) && m_Output)
@@ -765,62 +1034,43 @@ void BufferViewer::render_clicked(QMouseEvent *e)
});
}
if(m_CurrentCamera)
m_CurrentCamera->MouseClick(e);
ui->render->setFocus();
INVOKE_MEMFN(RT_UpdateAndDisplay);
}
void BufferViewer::render_mouseWheel(QWheelEvent *e)
{
float mod = (1.0f - e->delta() / 2500.0f);
m_CamDist = qMax(1e-6f, m_CamDist * mod);
Camera_SetArcballDistance(m_ConfigVSIn.cam, m_CamDist);
if(m_CurrentCamera)
m_CurrentCamera->MouseWheel(e);
INVOKE_MEMFN(RT_UpdateAndDisplay);
}
void BufferViewer::render_keyPress(QKeyEvent *e)
{
if(m_curConfig != &m_ConfigVSIn)
{
FloatVector pos, fwd, right, up;
Camera_GetBasis(m_curConfig->cam, &pos, &fwd, &right, &up);
m_CurrentCamera->KeyDown(e);
}
if(e->key() == Qt::Key_W)
{
m_pos.x += fwd.x * 0.1f;
m_pos.y += fwd.y * 0.1f;
m_pos.z += fwd.z * 0.1f;
}
if(e->key() == Qt::Key_S)
{
m_pos.x -= fwd.x * 0.1f;
m_pos.y -= fwd.y * 0.1f;
m_pos.z -= fwd.z * 0.1f;
}
if(e->key() == Qt::Key_A)
{
m_pos.x -= right.x * 0.1f;
m_pos.y -= right.y * 0.1f;
m_pos.z -= right.z * 0.1f;
}
if(e->key() == Qt::Key_D)
{
m_pos.x += right.x * 0.1f;
m_pos.y += right.y * 0.1f;
m_pos.z += right.z * 0.1f;
}
void BufferViewer::render_keyRelease(QKeyEvent *e)
{
m_CurrentCamera->KeyUp(e);
}
Camera_SetPosition(m_curConfig->cam, m_pos.x, m_pos.y, m_pos.z);
}
INVOKE_MEMFN(RT_UpdateAndDisplay);
void BufferViewer::render_timer()
{
if(m_CurrentCamera && m_CurrentCamera->Update(ui->render->rect()))
INVOKE_MEMFN(RT_UpdateAndDisplay);
}
void BufferViewer::RT_UpdateAndDisplay(IReplayRenderer *)
{
if(m_Output)
{
m_curConfig->cam = m_CurrentCamera->camera();
m_Output->SetMeshDisplay(*m_curConfig);
m_Output->Display();
}
@@ -854,12 +1104,14 @@ void BufferViewer::Reset()
render->setSizePolicy(ui->render->sizePolicy());
delete ui->render;
ui->render = render;
ui->outputTabs->currentWidget()->layout()->addWidget(ui->render);
ui->renderContainerGridLayout->addWidget(ui->render, 1, 1, 1, 1);
}
QObject::connect(ui->render, &CustomPaintWidget::mouseMove, this, &BufferViewer::render_mouseMove);
QObject::connect(ui->render, &CustomPaintWidget::clicked, this, &BufferViewer::render_clicked);
QObject::connect(ui->render, &CustomPaintWidget::keyPress, this, &BufferViewer::render_keyPress);
QObject::connect(ui->render, &CustomPaintWidget::keyRelease, this,
&BufferViewer::render_keyRelease);
QObject::connect(ui->render, &CustomPaintWidget::mouseWheel, this,
&BufferViewer::render_mouseWheel);
@@ -882,3 +1134,8 @@ void BufferViewer::data_selected(const QItemSelection &selected, const QItemSele
INVOKE_MEMFN(RT_UpdateAndDisplay);
}
}
void BufferViewer::on_toggleControls_toggled(bool checked)
{
ui->cameraControlsGroup->setVisible(checked);
}
+10 -4
View File
@@ -33,6 +33,9 @@ class BufferViewer;
}
class BufferItemModel;
class CameraWrapper;
class ArcballWrapper;
class FlycamWrapper;
class BufferViewer : public QFrame, public ILogViewerForm
{
@@ -50,12 +53,15 @@ public:
private slots:
// automatic slots
void on_outputTabs_currentChanged(int index);
void on_toggleControls_toggled(bool checked);
// manual slots
void render_mouseMove(QMouseEvent *e);
void render_clicked(QMouseEvent *e);
void render_mouseWheel(QWheelEvent *e);
void render_keyPress(QKeyEvent *e);
void render_keyRelease(QKeyEvent *e);
void render_timer();
void data_selected(const QItemSelection &selected, const QItemSelection &deselected);
private:
@@ -70,13 +76,13 @@ private:
MeshDisplay m_ConfigVSOut;
MeshDisplay *m_curConfig;
QPoint m_PrevPos;
FloatVector m_pos, m_rot;
float m_CamDist;
CameraWrapper *m_CurrentCamera = NULL;
ArcballWrapper *m_Arcball = NULL;
FlycamWrapper *m_Flycam = NULL;
BufferItemModel *m_ModelVSIn;
BufferItemModel *m_ModelVSOut;
// BufferItemModel *m_ModelGSOut;
BufferItemModel *m_ModelGSOut;
void Reset();
};
+759 -111
View File
@@ -6,125 +6,760 @@
<rect>
<x>0</x>
<y>0</y>
<width>612</width>
<height>429</height>
<width>761</width>
<height>537</height>
</rect>
</property>
<property name="windowTitle">
<string>Buffer Viewer</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="RDTableView" name="vsinData">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="cornerButtonEnabled">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
<item row="0" column="1">
<widget class="RDTableView" name="vsoutData">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="cornerButtonEnabled">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QTabWidget" name="outputTabs">
<property name="currentIndex">
<widget class="RDTableView" name="vsinData">
<property name="geometry">
<rect>
<x>60</x>
<y>50</y>
<width>194</width>
<height>91</height>
</rect>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="cornerButtonEnabled">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
<widget class="RDTableView" name="vsoutData">
<property name="geometry">
<rect>
<x>280</x>
<y>50</y>
<width>194</width>
<height>101</height>
</rect>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="cornerButtonEnabled">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
<widget class="QTabWidget" name="outputTabs">
<property name="geometry">
<rect>
<x>50</x>
<y>220</y>
<width>666</width>
<height>312</height>
</rect>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="vsinTab">
<attribute name="title">
<string>VS In</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<widget class="QWidget" name="vsinTab">
<attribute name="title">
<string>VS In</string>
</attribute>
<layout class="QHBoxLayout" name="vsinLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="CustomPaintWidget" name="render" native="true"/>
</item>
</layout>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QFrame" name="renderContainer">
<layout class="QGridLayout" name="renderContainerGridLayout">
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0" colspan="2">
<widget class="QFrame" name="controlsToolbar">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>28</height>
</size>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="toggleControls">
<property name="enabled">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/Resources/cog.png</normaloff>:/Resources/cog.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="resetCamera">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/Resources/arrow_undo.png</normaloff>:/Resources/arrow_undo.png</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="autofitCamera">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/Resources/wand.png</normaloff>:/Resources/wand.png</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="controlType"/>
</item>
<item>
<widget class="Line" name="line_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="drawRange"/>
</item>
<item>
<widget class="Line" name="line_6">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="instanceLabel_2">
<property name="text">
<string>Solid Shading</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="solidShading"/>
</item>
<item>
<widget class="QToolButton" name="wireframeRender">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Wireframe</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="highlightVerts">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Highlight Vertices</string>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/Resources/asterisk_orange.png</normaloff>:/Resources/asterisk_orange.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="cameraControlsGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Camera Controls</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="6" column="1">
<widget class="QDoubleSpinBox" name="farGuess"/>
</item>
<item row="5" column="1">
<widget class="QDoubleSpinBox" name="nearGuess"/>
</item>
<item row="4" column="1">
<widget class="QDoubleSpinBox" name="aspectGuess"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="farGuessLabel">
<property name="text">
<string>Far Plane:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="camSpeed">
<property name="decimals">
<number>5</number>
</property>
<property name="minimum">
<double>0.000100000000000</double>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
<property name="singleStep">
<double>0.000100000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="nearGuessLabel">
<property name="text">
<string>Near Plane:</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="aspectGuessLabel">
<property name="text">
<string>Aspect Ratio:</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="fovGuessLabel">
<property name="text">
<string>Persp. FOV:</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="camSpeedLabel">
<property name="text">
<string>Speed:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="matrixType">
<property name="maxVisibleItems">
<number>2</number>
</property>
<property name="maxCount">
<number>2</number>
</property>
<property name="insertPolicy">
<enum>QComboBox::NoInsert</enum>
</property>
<property name="frame">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="guessInstructions">
<property name="text">
<string>Manually set auto-guessed values
Blank to use automatic value</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="fovGuess">
<property name="inputMask">
<string extracomment="Positive integer (&lt; 180)">D00</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="matrixTypeLabel">
<property name="text">
<string>Matrix Type:</string>
</property>
</widget>
</item>
<item row="7" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="1" column="1">
<widget class="CustomPaintWidget" name="render" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="vsoutTab">
<attribute name="title">
<string>VS Out</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
</layout>
</widget>
<widget class="QWidget" name="gsoutTab">
<attribute name="title">
<string>GS Out</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
</layout>
</widget>
</widget>
<widget class="RDTableView" name="gsoutData">
<property name="geometry">
<rect>
<x>500</x>
<y>50</y>
<width>194</width>
<height>81</height>
</rect>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="cornerButtonEnabled">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
<widget class="QFrame" name="meshToolbar">
<property name="geometry">
<rect>
<x>50</x>
<y>10</y>
<width>435</width>
<height>28</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>28</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>6</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QLabel" name="zoomLabel">
<property name="text">
<string>Controls</string>
</property>
</widget>
<widget class="QWidget" name="vsoutTab">
<attribute name="title">
<string>VS Out</string>
</attribute>
<layout class="QHBoxLayout" name="vsoutLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QToolButton" name="exportDrop">
<property name="enabled">
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/Resources/save.png</normaloff>:/Resources/save.png</iconset>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="popupMode">
<enum>QToolButton::MenuButtonPopup</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="syncViews">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Sync Views</string>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/Resources/arrow_join.png</normaloff>:/Resources/arrow_join.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="rowOffsetLabel">
<property name="text">
<string>Row Offset</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="rowOffset">
<property name="prefix">
<string/>
</property>
<property name="maximum">
<number>1000000</number>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="instanceLabel">
<property name="text">
<string>Instance</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="instance">
<property name="maximum">
<number>100000</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="ToolWindowManager" name="dockarea" native="true">
<property name="geometry">
<rect>
<x>30</x>
<y>50</y>
<width>119</width>
<height>100</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>100</height>
</size>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
</widget>
<widget class="BufferFormatSpecifier" name="formatSpecifier" native="true">
<property name="geometry">
<rect>
<x>139</x>
<y>160</y>
<width>521</width>
<height>61</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</widget>
<customwidgets>
<customwidget>
@@ -137,7 +772,20 @@
<extends>QTableView</extends>
<header>Widgets/Extended/RDTableView.h</header>
</customwidget>
<customwidget>
<class>ToolWindowManager</class>
<extends>QWidget</extends>
<header>ToolWindowManager.h</header>
</customwidget>
<customwidget>
<class>BufferFormatSpecifier</class>
<extends>QWidget</extends>
<header>Widgets/BufferFormatSpecifier.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<resources>
<include location="../resources.qrc"/>
</resources>
<connections/>
</ui>