Jelajahi Sumber

Adapt multiple functions to rlgl

Nearly a complete rework of Models module
Some teaks on multiple functions
raysan5 11 tahun lalu
induk
melakukan
c04f37d0f5
8 mengubah file dengan 744 tambahan dan 393 penghapusan
  1. 2 2
      src/audio.c
  2. 505 294
      src/models.c
  3. 4 2
      src/raylib.h
  4. 132 18
      src/rlgl.c
  5. 39 7
      src/rlgl.h
  6. 11 18
      src/shapes.c
  7. 0 1
      src/text.c
  8. 51 51
      src/textures.c

+ 2 - 2
src/audio.c

@@ -131,7 +131,7 @@ Sound LoadSound(char *fileName)
     // NOTE: Buffer space is allocated inside LoadWAV, Wave must be freed
     Wave wave = LoadWAV(fileName);
     
-    ALenum format;
+    ALenum format = 0;
     // The OpenAL format is worked out by looking at the number of channels and the bits per sample
     if (wave.channels == 1) 
     {
@@ -257,7 +257,7 @@ Sound LoadSoundFromRES(const char *rresName, int resId)
                 free(data);
                 
                 // Convert wave to Sound (OpenAL)
-                ALenum format;
+                ALenum format = 0;
                 
                 // The OpenAL format is worked out by looking at the number of channels and the bits per sample
                 if (wave.channels == 1) 

File diff ditekan karena terlalu besar
+ 505 - 294
src/models.c


+ 4 - 2
src/raylib.h

@@ -355,15 +355,17 @@ const char *FormatText(const char *text, ...);
 void DrawCube(Vector3 position, float width, float height, float lenght, Color color);             // Draw cube
 void DrawCubeV(Vector3 position, Vector3 size, Color color);                                       // Draw cube (Vector version)
 void DrawCubeWires(Vector3 position, float width, float height, float lenght, Color color);        // Draw cube wires
+void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float lenght, Color color); // Draw cube textured
 void DrawSphere(Vector3 centerPos, float radius, Color color);                                     // Draw sphere
 void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color);            // Draw sphere with extended parameters
-void DrawSphereWires(Vector3 centerPos, float radius, Color color);                                // Draw sphere wires
+void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color);         // Draw sphere wires
 void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone
 void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires
 void DrawPlane(Vector3 centerPos, Vector2 size, Vector3 rotation, Color color);                    // Draw a plane
 void DrawPlaneEx(Vector3 centerPos, Vector2 size, Vector3 rotation, int slicesX, int slicesZ, Color color); // Draw a plane with divisions
 void DrawGrid(int slices, float spacing);                                                          // Draw a grid (centered at (0, 0, 0))
-void DrawGizmo(Vector3 position, bool orbits);                                                     // Draw gizmo (with or without orbits)
+void DrawGizmo(Vector3 position);                                                                  // Draw simple gizmo
+void DrawGizmoEx(Vector3 position, Vector3 rotation, float scale, bool orbits);                    // Draw gizmo with extended parameters
 //DrawTorus(), DrawTeapot() are useless...
 
 //------------------------------------------------------------------------------------

+ 132 - 18
src/rlgl.c

@@ -49,9 +49,9 @@
 //----------------------------------------------------------------------------------
 // Defines and Macros
 //----------------------------------------------------------------------------------
-#define MATRIX_STACK_SIZE          16   // TODO: REVIEW: Matrix stack required?
+#define MATRIX_STACK_SIZE          16   // Matrix stack max size
 #define MAX_DRAWS_BY_TEXTURE      256   // Draws are organized by texture changes
-#define TEMP_VERTEX_BUFFER_SIZE  1024   // Temporal Vertex Buffer (required for post-transformations)
+#define TEMP_VERTEX_BUFFER_SIZE  1024   // Temporal Vertex Buffer (required for vertex-transformations)
 
 //----------------------------------------------------------------------------------
 // Types and Structures Definition
@@ -67,7 +67,7 @@ typedef struct {
     float *vertices;            // 3 components per vertex
     float *colors;              // 4 components per vertex
 } VertexPositionColorBuffer;
-
+/*
 typedef struct {
     int vCounter;
     int tcCounter;
@@ -76,7 +76,17 @@ typedef struct {
     float *texcoords;           // 2 components per vertex
     float *colors;              // 4 components per vertex
 } VertexPositionColorTextureBuffer;
-
+*/
+/*
+typedef struct {
+    int vCounter;
+    int tcCounter;
+    int nCounter;
+    float *vertices;            // 3 components per vertex
+    float *texcoords;           // 2 components per vertex
+    float *normals;             // 3 components per vertex
+} VertexPositionTextureNormalBuffer;
+*/
 typedef struct {
     int vCounter;
     int tcCounter;
@@ -108,8 +118,8 @@ static int currentMatrixMode;
 static DrawMode currentDrawMode;
 
 // Vertex arrays for lines, triangles and quads
-static VertexPositionColorBuffer lines;
-static VertexPositionColorTextureBuffer triangles;
+static VertexPositionColorBuffer lines;         // No texture support
+static VertexPositionColorBuffer triangles;     // No texture support
 static VertexPositionColorTextureIndexBuffer quads;
 
 // Vetex-Fragment Shader Program ID
@@ -614,6 +624,14 @@ void rlDeleteTextures(unsigned int id)
     glDeleteTextures(1, &id);
 }
 
+// Unload vertex data from GPU memory
+void rlDeleteVertexArrays(unsigned int id)
+{
+#if defined(USE_OPENGL_33) || defined(USE_OPENGL_ES2)
+    glDeleteVertexArrays(1, &id);
+#endif
+}
+
 // Clear color buffer with color
 void rlClearColor(byte r, byte g, byte b, byte a)
 {
@@ -655,10 +673,11 @@ void rlglInit()
 
     if (glewIsSupported("GL_VERSION_3_3")) printf("OpenGL 3.3 initialized\n"); 
 /*
+    // TODO: GLEW is a big library that loads ALL extensions, maybe using glad we can only load required ones...
     if (!gladLoadGL()) 
     {
-        printf("Something went wrong!\n");
-        exit(-1);
+        fprintf(stderr, printf("Failed to initialize glad.\n");
+        exit(1);
     }
 */    
     // Set default draw mode
@@ -694,7 +713,7 @@ void rlglInit()
     printf("Vendor:   %s\n", glGetString(GL_VENDOR));
     printf("Renderer: %s\n", glGetString(GL_RENDERER));
     printf("Version:  %s\n", glGetString(GL_VERSION));
-    printf("GLSL:     %s\n\n", glGetString(0x8B8C));  // GL_SHADING_LANGUAGE_VERSION
+    printf("GLSL:     %s\n\n", glGetString(0x8B8C));  //GL_SHADING_LANGUAGE_VERSION
     
     InitializeBuffers();    // Init vertex arrays
     InitializeVAOs();       // Init VBO and VAO
@@ -707,7 +726,7 @@ void rlglInit()
     // Create default white texture for plain colors (required by shader)
     unsigned char pixels[4] = { 255, 255, 255, 255 };   // 1 pixel RGBA (4 bytes)
     
-    whiteTexture = rlglTexture(1, 1, pixels);     
+    whiteTexture = rlglLoadTexture(1, 1, pixels);     
     
     // Init draw calls tracking system
     draws = (DrawCall *)malloc(sizeof(DrawCall)*MAX_DRAWS_BY_TEXTURE);
@@ -794,8 +813,12 @@ void rlglDraw()
     
     if (triangles.vCounter > 0)
     {
+        glBindTexture(GL_TEXTURE_2D, whiteTexture);
+    
         glBindVertexArray(vaoTriangles);
         glDrawArrays(GL_TRIANGLES, 0, triangles.vCounter);
+        
+        glBindTexture(GL_TEXTURE_2D, 0);
     }
     
     if (quads.vCounter > 0)
@@ -830,8 +853,6 @@ void rlglDraw()
             glDrawElements(GL_TRIANGLES, numIndicesToProcess, GL_UNSIGNED_INT, (GLvoid*) (sizeof(GLuint) * indicesOffset));
 
             indicesOffset += draws[i].vCount/4*6;
-            
-            //printf("-------Next vertex offset: %i\n", indicesOffset/6*4);
         }
     }
     
@@ -849,7 +870,7 @@ void rlglDraw()
     lines.cCounter = 0;
     
     triangles.vCounter = 0;
-    triangles.vCounter = 0;
+    triangles.cCounter = 0;
     
     quads.vCounter = 0;
     quads.tcCounter = 0;
@@ -861,6 +882,58 @@ void rlglDraw()
 #endif
 }
 
+void rlglDrawModel(Model model, bool wires)
+{
+    if (wires) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+    
+#ifdef USE_OPENGL_11
+    // NOTE: For models we use Vertex Arrays (OpenGL 1.1)
+    glEnableClientState(GL_VERTEX_ARRAY);                     // Enable vertex array
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);              // Enable texture coords array
+    glEnableClientState(GL_NORMAL_ARRAY);                     // Enable normals array
+        
+    glVertexPointer(3, GL_FLOAT, 0, model.vertices);          // Pointer to vertex coords array
+    glTexCoordPointer(2, GL_FLOAT, 0, model.texcoords);       // Pointer to texture coords array
+    glNormalPointer(GL_FLOAT, 0, model.normals);              // Pointer to normals array
+    //glColorPointer(4, GL_UNSIGNED_BYTE, 0, model.colors);   // Pointer to colors array (NOT USED)
+        
+    rlPushMatrix();
+        rlTranslatef(position.x, position.y, position.z);
+        //glRotatef(rotation * GetFrameTime(), 0, 1, 0);
+        rlScalef(scale, scale, scale);
+        
+        rlColor4ub(color.r, color.g, color.b, color.a);
+
+        glDrawArrays(GL_TRIANGLES, 0, model.numVertices);
+    rlPopMatrix();
+    
+    glDisableClientState(GL_VERTEX_ARRAY);                     // Disable vertex array
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);              // Disable texture coords array
+    glDisableClientState(GL_NORMAL_ARRAY);                     // Disable normals array
+#endif
+
+#ifdef USE_OPENGL_33
+    glUseProgram(shaderProgram);        // Use our shader
+    
+    Matrix modelview2 = MatrixMultiply(model.transform, modelview);
+    
+    // NOTE: Drawing in OpenGL 3.3+, transform is passed to shader
+    glUniformMatrix4fv(projectionMatrixLoc, 1, false, GetMatrixVector(projection));
+    glUniformMatrix4fv(modelviewMatrixLoc, 1, false, GetMatrixVector(modelview2));
+    glUniform1i(textureLoc, 0);
+   
+    glBindVertexArray(model.vaoId);
+    //glBindTexture(GL_TEXTURE_2D, model.textureId);
+
+    glDrawArrays(GL_TRIANGLES, 0, model.numVertices);
+
+    //glBindTexture(GL_TEXTURE_2D, 0);    // Unbind textures
+    glBindVertexArray(0);               // Unbind VAO
+#endif
+
+    if (wires) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+}
+
 #endif
 
 // Initialize Graphics Device (OpenGL stuff)
@@ -909,7 +982,7 @@ void rlglInitGraphicsDevice(int fbWidth, int fbHeight)
 
 // Convert image data to OpenGL texture (returns OpenGL valid Id)
 // NOTE: Image is not unloaded, it should be done manually...
-unsigned int rlglTexture(int width, int height, unsigned char *pixels)
+unsigned int rlglLoadTexture(int width, int height, unsigned char *pixels)
 {
     glBindTexture(GL_TEXTURE_2D,0); // Free any old binding
 
@@ -926,7 +999,7 @@ unsigned int rlglTexture(int width, int height, unsigned char *pixels)
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  // Filter for pixel-perfect drawing, alternative: GL_LINEAR
  
 #ifdef USE_OPENGL_33 
-    // Trilinear filtering!
+    // Trilinear filtering
     //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);   // Activate use of mipmaps (must be available)
     //glGenerateMipmap(GL_TEXTURE_2D);    // OpenGL 3.3!
@@ -947,6 +1020,39 @@ unsigned int rlglTexture(int width, int height, unsigned char *pixels)
     return id;
 }
 
+#ifdef USE_OPENGL_33 
+unsigned int rlglLoadModel(VertexData data)
+{
+    GLuint vaoModel;            // Vertex Array Objects (VAO)
+    GLuint vertexBuffer[3];     // Vertex Buffer Objects (VBO)
+
+    // Initialize Quads VAO (Buffer A)
+    glGenVertexArrays(1, &vaoModel);
+    glBindVertexArray(vaoModel);
+ 
+    // Create buffers for our vertex data (positions, texcoords, normals)
+    glGenBuffers(3, vertexBuffer);
+ 
+    // Enable vertex attributes
+    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer[0]);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*data.numVertices, data.vertices, GL_STATIC_DRAW);
+    glEnableVertexAttribArray(vertexLoc);
+    glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, 0, 0, 0);
+    
+    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer[1]);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*data.numVertices, data.texcoords, GL_STATIC_DRAW);      
+    glEnableVertexAttribArray(texcoordLoc);
+    glVertexAttribPointer(texcoordLoc, 2, GL_FLOAT, 0, 0, 0);
+    
+    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer[2]);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*data.numVertices, data.normals, GL_STATIC_DRAW);   
+    //glEnableVertexAttribArray(normalLoc);
+    //glVertexAttribPointer(normalLoc, 3, GL_FLOAT, 0, 0, 0);
+    
+    return vaoModel;
+}
+#endif
+
 // Read screen pixel data (color buffer)
 unsigned char *rlglReadScreenPixels(int width, int height)
 {
@@ -1303,11 +1409,13 @@ static void UpdateBuffers()
  
     // Triangles - vertex positions buffer
     glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[0]);
-    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*3*MAX_TRIANGLES_BATCH, triangles.vertices, GL_DYNAMIC_DRAW);
-
+    //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*3*MAX_TRIANGLES_BATCH, triangles.vertices, GL_DYNAMIC_DRAW);
+    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*triangles.vCounter, triangles.vertices);
+    
     // Triangles - colors buffer
     glBindBuffer(GL_ARRAY_BUFFER, trianglesBuffer[1]);
-    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*3*MAX_TRIANGLES_BATCH, triangles.colors, GL_DYNAMIC_DRAW);
+    //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*3*MAX_TRIANGLES_BATCH, triangles.colors, GL_DYNAMIC_DRAW);
+    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*4*triangles.cCounter, triangles.colors);
     
     //--------------------------------------------------------------
 
@@ -1355,6 +1463,12 @@ static void UpdateBuffers()
         glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*4*quads.vCounter, quads.colors);
     }
     
+        
+    // Another option would be using buffer mapping...
+    //triangles.vertices = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
+    // Now we can modify vertices
+    //glUnmapBuffer(GL_ARRAY_BUFFER);
+    
     //--------------------------------------------------------------
     
     // Unbind the current VAO

+ 39 - 7
src/rlgl.h

@@ -29,9 +29,15 @@
 #ifndef RLGL_H
 #define RLGL_H
 
+//#define RLGL_STANDALONE       // NOTE: To use rlgl as standalone lib, just uncomment this line
+
+#ifndef RLGL_STANDALONE
+    #include "raylib.h"         // Required for typedef: Model
+#endif
+
 // Select desired OpenGL version
-//#define USE_OPENGL_11
-#define USE_OPENGL_33
+#define USE_OPENGL_11
+//#define USE_OPENGL_33
 //#define USE_OPENGL_ES2
 
 //----------------------------------------------------------------------------------
@@ -50,6 +56,29 @@ typedef enum { RL_PROJECTION, RL_MODELVIEW, RL_TEXTURE } MatrixMode;
 
 typedef enum { RL_LINES, RL_TRIANGLES, RL_QUADS } DrawMode;
 
+#ifdef RLGL_STANDALONE
+    typedef struct Model Model;
+#endif
+
+typedef struct {
+    int numVertices;
+    float *vertices;            // 3 components per vertex
+    float *texcoords;           // 2 components per vertex
+    float *normals;             // 3 components per vertex
+} VertexData;
+
+#ifdef USE_OPENGL_11
+struct Model {
+    VertexData data;
+};
+#else
+struct Model {
+    unsigned int vaoId;
+    Matrix transform;
+    int numVertices;
+};
+#endif
+
 #ifdef __cplusplus
 extern "C" {            // Prevents name mangling of functions
 #endif
@@ -88,7 +117,8 @@ void rlColor4f(float x, float y, float z, float w); // Define one vertex (color)
 //------------------------------------------------------------------------------------
 void rlEnableTexture(unsigned int id);      // Enable texture usage
 void rlDisableTexture();                    // Disable texture usage
-void rlDeleteTextures(unsigned int id);     // Delete OpenGL texture
+void rlDeleteTextures(unsigned int id);     // Delete OpenGL texture from GPU
+void rlDeleteVertexArrays(unsigned int id); // Unload vertex data from GPU memory
 void rlClearColor(byte r, byte g, byte b, byte a);  // Clear color buffer with color
 void rlClearScreenBuffers();                // Clear used screen buffers (color and depth)
 
@@ -96,13 +126,15 @@ void rlClearScreenBuffers();                // Clear used screen buffers (color
 // Functions Declaration - rlgl functionality
 //------------------------------------------------------------------------------------
 #ifdef USE_OPENGL_33
-void rlglInit();                            // Initialize rlgl (shaders, VAO, VBO...)
-void rlglClose();                           // De-init rlgl
-void rlglDraw();                            // Draw VAOs
+void rlglInit();                                // Initialize rlgl (shaders, VAO, VBO...)
+void rlglClose();                               // De-init rlgl
+void rlglDraw();                                // Draw VAOs
+unsigned int rlglLoadModel(VertexData data);
 #endif
 
+void rlglDrawModel(Model model, bool wires);    // Draw model
 void rlglInitGraphicsDevice(int fbWidth, int fbHeight);  // Initialize Graphics Device (OpenGL stuff)
-unsigned int rlglTexture(int width, int height, unsigned char *pixels); // Create OpenGL texture
+unsigned int rlglLoadTexture(int width, int height, unsigned char *pixels); // Load in GPU OpenGL texture
 byte *rlglReadScreenPixels(int width, int height);    // Read screen pixel data (color buffer)
 
 #ifdef USE_OPENGL_33

+ 11 - 18
src/shapes.c

@@ -62,7 +62,7 @@ void DrawPixel(int posX, int posY, Color color)
         rlColor4ub(color.r, color.g, color.b, color.a);
         rlVertex2i(posX, posY);
         rlVertex2i(posX + 1, posY + 1);
-    rlEnd();  
+    rlEnd();
 }
 
 // Draw a pixel (Vector version)
@@ -96,7 +96,6 @@ void DrawLineV(Vector2 startPos, Vector2 endPos, Color color)
 }
 
 // Draw a color-filled circle
-// TODO: Review, on some GPUs is drawn with a weird transparency (GL_POLYGON_SMOOTH issue?)
 void DrawCircle(int centerX, int centerY, float radius, Color color)
 {
     DrawPoly((Vector2){centerX, centerY}, 360, radius, 0, color);
@@ -107,13 +106,13 @@ void DrawCircle(int centerX, int centerY, float radius, Color color)
 void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2)
 {
     rlBegin(RL_TRIANGLES);        
-        for (int i=0; i <= 360; i += 2)        //i++ --> Step = 1.0 pixels
+        for (int i=0; i < 360; i += 2)
         {
             rlColor4ub(color1.r, color1.g, color1.b, color1.a);
             rlVertex2i(centerX, centerY);
             rlColor4ub(color2.r, color2.g, color2.b, color2.a);
             rlVertex2f(centerX + sin(DEG2RAD*i) * radius, centerY + cos(DEG2RAD*i) * radius);
-            rlVertex2f(centerX + sin(DEG2RAD*(i+1)) * radius, centerY + cos(DEG2RAD*(i+1)) * radius);
+            rlVertex2f(centerX + sin(DEG2RAD*(i+2)) * radius, centerY + cos(DEG2RAD*(i+2)) * radius);
         }
     rlEnd();
 }
@@ -127,7 +126,7 @@ void DrawCircleV(Vector2 center, float radius, Color color)
             rlColor4ub(color.r, color.g, color.b, color.a);
             rlVertex2i(center.x, center.y);
             rlVertex2f(center.x + sin(DEG2RAD*i) * radius, center.y + cos(DEG2RAD*i) * radius);
-            rlVertex2f(center.x + sin(DEG2RAD*(i+1)) * radius, center.y + cos(DEG2RAD*(i+1)) * radius);
+            rlVertex2f(center.x + sin(DEG2RAD*(i+2)) * radius, center.y + cos(DEG2RAD*(i+2)) * radius);
         }
     rlEnd();
 }
@@ -135,9 +134,6 @@ void DrawCircleV(Vector2 center, float radius, Color color)
 // Draw circle outline
 void DrawCircleLines(int centerX, int centerY, float radius, Color color)
 {
-    //glEnable(GL_LINE_SMOOTH);                    // Smoothies circle outline (anti-aliasing applied)
-    //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);      // Best quality for line smooth (anti-aliasing best algorithm)
-    
     rlBegin(RL_LINES);
         rlColor4ub(color.r, color.g, color.b, color.a);
         
@@ -148,10 +144,6 @@ void DrawCircleLines(int centerX, int centerY, float radius, Color color)
             rlVertex2f(centerX + sin(DEG2RAD*(i+1)) * radius, centerY + cos(DEG2RAD*(i+1)) * radius);
         }
    rlEnd();
-   
-   //glDisable(GL_LINE_SMOOTH);
-   
-   // TODO: Draw all lines with line smooth??? --> Do it before drawing lines VAO
 }
 
 // Draw a color-filled rectangle
@@ -255,16 +247,17 @@ void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color col
     if (sides < 3) sides = 3;
 
     rlPushMatrix();
-
-        rlRotatef(rotation, 0, 0, 1);   // TODO: compute vertex rotation manually!
+        rlTranslatef(center.x, center.y, 0.0);
+        rlRotatef(rotation, 0, 0, 1);
         
         rlBegin(RL_TRIANGLES);
-            for (int i=0; i < 360; i += 2)
+            for (int i=0; i < 360; i += 360/sides)
             {
                 rlColor4ub(color.r, color.g, color.b, color.a);
-                rlVertex2i(center.x, center.y);
-                rlVertex2f(center.x + sin(DEG2RAD*i) * radius, center.y + cos(DEG2RAD*i) * radius);
-                rlVertex2f(center.x + sin(DEG2RAD*(i+1)) * radius, center.y + cos(DEG2RAD*(i+1)) * radius);
+                
+                rlVertex2i(0, 0);
+                rlVertex2f(sin(DEG2RAD*i) * radius, cos(DEG2RAD*i) * radius);
+                rlVertex2f(sin(DEG2RAD*(i+360/sides)) * radius, cos(DEG2RAD*(i+360/sides)) * radius);
             }
         rlEnd();
     rlPopMatrix();

+ 0 - 1
src/text.c

@@ -313,7 +313,6 @@ void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position, int f
 
     rlEnableTexture(spriteFont.texture.glId);
 
-    // Optimized to use one draw call per string
     rlBegin(RL_QUADS);
         for(int i = 0; i < length; i++)
         {

+ 51 - 51
src/textures.c

@@ -273,31 +273,30 @@ void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float sc
 {
     rlEnableTexture(texture.glId);
     
-    // TODO: Apply rotation to vertex! --> rotate from origin CW (0, 0)
-    // TODO: Compute vertex scaling!
-    
     // NOTE: Rotation is applied before translation and scaling, even being called in inverse order...
-    // NOTE: Rotation point is upper-left corner
-    //rlTranslatef(position.x, position.y, 0);
-    //rlScalef(scale, scale, 1.0f);
-    //rlRotatef(rotation, 0, 0, 1);
-        
-    rlBegin(RL_QUADS);
-        rlColor4ub(tint.r, tint.g, tint.b, tint.a);
-        rlNormal3f(0.0f, 0.0f, 1.0f);                               // Normal vector pointing towards viewer
-        
-        rlTexCoord2f(0.0f, 0.0f);
-        rlVertex2f(position.x, position.y);                         // Bottom-left corner for texture and quad
-        
-        rlTexCoord2f(0.0f, 1.0f); 
-        rlVertex2f(position.x, position.y + texture.height);        // Bottom-right corner for texture and quad
-        
-        rlTexCoord2f(1.0f, 1.0f); 
-        rlVertex2f(position.x + texture.width, position.y + texture.height);  // Top-right corner for texture and quad
-        
-        rlTexCoord2f(1.0f, 0.0f); 
-        rlVertex2f(position.x + texture.width, position.y);         // Top-left corner for texture and quad
-    rlEnd();
+    // NOTE: Rotation point is upper-left corner    
+    rlPushMatrix();
+        rlTranslatef(position.x, position.y, 0.0);
+        rlScalef(scale, scale, 1.0f);
+        rlRotatef(rotation, 0, 0, 1);
+    
+        rlBegin(RL_QUADS);
+            rlColor4ub(tint.r, tint.g, tint.b, tint.a);
+            rlNormal3f(0.0f, 0.0f, 1.0f);                               // Normal vector pointing towards viewer
+            
+            rlTexCoord2f(0.0f, 0.0f);
+            rlVertex2f(position.x, position.y);                         // Bottom-left corner for texture and quad
+            
+            rlTexCoord2f(0.0f, 1.0f); 
+            rlVertex2f(position.x, position.y + texture.height);        // Bottom-right corner for texture and quad
+            
+            rlTexCoord2f(1.0f, 1.0f); 
+            rlVertex2f(position.x + texture.width, position.y + texture.height);  // Top-right corner for texture and quad
+            
+            rlTexCoord2f(1.0f, 0.0f); 
+            rlVertex2f(position.x + texture.width, position.y);         // Top-left corner for texture and quad
+        rlEnd();
+    rlPopMatrix();
     
     rlDisableTexture();
 }
@@ -337,32 +336,33 @@ void DrawTexturePro(Texture2D texture, Rectangle sourceRec, Rectangle destRec, V
 {
     rlEnableTexture(texture.glId);
     
-    // TODO: Apply translation, rotation and scaling of vertex manually!
-    
-    //rlTranslatef(-origin.x, -origin.y, 0);
-    //rlRotatef(rotation, 0, 0, 1);
-    //rlTranslatef(destRec.x + origin.x, destRec.y + origin.y, 0);
-        
-    rlBegin(RL_QUADS);
-        rlColor4ub(tint.r, tint.g, tint.b, tint.a);
-        rlNormal3f(0.0f, 0.0f, 1.0f);                          // Normal vector pointing towards viewer
-        
-        // Bottom-left corner for texture and quad
-        rlTexCoord2f((float)sourceRec.x / texture.width, (float)sourceRec.y / texture.height); 
-        rlVertex2f(0.0f, 0.0f);
-        
-        // Bottom-right corner for texture and quad
-        rlTexCoord2f((float)(sourceRec.x + sourceRec.width) / texture.width, (float)sourceRec.y / texture.height);
-        rlVertex2f(destRec.width, 0.0f);
-        
-        // Top-right corner for texture and quad
-        rlTexCoord2f((float)(sourceRec.x + sourceRec.width) / texture.width, (float)(sourceRec.y + sourceRec.height) / texture.height); 
-        rlVertex2f(destRec.width, destRec.height);
-        
-        // Top-left corner for texture and quad
-        rlTexCoord2f((float)sourceRec.x / texture.width, (float)(sourceRec.y + sourceRec.height) / texture.height);
-        rlVertex2f(0.0f, destRec.height);
-    rlEnd();
+    // NOTE: First we translate texture to origin to apply rotation and translation from there
+    rlPushMatrix();
+        rlTranslatef(-origin.x, -origin.y, 0);  
+        rlRotatef(rotation, 0, 0, 1);
+        rlTranslatef(destRec.x + origin.x, destRec.y + origin.y, 0);
+            
+        rlBegin(RL_QUADS);
+            rlColor4ub(tint.r, tint.g, tint.b, tint.a);
+            rlNormal3f(0.0f, 0.0f, 1.0f);                          // Normal vector pointing towards viewer
+            
+            // Bottom-left corner for texture and quad
+            rlTexCoord2f((float)sourceRec.x / texture.width, (float)sourceRec.y / texture.height); 
+            rlVertex2f(0.0f, 0.0f);
+            
+            // Bottom-right corner for texture and quad
+            rlTexCoord2f((float)(sourceRec.x + sourceRec.width) / texture.width, (float)sourceRec.y / texture.height);
+            rlVertex2f(destRec.width, 0.0f);
+            
+            // Top-right corner for texture and quad
+            rlTexCoord2f((float)(sourceRec.x + sourceRec.width) / texture.width, (float)(sourceRec.y + sourceRec.height) / texture.height); 
+            rlVertex2f(destRec.width, destRec.height);
+            
+            // Top-left corner for texture and quad
+            rlTexCoord2f((float)sourceRec.x / texture.width, (float)(sourceRec.y + sourceRec.height) / texture.height);
+            rlVertex2f(0.0f, destRec.height);
+        rlEnd();
+    rlPopMatrix();
     
     rlDisableTexture();
 }
@@ -385,7 +385,7 @@ Texture2D CreateTexture(Image image)
         j++;
     }
 
-    texture.glId = rlglTexture(image.width, image.height, img);
+    texture.glId = rlglLoadTexture(image.width, image.height, img);
 
     texture.width = image.width;
     texture.height = image.height;

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini