git-svn-id: svn://db.shs.com.ru/libs@705 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -307,6 +307,7 @@ inline T globject_cast(const ObjectBase * object) {return reinterpret_cast<T>(ob
|
|||||||
QDataStream & operator <<(QDataStream & s, const ObjectBase * p);
|
QDataStream & operator <<(QDataStream & s, const ObjectBase * p);
|
||||||
QDataStream & operator >>(QDataStream & s, ObjectBase *& p);
|
QDataStream & operator >>(QDataStream & s, ObjectBase *& p);
|
||||||
|
|
||||||
inline ObjectBaseList light2objectList(const QList<Light*> & v) {ObjectBaseList ret; foreach (Light*i, v) ret << (ObjectBase*)i; return ret;}
|
inline ObjectBaseList lights2objectList(const QList<Light*> & v) {ObjectBaseList ret; foreach (Light*i, v) ret << (ObjectBase*)i; return ret;}
|
||||||
|
inline ObjectBaseList cameras2objectList(const QList<Camera*> & v) {ObjectBaseList ret; foreach (Camera*i, v) ret << (ObjectBase*)i; return ret;}
|
||||||
|
|
||||||
#endif // GLOBJECT_H
|
#endif // GLOBJECT_H
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ Scene::Scene() {
|
|||||||
|
|
||||||
Scene::~Scene() {
|
Scene::~Scene() {
|
||||||
destroying = true;
|
destroying = true;
|
||||||
destroy();
|
clear();
|
||||||
delete root_;
|
delete root_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ void Scene::addScene(const Scene * s) {
|
|||||||
|
|
||||||
|
|
||||||
void Scene::assignFrom(const Scene * s) {
|
void Scene::assignFrom(const Scene * s) {
|
||||||
destroy();
|
clear();
|
||||||
setName(s->name());
|
setName(s->name());
|
||||||
foreach (Material * m, s->materials) {
|
foreach (Material * m, s->materials) {
|
||||||
Material * nm = new Material();
|
Material * nm = new Material();
|
||||||
@@ -91,6 +91,19 @@ void Scene::assignFrom(const Scene * s) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Scene::clear() {
|
||||||
|
selected_.clear();
|
||||||
|
selected_top.clear();
|
||||||
|
emitSelectionChanged();
|
||||||
|
root_->clearChildren(true);
|
||||||
|
td_geometries << geometries;
|
||||||
|
qDeleteAll(materials);
|
||||||
|
geometries.clear();
|
||||||
|
materials.clear();
|
||||||
|
emit __destroyed();
|
||||||
|
emit treeChanged();}
|
||||||
|
|
||||||
|
|
||||||
void Scene::objectsCountInternal(int * cnt, ObjectBase * where) {
|
void Scene::objectsCountInternal(int * cnt, ObjectBase * where) {
|
||||||
++(*cnt);
|
++(*cnt);
|
||||||
foreach (ObjectBase * i, where->children_)
|
foreach (ObjectBase * i, where->children_)
|
||||||
@@ -422,6 +435,9 @@ void Scene::prepareTree(ObjectBase * o) {
|
|||||||
co->setObjectsChanged();
|
co->setObjectsChanged();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ObjectBase::glCamera:
|
||||||
|
cameras_used << globject_cast<Camera * >(co);
|
||||||
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
prepareTree(co);
|
prepareTree(co);
|
||||||
@@ -445,6 +461,7 @@ bool Scene::prepare() {
|
|||||||
geometries_used[rpSolid ].clear();
|
geometries_used[rpSolid ].clear();
|
||||||
geometries_used[rpTransparent].clear();
|
geometries_used[rpTransparent].clear();
|
||||||
lights_used.clear();
|
lights_used.clear();
|
||||||
|
cameras_used.clear();
|
||||||
prepareTree(root_);
|
prepareTree(root_);
|
||||||
if (tree_struct_changed) {
|
if (tree_struct_changed) {
|
||||||
tree_struct_changed = false;
|
tree_struct_changed = false;
|
||||||
@@ -459,17 +476,9 @@ bool Scene::prepare() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Scene::destroy() {
|
void Scene::destroy(QOpenGLExtraFunctions * f) {
|
||||||
selected_.clear();
|
foreach (Mesh * g, geometries)
|
||||||
selected_top.clear();
|
g->destroy(f);
|
||||||
emitSelectionChanged();
|
|
||||||
root_->clearChildren(true);
|
|
||||||
td_geometries << geometries;
|
|
||||||
qDeleteAll(materials);
|
|
||||||
geometries.clear();
|
|
||||||
materials.clear();
|
|
||||||
emit __destroyed();
|
|
||||||
emit treeChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ public:
|
|||||||
|
|
||||||
void addScene(const Scene * s);
|
void addScene(const Scene * s);
|
||||||
void assignFrom(const Scene * s);
|
void assignFrom(const Scene * s);
|
||||||
|
void clear();
|
||||||
|
|
||||||
int objectsCount(bool all = false);
|
int objectsCount(bool all = false);
|
||||||
ObjectBaseList objects(bool all = false);
|
ObjectBaseList objects(bool all = false);
|
||||||
@@ -89,7 +90,7 @@ public:
|
|||||||
void removeLight(Light * l);
|
void removeLight(Light * l);
|
||||||
|
|
||||||
void dump();
|
void dump();
|
||||||
void destroy();
|
void destroy(QOpenGLExtraFunctions * f);
|
||||||
void destroyUnused(QOpenGLExtraFunctions * f);
|
void destroyUnused(QOpenGLExtraFunctions * f);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -120,6 +121,7 @@ protected:
|
|||||||
|
|
||||||
QMap<int, QMap<Mesh*, ObjectBaseList>> geometries_used; // [pass][mesh] = ObjectBaseList
|
QMap<int, QMap<Mesh*, ObjectBaseList>> geometries_used; // [pass][mesh] = ObjectBaseList
|
||||||
QMap<int, QList<Light*>> lights_used; // by Light::Type
|
QMap<int, QList<Light*>> lights_used; // by Light::Type
|
||||||
|
QList<Camera*> cameras_used;
|
||||||
QVector<Material*> changed_materials;
|
QVector<Material*> changed_materials;
|
||||||
|
|
||||||
SelectionMode sel_mode_;
|
SelectionMode sel_mode_;
|
||||||
|
|||||||
@@ -208,8 +208,8 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
|||||||
view->camera()->orbitZ (dx / 4.f);
|
view->camera()->orbitZ (dx / 4.f);
|
||||||
view->camera()->orbitXY(dy / 4.f);
|
view->camera()->orbitXY(dy / 4.f);
|
||||||
} else {
|
} else {
|
||||||
view->camera()->rotateZ(dx / 4.f);
|
view->camera()->rotateZ(-dx / 4.f);
|
||||||
view->camera()->rotateX(dy / 4.f);
|
view->camera()->rotateX(-dy / 4.f);
|
||||||
}
|
}
|
||||||
emit view->cameraPosChanged(view->camera()->pos());
|
emit view->cameraPosChanged(view->camera()->pos());
|
||||||
} else if (e->buttons().testFlag(Qt::RightButton)) {
|
} else if (e->buttons().testFlag(Qt::RightButton)) {
|
||||||
|
|||||||
@@ -81,12 +81,14 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) {
|
|||||||
scene_ = new Scene();
|
scene_ = new Scene();
|
||||||
connect(scene_, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
|
connect(scene_, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
|
||||||
connect(scene_, SIGNAL(__destroyed()), this, SLOT(__destroyed()));
|
connect(scene_, SIGNAL(__destroyed()), this, SLOT(__destroyed()));
|
||||||
camera_ = new Camera();
|
connect(scene_, SIGNAL(__objectDeleted(ObjectBase*)), this, SLOT(__objectDeleted(ObjectBase*)));
|
||||||
camera_->setPos(QVector3D(2, 2, 2));
|
default_camera = new Camera();
|
||||||
camera_->setAim(QVector3D());
|
default_camera->setPos(QVector3D(2, 2, 2));
|
||||||
|
default_camera->setAim(QVector3D());
|
||||||
|
camera_ = default_camera;
|
||||||
// qDebug() << camera_->aim();
|
// qDebug() << camera_->aim();
|
||||||
camera_->setName("Camera");
|
default_camera->setName("Camera");
|
||||||
emit cameraPosChanged(camera_->pos());
|
emit cameraPosChanged(default_camera->pos());
|
||||||
//camera().aim_ = camera().pos_;
|
//camera().aim_ = camera().pos_;
|
||||||
ktm_.restart();
|
ktm_.restart();
|
||||||
|
|
||||||
@@ -109,8 +111,9 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) {
|
|||||||
QGLView::~QGLView() {
|
QGLView::~QGLView() {
|
||||||
deleting_ = true;
|
deleting_ = true;
|
||||||
stop();
|
stop();
|
||||||
scene_->destroy();
|
scene_->clear();
|
||||||
delete scene_;
|
delete scene_;
|
||||||
|
delete default_camera;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -210,6 +213,12 @@ void QGLView::__destroyed() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void QGLView::__objectDeleted(ObjectBase * o) {
|
||||||
|
if (o == camera_)
|
||||||
|
setDefaultCamera();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void QGLView::resizeGL(int width, int height) {
|
void QGLView::resizeGL(int width, int height) {
|
||||||
if (!is_init) return;
|
if (!is_init) return;
|
||||||
if (width <= 0 || height <= 0) return;
|
if (width <= 0 || height <= 0) return;
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ public:
|
|||||||
Camera * camera() {return camera_;}
|
Camera * camera() {return camera_;}
|
||||||
const Camera * camera() const {return camera_;}
|
const Camera * camera() const {return camera_;}
|
||||||
void setCamera(Camera * camera) {camera_ = camera;}
|
void setCamera(Camera * camera) {camera_ = camera;}
|
||||||
|
void setDefaultCamera() {camera_ = default_camera;}
|
||||||
QByteArray saveCamera();
|
QByteArray saveCamera();
|
||||||
void restoreCamera(const QByteArray & ba);
|
void restoreCamera(const QByteArray & ba);
|
||||||
QByteArray saveFeatures();
|
QByteArray saveFeatures();
|
||||||
@@ -215,7 +216,7 @@ private:
|
|||||||
bool setupViewport();
|
bool setupViewport();
|
||||||
|
|
||||||
Scene * scene_;
|
Scene * scene_;
|
||||||
Camera * camera_;
|
Camera * camera_, * default_camera;
|
||||||
MouseController mouse;
|
MouseController mouse;
|
||||||
QMenu context_menu;
|
QMenu context_menu;
|
||||||
// uint cid;
|
// uint cid;
|
||||||
@@ -237,6 +238,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void __destroyed();
|
void __destroyed();
|
||||||
|
void __objectDeleted(ObjectBase * o);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setBackColor(const QColor & arg) {backColor_ = arg;}
|
void setBackColor(const QColor & arg) {backColor_ = arg;}
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ void QGLViewWindow::loadFile(const QString & path, bool import) {
|
|||||||
|
|
||||||
void QGLViewWindow::on_actionReset_triggered() {
|
void QGLViewWindow::on_actionReset_triggered() {
|
||||||
///view->view()->removeObject(axis, false);
|
///view->view()->removeObject(axis, false);
|
||||||
view->view()->scene()->destroy();
|
view->view()->scene()->clear();
|
||||||
///view->view()->addObject(axis);
|
///view->view()->addObject(axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,6 +79,12 @@ void RendererSelection::generateObjectsID(Scene & scene) {
|
|||||||
o->id_ = id;
|
o->id_ = id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
foreach (Camera * o, scene.cameras_used) {
|
||||||
|
uint id = qHash(o);
|
||||||
|
ids[id] = o;
|
||||||
|
aim_ids[id + 1] = o;
|
||||||
|
o->id_ = id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,6 +136,7 @@ void RendererSelection::renderSelection(Scene & scene) {
|
|||||||
|
|
||||||
RendererService & rs(r->rend_service);
|
RendererService & rs(r->rend_service);
|
||||||
rs.drawLights();
|
rs.drawLights();
|
||||||
|
rs.drawCameras();
|
||||||
rs.drawCurrentHandleObjects();
|
rs.drawCurrentHandleObjects();
|
||||||
|
|
||||||
//mouse_rect = fbo_selection.rect();
|
//mouse_rect = fbo_selection.rect();
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ RendererService::RendererService(Renderer * r_): r(r_) {
|
|||||||
axis_camera->setFOV(45.);
|
axis_camera->setFOV(45.);
|
||||||
axis_mesh = Primitive::arrow(12);
|
axis_mesh = Primitive::arrow(12);
|
||||||
size_vp_scale = size_full_scale = 1.;
|
size_vp_scale = size_full_scale = 1.;
|
||||||
|
|
||||||
box_mesh = Primitive::cube(0.8, 0.8, 0.8);
|
box_mesh = Primitive::cube(0.8, 0.8, 0.8);
|
||||||
box_mesh_f = Primitive::cubeFrame(0.8, 0.8, 0.8);
|
box_mesh_f = Primitive::cubeFrame(0.8, 0.8, 0.8);
|
||||||
omni_mesh = Primitive::ellipsoid(2, 1, 0.5);
|
omni_mesh = Primitive::ellipsoid(2, 1, 0.5);
|
||||||
@@ -75,11 +76,23 @@ RendererService::RendererService(Renderer * r_): r(r_) {
|
|||||||
cone_mesh ->translatePoints(0,0,-0.5);
|
cone_mesh ->translatePoints(0,0,-0.5);
|
||||||
cone_mesh ->scalePoints(1.5);
|
cone_mesh ->scalePoints(1.5);
|
||||||
|
|
||||||
|
camera_mesh = Primitive::cube(1.2, 1.2, 1.2);
|
||||||
|
mat.translate(0,0,-0.5);
|
||||||
|
Mesh * m = Primitive::cone(6, 0.6, 1.);
|
||||||
|
m->scalePoints(1.4);
|
||||||
|
m->transformPoints(mat);
|
||||||
|
camera_mesh->append(m);
|
||||||
|
camera_mesh_f = Primitive::cubeFrame(1., 1., 1.);
|
||||||
|
camera_mesh_f->append(Primitive::cubeFrame(0.5, 0.5, 0.5));
|
||||||
|
m = Primitive::coneFrame(6, 0.6, 1.);
|
||||||
|
m->transformPoints(mat);
|
||||||
|
camera_mesh_f->append(m);
|
||||||
|
|
||||||
line_mesh_f = Primitive::lineFrame(QVector3D(), QVector3D(0, 0, -1));
|
line_mesh_f = Primitive::lineFrame(QVector3D(), QVector3D(0, 0, -1));
|
||||||
|
|
||||||
handle_move_mesh = Primitive::arrow(12, 0.06);
|
handle_move_mesh = Primitive::arrow(12, 0.06);
|
||||||
handle_ms_2_mesh = Primitive::torus(8, 12, 0.5, 0.02, 90);
|
handle_ms_2_mesh = Primitive::torus(8, 12, 0.5, 0.02, 90);
|
||||||
Mesh * m = Primitive::disc(8, 0.5, 90);
|
m = Primitive::disc(8, 0.5, 90);
|
||||||
handle_ms_2_mesh->append(m);
|
handle_ms_2_mesh->append(m);
|
||||||
m->flipNormals();
|
m->flipNormals();
|
||||||
handle_ms_2_mesh->append(m);
|
handle_ms_2_mesh->append(m);
|
||||||
@@ -113,6 +126,8 @@ RendererService::~RendererService() {
|
|||||||
delete omni_mesh_f;
|
delete omni_mesh_f;
|
||||||
delete cone_mesh;
|
delete cone_mesh;
|
||||||
delete cone_mesh_f;
|
delete cone_mesh_f;
|
||||||
|
delete camera_mesh;
|
||||||
|
delete camera_mesh_f;
|
||||||
delete line_mesh_f;
|
delete line_mesh_f;
|
||||||
delete axis_camera;
|
delete axis_camera;
|
||||||
delete axis_mesh;
|
delete axis_mesh;
|
||||||
@@ -187,8 +202,7 @@ void RendererService::fillOmniObjects() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void RendererService::fillSpotObjects() {
|
void RendererService::fillAimedObjects(const ObjectBaseList & objects) {
|
||||||
QList<Light*> ll = r->view->scene()->lights_used.value(Light::Cone);
|
|
||||||
Object o;
|
Object o;
|
||||||
cur_objects.clear();
|
cur_objects.clear();
|
||||||
cur_aims.clear();
|
cur_aims.clear();
|
||||||
@@ -197,18 +211,19 @@ void RendererService::fillSpotObjects() {
|
|||||||
QVector<QVector2D> & lt (line_mesh_f->texcoords ());
|
QVector<QVector2D> & lt (line_mesh_f->texcoords ());
|
||||||
QVector< Vector2i> & lind(line_mesh_f->indicesLines());
|
QVector< Vector2i> & lind(line_mesh_f->indicesLines());
|
||||||
lv.clear();
|
lv.clear();
|
||||||
foreach (Light * l, ll) {
|
foreach (ObjectBase * go, objects) {
|
||||||
|
AimedObject * ao = (AimedObject *)go;
|
||||||
QMatrix4x4 m;
|
QMatrix4x4 m;
|
||||||
m = invariantSizeMatrix(l->worldPos()) * parentRotationMatrix(l);
|
m = invariantSizeMatrix(ao->worldPos()) * parentRotationMatrix(ao);
|
||||||
m.transposed().copyDataTo(o.modelmatrix);
|
m.transposed().copyDataTo(o.modelmatrix);
|
||||||
o.object_id = l->id_;
|
o.object_id = ao->id_;
|
||||||
cur_objects << o;
|
cur_objects << o;
|
||||||
|
|
||||||
lv << l->worldPos() << l->worldAim();
|
lv << ao->worldPos() << ao->worldAim();
|
||||||
|
|
||||||
m = invariantSizeMatrix(l->worldAim());
|
m = invariantSizeMatrix(ao->worldAim());
|
||||||
m.transposed().copyDataTo(o.modelmatrix);
|
m.transposed().copyDataTo(o.modelmatrix);
|
||||||
o.object_id = l->id_ + 1;
|
o.object_id = ao->id_ + 1;
|
||||||
cur_aims << o;
|
cur_aims << o;
|
||||||
}
|
}
|
||||||
ln.resize(lv.size());
|
ln.resize(lv.size());
|
||||||
@@ -313,13 +328,14 @@ void RendererService::drawLights() {
|
|||||||
|
|
||||||
fillOmniObjects();
|
fillOmniObjects();
|
||||||
omni_mesh->loadObjects(v, cur_objects);
|
omni_mesh->loadObjects(v, cur_objects);
|
||||||
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Omni)));
|
r->fillSelectionsBuffer(rs.cur_selections_, lights2objectList(v->scene_->lights_used.value(Light::Omni)));
|
||||||
omni_mesh->loadSelections(v, rs.cur_selections_);
|
omni_mesh->loadSelections(v, rs.cur_selections_);
|
||||||
omni_mesh->draw(v, cur_objects.size());
|
omni_mesh->draw(v, cur_objects.size());
|
||||||
|
|
||||||
fillSpotObjects();
|
ObjectBaseList ll = lights2objectList(r->view->scene()->lights_used.value(Light::Cone));
|
||||||
|
fillAimedObjects(ll);
|
||||||
cone_mesh->loadObjects(v, cur_objects);
|
cone_mesh->loadObjects(v, cur_objects);
|
||||||
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone)));
|
r->fillSelectionsBuffer(rs.cur_selections_, ll);
|
||||||
cone_mesh->loadSelections(v, rs.cur_selections_);
|
cone_mesh->loadSelections(v, rs.cur_selections_);
|
||||||
cone_mesh->draw(v, cur_objects.size());
|
cone_mesh->draw(v, cur_objects.size());
|
||||||
box_mesh->loadObjects(v, cur_aims);
|
box_mesh->loadObjects(v, cur_aims);
|
||||||
@@ -336,14 +352,15 @@ void RendererService::drawLightsFrame(QColor color) {
|
|||||||
fillOmniObjects();
|
fillOmniObjects();
|
||||||
setObjectsColor(cur_objects, color);
|
setObjectsColor(cur_objects, color);
|
||||||
omni_mesh_f->loadObjects(v, cur_objects);
|
omni_mesh_f->loadObjects(v, cur_objects);
|
||||||
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Omni)));
|
r->fillSelectionsBuffer(rs.cur_selections_, lights2objectList(v->scene_->lights_used.value(Light::Omni)));
|
||||||
omni_mesh_f->loadSelections(v, rs.cur_selections_);
|
omni_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||||
omni_mesh_f->draw(v, cur_objects.size());
|
omni_mesh_f->draw(v, cur_objects.size());
|
||||||
|
|
||||||
fillSpotObjects();
|
ObjectBaseList ll = lights2objectList(r->view->scene()->lights_used.value(Light::Cone));
|
||||||
|
fillAimedObjects(ll);
|
||||||
setObjectsColor(cur_objects, color);
|
setObjectsColor(cur_objects, color);
|
||||||
cone_mesh_f->loadObjects(v, cur_objects);
|
cone_mesh_f->loadObjects(v, cur_objects);
|
||||||
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone)));
|
r->fillSelectionsBuffer(rs.cur_selections_, ll);
|
||||||
cone_mesh_f->loadSelections(v, rs.cur_selections_);
|
cone_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||||
cone_mesh_f->draw(v, cur_objects.size());
|
cone_mesh_f->draw(v, cur_objects.size());
|
||||||
|
|
||||||
@@ -355,6 +372,45 @@ void RendererService::drawLightsFrame(QColor color) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RendererService::drawCameras() {
|
||||||
|
QGLView * v = r->view;
|
||||||
|
RendererSelection & rs(r->rend_selection);
|
||||||
|
|
||||||
|
ObjectBaseList cl = cameras2objectList(r->view->scene()->cameras_used);
|
||||||
|
cl.removeOne(r->view->camera());
|
||||||
|
fillAimedObjects(cl);
|
||||||
|
camera_mesh->loadObjects(v, cur_objects);
|
||||||
|
r->fillSelectionsBuffer(rs.cur_selections_, cl);
|
||||||
|
camera_mesh->loadSelections(v, rs.cur_selections_);
|
||||||
|
camera_mesh->draw(v, cur_objects.size());
|
||||||
|
box_mesh->loadObjects(v, cur_aims);
|
||||||
|
box_mesh->loadSelections(v, rs.cur_selections_);
|
||||||
|
box_mesh->draw(v, cur_aims.size());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RendererService::drawCamerasFrame(QColor color) {
|
||||||
|
QGLView * v = r->view;
|
||||||
|
RendererSelection & rs(r->rend_selection);
|
||||||
|
|
||||||
|
ObjectBaseList cl = cameras2objectList(r->view->scene()->cameras_used);
|
||||||
|
cl.removeOne(r->view->camera());
|
||||||
|
fillAimedObjects(cl);
|
||||||
|
setObjectsColor(cur_objects, color);
|
||||||
|
camera_mesh_f->loadObjects(v, cur_objects);
|
||||||
|
r->fillSelectionsBuffer(rs.cur_selections_, cl);
|
||||||
|
camera_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||||
|
camera_mesh_f->draw(v, cur_objects.size());
|
||||||
|
|
||||||
|
setObjectsColor(cur_aims, color);
|
||||||
|
box_mesh_f->loadObjects(v, cur_aims);
|
||||||
|
box_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||||
|
box_mesh_f->draw(v, cur_aims.size());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void RendererService::setObjectsColor(QVector<Object> & ol, QColor col) {
|
void RendererService::setObjectsColor(QVector<Object> & ol, QColor col) {
|
||||||
QVector4D cv = QColor2QVector(col);
|
QVector4D cv = QColor2QVector(col);
|
||||||
for (int i = 0; i < ol.size(); ++i)
|
for (int i = 0; i < ol.size(); ++i)
|
||||||
@@ -380,9 +436,11 @@ void RendererService::renderService() {
|
|||||||
prog->setUniformValue("line_width", 2.f);
|
prog->setUniformValue("line_width", 2.f);
|
||||||
prog->setUniformValue("z_offset", 0.f);
|
prog->setUniformValue("z_offset", 0.f);
|
||||||
drawLightsFrame(Qt::white);
|
drawLightsFrame(Qt::white);
|
||||||
|
drawCamerasFrame(Qt::white);
|
||||||
prog->setUniformValue("line_width", 1.f);
|
prog->setUniformValue("line_width", 1.f);
|
||||||
prog->setUniformValue("z_offset", -1.E-2f);
|
prog->setUniformValue("z_offset", -1.E-2f);
|
||||||
drawLightsFrame(Qt::black);
|
drawLightsFrame(Qt::black);
|
||||||
|
drawCamerasFrame(Qt::black);
|
||||||
|
|
||||||
}
|
}
|
||||||
if (r->bindShader(Renderer::srServiceLine, &prog)) {
|
if (r->bindShader(Renderer::srServiceLine, &prog)) {
|
||||||
|
|||||||
@@ -69,12 +69,14 @@ public:
|
|||||||
QMatrix4x4 parentRotationMatrix(ObjectBase * o, bool self_rotation = true);
|
QMatrix4x4 parentRotationMatrix(ObjectBase * o, bool self_rotation = true);
|
||||||
void fillXYZObjects();
|
void fillXYZObjects();
|
||||||
void fillOmniObjects();
|
void fillOmniObjects();
|
||||||
void fillSpotObjects();
|
void fillAimedObjects(const ObjectBaseList & objects);
|
||||||
void fillHandleObjects(QVector3D center, HandleMesh ids[], const QVector<QMatrix4x4> & mats, const QVector<QVector4D> & colors, QMatrix4x4 add_mat, int count = 3);
|
void fillHandleObjects(QVector3D center, HandleMesh ids[], const QVector<QMatrix4x4> & mats, const QVector<QVector4D> & colors, QMatrix4x4 add_mat, int count = 3);
|
||||||
bool calculateCenter();
|
bool calculateCenter();
|
||||||
void drawCurrentHandleObjects();
|
void drawCurrentHandleObjects();
|
||||||
void drawLights();
|
void drawLights();
|
||||||
void drawLightsFrame(QColor color);
|
void drawLightsFrame(QColor color);
|
||||||
|
void drawCameras();
|
||||||
|
void drawCamerasFrame(QColor color);
|
||||||
void setObjectsColor(QVector<QGLEngineShaders::Object> & ol, QColor col);
|
void setObjectsColor(QVector<QGLEngineShaders::Object> & ol, QColor col);
|
||||||
void renderService();
|
void renderService();
|
||||||
void setCurrentAction(HandleAction ha) {current_action = ha;}
|
void setCurrentAction(HandleAction ha) {current_action = ha;}
|
||||||
@@ -85,7 +87,8 @@ private:
|
|||||||
|
|
||||||
Mesh * axis_mesh, * handle_move_mesh, * handle_rotate_mesh, * handle_scale_mesh;
|
Mesh * axis_mesh, * handle_move_mesh, * handle_rotate_mesh, * handle_scale_mesh;
|
||||||
Mesh * handle_ms_2_mesh, * handle_scale_3_mesh;
|
Mesh * handle_ms_2_mesh, * handle_scale_3_mesh;
|
||||||
Mesh * box_mesh_f, * omni_mesh_f, * cone_mesh_f, * box_mesh, * omni_mesh, * cone_mesh;
|
Mesh * box_mesh_f, * omni_mesh_f, * cone_mesh_f, * camera_mesh_f;
|
||||||
|
Mesh * box_mesh, * omni_mesh, * cone_mesh, * camera_mesh;
|
||||||
Mesh * line_mesh_f;
|
Mesh * line_mesh_f;
|
||||||
QMatrix4x4 v_mat, axis_mat;
|
QMatrix4x4 v_mat, axis_mat;
|
||||||
QVector3D selection_center;
|
QVector3D selection_center;
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ QList<QAction *> SceneTree::actionsSelection() {
|
|||||||
<< ui->actionGroup << ui->actionClone << newSeparator()
|
<< ui->actionGroup << ui->actionClone << newSeparator()
|
||||||
<< ui->actionSelect_parent << ui->actionSelect_by_mesh << ui->actionSelect_by_material << newSeparator()
|
<< ui->actionSelect_parent << ui->actionSelect_by_mesh << ui->actionSelect_by_material << newSeparator()
|
||||||
<< ui->actionTransfer_transform_to_children << newSeparator()
|
<< ui->actionTransfer_transform_to_children << newSeparator()
|
||||||
|
<< ui->actionActive_camera << ui->actionDefault_camera << newSeparator()
|
||||||
<< ui->actionRemove;
|
<< ui->actionRemove;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -165,6 +166,8 @@ void SceneTree::makeObjetTree(ObjectBase * o, QTreeWidgetItem * ti) {
|
|||||||
case ObjectBase::glCamera:
|
case ObjectBase::glCamera:
|
||||||
t = otCamera;
|
t = otCamera;
|
||||||
ci->setIcon(cName, icon_camera);
|
ci->setIcon(cName, icon_camera);
|
||||||
|
ci->setText(cVis, (co == view->camera()) ? "*" : "");
|
||||||
|
cam_items << ci;
|
||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
@@ -217,6 +220,16 @@ void SceneTree::materialsChanged() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SceneTree::cameraChanged() {
|
||||||
|
if (!view) return;
|
||||||
|
foreach (QTreeWidgetItem * i, cam_items) {
|
||||||
|
ObjectBase * o = itemObject(i);
|
||||||
|
if (!o) continue;
|
||||||
|
i->setText(cVis, (o == view->camera()) ? "*" : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SceneTree::filterTree(QTreeWidgetItem * ti, const QString & filter, int types) {
|
bool SceneTree::filterTree(QTreeWidgetItem * ti, const QString & filter, int types) {
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
for (int i = 0; i < ti->childCount(); ++i) {
|
for (int i = 0; i < ti->childCount(); ++i) {
|
||||||
@@ -262,6 +275,7 @@ void SceneTree::checkActions() {
|
|||||||
ui->actionSelect_parent->setEnabled(has_1);
|
ui->actionSelect_parent->setEnabled(has_1);
|
||||||
ui->actionSelect_by_mesh->setEnabled(has_1);
|
ui->actionSelect_by_mesh->setEnabled(has_1);
|
||||||
ui->actionSelect_by_material->setEnabled(has_1);
|
ui->actionSelect_by_material->setEnabled(has_1);
|
||||||
|
ui->actionActive_camera->setEnabled(has_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -299,6 +313,11 @@ void SceneTree::__objectDeleted(ObjectBase * o) {
|
|||||||
geo_items.removeAt(i);
|
geo_items.removeAt(i);
|
||||||
--i;
|
--i;
|
||||||
}
|
}
|
||||||
|
for (int i = 0; i < cam_items.size(); ++i)
|
||||||
|
if (itemObject(cam_items[i]) == o) {
|
||||||
|
cam_items.removeAt(i);
|
||||||
|
--i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -396,6 +415,23 @@ void SceneTree::on_actionTransfer_transform_to_children_triggered() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SceneTree::on_actionActive_camera_triggered() {
|
||||||
|
if (!view) return;
|
||||||
|
ObjectBase * o = view->scene()->selectedObject();
|
||||||
|
if (!o) return;
|
||||||
|
if (o->type() != ObjectBase::glCamera) return;
|
||||||
|
view->setCamera((Camera *)o);
|
||||||
|
cameraChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SceneTree::on_actionDefault_camera_triggered() {
|
||||||
|
if (!view) return;
|
||||||
|
view->setDefaultCamera();
|
||||||
|
cameraChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SceneTree::on_actionSelect_parent_triggered() {
|
void SceneTree::on_actionSelect_parent_triggered() {
|
||||||
if (!view) return;
|
if (!view) return;
|
||||||
ObjectBaseList sol = view->scene()->selectedObjects(true);
|
ObjectBaseList sol = view->scene()->selectedObjects(true);
|
||||||
@@ -448,6 +484,7 @@ void SceneTree::objectsTreeChanged() {
|
|||||||
int vpos = ui->treeObjects->verticalScrollBar()->value();
|
int vpos = ui->treeObjects->verticalScrollBar()->value();
|
||||||
expanded_.clear();
|
expanded_.clear();
|
||||||
geo_items.clear();
|
geo_items.clear();
|
||||||
|
cam_items.clear();
|
||||||
rememberExpanded(ui->treeObjects->invisibleRootItem());
|
rememberExpanded(ui->treeObjects->invisibleRootItem());
|
||||||
block_tree = true;
|
block_tree = true;
|
||||||
ui->treeObjects->clear();
|
ui->treeObjects->clear();
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ private:
|
|||||||
int hidden_by_filter, obj_count;
|
int hidden_by_filter, obj_count;
|
||||||
QIcon icon_empty, icon_geo, icon_camera, icon_light, icon_vis[2];
|
QIcon icon_empty, icon_geo, icon_camera, icon_light, icon_vis[2];
|
||||||
QSet<ObjectBase*> expanded_;
|
QSet<ObjectBase*> expanded_;
|
||||||
QList<QTreeWidgetItem*> geo_items;
|
QList<QTreeWidgetItem*> geo_items, cam_items;
|
||||||
QGLView * view;
|
QGLView * view;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
@@ -73,6 +73,9 @@ private slots:
|
|||||||
void on_actionGroup_triggered();
|
void on_actionGroup_triggered();
|
||||||
void on_actionTransfer_transform_to_children_triggered();
|
void on_actionTransfer_transform_to_children_triggered();
|
||||||
|
|
||||||
|
void on_actionActive_camera_triggered();
|
||||||
|
void on_actionDefault_camera_triggered();
|
||||||
|
|
||||||
void on_actionSelect_parent_triggered();
|
void on_actionSelect_parent_triggered();
|
||||||
void on_actionSelect_by_mesh_triggered();
|
void on_actionSelect_by_mesh_triggered();
|
||||||
void on_actionSelect_by_material_triggered();
|
void on_actionSelect_by_material_triggered();
|
||||||
@@ -82,10 +85,10 @@ private slots:
|
|||||||
void objectsTreeChanged();
|
void objectsTreeChanged();
|
||||||
void selectionChanged();
|
void selectionChanged();
|
||||||
void materialsChanged();
|
void materialsChanged();
|
||||||
|
void cameraChanged();
|
||||||
void filter();
|
void filter();
|
||||||
void __objectDeleted(ObjectBase * o);
|
void __objectDeleted(ObjectBase * o);
|
||||||
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|||||||
@@ -265,6 +265,24 @@
|
|||||||
<string>Transfer transform to children</string>
|
<string>Transfer transform to children</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionActive_camera">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../qglview.qrc">
|
||||||
|
<normaloff>:/icons/type-camera.png</normaloff>:/icons/type-camera.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Active camera</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionDefault_camera">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../qglview.qrc">
|
||||||
|
<normaloff>:/icons/type-camera.png</normaloff>:/icons/type-camera.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Default camera</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
|||||||
Reference in New Issue
Block a user