git-svn-id: svn://db.shs.com.ru/libs@688 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user