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

This commit is contained in:
2019-12-20 10:55:11 +00:00
parent cb19854e1b
commit 7c271cc3b5
13 changed files with 193 additions and 44 deletions

View File

@@ -54,6 +54,7 @@ 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(0.8, 0.8, 0.8);
box_mesh_f = Primitive::cubeFrame(0.8, 0.8, 0.8);
omni_mesh = Primitive::ellipsoid(2, 1, 0.5);
@@ -75,11 +76,23 @@ RendererService::RendererService(Renderer * r_): r(r_) {
cone_mesh ->translatePoints(0,0,-0.5);
cone_mesh ->scalePoints(1.5);
camera_mesh = Primitive::cube(1.2, 1.2, 1.2);
mat.translate(0,0,-0.5);
Mesh * m = Primitive::cone(6, 0.6, 1.);
m->scalePoints(1.4);
m->transformPoints(mat);
camera_mesh->append(m);
camera_mesh_f = Primitive::cubeFrame(1., 1., 1.);
camera_mesh_f->append(Primitive::cubeFrame(0.5, 0.5, 0.5));
m = Primitive::coneFrame(6, 0.6, 1.);
m->transformPoints(mat);
camera_mesh_f->append(m);
line_mesh_f = Primitive::lineFrame(QVector3D(), QVector3D(0, 0, -1));
handle_move_mesh = Primitive::arrow(12, 0.06);
handle_ms_2_mesh = Primitive::torus(8, 12, 0.5, 0.02, 90);
Mesh * m = Primitive::disc(8, 0.5, 90);
m = Primitive::disc(8, 0.5, 90);
handle_ms_2_mesh->append(m);
m->flipNormals();
handle_ms_2_mesh->append(m);
@@ -113,6 +126,8 @@ RendererService::~RendererService() {
delete omni_mesh_f;
delete cone_mesh;
delete cone_mesh_f;
delete camera_mesh;
delete camera_mesh_f;
delete line_mesh_f;
delete axis_camera;
delete axis_mesh;
@@ -187,8 +202,7 @@ void RendererService::fillOmniObjects() {
}
void RendererService::fillSpotObjects() {
QList<Light*> ll = r->view->scene()->lights_used.value(Light::Cone);
void RendererService::fillAimedObjects(const ObjectBaseList & objects) {
Object o;
cur_objects.clear();
cur_aims.clear();
@@ -197,18 +211,19 @@ void RendererService::fillSpotObjects() {
QVector<QVector2D> & lt (line_mesh_f->texcoords ());
QVector< Vector2i> & lind(line_mesh_f->indicesLines());
lv.clear();
foreach (Light * l, ll) {
foreach (ObjectBase * go, objects) {
AimedObject * ao = (AimedObject *)go;
QMatrix4x4 m;
m = invariantSizeMatrix(l->worldPos()) * parentRotationMatrix(l);
m = invariantSizeMatrix(ao->worldPos()) * parentRotationMatrix(ao);
m.transposed().copyDataTo(o.modelmatrix);
o.object_id = l->id_;
o.object_id = ao->id_;
cur_objects << o;
lv << l->worldPos() << l->worldAim();
lv << ao->worldPos() << ao->worldAim();
m = invariantSizeMatrix(l->worldAim());
m = invariantSizeMatrix(ao->worldAim());
m.transposed().copyDataTo(o.modelmatrix);
o.object_id = l->id_ + 1;
o.object_id = ao->id_ + 1;
cur_aims << o;
}
ln.resize(lv.size());
@@ -313,13 +328,14 @@ void RendererService::drawLights() {
fillOmniObjects();
omni_mesh->loadObjects(v, cur_objects);
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Omni)));
r->fillSelectionsBuffer(rs.cur_selections_, lights2objectList(v->scene_->lights_used.value(Light::Omni)));
omni_mesh->loadSelections(v, rs.cur_selections_);
omni_mesh->draw(v, cur_objects.size());
fillSpotObjects();
ObjectBaseList ll = lights2objectList(r->view->scene()->lights_used.value(Light::Cone));
fillAimedObjects(ll);
cone_mesh->loadObjects(v, cur_objects);
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone)));
r->fillSelectionsBuffer(rs.cur_selections_, ll);
cone_mesh->loadSelections(v, rs.cur_selections_);
cone_mesh->draw(v, cur_objects.size());
box_mesh->loadObjects(v, cur_aims);
@@ -336,14 +352,15 @@ void RendererService::drawLightsFrame(QColor color) {
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)));
r->fillSelectionsBuffer(rs.cur_selections_, lights2objectList(v->scene_->lights_used.value(Light::Omni)));
omni_mesh_f->loadSelections(v, rs.cur_selections_);
omni_mesh_f->draw(v, cur_objects.size());
fillSpotObjects();
ObjectBaseList ll = lights2objectList(r->view->scene()->lights_used.value(Light::Cone));
fillAimedObjects(ll);
setObjectsColor(cur_objects, color);
cone_mesh_f->loadObjects(v, cur_objects);
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone)));
r->fillSelectionsBuffer(rs.cur_selections_, ll);
cone_mesh_f->loadSelections(v, rs.cur_selections_);
cone_mesh_f->draw(v, cur_objects.size());
@@ -355,6 +372,45 @@ void RendererService::drawLightsFrame(QColor color) {
}
void RendererService::drawCameras() {
QGLView * v = r->view;
RendererSelection & rs(r->rend_selection);
ObjectBaseList cl = cameras2objectList(r->view->scene()->cameras_used);
cl.removeOne(r->view->camera());
fillAimedObjects(cl);
camera_mesh->loadObjects(v, cur_objects);
r->fillSelectionsBuffer(rs.cur_selections_, cl);
camera_mesh->loadSelections(v, rs.cur_selections_);
camera_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::drawCamerasFrame(QColor color) {
QGLView * v = r->view;
RendererSelection & rs(r->rend_selection);
ObjectBaseList cl = cameras2objectList(r->view->scene()->cameras_used);
cl.removeOne(r->view->camera());
fillAimedObjects(cl);
setObjectsColor(cur_objects, color);
camera_mesh_f->loadObjects(v, cur_objects);
r->fillSelectionsBuffer(rs.cur_selections_, cl);
camera_mesh_f->loadSelections(v, rs.cur_selections_);
camera_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());
}
void RendererService::setObjectsColor(QVector<Object> & ol, QColor col) {
QVector4D cv = QColor2QVector(col);
for (int i = 0; i < ol.size(); ++i)
@@ -380,9 +436,11 @@ void RendererService::renderService() {
prog->setUniformValue("line_width", 2.f);
prog->setUniformValue("z_offset", 0.f);
drawLightsFrame(Qt::white);
drawCamerasFrame(Qt::white);
prog->setUniformValue("line_width", 1.f);
prog->setUniformValue("z_offset", -1.E-2f);
drawLightsFrame(Qt::black);
drawCamerasFrame(Qt::black);
}
if (r->bindShader(Renderer::srServiceLine, &prog)) {