mirror of
https://github.com/raysan5/raylib.git
synced 2025-09-28 05:58:30 +00:00
Adapt multiple functions to rlgl
Nearly a complete rework of Models module Some teaks on multiple functions
This commit is contained in:
150
src/rlgl.c
150
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
|
||||
|
Reference in New Issue
Block a user