#include "PCH.h"
#include "OpenGLWidget.h"
#include <Events/EventManager.h>
#include <Events/SettingsEvent.h>
#include <Logger/Logger.h>
using namespace MCRendererEngine;
using namespace std;
namespace Widgets
{
OpenGLWidget::OpenGLWidget(QWidget* parent)
: QGLWidget(parent)
{
//Register event listener
Event::AddListener(this, &OpenGLWidget::OnArnoldResolutionChanged, SettingsEvent::c_iEventType);
}
void OpenGLWidget::initializeGL()
{
//initializeGLFunctions();
glewInit();
glEnable(GL_TEXTURE_2D);
glGenBuffersARB(1, &m_uPBO);
glGenTextures(1, &m_uTexture);
}
void OpenGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, m_uTexture);
glBegin(GL_QUADS);
{
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0f, width());
glTexCoord2f(0.0f, m_iArnoldHeight);
glVertex2f(0.0f, 0.0f);
glTexCoord2f(m_iArnoldWidth, m_iArnoldHeight);
glVertex2f(width(), 0.0f);
glTexCoord2f(m_iArnoldWidth, 0.0f);
glVertex2f(width(), height());
}
glEnd();
}
void OpenGLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, (GLint)w, (GLint)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
glOrtho((GLfloat)0, (GLfloat)w, (GLfloat)0, (GLfloat)h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
void OpenGLWidget::OnArnoldResolutionChanged(MCRendererEngine::IEventDataPtr p_pEvent)
{
auto pEvent = static_pointer_cast<SettingsEvent>(p_pEvent);
ASSERT(pEvent != nullptr);
if (pEvent->GetSettingsName() == SettingsEvent::c_sArnoldResolution)
{
//We should change texture resolution here
//Creates our buffer
pEvent->GetParams() >> m_iArnoldWidth;
pEvent->GetParams() >> m_iArnoldHeight;
float* data = new float[m_iArnoldWidth *m_iArnoldHeight * 4];
for (int i = 0; i < m_iArnoldWidth *m_iArnoldHeight * 4; ++i)
{
data[i] = 1.0f;
}
//glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_uPBO);
//glBufferData(GL_PIXEL_UNPACK_BUFFER, m_iArnoldWidth * m_iArnoldHeight * 4 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glBindTexture(GL_TEXTURE_2D, m_uTexture);
glTexImage2D(GL_TEXTURE_2D, 0, 3, m_iArnoldWidth, m_iArnoldHeight, 0, GL_RGBA, GL_FLOAT, data);
int size = 32;
float* dataf = new float[size * size * 4];
for (int i = 0; i < size * size * 4; ++i)
{
dataf[i] = 0.6f;
}
//glBindTexture(GL_TEXTURE_2D, m_uTexture);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, size, size, GL_RGBA, GL_FLOAT, dataf);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
}
void OpenGLWidget::RenderBucketSlot(int x, int y, int w, int h, const void* data)
{
//const AtRGBA* pArnoldPixels = static_cast<const AtRGBA*>(data);
/*glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_uPBO);
GLfloat* pPBOData = (GLfloat*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
if (pPBOData != nullptr)
{
for (int i = 0; i < h; ++i)
{
for (int j = 0; j < w; ++j)
{
const AtRGBA& pixel = pArnoldPixels[i * w + j];
pPBOData[((y + i)* m_iArnoldWidth + j + x) * sizeof(float)+0] = pixel.r;
pPBOData[((y + i)* m_iArnoldWidth + j + x) * sizeof(float)+1] = pixel.g;
pPBOData[((y + i)* m_iArnoldWidth + j + x) * sizeof(float)+2] = pixel.b;
pPBOData[((y + i)* m_iArnoldWidth + j + x) * sizeof(float)+3] = pixel.a;
}
}
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
}
//Copy data from PBO to our texture*/
/*int size = 64;
float* dataf = new float[size * size * 4];
for (int i = 0; i < size * size * 4; ++i)
{
dataf[i] = 0.6f;
}
glBindTexture(GL_TEXTURE_2D, m_uTexture);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, size, size, GL_BGRA, GL_FLOAT, dataf);
*/
//Redraw content
updateGL();
}
}
I2luY2x1ZGUgIlBDSC5oIgojaW5jbHVkZSAiT3BlbkdMV2lkZ2V0LmgiCiNpbmNsdWRlIDxFdmVudHMvRXZlbnRNYW5hZ2VyLmg+CiNpbmNsdWRlIDxFdmVudHMvU2V0dGluZ3NFdmVudC5oPgojaW5jbHVkZSA8TG9nZ2VyL0xvZ2dlci5oPgoKdXNpbmcgbmFtZXNwYWNlIE1DUmVuZGVyZXJFbmdpbmU7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpuYW1lc3BhY2UgV2lkZ2V0cwp7CglPcGVuR0xXaWRnZXQ6Ok9wZW5HTFdpZGdldChRV2lkZ2V0KiBwYXJlbnQpCgkJOiBRR0xXaWRnZXQocGFyZW50KQoJewoJCS8vUmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXIKCQlFdmVudDo6QWRkTGlzdGVuZXIodGhpcywgJk9wZW5HTFdpZGdldDo6T25Bcm5vbGRSZXNvbHV0aW9uQ2hhbmdlZCwgU2V0dGluZ3NFdmVudDo6Y19pRXZlbnRUeXBlKTsKCX0KCgl2b2lkIE9wZW5HTFdpZGdldDo6aW5pdGlhbGl6ZUdMKCkKCXsKCQkvL2luaXRpYWxpemVHTEZ1bmN0aW9ucygpOwoJCWdsZXdJbml0KCk7CgkJZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CgoJCWdsR2VuQnVmZmVyc0FSQigxLCAmbV91UEJPKTsKCQlnbEdlblRleHR1cmVzKDEsICZtX3VUZXh0dXJlKTsKCX0KCgl2b2lkIE9wZW5HTFdpZGdldDo6cGFpbnRHTCgpCgl7CQoJCWdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOwoJCWdsTG9hZElkZW50aXR5KCk7CgoJCWdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV91VGV4dHVyZSk7CgoJCWdsQmVnaW4oR0xfUVVBRFMpOwoJCXsKCQkJZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwoJCQlnbFZlcnRleDJmKDAuMGYsIHdpZHRoKCkpOwoJCQlnbFRleENvb3JkMmYoMC4wZiwgbV9pQXJub2xkSGVpZ2h0KTsKCQkJZ2xWZXJ0ZXgyZigwLjBmLCAwLjBmKTsKCQkJZ2xUZXhDb29yZDJmKG1faUFybm9sZFdpZHRoLCBtX2lBcm5vbGRIZWlnaHQpOwoJCQlnbFZlcnRleDJmKHdpZHRoKCksIDAuMGYpOwoJCQlnbFRleENvb3JkMmYobV9pQXJub2xkV2lkdGgsIDAuMGYpOwoJCQlnbFZlcnRleDJmKHdpZHRoKCksIGhlaWdodCgpKTsKCQl9CgkJZ2xFbmQoKTsKCX0KCgl2b2lkIE9wZW5HTFdpZGdldDo6cmVzaXplR0woaW50IHcsIGludCBoKQoJewoJCWdsVmlld3BvcnQoMCwgMCwgKEdMaW50KXcsIChHTGludCloKTsKCQlnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CgkJZ2xMb2FkSWRlbnRpdHkoKTsKCQkvL2dsRnJ1c3R1bSgtMS4wLCAxLjAsIC0xLjAsIDEuMCwgNS4wLCAxNS4wKTsKCQlnbE9ydGhvKChHTGZsb2F0KTAsIChHTGZsb2F0KXcsIChHTGZsb2F0KTAsIChHTGZsb2F0KWgsIC0xLjAsIDEuMCk7CgkJZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Cgl9CgoJdm9pZCBPcGVuR0xXaWRnZXQ6Ok9uQXJub2xkUmVzb2x1dGlvbkNoYW5nZWQoTUNSZW5kZXJlckVuZ2luZTo6SUV2ZW50RGF0YVB0ciBwX3BFdmVudCkKCXsKCQlhdXRvIHBFdmVudCA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8U2V0dGluZ3NFdmVudD4ocF9wRXZlbnQpOwoJCUFTU0VSVChwRXZlbnQgIT0gbnVsbHB0cik7CgkJaWYgKHBFdmVudC0+R2V0U2V0dGluZ3NOYW1lKCkgPT0gU2V0dGluZ3NFdmVudDo6Y19zQXJub2xkUmVzb2x1dGlvbikKCQl7CgkJCS8vV2Ugc2hvdWxkIGNoYW5nZSB0ZXh0dXJlIHJlc29sdXRpb24gaGVyZQoJCQkvL0NyZWF0ZXMgb3VyIGJ1ZmZlcgoJCQlwRXZlbnQtPkdldFBhcmFtcygpID4+IG1faUFybm9sZFdpZHRoOwoJCQlwRXZlbnQtPkdldFBhcmFtcygpID4+IG1faUFybm9sZEhlaWdodDsKCgkJCWZsb2F0KiBkYXRhID0gbmV3IGZsb2F0W21faUFybm9sZFdpZHRoICptX2lBcm5vbGRIZWlnaHQgKiA0XTsKCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgbV9pQXJub2xkV2lkdGggKm1faUFybm9sZEhlaWdodCAqIDQ7ICsraSkKCQkJewoJCQkJZGF0YVtpXSA9IDEuMGY7CgkJCX0KCgkJCS8vZ2xCaW5kQnVmZmVyKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIsIG1fdVBCTyk7CgkJCS8vZ2xCdWZmZXJEYXRhKEdMX1BJWEVMX1VOUEFDS19CVUZGRVIsIG1faUFybm9sZFdpZHRoICogbV9pQXJub2xkSGVpZ2h0ICogNCAqIHNpemVvZihmbG9hdCksIG51bGxwdHIsIEdMX0RZTkFNSUNfRFJBVyk7CgkJCWdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV91VGV4dHVyZSk7CgkJCWdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAzLCBtX2lBcm5vbGRXaWR0aCwgbV9pQXJub2xkSGVpZ2h0LCAwLCBHTF9SR0JBLCBHTF9GTE9BVCwgZGF0YSk7CgoJCQlpbnQgc2l6ZSA9IDMyOwoJCQlmbG9hdCogZGF0YWYgPSBuZXcgZmxvYXRbc2l6ZSAqIHNpemUgKiA0XTsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplICogc2l6ZSAqIDQ7ICsraSkKCQkJewoJCQkJZGF0YWZbaV0gPSAwLjZmOwoJCQl9CgkJCS8vZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3VUZXh0dXJlKTsKCQkJZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIHNpemUsIHNpemUsIEdMX1JHQkEsIEdMX0ZMT0FULCBkYXRhZik7CgkJCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CgkJCWdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CgkJfQoJfQoKCXZvaWQgT3BlbkdMV2lkZ2V0OjpSZW5kZXJCdWNrZXRTbG90KGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBjb25zdCB2b2lkKiBkYXRhKQoJewoJCS8vY29uc3QgQXRSR0JBKiBwQXJub2xkUGl4ZWxzID0gc3RhdGljX2Nhc3Q8Y29uc3QgQXRSR0JBKj4oZGF0YSk7CgkJLypnbEJpbmRCdWZmZXIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUiwgbV91UEJPKTsKCQlHTGZsb2F0KiBwUEJPRGF0YSA9IChHTGZsb2F0KilnbE1hcEJ1ZmZlcihHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSLCBHTF9XUklURV9PTkxZKTsKCQkKCQlpZiAocFBCT0RhdGEgIT0gbnVsbHB0cikKCQl7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgaDsgKytpKQoJCQl7CgkJCQlmb3IgKGludCBqID0gMDsgaiA8IHc7ICsraikKCQkJCXsKCQkJCQljb25zdCBBdFJHQkEmIHBpeGVsID0gcEFybm9sZFBpeGVsc1tpICogdyArIGpdOwoJCQkJCXBQQk9EYXRhWygoeSArIGkpKiBtX2lBcm5vbGRXaWR0aCArIGogKyB4KSAqIHNpemVvZihmbG9hdCkrMF0gPSBwaXhlbC5yOwoJCQkJCXBQQk9EYXRhWygoeSArIGkpKiBtX2lBcm5vbGRXaWR0aCArIGogKyB4KSAqIHNpemVvZihmbG9hdCkrMV0gPSBwaXhlbC5nOwoJCQkJCXBQQk9EYXRhWygoeSArIGkpKiBtX2lBcm5vbGRXaWR0aCArIGogKyB4KSAqIHNpemVvZihmbG9hdCkrMl0gPSBwaXhlbC5iOwoJCQkJCXBQQk9EYXRhWygoeSArIGkpKiBtX2lBcm5vbGRXaWR0aCArIGogKyB4KSAqIHNpemVvZihmbG9hdCkrM10gPSBwaXhlbC5hOwoJCQkJfQoJCQl9CgkJCWdsVW5tYXBCdWZmZXIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUik7CgkJfQoKCQkvL0NvcHkgZGF0YSBmcm9tIFBCTyB0byBvdXIgdGV4dHVyZSovCgkJLyppbnQgc2l6ZSA9IDY0OwoJCWZsb2F0KiBkYXRhZiA9IG5ldyBmbG9hdFtzaXplICogc2l6ZSAqIDRdOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAqIHNpemUgKiA0OyArK2kpCgkJewoJCQlkYXRhZltpXSA9IDAuNmY7CgkJfQoJCWdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV91VGV4dHVyZSk7CgkJZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIHNpemUsIHNpemUsIEdMX0JHUkEsIEdMX0ZMT0FULCBkYXRhZik7CgkJKi8KCQkvL1JlZHJhdyBjb250ZW50CgkJdXBkYXRlR0woKTsKCX0KfQ==