1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-09-15 06:52:34 +02:00

Improve rwviewer frame selection + view

* ViewerWidget now highlights selected non-model frames
This commit is contained in:
Daniel Evans 2015-04-13 02:09:14 +01:00
parent 1827b9cca3
commit 0f4152d099
5 changed files with 45 additions and 11 deletions

View File

@ -15,7 +15,8 @@
ViewerWidget::ViewerWidget(QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f)
: QGLWidget(parent, shareWidget, f), gworld(nullptr), activeModel(nullptr), dummyObject(nullptr), currentObjectID(0),
: QGLWidget(parent, shareWidget, f), gworld(nullptr), activeModel(nullptr),
selectedFrame(nullptr), dummyObject(nullptr), currentObjectID(0),
_lastModel(nullptr), canimation(nullptr), viewDistance(1.f), dragging(false),
_frameWidgetDraw(nullptr), _frameWidgetGeom(nullptr)
{
@ -25,18 +26,18 @@ struct WidgetVertex {
float x, y, z;
static const AttributeList vertex_attributes() {
return {
{ATRS_Position, 2, sizeof(WidgetVertex), 0ul}
{ATRS_Position, 3, sizeof(WidgetVertex), 0ul}
};
}
};
std::vector<WidgetVertex> widgetVerts = {
{-1.f, 0.f, 0.f},
{ 1.f, 0.f, 0.f},
{ 0.f,-1.f, 0.f},
{ 0.f, 1.f, 0.f},
{ 0.f, 0.f,-1.f},
{ 0.f, 0.f, 1.f}
{-.5f, 0.f, 0.f},
{ .5f, 0.f, 0.f},
{ 0.f,-.5f, 0.f},
{ 0.f, .5f, 0.f},
{ 0.f, 0.f,-.5f},
{ 0.f, 0.f, .5f}
};
void ViewerWidget::initializeGL()
@ -51,6 +52,13 @@ void ViewerWidget::initializeGL()
_frameWidgetGeom = new GeometryBuffer;
_frameWidgetGeom->uploadVertices(widgetVerts);
_frameWidgetDraw->addGeometry(_frameWidgetGeom);
glGenTextures(1, &whiteTex);
glBindTexture(GL_TEXTURE_2D, whiteTex);
GLuint tex = 0xFFFFFFFF;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, &tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
void ViewerWidget::resizeGL(int w, int h)
@ -112,7 +120,8 @@ void ViewerWidget::paintGL()
r.getRenderer()->invalidate();
r.setupRender();
if( model ) {
if( model )
{
r.renderModel(model, m, dummyObject);
drawFrameWidget(model->frames[model->rootFrameIdx]);
@ -131,8 +140,18 @@ void ViewerWidget::drawFrameWidget(ModelFrame* f, const glm::mat4& m)
dp.start = 0;
dp.ambient = 1.f;
dp.diffuse = 1.f;
dp.colour = {255, 255, 255, 255};
dp.textures = { 0 };
if( f == selectedFrame )
{
dp.colour = {255, 255, 0, 255};
// Sorry!
glLineWidth(10.f);
}
else
{
dp.colour = {255, 255, 255, 255};
glLineWidth(1.f);
}
dp.textures = { whiteTex };
renderer->getRenderer()->drawArrays(thisM, _frameWidgetDraw, dp);
}
@ -179,6 +198,10 @@ void ViewerWidget::showModel(Model* model)
activeModel = model;
}
void ViewerWidget::selectFrame(ModelFrame* frame)
{
selectedFrame = frame;
}
void ViewerWidget::exportModel()
{

View File

@ -25,6 +25,7 @@ class ViewerWidget : public QGLWidget
GameWorld* gworld;
Model* activeModel;
ModelFrame* selectedFrame;
GameObject* dummyObject;
quint16 currentObjectID;
@ -40,6 +41,8 @@ class ViewerWidget : public QGLWidget
DrawBuffer* _frameWidgetDraw;
GeometryBuffer* _frameWidgetGeom;
GLuint whiteTex;
void drawFrameWidget(ModelFrame* f, const glm::mat4& = glm::mat4(1.f));
public:
@ -59,6 +62,7 @@ public slots:
void showItem(qint16 item);
void showModel(Model* model);
void selectFrame(ModelFrame* frame);
void exportModel();

View File

@ -20,6 +20,8 @@ ModelViewer::ModelViewer(ViewerWidget* viewer, QWidget* parent, Qt::WindowFlags
this->setLayout(mainLayout);
connect(frames, SIGNAL(selectedFrameChanged(ModelFrame*)),
viewerWidget, SLOT(selectFrame(ModelFrame*)));
setViewerWidget(viewerWidget);
}

View File

@ -31,6 +31,7 @@ void ModelFramesWidget::updateInfoBox(Model* model, ModelFrame *f)
void ModelFramesWidget::selectedModelChanged(const QModelIndex & n, const QModelIndex &)
{
updateInfoBox( gmodel, (ModelFrame*) n.internalPointer() );
selectedFrameChanged( (ModelFrame*) n.internalPointer() );
}
ModelFramesWidget::ModelFramesWidget(QWidget* parent, Qt::WindowFlags flags)

View File

@ -32,6 +32,10 @@ public:
public slots:
void setModel(Model *model);
signals:
void selectedFrameChanged(ModelFrame* frame);
};
#endif