git-svn-id: svn://db.shs.com.ru/libs@631 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -29,17 +29,26 @@ using namespace QGLEngineShaders;
|
||||
|
||||
RendererService::RendererService(Renderer * r_): r(r_) {
|
||||
line_width = 1;
|
||||
current_handle = htNoHandle;
|
||||
mat_xyz.resize(3);
|
||||
color_xyz.resize(3);
|
||||
const QVector3D _rot[3] = {QVector3D(0,1,0), QVector3D(-1,0,0), QVector3D(0,0,1)};
|
||||
current_action = haNoAction;
|
||||
current_handle = 0;
|
||||
mat_xyz.resize(3); mat_ms2.resize(3);
|
||||
color_xyz.resize(3); color_ms2.resize(3);
|
||||
const QVector3D _rot [3] = {QVector3D(0,1,0), QVector3D(-1,0,0), QVector3D(0, 0,1)};
|
||||
const QVector3D _rot2[3] = {QVector3D(0,0,0), QVector3D( 1,0,0), QVector3D(0,-1,0)};
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
QMatrix4x4 m;
|
||||
m.rotate(90., _rot[i]);
|
||||
mat_xyz[i] = m;
|
||||
color_xyz[i] = QVector4D(0,0,0,0.667);
|
||||
m.setToIdentity();
|
||||
if (!_rot2[i].isNull())
|
||||
m.rotate(90., _rot2[i]);
|
||||
mat_ms2[i] = m;
|
||||
color_xyz[i] = color_ms2[i] = QVector4D(0,0,0,0.8);
|
||||
color_xyz[i][i] = 1.;
|
||||
}
|
||||
color_ms2[0] = (color_xyz[0] + color_xyz[1]) / 2.;
|
||||
color_ms2[1] = (color_xyz[0] + color_xyz[2]) / 2.;
|
||||
color_ms2[2] = (color_xyz[1] + color_xyz[2]) / 2.;
|
||||
axis_camera = new Camera();
|
||||
axis_camera->setAim(QVector3D());
|
||||
axis_camera->setFOV(45.);
|
||||
@@ -53,20 +62,34 @@ RendererService::RendererService(Renderer * r_): r(r_) {
|
||||
omni_mesh_f->scalePoints(1.5);
|
||||
box_mesh ->scalePoints(1.3);
|
||||
omni_mesh ->scalePoints(1.3);
|
||||
handle_move_mesh = Primitive::arrow(12, 0.06);
|
||||
|
||||
handle_move_mesh = Primitive::arrow(12, 0.06);
|
||||
handle_ms_2_mesh = Primitive::torus(8, 12, 0.5, 0.025, 90);
|
||||
Mesh * m = Primitive::disc(8, 1., 1., true, 90);
|
||||
handle_ms_2_mesh->append(m);
|
||||
delete m;
|
||||
m = Primitive::disc(8, 1., 1., false, 90);
|
||||
handle_ms_2_mesh->append(m);
|
||||
delete m;
|
||||
|
||||
handle_rotate_mesh = Primitive::arrow(12, 0.03);
|
||||
Mesh * m = Primitive::torus(30, 12, 0.5, 0.06);
|
||||
m = Primitive::torus(30, 12, 0.5, 0.06);
|
||||
m->translatePoints(QVector3D(0., 0., 0.75));
|
||||
handle_rotate_mesh->append(m);
|
||||
delete m;
|
||||
handle_scale_mesh = Primitive::cylinder(12, 0.06, 0.06, 0.85);
|
||||
|
||||
handle_scale_mesh = Primitive::cylinder(12, 0.06, 0.06, 0.85);
|
||||
m = Primitive::ellipsoid(12, 12, 0.3, 0.3, 0.3);
|
||||
m->translatePoints(QVector3D(0., 0., 0.85));
|
||||
handle_scale_mesh->append(m);
|
||||
delete m;
|
||||
handle_move_mesh ->scalePoints(7.5);
|
||||
handle_rotate_mesh->scalePoints(7.5);
|
||||
handle_scale_mesh ->scalePoints(7.5);
|
||||
handle_scale_3_mesh = Primitive::ellipsoid(12, 12, 0.4, 0.4, 0.4);
|
||||
|
||||
handle_move_mesh ->scalePoints(7.5);
|
||||
handle_ms_2_mesh ->scalePoints(7.5);
|
||||
handle_rotate_mesh ->scalePoints(7.5);
|
||||
handle_scale_mesh ->scalePoints(7.5);
|
||||
handle_scale_3_mesh ->scalePoints(7.5);
|
||||
}
|
||||
|
||||
|
||||
@@ -78,8 +101,10 @@ RendererService::~RendererService() {
|
||||
delete axis_camera;
|
||||
delete axis_mesh;
|
||||
delete handle_move_mesh;
|
||||
delete handle_ms_2_mesh;
|
||||
delete handle_rotate_mesh;
|
||||
delete handle_scale_mesh;
|
||||
delete handle_scale_3_mesh;
|
||||
}
|
||||
|
||||
|
||||
@@ -130,42 +155,98 @@ void RendererService::fillOmniObjects() {
|
||||
}
|
||||
|
||||
|
||||
void RendererService::fillHandleObjects(QVector3D center, HandleType first, QMatrix4x4 add_mat) {
|
||||
cur_objects.resize(3);
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
cur_objects[i].color = color_xyz[i];
|
||||
QMatrix4x4 m = invariantSizeMatrix(center);
|
||||
m = m * add_mat * mat_xyz[i];
|
||||
cur_objects[i].object_id = first + i;
|
||||
m.transposed().copyDataTo(cur_objects[i].modelmatrix);
|
||||
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);
|
||||
for (int i = 0; i < count; ++i) {
|
||||
cur_objects[i].color = colors[i];
|
||||
QMatrix4x4 omat = m * mats[i];
|
||||
cur_objects[i].object_id = ids[i];
|
||||
if (current_handle.testFlag(ids[i])) {
|
||||
cur_objects[i].color = QVector4D(0,1,1,1);
|
||||
}
|
||||
omat.transposed().copyDataTo(cur_objects[i].modelmatrix);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool RendererService::fillCurrentHandleObjects() {
|
||||
bool RendererService::calculateCenter() {
|
||||
QList<ObjectBase*> sol = r->view->scene()->selectedObjects(true);
|
||||
if (sol.isEmpty()) return false;
|
||||
selection_center = QVector3D();
|
||||
Box3D bb;
|
||||
foreach (ObjectBase * o, sol) {
|
||||
o->calculateBoundingBox();
|
||||
bb |= o->boundingBox();
|
||||
selection_center = sol[0]->worldPos();
|
||||
if (sol.size() > 1) {
|
||||
Box3D bb;
|
||||
foreach (ObjectBase * o, sol) {
|
||||
o->calculateBoundingBox();
|
||||
bb |= o->boundingBox();
|
||||
}
|
||||
if (!bb.isEmpty())
|
||||
selection_center = bb.center();
|
||||
}
|
||||
if (bb.isEmpty())
|
||||
selection_center = sol[0]->worldPos();
|
||||
else
|
||||
selection_center = bb.center();
|
||||
axis_mat = QMatrix4x4();
|
||||
if ((sol.size() == 1) && (current_handle >= htRotateX)) {
|
||||
axis_mat.rotate(sol[0]->angles_.z(), 0., 0., 1.);
|
||||
axis_mat.rotate(sol[0]->angles_.y(), 0., 1., 0.);
|
||||
axis_mat.rotate(sol[0]->angles_.x(), 1., 0., 0.);
|
||||
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;
|
||||
}
|
||||
fillHandleObjects(selection_center, current_handle, axis_mat);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void RendererService::drawCurrentHandleObjects() {
|
||||
if (current_action == haNoAction) return;
|
||||
if (calculateCenter()) {
|
||||
HandleMesh ids[3];
|
||||
switch (current_action) {
|
||||
case haMove : ids[0] = hmMoveX ; ids[1] = hmMoveY ; ids[2] = hmMoveZ ; break;
|
||||
case haRotate: ids[0] = hmRotateX; ids[1] = hmRotateY; ids[2] = hmRotateZ; break;
|
||||
case haScale : ids[0] = hmScaleX ; ids[1] = hmScaleY ; ids[2] = hmScaleZ ; break;
|
||||
default: break;
|
||||
}
|
||||
fillHandleObjects(selection_center, ids, mat_xyz, color_xyz, axis_mat);
|
||||
Mesh * hm = currentHandleMesh();
|
||||
QVector<uchar> sel;
|
||||
sel.fill(0, 3);
|
||||
if (hm) {
|
||||
hm->loadObjects(r->view, cur_objects);
|
||||
hm->loadSelections(r->view, sel);
|
||||
hm->draw(r->view, 3);
|
||||
}
|
||||
if (current_action == haMove || current_action == haScale) {
|
||||
switch (current_action) {
|
||||
case haMove : ids[0] = hmMoveXY ; ids[1] = hmMoveXZ ; ids[2] = hmMoveYZ ; break;
|
||||
case haScale : ids[0] = hmScaleXY ; ids[1] = hmScaleXZ ; ids[2] = hmScaleYZ ; break;
|
||||
default: break;
|
||||
}
|
||||
hm = handle_ms_2_mesh;
|
||||
fillHandleObjects(selection_center, ids, mat_ms2, color_ms2, axis_mat);
|
||||
hm->loadObjects(r->view, cur_objects);
|
||||
hm->loadSelections(r->view, sel);
|
||||
hm->draw(r->view, 3);
|
||||
if (current_action == haScale) {
|
||||
hm = handle_scale_3_mesh;
|
||||
QVector<QMatrix4x4> mv; mv.resize(1);
|
||||
QVector<QVector4D> cv; cv.fill(QVector4D(0.9, 0.9, 0.7, 1), 1);
|
||||
ids[0] = hmMaxScale;
|
||||
fillHandleObjects(selection_center, ids, mv, cv, axis_mat, 1);
|
||||
hm->loadObjects(r->view, cur_objects);
|
||||
hm->loadSelections(r->view, sel);
|
||||
hm->draw(r->view, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RendererService::setObjectsColor(QVector<Object> & ol, QColor col) {
|
||||
QVector4D cv = QColor2QVector(col);
|
||||
for (int i = 0; i < ol.size(); ++i)
|
||||
@@ -210,16 +291,10 @@ void RendererService::renderService() {
|
||||
r->setUniformCamera(prog, r->view->camera());
|
||||
|
||||
/// handles
|
||||
if (fillCurrentHandleObjects()) {
|
||||
f->glEnable(GL_BLEND);
|
||||
f->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
Mesh * hm = currentHandleMesh();
|
||||
if (hm) {
|
||||
hm->loadObjects(r->view, cur_objects);
|
||||
hm->draw(f, 3);
|
||||
}
|
||||
f->glDisable(GL_BLEND);
|
||||
}
|
||||
f->glEnable(GL_BLEND);
|
||||
f->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
drawCurrentHandleObjects();
|
||||
f->glDisable(GL_BLEND);
|
||||
|
||||
/// axis
|
||||
f->glViewport(0, 0, axis_viewport.width(), axis_viewport.height());
|
||||
@@ -234,16 +309,10 @@ void RendererService::renderService() {
|
||||
|
||||
|
||||
Mesh * RendererService::currentHandleMesh() {
|
||||
switch (current_handle) {
|
||||
case htMoveX :
|
||||
case htMoveY :
|
||||
case htMoveZ : return handle_move_mesh;
|
||||
case htRotateX:
|
||||
case htRotateY:
|
||||
case htRotateZ: return handle_rotate_mesh;
|
||||
case htScaleX :
|
||||
case htScaleY :
|
||||
case htScaleZ : return handle_scale_mesh;
|
||||
switch (current_action) {
|
||||
case haMove : return handle_move_mesh;
|
||||
case haRotate: return handle_rotate_mesh;
|
||||
case haScale : return handle_scale_mesh;
|
||||
default: break;
|
||||
}
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user