summaryrefslogtreecommitdiff
path: root/src/render/vertexes
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/vertexes')
-rw-r--r--src/render/vertexes/graphicsvertexes.cpp284
-rw-r--r--src/render/vertexes/graphicsvertexes.h178
2 files changed, 462 insertions, 0 deletions
diff --git a/src/render/vertexes/graphicsvertexes.cpp b/src/render/vertexes/graphicsvertexes.cpp
new file mode 100644
index 000000000..8c4283f6a
--- /dev/null
+++ b/src/render/vertexes/graphicsvertexes.cpp
@@ -0,0 +1,284 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2011-2016 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "render/vertexes/graphicsvertexes.h"
+
+#ifdef USE_OPENGL
+#include "render/graphics.h"
+#endif
+
+#include "utils/dtor.h"
+
+#include "debug.h"
+
+#ifdef USE_OPENGL
+unsigned int vertexBufSize = 500;
+#endif
+
+SDLGraphicsVertexes::SDLGraphicsVertexes() :
+ mList()
+{
+ mList.reserve(30);
+}
+
+SDLGraphicsVertexes::~SDLGraphicsVertexes()
+{
+ delete_all(mList);
+}
+
+#ifdef USE_OPENGL
+OpenGLGraphicsVertexes::OpenGLGraphicsVertexes() :
+ ptr(0),
+ mFloatTexArray(nullptr),
+ mIntTexArray(nullptr),
+ mIntVertArray(nullptr),
+ mShortVertArray(nullptr),
+ mVp(),
+ mFloatTexPool(),
+ mIntVertPool(),
+ mShortVertPool(),
+ mIntTexPool(),
+ mVbo()
+{
+ mFloatTexPool.reserve(30);
+ mIntVertPool.reserve(30);
+ mShortVertPool.reserve(30);
+ mIntTexPool.reserve(30);
+ mVp.reserve(30);
+ mVbo.reserve(30);
+}
+
+OpenGLGraphicsVertexes::~OpenGLGraphicsVertexes()
+{
+ clear();
+}
+
+void OpenGLGraphicsVertexes::clear() restrict2
+{
+ for (std::vector<GLfloat*>::iterator it = mFloatTexPool.begin();
+ it != mFloatTexPool.end(); ++ it)
+ {
+ delete [] (*it);
+ }
+ mFloatTexPool.clear();
+
+ for (std::vector<GLint*>::iterator it = mIntVertPool.begin();
+ it != mIntVertPool.end(); ++ it)
+ {
+ delete [] (*it);
+ }
+ mIntVertPool.clear();
+
+ for (std::vector<GLshort*>::iterator it = mShortVertPool.begin();
+ it != mShortVertPool.end(); ++ it)
+ {
+ delete [] (*it);
+ }
+ mShortVertPool.clear();
+
+ for (std::vector<GLint*>::iterator it = mIntTexPool.begin();
+ it != mIntTexPool.end(); ++ it)
+ {
+ delete [] (*it);
+ }
+ mIntTexPool.clear();
+
+ const int sz = CAST_S32(mVbo.size());
+ if (sz > 0)
+ {
+ mainGraphics->removeArray(sz, &mVbo[0]);
+ mVbo.clear();
+ }
+
+ mVp.clear();
+ if (ptr)
+ {
+ ptr = 0;
+ delete []mFloatTexArray;
+ mFloatTexArray = nullptr;
+ delete []mIntTexArray;
+ mIntTexArray = nullptr;
+ delete []mIntVertArray;
+ mIntVertArray = nullptr;
+ delete []mShortVertArray;
+ mShortVertArray = nullptr;
+ }
+}
+
+void OpenGLGraphicsVertexes::init() restrict2
+{
+ clear();
+}
+
+GLfloat *OpenGLGraphicsVertexes::switchFloatTexArray() restrict2
+{
+ mFloatTexArray = new GLfloat[CAST_SIZE(vertexBufSize * 4 + 30)];
+ mFloatTexPool.push_back(mFloatTexArray);
+ return mFloatTexArray;
+}
+
+GLint *OpenGLGraphicsVertexes::switchIntVertArray() restrict2
+{
+ mIntVertArray = new GLint[CAST_SIZE(vertexBufSize * 4 + 30)];
+ mIntVertPool.push_back(mIntVertArray);
+ return mIntVertArray;
+}
+
+GLshort *OpenGLGraphicsVertexes::switchShortVertArray() restrict2
+{
+ mShortVertArray = new GLshort[CAST_SIZE(vertexBufSize * 4 + 30)];
+ mShortVertPool.push_back(mShortVertArray);
+ return mShortVertArray;
+}
+
+GLint *OpenGLGraphicsVertexes::switchIntTexArray() restrict2
+{
+ mIntTexArray = new GLint[CAST_SIZE(vertexBufSize * 4 + 30)];
+ mIntTexPool.push_back(mIntTexArray);
+ return mIntTexArray;
+}
+
+void OpenGLGraphicsVertexes::switchVp(const int n) restrict2
+{
+ mVp.push_back(n);
+}
+
+int OpenGLGraphicsVertexes::continueVp() restrict2
+{
+ if (mVp.empty())
+ {
+ return 0;
+ }
+ else
+ {
+ const int val = mVp.back();
+ mVp.pop_back();
+ return val;
+ }
+}
+
+void OpenGLGraphicsVertexes::updateVp(const int n) restrict2
+{
+ if (!mVp.empty())
+ mVp.pop_back();
+ mVp.push_back(n);
+}
+
+GLfloat *OpenGLGraphicsVertexes::continueFloatTexArray() restrict2
+{
+ if (mFloatTexPool.empty())
+ {
+ mFloatTexArray = new GLfloat[CAST_SIZE(
+ vertexBufSize * 4 + 30)];
+ mFloatTexPool.push_back(mFloatTexArray);
+ }
+ else
+ {
+ mFloatTexArray = mFloatTexPool.back();
+ }
+ return mFloatTexArray;
+}
+
+GLint *OpenGLGraphicsVertexes::continueIntVertArray() restrict2
+{
+ if (mIntVertPool.empty())
+ {
+ mIntVertArray = new GLint[CAST_SIZE(vertexBufSize * 4 + 30)];
+ mIntVertPool.push_back(mIntVertArray);
+ }
+ else
+ {
+ mIntVertArray = mIntVertPool.back();
+ }
+ return mIntVertArray;
+}
+
+GLshort *OpenGLGraphicsVertexes::continueShortVertArray() restrict2
+{
+ if (mShortVertPool.empty())
+ {
+ mShortVertArray = new GLshort[CAST_SIZE(
+ vertexBufSize * 4 + 30)];
+ mShortVertPool.push_back(mShortVertArray);
+ }
+ else
+ {
+ mShortVertArray = mShortVertPool.back();
+ }
+ return mShortVertArray;
+}
+
+GLint *OpenGLGraphicsVertexes::continueIntTexArray() restrict2
+{
+ if (mIntTexPool.empty())
+ {
+ mIntTexArray = new GLint[CAST_SIZE(vertexBufSize * 4 + 30)];
+ mIntTexPool.push_back(mIntTexArray);
+ }
+ else
+ {
+ mIntTexArray = mIntTexPool.back();
+ }
+ return mIntTexArray;
+}
+#endif
+
+ImageVertexes::ImageVertexes() :
+ image(nullptr),
+#ifdef USE_OPENGL
+ ogl(),
+#endif
+ sdl()
+{
+ sdl.reserve(30);
+}
+
+ImageVertexes::~ImageVertexes()
+{
+ delete_all(sdl);
+ sdl.clear();
+}
+
+ImageCollection::ImageCollection() :
+#ifdef USE_OPENGL
+ currentGLImage(0),
+#endif
+ currentImage(nullptr),
+ currentVert(nullptr),
+ draws()
+{
+}
+
+ImageCollection::~ImageCollection()
+{
+ clear();
+}
+
+void ImageCollection::clear() restrict2
+{
+#ifdef USE_OPENGL
+ currentGLImage = 0;
+#endif
+ currentImage = nullptr;
+ currentVert = nullptr;
+
+ delete_all(draws);
+ draws.clear();
+}
diff --git a/src/render/vertexes/graphicsvertexes.h b/src/render/vertexes/graphicsvertexes.h
new file mode 100644
index 000000000..8f54c5550
--- /dev/null
+++ b/src/render/vertexes/graphicsvertexes.h
@@ -0,0 +1,178 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2011-2016 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRAPHICSVERTEXES_H
+#define GRAPHICSVERTEXES_H
+
+#include "main.h"
+
+#include "localconsts.h"
+
+#ifdef USE_OPENGL
+
+#ifdef ANDROID
+#include <GLES/gl.h>
+#else
+#ifndef USE_SDL2
+#define GL_GLEXT_PROTOTYPES 1
+#endif
+#include <SDL_opengl.h>
+#endif
+
+#endif
+
+#include <SDL_video.h>
+
+#include <vector>
+
+class Image;
+
+struct DoubleRect final
+{
+ SDL_Rect src;
+ SDL_Rect dst;
+};
+
+class SDLGraphicsVertexes final
+{
+ public:
+ SDLGraphicsVertexes();
+
+ A_DELETE_COPY(SDLGraphicsVertexes)
+
+ ~SDLGraphicsVertexes();
+
+ std::vector<DoubleRect*> mList;
+};
+
+#ifdef USE_OPENGL
+class OpenGLGraphicsVertexes final
+{
+ public:
+ OpenGLGraphicsVertexes();
+
+ A_DELETE_COPY(OpenGLGraphicsVertexes)
+
+ ~OpenGLGraphicsVertexes();
+
+ GLfloat *switchFloatTexArray() restrict2;
+
+ GLint *switchIntVertArray() restrict2;
+
+ GLint *switchIntTexArray() restrict2;
+
+ GLshort *switchShortVertArray() restrict2;
+
+ std::vector<GLfloat*> *getFloatTexPool() restrict2 A_WARN_UNUSED
+ { return &mFloatTexPool; }
+
+ std::vector<GLint*> *getIntVertPool() restrict2 A_WARN_UNUSED
+ { return &mIntVertPool; }
+
+ std::vector<GLshort*> *getShortVertPool() restrict2 A_WARN_UNUSED
+ { return &mShortVertPool; }
+
+ std::vector<GLint*> *getIntTexPool() restrict2 A_WARN_UNUSED
+ { return &mIntTexPool; }
+
+ void switchVp(const int n) restrict2;
+
+ GLfloat *continueFloatTexArray() restrict2 RETURNS_NONNULL;
+
+ GLint *continueIntVertArray() restrict2 RETURNS_NONNULL;
+
+ GLshort *continueShortVertArray() restrict2 RETURNS_NONNULL;
+
+ GLint *continueIntTexArray() restrict2 RETURNS_NONNULL;
+
+ int continueVp() restrict2;
+
+ void updateVp(const int n) restrict2;
+
+ std::vector<int> *getVp() restrict2 A_WARN_UNUSED
+ { return &mVp; }
+
+ void init() restrict2;
+
+ void clear() restrict2;
+
+ int ptr;
+
+ GLfloat *mFloatTexArray;
+ GLint *mIntTexArray;
+ GLint *mIntVertArray;
+ GLshort *mShortVertArray;
+ std::vector<int> mVp;
+ std::vector<GLfloat*> mFloatTexPool;
+ std::vector<GLint*> mIntVertPool;
+ std::vector<GLshort*> mShortVertPool;
+ std::vector<GLint*> mIntTexPool;
+ std::vector<GLuint> mVbo;
+};
+#endif
+
+typedef std::vector<DoubleRect*> DoubleRects;
+
+class ImageVertexes final
+{
+ public:
+ ImageVertexes();
+
+ A_DELETE_COPY(ImageVertexes)
+
+ ~ImageVertexes();
+
+ const Image *restrict image;
+#ifdef USE_OPENGL
+ OpenGLGraphicsVertexes ogl;
+#endif
+ DoubleRects sdl;
+};
+
+typedef std::vector<ImageVertexes*> ImageVertexesVector;
+typedef ImageVertexesVector::iterator ImageCollectionIter;
+typedef ImageVertexesVector::const_iterator ImageCollectionCIter;
+
+class ImageCollection final
+{
+ public:
+ ImageCollection();
+
+ A_DELETE_COPY(ImageCollection)
+
+ ~ImageCollection();
+
+ void clear() restrict2;
+
+#ifdef USE_OPENGL
+ GLuint currentGLImage;
+#endif
+ const Image *restrict currentImage;
+
+ ImageVertexes *restrict currentVert;
+
+ ImageVertexesVector draws;
+};
+
+#ifdef USE_OPENGL
+extern unsigned int vertexBufSize;
+#endif
+
+#endif // GRAPHICSVERTEXES_H