24 #if defined USE_OPENGL
28 #ifdef DEBUG_BIND_TEXTURE
42 #ifdef DEBUG_DRAW_CALLS
43 unsigned int NullOpenGLGraphics::mDrawCalls = 0;
44 unsigned int NullOpenGLGraphics::mLastDrawCalls = 0;
57 #ifdef DEBUG_BIND_TEXTURE
64 mName =
"null OpenGL";
76 mMaxVertices = vertCount;
77 if (mMaxVertices < 500)
79 else if (mMaxVertices > 1024)
84 const size_t sz = mMaxVertices * 4 + 30;
85 if (mFloatTexArray ==
nullptr)
86 mFloatTexArray =
new GLfloat[sz];
87 if (mIntTexArray ==
nullptr)
88 mIntTexArray =
new GLint[sz];
89 if (mIntVertArray ==
nullptr)
90 mIntVertArray =
new GLint[sz];
115 return setOpenGLMode();
132 #ifdef DEBUG_DRAW_CALLS
133 NullOpenGLGraphics::mDrawCalls ++;
138 #ifdef DEBUG_DRAW_CALLS
139 NullOpenGLGraphics::mDrawCalls ++;
156 #ifdef DEBUG_DRAW_CALLS
157 NullOpenGLGraphics::mDrawCalls ++;
162 #ifdef DEBUG_DRAW_CALLS
163 NullOpenGLGraphics::mDrawCalls ++;
184 if (image ==
nullptr)
188 #ifdef DEBUG_BIND_TEXTURE
195 const SDL_Rect &imageRect = image->mBounds;
196 drawQuad(image, imageRect.x, imageRect.y, dstX, dstY,
197 imageRect.w, imageRect.h);
222 const int desiredWidth,
226 if (image ==
nullptr)
229 const SDL_Rect &imageRect = image->mBounds;
232 if (imageRect.w == desiredWidth && imageRect.h == desiredHeight)
239 #ifdef DEBUG_BIND_TEXTURE
248 imageRect.w, imageRect.h, desiredWidth, desiredHeight);
252 const int x,
const int y,
259 const int x,
const int y,
263 if (image ==
nullptr)
266 const SDL_Rect &imageRect = image->mBounds;
267 const
int srcX = imageRect.
x;
268 const
int srcY = imageRect.
y;
269 const
int iw = imageRect.w;
270 const
int ih = imageRect.h;
272 if (iw == 0 || ih == 0)
277 #ifdef DEBUG_BIND_TEXTURE
286 const unsigned int vLimit = mMaxVertices * 4;
290 const float tw =
static_cast<float>(image->mTexWidth);
291 const float th =
static_cast<float>(image->mTexHeight);
293 const float texX1 =
static_cast<float>(srcX) / tw;
294 const float texY1 =
static_cast<float>(srcY) / th;
296 for (
int py = 0; py < h; py += ih)
298 const int height = (py + ih >= h) ? h - py : ih;
299 const int dstY =
y + py;
300 const float texY2 =
static_cast<float>(srcY + height) / th;
301 for (
int px = 0; px < w; px += iw)
303 const int width = (px + iw >= w) ? w - px : iw;
304 const int dstX =
x + px;
306 const float texX2 =
static_cast<float>(srcX + width) / tw;
308 mFloatTexArray[vp + 0] = texX1;
309 mFloatTexArray[vp + 1] = texY1;
311 mFloatTexArray[vp + 2] = texX2;
312 mFloatTexArray[vp + 3] = texY1;
314 mFloatTexArray[vp + 4] = texX2;
315 mFloatTexArray[vp + 5] = texY2;
317 mFloatTexArray[vp + 6] = texX1;
318 mFloatTexArray[vp + 7] = texY2;
320 mIntVertArray[vp + 0] = dstX;
321 mIntVertArray[vp + 1] = dstY;
323 mIntVertArray[vp + 2] = dstX + width;
324 mIntVertArray[vp + 3] = dstY;
326 mIntVertArray[vp + 4] = dstX + width;
327 mIntVertArray[vp + 5] = dstY + height;
329 mIntVertArray[vp + 6] = dstX;
330 mIntVertArray[vp + 7] = dstY + height;
345 for (
int py = 0; py < h; py += ih)
347 const int height = (py + ih >= h) ? h - py : ih;
348 const int dstY =
y + py;
349 for (
int px = 0; px < w; px += iw)
351 const int width = (px + iw >= w) ? w - px : iw;
352 const int dstX =
x + px;
354 mIntTexArray[vp + 0] = srcX;
355 mIntTexArray[vp + 1] = srcY;
357 mIntTexArray[vp + 2] = srcX + width;
358 mIntTexArray[vp + 3] = srcY;
360 mIntTexArray[vp + 4] = srcX + width;
361 mIntTexArray[vp + 5] = srcY + height;
363 mIntTexArray[vp + 6] = srcX;
364 mIntTexArray[vp + 7] = srcY + height;
366 mIntVertArray[vp + 0] = dstX;
367 mIntVertArray[vp + 1] = dstY;
369 mIntVertArray[vp + 2] = dstX + width;
370 mIntVertArray[vp + 3] = dstY;
372 mIntVertArray[vp + 4] = dstX + width;
373 mIntVertArray[vp + 5] = dstY + height;
375 mIntVertArray[vp + 6] = dstX;
376 mIntVertArray[vp + 7] = dstY + height;
392 const int x,
const int y,
393 const int w,
const int h,
394 const int scaledWidth,
397 if (image ==
nullptr)
400 if (scaledWidth == 0 || scaledHeight == 0)
403 const SDL_Rect &imageRect = image->mBounds;
404 const int iw = imageRect.w;
405 const int ih = imageRect.h;
406 if (iw == 0 || ih == 0)
409 const int srcX = imageRect.x;
410 const int srcY = imageRect.y;
414 #ifdef DEBUG_BIND_TEXTURE
423 const unsigned int vLimit = mMaxVertices * 4;
428 const float tw =
static_cast<float>(image->mTexWidth);
429 const float th =
static_cast<float>(image->mTexHeight);
431 const float texX1 =
static_cast<float>(srcX) / tw;
432 const float texY1 =
static_cast<float>(srcY) / th;
434 const float tFractionW = iw / tw;
435 const float tFractionH = ih / th;
437 for (
int py = 0; py < h; py += scaledHeight)
439 const int height = (py + scaledHeight >= h)
440 ? h - py : scaledHeight;
441 const int dstY =
y + py;
442 const float visibleFractionH =
static_cast<float>(height)
444 const float texY2 = texY1 + tFractionH * visibleFractionH;
445 for (
int px = 0; px < w; px += scaledWidth)
447 const int width = (px + scaledWidth >= w)
448 ? w - px : scaledWidth;
449 const int dstX =
x + px;
450 const float visibleFractionW =
static_cast<float>(width)
452 const float texX2 = texX1 + tFractionW * visibleFractionW;
454 mFloatTexArray[vp + 0] = texX1;
455 mFloatTexArray[vp + 1] = texY1;
457 mFloatTexArray[vp + 2] = texX2;
458 mFloatTexArray[vp + 3] = texY1;
460 mFloatTexArray[vp + 4] = texX2;
461 mFloatTexArray[vp + 5] = texY2;
463 mFloatTexArray[vp + 6] = texX1;
464 mFloatTexArray[vp + 7] = texY2;
466 mIntVertArray[vp + 0] = dstX;
467 mIntVertArray[vp + 1] = dstY;
469 mIntVertArray[vp + 2] = dstX + width;
470 mIntVertArray[vp + 3] = dstY;
472 mIntVertArray[vp + 4] = dstX + width;
473 mIntVertArray[vp + 5] = dstY + height;
475 mIntVertArray[vp + 6] = dstX;
476 mIntVertArray[vp + 7] = dstY + height;
491 const float scaleFactorW =
static_cast<float>(scaledWidth) / iw;
492 const float scaleFactorH =
static_cast<float>(scaledHeight) / ih;
494 for (
int py = 0; py < h; py += scaledHeight)
496 const int height = (py + scaledHeight >= h)
497 ? h - py : scaledHeight;
498 const int dstY =
y + py;
499 const int scaledY = srcY + height / scaleFactorH;
500 for (
int px = 0; px < w; px += scaledWidth)
502 const int width = (px + scaledWidth >= w)
503 ? w - px : scaledWidth;
504 const int dstX =
x + px;
505 const int scaledX = srcX + width / scaleFactorW;
507 mIntTexArray[vp + 0] = srcX;
508 mIntTexArray[vp + 1] = srcY;
510 mIntTexArray[vp + 2] = scaledX;
511 mIntTexArray[vp + 3] = srcY;
513 mIntTexArray[vp + 4] = scaledX;
514 mIntTexArray[vp + 5] = scaledY;
516 mIntTexArray[vp + 6] = srcX;
517 mIntTexArray[vp + 7] = scaledY;
519 mIntVertArray[vp + 0] = dstX;
520 mIntVertArray[vp + 1] = dstY;
522 mIntVertArray[vp + 2] = dstX + width;
523 mIntVertArray[vp + 3] = dstY;
525 mIntVertArray[vp + 4] = dstX + width;
526 mIntVertArray[vp + 5] = dstY + height;
528 mIntVertArray[vp + 6] = dstX;
529 mIntVertArray[vp + 7] = dstY + height;
545 OpenGLGraphicsVertexes
548 const STD_VECTOR<GLint*> &intVertPool = ogl.mIntVertPool;
549 STD_VECTOR<GLint*>::const_iterator iv;
550 const STD_VECTOR<GLint*>::const_iterator iv_end = intVertPool.end();
551 const STD_VECTOR<int> &vp = ogl.mVp;
552 STD_VECTOR<int>::const_iterator ivp;
553 const STD_VECTOR<int>::const_iterator ivp_end = vp.end();
558 const STD_VECTOR<GLfloat*> &floatTexPool = ogl.mFloatTexPool;
559 STD_VECTOR<GLfloat*>::const_iterator ft;
560 const STD_VECTOR<GLfloat*>::const_iterator
561 ft_end = floatTexPool.end();
563 for (iv = intVertPool.begin(), ft = floatTexPool.begin(),
565 iv != iv_end && ft != ft_end && ivp != ivp_end;
566 ++ iv, ++ ft, ++ ivp)
568 drawQuadArrayfi(*iv, *ft, *ivp);
573 const STD_VECTOR<GLint*> &intTexPool = ogl.mIntTexPool;
574 STD_VECTOR<GLint*>::const_iterator it;
575 const STD_VECTOR<GLint*>::const_iterator it_end = intTexPool.end();
577 for (iv = intVertPool.begin(), it = intTexPool.begin(),
579 iv != iv_end && it != it_end && ivp != ivp_end;
580 ++ iv, ++ it, ++ ivp)
582 drawQuadArrayii(*iv, *it, *ivp);
589 const int x,
const int y,
590 const int w,
const int h)
const restrict2
602 if (image ==
nullptr || vert ==
nullptr)
605 const SDL_Rect &imageRect = image->mBounds;
606 const int iw = imageRect.w;
607 const int ih = imageRect.h;
609 if (iw == 0 || ih == 0)
612 const int srcX = imageRect.x;
613 const int srcY = imageRect.y;
614 const unsigned int vLimit = mMaxVertices * 4;
616 OpenGLGraphicsVertexes &ogl = vert->ogl;
617 unsigned int vp = ogl.continueVp();
622 const float tw =
static_cast<float>(image->mTexWidth);
623 const float th =
static_cast<float>(image->mTexHeight);
625 const float texX1 =
static_cast<float>(srcX) / tw;
626 const float texY1 =
static_cast<float>(srcY) / th;
628 GLfloat *floatTexArray = ogl.continueFloatTexArray();
629 GLint *intVertArray = ogl.continueIntVertArray();
631 for (
int py = 0; py < h; py += ih)
633 const int height = (py + ih >= h) ? h - py : ih;
634 const int dstY =
y + py;
635 const float texY2 =
static_cast<float>(srcY + height) / th;
636 for (
int px = 0; px < w; px += iw)
638 const int width = (px + iw >= w) ? w - px : iw;
639 const int dstX =
x + px;
640 const float texX2 =
static_cast<float>(srcX + width) / tw;
642 floatTexArray[vp + 0] = texX1;
643 floatTexArray[vp + 1] = texY1;
645 floatTexArray[vp + 2] = texX2;
646 floatTexArray[vp + 3] = texY1;
648 floatTexArray[vp + 4] = texX2;
649 floatTexArray[vp + 5] = texY2;
651 floatTexArray[vp + 6] = texX1;
652 floatTexArray[vp + 7] = texY2;
654 intVertArray[vp + 0] = dstX;
655 intVertArray[vp + 1] = dstY;
657 intVertArray[vp + 2] = dstX + width;
658 intVertArray[vp + 3] = dstY;
660 intVertArray[vp + 4] = dstX + width;
661 intVertArray[vp + 5] = dstY + height;
663 intVertArray[vp + 6] = dstX;
664 intVertArray[vp + 7] = dstY + height;
669 floatTexArray = ogl.switchFloatTexArray();
670 intVertArray = ogl.switchIntVertArray();
679 GLint *intTexArray = ogl.continueIntTexArray();
680 GLint *intVertArray = ogl.continueIntVertArray();
682 for (
int py = 0; py < h; py += ih)
684 const int height = (py + ih >= h) ? h - py : ih;
685 const int dstY =
y + py;
686 for (
int px = 0; px < w; px += iw)
688 const int width = (px + iw >= w) ? w - px : iw;
689 const int dstX =
x + px;
691 intTexArray[vp + 0] = srcX;
692 intTexArray[vp + 1] = srcY;
694 intTexArray[vp + 2] = srcX + width;
695 intTexArray[vp + 3] = srcY;
697 intTexArray[vp + 4] = srcX + width;
698 intTexArray[vp + 5] = srcY + height;
700 intTexArray[vp + 6] = srcX;
701 intTexArray[vp + 7] = srcY + height;
703 intVertArray[vp + 0] = dstX;
704 intVertArray[vp + 1] = dstY;
706 intVertArray[vp + 2] = dstX + width;
707 intVertArray[vp + 3] = dstY;
709 intVertArray[vp + 4] = dstX + width;
710 intVertArray[vp + 5] = dstY + height;
712 intVertArray[vp + 6] = dstX;
713 intVertArray[vp + 7] = dstY + height;
718 intTexArray = ogl.switchIntTexArray();
719 intVertArray = ogl.switchIntVertArray();
734 if (vertCol ==
nullptr || image ==
nullptr)
736 if (vertCol->currentGLImage != image->mGLImage)
739 vertCol->currentGLImage = image->mGLImage;
740 vertCol->currentVert = vert;
742 vertCol->draws.push_back(vert);
762 #ifdef DEBUG_BIND_TEXTURE
774 const int x,
const int y,
775 const int w,
const int h)
const restrict2
777 if (vertCol ==
nullptr || image ==
nullptr)
780 if (vertCol->currentGLImage != image->mGLImage)
783 vertCol->currentGLImage = image->mGLImage;
784 vertCol->currentVert = vert;
786 vertCol->draws.push_back(vert);
790 vert = vertCol->currentVert;
810 const SDL_Rect &imageRect = image->mBounds;
811 const int w = imageRect.w;
812 const int h = imageRect.h;
814 if (w == 0 || h == 0)
817 const int srcX = imageRect.x;
818 const int srcY = imageRect.y;
820 const unsigned int vLimit = mMaxVertices * 4;
822 OpenGLGraphicsVertexes &ogl = vert->
ogl;
825 unsigned int vp = ogl.continueVp();
830 const float tw =
static_cast<float>(image->mTexWidth);
831 const float th =
static_cast<float>(image->mTexHeight);
833 const float texX1 =
static_cast<float>(srcX) / tw;
834 const float texY1 =
static_cast<float>(srcY) / th;
836 const float texX2 =
static_cast<float>(srcX + w) / tw;
837 const float texY2 =
static_cast<float>(srcY + h) / th;
839 GLfloat *
const floatTexArray = ogl.continueFloatTexArray();
840 GLint *
const intVertArray = ogl.continueIntVertArray();
842 floatTexArray[vp + 0] = texX1;
843 floatTexArray[vp + 1] = texY1;
845 floatTexArray[vp + 2] = texX2;
846 floatTexArray[vp + 3] = texY1;
848 floatTexArray[vp + 4] = texX2;
849 floatTexArray[vp + 5] = texY2;
851 floatTexArray[vp + 6] = texX1;
852 floatTexArray[vp + 7] = texY2;
854 intVertArray[vp + 0] = dstX;
855 intVertArray[vp + 1] = dstY;
857 intVertArray[vp + 2] = dstX + w;
858 intVertArray[vp + 3] = dstY;
860 intVertArray[vp + 4] = dstX + w;
861 intVertArray[vp + 5] = dstY + h;
863 intVertArray[vp + 6] = dstX;
864 intVertArray[vp + 7] = dstY + h;
869 ogl.switchFloatTexArray();
870 ogl.switchIntVertArray();
877 GLint *
const intTexArray = ogl.continueIntTexArray();
878 GLint *
const intVertArray = ogl.continueIntVertArray();
880 intTexArray[vp + 0] = srcX;
881 intTexArray[vp + 1] = srcY;
883 intTexArray[vp + 2] = srcX + w;
884 intTexArray[vp + 3] = srcY;
886 intTexArray[vp + 4] = srcX + w;
887 intTexArray[vp + 5] = srcY + h;
889 intTexArray[vp + 6] = srcX;
890 intTexArray[vp + 7] = srcY + h;
892 intVertArray[vp + 0] = dstX;
893 intVertArray[vp + 1] = dstY;
895 intVertArray[vp + 2] = dstX + w;
896 intVertArray[vp + 3] = dstY;
898 intVertArray[vp + 4] = dstX + w;
899 intVertArray[vp + 5] = dstY + h;
901 intVertArray[vp + 6] = dstX;
902 intVertArray[vp + 7] = dstY + h;
907 ogl.switchIntTexArray();
908 ogl.switchIntVertArray();
924 #ifdef DEBUG_BIND_TEXTURE
934 const int x,
const int y,
935 const int w,
const int h,
940 Image *
const image = imgRect.grid[4];
941 if (image ==
nullptr)
943 if (vertCol->currentGLImage != image->mGLImage)
946 vertCol->currentGLImage = image->mGLImage;
947 vertCol->currentVert = vert;
949 vertCol->draws.push_back(vert);
953 vert = vertCol->currentVert;
961 #ifdef DEBUG_DRAW_CALLS
962 mLastDrawCalls = mDrawCalls;
984 if (!mClipStack.empty())
986 const ClipRect &clipArea = mClipStack.top();
993 const ClipRect &clipArea = mClipStack.top();
1018 mFloatTexArray[0] =
static_cast<float>(x1) + 0.5F;
1019 mFloatTexArray[1] =
static_cast<float>(y1) + 0.5F;
1020 mFloatTexArray[2] =
static_cast<float>(x2) + 0.5F;
1021 mFloatTexArray[3] =
static_cast<float>(y2) + 0.5F;
1064 #ifdef DEBUG_DRAW_CALLS
1072 const int x2,
const int y2,
1073 const int width,
const int height)
restrict2
1075 unsigned int vp = 0;
1076 const unsigned int vLimit = mMaxVertices * 4;
1081 const float xf1 =
static_cast<float>(x1);
1082 const float xf2 =
static_cast<float>(x2);
1083 const float yf1 =
static_cast<float>(y1);
1084 const float yf2 =
static_cast<float>(y2);
1086 for (
int y = y1;
y < y2;
y += height)
1088 mFloatTexArray[vp + 0] = xf1;
1089 mFloatTexArray[vp + 1] =
static_cast<float>(
y);
1091 mFloatTexArray[vp + 2] = xf2;
1092 mFloatTexArray[vp + 3] =
static_cast<float>(
y);
1102 for (
int x = x1;
x < x2;
x += width)
1104 mFloatTexArray[vp + 0] =
static_cast<float>(
x);
1105 mFloatTexArray[vp + 1] = yf1;
1107 mFloatTexArray[vp + 2] =
static_cast<float>(
x);
1108 mFloatTexArray[vp + 3] = yf2;
1123 const GLuint texture)
1132 #ifdef DEBUG_DRAW_CALLS
1144 #ifdef DEBUG_DRAW_CALLS
1152 #ifdef DEBUG_DRAW_CALLS
1164 #ifdef DEBUG_DRAW_CALLS
1172 #ifdef DEBUG_DRAW_CALLS
1180 #ifdef DEBUG_DRAW_CALLS
1191 if (!mIsByteColor && mFloatColor == alpha)
1194 mIsByteColor =
false;
1195 mFloatColor = alpha;
1208 const int w,
const int h,
1216 const int x,
const int y,
1217 const int w,
const int h,
1228 #ifdef DEBUG_BIND_TEXTURE
1232 const std::string texture = image->mIdPath;
1233 if (mOldTexture != texture)
1235 if ((!mOldTexture.empty() || !texture.empty())
1236 && mOldTextureId != image->mGLImage)
1238 logger->
log(
"bind: %s (%d) to %s (%d)", mOldTexture.c_str(),
1239 mOldTextureId, texture.c_str(), image->mGLImage);
1241 mOldTextureId = image->mGLImage;
1242 mOldTexture = texture;
virtual void updateScreen()=0
virtual void drawImage(const Image *const image, int dstX, int dstY)=0
virtual void popClipArea()
virtual void drawRescaledPattern(const Image *const image, const int x, const int y, const int w, const int h, const int scaledWidth, const int scaledHeight)=0
virtual void drawTileCollection(const ImageCollection *const vertCol)=0
virtual bool setVideoMode(const int w, const int h, const int scale, const int bpp, const bool fs, const bool hwaccel, const bool resize, const bool noFrame, const bool allowHighDPI)=0
virtual void fillRectangle(const Rect &rectangle)=0
virtual void calcTileCollection(ImageCollection *const vertCol, const Image *const image, int x, int y)=0
virtual void drawImageCached(const Image *const image, int srcX, int srcY)=0
virtual void calcPattern(ImageVertexes *const vert, const Image *const image, const int x, const int y, const int w, const int h) const =0
virtual void deleteArrays()
virtual void drawRectangle(const Rect &rectangle)=0
MStack< ClipRect > mClipStack
virtual void calcWindow(ImageCollection *const vertCol, const int x, const int y, const int w, const int h, const ImageRect &imgRect)=0
virtual void drawLine(int x1, int y1, int x2, int y2)=0
virtual void calcTileVertexes(ImageVertexes *const vert, const Image *const image, int x, int y) const =0
virtual void drawPattern(const Image *const image, const int x, const int y, const int w, const int h)=0
virtual void initArrays(const int vertCount)
virtual void clearScreen() const
virtual void drawPoint(int x, int y)=0
virtual void drawImageRect(const int x, const int y, const int w, const int h, const ImageRect &imgRect)=0
virtual void copyImage(const Image *const image, int dstX, int dstY)=0
virtual void pushClipArea(const Rect &area)
virtual void drawTileVertexes(const ImageVertexes *const vert)=0
virtual void drawPatternCached(const Image *const image, const int x, const int y, const int w, const int h)=0
virtual void completeCache()=0
virtual void drawNet(const int x1, const int y1, const int x2, const int y2, const int width, const int height)
virtual void drawRescaledImage(const Image *const image, int dstX, int dstY, const int desiredWidth, const int desiredHeight)=0
OpenGLGraphicsVertexes ogl
void log(const char *const log_text,...)
void drawLineArrayf(const int size) A_INLINE
void drawQuadArrayfi(const int size) A_INLINE
void drawLineArrayi(const int size) A_INLINE
void drawQuadArrayii(const int size) A_INLINE
void calcPatternInline(ImageVertexes *restrict const vert, const Image *restrict const image, const int x, const int y, const int w, const int h) const restrict2 A_INLINE
void drawPatternInline(const Image *restrict const image, const int x, const int y, const int w, const int h) restrict2 A_INLINE
void drawRectangle(const Rect &restrict rect) restrict2 override final
void void drawImageInline(const Image *restrict const image, int dstX, int dstY) restrict2 A_INLINE
void calcTileVertexesInline(ImageVertexes *restrict const vert, const Image *restrict const image, int x, int y) const restrict2 A_INLINE A_NONNULL(2
void calcImageRect(ImageVertexes *restrict const vert, int x, int y, int w, int h, const ImageRect &restrict imgRect) restrict2 A_INLINE
std::vector< ImageVertexes * > ImageVertexesVector
ImageVertexesVector::const_iterator ImageCollectionCIter
static void drawRescaledQuad(const Image *const image, const int srcX, const int srcY, const int dstX, const int dstY, const int width, const int height, const int desiredWidth, const int desiredHeight)
static void drawQuad(const Image *const image, const int srcX, const int srcY, const int dstX, const int dstY, const int width, const int height)
void enableTexturingAndBlending() restrict2
static GLuint mTextureBinded
void disableTexturingAndBlending() restrict2
static void dumpSettings()
static void bindTexture(const GLenum target, const GLuint texture)
void restoreColor() restrict2 A_INLINE
void setColorAlpha(const float alpha) restrict2 A_INLINE
void drawVertexes(const OpenGLGraphicsVertexes &restrict ogl) restrict2 A_INLINE
void debugBindTexture(const Image *restrict const image) restrict2
unsigned int vertexBufSize
#define FUNC_BLOCK(name, id)
#define BLOCK_START(name)