#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <vcl/opengl/OpenGLHelper.hxx>
+#include <vcl/opengl/OpenGLContext.hxx>
#include <algorithm>
#include <array>
return indices;
}
-bool OGLTransitionImpl::prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex )
+bool OGLTransitionImpl::prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext )
{
m_nProgramObject = makeShader();
if (!m_nProgramObject)
glBindBuffer(GL_ARRAY_BUFFER, 0);
CHECK_GL_ERROR();
- prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
+ prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
return true;
}
{
}
-void OGLTransitionImpl::prepareTransition( sal_Int32, sal_Int32 )
+void OGLTransitionImpl::prepareTransition( sal_Int32, sal_Int32, OpenGLContext* )
{
}
{
}
-void OGLTransitionImpl::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale )
+void OGLTransitionImpl::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
{
CHECK_GL_ERROR();
applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
}
void OGLTransitionImpl::display( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
- double SlideWidth, double SlideHeight, double DispWidth, double DispHeight )
+ double SlideWidth, double SlideHeight, double DispWidth, double DispHeight, OpenGLContext *pContext )
{
const double SlideWidthScale = SlideWidth/DispWidth;
const double SlideHeightScale = SlideHeight/DispHeight;
prepare( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
CHECK_GL_ERROR();
- displaySlides_( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale );
+ displaySlides_( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale, pContext );
CHECK_GL_ERROR();
displayScene( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
CHECK_GL_ERROR();
const sal_Int32 glSlideTex, const Primitives_t& primitives,
double SlideWidthScale, double SlideHeightScale )
{
- CHECK_GL_ERROR();
- glPushMatrix();
CHECK_GL_ERROR();
glBindTexture(GL_TEXTURE_2D, glSlideTex);
CHECK_GL_ERROR();
CHECK_GL_ERROR();
glBindBuffer(GL_ARRAY_BUFFER, m_nVertexBufferObject);
CHECK_GL_ERROR();
- glPopMatrix();
- CHECK_GL_ERROR();
}
void OGLTransitionImpl::displayScene( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight )
CHECK_GL_ERROR();
}
- glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLuint nVertexArrayObject;
+ glGenVertexArrays(1, &nVertexArrayObject);
+ CHECK_GL_ERROR();
+ glBindVertexArray(nVertexArrayObject);
+ CHECK_GL_ERROR();
+
+ GLuint nBuffer;
+ glGenBuffers(1, &nBuffer);
CHECK_GL_ERROR();
- glEnableClientState( GL_VERTEX_ARRAY );
+ glBindBuffer(GL_ARRAY_BUFFER, nBuffer);
CHECK_GL_ERROR();
- glVertexPointer( 3, GL_FLOAT, sizeof(Vertex), &Vertices[0] );
+ glBufferData(GL_ARRAY_BUFFER, getVerticesSize(), Vertices.data(), GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray(0);
+ CHECK_GL_ERROR();
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), nullptr);
+
CHECK_GL_ERROR();
glDrawArrays( GL_TRIANGLES, 0, Vertices.size() );
CHECK_GL_ERROR();
- glPopClientAttrib();
+
+ glDeleteBuffers(1, &nBuffer);
+ CHECK_GL_ERROR();
+
+ glDeleteVertexArrays(1, &nVertexArrayObject);
CHECK_GL_ERROR();
}
private:
virtual GLuint makeShader() const override;
- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
+ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
- virtual void prepareTransition( sal_Int32, sal_Int32 ) override {
+ virtual void prepareTransition( sal_Int32, sal_Int32, OpenGLContext* ) override {
glDisable(GL_CULL_FACE);
}
}
void ReflectionTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
- double SlideWidthScale, double SlideHeightScale )
+ double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
{
CHECK_GL_ERROR();
applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
private:
virtual GLuint makeShader() const override;
- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
+ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
};
GLuint SimpleTransition::makeShader() const
}
void SimpleTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
- double SlideWidthScale, double SlideHeightScale )
+ double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
{
CHECK_GL_ERROR();
applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
{}
private:
- virtual void displaySlides_(double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale) override;
+ virtual void displaySlides_(double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext) override;
};
-void RochadeTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale )
+void RochadeTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
{
applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
{}
private:
- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
+ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
Primitives_t makeLeavingSlide(double nTime) const;
};
void DiamondTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
- double SlideWidthScale, double SlideHeightScale )
+ double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
{
CHECK_GL_ERROR();
applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
{}
virtual void finishTransition() override;
- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
+ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
private:
/** various data */
CHECK_GL_ERROR();
}
-void PermTextureTransition::prepareTransition( sal_Int32, sal_Int32 )
+void PermTextureTransition::prepareTransition( sal_Int32, sal_Int32, OpenGLContext* )
{
CHECK_GL_ERROR();
GLint location = glGetUniformLocation( m_nProgramObject, "permTexture" );
private:
virtual void finishTransition() override;
virtual GLuint makeShader() const override;
- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
+ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
+ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
GLint mnSlideLocation = -1;
GLint mnTileInfoLocation = -1;
-glm::dot(s, eye), -glm::dot(u, eye), glm::dot(f, eye), 1);
}
-void VortexTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex )
+void VortexTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext )
{
CHECK_GL_ERROR();
- PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
+ PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
CHECK_GL_ERROR();
mnSlideLocation = glGetUniformLocation(m_nProgramObject, "slide");
}
}
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ pContext->restoreDefaultFramebuffer();
glBindTexture(GL_TEXTURE_2D, 0);
glActiveTexture( GL_TEXTURE2 );
glActiveTexture( GL_TEXTURE0 );
}
-void VortexTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale )
+void VortexTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext * pContext )
{
CHECK_GL_ERROR();
applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale );
glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ pContext->restoreDefaultFramebuffer();
glUniform1f( mnShadowLocation, 0.0 );
glUniform1f( mnSlideLocation, 0.0 );
displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
private:
virtual GLuint makeShader() const override;
- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
+ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
virtual void prepare( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) override;
glm::vec2 maCenter;
return OpenGLHelper::LoadShaders( "basicVertexShader", "rippleFragmentShader" );
}
-void RippleTransition::prepareTransition( sal_Int32, sal_Int32 )
+void RippleTransition::prepareTransition( sal_Int32, sal_Int32, OpenGLContext* )
{
GLint nCenterLocation = glGetUniformLocation(m_nProgramObject, "center");
CHECK_GL_ERROR();
private:
virtual GLuint makeShader() const override;
- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
+ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
virtual void finish( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) override;
GLuint maBuffer = 0;
GLfloat x, y, z;
};
-void GlitterTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex )
+void GlitterTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext )
{
CHECK_GL_ERROR();
- PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
+ PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
CHECK_GL_ERROR();
GLint nNumTilesLocation = glGetUniformLocation(m_nProgramObject, "numTiles");
private:
virtual void finishTransition() override;
virtual GLuint makeShader() const override;
- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
+ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
+ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
GLint maHexagonSizeLocation = -1;
GLint maSelectedTextureLocation = -1;
return OpenGLHelper::LoadShaders( "honeycombVertexShader", "honeycombFragmentShader", "honeycombGeometryShader" );
}
-void HoneycombTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex )
+void HoneycombTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext )
{
CHECK_GL_ERROR();
- PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
+ PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
CHECK_GL_ERROR();
maHexagonSizeLocation = glGetUniformLocation(m_nProgramObject, "hexagonSize");
return;
}
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ pContext->restoreDefaultFramebuffer();
}
void HoneycombTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
- double SlideWidthScale, double SlideHeightScale )
+ double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext )
{
CHECK_GL_ERROR();
applyOverallOperations(nTime, SlideWidthScale, SlideHeightScale);
// The back (entering) slide needs to be drawn before the front (leaving) one in order for blending to work.
glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ pContext->restoreDefaultFramebuffer();
glUniform1f(mnShadowLocation, 0.0);
glUniform1f(maSelectedTextureLocation, 0.0);
glUniform1f(maHexagonSizeLocation, 1.0f - borderSize);
return Reference< XInterface >( static_cast<cppu::OWeakObject *>(new GtkDragSource()) );
}
+class GtkOpenGLContext : public OpenGLContext
+{
+ GLWindow m_aGLWin;
+ GtkWidget *m_pGLArea;
+
+public:
+ GtkOpenGLContext()
+ : OpenGLContext()
+ , m_pGLArea(nullptr)
+ {
+ }
+
+ virtual bool initWindow() override
+ {
+ if( !m_pChildWindow )
+ {
+ SystemWindowData winData = generateWinData(mpWindow, mbRequestLegacyContext);
+ m_pChildWindow = VclPtr<SystemChildWindow>::Create(mpWindow, 0, &winData, false);
+ }
+
+ if (m_pChildWindow)
+ {
+ InitChildWindow(m_pChildWindow.get());
+ }
+
+ return true;
+ }
+
+private:
+ virtual const GLWindow& getOpenGLWindow() const override { return m_aGLWin; }
+ virtual GLWindow& getModifiableOpenGLWindow() override { return m_aGLWin; }
+
+ static void signalDestroy(GtkWidget*, gpointer context)
+ {
+ GtkOpenGLContext* pThis = static_cast<GtkOpenGLContext*>(context);
+ pThis->m_pGLArea = nullptr;
+ }
+
+ virtual bool ImplInit() override
+ {
+#if GTK_CHECK_VERSION(3,16,0)
+ const SystemEnvData* pEnvData = m_pChildWindow->GetSystemData();
+ GtkWidget *pParent = static_cast<GtkWidget*>(pEnvData->pWidget);
+ m_pGLArea = gtk_gl_area_new();
+ g_signal_connect(G_OBJECT(m_pGLArea), "destroy", G_CALLBACK(signalDestroy), this);
+ gtk_gl_area_set_has_depth_buffer(GTK_GL_AREA(m_pGLArea), true);
+ gtk_gl_area_set_auto_render(GTK_GL_AREA(m_pGLArea), false);
+ gtk_widget_set_hexpand(m_pGLArea, true);
+ gtk_widget_set_vexpand(m_pGLArea, true);
+ gtk_container_add(GTK_CONTAINER(pParent), m_pGLArea);
+ gtk_widget_show_all(pParent);
+ gtk_gl_area_make_current(GTK_GL_AREA(m_pGLArea));
+ gtk_gl_area_attach_buffers(GTK_GL_AREA(m_pGLArea));
+#endif
+ bool bRet = InitGLEW();
+ InitGLEWDebugging();
+ return bRet;
+ }
+
+ virtual void restoreDefaultFramebuffer() override
+ {
+ OpenGLContext::restoreDefaultFramebuffer();
+#if GTK_CHECK_VERSION(3,16,0)
+ gtk_gl_area_attach_buffers(GTK_GL_AREA(m_pGLArea));
+#endif
+ }
+
+ virtual void makeCurrent() override
+ {
+ if (isCurrent())
+ return;
+
+ clearCurrent();
+
+#if GTK_CHECK_VERSION(3,16,0)
+ if (m_pGLArea)
+ gtk_gl_area_make_current(GTK_GL_AREA(m_pGLArea));
+#endif
+
+ registerAsCurrent();
+ }
+
+ virtual void destroyCurrentContext() override
+ {
+#if GTK_CHECK_VERSION(3,16,0)
+ gdk_gl_context_clear_current();
+#endif
+ }
+
+ virtual bool isCurrent() override
+ {
+#if GTK_CHECK_VERSION(3,16,0)
+ return m_pGLArea && gdk_gl_context_get_current() == gtk_gl_area_get_context(GTK_GL_AREA(m_pGLArea));
+#else
+ return false;
+#endif
+ }
+
+ virtual void sync() override
+ {
+#if GTK_CHECK_VERSION(3,16,0)
+ gtk_gl_area_queue_render(GTK_GL_AREA(m_pGLArea));
+#endif
+ }
+
+ virtual void resetCurrent() override
+ {
+ clearCurrent();
+#if GTK_CHECK_VERSION(3,16,0)
+ gdk_gl_context_clear_current();
+#endif
+ }
+
+ virtual void swapBuffers() override
+ {
+#if GTK_CHECK_VERSION(3,16,0)
+ gtk_gl_area_queue_render(GTK_GL_AREA(m_pGLArea));
+#endif
+ BuffersSwapped();
+ }
+};
+
+OpenGLContext* GtkInstance::CreateOpenGLContext()
+{
+ return new GtkOpenGLContext;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */