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

This commit is contained in:
2019-05-27 16:36:51 +00:00
parent 09e7268779
commit bb75525a3b
37 changed files with 926 additions and 683 deletions

View File

@@ -54,7 +54,6 @@ QString findFile(const QString & file, const QStringList & pathes) {
void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
QGLCI
glResetAllTransforms();
glSetPolygonMode(GL_FILL);
int loc = prog ? prog->attributeLocation("qgl_Color") : 0,
@@ -62,18 +61,19 @@ void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x,
loct = prog ? prog->attributeLocation("qgl_Texture") : 0,
locc = prog ? prog->attributeLocation("view_corner") : 0;
glBegin(GL_QUADS);
if (prog) {QGLC glVertexAttrib3f(loc, 1.f, 1.f, 1.f);} glColor3f(1.f, 1.f, 1.f);
if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[0]); QGLC glVertexAttrib2f(loct, 0.f, 0.f); QGLC glVertexAttrib2f(locv, x, y);} glTexCoord2f(0.f, 0.f); glVertex2f(x, y);
if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[1]); QGLC glVertexAttrib2f(loct, 1.f, 0.f); QGLC glVertexAttrib2f(locv, x + w, y);} glTexCoord2f(1.f, 0.f); glVertex2f(x + w, y);
if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[2]); QGLC glVertexAttrib2f(loct, 1.f, 1.f); QGLC glVertexAttrib2f(locv, x + w, y + h);} glTexCoord2f(1.f, 1.f); glVertex2f(x + w, y + h);
if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[3]); QGLC glVertexAttrib2f(loct, 0.f, 1.f); QGLC glVertexAttrib2f(locv, x, y + h);} glTexCoord2f(0.f, 1.f); glVertex2f(x, y + h);
QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();
if (prog) {glFuncs->glVertexAttrib3f(loc, 1.f, 1.f, 1.f);} glColor3f(1.f, 1.f, 1.f);
if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[0]); glFuncs->glVertexAttrib2f(loct, 0.f, 0.f); glFuncs->glVertexAttrib2f(locv, x, y);} glTexCoord2f(0.f, 0.f); glVertex2f(x, y);
if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[1]); glFuncs->glVertexAttrib2f(loct, 1.f, 0.f); glFuncs->glVertexAttrib2f(locv, x + w, y);} glTexCoord2f(1.f, 0.f); glVertex2f(x + w, y);
if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[2]); glFuncs->glVertexAttrib2f(loct, 1.f, 1.f); glFuncs->glVertexAttrib2f(locv, x + w, y + h);} glTexCoord2f(1.f, 1.f); glVertex2f(x + w, y + h);
if (prog) {if (corner_dirs) prog->setAttributeValue(locc, corner_dirs[3]); glFuncs->glVertexAttrib2f(loct, 0.f, 1.f); glFuncs->glVertexAttrib2f(locv, x, y + h);} glTexCoord2f(0.f, 1.f); glVertex2f(x, y + h);
glEnd();
}
QMatrix4x4 getGLMatrix(GLenum matrix) {
GLdouble gm[16];
glGetDoublev(matrix, gm);
GLfloat gm[16];
glGetFloatv(matrix, gm);
float qm[16];
for (int i = 0; i < 16; ++i)
qm[i] = gm[i];
@@ -82,22 +82,22 @@ QMatrix4x4 getGLMatrix(GLenum matrix) {
void setGLMatrix(QMatrix4x4 matrix) {
GLdouble gm[16];
GLfloat gm[16];
float qm[16];
matrix.transposed().copyDataTo(qm);
for (int i = 0; i < 16; ++i)
gm[i] = qm[i];
glLoadMatrixd(gm);
glLoadMatrixf(gm);
}
void qglMultMatrix(const QMatrix4x4 & m) {
GLdouble gm[16];
GLfloat gm[16];
float qm[16];
m.transposed().copyDataTo(qm);
for (int i = 0; i < 16; ++i)
gm[i] = qm[i];
glMultMatrixd(gm);
glMultMatrixf(gm);
}
@@ -109,7 +109,7 @@ void createGLTexture(GLuint & tex, int width, int height, const GLenum & format,
}
//glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
if (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_COMPONENT16 || format == GL_DEPTH_COMPONENT24 || format == GL_DEPTH_COMPONENT32)
glTexImage2D(target, 0, format, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
glTexImage2D(target, 0, format, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, nullptr);
else {
int t = GL_UNSIGNED_BYTE;
int f = GL_RGBA;
@@ -117,7 +117,7 @@ void createGLTexture(GLuint & tex, int width, int height, const GLenum & format,
t = GL_FLOAT;
if (format == GL_RGB32F || format == GL_RGB16F || format == GL_RGB8 || format == GL_RGB)
f = GL_RGB;
glTexImage2D(target, 0, format, width, height, 0, f, t, 0);
glTexImage2D(target, 0, format, width, height, 0, f, t, nullptr);
//glGenerateMipmap(target);
//qDebug() << "glTexImage2D" << width << height << QString::number(t, 16);
}
@@ -147,15 +147,15 @@ void createGLTexture(GLuint & tex, const QImage & image, const GLenum & format,
}
QMatrix4x4 glMatrixPerspective(double angle, double aspect, double near_, double far_) {
QMatrix4x4 glMatrixPerspective(float angle, float aspect, float near_, float far_) {
QMatrix4x4 ret;
double t = 1. / (tan(angle * deg2rad / 2.)), e = 2.4e-7;
float t = 1.f / (tanf(angle * deg2rad / 2.f)), e = 2.4e-7f;
ret(0, 0) = t / aspect;
ret(1, 1) = t;
ret(2, 2) = e - 1.;//far_ / (far_ - near_) - 1.;
ret(2, 3) = (e - 2.) * near_;//2. * far_ * near_ / (far_ - near_);
ret(3, 2) = -1.;
ret(3, 3) = 0.;
ret(2, 2) = e - 1.f;//far_ / (far_ - near_) - 1.;
ret(2, 3) = (e - 2.f) * near_;//2. * far_ * near_ / (far_ - near_);
ret(3, 2) = -1.f;
ret(3, 3) = 0.f;
return ret;
}
@@ -185,19 +185,19 @@ QImage rotateQImageRight(const QImage & im) {
QColor colorFromString(const QString & str) {
QString s = str.trimmed();
int i = s.indexOf("\t");
double r, g, b;
float r, g, b;
r = s.left(i).toFloat(); s = s.right(s.length() - i - 1); i = s.indexOf("\t");
g = s.left(i).toFloat(); s = s.right(s.length() - i - 1);
b = s.toFloat();
return QColor(r * 255., g * 255., b * 255.);
return QColor(r * 255.f, g * 255.f, b * 255.f);
}
QVector3D orthToVector(const QVector3D & v, const double & scale) {
QVector3D orthToVector(const QVector3D & v, const float & scale) {
if (v.isNull()) return QVector3D();
QVector3D rv, fn, sn;
if (v.x() != 0) rv.setZ(1.);
else if (v.y() != 0) rv.setX(1.);
if (v.x() != 0.f) rv.setZ(1.);
else if (v.y() != 0.f) rv.setX(1.);
else rv.setY(1.);
fn = QVector3D::crossProduct(v, rv).normalized();
sn = QVector3D::crossProduct(v, fn).normalized();
@@ -214,18 +214,18 @@ QVector3D rotateVector(const QVector3D & v, const QVector3D & a) {
}
void setVectorLength(QVector3D & v, const double & l) {
double vl = v.length();
if (vl == 0.) return;
double c = l / vl;
void setVectorLength(QVector3D & v, const float & l) {
float vl = v.length();
if (vl == 0.f) return;
float c = l / vl;
v *= c;
}
void lengthenVector(QVector3D & v, const double & l) {
double vl = v.length();
if (l == 0. || vl == 0.) return;
double c = 1. + l / vl;
void lengthenVector(QVector3D & v, const float & l) {
float vl = v.length();
if (l == 0.f || vl == 0.f) return;
float c = 1.f + l / vl;
v *= c;
}
@@ -276,26 +276,32 @@ void glClearFramebuffer(const QColor & color, bool depth) {
QGLViewBase::QGLViewBase() {
camera_ = new Camera();
textures_manager = new GLTextureManager();
}
Camera & QGLViewBase::camera() {
return *camera_;
QGLViewBase::~QGLViewBase() {
delete textures_manager;
}
const Camera & QGLViewBase::camera() const {
return *camera_;
Camera * QGLViewBase::camera() {
return camera_;
}
void QGLViewBase::setCamera(const Camera & camera) {
*camera_ = camera;
const Camera * QGLViewBase::camera() const {
return camera_;
}
void QGLViewBase::setCamera(Camera * camera) {
camera_ = camera;
}
GLTextureManagerBase * QGLViewBase::textureManager() {
return m_texture_manager;
return textures_manager;
}
@@ -307,9 +313,9 @@ Box3D::Box3D(const QVector<QVector3D> & points) {
iy = ay = points[0].y();
iz = az = points[0].z();
for (int i = 1; i < points.size(); ++i) {
ix = qMin<double>(ix, points[i].x()); ax = qMax<double>(ax, points[i].x());
iy = qMin<double>(iy, points[i].y()); ay = qMax<double>(ay, points[i].y());
iz = qMin<double>(iz, points[i].z()); az = qMax<double>(az, points[i].z());
ix = qMin<float>(ix, points[i].x()); ax = qMax<float>(ax, points[i].x());
iy = qMin<float>(iy, points[i].y()); ay = qMax<float>(ay, points[i].y());
iz = qMin<float>(iz, points[i].z()); az = qMax<float>(az, points[i].z());
}
x = ix;
y = iy;