code format
This commit is contained in:
@@ -17,9 +17,10 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "glbuffer.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
|
||||
|
||||
Buffer::Buffer(GLenum target, GLenum _usage) {
|
||||
target_ = target;
|
||||
@@ -29,8 +30,7 @@ Buffer::Buffer(GLenum target, GLenum _usage) {
|
||||
}
|
||||
|
||||
|
||||
Buffer::~Buffer() {
|
||||
}
|
||||
Buffer::~Buffer() {}
|
||||
|
||||
|
||||
void Buffer::init(QOpenGLExtraFunctions * f) {
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
#include "gltypes.h"
|
||||
|
||||
|
||||
class Buffer
|
||||
{
|
||||
class Buffer {
|
||||
friend class ObjectBase;
|
||||
|
||||
public:
|
||||
Buffer(GLenum target, GLenum usage = GL_DYNAMIC_DRAW);
|
||||
~Buffer();
|
||||
@@ -52,7 +52,6 @@ private:
|
||||
GLenum target_, usage_;
|
||||
GLuint buffer_;
|
||||
int prev_size;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -16,8 +16,9 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "gltypes.h"
|
||||
#include "glcubemap.h"
|
||||
|
||||
#include "gltypes.h"
|
||||
#include "hdr_p.h"
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
@@ -62,8 +63,7 @@ QVector<QVector3D> loadFileHDR(const QString & path, QSize * size) {
|
||||
QDataStream ds(&f);
|
||||
int count = sz.width() * sz.height();
|
||||
QVector<float> data(count * 3);
|
||||
if (!RGBE_ReadPixels_RLE(&ds, data.data(), sz.width(), sz.height()))
|
||||
return ret;
|
||||
if (!RGBE_ReadPixels_RLE(&ds, data.data(), sz.width(), sz.height())) return ret;
|
||||
|
||||
if (size) *size = sz;
|
||||
ret.resize(count);
|
||||
@@ -71,9 +71,7 @@ QVector<QVector3D> loadFileHDR(const QString & path, QSize * size) {
|
||||
// QImage im(sz, QImage::Format_ARGB32);
|
||||
// QRgb * imdata = (QRgb*)im.bits();
|
||||
for (int i = 0; i < count; ++i) {
|
||||
QVector3D p(pow(data[i*3 + 2], 1. / 2.2),
|
||||
pow(data[i*3 + 1], 1. / 2.2),
|
||||
pow(data[i*3 + 0], 1. / 2.2));
|
||||
QVector3D p(pow(data[i * 3 + 2], 1. / 2.2), pow(data[i * 3 + 1], 1. / 2.2), pow(data[i * 3 + 0], 1. / 2.2));
|
||||
ret[i] = p;
|
||||
// col = QColor::fromRgbF(piClamp(p[0], 0.f, 1.f),
|
||||
// piClamp(p[1], 0.f, 1.f),
|
||||
@@ -151,7 +149,6 @@ QVector<QVector3D> faceHDR(const QVector<QVector3D> & data, QSize sz, QSize & fs
|
||||
}
|
||||
|
||||
|
||||
|
||||
CubeTexture::CubeTexture(QOpenGLExtraFunctions * f_, int _size, const GLenum & _format): f(f_) {
|
||||
size = _size;
|
||||
format_ = _format;
|
||||
@@ -200,7 +197,15 @@ void CubeTexture::loadHDR(const QVector<QVector3D> & data, QSize sz) {
|
||||
for (int i = 0; i < 6; ++i) {
|
||||
fd = faceHDR(data, sz, fsz, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i);
|
||||
// qDebug() << "load cube" << fd[0];
|
||||
f->glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, format_, fsz.width(), fsz.height(), 0, GL_RGB, GL_FLOAT, fd.isEmpty() ? 0 : fd.constData());
|
||||
f->glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
|
||||
0,
|
||||
format_,
|
||||
fsz.width(),
|
||||
fsz.height(),
|
||||
0,
|
||||
GL_RGB,
|
||||
GL_FLOAT,
|
||||
fd.isEmpty() ? 0 : fd.constData());
|
||||
// qDebug() << QString::number(GetLastError(), 16);
|
||||
}
|
||||
f->glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
|
||||
@@ -230,4 +235,3 @@ void CubeTexture::load() {
|
||||
}
|
||||
changed_ = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
#ifndef GLCUBEMAP_H
|
||||
#define GLCUBEMAP_H
|
||||
|
||||
#include "glshaders_types.h"
|
||||
#include "chunkstream.h"
|
||||
#include "glshaders_types.h"
|
||||
|
||||
QVector<QVector3D> loadFileHDR(const QString & path, QSize * size = 0);
|
||||
|
||||
@@ -31,17 +31,23 @@ public:
|
||||
void destroy();
|
||||
void bind(int channel = 0);
|
||||
void release();
|
||||
void resize(int _size) {size = _size; changed_ = true;}
|
||||
void resize(int _size) {
|
||||
size = _size;
|
||||
changed_ = true;
|
||||
}
|
||||
void loadHDR(const QVector<QVector3D> & data, QSize sz);
|
||||
void setFileHDR(const QString & path);
|
||||
QString fileHDR() const { return hdr_path; }
|
||||
GLenum format() const { return format_; }
|
||||
void setFormat(GLenum f) {format_ = f; changed_ = true;}
|
||||
void setFormat(GLenum f) {
|
||||
format_ = f;
|
||||
changed_ = true;
|
||||
}
|
||||
GLuint id() const { return id_; }
|
||||
bool isInit() const { return id_ != 0; }
|
||||
void load();
|
||||
private:
|
||||
|
||||
private:
|
||||
QOpenGLExtraFunctions * f;
|
||||
bool changed_;
|
||||
int size;
|
||||
|
||||
@@ -16,13 +16,15 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "glframebuffer.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <QTime>
|
||||
|
||||
|
||||
Framebuffer::Framebuffer(QOpenGLExtraFunctions * f_, int colorAttachments_, bool withDepth, GLenum colorFormat_, GLenum _target)
|
||||
: f(f_), pbo(GL_PIXEL_PACK_BUFFER, GL_STREAM_DRAW) {
|
||||
: f(f_)
|
||||
, pbo(GL_PIXEL_PACK_BUFFER, GL_STREAM_DRAW) {
|
||||
is_depth = withDepth;
|
||||
target_ = _target;
|
||||
color_formats.fill(colorFormat_, colorAttachments_);
|
||||
@@ -36,7 +38,8 @@ Framebuffer::Framebuffer(QOpenGLExtraFunctions * f_, int colorAttachments_, bool
|
||||
|
||||
|
||||
Framebuffer::Framebuffer(QOpenGLExtraFunctions * f_, QVector<GLenum> colors_, bool withDepth, GLenum _target)
|
||||
: f(f_), pbo(GL_PIXEL_PACK_BUFFER, GL_STREAM_DRAW) {
|
||||
: f(f_)
|
||||
, pbo(GL_PIXEL_PACK_BUFFER, GL_STREAM_DRAW) {
|
||||
is_depth = withDepth;
|
||||
target_ = _target;
|
||||
color_formats = colors_;
|
||||
@@ -152,8 +155,7 @@ uint Framebuffer::getPoint() const {
|
||||
uint ret = 0;
|
||||
pbo.bind(f);
|
||||
void * map = pbo.map(f, GL_MAP_READ_BIT, sizeof(uint));
|
||||
if (map)
|
||||
memcpy(&ret, map, sizeof(uint));
|
||||
if (map) memcpy(&ret, map, sizeof(uint));
|
||||
pbo.unmap(f);
|
||||
pbo.release(f);
|
||||
return ret;
|
||||
@@ -166,8 +168,7 @@ QVector<uint> Framebuffer::getPointsByte() const {
|
||||
ret.resize(pbo_queried);
|
||||
pbo.bind(f);
|
||||
void * map = pbo.map(f, GL_MAP_READ_BIT, pbo_queried * sizeof(uint));
|
||||
if (map)
|
||||
memcpy(ret.data(), map, pbo_queried * sizeof(uint));
|
||||
if (map) memcpy(ret.data(), map, pbo_queried * sizeof(uint));
|
||||
pbo.unmap(f);
|
||||
pbo.release(f);
|
||||
return ret;
|
||||
@@ -180,8 +181,7 @@ QVector<QVector4D> Framebuffer::getPointsFloat() const {
|
||||
ret.resize(pbo_queried);
|
||||
pbo.bind(f);
|
||||
void * map = pbo.map(f, GL_MAP_READ_BIT, pbo_queried * sizeof(QVector4D));
|
||||
if (map)
|
||||
memcpy(ret.data(), map, pbo_queried * sizeof(QVector4D));
|
||||
if (map) memcpy(ret.data(), map, pbo_queried * sizeof(QVector4D));
|
||||
pbo.unmap(f);
|
||||
pbo.release(f);
|
||||
return ret;
|
||||
@@ -195,8 +195,7 @@ QImage Framebuffer::getImage() const {
|
||||
int bytes = width() * height() * 4;
|
||||
pbo.bind(f);
|
||||
void * map = pbo.map(f, GL_MAP_READ_BIT, bytes);
|
||||
if (map)
|
||||
memcpy(ret.bits(), map, bytes);
|
||||
if (map) memcpy(ret.bits(), map, bytes);
|
||||
pbo.unmap(f);
|
||||
pbo.release(f);
|
||||
return ret;
|
||||
@@ -311,14 +310,12 @@ void Framebuffer::bindDepthTexture(int channel) {
|
||||
|
||||
|
||||
void Framebuffer::deleteGLRenderbuffer(GLuint & drbo) {
|
||||
if (drbo != 0)
|
||||
f->glDeleteRenderbuffers(1, &drbo);
|
||||
if (drbo != 0) f->glDeleteRenderbuffers(1, &drbo);
|
||||
drbo = 0;
|
||||
}
|
||||
|
||||
|
||||
void Framebuffer::deleteGLFramebuffer(GLuint & fbo) {
|
||||
if (fbo != 0)
|
||||
f->glDeleteFramebuffers(1, &fbo);
|
||||
if (fbo != 0) f->glDeleteFramebuffers(1, &fbo);
|
||||
fbo = 0;
|
||||
}
|
||||
|
||||
@@ -22,11 +22,15 @@
|
||||
#include "glbuffer.h"
|
||||
|
||||
|
||||
class Framebuffer
|
||||
{
|
||||
class Framebuffer {
|
||||
friend class FramebufferMipmap;
|
||||
|
||||
public:
|
||||
Framebuffer(QOpenGLExtraFunctions * f_, int colorAttachments = 1, bool withDepth = true, GLenum colorFormat = GL_RGBA8, GLenum _target = GL_TEXTURE_2D);
|
||||
Framebuffer(QOpenGLExtraFunctions * f_,
|
||||
int colorAttachments = 1,
|
||||
bool withDepth = true,
|
||||
GLenum colorFormat = GL_RGBA8,
|
||||
GLenum _target = GL_TEXTURE_2D);
|
||||
Framebuffer(QOpenGLExtraFunctions * f_, QVector<GLenum> colors_, bool withDepth = true, GLenum _target = GL_TEXTURE_2D);
|
||||
virtual ~Framebuffer();
|
||||
|
||||
@@ -49,7 +53,13 @@ public:
|
||||
QVector<QVector4D> getPointsFloat() const;
|
||||
QImage getImage() const;
|
||||
int queriedPoints() const { return pbo_queried; }
|
||||
void blit(int index_from, GLuint fb_to, int index_to, QRect from, QRect to, GLbitfield mask = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST) const;
|
||||
void blit(int index_from,
|
||||
GLuint fb_to,
|
||||
int index_to,
|
||||
QRect from,
|
||||
QRect to,
|
||||
GLbitfield mask = GL_COLOR_BUFFER_BIT,
|
||||
GLenum filter = GL_NEAREST) const;
|
||||
|
||||
void resize(int width, int height, bool force = false);
|
||||
void reinit();
|
||||
|
||||
@@ -16,8 +16,9 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "glframebuffer_mipmap.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <QTime>
|
||||
|
||||
|
||||
@@ -28,9 +29,7 @@ FramebufferMipmap::FramebufferMipmap(const Framebuffer & fb, int index_from_, in
|
||||
}
|
||||
|
||||
|
||||
FramebufferMipmap::~FramebufferMipmap() {
|
||||
|
||||
}
|
||||
FramebufferMipmap::~FramebufferMipmap() {}
|
||||
|
||||
|
||||
void FramebufferMipmap::resize() {
|
||||
|
||||
@@ -22,8 +22,7 @@
|
||||
#include "glframebuffer.h"
|
||||
|
||||
|
||||
class FramebufferMipmap
|
||||
{
|
||||
class FramebufferMipmap {
|
||||
public:
|
||||
FramebufferMipmap(const Framebuffer & fb, int index_from_, int levels = 2);
|
||||
virtual ~FramebufferMipmap();
|
||||
@@ -45,7 +44,6 @@ private:
|
||||
int index_from;
|
||||
const Framebuffer & src_fb;
|
||||
QVector<Framebuffer *> fbo;
|
||||
|
||||
};
|
||||
|
||||
#endif // GLFRAMEBUFFER_MIPMAP_H
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "gltypes.h"
|
||||
#include "gltexture_manager.h"
|
||||
#include "gltypes.h"
|
||||
#include "qglview.h"
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
@@ -41,8 +41,7 @@ void Map::setBitmapPath(const QString & p) {
|
||||
|
||||
|
||||
void Map::load(TextureManager * tm) {
|
||||
if (bitmap_id == 0)
|
||||
bitmap_id = tm->loadTexture(bitmap_path, true, _type == mtNormal);
|
||||
if (bitmap_id == 0) bitmap_id = tm->loadTexture(bitmap_path, true, _type == mtNormal);
|
||||
}
|
||||
|
||||
|
||||
@@ -60,8 +59,6 @@ void Map::copyToQGLMap(QGLMap & m) const {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Material::Material(const QString _name) {
|
||||
setTypes();
|
||||
name = _name;
|
||||
@@ -89,11 +86,7 @@ bool Material::hasTransparency() const {
|
||||
|
||||
|
||||
bool Material::isMapsChanged() const {
|
||||
return map_diffuse ._changed ||
|
||||
map_normal ._changed ||
|
||||
map_metalness._changed ||
|
||||
map_roughness._changed ||
|
||||
map_emission ._changed ||
|
||||
return map_diffuse._changed || map_normal._changed || map_metalness._changed || map_roughness._changed || map_emission._changed ||
|
||||
map_relief._changed;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
#ifndef GLMATERIAL_H
|
||||
#define GLMATERIAL_H
|
||||
|
||||
#include "glshaders_types.h"
|
||||
#include "chunkstream.h"
|
||||
#include "glshaders_types.h"
|
||||
|
||||
|
||||
class Map {
|
||||
@@ -75,24 +75,33 @@ public:
|
||||
|
||||
inline QDataStream & operator<<(QDataStream & s, const Map & m) {
|
||||
ChunkStream cs;
|
||||
cs.add(1, m.bitmap_path).add(2, m.color_amount).add(3, m.color_offset).add(6, m.bitmap_scale)
|
||||
.add(7, m.use_bitmap);
|
||||
s << cs.data(); return s;
|
||||
cs.add(1, m.bitmap_path).add(2, m.color_amount).add(3, m.color_offset).add(6, m.bitmap_scale).add(7, m.use_bitmap);
|
||||
s << cs.data();
|
||||
return s;
|
||||
}
|
||||
inline QDataStream & operator>>(QDataStream & s, Map & m) {
|
||||
ChunkStream cs(s);
|
||||
cs.readAll();
|
||||
cs.get(1, m.bitmap_path).get(2, m.color_amount).get(3, m.color_offset).get(6, m.bitmap_scale)
|
||||
.get(7, m.use_bitmap);
|
||||
cs.get(1, m.bitmap_path).get(2, m.color_amount).get(3, m.color_offset).get(6, m.bitmap_scale).get(7, m.use_bitmap);
|
||||
return s;
|
||||
}
|
||||
|
||||
inline QDataStream & operator<<(QDataStream & s, const Material * m) {
|
||||
ChunkStream cs;
|
||||
cs.add(1, m->name).add(2, m->color_diffuse).add(4, m->color_emission)
|
||||
.add(5, m->transparency).add(6, m->reflectivity).add(7, m->glass).add(8, m->map_diffuse).add(9, m->map_normal)
|
||||
.add(10, m->map_relief).add(11, m->map_metalness).add(12, m->map_roughness).add(13, m->map_emission);
|
||||
s << (cs.data()); return s;
|
||||
cs.add(1, m->name)
|
||||
.add(2, m->color_diffuse)
|
||||
.add(4, m->color_emission)
|
||||
.add(5, m->transparency)
|
||||
.add(6, m->reflectivity)
|
||||
.add(7, m->glass)
|
||||
.add(8, m->map_diffuse)
|
||||
.add(9, m->map_normal)
|
||||
.add(10, m->map_relief)
|
||||
.add(11, m->map_metalness)
|
||||
.add(12, m->map_roughness)
|
||||
.add(13, m->map_emission);
|
||||
s << (cs.data());
|
||||
return s;
|
||||
}
|
||||
inline QDataStream & operator>>(QDataStream & s, Material *& m) {
|
||||
m = new Material();
|
||||
|
||||
@@ -17,18 +17,21 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "glmesh.h"
|
||||
|
||||
#include "globject.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <QTime>
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
// static int _count = 0;
|
||||
|
||||
Mesh::Mesh(GLenum geom_type_): geom_type(geom_type_),
|
||||
buffer_geom(GL_ARRAY_BUFFER, GL_STATIC_DRAW),
|
||||
buffer_ind (GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW) {
|
||||
Mesh::Mesh(GLenum geom_type_)
|
||||
: geom_type(geom_type_)
|
||||
, buffer_geom(GL_ARRAY_BUFFER, GL_STATIC_DRAW)
|
||||
, buffer_ind(GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW) {
|
||||
hash_ = 0;
|
||||
changed = hash_changed = true;
|
||||
// qDebug() << "Mesh, now" << ++_count;
|
||||
@@ -145,8 +148,7 @@ VertexObject * Mesh::vaoByType(int type) {
|
||||
bool Mesh::rebuffer(QOpenGLExtraFunctions * f) {
|
||||
changed = false;
|
||||
if (vertices_.isEmpty()) return true;
|
||||
if (normals_.isEmpty())
|
||||
calculateNormals();
|
||||
if (normals_.isEmpty()) calculateNormals();
|
||||
calculateTangents();
|
||||
vert_count = qMin(vertices_.size(), normals_.size());
|
||||
vert_count = qMin(vert_count, tangents_.size());
|
||||
@@ -301,8 +303,7 @@ void Mesh::transformPoints(const QMatrix4x4 & mat) {
|
||||
int vcnt = vertices_.size(), ncnt = normals_.size();
|
||||
for (int i = 0; i < vcnt; ++i) {
|
||||
vertices_[i] = (mat * QVector4D(vertices_[i], 1)).toVector3D();
|
||||
if (i < ncnt)
|
||||
normals_[i] = (mat * QVector4D(normals_[i], 0)).toVector3D();
|
||||
if (i < ncnt) normals_[i] = (mat * QVector4D(normals_[i], 0)).toVector3D();
|
||||
}
|
||||
changed = hash_changed = true;
|
||||
}
|
||||
@@ -407,10 +408,10 @@ Box3D Mesh::boundingBox() const {
|
||||
QDataStream & operator<<(QDataStream & s, const Mesh * m) {
|
||||
ChunkStream cs;
|
||||
// qDebug() << "place VBO" << m.vertices_.size() << m.normals_.size() << m.texcoords_.size() << m.colors_.size() << "...";
|
||||
cs.add(1, m->vertices_).add(2, m->normals_).add(3, m->texcoords_)
|
||||
.add(6, m->triangles_).add(7, m->lines_).add(10, int(m->geom_type));
|
||||
cs.add(1, m->vertices_).add(2, m->normals_).add(3, m->texcoords_).add(6, m->triangles_).add(7, m->lines_).add(10, int(m->geom_type));
|
||||
// qDebug() << "place VBO done" << cs.data().size() << "...";
|
||||
s << cs.data(); return s;
|
||||
s << cs.data();
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -19,14 +19,15 @@
|
||||
#ifndef GLMESH_H
|
||||
#define GLMESH_H
|
||||
|
||||
#include <chunkstream.h>
|
||||
#include "glvertexobject.h"
|
||||
|
||||
#include <chunkstream.h>
|
||||
|
||||
class Mesh
|
||||
{
|
||||
|
||||
class Mesh {
|
||||
friend QDataStream & operator<<(QDataStream & s, const Mesh * m);
|
||||
friend QDataStream & operator>>(QDataStream & s, Mesh *& m);
|
||||
|
||||
public:
|
||||
Mesh(GLenum geom_type_ = GL_TRIANGLES);
|
||||
~Mesh();
|
||||
@@ -57,18 +58,35 @@ public:
|
||||
void setAllObjectsChanged(bool yes = true);
|
||||
void setAllSelectionChanged(bool yes = true);
|
||||
|
||||
QVector<QVector3D> & vertices () {changed = hash_changed = true; return vertices_;}
|
||||
QVector<QVector3D> & normals () {changed = hash_changed = true; return normals_;}
|
||||
QVector<QVector2D> & texcoords() {changed = hash_changed = true; return texcoords_;}
|
||||
QVector< Vector3i> & indicesTriangles() {changed = hash_changed = true; return triangles_;}
|
||||
QVector< Vector2i> & indicesLines () {changed = hash_changed = true; return lines_;}
|
||||
QVector<QVector3D> & vertices() {
|
||||
changed = hash_changed = true;
|
||||
return vertices_;
|
||||
}
|
||||
QVector<QVector3D> & normals() {
|
||||
changed = hash_changed = true;
|
||||
return normals_;
|
||||
}
|
||||
QVector<QVector2D> & texcoords() {
|
||||
changed = hash_changed = true;
|
||||
return texcoords_;
|
||||
}
|
||||
QVector<Vector3i> & indicesTriangles() {
|
||||
changed = hash_changed = true;
|
||||
return triangles_;
|
||||
}
|
||||
QVector<Vector2i> & indicesLines() {
|
||||
changed = hash_changed = true;
|
||||
return lines_;
|
||||
}
|
||||
|
||||
void translatePoints(const QVector3D & dp);
|
||||
void translatePoints(const double & x, const double & y, const double & z) { translatePoints(QVector3D(x, y, z)); }
|
||||
void scalePoints(const QVector3D & dp);
|
||||
void scalePoints(const double & s) { scalePoints(QVector3D(s, s, s)); }
|
||||
void rotatePoints(const double & angle, const QVector3D & a);
|
||||
void rotatePoints (const double & angle, const double & x, const double & y, const double & z) {rotatePoints(angle, QVector3D(x, y, z));}
|
||||
void rotatePoints(const double & angle, const double & x, const double & y, const double & z) {
|
||||
rotatePoints(angle, QVector3D(x, y, z));
|
||||
}
|
||||
void transformPoints(const QMatrix4x4 & mat);
|
||||
void flipNormals();
|
||||
void append(const Mesh * m);
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
|
||||
#include "glprimitives.h"
|
||||
|
||||
#include "glmesh.h"
|
||||
|
||||
|
||||
@@ -27,7 +28,8 @@ Mesh * Primitive::plane(float width, float length) {
|
||||
QVector<QVector2D> & t(ret->texcoords());
|
||||
QVector<Vector3i> & i(ret->indicesTriangles());
|
||||
float hw = width / 2.f, hl = length / 2.f;
|
||||
for (int j = 0; j < 4; ++j) n << QVector3D(0., 0., 1.);
|
||||
for (int j = 0; j < 4; ++j)
|
||||
n << QVector3D(0., 0., 1.);
|
||||
t << QVector2D(0., 0.) << QVector2D(0., 1.) << QVector2D(1., 1.) << QVector2D(1., 0.);
|
||||
v << QVector3D(-hw, -hl, 0.) << QVector3D(-hw, hl, 0.) << QVector3D(hw, hl, 0.) << QVector3D(hw, -hl, 0.);
|
||||
i << Vector3i(0, 2, 1) << Vector3i(0, 3, 2);
|
||||
@@ -47,7 +49,8 @@ Mesh * Primitive::cube(float width, float length, float height) {
|
||||
QMatrix4x4 mat;
|
||||
|
||||
si = v.size();
|
||||
for (int j = 0; j < 4; ++j) n << QVector3D(0., -1., 0.);
|
||||
for (int j = 0; j < 4; ++j)
|
||||
n << QVector3D(0., -1., 0.);
|
||||
t << QVector2D(0., 0.) << QVector2D(1., 0.) << QVector2D(1., 1.) << QVector2D(0., 1.);
|
||||
v << QVector3D(-hs, -hs, -hs) << QVector3D(hs, -hs, -hs) << QVector3D(hs, -hs, hs) << QVector3D(-hs, -hs, hs);
|
||||
i << Vector3i(si + 0, si + 1, si + 2) << Vector3i(si + 0, si + 2, si + 3);
|
||||
@@ -194,8 +197,7 @@ Mesh * Primitive::cone(int segments, float radius, float height) {
|
||||
t << QVector2D((double)i / (seg - 1), 0.f);
|
||||
n << coneNormal(radius, height, a);
|
||||
int si = v.size() - 1;
|
||||
if (i > 0)
|
||||
ind << Vector3i(si - 1, si - 2, si);
|
||||
if (i > 0) ind << Vector3i(si - 1, si - 2, si);
|
||||
}
|
||||
|
||||
Mesh * cap = Primitive::disc(segments, radius);
|
||||
@@ -229,7 +231,8 @@ Mesh * Primitive::cylinder(int segments, float radius, float height, float end_a
|
||||
v << cp;
|
||||
t << QVector2D((double)i / (seg - 1), 0.f);
|
||||
t << QVector2D((double)i / (seg - 1), 1.f);
|
||||
n << norm; n << norm;
|
||||
n << norm;
|
||||
n << norm;
|
||||
int si = v.size() - 1;
|
||||
if (i > 0) {
|
||||
ind << Vector3i(si - 2, si - 1, si);
|
||||
@@ -328,8 +331,6 @@ Mesh * Primitive::torus(int segments_main, int segments_second, float radius_mai
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Mesh * Primitive::cubeFrame(float width, float length, float height) {
|
||||
Mesh * ret = new Mesh(GL_LINES);
|
||||
QVector3D scale(width, length, height);
|
||||
|
||||
@@ -50,6 +50,6 @@ Mesh * ellipsoidFrame(int segments_wl, int segments_h, float radius = 1.);
|
||||
|
||||
Mesh * coneFrame(int segments, float radius = 1., float height = 1.);
|
||||
|
||||
}
|
||||
} // namespace Primitive
|
||||
|
||||
#endif // GLPRIMITIVE_CUBE_H
|
||||
|
||||
@@ -16,15 +16,21 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "glshaders.h"
|
||||
|
||||
#include "glshaders_headers.h"
|
||||
#include "gltypes.h"
|
||||
#include "qglview.h"
|
||||
#include "glshaders.h"
|
||||
#include "glshaders_headers.h"
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
|
||||
bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QString & content, const QString & file, bool add_qgl, const QString & defs) {
|
||||
bool addShader(QOpenGLShaderProgram * prog,
|
||||
QOpenGLShader::ShaderType type,
|
||||
QString & content,
|
||||
const QString & file,
|
||||
bool add_qgl,
|
||||
const QString & defs) {
|
||||
if (type == 0 || content.isEmpty()) {
|
||||
content.clear();
|
||||
return true;
|
||||
@@ -37,12 +43,8 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
|
||||
content.prepend(qgl_uniform);
|
||||
content.prepend(qgl_structs);
|
||||
break;
|
||||
case QOpenGLShader::Vertex :
|
||||
content.prepend(qgl_vertex_head );
|
||||
break;
|
||||
case QOpenGLShader::Geometry:
|
||||
content.prepend(qgl_geometry_head);
|
||||
break;
|
||||
case QOpenGLShader::Vertex: content.prepend(qgl_vertex_head); break;
|
||||
case QOpenGLShader::Geometry: content.prepend(qgl_geometry_head); break;
|
||||
}
|
||||
}
|
||||
content.prepend(defs);
|
||||
@@ -64,8 +66,7 @@ QString prepareDefines(const QStringList & defines) {
|
||||
|
||||
|
||||
bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, bool add_qgl, const QStringList & defines) {
|
||||
if (!prog)
|
||||
prog = new QOpenGLShaderProgram();
|
||||
if (!prog) prog = new QOpenGLShaderProgram();
|
||||
QFile f(file);
|
||||
if (!f.open(QIODevice::ReadOnly)) {
|
||||
qDebug() << "[QGLEngine] Shader" << file << "Error: can`t open file!";
|
||||
@@ -117,8 +118,7 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
|
||||
|
||||
|
||||
bool QGLEngineShaders::loadShaders(QOpenGLShaderProgram *& prog, const QStringList & files, bool add_qgl, const QStringList & defines) {
|
||||
if (!prog)
|
||||
prog = new QOpenGLShaderProgram();
|
||||
if (!prog) prog = new QOpenGLShaderProgram();
|
||||
prog->removeAllShaders();
|
||||
QString cur_shader, defs = prepareDefines(defines);
|
||||
foreach(QString f, files) {
|
||||
|
||||
@@ -26,6 +26,6 @@ namespace QGLEngineShaders {
|
||||
bool loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, bool add_qgl = true, const QStringList & defines = QStringList());
|
||||
bool loadShaders(QOpenGLShaderProgram *& prog, const QStringList & files, bool add_qgl = true, const QStringList & defines = QStringList());
|
||||
|
||||
}
|
||||
} // namespace QGLEngineShaders
|
||||
|
||||
#endif // GLSHADERS_H
|
||||
|
||||
@@ -24,12 +24,10 @@ namespace QGLEngineShaders {
|
||||
const int max_materials = 128;
|
||||
const int max_lights = 256;
|
||||
|
||||
const char qgl_common_head[] =
|
||||
"#version 400 core\n"
|
||||
const char qgl_common_head[] = "#version 400 core\n"
|
||||
"";
|
||||
|
||||
const char qgl_vertex_head[] =
|
||||
"layout(location = 1 ) in vec3 qgl_Vertex ;\n"
|
||||
const char qgl_vertex_head[] = "layout(location = 1 ) in vec3 qgl_Vertex ;\n"
|
||||
"layout(location = 2 ) in vec3 qgl_Normal ;\n"
|
||||
"layout(location = 3 ) in vec3 qgl_Tangent ;\n"
|
||||
"layout(location = 4 ) in vec3 qgl_Bitangent ;\n"
|
||||
@@ -63,11 +61,9 @@ const char qgl_fragment_head[] =
|
||||
"#define qgl_FragColor qgl_FragData[0]\n"
|
||||
"";
|
||||
|
||||
const char qgl_geometry_head[] =
|
||||
"";
|
||||
const char qgl_geometry_head[] = "";
|
||||
|
||||
const char qgl_structs[] =
|
||||
"#define QGL_MAPS_COUNT 6\n"
|
||||
const char qgl_structs[] = "#define QGL_MAPS_COUNT 6\n"
|
||||
"#define QGL_MAP_DIFFUSE 0\n"
|
||||
"#define QGL_MAP_NORMAL 1\n"
|
||||
"#define QGL_MAP_METALNESS 2\n"
|
||||
@@ -103,8 +99,7 @@ const char qgl_structs[] =
|
||||
"};\n"
|
||||
"";
|
||||
|
||||
const char qgl_uniform[] =
|
||||
"layout (std140) uniform QGLMaterialData {\n"
|
||||
const char qgl_uniform[] = "layout (std140) uniform QGLMaterialData {\n"
|
||||
" QGLMaterial qgl_material[128];\n"
|
||||
"};\n"
|
||||
"layout (std140) uniform QGLLightParameterData {\n"
|
||||
@@ -116,6 +111,6 @@ const char qgl_uniform[] =
|
||||
"uniform sampler2DArray qgl_texture_array[2];\n"
|
||||
"";
|
||||
|
||||
}
|
||||
} // namespace QGLEngineShaders
|
||||
|
||||
#endif // GLSHADERS_HEADERS_H
|
||||
|
||||
@@ -73,7 +73,12 @@ void QGLEngineShaders::prepareDrawObj(QOpenGLExtraFunctions * f) {
|
||||
f->glVertexAttribIPointer(object_id_loc, 1, GL_UNSIGNED_INT, size, (const void *)object_id_offset);
|
||||
f->glVertexAttribPointer(color_loc, 4, GL_FLOAT, GL_FALSE, size, (const void *)color_offset);
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
f->glVertexAttribPointer(modelmatrix_loc + i, 4, GL_FLOAT, GL_FALSE, size, (const void *)(modelmatrix_offset + sizeof(QVector4D)*i));
|
||||
f->glVertexAttribPointer(modelmatrix_loc + i,
|
||||
4,
|
||||
GL_FLOAT,
|
||||
GL_FALSE,
|
||||
size,
|
||||
(const void *)(modelmatrix_offset + sizeof(QVector4D) * i));
|
||||
}
|
||||
|
||||
f->glVertexAttribDivisor(material_loc, 1);
|
||||
@@ -82,7 +87,6 @@ void QGLEngineShaders::prepareDrawObj(QOpenGLExtraFunctions * f) {
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
f->glVertexAttribDivisor(modelmatrix_loc + i, 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -93,5 +97,4 @@ void QGLEngineShaders::prepareDrawSel(QOpenGLExtraFunctions * f) {
|
||||
GLsizei size = 1;
|
||||
f->glVertexAttribIPointer(is_selected_loc, 1, GL_UNSIGNED_BYTE, size, (const void *)is_selected_offset);
|
||||
f->glVertexAttribDivisor(is_selected_loc, 1);
|
||||
|
||||
}
|
||||
|
||||
@@ -137,6 +137,6 @@ void prepareDrawObj (QOpenGLExtraFunctions * f);
|
||||
void prepareDrawSel(QOpenGLExtraFunctions * f);
|
||||
|
||||
|
||||
}
|
||||
} // namespace QGLEngineShaders
|
||||
|
||||
#endif // GLSHADERS_TYPES_H
|
||||
|
||||
@@ -17,9 +17,10 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "gltexturearray.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
|
||||
|
||||
Texture2DArray::Texture2DArray(bool filter) {
|
||||
target_ = GL_TEXTURE_2D_ARRAY;
|
||||
@@ -29,8 +30,7 @@ Texture2DArray::Texture2DArray(bool filter) {
|
||||
}
|
||||
|
||||
|
||||
Texture2DArray::~Texture2DArray() {
|
||||
}
|
||||
Texture2DArray::~Texture2DArray() {}
|
||||
|
||||
|
||||
void Texture2DArray::init(QOpenGLExtraFunctions * f) {
|
||||
@@ -88,9 +88,8 @@ bool Texture2DArray::resize(QOpenGLExtraFunctions * f, QSize new_size, int layer
|
||||
|
||||
void Texture2DArray::load(QOpenGLExtraFunctions * f, const QImage & image, int layer) {
|
||||
if (image.isNull() || size_.isNull() || layer < 0 || layer >= layers_) return;
|
||||
QImage im = image.mirrored(false, true)
|
||||
.scaled(size_, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)
|
||||
.convertToFormat(QImage::Format_RGBA8888);
|
||||
QImage im =
|
||||
image.mirrored(false, true).scaled(size_, Qt::IgnoreAspectRatio, Qt::SmoothTransformation).convertToFormat(QImage::Format_RGBA8888);
|
||||
// qDebug() << "Texture2DArray::load image" << image.size() << "to layer" << layer;
|
||||
f->glTexSubImage3D(target_, 0, 0, 0, layer, size_.width(), size_.height(), 1, GL_RGBA, GL_UNSIGNED_BYTE, im.constBits());
|
||||
}
|
||||
|
||||
@@ -22,8 +22,7 @@
|
||||
#include "gltypes.h"
|
||||
|
||||
|
||||
class Texture2DArray
|
||||
{
|
||||
class Texture2DArray {
|
||||
public:
|
||||
Texture2DArray(bool filter);
|
||||
~Texture2DArray();
|
||||
|
||||
@@ -18,7 +18,9 @@
|
||||
|
||||
|
||||
#include "gltransform.h"
|
||||
|
||||
#include "gltypes.h"
|
||||
|
||||
#include <cmath>
|
||||
|
||||
|
||||
@@ -26,11 +28,23 @@ inline void composeQMatrix4x4(const QVector3D & position, const QVector3D & orie
|
||||
const QMatrix3x3 rot3x3(Transform::toRotationMatrix(orientation));
|
||||
|
||||
// set up final matrix with scale, rotation and translation
|
||||
m(0, 0) = scale.x() * rot3x3(0, 0); m(0, 1) = scale.y() * rot3x3(0, 1); m(0, 2) = scale.z() * rot3x3(0, 2); m(0, 3) = position.x();
|
||||
m(1, 0) = scale.x() * rot3x3(1, 0); m(1, 1) = scale.y() * rot3x3(1, 1); m(1, 2) = scale.z() * rot3x3(1, 2); m(1, 3) = position.y();
|
||||
m(2, 0) = scale.x() * rot3x3(2, 0); m(2, 1) = scale.y() * rot3x3(2, 1); m(2, 2) = scale.z() * rot3x3(2, 2); m(2, 3) = position.z();
|
||||
m(0, 0) = scale.x() * rot3x3(0, 0);
|
||||
m(0, 1) = scale.y() * rot3x3(0, 1);
|
||||
m(0, 2) = scale.z() * rot3x3(0, 2);
|
||||
m(0, 3) = position.x();
|
||||
m(1, 0) = scale.x() * rot3x3(1, 0);
|
||||
m(1, 1) = scale.y() * rot3x3(1, 1);
|
||||
m(1, 2) = scale.z() * rot3x3(1, 2);
|
||||
m(1, 3) = position.y();
|
||||
m(2, 0) = scale.x() * rot3x3(2, 0);
|
||||
m(2, 1) = scale.y() * rot3x3(2, 1);
|
||||
m(2, 2) = scale.z() * rot3x3(2, 2);
|
||||
m(2, 3) = position.z();
|
||||
// no projection term
|
||||
m(3, 0) = 0.0f; m(3, 1) = 0.0f; m(3, 2) = 0.0f; m(3, 3) = 1.0f;
|
||||
m(3, 0) = 0.0f;
|
||||
m(3, 1) = 0.0f;
|
||||
m(3, 2) = 0.0f;
|
||||
m(3, 3) = 1.0f;
|
||||
}
|
||||
|
||||
inline void decomposeQMatrix3x3(const QMatrix3x3 & m, QMatrix3x3 & Q, QVector3D & D, QVector3D & U) {
|
||||
@@ -89,11 +103,9 @@ inline void decomposeQMatrix3x3(const QMatrix3x3 & m, QMatrix3x3 & Q, QVector3D
|
||||
Q(2, 2) *= invLen;
|
||||
|
||||
// guarantee that orthogonal matrix has determinant 1 (no reflections)
|
||||
const float det = Q(0, 0) * Q(1, 1) * Q(2, 2) + Q(0, 1) * Q(1, 2) * Q(2, 0) +
|
||||
Q(0, 2) * Q(1, 0) * Q(2, 1) - Q(0, 2) * Q(1, 1) * Q(2, 0) -
|
||||
Q(0, 1) * Q(1, 0) * Q(2, 2) - Q(0, 0) * Q(1, 2) * Q(2, 1);
|
||||
if (det < 0.0f)
|
||||
Q *= -1.0f;
|
||||
const float det = Q(0, 0) * Q(1, 1) * Q(2, 2) + Q(0, 1) * Q(1, 2) * Q(2, 0) + Q(0, 2) * Q(1, 0) * Q(2, 1) -
|
||||
Q(0, 2) * Q(1, 1) * Q(2, 0) - Q(0, 1) * Q(1, 0) * Q(2, 2) - Q(0, 0) * Q(1, 2) * Q(2, 1);
|
||||
if (det < 0.0f) Q *= -1.0f;
|
||||
|
||||
// build "right" matrix R
|
||||
QMatrix3x3 R(Qt::Uninitialized);
|
||||
@@ -118,17 +130,13 @@ inline void decomposeQMatrix3x3(const QMatrix3x3 & m, QMatrix3x3 & Q, QVector3D
|
||||
inline bool hasScale(const QMatrix4x4 & m) {
|
||||
// If the columns are orthonormal and form a right-handed system, then there is no scale
|
||||
float t(m.determinant());
|
||||
if (!qFuzzyIsNull(t - 1.0f))
|
||||
return true;
|
||||
if (!qFuzzyIsNull(t - 1.0f)) return true;
|
||||
t = m(0, 0) * m(0, 0) + m(1, 0) * m(1, 0) + m(2, 0) * m(2, 0);
|
||||
if (!qFuzzyIsNull(t - 1.0f))
|
||||
return true;
|
||||
if (!qFuzzyIsNull(t - 1.0f)) return true;
|
||||
t = m(0, 1) * m(0, 1) + m(1, 1) * m(1, 1) + m(2, 1) * m(2, 1);
|
||||
if (!qFuzzyIsNull(t - 1.0f))
|
||||
return true;
|
||||
if (!qFuzzyIsNull(t - 1.0f)) return true;
|
||||
t = m(0, 2) * m(0, 2) + m(1, 2) * m(1, 2) + m(2, 2) * m(2, 2);
|
||||
if (!qFuzzyIsNull(t - 1.0f))
|
||||
return true;
|
||||
if (!qFuzzyIsNull(t - 1.0f)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -150,11 +158,7 @@ inline void decomposeQMatrix4x4(const QMatrix4x4 & m, QVector3D & position, QVec
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Transform::Transform(): m_scale(1.0f, 1.0f, 1.0f),
|
||||
m_translation(), m_eulerRotationAngles(), m_matrixDirty(false) {
|
||||
}
|
||||
Transform::Transform(): m_scale(1.0f, 1.0f, 1.0f), m_translation(), m_eulerRotationAngles(), m_matrixDirty(false) {}
|
||||
|
||||
|
||||
Transform & Transform::operator=(const Transform & t) {
|
||||
@@ -182,24 +186,21 @@ void Transform::setMatrix(const QMatrix4x4 & m) {
|
||||
|
||||
|
||||
void Transform::setRotationX(float r) {
|
||||
if (m_eulerRotationAngles.x() == r)
|
||||
return;
|
||||
if (m_eulerRotationAngles.x() == r) return;
|
||||
m_eulerRotationAngles.setX(r);
|
||||
m_matrixDirty = true;
|
||||
}
|
||||
|
||||
|
||||
void Transform::setRotationY(float r) {
|
||||
if (m_eulerRotationAngles.y() == r)
|
||||
return;
|
||||
if (m_eulerRotationAngles.y() == r) return;
|
||||
m_eulerRotationAngles.setY(r);
|
||||
m_matrixDirty = true;
|
||||
}
|
||||
|
||||
|
||||
void Transform::setRotationZ(float r) {
|
||||
if (m_eulerRotationAngles.z() == r)
|
||||
return;
|
||||
if (m_eulerRotationAngles.z() == r) return;
|
||||
m_eulerRotationAngles.setZ(r);
|
||||
m_matrixDirty = true;
|
||||
}
|
||||
@@ -362,17 +363,19 @@ QQuaternion Transform::fromAxisAndAngle(float x, float y, float z, float angle)
|
||||
}
|
||||
|
||||
|
||||
QQuaternion Transform::fromAxesAndAngles(const QVector3D & axis1, float angle1,
|
||||
const QVector3D & axis2, float angle2) {
|
||||
QQuaternion Transform::fromAxesAndAngles(const QVector3D & axis1, float angle1, const QVector3D & axis2, float angle2) {
|
||||
const QQuaternion q1 = QQuaternion::fromAxisAndAngle(axis1, angle1);
|
||||
const QQuaternion q2 = QQuaternion::fromAxisAndAngle(axis2, angle2);
|
||||
return q2 * q1;
|
||||
}
|
||||
|
||||
|
||||
QQuaternion Transform::fromAxesAndAngles(const QVector3D & axis1, float angle1,
|
||||
const QVector3D & axis2, float angle2,
|
||||
const QVector3D & axis3, float angle3) {
|
||||
QQuaternion Transform::fromAxesAndAngles(const QVector3D & axis1,
|
||||
float angle1,
|
||||
const QVector3D & axis2,
|
||||
float angle2,
|
||||
const QVector3D & axis3,
|
||||
float angle3) {
|
||||
const QQuaternion q1 = QQuaternion::fromAxisAndAngle(axis1, angle1);
|
||||
const QQuaternion q2 = QQuaternion::fromAxisAndAngle(axis2, angle2);
|
||||
const QQuaternion q3 = QQuaternion::fromAxisAndAngle(axis3, angle3);
|
||||
@@ -433,8 +436,20 @@ QMatrix4x4 Transform::rotateAround(const QVector3D & point, float angle, const Q
|
||||
|
||||
|
||||
QMatrix4x4 Transform::rotateFromAxes(const QVector3D & xAxis, const QVector3D & yAxis, const QVector3D & zAxis) {
|
||||
return QMatrix4x4(xAxis.x(), yAxis.x(), zAxis.x(), 0.0f,
|
||||
xAxis.y(), yAxis.y(), zAxis.y(), 0.0f,
|
||||
xAxis.z(), yAxis.z(), zAxis.z(), 0.0f,
|
||||
0.0f, 0.0f, 0.0f, 1.0f);
|
||||
return QMatrix4x4(xAxis.x(),
|
||||
yAxis.x(),
|
||||
zAxis.x(),
|
||||
0.0f,
|
||||
xAxis.y(),
|
||||
yAxis.y(),
|
||||
zAxis.y(),
|
||||
0.0f,
|
||||
xAxis.z(),
|
||||
yAxis.z(),
|
||||
zAxis.z(),
|
||||
0.0f,
|
||||
0.0f,
|
||||
0.0f,
|
||||
0.0f,
|
||||
1.0f);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
class Transform {
|
||||
friend QDataStream & operator>>(QDataStream & s, Transform & v);
|
||||
|
||||
public:
|
||||
Transform();
|
||||
Transform & operator=(const Transform & t);
|
||||
@@ -68,11 +69,9 @@ public:
|
||||
static QQuaternion fromAxisAndAngle(const QVector3D & axis, float angle);
|
||||
static QQuaternion fromAxisAndAngle(float x, float y, float z, float angle);
|
||||
|
||||
static QQuaternion fromAxesAndAngles(const QVector3D & axis1, float angle1,
|
||||
const QVector3D & axis2, float angle2);
|
||||
static QQuaternion fromAxesAndAngles(const QVector3D & axis1, float angle1,
|
||||
const QVector3D & axis2, float angle2,
|
||||
const QVector3D & axis3, float angle3);
|
||||
static QQuaternion fromAxesAndAngles(const QVector3D & axis1, float angle1, const QVector3D & axis2, float angle2);
|
||||
static QQuaternion
|
||||
fromAxesAndAngles(const QVector3D & axis1, float angle1, const QVector3D & axis2, float angle2, const QVector3D & axis3, float angle3);
|
||||
static QQuaternion fromAxes(const QVector3D & xAxis, const QVector3D & yAxis, const QVector3D & zAxis);
|
||||
|
||||
static QVector3D fromDirection(QVector3D d, float pitch = 0.f);
|
||||
@@ -91,12 +90,12 @@ protected:
|
||||
|
||||
mutable QMatrix4x4 m_matrix, m_matrixWT, m_matrixR, m_matrixS;
|
||||
mutable bool m_matrixDirty;
|
||||
|
||||
};
|
||||
|
||||
|
||||
inline QDataStream & operator<<(QDataStream & s, const Transform & v) {
|
||||
s << v.matrix(); return s;
|
||||
s << v.matrix();
|
||||
return s;
|
||||
}
|
||||
inline QDataStream & operator>>(QDataStream & s, Transform & v) {
|
||||
QMatrix4x4 m;
|
||||
|
||||
112
core/gltypes.cpp
112
core/gltypes.cpp
@@ -17,8 +17,8 @@
|
||||
*/
|
||||
|
||||
#include "glcamera.h"
|
||||
#include "qglview.h"
|
||||
#include "gltexture_manager.h"
|
||||
#include "qglview.h"
|
||||
|
||||
#include <QPainter>
|
||||
|
||||
@@ -44,8 +44,7 @@ QString findFile(const QString & file, const QStringList & pathes) {
|
||||
foreach(QString p, pathes) {
|
||||
QFileInfoList fil = QDir(p).entryInfoList(QStringList(fn), QDir::Files | QDir::NoDotAndDotDot);
|
||||
// qDebug() << "findFile" << fn << "in" << p << "->" << fil.size();
|
||||
if (!fil.isEmpty())
|
||||
return fil[0].absoluteFilePath();
|
||||
if (!fil.isEmpty()) return fil[0].absoluteFilePath();
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
@@ -55,10 +54,8 @@ void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x,
|
||||
glSetPolygonMode(GL_FILL);
|
||||
glDisable(GL_LIGHTING);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
int loc = prog ? prog->attributeLocation("qgl_Color") : -1,
|
||||
locv = prog ? prog->attributeLocation("qgl_Vertex") : -1,
|
||||
loct = prog ? prog->attributeLocation("qgl_Texture") : -1,
|
||||
locc = prog ? prog->attributeLocation("view_corner") : -1;
|
||||
int loc = prog ? prog->attributeLocation("qgl_Color") : -1, locv = prog ? prog->attributeLocation("qgl_Vertex") : -1,
|
||||
loct = prog ? prog->attributeLocation("qgl_Texture") : -1, locc = prog ? prog->attributeLocation("view_corner") : -1;
|
||||
QOpenGLFunctions * glFuncs = QOpenGLContext::currentContext()->functions();
|
||||
if (prog) {
|
||||
static const GLfloat cols[] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
|
||||
@@ -66,10 +63,18 @@ void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x,
|
||||
static const GLfloat texs[] = {0.f, 0.f, 1.f, 0.f, 0.f, 1.f, 1.f, 1.f};
|
||||
GLfloat vcs[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
|
||||
if (corner_dirs) {
|
||||
vcs[0] = corner_dirs[0].x(); vcs[1] = corner_dirs[0].y(); vcs[2] = corner_dirs[0].z();
|
||||
vcs[3] = corner_dirs[1].x(); vcs[4] = corner_dirs[1].y(); vcs[5] = corner_dirs[1].z();
|
||||
vcs[6] = corner_dirs[2].x(); vcs[7] = corner_dirs[2].y(); vcs[8] = corner_dirs[2].z();
|
||||
vcs[9] = corner_dirs[3].x(); vcs[10] = corner_dirs[3].y(); vcs[11] = corner_dirs[3].z();
|
||||
vcs[0] = corner_dirs[0].x();
|
||||
vcs[1] = corner_dirs[0].y();
|
||||
vcs[2] = corner_dirs[0].z();
|
||||
vcs[3] = corner_dirs[1].x();
|
||||
vcs[4] = corner_dirs[1].y();
|
||||
vcs[5] = corner_dirs[1].z();
|
||||
vcs[6] = corner_dirs[2].x();
|
||||
vcs[7] = corner_dirs[2].y();
|
||||
vcs[8] = corner_dirs[2].z();
|
||||
vcs[9] = corner_dirs[3].x();
|
||||
vcs[10] = corner_dirs[3].y();
|
||||
vcs[11] = corner_dirs[3].z();
|
||||
}
|
||||
glDisableClientState(GL_VERTEX_ARRAY);
|
||||
glDisableClientState(GL_NORMAL_ARRAY);
|
||||
@@ -92,10 +97,14 @@ void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x,
|
||||
} else {
|
||||
glBegin(GL_TRIANGLE_STRIP);
|
||||
glColor4f(1.f, 1.f, 1.f, 1.f);
|
||||
glTexCoord2f(0.f, 0.f); glVertex2f(x, y);
|
||||
glTexCoord2f(1.f, 0.f); glVertex2f(x+w, y);
|
||||
glTexCoord2f(0.f, 1.f); glVertex2f(x, y+h);
|
||||
glTexCoord2f(1.f, 1.f); glVertex2f(x+w, y+h);
|
||||
glTexCoord2f(0.f, 0.f);
|
||||
glVertex2f(x, y);
|
||||
glTexCoord2f(1.f, 0.f);
|
||||
glVertex2f(x + w, y);
|
||||
glTexCoord2f(0.f, 1.f);
|
||||
glVertex2f(x, y + h);
|
||||
glTexCoord2f(1.f, 1.f);
|
||||
glVertex2f(x + w, y + h);
|
||||
glEnd();
|
||||
}
|
||||
}
|
||||
@@ -141,10 +150,8 @@ void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, int width, int hei
|
||||
else {
|
||||
int type = GL_UNSIGNED_BYTE;
|
||||
int fmt = GL_RGBA;
|
||||
if (format == GL_RGB32F || format == GL_RGB16F || format == GL_RGBA32F || format == GL_RGBA16F)
|
||||
type = GL_FLOAT;
|
||||
if (format == GL_RGB32F || format == GL_RGB16F || format == GL_RGB8 || format == GL_RGB)
|
||||
fmt = GL_RGB;
|
||||
if (format == GL_RGB32F || format == GL_RGB16F || format == GL_RGBA32F || format == GL_RGBA16F) type = GL_FLOAT;
|
||||
if (format == GL_RGB32F || format == GL_RGB16F || format == GL_RGB8 || format == GL_RGB) fmt = GL_RGB;
|
||||
f->glTexImage2D(target, 0, format, width, height, 0, fmt, type, nullptr);
|
||||
// qDebug() << "glTexImage2D" << width << height << QString::number(t, 16);
|
||||
}
|
||||
@@ -216,14 +223,15 @@ QImage rotateQImageRight(const QImage & im) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
QColor colorFromString(const QString & str) {
|
||||
QString s = str.trimmed();
|
||||
int i = s.indexOf("\t");
|
||||
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);
|
||||
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.f, g * 255.f, b * 255.f);
|
||||
}
|
||||
@@ -232,9 +240,12 @@ QColor colorFromString(const QString & str) {
|
||||
QVector3D orthToVector(const QVector3D & v, const float & scale) {
|
||||
if (v.isNull()) return QVector3D();
|
||||
QVector3D rv, fn, sn;
|
||||
if (v.x() != 0.f) rv.setZ(1.);
|
||||
else if (v.y() != 0.f) rv.setX(1.);
|
||||
else rv.setY(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();
|
||||
return fn * urand(scale) + sn * urand(scale);
|
||||
@@ -269,7 +280,8 @@ void lengthenVector(QVector3D & v, const float & l) {
|
||||
Vector2i::Vector2i(const QString & str) {
|
||||
QString s = str.trimmed();
|
||||
int i = s.indexOf("\t");
|
||||
p0 = s.left(i).toInt(); s = s.right(s.length() - i - 1);
|
||||
p0 = s.left(i).toInt();
|
||||
s = s.right(s.length() - i - 1);
|
||||
p1 = s.toInt();
|
||||
}
|
||||
|
||||
@@ -277,8 +289,11 @@ Vector2i::Vector2i(const QString & str) {
|
||||
Vector3i::Vector3i(const QString & str) {
|
||||
QString s = str.trimmed();
|
||||
int i = s.indexOf("\t");
|
||||
p0 = s.left(i).toInt(); s = s.right(s.length() - i - 1); i = s.indexOf("\t");
|
||||
p1 = s.left(i).toInt(); s = s.right(s.length() - i - 1);
|
||||
p0 = s.left(i).toInt();
|
||||
s = s.right(s.length() - i - 1);
|
||||
i = s.indexOf("\t");
|
||||
p1 = s.left(i).toInt();
|
||||
s = s.right(s.length() - i - 1);
|
||||
p2 = s.toInt();
|
||||
}
|
||||
|
||||
@@ -305,8 +320,6 @@ void glClearFramebuffer(const QColor & color, bool depth) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Box3D::Box3D(const QVector<QVector3D> & points) {
|
||||
x = y = z = width = length = height = angle_z = angle_xy = angle_roll = 0.f;
|
||||
if (points.isEmpty()) return;
|
||||
@@ -315,9 +328,12 @@ 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<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());
|
||||
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;
|
||||
@@ -331,21 +347,28 @@ Box3D::Box3D(const QVector<QVector3D> & points) {
|
||||
QVector<QVector3D> Box3D::corners() const {
|
||||
QVector<QVector3D> ret;
|
||||
ret << QVector3D(x, y, z) << QVector3D(x, y + width, z) << QVector3D(x, y, z + height) << QVector3D(x, y + width, z + height)
|
||||
<< QVector3D(x + length, y, z) << QVector3D(x + length, y + width, z)
|
||||
<< QVector3D(x + length, y, z + height) << QVector3D(x + length, y + width, z + height);
|
||||
<< QVector3D(x + length, y, z) << QVector3D(x + length, y + width, z) << QVector3D(x + length, y, z + height)
|
||||
<< QVector3D(x + length, y + width, z + height);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Box3D & Box3D::operator|=(const Box3D & o) {
|
||||
if (o.isEmpty()) return *this;
|
||||
if (isEmpty()) *this = o;
|
||||
if (isEmpty())
|
||||
*this = o;
|
||||
else {
|
||||
GLfloat mx = x + length, my = y + width, mz = z + height;
|
||||
GLfloat omx = o.x + o.length, omy = o.y + o.width, omz = o.z + o.height;
|
||||
x = qMin(x, o.x); y = qMin(y, o.y); z = qMin(z, o.z);
|
||||
mx = qMax(mx, omx); my = qMax(my, omy); mz = qMax(mz, omz);
|
||||
length = mx - x; width = my - y; height = mz - z;
|
||||
x = qMin(x, o.x);
|
||||
y = qMin(y, o.y);
|
||||
z = qMin(z, o.z);
|
||||
mx = qMax(mx, omx);
|
||||
my = qMax(my, omy);
|
||||
mz = qMax(mz, omz);
|
||||
length = mx - x;
|
||||
width = my - y;
|
||||
height = mz - z;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
@@ -355,8 +378,11 @@ QVector3D vectorFromString(const QString & str) {
|
||||
QTextStream s(const_cast<QString *>(&str), QIODevice::ReadOnly);
|
||||
QVector3D ret;
|
||||
float f(0.f);
|
||||
s >> f; ret.setX(f);
|
||||
s >> f; ret.setY(f);
|
||||
s >> f; ret.setZ(f);
|
||||
s >> f;
|
||||
ret.setX(f);
|
||||
s >> f;
|
||||
ret.setY(f);
|
||||
s >> f;
|
||||
ret.setZ(f);
|
||||
return ret;
|
||||
}
|
||||
|
||||
339
core/gltypes.h
339
core/gltypes.h
@@ -54,32 +54,33 @@
|
||||
// # include <GL/glu.h>
|
||||
// # endif
|
||||
// #endif
|
||||
#include <QColor>
|
||||
#include <QDataStream>
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QImage>
|
||||
#include <QMatrix4x4>
|
||||
#include <QMutex>
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <QOpenGLShader>
|
||||
#include <QOpenGLShaderProgram>
|
||||
#include <qopenglext.h>
|
||||
#include <cmath>
|
||||
#include <float.h>
|
||||
#include <QMatrix4x4>
|
||||
#include <QDebug>
|
||||
#include <QDataStream>
|
||||
#include <QColor>
|
||||
#include <QVector2D>
|
||||
#include <QVector3D>
|
||||
#include <QImage>
|
||||
#include <QMutex>
|
||||
#include <QFile>
|
||||
#include <QDir>
|
||||
#include <cmath>
|
||||
#include <float.h>
|
||||
#include <qopenglext.h>
|
||||
#ifndef QNX
|
||||
# include <cmath>
|
||||
# include <complex>
|
||||
#else
|
||||
# include <math.h>
|
||||
# include <complex.h>
|
||||
# include <math.h>
|
||||
#endif
|
||||
#include <iostream>
|
||||
#include "qglengine_version.h"
|
||||
#include "qglengine_core_export.h"
|
||||
#include "qglengine_version.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
|
||||
// #ifdef WINDOWS
|
||||
@@ -116,53 +117,131 @@ const float deg2rad = atanf(1.f) / 45.f;
|
||||
const float rad2deg = 45.f / atanf(1.f);
|
||||
|
||||
# ifdef WINDOWS
|
||||
inline int random() {return rand();}
|
||||
inline int random() {
|
||||
return rand();
|
||||
}
|
||||
# endif
|
||||
#else
|
||||
# define random randomi
|
||||
#endif
|
||||
|
||||
#ifdef CC_VC
|
||||
inline float round(const float & v) {return floor(v + 0.5);}
|
||||
inline float round(const float & v) {
|
||||
return floor(v + 0.5);
|
||||
}
|
||||
#endif
|
||||
inline float randomu() {return float(random()) / RAND_MAX;}
|
||||
inline float randomu() {
|
||||
return float(random()) / RAND_MAX;
|
||||
}
|
||||
|
||||
inline const QSizeF operator *(const QSizeF & f, const QSizeF & s) {return QSizeF(f.width() * s.width(), f.height() * s.height());}
|
||||
inline const QSizeF operator*(const QSizeF & f, const QSizeF & s) {
|
||||
return QSizeF(f.width() * s.width(), f.height() * s.height());
|
||||
}
|
||||
#ifndef PIP_VERSION
|
||||
template<typename T> inline void piSwap(T & f, T & s) {T t(f); f = s; s = t;}
|
||||
template<typename Type> inline Type piMin(const Type & f, const Type & s) {return (f > s) ? s : f;}
|
||||
template<typename Type> inline Type piMin(const Type & f, const Type & s, const Type & t) {return (f < s && f < t) ? f : ((s < t) ? s : t);}
|
||||
template<typename Type> inline Type piMax(const Type & f, const Type & s) {return (f < s) ? s : f;}
|
||||
template<typename Type> inline Type piMax(const Type & f, const Type & s, const Type & t) {return (f > s && f > t) ? f : ((s > t) ? s : t);}
|
||||
template<typename Type> inline Type piClamp(const Type & v, const Type & min, const Type & max) {return (v > max ? max : (v < min ? min : v));}
|
||||
inline ushort letobe_s(ushort v) {return (v << 8) | (v >> 8);}
|
||||
inline uint letobe_i(const uint & v) {return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);}
|
||||
template<typename T>
|
||||
inline void piSwap(T & f, T & s) {
|
||||
T t(f);
|
||||
f = s;
|
||||
s = t;
|
||||
}
|
||||
template<typename Type>
|
||||
inline Type piMin(const Type & f, const Type & s) {
|
||||
return (f > s) ? s : f;
|
||||
}
|
||||
template<typename Type>
|
||||
inline Type piMin(const Type & f, const Type & s, const Type & t) {
|
||||
return (f < s && f < t) ? f : ((s < t) ? s : t);
|
||||
}
|
||||
template<typename Type>
|
||||
inline Type piMax(const Type & f, const Type & s) {
|
||||
return (f < s) ? s : f;
|
||||
}
|
||||
template<typename Type>
|
||||
inline Type piMax(const Type & f, const Type & s, const Type & t) {
|
||||
return (f > s && f > t) ? f : ((s > t) ? s : t);
|
||||
}
|
||||
template<typename Type>
|
||||
inline Type piClamp(const Type & v, const Type & min, const Type & max) {
|
||||
return (v > max ? max : (v < min ? min : v));
|
||||
}
|
||||
inline ushort letobe_s(ushort v) {
|
||||
return (v << 8) | (v >> 8);
|
||||
}
|
||||
inline uint letobe_i(const uint & v) {
|
||||
return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);
|
||||
}
|
||||
#endif
|
||||
// return [-1, 1]
|
||||
inline float urand(const float & scale = 1.) {return ((float)rand() / RAND_MAX - .5f) * (scale + scale);}
|
||||
inline float urand(const float & scale = 1.) {
|
||||
return ((float)rand() / RAND_MAX - .5f) * (scale + scale);
|
||||
}
|
||||
// return [0, 1]
|
||||
inline float uprand(const float & scale = 1.) {return ((float)rand() / RAND_MAX) * scale;}
|
||||
inline float uprand(const float & scale = 1.) {
|
||||
return ((float)rand() / RAND_MAX) * scale;
|
||||
}
|
||||
QString readCharsUntilNull(QDataStream & s);
|
||||
QString findFile(const QString & file, const QStringList & pathes);
|
||||
inline QColor operator *(const QColor & c, float v) {return QColor(piClamp<int>(c.red() * v, 0, 255), piClamp<int>(c.green() * v, 0, 255), piClamp<int>(c.blue() * v, 0, 255), piClamp<int>(c.alpha() * v, 0, 255));}
|
||||
inline QColor operator /(const QColor & c, float v) {return QColor(piClamp<int>(c.red() / v, 0, 255), piClamp<int>(c.green() / v, 0, 255), piClamp<int>(c.blue() / v, 0, 255), piClamp<int>(c.alpha() / v, 0, 255));}
|
||||
inline QColor operator*(const QColor & c, float v) {
|
||||
return QColor(piClamp<int>(c.red() * v, 0, 255),
|
||||
piClamp<int>(c.green() * v, 0, 255),
|
||||
piClamp<int>(c.blue() * v, 0, 255),
|
||||
piClamp<int>(c.alpha() * v, 0, 255));
|
||||
}
|
||||
inline QColor operator/(const QColor & c, float v) {
|
||||
return QColor(piClamp<int>(c.red() / v, 0, 255),
|
||||
piClamp<int>(c.green() / v, 0, 255),
|
||||
piClamp<int>(c.blue() / v, 0, 255),
|
||||
piClamp<int>(c.alpha() / v, 0, 255));
|
||||
}
|
||||
|
||||
|
||||
inline void qglColor(const QColor & c) {glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF());}
|
||||
inline void glClearError() {int c = 100; while (glGetError() != GL_NO_ERROR && --c > 0) glGetError();}
|
||||
inline void glSetCapEnabled(GLenum cap, bool on = true) {if (on) glEnable(cap); else glDisable(cap);}
|
||||
inline void glSetPolygonMode(GLenum mode) {glPolygonMode(GL_FRONT_AND_BACK, mode);}
|
||||
inline void deleteGLTexture(QOpenGLExtraFunctions * f, GLuint & tex) {if (tex != 0) f->glDeleteTextures(1, &tex); tex = 0;}
|
||||
inline void qglColor(const QColor & c) {
|
||||
glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF());
|
||||
}
|
||||
inline void glClearError() {
|
||||
int c = 100;
|
||||
while (glGetError() != GL_NO_ERROR && --c > 0)
|
||||
glGetError();
|
||||
}
|
||||
inline void glSetCapEnabled(GLenum cap, bool on = true) {
|
||||
if (on)
|
||||
glEnable(cap);
|
||||
else
|
||||
glDisable(cap);
|
||||
}
|
||||
inline void glSetPolygonMode(GLenum mode) {
|
||||
glPolygonMode(GL_FRONT_AND_BACK, mode);
|
||||
}
|
||||
inline void deleteGLTexture(QOpenGLExtraFunctions * f, GLuint & tex) {
|
||||
if (tex != 0) f->glDeleteTextures(1, &tex);
|
||||
tex = 0;
|
||||
}
|
||||
void glEnableDepth();
|
||||
void glDisableDepth();
|
||||
void glClearFramebuffer(const QColor & color = Qt::black, bool depth = true);
|
||||
void glDrawQuad(QOpenGLShaderProgram * prog = nullptr, QVector4D * corner_dirs = nullptr, GLfloat x = -1.f, GLfloat y = -1.f, GLfloat w = 2.f, GLfloat h = 2.f);
|
||||
void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, int width, int height, const GLenum & format = GL_RGBA, const GLenum & target = GL_TEXTURE_2D);
|
||||
void createGLTexture(QOpenGLExtraFunctions * f, GLuint & tex, const QImage & image, const GLenum & format = GL_RGBA, const GLenum & target = GL_TEXTURE_2D);
|
||||
void glDrawQuad(QOpenGLShaderProgram * prog = nullptr,
|
||||
QVector4D * corner_dirs = nullptr,
|
||||
GLfloat x = -1.f,
|
||||
GLfloat y = -1.f,
|
||||
GLfloat w = 2.f,
|
||||
GLfloat h = 2.f);
|
||||
void createGLTexture(QOpenGLExtraFunctions * f,
|
||||
GLuint & tex,
|
||||
int width,
|
||||
int height,
|
||||
const GLenum & format = GL_RGBA,
|
||||
const GLenum & target = GL_TEXTURE_2D);
|
||||
void createGLTexture(QOpenGLExtraFunctions * f,
|
||||
GLuint & tex,
|
||||
const QImage & image,
|
||||
const GLenum & format = GL_RGBA,
|
||||
const GLenum & target = GL_TEXTURE_2D);
|
||||
QMatrix4x4 glMatrixPerspective(float angle, float aspect, float near_);
|
||||
QImage rotateQImageLeft(const QImage & im);
|
||||
QImage rotateQImageRight(const QImage & im);
|
||||
inline QImage rotateQImage180(const QImage & im) {return im.mirrored(true, true);}
|
||||
inline QImage rotateQImage180(const QImage & im) {
|
||||
return im.mirrored(true, true);
|
||||
}
|
||||
|
||||
class QGLView;
|
||||
class MouseController;
|
||||
@@ -205,7 +284,15 @@ struct Box3D {
|
||||
GLfloat angle_xy;
|
||||
GLfloat angle_roll;
|
||||
Box3D() { x = y = z = width = length = height = angle_z = angle_xy = angle_roll = 0.f; }
|
||||
Box3D(const QVector3D & center, GLfloat hwid, GLfloat hlen, GLfloat hhei) {x = center.x() - hwid; y = center.y() - hlen; z = center.z() - hhei; width = 2 * hwid; length = 2 * hlen; height = 2 * hhei; angle_z = angle_xy = angle_roll = 0.f;}
|
||||
Box3D(const QVector3D & center, GLfloat hwid, GLfloat hlen, GLfloat hhei) {
|
||||
x = center.x() - hwid;
|
||||
y = center.y() - hlen;
|
||||
z = center.z() - hhei;
|
||||
width = 2 * hwid;
|
||||
length = 2 * hlen;
|
||||
height = 2 * hhei;
|
||||
angle_z = angle_xy = angle_roll = 0.f;
|
||||
}
|
||||
Box3D(const QVector<QVector3D> & points);
|
||||
bool isEmpty() const { return (qAbs(width) < 1E-6f) && (qAbs(length) < 1E-6f) && (qAbs(height) < 1E-6f); }
|
||||
QVector3D randomPoint() const { return QVector3D(uprand(length) + x, uprand(width) + y, uprand(height) + z); }
|
||||
@@ -214,22 +301,62 @@ struct Box3D {
|
||||
QVector3D center() const { return QVector3D(length / 2.f + x, width / 2.f + y, height / 2.f + z); }
|
||||
QVector3D angles() const { return QVector3D(angle_xy, angle_roll, angle_z); }
|
||||
QVector<QVector3D> corners() const;
|
||||
void setPos(const QVector3D & p) {x = p.x(); y = p.y(); z = p.z();}
|
||||
void setAngles(const QVector3D & a) {angle_xy = a.x(); angle_roll = a.y(); angle_z = a.z();}
|
||||
void setSize(const QVector3D & s) {length = s.x(); width = s.y(); height = s.z();}
|
||||
Box3D & moveTo(const QVector3D & v) {x = v.x(); y = v.y(); z = v.z(); return *this;}
|
||||
Box3D & move(const QVector3D & v) {x += v.x(); y += v.y(); z += v.z(); return *this;}
|
||||
Box3D movedTo(const QVector3D & v) const {Box3D t(*this); t.x = v.x(); t.y = v.y(); t.z = v.z(); return t;}
|
||||
Box3D moved(const QVector3D & v) const {Box3D t(*this); t.x += v.x(); t.y += v.y(); t.z += v.z(); return t;}
|
||||
void setPos(const QVector3D & p) {
|
||||
x = p.x();
|
||||
y = p.y();
|
||||
z = p.z();
|
||||
}
|
||||
void setAngles(const QVector3D & a) {
|
||||
angle_xy = a.x();
|
||||
angle_roll = a.y();
|
||||
angle_z = a.z();
|
||||
}
|
||||
void setSize(const QVector3D & s) {
|
||||
length = s.x();
|
||||
width = s.y();
|
||||
height = s.z();
|
||||
}
|
||||
Box3D & moveTo(const QVector3D & v) {
|
||||
x = v.x();
|
||||
y = v.y();
|
||||
z = v.z();
|
||||
return *this;
|
||||
}
|
||||
Box3D & move(const QVector3D & v) {
|
||||
x += v.x();
|
||||
y += v.y();
|
||||
z += v.z();
|
||||
return *this;
|
||||
}
|
||||
Box3D movedTo(const QVector3D & v) const {
|
||||
Box3D t(*this);
|
||||
t.x = v.x();
|
||||
t.y = v.y();
|
||||
t.z = v.z();
|
||||
return t;
|
||||
}
|
||||
Box3D moved(const QVector3D & v) const {
|
||||
Box3D t(*this);
|
||||
t.x += v.x();
|
||||
t.y += v.y();
|
||||
t.z += v.z();
|
||||
return t;
|
||||
}
|
||||
Box3D & operator|=(const Box3D & o);
|
||||
};
|
||||
|
||||
inline QDebug operator <<(QDebug d, const Box3D & v) {d << "Box3D {start (" << v.x << "," << v.y << "," << v.z << "), size (" << v.length << "," << v.width << "," << v.height << ")}"; return d;}
|
||||
inline QDebug operator<<(QDebug d, const Box3D & v) {
|
||||
d << "Box3D {start (" << v.x << "," << v.y << "," << v.z << "), size (" << v.length << "," << v.width << "," << v.height << ")}";
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct Vector2i {
|
||||
Vector2i(int p0_ = 0, int p1_ = 0) {p0 = p0_; p1 = p1_;}
|
||||
Vector2i(int p0_ = 0, int p1_ = 0) {
|
||||
p0 = p0_;
|
||||
p1 = p1_;
|
||||
}
|
||||
Vector2i(const QString & str);
|
||||
Vector2i movedX(const int & o) { return Vector2i(p0 + o, p1); }
|
||||
Vector2i movedY(const int & o) { return Vector2i(p0, p1 + o); }
|
||||
@@ -238,24 +365,48 @@ struct Vector2i {
|
||||
GLint p1;
|
||||
bool operator==(const Vector2i & o) const { return p0 == o.p0 && p1 == o.p1; }
|
||||
bool operator!=(const Vector2i & o) const { return p0 != o.p0 || p1 != o.p1; }
|
||||
void operator +=(int v) {p0 += v; p1 += v;}
|
||||
void operator+=(int v) {
|
||||
p0 += v;
|
||||
p1 += v;
|
||||
}
|
||||
QVector2D toQVector2D() const { return QVector2D(p0, p1); }
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
inline Vector2i operator +(const Vector2i & f, const Vector2i & s) {return Vector2i(f.p0 + s.p0, f.p1 + s.p1);}
|
||||
inline Vector2i operator -(const Vector2i & f, const Vector2i & s) {return Vector2i(f.p0 - s.p0, f.p1 - s.p1);}
|
||||
inline Vector2i operator /(const Vector2i & f, const int & s) {return Vector2i(f.p0 / s, f.p1 / s);}
|
||||
inline uint qHash(const Vector2i & v) {return v.p0 ^ ((v.p1 << 8) | (v.p1 >> 24));}
|
||||
inline QDebug operator <<(QDebug d, const Vector2i & v) {d.nospace() << "{" << v.p0 << ", " << v.p1 << "}"; return d.space();}
|
||||
inline Vector2i operator+(const Vector2i & f, const Vector2i & s) {
|
||||
return Vector2i(f.p0 + s.p0, f.p1 + s.p1);
|
||||
}
|
||||
inline Vector2i operator-(const Vector2i & f, const Vector2i & s) {
|
||||
return Vector2i(f.p0 - s.p0, f.p1 - s.p1);
|
||||
}
|
||||
inline Vector2i operator/(const Vector2i & f, const int & s) {
|
||||
return Vector2i(f.p0 / s, f.p1 / s);
|
||||
}
|
||||
inline uint qHash(const Vector2i & v) {
|
||||
return v.p0 ^ ((v.p1 << 8) | (v.p1 >> 24));
|
||||
}
|
||||
inline QDebug operator<<(QDebug d, const Vector2i & v) {
|
||||
d.nospace() << "{" << v.p0 << ", " << v.p1 << "}";
|
||||
return d.space();
|
||||
}
|
||||
|
||||
inline QDataStream & operator <<(QDataStream & s, const Vector2i & v) {s << v.p0 << v.p1; return s;}
|
||||
inline QDataStream & operator >>(QDataStream & s, Vector2i & v) {s >> v.p0 >> v.p1; return s;}
|
||||
inline QDataStream & operator<<(QDataStream & s, const Vector2i & v) {
|
||||
s << v.p0 << v.p1;
|
||||
return s;
|
||||
}
|
||||
inline QDataStream & operator>>(QDataStream & s, Vector2i & v) {
|
||||
s >> v.p0 >> v.p1;
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct Vector3i {
|
||||
Vector3i(int p0_ = 0, int p1_ = 0, int p2_ = 0) {p0 = p0_; p1 = p1_; p2 = p2_;}
|
||||
Vector3i(int p0_ = 0, int p1_ = 0, int p2_ = 0) {
|
||||
p0 = p0_;
|
||||
p1 = p1_;
|
||||
p2 = p2_;
|
||||
}
|
||||
Vector3i(const QString & str);
|
||||
Vector3i movedX(const int & o) { return Vector3i(p0 + o, p1, p2); }
|
||||
Vector3i movedY(const int & o) { return Vector3i(p0, p1 + o, p2); }
|
||||
@@ -266,39 +417,81 @@ struct Vector3i {
|
||||
GLint p2;
|
||||
bool operator==(const Vector3i & o) const { return p0 == o.p0 && p1 == o.p1 && p2 == o.p2; }
|
||||
bool operator!=(const Vector3i & o) const { return p0 != o.p0 || p1 != o.p1 || p2 != o.p2; }
|
||||
void operator +=(int v) {p0 += v; p1 += v; p2 += v;}
|
||||
void operator+=(int v) {
|
||||
p0 += v;
|
||||
p1 += v;
|
||||
p2 += v;
|
||||
}
|
||||
QVector3D toQVector3D() const { return QVector3D(p0, p1, p2); }
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
inline Vector3i operator +(const Vector3i & f, const Vector3i & s) {return Vector3i(f.p0 + s.p0, f.p1 + s.p1, f.p2 + s.p2);}
|
||||
inline Vector3i operator -(const Vector3i & f, const Vector3i & s) {return Vector3i(f.p0 - s.p0, f.p1 - s.p1, f.p2 - s.p2);}
|
||||
inline Vector3i operator /(const Vector3i & f, const int & s) {return Vector3i(f.p0 / s, f.p1 / s, f.p2 / s);}
|
||||
inline uint qHash(const Vector3i & v) {return v.p0 ^ ((v.p1 << 8) | (v.p1 >> 24)) ^ ((v.p2 << 16) | (v.p2 >> 16));}
|
||||
inline QDebug operator <<(QDebug d, const Vector3i & v) {d.nospace() << "{" << v.p0 << ", " << v.p1 << ", " << v.p2 << "}"; return d.space();}
|
||||
inline Vector3i operator+(const Vector3i & f, const Vector3i & s) {
|
||||
return Vector3i(f.p0 + s.p0, f.p1 + s.p1, f.p2 + s.p2);
|
||||
}
|
||||
inline Vector3i operator-(const Vector3i & f, const Vector3i & s) {
|
||||
return Vector3i(f.p0 - s.p0, f.p1 - s.p1, f.p2 - s.p2);
|
||||
}
|
||||
inline Vector3i operator/(const Vector3i & f, const int & s) {
|
||||
return Vector3i(f.p0 / s, f.p1 / s, f.p2 / s);
|
||||
}
|
||||
inline uint qHash(const Vector3i & v) {
|
||||
return v.p0 ^ ((v.p1 << 8) | (v.p1 >> 24)) ^ ((v.p2 << 16) | (v.p2 >> 16));
|
||||
}
|
||||
inline QDebug operator<<(QDebug d, const Vector3i & v) {
|
||||
d.nospace() << "{" << v.p0 << ", " << v.p1 << ", " << v.p2 << "}";
|
||||
return d.space();
|
||||
}
|
||||
|
||||
inline QDataStream & operator <<(QDataStream & s, const Vector3i & v) {s << v.p0 << v.p1 << v.p2; return s;}
|
||||
inline QDataStream & operator >>(QDataStream & s, Vector3i & v) {s >> v.p0 >> v.p1 >> v.p2; return s;}
|
||||
inline QDataStream & operator<<(QDataStream & s, const Vector3i & v) {
|
||||
s << v.p0 << v.p1 << v.p2;
|
||||
return s;
|
||||
}
|
||||
inline QDataStream & operator>>(QDataStream & s, Vector3i & v) {
|
||||
s >> v.p0 >> v.p1 >> v.p2;
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
QVector3D vectorFromString(const QString & str);
|
||||
QColor colorFromString(const QString & str);
|
||||
inline QVector4D QColor2QVector(const QColor & c) {return QVector4D(c.redF(), c.greenF(), c.blueF(), c.alphaF());}
|
||||
inline QVector4D QColor2QVector(const QColor & c) {
|
||||
return QVector4D(c.redF(), c.greenF(), c.blueF(), c.alphaF());
|
||||
}
|
||||
inline float cosABV(const QVector3D & v0, const QVector3D & v1) {
|
||||
float l = v0.length() * v1.length();
|
||||
if (l == 0.f) return 0.;
|
||||
return (QVector3D::dotProduct(v0, v1)) / l;
|
||||
}
|
||||
inline void normalizeAngleRad(float & a) {while (a < 0.) a += M_2PI; while (a >= M_2PI) a -= M_2PI;}
|
||||
inline void normalizeAngleDeg360(float & a) {while (a < 0.) a += 360. ; while (a >= 360. ) a -= 360. ;}
|
||||
inline QVector3D projection(const QVector3D & v, const QVector3D & to) {return to.normalized() * v.length() * cosABV(v, to);}
|
||||
inline void normalizeAngleRad(float & a) {
|
||||
while (a < 0.)
|
||||
a += M_2PI;
|
||||
while (a >= M_2PI)
|
||||
a -= M_2PI;
|
||||
}
|
||||
inline void normalizeAngleDeg360(float & a) {
|
||||
while (a < 0.)
|
||||
a += 360.;
|
||||
while (a >= 360.)
|
||||
a -= 360.;
|
||||
}
|
||||
inline QVector3D projection(const QVector3D & v, const QVector3D & to) {
|
||||
return to.normalized() * v.length() * cosABV(v, to);
|
||||
}
|
||||
QVector3D orthToVector(const QVector3D & v, const float & scale = 1.);
|
||||
QVector3D rotateVector(const QVector3D & v, const QVector3D & a);
|
||||
void setVectorLength(QVector3D & v, const float & l);
|
||||
void lengthenVector(QVector3D & v, const float & l);
|
||||
inline float squareLength(const QVector3D & from, const QVector3D & to) {return (to.x() - from.x())*(to.x() - from.x()) + (to.y() - from.y())*(to.y() - from.y()) + (to.z() - from.z())*(to.z() - from.z());}
|
||||
inline QVector3D directionFromAngles(const QVector3D & a) {return rotateVector(QVector3D(1., 0., 0.), a);}
|
||||
inline float frac(const float & x, const float & b) {return x - int(x / b) * b;}
|
||||
inline float squareLength(const QVector3D & from, const QVector3D & to) {
|
||||
return (to.x() - from.x()) * (to.x() - from.x()) + (to.y() - from.y()) * (to.y() - from.y()) +
|
||||
(to.z() - from.z()) * (to.z() - from.z());
|
||||
}
|
||||
inline QVector3D directionFromAngles(const QVector3D & a) {
|
||||
return rotateVector(QVector3D(1., 0., 0.), a);
|
||||
}
|
||||
inline float frac(const float & x, const float & b) {
|
||||
return x - int(x / b) * b;
|
||||
}
|
||||
|
||||
|
||||
#endif // GLTYPES_H
|
||||
|
||||
@@ -17,23 +17,21 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "glvertexobject.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
|
||||
VertexObject::VertexObject():
|
||||
buffer_obj (GL_ARRAY_BUFFER, GL_STREAM_DRAW),
|
||||
buffer_sel (GL_ARRAY_BUFFER, GL_STREAM_DRAW) {
|
||||
VertexObject::VertexObject(): buffer_obj(GL_ARRAY_BUFFER, GL_STREAM_DRAW), buffer_sel(GL_ARRAY_BUFFER, GL_STREAM_DRAW) {
|
||||
vao_ = 0;
|
||||
buffers_binded = false;
|
||||
objects_changed = selected_changed = true;
|
||||
}
|
||||
|
||||
|
||||
VertexObject::~VertexObject() {
|
||||
}
|
||||
VertexObject::~VertexObject() {}
|
||||
|
||||
|
||||
void VertexObject::init(QOpenGLExtraFunctions * f) {
|
||||
|
||||
@@ -23,8 +23,7 @@
|
||||
#include "glshaders_types.h"
|
||||
|
||||
|
||||
class VertexObject
|
||||
{
|
||||
class VertexObject {
|
||||
public:
|
||||
VertexObject();
|
||||
~VertexObject();
|
||||
|
||||
18
core/hdr.cpp
18
core/hdr.cpp
@@ -17,8 +17,9 @@
|
||||
*/
|
||||
|
||||
#include "hdr_p.h"
|
||||
#include <qmath.h>
|
||||
|
||||
#include <QByteArray>
|
||||
#include <qmath.h>
|
||||
|
||||
#define RGBE_DATA_RED 2
|
||||
#define RGBE_DATA_GREEN 1
|
||||
@@ -34,8 +35,7 @@ void rgbe2float(float *red, float *green, float *blue, uchar rgbe[4]) {
|
||||
*red = rgbe[0] * f;
|
||||
*green = rgbe[1] * f;
|
||||
*blue = rgbe[2] * f;
|
||||
}
|
||||
else
|
||||
} else
|
||||
*red = *green = *blue = 0.0;
|
||||
}
|
||||
|
||||
@@ -44,8 +44,7 @@ void rgbe2float(float *red, float *green, float *blue, uchar rgbe[4]) {
|
||||
bool RGBE_ReadPixels(QDataStream * fp, float * data, int numpixels) {
|
||||
uchar rgbe[4];
|
||||
while (numpixels-- > 0) {
|
||||
if (fp->readRawData((char*)rgbe, sizeof(rgbe)) < 1)
|
||||
return false;
|
||||
if (fp->readRawData((char *)rgbe, sizeof(rgbe)) < 1) return false;
|
||||
rgbe2float(&data[RGBE_DATA_RED], &data[RGBE_DATA_GREEN], &data[RGBE_DATA_BLUE], rgbe);
|
||||
data += RGBE_DATA_SIZE;
|
||||
}
|
||||
@@ -59,8 +58,7 @@ bool RGBE_ReadPixels_RLE(QDataStream * fp, float * data, int scanline_width, int
|
||||
uchar buf[2];
|
||||
QByteArray scanline_buffer;
|
||||
|
||||
if ((scanline_width < 8)||(scanline_width > 0x7fff))
|
||||
/* run length encoding is not allowed so read flat*/
|
||||
if ((scanline_width < 8) || (scanline_width > 0x7fff)) /* run length encoding is not allowed so read flat*/
|
||||
return RGBE_ReadPixels(fp, data, scanline_width * num_scanlines);
|
||||
scanline_buffer.resize(4 * scanline_width);
|
||||
/* read in each successive scanline */
|
||||
@@ -93,8 +91,7 @@ bool RGBE_ReadPixels_RLE(QDataStream * fp, float * data, int scanline_width, int
|
||||
}
|
||||
while (count-- > 0)
|
||||
*ptr++ = buf[1];
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* a non-run */
|
||||
count = buf[0];
|
||||
if ((count == 0) || (count > ptr_end - ptr)) {
|
||||
@@ -116,8 +113,7 @@ bool RGBE_ReadPixels_RLE(QDataStream * fp, float * data, int scanline_width, int
|
||||
rgbe[1] = scanline_buffer[i + scanline_width];
|
||||
rgbe[2] = scanline_buffer[i + 2 * scanline_width];
|
||||
rgbe[3] = scanline_buffer[i + 3 * scanline_width];
|
||||
rgbe2float(&data[RGBE_DATA_RED],&data[RGBE_DATA_GREEN],
|
||||
&data[RGBE_DATA_BLUE],rgbe);
|
||||
rgbe2float(&data[RGBE_DATA_RED], &data[RGBE_DATA_GREEN], &data[RGBE_DATA_BLUE], rgbe);
|
||||
data += RGBE_DATA_SIZE;
|
||||
}
|
||||
num_scanlines--;
|
||||
|
||||
@@ -17,25 +17,36 @@
|
||||
*/
|
||||
|
||||
#include "loader_assimp.h"
|
||||
#include "glscene.h"
|
||||
#include "glmesh.h"
|
||||
|
||||
#include "glmaterial.h"
|
||||
#include "glmesh.h"
|
||||
#include "globject.h"
|
||||
#include "glscene.h"
|
||||
|
||||
#include <assimp/Importer.hpp>
|
||||
#include <assimp/material.h>
|
||||
#include <assimp/mesh.h>
|
||||
#include <assimp/postprocess.h>
|
||||
#include <assimp/scene.h>
|
||||
#include <assimp/mesh.h>
|
||||
#include <assimp/material.h>
|
||||
|
||||
QString fromAiString (const aiString & s) {return QString::fromLocal8Bit(s.C_Str());}
|
||||
QColor fromAiColor (const aiColor4D & c) {return QColor::fromRgbF(piClamp(c.r, 0.f, 1.f), piClamp(c.g, 0.f, 1.f), piClamp(c.b, 0.f, 1.f));}
|
||||
QVector3D fromAiVector3D(const aiVector3D & v) {return QVector3D(v.x, v.y, v.z);}
|
||||
Vector3i fromAiFace (const aiFace & v) {return Vector3i(v.mIndices[0], v.mIndices[1], v.mIndices[2]);}
|
||||
QMatrix4x4 fromAiMatrix4D(const aiMatrix4x4 & v) {return QMatrix4x4(v.a1, v.a2, v.a3, v.a4,
|
||||
v.b1, v.b2, v.b3, v.b4,
|
||||
v.c1, v.c2, v.c3, v.c4,
|
||||
v.d1, v.d2, v.d3, v.d4);}
|
||||
bool isAiMeshTriangles(const aiMesh * m) {return (m->mPrimitiveTypes & aiPrimitiveType_TRIANGLE) == aiPrimitiveType_TRIANGLE;}
|
||||
QString fromAiString(const aiString & s) {
|
||||
return QString::fromLocal8Bit(s.C_Str());
|
||||
}
|
||||
QColor fromAiColor(const aiColor4D & c) {
|
||||
return QColor::fromRgbF(piClamp(c.r, 0.f, 1.f), piClamp(c.g, 0.f, 1.f), piClamp(c.b, 0.f, 1.f));
|
||||
}
|
||||
QVector3D fromAiVector3D(const aiVector3D & v) {
|
||||
return QVector3D(v.x, v.y, v.z);
|
||||
}
|
||||
Vector3i fromAiFace(const aiFace & v) {
|
||||
return Vector3i(v.mIndices[0], v.mIndices[1], v.mIndices[2]);
|
||||
}
|
||||
QMatrix4x4 fromAiMatrix4D(const aiMatrix4x4 & v) {
|
||||
return QMatrix4x4(v.a1, v.a2, v.a3, v.a4, v.b1, v.b2, v.b3, v.b4, v.c1, v.c2, v.c3, v.c4, v.d1, v.d2, v.d3, v.d4);
|
||||
}
|
||||
bool isAiMeshTriangles(const aiMesh * m) {
|
||||
return (m->mPrimitiveTypes & aiPrimitiveType_TRIANGLE) == aiPrimitiveType_TRIANGLE;
|
||||
}
|
||||
|
||||
|
||||
Mesh * assimpMesh(const aiMesh * m) {
|
||||
@@ -44,8 +55,10 @@ Mesh * assimpMesh(const aiMesh * m) {
|
||||
Mesh * ret = new Mesh();
|
||||
int vcnt = m->mNumVertices, tcnt = m->mNumFaces;
|
||||
|
||||
QVector<QVector3D> & v(ret->vertices()); v.resize(vcnt);
|
||||
QVector<QVector2D> & t(ret->texcoords()); t.resize(vcnt);
|
||||
QVector<QVector3D> & v(ret->vertices());
|
||||
v.resize(vcnt);
|
||||
QVector<QVector2D> & t(ret->texcoords());
|
||||
t.resize(vcnt);
|
||||
QVector<Vector3i> & ind(ret->indicesTriangles());
|
||||
|
||||
for (int i = 0; i < vcnt; ++i)
|
||||
@@ -136,8 +149,7 @@ Material * assimpMaterial(const aiMaterial * m) {
|
||||
|
||||
Light * assimpLight(const aiLight * l) {
|
||||
if (!l) return 0;
|
||||
if (l->mType != aiLightSource_POINT && l->mType != aiLightSource_SPOT)
|
||||
return 0;
|
||||
if (l->mType != aiLightSource_POINT && l->mType != aiLightSource_SPOT) return 0;
|
||||
Light * ret = new Light();
|
||||
ret->setName(fromAiString(l->mName));
|
||||
ret->setPos(fromAiVector3D(l->mPosition));
|
||||
@@ -147,8 +159,7 @@ Light * assimpLight(const aiLight * l) {
|
||||
ret->decay_quadratic = l->mAttenuationQuadratic;
|
||||
ret->angle_start = l->mAngleInnerCone * rad2deg;
|
||||
ret->angle_end = l->mAngleOuterCone * rad2deg;
|
||||
if (l->mType == aiLightSource_SPOT)
|
||||
ret->light_type = Light::Cone;
|
||||
if (l->mType == aiLightSource_SPOT) ret->light_type = Light::Cone;
|
||||
QVector3D col(l->mColorDiffuse.r, l->mColorDiffuse.g, l->mColorDiffuse.b);
|
||||
ret->intensity = col.length();
|
||||
col /= ret->intensity;
|
||||
@@ -157,9 +168,12 @@ Light * assimpLight(const aiLight * l) {
|
||||
}
|
||||
|
||||
|
||||
ObjectBaseList assimpObject(const aiNode * n, const QVector<Mesh * > & meshes, aiMesh ** ai_meshes,
|
||||
ObjectBaseList assimpObject(const aiNode * n,
|
||||
const QVector<Mesh *> & meshes,
|
||||
aiMesh ** ai_meshes,
|
||||
const QVector<Material *> & materials,
|
||||
const QMap<QString, Light * > & light_by_name, QVector<Light*> & out_lights) {
|
||||
const QMap<QString, Light *> & light_by_name,
|
||||
QVector<Light *> & out_lights) {
|
||||
if (!n) return ObjectBaseList();
|
||||
ObjectBaseList ret;
|
||||
ObjectBase * obj = 0;
|
||||
@@ -185,8 +199,7 @@ ObjectBaseList assimpObject(const aiNode * n, const QVector<Mesh * > & meshes, a
|
||||
}
|
||||
obj->setMesh(meshes[mi]);
|
||||
int mati = ai_meshes[mi]->mMaterialIndex;
|
||||
if (mati >= 0 || mati < materials.size())
|
||||
obj->setMaterial(materials[mati]);
|
||||
if (mati >= 0 || mati < materials.size()) obj->setMaterial(materials[mati]);
|
||||
// ret->setMesh(meshes[mi]);
|
||||
// qDebug() << "set mesh" << mi << ret->mesh();
|
||||
// break;
|
||||
@@ -207,10 +220,9 @@ Scene * loadScene(const QString & filepath) {
|
||||
if (filepath.isEmpty()) return 0;
|
||||
qDebug() << "[Loader Assimp] Import" << filepath << "...";
|
||||
Assimp::Importer importer;
|
||||
const aiScene * ais = importer.ReadFile(filepath.toUtf8(), aiProcess_Triangulate |
|
||||
aiProcess_SortByPType |
|
||||
aiProcess_GenUVCoords |
|
||||
aiProcess_TransformUVCoords);
|
||||
const aiScene * ais =
|
||||
importer.ReadFile(filepath.toUtf8(),
|
||||
aiProcess_Triangulate | aiProcess_SortByPType | aiProcess_GenUVCoords | aiProcess_TransformUVCoords);
|
||||
if (!ais) {
|
||||
qDebug() << "[Loader Assimp] Error: \"" + QString(importer.GetErrorString()) + "\"";
|
||||
return 0;
|
||||
@@ -227,8 +239,7 @@ Scene * loadScene(const QString & filepath) {
|
||||
lights << assimpLight(ais->mLights[i]);
|
||||
QMap<QString, Light *> light_by_name;
|
||||
foreach(Light * l, lights)
|
||||
if (l)
|
||||
light_by_name[l->name()] = l;
|
||||
if (l) light_by_name[l->name()] = l;
|
||||
|
||||
QVector<Light *> out_lights;
|
||||
ObjectBaseList rootl = assimpObject(ais->mRootNode, meshes, ais->mMeshes, materials, light_by_name, out_lights);
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
*/
|
||||
|
||||
#include "loader_qgl.h"
|
||||
|
||||
#include "glscene.h"
|
||||
|
||||
#include <chunkstream.h>
|
||||
|
||||
|
||||
@@ -53,8 +55,7 @@ Scene * loadFromQGLFile(const QString & filepath) {
|
||||
|
||||
bool saveToQGLFile(const QString & filepath, const Scene * scene) {
|
||||
QFile f(filepath);
|
||||
if (!f.open(QIODevice::ReadWrite))
|
||||
return false;
|
||||
if (!f.open(QIODevice::ReadWrite)) return false;
|
||||
f.resize(0);
|
||||
QDataStream s(&f);
|
||||
s.setVersion(QDataStream::Qt_5_0);
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#define LOADER_QGL_H
|
||||
|
||||
#include "gltypes.h"
|
||||
|
||||
#include <QFileInfo>
|
||||
|
||||
Scene * loadFromQGLFile(const QString & filepath);
|
||||
|
||||
@@ -22,10 +22,10 @@
|
||||
#include "globject.h"
|
||||
|
||||
|
||||
class Camera: public AimedObject
|
||||
{
|
||||
class Camera: public AimedObject {
|
||||
friend QDataStream & operator<<(QDataStream & s, const ObjectBase * p);
|
||||
friend QDataStream & operator>>(QDataStream & s, ObjectBase *& p);
|
||||
|
||||
public:
|
||||
Camera();
|
||||
|
||||
|
||||
222
globject.cpp
222
globject.cpp
@@ -17,9 +17,11 @@
|
||||
*/
|
||||
|
||||
#include "globject.h"
|
||||
|
||||
#include "glcamera.h"
|
||||
#include "glscene.h"
|
||||
#include "glmesh.h"
|
||||
#include "glscene.h"
|
||||
|
||||
#include <chunkstream.h>
|
||||
// static int _count = 0;
|
||||
|
||||
@@ -106,8 +108,7 @@ void ObjectBase::init() {
|
||||
RenderPass ObjectBase::pass() const {
|
||||
RenderPass ret = rpSolid;
|
||||
if (material_)
|
||||
if (material_->hasTransparency())
|
||||
ret = rpTransparent;
|
||||
if (material_->hasTransparency()) ret = rpTransparent;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -121,8 +122,7 @@ void ObjectBase::setScene(Scene * v) {
|
||||
|
||||
void ObjectBase::addChild(ObjectBase * o) {
|
||||
if (o == this) return;
|
||||
if (o->parent_)
|
||||
o->parent_->children_.removeAll(o);
|
||||
if (o->parent_) o->parent_->children_.removeAll(o);
|
||||
children_ << o;
|
||||
o->parent_ = this;
|
||||
o->setScene(scene_);
|
||||
@@ -326,8 +326,10 @@ void ObjectBase::transferTransformToChildren(bool only_scale) {
|
||||
if (only_scale) m = trans.matrixScale();
|
||||
foreach(ObjectBase * i, children_)
|
||||
i->trans.setMatrix(m * i->trans.matrix());
|
||||
if (only_scale) resetScale();
|
||||
else setMatrix(QMatrix4x4());
|
||||
if (only_scale)
|
||||
resetScale();
|
||||
else
|
||||
setMatrix(QMatrix4x4());
|
||||
}
|
||||
|
||||
|
||||
@@ -357,10 +359,8 @@ bool ObjectBase::isSelected(bool check_parents) const {
|
||||
|
||||
void ObjectBase::setSelected(bool yes) {
|
||||
// qDebug() << "select" << name() << view_;
|
||||
if (select_)
|
||||
selected_ = yes;
|
||||
if (!selected_)
|
||||
selected_aim = false;
|
||||
if (select_) selected_ = yes;
|
||||
if (!selected_) selected_aim = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -377,7 +377,8 @@ ObjectBase * ObjectBase::selectedParent() const {
|
||||
void ObjectBase::setMaterial(Material * m, bool with_children) {
|
||||
material_ = m;
|
||||
if (with_children)
|
||||
foreach (ObjectBase * i, children_) i->setMaterial(m, true);
|
||||
foreach(ObjectBase * i, children_)
|
||||
i->setMaterial(m, true);
|
||||
setObjectsChanged();
|
||||
if (scene_) scene_->mat_changed = scene_->tree_changed = true;
|
||||
}
|
||||
@@ -386,14 +387,14 @@ void ObjectBase::setMaterial(Material * m, bool with_children) {
|
||||
void ObjectBase::setColor(QColor c, bool with_children) {
|
||||
color_ = c;
|
||||
if (with_children)
|
||||
foreach (ObjectBase * i, children_) i->setColor(c, true);
|
||||
foreach(ObjectBase * i, children_)
|
||||
i->setColor(c, true);
|
||||
setObjectsChanged();
|
||||
}
|
||||
|
||||
|
||||
void ObjectBase::setMesh(Mesh * v) {
|
||||
if (scene_)
|
||||
v = scene_->attachMesh(v);
|
||||
if (scene_) v = scene_->attachMesh(v);
|
||||
mesh_ = v;
|
||||
setSceneTreeChanged();
|
||||
setObjectsChanged();
|
||||
@@ -404,8 +405,7 @@ void ObjectBase::buildTransform(bool force) {
|
||||
if (force) trans.setDirty();
|
||||
itransform_.setToIdentity();
|
||||
ObjectBase * p = parent_;
|
||||
if (p)
|
||||
itransform_ = p->itransform_;
|
||||
if (p) itransform_ = p->itransform_;
|
||||
// if (raw_matrix) {
|
||||
// itransform_.translate(pos_);
|
||||
// itransform_ *= mat_;
|
||||
@@ -421,7 +421,8 @@ void ObjectBase::buildTransform(bool force) {
|
||||
|
||||
void ObjectBase::initInternal() {
|
||||
init();
|
||||
foreach (ObjectBase * i, children_) i->initInternal();
|
||||
foreach(ObjectBase * i, children_)
|
||||
i->initInternal();
|
||||
}
|
||||
|
||||
|
||||
@@ -469,8 +470,6 @@ QMatrix4x4 ObjectBase::worldMatrix(QMatrix4x4 parent) const {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
AimedObject::AimedObject() {
|
||||
aim_dist = 1.;
|
||||
}
|
||||
@@ -560,11 +559,7 @@ void AimedObject::orbitXY(const float & a) {
|
||||
}
|
||||
|
||||
|
||||
void AimedObject::transformChanged() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void AimedObject::transformChanged() {}
|
||||
|
||||
|
||||
Light::Light(): AimedObject(), shadow_map(0, true, GL_R16F) {
|
||||
@@ -625,24 +620,45 @@ void Light::apply() {
|
||||
QDataStream & operator<<(QDataStream & s, const ObjectBase * p) {
|
||||
ChunkStream cs;
|
||||
// qDebug() << "place" << p->name() << "...";
|
||||
cs.add(1, int(p->type_)).add(2, p->accept_light).add(3, p->accept_fog).add(4, p->visible_)
|
||||
.add(5, p->cast_shadow).add(6, p->rec_shadow).add(7, p->raw_matrix).add(8, p->line_width)
|
||||
.add(9, int(p->render_mode)).add(14, p->mat_).add(16, p->children_.size())
|
||||
.add(17, p->name_).add(18, p->meta).add(19, p->color_).add(20, p->trans);
|
||||
cs.add(1, int(p->type_))
|
||||
.add(2, p->accept_light)
|
||||
.add(3, p->accept_fog)
|
||||
.add(4, p->visible_)
|
||||
.add(5, p->cast_shadow)
|
||||
.add(6, p->rec_shadow)
|
||||
.add(7, p->raw_matrix)
|
||||
.add(8, p->line_width)
|
||||
.add(9, int(p->render_mode))
|
||||
.add(14, p->mat_)
|
||||
.add(16, p->children_.size())
|
||||
.add(17, p->name_)
|
||||
.add(18, p->meta)
|
||||
.add(19, p->color_)
|
||||
.add(20, p->trans);
|
||||
// qDebug() << "place self done";
|
||||
if (p->type_ == ObjectBase::glLight) {
|
||||
// qDebug() << "place light ...";
|
||||
const Light * l = (const Light *)p;
|
||||
cs.add(101, l->angle_start).add(102, l->angle_end).add(103, l->intensity)
|
||||
.add(104, l->decay_const).add(105, l->decay_linear).add(106, l->decay_quadratic)
|
||||
.add(107, l->decay_start).add(108, l->decay_end).add(109, int(l->light_type))
|
||||
cs.add(101, l->angle_start)
|
||||
.add(102, l->angle_end)
|
||||
.add(103, l->intensity)
|
||||
.add(104, l->decay_const)
|
||||
.add(105, l->decay_linear)
|
||||
.add(106, l->decay_quadratic)
|
||||
.add(107, l->decay_start)
|
||||
.add(108, l->decay_end)
|
||||
.add(109, int(l->light_type))
|
||||
.add(111, l->distance());
|
||||
}
|
||||
if (p->type_ == ObjectBase::glCamera) {
|
||||
// qDebug() << "place camera ...";
|
||||
const Camera * c = (const Camera *)p;
|
||||
cs.add(200, c->aim()).add(201, c->fov_).add(202, c->depth_start)
|
||||
.add(206, c->mirror_x).add(207, c->mirror_y).add(208, c->distance())
|
||||
cs.add(200, c->aim())
|
||||
.add(201, c->fov_)
|
||||
.add(202, c->depth_start)
|
||||
.add(206, c->mirror_x)
|
||||
.add(207, c->mirror_y)
|
||||
.add(208, c->distance())
|
||||
.add(209, c->roll_);
|
||||
}
|
||||
// qDebug() << "place" << p->name() << cs.data().size() << s.device()->size();
|
||||
@@ -664,44 +680,114 @@ QDataStream & operator >>(QDataStream & s, ObjectBase *& p) {
|
||||
ObjectBase::Type type = (ObjectBase::Type)cs.getData<int>();
|
||||
switch (type) {
|
||||
case ObjectBase::glMesh: p = new ObjectBase(); break;
|
||||
case ObjectBase::glLight: p = new Light(); l = (Light*)p; break;
|
||||
case ObjectBase::glCamera: p = new Camera(); c = (Camera*)p; break;
|
||||
case ObjectBase::glLight:
|
||||
p = new Light();
|
||||
l = (Light *)p;
|
||||
break;
|
||||
case ObjectBase::glCamera:
|
||||
p = new Camera();
|
||||
c = (Camera *)p;
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
if (p) p->type_ = type;
|
||||
} break;
|
||||
case 2: if (p) p->accept_light = cs.getData<bool>(); break;
|
||||
case 3: if (p) p->accept_fog = cs.getData<bool>(); break;
|
||||
case 4: if (p) p->visible_ = cs.getData<bool>(); break;
|
||||
case 5: if (p) p->cast_shadow = cs.getData<bool>(); break;
|
||||
case 6: if (p) p->rec_shadow = cs.getData<bool>(); break;
|
||||
case 7: if (p) p->raw_matrix = cs.getData<bool>(); break;
|
||||
case 8: if (p) p->line_width = cs.getData<float>(); break;
|
||||
case 9: if (p) p->render_mode = (ObjectBase::RenderMode)cs.getData<int>(); break;
|
||||
case 14: if (p) p->mat_ = cs.getData<QMatrix4x4>(); break;
|
||||
case 16: if (p) ccnt = cs.getData<int>(); break;
|
||||
case 17: if (p) p->name_ = cs.getData<QString>(); break;
|
||||
case 18: if (p) p->meta = cs.getData<QVariantMap>(); break;
|
||||
case 19: if (p) p->color_ = cs.getData<QColor>(); break;
|
||||
case 20: if (p) p->trans = cs.getData<Transform>(); break;
|
||||
case 100: if (l) l->setAim(cs.getData<QVector3D>()); break;
|
||||
case 101: if (l) l->angle_start = cs.getData<GLfloat>(); break;
|
||||
case 102: if (l) l->angle_end = cs.getData<GLfloat>(); break;
|
||||
case 103: if (l) l->intensity = cs.getData<GLfloat>(); break;
|
||||
case 104: if (l) l->decay_const = cs.getData<GLfloat>(); break;
|
||||
case 105: if (l) l->decay_linear = cs.getData<GLfloat>(); break;
|
||||
case 106: if (l) l->decay_quadratic = cs.getData<GLfloat>(); break;
|
||||
case 107: if (l) l->decay_start = cs.getData<GLfloat>(); break;
|
||||
case 108: if (l) l->decay_end = cs.getData<GLfloat>(); break;
|
||||
case 109: if (l) l->light_type = (Light::Type)cs.getData<int>(); break;
|
||||
case 111: if (l) l->setDistance(cs.getData<double>()); break;
|
||||
case 200: if (c) c->setAim(cs.getData<QVector3D>()); break;
|
||||
case 201: if (c) c->setFOV(cs.getData<GLfloat>()); break;
|
||||
case 202: if (c) c->setDepthStart(cs.getData<GLfloat>()); break;
|
||||
case 206: if (c) c->mirror_x = cs.getData<bool>(); break;
|
||||
case 207: if (c) c->mirror_y = cs.getData<bool>(); break;
|
||||
case 208: if (c) c->setDistance(cs.getData<double>()); break;
|
||||
case 209: if (c) c->roll_ = cs.getData<GLfloat>(); break;
|
||||
case 2:
|
||||
if (p) p->accept_light = cs.getData<bool>();
|
||||
break;
|
||||
case 3:
|
||||
if (p) p->accept_fog = cs.getData<bool>();
|
||||
break;
|
||||
case 4:
|
||||
if (p) p->visible_ = cs.getData<bool>();
|
||||
break;
|
||||
case 5:
|
||||
if (p) p->cast_shadow = cs.getData<bool>();
|
||||
break;
|
||||
case 6:
|
||||
if (p) p->rec_shadow = cs.getData<bool>();
|
||||
break;
|
||||
case 7:
|
||||
if (p) p->raw_matrix = cs.getData<bool>();
|
||||
break;
|
||||
case 8:
|
||||
if (p) p->line_width = cs.getData<float>();
|
||||
break;
|
||||
case 9:
|
||||
if (p) p->render_mode = (ObjectBase::RenderMode)cs.getData<int>();
|
||||
break;
|
||||
case 14:
|
||||
if (p) p->mat_ = cs.getData<QMatrix4x4>();
|
||||
break;
|
||||
case 16:
|
||||
if (p) ccnt = cs.getData<int>();
|
||||
break;
|
||||
case 17:
|
||||
if (p) p->name_ = cs.getData<QString>();
|
||||
break;
|
||||
case 18:
|
||||
if (p) p->meta = cs.getData<QVariantMap>();
|
||||
break;
|
||||
case 19:
|
||||
if (p) p->color_ = cs.getData<QColor>();
|
||||
break;
|
||||
case 20:
|
||||
if (p) p->trans = cs.getData<Transform>();
|
||||
break;
|
||||
case 100:
|
||||
if (l) l->setAim(cs.getData<QVector3D>());
|
||||
break;
|
||||
case 101:
|
||||
if (l) l->angle_start = cs.getData<GLfloat>();
|
||||
break;
|
||||
case 102:
|
||||
if (l) l->angle_end = cs.getData<GLfloat>();
|
||||
break;
|
||||
case 103:
|
||||
if (l) l->intensity = cs.getData<GLfloat>();
|
||||
break;
|
||||
case 104:
|
||||
if (l) l->decay_const = cs.getData<GLfloat>();
|
||||
break;
|
||||
case 105:
|
||||
if (l) l->decay_linear = cs.getData<GLfloat>();
|
||||
break;
|
||||
case 106:
|
||||
if (l) l->decay_quadratic = cs.getData<GLfloat>();
|
||||
break;
|
||||
case 107:
|
||||
if (l) l->decay_start = cs.getData<GLfloat>();
|
||||
break;
|
||||
case 108:
|
||||
if (l) l->decay_end = cs.getData<GLfloat>();
|
||||
break;
|
||||
case 109:
|
||||
if (l) l->light_type = (Light::Type)cs.getData<int>();
|
||||
break;
|
||||
case 111:
|
||||
if (l) l->setDistance(cs.getData<double>());
|
||||
break;
|
||||
case 200:
|
||||
if (c) c->setAim(cs.getData<QVector3D>());
|
||||
break;
|
||||
case 201:
|
||||
if (c) c->setFOV(cs.getData<GLfloat>());
|
||||
break;
|
||||
case 202:
|
||||
if (c) c->setDepthStart(cs.getData<GLfloat>());
|
||||
break;
|
||||
case 206:
|
||||
if (c) c->mirror_x = cs.getData<bool>();
|
||||
break;
|
||||
case 207:
|
||||
if (c) c->mirror_y = cs.getData<bool>();
|
||||
break;
|
||||
case 208:
|
||||
if (c) c->setDistance(cs.getData<double>());
|
||||
break;
|
||||
case 209:
|
||||
if (c) c->roll_ = cs.getData<GLfloat>();
|
||||
break;
|
||||
}
|
||||
}
|
||||
// qDebug() << p->name() << ccnt;
|
||||
|
||||
238
globject.h
238
globject.h
@@ -21,20 +21,30 @@
|
||||
|
||||
#include "glframebuffer.h"
|
||||
#include "glmaterial.h"
|
||||
#include "gltypes.h"
|
||||
#include "gltransform.h"
|
||||
#include "gltypes.h"
|
||||
|
||||
|
||||
class ObjectBase
|
||||
{
|
||||
class ObjectBase {
|
||||
friend class Scene;
|
||||
friend class RendererSelection;
|
||||
friend QDataStream & operator<<(QDataStream & s, const ObjectBase * p);
|
||||
friend QDataStream & operator>>(QDataStream & s, ObjectBase *& p);
|
||||
friend QDataStream & operator>>(QDataStream & s, Scene *& p);
|
||||
|
||||
public:
|
||||
enum Type {glMesh, glLight, glCamera, glParticlesSystem};
|
||||
enum RenderMode {View = 0, Point = GL_POINT, Line = GL_LINE, Fill = GL_FILL};
|
||||
enum Type {
|
||||
glMesh,
|
||||
glLight,
|
||||
glCamera,
|
||||
glParticlesSystem
|
||||
};
|
||||
enum RenderMode {
|
||||
View = 0,
|
||||
Point = GL_POINT,
|
||||
Line = GL_LINE,
|
||||
Fill = GL_FILL
|
||||
};
|
||||
|
||||
explicit ObjectBase(Mesh * geom = 0, Material * mat = 0);
|
||||
virtual ~ObjectBase();
|
||||
@@ -86,19 +96,58 @@ public:
|
||||
void setReceiveShadows(bool on) { rec_shadow = on; }
|
||||
void setCastShadows(bool on) { cast_shadow = on; }
|
||||
|
||||
void move(const QVector3D & dv) {trans.setTranslation(pos() + dv); buildTransform();}
|
||||
void moveTo(const QVector3D & dv) {trans.setTranslation(dv); buildTransform();}
|
||||
void move(GLfloat dx, GLfloat dy, GLfloat dz = 0.) {move(QVector3D(dx, dy, dz)); buildTransform();}
|
||||
void moveTo(GLfloat dx, GLfloat dy, GLfloat dz = 0.) {moveTo(QVector3D(dx, dy, dz)); buildTransform();}
|
||||
void moveX(GLfloat o) {trans.setTranslationX(posX() + o); buildTransform();}
|
||||
void moveY(GLfloat o) {trans.setTranslationY(posY() + o); buildTransform();}
|
||||
void moveZ(GLfloat o) {trans.setTranslationZ(posZ() + o); buildTransform();}
|
||||
void setPosX(GLfloat o) {trans.setTranslationX(o); buildTransform();}
|
||||
void setPosY(GLfloat o) {trans.setTranslationY(o); buildTransform();}
|
||||
void setPosZ(GLfloat o) {trans.setTranslationZ(o); buildTransform();}
|
||||
void setPos(GLfloat x, GLfloat y, GLfloat z) {trans.setTranslation(QVector3D(x, y, z)); buildTransform();}
|
||||
void setPos(const QVector3D & p) {trans.setTranslation(p); buildTransform();}
|
||||
void resetPos() {trans.setTranslation(QVector3D()); buildTransform();}
|
||||
void move(const QVector3D & dv) {
|
||||
trans.setTranslation(pos() + dv);
|
||||
buildTransform();
|
||||
}
|
||||
void moveTo(const QVector3D & dv) {
|
||||
trans.setTranslation(dv);
|
||||
buildTransform();
|
||||
}
|
||||
void move(GLfloat dx, GLfloat dy, GLfloat dz = 0.) {
|
||||
move(QVector3D(dx, dy, dz));
|
||||
buildTransform();
|
||||
}
|
||||
void moveTo(GLfloat dx, GLfloat dy, GLfloat dz = 0.) {
|
||||
moveTo(QVector3D(dx, dy, dz));
|
||||
buildTransform();
|
||||
}
|
||||
void moveX(GLfloat o) {
|
||||
trans.setTranslationX(posX() + o);
|
||||
buildTransform();
|
||||
}
|
||||
void moveY(GLfloat o) {
|
||||
trans.setTranslationY(posY() + o);
|
||||
buildTransform();
|
||||
}
|
||||
void moveZ(GLfloat o) {
|
||||
trans.setTranslationZ(posZ() + o);
|
||||
buildTransform();
|
||||
}
|
||||
void setPosX(GLfloat o) {
|
||||
trans.setTranslationX(o);
|
||||
buildTransform();
|
||||
}
|
||||
void setPosY(GLfloat o) {
|
||||
trans.setTranslationY(o);
|
||||
buildTransform();
|
||||
}
|
||||
void setPosZ(GLfloat o) {
|
||||
trans.setTranslationZ(o);
|
||||
buildTransform();
|
||||
}
|
||||
void setPos(GLfloat x, GLfloat y, GLfloat z) {
|
||||
trans.setTranslation(QVector3D(x, y, z));
|
||||
buildTransform();
|
||||
}
|
||||
void setPos(const QVector3D & p) {
|
||||
trans.setTranslation(p);
|
||||
buildTransform();
|
||||
}
|
||||
void resetPos() {
|
||||
trans.setTranslation(QVector3D());
|
||||
buildTransform();
|
||||
}
|
||||
|
||||
QVector3D pos() const { return trans.translation(); }
|
||||
float posX() const { return trans.translation().x(); }
|
||||
@@ -111,32 +160,108 @@ public:
|
||||
float rotationX() const { return rotation().x(); }
|
||||
float rotationY() const { return rotation().y(); }
|
||||
float rotationZ() const { return rotation().z(); }
|
||||
void rotateX(GLfloat a) {raw_matrix = false; trans.setRotationX(trans.rotationX() + a); buildTransform();}
|
||||
void rotateY(GLfloat a) {raw_matrix = false; trans.setRotationY(trans.rotationY() + a); buildTransform();}
|
||||
void rotateX(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setRotationX(trans.rotationX() + a);
|
||||
buildTransform();
|
||||
}
|
||||
void rotateY(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setRotationY(trans.rotationY() + a);
|
||||
buildTransform();
|
||||
}
|
||||
void rotateZ(GLfloat a);
|
||||
void setRotationX(GLfloat a) {raw_matrix = false; trans.setRotationX(a); buildTransform();}
|
||||
void setRotationY(GLfloat a) {raw_matrix = false; trans.setRotationY(a); buildTransform();}
|
||||
void setRotationX(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setRotationX(a);
|
||||
buildTransform();
|
||||
}
|
||||
void setRotationY(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setRotationY(a);
|
||||
buildTransform();
|
||||
}
|
||||
void setRotationZ(GLfloat a);
|
||||
void setRotation(const QVector3D & a) {raw_matrix = false; trans.setRotation(a); buildTransform();}
|
||||
void resetRotation() {raw_matrix = false; trans.setRotation(QVector3D()); buildTransform();}
|
||||
void setRotation(const QVector3D & a) {
|
||||
raw_matrix = false;
|
||||
trans.setRotation(a);
|
||||
buildTransform();
|
||||
}
|
||||
void resetRotation() {
|
||||
raw_matrix = false;
|
||||
trans.setRotation(QVector3D());
|
||||
buildTransform();
|
||||
}
|
||||
|
||||
QVector3D scale() { return trans.scale3D(); }
|
||||
float scaleX() { return trans.scale3D().x(); }
|
||||
float scaleY() { return trans.scale3D().y(); }
|
||||
float scaleZ() { return trans.scale3D().z(); }
|
||||
void scale(const QVector3D & sv) {raw_matrix = false; trans.setScale(trans.scale3D() * sv); buildTransform();}
|
||||
void scale(GLfloat sx, GLfloat sy, GLfloat sz) {raw_matrix = false; scale(QVector3D(sx, sy, sz)); buildTransform();}
|
||||
void scale(GLfloat sx, GLfloat sy) {raw_matrix = false; scale(QVector3D(sx, sy, sy)); buildTransform();}
|
||||
void scale(GLfloat sx) {raw_matrix = false; scale(QVector3D(sx, sx, sx)); buildTransform();}
|
||||
void scaleX(GLfloat a) {raw_matrix = false; trans.setScaleX(trans.scale3D().x() + a); buildTransform();}
|
||||
void scaleY(GLfloat a) {raw_matrix = false; trans.setScaleY(trans.scale3D().y() + a); buildTransform();}
|
||||
void scaleZ(GLfloat a) {raw_matrix = false; trans.setScaleZ(trans.scale3D().z() + a); buildTransform();}
|
||||
void setScale(const QVector3D & a) {raw_matrix = false; trans.setScale(a); buildTransform();}
|
||||
void setScale(GLfloat a) {raw_matrix = false; trans.setScale(a); buildTransform();}
|
||||
void setScaleX(GLfloat a) {raw_matrix = false; trans.setScaleX(a); buildTransform();}
|
||||
void setScaleY(GLfloat a) {raw_matrix = false; trans.setScaleY(a); buildTransform();}
|
||||
void setScaleZ(GLfloat a) {raw_matrix = false; trans.setScaleZ(a); buildTransform();}
|
||||
void resetScale() {raw_matrix = false; trans.setScale(1.f); buildTransform();}
|
||||
void scale(const QVector3D & sv) {
|
||||
raw_matrix = false;
|
||||
trans.setScale(trans.scale3D() * sv);
|
||||
buildTransform();
|
||||
}
|
||||
void scale(GLfloat sx, GLfloat sy, GLfloat sz) {
|
||||
raw_matrix = false;
|
||||
scale(QVector3D(sx, sy, sz));
|
||||
buildTransform();
|
||||
}
|
||||
void scale(GLfloat sx, GLfloat sy) {
|
||||
raw_matrix = false;
|
||||
scale(QVector3D(sx, sy, sy));
|
||||
buildTransform();
|
||||
}
|
||||
void scale(GLfloat sx) {
|
||||
raw_matrix = false;
|
||||
scale(QVector3D(sx, sx, sx));
|
||||
buildTransform();
|
||||
}
|
||||
void scaleX(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setScaleX(trans.scale3D().x() + a);
|
||||
buildTransform();
|
||||
}
|
||||
void scaleY(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setScaleY(trans.scale3D().y() + a);
|
||||
buildTransform();
|
||||
}
|
||||
void scaleZ(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setScaleZ(trans.scale3D().z() + a);
|
||||
buildTransform();
|
||||
}
|
||||
void setScale(const QVector3D & a) {
|
||||
raw_matrix = false;
|
||||
trans.setScale(a);
|
||||
buildTransform();
|
||||
}
|
||||
void setScale(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setScale(a);
|
||||
buildTransform();
|
||||
}
|
||||
void setScaleX(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setScaleX(a);
|
||||
buildTransform();
|
||||
}
|
||||
void setScaleY(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setScaleY(a);
|
||||
buildTransform();
|
||||
}
|
||||
void setScaleZ(GLfloat a) {
|
||||
raw_matrix = false;
|
||||
trans.setScaleZ(a);
|
||||
buildTransform();
|
||||
}
|
||||
void resetScale() {
|
||||
raw_matrix = false;
|
||||
trans.setScale(1.f);
|
||||
buildTransform();
|
||||
}
|
||||
|
||||
Transform transform() { return trans; }
|
||||
void setTransform(const Transform & t);
|
||||
@@ -220,7 +345,9 @@ protected:
|
||||
QVariantMap meta;
|
||||
};
|
||||
|
||||
inline bool operator <(const ObjectBase & f, const ObjectBase & s) {return f.pos_h.z() < s.pos_h.z();}
|
||||
inline bool operator<(const ObjectBase & f, const ObjectBase & s) {
|
||||
return f.pos_h.z() < s.pos_h.z();
|
||||
}
|
||||
|
||||
|
||||
class AimedObject: public ObjectBase {
|
||||
@@ -228,6 +355,7 @@ class AimedObject: public ObjectBase {
|
||||
friend class GLRendererBase;
|
||||
friend class Light;
|
||||
friend class Camera;
|
||||
|
||||
public:
|
||||
AimedObject();
|
||||
~AimedObject() {}
|
||||
@@ -265,13 +393,21 @@ protected:
|
||||
class Light: public AimedObject {
|
||||
friend class QGLView;
|
||||
friend class RendererBase;
|
||||
|
||||
public:
|
||||
enum Type {Omni, Cone, Directional};
|
||||
enum Type {
|
||||
Omni,
|
||||
Cone,
|
||||
Directional
|
||||
};
|
||||
|
||||
Light();
|
||||
Light(const QVector3D & p, const QColor & c = Qt::white, float i = 1.);
|
||||
virtual ObjectBase * clone(bool withChildren = true);
|
||||
virtual void init() {shadow_map.resize(512, 512); is_init = true;}
|
||||
virtual void init() {
|
||||
shadow_map.resize(512, 512);
|
||||
is_init = true;
|
||||
}
|
||||
void apply();
|
||||
|
||||
float angle_start;
|
||||
@@ -288,16 +424,30 @@ public:
|
||||
};
|
||||
|
||||
template<class T>
|
||||
inline T globject_cast(ObjectBase * object) {return reinterpret_cast<T>(object);}
|
||||
inline T globject_cast(ObjectBase * object) {
|
||||
return reinterpret_cast<T>(object);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline T globject_cast(const ObjectBase * object) {return reinterpret_cast<T>(object);}
|
||||
inline T globject_cast(const ObjectBase * object) {
|
||||
return reinterpret_cast<T>(object);
|
||||
}
|
||||
|
||||
|
||||
QDataStream & operator<<(QDataStream & s, const ObjectBase * p);
|
||||
QDataStream & operator>>(QDataStream & s, ObjectBase *& p);
|
||||
|
||||
inline ObjectBaseList lights2objectList(const QList<Light*> & v) {ObjectBaseList ret; foreach (Light*i, v) ret << (ObjectBase*)i; return ret;}
|
||||
inline ObjectBaseList cameras2objectList(const QList<Camera*> & v) {ObjectBaseList ret; foreach (Camera*i, v) ret << (ObjectBase*)i; return ret;}
|
||||
inline ObjectBaseList lights2objectList(const QList<Light *> & v) {
|
||||
ObjectBaseList ret;
|
||||
foreach(Light * i, v)
|
||||
ret << (ObjectBase *)i;
|
||||
return ret;
|
||||
}
|
||||
inline ObjectBaseList cameras2objectList(const QList<Camera *> & v) {
|
||||
ObjectBaseList ret;
|
||||
foreach(Camera * i, v)
|
||||
ret << (ObjectBase *)i;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif // GLOBJECT_H
|
||||
|
||||
48
glscene.cpp
48
glscene.cpp
@@ -17,9 +17,11 @@
|
||||
*/
|
||||
|
||||
#include "glscene.h"
|
||||
|
||||
#include "glcamera.h"
|
||||
#include "glmesh.h"
|
||||
#include "qglview.h"
|
||||
|
||||
#include <chunkstream.h>
|
||||
|
||||
|
||||
@@ -148,8 +150,7 @@ void Scene::emitSelectionChanged() {
|
||||
foreach(ObjectBase * o, selected_) {
|
||||
ObjectBase * po = o->selectedParent();
|
||||
if (!po) po = o;
|
||||
if (!selected_top.contains(po))
|
||||
selected_top << po;
|
||||
if (!selected_top.contains(po)) selected_top << po;
|
||||
}
|
||||
foreach(Mesh * m, geometries)
|
||||
m->setAllSelectionChanged(true);
|
||||
@@ -158,14 +159,14 @@ void Scene::emitSelectionChanged() {
|
||||
|
||||
|
||||
QString Scene::uniqueName(QString n, const QSet<QString> & names) {
|
||||
if (!names.contains(n))
|
||||
return n;
|
||||
if (!names.contains(n)) return n;
|
||||
QString num;
|
||||
while (!n.isEmpty()) {
|
||||
if (n.right(1)[0].isDigit()) {
|
||||
num.push_front(n.right(1));
|
||||
n.chop(1);
|
||||
} else break;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
if (!n.endsWith('_')) n += '_';
|
||||
int in = num.toInt() + 1;
|
||||
@@ -176,7 +177,6 @@ QString Scene::uniqueName(QString n, const QSet<QString> & names) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Scene::removeObject(ObjectBase * o, bool inChildren) {
|
||||
if (destroying) return;
|
||||
o->setScene(nullptr);
|
||||
@@ -208,8 +208,10 @@ void Scene::selectObject(ObjectBase * o, bool add_to_selection) {
|
||||
// qDebug() << "selectObject" << o << add_to_selection;
|
||||
if (!add_to_selection || (sel_mode_ == smSingleSelection)) clearSelection();
|
||||
if (o) {
|
||||
if (!add_to_selection) o->setSelected(true);
|
||||
else o->setSelected(!o->isSelected());
|
||||
if (!add_to_selection)
|
||||
o->setSelected(true);
|
||||
else
|
||||
o->setSelected(!o->isSelected());
|
||||
gatherSelection();
|
||||
}
|
||||
emitSelectionChanged();
|
||||
@@ -231,12 +233,10 @@ void Scene::selectObjectsByMesh() {
|
||||
ObjectBaseList csl = selected_;
|
||||
QSet<Mesh *> sml;
|
||||
foreach(ObjectBase * o, csl)
|
||||
if (o->mesh())
|
||||
sml << o->mesh();
|
||||
if (o->mesh()) sml << o->mesh();
|
||||
ObjectBaseList ol = root_->children(true);
|
||||
foreach(ObjectBase * o, ol) {
|
||||
if (sml.contains(o->mesh()))
|
||||
o->setSelected(true);
|
||||
if (sml.contains(o->mesh())) o->setSelected(true);
|
||||
}
|
||||
gatherSelection();
|
||||
emitSelectionChanged();
|
||||
@@ -247,12 +247,10 @@ void Scene::selectObjectsByMaterial() {
|
||||
ObjectBaseList csl = selected_;
|
||||
QSet<Material *> sml;
|
||||
foreach(ObjectBase * o, csl)
|
||||
if (o->material())
|
||||
sml << o->material();
|
||||
if (o->material()) sml << o->material();
|
||||
ObjectBaseList ol = root_->children(true);
|
||||
foreach(ObjectBase * o, ol) {
|
||||
if (sml.contains(o->material()))
|
||||
o->setSelected(true);
|
||||
if (sml.contains(o->material())) o->setSelected(true);
|
||||
}
|
||||
gatherSelection();
|
||||
emitSelectionChanged();
|
||||
@@ -317,8 +315,7 @@ void Scene::removeMaterial(Material * m) {
|
||||
if (!m || !materials.contains(m)) return;
|
||||
ObjectBaseList ol = root_->children(true);
|
||||
foreach(ObjectBase * o, ol)
|
||||
if (o->material_ == m)
|
||||
o->setMaterial(0);
|
||||
if (o->material_ == m) o->setMaterial(0);
|
||||
materials.removeAll(m);
|
||||
changed_materials.removeAll(m);
|
||||
mat_changed = true;
|
||||
@@ -356,8 +353,7 @@ void Scene::gatherSelection() {
|
||||
selected_.clear();
|
||||
ObjectBaseList ol = root_->children(true);
|
||||
foreach(ObjectBase * o, ol)
|
||||
if (o->isSelected())
|
||||
selected_ << o;
|
||||
if (o->isSelected()) selected_ << o;
|
||||
}
|
||||
|
||||
|
||||
@@ -447,9 +443,7 @@ void Scene::prepareTree(ObjectBase * o) {
|
||||
co->setObjectsChanged();
|
||||
}
|
||||
break;
|
||||
case ObjectBase::glCamera:
|
||||
cameras_used << globject_cast<Camera * >(co);
|
||||
break;
|
||||
case ObjectBase::glCamera: cameras_used << globject_cast<Camera *>(co); break;
|
||||
default: break;
|
||||
}
|
||||
prepareTree(co);
|
||||
@@ -513,8 +507,7 @@ QDataStream & operator <<(QDataStream & s, const Scene * p) {
|
||||
geom_ind << p->geometries.indexOf(c->mesh());
|
||||
mat_ind << p->materials.indexOf(c->material());
|
||||
}
|
||||
cs.add(1, p->name_).add(10, p->geometries).add(11, p->materials)
|
||||
.add(20, p->root_).add(21, geom_ind).add(22, mat_ind);
|
||||
cs.add(1, p->name_).add(10, p->geometries).add(11, p->materials).add(20, p->root_).add(21, geom_ind).add(22, mat_ind);
|
||||
s << qCompress(cs.data());
|
||||
return s;
|
||||
}
|
||||
@@ -530,7 +523,10 @@ QDataStream & operator >>(QDataStream & s, Scene *& p) {
|
||||
case 1: cs.get(p->name_); break;
|
||||
case 10: cs.get(p->geometries); break;
|
||||
case 11: cs.get(p->materials); break;
|
||||
case 20: cs.get(p->root_); p->root_->setScene(p); break;
|
||||
case 20:
|
||||
cs.get(p->root_);
|
||||
p->root_->setScene(p);
|
||||
break;
|
||||
case 21: cs.get(geom_ind); break;
|
||||
case 22: cs.get(mat_ind); break;
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ class Scene: public QObject {
|
||||
friend class Light;
|
||||
friend QDataStream & operator<<(QDataStream & s, const Scene * p);
|
||||
friend QDataStream & operator>>(QDataStream & s, Scene *& p);
|
||||
|
||||
public:
|
||||
explicit Scene();
|
||||
virtual ~Scene();
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
|
||||
#include "gltexture_manager.h"
|
||||
|
||||
#include "gltypes.h"
|
||||
|
||||
QStringList TextureManager::search_pathes(".");
|
||||
@@ -115,9 +116,12 @@ void TextureManager::convertToNormal(QImage & im) {
|
||||
const uchar * sd = sim.constBits();
|
||||
for (int i = 0; i < sim.height(); i++) {
|
||||
for (int j = 0; j < sim.width(); j++) {
|
||||
sum[2] += sd[a] / 255.f - 0.5f; ++a;
|
||||
sum[1] += sd[a] / 255.f - 0.5f; ++a;
|
||||
sum[0] += sd[a] / 255.f - 0.5f; ++a;
|
||||
sum[2] += sd[a] / 255.f - 0.5f;
|
||||
++a;
|
||||
sum[1] += sd[a] / 255.f - 0.5f;
|
||||
++a;
|
||||
sum[0] += sd[a] / 255.f - 0.5f;
|
||||
++a;
|
||||
++a;
|
||||
}
|
||||
}
|
||||
@@ -152,10 +156,14 @@ void TextureManager::convertToNormal(QImage & im) {
|
||||
res.setY(piClamp(0.5f + (p[0].length() - p[1].length()) / 2.f, 0.f, 1.f));
|
||||
res.setX(piClamp(0.5f - (p[0].length() - p[2].length()) / 2.f, 0.f, 1.f));
|
||||
res.setZ(1.f);
|
||||
dd[a] = res.z() * 255; ++a;
|
||||
dd[a] = res.y() * 255; ++a;
|
||||
dd[a] = res.x() * 255; ++a;
|
||||
dd[a] = 255; ++a;
|
||||
dd[a] = res.z() * 255;
|
||||
++a;
|
||||
dd[a] = res.y() * 255;
|
||||
++a;
|
||||
dd[a] = res.x() * 255;
|
||||
++a;
|
||||
dd[a] = 255;
|
||||
++a;
|
||||
}
|
||||
}
|
||||
im = dim;
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
#ifndef GLTEXTUREMANAGER_H
|
||||
#define GLTEXTUREMANAGER_H
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <QDir>
|
||||
#include <QMap>
|
||||
#include <QFileInfo>
|
||||
#include <QImage>
|
||||
#include <QMap>
|
||||
#include <QOpenGLExtraFunctions>
|
||||
|
||||
|
||||
class TextureManager {
|
||||
@@ -31,7 +31,9 @@ public:
|
||||
TextureManager(QOpenGLExtraFunctions * f_): f(f_) {}
|
||||
virtual ~TextureManager() {}
|
||||
|
||||
static void addSearchPath(const QString & path) {if (!search_pathes.contains(path)) search_pathes << path;}
|
||||
static void addSearchPath(const QString & path) {
|
||||
if (!search_pathes.contains(path)) search_pathes << path;
|
||||
}
|
||||
static void clearSearchPathes() { search_pathes.clear(); }
|
||||
static QStringList searchPathes() { return search_pathes; }
|
||||
static QString findFile(const QString & path);
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
*/
|
||||
|
||||
#include "glwidget.h"
|
||||
|
||||
#include "qglview.h"
|
||||
|
||||
#include <QVBoxLayout>
|
||||
|
||||
|
||||
@@ -70,8 +72,7 @@ bool GLWidget::isMouseSelectionEnabled() const {
|
||||
}
|
||||
|
||||
|
||||
bool GLWidget::isCameraOrbit() const
|
||||
{
|
||||
bool GLWidget::isCameraOrbit() const {
|
||||
return view_->isCameraOrbit();
|
||||
}
|
||||
|
||||
|
||||
@@ -26,8 +26,7 @@ class QGLView;
|
||||
class ObjectBase;
|
||||
class Scene;
|
||||
|
||||
class GLWidget : public QWidget
|
||||
{
|
||||
class GLWidget: public QWidget {
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(qreal lineWidth READ lineWidth WRITE setLineWidth)
|
||||
Q_PROPERTY(qreal FOV READ FOV WRITE setFOV)
|
||||
@@ -42,6 +41,7 @@ class GLWidget : public QWidget
|
||||
Q_PROPERTY(bool selectionHalo READ isSelectionHaloEnabled WRITE setSelectionHaloEnabled)
|
||||
Q_PROPERTY(QColor selectionHaloColor READ selectionHaloColor WRITE setSelectionHaloColor)
|
||||
Q_PROPERTY(qreal selectionHaloFillAlpha READ selectionHaloFillAlpha WRITE setSelectionHaloFillAlpha)
|
||||
|
||||
public:
|
||||
explicit GLWidget(QWidget * parent = nullptr);
|
||||
QGLView * view() { return view_; }
|
||||
|
||||
@@ -17,11 +17,13 @@
|
||||
*/
|
||||
|
||||
#include "mouse_controller.h"
|
||||
|
||||
#include "glmesh.h"
|
||||
#include "qglview.h"
|
||||
#include <qad_types.h>
|
||||
|
||||
#include <QApplication>
|
||||
#include <QKeyEvent>
|
||||
#include <qad_types.h>
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
@@ -37,8 +39,7 @@ MouseController::MouseController(QGLView * view_): view(view_) {
|
||||
}
|
||||
|
||||
|
||||
MouseController::~MouseController() {
|
||||
}
|
||||
MouseController::~MouseController() {}
|
||||
|
||||
|
||||
void MouseController::resize() {
|
||||
@@ -67,8 +68,7 @@ void MouseController::mouseReleaseEvent(QMouseEvent * e) {
|
||||
if (hov_objects.isEmpty() && hov_aims.isEmpty()) {
|
||||
view->scene()->clearSelection();
|
||||
} else {
|
||||
if (!hov_objects.isEmpty())
|
||||
view->scene()->selectObject(hov_objects[0], add_ts);
|
||||
if (!hov_objects.isEmpty()) view->scene()->selectObject(hov_objects[0], add_ts);
|
||||
if (!hov_aims.isEmpty()) {
|
||||
view->scene()->selectObject(hov_aims[0], add_ts);
|
||||
hov_aims[0]->setAimSelected(true);
|
||||
@@ -135,7 +135,8 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
||||
}
|
||||
QVector<QVector3D> scales;
|
||||
foreach(int a, axis) {
|
||||
QVector3D axe_vector; axe_vector[a] = 1.;
|
||||
QVector3D axe_vector;
|
||||
axe_vector[a] = 1.;
|
||||
QMatrix4x4 axis_mat = view->camera()->fullViewMatrix() * rs.axis_mat;
|
||||
QVector3D center_screen = axis_mat.map(rs.selection_center);
|
||||
QVector3D axe_screen = (axis_mat.map(rs.selection_center + axe_vector) - center_screen).normalized();
|
||||
@@ -149,8 +150,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
||||
QMatrix4x4 pmat;
|
||||
foreach(ObjectBase * o, objects) {
|
||||
pmat.setToIdentity();
|
||||
if (o->parent())
|
||||
pmat = o->parent()->worldTransform().inverted();
|
||||
if (o->parent()) pmat = o->parent()->worldTransform().inverted();
|
||||
QVector3D dv = pmat.mapVector(axe_vector);
|
||||
if (o->isAimSelected()) {
|
||||
AimedObject * ao = (AimedObject *)o;
|
||||
@@ -251,8 +251,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
||||
cs = Qt::SplitHCursor;
|
||||
}
|
||||
}
|
||||
if (cur_action == RendererService::haNoAction)
|
||||
cur_handle = QFlags<RendererService::HandleMesh>();
|
||||
if (cur_action == RendererService::haNoAction) cur_handle = QFlags<RendererService::HandleMesh>();
|
||||
view->setCursor(cs);
|
||||
view->renderer_.rend_service.current_handle = cur_handle;
|
||||
}
|
||||
@@ -305,6 +304,5 @@ void MouseController::leaveEvent(QEvent * ) {
|
||||
|
||||
|
||||
void MouseController::mouseDoubleClickEvent(QMouseEvent * e) {
|
||||
if (e->buttons().testFlag(QT_MID_BUTTON))
|
||||
emit view->doubleClick();
|
||||
if (e->buttons().testFlag(QT_MID_BUTTON)) emit view->doubleClick();
|
||||
}
|
||||
|
||||
@@ -19,18 +19,19 @@
|
||||
#ifndef MOUSE_CONTROLLER_H
|
||||
#define MOUSE_CONTROLLER_H
|
||||
|
||||
#include "glprimitives.h"
|
||||
#include "glcamera.h"
|
||||
#include "glprimitives.h"
|
||||
#include "renderer_service.h"
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QTime>
|
||||
|
||||
|
||||
class MouseController: public QObject
|
||||
{
|
||||
class MouseController: public QObject {
|
||||
friend class QGLView;
|
||||
friend class RendererSelection;
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MouseController(QGLView * view_);
|
||||
virtual ~MouseController();
|
||||
@@ -71,14 +72,16 @@ private:
|
||||
private slots:
|
||||
|
||||
public slots:
|
||||
void setGrabMouseEnabled(const bool & arg) {grabMouse_ = arg; mouse_first = true;}
|
||||
void setGrabMouseEnabled(const bool & arg) {
|
||||
grabMouse_ = arg;
|
||||
mouse_first = true;
|
||||
}
|
||||
void setMouseRotateEnabled(const bool & arg) { mouseRotate_ = arg; }
|
||||
void setMouseSelectionEnabled(const bool & arg) { mouseSelect_ = arg; }
|
||||
void setCustomMouseMove(const bool & arg) { customMouseMove_ = arg; }
|
||||
void setCameraOrbit(const bool & arg) { cameraOrbit_ = arg; }
|
||||
|
||||
signals:
|
||||
|
||||
};
|
||||
|
||||
#endif // QGLVIEW_H
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "openglwindow.h"
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QOpenGLContext>
|
||||
#include <QOpenGLPaintDevice>
|
||||
@@ -31,11 +32,8 @@ void OpenGLWindow::renderLater() {
|
||||
|
||||
bool OpenGLWindow::event(QEvent * event) {
|
||||
switch (event->type()) {
|
||||
case QEvent::UpdateRequest:
|
||||
renderNow();
|
||||
return true;
|
||||
default:
|
||||
return QWindow::event(event);
|
||||
case QEvent::UpdateRequest: renderNow(); return true;
|
||||
default: return QWindow::event(event);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,4 +101,3 @@ void OpenGLWindow::renderNow() {
|
||||
m_context->swapBuffers(this);
|
||||
frame_cnt++;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
#include <QWindow>
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <QWindow>
|
||||
|
||||
class QPainter;
|
||||
class QOpenGLContext;
|
||||
class QOpenGLPaintDevice;
|
||||
|
||||
|
||||
class OpenGLWindow : public QWindow, public QOpenGLExtraFunctions {
|
||||
class OpenGLWindow
|
||||
: public QWindow
|
||||
, public QOpenGLExtraFunctions {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit OpenGLWindow(QWindow * parent = nullptr);
|
||||
virtual ~OpenGLWindow() {}
|
||||
@@ -35,4 +38,3 @@ private:
|
||||
bool format_change = false;
|
||||
int frame_cnt = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "qglview_designerplugin.h"
|
||||
|
||||
#include "qglviewplugin.h"
|
||||
|
||||
|
||||
QGLViewDesignerPlugin::QGLViewDesignerPlugin(QObject * parent): QObject(parent)
|
||||
{
|
||||
QGLViewDesignerPlugin::QGLViewDesignerPlugin(QObject * parent): QObject(parent) {
|
||||
m_widgets.append(new QGLViewPlugin(this));
|
||||
}
|
||||
|
||||
@@ -11,4 +11,3 @@ QGLViewDesignerPlugin::QGLViewDesignerPlugin(QObject * parent): QObject(parent)
|
||||
QList<QDesignerCustomWidgetInterface *> QGLViewDesignerPlugin::customWidgets() const {
|
||||
return m_widgets;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,22 +1,23 @@
|
||||
#ifndef QGLVIEW_DESIGNERPLUGIN_H
|
||||
#define QGLVIEW_DESIGNERPLUGIN_H
|
||||
|
||||
#include <QtDesigner/QtDesigner>
|
||||
#include <QtCore/qplugin.h>
|
||||
#include <QtDesigner/QtDesigner>
|
||||
|
||||
|
||||
class QGLViewDesignerPlugin: public QObject, public QDesignerCustomWidgetCollectionInterface
|
||||
{
|
||||
class QGLViewDesignerPlugin
|
||||
: public QObject
|
||||
, public QDesignerCustomWidgetCollectionInterface {
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "qad.qglview")
|
||||
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
|
||||
|
||||
public:
|
||||
QGLViewDesignerPlugin(QObject * parent = 0);
|
||||
virtual QList<QDesignerCustomWidgetInterface *> customWidgets() const;
|
||||
|
||||
private:
|
||||
QList<QDesignerCustomWidgetInterface *> m_widgets;
|
||||
|
||||
};
|
||||
|
||||
#endif // QGLVIEW_DESIGNERPLUGIN_H
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
#include "../glwidget.h"
|
||||
#include "qglviewplugin.h"
|
||||
#include <QtCore/QtPlugin>
|
||||
|
||||
#include "../glwidget.h"
|
||||
#include "glprimitives.h"
|
||||
#include "qglview.h"
|
||||
|
||||
#include <QtCore/QtPlugin>
|
||||
|
||||
|
||||
QGLViewPlugin::QGLViewPlugin(QObject * parent): QObject(parent) {
|
||||
m_initialized = false;
|
||||
@@ -11,8 +13,7 @@ QGLViewPlugin::QGLViewPlugin(QObject * parent): QObject(parent) {
|
||||
|
||||
|
||||
void QGLViewPlugin::initialize(QDesignerFormEditorInterface * /* core */) {
|
||||
if (m_initialized)
|
||||
return;
|
||||
if (m_initialized) return;
|
||||
|
||||
// Add extension registrations, etc. here
|
||||
|
||||
@@ -32,15 +33,18 @@ QWidget * QGLViewPlugin::createWidget(QWidget * parent) {
|
||||
GLObjectBase * obj;
|
||||
float al = 1.;
|
||||
obj = new GLPrimitiveLine(QVector3D(0, 0, -al), QVector3D(0, 0, al));
|
||||
obj->material().color_diffuse = Qt::darkBlue; obj->setAcceptLight(false);
|
||||
obj->material().color_diffuse = Qt::darkBlue;
|
||||
obj->setAcceptLight(false);
|
||||
obj->setSelectable(false);
|
||||
axis->addChild(obj);
|
||||
obj = new GLPrimitiveLine(QVector3D(-al, 0, 0), QVector3D(al, 0, 0));
|
||||
obj->material().color_diffuse = Qt::darkRed; obj->setAcceptLight(false);
|
||||
obj->material().color_diffuse = Qt::darkRed;
|
||||
obj->setAcceptLight(false);
|
||||
obj->setSelectable(false);
|
||||
axis->addChild(obj);
|
||||
obj = new GLPrimitiveLine(QVector3D(0, -al, 0), QVector3D(0, al, 0));
|
||||
obj->material().color_diffuse = Qt::darkGreen; obj->setAcceptLight(false);
|
||||
obj->material().color_diffuse = Qt::darkGreen;
|
||||
obj->setAcceptLight(false);
|
||||
obj->setSelectable(false);
|
||||
axis->addChild(obj);
|
||||
w->view()->addObject(axis);
|
||||
@@ -92,4 +96,3 @@ QString QGLViewPlugin::domXml() const {
|
||||
QString QGLViewPlugin::includeFile() const {
|
||||
return QLatin1String("glwidget.h");
|
||||
}
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
|
||||
class QGLViewPlugin: public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
class QGLViewPlugin
|
||||
: public QObject
|
||||
, public QDesignerCustomWidgetInterface {
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
@@ -27,7 +28,6 @@ public:
|
||||
|
||||
private:
|
||||
bool m_initialized;
|
||||
|
||||
};
|
||||
|
||||
#endif // QGLVIEWPLUGIN_H
|
||||
|
||||
12
qglview.cpp
12
qglview.cpp
@@ -17,13 +17,15 @@
|
||||
*/
|
||||
|
||||
#include "qglview.h"
|
||||
|
||||
#include "glmesh.h"
|
||||
#include "gltexture_manager.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QKeyEvent>
|
||||
#include <QOpenGLTexture>
|
||||
#include <chunkstream.h>
|
||||
#include <qad_types.h>
|
||||
#include <QApplication>
|
||||
#include <QOpenGLTexture>
|
||||
#include <QKeyEvent>
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
@@ -116,8 +118,7 @@ QList<Light * > QGLView::selectedLights() const {
|
||||
QList<Light *> ret;
|
||||
ObjectBaseList sol = scene_->selectedObjects();
|
||||
foreach(ObjectBase * o, sol)
|
||||
if (o->type() == ObjectBase::glLight)
|
||||
ret << (Light*)o;
|
||||
if (o->type() == ObjectBase::glLight) ret << (Light *)o;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -132,7 +133,6 @@ QList<Camera * > QGLView::selectedCameras() const {
|
||||
}
|
||||
|
||||
|
||||
|
||||
void QGLView::resizeEvent(QResizeEvent * e) {
|
||||
renderLater();
|
||||
mouse.resize();
|
||||
|
||||
26
qglview.h
26
qglview.h
@@ -19,19 +19,19 @@
|
||||
#ifndef QGLVIEW_H
|
||||
#define QGLVIEW_H
|
||||
|
||||
#include "openglwindow.h"
|
||||
#include "glcamera.h"
|
||||
#include "glframebuffer.h"
|
||||
#include "glprimitives.h"
|
||||
#include "glcamera.h"
|
||||
#include "glscene.h"
|
||||
#include "renderer.h"
|
||||
#include "mouse_controller.h"
|
||||
#include "openglwindow.h"
|
||||
#include "renderer.h"
|
||||
|
||||
#include <QElapsedTimer>
|
||||
#include <QMenu>
|
||||
|
||||
|
||||
class QGLView: public OpenGLWindow
|
||||
{
|
||||
class QGLView: public OpenGLWindow {
|
||||
friend class RendererSelection;
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(float lineWidth READ lineWidth WRITE setLineWidth)
|
||||
@@ -126,7 +126,11 @@ public:
|
||||
float selectionHaloFillAlpha() const { return selectionHaloFill_; }
|
||||
|
||||
QVariant feature(Feature f) const { return features_.value(int(f)); }
|
||||
QVariant setFeature(Feature f, const QVariant & value) {QVariant ret = features_.value(int(f)); features_[int(f)] = value; return ret;}
|
||||
QVariant setFeature(Feature f, const QVariant & value) {
|
||||
QVariant ret = features_.value(int(f));
|
||||
features_[int(f)] = value;
|
||||
return ret;
|
||||
}
|
||||
bool isFeatureEnabled(Feature f) const { return features_[int(f)].toBool(); }
|
||||
|
||||
int renderMode() const { return (int)rmode; }
|
||||
@@ -171,7 +175,10 @@ public:
|
||||
|
||||
QImage materialThumbnail(Material * m) { return renderer_.materialThumbnail(m); }
|
||||
void setCurrentAction(RendererService::HandleAction ha) { renderer_.rend_service.setCurrentAction(ha); }
|
||||
void setContextActions(QList<QAction*> al) {context_menu.clear(); context_menu.addActions(al);}
|
||||
void setContextActions(QList<QAction *> al) {
|
||||
context_menu.clear();
|
||||
context_menu.addActions(al);
|
||||
}
|
||||
void popupMenu(const QPoint & pos, QAction * at = nullptr) { context_menu.popup(pos, at); }
|
||||
void setGrabImage(bool on) { renderer_.setGrabImage(on); }
|
||||
bool isGrabImage() const { return renderer_.isGrabImage(); }
|
||||
@@ -234,7 +241,10 @@ public slots:
|
||||
void setDepthStart(const float & arg) { camera()->setDepthStart(arg); }
|
||||
void setGamma(const float & arg) { renderer_.gamma_ = arg; }
|
||||
void setAutoExposure(bool arg) { renderer_.tone_proc.enabled = arg; }
|
||||
void setEnvironmentMapFile(QString file) {renderer_.tex_env.setFileHDR(file); renderer_.recreateMaterialThumbnails(true);}
|
||||
void setEnvironmentMapFile(QString file) {
|
||||
renderer_.tex_env.setFileHDR(file);
|
||||
renderer_.recreateMaterialThumbnails(true);
|
||||
}
|
||||
void setFogColor(const QColor & arg) { fogColor_ = arg; }
|
||||
void setFogDensity(const float & arg) { fogDensity_ = arg; }
|
||||
void setFogDecay(const float & arg) { fogDecay_ = arg; }
|
||||
|
||||
@@ -16,10 +16,11 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "qglview_window.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include "qglview_window.h"
|
||||
|
||||
int main(int argc, char ** argv) {
|
||||
QApplication a(argc, argv);
|
||||
|
||||
@@ -17,13 +17,15 @@
|
||||
*/
|
||||
|
||||
#include "qglview_window.h"
|
||||
#include "renderer.h"
|
||||
#include "glwidget.h"
|
||||
|
||||
#include "gltexture_manager.h"
|
||||
#include "glwidget.h"
|
||||
#include "qad_types.h"
|
||||
#include "renderer.h"
|
||||
|
||||
#include <QGraphicsRectItem>
|
||||
#include <QImageReader>
|
||||
#include <QMessageBox>
|
||||
#include "qad_types.h"
|
||||
|
||||
|
||||
QGLViewWindow::QGLViewWindow(QWidget * parent): QMainWindow(parent), Ui::QGLViewWindow() {
|
||||
@@ -123,15 +125,18 @@ void QGLViewWindow::loadFile(const QString & path, bool import) {
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
QFileInfo fi(path);
|
||||
Scene * s = nullptr;
|
||||
if (fi.suffix().toLower() == "qgl") s = loadFromQGLFile(path);
|
||||
else s = loadScene(path);
|
||||
if (fi.suffix().toLower() == "qgl")
|
||||
s = loadFromQGLFile(path);
|
||||
else
|
||||
s = loadScene(path);
|
||||
QApplication::restoreOverrideCursor();
|
||||
if (!s) {
|
||||
QMessageBox::critical(this, "Import", "Can`t load " + path + "!");
|
||||
return;
|
||||
}
|
||||
s->setName(fi.baseName());
|
||||
if (import) view->scene()->addScene(s);
|
||||
if (import)
|
||||
view->scene()->addScene(s);
|
||||
else {
|
||||
TextureManager::clearSearchPathes();
|
||||
view->scene()->assignFrom(s);
|
||||
@@ -161,8 +166,7 @@ void QGLViewWindow::on_actionImport_triggered() {
|
||||
void QGLViewWindow::on_actionSave_triggered() {
|
||||
QString f = QFileDialog::getSaveFileName(this, "Select file", prev_path, "QGLView(*.qgl)");
|
||||
if (f.isEmpty()) return;
|
||||
if (f.right(4).toLower() != ".qgl")
|
||||
f += ".qgl";
|
||||
if (f.right(4).toLower() != ".qgl") f += ".qgl";
|
||||
prev_path = f;
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
saveToQGLFile(f, view->scene());
|
||||
@@ -175,8 +179,7 @@ void QGLViewWindow::on_actionSaveSelected_triggered() {
|
||||
if (!sel_obj) return;
|
||||
QString f = QFileDialog::getSaveFileName(this, "Select file", prev_path, "QGLView(*.qgl)");
|
||||
if (f.isEmpty()) return;
|
||||
if (f.right(4).toLower() != ".qgl")
|
||||
f += ".qgl";
|
||||
if (f.right(4).toLower() != ".qgl") f += ".qgl";
|
||||
prev_path = f;
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
/// saveToQGLFile(f, sel_obj);
|
||||
@@ -195,8 +198,7 @@ void QGLViewWindow::on_actionOpen_triggered() {
|
||||
void QGLViewWindow::view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m) {
|
||||
// qDebug() << k;
|
||||
double spd = 0.2;
|
||||
if (m.testFlag(Qt::ShiftModifier))
|
||||
spd = 0.5;
|
||||
if (m.testFlag(Qt::ShiftModifier)) spd = 0.5;
|
||||
switch (k) {
|
||||
case Qt::Key_W: view->view()->camera()->moveForward(spd); break;
|
||||
case Qt::Key_S: view->view()->camera()->moveBackward(spd); break;
|
||||
|
||||
@@ -19,29 +19,32 @@
|
||||
#ifndef QGLVIEWWINDOW_H
|
||||
#define QGLVIEWWINDOW_H
|
||||
|
||||
#include <QTranslator>
|
||||
#include <QInputDialog>
|
||||
#include <QFileDialog>
|
||||
#include <QColorDialog>
|
||||
#include <QCloseEvent>
|
||||
#include "formats/loader_assimp.h"
|
||||
#include "formats/loader_qgl.h"
|
||||
#include "session_manager.h"
|
||||
#include "ui_qglview_window.h"
|
||||
|
||||
#include <QClipboard>
|
||||
#include <QCloseEvent>
|
||||
#include <QColorDialog>
|
||||
#include <QFileDialog>
|
||||
#include <QInputDialog>
|
||||
#include <QRadioButton>
|
||||
#include <QUrl>
|
||||
#include <QSplitter>
|
||||
#include <QThread>
|
||||
#include <QTime>
|
||||
#include <QSplitter>
|
||||
#include "ui_qglview_window.h"
|
||||
#include "formats/loader_qgl.h"
|
||||
#include "formats/loader_assimp.h"
|
||||
#include "session_manager.h"
|
||||
#include <QTranslator>
|
||||
#include <QUrl>
|
||||
// #include "renderer_rt.h"
|
||||
#include "qglview.h"
|
||||
#include "ui_qglview_window.h"
|
||||
|
||||
|
||||
class QGLViewWindow: public QMainWindow, public Ui::QGLViewWindow
|
||||
{
|
||||
class QGLViewWindow
|
||||
: public QMainWindow
|
||||
, public Ui::QGLViewWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QGLViewWindow(QWidget * parent = 0);
|
||||
~QGLViewWindow();
|
||||
@@ -113,7 +116,6 @@ signals:
|
||||
|
||||
private:
|
||||
QMatrix4x4 cam_mat;
|
||||
|
||||
};
|
||||
|
||||
#endif // QGLVIEWWINDOW_H
|
||||
|
||||
36
renderer.cpp
36
renderer.cpp
@@ -17,22 +17,29 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include "renderer.h"
|
||||
|
||||
#include "glmesh.h"
|
||||
#include "glshaders.h"
|
||||
#include "gltexture_manager.h"
|
||||
#include "qglview.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <qad_types.h>
|
||||
#include "renderer.h"
|
||||
#include "qglview.h"
|
||||
#include "glmesh.h"
|
||||
#include "gltexture_manager.h"
|
||||
#include "glshaders.h"
|
||||
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
|
||||
Renderer::Renderer(QGLView * view_): RendererBase(view_),
|
||||
fbo_ds (view_, QVector<GLenum>() << GL_RGBA16F << GL_RGBA32F << GL_RGBA16F << GL_RGBA16F << GL_RGBA16F),
|
||||
fbo_out (view_, obrBuffersCount, false, GL_RGBA16F),
|
||||
rend_mat(this), rend_service(this), rend_selection(this), tone_proc(this), tex_env(view_, 512) {
|
||||
Renderer::Renderer(QGLView * view_)
|
||||
: RendererBase(view_)
|
||||
, fbo_ds(view_, QVector<GLenum>() << GL_RGBA16F << GL_RGBA32F << GL_RGBA16F << GL_RGBA16F << GL_RGBA16F)
|
||||
, fbo_out(view_, obrBuffersCount, false, GL_RGBA16F)
|
||||
, rend_mat(this)
|
||||
, rend_service(this)
|
||||
, rend_selection(this)
|
||||
, tone_proc(this)
|
||||
, tex_env(view_, 512) {
|
||||
quad = Primitive::plane(2., 2.);
|
||||
cam_light = new Light();
|
||||
cam_light->intensity = 0.75;
|
||||
@@ -49,7 +56,8 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_),
|
||||
|
||||
shader_files[srGeometryPass] = "ds_geom.glsl";
|
||||
shader_files[srLightOmniPass] = "ds_light.glsl";
|
||||
shader_files[srLightSpotPass] = "ds_light.glsl"; shader_defines[srLightSpotPass] << "SPOT";
|
||||
shader_files[srLightSpotPass] = "ds_light.glsl";
|
||||
shader_defines[srLightSpotPass] << "SPOT";
|
||||
shader_files[srFinalPass] = "ds_final.glsl";
|
||||
shader_files[srTonemapPass] = "ds_tonemap.glsl";
|
||||
|
||||
@@ -115,7 +123,9 @@ void Renderer::reloadShaders() {
|
||||
}
|
||||
loadShadersMulti(tone_proc.shader_sum, dir + "sum.glsl", false);
|
||||
QStringList fxaa_defs;
|
||||
fxaa_defs << "FXAA_PC 1" << "FXAA_GLSL_130 1" << "FXAA_QUALITY__PRESET 15";
|
||||
fxaa_defs << "FXAA_PC 1"
|
||||
<< "FXAA_GLSL_130 1"
|
||||
<< "FXAA_QUALITY__PRESET 15";
|
||||
loadShaders(shader_fxaa, QStringList() << (dir + "fxaa.vert") << (dir + "fxaa.frag"), true, fxaa_defs);
|
||||
need_init_shaders = true;
|
||||
view->scene()->setLightsChanged();
|
||||
@@ -200,7 +210,6 @@ void Renderer::fillObjectsBuffer(const ObjectBaseList & ol, RenderPass pass) {
|
||||
// qDebug() << "load obj" << o->name() << o->worldTransform();
|
||||
}
|
||||
// qDebug() << "fillObjectsBuffer" << ol.size();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -279,8 +288,7 @@ void Renderer::renderScene() {
|
||||
if (scene_changed || scene.need_reload_materials) {
|
||||
rend_selection.generateObjectsID(scene);
|
||||
reloadMaterials(scene);
|
||||
if (edit_mode)
|
||||
recreateMaterialThumbnails();
|
||||
if (edit_mode) recreateMaterialThumbnails();
|
||||
emit view->materialsChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -19,12 +19,13 @@
|
||||
#ifndef RENDERER_H
|
||||
#define RENDERER_H
|
||||
|
||||
#include "glcubemap.h"
|
||||
#include "renderer_base.h"
|
||||
#include "renderer_material.h"
|
||||
#include "renderer_service.h"
|
||||
#include "renderer_selection.h"
|
||||
#include "renderer_service.h"
|
||||
#include "tonemapping_proc.h"
|
||||
#include "glcubemap.h"
|
||||
|
||||
#include <QQueue>
|
||||
|
||||
|
||||
|
||||
@@ -17,30 +17,30 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "renderer_base.h"
|
||||
#include "renderer.h"
|
||||
#include "qglview.h"
|
||||
|
||||
#include "glmesh.h"
|
||||
#include "gltexture_manager.h"
|
||||
#include "glshaders_headers.h"
|
||||
#include "gltexture_manager.h"
|
||||
#include "qglview.h"
|
||||
#include "renderer.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
|
||||
RendererBase::RendererBase(QGLView * view_):
|
||||
view(view_),
|
||||
buffer_materials (GL_UNIFORM_BUFFER, GL_STREAM_DRAW),
|
||||
buffer_lights (GL_UNIFORM_BUFFER, GL_STREAM_DRAW),
|
||||
buffer_lights_pos(GL_UNIFORM_BUFFER, GL_STREAM_DRAW),
|
||||
textures_empty(false),
|
||||
textures_maps(true)
|
||||
{
|
||||
RendererBase::RendererBase(QGLView * view_)
|
||||
: view(view_)
|
||||
, buffer_materials(GL_UNIFORM_BUFFER, GL_STREAM_DRAW)
|
||||
, buffer_lights(GL_UNIFORM_BUFFER, GL_STREAM_DRAW)
|
||||
, buffer_lights_pos(GL_UNIFORM_BUFFER, GL_STREAM_DRAW)
|
||||
, textures_empty(false)
|
||||
, textures_maps(true) {
|
||||
textures_manager = new TextureManager(view);
|
||||
maps_size = QSize(512, 512);
|
||||
maps_hash = 0;
|
||||
tex_coeff[0] = tex_coeff[1] = 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -212,7 +212,6 @@ void RendererBase::reloadMaterials(Scene & scene) {
|
||||
buffer_materials.resize(view, cur_materials_.size() * sizeof(QGLMaterial));
|
||||
buffer_materials.load(view, cur_materials_.constData(), cur_materials_.size() * sizeof(QGLMaterial));
|
||||
scene.need_reload_materials = false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -232,8 +231,7 @@ void RendererBase::reloadLightsParameters(const QMap<int, QList<Light*>> & light
|
||||
QGLLightParameter & so(cur_lights_params_[i]);
|
||||
Light * l = current_lights[i];
|
||||
double ang_start = l->angle_start / 2.f, ang_end = l->angle_end / 2.f;
|
||||
if (l->light_type == Light::Omni)
|
||||
ang_start = ang_end = 180.;
|
||||
if (l->light_type == Light::Omni) ang_start = ang_end = 180.;
|
||||
// qDebug() << "light" << light->name() << ulightn << pos;
|
||||
so.color = QColor2QVector(l->color_);
|
||||
so.angles[0] = ang_start;
|
||||
@@ -293,8 +291,7 @@ void RendererBase::initQuad(Mesh * mesh, QMatrix4x4 mat) {
|
||||
|
||||
void RendererBase::renderQuad(QOpenGLShaderProgram * prog, Mesh * mesh, Camera * cam, bool uniforms) {
|
||||
glDisableDepth();
|
||||
if (uniforms)
|
||||
setUniformCamera(prog, cam, false);
|
||||
if (uniforms) setUniformCamera(prog, cam, false);
|
||||
mesh->draw(view, 1);
|
||||
}
|
||||
|
||||
@@ -408,8 +405,17 @@ void RendererBase::createCoeffTexture(GLuint & id, const void * data, int size,
|
||||
f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
GLenum iformat = GL_R16F, format = GL_RED;
|
||||
if (channels == 2) {iformat = GL_RG16F; format = GL_RG;}
|
||||
if (channels == 3) {iformat = GL_RGB16F; format = GL_RGB;}
|
||||
if (channels == 4) {iformat = GL_RGBA16F; format = GL_RGBA;}
|
||||
if (channels == 2) {
|
||||
iformat = GL_RG16F;
|
||||
format = GL_RG;
|
||||
}
|
||||
if (channels == 3) {
|
||||
iformat = GL_RGB16F;
|
||||
format = GL_RGB;
|
||||
}
|
||||
if (channels == 4) {
|
||||
iformat = GL_RGBA16F;
|
||||
format = GL_RGBA;
|
||||
}
|
||||
f->glTexImage2D(GL_TEXTURE_2D, 0, iformat, size, size, 0, format, GL_FLOAT, data);
|
||||
}
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
#ifndef RENDERER_BASE_H
|
||||
#define RENDERER_BASE_H
|
||||
|
||||
#include "glbuffer.h"
|
||||
#include "glshaders_types.h"
|
||||
#include "gltexturearray.h"
|
||||
#include "glbuffer.h"
|
||||
|
||||
|
||||
class RendererBase {
|
||||
|
||||
@@ -17,19 +17,20 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "renderer_material.h"
|
||||
#include "renderer.h"
|
||||
#include "qglview.h"
|
||||
|
||||
#include "glmesh.h"
|
||||
#include "gltexture_manager.h"
|
||||
#include "qglview.h"
|
||||
#include "renderer.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <qad_types.h>
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
|
||||
RendererMaterial::RendererMaterial(Renderer * r_)
|
||||
: r(r_), fbo_mat_thumb(r->view, 6, true , GL_RGBA16F) {
|
||||
RendererMaterial::RendererMaterial(Renderer * r_): r(r_), fbo_mat_thumb(r->view, 6, true, GL_RGBA16F) {
|
||||
mat_sphere = Primitive::ellipsoid(16, 16);
|
||||
mat_camera = new Camera();
|
||||
mat_camera->setPos(QVector3D(2, 2, 2));
|
||||
@@ -110,8 +111,7 @@ void RendererMaterial::procQueue() {
|
||||
emit r->view->materialThumbnailCreated(last_thumb_material);
|
||||
last_thumb_material = 0;
|
||||
}
|
||||
if (!mat_thumb_queue.isEmpty())
|
||||
renderMaterial(mat_thumb_queue.dequeue());
|
||||
if (!mat_thumb_queue.isEmpty()) renderMaterial(mat_thumb_queue.dequeue());
|
||||
}
|
||||
|
||||
|
||||
@@ -128,7 +128,6 @@ void RendererMaterial::recreateMaterialThumbnails(bool force_all) {
|
||||
mat_thumb_queue.enqueue(m);
|
||||
} else {
|
||||
foreach(Material * m, r->view->scene()->changed_materials)
|
||||
if (!mat_thumb_queue.contains(m))
|
||||
mat_thumb_queue.enqueue(m);
|
||||
if (!mat_thumb_queue.contains(m)) mat_thumb_queue.enqueue(m);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,11 +20,13 @@
|
||||
#define RENDERER_MATERIAL_H
|
||||
|
||||
#include "glframebuffer.h"
|
||||
|
||||
#include <QQueue>
|
||||
|
||||
|
||||
class RendererMaterial {
|
||||
friend class QGLView;
|
||||
|
||||
public:
|
||||
RendererMaterial(Renderer * r_);
|
||||
virtual ~RendererMaterial();
|
||||
|
||||
@@ -17,17 +17,18 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "renderer_selection.h"
|
||||
#include "qglview.h"
|
||||
|
||||
#include "glmesh.h"
|
||||
#include "qglview.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <qad_types.h>
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
|
||||
RendererSelection::RendererSelection(Renderer * r_)
|
||||
: r(r_), fbo_selection(r->view, 6) {
|
||||
RendererSelection::RendererSelection(Renderer * r_): r(r_), fbo_selection(r->view, 6) {
|
||||
sel_frame = Primitive::plane(2., 2.);
|
||||
id_hover = 0;
|
||||
line_thick_ = 2.;
|
||||
@@ -105,8 +106,7 @@ void RendererSelection::renderSelection(Scene & scene) {
|
||||
mc.hov_objects << o;
|
||||
else {
|
||||
o = aim_ids.value(id_hover);
|
||||
if (o)
|
||||
mc.hov_aims << o;
|
||||
if (o) mc.hov_aims << o;
|
||||
}
|
||||
// qDebug() << id_hover;
|
||||
} else {
|
||||
@@ -141,8 +141,7 @@ void RendererSelection::renderSelection(Scene & scene) {
|
||||
if (r->mouse_rect.isNull())
|
||||
fbo_selection.queryPoint(0, r->mouse_pos * scale_);
|
||||
else
|
||||
fbo_selection.queryPoints(0, QRect(r->mouse_rect.topLeft() * scale_,
|
||||
r->mouse_rect.size() * scale_));
|
||||
fbo_selection.queryPoints(0, QRect(r->mouse_rect.topLeft() * scale_, r->mouse_rect.size() * scale_));
|
||||
|
||||
// qDebug() << id_hover;
|
||||
fbo_selection.bindColorTexture(sbrSrcHover, sbrSrcHover);
|
||||
@@ -158,7 +157,8 @@ void RendererSelection::renderSelection(Scene & scene) {
|
||||
prog->setUniformValue("has_selection", view->isSelectionHaloEnabled() ? 1.f : 0.f);
|
||||
prog->setUniformValue("fb_hover", (int)sbrSrcHover);
|
||||
prog->setUniformValue("fb_selection", (int)sbrSrcSelect);
|
||||
prog->setUniformValue("hover_id", QVector4D(float( id_hover & 0xFF) / 255.f,
|
||||
prog->setUniformValue("hover_id",
|
||||
QVector4D(float(id_hover & 0xFF) / 255.f,
|
||||
float((id_hover >> 8) & 0xFF) / 255.f,
|
||||
float((id_hover >> 16) & 0xFF) / 255.f,
|
||||
float((id_hover >> 24) & 0xFF) / 255.f));
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#define RENDERER_SELECTION_H
|
||||
|
||||
#include "renderer_service.h"
|
||||
|
||||
#include <QHash>
|
||||
|
||||
|
||||
|
||||
@@ -17,11 +17,13 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "renderer_service.h"
|
||||
#include "renderer.h"
|
||||
#include "qglview.h"
|
||||
|
||||
#include "glmesh.h"
|
||||
#include "qglview.h"
|
||||
#include "renderer.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <qad_types.h>
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
@@ -31,8 +33,10 @@ RendererService::RendererService(Renderer * r_): r(r_) {
|
||||
line_width = 1;
|
||||
current_action = haNoAction;
|
||||
current_handle = QFlags<HandleMesh>();
|
||||
mat_xyz.resize(3); mat_ms2.resize(3);
|
||||
color_xyz.resize(3); color_ms2.resize(3);
|
||||
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) {
|
||||
@@ -40,8 +44,7 @@ RendererService::RendererService(Renderer * r_): r(r_) {
|
||||
m.rotate(90., _rot[i]);
|
||||
mat_xyz[i] = m;
|
||||
m.setToIdentity();
|
||||
if (!_rot2[i].isNull())
|
||||
m.rotate(90., _rot2[i]);
|
||||
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.;
|
||||
@@ -254,7 +257,12 @@ void RendererService::fillAimedObjects(const ObjectBaseList & objects, Mesh * li
|
||||
}
|
||||
|
||||
|
||||
void RendererService::fillHandleObjects(QVector3D center, HandleMesh ids[], const QVector<QMatrix4x4> & mats, const QVector<QVector4D> & colors, QMatrix4x4 add_mat, int count) {
|
||||
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) {
|
||||
@@ -286,8 +294,7 @@ bool RendererService::calculateCenter() {
|
||||
axis_mat = QMatrix4x4();
|
||||
if ((sol.size() == 1)) {
|
||||
if (current_action == haMove) {
|
||||
if (sol[0]->isAimSelected())
|
||||
selection_center = ((AimedObject*)sol[0])->worldAim();
|
||||
if (sol[0]->isAimSelected()) selection_center = ((AimedObject *)sol[0])->worldAim();
|
||||
} else {
|
||||
axis_mat = parentRotationMatrix(sol[0]);
|
||||
}
|
||||
@@ -301,9 +308,21 @@ void RendererService::drawCurrentHandleObjects() {
|
||||
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;
|
||||
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);
|
||||
@@ -317,8 +336,16 @@ void RendererService::drawCurrentHandleObjects() {
|
||||
}
|
||||
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;
|
||||
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;
|
||||
@@ -328,8 +355,10 @@ void RendererService::drawCurrentHandleObjects() {
|
||||
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(1, 1, 0.5, 1), 1);
|
||||
QVector<QMatrix4x4> mv;
|
||||
mv.resize(1);
|
||||
QVector<QVector4D> cv;
|
||||
cv.fill(QVector4D(1, 1, 0.5, 1), 1);
|
||||
ids[0] = hmMaxScale;
|
||||
fillHandleObjects(selection_center, ids, mv, cv, axis_mat, 1);
|
||||
hm->loadObjects(r->view, cur_objects);
|
||||
@@ -360,7 +389,6 @@ void RendererService::drawLights() {
|
||||
box_mesh->loadObjects(v, cur_aims);
|
||||
box_mesh->loadSelections(v, rs.cur_selections_);
|
||||
box_mesh->draw(v, cur_aims.size());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -387,7 +415,6 @@ void RendererService::drawLightsFrame(QColor color) {
|
||||
box_mesh_f->loadObjects(v, cur_aims);
|
||||
box_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||
box_mesh_f->draw(v, cur_aims.size());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -405,7 +432,6 @@ void RendererService::drawCameras() {
|
||||
box_mesh->loadObjects(v, cur_aims);
|
||||
box_mesh->loadSelections(v, rs.cur_selections_);
|
||||
box_mesh->draw(v, cur_aims.size());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -426,7 +452,6 @@ void RendererService::drawCamerasFrame(QColor color) {
|
||||
box_mesh_f->loadObjects(v, cur_aims);
|
||||
box_mesh_f->loadSelections(v, rs.cur_selections_);
|
||||
box_mesh_f->draw(v, cur_aims.size());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -460,7 +485,6 @@ void RendererService::renderService() {
|
||||
prog->setUniformValue("z_offset", -1.E-2f);
|
||||
drawLightsFrame(Qt::black);
|
||||
drawCamerasFrame(Qt::black);
|
||||
|
||||
}
|
||||
if (r->bindShader(Renderer::srServiceLine, &prog)) {
|
||||
r->setUniformCamera(prog, r->view->camera());
|
||||
@@ -488,7 +512,6 @@ void RendererService::renderService() {
|
||||
r->setUniformCamera(prog, axis_camera, true, axis_viewport);
|
||||
axis_mesh->draw(f, 3);
|
||||
f->glViewport(0, 0, r->view->width(), r->view->height());
|
||||
|
||||
}
|
||||
f->glDisable(GL_MULTISAMPLE);
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include "glframebuffer.h"
|
||||
#include "glshaders_types.h"
|
||||
|
||||
#include <QQueue>
|
||||
|
||||
|
||||
@@ -70,7 +71,12 @@ public:
|
||||
void fillXYZObjects();
|
||||
void fillOmniObjects();
|
||||
void fillAimedObjects(const ObjectBaseList & objects, Mesh * line_mesh);
|
||||
void fillHandleObjects(QVector3D center, HandleMesh ids[], const QVector<QMatrix4x4> & mats, const QVector<QVector4D> & colors, QMatrix4x4 add_mat, int count = 3);
|
||||
void fillHandleObjects(QVector3D center,
|
||||
HandleMesh ids[],
|
||||
const QVector<QMatrix4x4> & mats,
|
||||
const QVector<QVector4D> & colors,
|
||||
QMatrix4x4 add_mat,
|
||||
int count = 3);
|
||||
bool calculateCenter();
|
||||
void drawCurrentHandleObjects();
|
||||
void drawLights();
|
||||
|
||||
@@ -17,18 +17,22 @@
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include "tonemapping_proc.h"
|
||||
|
||||
#include "qglview.h"
|
||||
|
||||
#include <QOpenGLExtraFunctions>
|
||||
#include <qad_types.h>
|
||||
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
|
||||
TonemappingProc::TonemappingProc(Renderer * rend): QThread(), r(rend),
|
||||
fbo_1x1(r->view, 1, false, GL_RGB32F),
|
||||
fbomm(r->fbo_out, Renderer::obrSum, 3),
|
||||
buffer_vbo(GL_ARRAY_BUFFER, GL_DYNAMIC_DRAW) {
|
||||
TonemappingProc::TonemappingProc(Renderer * rend)
|
||||
: QThread()
|
||||
, r(rend)
|
||||
, fbo_1x1(r->view, 1, false, GL_RGB32F)
|
||||
, fbomm(r->fbo_out, Renderer::obrSum, 3)
|
||||
, buffer_vbo(GL_ARRAY_BUFFER, GL_DYNAMIC_DRAW) {
|
||||
shader_sum = 0;
|
||||
timer_delim = 0;
|
||||
frame_max = cur_max = 1.;
|
||||
@@ -40,8 +44,7 @@ TonemappingProc::TonemappingProc(Renderer * rend): QThread(), r(rend),
|
||||
|
||||
TonemappingProc::~TonemappingProc() {
|
||||
exit_ = true;
|
||||
if (!wait(1000))
|
||||
terminate();
|
||||
if (!wait(1000)) terminate();
|
||||
killTimer(timer_tone);
|
||||
if (shader_sum) delete shader_sum;
|
||||
}
|
||||
@@ -85,8 +88,7 @@ void TonemappingProc::resize() {
|
||||
|
||||
void TonemappingProc::timerEvent(QTimerEvent * e) {
|
||||
if (!fbo_1x1.isInit() || !enabled) return;
|
||||
if (timer_delim == 0)
|
||||
need_render_sum = true;
|
||||
if (timer_delim == 0) need_render_sum = true;
|
||||
timer_delim = (timer_delim + 1) % 10;
|
||||
mutex.lock();
|
||||
float fmax = frame_max;
|
||||
@@ -139,8 +141,7 @@ void TonemappingProc::run() {
|
||||
mutex.unlock();
|
||||
float max = calcHistogram(data);
|
||||
last_max << max;
|
||||
if (last_max.size() > 5)
|
||||
last_max.removeAt(0);
|
||||
if (last_max.size() > 5) last_max.removeAt(0);
|
||||
float cm = last_max[0];
|
||||
for (int i = 1; i < last_max.size(); ++i)
|
||||
cm += last_max[i];
|
||||
|
||||
@@ -20,13 +20,14 @@
|
||||
#define TONEMAPPING_PROC_H
|
||||
|
||||
#include "glframebuffer_mipmap.h"
|
||||
|
||||
#include <QThread>
|
||||
|
||||
|
||||
class TonemappingProc: public QThread
|
||||
{
|
||||
class TonemappingProc: public QThread {
|
||||
friend class Renderer;
|
||||
friend class QGLView;
|
||||
|
||||
public:
|
||||
TonemappingProc(Renderer * rend);
|
||||
virtual ~TonemappingProc();
|
||||
|
||||
@@ -17,8 +17,9 @@
|
||||
*/
|
||||
|
||||
#include "material_editor.h"
|
||||
#include "ui_material_editor.h"
|
||||
|
||||
#include "glmaterial.h"
|
||||
#include "ui_material_editor.h"
|
||||
|
||||
|
||||
MaterialEditor::MaterialEditor(QWidget * parent): QWidget(parent) {
|
||||
@@ -42,11 +43,8 @@ MaterialEditor::MaterialEditor(QWidget * parent): QWidget(parent) {
|
||||
void MaterialEditor::changeEvent(QEvent * e) {
|
||||
QWidget::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case QEvent::LanguageChange: ui->retranslateUi(this); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,13 +86,17 @@ void MaterialEditor::setMaterial(Material * m) {
|
||||
ui->mapRoughness->setMap(&(mat->map_roughness));
|
||||
ui->mapEmission->setMap(&(mat->map_emission));
|
||||
ui->mapRelief->setMap(&(mat->map_relief));
|
||||
/*ui->lineReflFront->setProperty("GLpath", mat->map_reflection.path(0)); ui->lineReflFront->setText(QFileInfo(mat->map_reflection.path(0)).fileName());
|
||||
ui->lineReflBack->setProperty("GLpath", mat->map_reflection.path(1)); ui->lineReflBack->setText(QFileInfo(mat->map_reflection.path(1)).fileName());
|
||||
ui->lineReflLeft->setProperty("GLpath", mat->map_reflection.path(2)); ui->lineReflLeft->setText(QFileInfo(mat->map_reflection.path(2)).fileName());
|
||||
ui->lineReflRight->setProperty("GLpath", mat->map_reflection.path(3)); ui->lineReflRight->setText(QFileInfo(mat->map_reflection.path(3)).fileName());
|
||||
ui->lineReflTop->setProperty("GLpath", mat->map_reflection.path(4)); ui->lineReflTop->setText(QFileInfo(mat->map_reflection.path(4)).fileName());
|
||||
ui->lineReflBottom->setProperty("GLpath", mat->map_reflection.path(5)); ui->lineReflBottom->setText(QFileInfo(mat->map_reflection.path(5)).fileName());
|
||||
*/active = true;
|
||||
/*ui->lineReflFront->setProperty("GLpath", mat->map_reflection.path(0));
|
||||
ui->lineReflFront->setText(QFileInfo(mat->map_reflection.path(0)).fileName()); ui->lineReflBack->setProperty("GLpath",
|
||||
mat->map_reflection.path(1)); ui->lineReflBack->setText(QFileInfo(mat->map_reflection.path(1)).fileName());
|
||||
ui->lineReflLeft->setProperty("GLpath", mat->map_reflection.path(2));
|
||||
ui->lineReflLeft->setText(QFileInfo(mat->map_reflection.path(2)).fileName()); ui->lineReflRight->setProperty("GLpath",
|
||||
mat->map_reflection.path(3)); ui->lineReflRight->setText(QFileInfo(mat->map_reflection.path(3)).fileName());
|
||||
ui->lineReflTop->setProperty("GLpath", mat->map_reflection.path(4));
|
||||
ui->lineReflTop->setText(QFileInfo(mat->map_reflection.path(4)).fileName()); ui->lineReflBottom->setProperty("GLpath",
|
||||
mat->map_reflection.path(5)); ui->lineReflBottom->setText(QFileInfo(mat->map_reflection.path(5)).fileName());
|
||||
*/
|
||||
active = true;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -125,7 +127,10 @@ Material MaterialEditor::material() {
|
||||
*/
|
||||
|
||||
void MaterialEditor::on_buttonReflFrontSelect_clicked() {
|
||||
QString str = QFileDialog::getOpenFileName(this, "Select image", ui->lineReflFront->property("GLpath").toString(), "Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
QString str = QFileDialog::getOpenFileName(this,
|
||||
"Select image",
|
||||
ui->lineReflFront->property("GLpath").toString(),
|
||||
"Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
if (str.isEmpty()) return;
|
||||
ui->lineReflFront->setProperty("GLpath", str);
|
||||
ui->lineReflFront->setText(QFileInfo(str).fileName());
|
||||
@@ -134,7 +139,10 @@ void MaterialEditor::on_buttonReflFrontSelect_clicked() {
|
||||
|
||||
|
||||
void MaterialEditor::on_buttonReflBackSelect_clicked() {
|
||||
QString str = QFileDialog::getOpenFileName(this, "Select image", ui->lineReflBack->property("GLpath").toString(), "Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
QString str = QFileDialog::getOpenFileName(this,
|
||||
"Select image",
|
||||
ui->lineReflBack->property("GLpath").toString(),
|
||||
"Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
if (str.isEmpty()) return;
|
||||
ui->lineReflBack->setProperty("GLpath", str);
|
||||
ui->lineReflBack->setText(QFileInfo(str).fileName());
|
||||
@@ -143,7 +151,10 @@ void MaterialEditor::on_buttonReflBackSelect_clicked() {
|
||||
|
||||
|
||||
void MaterialEditor::on_buttonReflLeftSelect_clicked() {
|
||||
QString str = QFileDialog::getOpenFileName(this, "Select image", ui->lineReflLeft->property("GLpath").toString(), "Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
QString str = QFileDialog::getOpenFileName(this,
|
||||
"Select image",
|
||||
ui->lineReflLeft->property("GLpath").toString(),
|
||||
"Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
if (str.isEmpty()) return;
|
||||
ui->lineReflLeft->setProperty("GLpath", str);
|
||||
ui->lineReflLeft->setText(QFileInfo(str).fileName());
|
||||
@@ -152,7 +163,10 @@ void MaterialEditor::on_buttonReflLeftSelect_clicked() {
|
||||
|
||||
|
||||
void MaterialEditor::on_buttonReflRightSelect_clicked() {
|
||||
QString str = QFileDialog::getOpenFileName(this, "Select image", ui->lineReflRight->property("GLpath").toString(), "Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
QString str = QFileDialog::getOpenFileName(this,
|
||||
"Select image",
|
||||
ui->lineReflRight->property("GLpath").toString(),
|
||||
"Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
if (str.isEmpty()) return;
|
||||
ui->lineReflRight->setProperty("GLpath", str);
|
||||
ui->lineReflRight->setText(QFileInfo(str).fileName());
|
||||
@@ -161,7 +175,10 @@ void MaterialEditor::on_buttonReflRightSelect_clicked() {
|
||||
|
||||
|
||||
void MaterialEditor::on_buttonReflTopSelect_clicked() {
|
||||
QString str = QFileDialog::getOpenFileName(this, "Select image", ui->lineReflTop->property("GLpath").toString(), "Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
QString str = QFileDialog::getOpenFileName(this,
|
||||
"Select image",
|
||||
ui->lineReflTop->property("GLpath").toString(),
|
||||
"Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
if (str.isEmpty()) return;
|
||||
ui->lineReflTop->setProperty("GLpath", str);
|
||||
ui->lineReflTop->setText(QFileInfo(str).fileName());
|
||||
@@ -170,7 +187,10 @@ void MaterialEditor::on_buttonReflTopSelect_clicked() {
|
||||
|
||||
|
||||
void MaterialEditor::on_buttonReflBottomSelect_clicked() {
|
||||
QString str = QFileDialog::getOpenFileName(this, "Select image", ui->lineReflBottom->property("GLpath").toString(), "Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
QString str = QFileDialog::getOpenFileName(this,
|
||||
"Select image",
|
||||
ui->lineReflBottom->property("GLpath").toString(),
|
||||
"Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
if (str.isEmpty()) return;
|
||||
ui->lineReflBottom->setProperty("GLpath", str);
|
||||
ui->lineReflBottom->setText(QFileInfo(str).fileName());
|
||||
|
||||
@@ -19,17 +19,18 @@
|
||||
#ifndef MATERIAL_EDITOR_H
|
||||
#define MATERIAL_EDITOR_H
|
||||
|
||||
#include <QFileDialog>
|
||||
#include "gltypes.h"
|
||||
|
||||
#include <QFileDialog>
|
||||
|
||||
namespace Ui {
|
||||
class MaterialEditor;
|
||||
}
|
||||
|
||||
class MaterialEditor: public QWidget
|
||||
{
|
||||
class MaterialEditor: public QWidget {
|
||||
friend class MaterialsEditor;
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MaterialEditor(QWidget * parent = 0);
|
||||
|
||||
@@ -61,7 +62,6 @@ private slots:
|
||||
|
||||
signals:
|
||||
void changed();
|
||||
|
||||
};
|
||||
|
||||
#endif // MATERIAL_EDITOR_H
|
||||
|
||||
@@ -17,9 +17,11 @@
|
||||
*/
|
||||
|
||||
#include "material_map_editor.h"
|
||||
#include "ui_material_map_editor.h"
|
||||
#include "gltexture_manager.h"
|
||||
|
||||
#include "glmaterial.h"
|
||||
#include "gltexture_manager.h"
|
||||
#include "ui_material_map_editor.h"
|
||||
|
||||
#include <qad_types.h>
|
||||
|
||||
|
||||
@@ -34,11 +36,8 @@ MaterialMapEditor::MaterialMapEditor(QWidget * parent): QWidget(parent) {
|
||||
void MaterialMapEditor::changeEvent(QEvent * e) {
|
||||
QWidget::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case QEvent::LanguageChange: ui->retranslateUi(this); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,7 +84,8 @@ void MaterialMapEditor::setMap(Map * m) {
|
||||
ui->sliderOffset->setValue(map->color_offset);
|
||||
ui->spinScaleX->setValue(map->bitmap_scale.x());
|
||||
ui->spinScaleY->setValue(map->bitmap_scale.y());
|
||||
ui->linePath->setProperty("GLpath", map->bitmap_path); ui->linePath->setText(QFileInfo(map->bitmap_path).fileName());
|
||||
ui->linePath->setProperty("GLpath", map->bitmap_path);
|
||||
ui->linePath->setText(QFileInfo(map->bitmap_path).fileName());
|
||||
updateIcon();
|
||||
active = true;
|
||||
}
|
||||
@@ -121,7 +121,10 @@ Map MaterialMapEditor::map() {
|
||||
*/
|
||||
|
||||
void MaterialMapEditor::on_buttonSelect_clicked() {
|
||||
QString str = QFileDialog::getOpenFileName(this, "Select image", ui->linePath->property("GLpath").toString(), "Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
QString str = QFileDialog::getOpenFileName(this,
|
||||
"Select image",
|
||||
ui->linePath->property("GLpath").toString(),
|
||||
"Images(*.bmp *.jpg *.jpeg *.png *.tif *.tiff *.tga);;All files(*)");
|
||||
if (str.isEmpty()) return;
|
||||
ui->linePath->setProperty("GLpath", str);
|
||||
ui->linePath->setText(QFileInfo(str).fileName());
|
||||
|
||||
@@ -19,16 +19,17 @@
|
||||
#ifndef MATERIAL_MAP_EDITOR_H
|
||||
#define MATERIAL_MAP_EDITOR_H
|
||||
|
||||
#include <QFileDialog>
|
||||
#include "gltypes.h"
|
||||
|
||||
#include <QFileDialog>
|
||||
|
||||
namespace Ui {
|
||||
class MaterialMapEditor;
|
||||
}
|
||||
|
||||
class MaterialMapEditor: public QWidget
|
||||
{
|
||||
class MaterialMapEditor: public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MaterialMapEditor(QWidget * parent = 0);
|
||||
|
||||
@@ -54,7 +55,6 @@ private slots:
|
||||
|
||||
signals:
|
||||
void changed();
|
||||
|
||||
};
|
||||
|
||||
#endif // MATERIAL_MAP_EDITOR_H
|
||||
|
||||
@@ -17,13 +17,15 @@
|
||||
*/
|
||||
|
||||
#include "materials_editor.h"
|
||||
#include "ui_materials_editor.h"
|
||||
|
||||
#include "glmaterial.h"
|
||||
#include "material_editor.h"
|
||||
#include "qglview.h"
|
||||
#include "glmaterial.h"
|
||||
#include <qad_types.h>
|
||||
#include <ecombobox.h>
|
||||
#include "ui_materials_editor.h"
|
||||
|
||||
#include <QInputDialog>
|
||||
#include <ecombobox.h>
|
||||
#include <qad_types.h>
|
||||
|
||||
|
||||
MaterialsEditor::MaterialsEditor(QWidget * parent): QWidget(parent) {
|
||||
@@ -63,11 +65,8 @@ bool MaterialsEditor::event(QEvent * e) {
|
||||
void MaterialsEditor::changeEvent(QEvent * e) {
|
||||
QWidget::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case QEvent::LanguageChange: ui->retranslateUi(this); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,8 +97,7 @@ void MaterialsEditor::selectMaterial(Material * m) {
|
||||
int MaterialsEditor::indexByMaterial(Material * m) {
|
||||
if (!m) return -1;
|
||||
for (int i = 0; i < ui->comboMaterial->count(); ++i) {
|
||||
if ((Material*)(ui->comboMaterial->itemData(i, Qt::UserRole + 1).value<quintptr>()) == m)
|
||||
return i;
|
||||
if ((Material *)(ui->comboMaterial->itemData(i, Qt::UserRole + 1).value<quintptr>()) == m) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -129,7 +127,6 @@ void MaterialsEditor::materialsChanged() {
|
||||
ui->comboMaterial->setItemIcon(i, QIcon(QPixmap::fromImage(view->materialThumbnail(m))));
|
||||
if (cm == m) ui->comboMaterial->setCurrentIndex(i);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -19,16 +19,17 @@
|
||||
#ifndef MATERIALS_EDITOR_H
|
||||
#define MATERIALS_EDITOR_H
|
||||
|
||||
#include <QFileDialog>
|
||||
#include "gltypes.h"
|
||||
|
||||
#include <QFileDialog>
|
||||
|
||||
namespace Ui {
|
||||
class MaterialsEditor;
|
||||
}
|
||||
|
||||
class MaterialsEditor: public QWidget
|
||||
{
|
||||
class MaterialsEditor: public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MaterialsEditor(QWidget * parent = 0);
|
||||
|
||||
@@ -60,7 +61,6 @@ private slots:
|
||||
|
||||
signals:
|
||||
void changed();
|
||||
|
||||
};
|
||||
|
||||
#endif // MATERIALS_EDITOR_H
|
||||
|
||||
@@ -17,10 +17,12 @@
|
||||
*/
|
||||
|
||||
#include "object_editor.h"
|
||||
#include "ui_object_editor.h"
|
||||
|
||||
#include "qglview.h"
|
||||
#include <spinslider.h>
|
||||
#include "ui_object_editor.h"
|
||||
|
||||
#include <scroll_spin_box.h>
|
||||
#include <spinslider.h>
|
||||
|
||||
|
||||
ObjectEditor::ObjectEditor(QWidget * parent): QWidget(parent) {
|
||||
@@ -35,16 +37,14 @@ ObjectEditor::ObjectEditor(QWidget * parent): QWidget(parent) {
|
||||
ui->spinAimDist->hide();
|
||||
|
||||
QObjectList ol;
|
||||
ol << ui->spinPosX << ui->spinPosY << ui->spinPosZ <<
|
||||
ui->spinRotationX << ui->spinRotationY << ui->spinRotationZ <<
|
||||
ui->spinScaleX << ui->spinScaleY << ui->spinScaleZ;
|
||||
ol << ui->spinPosX << ui->spinPosY << ui->spinPosZ << ui->spinRotationX << ui->spinRotationY << ui->spinRotationZ << ui->spinScaleX
|
||||
<< ui->spinScaleY << ui->spinScaleZ;
|
||||
foreach(QObject * o, ol)
|
||||
connect(o, SIGNAL(valueChanged(double)), this, SLOT(spinChanged(double)));
|
||||
|
||||
ol.clear();
|
||||
ol << ui->spinLightIntensity << ui->spinLightDecayConst << ui->spinLightDecayLinear <<
|
||||
ui->spinLightDecayQuadratic << ui->spinLightAngleStart << ui->spinLightAngleEnd <<
|
||||
ui->spinAimDist;
|
||||
ol << ui->spinLightIntensity << ui->spinLightDecayConst << ui->spinLightDecayLinear << ui->spinLightDecayQuadratic
|
||||
<< ui->spinLightAngleStart << ui->spinLightAngleEnd << ui->spinAimDist;
|
||||
foreach(QObject * o, ol)
|
||||
connect(o, SIGNAL(valueChanged(double)), this, SLOT(spinLightChanged(double)));
|
||||
|
||||
@@ -54,12 +54,10 @@ ObjectEditor::ObjectEditor(QWidget * parent): QWidget(parent) {
|
||||
connect(o, SIGNAL(valueChanged(double)), this, SLOT(spinCameraChanged(double)));
|
||||
|
||||
ol.clear();
|
||||
ol << ui->checkVisible << ui->checkCastShadows << ui->checkReceiveShadows <<
|
||||
ui->checkAcceptLight << ui->checkAcceptFog <<
|
||||
ui->checkCameraMirrorX << ui->checkCameraMirrorY;
|
||||
ol << ui->checkVisible << ui->checkCastShadows << ui->checkReceiveShadows << ui->checkAcceptLight << ui->checkAcceptFog
|
||||
<< ui->checkCameraMirrorX << ui->checkCameraMirrorY;
|
||||
foreach(QObject * o, ol)
|
||||
connect(o, SIGNAL(toggled(bool)), this, SLOT(checkChanged(bool)));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -75,11 +73,8 @@ void ObjectEditor::assignQGLView(QGLView * v) {
|
||||
void ObjectEditor::changeEvent(QEvent * e) {
|
||||
QWidget::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case QEvent::LanguageChange: ui->retranslateUi(this); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,14 +156,12 @@ void ObjectEditor::setObject(ObjectBase * o) {
|
||||
|
||||
|
||||
void ObjectEditor::on_spinLightAngleStart_valueChanged(double v) {
|
||||
if (ui->spinLightAngleEnd->value() < v)
|
||||
ui->spinLightAngleEnd->setValue(v);
|
||||
if (ui->spinLightAngleEnd->value() < v) ui->spinLightAngleEnd->setValue(v);
|
||||
}
|
||||
|
||||
|
||||
void ObjectEditor::on_spinLightAngleEnd_valueChanged(double v) {
|
||||
if (ui->spinLightAngleStart->value() > v)
|
||||
ui->spinLightAngleStart->setValue(v);
|
||||
if (ui->spinLightAngleStart->value() > v) ui->spinLightAngleStart->setValue(v);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -19,16 +19,17 @@
|
||||
#ifndef OBJECT_EDITOR_H
|
||||
#define OBJECT_EDITOR_H
|
||||
|
||||
#include <QWidget>
|
||||
#include "globject.h"
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class ObjectEditor;
|
||||
}
|
||||
|
||||
class ObjectEditor: public QWidget
|
||||
{
|
||||
class ObjectEditor: public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ObjectEditor(QWidget * parent = 0);
|
||||
|
||||
@@ -56,7 +57,6 @@ private slots:
|
||||
|
||||
signals:
|
||||
void changed();
|
||||
|
||||
};
|
||||
|
||||
#endif // OBJECT_EDITOR_H
|
||||
|
||||
@@ -17,11 +17,13 @@
|
||||
*/
|
||||
|
||||
#include "primitiveeditor.h"
|
||||
|
||||
#include "glmesh.h"
|
||||
#include "glprimitives.h"
|
||||
#include "ui_primitiveeditor.h"
|
||||
|
||||
#include <QMetaEnum>
|
||||
#include <qad_types.h>
|
||||
#include "glprimitives.h"
|
||||
#include "glmesh.h"
|
||||
|
||||
|
||||
PrimitiveEditor::PrimitiveEditor(QWidget * parent): QWidget(parent), ui(new Ui::PrimitiveEditor) {
|
||||
@@ -90,54 +92,28 @@ Mesh * PrimitiveEditor::createMesh(QVariantList & params) {
|
||||
params << pt;
|
||||
switch (pt) {
|
||||
case Plane:
|
||||
m = Primitive::plane(ui->spinWidth->value(),
|
||||
ui->spinLength->value());
|
||||
params << ui->spinWidth->value()
|
||||
<< ui->spinLength->value();
|
||||
m = Primitive::plane(ui->spinWidth->value(), ui->spinLength->value());
|
||||
params << ui->spinWidth->value() << ui->spinLength->value();
|
||||
break;
|
||||
case Cube:
|
||||
m = Primitive::cube(ui->spinWidth->value(),
|
||||
ui->spinLength->value(),
|
||||
ui->spinHeight->value());
|
||||
params << ui->spinWidth->value()
|
||||
<< ui->spinLength->value()
|
||||
<< ui->spinHeight->value();
|
||||
m = Primitive::cube(ui->spinWidth->value(), ui->spinLength->value(), ui->spinHeight->value());
|
||||
params << ui->spinWidth->value() << ui->spinLength->value() << ui->spinHeight->value();
|
||||
break;
|
||||
case Ellipsoid:
|
||||
m = Primitive::ellipsoid(ui->spinSegments->value(),
|
||||
ui->spinSegments2->value(),
|
||||
ui->spinRadius->value(),
|
||||
ui->spinAngle->value());
|
||||
params << ui->spinSegments->value()
|
||||
<< ui->spinSegments2->value()
|
||||
<< ui->spinRadius->value()
|
||||
<< ui->spinAngle->value();
|
||||
m = Primitive::ellipsoid(ui->spinSegments->value(), ui->spinSegments2->value(), ui->spinRadius->value(), ui->spinAngle->value());
|
||||
params << ui->spinSegments->value() << ui->spinSegments2->value() << ui->spinRadius->value() << ui->spinAngle->value();
|
||||
break;
|
||||
case Disc:
|
||||
m = Primitive::disc(ui->spinSegments->value(),
|
||||
ui->spinRadius->value(),
|
||||
ui->spinAngle->value());
|
||||
params << ui->spinSegments->value()
|
||||
<< ui->spinRadius->value()
|
||||
<< ui->spinAngle->value();
|
||||
m = Primitive::disc(ui->spinSegments->value(), ui->spinRadius->value(), ui->spinAngle->value());
|
||||
params << ui->spinSegments->value() << ui->spinRadius->value() << ui->spinAngle->value();
|
||||
break;
|
||||
case Cone:
|
||||
m = Primitive::cone(ui->spinSegments->value(),
|
||||
ui->spinRadius->value(),
|
||||
ui->spinHeight->value());
|
||||
params << ui->spinSegments->value()
|
||||
<< ui->spinRadius->value()
|
||||
<< ui->spinHeight->value();
|
||||
m = Primitive::cone(ui->spinSegments->value(), ui->spinRadius->value(), ui->spinHeight->value());
|
||||
params << ui->spinSegments->value() << ui->spinRadius->value() << ui->spinHeight->value();
|
||||
break;
|
||||
case Cylinder:
|
||||
m = Primitive::cylinder(ui->spinSegments->value(),
|
||||
ui->spinRadius->value(),
|
||||
ui->spinHeight->value(),
|
||||
ui->spinAngle->value());
|
||||
params << ui->spinSegments->value()
|
||||
<< ui->spinRadius->value()
|
||||
<< ui->spinHeight->value()
|
||||
<< ui->spinAngle->value();
|
||||
m = Primitive::cylinder(ui->spinSegments->value(), ui->spinRadius->value(), ui->spinHeight->value(), ui->spinAngle->value());
|
||||
params << ui->spinSegments->value() << ui->spinRadius->value() << ui->spinHeight->value() << ui->spinAngle->value();
|
||||
break;
|
||||
case Torus:
|
||||
m = Primitive::torus(ui->spinSegments->value(),
|
||||
@@ -145,32 +121,30 @@ Mesh * PrimitiveEditor::createMesh(QVariantList & params) {
|
||||
ui->spinRadius->value(),
|
||||
ui->spinRadius2->value(),
|
||||
ui->spinAngle->value());
|
||||
params << ui->spinSegments->value()
|
||||
<< ui->spinSegments2->value()
|
||||
<< ui->spinRadius->value()
|
||||
<< ui->spinRadius2->value()
|
||||
params << ui->spinSegments->value() << ui->spinSegments2->value() << ui->spinRadius->value() << ui->spinRadius2->value()
|
||||
<< ui->spinAngle->value();
|
||||
break;
|
||||
default: return 0;
|
||||
}
|
||||
params << ui->flipNormals->isChecked();
|
||||
params << ui->colorButton->color();
|
||||
if (ui->flipNormals->isChecked())
|
||||
m->flipNormals();
|
||||
if (ui->flipNormals->isChecked()) m->flipNormals();
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
void PrimitiveEditor::showEditors() {
|
||||
foreach (QWidget * w, all_editors) w->hide();
|
||||
foreach(QWidget * w, all_editors)
|
||||
w->hide();
|
||||
PrimitiveType pt = (PrimitiveType)ui->comboPrimitives->currentIndex();
|
||||
QList<QWidget *> wds = editors[pt];
|
||||
foreach (QWidget * w, wds) w->show();
|
||||
foreach(QWidget * w, wds)
|
||||
w->show();
|
||||
}
|
||||
|
||||
|
||||
void PrimitiveEditor::selectionChanged() {
|
||||
ObjectBase * so = view->selectedObject();\
|
||||
ObjectBase * so = view->selectedObject();
|
||||
can_replace = false;
|
||||
if (so) {
|
||||
QVariantList vl = so->property("primitive", &can_replace).toList();
|
||||
|
||||
@@ -19,9 +19,10 @@
|
||||
#ifndef PRIMITIVEEDITOR_H
|
||||
#define PRIMITIVEEDITOR_H
|
||||
|
||||
#include <QWidget>
|
||||
#include "qglview.h"
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
|
||||
namespace Ui {
|
||||
class PrimitiveEditor;
|
||||
@@ -30,6 +31,7 @@ class PrimitiveEditor;
|
||||
|
||||
class PrimitiveEditor: public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum PrimitiveType {
|
||||
Plane,
|
||||
|
||||
@@ -17,13 +17,15 @@
|
||||
*/
|
||||
|
||||
#include "propertyeditor.h"
|
||||
|
||||
#include "clineedit.h"
|
||||
#include "colorbutton.h"
|
||||
#include "qpointedit.h"
|
||||
#include "qrectedit.h"
|
||||
#include "colorbutton.h"
|
||||
#include "clineedit.h"
|
||||
#include <QPainter>
|
||||
#include <QCheckBox>
|
||||
|
||||
#include <QApplication>
|
||||
#include <QCheckBox>
|
||||
#include <QPainter>
|
||||
|
||||
|
||||
QWidget * Delegate::widgetForProperty(QWidget * parent, const QModelIndex & index) const {
|
||||
@@ -35,7 +37,9 @@ QWidget * Delegate::widgetForProperty(QWidget * parent, const QModelIndex & inde
|
||||
qulonglong key = index.data(Qt::UserRole).toULongLong();
|
||||
value = index.parent().data(Qt::UserRole);
|
||||
// QMetaProperty prop = index.parent().data(Qt::UserRole + 1).value<QMetaProperty>();
|
||||
w = new QCheckBox(parent); type = 14; ((QCheckBox*)w)->setChecked(((value.toULongLong() & key) == key && key != 0) || (value.toULongLong() == 0 && key == 0));
|
||||
w = new QCheckBox(parent);
|
||||
type = 14;
|
||||
((QCheckBox *)w)->setChecked(((value.toULongLong() & key) == key && key != 0) || (value.toULongLong() == 0 && key == 0));
|
||||
((QCheckBox *)w)->setText("0x" + QString::number(key, 16).toUpper());
|
||||
connect((QCheckBox *)w, SIGNAL(clicked(bool)), this, SLOT(changedFlag()));
|
||||
// qDebug() << prop.enumerator().name();
|
||||
@@ -43,13 +47,15 @@ QWidget * Delegate::widgetForProperty(QWidget * parent, const QModelIndex & inde
|
||||
if (value.canConvert<PropertyValuePair>()) {
|
||||
PropertyValuePair prop = value.value<PropertyValuePair>();
|
||||
if (prop.first.isEnumType()) {
|
||||
w = new QComboBox(parent); type = 13; ((QComboBox*)w)->setCurrentIndex(value.toInt());
|
||||
w = new QComboBox(parent);
|
||||
type = 13;
|
||||
((QComboBox *)w)->setCurrentIndex(value.toInt());
|
||||
w->setProperty("__prop", QVariant::fromValue<QMetaProperty>(prop.first));
|
||||
QMetaEnum menum = prop.first.enumerator();
|
||||
for (int i = 0; i < menum.keyCount(); ++i) {
|
||||
((QComboBox*)w)->addItem(QString(menum.key(i)) + " (0x" + QString::number(menum.value(i), 16).toUpper() + ")", menum.value(i));
|
||||
if (menum.value(i) == prop.second.toInt())
|
||||
((QComboBox*)w)->setCurrentIndex(i);
|
||||
((QComboBox *)w)
|
||||
->addItem(QString(menum.key(i)) + " (0x" + QString::number(menum.value(i), 16).toUpper() + ")", menum.value(i));
|
||||
if (menum.value(i) == prop.second.toInt()) ((QComboBox *)w)->setCurrentIndex(i);
|
||||
}
|
||||
connect((QComboBox *)w, SIGNAL(currentIndexChanged(int)), this, SLOT(changed()));
|
||||
}
|
||||
@@ -64,73 +70,129 @@ QWidget * Delegate::widgetForProperty(QWidget * parent, const QModelIndex & inde
|
||||
#else
|
||||
case QMetaType::Int:
|
||||
#endif
|
||||
w = new QSpinBox(parent); type = 2; ((QSpinBox*)w)->setRange(-0x7FFFFFFF, 0x7FFFFFFF); connect((QSpinBox*)w, SIGNAL(valueChanged(int)), this, SLOT(changed())); break;
|
||||
w = new QSpinBox(parent);
|
||||
type = 2;
|
||||
((QSpinBox *)w)->setRange(-0x7FFFFFFF, 0x7FFFFFFF);
|
||||
connect((QSpinBox *)w, SIGNAL(valueChanged(int)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::UInt:
|
||||
#else
|
||||
case QMetaType::UInt:
|
||||
#endif
|
||||
w = new QSpinBox(parent); type = 3; ((QSpinBox*)w)->setRange(0, 0xFFFFFFFF); connect((QSpinBox*)w, SIGNAL(valueChanged(int)), this, SLOT(changed())); break;
|
||||
w = new QSpinBox(parent);
|
||||
type = 3;
|
||||
((QSpinBox *)w)->setRange(0, 0xFFFFFFFF);
|
||||
connect((QSpinBox *)w, SIGNAL(valueChanged(int)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::LongLong:
|
||||
#else
|
||||
case QMetaType::LongLong:
|
||||
#endif
|
||||
w = new QSpinBox(parent); type = 4; ((QSpinBox*)w)->setRange(-0x7FFFFFFF, 0x7FFFFFFF); connect((QSpinBox*)w, SIGNAL(valueChanged(int)), this, SLOT(changed())); break;
|
||||
w = new QSpinBox(parent);
|
||||
type = 4;
|
||||
((QSpinBox *)w)->setRange(-0x7FFFFFFF, 0x7FFFFFFF);
|
||||
connect((QSpinBox *)w, SIGNAL(valueChanged(int)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::ULongLong:
|
||||
#else
|
||||
case QMetaType::ULongLong:
|
||||
#endif
|
||||
w = new QSpinBox(parent); type = 5; ((QSpinBox*)w)->setRange(0, 0xFFFFFFFF); connect((QSpinBox*)w, SIGNAL(valueChanged(int)), this, SLOT(changed())); break;
|
||||
w = new QSpinBox(parent);
|
||||
type = 5;
|
||||
((QSpinBox *)w)->setRange(0, 0xFFFFFFFF);
|
||||
connect((QSpinBox *)w, SIGNAL(valueChanged(int)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::Double:
|
||||
#else
|
||||
case QMetaType::Double:
|
||||
#endif
|
||||
w = new QDoubleSpinBox(parent); type = 6; ((QDoubleSpinBox*)w)->setRange(-999999999, 999999999); ((QDoubleSpinBox*)w)->setDecimals(3); connect((QDoubleSpinBox*)w, SIGNAL(valueChanged(double)), this, SLOT(changed())); break;
|
||||
w = new QDoubleSpinBox(parent);
|
||||
type = 6;
|
||||
((QDoubleSpinBox *)w)->setRange(-999999999, 999999999);
|
||||
((QDoubleSpinBox *)w)->setDecimals(3);
|
||||
connect((QDoubleSpinBox *)w, SIGNAL(valueChanged(double)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::Bool:
|
||||
#else
|
||||
case QMetaType::Bool:
|
||||
#endif
|
||||
w = new QCheckBox(parent); type = 7; ((QCheckBox*)w)->setChecked(value.toBool()); connect((QCheckBox*)w, SIGNAL(toggled(bool)), this, SLOT(changed())); break;
|
||||
w = new QCheckBox(parent);
|
||||
type = 7;
|
||||
((QCheckBox *)w)->setChecked(value.toBool());
|
||||
connect((QCheckBox *)w, SIGNAL(toggled(bool)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::Color:
|
||||
#else
|
||||
case QMetaType::QColor:
|
||||
#endif
|
||||
w = new ColorButton(parent); type = 8; ((ColorButton*)w)->setUseAlphaChannel(true); ((ColorButton*)w)->setColor(value.value<QColor>()); connect((ColorButton*)w, SIGNAL(colorChanged(QColor)), this, SLOT(changed())); break;
|
||||
w = new ColorButton(parent);
|
||||
type = 8;
|
||||
((ColorButton *)w)->setUseAlphaChannel(true);
|
||||
((ColorButton *)w)->setColor(value.value<QColor>());
|
||||
connect((ColorButton *)w, SIGNAL(colorChanged(QColor)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::Point:
|
||||
#else
|
||||
case QMetaType::QPoint:
|
||||
#endif
|
||||
w = new QPointEdit(parent); type = 9; ((QPointEdit*)w)->setDecimals(0); ((QPointEdit*)w)->setValue(QPointF(value.toPoint())); connect((QPointEdit*)w, SIGNAL(valueChanged(QPointF)), this, SLOT(changed())); break;
|
||||
w = new QPointEdit(parent);
|
||||
type = 9;
|
||||
((QPointEdit *)w)->setDecimals(0);
|
||||
((QPointEdit *)w)->setValue(QPointF(value.toPoint()));
|
||||
connect((QPointEdit *)w, SIGNAL(valueChanged(QPointF)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::PointF:
|
||||
#else
|
||||
case QMetaType::QPointF:
|
||||
#endif
|
||||
w = new QPointEdit(parent); type = 10; ((QPointEdit*)w)->setDecimals(3); ((QPointEdit*)w)->setValue(value.toPointF()); connect((QPointEdit*)w, SIGNAL(valueChanged(QPointF)), this, SLOT(changed())); break;
|
||||
w = new QPointEdit(parent);
|
||||
type = 10;
|
||||
((QPointEdit *)w)->setDecimals(3);
|
||||
((QPointEdit *)w)->setValue(value.toPointF());
|
||||
connect((QPointEdit *)w, SIGNAL(valueChanged(QPointF)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::Rect:
|
||||
#else
|
||||
case QMetaType::QRect:
|
||||
#endif
|
||||
w = new QRectEdit(parent); type = 11; ((QRectEdit*)w)->setDecimals(0); ((QRectEdit*)w)->setValue(QRectF(value.toRect())); connect((QRectEdit*)w, SIGNAL(valueChanged(QRectF)), this, SLOT(changed())); break;
|
||||
w = new QRectEdit(parent);
|
||||
type = 11;
|
||||
((QRectEdit *)w)->setDecimals(0);
|
||||
((QRectEdit *)w)->setValue(QRectF(value.toRect()));
|
||||
connect((QRectEdit *)w, SIGNAL(valueChanged(QRectF)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::RectF:
|
||||
#else
|
||||
case QMetaType::QRectF:
|
||||
#endif
|
||||
w = new QRectEdit(parent); type = 12; ((QRectEdit*)w)->setDecimals(3); ((QRectEdit*)w)->setValue(value.toRectF()); connect((QRectEdit*)w, SIGNAL(valueChanged(QRectF)), this, SLOT(changed())); break;
|
||||
w = new QRectEdit(parent);
|
||||
type = 12;
|
||||
((QRectEdit *)w)->setDecimals(3);
|
||||
((QRectEdit *)w)->setValue(value.toRectF());
|
||||
connect((QRectEdit *)w, SIGNAL(valueChanged(QRectF)), this, SLOT(changed()));
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::String: default:
|
||||
case QVariant::String:
|
||||
default:
|
||||
#else
|
||||
case QMetaType::QString: default:
|
||||
case QMetaType::QString:
|
||||
default:
|
||||
#endif
|
||||
w = new CLineEdit(parent); type = 1; ((CLineEdit*)w)->setDefaultText(value.toString()); connect((CLineEdit*)w, SIGNAL(textChanged(QString)), this, SLOT(changed())); break;
|
||||
w = new CLineEdit(parent);
|
||||
type = 1;
|
||||
((CLineEdit *)w)->setDefaultText(value.toString());
|
||||
connect((CLineEdit *)w, SIGNAL(textChanged(QString)), this, SLOT(changed()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -148,7 +210,10 @@ void Delegate::setWidgetProperty(QWidget * w, const QVariant & value) const {
|
||||
if (w == 0) return;
|
||||
switch (w->property("__type").toInt()) {
|
||||
case 1: ((CLineEdit *)w)->setText(value.toString()); break;
|
||||
case 2: case 3: case 4: case 5: ((QSpinBox*)w)->setValue(value.toInt()); break;
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5: ((QSpinBox *)w)->setValue(value.toInt()); break;
|
||||
case 6: ((QDoubleSpinBox *)w)->setValue(value.toDouble()); break;
|
||||
case 7: ((QCheckBox *)w)->setChecked(value.toBool()); break;
|
||||
case 8: ((ColorButton *)w)->setColor(value.value<QColor>()); break;
|
||||
@@ -175,7 +240,10 @@ const QVariant Delegate::widgetProperty(QWidget * w) const {
|
||||
case 10: return QVariant::fromValue<QPointF>(((QPointEdit *)w)->value()); break;
|
||||
case 11: return QVariant::fromValue<QRect>(((QRectEdit *)w)->value().toRect()); break;
|
||||
case 12: return QVariant::fromValue<QRectF>(((QRectEdit *)w)->value()); break;
|
||||
case 13: return QVariant::fromValue<PropertyValuePair>(PropertyValuePair(w->property("__prop").value<QMetaProperty>(), ((QComboBox*)w)->itemData(((QComboBox*)w)->currentIndex()))); break;
|
||||
case 13:
|
||||
return QVariant::fromValue<PropertyValuePair>(
|
||||
PropertyValuePair(w->property("__prop").value<QMetaProperty>(), ((QComboBox *)w)->itemData(((QComboBox *)w)->currentIndex())));
|
||||
break;
|
||||
default: return QVariant(); break;
|
||||
}
|
||||
return QVariant();
|
||||
@@ -183,8 +251,7 @@ const QVariant Delegate::widgetProperty(QWidget * w) const {
|
||||
|
||||
|
||||
void Delegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const {
|
||||
if (index.data(Qt::UserRole + 1).toString() != "__flag")
|
||||
model->setData(index, widgetProperty(editor), Qt::UserRole);
|
||||
if (index.data(Qt::UserRole + 1).toString() != "__flag") model->setData(index, widgetProperty(editor), Qt::UserRole);
|
||||
}
|
||||
|
||||
|
||||
@@ -196,11 +263,18 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
QStyleOptionComplex * soc = 0;
|
||||
QString text;
|
||||
QRect rect;
|
||||
QPalette::ColorRole role = (option.state.testFlag(QStyle::State_Selected) && option.state.testFlag(QStyle::State_Active) ? QPalette::HighlightedText : QPalette::WindowText);
|
||||
QPalette::ColorRole role =
|
||||
(option.state.testFlag(QStyle::State_Selected) && option.state.testFlag(QStyle::State_Active) ? QPalette::HighlightedText
|
||||
: QPalette::WindowText);
|
||||
if (index.data(Qt::UserRole + 2).toString() == "__flags") {
|
||||
text = "0x" + QString::number(value.toInt(), 16).toUpper();
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
return;
|
||||
}
|
||||
if (index.data(Qt::UserRole + 1) == "__flag") {
|
||||
@@ -210,7 +284,10 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
so->rect = option.rect;
|
||||
so->palette = option.palette;
|
||||
so->fontMetrics = option.fontMetrics;
|
||||
((QStyleOptionButton*)so)->state = (((value.toULongLong() & key) == key && key != 0) || (value.toULongLong() == 0 && key == 0) ? QStyle::State_On : QStyle::State_Off) | option.state;
|
||||
((QStyleOptionButton *)so)->state =
|
||||
(((value.toULongLong() & key) == key && key != 0) || (value.toULongLong() == 0 && key == 0) ? QStyle::State_On
|
||||
: QStyle::State_Off) |
|
||||
option.state;
|
||||
((QStyleOptionButton *)so)->text = "0x" + QString::number(key, 16).toUpper();
|
||||
if (option.state.testFlag(QStyle::State_Selected))
|
||||
so->palette.setColor(QPalette::WindowText, so->palette.color(QPalette::HighlightedText));
|
||||
@@ -226,8 +303,13 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
break;
|
||||
}
|
||||
}
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
}
|
||||
} else {
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
@@ -241,8 +323,13 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
case QMetaType::Int:
|
||||
#endif
|
||||
text.setNum(value.toInt());
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::UInt:
|
||||
@@ -250,8 +337,13 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
case QMetaType::UInt:
|
||||
#endif
|
||||
text.setNum(value.toUInt());
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::LongLong:
|
||||
@@ -259,8 +351,13 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
case QMetaType::LongLong:
|
||||
#endif
|
||||
text.setNum(value.toLongLong());
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::ULongLong:
|
||||
@@ -268,8 +365,13 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
case QMetaType::ULongLong:
|
||||
#endif
|
||||
text.setNum(value.toULongLong());
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::Double:
|
||||
@@ -277,8 +379,13 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
case QMetaType::Double:
|
||||
#endif
|
||||
text.setNum(value.toDouble(), 'f', 3);
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::Bool:
|
||||
@@ -309,8 +416,13 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
case QMetaType::QPoint:
|
||||
#endif
|
||||
text = pointString(value.toPoint());
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::PointF:
|
||||
@@ -318,8 +430,13 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
case QMetaType::QPointF:
|
||||
#endif
|
||||
text = pointString(value.toPointF());
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::Rect:
|
||||
@@ -327,8 +444,13 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
case QMetaType::QRect:
|
||||
#endif
|
||||
text = rectString(value.toRect());
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::RectF:
|
||||
@@ -336,16 +458,29 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
case QMetaType::QRectF:
|
||||
#endif
|
||||
text = rectString(value.toRectF());
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, text, role);
|
||||
style->drawItemText(painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, text),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
text,
|
||||
role);
|
||||
break;
|
||||
#if QT_VERSION_MAJOR <= 5
|
||||
case QVariant::String: default:
|
||||
case QVariant::String:
|
||||
default:
|
||||
#else
|
||||
case QMetaType::QString: default:
|
||||
case QMetaType::QString:
|
||||
default:
|
||||
#endif
|
||||
style->drawItemText(painter, style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, value.toString()),
|
||||
Qt::AlignLeft | Qt::AlignVCenter, option.palette, true, value.toString(), role);
|
||||
style->drawItemText(
|
||||
painter,
|
||||
style->itemTextRect(option.fontMetrics, option.rect, Qt::AlignLeft | Qt::AlignVCenter, true, value.toString()),
|
||||
Qt::AlignLeft | Qt::AlignVCenter,
|
||||
option.palette,
|
||||
true,
|
||||
value.toString(),
|
||||
role);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -361,7 +496,6 @@ void Delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, co
|
||||
break;*/
|
||||
if (so != 0) delete so;
|
||||
if (soc != 0) delete soc;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -390,14 +524,12 @@ void Delegate::changedFlag() {
|
||||
for (int i = 0; i < chldr.size(); ++i) {
|
||||
if (chldr[i] == cmi) continue;
|
||||
// qDebug() << (chldr[i].data(Qt::UserRole).toULongLong() & cv);
|
||||
if (chldr[i].data(Qt::UserRole).toULongLong() & cv)
|
||||
model->setData(chldr[i], false, Qt::UserRole + 3);
|
||||
if (chldr[i].data(Qt::UserRole).toULongLong() & cv) model->setData(chldr[i], false, Qt::UserRole + 3);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < chldr.size(); ++i) {
|
||||
// qDebug() << chldr[i].data(Qt::UserRole + 3).toBool();
|
||||
if (chldr[i].data(Qt::UserRole + 3).toBool())
|
||||
val |= chldr[i].data(Qt::UserRole).toULongLong();
|
||||
if (chldr[i].data(Qt::UserRole + 3).toBool()) val |= chldr[i].data(Qt::UserRole).toULongLong();
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < chldr.size(); ++i) {
|
||||
@@ -411,7 +543,6 @@ void Delegate::changedFlag() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
PropertyEditor::PropertyEditor(QWidget * parent): QTreeWidget(parent) {
|
||||
object = 0;
|
||||
active_ = false;
|
||||
@@ -421,9 +552,7 @@ PropertyEditor::PropertyEditor(QWidget * parent): QTreeWidget(parent) {
|
||||
}
|
||||
|
||||
|
||||
PropertyEditor::~PropertyEditor() {
|
||||
|
||||
}
|
||||
PropertyEditor::~PropertyEditor() {}
|
||||
|
||||
|
||||
void PropertyEditor::changeEvent(QEvent * e) {
|
||||
@@ -446,7 +575,6 @@ void PropertyEditor::configTree() {
|
||||
setHeaderLabels(lbls);
|
||||
setAlternatingRowColors(true);
|
||||
setItemDelegateForColumn(1, new Delegate());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -528,8 +656,7 @@ void PropertyEditor::rebuild() {
|
||||
ti->setData(1, Qt::UserRole, value);
|
||||
ti->setData(1, Qt::UserRole + 2, "__flags");
|
||||
ti->setData(0, Qt::UserRole + 1, QVariant::fromValue<QMetaProperty>(props.back()));
|
||||
}
|
||||
else if (props.back().isEnumType())
|
||||
} else if (props.back().isEnumType())
|
||||
value.setValue<PropertyValuePair>(PropertyValuePair(props.back(), value));
|
||||
// ti->setText(1, value.toString());
|
||||
ti->setData(1, Qt::UserRole, value);
|
||||
@@ -544,6 +671,4 @@ void PropertyEditor::rebuild() {
|
||||
}
|
||||
|
||||
|
||||
void PropertyEditor::refresh() {
|
||||
|
||||
}
|
||||
void PropertyEditor::refresh() {}
|
||||
|
||||
@@ -19,24 +19,30 @@
|
||||
#ifndef PROPERTYEDITOR_H
|
||||
#define PROPERTYEDITOR_H
|
||||
|
||||
#include <QTreeWidget>
|
||||
#include <QDebug>
|
||||
#include <QEvent>
|
||||
#include <QHeaderView>
|
||||
#include <QMetaProperty>
|
||||
#include <QEvent>
|
||||
#include <QDebug>
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QTreeWidget>
|
||||
#include <qpiconfigwidget.h>
|
||||
|
||||
|
||||
class Delegate: public QStyledItemDelegate {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
Delegate(QObject * parent = 0): QStyledItemDelegate() { ab = QBrush(QImage(":/icons/alpha.png")); }
|
||||
|
||||
QWidget * createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const {cmi = const_cast<QModelIndex & >(index); return widgetForProperty(parent, index);}
|
||||
QWidget * createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const {
|
||||
cmi = const_cast<QModelIndex &>(index);
|
||||
return widgetForProperty(parent, index);
|
||||
}
|
||||
void setEditorData(QWidget * editor, const QModelIndex & index) const { setWidgetProperty(editor, index.data(Qt::UserRole)); }
|
||||
void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const;
|
||||
void updateEditorGeometry(QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index) const {editor->setGeometry(option.rect);}
|
||||
void updateEditorGeometry(QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index) const {
|
||||
editor->setGeometry(option.rect);
|
||||
}
|
||||
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
|
||||
|
||||
private:
|
||||
@@ -45,10 +51,14 @@ private:
|
||||
const QVariant widgetProperty(QWidget * w) const;
|
||||
QString pointString(const QPoint & p) const { return QString::number(p.x()) + " x " + QString::number(p.y()); }
|
||||
QString pointString(const QPointF & p) const { return QString::number(p.x()) + " x " + QString::number(p.y()); }
|
||||
QString rectString(const QRect & r) const {return QString::number(r.x()) + " x " + QString::number(r.y()) + " : " +
|
||||
QString::number(r.width()) + " x " + QString::number(r.height());}
|
||||
QString rectString(const QRectF & r) const {return QString::number(r.x()) + " x " + QString::number(r.y()) + " : " +
|
||||
QString::number(r.width()) + " x " + QString::number(r.height());}
|
||||
QString rectString(const QRect & r) const {
|
||||
return QString::number(r.x()) + " x " + QString::number(r.y()) + " : " + QString::number(r.width()) + " x " +
|
||||
QString::number(r.height());
|
||||
}
|
||||
QString rectString(const QRectF & r) const {
|
||||
return QString::number(r.x()) + " x " + QString::number(r.y()) + " : " + QString::number(r.width()) + " x " +
|
||||
QString::number(r.height());
|
||||
}
|
||||
|
||||
QBrush ab;
|
||||
mutable QModelIndex cmi;
|
||||
@@ -56,7 +66,6 @@ private:
|
||||
private slots:
|
||||
void changed() { setModelData((QWidget *)sender(), const_cast<QAbstractItemModel *>(cmi.model()), cmi); }
|
||||
void changedFlag();
|
||||
|
||||
};
|
||||
|
||||
typedef QPair<QMetaProperty, QVariant> PropertyValuePair;
|
||||
@@ -67,19 +76,29 @@ Q_DECLARE_METATYPE (PropertyValuePair)
|
||||
|
||||
class PropertyEditor: public QTreeWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit PropertyEditor(QWidget * parent = 0);
|
||||
virtual ~PropertyEditor();
|
||||
|
||||
void assignObject(QObject * o) {object = o; rebuild();}
|
||||
void assignObject(QObject * o) {
|
||||
object = o;
|
||||
rebuild();
|
||||
}
|
||||
|
||||
protected:
|
||||
void changeEvent(QEvent * e);
|
||||
|
||||
private:
|
||||
void configTree();
|
||||
void setItemBackColor(QTreeWidgetItem * i, const QColor & c) {i->setBackground(0, c); i->setBackground(1, c);}
|
||||
void setItemForeColor(QTreeWidgetItem * i, const QColor & c) {i->setForeground(0, c); i->setForeground(1, c);}
|
||||
void setItemBackColor(QTreeWidgetItem * i, const QColor & c) {
|
||||
i->setBackground(0, c);
|
||||
i->setBackground(1, c);
|
||||
}
|
||||
void setItemForeColor(QTreeWidgetItem * i, const QColor & c) {
|
||||
i->setForeground(0, c);
|
||||
i->setForeground(1, c);
|
||||
}
|
||||
void rebuild();
|
||||
void refresh();
|
||||
|
||||
@@ -91,7 +110,6 @@ private:
|
||||
private slots:
|
||||
void itemClicked(QTreeWidgetItem * item, int column);
|
||||
void itemChanged(QTreeWidgetItem * item, int column);
|
||||
|
||||
};
|
||||
|
||||
#endif // PROPERTYEDITOR_H
|
||||
|
||||
@@ -17,13 +17,15 @@
|
||||
*/
|
||||
|
||||
#include "scene_tree.h"
|
||||
#include "ui_scene_tree.h"
|
||||
|
||||
#include "glcamera.h"
|
||||
#include "qglview.h"
|
||||
#include <QTreeWidget>
|
||||
#include <QScrollBar>
|
||||
#include "ui_scene_tree.h"
|
||||
|
||||
#include <QAction>
|
||||
#include <QEvent>
|
||||
#include <QScrollBar>
|
||||
#include <QTreeWidget>
|
||||
|
||||
enum Column {
|
||||
cName,
|
||||
@@ -67,11 +69,15 @@ SceneTree::SceneTree(QWidget * parent): QWidget(parent) {
|
||||
ui->treeObjects->addActions(actionsSelection());
|
||||
ui->treeObjects->addAction(newSeparator());
|
||||
ui->treeObjects->addActions(actionsAdd());
|
||||
ui->buttonFilter->addActions(QList<QAction*>() << ui->actionFilter_node << ui->actionFilter_mesh << ui->actionFilter_light << ui->actionFilter_camera);
|
||||
ui->buttonFilter->addActions(QList<QAction *>()
|
||||
<< ui->actionFilter_node << ui->actionFilter_mesh << ui->actionFilter_light << ui->actionFilter_camera);
|
||||
view = 0;
|
||||
hidden_by_filter = obj_count = 0;
|
||||
block_tree = false;
|
||||
connect(ui->treeObjects->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(treeObjects_selectionCnahged()));
|
||||
connect(ui->treeObjects->selectionModel(),
|
||||
SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
|
||||
this,
|
||||
SLOT(treeObjects_selectionCnahged()));
|
||||
}
|
||||
|
||||
|
||||
@@ -102,12 +108,9 @@ QList<QAction *> SceneTree::actionsAdd() {
|
||||
|
||||
QList<QAction *> SceneTree::actionsSelection() {
|
||||
QList<QAction *> ret;
|
||||
ret << ui->actionFocus << newSeparator()
|
||||
<< ui->actionGroup << ui->actionClone << newSeparator()
|
||||
<< ui->actionSelect_parent << ui->actionSelect_by_mesh << ui->actionSelect_by_material << newSeparator()
|
||||
<< ui->actionTransfer_transform_to_children << newSeparator()
|
||||
<< ui->actionActive_camera << ui->actionDefault_camera << newSeparator()
|
||||
<< ui->actionRemove;
|
||||
ret << ui->actionFocus << newSeparator() << ui->actionGroup << ui->actionClone << newSeparator() << ui->actionSelect_parent
|
||||
<< ui->actionSelect_by_mesh << ui->actionSelect_by_material << newSeparator() << ui->actionTransfer_transform_to_children
|
||||
<< newSeparator() << ui->actionActive_camera << ui->actionDefault_camera << newSeparator() << ui->actionRemove;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -129,8 +132,7 @@ void SceneTree::changeEvent(QEvent * e) {
|
||||
void SceneTree::rememberExpanded(QTreeWidgetItem * ti) {
|
||||
for (int i = 0; i < ti->childCount(); ++i) {
|
||||
QTreeWidgetItem * ci = ti->child(i);
|
||||
if (ci->isExpanded())
|
||||
expanded_ << itemObject(ci);
|
||||
if (ci->isExpanded()) expanded_ << itemObject(ci);
|
||||
rememberExpanded(ci);
|
||||
}
|
||||
}
|
||||
@@ -153,8 +155,7 @@ void SceneTree::makeObjetTree(ObjectBase * o, QTreeWidgetItem * ti) {
|
||||
ci->setText(cName, co->name());
|
||||
ci->setCheckState(cVis, co->isVisible() ? Qt::Checked : Qt::Unchecked);
|
||||
ci->setIcon(cVis, icon_vis[co->isVisible(true)]);
|
||||
if (co->material())
|
||||
ci->setText(cMaterial, co->material()->name);
|
||||
if (co->material()) ci->setText(cMaterial, co->material()->name);
|
||||
ci->setFlags(ci->flags() | Qt::ItemIsEditable);
|
||||
ObjectType t = otNode;
|
||||
switch (co->type()) {
|
||||
@@ -204,8 +205,7 @@ void SceneTree::selectionChanged() {
|
||||
block_tree = true;
|
||||
QList<QTreeWidgetItem *> il = ui->treeObjects->findItems("", Qt::MatchContains | Qt::MatchRecursive);
|
||||
const ObjectBase * fo = 0;
|
||||
if (view->selectedObjects().size() == 1)
|
||||
fo = view->selectedObject();
|
||||
if (view->selectedObjects().size() == 1) fo = view->selectedObject();
|
||||
foreach(QTreeWidgetItem * i, il) {
|
||||
ObjectBase * o = itemObject(i);
|
||||
i->setSelected(o->isSelected());
|
||||
@@ -222,8 +222,7 @@ void SceneTree::materialsChanged() {
|
||||
foreach(QTreeWidgetItem * i, geo_items) {
|
||||
ObjectBase * o = itemObject(i);
|
||||
if (!o) continue;
|
||||
if (o->material())
|
||||
i->setText(cMaterial, o->material()->name);
|
||||
if (o->material()) i->setText(cMaterial, o->material()->name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,11 +258,12 @@ bool SceneTree::filterTree(QTreeWidgetItem * ti, const QString & filter, int typ
|
||||
} else {
|
||||
f = f || cit.contains(filter, Qt::CaseInsensitive);
|
||||
}
|
||||
if ((types & t) != t)
|
||||
f = false;
|
||||
if ((types & t) != t) f = false;
|
||||
ci->setHidden(!f);
|
||||
if (f) ret = true;
|
||||
else ++hidden_by_filter;
|
||||
if (f)
|
||||
ret = true;
|
||||
else
|
||||
++hidden_by_filter;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@@ -370,8 +370,7 @@ void SceneTree::on_treeObjects_itemMoved(QTreeWidgetItem * item, QTreeWidgetItem
|
||||
view->scene()->rootObject()->addChild(co);
|
||||
} else {
|
||||
ObjectBase * po = itemObject(new_parent);
|
||||
if (po)
|
||||
po->addChild(co);
|
||||
if (po) po->addChild(co);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -458,8 +457,7 @@ void SceneTree::on_actionSelect_parent_triggered() {
|
||||
QSet<ObjectBase *> nsl;
|
||||
foreach(ObjectBase * o, sol) {
|
||||
ObjectBase * po = o->parent();
|
||||
if (po != view->scene()->rootObject())
|
||||
o = po;
|
||||
if (po != view->scene()->rootObject()) o = po;
|
||||
nsl << o;
|
||||
}
|
||||
view->scene()->selectObjects(nsl.values());
|
||||
|
||||
@@ -19,19 +19,20 @@
|
||||
#ifndef SCENE_TREE_H
|
||||
#define SCENE_TREE_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QIcon>
|
||||
#include "glscene.h"
|
||||
|
||||
#include <QIcon>
|
||||
#include <QWidget>
|
||||
|
||||
class QTreeWidgetItem;
|
||||
|
||||
namespace Ui {
|
||||
class SceneTree;
|
||||
}
|
||||
|
||||
class SceneTree: public QWidget
|
||||
{
|
||||
class SceneTree: public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
SceneTree(QWidget * parent = 0);
|
||||
~SceneTree();
|
||||
@@ -95,7 +96,6 @@ public slots:
|
||||
signals:
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif // SCENE_TREE_H
|
||||
|
||||
@@ -19,15 +19,15 @@
|
||||
#ifndef TREEWIDGET_H
|
||||
#define TREEWIDGET_H
|
||||
|
||||
#include <QTreeWidget>
|
||||
#include <QDropEvent>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
#include <QDropEvent>
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QTimer>
|
||||
#include <QTreeWidget>
|
||||
|
||||
class InternalMoveTreeWidget: public QTreeWidget
|
||||
{
|
||||
class InternalMoveTreeWidget: public QTreeWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
InternalMoveTreeWidget(QWidget * parent = 0): QTreeWidget(parent) {}
|
||||
|
||||
@@ -46,7 +46,6 @@ protected:
|
||||
|
||||
signals:
|
||||
void itemMoved(QTreeWidgetItem * item, QTreeWidgetItem * new_parent, int new_index);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
*/
|
||||
|
||||
#include "view_editor.h"
|
||||
|
||||
#include "ui_view_editor.h"
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <colorbutton.h>
|
||||
#include <spinslider.h>
|
||||
@@ -64,11 +66,8 @@ void ViewEditor::assignQGLView(QGLView * v) {
|
||||
void ViewEditor::changeEvent(QEvent * e) {
|
||||
QWidget::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case QEvent::LanguageChange: ui->retranslateUi(this); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,7 +160,6 @@ void ViewEditor::on_checkService_clicked(bool val) {
|
||||
void ViewEditor::on_checkCameraLight_stateChanged(int s) {
|
||||
if (!view || !active) return;
|
||||
view->setCameraLightMode((QGLView::CameraLightMode)s);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -205,4 +203,3 @@ void ViewEditor::on_checkVSync_clicked(bool val) {
|
||||
if (!view || !active) return;
|
||||
view->setVSync(val);
|
||||
}
|
||||
|
||||
|
||||
@@ -19,16 +19,17 @@
|
||||
#ifndef VIEW_EDITOR_H
|
||||
#define VIEW_EDITOR_H
|
||||
|
||||
#include <QWidget>
|
||||
#include "qglview.h"
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class ViewEditor;
|
||||
}
|
||||
|
||||
class ViewEditor: public QWidget
|
||||
{
|
||||
class ViewEditor: public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ViewEditor(QWidget * parent = 0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user