git-svn-id: svn://db.shs.com.ru/libs@637 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -54,8 +54,8 @@ RendererService::RendererService(Renderer * r_): r(r_) {
|
||||
axis_camera->setFOV(45.);
|
||||
axis_mesh = Primitive::arrow(12);
|
||||
size_vp_scale = size_full_scale = 1.;
|
||||
box_mesh = Primitive::cube();
|
||||
box_mesh_f = Primitive::cubeFrame();
|
||||
box_mesh = Primitive::cube(0.8, 0.8, 0.8);
|
||||
box_mesh_f = Primitive::cubeFrame(0.8, 0.8, 0.8);
|
||||
omni_mesh = Primitive::ellipsoid(2, 1);
|
||||
omni_mesh_f = Primitive::ellipsoidFrame(2, 1);
|
||||
omni_mesh ->scalePoints(1.5);
|
||||
@@ -63,14 +63,18 @@ RendererService::RendererService(Renderer * r_): r(r_) {
|
||||
cone_mesh = Primitive::cone(8, 1., 1., 1.);
|
||||
cone_mesh_f = Primitive::coneFrame(8, 1., 1., 1.);
|
||||
QMatrix4x4 mat;
|
||||
mat.rotate(90, 0,1,0);
|
||||
mat.translate(0,0,2);
|
||||
mat.translate(0,0,1);
|
||||
mat.rotate(180, 1,0,0);
|
||||
cone_mesh ->transformPoints(mat);
|
||||
cone_mesh_f->transformPoints(mat);
|
||||
cone_mesh_f->scalePoints(1.5);
|
||||
|
||||
box_mesh ->scalePoints(1.3);
|
||||
omni_mesh ->scalePoints(1.3);
|
||||
cone_mesh ->translatePoints(0,0,-1);
|
||||
cone_mesh ->scalePoints(1.4);
|
||||
cone_mesh ->translatePoints(0,0,1);
|
||||
cone_mesh ->scalePoints(1.5);
|
||||
|
||||
handle_move_mesh = Primitive::arrow(12, 0.06);
|
||||
handle_ms_2_mesh = Primitive::torus(8, 12, 0.5, 0.02, 90);
|
||||
@@ -144,6 +148,26 @@ QMatrix4x4 RendererService::invariantSizeMatrix(QVector3D p) {
|
||||
}
|
||||
|
||||
|
||||
QMatrix4x4 RendererService::parentRotationMatrix(ObjectBase * o, bool self_rotation) {
|
||||
QMatrix4x4 ret;
|
||||
if (!o) return ret;
|
||||
QMatrix4x4 pmat;
|
||||
if (o->parent()) {
|
||||
pmat = o->parent()->worldTransform();
|
||||
pmat.setColumn(3, QVector4D(0,0,0,1));
|
||||
double det = pmat.determinant();
|
||||
if (det > 0.) pmat /= sqrt(det);
|
||||
}
|
||||
if (self_rotation) {
|
||||
ret.rotate(o->angles_.z(), 0., 0., 1.);
|
||||
ret.rotate(o->angles_.y(), 0., 1., 0.);
|
||||
ret.rotate(o->angles_.x(), 1., 0., 0.);
|
||||
}
|
||||
ret = pmat * ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void RendererService::fillXYZObjects() {
|
||||
cur_objects.resize(3);
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
@@ -166,6 +190,32 @@ void RendererService::fillOmniObjects() {
|
||||
}
|
||||
|
||||
|
||||
void RendererService::fillSpotObjects() {
|
||||
QList<Light*> ll = r->view->scene()->lights_used.value(Light::Cone);
|
||||
Object o;
|
||||
cur_objects.clear();
|
||||
cur_aims.clear();
|
||||
foreach (Light * l, ll) {
|
||||
QMatrix4x4 m, lm;
|
||||
//QVector3D up = QVector3D::crossProduct(l->direction, QVector3D(0,0,1)).normalized();
|
||||
//if (up.isNull())
|
||||
// up = QVector3D::crossProduct(l->direction, QVector3D(0,0,1)).normalized();
|
||||
//lm.lookAt(QVector3D(), l->direction, up);
|
||||
//lm.lookAt(QVector3D(), l->direction, (QVector3D(0,0,1)));
|
||||
lm.rotate(QQuaternion::fromDirection(l->direction(), QVector3D()));
|
||||
m = invariantSizeMatrix(l->worldPos()) * parentRotationMatrix(l) * lm;
|
||||
m.transposed().copyDataTo(o.modelmatrix);
|
||||
o.object_id = l->id_;
|
||||
cur_objects << o;
|
||||
|
||||
m = invariantSizeMatrix(l->worldAim());
|
||||
m.transposed().copyDataTo(o.modelmatrix);
|
||||
o.object_id = l->id_ + 1;
|
||||
cur_aims << o;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RendererService::fillHandleObjects(QVector3D center, HandleMesh ids[], const QVector<QMatrix4x4> & mats, const QVector<QVector4D> & colors, QMatrix4x4 add_mat, int count) {
|
||||
QMatrix4x4 m = invariantSizeMatrix(center) * add_mat;
|
||||
cur_objects.resize(count);
|
||||
@@ -196,18 +246,7 @@ bool RendererService::calculateCenter() {
|
||||
}
|
||||
axis_mat = QMatrix4x4();
|
||||
if ((sol.size() == 1) && (current_action != haMove)) {
|
||||
ObjectBase * o = sol[0];
|
||||
QMatrix4x4 pmat;
|
||||
if (o->parent()) {
|
||||
pmat = o->parent()->worldTransform();
|
||||
pmat.setColumn(3, QVector4D(0,0,0,1));
|
||||
double det = pmat.determinant();
|
||||
if (det > 0.) pmat /= sqrt(det);
|
||||
}
|
||||
axis_mat.rotate(o->angles_.z(), 0., 0., 1.);
|
||||
axis_mat.rotate(o->angles_.y(), 0., 1., 0.);
|
||||
axis_mat.rotate(o->angles_.x(), 1., 0., 0.);
|
||||
axis_mat = pmat * axis_mat;
|
||||
axis_mat = parentRotationMatrix(sol[0]);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -259,11 +298,50 @@ void RendererService::drawCurrentHandleObjects() {
|
||||
|
||||
|
||||
void RendererService::drawLights() {
|
||||
QGLView * v = r->view;
|
||||
RendererSelection & rs(r->rend_selection);
|
||||
|
||||
fillOmniObjects();
|
||||
omni_mesh->loadObjects(r->view, cur_objects);
|
||||
r->fillSelectionsBuffer(r->rend_selection.cur_selections_, light2objectList(r->view->scene_->lights_used.value(Light::Omni)));
|
||||
omni_mesh->loadSelections(r->view, r->rend_selection.cur_selections_);
|
||||
omni_mesh->draw(r->view, cur_objects.size());
|
||||
omni_mesh->loadObjects(v, cur_objects);
|
||||
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Omni)));
|
||||
omni_mesh->loadSelections(v, rs.cur_selections_);
|
||||
omni_mesh->draw(v, cur_objects.size());
|
||||
|
||||
fillSpotObjects();
|
||||
cone_mesh->loadObjects(v, cur_objects);
|
||||
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone)));
|
||||
cone_mesh->loadSelections(v, rs.cur_selections_);
|
||||
cone_mesh->draw(v, cur_objects.size());
|
||||
box_mesh->loadObjects(v, cur_aims);
|
||||
box_mesh->loadSelections(v, rs.cur_selections_);
|
||||
box_mesh->draw(v, cur_aims.size());
|
||||
|
||||
}
|
||||
|
||||
|
||||
void RendererService::drawLightsFrame(QColor color) {
|
||||
QGLView * v = r->view;
|
||||
RendererSelection & rs(r->rend_selection);
|
||||
|
||||
fillOmniObjects();
|
||||
setObjectsColor(cur_objects, color);
|
||||
omni_mesh_f->loadObjects(v, cur_objects);
|
||||
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Omni)));
|
||||
omni_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||
omni_mesh_f->draw(v, cur_objects.size());
|
||||
|
||||
fillSpotObjects();
|
||||
setObjectsColor(cur_objects, color);
|
||||
cone_mesh_f->loadObjects(v, cur_objects);
|
||||
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone)));
|
||||
cone_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||
cone_mesh_f->draw(v, cur_objects.size());
|
||||
setObjectsColor(cur_aims, color);
|
||||
box_mesh_f->loadObjects(v, cur_aims);
|
||||
box_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||
box_mesh_f->draw(v, cur_aims.size());
|
||||
|
||||
setObjectsColor(cur_aims, color);
|
||||
}
|
||||
|
||||
|
||||
@@ -289,19 +367,13 @@ void RendererService::renderService() {
|
||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
glDisable(GL_CULL_FACE);
|
||||
r->setUniformCamera(prog, r->view->camera());
|
||||
fillOmniObjects();
|
||||
|
||||
setObjectsColor(cur_objects, Qt::white);
|
||||
prog->setUniformValue("line_width", 2.f);
|
||||
prog->setUniformValue("z_offset", 0.f);
|
||||
omni_mesh_f->loadObjects(f, cur_objects);
|
||||
omni_mesh_f->draw(f, cur_objects.size());
|
||||
|
||||
setObjectsColor(cur_objects, Qt::black);
|
||||
drawLightsFrame(Qt::white);
|
||||
prog->setUniformValue("line_width", 1.f);
|
||||
prog->setUniformValue("z_offset", -1.E-2f);
|
||||
omni_mesh_f->loadObjects(f, cur_objects);
|
||||
omni_mesh_f->draw(f, cur_objects.size());
|
||||
drawLightsFrame(Qt::black);
|
||||
|
||||
glEnable(GL_CULL_FACE);
|
||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
|
||||
Reference in New Issue
Block a user