SVG5/qopenglbufferbase.cpp
2025-10-12 13:55:56 +09:00

174 lines
4.6 KiB
C++

#include "qopenglbufferbase.h"
using namespace SOPENGL;
QOpenGLBufferBase::QOpenGLBufferBase(QOpenGLContext *pContext, QSurfaceFormat surfaceformat, QObject *parent):
QObject(parent), m_SurfaceFormatParent(surfaceformat), m_pContext(pContext)
{
m_pShaderThumbnail = new QGLSLShader;
int i=0;
for(i=0 ; i<18 ; i++)
{
m_fNormalRect[i] = -1;
}
GLfloat afTexCoord[] = {
0.0f,1.0f, 1.0f,1.0f, 0.0f,0.0f,
1.0f,0.0f, 0.0f,0.0f, 1.0f,1.0f
};
memcpy(m_fNormalRectTexture, afTexCoord, sizeof(GLfloat)*2*6);
}
QOpenGLBufferBase::~QOpenGLBufferBase()
{
}
void QOpenGLBufferBase::initializeGL()
{
m_pFBO = new QOpenGLFramebufferObject(m_rectDisplay.width(), m_rectDisplay.height(), QOpenGLFramebufferObject::CombinedDepthStencil, GL_TEXTURE_2D, (int)QOpenGLTexture::RGBA8_UNorm);
m_pOffScreen = new QOffscreenSurface();
m_pOffScreen->setFormat(m_SurfaceFormatParent);
m_pOffScreen->create();
char *pSrcVertex =
"#version 300 es\n"
"attribute highp vec4 vertex;\n"
"attribute highp vec4 texCoord;\n"
"uniform mediump mat4 matrix;\n"
"varying highp vec4 texc;\n"
"void main(void)\n"
"{\n"
" gl_Position = matrix * vertex;\n"
" texc = texCoord;\n"
"}\n";
char *pSrcFragment =
"#version 300 es\n"
"in highp vec4 texc;\n"
"uniform sampler2D tex;\n"
"uniform lowp int nImageWidth;\n"
"uniform lowp int nImageHeight;\n"
"uniform lowp int nDisplayType;\n"
"out lowp vec4 FragColor;\n"
"void main(void)\n"
"{\n"
" lowp vec4 color = texture2D(tex, texc.st);\n"
" FragColor = vec4(color);\n"
"}\n";
m_pShaderThumbnail->CreateShader((const char*)pSrcVertex, (const char*)pSrcFragment);
if (!m_VBOThumbnail.isCreated()) {
MakeRectNormal(m_rectDisplay, QSize(1920, 1080));
m_VBOThumbnail.create();
m_VBOThumbnail.bind();
m_VBOThumbnail.allocate(6 * 5 * sizeof(GLfloat));
m_VBOThumbnail.write(0, m_fNormalRect, 6*3*sizeof(GLfloat));
m_VBOThumbnail.write(6*3*sizeof(GLfloat), m_fNormalRectTexture, 6*2*sizeof(GLfloat));
//m_VBOVideo.write(6*5*sizeof(GLfloat), afNormals, 6*3*sizeof(GLfloat));
m_VBOThumbnail.release();
}
}
float QOpenGLBufferBase::MakeNormalize(int nPos, int nRange)
{
float fData = 0.0f;
//fData = (float)(nPos-nRange/2.0)/(float)(nRange/2.0);
fData = (float)nPos/(float)(nRange/2) - 1.0f;
return fData;
}
void QOpenGLBufferBase::MakeRectNormal(const QRect &rect, QSize rectSize)
{
float fLeft = MakeNormalize(rect.left(), rectSize.width());
float fTop = MakeNormalize(rect.top(), rectSize.height()) * -1.0f;
float fRight = MakeNormalize(rect.right(), rectSize.width());
float fBottom = MakeNormalize(rect.bottom(), rectSize.height()) * -1.0f;
//lefttop
m_fNormalRect[0] = fLeft;
m_fNormalRect[1] = fBottom;
//righttop
m_fNormalRect[3] = fRight;
m_fNormalRect[4] = fBottom;
//leftbottom
m_fNormalRect[6] = fLeft;
m_fNormalRect[7] = fTop;
//rightbottom
m_fNormalRect[9] = fRight;
m_fNormalRect[10] = fTop;
//leftbottom
m_fNormalRect[12] = fLeft;
m_fNormalRect[13] = fTop;
//righttop
m_fNormalRect[15] = fRight;
m_fNormalRect[16] = fBottom;
}
void QOpenGLBufferBase::MakeRectNormalFlip(const QRect &rect, QSize rectSize)
{
float fLeft = MakeNormalize(rect.left(), rectSize.width());
float fTop = MakeNormalize(rect.top(), rectSize.height()) * 1.0f;
float fRight = MakeNormalize(rect.right(), rectSize.width());
float fBottom = MakeNormalize(rect.bottom(), rectSize.height()) * 1.0f;
//lefttop
m_fNormalRect[0] = fLeft;
m_fNormalRect[1] = fBottom;
//righttop
m_fNormalRect[3] = fRight;
m_fNormalRect[4] = fBottom;
//leftbottom
m_fNormalRect[6] = fLeft;
m_fNormalRect[7] = fTop;
//rightbottom
m_fNormalRect[9] = fRight;
m_fNormalRect[10] = fTop;
//leftbottom
m_fNormalRect[12] = fLeft;
m_fNormalRect[13] = fTop;
//righttop
m_fNormalRect[15] = fRight;
m_fNormalRect[16] = fBottom;
}
void QOpenGLBufferBase::MakeRectNormalWithOffset(const QRect &rect, QSize rectSize, QSize rectOffset)
{
QRect rectNormal;
int nX = 0;
int nY = 0;
int nWidth = 0;
int nHeight = 0;
nX = rect.left() - rectOffset.width();
nY = rect.top() - rectOffset.height();
nWidth = rect.width();
nHeight = rect.height();
rectNormal = QRect(nX, nY, nWidth, nHeight);
MakeRectNormalFlip(rectNormal, rectSize);
}