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

This commit is contained in:
2019-12-03 18:29:26 +00:00
parent b1e1ad4aea
commit cb6fe2b7ef
10 changed files with 61 additions and 13 deletions

View File

@@ -245,13 +245,14 @@ void Framebuffer::release() {
void Framebuffer::setWriteBuffer(int index) {
//QVector<GLenum> buffers; buffers << GL_COLOR_ATTACHMENT0 + index;
unsetWriteBuffers();
GLenum e = GL_COLOR_ATTACHMENT0 + index;
f->glDrawBuffers(1, &e);
}
void Framebuffer::setWriteBuffers(int * indeces, int count) {
unsetWriteBuffers();
QVector<GLenum> buffers;
for (int i = 0; i < count; ++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() {
pbo.init(f);
}

View File

@@ -56,6 +56,7 @@ public:
void setWriteBuffer(int index);
void setWriteBuffers(int * indeces, int count);
void setWriteBuffers();
void unsetWriteBuffers();
//void setColorFormat(GLenum format) {color_format = format; is_changed = true;}
void enablePixelBuffer();

View File

@@ -405,3 +405,17 @@ Mesh * Primitive::coneFrame(int segments, float width, float length, float heigh
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;
}

View File

@@ -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 * lineFrame(QVector3D p0, QVector3D p1);
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.);

View File

@@ -66,7 +66,10 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
prog = new QOpenGLShaderProgram();
prog->removeAllShaders();
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);
QString cur_shader, line, pl, defs = prepareDefines(defines);
QOpenGLShader::ShaderType type = 0;

View File

@@ -131,8 +131,10 @@ void RendererSelection::renderSelection(Scene & scene) {
fbo_selection.queryPoints(0, r->mouse_rect);
//qDebug() << id_hover;
fbo_selection.bindColorTextures();
fbo_selection.setWriteBuffers();
fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover );
fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect);
int wind[2] = {2, 3};
fbo_selection.setWriteBuffers(wind, 2);
if (!view->hoverHalo_ && !view->selectionHalo_)
glClearFramebuffer(QColor(0,0,0,0), false);
else {

View File

@@ -75,6 +75,8 @@ RendererService::RendererService(Renderer * r_): r(r_) {
cone_mesh ->translatePoints(0,0,-0.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_ms_2_mesh = Primitive::torus(8, 12, 0.5, 0.02, 90);
Mesh * m = Primitive::disc(8, 1., 1., true, 90);
@@ -112,6 +114,7 @@ RendererService::~RendererService() {
delete omni_mesh_f;
delete cone_mesh;
delete cone_mesh_f;
delete line_mesh_f;
delete axis_camera;
delete axis_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.);
double dist = -(v_mat * pos).z();
QMatrix4x4 m;
m.translate(pos.toVector3D());
m.scale(dist * size_full_scale);
if (ret_scale) *ret_scale = dist * size_full_scale;
return m;
}
@@ -189,13 +193,21 @@ void RendererService::fillSpotObjects() {
Object o;
cur_objects.clear();
cur_aims.clear();
cur_lines.clear();
double scl = 1.;
foreach (Light * l, ll) {
QMatrix4x4 m;
m = invariantSizeMatrix(l->worldPos()) * parentRotationMatrix(l);
m = invariantSizeMatrix(l->worldPos(), &scl) * parentRotationMatrix(l);
m.transposed().copyDataTo(o.modelmatrix);
o.object_id = l->id_;
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.transposed().copyDataTo(o.modelmatrix);
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)));
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);
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());
}

View File

@@ -65,7 +65,7 @@ public:
void init(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);
void fillXYZObjects();
void fillOmniObjects();
@@ -86,11 +86,12 @@ private:
Mesh * axis_mesh, * handle_move_mesh, * handle_rotate_mesh, * handle_scale_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 * line_mesh_f;
QMatrix4x4 v_mat, axis_mat;
QVector3D selection_center;
QVector<QMatrix4x4> mat_xyz, mat_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;
QSize axis_viewport;
HandleAction current_action;

View File

@@ -34,11 +34,9 @@ void main(void) {
vec2 dp = diffPair(diffVector(fb_hover, hover_id));
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)));
v = diffAlpha(dp, selection_fill);
qgl_FragData[3] = has_selection*v*vec4(selection_color.bgr, selection_color.a);
//qgl_FragData[3] = vec4(has_selection);
qgl_FragData[1] = has_selection*v*vec4(selection_color.bgr, selection_color.a);
}

View File

@@ -8,6 +8,8 @@ void main(void) {
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(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]));
}