diff --git a/qglengine/glscene.cpp b/qglengine/glscene.cpp index 0c8425a..9f72dc2 100644 --- a/qglengine/glscene.cpp +++ b/qglengine/glscene.cpp @@ -184,8 +184,6 @@ void Scene::selectObject(ObjectBase * o, bool add_to_selection) { else o->setSelected(!o->isSelected()); gatherSelection(); } - foreach (Mesh * m, geometries) - m->selected_changed = true; emitSelectionChanged(); } @@ -197,8 +195,38 @@ void Scene::selectObjects(QList ol, bool add_to_selection) { o->setSelected(true); } gatherSelection(); - foreach (Mesh * m, geometries) - m->selected_changed = true; + emitSelectionChanged(); +} + + +void Scene::selectObjectsByMesh() { + QList csl = selected_; + QSet sml; + foreach (ObjectBase * o, csl) + if (o->mesh()) + sml << o->mesh(); + QList ol = root_->children(true); + foreach (ObjectBase * o, ol) { + if (sml.contains(o->mesh())) + o->setSelected(true); + } + gatherSelection(); + emitSelectionChanged(); +} + + +void Scene::selectObjectsByMaterial() { + QList csl = selected_; + QSet sml; + foreach (ObjectBase * o, csl) + if (o->material()) + sml << o->material(); + QList ol = root_->children(true); + foreach (ObjectBase * o, ol) { + if (sml.contains(o->material())) + o->setSelected(true); + } + gatherSelection(); emitSelectionChanged(); } diff --git a/qglengine/glscene.h b/qglengine/glscene.h index df11031..8ab6589 100644 --- a/qglengine/glscene.h +++ b/qglengine/glscene.h @@ -72,6 +72,8 @@ public: void setSelectionMode(SelectionMode mode) {sel_mode_ = mode;} void selectObject(ObjectBase * o, bool add_to_selection = false); void selectObjects(QList ol, bool add_to_selection = false); + void selectObjectsByMesh(); + void selectObjectsByMaterial(); void clearSelection(); QList selectedObjects(bool top_only = false) const; ObjectBase * selectedObject() const; diff --git a/qglengine/qglview.h b/qglengine/qglview.h index 514a914..bd34f8b 100644 --- a/qglengine/qglview.h +++ b/qglengine/qglview.h @@ -193,8 +193,6 @@ protected: void keyReleaseEvent(QKeyEvent * e); void focusOutEvent(QFocusEvent *); - void renderSelection(); - void checkCaps(); private: diff --git a/qglengine/renderer_base.cpp b/qglengine/renderer_base.cpp index 86aec0f..015c6a0 100644 --- a/qglengine/renderer_base.cpp +++ b/qglengine/renderer_base.cpp @@ -140,7 +140,7 @@ void RendererBase::reloadMaterials(Scene & scene) { tex_layers[i][m->bitmap_path] = 0; } int layers_count = tex_layers[0].size() + tex_layers[1].size(), cl = -1; - uint cur_maps_hash = qHash(tex_layers[0].keys()) ^ qHash(tex_layers[1].keys()); + uint cur_maps_hash = qHash(tex_layers[0].keys()) ^ (qHash(tex_layers[1].keys()) + 0xF00FF00F); if (maps_hash != cur_maps_hash) { maps_hash = cur_maps_hash; textures_maps.resize(view, maps_size, layers_count); diff --git a/qglengine/widgets/scene_tree.cpp b/qglengine/widgets/scene_tree.cpp index f64790b..354b214 100644 --- a/qglengine/widgets/scene_tree.cpp +++ b/qglengine/widgets/scene_tree.cpp @@ -231,6 +231,8 @@ void SceneTree::checkButtons() { ui->buttonRemove->setEnabled(has_1); ui->buttonClone ->setEnabled(has_1); ui->buttonSelectParent->setEnabled(has_1); + ui->buttonSelectByMesh->setEnabled(has_1); + ui->buttonSelectByMaterial->setEnabled(has_1); ui->buttonGroup->setEnabled(has_m); } @@ -350,6 +352,16 @@ void SceneTree::on_buttonSelectParent_clicked() { } +void SceneTree::on_buttonSelectByMesh_clicked() { + view->scene()->selectObjectsByMesh(); +} + + +void SceneTree::on_buttonSelectByMaterial_clicked() { + view->scene()->selectObjectsByMaterial(); +} + + void SceneTree::on_buttonGroup_clicked() { if (!view) return; QList sol = view->scene()->selectedObjects(true); diff --git a/qglengine/widgets/scene_tree.h b/qglengine/widgets/scene_tree.h index 8c13215..78b08d9 100644 --- a/qglengine/widgets/scene_tree.h +++ b/qglengine/widgets/scene_tree.h @@ -64,6 +64,8 @@ private slots: void on_buttonClone_clicked(); void on_buttonUpdate_clicked() {objectsTreeChanged();} void on_buttonSelectParent_clicked(); + void on_buttonSelectByMesh_clicked(); + void on_buttonSelectByMaterial_clicked(); void on_buttonGroup_clicked(); void removeObjects(); diff --git a/qglengine/widgets/scene_tree.ui b/qglengine/widgets/scene_tree.ui index be71efe..f742dc5 100644 --- a/qglengine/widgets/scene_tree.ui +++ b/qglengine/widgets/scene_tree.ui @@ -67,7 +67,7 @@ Delete selected - + :/icons/edit-delete.png:/icons/edit-delete.png @@ -97,7 +97,7 @@ Clone selected - + :/icons/edit-copy.png:/icons/edit-copy.png @@ -129,6 +129,34 @@ + + + + false + + + Select by mesh + + + + :/icons/type-geo.png:/icons/type-geo.png + + + + + + + false + + + Select by material + + + + :/icons/format-fill-color.png:/icons/format-fill-color.png + + + @@ -320,7 +348,7 @@ Force update - + :/icons/view-refresh.png:/icons/view-refresh.png @@ -393,7 +421,9 @@ - + + +