move to OpenGLWindow step one

Change-Id: I9f019a397f8b0daf27f0969b1f23539438eb6422
This commit is contained in:
Markus Mohrhard
2014-06-01 01:28:06 +02:00
parent adde053786
commit 8822b255e5
9 changed files with 57 additions and 123 deletions

View File

@@ -29,6 +29,8 @@
#include <rtl/ustring.hxx> #include <rtl/ustring.hxx>
class OpenGLWindow;
namespace chart { namespace chart {
@@ -239,6 +241,9 @@ public:
*/ */
virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) = 0; virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) = 0;
virtual bool preRender(OpenGLWindow* pWindow) = 0;
virtual void postRender(OpenGLWindow* pWindow) = 0;
virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) = 0; virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) = 0;
static ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes > static ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >
@@ -284,6 +289,7 @@ public:
}; };
} }
#endif #endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -186,6 +186,9 @@ public:
virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) SAL_OVERRIDE; virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) SAL_OVERRIDE;
virtual bool preRender(OpenGLWindow* pWindow) SAL_OVERRIDE;
virtual void postRender(OpenGLWindow* pWindow) SAL_OVERRIDE;
virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) SAL_OVERRIDE; virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > xDrawPage) SAL_OVERRIDE;
}; };

View File

@@ -199,6 +199,9 @@ public:
*/ */
virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > ) SAL_OVERRIDE {} virtual void render(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > ) SAL_OVERRIDE {}
virtual bool preRender(OpenGLWindow*) SAL_OVERRIDE { return true; }
virtual void postRender(OpenGLWindow*) SAL_OVERRIDE {}
virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > ) SAL_OVERRIDE {} virtual void clearPage(com::sun::star::uno::Reference< com::sun::star::drawing::XDrawPage > ) SAL_OVERRIDE {}
private: private:

View File

@@ -2615,7 +2615,13 @@ void ChartView::createShapes()
//cleanup: remove all empty group shapes to avoid grey border lines: //cleanup: remove all empty group shapes to avoid grey border lines:
lcl_removeEmptyGroupShapes( mxRootShape ); lcl_removeEmptyGroupShapes( mxRootShape );
pShapeFactory->render( m_xDrawPage ); OpenGLWindow* pWindow = mrChartModel.getOpenGLWindow();
bool bRender = pShapeFactory->preRender(pWindow);
if(bRender)
{
pShapeFactory->render(m_xDrawPage);
pShapeFactory->postRender(pWindow);
}
if(maTimeBased.bTimeBased && maTimeBased.nFrame % 60 == 0) if(maTimeBased.bTimeBased && maTimeBased.nFrame % 60 == 0)
{ {

View File

@@ -1145,9 +1145,9 @@ void DummyXShapes::render()
} }
} }
DummyChart::DummyChart(uno::Reference< drawing::XShape > xTarget): DummyChart::DummyChart():
mbNotInit(true), mbNotInit(true),
m_GLRender(xTarget) m_GLRender()
{ {
SAL_INFO("chart2.opengl", "DummyXShape::DummyChart()-----test: "); SAL_INFO("chart2.opengl", "DummyXShape::DummyChart()-----test: ");
setName("com.sun.star.chart2.shapes"); setName("com.sun.star.chart2.shapes");

View File

@@ -387,7 +387,7 @@ protected:
class DummyChart : public DummyXShapes class DummyChart : public DummyXShapes
{ {
public: public:
DummyChart(com::sun::star::uno::Reference< com::sun::star::drawing::XShape > xDrawPage); DummyChart();
virtual ~DummyChart(); virtual ~DummyChart();
virtual DummyChart* getRootShape() SAL_OVERRIDE; virtual DummyChart* getRootShape() SAL_OVERRIDE;

View File

@@ -375,49 +375,6 @@ void OpenGLRender::prepareToRender()
void OpenGLRender::renderToBitmap() void OpenGLRender::renderToBitmap()
{ {
if (mbArbMultisampleSupported)
{
GLenum status;
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_frameBufferMS);
status = glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
SAL_INFO("chart2.opengl", "The frame buffer status is not complete!");
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FboID[0]);
status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
SAL_INFO("chart2.opengl", "The frame buffer status is not complete!");
}
glBlitFramebuffer(0, 0 ,m_iWidth, m_iHeight, 0, 0,m_iWidth ,m_iHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
glBindFramebuffer(GL_READ_FRAMEBUFFER,0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
}
glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[0]);
BitmapEx aBitmap = GetAsBitmap();
#if RENDER_TO_FILE
static int nIdx = 0;
OUString aName = OUString( "file:///home/moggi/Documents/work/text" ) + OUString::number( nIdx++ ) + ".png";
try {
vcl::PNGWriter aWriter( aBitmap );
SvFileStream sOutput( aName, STREAM_WRITE );
aWriter.Write( sOutput );
sOutput.Close();
} catch (...) {
SAL_WARN("chart2.opengl", "Error writing png to " << aName);
}
#else
Graphic aGraphic(aBitmap);
uno::Reference< awt::XBitmap> xBmp( aGraphic.GetXGraphic(), uno::UNO_QUERY );
uno::Reference < beans::XPropertySet > xPropSet ( mxTarget, uno::UNO_QUERY );
xPropSet->setPropertyValue("Graphic", uno::makeAny(aGraphic.GetXGraphic()));
mxTarget->setSize(awt::Size(m_iWidth*OPENGL_SCALE_VALUE, m_iHeight*OPENGL_SCALE_VALUE));
mxTarget->setPosition(awt::Point(0,0));
#endif
glBindFramebuffer(GL_FRAMEBUFFER, 0);
} }
int OpenGLRender::CreateTextureObj(int width, int height) int OpenGLRender::CreateTextureObj(int width, int height)
@@ -502,9 +459,8 @@ void OpenGLRender::Release()
glDeleteRenderbuffers(1, &m_renderBufferDepthMS); glDeleteRenderbuffers(1, &m_renderBufferDepthMS);
} }
OpenGLRender::OpenGLRender(uno::Reference< drawing::XShape > xTarget) OpenGLRender::OpenGLRender()
: mxTarget(xTarget) : m_iWidth(1600)
, m_iWidth(1600)
, m_iHeight(900) , m_iHeight(900)
, m_Model(glm::mat4(1.0f)) , m_Model(glm::mat4(1.0f))
, m_VertexBuffer(0) , m_VertexBuffer(0)

View File

@@ -73,7 +73,7 @@ typedef std::vector<GLfloat> PointList;
class OpenGLRender class OpenGLRender
{ {
public: public:
OpenGLRender(com::sun::star::uno::Reference< com::sun::star::drawing::XShape > xTarget); OpenGLRender();
~OpenGLRender(); ~OpenGLRender();
int InitOpenGL(); int InitOpenGL();
int MoveModelf(PosVecf3 trans, PosVecf3 angle, PosVecf3 scale); int MoveModelf(PosVecf3 trans, PosVecf3 angle, PosVecf3 scale);
@@ -125,9 +125,6 @@ public:
private: private:
com::sun::star::uno::Reference< com::sun::star::drawing::XShape > mxTarget;
#if 0 #if 0
//for performance //for performance
double m_dFreq; double m_dFreq;

View File

@@ -48,6 +48,7 @@
#include <svx/svdocirc.hxx> #include <svx/svdocirc.hxx>
#include <svx/svdopath.hxx> #include <svx/svdopath.hxx>
#include <vcl/opengl/IOpenGLRenderer.hxx> #include <vcl/opengl/IOpenGLRenderer.hxx>
#include <vcl/openglwin.hxx>
#include <basegfx/point/b2dpoint.hxx> #include <basegfx/point/b2dpoint.hxx>
#include <basegfx/matrix/b3dhommatrix.hxx> #include <basegfx/matrix/b3dhommatrix.hxx>
@@ -64,24 +65,6 @@ extern "C" {
{ return new opengl::OpenglShapeFactory();} { return new opengl::OpenglShapeFactory();}
} }
class OpenGLChartAdapter : public IOpenGLRenderer
{
public:
OpenGLChartAdapter(uno::Reference<drawing::XShapes> xShapes):
mxShapes(xShapes) {}
virtual ~OpenGLChartAdapter() {}
uno::Reference<drawing::XShapes> getShapes()
{
return mxShapes;
}
private:
uno::Reference<drawing::XShapes> mxShapes; // here to fix lifetime
};
using dummy::DummyXShape; using dummy::DummyXShape;
using dummy::DummyXShapes; using dummy::DummyXShapes;
using dummy::DummyCylinder; using dummy::DummyCylinder;
@@ -93,8 +76,10 @@ namespace opengl {
namespace { namespace {
IOpenGLRenderer* getRenderer(const uno::Reference< drawing::XDrawPage>& xDrawPage ) uno::Reference< drawing::XShapes > getChartShape(
const uno::Reference< drawing::XDrawPage>& xDrawPage )
{ {
uno::Reference< drawing::XShapes > xRet;
uno::Reference< drawing::XShapes > xShapes( xDrawPage, uno::UNO_QUERY ); uno::Reference< drawing::XShapes > xShapes( xDrawPage, uno::UNO_QUERY );
if( xShapes.is() ) if( xShapes.is() )
{ {
@@ -104,33 +89,20 @@ IOpenGLRenderer* getRenderer(const uno::Reference< drawing::XDrawPage>& xDrawPag
{ {
if( xShapes->getByIndex( nN ) >>= xShape ) if( xShapes->getByIndex( nN ) >>= xShape )
{ {
OUString aRet; OUString aRet;
uno::Reference< beans::XPropertySet > xProp( xShape, uno::UNO_QUERY ); uno::Reference< beans::XPropertySet > xProp( xShape, uno::UNO_QUERY );
xProp->getPropertyValue( UNO_NAME_MISC_OBJ_NAME ) >>= aRet; xProp->getPropertyValue( UNO_NAME_MISC_OBJ_NAME ) >>= aRet;
if( aRet.equals("com.sun.star.chart2.shapes") ) if( aRet.equals("com.sun.star.chart2.shapes") )
{ {
SvxOpenGLObject* pGLObj = dynamic_cast<SvxOpenGLObject*>(xShape.get()); xRet = dynamic_cast<SvxDummyShapeContainer*>(xShape.get())->getWrappedShape();
IOpenGLRenderer* pRenderer = pGLObj ? pGLObj->getRenderer() : NULL; break;
if (pRenderer)
return pRenderer;
} }
} }
} }
} }
return xRet;
return NULL;
}
uno::Reference< drawing::XShapes > getChartShape(
const uno::Reference< drawing::XDrawPage>& xDrawPage )
{
IOpenGLRenderer* pRenderer = getRenderer(xDrawPage);
OpenGLChartAdapter* pAdapter = dynamic_cast<OpenGLChartAdapter*>(pRenderer);
if(pAdapter)
return pAdapter->getShapes();
return uno::Reference< drawing::XShapes> ();
} }
} }
@@ -144,20 +116,11 @@ uno::Reference< drawing::XShapes > OpenglShapeFactory::getOrCreateChartRootShape
//create the root shape //create the root shape
SAL_WARN("chart2.opengl", "getOrCreateChartRootShape"); SAL_WARN("chart2.opengl", "getOrCreateChartRootShape");
uno::Reference< drawing::XShape > xTarget (m_xShapeFactory->createInstance( dummy::DummyChart *pChart = new dummy::DummyChart();
"com.sun.star.drawing.OpenGLObject" ), uno::UNO_QUERY ); SvxDummyShapeContainer* pContainer = new SvxDummyShapeContainer(pChart);
uno::Reference<drawing::XShapes> xChart(new dummy::DummyChart(xTarget)); pContainer->setSize(awt::Size(0,0));
xDrawPage->add(xTarget); xRet = pChart;
uno::Any aName; xDrawPage->add(pContainer);
aName <<= OUString("com.sun.star.chart2.shapes");
uno::Reference<beans::XPropertySet> xPropSet( xTarget, uno::UNO_QUERY_THROW );
xPropSet->setPropertyValue( UNO_NAME_MISC_OBJ_NAME, aName );
SvxOpenGLObject* pObj = dynamic_cast<SvxOpenGLObject*>(xTarget.get());
if (pObj)
pObj->setRenderer(new OpenGLChartAdapter(xChart));
xRet = getChartShape( xDrawPage );
} }
return xRet; return xRet;
} }
@@ -486,32 +449,32 @@ uno::Reference< drawing::XShape >
void OpenglShapeFactory::render(uno::Reference< drawing::XDrawPage > xDrawPage) void OpenglShapeFactory::render(uno::Reference< drawing::XDrawPage > xDrawPage)
{ {
IOpenGLRenderer* pRenderer = getRenderer(xDrawPage); uno::Reference< drawing::XShapes > xRootShape = getChartShape(xDrawPage);
if(!pRenderer)
return;
if(!pRenderer->isOpenGLInitialized())
return;
OpenGLChartAdapter* pAdapter = dynamic_cast<OpenGLChartAdapter*>(pRenderer);
if(!pAdapter)
return;
uno::Reference< drawing::XShapes > xRootShape = pAdapter->getShapes();
dummy::DummyChart* pChart = dynamic_cast<dummy::DummyChart*>(xRootShape.get()); dummy::DummyChart* pChart = dynamic_cast<dummy::DummyChart*>(xRootShape.get());
assert(pChart); assert(pChart);
pChart->render(); pChart->render();
} }
bool OpenglShapeFactory::preRender(OpenGLWindow* pWindow)
{
if(!pWindow)
return false;
pWindow->Show();
pWindow->getContext()->makeCurrent();
Size aSize = pWindow->GetSizePixel();
pWindow->getContext()->setWinSize(aSize);
return true;
}
void OpenglShapeFactory::postRender(OpenGLWindow* pWindow)
{
pWindow->getContext()->swapBuffers();
}
void OpenglShapeFactory::clearPage(uno::Reference< drawing::XDrawPage > xDrawPage) void OpenglShapeFactory::clearPage(uno::Reference< drawing::XDrawPage > xDrawPage)
{ {
IOpenGLRenderer* pRenderer = getRenderer(xDrawPage); uno::Reference< drawing::XShapes > xRootShape = getChartShape(xDrawPage);
OpenGLChartAdapter* pAdapter = dynamic_cast<OpenGLChartAdapter*>(pRenderer);
if(!pAdapter)
return;
uno::Reference< drawing::XShapes > xRootShape = pAdapter->getShapes();
dummy::DummyChart* pChart = dynamic_cast<dummy::DummyChart*>(xRootShape.get()); dummy::DummyChart* pChart = dynamic_cast<dummy::DummyChart*>(xRootShape.get());
assert(pChart); assert(pChart);
pChart->clear(); pChart->clear();