123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- #include "MandelWidget.h"
- #include <QOpenGLVertexArrayObject>
- Texture::Texture(const Bitmap<RGBColor>& bitmap)
- {
- glGenTextures(1, &id);
- glBindTexture(GL_TEXTURE_2D, id);
- long lineLength = (bitmap.width * 3 + 3) & ~3;
- unsigned char* pixels = new unsigned char[lineLength * bitmap.height];
- for (int i = 0; i < bitmap.width; i++) {
- for (int j = 0; j < bitmap.height; j++) {
- int index = i * 3 + j * lineLength;
- RGBColor c = bitmap.get(i, j);
- pixels[index] = c.r;
- pixels[index + 1] = c.g;
- pixels[index + 2] = c.b;
- }
- }
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, int(bitmap.width), int(bitmap.height), 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- }
- Texture::~Texture(void)
- {
- glDeleteTextures(1, &id);
- }
- void Texture::bind(void) const
- {
- glBindTexture(GL_TEXTURE_2D, id);
- }
- void Texture::drawRect(float x, float y, float width, float height)
- {
- glColor3ub(255, 255, 255);
- glEnable(GL_TEXTURE_2D);
- bind();
- glBegin(GL_TRIANGLE_STRIP);
- glTexCoord2f(0, 0);
- glVertex2f(x, y);
- glTexCoord2f(1, 0);
- glVertex2f(x + width, y);
- glTexCoord2f(0, 1);
- glVertex2f(x, y + height);
- glTexCoord2f(1, 1);
- glVertex2f(x + width, y + height);
- glEnd();
- glDisable(GL_TEXTURE_2D);
- }
- MandelWidget::MandelWidget(QWidget* parent) :
- QGLWidget{ QGLFormat(QGL::SampleBuffers), parent }
- {
- this->setContentsMargins(0, 0, 0, 0);
- this->setSizePolicy(QSizePolicy::Expanding,
- QSizePolicy::Expanding);
- }
- MandelWidget::~MandelWidget()
- {
- }
- void MandelWidget::initializeGL(void)
- {
- qglClearColor(Qt::black);
- glDisable(GL_DEPTH_TEST);
- //glShadeModel(GL_SMOOTH);
- /*CpuGenerator<double> cpg;
- MandelInfo mi;
- mi.bWidth = this->width();//ql.geometry().width();
- mi.bHeight = this->height(); //ql.geometry().height();
- mi.maxIter = 250;
- mi.view = viewport;
- auto bitmap = cpg.generate(mi);*/
- Bitmap<RGBColor> bitmap(1, 1);
- bitmap.get(0, 0) = RGBColor{5, 150, 50};
- tex = std::make_unique<Texture>(bitmap);
- }
- void MandelWidget::paintGL(void)
- {
- int width = this->width();
- int height = this->height();
- CpuGenerator<double> cpg;
- ClGenerator clg;
- MandelGenerator& mg = cpg;
- MandelInfo mi;
- mi.bWidth = width; //ql.geometry().width();
- mi.bHeight = height; //ql.geometry().height();
- mi.maxIter = 5000;
- mi.view = viewport;
- //auto bitmap = mg.generate(mi);
- Bitmap<RGBColor> bitmap(1000, 1000);
- for (int i = 0; i < 1000 * 1000; i++)
- bitmap.pixels[i] = RGBColor{5, uint8_t((i % 1000) ^ (i / 1000)), 50};
- tex = std::make_unique<Texture>(bitmap);
- glViewport(0, 0, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- #ifdef QT_OPENGL_ES_1
- glOrthof(0, width, height, 0, -1.0, 1.0);
- #else
- glOrtho(0, width, height, 0, -1.0, 1.0);
- #endif
- glMatrixMode(GL_MODELVIEW);
- glClear(GL_COLOR_BUFFER_BIT);
- glLoadIdentity();
- tex->drawRect(0, 0, width, height);
- drawRubberband();
- printf("omg\n");
- }
- void MandelWidget::drawRubberband(void)
- {
- glColor3ub(10, 200, 10);
- glBegin(GL_LINE_LOOP);
- glVertex2d(rubberband.x(), rubberband.y());
- glVertex2d(rubberband.right(), rubberband.y());
- glVertex2d(rubberband.right(), rubberband.bottom());
- glVertex2d(rubberband.x(), rubberband.bottom());
- glEnd();
- }
- void MandelWidget::resizeGL(int width, int height)
- {
- }
- void MandelWidget::redraw(void)
- {
- /*CpuGenerator<double> cpg;
- MandelInfo mi;
- mi.bWidth = this->geometry().width();//ql.geometry().width();
- mi.bHeight = this->geometry().height(); //ql.geometry().height();
- mi.maxIter = 250;
- mi.view = viewport;*/
- update();
- //auto bitmap = cpg.generate(mi).map<uint32_t>([](RGBColor rgb) { return 255 << 24 | rgb.b << 16 | rgb.g << 8 | rgb.r; });
- }
- void MandelWidget::resizeEvent(QResizeEvent* re)
- {
- double aspect = double(geometry().width()) / geometry().height();
- //if (viewport.width > viewport.height * aspect)
- viewport.height = (viewport.width / aspect);
- //else
- // viewport.width = (viewport.height * aspect);
-
- redraw();
- }
- void MandelWidget::mousePressEvent(QMouseEvent* me)
- {
- rubberband.setCoords(me->x(), me->y(), 0, 0);
- }
- void MandelWidget::mouseMoveEvent(QMouseEvent* me)
- {
- QRectF& rect = rubberband;
- float aspect = float(geometry().width()) / geometry().height();
- rect.setBottomRight(QPoint(me->x(), me->y()));
- if (rect.width() > rect.height() * aspect)
- rect.setHeight(rect.width() / aspect);
- else
- rect.setWidth(rect.height() * aspect);
- }
- void MandelWidget::mouseReleaseEvent(QMouseEvent* me)
- {
- QRect rect = rubberband.toRect();
- QRect full = this->geometry();
- viewport.x += double(rect.left()) * viewport.width / full.width();
- viewport.y += double(rect.top()) * viewport.height / full.height();
- viewport.width *= double(rect.width()) / full.width();
- viewport.height *= double(rect.height()) / full.height();
- redraw();
- }
|