initial work on screen text
Screen text is positioned in screen coordinates and therefore in 2D. This means it will not move with the camera. Change-Id: I3cf2e8859871ebc8034396b4c2d6f1ff9fe5d9f6
This commit is contained in:
committed by
Markus Mohrhard
parent
f9d9aceb1c
commit
36943e981b
@@ -22,6 +22,8 @@ $(eval $(call gb_Package_add_files,chart2_opengl_shader,$(LIBO_BIN_FOLDER)/openg
|
|||||||
symbolVertexShader.glsl \
|
symbolVertexShader.glsl \
|
||||||
textFragmentShader.glsl \
|
textFragmentShader.glsl \
|
||||||
textVertexShader.glsl \
|
textVertexShader.glsl \
|
||||||
|
screenTextFragmentShader.glsl \
|
||||||
|
screenTextVertexShader.glsl \
|
||||||
shape3DFragmentShader.glsl \
|
shape3DFragmentShader.glsl \
|
||||||
shape3DVertexShader.glsl \
|
shape3DVertexShader.glsl \
|
||||||
renderTextureVertexShader.glsl \
|
renderTextureVertexShader.glsl \
|
||||||
|
17
chart2/opengl/screenTextFragmentShader.glsl
Normal file
17
chart2/opengl/screenTextFragmentShader.glsl
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||||
|
/*
|
||||||
|
* This file is part of the LibreOffice project.
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
varying vec2 vTexCoord;
|
||||||
|
uniform sampler2D TextTex;
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = vec4(texture2D(TextTex, vTexCoord).rgba);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
19
chart2/opengl/screenTextVertexShader.glsl
Normal file
19
chart2/opengl/screenTextVertexShader.glsl
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||||
|
/*
|
||||||
|
* This file is part of the LibreOffice project.
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
attribute vec3 vPosition;
|
||||||
|
attribute vec2 texCoord;
|
||||||
|
varying vec2 vTexCoord;
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = vec4(vPosition, 1);
|
||||||
|
vTexCoord = texCoord;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
@@ -186,6 +186,12 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer
|
|||||||
pAxis->setPosition(aBegin, aEnd);
|
pAxis->setPosition(aBegin, aEnd);
|
||||||
pAxis->setLineColor(COL_BLUE);
|
pAxis->setLineColor(COL_BLUE);
|
||||||
|
|
||||||
|
// test for information
|
||||||
|
maShapes.push_back(new opengl3D::ScreenText(mpRenderer.get(), *mpTextCache,
|
||||||
|
"I'm really nice text", 0));
|
||||||
|
opengl3D::ScreenText* pScreenText = static_cast<opengl3D::ScreenText*>(&maShapes.back());
|
||||||
|
pScreenText->setPosition(glm::vec2(-1.0f, 0.9f), glm::vec2(-0.6f, 0.75f));
|
||||||
|
|
||||||
// Chart background.
|
// Chart background.
|
||||||
maShapes.push_back(new opengl3D::Rectangle(mpRenderer.get(), nId++));
|
maShapes.push_back(new opengl3D::Rectangle(mpRenderer.get(), nId++));
|
||||||
opengl3D::Rectangle* pRect = static_cast<opengl3D::Rectangle*>(&maShapes.back());
|
opengl3D::Rectangle* pRect = static_cast<opengl3D::Rectangle*>(&maShapes.back());
|
||||||
|
@@ -91,6 +91,20 @@ private:
|
|||||||
glm::vec3 maBottomRight;
|
glm::vec3 maBottomRight;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ScreenText : public Renderable3DObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScreenText(OpenGL3DRenderer* pRenderer, TextCache& rTextCache, const OUString& rStr, sal_uInt32 nId);
|
||||||
|
|
||||||
|
virtual void render() SAL_OVERRIDE;
|
||||||
|
void setPosition(const glm::vec2& rTopLeft, const glm::vec2& rBottomRight);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const BitmapEx& mrText;
|
||||||
|
glm::vec2 maTopLeft;
|
||||||
|
glm::vec2 maBottomRight;
|
||||||
|
};
|
||||||
|
|
||||||
class Rectangle : public Renderable3DObject
|
class Rectangle : public Renderable3DObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@@ -87,6 +87,15 @@ private:
|
|||||||
* numbering counter clockwise
|
* numbering counter clockwise
|
||||||
*/
|
*/
|
||||||
sal_Int8 mnCornerId;
|
sal_Int8 mnCornerId;
|
||||||
|
|
||||||
|
struct BarInformation
|
||||||
|
{
|
||||||
|
double nVal;
|
||||||
|
OUString aSeriesName;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
std::map<sal_uInt32, BarInformation> maBarMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -162,6 +162,7 @@ public:
|
|||||||
void SetSize(const Size& rSize);
|
void SetSize(const Size& rSize);
|
||||||
void SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::vec3 up);
|
void SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::vec3 up);
|
||||||
void CreateTextTexture(const BitmapEx& rBitmapEx, glm::vec3 vTopLeft,glm::vec3 vTopRight, glm::vec3 vBottomRight, glm::vec3 vBottomLeft, sal_uInt32 nUniqueId);
|
void CreateTextTexture(const BitmapEx& rBitmapEx, glm::vec3 vTopLeft,glm::vec3 vTopRight, glm::vec3 vBottomRight, glm::vec3 vBottomLeft, sal_uInt32 nUniqueId);
|
||||||
|
void CreateScreenTextTexture(const BitmapEx& rBitmapEx, glm::vec2 vTopLeft, glm::vec2 vBottomRight, sal_uInt32 nUniqueId);
|
||||||
void ProcessUnrenderedShape();
|
void ProcessUnrenderedShape();
|
||||||
|
|
||||||
void SetPickingMode(bool bPickingMode);
|
void SetPickingMode(bool bPickingMode);
|
||||||
@@ -178,6 +179,7 @@ private:
|
|||||||
void RenderExtrude3DObject();
|
void RenderExtrude3DObject();
|
||||||
//add for text
|
//add for text
|
||||||
void RenderTextShape();
|
void RenderTextShape();
|
||||||
|
void RenderScreenTextShape();
|
||||||
void RenderExtrudeSurface(const Extrude3DInfo& extrude3D);
|
void RenderExtrudeSurface(const Extrude3DInfo& extrude3D);
|
||||||
void RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D);
|
void RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D);
|
||||||
void RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D);
|
void RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D);
|
||||||
@@ -206,6 +208,7 @@ private:
|
|||||||
void ReleasePolygonShapes();
|
void ReleasePolygonShapes();
|
||||||
void ReleaseExtrude3DShapes();
|
void ReleaseExtrude3DShapes();
|
||||||
void ReleaseTextShapes();
|
void ReleaseTextShapes();
|
||||||
|
void ReleaseScreenTextShapes();
|
||||||
private:
|
private:
|
||||||
|
|
||||||
struct ShaderResources
|
struct ShaderResources
|
||||||
@@ -226,6 +229,12 @@ private:
|
|||||||
GLint m_TextTexCoordID;
|
GLint m_TextTexCoordID;
|
||||||
GLint m_TextTexID;
|
GLint m_TextTexID;
|
||||||
|
|
||||||
|
// ScreenTextProID
|
||||||
|
GLint m_ScreenTextProID;
|
||||||
|
GLint m_ScreenTextVertexID;
|
||||||
|
GLint m_ScreenTextTexCoordID;
|
||||||
|
GLint m_ScreenTextTexID;
|
||||||
|
|
||||||
// CommonProID
|
// CommonProID
|
||||||
GLint m_CommonProID;
|
GLint m_CommonProID;
|
||||||
GLint m_2DVertexID;
|
GLint m_2DVertexID;
|
||||||
@@ -251,6 +260,10 @@ private:
|
|||||||
, m_TextVertexID(0)
|
, m_TextVertexID(0)
|
||||||
, m_TextTexCoordID(0)
|
, m_TextTexCoordID(0)
|
||||||
, m_TextTexID(0)
|
, m_TextTexID(0)
|
||||||
|
, m_ScreenTextProID(0)
|
||||||
|
, m_ScreenTextVertexID(0)
|
||||||
|
, m_ScreenTextTexCoordID(0)
|
||||||
|
, m_ScreenTextTexID(0)
|
||||||
, m_CommonProID(0)
|
, m_CommonProID(0)
|
||||||
, m_2DVertexID(0)
|
, m_2DVertexID(0)
|
||||||
, m_2DColorID(0)
|
, m_2DColorID(0)
|
||||||
@@ -267,6 +280,7 @@ private:
|
|||||||
glDeleteProgram(m_CommonProID);
|
glDeleteProgram(m_CommonProID);
|
||||||
glDeleteProgram(m_RenderProID);
|
glDeleteProgram(m_RenderProID);
|
||||||
glDeleteProgram(m_TextProID);
|
glDeleteProgram(m_TextProID);
|
||||||
|
glDeleteProgram(m_ScreenTextProID);
|
||||||
glDeleteProgram(m_3DProID);
|
glDeleteProgram(m_3DProID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,6 +367,7 @@ private:
|
|||||||
GLuint m_BoundBoxNormal;
|
GLuint m_BoundBoxNormal;
|
||||||
// add for text
|
// add for text
|
||||||
std::vector <TextInfo> m_TextInfoList;
|
std::vector <TextInfo> m_TextInfoList;
|
||||||
|
std::vector <TextInfo> m_ScreenTextInfoList;
|
||||||
GLuint m_TextTexCoordBuf;
|
GLuint m_TextTexCoordBuf;
|
||||||
|
|
||||||
std::vector<glm::vec3> m_Vertices;
|
std::vector<glm::vec3> m_Vertices;
|
||||||
|
@@ -115,6 +115,23 @@ void Text::setPosition(const glm::vec3& rTopLeft, const glm::vec3& rTopRight, co
|
|||||||
maBottomRight = rBottomRight;
|
maBottomRight = rBottomRight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScreenText::ScreenText(OpenGL3DRenderer* pRenderer, TextCache& rTextCache, const OUString& rStr, sal_uInt32 nId):
|
||||||
|
Renderable3DObject(pRenderer, nId),
|
||||||
|
mrText(rTextCache.getText(rStr))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenText::setPosition(const glm::vec2& rTopLeft, const glm::vec2& rBottomRight)
|
||||||
|
{
|
||||||
|
maTopLeft = rTopLeft;
|
||||||
|
maBottomRight = rBottomRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenText::render()
|
||||||
|
{
|
||||||
|
mpRenderer->CreateScreenTextTexture(mrText, maTopLeft, maBottomRight, mnUniqueId);
|
||||||
|
}
|
||||||
|
|
||||||
Rectangle::Rectangle(OpenGL3DRenderer* pRenderer, sal_uInt32 nId):
|
Rectangle::Rectangle(OpenGL3DRenderer* pRenderer, sal_uInt32 nId):
|
||||||
Renderable3DObject(pRenderer, nId)
|
Renderable3DObject(pRenderer, nId)
|
||||||
{
|
{
|
||||||
|
@@ -123,6 +123,11 @@ void OpenGL3DRenderer::ShaderResources::LoadShaders()
|
|||||||
m_TextTexCoordID = glGetAttribLocation(m_TextProID, "texCoord");
|
m_TextTexCoordID = glGetAttribLocation(m_TextProID, "texCoord");
|
||||||
m_TextTexID = glGetUniformLocation(m_TextProID, "TextTex");
|
m_TextTexID = glGetUniformLocation(m_TextProID, "TextTex");
|
||||||
|
|
||||||
|
m_ScreenTextProID = OpenGLHelper::LoadShaders("screenTextVertexShader", "screenTextFragmentShader");
|
||||||
|
m_ScreenTextVertexID = glGetAttribLocation(m_ScreenTextProID, "vPosition");
|
||||||
|
m_ScreenTextTexCoordID = glGetAttribLocation(m_ScreenTextProID, "texCoord");
|
||||||
|
m_ScreenTextTexID = glGetUniformLocation(m_ScreenTextProID, "TextTex");
|
||||||
|
|
||||||
m_CommonProID = OpenGLHelper::LoadShaders("commonVertexShader", "commonFragmentShader");
|
m_CommonProID = OpenGLHelper::LoadShaders("commonVertexShader", "commonFragmentShader");
|
||||||
m_MatrixID = glGetUniformLocation(m_CommonProID, "MVP");
|
m_MatrixID = glGetUniformLocation(m_CommonProID, "MVP");
|
||||||
m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition");
|
m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition");
|
||||||
@@ -1349,6 +1354,50 @@ void OpenGL3DRenderer::RenderExtrude3DObject()
|
|||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OpenGL3DRenderer::CreateScreenTextTexture(const BitmapEx& rBitmapEx, glm::vec2 vTopLeft, glm::vec2 vBottomRight, sal_uInt32 nUniqueId)
|
||||||
|
{
|
||||||
|
long bmpWidth = rBitmapEx.GetSizePixel().Width();
|
||||||
|
long bmpHeight = rBitmapEx.GetSizePixel().Height();
|
||||||
|
boost::scoped_array<sal_uInt8> bitmapBuf(OpenGLHelper::ConvertBitmapExToRGBABuffer(rBitmapEx));
|
||||||
|
|
||||||
|
TextInfo aTextInfo;
|
||||||
|
aTextInfo.id = getColorAsVector(nUniqueId);
|
||||||
|
aTextInfo.vertex[0] = vTopLeft.x;
|
||||||
|
aTextInfo.vertex[1] = vTopLeft.y;
|
||||||
|
aTextInfo.vertex[2] = 0;
|
||||||
|
|
||||||
|
aTextInfo.vertex[3] = vBottomRight.x;
|
||||||
|
aTextInfo.vertex[4] = vTopLeft.y;
|
||||||
|
aTextInfo.vertex[5] = 0;
|
||||||
|
|
||||||
|
aTextInfo.vertex[9] = vTopLeft.x;
|
||||||
|
aTextInfo.vertex[10] = vBottomRight.y;
|
||||||
|
aTextInfo.vertex[11] = 0;
|
||||||
|
|
||||||
|
aTextInfo.vertex[6] = vBottomRight.x;
|
||||||
|
aTextInfo.vertex[7] = vBottomRight.y;
|
||||||
|
aTextInfo.vertex[8] = 0;
|
||||||
|
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glGenTextures(1, &aTextInfo.texture);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glBindTexture(GL_TEXTURE_2D, aTextInfo.texture);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmpWidth, bmpHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapBuf.get());
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
m_ScreenTextInfoList.push_back(aTextInfo);
|
||||||
|
}
|
||||||
|
|
||||||
void OpenGL3DRenderer::CreateTextTexture(const BitmapEx& rBitmapEx, glm::vec3 vTopLeft,glm::vec3 vTopRight, glm::vec3 vBottomRight, glm::vec3 vBottomLeft, sal_uInt32 nUniqueId)
|
void OpenGL3DRenderer::CreateTextTexture(const BitmapEx& rBitmapEx, glm::vec3 vTopLeft,glm::vec3 vTopRight, glm::vec3 vBottomRight, glm::vec3 vBottomLeft, sal_uInt32 nUniqueId)
|
||||||
{
|
{
|
||||||
long bmpWidth = rBitmapEx.GetSizePixel().Width();
|
long bmpWidth = rBitmapEx.GetSizePixel().Width();
|
||||||
@@ -1403,6 +1452,72 @@ void OpenGL3DRenderer::ReleaseTextShapes()
|
|||||||
m_TextInfoList.clear();
|
m_TextInfoList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OpenGL3DRenderer::ReleaseScreenTextShapes()
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < m_ScreenTextInfoList.size(); i++)
|
||||||
|
{
|
||||||
|
TextInfo &textInfo = m_ScreenTextInfoList[i];
|
||||||
|
glDeleteTextures(1, &textInfo.texture);
|
||||||
|
}
|
||||||
|
m_ScreenTextInfoList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenGL3DRenderer::RenderScreenTextShape()
|
||||||
|
{
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
for (size_t i = 0; i < m_ScreenTextInfoList.size(); i++)
|
||||||
|
{
|
||||||
|
TextInfo &textInfo = m_ScreenTextInfoList[i];
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(textInfo.vertex), textInfo.vertex, GL_STATIC_DRAW);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glUseProgram(maResources.m_ScreenTextProID);
|
||||||
|
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
|
||||||
|
// 1rst attribute buffer : vertices
|
||||||
|
glEnableVertexAttribArray(maResources.m_ScreenTextVertexID);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
|
||||||
|
glVertexAttribPointer(
|
||||||
|
maResources.m_ScreenTextVertexID,
|
||||||
|
3, // size
|
||||||
|
GL_FLOAT, // type
|
||||||
|
GL_FALSE, // normalized?
|
||||||
|
0, // stride
|
||||||
|
(void*)0 // array buffer offset
|
||||||
|
);
|
||||||
|
//tex coord
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glEnableVertexAttribArray(maResources.m_ScreenTextTexCoordID);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, m_TextTexCoordBuf);
|
||||||
|
glVertexAttribPointer(
|
||||||
|
maResources.m_ScreenTextTexCoordID,
|
||||||
|
2, // size
|
||||||
|
GL_FLOAT, // type
|
||||||
|
GL_FALSE, // normalized?
|
||||||
|
0, // stride
|
||||||
|
(void*)0 // array buffer offset
|
||||||
|
);
|
||||||
|
//texture
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glBindTexture(GL_TEXTURE_2D, textInfo.texture);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glUniform1i(maResources.m_ScreenTextTexID, 0);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
//TODO: moggi: get rid fo GL_QUADS
|
||||||
|
glDrawArrays(GL_QUADS, 0, 4);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glDisableVertexAttribArray(maResources.m_ScreenTextTexCoordID);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glDisableVertexAttribArray(maResources.m_ScreenTextVertexID);
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
glUseProgram(0);
|
||||||
|
}
|
||||||
|
CHECK_GL_ERROR();
|
||||||
|
}
|
||||||
|
|
||||||
void OpenGL3DRenderer::RenderTextShape()
|
void OpenGL3DRenderer::RenderTextShape()
|
||||||
{
|
{
|
||||||
CHECK_GL_ERROR();
|
CHECK_GL_ERROR();
|
||||||
@@ -1484,6 +1599,8 @@ void OpenGL3DRenderer::ProcessUnrenderedShape()
|
|||||||
RenderExtrude3DObject();
|
RenderExtrude3DObject();
|
||||||
//render text
|
//render text
|
||||||
RenderTextShape();
|
RenderTextShape();
|
||||||
|
// render screen text
|
||||||
|
RenderScreenTextShape();
|
||||||
ReleaseShapes();
|
ReleaseShapes();
|
||||||
#if DEBUG_FBO
|
#if DEBUG_FBO
|
||||||
OUString aFileName = OUString("D://shaderout_") + OUString::number(m_iWidth) + "_" + OUString::number(m_iHeight) + ".png";
|
OUString aFileName = OUString("D://shaderout_") + OUString::number(m_iWidth) + "_" + OUString::number(m_iHeight) + ".png";
|
||||||
@@ -1525,6 +1642,7 @@ void OpenGL3DRenderer::ReleaseShapes()
|
|||||||
ReleasePolygonShapes();
|
ReleasePolygonShapes();
|
||||||
ReleaseExtrude3DShapes();
|
ReleaseExtrude3DShapes();
|
||||||
ReleaseTextShapes();
|
ReleaseTextShapes();
|
||||||
|
ReleaseScreenTextShapes();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user