git-svn-id: svn://db.shs.com.ru/libs@665 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-12-10 10:22:09 +00:00
parent 86f4e0ad78
commit 9d05dbe6da
24 changed files with 186 additions and 137 deletions

View File

@@ -52,7 +52,7 @@ Scene * Scene::clone() {
void Scene::addObject(ObjectBase * o) {
QList<ObjectBase*> aol = o->children(true);
ObjectBaseList aol = o->children(true);
attachObject(o);
foreach (ObjectBase * c, aol)
attachObject(c);
@@ -125,7 +125,7 @@ void Scene::emitSelectionChanged() {
selected_top << po;
}
foreach (Mesh * m, geometries)
m->selected_changed = true;
m->setAllSelectionChanged(true);
selectionChanged();
}
@@ -188,7 +188,7 @@ void Scene::selectObject(ObjectBase * o, bool add_to_selection) {
}
void Scene::selectObjects(QList<ObjectBase *> ol, bool add_to_selection) {
void Scene::selectObjects(ObjectBaseList ol, bool add_to_selection) {
if (!add_to_selection || (sel_mode_ == smSingleSelection)) clearSelection();
foreach (ObjectBase * o, ol) {
if (!o) continue;
@@ -200,12 +200,12 @@ void Scene::selectObjects(QList<ObjectBase *> ol, bool add_to_selection) {
void Scene::selectObjectsByMesh() {
QList<ObjectBase * > csl = selected_;
ObjectBaseList csl = selected_;
QSet<Mesh*> sml;
foreach (ObjectBase * o, csl)
if (o->mesh())
sml << o->mesh();
QList<ObjectBase * > ol = root_->children(true);
ObjectBaseList ol = root_->children(true);
foreach (ObjectBase * o, ol) {
if (sml.contains(o->mesh()))
o->setSelected(true);
@@ -216,12 +216,12 @@ void Scene::selectObjectsByMesh() {
void Scene::selectObjectsByMaterial() {
QList<ObjectBase * > csl = selected_;
ObjectBaseList csl = selected_;
QSet<Material*> sml;
foreach (ObjectBase * o, csl)
if (o->material())
sml << o->material();
QList<ObjectBase * > ol = root_->children(true);
ObjectBaseList ol = root_->children(true);
foreach (ObjectBase * o, ol) {
if (sml.contains(o->material()))
o->setSelected(true);
@@ -234,7 +234,7 @@ void Scene::selectObjectsByMaterial() {
void Scene::clearSelection() {
selected_.clear();
selected_top.clear();
QList<ObjectBase * > ol = root_->children(true);
ObjectBaseList ol = root_->children(true);
foreach (ObjectBase * o, ol) {
o->selected_ = o->selected_aim = false;
}
@@ -242,7 +242,7 @@ void Scene::clearSelection() {
}
QList<ObjectBase * > Scene::selectedObjects(bool top_only) const {
ObjectBaseList Scene::selectedObjects(bool top_only) const {
return top_only ? selected_top : selected_;
}
@@ -269,7 +269,7 @@ Material * Scene::newMaterial() {
void Scene::removeMaterial(Material * m) {
if (!m || !materials.contains(m)) return;
QList<ObjectBase * > ol = root_->children(true);
ObjectBaseList ol = root_->children(true);
foreach (ObjectBase * o, ol)
if (o->material_ == m)
o->setMaterial(0);
@@ -289,7 +289,7 @@ void Scene::makeMaterialsUniqueNames() {
}
QList<ObjectBase *> Scene::objects(bool all) {
ObjectBaseList Scene::objects(bool all) {
return root_->children(all);
}
@@ -308,7 +308,7 @@ void Scene::dump() {
void Scene::gatherSelection() {
selected_.clear();
QList<ObjectBase * > ol = root_->children(true);
ObjectBaseList ol = root_->children(true);
foreach (ObjectBase * o, ol)
if (o->selected_)
selected_ << o;
@@ -367,8 +367,10 @@ void Scene::attachObject(ObjectBase * o) {
void Scene::setTreeChanged() {
if (destroying) return;
tree_changed = true;
foreach (Mesh * m, geometries)
m->selected_changed = true;
foreach (Mesh * m, geometries) {
m->setAllObjectsChanged(true);
m->setAllSelectionChanged(true);
}
gatherSelection();
}
@@ -379,7 +381,7 @@ void Scene::setTreeStructChanged() {
void Scene::setObjectMeshChanged(ObjectBase * o) {
if (o) o->setMeshChanged();
if (o) o->setObjectsChanged();
}
@@ -393,8 +395,8 @@ void Scene::prepareTree(ObjectBase * o) {
} break;
case ObjectBase::glMesh:
if (co->mesh()) {
geometries_used[co->mesh()] << co;
co->mesh()->objects_changed = co->mesh()->selected_changed = true;
geometries_used[co->pass()][co->mesh()] << co;
co->setObjectsChanged();
}
break;
default: break;
@@ -413,7 +415,7 @@ bool Scene::prepare() {
}
}
QList<ObjectBase*> aol;
ObjectBaseList aol;
if (!tree_changed && !mat_changed) return false;
aol = root_->children(true);
if (tree_changed) {
@@ -423,7 +425,8 @@ bool Scene::prepare() {
tree_struct_changed = false;
QMetaObject::invokeMethod(this, "treeChanged", Qt::QueuedConnection);
}
geometries_used.clear();
geometries_used[rpSolid ].clear();
geometries_used[rpTransparent].clear();
lights_used.clear();
prepareTree(root_);
}
@@ -450,7 +453,7 @@ QDataStream & operator <<(QDataStream & s, const Scene * p) {
ChunkStream cs;
//qDebug() << "place" << p->name() << "...";
QVector<short> geom_ind, mat_ind;
QList<ObjectBase*> cl = p->root_->children(true);
ObjectBaseList cl = p->root_->children(true);
geom_ind.reserve(cl.size());
mat_ind.reserve(cl.size());
foreach (ObjectBase * c, cl) {
@@ -484,7 +487,7 @@ QDataStream & operator >>(QDataStream & s, Scene *& p) {
}
}
p->makeMaterialsUniqueNames();
QList<ObjectBase*> cl = p->root_->children(true);
ObjectBaseList cl = p->root_->children(true);
int cnt = qMin(qMin(cl.size(), geom_ind.size()), mat_ind.size());
for (int i = 0; i < cnt; ++i) {
ObjectBase * c(cl[i]);