git-svn-id: svn://db.shs.com.ru/libs@668 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -171,6 +171,7 @@ void Scene::removeObject(ObjectBase & o, bool inChildren) {
|
||||
|
||||
void Scene::clearObjects(bool deleteAll) {
|
||||
root_->clearChildren(deleteAll);
|
||||
cleanUnused();
|
||||
setTreeStructChanged();
|
||||
emitSelectionChanged();
|
||||
}
|
||||
@@ -253,6 +254,20 @@ ObjectBase * Scene::selectedObject() const {
|
||||
}
|
||||
|
||||
|
||||
void Scene::cleanUnused() {
|
||||
QSet<Mesh*> ums;
|
||||
QMapIterator<int, QMap<Mesh*, ObjectBaseList>> it(geometries_used);
|
||||
while (it.hasNext())
|
||||
ums |= it.next().value().keys().toSet();
|
||||
for (int i = 0; i < geometries.size(); ++i) {
|
||||
if (ums.contains(geometries[i])) continue;
|
||||
td_geometries << geometries[i];
|
||||
geometries.removeAt(i);
|
||||
--i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const Box3D & Scene::boundingBox() const {
|
||||
root_->calculateBoundingBox();
|
||||
return root_->boundingBox();
|
||||
@@ -319,25 +334,8 @@ void Scene::attachObject(ObjectBase * o) {
|
||||
if (!o) return;
|
||||
o->setScene(this);
|
||||
if (o->mesh()) { // search suitable mesh in this scene
|
||||
uint ohash = o->mesh()->hash();
|
||||
bool need_new = true;
|
||||
foreach (Mesh * m, geometries) {
|
||||
if (m == o->mesh()) { // already exists by ptr
|
||||
need_new = false;
|
||||
setObjectMeshChanged(o);
|
||||
break;
|
||||
}
|
||||
if (m->hash() == ohash) { // already exists by hash
|
||||
need_new = false;
|
||||
o->setMesh(m);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (need_new) { // need to clone mesh and add to scene
|
||||
Mesh * nmesh = o->mesh()->clone();
|
||||
o->setMesh(nmesh);
|
||||
geometries << nmesh;
|
||||
}
|
||||
o->mesh_ = attachMesh(o->mesh());
|
||||
setObjectMeshChanged(o);
|
||||
}
|
||||
if (o->material()) { // search suitable material in this scene
|
||||
uint ohash = o->material()->hash();
|
||||
@@ -361,6 +359,25 @@ void Scene::attachObject(ObjectBase * o) {
|
||||
materials << nmat;
|
||||
}
|
||||
}
|
||||
setTreeStructChanged();
|
||||
}
|
||||
|
||||
|
||||
Mesh * Scene::attachMesh(Mesh * mesh) {
|
||||
if (!mesh) return 0;
|
||||
uint mhash = mesh->hash();
|
||||
foreach (Mesh * m, geometries) {
|
||||
if (m == mesh) { // already exists by ptr
|
||||
return m;
|
||||
}
|
||||
if (m->hash() == mhash) { // already exists by hash
|
||||
return m;
|
||||
}
|
||||
}
|
||||
// need to clone mesh and add to scene
|
||||
Mesh * nmesh = mesh->clone();
|
||||
geometries << nmesh;
|
||||
return nmesh;
|
||||
}
|
||||
|
||||
|
||||
@@ -421,14 +438,15 @@ bool Scene::prepare() {
|
||||
if (tree_changed) {
|
||||
tree_changed = false;
|
||||
lights_changed = true;
|
||||
if (tree_struct_changed) {
|
||||
tree_struct_changed = false;
|
||||
QMetaObject::invokeMethod(this, "treeChanged", Qt::QueuedConnection);
|
||||
}
|
||||
geometries_used[rpSolid ].clear();
|
||||
geometries_used[rpTransparent].clear();
|
||||
lights_used.clear();
|
||||
prepareTree(root_);
|
||||
if (tree_struct_changed) {
|
||||
tree_struct_changed = false;
|
||||
cleanUnused();
|
||||
QMetaObject::invokeMethod(this, "treeChanged", Qt::QueuedConnection);
|
||||
}
|
||||
}
|
||||
mat_changed = false;
|
||||
return true;
|
||||
@@ -440,7 +458,7 @@ void Scene::destroy() {
|
||||
selected_top.clear();
|
||||
emitSelectionChanged();
|
||||
root_->clearChildren(true);
|
||||
qDeleteAll(geometries);
|
||||
td_geometries << geometries;
|
||||
qDeleteAll(materials);
|
||||
geometries.clear();
|
||||
materials.clear();
|
||||
@@ -449,6 +467,15 @@ void Scene::destroy() {
|
||||
}
|
||||
|
||||
|
||||
void Scene::destroyUnused(QOpenGLExtraFunctions * f) {
|
||||
if (!td_geometries.isEmpty()) qDebug() << "destroyUnused" << td_geometries.size();
|
||||
foreach (Mesh * i, td_geometries)
|
||||
i->destroy(f);
|
||||
qDeleteAll(td_geometries);
|
||||
td_geometries.clear();
|
||||
}
|
||||
|
||||
|
||||
QDataStream & operator <<(QDataStream & s, const Scene * p) {
|
||||
ChunkStream cs;
|
||||
//qDebug() << "place" << p->name() << "...";
|
||||
|
||||
Reference in New Issue
Block a user