git-svn-id: svn://db.shs.com.ru/libs@665 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -30,7 +30,7 @@ Mesh::Mesh(GLenum geom_type_): geom_type(geom_type_),
|
||||
buffer_geom(GL_ARRAY_BUFFER, GL_STATIC_DRAW),
|
||||
buffer_ind (GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW) {
|
||||
hash_ = 0;
|
||||
changed = hash_changed = objects_changed = selected_changed = true;
|
||||
changed = hash_changed = true;
|
||||
//qDebug() << "Mesh, now" << ++_count;
|
||||
}
|
||||
|
||||
@@ -189,14 +189,14 @@ void Mesh::draw(QOpenGLExtraFunctions * f, int count, int type) {
|
||||
|
||||
|
||||
void Mesh::clear() {
|
||||
vertices_.clear();
|
||||
normals_.clear();
|
||||
tangents_.clear();
|
||||
vertices_ .clear();
|
||||
normals_ .clear();
|
||||
tangents_ .clear();
|
||||
bitangents_.clear();
|
||||
texcoords_.clear();
|
||||
triangles_.clear();
|
||||
lines_.clear();
|
||||
data_.clear();
|
||||
texcoords_ .clear();
|
||||
triangles_ .clear();
|
||||
lines_ .clear();
|
||||
data_ .clear();
|
||||
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) {
|
||||
QMatrix4x4 m;
|
||||
m.translate(dp);
|
||||
|
||||
@@ -54,6 +54,13 @@ public:
|
||||
bool isEmpty() const {return vertices_.isEmpty();}
|
||||
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> & normals () {changed = hash_changed = true; return normals_;}
|
||||
QVector<QVector2D> & texcoords() {changed = hash_changed = true; return texcoords_;}
|
||||
@@ -92,7 +99,7 @@ private:
|
||||
mutable uint hash_;
|
||||
mutable bool hash_changed;
|
||||
int vert_count;
|
||||
bool changed, objects_changed, selected_changed;
|
||||
bool changed;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -185,6 +185,12 @@ class RendererMaterial;
|
||||
class RendererService;
|
||||
class RendererSelection;
|
||||
|
||||
enum RenderPass {
|
||||
rpSolid,
|
||||
rpTransparent,
|
||||
};
|
||||
|
||||
typedef QList<ObjectBase*> ObjectBaseList;
|
||||
|
||||
struct Box3D {
|
||||
GLfloat x;
|
||||
|
||||
@@ -28,6 +28,7 @@ VertexObject::VertexObject():
|
||||
buffer_sel (GL_ARRAY_BUFFER, GL_STREAM_DRAW) {
|
||||
vao_ = 0;
|
||||
buffers_binded = false;
|
||||
objects_changed = selected_changed = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -46,12 +46,17 @@ public:
|
||||
GLuint ID() const {return vao_;}
|
||||
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:
|
||||
void loadBuffer(QOpenGLExtraFunctions * f, Buffer & buf, const void * data, int size);
|
||||
|
||||
GLuint vao_;
|
||||
Buffer buffer_obj, buffer_sel;
|
||||
bool buffers_binded;
|
||||
bool buffers_binded, objects_changed, selected_changed;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ Scene * loadScene(const QString & filepath) {
|
||||
ObjectBase * root = assimpObject(ais->mRootNode, meshes, light_by_name, out_lights);
|
||||
if (!root) return 0;
|
||||
|
||||
QList<ObjectBase*> rcl = root->children(true);
|
||||
ObjectBaseList rcl = root->children(true);
|
||||
foreach (ObjectBase * c, rcl) {
|
||||
foreach (Light * l, out_lights) {
|
||||
if (c->name() == (l->name() + ".Target")) {
|
||||
|
||||
@@ -26,10 +26,10 @@ static int _count = 0;
|
||||
ObjectBase::ObjectBase(Mesh * geom, Material * mat) {
|
||||
type_ = glMesh;
|
||||
render_mode = View;
|
||||
pass_ = Solid;
|
||||
prev_pass = rpSolid;
|
||||
parent_ = nullptr;
|
||||
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;
|
||||
line_width = -1.;
|
||||
id_ = 0;
|
||||
@@ -61,7 +61,7 @@ ObjectBase::~ObjectBase() {
|
||||
|
||||
ObjectBase * ObjectBase::clone(bool withChildren) {
|
||||
ObjectBase * o = new ObjectBase();
|
||||
o->pass_ = pass_;
|
||||
o->prev_pass = prev_pass;
|
||||
o->is_init = false;
|
||||
o->accept_light = accept_light;
|
||||
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) {
|
||||
scene_ = v;
|
||||
foreach (ObjectBase * c, children_)
|
||||
@@ -118,7 +127,7 @@ void ObjectBase::addChild(ObjectBase * o) {
|
||||
o->setScene(scene_);
|
||||
o->buildTransform();
|
||||
/*if (scene_) {
|
||||
QList<ObjectBase*> cl = o->children(true);
|
||||
ObjectBaseList cl = o->children(true);
|
||||
cl << o;
|
||||
//foreach (ObjectBase * i, cl) {
|
||||
// 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_;
|
||||
QList<ObjectBase * > cl;
|
||||
ObjectBaseList cl;
|
||||
addChildren(cl, this);
|
||||
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_) {
|
||||
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() {
|
||||
bound = Box3D();
|
||||
if (mesh_) {
|
||||
@@ -349,9 +350,7 @@ void ObjectBase::setMaterial(Material * m, bool with_children) {
|
||||
material_ = m;
|
||||
if (with_children)
|
||||
foreach (ObjectBase * i, children_) i->setMaterial(m, true);
|
||||
checkPass();
|
||||
is_tex_loaded = false;
|
||||
setMeshChanged();
|
||||
setObjectsChanged();
|
||||
if (scene_) scene_->mat_changed = true;
|
||||
}
|
||||
|
||||
@@ -360,14 +359,14 @@ void ObjectBase::setColor(QColor c, bool with_children) {
|
||||
color_ = c;
|
||||
if (with_children)
|
||||
foreach (ObjectBase * i, children_) i->setColor(c, true);
|
||||
setMeshChanged();
|
||||
setObjectsChanged();
|
||||
}
|
||||
|
||||
|
||||
void ObjectBase::setMesh(Mesh * v) {
|
||||
mesh_ = v;
|
||||
setSceneTreeChanged();
|
||||
setMeshChanged();
|
||||
setObjectsChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -385,7 +384,7 @@ void ObjectBase::buildTransform() {
|
||||
//qDebug() << name_ << itransform_;
|
||||
foreach (ObjectBase * i, children_)
|
||||
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() {
|
||||
if (scene_) {
|
||||
scene_->setTreeChanged();
|
||||
scene_->setTreeStructChanged();
|
||||
}
|
||||
setMeshChanged();
|
||||
setObjectsChanged();
|
||||
}
|
||||
|
||||
|
||||
void ObjectBase::setMeshChanged() {
|
||||
if (mesh_) mesh_->objects_changed = true;
|
||||
void ObjectBase::setObjectsChanged() {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@ class ObjectBase
|
||||
friend QDataStream & operator >>(QDataStream & s, Scene *& p);
|
||||
public:
|
||||
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};
|
||||
|
||||
explicit ObjectBase(Mesh * geom = 0, Material * mat = 0);
|
||||
@@ -49,12 +48,11 @@ public:
|
||||
|
||||
QString name() const {return name_;}
|
||||
void setName(const QString & name) {name_ = name;}
|
||||
//virtual GLuint hList() {return list;}
|
||||
virtual void init();
|
||||
virtual void update() {}
|
||||
bool isInit() const {return is_init;}
|
||||
bool isTexturesLoaded() const {return is_tex_loaded;}
|
||||
Type type() const {return type_;}
|
||||
RenderPass pass() const;
|
||||
|
||||
RenderMode renderMode() const {return render_mode;}
|
||||
void setRenderMode(RenderMode mode) {render_mode = mode;}
|
||||
@@ -77,7 +75,7 @@ public:
|
||||
ObjectBase * child(const QString & name);
|
||||
const ObjectBase * child(int index) 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 isHidden(bool check_parents = false) const {return !isVisible(check_parents);}
|
||||
@@ -196,19 +194,16 @@ public:
|
||||
|
||||
protected:
|
||||
virtual void transformChanged() {}
|
||||
void addChildren(QList<ObjectBase * > & list, ObjectBase * where);
|
||||
void loadTextures(bool with_children = false);
|
||||
//void deleteTextures() {foreach (GLuint i, textures) currentQGLView->deleteTexture(i); textures.clear();}
|
||||
void addChildren(ObjectBaseList & list, ObjectBase * where);
|
||||
void buildTransform();
|
||||
void initInternal();
|
||||
void checkPass();
|
||||
void setSceneTreeChanged();
|
||||
void setMeshChanged();
|
||||
void setObjectsChanged();
|
||||
virtual void localTransform(QMatrix4x4 & m);
|
||||
QMatrix4x4 worldMatrix(QMatrix4x4 parent) const;
|
||||
|
||||
int pass_; // Pass
|
||||
bool is_init, is_tex_loaded, accept_light, accept_fog, /*write_depth_,*/ visible_, cast_shadow, rec_shadow, select_, selected_, raw_matrix;
|
||||
int prev_pass; // Pass
|
||||
bool is_init, accept_light, accept_fog, visible_, cast_shadow, rec_shadow, select_, selected_, raw_matrix;
|
||||
bool is_root, selected_aim;
|
||||
float line_width;
|
||||
QColor color_;
|
||||
@@ -217,7 +212,7 @@ protected:
|
||||
RenderMode render_mode;
|
||||
Box3D bound;
|
||||
Transform trans;
|
||||
QList<ObjectBase * > children_;
|
||||
ObjectBaseList children_;
|
||||
QMatrix4x4 itransform_, mat_;
|
||||
QString name_;
|
||||
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, 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
|
||||
|
||||
@@ -221,7 +221,6 @@ void GLRendererBase::renderShadow(Light * l, QOpenGLShaderProgram * prog, QMatri
|
||||
l->dir1 = cam.direction() - rdir;*/
|
||||
//qDebug() << rdir << l->dir0 << l->dir1;
|
||||
RenderingParameters rpl;
|
||||
rpl.pass = ObjectBase::Solid;
|
||||
rpl.shaders = prog;
|
||||
rpl.textures = rpl.light = rpl.fog = false;
|
||||
//rpl.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
void assignFrom(const Scene * s);
|
||||
|
||||
int objectsCount(bool all = false);
|
||||
QList<ObjectBase * > objects(bool all = false);
|
||||
ObjectBaseList objects(bool all = false);
|
||||
ObjectBase * rootObject() {return root_;}
|
||||
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_;}
|
||||
void setSelectionMode(SelectionMode mode) {sel_mode_ = mode;}
|
||||
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 selectObjectsByMaterial();
|
||||
void clearSelection();
|
||||
QList<ObjectBase * > selectedObjects(bool top_only = false) const;
|
||||
ObjectBaseList selectedObjects(bool top_only = false) const;
|
||||
ObjectBase * selectedObject() const;
|
||||
|
||||
const Box3D & boundingBox() const;
|
||||
@@ -115,12 +115,12 @@ protected:
|
||||
QVector<Mesh*> geometries;
|
||||
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
|
||||
QVector<Material*> changed_materials;
|
||||
|
||||
SelectionMode sel_mode_;
|
||||
QList<ObjectBase*> selected_, selected_top;
|
||||
ObjectBaseList selected_, selected_top;
|
||||
|
||||
protected slots:
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
||||
QPoint cpos = e->pos();
|
||||
if (cur_action != RendererService::haNoAction && (e->buttons() == Qt::LeftButton)) {
|
||||
RendererService & rs(view->renderer_.rend_service);
|
||||
QList<ObjectBase*> objects = view->scene_->selectedObjects(true);
|
||||
ObjectBaseList objects = view->scene_->selectedObjects(true);
|
||||
QVector<int> axis;
|
||||
switch (cur_action) {
|
||||
case RendererService::haMove:
|
||||
|
||||
@@ -124,7 +124,7 @@ void QGLView::start(float freq) {
|
||||
|
||||
QList<Light * > QGLView::selectedLights() const {
|
||||
QList<Light * > ret;
|
||||
QList<ObjectBase*> sol = scene_->selectedObjects();
|
||||
ObjectBaseList sol = scene_->selectedObjects();
|
||||
foreach (ObjectBase * o, sol)
|
||||
if (o->type() == ObjectBase::glLight)
|
||||
ret << (Light*)o;
|
||||
@@ -134,7 +134,7 @@ QList<Light * > QGLView::selectedLights() const {
|
||||
|
||||
QList<Camera * > QGLView::selectedCameras() const {
|
||||
QList<Camera * > ret;
|
||||
QList<ObjectBase*> sol = scene_->selectedObjects();
|
||||
ObjectBaseList sol = scene_->selectedObjects();
|
||||
foreach (ObjectBase * o, sol)
|
||||
if (o->type() == ObjectBase::glCamera)
|
||||
ret << (Camera*)o;
|
||||
|
||||
@@ -151,7 +151,7 @@ public:
|
||||
|
||||
void selectObject(ObjectBase * o, bool add_to_selection = false) {scene_->selectObject(o, add_to_selection);}
|
||||
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<Camera * > selectedCameras() const;
|
||||
ObjectBase * selectedObject() const {return scene_->selectedObject();}
|
||||
|
||||
@@ -254,7 +254,7 @@ void QGLViewWindow::on_pushButton_clicked() {
|
||||
|
||||
|
||||
void QGLViewWindow::on_pushButton_3_clicked() {
|
||||
/*QList<ObjectBase * > ol = view->view()->objects(true);
|
||||
/*ObjectBaseList ol = view->view()->objects(true);
|
||||
qDebug() << ol.size();
|
||||
foreach (ObjectBase * i, ol) {
|
||||
//i->VBO().rebuffer();
|
||||
|
||||
@@ -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());
|
||||
for (int i = 0; i < ol.size(); ++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) {
|
||||
QOpenGLExtraFunctions * f = view;
|
||||
QMapIterator<Mesh*, QList<ObjectBase*> > it(scene.geometries_used);
|
||||
QMapIterator<Mesh*, ObjectBaseList> it(scene.geometries_used[pass]);
|
||||
bool emit_pos_change = false;
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
Mesh * mesh = it.key();
|
||||
if (mesh->objects_changed) {
|
||||
mesh->objects_changed = false;
|
||||
if (mesh->isObjectsChanged(pass)) {
|
||||
mesh->setObjectsChanged(pass, false);
|
||||
emit_pos_change = true;
|
||||
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) {
|
||||
mesh->selected_changed = false;
|
||||
if (mesh->isSelectionChanged(pass) && edit_mode) {
|
||||
mesh->setSelectionChanged(pass, false);
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -34,13 +34,6 @@ class Renderer: public RendererBase {
|
||||
friend class RendererService;
|
||||
friend class RendererSelection;
|
||||
friend class TonemappingProc;
|
||||
enum RenderPass {
|
||||
rpSolid,
|
||||
rpTransparent,
|
||||
rpSelection,
|
||||
rpShadow,
|
||||
rpNoProc,
|
||||
};
|
||||
enum ShaderRole {
|
||||
// Selection
|
||||
srSelectionFill,
|
||||
@@ -89,7 +82,7 @@ public:
|
||||
void recreateMaterialThumbnails(bool force_all = false) {rend_mat.recreateMaterialThumbnails(force_all);}
|
||||
|
||||
protected:
|
||||
void fillObjectsBuffer(const QList<ObjectBase*> & ol, RenderPass pass);
|
||||
void fillObjectsBuffer(const ObjectBaseList & ol, RenderPass pass);
|
||||
void reloadObjects();
|
||||
void renderObjects(Scene & scene, RenderPass pass);
|
||||
|
||||
|
||||
@@ -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());
|
||||
for (int i = 0; i < ol.size(); ++i) {
|
||||
buffer[i] = (ol[i]->isSelected(true) ? 1 : 0);
|
||||
|
||||
@@ -36,7 +36,7 @@ protected:
|
||||
void setUniformMaps (QOpenGLShaderProgram * prog);
|
||||
void setUniformCamera (QOpenGLShaderProgram * prog, Camera * cam, bool matrices = true, 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 reloadMaterials(Scene & scene);
|
||||
void reloadLightsParameters(const QMap<int, QList<Light*>> & lights);
|
||||
|
||||
@@ -58,23 +58,26 @@ void RendererSelection::resize(int width, int height) {
|
||||
void RendererSelection::generateObjectsID(Scene & scene) {
|
||||
ids.clear();
|
||||
aim_ids.clear();
|
||||
QMapIterator<Mesh*, QList<ObjectBase*> > it(scene.geometries_used);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
foreach (ObjectBase * o, it.value()) {
|
||||
uint id = qHash(o);
|
||||
ids[id] = o;
|
||||
o->id_ = id;
|
||||
QList<int> passes = scene.geometries_used.keys();
|
||||
foreach (int p, passes) {
|
||||
QMapIterator<Mesh*, ObjectBaseList> it(scene.geometries_used[p]);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
foreach (ObjectBase * o, it.value()) {
|
||||
uint id = qHash(o);
|
||||
ids[id] = o;
|
||||
o->id_ = id;
|
||||
}
|
||||
}
|
||||
}
|
||||
QMapIterator<int, QList<Light*>> lit(scene.lights_used);
|
||||
while (lit.hasNext()) {
|
||||
lit.next();
|
||||
foreach (ObjectBase * o, lit.value()) {
|
||||
uint id = qHash(o);
|
||||
ids[id] = o;
|
||||
aim_ids[id + 1] = o;
|
||||
o->id_ = id;
|
||||
QMapIterator<int, QList<Light*>> lit(scene.lights_used);
|
||||
while (lit.hasNext()) {
|
||||
lit.next();
|
||||
foreach (ObjectBase * o, lit.value()) {
|
||||
uint id = qHash(o);
|
||||
ids[id] = o;
|
||||
aim_ids[id + 1] = o;
|
||||
o->id_ = id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -121,7 +124,8 @@ void RendererSelection::renderSelection(Scene & scene) {
|
||||
glEnableDepth();
|
||||
glClearFramebuffer(QColor(0,0,0,0));
|
||||
r->setUniformCamera(prog, view->camera());
|
||||
r->renderObjects(scene, Renderer::rpSelection);
|
||||
r->renderObjects(scene, rpSolid);
|
||||
r->renderObjects(scene, rpTransparent);
|
||||
view->glClear(GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
RendererService & rs(r->rend_service);
|
||||
|
||||
@@ -237,7 +237,7 @@ void RendererService::fillHandleObjects(QVector3D center, HandleMesh ids[], cons
|
||||
|
||||
|
||||
bool RendererService::calculateCenter() {
|
||||
QList<ObjectBase*> sol = r->view->scene()->selectedObjects(true);
|
||||
ObjectBaseList sol = r->view->scene()->selectedObjects(true);
|
||||
if (sol.isEmpty()) return false;
|
||||
selection_center = sol[0]->worldPos();
|
||||
if (sol.size() > 1) {
|
||||
|
||||
@@ -172,7 +172,7 @@ void MaterialsEditor::on_buttonDelete_clicked() {
|
||||
void MaterialsEditor::on_buttonAssign_clicked() {
|
||||
if (!view) return;
|
||||
Material * m = currentMaterial();
|
||||
QList<ObjectBase*> ol = view->selectedObjects();
|
||||
ObjectBaseList ol = view->selectedObjects();
|
||||
foreach (ObjectBase * o, ol)
|
||||
o->setMaterial(m, true);
|
||||
}
|
||||
@@ -180,7 +180,7 @@ void MaterialsEditor::on_buttonAssign_clicked() {
|
||||
|
||||
void MaterialsEditor::on_buttonUnset_clicked() {
|
||||
if (!view) return;
|
||||
QList<ObjectBase*> ol = view->selectedObjects();
|
||||
ObjectBaseList ol = view->selectedObjects();
|
||||
foreach (ObjectBase * o, ol)
|
||||
o->setMaterial(0, true);
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ void ObjectEditor::selectionChanged() {
|
||||
}
|
||||
ui->widgetMain->setEnabled(false);
|
||||
if (!view) return;
|
||||
QList<ObjectBase*> sol = view->selectedObjects(true);
|
||||
ObjectBaseList sol = view->selectedObjects(true);
|
||||
if (sol.isEmpty()) {
|
||||
ui->labelTitle->setText(tr("[No selected]"));
|
||||
return;
|
||||
@@ -188,7 +188,7 @@ void ObjectEditor::on_comboLightType_currentIndexChanged(int index) {
|
||||
|
||||
void ObjectEditor::on_buttonColor_colorChanged(const QColor & v) {
|
||||
if (!view || !active) return;
|
||||
QList<ObjectBase*> sol = view->selectedObjects();
|
||||
ObjectBaseList sol = view->selectedObjects();
|
||||
foreach (ObjectBase * o, sol)
|
||||
o->setColor(v);
|
||||
QList<Light*> sll = view->selectedLights();
|
||||
@@ -199,7 +199,7 @@ void ObjectEditor::on_buttonColor_colorChanged(const QColor & v) {
|
||||
|
||||
void ObjectEditor::spinChanged(double v) {
|
||||
if (!view || !active) return;
|
||||
QList<ObjectBase*> sol = view->selectedObjects(true);
|
||||
ObjectBaseList sol = view->selectedObjects(true);
|
||||
QObject * s = sender();
|
||||
foreach (ObjectBase * o, sol) {
|
||||
if (s == ui->spinPosX ) o->setPosX (v);
|
||||
@@ -249,7 +249,7 @@ void ObjectEditor::spinCameraChanged(double v) {
|
||||
|
||||
void ObjectEditor::checkChanged(bool v) {
|
||||
if (!view || !active) return;
|
||||
QList<ObjectBase*> sol = view->selectedObjects();
|
||||
ObjectBaseList sol = view->selectedObjects();
|
||||
QList<Camera*> scl = view->selectedCameras();
|
||||
QObject * s = sender();
|
||||
foreach (ObjectBase * o, sol) {
|
||||
|
||||
@@ -266,7 +266,7 @@ void SceneTree::treeObjects_selectionCnahged() {
|
||||
if (block_tree || !view) return;
|
||||
block_tree = true;
|
||||
view->scene()->clearSelection();
|
||||
QList<ObjectBase*> sol;
|
||||
ObjectBaseList sol;
|
||||
QList<QTreeWidgetItem*> til = ui->treeObjects->selectedItems();
|
||||
foreach (QTreeWidgetItem * i, til)
|
||||
sol << itemObject(i);
|
||||
@@ -361,7 +361,7 @@ void SceneTree::on_actionAdd_camera_triggered() {
|
||||
void SceneTree::on_actionClone_triggered() {
|
||||
if (!view) return;
|
||||
QList<QTreeWidgetItem*> sil = ui->treeObjects->selectedItems();
|
||||
QList<ObjectBase*> col;
|
||||
ObjectBaseList col;
|
||||
foreach (QTreeWidgetItem * i, sil) {
|
||||
ObjectBase * o = itemObject(i);
|
||||
if (!o) continue;
|
||||
@@ -375,7 +375,7 @@ void SceneTree::on_actionClone_triggered() {
|
||||
|
||||
void SceneTree::on_actionGroup_triggered() {
|
||||
if (!view) return;
|
||||
QList<ObjectBase*> sol = view->scene()->selectedObjects(true);
|
||||
ObjectBaseList sol = view->scene()->selectedObjects(true);
|
||||
ObjectBase * cp = sol[0]->parent();
|
||||
ObjectBase * nr = new ObjectBase();
|
||||
cp->addChild(nr);
|
||||
@@ -387,7 +387,7 @@ void SceneTree::on_actionGroup_triggered() {
|
||||
|
||||
void SceneTree::on_actionSelect_parent_triggered() {
|
||||
if (!view) return;
|
||||
QList<ObjectBase*> sol = view->scene()->selectedObjects(true);
|
||||
ObjectBaseList sol = view->scene()->selectedObjects(true);
|
||||
QSet<ObjectBase*> nsl;
|
||||
foreach (ObjectBase * o, sol) {
|
||||
ObjectBase * po = o->parent();
|
||||
@@ -424,7 +424,7 @@ void SceneTree::focusObjects() {
|
||||
if (!view) return;
|
||||
if (!view->camera()) return;
|
||||
Box3D bb;
|
||||
QList<ObjectBase*> ol = view->selectedObjects();
|
||||
ObjectBaseList ol = view->selectedObjects();
|
||||
foreach (ObjectBase * o, ol) {
|
||||
o->calculateBoundingBox();
|
||||
bb |= o->boundingBox();
|
||||
|
||||
Reference in New Issue
Block a user