浏览代码

fixed some memory leaks, still issue with material index allocation leaking 4 bytes (possibly double allocation) (#964)

pull/969/head
chriscamacho 5 年前
committed by Ray
父节点
当前提交
6916ff58b1
共有 2 个文件被更改,包括 60 次插入58 次删除
  1. +48
    -47
      src/models.c
  2. +12
    -11
      src/rlgl.h

+ 48
- 47
src/models.c 查看文件

@ -296,7 +296,7 @@ void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float hei
float x = position.x; float x = position.x;
float y = position.y; float y = position.y;
float z = position.z; float z = position.z;
if (rlCheckBufferLimit(36)) rlglDraw(); if (rlCheckBufferLimit(36)) rlglDraw();
rlEnableTexture(texture.id); rlEnableTexture(texture.id);
@ -362,7 +362,7 @@ void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color
{ {
int numVertex = (rings + 2)*slices*6; int numVertex = (rings + 2)*slices*6;
if (rlCheckBufferLimit(numVertex)) rlglDraw(); if (rlCheckBufferLimit(numVertex)) rlglDraw();
rlPushMatrix(); rlPushMatrix();
// NOTE: Transformation is applied in inverse order (scale -> translate) // NOTE: Transformation is applied in inverse order (scale -> translate)
rlTranslatef(centerPos.x, centerPos.y, centerPos.z); rlTranslatef(centerPos.x, centerPos.y, centerPos.z);
@ -405,7 +405,7 @@ void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Col
{ {
int numVertex = (rings + 2)*slices*6; int numVertex = (rings + 2)*slices*6;
if (rlCheckBufferLimit(numVertex)) rlglDraw(); if (rlCheckBufferLimit(numVertex)) rlglDraw();
rlPushMatrix(); rlPushMatrix();
// NOTE: Transformation is applied in inverse order (scale -> translate) // NOTE: Transformation is applied in inverse order (scale -> translate)
rlTranslatef(centerPos.x, centerPos.y, centerPos.z); rlTranslatef(centerPos.x, centerPos.y, centerPos.z);
@ -449,7 +449,7 @@ void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Col
void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int sides, Color color) void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int sides, Color color)
{ {
if (sides < 3) sides = 3; if (sides < 3) sides = 3;
int numVertex = sides*6; int numVertex = sides*6;
if (rlCheckBufferLimit(numVertex)) rlglDraw(); if (rlCheckBufferLimit(numVertex)) rlglDraw();
@ -508,7 +508,7 @@ void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float h
void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int sides, Color color) void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int sides, Color color)
{ {
if (sides < 3) sides = 3; if (sides < 3) sides = 3;
int numVertex = sides*8; int numVertex = sides*8;
if (rlCheckBufferLimit(numVertex)) rlglDraw(); if (rlCheckBufferLimit(numVertex)) rlglDraw();
@ -540,7 +540,7 @@ void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, fl
void DrawPlane(Vector3 centerPos, Vector2 size, Color color) void DrawPlane(Vector3 centerPos, Vector2 size, Color color)
{ {
if (rlCheckBufferLimit(4)) rlglDraw(); if (rlCheckBufferLimit(4)) rlglDraw();
// NOTE: Plane is always created on XZ ground // NOTE: Plane is always created on XZ ground
rlPushMatrix(); rlPushMatrix();
rlTranslatef(centerPos.x, centerPos.y, centerPos.z); rlTranslatef(centerPos.x, centerPos.y, centerPos.z);
@ -725,9 +725,9 @@ Mesh *LoadMeshes(const char *fileName, int *meshCount)
{ {
Mesh *meshes = NULL; Mesh *meshes = NULL;
int count = 0; int count = 0;
// TODO: Load meshes from file (OBJ, IQM, GLTF) // TODO: Load meshes from file (OBJ, IQM, GLTF)
*meshCount = count; *meshCount = count;
return meshes; return meshes;
} }
@ -800,7 +800,7 @@ Material *LoadMaterials(const char *fileName, int *materialCount)
{ {
Material *materials = NULL; Material *materials = NULL;
unsigned int count = 0; unsigned int count = 0;
// TODO: Support IQM and GLTF for materials parsing // TODO: Support IQM and GLTF for materials parsing
#if defined(SUPPORT_FILEFORMAT_MTL) #if defined(SUPPORT_FILEFORMAT_MTL)
@ -853,7 +853,7 @@ void UnloadMaterial(Material material)
{ {
if (material.maps[i].texture.id != GetTextureDefault().id) rlDeleteTextures(material.maps[i].texture.id); if (material.maps[i].texture.id != GetTextureDefault().id) rlDeleteTextures(material.maps[i].texture.id);
} }
RL_FREE(material.maps); RL_FREE(material.maps);
} }
@ -908,7 +908,7 @@ ModelAnimation *LoadModelAnimations(const char *filename, int *animCount)
float framerate; float framerate;
unsigned int flags; unsigned int flags;
} IQMAnim; } IQMAnim;
FILE *iqmFile; FILE *iqmFile;
IQMHeader iqm; IQMHeader iqm;
@ -1076,7 +1076,7 @@ ModelAnimation *LoadModelAnimations(const char *filename, int *animCount)
RL_FREE(framedata); RL_FREE(framedata);
RL_FREE(poses); RL_FREE(poses);
RL_FREE(anim); RL_FREE(anim);
fclose(iqmFile); fclose(iqmFile);
return animations; return animations;
@ -1151,7 +1151,7 @@ void UpdateModelAnimation(Model model, ModelAnimation anim, int frame)
void UnloadModelAnimation(ModelAnimation anim) void UnloadModelAnimation(ModelAnimation anim)
{ {
for (int i = 0; i < anim.frameCount; i++) RL_FREE(anim.framePoses[i]); for (int i = 0; i < anim.frameCount; i++) RL_FREE(anim.framePoses[i]);
RL_FREE(anim.bones); RL_FREE(anim.bones);
RL_FREE(anim.framePoses); RL_FREE(anim.framePoses);
} }
@ -1161,7 +1161,7 @@ void UnloadModelAnimation(ModelAnimation anim)
bool IsModelAnimationValid(Model model, ModelAnimation anim) bool IsModelAnimationValid(Model model, ModelAnimation anim)
{ {
int result = true; int result = true;
if (model.boneCount != anim.boneCount) result = false; if (model.boneCount != anim.boneCount) result = false;
else else
{ {
@ -2336,7 +2336,7 @@ void MeshTangents(Mesh *mesh)
RL_FREE(tan1); RL_FREE(tan1);
RL_FREE(tan2); RL_FREE(tan2);
// Load a new tangent attributes buffer // Load a new tangent attributes buffer
mesh->vboId[LOC_VERTEX_TANGENT] = rlLoadAttribBuffer(mesh->vaoId, LOC_VERTEX_TANGENT, mesh->tangents, mesh->vertexCount*4*sizeof(float), false); mesh->vboId[LOC_VERTEX_TANGENT] = rlLoadAttribBuffer(mesh->vaoId, LOC_VERTEX_TANGENT, mesh->tangents, mesh->vertexCount*4*sizeof(float), false);
@ -2491,7 +2491,7 @@ void DrawBoundingBox(BoundingBox box, Color color)
bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB) bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB)
{ {
bool collision = false; bool collision = false;
// Simple way to check for collision, just checking distance between two points // Simple way to check for collision, just checking distance between two points
// Unfortunately, sqrtf() is a costly operation, so we avoid it with following solution // Unfortunately, sqrtf() is a costly operation, so we avoid it with following solution
/* /*
@ -2503,10 +2503,10 @@ bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, floa
if (distance <= (radiusA + radiusB)) collision = true; if (distance <= (radiusA + radiusB)) collision = true;
*/ */
// Check for distances squared to avoid sqrtf() // Check for distances squared to avoid sqrtf()
if (Vector3DotProduct(Vector3Subtract(centerB, centerA), Vector3Subtract(centerB, centerA)) <= (radiusA + radiusB)*(radiusA + radiusB)) collision = true; if (Vector3DotProduct(Vector3Subtract(centerB, centerA), Vector3Subtract(centerB, centerA)) <= (radiusA + radiusB)*(radiusA + radiusB)) collision = true;
return collision; return collision;
} }
@ -2798,7 +2798,7 @@ static Model LoadOBJ(const char *fileName)
model.materialCount = materialCount; model.materialCount = materialCount;
model.materials = (Material *)RL_CALLOC(model.materialCount, sizeof(Material)); model.materials = (Material *)RL_CALLOC(model.materialCount, sizeof(Material));
} }
model.meshMaterial = (int *)RL_CALLOC(model.meshCount, sizeof(int)); model.meshMaterial = (int *)RL_CALLOC(model.meshCount, sizeof(int));
/* /*
@ -2897,7 +2897,7 @@ static Model LoadOBJ(const char *fileName)
*/ */
model.materials[m].maps[MAP_DIFFUSE].texture = GetTextureDefault(); // Get default texture, in case no texture is defined model.materials[m].maps[MAP_DIFFUSE].texture = GetTextureDefault(); // Get default texture, in case no texture is defined
if (materials[m].diffuse_texname != NULL) model.materials[m].maps[MAP_DIFFUSE].texture = LoadTexture(materials[m].diffuse_texname); //char *diffuse_texname; // map_Kd if (materials[m].diffuse_texname != NULL) model.materials[m].maps[MAP_DIFFUSE].texture = LoadTexture(materials[m].diffuse_texname); //char *diffuse_texname; // map_Kd
model.materials[m].maps[MAP_DIFFUSE].color = (Color){ (float)(materials[m].diffuse[0]*255.0f), (float)(materials[m].diffuse[1]*255.0f), (float)(materials[m].diffuse[2]*255.0f), 255 }; //float diffuse[3]; model.materials[m].maps[MAP_DIFFUSE].color = (Color){ (float)(materials[m].diffuse[0]*255.0f), (float)(materials[m].diffuse[1]*255.0f), (float)(materials[m].diffuse[2]*255.0f), 255 }; //float diffuse[3];
model.materials[m].maps[MAP_DIFFUSE].value = 0.0f; model.materials[m].maps[MAP_DIFFUSE].value = 0.0f;
@ -2918,6 +2918,7 @@ static Model LoadOBJ(const char *fileName)
tinyobj_attrib_free(&attrib); tinyobj_attrib_free(&attrib);
tinyobj_shapes_free(meshes, meshCount); tinyobj_shapes_free(meshes, meshCount);
tinyobj_materials_free(materials, materialCount); tinyobj_materials_free(materials, materialCount);
RL_FREE(data); // oh ray how did you miss this...! :-p
} }
// NOTE: At this point we have all model data loaded // NOTE: At this point we have all model data loaded
@ -2966,13 +2967,13 @@ static Model LoadIQM(const char *fileName)
typedef struct IQMTriangle { typedef struct IQMTriangle {
unsigned int vertex[3]; unsigned int vertex[3];
} IQMTriangle; } IQMTriangle;
typedef struct IQMJoint { typedef struct IQMJoint {
unsigned int name; unsigned int name;
int parent; int parent;
float translate[3], rotate[4], scale[3]; float translate[3], rotate[4], scale[3];
} IQMJoint; } IQMJoint;
typedef struct IQMVertexArray { typedef struct IQMVertexArray {
unsigned int type; unsigned int type;
unsigned int flags; unsigned int flags;
@ -3090,7 +3091,7 @@ static Model LoadIQM(const char *fileName)
// NOTE: Animated vertex should be re-uploaded to GPU (if not using GPU skinning) // NOTE: Animated vertex should be re-uploaded to GPU (if not using GPU skinning)
model.meshes[i].animVertices = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float)); model.meshes[i].animVertices = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
model.meshes[i].animNormals = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float)); model.meshes[i].animNormals = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
model.meshes[i].vboId = (unsigned int *)RL_CALLOC(MAX_MESH_VBO, sizeof(unsigned int)); model.meshes[i].vboId = (unsigned int *)RL_CALLOC(MAX_MESH_VBO, sizeof(unsigned int));
} }
@ -3286,7 +3287,7 @@ static const unsigned char base64Table[] = {
static int GetSizeBase64(char *input) static int GetSizeBase64(char *input)
{ {
int size = 0; int size = 0;
for (int i = 0; input[4*i] != 0; i++) for (int i = 0; input[4*i] != 0; i++)
{ {
if (input[4*i + 3] == '=') if (input[4*i + 3] == '=')
@ -3296,7 +3297,7 @@ static int GetSizeBase64(char *input)
} }
else size += 3; else size += 3;
} }
return size; return size;
} }
@ -3340,24 +3341,24 @@ static unsigned char *DecodeBase64(char *input, int *size)
static Model LoadGLTF(const char *fileName) static Model LoadGLTF(const char *fileName)
{ {
/*********************************************************************************** /***********************************************************************************
Function implemented by Wilhem Barbier (@wbrbr) Function implemented by Wilhem Barbier (@wbrbr)
Features: Features:
- Supports .gltf and .glb files - Supports .gltf and .glb files
- Supports embedded (base64) or external textures - Supports embedded (base64) or external textures
- Loads the albedo/diffuse texture (other maps could be added) - Loads the albedo/diffuse texture (other maps could be added)
- Supports multiple mesh per model and multiple primitives per model - Supports multiple mesh per model and multiple primitives per model
Some restrictions (not exhaustive): Some restrictions (not exhaustive):
- Triangle-only meshes - Triangle-only meshes
- Not supported node hierarchies or transforms - Not supported node hierarchies or transforms
- Only loads the diffuse texture... but not too hard to support other maps (normal, roughness/metalness...) - Only loads the diffuse texture... but not too hard to support other maps (normal, roughness/metalness...)
- Only supports unsigned short indices (no byte/unsigned int) - Only supports unsigned short indices (no byte/unsigned int)
- Only supports float for texture coordinates (no byte/unsigned short) - Only supports float for texture coordinates (no byte/unsigned short)
*************************************************************************************/ *************************************************************************************/
#define LOAD_ACCESSOR(type, nbcomp, acc, dst) \ #define LOAD_ACCESSOR(type, nbcomp, acc, dst) \
{ \ { \
int n = 0; \ int n = 0; \
@ -3369,7 +3370,7 @@ static Model LoadGLTF(const char *fileName)
n += acc->stride/sizeof(type);\ n += acc->stride/sizeof(type);\
}\ }\
} }
Model model = { 0 }; Model model = { 0 };
// glTF file loading // glTF file loading
@ -3403,7 +3404,7 @@ static Model LoadGLTF(const char *fileName)
result = cgltf_load_buffers(&options, data, fileName); result = cgltf_load_buffers(&options, data, fileName);
int primitivesCount = 0; int primitivesCount = 0;
for (int i = 0; i < data->meshes_count; i++) primitivesCount += (int)data->meshes[i].primitives_count; for (int i = 0; i < data->meshes_count; i++) primitivesCount += (int)data->meshes[i].primitives_count;
// Process glTF data and map to model // Process glTF data and map to model
@ -3412,7 +3413,7 @@ static Model LoadGLTF(const char *fileName)
model.materialCount = data->materials_count + 1; model.materialCount = data->materials_count + 1;
model.materials = RL_MALLOC(model.materialCount*sizeof(Material)); model.materials = RL_MALLOC(model.materialCount*sizeof(Material));
model.meshMaterial = RL_MALLOC(model.meshCount*sizeof(int)); model.meshMaterial = RL_MALLOC(model.meshCount*sizeof(int));
for (int i = 0; i < model.meshCount; i++) model.meshes[i].vboId = (unsigned int *)RL_CALLOC(MAX_MESH_VBO, sizeof(unsigned int)); for (int i = 0; i < model.meshCount; i++) model.meshes[i].vboId = (unsigned int *)RL_CALLOC(MAX_MESH_VBO, sizeof(unsigned int));
for (int i = 0; i < model.materialCount - 1; i++) for (int i = 0; i < model.materialCount - 1; i++)
@ -3420,7 +3421,7 @@ static Model LoadGLTF(const char *fileName)
Color tint = WHITE; Color tint = WHITE;
Texture2D texture = { 0 }; Texture2D texture = { 0 };
const char *texPath = GetDirectoryPath(fileName); const char *texPath = GetDirectoryPath(fileName);
if (data->materials[i].has_pbr_metallic_roughness) if (data->materials[i].has_pbr_metallic_roughness)
{ {
tint.r = (unsigned char)(data->materials[i].pbr_metallic_roughness.base_color_factor[0]*255.99f); tint.r = (unsigned char)(data->materials[i].pbr_metallic_roughness.base_color_factor[0]*255.99f);
@ -3435,12 +3436,12 @@ static Model LoadGLTF(const char *fileName)
tint.b = 1.0f; tint.b = 1.0f;
tint.a = 1.0f; tint.a = 1.0f;
} }
if (data->materials[i].has_pbr_metallic_roughness) if (data->materials[i].has_pbr_metallic_roughness)
{ {
cgltf_image *img = data->materials[i].pbr_metallic_roughness.base_color_texture.texture->image; cgltf_image *img = data->materials[i].pbr_metallic_roughness.base_color_texture.texture->image;
if (img->uri)
if (img->uri)
{ {
if ((strlen(img->uri) > 5) && if ((strlen(img->uri) > 5) &&
(img->uri[0] == 'd') && (img->uri[0] == 'd') &&
@ -3461,10 +3462,10 @@ static Model LoadGLTF(const char *fileName)
{ {
int size; int size;
unsigned char *data = DecodeBase64(img->uri + i + 1, &size); unsigned char *data = DecodeBase64(img->uri + i + 1, &size);
int w, h; int w, h;
unsigned char *raw = stbi_load_from_memory(data, size, &w, &h, NULL, 4); unsigned char *raw = stbi_load_from_memory(data, size, &w, &h, NULL, 4);
Image image = LoadImagePro(raw, w, h, UNCOMPRESSED_R8G8B8A8); Image image = LoadImagePro(raw, w, h, UNCOMPRESSED_R8G8B8A8);
ImageColorTint(&image, tint); ImageColorTint(&image, tint);
texture = LoadTextureFromImage(image); texture = LoadTextureFromImage(image);
@ -3491,7 +3492,7 @@ static Model LoadGLTF(const char *fileName)
unsigned char *data = RL_MALLOC(img->buffer_view->size); unsigned char *data = RL_MALLOC(img->buffer_view->size);
int n = img->buffer_view->offset; int n = img->buffer_view->offset;
int stride = img->buffer_view->stride ? img->buffer_view->stride : 1; int stride = img->buffer_view->stride ? img->buffer_view->stride : 1;
for (int i = 0; i < img->buffer_view->size; i++) for (int i = 0; i < img->buffer_view->size; i++)
{ {
data[i] = ((unsigned char *)img->buffer_view->buffer->data)[n]; data[i] = ((unsigned char *)img->buffer_view->buffer->data)[n];
@ -3500,7 +3501,7 @@ static Model LoadGLTF(const char *fileName)
int w, h; int w, h;
unsigned char *raw = stbi_load_from_memory(data, img->buffer_view->size, &w, &h, NULL, 4); unsigned char *raw = stbi_load_from_memory(data, img->buffer_view->size, &w, &h, NULL, 4);
Image image = LoadImagePro(raw, w, h, UNCOMPRESSED_R8G8B8A8); Image image = LoadImagePro(raw, w, h, UNCOMPRESSED_R8G8B8A8);
ImageColorTint(&image, tint); ImageColorTint(&image, tint);
texture = LoadTextureFromImage(image); texture = LoadTextureFromImage(image);
@ -3512,16 +3513,16 @@ static Model LoadGLTF(const char *fileName)
texture = LoadTextureFromImage(image); texture = LoadTextureFromImage(image);
UnloadImage(image); UnloadImage(image);
} }
model.materials[i] = LoadMaterialDefault(); model.materials[i] = LoadMaterialDefault();
model.materials[i].maps[MAP_DIFFUSE].texture = texture; model.materials[i].maps[MAP_DIFFUSE].texture = texture;
} }
} }
model.materials[model.materialCount - 1] = LoadMaterialDefault(); model.materials[model.materialCount - 1] = LoadMaterialDefault();
int primitiveIndex = 0; int primitiveIndex = 0;
for (int i = 0; i < data->meshes_count; i++) for (int i = 0; i < data->meshes_count; i++)
{ {
for (int p = 0; p < data->meshes[i].primitives_count; p++) for (int p = 0; p < data->meshes[i].primitives_count; p++)
@ -3546,7 +3547,7 @@ static Model LoadGLTF(const char *fileName)
else if (data->meshes[i].primitives[p].attributes[j].type == cgltf_attribute_type_texcoord) else if (data->meshes[i].primitives[p].attributes[j].type == cgltf_attribute_type_texcoord)
{ {
cgltf_accessor *acc = data->meshes[i].primitives[p].attributes[j].data; cgltf_accessor *acc = data->meshes[i].primitives[p].attributes[j].data;
if (acc->component_type == cgltf_component_type_r_32f) if (acc->component_type == cgltf_component_type_r_32f)
{ {
model.meshes[primitiveIndex].texcoords = RL_MALLOC(sizeof(float)*acc->count*2); model.meshes[primitiveIndex].texcoords = RL_MALLOC(sizeof(float)*acc->count*2);
@ -3561,7 +3562,7 @@ static Model LoadGLTF(const char *fileName)
} }
cgltf_accessor *acc = data->meshes[i].primitives[p].indices; cgltf_accessor *acc = data->meshes[i].primitives[p].indices;
if (acc) if (acc)
{ {
if (acc->component_type == cgltf_component_type_r_16u) if (acc->component_type == cgltf_component_type_r_16u)
@ -3591,7 +3592,7 @@ static Model LoadGLTF(const char *fileName)
{ {
model.meshMaterial[primitiveIndex] = model.materialCount - 1;; model.meshMaterial[primitiveIndex] = model.materialCount - 1;;
} }
primitiveIndex++; primitiveIndex++;
} }
} }

+ 12
- 11
src/rlgl.h 查看文件

@ -1527,7 +1527,7 @@ void rlglInit(int width, int height)
// Allocate numExt strings pointers // Allocate numExt strings pointers
const char **extList = RL_MALLOC(sizeof(const char *)*numExt); const char **extList = RL_MALLOC(sizeof(const char *)*numExt);
// Get extensions strings // Get extensions strings
for (int i = 0; i < numExt; i++) extList[i] = (const char *)glGetStringi(GL_EXTENSIONS, i); for (int i = 0; i < numExt; i++) extList[i] = (const char *)glGetStringi(GL_EXTENSIONS, i);
@ -1541,7 +1541,7 @@ void rlglInit(int width, int height)
int len = strlen(extensions) + 1; int len = strlen(extensions) + 1;
char *extensionsDup = (char *)RL_CALLOC(len, sizeof(char)); char *extensionsDup = (char *)RL_CALLOC(len, sizeof(char));
strcpy(extensionsDup, extensions); strcpy(extensionsDup, extensions);
extList[numExt] = extensionsDup; extList[numExt] = extensionsDup;
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
@ -1549,13 +1549,13 @@ void rlglInit(int width, int height)
if (extensionsDup[i] == ' ') if (extensionsDup[i] == ' ')
{ {
extensionsDup[i] = '\0'; extensionsDup[i] = '\0';
numExt++; numExt++;
extList[numExt] = &extensionsDup[i + 1]; extList[numExt] = &extensionsDup[i + 1];
} }
} }
// NOTE: Duplicated string (extensionsDup) must be deallocated
// NOTE: Duplicated string (extensionsDup) must be deallocated
#endif #endif
TraceLog(LOG_INFO, "Number of supported extensions: %i", numExt); TraceLog(LOG_INFO, "Number of supported extensions: %i", numExt);
@ -2636,11 +2636,11 @@ void rlDrawMesh(Mesh mesh, Material material, Matrix transform)
// That's because BeginMode3D() sets it an no model-drawing function modifies it, all use rlPushMatrix() and rlPopMatrix() // That's because BeginMode3D() sets it an no model-drawing function modifies it, all use rlPushMatrix() and rlPopMatrix()
Matrix matView = modelview; // View matrix (camera) Matrix matView = modelview; // View matrix (camera)
Matrix matProjection = projection; // Projection matrix (perspective) Matrix matProjection = projection; // Projection matrix (perspective)
// TODO: Matrix nightmare! Trying to combine stack matrices with view matrix and local model transform matrix.. // TODO: Matrix nightmare! Trying to combine stack matrices with view matrix and local model transform matrix..
// There is some problem in the order matrices are multiplied... it requires some time to figure out... // There is some problem in the order matrices are multiplied... it requires some time to figure out...
Matrix matStackTransform = MatrixIdentity(); Matrix matStackTransform = MatrixIdentity();
// TODO: Consider possible transform matrices in the stack // TODO: Consider possible transform matrices in the stack
// Is this the right order? or should we start with the first stored matrix instead of the last one? // Is this the right order? or should we start with the first stored matrix instead of the last one?
//for (int i = stackCounter; i > 0; i--) matStackTransform = MatrixMultiply(stack[i], matStackTransform); //for (int i = stackCounter; i > 0; i--) matStackTransform = MatrixMultiply(stack[i], matStackTransform);
@ -2967,7 +2967,8 @@ char *LoadText(const char *fileName)
Shader LoadShader(const char *vsFileName, const char *fsFileName) Shader LoadShader(const char *vsFileName, const char *fsFileName)
{ {
Shader shader = { 0 }; Shader shader = { 0 };
shader.locs = (int *)RL_CALLOC(MAX_SHADER_LOCATIONS, sizeof(int)); // double allocation causing leak (allocation done in LoadShaderCode)
//shader.locs = (int *)RL_CALLOC(MAX_SHADER_LOCATIONS, sizeof(int));
char *vShaderStr = NULL; char *vShaderStr = NULL;
char *fShaderStr = NULL; char *fShaderStr = NULL;
@ -3054,7 +3055,7 @@ void UnloadShader(Shader shader)
rlDeleteShader(shader.id); rlDeleteShader(shader.id);
TraceLog(LOG_INFO, "[SHDR ID %i] Unloaded shader program data", shader.id); TraceLog(LOG_INFO, "[SHDR ID %i] Unloaded shader program data", shader.id);
} }
RL_FREE(shader.locs); RL_FREE(shader.locs);
} }
@ -4615,8 +4616,8 @@ int GetPixelDataSize(int width, int height, int format)
} }
dataSize = width*height*bpp/8; // Total data size in bytes dataSize = width*height*bpp/8; // Total data size in bytes
// Most compressed formats works on 4x4 blocks,
// Most compressed formats works on 4x4 blocks,
// if texture is smaller, minimum dataSize is 8 or 16 // if texture is smaller, minimum dataSize is 8 or 16
if ((width < 4) && (height < 4)) if ((width < 4) && (height < 4))
{ {

||||||
x
 
000:0
正在加载...
取消
保存