Browse Source

Add vendor/raylib/rlgl.odin

gingerBill 4 years ago
parent
commit
027d69678a
1 changed files with 337 additions and 0 deletions
  1. 337 0
      vendor/raylib/rlgl.odin

+ 337 - 0
vendor/raylib/rlgl.odin

@@ -0,0 +1,337 @@
+package raylib
+
+import "core:c"
+
+when ODIN_OS == "windows" do foreign import lib "raylib.lib"
+when ODIN_OS == "linux"   do foreign import lib "linux/libraylib.a"
+when ODIN_OS == "darwin"  do foreign import lib "macos/libraylib.a"
+
+GRAPHICS_API_OPENGL_11 :: false
+GRAPHICS_API_OPENGL_21 :: true
+GRAPHICS_API_OPENGL_33 :: GRAPHICS_API_OPENGL_21
+GRAPHICS_API_OPENGL_ES2 :: false
+
+when !GRAPHICS_API_OPENGL_ES2 {
+	// This is the maximum amount of elements (quads) per batch
+	// NOTE: Be careful with text, every letter maps to a quad
+	DEFAULT_BATCH_BUFFER_ELEMENTS :: 8192
+} else {
+	// We reduce memory sizes for embedded systems (RPI and HTML5)
+	// NOTE: On HTML5 (emscripten) this is allocated on heap,
+	// by default it's only 16MB!...just take care...
+	DEFAULT_BATCH_BUFFER_ELEMENTS :: 2048
+}
+
+DEFAULT_BATCH_BUFFERS          :: 1                    // Default number of batch buffers (multi-buffering)
+DEFAULT_BATCH_DRAWCALLS        :: 256                  // Default number of batch draw calls (by state changes: mode, texture)
+MAX_BATCH_ACTIVE_TEXTURES      :: 4                    // Maximum number of additional textures that can be activated on batch drawing (SetShaderValueTexture())
+
+// Internal Matrix stack
+MAX_MATRIX_STACK_SIZE           :: 32                  // Maximum size of Matrix stack
+
+// Vertex buffers id limit
+MAX_MESH_VERTEX_BUFFERS          :: 7                  // Maximum vertex buffers (VBO) per mesh
+
+// Shader and material limits
+MAX_SHADER_LOCATIONS            :: 32                  // Maximum number of shader locations supported
+MAX_MATERIAL_MAPS               :: 12                  // Maximum number of shader maps supported
+
+// Projection matrix culling
+RL_CULL_DISTANCE_NEAR         :: 0.01                  // Default near cull distance
+RL_CULL_DISTANCE_FAR          :: 1000.0                // Default far cull distance
+
+// Texture parameters (equivalent to OpenGL defines)
+RL_TEXTURE_WRAP_S               :: 0x2802              // GL_TEXTURE_WRAP_S
+RL_TEXTURE_WRAP_T               :: 0x2803              // GL_TEXTURE_WRAP_T
+RL_TEXTURE_MAG_FILTER           :: 0x2800              // GL_TEXTURE_MAG_FILTER
+RL_TEXTURE_MIN_FILTER           :: 0x2801              // GL_TEXTURE_MIN_FILTER
+
+RL_TEXTURE_FILTER_NEAREST               :: 0x2600      // GL_NEAREST
+RL_TEXTURE_FILTER_LINEAR                :: 0x2601      // GL_LINEAR
+RL_TEXTURE_FILTER_MIP_NEAREST           :: 0x2700      // GL_NEAREST_MIPMAP_NEAREST
+RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR    :: 0x2702      // GL_NEAREST_MIPMAP_LINEAR
+RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST    :: 0x2701      // GL_LINEAR_MIPMAP_NEAREST
+RL_TEXTURE_FILTER_MIP_LINEAR            :: 0x2703      // GL_LINEAR_MIPMAP_LINEAR
+RL_TEXTURE_FILTER_ANISOTROPIC           :: 0x3000      // Anisotropic filter (custom identifier)
+
+RL_TEXTURE_WRAP_REPEAT                  :: 0x2901      // GL_REPEAT
+RL_TEXTURE_WRAP_CLAMP                   :: 0x812F      // GL_CLAMP_TO_EDGE
+RL_TEXTURE_WRAP_MIRROR_REPEAT           :: 0x8370      // GL_MIRRORED_REPEAT
+RL_TEXTURE_WRAP_MIRROR_CLAMP            :: 0x8742      // GL_MIRROR_CLAMP_EXT
+
+// Matrix modes (equivalent to OpenGL)
+RL_MODELVIEW                    :: 0x1700              // GL_MODELVIEW
+RL_PROJECTION                   :: 0x1701              // GL_PROJECTION
+RL_TEXTURE                      :: 0x1702              // GL_TEXTURE
+
+// Primitive assembly draw modes
+RL_LINES                        :: 0x0001              // GL_LINES
+RL_TRIANGLES                    :: 0x0004              // GL_TRIANGLES
+RL_QUADS                        :: 0x0007              // GL_QUADS
+
+// GL equivalent data types
+RL_UNSIGNED_BYTE                :: 0x1401              // GL_UNSIGNED_BYTE
+RL_f32                        :: 0x1406              // GL_f32
+
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+GlVersion :: enum c.int { OPENGL_11 = 1, OPENGL_21, OPENGL_33, OPENGL_ES_20 }
+
+FramebufferAttachType :: enum c. int {
+	COLOR_CHANNEL0 = 0,
+	COLOR_CHANNEL1,
+	COLOR_CHANNEL2,
+	COLOR_CHANNEL3,
+	COLOR_CHANNEL4,
+	COLOR_CHANNEL5,
+	COLOR_CHANNEL6,
+	COLOR_CHANNEL7,
+	DEPTH = 100,
+	STENCIL = 200,
+}
+
+FramebufferAttachTextureType :: enum c.int {
+	CUBEMAP_POSITIVE_X = 0,
+	CUBEMAP_NEGATIVE_X,
+	CUBEMAP_POSITIVE_Y,
+	CUBEMAP_NEGATIVE_Y,
+	CUBEMAP_POSITIVE_Z,
+	CUBEMAP_NEGATIVE_Z,
+	TEXTURE2D = 100,
+	RENDERBUFFER = 200,
+}
+
+VertexBufferIndexType :: c.ushort when GRAPHICS_API_OPENGL_ES2 else c.uint
+
+// Dynamic vertex buffers (position + texcoords + colors + indices arrays)
+VertexBuffer :: struct {
+	elementsCount: c.int,                    // Number of elements in the buffer (QUADS)
+
+	vCounter:      c.int,                    // Vertex position counter to process (and draw) from full buffer
+	tcCounter:     c.int,                    // Vertex texcoord counter to process (and draw) from full buffer
+	cCounter:      c.int,                    // Vertex color counter to process (and draw) from full buffer
+
+	vertices:      [^]f32,                   // Vertex position (XYZ - 3 components per vertex) (shader-location = 0)
+	texcoords:     [^]f32,                   // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)
+	colors:        [^]u8,                    // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
+	indices:       [^]VertexBufferIndexType, // Vertex indices (in case vertex data comes indexed) (6 indices per quad)
+	vaoId:         u32,                      // OpenGL Vertex Array Object id
+	vboId:         [4]u32,                   // OpenGL Vertex Buffer Objects id (4 types of vertex data)
+} 
+
+// Draw call type
+// NOTE: Only texture changes register a new draw, other state-change-related elements are not
+// used at this moment (vaoId, shaderId, matrices), raylib just forces a batch draw call if any
+// of those state-change happens (this is done in core module)
+DrawCall :: struct {
+	mode:            c.int,       // Drawing mode: LINES, TRIANGLES, QUADS
+	vertexCount:     c.int,       // Number of vertex of the draw
+	vertexAlignment: c.int,       // Number of vertex required for index alignment (LINES, TRIANGLES)
+	//vaoId: u32,                 // Vertex array id to be used on the draw -> Using RLGL.currentBatch->vertexBuffer.vaoId
+	//shaderId: u32,              // Shader id to be used on the draw -> Using RLGL.currentShader.id
+	textureId: u32,               // Texture id to be used on the draw -> Use to create new draw call if changes
+
+	//projection: Matrix,         // Projection matrix for this draw -> Using RLGL.projection by default
+	//modelview:  Matrix,         // Modelview matrix for this draw -> Using RLGL.modelview by default
+} 
+
+// RenderBatch type
+RenderBatch :: struct {
+	buffersCount:  c.int,           // Number of vertex buffers (multi-buffering support)
+	currentBuffer: c.int,           // Current buffer tracking in case of multi-buffering
+	vertexBuffer:  [^]VertexBuffer, // Dynamic buffer(s) for vertex data
+
+	draws:        [^]DrawCall,      // Draw calls array, depends on textureId
+	drawsCounter: c.int,            // Draw calls counter
+	currentDepth: f32,              // Current depth value for next draw
+}
+
+// Shader attribute data types
+ShaderAttributeDataType :: enum c.int {
+	FLOAT = 0,
+	VEC2,
+	VEC3,
+	VEC4,
+}
+
+@(default_calling_convention="c")
+foreign lib {
+	//------------------------------------------------------------------------------------
+	// Functions Declaration - Matrix operations
+	//------------------------------------------------------------------------------------
+	rlMatrixMode   :: proc(mode: c.int) ---                 // Choose the current matrix to be transformed
+	rlPushMatrix   :: proc() ---                            // Push the current matrix to stack
+	rlPopMatrix    :: proc() ---                            // Pop lattest inserted matrix from stack
+	rlLoadIdentity :: proc() ---                            // Reset current matrix to identity matrix
+	rlTranslatef   :: proc(x, y, z: f32) ---                // Multiply the current matrix by a translation matrix
+	rlRotatef      :: proc(angleDeg: f32, x, y, z: f32) --- // Multiply the current matrix by a rotation matrix
+	rlScalef       :: proc(x, y, z: f32) ---                // Multiply the current matrix by a scaling matrix
+	rlMultMatrixf  :: proc(matf: [^]f32) ---                // Multiply the current matrix by another matrix
+	rlFrustum      :: proc(left, right, bottom, top, znear, zfar: f64) ---
+	rlOrtho        :: proc(left, right, bottom, top, znear, zfar: f64) ---
+	rlViewport     :: proc(x, y, width, height: c.int) ---  // Set the viewport area
+
+	//------------------------------------------------------------------------------------
+	// Functions Declaration - Vertex level operations
+	//------------------------------------------------------------------------------------
+	rlBegin        :: proc(mode: c.int)     --- // Initialize drawing mode (how to organize vertex)
+	rlEnd          :: proc()                --- // Finish vertex providing
+	rlVertex2i     :: proc(x, y: c.int)     --- // Define one vertex (position) - 2 int
+	rlVertex2f     :: proc(x, y: f32)       --- // Define one vertex (position) - 2 f32
+	rlVertex3f     :: proc(x, y, z: f32)    --- // Define one vertex (position) - 3 f32
+	rlTexCoord2f   :: proc(x, y: f32)       --- // Define one vertex (texture coordinate) - 2 f32
+	rlNormal3f     :: proc(x, y, z: f32)    --- // Define one vertex (normal) - 3 f32
+	rlColor4ub     :: proc(r, g, b, a: u8)  --- // Define one vertex (color) - 4 byte
+	rlColor3f      :: proc(x, y, z: f32)    --- // Define one vertex (color) - 3 f32
+	rlColor4f      :: proc(x, y, z, w: f32) --- // Define one vertex (color) - 4 f32
+
+	//------------------------------------------------------------------------------------
+	// Functions Declaration - OpenGL style functions (common to 1.1, 3.3+, ES2)
+	// NOTE: This functions are used to completely abstract raylib code from OpenGL layer,
+	// some of them are direct wrappers over OpenGL calls, some others are custom
+	//------------------------------------------------------------------------------------
+
+	// Vertex buffers state
+	rlEnableVertexArray          :: proc(vaoId: u32) -> bool --- // Enable vertex array (VAO, if supported)
+	rlDisableVertexArray         :: proc() ---                   // Disable vertex array (VAO, if supported)
+	rlEnableVertexBuffer         :: proc(id: u32) ---            // Enable vertex buffer (VBO)
+	rlDisableVertexBuffer        :: proc() ---                   // Disable vertex buffer (VBO)
+	rlEnableVertexBufferElement  :: proc(id: u32) ---            // Enable vertex buffer element (VBO element)
+	rlDisableVertexBufferElement :: proc() ---                   // Disable vertex buffer element (VBO element)
+	rlEnableVertexAttribute      :: proc(index: u32) ---         // Enable vertex attribute index
+	rlDisableVertexAttribute     :: proc(index: u32) ---         // Disable vertex attribute index
+	when GRAPHICS_API_OPENGL_11 {
+		rlEnableStatePointer :: proc(vertexAttribType: c.int, buffer: rawptr) ---
+		rlDisableStatePointer :: proc(vertexAttribType: c.int) ---
+	}
+
+	// Textures state
+	rlActiveTextureSlot     :: proc(slot: c.int) ---                         // Select and active a texture slot
+	rlEnableTexture         :: proc(id: u32) ---                             // Enable texture
+	rlDisableTexture        :: proc() ---                                    // Disable texture
+	rlEnableTextureCubemap  :: proc(id: u32) ---                             // Enable texture cubemap
+	rlDisableTextureCubemap :: proc() ---                                    // Disable texture cubemap
+	rlTextureParameters     :: proc(id: u32, param: c.int, value: c.int) --- // Set texture parameters (filter, wrap)
+
+	// Shader state
+	rlEnableShader  :: proc(id: u32) ---                                          // Enable shader program
+	rlDisableShader :: proc() ---                                                 // Disable shader program
+
+	// Framebuffer state
+	rlEnableFramebuffer  :: proc(id: u32) ---                                     // Enable render texture (fbo)
+	rlDisableFramebuffer :: proc() ---                                            // Disable render texture (fbo), return to default framebuffer
+
+	// General render state
+	rlEnableDepthTest        :: proc() ---                                        // Enable depth test
+	rlDisableDepthTest       :: proc() ---                                        // Disable depth test
+	rlEnableDepthMask        :: proc() ---                                        // Enable depth write
+	rlDisableDepthMask       :: proc() ---                                        // Disable depth write
+	rlEnableBackfaceCulling  :: proc() ---                                        // Enable backface culling
+	rlDisableBackfaceCulling :: proc() ---                                        // Disable backface culling
+	rlEnableScissorTest      :: proc() ---                                        // Enable scissor test
+	rlDisableScissorTest     :: proc() ---                                        // Disable scissor test
+	rlScissor                :: proc(x, y, width, height: c.int) ---              // Scissor test
+	rlEnableWireMode         :: proc() ---                                        // Enable wire mode
+	rlDisableWireMode        :: proc() ---                                        // Disable wire mode
+	rlSetLineWidth           :: proc(width: f32) ---                              // Set the line drawing width
+	rlGetLineWidth           :: proc() -> f32 ---                                 // Get the line drawing width
+	rlEnableSmoothLines      :: proc() ---                                        // Enable line aliasing
+	rlDisableSmoothLines     :: proc() ---                                        // Disable line aliasing
+	rlEnableStereoRender     :: proc() ---                                        // Enable stereo rendering
+	rlDisableStereoRender    :: proc() ---                                        // Disable stereo rendering
+	rlIsStereoRenderEnabled  :: proc() -> bool ---                                // Check if stereo render is enabled
+
+	rlClearColor         :: proc(r, g, b, a: u8) ---                              // Clear color buffer with color
+	rlClearScreenBuffers :: proc() ---                                            // Clear used screen buffers (color and depth)
+	rlCheckErrors        :: proc() ---                                            // Check and log OpenGL error codes
+	rlSetBlendMode       :: proc(mode: c.int) ---                                 // Set blending mode
+	rlSetBlendFactors    :: proc(glSrcFactor, glDstFactor, glEquation: c.int) --- // Set blending mode factor and equation (using OpenGL factors)
+
+	//------------------------------------------------------------------------------------
+	// Functions Declaration - rlgl functionality
+	//------------------------------------------------------------------------------------
+	// rlgl initialization functions
+	rlglInit               :: proc(width, height: c.int) ---                               // Initialize rlgl (buffers, shaders, textures, states)
+	rlglClose              :: proc() ---                                                   // De-inititialize rlgl (buffers, shaders, textures)
+	rlLoadExtensions       :: proc(loader: rawptr) ---                                     // Load OpenGL extensions (loader function pointer required)
+	rlGetVersion           :: proc() -> GlVersion ---                                      // Returns current OpenGL version
+	rlGetFramebufferWidth  :: proc() -> c.int ---                                          // Get default framebuffer width
+	rlGetFramebufferHeight :: proc() -> c.int ---                                          // Get default framebuffer height
+
+	rlGetShaderDefault  :: proc() -> Shader ---                                            // Get default shader
+	rlGetTextureDefault :: proc() -> Texture2D ---                                         // Get default texture
+
+	// Render batch management
+	// NOTE: rlgl provides a default render batch to behave like OpenGL 1.1 immediate mode
+	// but this render batch API is exposed in case of custom batches are required
+	rlLoadRenderBatch       :: proc(numBuffers, bufferElements: c.int) -> RenderBatch ---  // Load a render batch system
+	rlUnloadRenderBatch     :: proc(batch: RenderBatch) ---                                // Unload render batch system
+	rlDrawRenderBatch       :: proc(batch: ^RenderBatch) ---                               // Draw render batch data (Update->Draw->Reset)
+	rlSetRenderBatchActive  :: proc(batch: ^RenderBatch) ---                               // Set the active render batch for rlgl (NULL for default internal)
+	rlDrawRenderBatchActive :: proc() ---                                                  // Update and draw internal render batch
+	rlCheckRenderBatchLimit :: proc(vCount: c.int) -> bool ---                             // Check internal buffer overflow for a given number of vertex
+	rlSetTexture            :: proc(id: u32) ---                                           // Set current texture for render batch and check buffers limits
+
+	//------------------------------------------------------------------------------------------------------------------------
+
+	// Vertex buffers management
+	rlLoadVertexArray                  :: proc() -> u32 ---                                                                 // Load vertex array (vao) if supported
+	rlLoadVertexBuffer                 :: proc(buffer: rawptr, size: c.int, is_dynamic: bool) -> u32 ---                    // Load a vertex buffer attribute
+	rlLoadVertexBufferElement          :: proc(buffer: rawptr, size: c.int, is_dynamic: bool) -> u32 ---                    // Load a new attributes element buffer
+	rlUpdateVertexBuffer               :: proc(bufferId: c.int, data: rawptr, dataSize: c.int, offset: c.int) -> u32 ---    // Update GPU buffer with new data
+	rlUnloadVertexArray                :: proc(vaoId: u32) ---
+	rlUnloadVertexBuffer               :: proc(vboId: u32) ---
+	rlSetVertexAttribute               :: proc(index: u32, compSize: c.int, type: c.int, normalized: bool, stride: c.int, pointer: uintptr) ---
+	rlSetVertexAttributeDivisor        :: proc(index: u32, divisor: c.int) ---
+	rlSetVertexAttributeDefault        :: proc(locIndex: c.int, value: rawptr, attribType: c.int, count: c.int) ---         // Set vertex attribute default value
+	rlDrawVertexArray                  :: proc(offset: c.int, count: c.int) ---
+	rlDrawVertexArrayElements          :: proc(offset: c.int, count: c.int, buffer: rawptr) ---
+	rlDrawVertexArrayInstanced         :: proc(offset: c.int, count: c.int, instances: c.int) ---
+	rlDrawVertexArrayElementsInstanced :: proc(offset: c.int, count: c.int, buffer: rawptr, instances: c.int) ---
+
+	// Textures management
+	rlLoadTexture          :: proc(data: rawptr, width, height: c.int, format: c.int, mipmapCount: c.int) -> u32 ---  // Load texture in GPU
+	rlLoadTextureDepth     :: proc(width, height: c.int, useRenderBuffer: bool) -> u32 ---                            // Load depth texture/renderbuffer (to be attached to fbo)
+	rlLoadTextureCubemap   :: proc(data: rawptr, size: c.int, format: c.int) -> u32 ---                               // Load texture cubemap
+	rlUpdateTexture        :: proc(id: u32, offsetX, offsetY, width, height: c.int, format: c.int, data: rawptr) ---  // Update GPU texture with new data
+	rlGetGlTextureFormats  :: proc(format: c.int, glInternalFormat: ^u32, glFormat: ^u32, glType: ^u32) ---           // Get OpenGL internal formats
+	rlUnloadTexture        :: proc(id: u32) ---                                                                       // Unload texture from GPU memory
+	rlGenerateMipmaps      :: proc(texture: ^Texture2D) ---                                                           // Generate mipmap data for selected texture
+	rlReadTexturePixels    :: proc(texture: Texture2D) -> rawptr ---                                                  // Read texture pixel data
+	rlReadScreenPixels     :: proc(width, height: c.int) -> [^]u8 ---                                                 // Read screen pixel data (color buffer)
+
+	// Framebuffer management (fbo)
+	rlLoadFramebuffer     :: proc(width, height: c.int) -> u32 ---                                                // Load an empty framebuffer
+	rlFramebufferAttach   :: proc(fboId: u32, texId: u32, attachType: c.int, texType: c.int, mipLevel: c.int) --- // Attach texture/renderbuffer to a framebuffer
+	rlFramebufferComplete :: proc(id: u32) -> bool ---                                                            // Verify framebuffer is complete
+	rlUnloadFramebuffer   :: proc(id: u32) ---                                                                    // Delete framebuffer from GPU
+
+	// Shaders management
+	rlLoadShaderCode      :: proc(vsCode, fsCode: cstring) -> u32 ---                                   // Load shader from code strings
+	rlCompileShader       :: proc(shaderCode: cstring, type: c.int) -> u32 ---                          // Compile custom shader and return shader id (type: GL_VERTEX_SHADER, GL_FRAGMENT_SHADER)
+	rlLoadShaderProgram   :: proc(vShaderId, fShaderId: u32) -> u32 ---                                 // Load custom shader program
+	rlUnloadShaderProgram :: proc(id: u32) ---                                                          // Unload shader program
+	rlGetLocationUniform  :: proc(shaderId: u32, uniformName: cstring) -> c.int ---                     // Get shader location uniform
+	rlGetLocationAttrib   :: proc(shaderId: u32, attribName: cstring) -> c.int ---                      // Get shader location attribute
+	rlSetUniform          :: proc(locIndex: c.int, value: rawptr, uniformType: c.int, count: c.int) --- // Set shader value uniform
+	rlSetUniformMatrix    :: proc(locIndex: c.int, mat: Matrix) ---                                     // Set shader value matrix
+	rlSetUniformSampler   :: proc(locIndex: c.int, textureId: u32) ---                                  // Set shader value sampler
+	rlSetShader           :: proc(shader: Shader) ---                                                   // Set shader currently active
+
+	// Matrix state management
+	rlGetMatrixModelview        :: proc() -> Matrix ---           // Get internal modelview matrix
+	rlGetMatrixProjection       :: proc() -> Matrix ---           // Get internal projection matrix
+	rlGetMatrixTransform        :: proc() -> Matrix ---           // Get internal accumulated transform matrix
+	rlGetMatrixProjectionStereo :: proc(eye: c.int) -> Matrix --- // Get internal projection matrix for stereo render (selected eye)
+	rlGetMatrixViewOffsetStereo :: proc(eye: c.int) -> Matrix --- // Get internal view offset matrix for stereo render (selected eye)
+	rlSetMatrixProjection       :: proc(proj: Matrix) ---         // Set a custom projection matrix (replaces internal projection matrix)
+	rlSetMatrixModelview        :: proc(view: Matrix) ---         // Set a custom modelview matrix (replaces internal modelview matrix)
+	rlSetMatrixProjectionStereo :: proc(right, left: Matrix) ---  // Set eyes projection matrices for stereo rendering
+	rlSetMatrixViewOffsetStereo :: proc(right, left: Matrix) ---  // Set eyes view offsets matrices for stereo rendering
+
+	// Quick and dirty cube/quad buffers load->draw->unload
+	rlLoadDrawCube :: proc() --- // Load and draw a cube
+	rlLoadDrawQuad :: proc() --- // Load and draw a quad
+}