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

This commit is contained in:
2019-12-01 16:52:10 +00:00
parent 09298fadcd
commit 385070f70f
33 changed files with 226 additions and 83 deletions

View File

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