110#define RLGL_VERSION "4.0"
115 #if defined(BUILD_LIBTYPE_SHARED)
116 #define RLAPI __declspec(dllexport)
117 #elif defined(USE_LIBTYPE_SHARED)
118 #define RLAPI __declspec(dllimport)
129 #define TRACELOG(level, ...) (void)0
130 #define TRACELOGD(...) (void)0
135 #define RL_MALLOC(sz) malloc(sz)
138 #define RL_CALLOC(n,sz) calloc(n,sz)
141 #define RL_REALLOC(n,sz) realloc(n,sz)
144 #define RL_FREE(p) free(p)
148#if !defined(GRAPHICS_API_OPENGL_11) && \
149 !defined(GRAPHICS_API_OPENGL_21) && \
150 !defined(GRAPHICS_API_OPENGL_33) && \
151 !defined(GRAPHICS_API_OPENGL_43) && \
152 !defined(GRAPHICS_API_OPENGL_ES2)
153 #define GRAPHICS_API_OPENGL_33
157#if defined(GRAPHICS_API_OPENGL_11)
158 #if defined(GRAPHICS_API_OPENGL_21)
159 #undef GRAPHICS_API_OPENGL_21
161 #if defined(GRAPHICS_API_OPENGL_33)
162 #undef GRAPHICS_API_OPENGL_33
164 #if defined(GRAPHICS_API_OPENGL_43)
165 #undef GRAPHICS_API_OPENGL_43
167 #if defined(GRAPHICS_API_OPENGL_ES2)
168 #undef GRAPHICS_API_OPENGL_ES2
174#if defined(GRAPHICS_API_OPENGL_21)
175 #define GRAPHICS_API_OPENGL_33
179#if defined(GRAPHICS_API_OPENGL_43)
180 #define GRAPHICS_API_OPENGL_33
185#define RLGL_RENDER_TEXTURES_HINT
192#ifndef RL_DEFAULT_BATCH_BUFFER_ELEMENTS
193 #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
196 #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192
198 #if defined(GRAPHICS_API_OPENGL_ES2)
202 #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 2048
205#ifndef RL_DEFAULT_BATCH_BUFFERS
206 #define RL_DEFAULT_BATCH_BUFFERS 1
208#ifndef RL_DEFAULT_BATCH_DRAWCALLS
209 #define RL_DEFAULT_BATCH_DRAWCALLS 256
211#ifndef RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS
212 #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4
216#ifndef RL_MAX_MATRIX_STACK_SIZE
217 #define RL_MAX_MATRIX_STACK_SIZE 32
221#ifndef RL_MAX_SHADER_LOCATIONS
222 #define RL_MAX_SHADER_LOCATIONS 32
226#ifndef RL_CULL_DISTANCE_NEAR
227 #define RL_CULL_DISTANCE_NEAR 0.01
229#ifndef RL_CULL_DISTANCE_FAR
230 #define RL_CULL_DISTANCE_FAR 1000.0
234#define RL_TEXTURE_WRAP_S 0x2802
235#define RL_TEXTURE_WRAP_T 0x2803
236#define RL_TEXTURE_MAG_FILTER 0x2800
237#define RL_TEXTURE_MIN_FILTER 0x2801
239#define RL_TEXTURE_FILTER_NEAREST 0x2600
240#define RL_TEXTURE_FILTER_LINEAR 0x2601
241#define RL_TEXTURE_FILTER_MIP_NEAREST 0x2700
242#define RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR 0x2702
243#define RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST 0x2701
244#define RL_TEXTURE_FILTER_MIP_LINEAR 0x2703
245#define RL_TEXTURE_FILTER_ANISOTROPIC 0x3000
247#define RL_TEXTURE_WRAP_REPEAT 0x2901
248#define RL_TEXTURE_WRAP_CLAMP 0x812F
249#define RL_TEXTURE_WRAP_MIRROR_REPEAT 0x8370
250#define RL_TEXTURE_WRAP_MIRROR_CLAMP 0x8742
253#define RL_MODELVIEW 0x1700
254#define RL_PROJECTION 0x1701
255#define RL_TEXTURE 0x1702
258#define RL_LINES 0x0001
259#define RL_TRIANGLES 0x0004
260#define RL_QUADS 0x0007
263#define RL_UNSIGNED_BYTE 0x1401
264#define RL_FLOAT 0x1406
267#define RL_STREAM_DRAW 0x88E0
268#define RL_STREAM_READ 0x88E1
269#define RL_STREAM_COPY 0x88E2
270#define RL_STATIC_DRAW 0x88E4
271#define RL_STATIC_READ 0x88E5
272#define RL_STATIC_COPY 0x88E6
273#define RL_DYNAMIC_DRAW 0x88E8
274#define RL_DYNAMIC_READ 0x88E9
275#define RL_DYNAMIC_COPY 0x88EA
278#define RL_FRAGMENT_SHADER 0x8B30
279#define RL_VERTEX_SHADER 0x8B31
280#define RL_COMPUTE_SHADER 0x91B9
324#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
327#if defined(GRAPHICS_API_OPENGL_ES2)
361#if defined(__STDC__) && __STDC_VERSION__ >= 199901L
363#elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE)
365 typedef enum bool {
false,
true }
bool;
368#if !defined(RL_MATRIX_TYPE)
376#define RL_MATRIX_TYPE
470#define RL_SHADER_LOC_MAP_DIFFUSE RL_SHADER_LOC_MAP_ALBEDO
471#define RL_SHADER_LOC_MAP_SPECULAR RL_SHADER_LOC_MAP_METALNESS
498#if defined(__cplusplus)
510RLAPI void rlFrustum(
double left,
double right,
double bottom,
double top,
double znear,
double zfar);
511RLAPI void rlOrtho(
double left,
double right,
double bottom,
double top,
double znear,
double zfar);
524RLAPI void rlColor4ub(
unsigned char r,
unsigned char g,
unsigned char b,
unsigned char a);
543#if defined(GRAPHICS_API_OPENGL_11)
544RLAPI void rlEnableStatePointer(
int vertexAttribType,
void *buffer);
545RLAPI void rlDisableStatePointer(
int vertexAttribType);
640RLAPI unsigned int rlLoadTexture(
const void *data,
int width,
int height,
int format,
int mipmapCount);
643RLAPI void rlUpdateTexture(
unsigned int id,
int offsetX,
int offsetY,
int width,
int height,
int format,
const void *data);
682RLAPI void rlCopyBuffersElements(
unsigned int destId,
unsigned int srcId,
unsigned long long destOffset,
unsigned long long srcOffset,
unsigned long long count);
700#if defined(__cplusplus)
712#if defined(RLGL_IMPLEMENTATION)
714#if defined(GRAPHICS_API_OPENGL_11)
715 #if defined(__APPLE__)
716 #include <OpenGL/gl.h>
717 #include <OpenGL/glext.h>
722 #define APIENTRY __stdcall
728 #if !defined(WINGDIAPI) && defined(_WIN32)
729 #define WINGDIAPI __declspec(dllimport)
736#if defined(GRAPHICS_API_OPENGL_33)
737 #if defined(__APPLE__)
738 #include <OpenGL/gl3.h>
739 #include <OpenGL/gl3ext.h>
741 #define GLAD_MALLOC RL_MALLOC
742 #define GLAD_FREE RL_FREE
744 #define GLAD_GL_IMPLEMENTATION
749#if defined(GRAPHICS_API_OPENGL_ES2)
750 #define GL_GLEXT_PROTOTYPES
752 #include <GLES2/gl2.h>
753 #include <GLES2/gl2ext.h>
757 #if defined(PLATFORM_RPI) || defined(PLATFORM_DRM)
758 typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (
GLenum mode,
GLint start,
GLsizei count,
GLsizei primcount);
759 typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (
GLenum mode,
GLsizei count,
GLenum type,
const void *indices,
GLsizei primcount);
760 typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (
GLuint index,
GLuint divisor);
772 #define PI 3.14159265358979323846f
775 #define DEG2RAD (PI/180.0f)
778 #define RAD2DEG (180.0f/PI)
781#ifndef GL_SHADING_LANGUAGE_VERSION
782 #define GL_SHADING_LANGUAGE_VERSION 0x8B8C
785#ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT
786 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
788#ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
789 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
791#ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
792 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
794#ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
795 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
797#ifndef GL_ETC1_RGB8_OES
798 #define GL_ETC1_RGB8_OES 0x8D64
800#ifndef GL_COMPRESSED_RGB8_ETC2
801 #define GL_COMPRESSED_RGB8_ETC2 0x9274
803#ifndef GL_COMPRESSED_RGBA8_ETC2_EAC
804 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
806#ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
807 #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
809#ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
810 #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
812#ifndef GL_COMPRESSED_RGBA_ASTC_4x4_KHR
813 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93b0
815#ifndef GL_COMPRESSED_RGBA_ASTC_8x8_KHR
816 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93b7
819#ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
820 #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
822#ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
823 #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
826#if defined(GRAPHICS_API_OPENGL_11)
827 #define GL_UNSIGNED_SHORT_5_6_5 0x8363
828 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
829 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
832#if defined(GRAPHICS_API_OPENGL_21)
833 #define GL_LUMINANCE 0x1909
834 #define GL_LUMINANCE_ALPHA 0x190A
837#if defined(GRAPHICS_API_OPENGL_ES2)
838 #define glClearDepth glClearDepthf
839 #define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER
840 #define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER
844#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION
845 #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition"
847#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD
848 #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord"
850#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL
851 #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal"
853#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR
854 #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor"
856#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT
857 #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent"
859#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2
860 #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2"
863#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MVP
864 #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp"
866#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW
867 #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView"
869#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION
870 #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection"
872#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL
873 #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel"
875#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL
876 #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal"
878#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR
879 #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse"
881#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0
882 #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0"
884#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1
885 #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1"
887#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2
888 #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2"
894#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
895typedef struct rlglData {
901 float texcoordx, texcoordy;
902 float normalx, normaly, normalz;
903 unsigned char colorr, colorg, colorb, colora;
905 int currentMatrixMode;
910 bool transformRequired;
914 unsigned int defaultTextureId;
916 unsigned int defaultVShaderId;
917 unsigned int defaultFShaderId;
918 unsigned int defaultShaderId;
919 int *defaultShaderLocs;
920 unsigned int currentShaderId;
921 int *currentShaderLocs;
924 Matrix projectionStereo[2];
925 Matrix viewOffsetStereo[2];
927 int currentBlendMode;
928 int glBlendSrcFactor;
929 int glBlendDstFactor;
932 int framebufferWidth;
933 int framebufferHeight;
952 float maxAnisotropyLevel;
958typedef void *(*rlglLoadProc)(
const char *name);
965#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
966static rlglData RLGL = { 0 };
969#if defined(GRAPHICS_API_OPENGL_ES2)
984#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
985static void rlLoadShaderDefault(
void);
986static void rlUnloadShaderDefault(
void);
987#if defined(RLGL_SHOW_GL_DETAILS_INFO)
988static char *rlGetCompressedFormatName(
int format);
991#if defined(GRAPHICS_API_OPENGL_11)
992static int rlGenTextureMipmapsData(
unsigned char *data,
int baseWidth,
int baseHeight);
993static unsigned char *rlGenNextMipmapData(
unsigned char *srcData,
int srcWidth,
int srcHeight);
995static int rlGetPixelDataSize(
int width,
int height,
int format);
997static Matrix rlMatrixIdentity(
void);
1004#if defined(GRAPHICS_API_OPENGL_11)
1018void rlFrustum(
double left,
double right,
double bottom,
double top,
double znear,
double zfar)
1020 glFrustum(left, right, bottom, top, znear, zfar);
1023void rlOrtho(
double left,
double right,
double bottom,
double top,
double znear,
double zfar)
1025 glOrtho(left, right, bottom, top, znear, zfar);
1036#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1040 if (mode ==
RL_PROJECTION) RLGL.State.currentMatrix = &RLGL.State.projection;
1041 else if (mode ==
RL_MODELVIEW) RLGL.State.currentMatrix = &RLGL.State.modelview;
1044 RLGL.State.currentMatrixMode = mode;
1054 RLGL.State.transformRequired =
true;
1055 RLGL.State.currentMatrix = &RLGL.State.transform;
1058 RLGL.State.stack[RLGL.State.stackCounter] = *RLGL.State.currentMatrix;
1059 RLGL.State.stackCounter++;
1065 if (RLGL.State.stackCounter > 0)
1067 Matrix mat = RLGL.State.stack[RLGL.State.stackCounter - 1];
1068 *RLGL.State.currentMatrix = mat;
1069 RLGL.State.stackCounter--;
1072 if ((RLGL.State.stackCounter == 0) && (RLGL.State.currentMatrixMode ==
RL_MODELVIEW))
1074 RLGL.State.currentMatrix = &RLGL.State.modelview;
1075 RLGL.State.transformRequired =
false;
1082 *RLGL.State.currentMatrix = rlMatrixIdentity();
1088 Matrix matTranslation = {
1089 1.0f, 0.0f, 0.0f, x,
1090 0.0f, 1.0f, 0.0f, y,
1091 0.0f, 0.0f, 1.0f, z,
1092 0.0f, 0.0f, 0.0f, 1.0f
1096 *RLGL.State.currentMatrix = rlMatrixMultiply(matTranslation, *RLGL.State.currentMatrix);
1101void rlRotatef(
float angle,
float x,
float y,
float z)
1103 Matrix matRotation = rlMatrixIdentity();
1106 float lengthSquared = x*x + y*y + z*z;
1107 if ((lengthSquared != 1.0f) && (lengthSquared != 0.0f))
1109 float inverseLength = 1.0f/sqrtf(lengthSquared);
1116 float sinres = sinf(
DEG2RAD*angle);
1117 float cosres = cosf(
DEG2RAD*angle);
1118 float t = 1.0f - cosres;
1120 matRotation.
m0 = x*x*t + cosres;
1121 matRotation.
m1 = y*x*t + z*sinres;
1122 matRotation.
m2 = z*x*t - y*sinres;
1123 matRotation.
m3 = 0.0f;
1125 matRotation.
m4 = x*y*t - z*sinres;
1126 matRotation.
m5 = y*y*t + cosres;
1127 matRotation.
m6 = z*y*t + x*sinres;
1128 matRotation.
m7 = 0.0f;
1130 matRotation.
m8 = x*z*t + y*sinres;
1131 matRotation.
m9 = y*z*t - x*sinres;
1132 matRotation.
m10 = z*z*t + cosres;
1133 matRotation.
m11 = 0.0f;
1135 matRotation.
m12 = 0.0f;
1136 matRotation.
m13 = 0.0f;
1137 matRotation.
m14 = 0.0f;
1138 matRotation.
m15 = 1.0f;
1141 *RLGL.State.currentMatrix = rlMatrixMultiply(matRotation, *RLGL.State.currentMatrix);
1145void rlScalef(
float x,
float y,
float z)
1148 x, 0.0f, 0.0f, 0.0f,
1149 0.0f, y, 0.0f, 0.0f,
1150 0.0f, 0.0f, z, 0.0f,
1151 0.0f, 0.0f, 0.0f, 1.0f
1155 *RLGL.State.currentMatrix = rlMatrixMultiply(matScale, *RLGL.State.currentMatrix);
1162 Matrix mat = { matf[0], matf[4], matf[8], matf[12],
1163 matf[1], matf[5], matf[9], matf[13],
1164 matf[2], matf[6], matf[10], matf[14],
1165 matf[3], matf[7], matf[11], matf[15] };
1167 *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, mat);
1171void rlFrustum(
double left,
double right,
double bottom,
double top,
double znear,
double zfar)
1173 Matrix matFrustum = { 0 };
1175 float rl = (float)(right - left);
1176 float tb = (float)(top - bottom);
1177 float fn = (float)(zfar - znear);
1179 matFrustum.
m0 = ((float) znear*2.0f)/rl;
1180 matFrustum.
m1 = 0.0f;
1181 matFrustum.
m2 = 0.0f;
1182 matFrustum.
m3 = 0.0f;
1184 matFrustum.
m4 = 0.0f;
1185 matFrustum.
m5 = ((float) znear*2.0f)/tb;
1186 matFrustum.
m6 = 0.0f;
1187 matFrustum.
m7 = 0.0f;
1189 matFrustum.
m8 = ((float)right + (
float)left)/rl;
1190 matFrustum.
m9 = ((float)top + (
float)bottom)/tb;
1191 matFrustum.
m10 = -((float)zfar + (
float)znear)/fn;
1192 matFrustum.
m11 = -1.0f;
1194 matFrustum.
m12 = 0.0f;
1195 matFrustum.
m13 = 0.0f;
1196 matFrustum.
m14 = -((float)zfar*(
float)znear*2.0f)/fn;
1197 matFrustum.
m15 = 0.0f;
1199 *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matFrustum);
1203void rlOrtho(
double left,
double right,
double bottom,
double top,
double znear,
double zfar)
1209 float rl = (float)(right - left);
1210 float tb = (float)(top - bottom);
1211 float fn = (float)(zfar - znear);
1213 matOrtho.
m0 = 2.0f/rl;
1218 matOrtho.
m5 = 2.0f/tb;
1223 matOrtho.
m10 = -2.0f/fn;
1224 matOrtho.
m11 = 0.0f;
1225 matOrtho.
m12 = -((float)left + (
float)right)/rl;
1226 matOrtho.
m13 = -((float)top + (
float)bottom)/tb;
1227 matOrtho.
m14 = -((float)zfar + (
float)znear)/fn;
1228 matOrtho.
m15 = 1.0f;
1230 *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matOrtho);
1236void rlViewport(
int x,
int y,
int width,
int height)
1244#if defined(GRAPHICS_API_OPENGL_11)
1264void rlColor4ub(
unsigned char r,
unsigned char g,
unsigned char b,
unsigned char a) {
glColor4ub(r, g, b, a); }
1268#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1274 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode != mode)
1276 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0)
1283 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode ==
RL_LINES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount : RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4);
1284 else if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode ==
RL_TRIANGLES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4)));
1285 else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0;
1289 RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment;
1290 RLGL.currentBatch->drawCounter++;
1296 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = mode;
1297 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount = 0;
1298 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = RLGL.State.defaultTextureId;
1308 RLGL.currentBatch->currentDepth += (1.0f/20000.0f);
1312 if (RLGL.State.vertexCounter >= (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4 - 4))
1317 for (
int i = RLGL.State.stackCounter; i >= 0; i--)
rlPopMatrix();
1331 if (RLGL.State.transformRequired)
1333 tx = RLGL.State.transform.m0*x + RLGL.State.transform.m4*y + RLGL.State.transform.m8*z + RLGL.State.transform.m12;
1334 ty = RLGL.State.transform.m1*x + RLGL.State.transform.m5*y + RLGL.State.transform.m9*z + RLGL.State.transform.m13;
1335 tz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z + RLGL.State.transform.m14;
1339 if (RLGL.State.vertexCounter < (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4))
1342 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter] = tx;
1343 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 1] = ty;
1344 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 2] = tz;
1347 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter] = RLGL.State.texcoordx;
1348 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter + 1] = RLGL.State.texcoordy;
1354 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr;
1355 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 1] = RLGL.State.colorg;
1356 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 2] = RLGL.State.colorb;
1357 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 3] = RLGL.State.colora;
1359 RLGL.State.vertexCounter++;
1361 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount++;
1369 rlVertex3f(x, y, RLGL.currentBatch->currentDepth);
1375 rlVertex3f((
float)x, (
float)y, RLGL.currentBatch->currentDepth);
1382 RLGL.State.texcoordx = x;
1383 RLGL.State.texcoordy = y;
1390 RLGL.State.normalx = x;
1391 RLGL.State.normaly = y;
1392 RLGL.State.normalz = z;
1396void rlColor4ub(
unsigned char x,
unsigned char y,
unsigned char z,
unsigned char w)
1398 RLGL.State.colorr = x;
1399 RLGL.State.colorg = y;
1400 RLGL.State.colorb = z;
1401 RLGL.State.colora = w;
1405void rlColor4f(
float r,
float g,
float b,
float a)
1407 rlColor4ub((
unsigned char)(r*255), (
unsigned char)(g*255), (
unsigned char)(b*255), (
unsigned char)(a*255));
1411void rlColor3f(
float x,
float y,
float z)
1413 rlColor4ub((
unsigned char)(x*255), (
unsigned char)(y*255), (
unsigned char)(z*255), 255);
1427#if defined(GRAPHICS_API_OPENGL_11)
1431 if (RLGL.State.vertexCounter >=
1432 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4)
1440#if defined(GRAPHICS_API_OPENGL_11)
1443 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId !=
id)
1445 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0)
1452 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode ==
RL_LINES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount : RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4);
1453 else if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode ==
RL_TRIANGLES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4)));
1454 else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0;
1458 RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment;
1460 RLGL.currentBatch->drawCounter++;
1466 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId =
id;
1467 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount = 0;
1476#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1484#if defined(GRAPHICS_API_OPENGL_11)
1493#if defined(GRAPHICS_API_OPENGL_11)
1502#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1510#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1527#if !defined(GRAPHICS_API_OPENGL_11)
1539#if !defined(GRAPHICS_API_OPENGL_11)
1541 else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f)
1543 TRACELOG(
RL_LOG_WARNING,
"GL: Maximum anisotropic filter level supported is %iX",
id, (
int)RLGL.ExtSupported.maxAnisotropyLevel);
1558#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2))
1566#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2))
1574#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT)
1582#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT)
1591#if (defined(GRAPHICS_API_OPENGL_33) && defined(RLGL_RENDER_TEXTURES_HINT))
1602 unsigned int buffers[8] = {
1655void rlScissor(
int x,
int y,
int width,
int height) {
glScissor(x, y, width, height); }
1660#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
1669#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
1689#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11)
1697#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11)
1705#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2))
1706 RLGL.State.stereoRender =
true;
1713#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2))
1714 RLGL.State.stereoRender =
false;
1721#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2))
1722 return RLGL.State.stereoRender;
1729void rlClearColor(
unsigned char r,
unsigned char g,
unsigned char b,
unsigned char a)
1732 float cr = (float)r/255;
1733 float cg = (float)g/255;
1734 float cb = (float)b/255;
1735 float ca = (float)a/255;
1750#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1774#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1775 if (RLGL.State.currentBlendMode != mode)
1795 RLGL.State.currentBlendMode = mode;
1803#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1804 RLGL.State.glBlendSrcFactor = glSrcFactor;
1805 RLGL.State.glBlendDstFactor = glDstFactor;
1806 RLGL.State.glBlendEquation = glEquation;
1813#if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43)
1824 if ((
id == 131169) || (
id == 131185) || (
id == 131218) || (
id == 131204))
return;
1826 const char *msgSource =
NULL;
1838 const char *msgType =
NULL;
1853 const char *msgSeverity =
"DEFAULT";
1875void rlglInit(
int width,
int height)
1878#if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43)
1892#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1894 unsigned char pixels[4] = { 255, 255, 255, 255 };
1897 if (RLGL.State.defaultTextureId != 0)
TRACELOG(
RL_LOG_INFO,
"TEXTURE: [ID %i] Default texture loaded successfully", RLGL.State.defaultTextureId);
1902 rlLoadShaderDefault();
1903 RLGL.State.currentShaderId = RLGL.State.defaultShaderId;
1904 RLGL.State.currentShaderLocs = RLGL.State.defaultShaderLocs;
1908 RLGL.currentBatch = &RLGL.defaultBatch;
1914 RLGL.State.transform = rlMatrixIdentity();
1915 RLGL.State.projection = rlMatrixIdentity();
1916 RLGL.State.modelview = rlMatrixIdentity();
1917 RLGL.State.currentMatrix = &RLGL.State.modelview;
1937#if defined(GRAPHICS_API_OPENGL_33)
1941#if defined(GRAPHICS_API_OPENGL_11)
1947#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1949 RLGL.State.framebufferWidth = width;
1950 RLGL.State.framebufferHeight = height;
1965#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
1968 rlUnloadShaderDefault();
1971 TRACELOG(
RL_LOG_INFO,
"TEXTURE: [ID %i] Default texture unloaded successfully", RLGL.State.defaultTextureId);
1979#if defined(GRAPHICS_API_OPENGL_33)
1981 #if !defined(__APPLE__)
1991#if defined(RLGL_SHOW_GL_DETAILS_INFO)
2000 RLGL.ExtSupported.vao =
true;
2001 RLGL.ExtSupported.instancing =
true;
2002 RLGL.ExtSupported.texNPOT =
true;
2003 RLGL.ExtSupported.texFloat32 =
true;
2004 RLGL.ExtSupported.texDepth =
true;
2005 RLGL.ExtSupported.maxDepthBits = 32;
2006 RLGL.ExtSupported.texAnisoFilter =
true;
2007 RLGL.ExtSupported.texMirrorClamp =
true;
2008 #if defined(GRAPHICS_API_OPENGL_43)
2012 #if !defined(__APPLE__)
2019#if defined(GRAPHICS_API_OPENGL_ES2)
2022 const char **extList =
RL_MALLOC(512*
sizeof(
const char *));
2026 int size = strlen(extensions) + 1;
2027 char *extensionsDup = (
char *)
RL_CALLOC(size,
sizeof(
char));
2028 strcpy(extensionsDup, extensions);
2029 extList[numExt] = extensionsDup;
2031 for (
int i = 0; i < size; i++)
2033 if (extensionsDup[i] ==
' ')
2035 extensionsDup[i] =
'\0';
2037 extList[numExt] = &extensionsDup[i + 1];
2043#if defined(RLGL_SHOW_GL_DETAILS_INFO)
2049 for (
int i = 0; i < numExt; i++)
2053 if (strcmp(extList[i], (
const char *)
"GL_OES_vertex_array_object") == 0)
2057 glGenVertexArrays = (PFNGLGENVERTEXARRAYSOESPROC)((rlglLoadProc)loader)(
"glGenVertexArraysOES");
2058 glBindVertexArray = (PFNGLBINDVERTEXARRAYOESPROC)((rlglLoadProc)loader)(
"glBindVertexArrayOES");
2059 glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSOESPROC)((rlglLoadProc)loader)(
"glDeleteVertexArraysOES");
2066 if (strcmp(extList[i], (
const char *)
"GL_ANGLE_instanced_arrays") == 0)
2068 glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)(
"glDrawArraysInstancedANGLE");
2069 glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)(
"glDrawElementsInstancedANGLE");
2070 glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)(
"glVertexAttribDivisorANGLE");
2076 if ((strcmp(extList[i], (
const char *)
"GL_EXT_draw_instanced") == 0) &&
2077 (strcmp(extList[i], (
const char *)
"GL_EXT_instanced_arrays") == 0))
2079 glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)(
"glDrawArraysInstancedEXT");
2080 glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)(
"glDrawElementsInstancedEXT");
2081 glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)(
"glVertexAttribDivisorEXT");
2089 if (strcmp(extList[i], (
const char *)
"GL_OES_texture_npot") == 0) RLGL.ExtSupported.texNPOT =
true;
2092 if (strcmp(extList[i], (
const char *)
"GL_OES_texture_float") == 0) RLGL.ExtSupported.texFloat32 =
true;
2095 if ((strcmp(extList[i], (
const char *)
"GL_OES_depth_texture") == 0) ||
2096 (strcmp(extList[i], (
const char *)
"GL_WEBGL_depth_texture") == 0)) RLGL.ExtSupported.texDepth =
true;
2098 if (strcmp(extList[i], (
const char *)
"GL_OES_depth24") == 0) RLGL.ExtSupported.maxDepthBits = 24;
2099 if (strcmp(extList[i], (
const char *)
"GL_OES_depth32") == 0) RLGL.ExtSupported.maxDepthBits = 32;
2102 if ((strcmp(extList[i], (
const char *)
"GL_EXT_texture_compression_s3tc") == 0) ||
2103 (strcmp(extList[i], (
const char *)
"GL_WEBGL_compressed_texture_s3tc") == 0) ||
2104 (strcmp(extList[i], (
const char *)
"GL_WEBKIT_WEBGL_compressed_texture_s3tc") == 0)) RLGL.ExtSupported.texCompDXT =
true;
2107 if ((strcmp(extList[i], (
const char *)
"GL_OES_compressed_ETC1_RGB8_texture") == 0) ||
2108 (strcmp(extList[i], (
const char *)
"GL_WEBGL_compressed_texture_etc1") == 0)) RLGL.ExtSupported.texCompETC1 =
true;
2111 if (strcmp(extList[i], (
const char *)
"GL_ARB_ES3_compatibility") == 0) RLGL.ExtSupported.texCompETC2 =
true;
2114 if (strcmp(extList[i], (
const char *)
"GL_IMG_texture_compression_pvrtc") == 0) RLGL.ExtSupported.texCompPVRT =
true;
2117 if (strcmp(extList[i], (
const char *)
"GL_KHR_texture_compression_astc_hdr") == 0) RLGL.ExtSupported.texCompASTC =
true;
2120 if (strcmp(extList[i], (
const char *)
"GL_EXT_texture_filter_anisotropic") == 0) RLGL.ExtSupported.texAnisoFilter =
true;
2123 if (strcmp(extList[i], (
const char *)
"GL_EXT_texture_mirror_clamp") == 0) RLGL.ExtSupported.texMirrorClamp =
true;
2140#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2142 #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
2143 #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
2145 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &RLGL.ExtSupported.maxAnisotropyLevel);
2147#if defined(RLGL_SHOW_GL_DETAILS_INFO)
2150 GLint capability = 0;
2159 #if !defined(GRAPHICS_API_OPENGL_ES2)
2164 if (RLGL.ExtSupported.texAnisoFilter)
TRACELOG(
RL_LOG_INFO,
" GL_MAX_TEXTURE_MAX_ANISOTROPY: %.0f", RLGL.ExtSupported.maxAnisotropyLevel);
2170 for (
int i = 0; i < capability; i++)
TRACELOG(
RL_LOG_INFO,
" %s", rlGetCompressedFormatName(compFormats[i]));
2173#if defined(GRAPHICS_API_OPENGL_43)
2182 #if defined(GRAPHICS_API_OPENGL_ES2)
2183 if (RLGL.ExtSupported.vao)
TRACELOG(
RL_LOG_INFO,
"GL: VAO extension detected, VAO functions loaded successfully");
2185 if (RLGL.ExtSupported.texNPOT)
TRACELOG(
RL_LOG_INFO,
"GL: NPOT textures extension detected, full NPOT textures supported");
2186 else TRACELOG(
RL_LOG_WARNING,
"GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)");
2188 if (RLGL.ExtSupported.texCompDXT)
TRACELOG(
RL_LOG_INFO,
"GL: DXT compressed textures supported");
2189 if (RLGL.ExtSupported.texCompETC1)
TRACELOG(
RL_LOG_INFO,
"GL: ETC1 compressed textures supported");
2190 if (RLGL.ExtSupported.texCompETC2)
TRACELOG(
RL_LOG_INFO,
"GL: ETC2/EAC compressed textures supported");
2191 if (RLGL.ExtSupported.texCompPVRT)
TRACELOG(
RL_LOG_INFO,
"GL: PVRT compressed textures supported");
2192 if (RLGL.ExtSupported.texCompASTC)
TRACELOG(
RL_LOG_INFO,
"GL: ASTC compressed textures supported");
2193 if (RLGL.ExtSupported.computeShader)
TRACELOG(
RL_LOG_INFO,
"GL: Compute shaders supported");
2194 if (RLGL.ExtSupported.ssbo)
TRACELOG(
RL_LOG_INFO,
"GL: Shader storage buffer objects supported");
2204#if defined(GRAPHICS_API_OPENGL_11)
2207#if defined(GRAPHICS_API_OPENGL_21)
2208 #if defined(__APPLE__)
2213#elif defined(GRAPHICS_API_OPENGL_33)
2216#if defined(GRAPHICS_API_OPENGL_43)
2219#if defined(GRAPHICS_API_OPENGL_ES2)
2228#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2229 RLGL.State.framebufferWidth = width;
2236#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2237 RLGL.State.framebufferHeight = height;
2245#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2246 width = RLGL.State.framebufferWidth;
2255#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2256 height = RLGL.State.framebufferHeight;
2265 unsigned int id = 0;
2266#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2267 id = RLGL.State.defaultTextureId;
2275 unsigned int id = 0;
2276#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2277 id = RLGL.State.defaultShaderId;
2286#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2287 locs = RLGL.State.defaultShaderLocs;
2299#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2304 for (
int i = 0; i < numBuffers; i++)
2311#if defined(GRAPHICS_API_OPENGL_33)
2314#if defined(GRAPHICS_API_OPENGL_ES2)
2325 for (
int j = 0; j < (6*bufferElements); j += 6)
2337 RLGL.State.vertexCounter = 0;
2340 TRACELOG(
RL_LOG_INFO,
"RLGL: Render batch vertex buffers loaded successfully in RAM (CPU)");
2345 for (
int i = 0; i < numBuffers; i++)
2347 if (RLGL.ExtSupported.vao)
2379#if defined(GRAPHICS_API_OPENGL_33)
2382#if defined(GRAPHICS_API_OPENGL_ES2)
2387 TRACELOG(
RL_LOG_INFO,
"RLGL: Render batch vertex buffers loaded successfully in VRAM (GPU)");
2421#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2430 if (RLGL.ExtSupported.vao)
2466#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2471 if (RLGL.State.vertexCounter > 0)
2513 Matrix matProjection = RLGL.State.projection;
2514 Matrix matModelView = RLGL.State.modelview;
2517 if (RLGL.State.stereoRender) eyeCount = 2;
2519 for (
int eye = 0; eye < eyeCount; eye++)
2524 rlViewport(eye*RLGL.State.framebufferWidth/2, 0, RLGL.State.framebufferWidth/2, RLGL.State.framebufferHeight);
2533 if (RLGL.State.vertexCounter > 0)
2539 Matrix matMVP = rlMatrixMultiply(RLGL.State.modelview, RLGL.State.projection);
2540 float matMVPfloat[16] = {
2541 matMVP.
m0, matMVP.
m1, matMVP.
m2, matMVP.
m3,
2542 matMVP.
m4, matMVP.
m5, matMVP.
m6, matMVP.
m7,
2543 matMVP.
m8, matMVP.
m9, matMVP.
m10, matMVP.
m11,
2577 if (RLGL.State.activeTextureId[i] > 0)
2588 for (
int i = 0, vertexOffset = 0; i < batch->
drawCounter; i++)
2596#if defined(GRAPHICS_API_OPENGL_33)
2602#if defined(GRAPHICS_API_OPENGL_ES2)
2610 if (!RLGL.ExtSupported.vao)
2625 if (eyeCount == 2)
rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight);
2631 RLGL.State.vertexCounter = 0;
2637 RLGL.State.projection = matProjection;
2638 RLGL.State.modelview = matModelView;
2664#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2667 if (batch !=
NULL) RLGL.currentBatch = batch;
2668 else RLGL.currentBatch = &RLGL.defaultBatch;
2675#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2684 bool overflow =
false;
2686#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2687 if ((RLGL.State.vertexCounter + vCount) >=
2688 (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4))
2690 int currentMode = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode;
2691 int currentTexture = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId;
2697 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = currentMode;
2698 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = currentTexture;
2708unsigned int rlLoadTexture(
const void *data,
int width,
int height,
int format,
int mipmapCount)
2712 unsigned int id = 0;
2715#if defined(GRAPHICS_API_OPENGL_11)
2728#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2761 int mipWidth = width;
2762 int mipHeight = height;
2766 for (
int i = 0; i < mipmapCount; i++)
2768 unsigned int mipSize = rlGetPixelDataSize(mipWidth, mipHeight, format);
2770 int glInternalFormat, glFormat, glType;
2773 TRACELOGD(
"TEXTURE: Load mipmap level %i (%i x %i), size: %i, offset: %i", i, mipWidth, mipHeight, mipSize, mipOffset);
2775 if (glInternalFormat != -1)
2778#if !defined(GRAPHICS_API_OPENGL_11)
2782#if defined(GRAPHICS_API_OPENGL_33)
2790#if defined(GRAPHICS_API_OPENGL_21)
2792#elif defined(GRAPHICS_API_OPENGL_33)
2802 mipOffset += mipSize;
2805 if (mipWidth < 1) mipWidth = 1;
2806 if (mipHeight < 1) mipHeight = 1;
2811#if defined(GRAPHICS_API_OPENGL_ES2)
2813 if (RLGL.ExtSupported.texNPOT)
2833#if defined(GRAPHICS_API_OPENGL_33)
2834 if (mipmapCount > 1)
2859 unsigned int id = 0;
2861#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2863 if (!RLGL.ExtSupported.texDepth) useRenderBuffer =
true;
2869#if defined(GRAPHICS_API_OPENGL_ES2)
2870 if (RLGL.ExtSupported.maxDepthBits == 32) glInternalFormat = GL_DEPTH_COMPONENT32_OES;
2871 else if (RLGL.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24_OES;
2875 if (!useRenderBuffer && RLGL.ExtSupported.texDepth)
2900 TRACELOG(
RL_LOG_INFO,
"TEXTURE: [ID %i] Depth renderbuffer loaded successfully (%i bits)",
id, (RLGL.ExtSupported.maxDepthBits >= 24)? RLGL.ExtSupported.maxDepthBits : 16);
2912 unsigned int id = 0;
2914#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
2915 unsigned int dataSize = rlGetPixelDataSize(size, size, format);
2920 int glInternalFormat, glFormat, glType;
2923 if (glInternalFormat != -1)
2926 for (
unsigned int i = 0; i < 6; i++)
2949#if defined(GRAPHICS_API_OPENGL_33)
2957#if defined(GRAPHICS_API_OPENGL_21)
2959#elif defined(GRAPHICS_API_OPENGL_33)
2973#if defined(GRAPHICS_API_OPENGL_33)
2980 if (
id > 0)
TRACELOG(
RL_LOG_INFO,
"TEXTURE: [ID %i] Cubemap texture loaded successfully (%ix%i)",
id, size, size);
2988void rlUpdateTexture(
unsigned int id,
int offsetX,
int offsetY,
int width,
int height,
int format,
const void *data)
2992 int glInternalFormat, glFormat, glType;
2999 else TRACELOG(
RL_LOG_WARNING,
"TEXTURE: [ID %i] Failed to update for current texture format (%i)",
id, format);
3005 *glInternalFormat = -1;
3011 #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_21) || defined(GRAPHICS_API_OPENGL_ES2)
3020 #if !defined(GRAPHICS_API_OPENGL_11)
3025 #elif defined(GRAPHICS_API_OPENGL_33)
3037 #if !defined(GRAPHICS_API_OPENGL_11)
3066 bool texIsPOT =
false;
3068 if (((width > 0) && ((width & (width - 1)) == 0)) &&
3069 ((height > 0) && ((height & (height - 1)) == 0))) texIsPOT =
true;
3071#if defined(GRAPHICS_API_OPENGL_11)
3082 int mipmapCount = rlGenTextureMipmapsData(texData, width, height);
3084 int size = width*height*4;
3087 int mipWidth = width/2;
3088 int mipHeight = height/2;
3091 for (
int level = 1; level < mipmapCount; level++)
3095 size = mipWidth*mipHeight*4;
3102 *mipmaps = mipmapCount + 1;
3105 TRACELOG(
RL_LOG_WARNING,
"TEXTURE: [ID %i] Mipmaps generated manually on CPU side, total: %i",
id, *mipmaps);
3107 else TRACELOG(
RL_LOG_WARNING,
"TEXTURE: [ID %i] Failed to generate mipmaps for provided texture format",
id);
3110#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3111 if ((texIsPOT) || (RLGL.ExtSupported.texNPOT))
3119 #define MIN(a,b) (((a)<(b))?(a):(b))
3120 #define MAX(a,b) (((a)>(b))?(a):(b))
3122 *mipmaps = 1 + (int)floor(log(MAX(width, height))/log(2));
3123 TRACELOG(
RL_LOG_INFO,
"TEXTURE: [ID %i] Mipmaps generated automatically, total: %i",
id, *mipmaps);
3135 void *pixels =
NULL;
3137#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)
3153 int glInternalFormat, glFormat, glType;
3155 unsigned int size = rlGetPixelDataSize(width, height, format);
3162 else TRACELOG(
RL_LOG_WARNING,
"TEXTURE: [ID %i] Data retrieval not suported for pixel format (%i)",
id, format);
3167#if defined(GRAPHICS_API_OPENGL_ES2)
3200 unsigned char *screenData = (
unsigned char *)
RL_CALLOC(width*height*4,
sizeof(
unsigned char));
3207 unsigned char *imgData = (
unsigned char *)
RL_MALLOC(width*height*4*
sizeof(
unsigned char));
3209 for (
int y = height - 1; y >= 0; y--)
3211 for (
int x = 0; x < (width*4); x++)
3213 imgData[((height - 1) - y)*width*4 + x] = screenData[(y*width*4) + x];
3217 if (((x + 1)%4) == 0) imgData[((height - 1) - y)*width*4 + x] = 255;
3232 unsigned int fboId = 0;
3234#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT)
3244void rlFramebufferAttach(
unsigned int fboId,
unsigned int texId,
int attachType,
int texType,
int mipLevel)
3246#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT)
3287 bool result =
false;
3289#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT)
3300#if defined(GRAPHICS_API_OPENGL_ES2)
3301 case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
TRACELOG(
RL_LOG_WARNING,
"FBO: [ID %i] Framebuffer has incomplete dimensions",
id);
break;
3320#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT)
3323 int depthType = 0, depthId = 0;
3328 unsigned int depthIdU = (
unsigned int)depthId;
3347 unsigned int id = 0;
3349#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3361 unsigned int id = 0;
3363#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3375#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3383#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3391#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3399#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3408#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3418#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3427 bool result =
false;
3428#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3429 if (RLGL.ExtSupported.vao)
3441#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3449#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3457#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3477#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3485#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3490#if defined(GRAPHICS_API_OPENGL_11)
3492void rlEnableStatePointer(
int vertexAttribType,
void *buffer)
3495 switch (vertexAttribType)
3507void rlDisableStatePointer(
int vertexAttribType)
3516 unsigned int vaoId = 0;
3517#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3518 if (RLGL.ExtSupported.vao)
3527void rlSetVertexAttribute(
unsigned int index,
int compSize,
int type,
bool normalized,
int stride,
const void *pointer)
3529#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3537#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3545#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3546 if (RLGL.ExtSupported.vao)
3558#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3570 unsigned int id = 0;
3572#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3573 unsigned int vertexShaderId = 0;
3574 unsigned int fragmentShaderId = 0;
3579 if (vertexShaderId == 0) vertexShaderId = RLGL.State.defaultVShaderId;
3584 if (fragmentShaderId == 0) fragmentShaderId = RLGL.State.defaultFShaderId;
3587 if ((vertexShaderId == RLGL.State.defaultVShaderId) && (fragmentShaderId == RLGL.State.defaultFShaderId))
id = RLGL.State.defaultShaderId;
3595 if (vertexShaderId != RLGL.State.defaultVShaderId)
3600 if (fragmentShaderId != RLGL.State.defaultFShaderId)
3611 id = RLGL.State.defaultShaderId;
3645 unsigned int shader = 0;
3647#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3662 #if defined(GRAPHICS_API_OPENGL_43)
3674 char *log =
RL_CALLOC(maxLength,
sizeof(
char));
3687 #if defined(GRAPHICS_API_OPENGL_43)
3701 unsigned int program = 0;
3703#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3736 char *log =
RL_CALLOC(maxLength,
sizeof(
char));
3762#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3765 TRACELOG(
RL_LOG_INFO,
"SHADER: [ID %i] Unloaded shader program data from VRAM (GPU)",
id);
3773#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3776 if (location == -1)
TRACELOG(
RL_LOG_WARNING,
"SHADER: [ID %i] Failed to find shader uniform: %s", shaderId, uniformName);
3777 else TRACELOG(
RL_LOG_INFO,
"SHADER: [ID %i] Shader uniform (%s) set at location: %i", shaderId, uniformName, location);
3786#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3789 if (location == -1)
TRACELOG(
RL_LOG_WARNING,
"SHADER: [ID %i] Failed to find shader attribute: %s", shaderId, attribName);
3790 else TRACELOG(
RL_LOG_INFO,
"SHADER: [ID %i] Shader attribute (%s) set at location: %i", shaderId, attribName, location);
3796void rlSetUniform(
int locIndex,
const void *value,
int uniformType,
int count)
3798#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3799 switch (uniformType)
3818#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3825 default:
TRACELOG(
RL_LOG_WARNING,
"SHADER: Failed to set attrib default value, data type not recognized");
3833#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3834 float matfloat[16] = {
3847#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3855 if (RLGL.State.activeTextureId[i] == 0)
3858 RLGL.State.activeTextureId[i] = textureId;
3868#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
3869 if (RLGL.State.currentShaderId !=
id)
3872 RLGL.State.currentShaderId =
id;
3873 RLGL.State.currentShaderLocs = locs;
3881 unsigned int program = 0;
3883#if defined(GRAPHICS_API_OPENGL_43)
3903 char *log =
RL_CALLOC(maxLength,
sizeof(
char));
3920 TRACELOG(
RL_LOG_INFO,
"SHADER: [ID %i] Compute shader program loaded successfully", program);
3930#if defined(GRAPHICS_API_OPENGL_43)
3936unsigned int rlLoadShaderBuffer(
unsigned long long size,
const void *data,
int usageHint)
3938 unsigned int ssbo = 0;
3940#if defined(GRAPHICS_API_OPENGL_43)
3954#if defined(GRAPHICS_API_OPENGL_43)
3962#if defined(GRAPHICS_API_OPENGL_43)
3973#if defined(GRAPHICS_API_OPENGL_43)
3978 return (size > 0)? size : 0;
3984#if defined(GRAPHICS_API_OPENGL_43)
3993#if defined(GRAPHICS_API_OPENGL_43)
3999void rlCopyBuffersElements(
unsigned int destId,
unsigned int srcId,
unsigned long long destOffset,
unsigned long long srcOffset,
unsigned long long count)
4001#if defined(GRAPHICS_API_OPENGL_43)
4009void rlBindImageTexture(
unsigned int id,
unsigned int index,
unsigned int format,
int readonly)
4011#if defined(GRAPHICS_API_OPENGL_43)
4012 int glInternalFormat = 0, glFormat = 0, glType = 0;
4024 Matrix matrix = rlMatrixIdentity();
4025#if defined(GRAPHICS_API_OPENGL_11)
4038 matrix.
m10 = mat[10];
4039 matrix.
m11 = mat[11];
4040 matrix.
m12 = mat[12];
4041 matrix.
m13 = mat[13];
4042 matrix.
m14 = mat[14];
4043 matrix.
m15 = mat[15];
4045 matrix = RLGL.State.modelview;
4053#if defined(GRAPHICS_API_OPENGL_11)
4075 return RLGL.State.projection;
4082 Matrix mat = rlMatrixIdentity();
4083#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4088 mat = RLGL.State.transform;
4096 Matrix mat = rlMatrixIdentity();
4097#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4098 mat = RLGL.State.projectionStereo[eye];
4106 Matrix mat = rlMatrixIdentity();
4107#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4108 mat = RLGL.State.viewOffsetStereo[eye];
4116#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4117 RLGL.State.modelview = view;
4124#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4125 RLGL.State.projection = projection;
4132#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4133 RLGL.State.projectionStereo[0] = right;
4134 RLGL.State.projectionStereo[1] = left;
4141#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4142 RLGL.State.viewOffsetStereo[0] = right;
4143 RLGL.State.viewOffsetStereo[1] = left;
4150#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4151 unsigned int quadVAO = 0;
4152 unsigned int quadVBO = 0;
4154 float vertices[] = {
4156 -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
4157 -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
4158 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
4159 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
4191#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4192 unsigned int cubeVAO = 0;
4193 unsigned int cubeVBO = 0;
4195 float vertices[] = {
4197 -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
4198 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
4199 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
4200 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
4201 -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
4202 -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
4203 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
4204 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
4205 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
4206 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
4207 -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
4208 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
4209 -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
4210 -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
4211 -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
4212 -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
4213 -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
4214 -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
4215 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
4216 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
4217 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
4218 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
4219 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
4220 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
4221 -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
4222 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
4223 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
4224 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
4225 -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
4226 -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
4227 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
4228 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
4229 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
4230 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
4231 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
4232 -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f
4292 default:
return "UNKNOWN";
break;
4299#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
4303static void rlLoadShaderDefault(
void)
4311 const char *defaultVShaderCode =
4312#
if defined(GRAPHICS_API_OPENGL_21)
4314 "attribute vec3 vertexPosition; \n"
4315 "attribute vec2 vertexTexCoord; \n"
4316 "attribute vec4 vertexColor; \n"
4317 "varying vec2 fragTexCoord; \n"
4318 "varying vec4 fragColor; \n"
4319#elif defined(GRAPHICS_API_OPENGL_33)
4321 "in vec3 vertexPosition; \n"
4322 "in vec2 vertexTexCoord; \n"
4323 "in vec4 vertexColor; \n"
4324 "out vec2 fragTexCoord; \n"
4325 "out vec4 fragColor; \n"
4327#if defined(GRAPHICS_API_OPENGL_ES2)
4329 "attribute vec3 vertexPosition; \n"
4330 "attribute vec2 vertexTexCoord; \n"
4331 "attribute vec4 vertexColor; \n"
4332 "varying vec2 fragTexCoord; \n"
4333 "varying vec4 fragColor; \n"
4335 "uniform mat4 mvp; \n"
4338 " fragTexCoord = vertexTexCoord; \n"
4339 " fragColor = vertexColor; \n"
4340 " gl_Position = mvp*vec4(vertexPosition, 1.0); \n"
4344 const char *defaultFShaderCode =
4345#if defined(GRAPHICS_API_OPENGL_21)
4347 "varying vec2 fragTexCoord; \n"
4348 "varying vec4 fragColor; \n"
4349 "uniform sampler2D texture0; \n"
4350 "uniform vec4 colDiffuse; \n"
4353 " vec4 texelColor = texture2D(texture0, fragTexCoord); \n"
4354 " gl_FragColor = texelColor*colDiffuse*fragColor; \n"
4356#elif defined(GRAPHICS_API_OPENGL_33)
4358 "in vec2 fragTexCoord; \n"
4359 "in vec4 fragColor; \n"
4360 "out vec4 finalColor; \n"
4361 "uniform sampler2D texture0; \n"
4362 "uniform vec4 colDiffuse; \n"
4365 " vec4 texelColor = texture(texture0, fragTexCoord); \n"
4366 " finalColor = texelColor*colDiffuse*fragColor; \n"
4369#if defined(GRAPHICS_API_OPENGL_ES2)
4371 "precision mediump float; \n"
4372 "varying vec2 fragTexCoord; \n"
4373 "varying vec4 fragColor; \n"
4374 "uniform sampler2D texture0; \n"
4375 "uniform vec4 colDiffuse; \n"
4378 " vec4 texelColor = texture2D(texture0, fragTexCoord); \n"
4379 " gl_FragColor = texelColor*colDiffuse*fragColor; \n"
4388 RLGL.State.defaultShaderId =
rlLoadShaderProgram(RLGL.State.defaultVShaderId, RLGL.State.defaultFShaderId);
4390 if (RLGL.State.defaultShaderId > 0)
4392 TRACELOG(
RL_LOG_INFO,
"SHADER: [ID %i] Default shader loaded successfully", RLGL.State.defaultShaderId);
4404 else TRACELOG(
RL_LOG_WARNING,
"SHADER: [ID %i] Failed to load default shader", RLGL.State.defaultShaderId);
4409static void rlUnloadShaderDefault(
void)
4413 glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultVShaderId);
4414 glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultFShaderId);
4420 RL_FREE(RLGL.State.defaultShaderLocs);
4422 TRACELOG(
RL_LOG_INFO,
"SHADER: [ID %i] Default shader unloaded successfully", RLGL.State.defaultShaderId);
4425#if defined(RLGL_SHOW_GL_DETAILS_INFO)
4427static char *rlGetCompressedFormatName(
int format)
4432 case 0x83F0:
return "GL_COMPRESSED_RGB_S3TC_DXT1_EXT";
break;
4433 case 0x83F1:
return "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT";
break;
4434 case 0x83F2:
return "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT";
break;
4435 case 0x83F3:
return "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT";
break;
4437 case 0x86B0:
return "GL_COMPRESSED_RGB_FXT1_3DFX";
break;
4438 case 0x86B1:
return "GL_COMPRESSED_RGBA_FXT1_3DFX";
break;
4440 case 0x8C00:
return "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG";
break;
4441 case 0x8C01:
return "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG";
break;
4442 case 0x8C02:
return "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG";
break;
4443 case 0x8C03:
return "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG";
break;
4445 case 0x8D64:
return "GL_ETC1_RGB8_OES";
break;
4447 case 0x8DBB:
return "GL_COMPRESSED_RED_RGTC1";
break;
4448 case 0x8DBC:
return "GL_COMPRESSED_SIGNED_RED_RGTC1";
break;
4449 case 0x8DBD:
return "GL_COMPRESSED_RG_RGTC2";
break;
4450 case 0x8DBE:
return "GL_COMPRESSED_SIGNED_RG_RGTC2";
break;
4452 case 0x8E8C:
return "GL_COMPRESSED_RGBA_BPTC_UNORM_ARB";
break;
4453 case 0x8E8D:
return "GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB";
break;
4454 case 0x8E8E:
return "GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB";
break;
4455 case 0x8E8F:
return "GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB";
break;
4457 case 0x9274:
return "GL_COMPRESSED_RGB8_ETC2";
break;
4458 case 0x9275:
return "GL_COMPRESSED_SRGB8_ETC2";
break;
4459 case 0x9276:
return "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2";
break;
4460 case 0x9277:
return "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2";
break;
4461 case 0x9278:
return "GL_COMPRESSED_RGBA8_ETC2_EAC";
break;
4462 case 0x9279:
return "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC";
break;
4463 case 0x9270:
return "GL_COMPRESSED_R11_EAC";
break;
4464 case 0x9271:
return "GL_COMPRESSED_SIGNED_R11_EAC";
break;
4465 case 0x9272:
return "GL_COMPRESSED_RG11_EAC";
break;
4466 case 0x9273:
return "GL_COMPRESSED_SIGNED_RG11_EAC";
break;
4468 case 0x93B0:
return "GL_COMPRESSED_RGBA_ASTC_4x4_KHR";
break;
4469 case 0x93B1:
return "GL_COMPRESSED_RGBA_ASTC_5x4_KHR";
break;
4470 case 0x93B2:
return "GL_COMPRESSED_RGBA_ASTC_5x5_KHR";
break;
4471 case 0x93B3:
return "GL_COMPRESSED_RGBA_ASTC_6x5_KHR";
break;
4472 case 0x93B4:
return "GL_COMPRESSED_RGBA_ASTC_6x6_KHR";
break;
4473 case 0x93B5:
return "GL_COMPRESSED_RGBA_ASTC_8x5_KHR";
break;
4474 case 0x93B6:
return "GL_COMPRESSED_RGBA_ASTC_8x6_KHR";
break;
4475 case 0x93B7:
return "GL_COMPRESSED_RGBA_ASTC_8x8_KHR";
break;
4476 case 0x93B8:
return "GL_COMPRESSED_RGBA_ASTC_10x5_KHR";
break;
4477 case 0x93B9:
return "GL_COMPRESSED_RGBA_ASTC_10x6_KHR";
break;
4478 case 0x93BA:
return "GL_COMPRESSED_RGBA_ASTC_10x8_KHR";
break;
4479 case 0x93BB:
return "GL_COMPRESSED_RGBA_ASTC_10x10_KHR";
break;
4480 case 0x93BC:
return "GL_COMPRESSED_RGBA_ASTC_12x10_KHR";
break;
4481 case 0x93BD:
return "GL_COMPRESSED_RGBA_ASTC_12x12_KHR";
break;
4482 case 0x93D0:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR";
break;
4483 case 0x93D1:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR";
break;
4484 case 0x93D2:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR";
break;
4485 case 0x93D3:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR";
break;
4486 case 0x93D4:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR";
break;
4487 case 0x93D5:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR";
break;
4488 case 0x93D6:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR";
break;
4489 case 0x93D7:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR";
break;
4490 case 0x93D8:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR";
break;
4491 case 0x93D9:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR";
break;
4492 case 0x93DA:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR";
break;
4493 case 0x93DB:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR";
break;
4494 case 0x93DC:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR";
break;
4495 case 0x93DD:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR";
break;
4496 default:
return "GL_COMPRESSED_UNKNOWN";
break;
4503#if defined(GRAPHICS_API_OPENGL_11)
4506static int rlGenTextureMipmapsData(
unsigned char *data,
int baseWidth,
int baseHeight)
4508 int mipmapCount = 1;
4509 int width = baseWidth;
4510 int height = baseHeight;
4511 int size = baseWidth*baseHeight*4;
4514 while ((width != 1) && (height != 1))
4519 TRACELOGD(
"TEXTURE: Next mipmap size: %i x %i", width, height);
4523 size += (width*height*4);
4526 TRACELOGD(
"TEXTURE: Total mipmaps required: %i", mipmapCount);
4527 TRACELOGD(
"TEXTURE: Total size of data required: %i", size);
4529 unsigned char *temp =
RL_REALLOC(data, size);
4531 if (temp !=
NULL) data = temp;
4535 height = baseHeight;
4536 size = (width*height*4);
4540 unsigned char *image = (
unsigned char *)
RL_MALLOC(width*height*4);
4541 unsigned char *mipmap =
NULL;
4544 for (
int i = 0; i < size; i += 4)
4547 image[i + 1] = data[i + 1];
4548 image[i + 2] = data[i + 2];
4549 image[i + 3] = data[i + 3];
4552 TRACELOGD(
"TEXTURE: Mipmap base size (%ix%i)", width, height);
4554 for (
int mip = 1; mip < mipmapCount; mip++)
4556 mipmap = rlGenNextMipmapData(image, width, height);
4558 offset += (width*height*4);
4562 size = (width*height*4);
4565 for (
int i = 0; i < size; i += 4)
4567 data[offset + i] = mipmap[i];
4568 data[offset + i + 1] = mipmap[i + 1];
4569 data[offset + i + 2] = mipmap[i + 2];
4570 data[offset + i + 3] = mipmap[i + 3];
4585static unsigned char *rlGenNextMipmapData(
unsigned char *srcData,
int srcWidth,
int srcHeight)
4589 unsigned char prow[4] = { 0 };
4590 unsigned char pcol[4] = { 0 };
4592 int width = srcWidth/2;
4593 int height = srcHeight/2;
4595 unsigned char *mipmap = (
unsigned char *)
RL_MALLOC(width*height*4);
4598 for (
int y = 0; y < height; y++)
4602 for (
int x = 0; x < width; x++)
4606 prow[0] = (srcData[(y2*srcWidth + x2)*4 + 0] + srcData[(y2*srcWidth + x2 + 1)*4 + 0])/2;
4607 prow[1] = (srcData[(y2*srcWidth + x2)*4 + 1] + srcData[(y2*srcWidth + x2 + 1)*4 + 1])/2;
4608 prow[2] = (srcData[(y2*srcWidth + x2)*4 + 2] + srcData[(y2*srcWidth + x2 + 1)*4 + 2])/2;
4609 prow[3] = (srcData[(y2*srcWidth + x2)*4 + 3] + srcData[(y2*srcWidth + x2 + 1)*4 + 3])/2;
4611 pcol[0] = (srcData[((y2 + 1)*srcWidth + x2)*4 + 0] + srcData[((y2 + 1)*srcWidth + x2 + 1)*4 + 0])/2;
4612 pcol[1] = (srcData[((y2 + 1)*srcWidth + x2)*4 + 1] + srcData[((y2 + 1)*srcWidth + x2 + 1)*4 + 1])/2;
4613 pcol[2] = (srcData[((y2 + 1)*srcWidth + x2)*4 + 2] + srcData[((y2 + 1)*srcWidth + x2 + 1)*4 + 2])/2;
4614 pcol[3] = (srcData[((y2 + 1)*srcWidth + x2)*4 + 3] + srcData[((y2 + 1)*srcWidth + x2 + 1)*4 + 3])/2;
4616 mipmap[(y*width + x)*4 + 0] = (prow[0] + pcol[0])/2;
4617 mipmap[(y*width + x)*4 + 1] = (prow[1] + pcol[1])/2;
4618 mipmap[(y*width + x)*4 + 2] = (prow[2] + pcol[2])/2;
4619 mipmap[(y*width + x)*4 + 3] = (prow[3] + pcol[3])/2;
4623 TRACELOGD(
"TEXTURE: Mipmap generated successfully (%ix%i)", width, height);
4631static int rlGetPixelDataSize(
int width,
int height,
int format)
4662 dataSize = width*height*bpp/8;
4666 if ((width < 4) && (height < 4))
4678static Matrix rlMatrixIdentity(
void)
4681 1.0f, 0.0f, 0.0f, 0.0f,
4682 0.0f, 1.0f, 0.0f, 0.0f,
4683 0.0f, 0.0f, 1.0f, 0.0f,
4684 0.0f, 0.0f, 0.0f, 1.0f
#define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS
#define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT
#define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD
#define RL_MAX_MATRIX_STACK_SIZE
#define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR
#define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL
#define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION
#define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2
#define GL_TEXTURE_COORD_ARRAY
#define glTexCoordPointer
#define GL_LUMINANCE_ALPHA
#define GL_PROJECTION_MATRIX
#define GL_MODELVIEW_MATRIX
#define glDisableClientState
#define glEnableClientState
#define GL_PERSPECTIVE_CORRECTION_HINT
#define GL_DEBUG_TYPE_MARKER
#define glDisableVertexAttribArray
#define glDebugMessageCallback
#define glGetUniformLocation
#define GL_MAX_TEXTURE_SIZE
#define GL_COMPRESSED_RGB8_ETC2
#define GL_COLOR_ATTACHMENT5
#define GL_DEBUG_SEVERITY_LOW
#define GL_TEXTURE_MIN_FILTER
#define GL_FRAGMENT_SHADER
#define GL_TEXTURE_WRAP_R
#define glUniformMatrix4fv
#define GL_MAX_UNIFORM_BLOCK_SIZE
khronos_uint16_t GLushort
#define GL_DEBUG_SOURCE_THIRD_PARTY
#define glCheckFramebufferStatus
#define glGetAttribLocation
#define glDeleteVertexArrays
#define GL_TEXTURE_WRAP_S
#define GL_DEBUG_TYPE_PORTABILITY
#define GL_DEPTH_COMPONENT16
#define GL_TEXTURE_CUBE_MAP
#define GL_COPY_WRITE_BUFFER
#define glGetShaderInfoLog
#define glDrawArraysInstanced
#define GL_DEBUG_TYPE_OTHER
#define GL_FRONT_AND_BACK
GLAD_API_CALL int GLAD_GL_EXT_texture_compression_s3tc
#define GL_UNSIGNED_SHORT
#define glClearBufferData
#define GL_COMPRESSED_TEXTURE_FORMATS
#define glFramebufferTexture2D
#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
#define GL_COLOR_ATTACHMENT7
#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
#define GL_SHADER_STORAGE_BUFFER_SIZE
#define glVertexAttrib4fv
#define GL_PACK_ALIGNMENT
#define GL_DEBUG_TYPE_PUSH_GROUP
#define glBindVertexArray
#define glDispatchCompute
#define GL_COLOR_ATTACHMENT0
#define GL_COMPRESSED_RGBA8_ETC2_EAC
#define GL_DEBUG_SOURCE_APPLICATION
#define GL_DEBUG_SOURCE_OTHER
#define glVertexAttribDivisor
#define GL_TEXTURE_CUBE_MAP_SEAMLESS
#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
#define GL_DEBUG_SEVERITY_MEDIUM
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE
#define GL_SHADER_STORAGE_BUFFER
#define GL_UNSIGNED_SHORT_5_5_5_1
#define glVertexAttrib1fv
#define GL_COLOR_ATTACHMENT2
#define GL_MAX_VERTEX_ATTRIBS
#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
#define glEnableVertexAttribArray
#define GL_COLOR_ATTACHMENT1
#define glGenVertexArrays
#define GL_LINEAR_MIPMAP_LINEAR
#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT
#define GL_COLOR_ATTACHMENT3
#define glBindImageTexture
#define GL_TEXTURE_SWIZZLE_RGBA
#define GL_DEBUG_SOURCE_SHADER_COMPILER
#define GL_COMPUTE_SHADER
GLAD_API_CALL int gladLoadGL(GLADloadfunc load)
GLAD_API_CALL int GLAD_GL_ARB_compute_shader
#define GL_FRAMEBUFFER_COMPLETE
#define glGetBufferSubData
#define glBindFramebuffer
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS
#define glGetFramebufferAttachmentParameteriv
#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
#define glVertexAttribPointer
#define GL_COMPILE_STATUS
#define glGenRenderbuffers
#define glVertexAttrib3fv
#define GL_UNPACK_ALIGNMENT
#define glVertexAttrib2fv
#define GL_MAX_DRAW_BUFFERS
#define GL_COLOR_BUFFER_BIT
#define GL_DEBUG_SEVERITY_NOTIFICATION
#define GL_DEBUG_TYPE_POP_GROUP
#define GL_FRAMEBUFFER_UNSUPPORTED
#define GL_COLOR_ATTACHMENT4
#define GL_DEBUG_SOURCE_WINDOW_SYSTEM
#define glDrawElementsInstanced
#define GL_MAX_TEXTURE_IMAGE_UNITS
#define glBindRenderbuffer
#define GL_ONE_MINUS_SRC_ALPHA
#define GL_DEBUG_SOURCE_API
#define glDeleteFramebuffers
#define glFramebufferRenderbuffer
#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
#define GL_DEPTH_COMPONENT
#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
#define GL_DEBUG_TYPE_ERROR
#define glBindAttribLocation
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X
#define GL_DEBUG_SEVERITY_HIGH
#define GL_DEBUG_OUTPUT_SYNCHRONOUS
#define GL_MAX_VERTEX_ATTRIB_BINDINGS
#define GL_TEXTURE_WRAP_T
#define GL_DEPTH_ATTACHMENT
#define GL_TEXTURE_MAG_FILTER
#define GL_SHADING_LANGUAGE_VERSION
#define GL_COLOR_ATTACHMENT6
#define glGetProgramInfoLog
#define GL_MAX_UNIFORM_LOCATIONS
#define GL_ELEMENT_ARRAY_BUFFER
#define glDeleteRenderbuffers
#define GL_TRIANGLE_STRIP
GLADapiproc(* GLADloadfunc)(const char *name)
#define glRenderbufferStorage
#define GL_UNSIGNED_SHORT_4_4_4_4
GLAD_API_CALL int GLAD_GL_ARB_ES3_compatibility
GLAD_API_CALL int GLAD_GL_ARB_shader_storage_buffer_object
#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
#define GL_INFO_LOG_LENGTH
#define GL_UNSIGNED_SHORT_5_6_5
#define GL_STENCIL_ATTACHMENT
#define GL_DEBUG_TYPE_PERFORMANCE
#define glDebugMessageControl
#define GL_DEPTH_BUFFER_BIT
#define glCopyBufferSubData
#define GL_NUM_EXTENSIONS
#define glCompressedTexImage2D
#define glGenFramebuffers
#define GL_COPY_READ_BUFFER
RLAPI int * rlGetShaderLocsDefault(void)
RLAPI void rlNormal3f(float x, float y, float z)
@ RL_ATTACHMENT_COLOR_CHANNEL2
@ RL_ATTACHMENT_COLOR_CHANNEL0
@ RL_ATTACHMENT_COLOR_CHANNEL5
@ RL_ATTACHMENT_COLOR_CHANNEL6
@ RL_ATTACHMENT_COLOR_CHANNEL4
@ RL_ATTACHMENT_COLOR_CHANNEL1
@ RL_ATTACHMENT_COLOR_CHANNEL7
@ RL_ATTACHMENT_COLOR_CHANNEL3
RLAPI Matrix rlGetMatrixProjection(void)
RLAPI unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmapCount)
RLAPI void rlDisableTextureCubemap(void)
RLAPI void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data)
RLAPI void rlDisableVertexBuffer(void)
RLAPI unsigned int rlCompileShader(const char *shaderCode, int type)
RLAPI void rlClearScreenBuffers(void)
RLAPI void rlSetUniform(int locIndex, const void *value, int uniformType, int count)
#define RL_TEXTURE_WRAP_T
RLAPI int rlGetFramebufferHeight(void)
RLAPI void rlSetRenderBatchActive(rlRenderBatch *batch)
RLAPI void rlUnloadFramebuffer(unsigned int id)
#define TRACELOG(level,...)
RLAPI void rlActiveDrawBuffers(int count)
#define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS
RLAPI void rlDrawVertexArray(int offset, int count)
RLAPI void rlSetBlendMode(int mode)
RLAPI bool rlIsStereoRenderEnabled(void)
RLAPI void rlLoadIdentity(void)
#define RL_REALLOC(n, sz)
RLAPI void rlEnableTexture(unsigned int id)
RLAPI void * rlReadTexturePixels(unsigned int id, int width, int height, int format)
#define RL_SHADER_LOC_MAP_DIFFUSE
RLAPI unsigned int rlLoadVertexArray(void)
RLAPI void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
RLAPI void rlEnableBackfaceCulling(void)
RLAPI void rlEnableTextureCubemap(unsigned int id)
RLAPI Matrix rlGetMatrixModelview(void)
@ RL_SHADER_UNIFORM_IVEC3
@ RL_SHADER_UNIFORM_IVEC2
@ RL_SHADER_UNIFORM_FLOAT
@ RL_SHADER_UNIFORM_IVEC4
@ RL_SHADER_UNIFORM_SAMPLER2D
RLAPI unsigned int rlLoadVertexBuffer(const void *buffer, int size, bool dynamic)
RLAPI void rlglClose(void)
RLAPI void rlDisableScissorTest(void)
RLAPI void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances)
RLAPI void rlEnableStereoRender(void)
RLAPI void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation)
@ RL_BLEND_SUBTRACT_COLORS
RLAPI void rlLoadDrawCube(void)
RLAPI void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar)
RLAPI void rlSetVertexAttributeDivisor(unsigned int index, int divisor)
RLAPI void rlDisableBackfaceCulling(void)
RLAPI void rlLoadExtensions(void *loader)
RLAPI void rlDisableTexture(void)
RLAPI void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps)
RLAPI unsigned int rlGetShaderIdDefault(void)
RLAPI void rlDisableSmoothLines(void)
RLAPI void rlVertex3f(float x, float y, float z)
RLAPI void rlDisableVertexArray(void)
RLAPI void rlDisableVertexAttribute(unsigned int index)
RLAPI void rlVertex2i(int x, int y)
RLAPI unsigned char * rlReadScreenPixels(int width, int height)
RLAPI void rlSetUniformMatrix(int locIndex, Matrix mat)
#define RL_DEFAULT_BATCH_BUFFERS
RLAPI void rlSetFramebufferHeight(int height)
RLAPI void rlDisableStereoRender(void)
RLAPI void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, const void *pointer)
RLAPI void rlPushMatrix(void)
RLAPI void rlUpdateVertexBuffer(unsigned int bufferId, const void *data, int dataSize, int offset)
RLAPI unsigned int rlLoadComputeShaderProgram(unsigned int shaderId)
RLAPI unsigned int rlLoadShaderBuffer(unsigned long long size, const void *data, int usageHint)
RLAPI void rlDisableDepthMask(void)
RLAPI unsigned int rlLoadVertexBufferElement(const void *buffer, int size, bool dynamic)
rlShaderAttributeDataType
#define RL_MAX_MATRIX_STACK_SIZE
RLAPI unsigned int rlGetTextureIdDefault(void)
RLAPI void rlSetMatrixModelview(Matrix view)
RLAPI void rlViewport(int x, int y, int width, int height)
RLAPI const char * rlGetPixelFormatName(unsigned int format)
RLAPI void rlScissor(int x, int y, int width, int height)
RLAPI int rlGetVersion(void)
RLAPI float rlGetLineWidth(void)
RLAPI void rlClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
RLAPI bool rlEnableVertexArray(unsigned int vaoId)
RLAPI void rlSetUniformSampler(int locIndex, unsigned int textureId)
RLAPI Matrix rlGetMatrixViewOffsetStereo(int eye)
RLAPI void rlScalef(float x, float y, float z)
RLAPI Matrix rlGetMatrixTransform(void)
@ RL_SHADER_LOC_VERTEX_TEXCOORD01
@ RL_SHADER_LOC_MATRIX_NORMAL
@ RL_SHADER_LOC_MAP_EMISSION
@ RL_SHADER_LOC_MAP_ROUGHNESS
@ RL_SHADER_LOC_MATRIX_PROJECTION
@ RL_SHADER_LOC_MAP_NORMAL
@ RL_SHADER_LOC_MAP_CUBEMAP
@ RL_SHADER_LOC_MAP_ALBEDO
@ RL_SHADER_LOC_VERTEX_POSITION
@ RL_SHADER_LOC_COLOR_DIFFUSE
@ RL_SHADER_LOC_MAP_PREFILTER
@ RL_SHADER_LOC_VERTEX_TANGENT
@ RL_SHADER_LOC_MATRIX_MODEL
@ RL_SHADER_LOC_VECTOR_VIEW
@ RL_SHADER_LOC_COLOR_AMBIENT
@ RL_SHADER_LOC_MAP_OCCLUSION
@ RL_SHADER_LOC_MAP_METALNESS
@ RL_SHADER_LOC_MAP_HEIGHT
@ RL_SHADER_LOC_COLOR_SPECULAR
@ RL_SHADER_LOC_MATRIX_MVP
@ RL_SHADER_LOC_VERTEX_TEXCOORD02
@ RL_SHADER_LOC_MAP_IRRADIANCE
@ RL_SHADER_LOC_MATRIX_VIEW
@ RL_SHADER_LOC_VERTEX_NORMAL
@ RL_SHADER_LOC_VERTEX_COLOR
#define RL_MAX_SHADER_LOCATIONS
RLAPI void rlReadShaderBufferElements(unsigned int id, void *dest, unsigned long long count, unsigned long long offset)
RLAPI void rlDisableWireMode(void)
RLAPI unsigned int rlLoadTextureCubemap(const void *data, int size, int format)
RLAPI void rlSetMatrixProjectionStereo(Matrix right, Matrix left)
RLAPI void rlEnableSmoothLines(void)
RLAPI void rlVertex2f(float x, float y)
#define RL_TEXTURE_MIN_FILTER
RLAPI unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode)
RLAPI unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer)
RLAPI void rlEnableDepthMask(void)
RLAPI void rlEnableFramebuffer(unsigned int id)
RLAPI void rlSetLineWidth(float width)
RLAPI void rlActiveTextureSlot(int slot)
RLAPI void rlEnableShader(unsigned int id)
RLAPI void rlCopyBuffersElements(unsigned int destId, unsigned int srcId, unsigned long long destOffset, unsigned long long srcOffset, unsigned long long count)
RLAPI void rlCheckErrors(void)
RLAPI int rlGetFramebufferWidth(void)
RLAPI void rlMultMatrixf(float *matf)
RLAPI void rlBegin(int mode)
RLAPI void rlDisableFramebuffer(void)
RLAPI void rlDisableVertexBufferElement(void)
RLAPI void rlEnableScissorTest(void)
RLAPI void rlLoadDrawQuad(void)
RLAPI void rlBindShaderBuffer(unsigned int id, unsigned int index)
RLAPI void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar)
RLAPI void rlFramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel)
RLAPI void rlTexCoord2f(float x, float y)
RLAPI void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left)
RLAPI void rlDrawRenderBatchActive(void)
RLAPI void rlDrawVertexArrayInstanced(int offset, int count, int instances)
RLAPI void rlEnableVertexAttribute(unsigned int index)
RLAPI void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count)
RLAPI void rlColor3f(float x, float y, float z)
RLAPI void rlEnableDepthTest(void)
RLAPI void rlUnloadVertexArray(unsigned int vaoId)
RLAPI void rlEnableWireMode(void)
RLAPI void rlRotatef(float angle, float x, float y, float z)
RLAPI unsigned int rlLoadFramebuffer(int width, int height)
RLAPI void rlEnableVertexBuffer(unsigned int id)
RLAPI void rlSetShader(unsigned int id, int *locs)
RLAPI void rlDisableShader(void)
RLAPI void rlColor4f(float x, float y, float z, float w)
RLAPI void rlUnloadTexture(unsigned int id)
RLAPI int rlGetLocationAttrib(unsigned int shaderId, const char *attribName)
#define RL_TEXTURE_WRAP_MIRROR_CLAMP
#define RL_TEXTURE_MAG_FILTER
RLAPI void rlEnableColorBlend(void)
RLAPI void rlUpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset)
RLAPI void rlSetMatrixProjection(Matrix proj)
RLAPI void rlglInit(int width, int height)
RLAPI void rlTextureParameters(unsigned int id, int param, int value)
#define RL_TEXTURE_WRAP_S
#define RL_TEXTURE_FILTER_ANISOTROPIC
RLAPI void rlPopMatrix(void)
RLAPI void rlSetTexture(unsigned int id)
RLAPI void rlEnableVertexBufferElement(unsigned int id)
RLAPI void rlDrawVertexArrayElements(int offset, int count, const void *buffer)
RLAPI void rlGetGlTextureFormats(int format, int *glInternalFormat, int *glFormat, int *glType)
RLAPI bool rlCheckRenderBatchLimit(int vCount)
RLAPI void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ)
#define RL_DEFAULT_BATCH_BUFFER_ELEMENTS
RLAPI unsigned long long rlGetShaderBufferSize(unsigned int id)
@ RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA
@ RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA
@ RL_PIXELFORMAT_COMPRESSED_PVRT_RGB
@ RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE
@ RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA
@ RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA
@ RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA
@ RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8
@ RL_PIXELFORMAT_COMPRESSED_ETC1_RGB
@ RL_PIXELFORMAT_UNCOMPRESSED_R32
@ RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5
@ RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA
@ RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32
@ RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8
@ RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1
@ RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA
@ RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA
@ RL_PIXELFORMAT_COMPRESSED_ETC2_RGB
@ RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32
@ RL_PIXELFORMAT_COMPRESSED_DXT1_RGB
@ RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4
RLAPI bool rlFramebufferComplete(unsigned int id)
RLAPI void rlUnloadShaderProgram(unsigned int id)
RLAPI void rlDisableColorBlend(void)
#define RL_DEFAULT_BATCH_DRAWCALLS
@ RL_TEXTURE_FILTER_ANISOTROPIC_16X
@ RL_TEXTURE_FILTER_POINT
@ RL_TEXTURE_FILTER_ANISOTROPIC_4X
@ RL_TEXTURE_FILTER_ANISOTROPIC_8X
@ RL_TEXTURE_FILTER_TRILINEAR
@ RL_TEXTURE_FILTER_BILINEAR
rlFramebufferAttachTextureType
@ RL_ATTACHMENT_CUBEMAP_NEGATIVE_X
@ RL_ATTACHMENT_TEXTURE2D
@ RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z
@ RL_ATTACHMENT_CUBEMAP_POSITIVE_Z
@ RL_ATTACHMENT_CUBEMAP_POSITIVE_Y
@ RL_ATTACHMENT_RENDERBUFFER
@ RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y
@ RL_ATTACHMENT_CUBEMAP_POSITIVE_X
RLAPI rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements)
RLAPI void rlTranslatef(float x, float y, float z)
RLAPI Matrix rlGetMatrixProjectionStereo(int eye)
RLAPI void rlUnloadRenderBatch(rlRenderBatch batch)
RLAPI void rlUnloadShaderBuffer(unsigned int ssboId)
RLAPI void rlMatrixMode(int mode)
RLAPI void rlUpdateShaderBufferElements(unsigned int id, const void *data, unsigned long long dataSize, unsigned long long offset)
RLAPI void rlDisableDepthTest(void)
RLAPI void rlSetFramebufferWidth(int width)
RLAPI int rlGetLocationUniform(unsigned int shaderId, const char *uniformName)
RLAPI unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId)
RLAPI void rlUnloadVertexBuffer(unsigned int vboId)
RLAPI void rlBindImageTexture(unsigned int id, unsigned int index, unsigned int format, int readonly)
RLAPI void rlDrawRenderBatch(rlRenderBatch *batch)
rlVertexBuffer * vertexBuffer