110 #define RLGL_VERSION "5.0" 115 #if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED) 116 #define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) 117 #elif defined(BUILD_LIBTYPE_SHARED) 118 #define RLAPI __attribute__((visibility("default"))) // We are building the library as a Unix shared library (.so/.dylib) 119 #elif defined(_WIN32) && defined(USE_LIBTYPE_SHARED) 120 #define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) 125 #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) 130 #define TRACELOG(level, ...) (void)0 131 #define TRACELOGD(...) (void)0 136 #define RL_MALLOC(sz) malloc(sz) 139 #define RL_CALLOC(n,sz) calloc(n,sz) 142 #define RL_REALLOC(n,sz) realloc(n,sz) 145 #define RL_FREE(p) free(p) 149 #if !defined(GRAPHICS_API_OPENGL_11) && \ 150 !defined(GRAPHICS_API_OPENGL_21) && \ 151 !defined(GRAPHICS_API_OPENGL_33) && \ 152 !defined(GRAPHICS_API_OPENGL_43) && \ 153 !defined(GRAPHICS_API_OPENGL_ES2) && \ 154 !defined(GRAPHICS_API_OPENGL_ES3) 155 #define GRAPHICS_API_OPENGL_33 159 #if defined(GRAPHICS_API_OPENGL_11) 160 #if defined(GRAPHICS_API_OPENGL_21) 161 #undef GRAPHICS_API_OPENGL_21 163 #if defined(GRAPHICS_API_OPENGL_33) 164 #undef GRAPHICS_API_OPENGL_33 166 #if defined(GRAPHICS_API_OPENGL_43) 167 #undef GRAPHICS_API_OPENGL_43 169 #if defined(GRAPHICS_API_OPENGL_ES2) 170 #undef GRAPHICS_API_OPENGL_ES2 176 #if defined(GRAPHICS_API_OPENGL_21) 177 #define GRAPHICS_API_OPENGL_33 181 #if defined(GRAPHICS_API_OPENGL_43) 182 #define GRAPHICS_API_OPENGL_33 186 #if defined(GRAPHICS_API_OPENGL_ES3) 187 #define GRAPHICS_API_OPENGL_ES2 192 #define RLGL_RENDER_TEXTURES_HINT 199 #ifndef RL_DEFAULT_BATCH_BUFFER_ELEMENTS 200 #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) 203 #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192 205 #if defined(GRAPHICS_API_OPENGL_ES2) 209 #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 2048 212 #ifndef RL_DEFAULT_BATCH_BUFFERS 213 #define RL_DEFAULT_BATCH_BUFFERS 1 // Default number of batch buffers (multi-buffering) 215 #ifndef RL_DEFAULT_BATCH_DRAWCALLS 216 #define RL_DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture) 218 #ifndef RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 219 #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture()) 223 #ifndef RL_MAX_MATRIX_STACK_SIZE 224 #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of Matrix stack 228 #ifndef RL_MAX_SHADER_LOCATIONS 229 #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported 233 #ifndef RL_CULL_DISTANCE_NEAR 234 #define RL_CULL_DISTANCE_NEAR 0.01 // Default near cull distance 236 #ifndef RL_CULL_DISTANCE_FAR 237 #define RL_CULL_DISTANCE_FAR 1000.0 // Default far cull distance 241 #define RL_TEXTURE_WRAP_S 0x2802 // GL_TEXTURE_WRAP_S 242 #define RL_TEXTURE_WRAP_T 0x2803 // GL_TEXTURE_WRAP_T 243 #define RL_TEXTURE_MAG_FILTER 0x2800 // GL_TEXTURE_MAG_FILTER 244 #define RL_TEXTURE_MIN_FILTER 0x2801 // GL_TEXTURE_MIN_FILTER 246 #define RL_TEXTURE_FILTER_NEAREST 0x2600 // GL_NEAREST 247 #define RL_TEXTURE_FILTER_LINEAR 0x2601 // GL_LINEAR 248 #define RL_TEXTURE_FILTER_MIP_NEAREST 0x2700 // GL_NEAREST_MIPMAP_NEAREST 249 #define RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR 0x2702 // GL_NEAREST_MIPMAP_LINEAR 250 #define RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST 0x2701 // GL_LINEAR_MIPMAP_NEAREST 251 #define RL_TEXTURE_FILTER_MIP_LINEAR 0x2703 // GL_LINEAR_MIPMAP_LINEAR 252 #define RL_TEXTURE_FILTER_ANISOTROPIC 0x3000 // Anisotropic filter (custom identifier) 253 #define RL_TEXTURE_MIPMAP_BIAS_RATIO 0x4000 // Texture mipmap bias, percentage ratio (custom identifier) 255 #define RL_TEXTURE_WRAP_REPEAT 0x2901 // GL_REPEAT 256 #define RL_TEXTURE_WRAP_CLAMP 0x812F // GL_CLAMP_TO_EDGE 257 #define RL_TEXTURE_WRAP_MIRROR_REPEAT 0x8370 // GL_MIRRORED_REPEAT 258 #define RL_TEXTURE_WRAP_MIRROR_CLAMP 0x8742 // GL_MIRROR_CLAMP_EXT 261 #define RL_MODELVIEW 0x1700 // GL_MODELVIEW 262 #define RL_PROJECTION 0x1701 // GL_PROJECTION 263 #define RL_TEXTURE 0x1702 // GL_TEXTURE 266 #define RL_LINES 0x0001 // GL_LINES 267 #define RL_TRIANGLES 0x0004 // GL_TRIANGLES 268 #define RL_QUADS 0x0007 // GL_QUADS 271 #define RL_UNSIGNED_BYTE 0x1401 // GL_UNSIGNED_BYTE 272 #define RL_FLOAT 0x1406 // GL_FLOAT 275 #define RL_STREAM_DRAW 0x88E0 // GL_STREAM_DRAW 276 #define RL_STREAM_READ 0x88E1 // GL_STREAM_READ 277 #define RL_STREAM_COPY 0x88E2 // GL_STREAM_COPY 278 #define RL_STATIC_DRAW 0x88E4 // GL_STATIC_DRAW 279 #define RL_STATIC_READ 0x88E5 // GL_STATIC_READ 280 #define RL_STATIC_COPY 0x88E6 // GL_STATIC_COPY 281 #define RL_DYNAMIC_DRAW 0x88E8 // GL_DYNAMIC_DRAW 282 #define RL_DYNAMIC_READ 0x88E9 // GL_DYNAMIC_READ 283 #define RL_DYNAMIC_COPY 0x88EA // GL_DYNAMIC_COPY 286 #define RL_FRAGMENT_SHADER 0x8B30 // GL_FRAGMENT_SHADER 287 #define RL_VERTEX_SHADER 0x8B31 // GL_VERTEX_SHADER 288 #define RL_COMPUTE_SHADER 0x91B9 // GL_COMPUTE_SHADER 291 #define RL_ZERO 0 // GL_ZERO 292 #define RL_ONE 1 // GL_ONE 293 #define RL_SRC_COLOR 0x0300 // GL_SRC_COLOR 294 #define RL_ONE_MINUS_SRC_COLOR 0x0301 // GL_ONE_MINUS_SRC_COLOR 295 #define RL_SRC_ALPHA 0x0302 // GL_SRC_ALPHA 296 #define RL_ONE_MINUS_SRC_ALPHA 0x0303 // GL_ONE_MINUS_SRC_ALPHA 297 #define RL_DST_ALPHA 0x0304 // GL_DST_ALPHA 298 #define RL_ONE_MINUS_DST_ALPHA 0x0305 // GL_ONE_MINUS_DST_ALPHA 299 #define RL_DST_COLOR 0x0306 // GL_DST_COLOR 300 #define RL_ONE_MINUS_DST_COLOR 0x0307 // GL_ONE_MINUS_DST_COLOR 301 #define RL_SRC_ALPHA_SATURATE 0x0308 // GL_SRC_ALPHA_SATURATE 302 #define RL_CONSTANT_COLOR 0x8001 // GL_CONSTANT_COLOR 303 #define RL_ONE_MINUS_CONSTANT_COLOR 0x8002 // GL_ONE_MINUS_CONSTANT_COLOR 304 #define RL_CONSTANT_ALPHA 0x8003 // GL_CONSTANT_ALPHA 305 #define RL_ONE_MINUS_CONSTANT_ALPHA 0x8004 // GL_ONE_MINUS_CONSTANT_ALPHA 308 #define RL_FUNC_ADD 0x8006 // GL_FUNC_ADD 309 #define RL_MIN 0x8007 // GL_MIN 310 #define RL_MAX 0x8008 // GL_MAX 311 #define RL_FUNC_SUBTRACT 0x800A // GL_FUNC_SUBTRACT 312 #define RL_FUNC_REVERSE_SUBTRACT 0x800B // GL_FUNC_REVERSE_SUBTRACT 313 #define RL_BLEND_EQUATION 0x8009 // GL_BLEND_EQUATION 314 #define RL_BLEND_EQUATION_RGB 0x8009 // GL_BLEND_EQUATION_RGB // (Same as BLEND_EQUATION) 315 #define RL_BLEND_EQUATION_ALPHA 0x883D // GL_BLEND_EQUATION_ALPHA 316 #define RL_BLEND_DST_RGB 0x80C8 // GL_BLEND_DST_RGB 317 #define RL_BLEND_SRC_RGB 0x80C9 // GL_BLEND_SRC_RGB 318 #define RL_BLEND_DST_ALPHA 0x80CA // GL_BLEND_DST_ALPHA 319 #define RL_BLEND_SRC_ALPHA 0x80CB // GL_BLEND_SRC_ALPHA 320 #define RL_BLEND_COLOR 0x8005 // GL_BLEND_COLOR 322 #define RL_READ_FRAMEBUFFER 0x8CA8 // GL_READ_FRAMEBUFFER 323 #define RL_DRAW_FRAMEBUFFER 0x8CA9 // GL_DRAW_FRAMEBUFFER 326 #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION 327 #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION 0 329 #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD 330 #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD 1 332 #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL 333 #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL 2 335 #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR 336 #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR 3 338 #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT 339 #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT 4 341 #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 342 #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 5 348 #if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800) 350 #elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE) 352 typedef enum bool {
false = 0,
true = !
false } bool;
355 #if !defined(RL_MATRIX_TYPE) 358 float m0, m4, m8, m12;
359 float m1, m5, m9, m13;
360 float m2, m6, m10, m14;
361 float m3, m7, m11, m15;
363 #define RL_MATRIX_TYPE 373 unsigned char *colors;
374 #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) 375 unsigned int *indices;
377 #if defined(GRAPHICS_API_OPENGL_ES2) 378 unsigned short *indices;
381 unsigned int vboId[5];
394 unsigned int textureId;
437 RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1,
438 RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA,
439 RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5,
440 RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8,
441 RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1,
442 RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4,
443 RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8,
444 RL_PIXELFORMAT_UNCOMPRESSED_R32,
445 RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32,
446 RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32,
447 RL_PIXELFORMAT_UNCOMPRESSED_R16,
448 RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16,
449 RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16,
450 RL_PIXELFORMAT_COMPRESSED_DXT1_RGB,
451 RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA,
452 RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA,
453 RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA,
454 RL_PIXELFORMAT_COMPRESSED_ETC1_RGB,
455 RL_PIXELFORMAT_COMPRESSED_ETC2_RGB,
456 RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA,
457 RL_PIXELFORMAT_COMPRESSED_PVRT_RGB,
458 RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA,
459 RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA,
460 RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA
467 RL_TEXTURE_FILTER_POINT = 0,
468 RL_TEXTURE_FILTER_BILINEAR,
469 RL_TEXTURE_FILTER_TRILINEAR,
470 RL_TEXTURE_FILTER_ANISOTROPIC_4X,
471 RL_TEXTURE_FILTER_ANISOTROPIC_8X,
472 RL_TEXTURE_FILTER_ANISOTROPIC_16X,
481 RL_BLEND_SUBTRACT_COLORS,
482 RL_BLEND_ALPHA_PREMULTIPLY,
484 RL_BLEND_CUSTOM_SEPARATE
489 RL_SHADER_LOC_VERTEX_POSITION = 0,
490 RL_SHADER_LOC_VERTEX_TEXCOORD01,
491 RL_SHADER_LOC_VERTEX_TEXCOORD02,
492 RL_SHADER_LOC_VERTEX_NORMAL,
493 RL_SHADER_LOC_VERTEX_TANGENT,
494 RL_SHADER_LOC_VERTEX_COLOR,
495 RL_SHADER_LOC_MATRIX_MVP,
496 RL_SHADER_LOC_MATRIX_VIEW,
497 RL_SHADER_LOC_MATRIX_PROJECTION,
498 RL_SHADER_LOC_MATRIX_MODEL,
499 RL_SHADER_LOC_MATRIX_NORMAL,
500 RL_SHADER_LOC_VECTOR_VIEW,
501 RL_SHADER_LOC_COLOR_DIFFUSE,
502 RL_SHADER_LOC_COLOR_SPECULAR,
503 RL_SHADER_LOC_COLOR_AMBIENT,
504 RL_SHADER_LOC_MAP_ALBEDO,
505 RL_SHADER_LOC_MAP_METALNESS,
506 RL_SHADER_LOC_MAP_NORMAL,
507 RL_SHADER_LOC_MAP_ROUGHNESS,
508 RL_SHADER_LOC_MAP_OCCLUSION,
509 RL_SHADER_LOC_MAP_EMISSION,
510 RL_SHADER_LOC_MAP_HEIGHT,
511 RL_SHADER_LOC_MAP_CUBEMAP,
512 RL_SHADER_LOC_MAP_IRRADIANCE,
513 RL_SHADER_LOC_MAP_PREFILTER,
514 RL_SHADER_LOC_MAP_BRDF
515 } rlShaderLocationIndex;
517 #define RL_SHADER_LOC_MAP_DIFFUSE RL_SHADER_LOC_MAP_ALBEDO 518 #define RL_SHADER_LOC_MAP_SPECULAR RL_SHADER_LOC_MAP_METALNESS 522 RL_SHADER_UNIFORM_FLOAT = 0,
523 RL_SHADER_UNIFORM_VEC2,
524 RL_SHADER_UNIFORM_VEC3,
525 RL_SHADER_UNIFORM_VEC4,
526 RL_SHADER_UNIFORM_INT,
527 RL_SHADER_UNIFORM_IVEC2,
528 RL_SHADER_UNIFORM_IVEC3,
529 RL_SHADER_UNIFORM_IVEC4,
530 RL_SHADER_UNIFORM_SAMPLER2D
531 } rlShaderUniformDataType;
535 RL_SHADER_ATTRIB_FLOAT = 0,
536 RL_SHADER_ATTRIB_VEC2,
537 RL_SHADER_ATTRIB_VEC3,
538 RL_SHADER_ATTRIB_VEC4
539 } rlShaderAttributeDataType;
544 RL_ATTACHMENT_COLOR_CHANNEL0 = 0,
545 RL_ATTACHMENT_COLOR_CHANNEL1 = 1,
546 RL_ATTACHMENT_COLOR_CHANNEL2 = 2,
547 RL_ATTACHMENT_COLOR_CHANNEL3 = 3,
548 RL_ATTACHMENT_COLOR_CHANNEL4 = 4,
549 RL_ATTACHMENT_COLOR_CHANNEL5 = 5,
550 RL_ATTACHMENT_COLOR_CHANNEL6 = 6,
551 RL_ATTACHMENT_COLOR_CHANNEL7 = 7,
552 RL_ATTACHMENT_DEPTH = 100,
553 RL_ATTACHMENT_STENCIL = 200,
554 } rlFramebufferAttachType;
558 RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0,
559 RL_ATTACHMENT_CUBEMAP_NEGATIVE_X = 1,
560 RL_ATTACHMENT_CUBEMAP_POSITIVE_Y = 2,
561 RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y = 3,
562 RL_ATTACHMENT_CUBEMAP_POSITIVE_Z = 4,
563 RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z = 5,
564 RL_ATTACHMENT_TEXTURE2D = 100,
565 RL_ATTACHMENT_RENDERBUFFER = 200,
566 } rlFramebufferAttachTextureType;
570 RL_CULL_FACE_FRONT = 0,
578 #if defined(__cplusplus) 582 RLAPI
void rlMatrixMode(
int mode);
583 RLAPI
void rlPushMatrix(
void);
584 RLAPI
void rlPopMatrix(
void);
585 RLAPI
void rlLoadIdentity(
void);
586 RLAPI
void rlTranslatef(
float x,
float y,
float z);
587 RLAPI
void rlRotatef(
float angle,
float x,
float y,
float z);
588 RLAPI
void rlScalef(
float x,
float y,
float z);
589 RLAPI
void rlMultMatrixf(
const float *matf);
590 RLAPI
void rlFrustum(
double left,
double right,
double bottom,
double top,
double znear,
double zfar);
591 RLAPI
void rlOrtho(
double left,
double right,
double bottom,
double top,
double znear,
double zfar);
592 RLAPI
void rlViewport(
int x,
int y,
int width,
int height);
593 RLAPI
void rlSetClipPlanes(
double near,
double far);
594 RLAPI
double rlGetCullDistanceNear(
void);
595 RLAPI
double rlGetCullDistanceFar(
void);
600 RLAPI
void rlBegin(
int mode);
601 RLAPI
void rlEnd(
void);
602 RLAPI
void rlVertex2i(
int x,
int y);
603 RLAPI
void rlVertex2f(
float x,
float y);
604 RLAPI
void rlVertex3f(
float x,
float y,
float z);
605 RLAPI
void rlTexCoord2f(
float x,
float y);
606 RLAPI
void rlNormal3f(
float x,
float y,
float z);
607 RLAPI
void rlColor4ub(
unsigned char r,
unsigned char g,
unsigned char b,
unsigned char a);
608 RLAPI
void rlColor3f(
float x,
float y,
float z);
609 RLAPI
void rlColor4f(
float x,
float y,
float z,
float w);
618 RLAPI
bool rlEnableVertexArray(
unsigned int vaoId);
619 RLAPI
void rlDisableVertexArray(
void);
620 RLAPI
void rlEnableVertexBuffer(
unsigned int id);
621 RLAPI
void rlDisableVertexBuffer(
void);
622 RLAPI
void rlEnableVertexBufferElement(
unsigned int id);
623 RLAPI
void rlDisableVertexBufferElement(
void);
624 RLAPI
void rlEnableVertexAttribute(
unsigned int index);
625 RLAPI
void rlDisableVertexAttribute(
unsigned int index);
626 #if defined(GRAPHICS_API_OPENGL_11) 627 RLAPI
void rlEnableStatePointer(
int vertexAttribType,
void *buffer);
628 RLAPI
void rlDisableStatePointer(
int vertexAttribType);
632 RLAPI
void rlActiveTextureSlot(
int slot);
633 RLAPI
void rlEnableTexture(
unsigned int id);
634 RLAPI
void rlDisableTexture(
void);
635 RLAPI
void rlEnableTextureCubemap(
unsigned int id);
636 RLAPI
void rlDisableTextureCubemap(
void);
637 RLAPI
void rlTextureParameters(
unsigned int id,
int param,
int value);
638 RLAPI
void rlCubemapParameters(
unsigned int id,
int param,
int value);
641 RLAPI
void rlEnableShader(
unsigned int id);
642 RLAPI
void rlDisableShader(
void);
645 RLAPI
void rlEnableFramebuffer(
unsigned int id);
646 RLAPI
void rlDisableFramebuffer(
void);
647 RLAPI
unsigned int rlGetActiveFramebuffer(
void);
648 RLAPI
void rlActiveDrawBuffers(
int count);
649 RLAPI
void rlBlitFramebuffer(
int srcX,
int srcY,
int srcWidth,
int srcHeight,
int dstX,
int dstY,
int dstWidth,
int dstHeight,
int bufferMask);
650 RLAPI
void rlBindFramebuffer(
unsigned int target,
unsigned int framebuffer);
653 RLAPI
void rlEnableColorBlend(
void);
654 RLAPI
void rlDisableColorBlend(
void);
655 RLAPI
void rlEnableDepthTest(
void);
656 RLAPI
void rlDisableDepthTest(
void);
657 RLAPI
void rlEnableDepthMask(
void);
658 RLAPI
void rlDisableDepthMask(
void);
659 RLAPI
void rlEnableBackfaceCulling(
void);
660 RLAPI
void rlDisableBackfaceCulling(
void);
661 RLAPI
void rlColorMask(
bool r,
bool g,
bool b,
bool a);
662 RLAPI
void rlSetCullFace(
int mode);
663 RLAPI
void rlEnableScissorTest(
void);
664 RLAPI
void rlDisableScissorTest(
void);
665 RLAPI
void rlScissor(
int x,
int y,
int width,
int height);
666 RLAPI
void rlEnableWireMode(
void);
667 RLAPI
void rlEnablePointMode(
void);
668 RLAPI
void rlDisableWireMode(
void);
669 RLAPI
void rlSetLineWidth(
float width);
670 RLAPI
float rlGetLineWidth(
void);
671 RLAPI
void rlEnableSmoothLines(
void);
672 RLAPI
void rlDisableSmoothLines(
void);
673 RLAPI
void rlEnableStereoRender(
void);
674 RLAPI
void rlDisableStereoRender(
void);
675 RLAPI
bool rlIsStereoRenderEnabled(
void);
677 RLAPI
void rlClearColor(
unsigned char r,
unsigned char g,
unsigned char b,
unsigned char a);
678 RLAPI
void rlClearScreenBuffers(
void);
679 RLAPI
void rlCheckErrors(
void);
680 RLAPI
void rlSetBlendMode(
int mode);
681 RLAPI
void rlSetBlendFactors(
int glSrcFactor,
int glDstFactor,
int glEquation);
682 RLAPI
void rlSetBlendFactorsSeparate(
int glSrcRGB,
int glDstRGB,
int glSrcAlpha,
int glDstAlpha,
int glEqRGB,
int glEqAlpha);
688 RLAPI
void rlglInit(
int width,
int height);
689 RLAPI
void rlglClose(
void);
690 RLAPI
void rlLoadExtensions(
void *loader);
691 RLAPI
int rlGetVersion(
void);
692 RLAPI
void rlSetFramebufferWidth(
int width);
693 RLAPI
int rlGetFramebufferWidth(
void);
694 RLAPI
void rlSetFramebufferHeight(
int height);
695 RLAPI
int rlGetFramebufferHeight(
void);
697 RLAPI
unsigned int rlGetTextureIdDefault(
void);
698 RLAPI
unsigned int rlGetShaderIdDefault(
void);
699 RLAPI
int *rlGetShaderLocsDefault(
void);
704 RLAPI
rlRenderBatch rlLoadRenderBatch(
int numBuffers,
int bufferElements);
708 RLAPI
void rlDrawRenderBatchActive(
void);
709 RLAPI
bool rlCheckRenderBatchLimit(
int vCount);
711 RLAPI
void rlSetTexture(
unsigned int id);
716 RLAPI
unsigned int rlLoadVertexArray(
void);
717 RLAPI
unsigned int rlLoadVertexBuffer(
const void *buffer,
int size,
bool dynamic);
718 RLAPI
unsigned int rlLoadVertexBufferElement(
const void *buffer,
int size,
bool dynamic);
719 RLAPI
void rlUpdateVertexBuffer(
unsigned int bufferId,
const void *data,
int dataSize,
int offset);
720 RLAPI
void rlUpdateVertexBufferElements(
unsigned int id,
const void *data,
int dataSize,
int offset);
721 RLAPI
void rlUnloadVertexArray(
unsigned int vaoId);
722 RLAPI
void rlUnloadVertexBuffer(
unsigned int vboId);
723 RLAPI
void rlSetVertexAttribute(
unsigned int index,
int compSize,
int type,
bool normalized,
int stride,
int offset);
724 RLAPI
void rlSetVertexAttributeDivisor(
unsigned int index,
int divisor);
725 RLAPI
void rlSetVertexAttributeDefault(
int locIndex,
const void *value,
int attribType,
int count);
726 RLAPI
void rlDrawVertexArray(
int offset,
int count);
727 RLAPI
void rlDrawVertexArrayElements(
int offset,
int count,
const void *buffer);
728 RLAPI
void rlDrawVertexArrayInstanced(
int offset,
int count,
int instances);
729 RLAPI
void rlDrawVertexArrayElementsInstanced(
int offset,
int count,
const void *buffer,
int instances);
732 RLAPI
unsigned int rlLoadTexture(
const void *data,
int width,
int height,
int format,
int mipmapCount);
733 RLAPI
unsigned int rlLoadTextureDepth(
int width,
int height,
bool useRenderBuffer);
734 RLAPI
unsigned int rlLoadTextureCubemap(
const void *data,
int size,
int format);
735 RLAPI
void rlUpdateTexture(
unsigned int id,
int offsetX,
int offsetY,
int width,
int height,
int format,
const void *data);
736 RLAPI
void rlGetGlTextureFormats(
int format,
unsigned int *glInternalFormat,
unsigned int *glFormat,
unsigned int *glType);
737 RLAPI
const char *rlGetPixelFormatName(
unsigned int format);
738 RLAPI
void rlUnloadTexture(
unsigned int id);
739 RLAPI
void rlGenTextureMipmaps(
unsigned int id,
int width,
int height,
int format,
int *mipmaps);
740 RLAPI
void *rlReadTexturePixels(
unsigned int id,
int width,
int height,
int format);
741 RLAPI
unsigned char *rlReadScreenPixels(
int width,
int height);
744 RLAPI
unsigned int rlLoadFramebuffer(
void);
745 RLAPI
void rlFramebufferAttach(
unsigned int fboId,
unsigned int texId,
int attachType,
int texType,
int mipLevel);
746 RLAPI
bool rlFramebufferComplete(
unsigned int id);
747 RLAPI
void rlUnloadFramebuffer(
unsigned int id);
750 RLAPI
unsigned int rlLoadShaderCode(
const char *vsCode,
const char *fsCode);
751 RLAPI
unsigned int rlCompileShader(
const char *shaderCode,
int type);
752 RLAPI
unsigned int rlLoadShaderProgram(
unsigned int vShaderId,
unsigned int fShaderId);
753 RLAPI
void rlUnloadShaderProgram(
unsigned int id);
754 RLAPI
int rlGetLocationUniform(
unsigned int shaderId,
const char *uniformName);
755 RLAPI
int rlGetLocationAttrib(
unsigned int shaderId,
const char *attribName);
756 RLAPI
void rlSetUniform(
int locIndex,
const void *value,
int uniformType,
int count);
757 RLAPI
void rlSetUniformMatrix(
int locIndex,
Matrix mat);
758 RLAPI
void rlSetUniformSampler(
int locIndex,
unsigned int textureId);
759 RLAPI
void rlSetShader(
unsigned int id,
int *locs);
762 RLAPI
unsigned int rlLoadComputeShaderProgram(
unsigned int shaderId);
763 RLAPI
void rlComputeShaderDispatch(
unsigned int groupX,
unsigned int groupY,
unsigned int groupZ);
766 RLAPI
unsigned int rlLoadShaderBuffer(
unsigned int size,
const void *data,
int usageHint);
767 RLAPI
void rlUnloadShaderBuffer(
unsigned int ssboId);
768 RLAPI
void rlUpdateShaderBuffer(
unsigned int id,
const void *data,
unsigned int dataSize,
unsigned int offset);
769 RLAPI
void rlBindShaderBuffer(
unsigned int id,
unsigned int index);
770 RLAPI
void rlReadShaderBuffer(
unsigned int id,
void *dest,
unsigned int count,
unsigned int offset);
771 RLAPI
void rlCopyShaderBuffer(
unsigned int destId,
unsigned int srcId,
unsigned int destOffset,
unsigned int srcOffset,
unsigned int count);
772 RLAPI
unsigned int rlGetShaderBufferSize(
unsigned int id);
775 RLAPI
void rlBindImageTexture(
unsigned int id,
unsigned int index,
int format,
bool readonly);
778 RLAPI
Matrix rlGetMatrixModelview(
void);
779 RLAPI
Matrix rlGetMatrixProjection(
void);
780 RLAPI
Matrix rlGetMatrixTransform(
void);
781 RLAPI
Matrix rlGetMatrixProjectionStereo(
int eye);
782 RLAPI
Matrix rlGetMatrixViewOffsetStereo(
int eye);
783 RLAPI
void rlSetMatrixProjection(
Matrix proj);
784 RLAPI
void rlSetMatrixModelview(
Matrix view);
785 RLAPI
void rlSetMatrixProjectionStereo(
Matrix right,
Matrix left);
786 RLAPI
void rlSetMatrixViewOffsetStereo(
Matrix right,
Matrix left);
789 RLAPI
void rlLoadDrawCube(
void);
790 RLAPI
void rlLoadDrawQuad(
void);
792 #if defined(__cplusplus) 804 #if defined(RLGL_IMPLEMENTATION) 807 #if defined(BUILD_LIBTYPE_SHARED) 808 #define GLAD_API_CALL_EXPORT 809 #define GLAD_API_CALL_EXPORT_BUILD 812 #if defined(GRAPHICS_API_OPENGL_11) 813 #if defined(__APPLE__) 814 #include <OpenGL/gl.h> 815 #include <OpenGL/glext.h> 818 #if !defined(APIENTRY) 820 #define APIENTRY __stdcall 826 #if !defined(WINGDIAPI) && defined(_WIN32) 827 #define WINGDIAPI __declspec(dllimport) 834 #if defined(GRAPHICS_API_OPENGL_33) 835 #define GLAD_MALLOC RL_MALLOC 836 #define GLAD_FREE RL_FREE 838 #define GLAD_GL_IMPLEMENTATION 839 #include "external/glad.h" 842 #if defined(GRAPHICS_API_OPENGL_ES3) 843 #include <GLES3/gl3.h> 844 #define GL_GLEXT_PROTOTYPES 845 #include <GLES2/gl2ext.h> 846 #elif defined(GRAPHICS_API_OPENGL_ES2) 849 #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_DESKTOP_SDL) 850 #define GLAD_GLES2_IMPLEMENTATION 851 #include "external/glad_gles2.h" 853 #define GL_GLEXT_PROTOTYPES 855 #include <GLES2/gl2.h> 856 #include <GLES2/gl2ext.h> 861 #if defined(PLATFORM_DRM) 862 typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
863 typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type,
const void *indices, GLsizei primcount);
864 typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor);
876 #define PI 3.14159265358979323846f 879 #define DEG2RAD (PI/180.0f) 882 #define RAD2DEG (180.0f/PI) 885 #ifndef GL_SHADING_LANGUAGE_VERSION 886 #define GL_SHADING_LANGUAGE_VERSION 0x8B8C 889 #ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT 890 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 892 #ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 893 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 895 #ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 896 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 898 #ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 899 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 901 #ifndef GL_ETC1_RGB8_OES 902 #define GL_ETC1_RGB8_OES 0x8D64 904 #ifndef GL_COMPRESSED_RGB8_ETC2 905 #define GL_COMPRESSED_RGB8_ETC2 0x9274 907 #ifndef GL_COMPRESSED_RGBA8_ETC2_EAC 908 #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 910 #ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 911 #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 913 #ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 914 #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 916 #ifndef GL_COMPRESSED_RGBA_ASTC_4x4_KHR 917 #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93b0 919 #ifndef GL_COMPRESSED_RGBA_ASTC_8x8_KHR 920 #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93b7 923 #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 924 #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF 926 #ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT 927 #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE 930 #ifndef GL_PROGRAM_POINT_SIZE 931 #define GL_PROGRAM_POINT_SIZE 0x8642 934 #ifndef GL_LINE_WIDTH 935 #define GL_LINE_WIDTH 0x0B21 938 #if defined(GRAPHICS_API_OPENGL_11) 939 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 940 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 941 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 944 #if defined(GRAPHICS_API_OPENGL_21) 945 #define GL_LUMINANCE 0x1909 946 #define GL_LUMINANCE_ALPHA 0x190A 949 #if defined(GRAPHICS_API_OPENGL_ES2) 950 #define glClearDepth glClearDepthf 951 #if !defined(GRAPHICS_API_OPENGL_ES3) 952 #define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER 953 #define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER 958 #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION 959 #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION 961 #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD 962 #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD 964 #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL 965 #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL 967 #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR 968 #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR 970 #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT 971 #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT 973 #ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 974 #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 977 #ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MVP 978 #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix 980 #ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW 981 #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix 983 #ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION 984 #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix 986 #ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL 987 #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix 989 #ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL 990 #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView)) 992 #ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR 993 #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) 995 #ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 996 #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) 998 #ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 999 #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) 1001 #ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 1002 #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) 1008 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 1009 typedef struct rlglData {
1015 float texcoordx, texcoordy;
1016 float normalx, normaly, normalz;
1017 unsigned char colorr, colorg, colorb, colora;
1019 int currentMatrixMode;
1024 bool transformRequired;
1025 Matrix stack[RL_MAX_MATRIX_STACK_SIZE];
1028 unsigned int defaultTextureId;
1029 unsigned int activeTextureId[RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS];
1030 unsigned int defaultVShaderId;
1031 unsigned int defaultFShaderId;
1032 unsigned int defaultShaderId;
1033 int *defaultShaderLocs;
1034 unsigned int currentShaderId;
1035 int *currentShaderLocs;
1038 Matrix projectionStereo[2];
1039 Matrix viewOffsetStereo[2];
1042 int currentBlendMode;
1043 int glBlendSrcFactor;
1044 int glBlendDstFactor;
1045 int glBlendEquation;
1046 int glBlendSrcFactorRGB;
1047 int glBlendDestFactorRGB;
1048 int glBlendSrcFactorAlpha;
1049 int glBlendDestFactorAlpha;
1050 int glBlendEquationRGB;
1051 int glBlendEquationAlpha;
1052 bool glCustomBlendModeModified;
1054 int framebufferWidth;
1055 int framebufferHeight;
1071 bool texMirrorClamp;
1072 bool texAnisoFilter;
1076 float maxAnisotropyLevel;
1082 typedef void *(*rlglLoadProc)(
const char *name);
1084 #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 1089 static double rlCullDistanceNear = RL_CULL_DISTANCE_NEAR;
1090 static double rlCullDistanceFar = RL_CULL_DISTANCE_FAR;
1092 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 1093 static rlglData RLGL = { 0 };
1094 #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 1096 #if defined(GRAPHICS_API_OPENGL_ES2) && !defined(GRAPHICS_API_OPENGL_ES3) 1098 static PFNGLGENVERTEXARRAYSOESPROC glGenVertexArrays = NULL;
1099 static PFNGLBINDVERTEXARRAYOESPROC glBindVertexArray = NULL;
1100 static PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArrays = NULL;
1103 static PFNGLDRAWARRAYSINSTANCEDEXTPROC glDrawArraysInstanced = NULL;
1104 static PFNGLDRAWELEMENTSINSTANCEDEXTPROC glDrawElementsInstanced = NULL;
1105 static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL;
1111 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 1112 static void rlLoadShaderDefault(
void);
1113 static void rlUnloadShaderDefault(
void);
1114 #if defined(RLGL_SHOW_GL_DETAILS_INFO) 1115 static const char *rlGetCompressedFormatName(
int format);
1116 #endif // RLGL_SHOW_GL_DETAILS_INFO 1117 #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 1119 static int rlGetPixelDataSize(
int width,
int height,
int format);
1122 typedef struct rl_float16 {
1125 static rl_float16 rlMatrixToFloatV(
Matrix mat);
1126 #define rlMatrixToFloat(mat) (rlMatrixToFloatV(mat).v) // Get float vector for Matrix 1127 static Matrix rlMatrixIdentity(
void);
1136 #if defined(GRAPHICS_API_OPENGL_11) 1139 void rlMatrixMode(
int mode)
1143 case RL_PROJECTION: glMatrixMode(GL_PROJECTION);
break;
1144 case RL_MODELVIEW: glMatrixMode(GL_MODELVIEW);
break;
1145 case RL_TEXTURE: glMatrixMode(GL_TEXTURE);
break;
1150 void rlFrustum(
double left,
double right,
double bottom,
double top,
double znear,
double zfar)
1152 glFrustum(left, right, bottom, top, znear, zfar);
1155 void rlOrtho(
double left,
double right,
double bottom,
double top,
double znear,
double zfar)
1157 glOrtho(left, right, bottom, top, znear, zfar);
1160 void rlPushMatrix(
void) { glPushMatrix(); }
1161 void rlPopMatrix(
void) { glPopMatrix(); }
1162 void rlLoadIdentity(
void) { glLoadIdentity(); }
1163 void rlTranslatef(
float x,
float y,
float z) { glTranslatef(x, y, z); }
1164 void rlRotatef(
float angle,
float x,
float y,
float z) { glRotatef(angle, x, y, z); }
1165 void rlScalef(
float x,
float y,
float z) { glScalef(x, y, z); }
1166 void rlMultMatrixf(
const float *matf) { glMultMatrixf(matf); }
1168 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 1170 void rlMatrixMode(
int mode)
1172 if (mode == RL_PROJECTION) RLGL.State.currentMatrix = &RLGL.State.projection;
1173 else if (mode == RL_MODELVIEW) RLGL.State.currentMatrix = &RLGL.State.modelview;
1176 RLGL.State.currentMatrixMode = mode;
1180 void rlPushMatrix(
void)
1182 if (RLGL.State.stackCounter >= RL_MAX_MATRIX_STACK_SIZE) TRACELOG(RL_LOG_ERROR,
"RLGL: Matrix stack overflow (RL_MAX_MATRIX_STACK_SIZE)");
1184 if (RLGL.State.currentMatrixMode == RL_MODELVIEW)
1186 RLGL.State.transformRequired =
true;
1187 RLGL.State.currentMatrix = &RLGL.State.transform;
1190 RLGL.State.stack[RLGL.State.stackCounter] = *RLGL.State.currentMatrix;
1191 RLGL.State.stackCounter++;
1195 void rlPopMatrix(
void)
1197 if (RLGL.State.stackCounter > 0)
1199 Matrix mat = RLGL.State.stack[RLGL.State.stackCounter - 1];
1200 *RLGL.State.currentMatrix = mat;
1201 RLGL.State.stackCounter--;
1204 if ((RLGL.State.stackCounter == 0) && (RLGL.State.currentMatrixMode == RL_MODELVIEW))
1206 RLGL.State.currentMatrix = &RLGL.State.modelview;
1207 RLGL.State.transformRequired =
false;
1212 void rlLoadIdentity(
void)
1214 *RLGL.State.currentMatrix = rlMatrixIdentity();
1218 void rlTranslatef(
float x,
float y,
float z)
1220 Matrix matTranslation = {
1221 1.0f, 0.0f, 0.0f, x,
1222 0.0f, 1.0f, 0.0f, y,
1223 0.0f, 0.0f, 1.0f, z,
1224 0.0f, 0.0f, 0.0f, 1.0f
1228 *RLGL.State.currentMatrix = rlMatrixMultiply(matTranslation, *RLGL.State.currentMatrix);
1233 void rlRotatef(
float angle,
float x,
float y,
float z)
1235 Matrix matRotation = rlMatrixIdentity();
1238 float lengthSquared = x*x + y*y + z*z;
1239 if ((lengthSquared != 1.0f) && (lengthSquared != 0.0f))
1241 float inverseLength = 1.0f/sqrtf(lengthSquared);
1248 float sinres = sinf(DEG2RAD*angle);
1249 float cosres = cosf(DEG2RAD*angle);
1250 float t = 1.0f - cosres;
1252 matRotation.m0 = x*x*t + cosres;
1253 matRotation.m1 = y*x*t + z*sinres;
1254 matRotation.m2 = z*x*t - y*sinres;
1255 matRotation.m3 = 0.0f;
1257 matRotation.m4 = x*y*t - z*sinres;
1258 matRotation.m5 = y*y*t + cosres;
1259 matRotation.m6 = z*y*t + x*sinres;
1260 matRotation.m7 = 0.0f;
1262 matRotation.m8 = x*z*t + y*sinres;
1263 matRotation.m9 = y*z*t - x*sinres;
1264 matRotation.m10 = z*z*t + cosres;
1265 matRotation.m11 = 0.0f;
1267 matRotation.m12 = 0.0f;
1268 matRotation.m13 = 0.0f;
1269 matRotation.m14 = 0.0f;
1270 matRotation.m15 = 1.0f;
1273 *RLGL.State.currentMatrix = rlMatrixMultiply(matRotation, *RLGL.State.currentMatrix);
1277 void rlScalef(
float x,
float y,
float z)
1280 x, 0.0f, 0.0f, 0.0f,
1281 0.0f, y, 0.0f, 0.0f,
1282 0.0f, 0.0f, z, 0.0f,
1283 0.0f, 0.0f, 0.0f, 1.0f
1287 *RLGL.State.currentMatrix = rlMatrixMultiply(matScale, *RLGL.State.currentMatrix);
1291 void rlMultMatrixf(
const float *matf)
1294 Matrix mat = { matf[0], matf[4], matf[8], matf[12],
1295 matf[1], matf[5], matf[9], matf[13],
1296 matf[2], matf[6], matf[10], matf[14],
1297 matf[3], matf[7], matf[11], matf[15] };
1299 *RLGL.State.currentMatrix = rlMatrixMultiply(mat, *RLGL.State.currentMatrix);
1303 void rlFrustum(
double left,
double right,
double bottom,
double top,
double znear,
double zfar)
1305 Matrix matFrustum = { 0 };
1307 float rl = (float)(right - left);
1308 float tb = (float)(top - bottom);
1309 float fn = (float)(zfar - znear);
1311 matFrustum.m0 = ((float) znear*2.0f)/rl;
1312 matFrustum.m1 = 0.0f;
1313 matFrustum.m2 = 0.0f;
1314 matFrustum.m3 = 0.0f;
1316 matFrustum.m4 = 0.0f;
1317 matFrustum.m5 = ((float) znear*2.0f)/tb;
1318 matFrustum.m6 = 0.0f;
1319 matFrustum.m7 = 0.0f;
1321 matFrustum.m8 = ((float)right + (
float)left)/rl;
1322 matFrustum.m9 = ((float)top + (
float)bottom)/tb;
1323 matFrustum.m10 = -((float)zfar + (
float)znear)/fn;
1324 matFrustum.m11 = -1.0f;
1326 matFrustum.m12 = 0.0f;
1327 matFrustum.m13 = 0.0f;
1328 matFrustum.m14 = -((float)zfar*(
float)znear*2.0f)/fn;
1329 matFrustum.m15 = 0.0f;
1331 *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matFrustum);
1335 void rlOrtho(
double left,
double right,
double bottom,
double top,
double znear,
double zfar)
1341 float rl = (float)(right - left);
1342 float tb = (float)(top - bottom);
1343 float fn = (float)(zfar - znear);
1345 matOrtho.m0 = 2.0f/rl;
1350 matOrtho.m5 = 2.0f/tb;
1355 matOrtho.m10 = -2.0f/fn;
1356 matOrtho.m11 = 0.0f;
1357 matOrtho.m12 = -((float)left + (
float)right)/rl;
1358 matOrtho.m13 = -((float)top + (
float)bottom)/tb;
1359 matOrtho.m14 = -((float)zfar + (
float)znear)/fn;
1360 matOrtho.m15 = 1.0f;
1362 *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matOrtho);
1368 void rlViewport(
int x,
int y,
int width,
int height)
1370 glViewport(x, y, width, height);
1374 void rlSetClipPlanes(
double near,
double far)
1376 rlCullDistanceNear = near;
1377 rlCullDistanceFar = far;
1381 double rlGetCullDistanceNear(
void)
1383 return rlCullDistanceNear;
1387 double rlGetCullDistanceFar(
void)
1389 return rlCullDistanceFar;
1395 #if defined(GRAPHICS_API_OPENGL_11) 1398 void rlBegin(
int mode)
1402 case RL_LINES: glBegin(GL_LINES);
break;
1403 case RL_TRIANGLES: glBegin(GL_TRIANGLES);
break;
1404 case RL_QUADS: glBegin(GL_QUADS);
break;
1409 void rlEnd() { glEnd(); }
1410 void rlVertex2i(
int x,
int y) { glVertex2i(x, y); }
1411 void rlVertex2f(
float x,
float y) { glVertex2f(x, y); }
1412 void rlVertex3f(
float x,
float y,
float z) { glVertex3f(x, y, z); }
1413 void rlTexCoord2f(
float x,
float y) { glTexCoord2f(x, y); }
1414 void rlNormal3f(
float x,
float y,
float z) { glNormal3f(x, y, z); }
1415 void rlColor4ub(
unsigned char r,
unsigned char g,
unsigned char b,
unsigned char a) { glColor4ub(r, g, b, a); }
1416 void rlColor3f(
float x,
float y,
float z) { glColor3f(x, y, z); }
1417 void rlColor4f(
float x,
float y,
float z,
float w) { glColor4f(x, y, z, w); }
1419 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 1421 void rlBegin(
int mode)
1425 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode != mode)
1427 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0)
1434 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);
1435 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)));
1436 else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0;
1438 if (!rlCheckRenderBatchLimit(RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment))
1440 RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment;
1441 RLGL.currentBatch->drawCounter++;
1445 if (RLGL.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) rlDrawRenderBatch(RLGL.currentBatch);
1447 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = mode;
1448 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount = 0;
1449 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = RLGL.State.defaultTextureId;
1459 RLGL.currentBatch->currentDepth += (1.0f/20000.0f);
1464 void rlVertex3f(
float x,
float y,
float z)
1471 if (RLGL.State.transformRequired)
1473 tx = RLGL.State.transform.m0*x + RLGL.State.transform.m4*y + RLGL.State.transform.m8*z + RLGL.State.transform.m12;
1474 ty = RLGL.State.transform.m1*x + RLGL.State.transform.m5*y + RLGL.State.transform.m9*z + RLGL.State.transform.m13;
1475 tz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z + RLGL.State.transform.m14;
1481 if (RLGL.State.vertexCounter > (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4 - 4))
1483 if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) &&
1484 (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%2 == 0))
1489 rlCheckRenderBatchLimit(2 + 1);
1491 else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) &&
1492 (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%3 == 0))
1494 rlCheckRenderBatchLimit(3 + 1);
1496 else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_QUADS) &&
1497 (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4 == 0))
1499 rlCheckRenderBatchLimit(4 + 1);
1504 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter] = tx;
1505 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 1] = ty;
1506 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 2] = tz;
1509 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter] = RLGL.State.texcoordx;
1510 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter + 1] = RLGL.State.texcoordy;
1513 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter] = RLGL.State.normalx;
1514 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter + 1] = RLGL.State.normaly;
1515 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter + 2] = RLGL.State.normalz;
1518 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr;
1519 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 1] = RLGL.State.colorg;
1520 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 2] = RLGL.State.colorb;
1521 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 3] = RLGL.State.colora;
1523 RLGL.State.vertexCounter++;
1524 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount++;
1528 void rlVertex2f(
float x,
float y)
1530 rlVertex3f(x, y, RLGL.currentBatch->currentDepth);
1534 void rlVertex2i(
int x,
int y)
1536 rlVertex3f((
float)x, (
float)y, RLGL.currentBatch->currentDepth);
1541 void rlTexCoord2f(
float x,
float y)
1543 RLGL.State.texcoordx = x;
1544 RLGL.State.texcoordy = y;
1549 void rlNormal3f(
float x,
float y,
float z)
1554 if (RLGL.State.transformRequired)
1556 normalx = RLGL.State.transform.m0*x + RLGL.State.transform.m4*y + RLGL.State.transform.m8*z;
1557 normaly = RLGL.State.transform.m1*x + RLGL.State.transform.m5*y + RLGL.State.transform.m9*z;
1558 normalz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z;
1560 float length = sqrtf(normalx*normalx + normaly*normaly + normalz*normalz);
1563 float ilength = 1.0f / length;
1568 RLGL.State.normalx = normalx;
1569 RLGL.State.normaly = normaly;
1570 RLGL.State.normalz = normalz;
1574 void rlColor4ub(
unsigned char x,
unsigned char y,
unsigned char z,
unsigned char w)
1576 RLGL.State.colorr = x;
1577 RLGL.State.colorg = y;
1578 RLGL.State.colorb = z;
1579 RLGL.State.colora = w;
1583 void rlColor4f(
float r,
float g,
float b,
float a)
1585 rlColor4ub((
unsigned char)(r*255), (
unsigned char)(g*255), (
unsigned char)(b*255), (
unsigned char)(a*255));
1589 void rlColor3f(
float x,
float y,
float z)
1591 rlColor4ub((
unsigned char)(x*255), (
unsigned char)(y*255), (
unsigned char)(z*255), 255);
1601 void rlSetTexture(
unsigned int id)
1605 #if defined(GRAPHICS_API_OPENGL_11) 1609 if (RLGL.State.vertexCounter >=
1610 RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4)
1612 rlDrawRenderBatch(RLGL.currentBatch);
1618 #if defined(GRAPHICS_API_OPENGL_11) 1619 rlEnableTexture(
id);
1621 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId !=
id)
1623 if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0)
1630 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);
1631 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)));
1632 else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0;
1634 if (!rlCheckRenderBatchLimit(RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment))
1636 RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment;
1638 RLGL.currentBatch->drawCounter++;
1642 if (RLGL.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) rlDrawRenderBatch(RLGL.currentBatch);
1644 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = id;
1645 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount = 0;
1652 void rlActiveTextureSlot(
int slot)
1654 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 1655 glActiveTexture(GL_TEXTURE0 + slot);
1660 void rlEnableTexture(
unsigned int id)
1662 #if defined(GRAPHICS_API_OPENGL_11) 1663 glEnable(GL_TEXTURE_2D);
1665 glBindTexture(GL_TEXTURE_2D,
id);
1669 void rlDisableTexture(
void)
1671 #if defined(GRAPHICS_API_OPENGL_11) 1672 glDisable(GL_TEXTURE_2D);
1674 glBindTexture(GL_TEXTURE_2D, 0);
1678 void rlEnableTextureCubemap(
unsigned int id)
1680 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 1681 glBindTexture(GL_TEXTURE_CUBE_MAP,
id);
1686 void rlDisableTextureCubemap(
void)
1688 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 1689 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
1694 void rlTextureParameters(
unsigned int id,
int param,
int value)
1696 glBindTexture(GL_TEXTURE_2D,
id);
1698 #if !defined(GRAPHICS_API_OPENGL_11) 1700 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
1705 case RL_TEXTURE_WRAP_S:
1706 case RL_TEXTURE_WRAP_T:
1708 if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP)
1710 #if !defined(GRAPHICS_API_OPENGL_11) 1711 if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_2D, param, value);
1712 else TRACELOG(RL_LOG_WARNING,
"GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)");
1715 else glTexParameteri(GL_TEXTURE_2D, param, value);
1718 case RL_TEXTURE_MAG_FILTER:
1719 case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_2D, param, value);
break;
1720 case RL_TEXTURE_FILTER_ANISOTROPIC:
1722 #if !defined(GRAPHICS_API_OPENGL_11) 1723 if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (
float)value);
1724 else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f)
1726 TRACELOG(RL_LOG_WARNING,
"GL: Maximum anisotropic filter level supported is %iX",
id, (
int)RLGL.ExtSupported.maxAnisotropyLevel);
1727 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (
float)value);
1729 else TRACELOG(RL_LOG_WARNING,
"GL: Anisotropic filtering not supported");
1732 #if defined(GRAPHICS_API_OPENGL_33) 1733 case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value/100.0f);
1738 glBindTexture(GL_TEXTURE_2D, 0);
1742 void rlCubemapParameters(
unsigned int id,
int param,
int value)
1744 #if !defined(GRAPHICS_API_OPENGL_11) 1745 glBindTexture(GL_TEXTURE_CUBE_MAP,
id);
1748 glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
1752 case RL_TEXTURE_WRAP_S:
1753 case RL_TEXTURE_WRAP_T:
1755 if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP)
1757 if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value);
1758 else TRACELOG(RL_LOG_WARNING,
"GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)");
1760 else glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value);
1763 case RL_TEXTURE_MAG_FILTER:
1764 case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value);
break;
1765 case RL_TEXTURE_FILTER_ANISOTROPIC:
1767 if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (
float)value);
1768 else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f)
1770 TRACELOG(RL_LOG_WARNING,
"GL: Maximum anisotropic filter level supported is %iX",
id, (
int)RLGL.ExtSupported.maxAnisotropyLevel);
1771 glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (
float)value);
1773 else TRACELOG(RL_LOG_WARNING,
"GL: Anisotropic filtering not supported");
1775 #if defined(GRAPHICS_API_OPENGL_33) 1776 case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_LOD_BIAS, value/100.0f);
1781 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
1786 void rlEnableShader(
unsigned int id)
1788 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) 1794 void rlDisableShader(
void)
1796 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) 1802 void rlEnableFramebuffer(
unsigned int id)
1804 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) 1805 glBindFramebuffer(GL_FRAMEBUFFER,
id);
1810 unsigned int rlGetActiveFramebuffer(
void)
1813 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT) 1814 glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &fboId);
1820 void rlDisableFramebuffer(
void)
1822 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) 1823 glBindFramebuffer(GL_FRAMEBUFFER, 0);
1828 void rlBlitFramebuffer(
int srcX,
int srcY,
int srcWidth,
int srcHeight,
int dstX,
int dstY,
int dstWidth,
int dstHeight,
int bufferMask)
1830 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT) 1831 glBlitFramebuffer(srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight, bufferMask, GL_NEAREST);
1836 void rlBindFramebuffer(
unsigned int target,
unsigned int framebuffer)
1838 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) 1839 glBindFramebuffer(target, framebuffer);
1845 void rlActiveDrawBuffers(
int count)
1847 #if ((defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT)) 1855 if (count > 8) TRACELOG(LOG_WARNING,
"GL: Max color buffers limited to 8");
1858 unsigned int buffers[8] = {
1859 #if defined(GRAPHICS_API_OPENGL_ES3) 1860 GL_COLOR_ATTACHMENT0_EXT,
1861 GL_COLOR_ATTACHMENT1_EXT,
1862 GL_COLOR_ATTACHMENT2_EXT,
1863 GL_COLOR_ATTACHMENT3_EXT,
1864 GL_COLOR_ATTACHMENT4_EXT,
1865 GL_COLOR_ATTACHMENT5_EXT,
1866 GL_COLOR_ATTACHMENT6_EXT,
1867 GL_COLOR_ATTACHMENT7_EXT,
1869 GL_COLOR_ATTACHMENT0,
1870 GL_COLOR_ATTACHMENT1,
1871 GL_COLOR_ATTACHMENT2,
1872 GL_COLOR_ATTACHMENT3,
1873 GL_COLOR_ATTACHMENT4,
1874 GL_COLOR_ATTACHMENT5,
1875 GL_COLOR_ATTACHMENT6,
1876 GL_COLOR_ATTACHMENT7,
1880 #if defined(GRAPHICS_API_OPENGL_ES3) 1881 glDrawBuffersEXT(count, buffers);
1883 glDrawBuffers(count, buffers);
1887 else TRACELOG(LOG_WARNING,
"GL: One color buffer active by default");
1896 void rlEnableColorBlend(
void) { glEnable(GL_BLEND); }
1899 void rlDisableColorBlend(
void) { glDisable(GL_BLEND); }
1902 void rlEnableDepthTest(
void) { glEnable(GL_DEPTH_TEST); }
1905 void rlDisableDepthTest(
void) { glDisable(GL_DEPTH_TEST); }
1908 void rlEnableDepthMask(
void) { glDepthMask(GL_TRUE); }
1911 void rlDisableDepthMask(
void) { glDepthMask(GL_FALSE); }
1914 void rlEnableBackfaceCulling(
void) { glEnable(GL_CULL_FACE); }
1917 void rlDisableBackfaceCulling(
void) { glDisable(GL_CULL_FACE); }
1920 void rlColorMask(
bool r,
bool g,
bool b,
bool a) { glColorMask(r, g, b, a); }
1923 void rlSetCullFace(
int mode)
1927 case RL_CULL_FACE_BACK: glCullFace(GL_BACK);
break;
1928 case RL_CULL_FACE_FRONT: glCullFace(GL_FRONT);
break;
1934 void rlEnableScissorTest(
void) { glEnable(GL_SCISSOR_TEST); }
1937 void rlDisableScissorTest(
void) { glDisable(GL_SCISSOR_TEST); }
1940 void rlScissor(
int x,
int y,
int width,
int height) { glScissor(x, y, width, height); }
1943 void rlEnableWireMode(
void)
1945 #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) 1947 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
1951 void rlEnablePointMode(
void)
1953 #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) 1955 glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
1956 glEnable(GL_PROGRAM_POINT_SIZE);
1960 void rlDisableWireMode(
void)
1962 #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) 1964 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
1969 void rlSetLineWidth(
float width) { glLineWidth(width); }
1972 float rlGetLineWidth(
void)
1975 glGetFloatv(GL_LINE_WIDTH, &width);
1980 void rlEnableSmoothLines(
void)
1982 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) 1983 glEnable(GL_LINE_SMOOTH);
1988 void rlDisableSmoothLines(
void)
1990 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) 1991 glDisable(GL_LINE_SMOOTH);
1996 void rlEnableStereoRender(
void)
1998 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) 1999 RLGL.State.stereoRender =
true;
2004 void rlDisableStereoRender(
void)
2006 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) 2007 RLGL.State.stereoRender =
false;
2012 bool rlIsStereoRenderEnabled(
void)
2014 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) 2015 return RLGL.State.stereoRender;
2022 void rlClearColor(
unsigned char r,
unsigned char g,
unsigned char b,
unsigned char a)
2025 float cr = (float)r/255;
2026 float cg = (float)g/255;
2027 float cb = (float)b/255;
2028 float ca = (float)a/255;
2030 glClearColor(cr, cg, cb, ca);
2034 void rlClearScreenBuffers(
void)
2036 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
2041 void rlCheckErrors(
void)
2043 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2047 const GLenum err = glGetError();
2050 case GL_NO_ERROR: check = 0;
break;
2051 case 0x0500: TRACELOG(RL_LOG_WARNING,
"GL: Error detected: GL_INVALID_ENUM");
break;
2052 case 0x0501: TRACELOG(RL_LOG_WARNING,
"GL: Error detected: GL_INVALID_VALUE");
break;
2053 case 0x0502: TRACELOG(RL_LOG_WARNING,
"GL: Error detected: GL_INVALID_OPERATION");
break;
2054 case 0x0503: TRACELOG(RL_LOG_WARNING,
"GL: Error detected: GL_STACK_OVERFLOW");
break;
2055 case 0x0504: TRACELOG(RL_LOG_WARNING,
"GL: Error detected: GL_STACK_UNDERFLOW");
break;
2056 case 0x0505: TRACELOG(RL_LOG_WARNING,
"GL: Error detected: GL_OUT_OF_MEMORY");
break;
2057 case 0x0506: TRACELOG(RL_LOG_WARNING,
"GL: Error detected: GL_INVALID_FRAMEBUFFER_OPERATION");
break;
2058 default: TRACELOG(RL_LOG_WARNING,
"GL: Error detected: Unknown error code: %x", err);
break;
2065 void rlSetBlendMode(
int mode)
2067 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2068 if ((RLGL.State.currentBlendMode != mode) || ((mode == RL_BLEND_CUSTOM || mode == RL_BLEND_CUSTOM_SEPARATE) && RLGL.State.glCustomBlendModeModified))
2070 rlDrawRenderBatch(RLGL.currentBatch);
2074 case RL_BLEND_ALPHA: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD);
break;
2075 case RL_BLEND_ADDITIVE: glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBlendEquation(GL_FUNC_ADD);
break;
2076 case RL_BLEND_MULTIPLIED: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD);
break;
2077 case RL_BLEND_ADD_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_ADD);
break;
2078 case RL_BLEND_SUBTRACT_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_SUBTRACT);
break;
2079 case RL_BLEND_ALPHA_PREMULTIPLY: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD);
break;
2080 case RL_BLEND_CUSTOM:
2083 glBlendFunc(RLGL.State.glBlendSrcFactor, RLGL.State.glBlendDstFactor); glBlendEquation(RLGL.State.glBlendEquation);
2086 case RL_BLEND_CUSTOM_SEPARATE:
2089 glBlendFuncSeparate(RLGL.State.glBlendSrcFactorRGB, RLGL.State.glBlendDestFactorRGB, RLGL.State.glBlendSrcFactorAlpha, RLGL.State.glBlendDestFactorAlpha);
2090 glBlendEquationSeparate(RLGL.State.glBlendEquationRGB, RLGL.State.glBlendEquationAlpha);
2096 RLGL.State.currentBlendMode = mode;
2097 RLGL.State.glCustomBlendModeModified =
false;
2103 void rlSetBlendFactors(
int glSrcFactor,
int glDstFactor,
int glEquation)
2105 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2106 if ((RLGL.State.glBlendSrcFactor != glSrcFactor) ||
2107 (RLGL.State.glBlendDstFactor != glDstFactor) ||
2108 (RLGL.State.glBlendEquation != glEquation))
2110 RLGL.State.glBlendSrcFactor = glSrcFactor;
2111 RLGL.State.glBlendDstFactor = glDstFactor;
2112 RLGL.State.glBlendEquation = glEquation;
2114 RLGL.State.glCustomBlendModeModified =
true;
2120 void rlSetBlendFactorsSeparate(
int glSrcRGB,
int glDstRGB,
int glSrcAlpha,
int glDstAlpha,
int glEqRGB,
int glEqAlpha)
2122 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2123 if ((RLGL.State.glBlendSrcFactorRGB != glSrcRGB) ||
2124 (RLGL.State.glBlendDestFactorRGB != glDstRGB) ||
2125 (RLGL.State.glBlendSrcFactorAlpha != glSrcAlpha) ||
2126 (RLGL.State.glBlendDestFactorAlpha != glDstAlpha) ||
2127 (RLGL.State.glBlendEquationRGB != glEqRGB) ||
2128 (RLGL.State.glBlendEquationAlpha != glEqAlpha))
2130 RLGL.State.glBlendSrcFactorRGB = glSrcRGB;
2131 RLGL.State.glBlendDestFactorRGB = glDstRGB;
2132 RLGL.State.glBlendSrcFactorAlpha = glSrcAlpha;
2133 RLGL.State.glBlendDestFactorAlpha = glDstAlpha;
2134 RLGL.State.glBlendEquationRGB = glEqRGB;
2135 RLGL.State.glBlendEquationAlpha = glEqAlpha;
2137 RLGL.State.glCustomBlendModeModified =
true;
2145 #if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43) 2146 static void GLAPIENTRY rlDebugMessageCallback(GLenum source, GLenum type, GLuint
id, GLenum severity, GLsizei length,
const GLchar *message,
const void *userParam)
2156 if ((
id == 131169) || (
id == 131185) || (
id == 131218) || (
id == 131204))
return;
2158 const char *msgSource = NULL;
2161 case GL_DEBUG_SOURCE_API: msgSource =
"API";
break;
2162 case GL_DEBUG_SOURCE_WINDOW_SYSTEM: msgSource =
"WINDOW_SYSTEM";
break;
2163 case GL_DEBUG_SOURCE_SHADER_COMPILER: msgSource =
"SHADER_COMPILER";
break;
2164 case GL_DEBUG_SOURCE_THIRD_PARTY: msgSource =
"THIRD_PARTY";
break;
2165 case GL_DEBUG_SOURCE_APPLICATION: msgSource =
"APPLICATION";
break;
2166 case GL_DEBUG_SOURCE_OTHER: msgSource =
"OTHER";
break;
2170 const char *msgType = NULL;
2173 case GL_DEBUG_TYPE_ERROR: msgType =
"ERROR";
break;
2174 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: msgType =
"DEPRECATED_BEHAVIOR";
break;
2175 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: msgType =
"UNDEFINED_BEHAVIOR";
break;
2176 case GL_DEBUG_TYPE_PORTABILITY: msgType =
"PORTABILITY";
break;
2177 case GL_DEBUG_TYPE_PERFORMANCE: msgType =
"PERFORMANCE";
break;
2178 case GL_DEBUG_TYPE_MARKER: msgType =
"MARKER";
break;
2179 case GL_DEBUG_TYPE_PUSH_GROUP: msgType =
"PUSH_GROUP";
break;
2180 case GL_DEBUG_TYPE_POP_GROUP: msgType =
"POP_GROUP";
break;
2181 case GL_DEBUG_TYPE_OTHER: msgType =
"OTHER";
break;
2185 const char *msgSeverity =
"DEFAULT";
2188 case GL_DEBUG_SEVERITY_LOW: msgSeverity =
"LOW";
break;
2189 case GL_DEBUG_SEVERITY_MEDIUM: msgSeverity =
"MEDIUM";
break;
2190 case GL_DEBUG_SEVERITY_HIGH: msgSeverity =
"HIGH";
break;
2191 case GL_DEBUG_SEVERITY_NOTIFICATION: msgSeverity =
"NOTIFICATION";
break;
2195 TRACELOG(LOG_WARNING,
"GL: OpenGL debug message: %s", message);
2196 TRACELOG(LOG_WARNING,
" > Type: %s", msgType);
2197 TRACELOG(LOG_WARNING,
" > Source = %s", msgSource);
2198 TRACELOG(LOG_WARNING,
" > Severity = %s", msgSeverity);
2207 void rlglInit(
int width,
int height)
2210 #if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43) 2211 if ((glDebugMessageCallback != NULL) && (glDebugMessageControl != NULL))
2213 glDebugMessageCallback(rlDebugMessageCallback, 0);
2219 glEnable(GL_DEBUG_OUTPUT);
2220 glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
2224 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2226 unsigned char pixels[4] = { 255, 255, 255, 255 };
2227 RLGL.State.defaultTextureId = rlLoadTexture(pixels, 1, 1, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1);
2229 if (RLGL.State.defaultTextureId != 0) TRACELOG(RL_LOG_INFO,
"TEXTURE: [ID %i] Default texture loaded successfully", RLGL.State.defaultTextureId);
2230 else TRACELOG(RL_LOG_WARNING,
"TEXTURE: Failed to load default texture");
2234 rlLoadShaderDefault();
2235 RLGL.State.currentShaderId = RLGL.State.defaultShaderId;
2236 RLGL.State.currentShaderLocs = RLGL.State.defaultShaderLocs;
2240 RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL] = RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL;
2241 RLGL.defaultBatch = rlLoadRenderBatch(RL_DEFAULT_BATCH_BUFFERS, RL_DEFAULT_BATCH_BUFFER_ELEMENTS);
2242 RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL] = -1;
2243 RLGL.currentBatch = &RLGL.defaultBatch;
2246 for (
int i = 0; i < RL_MAX_MATRIX_STACK_SIZE; i++) RLGL.State.stack[i] = rlMatrixIdentity();
2249 RLGL.State.transform = rlMatrixIdentity();
2250 RLGL.State.projection = rlMatrixIdentity();
2251 RLGL.State.modelview = rlMatrixIdentity();
2252 RLGL.State.currentMatrix = &RLGL.State.modelview;
2253 #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 2258 glDepthFunc(GL_LEQUAL);
2259 glDisable(GL_DEPTH_TEST);
2262 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2267 glCullFace(GL_BACK);
2268 glFrontFace(GL_CCW);
2269 glEnable(GL_CULL_FACE);
2272 #if defined(GRAPHICS_API_OPENGL_33) 2273 glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
2276 #if defined(GRAPHICS_API_OPENGL_11) 2278 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
2279 glShadeModel(GL_SMOOTH);
2282 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2284 RLGL.State.framebufferWidth = width;
2285 RLGL.State.framebufferHeight = height;
2287 TRACELOG(RL_LOG_INFO,
"RLGL: Default OpenGL state initialized successfully");
2292 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
2294 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
2298 void rlglClose(
void)
2300 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2301 rlUnloadRenderBatch(RLGL.defaultBatch);
2303 rlUnloadShaderDefault();
2305 glDeleteTextures(1, &RLGL.State.defaultTextureId);
2306 TRACELOG(RL_LOG_INFO,
"TEXTURE: [ID %i] Default texture unloaded successfully", RLGL.State.defaultTextureId);
2312 void rlLoadExtensions(
void *loader)
2314 #if defined(GRAPHICS_API_OPENGL_33) // Also defined for GRAPHICS_API_OPENGL_21 2316 if (gladLoadGL((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING,
"GLAD: Cannot load OpenGL extensions");
2317 else TRACELOG(RL_LOG_INFO,
"GLAD: OpenGL extensions loaded successfully");
2321 glGetIntegerv(GL_NUM_EXTENSIONS, &numExt);
2322 TRACELOG(RL_LOG_INFO,
"GL: Supported extensions count: %i", numExt);
2324 #if defined(RLGL_SHOW_GL_DETAILS_INFO) 2327 TRACELOG(RL_LOG_INFO,
"GL: OpenGL extensions:");
2328 for (
int i = 0; i < numExt; i++) TRACELOG(RL_LOG_INFO,
" %s", glGetStringi(GL_EXTENSIONS, i));
2331 #if defined(GRAPHICS_API_OPENGL_21) 2334 RLGL.ExtSupported.vao = GLAD_GL_ARB_vertex_array_object;
2335 RLGL.ExtSupported.instancing = (GLAD_GL_EXT_draw_instanced && GLAD_GL_ARB_instanced_arrays);
2336 RLGL.ExtSupported.texNPOT = GLAD_GL_ARB_texture_non_power_of_two;
2337 RLGL.ExtSupported.texFloat32 = GLAD_GL_ARB_texture_float;
2338 RLGL.ExtSupported.texFloat16 = GLAD_GL_ARB_texture_float;
2339 RLGL.ExtSupported.texDepth = GLAD_GL_ARB_depth_texture;
2340 RLGL.ExtSupported.maxDepthBits = 32;
2341 RLGL.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic;
2342 RLGL.ExtSupported.texMirrorClamp = GLAD_GL_EXT_texture_mirror_clamp;
2346 RLGL.ExtSupported.vao =
true;
2347 RLGL.ExtSupported.instancing =
true;
2348 RLGL.ExtSupported.texNPOT =
true;
2349 RLGL.ExtSupported.texFloat32 =
true;
2350 RLGL.ExtSupported.texFloat16 =
true;
2351 RLGL.ExtSupported.texDepth =
true;
2352 RLGL.ExtSupported.maxDepthBits = 32;
2353 RLGL.ExtSupported.texAnisoFilter =
true;
2354 RLGL.ExtSupported.texMirrorClamp =
true;
2358 RLGL.ExtSupported.texCompASTC = GLAD_GL_KHR_texture_compression_astc_hdr && GLAD_GL_KHR_texture_compression_astc_ldr;
2359 RLGL.ExtSupported.texCompDXT = GLAD_GL_EXT_texture_compression_s3tc;
2360 RLGL.ExtSupported.texCompETC2 = GLAD_GL_ARB_ES3_compatibility;
2361 #if defined(GRAPHICS_API_OPENGL_43) 2362 RLGL.ExtSupported.computeShader = GLAD_GL_ARB_compute_shader;
2363 RLGL.ExtSupported.ssbo = GLAD_GL_ARB_shader_storage_buffer_object;
2366 #endif // GRAPHICS_API_OPENGL_33 2368 #if defined(GRAPHICS_API_OPENGL_ES3) 2371 RLGL.ExtSupported.vao =
true;
2372 RLGL.ExtSupported.instancing =
true;
2373 RLGL.ExtSupported.texNPOT =
true;
2374 RLGL.ExtSupported.texFloat32 =
true;
2375 RLGL.ExtSupported.texFloat16 =
true;
2376 RLGL.ExtSupported.texDepth =
true;
2377 RLGL.ExtSupported.texDepthWebGL =
true;
2378 RLGL.ExtSupported.maxDepthBits = 24;
2379 RLGL.ExtSupported.texAnisoFilter =
true;
2380 RLGL.ExtSupported.texMirrorClamp =
true;
2391 #elif defined(GRAPHICS_API_OPENGL_ES2) 2393 #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_DESKTOP_SDL) 2395 if (gladLoadGLES2((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING,
"GLAD: Cannot load OpenGL ES2.0 functions");
2396 else TRACELOG(RL_LOG_INFO,
"GLAD: OpenGL ES 2.0 loaded successfully");
2401 const char **extList = RL_MALLOC(512*
sizeof(
const char *));
2402 const char *extensions = (
const char *)glGetString(GL_EXTENSIONS);
2405 int size = strlen(extensions) + 1;
2406 char *extensionsDup = (
char *)RL_CALLOC(size,
sizeof(
char));
2407 strcpy(extensionsDup, extensions);
2408 extList[numExt] = extensionsDup;
2410 for (
int i = 0; i < size; i++)
2412 if (extensionsDup[i] ==
' ')
2414 extensionsDup[i] =
'\0';
2416 extList[numExt] = &extensionsDup[i + 1];
2420 TRACELOG(RL_LOG_INFO,
"GL: Supported extensions count: %i", numExt);
2422 #if defined(RLGL_SHOW_GL_DETAILS_INFO) 2423 TRACELOG(RL_LOG_INFO,
"GL: OpenGL extensions:");
2424 for (
int i = 0; i < numExt; i++) TRACELOG(RL_LOG_INFO,
" %s", extList[i]);
2428 for (
int i = 0; i < numExt; i++)
2432 if (strcmp(extList[i], (
const char *)
"GL_OES_vertex_array_object") == 0)
2436 glGenVertexArrays = (PFNGLGENVERTEXARRAYSOESPROC)((rlglLoadProc)loader)(
"glGenVertexArraysOES");
2437 glBindVertexArray = (PFNGLBINDVERTEXARRAYOESPROC)((rlglLoadProc)loader)(
"glBindVertexArrayOES");
2438 glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSOESPROC)((rlglLoadProc)loader)(
"glDeleteVertexArraysOES");
2441 if ((glGenVertexArrays != NULL) && (glBindVertexArray != NULL) && (glDeleteVertexArrays != NULL)) RLGL.ExtSupported.vao =
true;
2445 if (strcmp(extList[i], (
const char *)
"GL_ANGLE_instanced_arrays") == 0)
2447 glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)(
"glDrawArraysInstancedANGLE");
2448 glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)(
"glDrawElementsInstancedANGLE");
2449 glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)(
"glVertexAttribDivisorANGLE");
2451 if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing =
true;
2455 if ((strcmp(extList[i], (
const char *)
"GL_EXT_draw_instanced") == 0) &&
2456 (strcmp(extList[i], (
const char *)
"GL_EXT_instanced_arrays") == 0))
2458 glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)(
"glDrawArraysInstancedEXT");
2459 glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)(
"glDrawElementsInstancedEXT");
2460 glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)(
"glVertexAttribDivisorEXT");
2462 if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing =
true;
2468 if (strcmp(extList[i], (
const char *)
"GL_OES_texture_npot") == 0) RLGL.ExtSupported.texNPOT =
true;
2471 if (strcmp(extList[i], (
const char *)
"GL_OES_texture_float") == 0) RLGL.ExtSupported.texFloat32 =
true;
2472 if (strcmp(extList[i], (
const char *)
"GL_OES_texture_half_float") == 0) RLGL.ExtSupported.texFloat16 =
true;
2475 if (strcmp(extList[i], (
const char *)
"GL_OES_depth_texture") == 0) RLGL.ExtSupported.texDepth =
true;
2476 if (strcmp(extList[i], (
const char *)
"GL_WEBGL_depth_texture") == 0) RLGL.ExtSupported.texDepthWebGL =
true;
2477 if (RLGL.ExtSupported.texDepthWebGL) RLGL.ExtSupported.texDepth =
true;
2479 if (strcmp(extList[i], (
const char *)
"GL_OES_depth24") == 0) RLGL.ExtSupported.maxDepthBits = 24;
2480 if (strcmp(extList[i], (
const char *)
"GL_OES_depth32") == 0) RLGL.ExtSupported.maxDepthBits = 32;
2483 if ((strcmp(extList[i], (
const char *)
"GL_EXT_texture_compression_s3tc") == 0) ||
2484 (strcmp(extList[i], (
const char *)
"GL_WEBGL_compressed_texture_s3tc") == 0) ||
2485 (strcmp(extList[i], (
const char *)
"GL_WEBKIT_WEBGL_compressed_texture_s3tc") == 0)) RLGL.ExtSupported.texCompDXT =
true;
2488 if ((strcmp(extList[i], (
const char *)
"GL_OES_compressed_ETC1_RGB8_texture") == 0) ||
2489 (strcmp(extList[i], (
const char *)
"GL_WEBGL_compressed_texture_etc1") == 0)) RLGL.ExtSupported.texCompETC1 =
true;
2492 if (strcmp(extList[i], (
const char *)
"GL_ARB_ES3_compatibility") == 0) RLGL.ExtSupported.texCompETC2 =
true;
2495 if (strcmp(extList[i], (
const char *)
"GL_IMG_texture_compression_pvrtc") == 0) RLGL.ExtSupported.texCompPVRT =
true;
2498 if (strcmp(extList[i], (
const char *)
"GL_KHR_texture_compression_astc_hdr") == 0) RLGL.ExtSupported.texCompASTC =
true;
2501 if (strcmp(extList[i], (
const char *)
"GL_EXT_texture_filter_anisotropic") == 0) RLGL.ExtSupported.texAnisoFilter =
true;
2504 if (strcmp(extList[i], (
const char *)
"GL_EXT_texture_mirror_clamp") == 0) RLGL.ExtSupported.texMirrorClamp =
true;
2509 RL_FREE(extensionsDup);
2510 #endif // GRAPHICS_API_OPENGL_ES2 2515 TRACELOG(RL_LOG_INFO,
"GL: OpenGL device information:");
2516 TRACELOG(RL_LOG_INFO,
" > Vendor: %s", glGetString(GL_VENDOR));
2517 TRACELOG(RL_LOG_INFO,
" > Renderer: %s", glGetString(GL_RENDERER));
2518 TRACELOG(RL_LOG_INFO,
" > Version: %s", glGetString(GL_VERSION));
2519 TRACELOG(RL_LOG_INFO,
" > GLSL: %s", glGetString(GL_SHADING_LANGUAGE_VERSION));
2521 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2523 #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 2524 #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF 2526 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &RLGL.ExtSupported.maxAnisotropyLevel);
2528 #if defined(RLGL_SHOW_GL_DETAILS_INFO) 2530 TRACELOG(RL_LOG_INFO,
"GL: OpenGL capabilities:");
2531 GLint capability = 0;
2532 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &capability);
2533 TRACELOG(RL_LOG_INFO,
" GL_MAX_TEXTURE_SIZE: %i", capability);
2534 glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &capability);
2535 TRACELOG(RL_LOG_INFO,
" GL_MAX_CUBE_MAP_TEXTURE_SIZE: %i", capability);
2536 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &capability);
2537 TRACELOG(RL_LOG_INFO,
" GL_MAX_TEXTURE_IMAGE_UNITS: %i", capability);
2538 glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &capability);
2539 TRACELOG(RL_LOG_INFO,
" GL_MAX_VERTEX_ATTRIBS: %i", capability);
2540 #if !defined(GRAPHICS_API_OPENGL_ES2) 2541 glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &capability);
2542 TRACELOG(RL_LOG_INFO,
" GL_MAX_UNIFORM_BLOCK_SIZE: %i", capability);
2543 glGetIntegerv(GL_MAX_DRAW_BUFFERS, &capability);
2544 TRACELOG(RL_LOG_INFO,
" GL_MAX_DRAW_BUFFERS: %i", capability);
2545 if (RLGL.ExtSupported.texAnisoFilter) TRACELOG(RL_LOG_INFO,
" GL_MAX_TEXTURE_MAX_ANISOTROPY: %.0f", RLGL.ExtSupported.maxAnisotropyLevel);
2547 glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &capability);
2548 TRACELOG(RL_LOG_INFO,
" GL_NUM_COMPRESSED_TEXTURE_FORMATS: %i", capability);
2549 GLint *compFormats = (GLint *)RL_CALLOC(capability,
sizeof(GLint));
2550 glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, compFormats);
2551 for (
int i = 0; i < capability; i++) TRACELOG(RL_LOG_INFO,
" %s", rlGetCompressedFormatName(compFormats[i]));
2552 RL_FREE(compFormats);
2554 #if defined(GRAPHICS_API_OPENGL_43) 2555 glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &capability);
2556 TRACELOG(RL_LOG_INFO,
" GL_MAX_VERTEX_ATTRIB_BINDINGS: %i", capability);
2557 glGetIntegerv(GL_MAX_UNIFORM_LOCATIONS, &capability);
2558 TRACELOG(RL_LOG_INFO,
" GL_MAX_UNIFORM_LOCATIONS: %i", capability);
2559 #endif // GRAPHICS_API_OPENGL_43 2560 #else // RLGL_SHOW_GL_DETAILS_INFO 2563 if (RLGL.ExtSupported.vao) TRACELOG(RL_LOG_INFO,
"GL: VAO extension detected, VAO functions loaded successfully");
2564 else TRACELOG(RL_LOG_WARNING,
"GL: VAO extension not found, VAO not supported");
2565 if (RLGL.ExtSupported.texNPOT) TRACELOG(RL_LOG_INFO,
"GL: NPOT textures extension detected, full NPOT textures supported");
2566 else TRACELOG(RL_LOG_WARNING,
"GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)");
2567 if (RLGL.ExtSupported.texCompDXT) TRACELOG(RL_LOG_INFO,
"GL: DXT compressed textures supported");
2568 if (RLGL.ExtSupported.texCompETC1) TRACELOG(RL_LOG_INFO,
"GL: ETC1 compressed textures supported");
2569 if (RLGL.ExtSupported.texCompETC2) TRACELOG(RL_LOG_INFO,
"GL: ETC2/EAC compressed textures supported");
2570 if (RLGL.ExtSupported.texCompPVRT) TRACELOG(RL_LOG_INFO,
"GL: PVRT compressed textures supported");
2571 if (RLGL.ExtSupported.texCompASTC) TRACELOG(RL_LOG_INFO,
"GL: ASTC compressed textures supported");
2572 if (RLGL.ExtSupported.computeShader) TRACELOG(RL_LOG_INFO,
"GL: Compute shaders supported");
2573 if (RLGL.ExtSupported.ssbo) TRACELOG(RL_LOG_INFO,
"GL: Shader storage buffer objects supported");
2574 #endif // RLGL_SHOW_GL_DETAILS_INFO 2576 #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 2580 int rlGetVersion(
void)
2583 #if defined(GRAPHICS_API_OPENGL_11) 2584 glVersion = RL_OPENGL_11;
2586 #if defined(GRAPHICS_API_OPENGL_21) 2587 glVersion = RL_OPENGL_21;
2588 #elif defined(GRAPHICS_API_OPENGL_43) 2589 glVersion = RL_OPENGL_43;
2590 #elif defined(GRAPHICS_API_OPENGL_33) 2591 glVersion = RL_OPENGL_33;
2593 #if defined(GRAPHICS_API_OPENGL_ES3) 2594 glVersion = RL_OPENGL_ES_30;
2595 #elif defined(GRAPHICS_API_OPENGL_ES2) 2596 glVersion = RL_OPENGL_ES_20;
2603 void rlSetFramebufferWidth(
int width)
2605 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2606 RLGL.State.framebufferWidth = width;
2611 void rlSetFramebufferHeight(
int height)
2613 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2614 RLGL.State.framebufferHeight = height;
2619 int rlGetFramebufferWidth(
void)
2622 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2623 width = RLGL.State.framebufferWidth;
2629 int rlGetFramebufferHeight(
void)
2632 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2633 height = RLGL.State.framebufferHeight;
2640 unsigned int rlGetTextureIdDefault(
void)
2642 unsigned int id = 0;
2643 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2644 id = RLGL.State.defaultTextureId;
2650 unsigned int rlGetShaderIdDefault(
void)
2652 unsigned int id = 0;
2653 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2654 id = RLGL.State.defaultShaderId;
2660 int *rlGetShaderLocsDefault(
void)
2663 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2664 locs = RLGL.State.defaultShaderLocs;
2672 rlRenderBatch rlLoadRenderBatch(
int numBuffers,
int bufferElements)
2676 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2681 for (
int i = 0; i < numBuffers; i++)
2683 batch.vertexBuffer[i].elementCount = bufferElements;
2685 batch.vertexBuffer[i].vertices = (
float *)RL_MALLOC(bufferElements*3*4*
sizeof(
float));
2686 batch.vertexBuffer[i].texcoords = (
float *)RL_MALLOC(bufferElements*2*4*
sizeof(
float));
2687 batch.vertexBuffer[i].normals = (
float *)RL_MALLOC(bufferElements*3*4*
sizeof(
float));
2688 batch.vertexBuffer[i].colors = (
unsigned char *)RL_MALLOC(bufferElements*4*4*
sizeof(
unsigned char));
2689 #if defined(GRAPHICS_API_OPENGL_33) 2690 batch.vertexBuffer[i].indices = (
unsigned int *)RL_MALLOC(bufferElements*6*
sizeof(
unsigned int));
2692 #if defined(GRAPHICS_API_OPENGL_ES2) 2693 batch.vertexBuffer[i].indices = (
unsigned short *)RL_MALLOC(bufferElements*6*
sizeof(
unsigned short));
2696 for (
int j = 0; j < (3*4*bufferElements); j++) batch.vertexBuffer[i].vertices[j] = 0.0f;
2697 for (
int j = 0; j < (2*4*bufferElements); j++) batch.vertexBuffer[i].texcoords[j] = 0.0f;
2698 for (
int j = 0; j < (3*4*bufferElements); j++) batch.vertexBuffer[i].normals[j] = 0.0f;
2699 for (
int j = 0; j < (4*4*bufferElements); j++) batch.vertexBuffer[i].colors[j] = 0;
2704 for (
int j = 0; j < (6*bufferElements); j += 6)
2706 batch.vertexBuffer[i].indices[j] = 4*k;
2707 batch.vertexBuffer[i].indices[j + 1] = 4*k + 1;
2708 batch.vertexBuffer[i].indices[j + 2] = 4*k + 2;
2709 batch.vertexBuffer[i].indices[j + 3] = 4*k;
2710 batch.vertexBuffer[i].indices[j + 4] = 4*k + 2;
2711 batch.vertexBuffer[i].indices[j + 5] = 4*k + 3;
2716 RLGL.State.vertexCounter = 0;
2719 TRACELOG(RL_LOG_INFO,
"RLGL: Render batch vertex buffers loaded successfully in RAM (CPU)");
2724 for (
int i = 0; i < numBuffers; i++)
2726 if (RLGL.ExtSupported.vao)
2729 glGenVertexArrays(1, &batch.vertexBuffer[i].vaoId);
2730 glBindVertexArray(batch.vertexBuffer[i].vaoId);
2735 glGenBuffers(1, &batch.vertexBuffer[i].vboId[0]);
2736 glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[0]);
2737 glBufferData(GL_ARRAY_BUFFER, bufferElements*3*4*
sizeof(
float), batch.vertexBuffer[i].vertices, GL_DYNAMIC_DRAW);
2738 glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]);
2739 glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0);
2742 glGenBuffers(1, &batch.vertexBuffer[i].vboId[1]);
2743 glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[1]);
2744 glBufferData(GL_ARRAY_BUFFER, bufferElements*2*4*
sizeof(
float), batch.vertexBuffer[i].texcoords, GL_DYNAMIC_DRAW);
2745 glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]);
2746 glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0);
2749 glGenBuffers(1, &batch.vertexBuffer[i].vboId[2]);
2750 glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[2]);
2751 glBufferData(GL_ARRAY_BUFFER, bufferElements*3*4*
sizeof(
float), batch.vertexBuffer[i].normals, GL_DYNAMIC_DRAW);
2752 glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL]);
2753 glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0);
2756 glGenBuffers(1, &batch.vertexBuffer[i].vboId[3]);
2757 glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[3]);
2758 glBufferData(GL_ARRAY_BUFFER, bufferElements*4*4*
sizeof(
unsigned char), batch.vertexBuffer[i].colors, GL_DYNAMIC_DRAW);
2759 glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]);
2760 glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);
2763 glGenBuffers(1, &batch.vertexBuffer[i].vboId[4]);
2764 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[4]);
2765 #if defined(GRAPHICS_API_OPENGL_33) 2766 glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*
sizeof(
int), batch.vertexBuffer[i].indices, GL_STATIC_DRAW);
2768 #if defined(GRAPHICS_API_OPENGL_ES2) 2769 glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*
sizeof(
short), batch.vertexBuffer[i].indices, GL_STATIC_DRAW);
2773 TRACELOG(RL_LOG_INFO,
"RLGL: Render batch vertex buffers loaded successfully in VRAM (GPU)");
2776 if (RLGL.ExtSupported.vao) glBindVertexArray(0);
2783 for (
int i = 0; i < RL_DEFAULT_BATCH_DRAWCALLS; i++)
2785 batch.draws[i].mode = RL_QUADS;
2786 batch.draws[i].vertexCount = 0;
2787 batch.draws[i].vertexAlignment = 0;
2790 batch.draws[i].textureId = RLGL.State.defaultTextureId;
2795 batch.bufferCount = numBuffers;
2796 batch.drawCounter = 1;
2797 batch.currentDepth = -1.0f;
2807 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2809 glBindBuffer(GL_ARRAY_BUFFER, 0);
2810 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
2813 for (
int i = 0; i < batch.bufferCount; i++)
2816 if (RLGL.ExtSupported.vao)
2818 glBindVertexArray(batch.vertexBuffer[i].vaoId);
2819 glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION);
2820 glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD);
2821 glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL);
2822 glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR);
2823 glBindVertexArray(0);
2827 glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[0]);
2828 glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[1]);
2829 glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[2]);
2830 glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[3]);
2831 glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[4]);
2834 if (RLGL.ExtSupported.vao) glDeleteVertexArrays(1, &batch.vertexBuffer[i].vaoId);
2837 RL_FREE(batch.vertexBuffer[i].vertices);
2838 RL_FREE(batch.vertexBuffer[i].texcoords);
2839 RL_FREE(batch.vertexBuffer[i].normals);
2840 RL_FREE(batch.vertexBuffer[i].colors);
2841 RL_FREE(batch.vertexBuffer[i].indices);
2845 RL_FREE(batch.vertexBuffer);
2846 RL_FREE(batch.draws);
2854 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 2859 if (RLGL.State.vertexCounter > 0)
2862 if (RLGL.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId);
2865 glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[0]);
2866 glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*3*
sizeof(
float), batch->vertexBuffer[batch->currentBuffer].vertices);
2870 glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[1]);
2871 glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*2*
sizeof(
float), batch->vertexBuffer[batch->currentBuffer].texcoords);
2875 glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]);
2876 glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*3*
sizeof(
float), batch->vertexBuffer[batch->currentBuffer].normals);
2880 glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[3]);
2881 glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*4*
sizeof(
unsigned char), batch->vertexBuffer[batch->currentBuffer].colors);
2900 if (RLGL.ExtSupported.vao) glBindVertexArray(0);
2906 Matrix matProjection = RLGL.State.projection;
2907 Matrix matModelView = RLGL.State.modelview;
2910 if (RLGL.State.stereoRender) eyeCount = 2;
2912 for (
int eye = 0; eye < eyeCount; eye++)
2917 rlViewport(eye*RLGL.State.framebufferWidth/2, 0, RLGL.State.framebufferWidth/2, RLGL.State.framebufferHeight);
2920 rlSetMatrixModelview(rlMatrixMultiply(matModelView, RLGL.State.viewOffsetStereo[eye]));
2922 rlSetMatrixProjection(RLGL.State.projectionStereo[eye]);
2926 if (RLGL.State.vertexCounter > 0)
2929 glUseProgram(RLGL.State.currentShaderId);
2932 Matrix matMVP = rlMatrixMultiply(RLGL.State.modelview, RLGL.State.projection);
2933 glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MVP], 1,
false, rlMatrixToFloat(matMVP));
2935 if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_PROJECTION] != -1)
2937 glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_PROJECTION], 1,
false, rlMatrixToFloat(RLGL.State.projection));
2943 if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_VIEW] != -1)
2945 glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_VIEW], 1,
false, rlMatrixToFloat(RLGL.State.modelview));
2948 if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MODEL] != -1)
2950 glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MODEL], 1,
false, rlMatrixToFloat(RLGL.State.transform));
2953 if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_NORMAL] != -1)
2955 glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_NORMAL], 1,
false, rlMatrixToFloat(rlMatrixTranspose(rlMatrixInvert(RLGL.State.transform))));
2958 if (RLGL.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId);
2962 glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[0]);
2963 glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0);
2964 glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]);
2967 glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[1]);
2968 glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0);
2969 glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]);
2972 glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]);
2973 glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0);
2974 glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL]);
2977 glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[3]);
2978 glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0);
2979 glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]);
2981 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[4]);
2985 glUniform4f(RLGL.State.currentShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE], 1.0f, 1.0f, 1.0f, 1.0f);
2986 glUniform1i(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE], 0);
2990 for (
int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++)
2992 if (RLGL.State.activeTextureId[i] > 0)
2994 glActiveTexture(GL_TEXTURE0 + 1 + i);
2995 glBindTexture(GL_TEXTURE_2D, RLGL.State.activeTextureId[i]);
3001 glActiveTexture(GL_TEXTURE0);
3003 for (
int i = 0, vertexOffset = 0; i < batch->drawCounter; i++)
3006 glBindTexture(GL_TEXTURE_2D, batch->draws[i].textureId);
3008 if ((batch->draws[i].mode == RL_LINES) || (batch->draws[i].mode == RL_TRIANGLES)) glDrawArrays(batch->draws[i].mode, vertexOffset, batch->draws[i].vertexCount);
3011 #if defined(GRAPHICS_API_OPENGL_33) 3015 glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_INT, (GLvoid *)(vertexOffset/4*6*
sizeof(GLuint)));
3017 #if defined(GRAPHICS_API_OPENGL_ES2) 3018 glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_SHORT, (GLvoid *)(vertexOffset/4*6*
sizeof(GLushort)));
3022 vertexOffset += (batch->draws[i].vertexCount + batch->draws[i].vertexAlignment);
3025 if (!RLGL.ExtSupported.vao)
3027 glBindBuffer(GL_ARRAY_BUFFER, 0);
3028 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
3031 glBindTexture(GL_TEXTURE_2D, 0);
3034 if (RLGL.ExtSupported.vao) glBindVertexArray(0);
3040 if (eyeCount == 2) rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight);
3046 RLGL.State.vertexCounter = 0;
3049 batch->currentDepth = -1.0f;
3052 RLGL.State.projection = matProjection;
3053 RLGL.State.modelview = matModelView;
3056 for (
int i = 0; i < RL_DEFAULT_BATCH_DRAWCALLS; i++)
3058 batch->draws[i].mode = RL_QUADS;
3059 batch->draws[i].vertexCount = 0;
3060 batch->draws[i].textureId = RLGL.State.defaultTextureId;
3064 for (
int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) RLGL.State.activeTextureId[i] = 0;
3067 batch->drawCounter = 1;
3071 batch->currentBuffer++;
3072 if (batch->currentBuffer >= batch->bufferCount) batch->currentBuffer = 0;
3079 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3080 rlDrawRenderBatch(RLGL.currentBatch);
3082 if (batch != NULL) RLGL.currentBatch = batch;
3083 else RLGL.currentBatch = &RLGL.defaultBatch;
3088 void rlDrawRenderBatchActive(
void)
3090 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3091 rlDrawRenderBatch(RLGL.currentBatch);
3097 bool rlCheckRenderBatchLimit(
int vCount)
3099 bool overflow =
false;
3101 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3102 if ((RLGL.State.vertexCounter + vCount) >=
3103 (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4))
3108 int currentMode = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode;
3109 int currentTexture = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId;
3111 rlDrawRenderBatch(RLGL.currentBatch);
3114 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = currentMode;
3115 RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = currentTexture;
3125 unsigned int rlLoadTexture(
const void *data,
int width,
int height,
int format,
int mipmapCount)
3127 unsigned int id = 0;
3129 glBindTexture(GL_TEXTURE_2D, 0);
3132 #if defined(GRAPHICS_API_OPENGL_11) 3133 if (format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)
3135 TRACELOG(RL_LOG_WARNING,
"GL: OpenGL 1.1 does not support GPU compressed texture formats");
3139 if ((!RLGL.ExtSupported.texCompDXT) && ((format == RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA) ||
3140 (format == RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA) || (format == RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA)))
3142 TRACELOG(RL_LOG_WARNING,
"GL: DXT compressed texture format not supported");
3145 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3146 if ((!RLGL.ExtSupported.texCompETC1) && (format == RL_PIXELFORMAT_COMPRESSED_ETC1_RGB))
3148 TRACELOG(RL_LOG_WARNING,
"GL: ETC1 compressed texture format not supported");
3152 if ((!RLGL.ExtSupported.texCompETC2) && ((format == RL_PIXELFORMAT_COMPRESSED_ETC2_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA)))
3154 TRACELOG(RL_LOG_WARNING,
"GL: ETC2 compressed texture format not supported");
3158 if ((!RLGL.ExtSupported.texCompPVRT) && ((format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA)))
3160 TRACELOG(RL_LOG_WARNING,
"GL: PVRT compressed texture format not supported");
3164 if ((!RLGL.ExtSupported.texCompASTC) && ((format == RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA) || (format == RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)))
3166 TRACELOG(RL_LOG_WARNING,
"GL: ASTC compressed texture format not supported");
3170 #endif // GRAPHICS_API_OPENGL_11 3172 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
3174 glGenTextures(1, &
id);
3176 glBindTexture(GL_TEXTURE_2D,
id);
3178 int mipWidth = width;
3179 int mipHeight = height;
3183 unsigned char *dataPtr = NULL;
3184 if (data != NULL) dataPtr = (
unsigned char *)data;
3187 for (
int i = 0; i < mipmapCount; i++)
3189 unsigned int mipSize = rlGetPixelDataSize(mipWidth, mipHeight, format);
3191 unsigned int glInternalFormat, glFormat, glType;
3192 rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
3194 TRACELOGD(
"TEXTURE: Load mipmap level %i (%i x %i), size: %i, offset: %i", i, mipWidth, mipHeight, mipSize, mipOffset);
3196 if (glInternalFormat != 0)
3198 if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, glFormat, glType, dataPtr);
3199 #if !defined(GRAPHICS_API_OPENGL_11) 3200 else glCompressedTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, mipSize, dataPtr);
3203 #if defined(GRAPHICS_API_OPENGL_33) 3204 if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE)
3206 GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ONE };
3207 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
3209 else if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA)
3211 #if defined(GRAPHICS_API_OPENGL_21) 3212 GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA };
3213 #elif defined(GRAPHICS_API_OPENGL_33) 3214 GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN };
3216 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
3223 mipOffset += mipSize;
3224 if (data != NULL) dataPtr += mipSize;
3227 if (mipWidth < 1) mipWidth = 1;
3228 if (mipHeight < 1) mipHeight = 1;
3233 #if defined(GRAPHICS_API_OPENGL_ES2) 3235 if (RLGL.ExtSupported.texNPOT)
3237 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
3238 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
3243 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3244 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3247 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
3248 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
3252 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3253 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3255 #if defined(GRAPHICS_API_OPENGL_33) 3256 if (mipmapCount > 1)
3259 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3260 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
3269 glBindTexture(GL_TEXTURE_2D, 0);
3271 if (
id > 0) TRACELOG(RL_LOG_INFO,
"TEXTURE: [ID %i] Texture loaded successfully (%ix%i | %s | %i mipmaps)",
id, width, height, rlGetPixelFormatName(format), mipmapCount);
3272 else TRACELOG(RL_LOG_WARNING,
"TEXTURE: Failed to load texture");
3279 unsigned int rlLoadTextureDepth(
int width,
int height,
bool useRenderBuffer)
3281 unsigned int id = 0;
3283 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3285 if (!RLGL.ExtSupported.texDepth) useRenderBuffer =
true;
3289 unsigned int glInternalFormat = GL_DEPTH_COMPONENT;
3291 #if (defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_ES3)) 3294 if (!RLGL.ExtSupported.texDepthWebGL || useRenderBuffer)
3296 if (RLGL.ExtSupported.maxDepthBits == 32) glInternalFormat = GL_DEPTH_COMPONENT32_OES;
3297 else if (RLGL.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24_OES;
3298 else glInternalFormat = GL_DEPTH_COMPONENT16;
3302 if (!useRenderBuffer && RLGL.ExtSupported.texDepth)
3304 glGenTextures(1, &
id);
3305 glBindTexture(GL_TEXTURE_2D,
id);
3306 glTexImage2D(GL_TEXTURE_2D, 0, glInternalFormat, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
3308 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3309 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3310 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3311 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3313 glBindTexture(GL_TEXTURE_2D, 0);
3315 TRACELOG(RL_LOG_INFO,
"TEXTURE: Depth texture loaded successfully");
3321 glGenRenderbuffers(1, &
id);
3322 glBindRenderbuffer(GL_RENDERBUFFER,
id);
3323 glRenderbufferStorage(GL_RENDERBUFFER, glInternalFormat, width, height);
3325 glBindRenderbuffer(GL_RENDERBUFFER, 0);
3327 TRACELOG(RL_LOG_INFO,
"TEXTURE: [ID %i] Depth renderbuffer loaded successfully (%i bits)",
id, (RLGL.ExtSupported.maxDepthBits >= 24)? RLGL.ExtSupported.maxDepthBits : 16);
3337 unsigned int rlLoadTextureCubemap(
const void *data,
int size,
int format)
3339 unsigned int id = 0;
3341 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3342 unsigned int dataSize = rlGetPixelDataSize(size, size, format);
3344 glGenTextures(1, &
id);
3345 glBindTexture(GL_TEXTURE_CUBE_MAP,
id);
3347 unsigned int glInternalFormat, glFormat, glType;
3348 rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
3350 if (glInternalFormat != 0)
3353 for (
unsigned int i = 0; i < 6; i++)
3357 if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)
3359 if ((format == RL_PIXELFORMAT_UNCOMPRESSED_R32) || (format == RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32)
3360 || (format == RL_PIXELFORMAT_UNCOMPRESSED_R16) || (format == RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16))
3361 TRACELOG(RL_LOG_WARNING,
"TEXTURES: Cubemap requested format not supported");
3362 else glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, size, size, 0, glFormat, glType, NULL);
3364 else TRACELOG(RL_LOG_WARNING,
"TEXTURES: Empty cubemap creation does not support compressed format");
3368 if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, size, size, 0, glFormat, glType, (
unsigned char *)data + i*dataSize);
3369 else glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, size, size, 0, dataSize, (
unsigned char *)data + i*dataSize);
3372 #if defined(GRAPHICS_API_OPENGL_33) 3373 if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE)
3375 GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ONE };
3376 glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
3378 else if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA)
3380 #if defined(GRAPHICS_API_OPENGL_21) 3381 GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA };
3382 #elif defined(GRAPHICS_API_OPENGL_33) 3383 GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN };
3385 glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
3392 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
3393 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3394 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3395 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3396 #if defined(GRAPHICS_API_OPENGL_33) 3397 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
3400 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
3403 if (
id > 0) TRACELOG(RL_LOG_INFO,
"TEXTURE: [ID %i] Cubemap texture loaded successfully (%ix%i)",
id, size, size);
3404 else TRACELOG(RL_LOG_WARNING,
"TEXTURE: Failed to load cubemap texture");
3411 void rlUpdateTexture(
unsigned int id,
int offsetX,
int offsetY,
int width,
int height,
int format,
const void *data)
3413 glBindTexture(GL_TEXTURE_2D,
id);
3415 unsigned int glInternalFormat, glFormat, glType;
3416 rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
3418 if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB))
3420 glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY, width, height, glFormat, glType, data);
3422 else TRACELOG(RL_LOG_WARNING,
"TEXTURE: [ID %i] Failed to update for current texture format (%i)",
id, format);
3426 void rlGetGlTextureFormats(
int format,
unsigned int *glInternalFormat,
unsigned int *glFormat,
unsigned int *glType)
3428 *glInternalFormat = 0;
3434 #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_21) || defined(GRAPHICS_API_OPENGL_ES2) 3436 case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_UNSIGNED_BYTE;
break;
3437 case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_LUMINANCE_ALPHA; *glFormat = GL_LUMINANCE_ALPHA; *glType = GL_UNSIGNED_BYTE;
break;
3438 case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5;
break;
3439 case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE;
break;
3440 case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1;
break;
3441 case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4;
break;
3442 case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE;
break;
3443 #if !defined(GRAPHICS_API_OPENGL_11) 3444 #if defined(GRAPHICS_API_OPENGL_ES3) 3445 case RL_PIXELFORMAT_UNCOMPRESSED_R32:
if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F_EXT; *glFormat = GL_RED_EXT; *glType = GL_FLOAT;
break;
3446 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32:
if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F_EXT; *glFormat = GL_RGB; *glType = GL_FLOAT;
break;
3447 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32:
if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F_EXT; *glFormat = GL_RGBA; *glType = GL_FLOAT;
break;
3448 case RL_PIXELFORMAT_UNCOMPRESSED_R16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F_EXT; *glFormat = GL_RED_EXT; *glType = GL_HALF_FLOAT;
break;
3449 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F_EXT; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT;
break;
3450 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F_EXT; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT;
break;
3452 case RL_PIXELFORMAT_UNCOMPRESSED_R32:
if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_FLOAT;
break;
3453 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32:
if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_FLOAT;
break;
3454 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32:
if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_FLOAT;
break;
3455 #if defined(GRAPHICS_API_OPENGL_21) 3456 case RL_PIXELFORMAT_UNCOMPRESSED_R16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_ARB;
break;
3457 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_ARB;
break;
3458 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_ARB;
break;
3459 #else // defined(GRAPHICS_API_OPENGL_ES2) 3460 case RL_PIXELFORMAT_UNCOMPRESSED_R16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_OES;
break;
3461 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_OES;
break;
3462 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_OES;
break;
3466 #elif defined(GRAPHICS_API_OPENGL_33) 3467 case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_R8; *glFormat = GL_RED; *glType = GL_UNSIGNED_BYTE;
break;
3468 case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_RG8; *glFormat = GL_RG; *glType = GL_UNSIGNED_BYTE;
break;
3469 case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB565; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5;
break;
3470 case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB8; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE;
break;
3471 case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGB5_A1; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1;
break;
3472 case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA4; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4;
break;
3473 case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA8; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE;
break;
3474 case RL_PIXELFORMAT_UNCOMPRESSED_R32:
if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F; *glFormat = GL_RED; *glType = GL_FLOAT;
break;
3475 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32:
if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT;
break;
3476 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32:
if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT;
break;
3477 case RL_PIXELFORMAT_UNCOMPRESSED_R16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F; *glFormat = GL_RED; *glType = GL_HALF_FLOAT;
break;
3478 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT;
break;
3479 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16:
if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT;
break;
3481 #if !defined(GRAPHICS_API_OPENGL_11) 3482 case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB:
if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
break;
3483 case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA:
if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
break;
3484 case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA:
if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
break;
3485 case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA:
if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
break;
3486 case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB:
if (RLGL.ExtSupported.texCompETC1) *glInternalFormat = GL_ETC1_RGB8_OES;
break;
3487 case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB:
if (RLGL.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGB8_ETC2;
break;
3488 case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA:
if (RLGL.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC;
break;
3489 case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB:
if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
break;
3490 case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA:
if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
break;
3491 case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA:
if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
break;
3492 case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA:
if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
break;
3494 default: TRACELOG(RL_LOG_WARNING,
"TEXTURE: Current format not supported (%i)", format);
break;
3499 void rlUnloadTexture(
unsigned int id)
3501 glDeleteTextures(1, &
id);
3506 void rlGenTextureMipmaps(
unsigned int id,
int width,
int height,
int format,
int *mipmaps)
3508 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3509 glBindTexture(GL_TEXTURE_2D,
id);
3512 bool texIsPOT =
false;
3514 if (((width > 0) && ((width & (width - 1)) == 0)) &&
3515 ((height > 0) && ((height & (height - 1)) == 0))) texIsPOT =
true;
3517 if ((texIsPOT) || (RLGL.ExtSupported.texNPOT))
3520 glGenerateMipmap(GL_TEXTURE_2D);
3522 #define MIN(a,b) (((a)<(b))? (a):(b)) 3523 #define MAX(a,b) (((a)>(b))? (a):(b)) 3525 *mipmaps = 1 + (int)floor(log(MAX(width, height))/log(2));
3526 TRACELOG(RL_LOG_INFO,
"TEXTURE: [ID %i] Mipmaps generated automatically, total: %i",
id, *mipmaps);
3528 else TRACELOG(RL_LOG_WARNING,
"TEXTURE: [ID %i] Failed to generate mipmaps",
id);
3530 glBindTexture(GL_TEXTURE_2D, 0);
3532 TRACELOG(RL_LOG_WARNING,
"TEXTURE: [ID %i] GPU mipmap generation not supported",
id);
3537 void *rlReadTexturePixels(
unsigned int id,
int width,
int height,
int format)
3539 void *pixels = NULL;
3541 #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) 3542 glBindTexture(GL_TEXTURE_2D,
id);
3555 glPixelStorei(GL_PACK_ALIGNMENT, 1);
3557 unsigned int glInternalFormat, glFormat, glType;
3558 rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
3559 unsigned int size = rlGetPixelDataSize(width, height, format);
3561 if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB))
3563 pixels = RL_MALLOC(size);
3564 glGetTexImage(GL_TEXTURE_2D, 0, glFormat, glType, pixels);
3566 else TRACELOG(RL_LOG_WARNING,
"TEXTURE: [ID %i] Data retrieval not suported for pixel format (%i)",
id, format);
3568 glBindTexture(GL_TEXTURE_2D, 0);
3571 #if defined(GRAPHICS_API_OPENGL_ES2) 3579 unsigned int fboId = rlLoadFramebuffer();
3581 glBindFramebuffer(GL_FRAMEBUFFER, fboId);
3582 glBindTexture(GL_TEXTURE_2D, 0);
3585 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
id, 0);
3588 pixels = (
unsigned char *)RL_MALLOC(rlGetPixelDataSize(width, height, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8));
3589 glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
3591 glBindFramebuffer(GL_FRAMEBUFFER, 0);
3594 rlUnloadFramebuffer(fboId);
3601 unsigned char *rlReadScreenPixels(
int width,
int height)
3603 unsigned char *screenData = (
unsigned char *)RL_CALLOC(width*height*4,
sizeof(
unsigned char));
3607 glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, screenData);
3610 unsigned char *imgData = (
unsigned char *)RL_MALLOC(width*height*4*
sizeof(
unsigned char));
3612 for (
int y = height - 1; y >= 0; y--)
3614 for (
int x = 0; x < (width*4); x++)
3616 imgData[((height - 1) - y)*width*4 + x] = screenData[(y*width*4) + x];
3620 if (((x + 1)%4) == 0) imgData[((height - 1) - y)*width*4 + x] = 255;
3624 RL_FREE(screenData);
3633 unsigned int rlLoadFramebuffer(
void)
3635 unsigned int fboId = 0;
3637 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) 3638 glGenFramebuffers(1, &fboId);
3639 glBindFramebuffer(GL_FRAMEBUFFER, 0);
3647 void rlFramebufferAttach(
unsigned int fboId,
unsigned int texId,
int attachType,
int texType,
int mipLevel)
3649 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) 3650 glBindFramebuffer(GL_FRAMEBUFFER, fboId);
3654 case RL_ATTACHMENT_COLOR_CHANNEL0:
3655 case RL_ATTACHMENT_COLOR_CHANNEL1:
3656 case RL_ATTACHMENT_COLOR_CHANNEL2:
3657 case RL_ATTACHMENT_COLOR_CHANNEL3:
3658 case RL_ATTACHMENT_COLOR_CHANNEL4:
3659 case RL_ATTACHMENT_COLOR_CHANNEL5:
3660 case RL_ATTACHMENT_COLOR_CHANNEL6:
3661 case RL_ATTACHMENT_COLOR_CHANNEL7:
3663 if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_TEXTURE_2D, texId, mipLevel);
3664 else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_RENDERBUFFER, texId);
3665 else if (texType >= RL_ATTACHMENT_CUBEMAP_POSITIVE_X) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_TEXTURE_CUBE_MAP_POSITIVE_X + texType, texId, mipLevel);
3668 case RL_ATTACHMENT_DEPTH:
3670 if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel);
3671 else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, texId);
3674 case RL_ATTACHMENT_STENCIL:
3676 if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel);
3677 else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, texId);
3683 glBindFramebuffer(GL_FRAMEBUFFER, 0);
3688 bool rlFramebufferComplete(
unsigned int id)
3690 bool result =
false;
3692 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) 3693 glBindFramebuffer(GL_FRAMEBUFFER,
id);
3695 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
3697 if (status != GL_FRAMEBUFFER_COMPLETE)
3701 case GL_FRAMEBUFFER_UNSUPPORTED: TRACELOG(RL_LOG_WARNING,
"FBO: [ID %i] Framebuffer is unsupported",
id);
break;
3702 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: TRACELOG(RL_LOG_WARNING,
"FBO: [ID %i] Framebuffer has incomplete attachment",
id);
break;
3703 #if defined(GRAPHICS_API_OPENGL_ES2) 3704 case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: TRACELOG(RL_LOG_WARNING,
"FBO: [ID %i] Framebuffer has incomplete dimensions",
id);
break;
3706 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: TRACELOG(RL_LOG_WARNING,
"FBO: [ID %i] Framebuffer has a missing attachment",
id);
break;
3711 glBindFramebuffer(GL_FRAMEBUFFER, 0);
3713 result = (status == GL_FRAMEBUFFER_COMPLETE);
3721 void rlUnloadFramebuffer(
unsigned int id)
3723 #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) 3725 int depthType = 0, depthId = 0;
3726 glBindFramebuffer(GL_FRAMEBUFFER,
id);
3727 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &depthType);
3732 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &depthId);
3734 unsigned int depthIdU = (
unsigned int)depthId;
3735 if (depthType == GL_RENDERBUFFER) glDeleteRenderbuffers(1, &depthIdU);
3736 else if (depthType == GL_TEXTURE) glDeleteTextures(1, &depthIdU);
3741 glBindFramebuffer(GL_FRAMEBUFFER, 0);
3742 glDeleteFramebuffers(1, &
id);
3744 TRACELOG(RL_LOG_INFO,
"FBO: [ID %i] Unloaded framebuffer from VRAM (GPU)",
id);
3751 unsigned int rlLoadVertexBuffer(
const void *buffer,
int size,
bool dynamic)
3753 unsigned int id = 0;
3755 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3756 glGenBuffers(1, &
id);
3757 glBindBuffer(GL_ARRAY_BUFFER,
id);
3758 glBufferData(GL_ARRAY_BUFFER, size, buffer, dynamic? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
3765 unsigned int rlLoadVertexBufferElement(
const void *buffer,
int size,
bool dynamic)
3767 unsigned int id = 0;
3769 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3770 glGenBuffers(1, &
id);
3771 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
id);
3772 glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, buffer, dynamic? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
3779 void rlEnableVertexBuffer(
unsigned int id)
3781 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3782 glBindBuffer(GL_ARRAY_BUFFER,
id);
3787 void rlDisableVertexBuffer(
void)
3789 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3790 glBindBuffer(GL_ARRAY_BUFFER, 0);
3795 void rlEnableVertexBufferElement(
unsigned int id)
3797 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3798 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
id);
3803 void rlDisableVertexBufferElement(
void)
3805 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3806 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
3812 void rlUpdateVertexBuffer(
unsigned int id,
const void *data,
int dataSize,
int offset)
3814 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3815 glBindBuffer(GL_ARRAY_BUFFER,
id);
3816 glBufferSubData(GL_ARRAY_BUFFER, offset, dataSize, data);
3822 void rlUpdateVertexBufferElements(
unsigned int id,
const void *data,
int dataSize,
int offset)
3824 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3825 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
id);
3826 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, dataSize, data);
3831 bool rlEnableVertexArray(
unsigned int vaoId)
3833 bool result =
false;
3834 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3835 if (RLGL.ExtSupported.vao)
3837 glBindVertexArray(vaoId);
3845 void rlDisableVertexArray(
void)
3847 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3848 if (RLGL.ExtSupported.vao) glBindVertexArray(0);
3853 void rlEnableVertexAttribute(
unsigned int index)
3855 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3856 glEnableVertexAttribArray(index);
3861 void rlDisableVertexAttribute(
unsigned int index)
3863 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3864 glDisableVertexAttribArray(index);
3869 void rlDrawVertexArray(
int offset,
int count)
3871 glDrawArrays(GL_TRIANGLES, offset, count);
3875 void rlDrawVertexArrayElements(
int offset,
int count,
const void *buffer)
3878 unsigned short *bufferPtr = (
unsigned short *)buffer;
3879 if (offset > 0) bufferPtr += offset;
3881 glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (
const unsigned short *)bufferPtr);
3885 void rlDrawVertexArrayInstanced(
int offset,
int count,
int instances)
3887 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3888 glDrawArraysInstanced(GL_TRIANGLES, 0, count, instances);
3893 void rlDrawVertexArrayElementsInstanced(
int offset,
int count,
const void *buffer,
int instances)
3895 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3897 unsigned short *bufferPtr = (
unsigned short *)buffer;
3898 if (offset > 0) bufferPtr += offset;
3900 glDrawElementsInstanced(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (
const unsigned short *)bufferPtr, instances);
3904 #if defined(GRAPHICS_API_OPENGL_11) 3906 void rlEnableStatePointer(
int vertexAttribType,
void *buffer)
3908 if (buffer != NULL) glEnableClientState(vertexAttribType);
3909 switch (vertexAttribType)
3911 case GL_VERTEX_ARRAY: glVertexPointer(3, GL_FLOAT, 0, buffer);
break;
3912 case GL_TEXTURE_COORD_ARRAY: glTexCoordPointer(2, GL_FLOAT, 0, buffer);
break;
3913 case GL_NORMAL_ARRAY:
if (buffer != NULL) glNormalPointer(GL_FLOAT, 0, buffer);
break;
3914 case GL_COLOR_ARRAY:
if (buffer != NULL) glColorPointer(4, GL_UNSIGNED_BYTE, 0, buffer);
break;
3921 void rlDisableStatePointer(
int vertexAttribType)
3923 glDisableClientState(vertexAttribType);
3928 unsigned int rlLoadVertexArray(
void)
3930 unsigned int vaoId = 0;
3931 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3932 if (RLGL.ExtSupported.vao)
3934 glGenVertexArrays(1, &vaoId);
3941 void rlSetVertexAttribute(
unsigned int index,
int compSize,
int type,
bool normalized,
int stride,
int offset)
3943 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3948 glVertexAttribPointer(index, compSize, type, normalized, stride, (
void *)offset);
3953 void rlSetVertexAttributeDivisor(
unsigned int index,
int divisor)
3955 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3956 glVertexAttribDivisor(index, divisor);
3961 void rlUnloadVertexArray(
unsigned int vaoId)
3963 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3964 if (RLGL.ExtSupported.vao)
3966 glBindVertexArray(0);
3967 glDeleteVertexArrays(1, &vaoId);
3968 TRACELOG(RL_LOG_INFO,
"VAO: [ID %i] Unloaded vertex array data from VRAM (GPU)", vaoId);
3974 void rlUnloadVertexBuffer(
unsigned int vboId)
3976 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3977 glDeleteBuffers(1, &vboId);
3986 unsigned int rlLoadShaderCode(
const char *vsCode,
const char *fsCode)
3988 unsigned int id = 0;
3990 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 3991 unsigned int vertexShaderId = 0;
3992 unsigned int fragmentShaderId = 0;
3995 if (vsCode != NULL) vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER);
3997 if (vertexShaderId == 0) vertexShaderId = RLGL.State.defaultVShaderId;
4000 if (fsCode != NULL) fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER);
4002 if (fragmentShaderId == 0) fragmentShaderId = RLGL.State.defaultFShaderId;
4005 if ((vertexShaderId == RLGL.State.defaultVShaderId) && (fragmentShaderId == RLGL.State.defaultFShaderId))
id = RLGL.State.defaultShaderId;
4009 id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId);
4013 if (vertexShaderId != RLGL.State.defaultVShaderId)
4016 if (
id > 0) glDetachShader(
id, vertexShaderId);
4017 glDeleteShader(vertexShaderId);
4019 if (fragmentShaderId != RLGL.State.defaultFShaderId)
4022 if (
id > 0) glDetachShader(
id, fragmentShaderId);
4023 glDeleteShader(fragmentShaderId);
4030 TRACELOG(RL_LOG_WARNING,
"SHADER: Failed to load custom shader code, using default shader");
4031 id = RLGL.State.defaultShaderId;
4063 unsigned int rlCompileShader(
const char *shaderCode,
int type)
4065 unsigned int shader = 0;
4067 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4068 shader = glCreateShader(type);
4069 glShaderSource(shader, 1, &shaderCode, NULL);
4072 glCompileShader(shader);
4073 glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
4075 if (success == GL_FALSE)
4079 case GL_VERTEX_SHADER: TRACELOG(RL_LOG_WARNING,
"SHADER: [ID %i] Failed to compile vertex shader code", shader);
break;
4080 case GL_FRAGMENT_SHADER: TRACELOG(RL_LOG_WARNING,
"SHADER: [ID %i] Failed to compile fragment shader code", shader);
break;
4082 #if defined(GRAPHICS_API_OPENGL_43) 4083 case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING,
"SHADER: [ID %i] Failed to compile compute shader code", shader);
break;
4089 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
4094 char *log = (
char *)RL_CALLOC(maxLength,
sizeof(
char));
4095 glGetShaderInfoLog(shader, maxLength, &length, log);
4096 TRACELOG(RL_LOG_WARNING,
"SHADER: [ID %i] Compile error: %s", shader, log);
4104 case GL_VERTEX_SHADER: TRACELOG(RL_LOG_INFO,
"SHADER: [ID %i] Vertex shader compiled successfully", shader);
break;
4105 case GL_FRAGMENT_SHADER: TRACELOG(RL_LOG_INFO,
"SHADER: [ID %i] Fragment shader compiled successfully", shader);
break;
4107 #if defined(GRAPHICS_API_OPENGL_43) 4108 case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_INFO,
"SHADER: [ID %i] Compute shader compiled successfully", shader);
break;
4119 unsigned int rlLoadShaderProgram(
unsigned int vShaderId,
unsigned int fShaderId)
4121 unsigned int program = 0;
4123 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4125 program = glCreateProgram();
4127 glAttachShader(program, vShaderId);
4128 glAttachShader(program, fShaderId);
4131 glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION);
4132 glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD);
4133 glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL, RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL);
4134 glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR);
4135 glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT, RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT);
4136 glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2);
4140 glLinkProgram(program);
4144 glGetProgramiv(program, GL_LINK_STATUS, &success);
4146 if (success == GL_FALSE)
4148 TRACELOG(RL_LOG_WARNING,
"SHADER: [ID %i] Failed to link shader program", program);
4151 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
4156 char *log = (
char *)RL_CALLOC(maxLength,
sizeof(
char));
4157 glGetProgramInfoLog(program, maxLength, &length, log);
4158 TRACELOG(RL_LOG_WARNING,
"SHADER: [ID %i] Link error: %s", program, log);
4162 glDeleteProgram(program);
4173 TRACELOG(RL_LOG_INFO,
"SHADER: [ID %i] Program shader loaded successfully", program);
4180 void rlUnloadShaderProgram(
unsigned int id)
4182 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4183 glDeleteProgram(
id);
4185 TRACELOG(RL_LOG_INFO,
"SHADER: [ID %i] Unloaded shader program data from VRAM (GPU)",
id);
4190 int rlGetLocationUniform(
unsigned int shaderId,
const char *uniformName)
4193 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4194 location = glGetUniformLocation(shaderId, uniformName);
4203 int rlGetLocationAttrib(
unsigned int shaderId,
const char *attribName)
4206 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4207 location = glGetAttribLocation(shaderId, attribName);
4216 void rlSetUniform(
int locIndex,
const void *value,
int uniformType,
int count)
4218 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4219 switch (uniformType)
4221 case RL_SHADER_UNIFORM_FLOAT: glUniform1fv(locIndex, count, (
float *)value);
break;
4222 case RL_SHADER_UNIFORM_VEC2: glUniform2fv(locIndex, count, (
float *)value);
break;
4223 case RL_SHADER_UNIFORM_VEC3: glUniform3fv(locIndex, count, (
float *)value);
break;
4224 case RL_SHADER_UNIFORM_VEC4: glUniform4fv(locIndex, count, (
float *)value);
break;
4225 case RL_SHADER_UNIFORM_INT: glUniform1iv(locIndex, count, (
int *)value);
break;
4226 case RL_SHADER_UNIFORM_IVEC2: glUniform2iv(locIndex, count, (
int *)value);
break;
4227 case RL_SHADER_UNIFORM_IVEC3: glUniform3iv(locIndex, count, (
int *)value);
break;
4228 case RL_SHADER_UNIFORM_IVEC4: glUniform4iv(locIndex, count, (
int *)value);
break;
4229 case RL_SHADER_UNIFORM_SAMPLER2D: glUniform1iv(locIndex, count, (
int *)value);
break;
4230 default: TRACELOG(RL_LOG_WARNING,
"SHADER: Failed to set uniform value, data type not recognized");
4236 void rlSetVertexAttributeDefault(
int locIndex,
const void *value,
int attribType,
int count)
4238 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4241 case RL_SHADER_ATTRIB_FLOAT:
if (count == 1) glVertexAttrib1fv(locIndex, (
float *)value);
break;
4242 case RL_SHADER_ATTRIB_VEC2:
if (count == 2) glVertexAttrib2fv(locIndex, (
float *)value);
break;
4243 case RL_SHADER_ATTRIB_VEC3:
if (count == 3) glVertexAttrib3fv(locIndex, (
float *)value);
break;
4244 case RL_SHADER_ATTRIB_VEC4:
if (count == 4) glVertexAttrib4fv(locIndex, (
float *)value);
break;
4245 default: TRACELOG(RL_LOG_WARNING,
"SHADER: Failed to set attrib default value, data type not recognized");
4251 void rlSetUniformMatrix(
int locIndex,
Matrix mat)
4253 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4254 float matfloat[16] = {
4255 mat.m0, mat.m1, mat.m2, mat.m3,
4256 mat.m4, mat.m5, mat.m6, mat.m7,
4257 mat.m8, mat.m9, mat.m10, mat.m11,
4258 mat.m12, mat.m13, mat.m14, mat.m15
4260 glUniformMatrix4fv(locIndex, 1,
false, matfloat);
4265 void rlSetUniformSampler(
int locIndex,
unsigned int textureId)
4267 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4269 for (
int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++)
4271 if (RLGL.State.activeTextureId[i] == textureId)
4273 glUniform1i(locIndex, 1 + i);
4280 for (
int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++)
4282 if (RLGL.State.activeTextureId[i] == 0)
4284 glUniform1i(locIndex, 1 + i);
4285 RLGL.State.activeTextureId[i] = textureId;
4293 void rlSetShader(
unsigned int id,
int *locs)
4295 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4296 if (RLGL.State.currentShaderId !=
id)
4298 rlDrawRenderBatch(RLGL.currentBatch);
4299 RLGL.State.currentShaderId = id;
4300 RLGL.State.currentShaderLocs = locs;
4306 unsigned int rlLoadComputeShaderProgram(
unsigned int shaderId)
4308 unsigned int program = 0;
4310 #if defined(GRAPHICS_API_OPENGL_43) 4312 program = glCreateProgram();
4313 glAttachShader(program, shaderId);
4314 glLinkProgram(program);
4318 glGetProgramiv(program, GL_LINK_STATUS, &success);
4320 if (success == GL_FALSE)
4322 TRACELOG(RL_LOG_WARNING,
"SHADER: [ID %i] Failed to link compute shader program", program);
4325 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
4330 char *log = (
char *)RL_CALLOC(maxLength,
sizeof(
char));
4331 glGetProgramInfoLog(program, maxLength, &length, log);
4332 TRACELOG(RL_LOG_WARNING,
"SHADER: [ID %i] Link error: %s", program, log);
4336 glDeleteProgram(program);
4347 TRACELOG(RL_LOG_INFO,
"SHADER: [ID %i] Compute shader program loaded successfully", program);
4355 void rlComputeShaderDispatch(
unsigned int groupX,
unsigned int groupY,
unsigned int groupZ)
4357 #if defined(GRAPHICS_API_OPENGL_43) 4358 glDispatchCompute(groupX, groupY, groupZ);
4363 unsigned int rlLoadShaderBuffer(
unsigned int size,
const void *data,
int usageHint)
4365 unsigned int ssbo = 0;
4367 #if defined(GRAPHICS_API_OPENGL_43) 4368 glGenBuffers(1, &ssbo);
4369 glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
4370 glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, usageHint? usageHint : RL_STREAM_COPY);
4371 if (data == NULL) glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NULL);
4372 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
4379 void rlUnloadShaderBuffer(
unsigned int ssboId)
4381 #if defined(GRAPHICS_API_OPENGL_43) 4382 glDeleteBuffers(1, &ssboId);
4387 void rlUpdateShaderBuffer(
unsigned int id,
const void *data,
unsigned int dataSize,
unsigned int offset)
4389 #if defined(GRAPHICS_API_OPENGL_43) 4390 glBindBuffer(GL_SHADER_STORAGE_BUFFER,
id);
4391 glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, dataSize, data);
4396 unsigned int rlGetShaderBufferSize(
unsigned int id)
4400 #if defined(GRAPHICS_API_OPENGL_43) 4401 glBindBuffer(GL_SHADER_STORAGE_BUFFER,
id);
4402 glGetInteger64v(GL_SHADER_STORAGE_BUFFER_SIZE, &size);
4405 return (size > 0)? (
unsigned int)size : 0;
4409 void rlReadShaderBuffer(
unsigned int id,
void *dest,
unsigned int count,
unsigned int offset)
4411 #if defined(GRAPHICS_API_OPENGL_43) 4412 glBindBuffer(GL_SHADER_STORAGE_BUFFER,
id);
4413 glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, count, dest);
4418 void rlBindShaderBuffer(
unsigned int id,
unsigned int index)
4420 #if defined(GRAPHICS_API_OPENGL_43) 4421 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index,
id);
4426 void rlCopyShaderBuffer(
unsigned int destId,
unsigned int srcId,
unsigned int destOffset,
unsigned int srcOffset,
unsigned int count)
4428 #if defined(GRAPHICS_API_OPENGL_43) 4429 glBindBuffer(GL_COPY_READ_BUFFER, srcId);
4430 glBindBuffer(GL_COPY_WRITE_BUFFER, destId);
4431 glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, srcOffset, destOffset, count);
4436 void rlBindImageTexture(
unsigned int id,
unsigned int index,
int format,
bool readonly)
4438 #if defined(GRAPHICS_API_OPENGL_43) 4439 unsigned int glInternalFormat = 0, glFormat = 0, glType = 0;
4441 rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
4442 glBindImageTexture(index,
id, 0, 0, 0, readonly? GL_READ_ONLY : GL_READ_WRITE, glInternalFormat);
4449 Matrix rlGetMatrixModelview(
void)
4451 Matrix matrix = rlMatrixIdentity();
4452 #if defined(GRAPHICS_API_OPENGL_11) 4454 glGetFloatv(GL_MODELVIEW_MATRIX, mat);
4465 matrix.m10 = mat[10];
4466 matrix.m11 = mat[11];
4467 matrix.m12 = mat[12];
4468 matrix.m13 = mat[13];
4469 matrix.m14 = mat[14];
4470 matrix.m15 = mat[15];
4472 matrix = RLGL.State.modelview;
4478 Matrix rlGetMatrixProjection(
void)
4480 #if defined(GRAPHICS_API_OPENGL_11) 4482 glGetFloatv(GL_PROJECTION_MATRIX,mat);
4502 return RLGL.State.projection;
4507 Matrix rlGetMatrixTransform(
void)
4509 Matrix mat = rlMatrixIdentity();
4510 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4515 mat = RLGL.State.transform;
4521 RLAPI
Matrix rlGetMatrixProjectionStereo(
int eye)
4523 Matrix mat = rlMatrixIdentity();
4524 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4525 mat = RLGL.State.projectionStereo[eye];
4531 RLAPI
Matrix rlGetMatrixViewOffsetStereo(
int eye)
4533 Matrix mat = rlMatrixIdentity();
4534 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4535 mat = RLGL.State.viewOffsetStereo[eye];
4541 void rlSetMatrixModelview(
Matrix view)
4543 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4544 RLGL.State.modelview = view;
4549 void rlSetMatrixProjection(
Matrix projection)
4551 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4552 RLGL.State.projection = projection;
4557 void rlSetMatrixProjectionStereo(
Matrix right,
Matrix left)
4559 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4560 RLGL.State.projectionStereo[0] = right;
4561 RLGL.State.projectionStereo[1] = left;
4566 void rlSetMatrixViewOffsetStereo(
Matrix right,
Matrix left)
4568 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4569 RLGL.State.viewOffsetStereo[0] = right;
4570 RLGL.State.viewOffsetStereo[1] = left;
4575 void rlLoadDrawQuad(
void)
4577 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4578 unsigned int quadVAO = 0;
4579 unsigned int quadVBO = 0;
4581 float vertices[] = {
4583 -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
4584 -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
4585 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
4586 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
4590 glGenVertexArrays(1, &quadVAO);
4591 glBindVertexArray(quadVAO);
4594 glGenBuffers(1, &quadVBO);
4595 glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
4596 glBufferData(GL_ARRAY_BUFFER,
sizeof(vertices), &vertices, GL_STATIC_DRAW);
4599 glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION);
4600 glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, 3, GL_FLOAT, GL_FALSE, 5*
sizeof(
float), (
void *)0);
4601 glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD);
4602 glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 5*
sizeof(
float), (
void *)(3*
sizeof(
float)));
4605 glBindVertexArray(quadVAO);
4606 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
4607 glBindVertexArray(0);
4610 glDeleteBuffers(1, &quadVBO);
4611 glDeleteVertexArrays(1, &quadVAO);
4616 void rlLoadDrawCube(
void)
4618 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4619 unsigned int cubeVAO = 0;
4620 unsigned int cubeVBO = 0;
4622 float vertices[] = {
4624 -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
4625 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
4626 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
4627 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
4628 -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
4629 -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
4630 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
4631 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
4632 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
4633 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
4634 -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
4635 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
4636 -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
4637 -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
4638 -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
4639 -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
4640 -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
4641 -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
4642 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
4643 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
4644 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
4645 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
4646 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
4647 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
4648 -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
4649 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
4650 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
4651 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
4652 -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
4653 -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
4654 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
4655 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
4656 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
4657 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
4658 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
4659 -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f
4663 glGenVertexArrays(1, &cubeVAO);
4664 glBindVertexArray(cubeVAO);
4667 glGenBuffers(1, &cubeVBO);
4668 glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
4669 glBufferData(GL_ARRAY_BUFFER,
sizeof(vertices), vertices, GL_STATIC_DRAW);
4672 glBindVertexArray(cubeVAO);
4673 glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION);
4674 glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, 3, GL_FLOAT, GL_FALSE, 8*
sizeof(
float), (
void *)0);
4675 glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL);
4676 glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL, 3, GL_FLOAT, GL_FALSE, 8*
sizeof(
float), (
void *)(3*
sizeof(
float)));
4677 glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD);
4678 glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 8*
sizeof(
float), (
void *)(6*
sizeof(
float)));
4679 glBindBuffer(GL_ARRAY_BUFFER, 0);
4680 glBindVertexArray(0);
4683 glBindVertexArray(cubeVAO);
4684 glDrawArrays(GL_TRIANGLES, 0, 36);
4685 glBindVertexArray(0);
4688 glDeleteBuffers(1, &cubeVBO);
4689 glDeleteVertexArrays(1, &cubeVAO);
4694 const char *rlGetPixelFormatName(
unsigned int format)
4698 case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE:
return "GRAYSCALE";
break;
4699 case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA:
return "GRAY_ALPHA";
break;
4700 case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5:
return "R5G6B5";
break;
4701 case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8:
return "R8G8B8";
break;
4702 case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1:
return "R5G5B5A1";
break;
4703 case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4:
return "R4G4B4A4";
break;
4704 case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8:
return "R8G8B8A8";
break;
4705 case RL_PIXELFORMAT_UNCOMPRESSED_R32:
return "R32";
break;
4706 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32:
return "R32G32B32";
break;
4707 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32:
return "R32G32B32A32";
break;
4708 case RL_PIXELFORMAT_UNCOMPRESSED_R16:
return "R16";
break;
4709 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16:
return "R16G16B16";
break;
4710 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16:
return "R16G16B16A16";
break;
4711 case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB:
return "DXT1_RGB";
break;
4712 case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA:
return "DXT1_RGBA";
break;
4713 case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA:
return "DXT3_RGBA";
break;
4714 case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA:
return "DXT5_RGBA";
break;
4715 case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB:
return "ETC1_RGB";
break;
4716 case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB:
return "ETC2_RGB";
break;
4717 case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA:
return "ETC2_RGBA";
break;
4718 case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB:
return "PVRT_RGB";
break;
4719 case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA:
return "PVRT_RGBA";
break;
4720 case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA:
return "ASTC_4x4_RGBA";
break;
4721 case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA:
return "ASTC_8x8_RGBA";
break;
4722 default:
return "UNKNOWN";
break;
4729 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) 4733 static void rlLoadShaderDefault(
void)
4735 RLGL.State.defaultShaderLocs = (
int *)RL_CALLOC(RL_MAX_SHADER_LOCATIONS,
sizeof(
int));
4738 for (
int i = 0; i < RL_MAX_SHADER_LOCATIONS; i++) RLGL.State.defaultShaderLocs[i] = -1;
4741 const char *defaultVShaderCode =
4742 #
if defined(GRAPHICS_API_OPENGL_21)
4744 "attribute vec3 vertexPosition; \n" 4745 "attribute vec2 vertexTexCoord; \n" 4746 "attribute vec4 vertexColor; \n" 4747 "varying vec2 fragTexCoord; \n" 4748 "varying vec4 fragColor; \n" 4749 #elif defined(GRAPHICS_API_OPENGL_33) 4751 "in vec3 vertexPosition; \n" 4752 "in vec2 vertexTexCoord; \n" 4753 "in vec4 vertexColor; \n" 4754 "out vec2 fragTexCoord; \n" 4755 "out vec4 fragColor; \n" 4757 #if defined(GRAPHICS_API_OPENGL_ES2) 4759 "precision mediump float; \n" 4760 "attribute vec3 vertexPosition; \n" 4761 "attribute vec2 vertexTexCoord; \n" 4762 "attribute vec4 vertexColor; \n" 4763 "varying vec2 fragTexCoord; \n" 4764 "varying vec4 fragColor; \n" 4766 "uniform mat4 mvp; \n" 4769 " fragTexCoord = vertexTexCoord; \n" 4770 " fragColor = vertexColor; \n" 4771 " gl_Position = mvp*vec4(vertexPosition, 1.0); \n" 4775 const char *defaultFShaderCode =
4776 #if defined(GRAPHICS_API_OPENGL_21) 4778 "varying vec2 fragTexCoord; \n" 4779 "varying vec4 fragColor; \n" 4780 "uniform sampler2D texture0; \n" 4781 "uniform vec4 colDiffuse; \n" 4784 " vec4 texelColor = texture2D(texture0, fragTexCoord); \n" 4785 " gl_FragColor = texelColor*colDiffuse*fragColor; \n" 4787 #elif defined(GRAPHICS_API_OPENGL_33) 4789 "in vec2 fragTexCoord; \n" 4790 "in vec4 fragColor; \n" 4791 "out vec4 finalColor; \n" 4792 "uniform sampler2D texture0; \n" 4793 "uniform vec4 colDiffuse; \n" 4796 " vec4 texelColor = texture(texture0, fragTexCoord); \n" 4797 " finalColor = texelColor*colDiffuse*fragColor; \n" 4800 #if defined(GRAPHICS_API_OPENGL_ES2) 4802 "precision mediump float; \n" 4803 "varying vec2 fragTexCoord; \n" 4804 "varying vec4 fragColor; \n" 4805 "uniform sampler2D texture0; \n" 4806 "uniform vec4 colDiffuse; \n" 4809 " vec4 texelColor = texture2D(texture0, fragTexCoord); \n" 4810 " gl_FragColor = texelColor*colDiffuse*fragColor; \n" 4816 RLGL.State.defaultVShaderId = rlCompileShader(defaultVShaderCode, GL_VERTEX_SHADER);
4817 RLGL.State.defaultFShaderId = rlCompileShader(defaultFShaderCode, GL_FRAGMENT_SHADER);
4819 RLGL.State.defaultShaderId = rlLoadShaderProgram(RLGL.State.defaultVShaderId, RLGL.State.defaultFShaderId);
4821 if (RLGL.State.defaultShaderId > 0)
4823 TRACELOG(RL_LOG_INFO,
"SHADER: [ID %i] Default shader loaded successfully", RLGL.State.defaultShaderId);
4826 RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_POSITION] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION);
4827 RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD);
4828 RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_COLOR] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR);
4831 RLGL.State.defaultShaderLocs[RL_SHADER_LOC_MATRIX_MVP] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_UNIFORM_NAME_MVP);
4832 RLGL.State.defaultShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR);
4833 RLGL.State.defaultShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0);
4835 else TRACELOG(RL_LOG_WARNING,
"SHADER: [ID %i] Failed to load default shader", RLGL.State.defaultShaderId);
4840 static void rlUnloadShaderDefault(
void)
4844 glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultVShaderId);
4845 glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultFShaderId);
4846 glDeleteShader(RLGL.State.defaultVShaderId);
4847 glDeleteShader(RLGL.State.defaultFShaderId);
4849 glDeleteProgram(RLGL.State.defaultShaderId);
4851 RL_FREE(RLGL.State.defaultShaderLocs);
4853 TRACELOG(RL_LOG_INFO,
"SHADER: [ID %i] Default shader unloaded successfully", RLGL.State.defaultShaderId);
4856 #if defined(RLGL_SHOW_GL_DETAILS_INFO) 4858 static const char *rlGetCompressedFormatName(
int format)
4863 case 0x83F0:
return "GL_COMPRESSED_RGB_S3TC_DXT1_EXT";
break;
4864 case 0x83F1:
return "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT";
break;
4865 case 0x83F2:
return "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT";
break;
4866 case 0x83F3:
return "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT";
break;
4868 case 0x86B0:
return "GL_COMPRESSED_RGB_FXT1_3DFX";
break;
4869 case 0x86B1:
return "GL_COMPRESSED_RGBA_FXT1_3DFX";
break;
4871 case 0x8C00:
return "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG";
break;
4872 case 0x8C01:
return "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG";
break;
4873 case 0x8C02:
return "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG";
break;
4874 case 0x8C03:
return "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG";
break;
4876 case 0x8D64:
return "GL_ETC1_RGB8_OES";
break;
4878 case 0x8DBB:
return "GL_COMPRESSED_RED_RGTC1";
break;
4879 case 0x8DBC:
return "GL_COMPRESSED_SIGNED_RED_RGTC1";
break;
4880 case 0x8DBD:
return "GL_COMPRESSED_RG_RGTC2";
break;
4881 case 0x8DBE:
return "GL_COMPRESSED_SIGNED_RG_RGTC2";
break;
4883 case 0x8E8C:
return "GL_COMPRESSED_RGBA_BPTC_UNORM_ARB";
break;
4884 case 0x8E8D:
return "GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB";
break;
4885 case 0x8E8E:
return "GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB";
break;
4886 case 0x8E8F:
return "GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB";
break;
4888 case 0x9274:
return "GL_COMPRESSED_RGB8_ETC2";
break;
4889 case 0x9275:
return "GL_COMPRESSED_SRGB8_ETC2";
break;
4890 case 0x9276:
return "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2";
break;
4891 case 0x9277:
return "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2";
break;
4892 case 0x9278:
return "GL_COMPRESSED_RGBA8_ETC2_EAC";
break;
4893 case 0x9279:
return "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC";
break;
4894 case 0x9270:
return "GL_COMPRESSED_R11_EAC";
break;
4895 case 0x9271:
return "GL_COMPRESSED_SIGNED_R11_EAC";
break;
4896 case 0x9272:
return "GL_COMPRESSED_RG11_EAC";
break;
4897 case 0x9273:
return "GL_COMPRESSED_SIGNED_RG11_EAC";
break;
4899 case 0x93B0:
return "GL_COMPRESSED_RGBA_ASTC_4x4_KHR";
break;
4900 case 0x93B1:
return "GL_COMPRESSED_RGBA_ASTC_5x4_KHR";
break;
4901 case 0x93B2:
return "GL_COMPRESSED_RGBA_ASTC_5x5_KHR";
break;
4902 case 0x93B3:
return "GL_COMPRESSED_RGBA_ASTC_6x5_KHR";
break;
4903 case 0x93B4:
return "GL_COMPRESSED_RGBA_ASTC_6x6_KHR";
break;
4904 case 0x93B5:
return "GL_COMPRESSED_RGBA_ASTC_8x5_KHR";
break;
4905 case 0x93B6:
return "GL_COMPRESSED_RGBA_ASTC_8x6_KHR";
break;
4906 case 0x93B7:
return "GL_COMPRESSED_RGBA_ASTC_8x8_KHR";
break;
4907 case 0x93B8:
return "GL_COMPRESSED_RGBA_ASTC_10x5_KHR";
break;
4908 case 0x93B9:
return "GL_COMPRESSED_RGBA_ASTC_10x6_KHR";
break;
4909 case 0x93BA:
return "GL_COMPRESSED_RGBA_ASTC_10x8_KHR";
break;
4910 case 0x93BB:
return "GL_COMPRESSED_RGBA_ASTC_10x10_KHR";
break;
4911 case 0x93BC:
return "GL_COMPRESSED_RGBA_ASTC_12x10_KHR";
break;
4912 case 0x93BD:
return "GL_COMPRESSED_RGBA_ASTC_12x12_KHR";
break;
4913 case 0x93D0:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR";
break;
4914 case 0x93D1:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR";
break;
4915 case 0x93D2:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR";
break;
4916 case 0x93D3:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR";
break;
4917 case 0x93D4:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR";
break;
4918 case 0x93D5:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR";
break;
4919 case 0x93D6:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR";
break;
4920 case 0x93D7:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR";
break;
4921 case 0x93D8:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR";
break;
4922 case 0x93D9:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR";
break;
4923 case 0x93DA:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR";
break;
4924 case 0x93DB:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR";
break;
4925 case 0x93DC:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR";
break;
4926 case 0x93DD:
return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR";
break;
4927 default:
return "GL_COMPRESSED_UNKNOWN";
break;
4930 #endif // RLGL_SHOW_GL_DETAILS_INFO 4932 #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 4936 static int rlGetPixelDataSize(
int width,
int height,
int format)
4943 case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8;
break;
4944 case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA:
4945 case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5:
4946 case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1:
4947 case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16;
break;
4948 case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32;
break;
4949 case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24;
break;
4950 case RL_PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32;
break;
4951 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3;
break;
4952 case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4;
break;
4953 case RL_PIXELFORMAT_UNCOMPRESSED_R16: bpp = 16;
break;
4954 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: bpp = 16*3;
break;
4955 case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: bpp = 16*4;
break;
4956 case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB:
4957 case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA:
4958 case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB:
4959 case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB:
4960 case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB:
4961 case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4;
break;
4962 case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA:
4963 case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA:
4964 case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA:
4965 case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: bpp = 8;
break;
4966 case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: bpp = 2;
break;
4970 dataSize = width*height*bpp/8;
4974 if ((width < 4) && (height < 4))
4976 if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA)) dataSize = 8;
4977 else if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)) dataSize = 16;
4986 static rl_float16 rlMatrixToFloatV(
Matrix mat)
4988 rl_float16 result = { 0 };
4990 result.v[0] = mat.m0;
4991 result.v[1] = mat.m1;
4992 result.v[2] = mat.m2;
4993 result.v[3] = mat.m3;
4994 result.v[4] = mat.m4;
4995 result.v[5] = mat.m5;
4996 result.v[6] = mat.m6;
4997 result.v[7] = mat.m7;
4998 result.v[8] = mat.m8;
4999 result.v[9] = mat.m9;
5000 result.v[10] = mat.m10;
5001 result.v[11] = mat.m11;
5002 result.v[12] = mat.m12;
5003 result.v[13] = mat.m13;
5004 result.v[14] = mat.m14;
5005 result.v[15] = mat.m15;
5011 static Matrix rlMatrixIdentity(
void)
5014 1.0f, 0.0f, 0.0f, 0.0f,
5015 0.0f, 1.0f, 0.0f, 0.0f,
5016 0.0f, 0.0f, 1.0f, 0.0f,
5017 0.0f, 0.0f, 0.0f, 1.0f
5029 result.m0 = left.m0*right.m0 + left.m1*right.m4 + left.m2*right.m8 + left.m3*right.m12;
5030 result.m1 = left.m0*right.m1 + left.m1*right.m5 + left.m2*right.m9 + left.m3*right.m13;
5031 result.m2 = left.m0*right.m2 + left.m1*right.m6 + left.m2*right.m10 + left.m3*right.m14;
5032 result.m3 = left.m0*right.m3 + left.m1*right.m7 + left.m2*right.m11 + left.m3*right.m15;
5033 result.m4 = left.m4*right.m0 + left.m5*right.m4 + left.m6*right.m8 + left.m7*right.m12;
5034 result.m5 = left.m4*right.m1 + left.m5*right.m5 + left.m6*right.m9 + left.m7*right.m13;
5035 result.m6 = left.m4*right.m2 + left.m5*right.m6 + left.m6*right.m10 + left.m7*right.m14;
5036 result.m7 = left.m4*right.m3 + left.m5*right.m7 + left.m6*right.m11 + left.m7*right.m15;
5037 result.m8 = left.m8*right.m0 + left.m9*right.m4 + left.m10*right.m8 + left.m11*right.m12;
5038 result.m9 = left.m8*right.m1 + left.m9*right.m5 + left.m10*right.m9 + left.m11*right.m13;
5039 result.m10 = left.m8*right.m2 + left.m9*right.m6 + left.m10*right.m10 + left.m11*right.m14;
5040 result.m11 = left.m8*right.m3 + left.m9*right.m7 + left.m10*right.m11 + left.m11*right.m15;
5041 result.m12 = left.m12*right.m0 + left.m13*right.m4 + left.m14*right.m8 + left.m15*right.m12;
5042 result.m13 = left.m12*right.m1 + left.m13*right.m5 + left.m14*right.m9 + left.m15*right.m13;
5043 result.m14 = left.m12*right.m2 + left.m13*right.m6 + left.m14*right.m10 + left.m15*right.m14;
5044 result.m15 = left.m12*right.m3 + left.m13*right.m7 + left.m14*right.m11 + left.m15*right.m15;
5057 result.m3 = mat.m12;
5061 result.m7 = mat.m13;
5064 result.m10 = mat.m10;
5065 result.m11 = mat.m14;
5066 result.m12 = mat.m3;
5067 result.m13 = mat.m7;
5068 result.m14 = mat.m11;
5069 result.m15 = mat.m15;
5080 float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3;
5081 float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7;
5082 float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11;
5083 float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15;
5085 float b00 = a00*a11 - a01*a10;
5086 float b01 = a00*a12 - a02*a10;
5087 float b02 = a00*a13 - a03*a10;
5088 float b03 = a01*a12 - a02*a11;
5089 float b04 = a01*a13 - a03*a11;
5090 float b05 = a02*a13 - a03*a12;
5091 float b06 = a20*a31 - a21*a30;
5092 float b07 = a20*a32 - a22*a30;
5093 float b08 = a20*a33 - a23*a30;
5094 float b09 = a21*a32 - a22*a31;
5095 float b10 = a21*a33 - a23*a31;
5096 float b11 = a22*a33 - a23*a32;
5099 float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06);
5101 result.m0 = (a11*b11 - a12*b10 + a13*b09)*invDet;
5102 result.m1 = (-a01*b11 + a02*b10 - a03*b09)*invDet;
5103 result.m2 = (a31*b05 - a32*b04 + a33*b03)*invDet;
5104 result.m3 = (-a21*b05 + a22*b04 - a23*b03)*invDet;
5105 result.m4 = (-a10*b11 + a12*b08 - a13*b07)*invDet;
5106 result.m5 = (a00*b11 - a02*b08 + a03*b07)*invDet;
5107 result.m6 = (-a30*b05 + a32*b02 - a33*b01)*invDet;
5108 result.m7 = (a20*b05 - a22*b02 + a23*b01)*invDet;
5109 result.m8 = (a10*b10 - a11*b08 + a13*b06)*invDet;
5110 result.m9 = (-a00*b10 + a01*b08 - a03*b06)*invDet;
5111 result.m10 = (a30*b04 - a31*b02 + a33*b00)*invDet;
5112 result.m11 = (-a20*b04 + a21*b02 - a23*b00)*invDet;
5113 result.m12 = (-a10*b09 + a11*b07 - a12*b06)*invDet;
5114 result.m13 = (a00*b09 - a01*b07 + a02*b06)*invDet;
5115 result.m14 = (-a30*b03 + a31*b01 - a32*b00)*invDet;
5116 result.m15 = (a20*b03 - a21*b01 + a22*b00)*invDet;
5121 #endif // RLGL_IMPLEMENTATION