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_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);

View File

@@ -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;
};

View File

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

View File

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

View File

@@ -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;
};

View File

@@ -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")) {

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);

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]);

View File

@@ -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:

View File

@@ -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:

View File

@@ -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;

View File

@@ -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();}

View File

@@ -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();

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());
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();
}

View File

@@ -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);

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());
for (int i = 0; i < ol.size(); ++i) {
buffer[i] = (ol[i]->isSelected(true) ? 1 : 0);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -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();