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

This commit is contained in:
2019-12-12 16:54:49 +00:00
parent bc33d99703
commit 52153469a9
12 changed files with 84 additions and 33 deletions

View File

@@ -95,14 +95,8 @@ const char qgl_structs[] =
"};\n" "};\n"
"struct QGLLightParameter {\n" "struct QGLLightParameter {\n"
" vec4 color;\n" " vec4 color;\n"
" float intensity;\n" " vec4 decay_intensity;\n"
" float startAngle;\n" " vec4 angles;\n"
" float startAngleCos;\n"
" float endAngle;\n"
" float endAngleCos;\n"
" float constantAttenuation;\n"
" float linearAttenuation;\n"
" float quadraticAttenuation;\n"
//" sampler2DShadow shadow;\n" //" sampler2DShadow shadow;\n"
//" sampler2D shadowColor\n" //" sampler2D shadowColor\n"
//" mat4 shadowMatrix;\n" //" mat4 shadowMatrix;\n"

View File

@@ -124,15 +124,8 @@ struct QGLMaterial {
}; };
struct QGLLightParameter { struct QGLLightParameter {
QVector4D color; QVector4D color;
//QVector4D shadowColor; QVector4D decay_intensity; // [^0, ^1, ^2, intensity]
GLfloat intensity; QVector4D angles; // [start, cos(start), end, cos(end)]
GLfloat startAngle;
GLfloat startAngleCos;
GLfloat endAngle;
GLfloat endAngleCos;
GLfloat constantAttenuation;
GLfloat linearAttenuation;
GLfloat quadraticAttenuation;
//GLfloat shadow; //GLfloat shadow;
//GLfloat shadowMatrix[16]; //GLfloat shadowMatrix[16];
}; };

View File

@@ -158,6 +158,15 @@ Transform::Transform(): m_scale(1.0f, 1.0f, 1.0f),
} }
Transform & Transform::operator =(const Transform & t) {
m_scale = t.m_scale;
m_translation = t.m_translation;
m_eulerRotationAngles = t.m_eulerRotationAngles;
m_matrixDirty = true;
return *this;
}
void Transform::setMatrix(const QMatrix4x4 & m) { void Transform::setMatrix(const QMatrix4x4 & m) {
if (m != matrix()) { if (m != matrix()) {
m_matrix = m; m_matrix = m;

View File

@@ -29,6 +29,7 @@ class Transform {
friend QDataStream & operator >>(QDataStream & s, Transform & v); friend QDataStream & operator >>(QDataStream & s, Transform & v);
public: public:
Transform(); Transform();
Transform & operator =(const Transform & t);
float scale() const; float scale() const;
QVector3D scale3D() const; QVector3D scale3D() const;
@@ -61,6 +62,7 @@ public:
void setTranslationZ(float t); void setTranslationZ(float t);
void setMatrix(const QMatrix4x4 & matrix); void setMatrix(const QMatrix4x4 & matrix);
void setDirty(bool yes = true) {m_matrixDirty = yes;}
static QQuaternion fromAxisAndAngle(const QVector3D & axis, float angle); static QQuaternion fromAxisAndAngle(const QVector3D & axis, float angle);

View File

@@ -132,6 +132,8 @@ Material * assimpMaterial(const aiMaterial * m) {
Light * assimpLight(const aiLight * l) { Light * assimpLight(const aiLight * l) {
if (!l) return 0; if (!l) return 0;
if (l->mType != aiLightSource_POINT && l->mType != aiLightSource_SPOT)
return 0;
Light * ret = new Light(); Light * ret = new Light();
ret->setName(fromAiString(l->mName)); ret->setName(fromAiString(l->mName));
ret->setPos(fromAiVector3D(l->mPosition)); ret->setPos(fromAiVector3D(l->mPosition));
@@ -221,28 +223,32 @@ Scene * loadScene(const QString & filepath) {
lights << assimpLight(ais->mLights[i]); lights << assimpLight(ais->mLights[i]);
QMap<QString, Light * > light_by_name; QMap<QString, Light * > light_by_name;
foreach (Light * l, lights) foreach (Light * l, lights)
if (l)
light_by_name[l->name()] = l; light_by_name[l->name()] = l;
QVector<Light*> out_lights; QVector<Light*> out_lights;
ObjectBaseList rootl = assimpObject(ais->mRootNode, meshes, ais->mMeshes, materials, light_by_name, out_lights); ObjectBaseList rootl = assimpObject(ais->mRootNode, meshes, ais->mMeshes, materials, light_by_name, out_lights);
if (rootl.isEmpty()) return 0; if (rootl.isEmpty()) return 0;
ObjectBase * root = rootl[0]; ObjectBase * root = rootl[0];
root->transferTransformToChildren(true);
ObjectBaseList 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")) {
l->setAim((l->worldTransform().inverted() * QVector4D(c->worldPos(), 1)).toVector3D()); l->setDistance((l->worldPos() - c->worldPos()).length());
delete c; delete c;
break; break;
} }
} }
} }
root->cleanTree();
Scene * scene = new Scene(); Scene * scene = new Scene();
scene->setName(root->name()); scene->setName(root->name());
foreach (ObjectBase * o, root->children()) foreach (ObjectBase * o, root->children())
scene->addObject(o); scene->addObject(o);
lights.removeAll(0);
qDeleteAll(lights); qDeleteAll(lights);
return scene; return scene;

View File

@@ -273,6 +273,11 @@ void ObjectBase::calculateBoundingBox() {
} }
void ObjectBase::updateTransform() {
buildTransform(true);
}
void ObjectBase::setProperty(const QString & pn, const QVariant & v) { void ObjectBase::setProperty(const QString & pn, const QVariant & v) {
meta[pn] = v; meta[pn] = v;
} }
@@ -316,6 +321,28 @@ QVector3D ObjectBase::inParentSpace(const QVector3D & v) const {
} }
void ObjectBase::transferTransformToChildren(bool only_scale) {
QMatrix4x4 m = trans.matrix();
if (only_scale) m = trans.matrixScale();
foreach (ObjectBase * i, children_)
i->trans.setMatrix(m * i->trans.matrix());
if (only_scale) resetScale();
else setMatrix(QMatrix4x4());
}
void ObjectBase::cleanTree() {
for (int i = 0; i < children_.size(); ++i) {
ObjectBase * o = children_[i];
if (!o->hasChildren() && !o->mesh() && (o->type() == glMesh)) {
delete o;
--i;
}
o->cleanTree();
}
}
bool ObjectBase::isSelected(bool check_parents) const { bool ObjectBase::isSelected(bool check_parents) const {
if (!check_parents) return selected_; if (!check_parents) return selected_;
if (selected_) return true; if (selected_) return true;
@@ -373,7 +400,8 @@ void ObjectBase::setMesh(Mesh * v) {
} }
void ObjectBase::buildTransform() { void ObjectBase::buildTransform(bool force) {
if (force) trans.setDirty();
itransform_.setToIdentity(); itransform_.setToIdentity();
ObjectBase * p = parent_; ObjectBase * p = parent_;
if (p) if (p)
@@ -386,7 +414,7 @@ void ObjectBase::buildTransform() {
localTransform(itransform_); localTransform(itransform_);
//qDebug() << name_ << itransform_; //qDebug() << name_ << itransform_;
foreach (ObjectBase * i, children_) foreach (ObjectBase * i, children_)
i->buildTransform(); i->buildTransform(force);
setObjectsChanged(); setObjectsChanged();
} }

View File

@@ -63,7 +63,7 @@ public:
ObjectBase * parent() {return parent_;} ObjectBase * parent() {return parent_;}
void setParent(ObjectBase * o) {parent_ = o;} void setParent(ObjectBase * o) {parent_ = o;}
bool hasParent() const {return parent_ != nullptr;} bool hasParent() const {return parent_ != nullptr;}
bool hasChildren() const {return children_.size() != 0;} bool hasChildren() const {return !children_.isEmpty();}
void setScene(Scene * v); void setScene(Scene * v);
void addChild(ObjectBase * o); void addChild(ObjectBase * o);
@@ -147,6 +147,8 @@ public:
QMatrix4x4 matrix() const; QMatrix4x4 matrix() const;
bool isRawMatrix() {return raw_matrix;} bool isRawMatrix() {return raw_matrix;}
QVector3D inParentSpace(const QVector3D & v) const; QVector3D inParentSpace(const QVector3D & v) const;
void transferTransformToChildren(bool only_scale = true);
void cleanTree();
bool isAcceptLight() const {return accept_light;} bool isAcceptLight() const {return accept_light;}
void setAcceptLight(bool yes) {accept_light = yes;} void setAcceptLight(bool yes) {accept_light = yes;}
@@ -182,6 +184,7 @@ public:
Mesh * mesh() {return mesh_;} Mesh * mesh() {return mesh_;}
void calculateBoundingBox(); void calculateBoundingBox();
void updateTransform();
void setProperty(const QString & pn, const QVariant & v); void setProperty(const QString & pn, const QVariant & v);
QVariant property(const QString & pn, bool * exists = 0) const; QVariant property(const QString & pn, bool * exists = 0) const;
@@ -195,11 +198,11 @@ public:
protected: protected:
virtual void transformChanged() {} virtual void transformChanged() {}
void addChildren(ObjectBaseList & list, ObjectBase * where); void addChildren(ObjectBaseList & list, ObjectBase * where);
void buildTransform(); void buildTransform(bool force = false);
void initInternal(); void initInternal();
void setSceneTreeChanged(); void setSceneTreeChanged();
void setObjectsChanged(); void setObjectsChanged();
virtual void localTransform(QMatrix4x4 & m); void localTransform(QMatrix4x4 & m);
QMatrix4x4 worldMatrix(QMatrix4x4 parent) const; QMatrix4x4 worldMatrix(QMatrix4x4 parent) const;
int prev_pass; // Pass int prev_pass; // Pass

View File

@@ -474,7 +474,7 @@ void Scene::destroy() {
void Scene::destroyUnused(QOpenGLExtraFunctions * f) { void Scene::destroyUnused(QOpenGLExtraFunctions * f) {
if (!td_geometries.isEmpty()) qDebug() << "destroyUnused" << td_geometries.size(); //if (!td_geometries.isEmpty()) qDebug() << "destroyUnused" << td_geometries.size();
foreach (Mesh * i, td_geometries) foreach (Mesh * i, td_geometries)
i->destroy(f); i->destroy(f);
qDeleteAll(td_geometries); qDeleteAll(td_geometries);

View File

@@ -233,15 +233,15 @@ void RendererBase::reloadLightsParameters(const QMap<int, QList<Light*>> & light
if (l->light_type == Light::Omni) if (l->light_type == Light::Omni)
ang_start = ang_end = 180.; ang_start = ang_end = 180.;
//qDebug() << "light" << light->name() << ulightn << pos; //qDebug() << "light" << light->name() << ulightn << pos;
so.intensity = l->intensity;
so.startAngle = ang_start;
so.startAngleCos = cos(ang_start * deg2rad);
so.endAngle = ang_end;
so.endAngleCos = cos(ang_end * deg2rad);
so.color = QColor2QVector(l->color_); so.color = QColor2QVector(l->color_);
so.constantAttenuation = l->decay_const; so.angles[0] = ang_start;
so.linearAttenuation = l->decay_linear; so.angles[1] = cos(ang_start * deg2rad);
so.quadraticAttenuation = l->decay_quadratic; so.angles[2] = ang_end;
so.angles[3] = cos(ang_end * deg2rad);
so.decay_intensity[0] = l->decay_const;
so.decay_intensity[1] = l->decay_linear;
so.decay_intensity[2] = l->decay_quadratic;
so.decay_intensity[3] = l->intensity;
//so.shadow = shadow; //so.shadow = shadow;
//so.shadowColor = shadow; //so.shadowColor = shadow;
} }

View File

@@ -102,6 +102,7 @@ QList<QAction *> SceneTree::actionsSelection() {
ret << ui->actionFocus << newSeparator() ret << ui->actionFocus << newSeparator()
<< ui->actionGroup << ui->actionClone << newSeparator() << ui->actionGroup << ui->actionClone << newSeparator()
<< ui->actionSelect_parent << ui->actionSelect_by_mesh << ui->actionSelect_by_material << newSeparator() << ui->actionSelect_parent << ui->actionSelect_by_mesh << ui->actionSelect_by_material << newSeparator()
<< ui->actionTransfer_transform_to_children << newSeparator()
<< ui->actionRemove; << ui->actionRemove;
return ret; return ret;
} }
@@ -387,6 +388,14 @@ void SceneTree::on_actionGroup_triggered() {
} }
void SceneTree::on_actionTransfer_transform_to_children_triggered() {
if (!view) return;
ObjectBaseList sol = view->scene()->selectedObjects(true);
foreach (ObjectBase * o, sol)
o->transferTransformToChildren();
}
void SceneTree::on_actionSelect_parent_triggered() { void SceneTree::on_actionSelect_parent_triggered() {
if (!view) return; if (!view) return;
ObjectBaseList sol = view->scene()->selectedObjects(true); ObjectBaseList sol = view->scene()->selectedObjects(true);

View File

@@ -71,6 +71,7 @@ private slots:
void on_actionRemove_triggered() {removeObjects();} void on_actionRemove_triggered() {removeObjects();}
void on_actionClone_triggered(); void on_actionClone_triggered();
void on_actionGroup_triggered(); void on_actionGroup_triggered();
void on_actionTransfer_transform_to_children_triggered();
void on_actionSelect_parent_triggered(); void on_actionSelect_parent_triggered();
void on_actionSelect_by_mesh_triggered(); void on_actionSelect_by_mesh_triggered();
@@ -84,6 +85,7 @@ private slots:
void filter(); void filter();
void __objectDeleted(ObjectBase * o); void __objectDeleted(ObjectBase * o);
public slots: public slots:
signals: signals:

View File

@@ -260,6 +260,11 @@
<string>Cameras</string> <string>Cameras</string>
</property> </property>
</action> </action>
<action name="actionTransfer_transform_to_children">
<property name="text">
<string>Transfer transform to children</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>