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

@@ -30,7 +30,7 @@ Mesh::Mesh(GLenum geom_type_): geom_type(geom_type_),
buffer_geom(GL_ARRAY_BUFFER, GL_STATIC_DRAW), buffer_geom(GL_ARRAY_BUFFER, GL_STATIC_DRAW),
buffer_ind (GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW) { buffer_ind (GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW) {
hash_ = 0; hash_ = 0;
changed = hash_changed = objects_changed = selected_changed = true; changed = hash_changed = true;
//qDebug() << "Mesh, now" << ++_count; //qDebug() << "Mesh, now" << ++_count;
} }
@@ -189,14 +189,14 @@ void Mesh::draw(QOpenGLExtraFunctions * f, int count, int type) {
void Mesh::clear() { void Mesh::clear() {
vertices_.clear(); vertices_ .clear();
normals_.clear(); normals_ .clear();
tangents_.clear(); tangents_ .clear();
bitangents_.clear(); bitangents_.clear();
texcoords_.clear(); texcoords_ .clear();
triangles_.clear(); triangles_ .clear();
lines_.clear(); lines_ .clear();
data_.clear(); data_ .clear();
changed = hash_changed = true; changed = hash_changed = true;
} }
@@ -232,6 +232,40 @@ uint Mesh::hash() const {
} }
bool Mesh::isObjectsChanged(int type) const {
return (const_cast<Mesh*>(this))->vaoByType(type)->isObjectsChanged();
}
bool Mesh::isSelectionChanged(int type) const {
return (const_cast<Mesh*>(this))->vaoByType(type)->isSelectionChanged();
}
void Mesh::setObjectsChanged(int type, bool yes) {
vaoByType(type)->setObjectsChanged(yes);
}
void Mesh::setSelectionChanged(int type, bool yes) {
vaoByType(type)->setSelectionChanged(yes);
}
void Mesh::setAllObjectsChanged(bool yes) {
QMapIterator<int, VertexObject * > it(vao_map);
while (it.hasNext())
it.next().value()->setObjectsChanged(yes);
}
void Mesh::setAllSelectionChanged(bool yes) {
QMapIterator<int, VertexObject * > it(vao_map);
while (it.hasNext())
it.next().value()->setSelectionChanged(yes);
}
void Mesh::translatePoints(const QVector3D & dp) { void Mesh::translatePoints(const QVector3D & dp) {
QMatrix4x4 m; QMatrix4x4 m;
m.translate(dp); m.translate(dp);

View File

@@ -54,6 +54,13 @@ public:
bool isEmpty() const {return vertices_.isEmpty();} bool isEmpty() const {return vertices_.isEmpty();}
uint hash() const; uint hash() const;
bool isObjectsChanged (int type = 0) const;
bool isSelectionChanged (int type = 0) const;
void setObjectsChanged (int type = 0, bool yes = true);
void setSelectionChanged(int type = 0, bool yes = true);
void setAllObjectsChanged (bool yes = true);
void setAllSelectionChanged(bool yes = true);
QVector<QVector3D> & vertices () {changed = hash_changed = true; return vertices_;} QVector<QVector3D> & vertices () {changed = hash_changed = true; return vertices_;}
QVector<QVector3D> & normals () {changed = hash_changed = true; return normals_;} QVector<QVector3D> & normals () {changed = hash_changed = true; return normals_;}
QVector<QVector2D> & texcoords() {changed = hash_changed = true; return texcoords_;} QVector<QVector2D> & texcoords() {changed = hash_changed = true; return texcoords_;}
@@ -92,7 +99,7 @@ private:
mutable uint hash_; mutable uint hash_;
mutable bool hash_changed; mutable bool hash_changed;
int vert_count; int vert_count;
bool changed, objects_changed, selected_changed; bool changed;
}; };

View File

@@ -185,6 +185,12 @@ class RendererMaterial;
class RendererService; class RendererService;
class RendererSelection; class RendererSelection;
enum RenderPass {
rpSolid,
rpTransparent,
};
typedef QList<ObjectBase*> ObjectBaseList;
struct Box3D { struct Box3D {
GLfloat x; GLfloat x;

View File

@@ -28,6 +28,7 @@ VertexObject::VertexObject():
buffer_sel (GL_ARRAY_BUFFER, GL_STREAM_DRAW) { buffer_sel (GL_ARRAY_BUFFER, GL_STREAM_DRAW) {
vao_ = 0; vao_ = 0;
buffers_binded = false; buffers_binded = false;
objects_changed = selected_changed = true;
} }

View File

@@ -46,12 +46,17 @@ public:
GLuint ID() const {return vao_;} GLuint ID() const {return vao_;}
bool isInit() const {return vao_ != 0;} bool isInit() const {return vao_ != 0;}
bool isObjectsChanged() const {return objects_changed;}
bool isSelectionChanged() const {return selected_changed;}
void setObjectsChanged(bool yes = true) {objects_changed = yes;}
void setSelectionChanged(bool yes = true) {selected_changed = yes;}
private: private:
void loadBuffer(QOpenGLExtraFunctions * f, Buffer & buf, const void * data, int size); void loadBuffer(QOpenGLExtraFunctions * f, Buffer & buf, const void * data, int size);
GLuint vao_; GLuint vao_;
Buffer buffer_obj, buffer_sel; Buffer buffer_obj, buffer_sel;
bool buffers_binded; bool buffers_binded, objects_changed, selected_changed;
}; };

View File

@@ -161,7 +161,7 @@ Scene * loadScene(const QString & filepath) {
ObjectBase * root = assimpObject(ais->mRootNode, meshes, light_by_name, out_lights); ObjectBase * root = assimpObject(ais->mRootNode, meshes, light_by_name, out_lights);
if (!root) return 0; if (!root) return 0;
QList<ObjectBase*> rcl = root->children(true); ObjectBaseList rcl = root->children(true);
foreach (ObjectBase * c, rcl) { foreach (ObjectBase * c, rcl) {
foreach (Light * l, out_lights) { foreach (Light * l, out_lights) {
if (c->name() == (l->name() + ".Target")) { if (c->name() == (l->name() + ".Target")) {

View File

@@ -26,10 +26,10 @@ static int _count = 0;
ObjectBase::ObjectBase(Mesh * geom, Material * mat) { ObjectBase::ObjectBase(Mesh * geom, Material * mat) {
type_ = glMesh; type_ = glMesh;
render_mode = View; render_mode = View;
pass_ = Solid; prev_pass = rpSolid;
parent_ = nullptr; parent_ = nullptr;
color_ = Qt::white; color_ = Qt::white;
is_root = is_init = is_tex_loaded = selected_ = false; is_root = is_init = selected_ = false;
visible_ = accept_fog = accept_light = cast_shadow = rec_shadow = select_ = true; visible_ = accept_fog = accept_light = cast_shadow = rec_shadow = select_ = true;
line_width = -1.; line_width = -1.;
id_ = 0; id_ = 0;
@@ -61,7 +61,7 @@ ObjectBase::~ObjectBase() {
ObjectBase * ObjectBase::clone(bool withChildren) { ObjectBase * ObjectBase::clone(bool withChildren) {
ObjectBase * o = new ObjectBase(); ObjectBase * o = new ObjectBase();
o->pass_ = pass_; o->prev_pass = prev_pass;
o->is_init = false; o->is_init = false;
o->accept_light = accept_light; o->accept_light = accept_light;
o->accept_fog = accept_fog; o->accept_fog = accept_fog;
@@ -102,6 +102,15 @@ void ObjectBase::init() {
} }
RenderPass ObjectBase::pass() const {
RenderPass ret = rpSolid;
if (material_)
if (material_->hasTransparency())
ret = rpTransparent;
return ret;
}
void ObjectBase::setScene(Scene * v) { void ObjectBase::setScene(Scene * v) {
scene_ = v; scene_ = v;
foreach (ObjectBase * c, children_) foreach (ObjectBase * c, children_)
@@ -118,7 +127,7 @@ void ObjectBase::addChild(ObjectBase * o) {
o->setScene(scene_); o->setScene(scene_);
o->buildTransform(); o->buildTransform();
/*if (scene_) { /*if (scene_) {
QList<ObjectBase*> cl = o->children(true); ObjectBaseList cl = o->children(true);
cl << o; cl << o;
//foreach (ObjectBase * i, cl) { //foreach (ObjectBase * i, cl) {
// emit view_->objectAdded(i); // emit view_->objectAdded(i);
@@ -187,9 +196,9 @@ const ObjectBase * ObjectBase::child(const QString & name) const {
} }
QList<ObjectBase * > ObjectBase::children(bool all_) { ObjectBaseList ObjectBase::children(bool all_) {
if (!all_) return children_; if (!all_) return children_;
QList<ObjectBase * > cl; ObjectBaseList cl;
addChildren(cl, this); addChildren(cl, this);
return cl; return cl;
} }
@@ -239,7 +248,7 @@ void ObjectBase::setTransform(const Transform & t) {
} }
void ObjectBase::addChildren(QList<ObjectBase * > & list, ObjectBase * where) { void ObjectBase::addChildren(ObjectBaseList & list, ObjectBase * where) {
foreach (ObjectBase * i, where->children_) { foreach (ObjectBase * i, where->children_) {
list << i; list << i;
addChildren(list, i); addChildren(list, i);
@@ -247,14 +256,6 @@ void ObjectBase::addChildren(QList<ObjectBase * > & list, ObjectBase * where) {
} }
void ObjectBase::loadTextures(bool with_children) {
if (with_children)
foreach (ObjectBase * i, children_) i->loadTextures();
is_tex_loaded = true;
checkPass();
}
void ObjectBase::calculateBoundingBox() { void ObjectBase::calculateBoundingBox() {
bound = Box3D(); bound = Box3D();
if (mesh_) { if (mesh_) {
@@ -349,9 +350,7 @@ void ObjectBase::setMaterial(Material * m, bool with_children) {
material_ = m; material_ = m;
if (with_children) if (with_children)
foreach (ObjectBase * i, children_) i->setMaterial(m, true); foreach (ObjectBase * i, children_) i->setMaterial(m, true);
checkPass(); setObjectsChanged();
is_tex_loaded = false;
setMeshChanged();
if (scene_) scene_->mat_changed = true; if (scene_) scene_->mat_changed = true;
} }
@@ -360,14 +359,14 @@ void ObjectBase::setColor(QColor c, bool with_children) {
color_ = c; color_ = c;
if (with_children) if (with_children)
foreach (ObjectBase * i, children_) i->setColor(c, true); foreach (ObjectBase * i, children_) i->setColor(c, true);
setMeshChanged(); setObjectsChanged();
} }
void ObjectBase::setMesh(Mesh * v) { void ObjectBase::setMesh(Mesh * v) {
mesh_ = v; mesh_ = v;
setSceneTreeChanged(); setSceneTreeChanged();
setMeshChanged(); setObjectsChanged();
} }
@@ -385,7 +384,7 @@ void ObjectBase::buildTransform() {
//qDebug() << name_ << itransform_; //qDebug() << name_ << itransform_;
foreach (ObjectBase * i, children_) foreach (ObjectBase * i, children_)
i->buildTransform(); i->buildTransform();
setMeshChanged(); setObjectsChanged();
} }
@@ -400,26 +399,26 @@ void ObjectBase::localTransform(QMatrix4x4 & m) {
} }
void ObjectBase::checkPass() {
pass_ = Solid;
if (material_) {
if (material_->hasTransparency())
pass_ = Transparent;
}
}
void ObjectBase::setSceneTreeChanged() { void ObjectBase::setSceneTreeChanged() {
if (scene_) { if (scene_) {
scene_->setTreeChanged(); scene_->setTreeChanged();
scene_->setTreeStructChanged(); scene_->setTreeStructChanged();
} }
setMeshChanged(); setObjectsChanged();
} }
void ObjectBase::setMeshChanged() { void ObjectBase::setObjectsChanged() {
if (mesh_) mesh_->objects_changed = true; int p = pass();
if (mesh_) {
mesh_->setObjectsChanged (p, true);
mesh_->setSelectionChanged(p, true);
if (prev_pass != p) {
mesh_->setObjectsChanged (prev_pass, true);
mesh_->setSelectionChanged(prev_pass, true);
}
}
prev_pass = p;
} }

View File

@@ -38,7 +38,6 @@ class ObjectBase
friend QDataStream & operator >>(QDataStream & s, Scene *& p); friend QDataStream & operator >>(QDataStream & s, Scene *& p);
public: public:
enum Type {glMesh, glLight, glCamera, glParticlesSystem}; enum Type {glMesh, glLight, glCamera, glParticlesSystem};
enum Pass {Solid, Transparent, Reflection, User};
enum RenderMode {View = 0, Point = GL_POINT, Line = GL_LINE, Fill = GL_FILL}; enum RenderMode {View = 0, Point = GL_POINT, Line = GL_LINE, Fill = GL_FILL};
explicit ObjectBase(Mesh * geom = 0, Material * mat = 0); explicit ObjectBase(Mesh * geom = 0, Material * mat = 0);
@@ -49,12 +48,11 @@ public:
QString name() const {return name_;} QString name() const {return name_;}
void setName(const QString & name) {name_ = name;} void setName(const QString & name) {name_ = name;}
//virtual GLuint hList() {return list;}
virtual void init(); virtual void init();
virtual void update() {} virtual void update() {}
bool isInit() const {return is_init;} bool isInit() const {return is_init;}
bool isTexturesLoaded() const {return is_tex_loaded;}
Type type() const {return type_;} Type type() const {return type_;}
RenderPass pass() const;
RenderMode renderMode() const {return render_mode;} RenderMode renderMode() const {return render_mode;}
void setRenderMode(RenderMode mode) {render_mode = mode;} void setRenderMode(RenderMode mode) {render_mode = mode;}
@@ -77,7 +75,7 @@ public:
ObjectBase * child(const QString & name); ObjectBase * child(const QString & name);
const ObjectBase * child(int index) const; const ObjectBase * child(int index) const;
const ObjectBase * child(const QString & name) const; const ObjectBase * child(const QString & name) const;
QList<ObjectBase * > children(bool all_ = false); ObjectBaseList children(bool all_ = false);
bool isVisible(bool check_parents = false) const; bool isVisible(bool check_parents = false) const;
bool isHidden(bool check_parents = false) const {return !isVisible(check_parents);} bool isHidden(bool check_parents = false) const {return !isVisible(check_parents);}
@@ -196,19 +194,16 @@ public:
protected: protected:
virtual void transformChanged() {} virtual void transformChanged() {}
void addChildren(QList<ObjectBase * > & list, ObjectBase * where); void addChildren(ObjectBaseList & list, ObjectBase * where);
void loadTextures(bool with_children = false);
//void deleteTextures() {foreach (GLuint i, textures) currentQGLView->deleteTexture(i); textures.clear();}
void buildTransform(); void buildTransform();
void initInternal(); void initInternal();
void checkPass();
void setSceneTreeChanged(); void setSceneTreeChanged();
void setMeshChanged(); void setObjectsChanged();
virtual void localTransform(QMatrix4x4 & m); virtual void localTransform(QMatrix4x4 & m);
QMatrix4x4 worldMatrix(QMatrix4x4 parent) const; QMatrix4x4 worldMatrix(QMatrix4x4 parent) const;
int pass_; // Pass int prev_pass; // Pass
bool is_init, is_tex_loaded, accept_light, accept_fog, /*write_depth_,*/ visible_, cast_shadow, rec_shadow, select_, selected_, raw_matrix; bool is_init, accept_light, accept_fog, visible_, cast_shadow, rec_shadow, select_, selected_, raw_matrix;
bool is_root, selected_aim; bool is_root, selected_aim;
float line_width; float line_width;
QColor color_; QColor color_;
@@ -217,7 +212,7 @@ protected:
RenderMode render_mode; RenderMode render_mode;
Box3D bound; Box3D bound;
Transform trans; Transform trans;
QList<ObjectBase * > children_; ObjectBaseList children_;
QMatrix4x4 itransform_, mat_; QMatrix4x4 itransform_, mat_;
QString name_; QString name_;
GLenum blend_src, blend_dest; GLenum blend_src, blend_dest;
@@ -309,6 +304,6 @@ 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 QList<ObjectBase*> light2objectList(const QList<Light*> & v) {QList<ObjectBase*> ret; foreach (Light*i, v) ret << (ObjectBase*)i; return ret;} inline ObjectBaseList light2objectList(const QList<Light*> & v) {ObjectBaseList ret; foreach (Light*i, v) ret << (ObjectBase*)i; return ret;}
#endif // GLOBJECT_H #endif // GLOBJECT_H

View File

@@ -221,7 +221,6 @@ void GLRendererBase::renderShadow(Light * l, QOpenGLShaderProgram * prog, QMatri
l->dir1 = cam.direction() - rdir;*/ l->dir1 = cam.direction() - rdir;*/
//qDebug() << rdir << l->dir0 << l->dir1; //qDebug() << rdir << l->dir0 << l->dir1;
RenderingParameters rpl; RenderingParameters rpl;
rpl.pass = ObjectBase::Solid;
rpl.shaders = prog; rpl.shaders = prog;
rpl.textures = rpl.light = rpl.fog = false; rpl.textures = rpl.light = rpl.fog = false;
//rpl.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX); //rpl.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);

View File

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

View File

@@ -62,7 +62,7 @@ public:
void assignFrom(const Scene * s); void assignFrom(const Scene * s);
int objectsCount(bool all = false); int objectsCount(bool all = false);
QList<ObjectBase * > objects(bool all = false); ObjectBaseList objects(bool all = false);
ObjectBase * rootObject() {return root_;} ObjectBase * rootObject() {return root_;}
void removeObject(ObjectBase * o, bool inChildren = true); void removeObject(ObjectBase * o, bool inChildren = true);
void removeObject(ObjectBase & o, bool inChildren = true); void removeObject(ObjectBase & o, bool inChildren = true);
@@ -71,11 +71,11 @@ public:
SelectionMode selectionMode() const {return sel_mode_;} SelectionMode selectionMode() const {return sel_mode_;}
void setSelectionMode(SelectionMode mode) {sel_mode_ = mode;} void setSelectionMode(SelectionMode mode) {sel_mode_ = mode;}
void selectObject(ObjectBase * o, bool add_to_selection = false); void selectObject(ObjectBase * o, bool add_to_selection = false);
void selectObjects(QList<ObjectBase * > ol, bool add_to_selection = false); void selectObjects(ObjectBaseList ol, bool add_to_selection = false);
void selectObjectsByMesh(); void selectObjectsByMesh();
void selectObjectsByMaterial(); void selectObjectsByMaterial();
void clearSelection(); void clearSelection();
QList<ObjectBase * > selectedObjects(bool top_only = false) const; ObjectBaseList selectedObjects(bool top_only = false) const;
ObjectBase * selectedObject() const; ObjectBase * selectedObject() const;
const Box3D & boundingBox() const; const Box3D & boundingBox() const;
@@ -115,12 +115,12 @@ protected:
QVector<Mesh*> geometries; QVector<Mesh*> geometries;
QVector<Material*> materials; QVector<Material*> materials;
QMap<Mesh*, QList<ObjectBase*> > geometries_used; 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
QVector<Material*> changed_materials; QVector<Material*> changed_materials;
SelectionMode sel_mode_; SelectionMode sel_mode_;
QList<ObjectBase*> selected_, selected_top; ObjectBaseList selected_, selected_top;
protected slots: protected slots:

View File

@@ -107,7 +107,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
QPoint cpos = e->pos(); QPoint cpos = e->pos();
if (cur_action != RendererService::haNoAction && (e->buttons() == Qt::LeftButton)) { if (cur_action != RendererService::haNoAction && (e->buttons() == Qt::LeftButton)) {
RendererService & rs(view->renderer_.rend_service); RendererService & rs(view->renderer_.rend_service);
QList<ObjectBase*> objects = view->scene_->selectedObjects(true); ObjectBaseList objects = view->scene_->selectedObjects(true);
QVector<int> axis; QVector<int> axis;
switch (cur_action) { switch (cur_action) {
case RendererService::haMove: case RendererService::haMove:

View File

@@ -124,7 +124,7 @@ void QGLView::start(float freq) {
QList<Light * > QGLView::selectedLights() const { QList<Light * > QGLView::selectedLights() const {
QList<Light * > ret; QList<Light * > ret;
QList<ObjectBase*> sol = scene_->selectedObjects(); ObjectBaseList sol = scene_->selectedObjects();
foreach (ObjectBase * o, sol) foreach (ObjectBase * o, sol)
if (o->type() == ObjectBase::glLight) if (o->type() == ObjectBase::glLight)
ret << (Light*)o; ret << (Light*)o;
@@ -134,7 +134,7 @@ QList<Light * > QGLView::selectedLights() const {
QList<Camera * > QGLView::selectedCameras() const { QList<Camera * > QGLView::selectedCameras() const {
QList<Camera * > ret; QList<Camera * > ret;
QList<ObjectBase*> sol = scene_->selectedObjects(); ObjectBaseList sol = scene_->selectedObjects();
foreach (ObjectBase * o, sol) foreach (ObjectBase * o, sol)
if (o->type() == ObjectBase::glCamera) if (o->type() == ObjectBase::glCamera)
ret << (Camera*)o; ret << (Camera*)o;

View File

@@ -151,7 +151,7 @@ public:
void selectObject(ObjectBase * o, bool add_to_selection = false) {scene_->selectObject(o, add_to_selection);} void selectObject(ObjectBase * o, bool add_to_selection = false) {scene_->selectObject(o, add_to_selection);}
void clearSelection() {scene_->clearSelection();} void clearSelection() {scene_->clearSelection();}
QList<ObjectBase * > selectedObjects(bool top_only = false) const {return scene_->selectedObjects(top_only);} ObjectBaseList selectedObjects(bool top_only = false) const {return scene_->selectedObjects(top_only);}
QList<Light * > selectedLights() const; QList<Light * > selectedLights() const;
QList<Camera * > selectedCameras() const; QList<Camera * > selectedCameras() const;
ObjectBase * selectedObject() const {return scene_->selectedObject();} ObjectBase * selectedObject() const {return scene_->selectedObject();}

View File

@@ -254,7 +254,7 @@ void QGLViewWindow::on_pushButton_clicked() {
void QGLViewWindow::on_pushButton_3_clicked() { void QGLViewWindow::on_pushButton_3_clicked() {
/*QList<ObjectBase * > ol = view->view()->objects(true); /*ObjectBaseList ol = view->view()->objects(true);
qDebug() << ol.size(); qDebug() << ol.size();
foreach (ObjectBase * i, ol) { foreach (ObjectBase * i, ol) {
//i->VBO().rebuffer(); //i->VBO().rebuffer();

View File

@@ -172,7 +172,7 @@ void Renderer::releaseShader() {
} }
void Renderer::fillObjectsBuffer(const QList<ObjectBase *> & ol, RenderPass pass) { void Renderer::fillObjectsBuffer(const ObjectBaseList & ol, RenderPass pass) {
cur_objects_.resize(ol.size()); cur_objects_.resize(ol.size());
for (int i = 0; i < ol.size(); ++i) { for (int i = 0; i < ol.size(); ++i) {
Object & so(cur_objects_[i]); Object & so(cur_objects_[i]);
@@ -195,23 +195,26 @@ void Renderer::fillObjectsBuffer(const QList<ObjectBase *> & ol, RenderPass pass
void Renderer::renderObjects(Scene & scene, RenderPass pass) { void Renderer::renderObjects(Scene & scene, RenderPass pass) {
QOpenGLExtraFunctions * f = view; QOpenGLExtraFunctions * f = view;
QMapIterator<Mesh*, QList<ObjectBase*> > it(scene.geometries_used); QMapIterator<Mesh*, ObjectBaseList> it(scene.geometries_used[pass]);
bool emit_pos_change = false; bool emit_pos_change = false;
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
Mesh * mesh = it.key(); Mesh * mesh = it.key();
if (mesh->objects_changed) { if (mesh->isObjectsChanged(pass)) {
mesh->objects_changed = false; mesh->setObjectsChanged(pass, false);
emit_pos_change = true; emit_pos_change = true;
fillObjectsBuffer(it.value(), pass); fillObjectsBuffer(it.value(), pass);
mesh->loadObjects(f, cur_objects_); //qDebug() << "loadObjects" << pass << cur_objects_.size();
mesh->loadObjects(f, cur_objects_, pass);
} }
if (mesh->selected_changed && edit_mode) { if (mesh->isSelectionChanged(pass) && edit_mode) {
mesh->selected_changed = false; mesh->setSelectionChanged(pass, false);
fillSelectionsBuffer(rend_selection.cur_selections_, it.value()); fillSelectionsBuffer(rend_selection.cur_selections_, it.value());
mesh->loadSelections(f, rend_selection.cur_selections_); //qDebug() << "fillSelectionsBuffer" << pass << rend_selection.cur_selections_.size();
mesh->loadSelections(f, rend_selection.cur_selections_, pass);
} }
mesh->draw(f, it.value().size()); //qDebug() << "draw" << pass << it.value().size();
mesh->draw(f, it.value().size(), pass);
} }
if (emit_pos_change) emit view->objectsPositionChanged(); if (emit_pos_change) emit view->objectsPositionChanged();
} }

View File

@@ -34,13 +34,6 @@ class Renderer: public RendererBase {
friend class RendererService; friend class RendererService;
friend class RendererSelection; friend class RendererSelection;
friend class TonemappingProc; friend class TonemappingProc;
enum RenderPass {
rpSolid,
rpTransparent,
rpSelection,
rpShadow,
rpNoProc,
};
enum ShaderRole { enum ShaderRole {
// Selection // Selection
srSelectionFill, srSelectionFill,
@@ -89,7 +82,7 @@ public:
void recreateMaterialThumbnails(bool force_all = false) {rend_mat.recreateMaterialThumbnails(force_all);} void recreateMaterialThumbnails(bool force_all = false) {rend_mat.recreateMaterialThumbnails(force_all);}
protected: protected:
void fillObjectsBuffer(const QList<ObjectBase*> & ol, RenderPass pass); void fillObjectsBuffer(const ObjectBaseList & ol, RenderPass pass);
void reloadObjects(); void reloadObjects();
void renderObjects(Scene & scene, RenderPass pass); void renderObjects(Scene & scene, RenderPass pass);

View File

@@ -123,7 +123,7 @@ void RendererBase::setUniformViewCorners(QOpenGLShaderProgram * prog, Camera * c
} }
void RendererBase::fillSelectionsBuffer(QVector<uchar> & buffer, const QList<ObjectBase *> & ol) { void RendererBase::fillSelectionsBuffer(QVector<uchar> & buffer, const ObjectBaseList & ol) {
buffer.resize(ol.size()); buffer.resize(ol.size());
for (int i = 0; i < ol.size(); ++i) { for (int i = 0; i < ol.size(); ++i) {
buffer[i] = (ol[i]->isSelected(true) ? 1 : 0); buffer[i] = (ol[i]->isSelected(true) ? 1 : 0);

View File

@@ -36,7 +36,7 @@ protected:
void setUniformMaps (QOpenGLShaderProgram * prog); void setUniformMaps (QOpenGLShaderProgram * prog);
void setUniformCamera (QOpenGLShaderProgram * prog, Camera * cam, bool matrices = true, QSize viewport = QSize()); void setUniformCamera (QOpenGLShaderProgram * prog, Camera * cam, bool matrices = true, QSize viewport = QSize());
void setUniformViewCorners(QOpenGLShaderProgram * prog, Camera * cam, QSize viewport = QSize()); void setUniformViewCorners(QOpenGLShaderProgram * prog, Camera * cam, QSize viewport = QSize());
void fillSelectionsBuffer(QVector<uchar> & buffer, const QList<ObjectBase *> & ol); void fillSelectionsBuffer(QVector<uchar> & buffer, const ObjectBaseList & ol);
void fillSelectionsBuffer(QVector<uchar> & buffer, bool yes, int size); void fillSelectionsBuffer(QVector<uchar> & buffer, bool yes, int size);
void reloadMaterials(Scene & scene); void reloadMaterials(Scene & scene);
void reloadLightsParameters(const QMap<int, QList<Light*>> & lights); void reloadLightsParameters(const QMap<int, QList<Light*>> & lights);

View File

@@ -58,23 +58,26 @@ void RendererSelection::resize(int width, int height) {
void RendererSelection::generateObjectsID(Scene & scene) { void RendererSelection::generateObjectsID(Scene & scene) {
ids.clear(); ids.clear();
aim_ids.clear(); aim_ids.clear();
QMapIterator<Mesh*, QList<ObjectBase*> > it(scene.geometries_used); QList<int> passes = scene.geometries_used.keys();
while (it.hasNext()) { foreach (int p, passes) {
it.next(); QMapIterator<Mesh*, ObjectBaseList> it(scene.geometries_used[p]);
foreach (ObjectBase * o, it.value()) { while (it.hasNext()) {
uint id = qHash(o); it.next();
ids[id] = o; foreach (ObjectBase * o, it.value()) {
o->id_ = id; uint id = qHash(o);
ids[id] = o;
o->id_ = id;
}
} }
} QMapIterator<int, QList<Light*>> lit(scene.lights_used);
QMapIterator<int, QList<Light*>> lit(scene.lights_used); while (lit.hasNext()) {
while (lit.hasNext()) { lit.next();
lit.next(); foreach (ObjectBase * o, lit.value()) {
foreach (ObjectBase * o, lit.value()) { uint id = qHash(o);
uint id = qHash(o); ids[id] = o;
ids[id] = o; aim_ids[id + 1] = o;
aim_ids[id + 1] = o; o->id_ = id;
o->id_ = id; }
} }
} }
} }
@@ -121,7 +124,8 @@ void RendererSelection::renderSelection(Scene & scene) {
glEnableDepth(); glEnableDepth();
glClearFramebuffer(QColor(0,0,0,0)); glClearFramebuffer(QColor(0,0,0,0));
r->setUniformCamera(prog, view->camera()); r->setUniformCamera(prog, view->camera());
r->renderObjects(scene, Renderer::rpSelection); r->renderObjects(scene, rpSolid);
r->renderObjects(scene, rpTransparent);
view->glClear(GL_DEPTH_BUFFER_BIT); view->glClear(GL_DEPTH_BUFFER_BIT);
RendererService & rs(r->rend_service); RendererService & rs(r->rend_service);

View File

@@ -237,7 +237,7 @@ void RendererService::fillHandleObjects(QVector3D center, HandleMesh ids[], cons
bool RendererService::calculateCenter() { bool RendererService::calculateCenter() {
QList<ObjectBase*> sol = r->view->scene()->selectedObjects(true); ObjectBaseList sol = r->view->scene()->selectedObjects(true);
if (sol.isEmpty()) return false; if (sol.isEmpty()) return false;
selection_center = sol[0]->worldPos(); selection_center = sol[0]->worldPos();
if (sol.size() > 1) { if (sol.size() > 1) {

View File

@@ -172,7 +172,7 @@ void MaterialsEditor::on_buttonDelete_clicked() {
void MaterialsEditor::on_buttonAssign_clicked() { void MaterialsEditor::on_buttonAssign_clicked() {
if (!view) return; if (!view) return;
Material * m = currentMaterial(); Material * m = currentMaterial();
QList<ObjectBase*> ol = view->selectedObjects(); ObjectBaseList ol = view->selectedObjects();
foreach (ObjectBase * o, ol) foreach (ObjectBase * o, ol)
o->setMaterial(m, true); o->setMaterial(m, true);
} }
@@ -180,7 +180,7 @@ void MaterialsEditor::on_buttonAssign_clicked() {
void MaterialsEditor::on_buttonUnset_clicked() { void MaterialsEditor::on_buttonUnset_clicked() {
if (!view) return; if (!view) return;
QList<ObjectBase*> ol = view->selectedObjects(); ObjectBaseList ol = view->selectedObjects();
foreach (ObjectBase * o, ol) foreach (ObjectBase * o, ol)
o->setMaterial(0, true); o->setMaterial(0, true);
} }

View File

@@ -91,7 +91,7 @@ void ObjectEditor::selectionChanged() {
} }
ui->widgetMain->setEnabled(false); ui->widgetMain->setEnabled(false);
if (!view) return; if (!view) return;
QList<ObjectBase*> sol = view->selectedObjects(true); ObjectBaseList sol = view->selectedObjects(true);
if (sol.isEmpty()) { if (sol.isEmpty()) {
ui->labelTitle->setText(tr("[No selected]")); ui->labelTitle->setText(tr("[No selected]"));
return; return;
@@ -188,7 +188,7 @@ void ObjectEditor::on_comboLightType_currentIndexChanged(int index) {
void ObjectEditor::on_buttonColor_colorChanged(const QColor & v) { void ObjectEditor::on_buttonColor_colorChanged(const QColor & v) {
if (!view || !active) return; if (!view || !active) return;
QList<ObjectBase*> sol = view->selectedObjects(); ObjectBaseList sol = view->selectedObjects();
foreach (ObjectBase * o, sol) foreach (ObjectBase * o, sol)
o->setColor(v); o->setColor(v);
QList<Light*> sll = view->selectedLights(); QList<Light*> sll = view->selectedLights();
@@ -199,7 +199,7 @@ void ObjectEditor::on_buttonColor_colorChanged(const QColor & v) {
void ObjectEditor::spinChanged(double v) { void ObjectEditor::spinChanged(double v) {
if (!view || !active) return; if (!view || !active) return;
QList<ObjectBase*> sol = view->selectedObjects(true); ObjectBaseList sol = view->selectedObjects(true);
QObject * s = sender(); QObject * s = sender();
foreach (ObjectBase * o, sol) { foreach (ObjectBase * o, sol) {
if (s == ui->spinPosX ) o->setPosX (v); if (s == ui->spinPosX ) o->setPosX (v);
@@ -249,7 +249,7 @@ void ObjectEditor::spinCameraChanged(double v) {
void ObjectEditor::checkChanged(bool v) { void ObjectEditor::checkChanged(bool v) {
if (!view || !active) return; if (!view || !active) return;
QList<ObjectBase*> sol = view->selectedObjects(); ObjectBaseList sol = view->selectedObjects();
QList<Camera*> scl = view->selectedCameras(); QList<Camera*> scl = view->selectedCameras();
QObject * s = sender(); QObject * s = sender();
foreach (ObjectBase * o, sol) { foreach (ObjectBase * o, sol) {

View File

@@ -266,7 +266,7 @@ void SceneTree::treeObjects_selectionCnahged() {
if (block_tree || !view) return; if (block_tree || !view) return;
block_tree = true; block_tree = true;
view->scene()->clearSelection(); view->scene()->clearSelection();
QList<ObjectBase*> sol; ObjectBaseList sol;
QList<QTreeWidgetItem*> til = ui->treeObjects->selectedItems(); QList<QTreeWidgetItem*> til = ui->treeObjects->selectedItems();
foreach (QTreeWidgetItem * i, til) foreach (QTreeWidgetItem * i, til)
sol << itemObject(i); sol << itemObject(i);
@@ -361,7 +361,7 @@ void SceneTree::on_actionAdd_camera_triggered() {
void SceneTree::on_actionClone_triggered() { void SceneTree::on_actionClone_triggered() {
if (!view) return; if (!view) return;
QList<QTreeWidgetItem*> sil = ui->treeObjects->selectedItems(); QList<QTreeWidgetItem*> sil = ui->treeObjects->selectedItems();
QList<ObjectBase*> col; ObjectBaseList col;
foreach (QTreeWidgetItem * i, sil) { foreach (QTreeWidgetItem * i, sil) {
ObjectBase * o = itemObject(i); ObjectBase * o = itemObject(i);
if (!o) continue; if (!o) continue;
@@ -375,7 +375,7 @@ void SceneTree::on_actionClone_triggered() {
void SceneTree::on_actionGroup_triggered() { void SceneTree::on_actionGroup_triggered() {
if (!view) return; if (!view) return;
QList<ObjectBase*> sol = view->scene()->selectedObjects(true); ObjectBaseList sol = view->scene()->selectedObjects(true);
ObjectBase * cp = sol[0]->parent(); ObjectBase * cp = sol[0]->parent();
ObjectBase * nr = new ObjectBase(); ObjectBase * nr = new ObjectBase();
cp->addChild(nr); cp->addChild(nr);
@@ -387,7 +387,7 @@ void SceneTree::on_actionGroup_triggered() {
void SceneTree::on_actionSelect_parent_triggered() { void SceneTree::on_actionSelect_parent_triggered() {
if (!view) return; if (!view) return;
QList<ObjectBase*> sol = view->scene()->selectedObjects(true); ObjectBaseList sol = view->scene()->selectedObjects(true);
QSet<ObjectBase*> nsl; QSet<ObjectBase*> nsl;
foreach (ObjectBase * o, sol) { foreach (ObjectBase * o, sol) {
ObjectBase * po = o->parent(); ObjectBase * po = o->parent();
@@ -424,7 +424,7 @@ void SceneTree::focusObjects() {
if (!view) return; if (!view) return;
if (!view->camera()) return; if (!view->camera()) return;
Box3D bb; Box3D bb;
QList<ObjectBase*> ol = view->selectedObjects(); ObjectBaseList ol = view->selectedObjects();
foreach (ObjectBase * o, ol) { foreach (ObjectBase * o, ol) {
o->calculateBoundingBox(); o->calculateBoundingBox();
bb |= o->boundingBox(); bb |= o->boundingBox();