git-svn-id: svn://db.shs.com.ru/libs@643 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -245,13 +245,14 @@ void Framebuffer::release() {
|
|||||||
|
|
||||||
|
|
||||||
void Framebuffer::setWriteBuffer(int index) {
|
void Framebuffer::setWriteBuffer(int index) {
|
||||||
//QVector<GLenum> buffers; buffers << GL_COLOR_ATTACHMENT0 + index;
|
unsetWriteBuffers();
|
||||||
GLenum e = GL_COLOR_ATTACHMENT0 + index;
|
GLenum e = GL_COLOR_ATTACHMENT0 + index;
|
||||||
f->glDrawBuffers(1, &e);
|
f->glDrawBuffers(1, &e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Framebuffer::setWriteBuffers(int * indeces, int count) {
|
void Framebuffer::setWriteBuffers(int * indeces, int count) {
|
||||||
|
unsetWriteBuffers();
|
||||||
QVector<GLenum> buffers;
|
QVector<GLenum> buffers;
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
buffers << GL_COLOR_ATTACHMENT0 + indeces[i];
|
buffers << GL_COLOR_ATTACHMENT0 + indeces[i];
|
||||||
@@ -267,6 +268,12 @@ void Framebuffer::setWriteBuffers() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Framebuffer::unsetWriteBuffers() {
|
||||||
|
QVector<GLenum> buffers(colors.size(), GL_NONE);
|
||||||
|
f->glDrawBuffers(buffers.size(), buffers.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Framebuffer::enablePixelBuffer() {
|
void Framebuffer::enablePixelBuffer() {
|
||||||
pbo.init(f);
|
pbo.init(f);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ public:
|
|||||||
void setWriteBuffer(int index);
|
void setWriteBuffer(int index);
|
||||||
void setWriteBuffers(int * indeces, int count);
|
void setWriteBuffers(int * indeces, int count);
|
||||||
void setWriteBuffers();
|
void setWriteBuffers();
|
||||||
|
void unsetWriteBuffers();
|
||||||
//void setColorFormat(GLenum format) {color_format = format; is_changed = true;}
|
//void setColorFormat(GLenum format) {color_format = format; is_changed = true;}
|
||||||
void enablePixelBuffer();
|
void enablePixelBuffer();
|
||||||
|
|
||||||
|
|||||||
@@ -405,3 +405,17 @@ Mesh * Primitive::coneFrame(int segments, float width, float length, float heigh
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Mesh * Primitive::lineFrame(QVector3D p0, QVector3D p1) {
|
||||||
|
Mesh * ret = new Mesh(GL_LINES);
|
||||||
|
QVector<QVector3D> & v(ret->vertices ());
|
||||||
|
QVector<QVector3D> & n(ret->normals ());
|
||||||
|
QVector<QVector2D> & t(ret->texcoords());
|
||||||
|
QVector< Vector2i> & ind(ret->indicesLines());
|
||||||
|
v << p0 << p1;
|
||||||
|
n << QVector3D(0,0,1) << QVector3D(0,0,1);
|
||||||
|
t << QVector2D(0,0) << QVector2D(1,0);
|
||||||
|
ind << Vector2i(0, 1);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ Mesh * arrow(int segments = 16, float thick = 0.04, float angle = 30.); // lengt
|
|||||||
Mesh * torus(int segments_main = 30, int segments_second = 16, float radius_main = 2.5, float radius_second = 0.5, float end_angle = 360.);
|
Mesh * torus(int segments_main = 30, int segments_second = 16, float radius_main = 2.5, float radius_second = 0.5, float end_angle = 360.);
|
||||||
|
|
||||||
|
|
||||||
|
Mesh * lineFrame(QVector3D p0, QVector3D p1);
|
||||||
|
|
||||||
Mesh * cubeFrame(float width = 1., float length = 1., float height = 1.);
|
Mesh * cubeFrame(float width = 1., float length = 1., float height = 1.);
|
||||||
|
|
||||||
Mesh * ellipsoidFrame(int segments_wl, int segments_h, float width = 1., float length = 1., float height = 1.);
|
Mesh * ellipsoidFrame(int segments_wl, int segments_h, float width = 1., float length = 1., float height = 1.);
|
||||||
|
|||||||
@@ -66,7 +66,10 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
|
|||||||
prog = new QOpenGLShaderProgram();
|
prog = new QOpenGLShaderProgram();
|
||||||
prog->removeAllShaders();
|
prog->removeAllShaders();
|
||||||
QFile f(file);
|
QFile f(file);
|
||||||
if (!f.open(QIODevice::ReadOnly)) return false;
|
if (!f.open(QIODevice::ReadOnly)) {
|
||||||
|
qDebug() << "[QGLView] Shader" << file << "Error: can`t open file!";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
QTextStream ts(&f);
|
QTextStream ts(&f);
|
||||||
QString cur_shader, line, pl, defs = prepareDefines(defines);
|
QString cur_shader, line, pl, defs = prepareDefines(defines);
|
||||||
QOpenGLShader::ShaderType type = 0;
|
QOpenGLShader::ShaderType type = 0;
|
||||||
|
|||||||
@@ -131,8 +131,10 @@ void RendererSelection::renderSelection(Scene & scene) {
|
|||||||
fbo_selection.queryPoints(0, r->mouse_rect);
|
fbo_selection.queryPoints(0, r->mouse_rect);
|
||||||
|
|
||||||
//qDebug() << id_hover;
|
//qDebug() << id_hover;
|
||||||
fbo_selection.bindColorTextures();
|
fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover );
|
||||||
fbo_selection.setWriteBuffers();
|
fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect);
|
||||||
|
int wind[2] = {2, 3};
|
||||||
|
fbo_selection.setWriteBuffers(wind, 2);
|
||||||
if (!view->hoverHalo_ && !view->selectionHalo_)
|
if (!view->hoverHalo_ && !view->selectionHalo_)
|
||||||
glClearFramebuffer(QColor(0,0,0,0), false);
|
glClearFramebuffer(QColor(0,0,0,0), false);
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ RendererService::RendererService(Renderer * r_): r(r_) {
|
|||||||
cone_mesh ->translatePoints(0,0,-0.5);
|
cone_mesh ->translatePoints(0,0,-0.5);
|
||||||
cone_mesh ->scalePoints(1.5);
|
cone_mesh ->scalePoints(1.5);
|
||||||
|
|
||||||
|
line_mesh_f = Primitive::lineFrame(QVector3D(), QVector3D(0, 0, -1));
|
||||||
|
|
||||||
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.02, 90);
|
handle_ms_2_mesh = Primitive::torus(8, 12, 0.5, 0.02, 90);
|
||||||
Mesh * m = Primitive::disc(8, 1., 1., true, 90);
|
Mesh * m = Primitive::disc(8, 1., 1., true, 90);
|
||||||
@@ -112,6 +114,7 @@ RendererService::~RendererService() {
|
|||||||
delete omni_mesh_f;
|
delete omni_mesh_f;
|
||||||
delete cone_mesh;
|
delete cone_mesh;
|
||||||
delete cone_mesh_f;
|
delete cone_mesh_f;
|
||||||
|
delete line_mesh_f;
|
||||||
delete axis_camera;
|
delete axis_camera;
|
||||||
delete axis_mesh;
|
delete axis_mesh;
|
||||||
delete handle_move_mesh;
|
delete handle_move_mesh;
|
||||||
@@ -137,12 +140,13 @@ void RendererService::resize(int width, int height) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QMatrix4x4 RendererService::invariantSizeMatrix(QVector3D p) {
|
QMatrix4x4 RendererService::invariantSizeMatrix(QVector3D p, double * ret_scale) {
|
||||||
QVector4D pos = QVector4D(p, 1.);
|
QVector4D pos = QVector4D(p, 1.);
|
||||||
double dist = -(v_mat * pos).z();
|
double dist = -(v_mat * pos).z();
|
||||||
QMatrix4x4 m;
|
QMatrix4x4 m;
|
||||||
m.translate(pos.toVector3D());
|
m.translate(pos.toVector3D());
|
||||||
m.scale(dist * size_full_scale);
|
m.scale(dist * size_full_scale);
|
||||||
|
if (ret_scale) *ret_scale = dist * size_full_scale;
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,13 +193,21 @@ void RendererService::fillSpotObjects() {
|
|||||||
Object o;
|
Object o;
|
||||||
cur_objects.clear();
|
cur_objects.clear();
|
||||||
cur_aims.clear();
|
cur_aims.clear();
|
||||||
|
cur_lines.clear();
|
||||||
|
double scl = 1.;
|
||||||
foreach (Light * l, ll) {
|
foreach (Light * l, ll) {
|
||||||
QMatrix4x4 m;
|
QMatrix4x4 m;
|
||||||
m = invariantSizeMatrix(l->worldPos()) * parentRotationMatrix(l);
|
m = invariantSizeMatrix(l->worldPos(), &scl) * parentRotationMatrix(l);
|
||||||
m.transposed().copyDataTo(o.modelmatrix);
|
m.transposed().copyDataTo(o.modelmatrix);
|
||||||
o.object_id = l->id_;
|
o.object_id = l->id_;
|
||||||
cur_objects << o;
|
cur_objects << o;
|
||||||
|
|
||||||
|
QMatrix4x4 sm;
|
||||||
|
sm.scale(1, 1, l->distance() / scl);
|
||||||
|
m = m * sm;
|
||||||
|
m.transposed().copyDataTo(o.modelmatrix);
|
||||||
|
//cur_lines << o;
|
||||||
|
|
||||||
m = invariantSizeMatrix(l->worldAim());
|
m = invariantSizeMatrix(l->worldAim());
|
||||||
m.transposed().copyDataTo(o.modelmatrix);
|
m.transposed().copyDataTo(o.modelmatrix);
|
||||||
o.object_id = l->id_ + 1;
|
o.object_id = l->id_ + 1;
|
||||||
@@ -330,12 +342,18 @@ void RendererService::drawLightsFrame(QColor color) {
|
|||||||
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone)));
|
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone)));
|
||||||
cone_mesh_f->loadSelections(v, rs.cur_selections_);
|
cone_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||||
cone_mesh_f->draw(v, cur_objects.size());
|
cone_mesh_f->draw(v, cur_objects.size());
|
||||||
|
|
||||||
setObjectsColor(cur_aims, color);
|
setObjectsColor(cur_aims, color);
|
||||||
box_mesh_f->loadObjects(v, cur_aims);
|
box_mesh_f->loadObjects(v, cur_aims);
|
||||||
box_mesh_f->loadSelections(v, rs.cur_selections_);
|
box_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||||
box_mesh_f->draw(v, cur_aims.size());
|
box_mesh_f->draw(v, cur_aims.size());
|
||||||
|
|
||||||
setObjectsColor(cur_aims, color);
|
setObjectsColor(cur_lines, color);
|
||||||
|
line_mesh_f->loadObjects(v, cur_lines);
|
||||||
|
r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone)));
|
||||||
|
line_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||||
|
line_mesh_f->draw(v, cur_lines.size());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
void init(int width, int height);
|
void init(int width, int height);
|
||||||
void resize(int width, int height);
|
void resize(int width, int height);
|
||||||
|
|
||||||
QMatrix4x4 invariantSizeMatrix(QVector3D p);
|
QMatrix4x4 invariantSizeMatrix(QVector3D p, double * ret_scale = 0);
|
||||||
QMatrix4x4 parentRotationMatrix(ObjectBase * o, bool self_rotation = true);
|
QMatrix4x4 parentRotationMatrix(ObjectBase * o, bool self_rotation = true);
|
||||||
void fillXYZObjects();
|
void fillXYZObjects();
|
||||||
void fillOmniObjects();
|
void fillOmniObjects();
|
||||||
@@ -86,11 +86,12 @@ private:
|
|||||||
Mesh * axis_mesh, * handle_move_mesh, * handle_rotate_mesh, * handle_scale_mesh;
|
Mesh * axis_mesh, * handle_move_mesh, * handle_rotate_mesh, * handle_scale_mesh;
|
||||||
Mesh * handle_ms_2_mesh, * handle_scale_3_mesh;
|
Mesh * handle_ms_2_mesh, * handle_scale_3_mesh;
|
||||||
Mesh * box_mesh_f, * omni_mesh_f, * cone_mesh_f, * box_mesh, * omni_mesh, * cone_mesh;
|
Mesh * box_mesh_f, * omni_mesh_f, * cone_mesh_f, * box_mesh, * omni_mesh, * cone_mesh;
|
||||||
|
Mesh * line_mesh_f;
|
||||||
QMatrix4x4 v_mat, axis_mat;
|
QMatrix4x4 v_mat, axis_mat;
|
||||||
QVector3D selection_center;
|
QVector3D selection_center;
|
||||||
QVector<QMatrix4x4> mat_xyz, mat_ms2;
|
QVector<QMatrix4x4> mat_xyz, mat_ms2;
|
||||||
QVector<QVector4D> color_xyz, color_ms2;
|
QVector<QVector4D> color_xyz, color_ms2;
|
||||||
QVector<QGLEngineShaders::Object> cur_objects, cur_aims;
|
QVector<QGLEngineShaders::Object> cur_objects, cur_aims, cur_lines;
|
||||||
Camera * axis_camera;
|
Camera * axis_camera;
|
||||||
QSize axis_viewport;
|
QSize axis_viewport;
|
||||||
HandleAction current_action;
|
HandleAction current_action;
|
||||||
|
|||||||
@@ -34,11 +34,9 @@ void main(void) {
|
|||||||
|
|
||||||
vec2 dp = diffPair(diffVector(fb_hover, hover_id));
|
vec2 dp = diffPair(diffVector(fb_hover, hover_id));
|
||||||
float v = diffAlpha(dp, hover_fill);
|
float v = diffAlpha(dp, hover_fill);
|
||||||
qgl_FragData[2] = has_hover*hh*v*vec4(hover_color.bgr, hover_color.a);
|
qgl_FragData[0] = has_hover*hh*v*vec4(hover_color.bgr, hover_color.a);
|
||||||
|
|
||||||
dp = diffPair(diffVector(fb_selection, vec4(1)));
|
dp = diffPair(diffVector(fb_selection, vec4(1)));
|
||||||
v = diffAlpha(dp, selection_fill);
|
v = diffAlpha(dp, selection_fill);
|
||||||
qgl_FragData[3] = has_selection*v*vec4(selection_color.bgr, selection_color.a);
|
qgl_FragData[1] = has_selection*v*vec4(selection_color.bgr, selection_color.a);
|
||||||
|
|
||||||
//qgl_FragData[3] = vec4(has_selection);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ void main(void) {
|
|||||||
object_color_g = qgl_ObjectColor;
|
object_color_g = qgl_ObjectColor;
|
||||||
//mat_scale = pow(qgl_ModelMatrix[0][0] * qgl_ModelMatrix[1][1] * qgl_ModelMatrix[2][2], 0.3333);
|
//mat_scale = pow(qgl_ModelMatrix[0][0] * qgl_ModelMatrix[1][1] * qgl_ModelMatrix[2][2], 0.3333);
|
||||||
mat_scale = pow(determinant(mat3(qgl_ModelMatrix)), 0.333);
|
mat_scale = pow(determinant(mat3(qgl_ModelMatrix)), 0.333);
|
||||||
|
//mat3 mm = transpose(mat3(qgl_ModelMatrix));
|
||||||
|
//mat_scale = min(min(dot(vec3(1), mm[0]), dot(vec3(1), mm[1])), dot(vec3(1), mm[2]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user