Update to latest tiniobjloader

WARNING: OBJ loading is broken at this point...
This commit is contained in:
Ray 2020-11-17 00:30:12 +01:00
parent a54d9f734b
commit 9471794449
2 changed files with 117 additions and 118 deletions

View File

@ -24,8 +24,8 @@
#ifndef TINOBJ_LOADER_C_H_
#define TINOBJ_LOADER_C_H_
/* @todo { Remove stddef dependency. unsigned int? } ---> RAY: DONE. */
//#include <stddef.h>
/* @todo { Remove stddef dependency. size_t? } */
#include <stddef.h>
typedef struct {
char *name;
@ -98,7 +98,7 @@ typedef struct {
* @param[out] buf Content of loaded file
* @param[out] len Size of content(file)
*/
typedef void (*file_reader_callback)(const char *filename, int is_mtl, const char *obj_filename, char **buf, unsigned char *len);
typedef void (*file_reader_callback)(const char *filename, int is_mtl, const char *obj_filename, char **buf, size_t *len);
/* Parse wavefront .obj
* @param[out] attrib Attibutes
@ -114,8 +114,8 @@ typedef void (*file_reader_callback)(const char *filename, int is_mtl, const cha
* Returns TINYOBJ_ERR_*** when there is an error.
*/
extern int tinyobj_parse_obj(tinyobj_attrib_t *attrib, tinyobj_shape_t **shapes,
unsigned int *num_shapes, tinyobj_material_t **materials,
unsigned int *num_materials, const char *file_name, file_reader_callback file_reader,
size_t *num_shapes, tinyobj_material_t **materials,
size_t *num_materials, const char *file_name, file_reader_callback file_reader,
unsigned int flags);
/* Parse wavefront .mtl
@ -130,14 +130,14 @@ extern int tinyobj_parse_obj(tinyobj_attrib_t *attrib, tinyobj_shape_t **shapes,
* Returns TINYOBJ_ERR_*** when there is an error.
*/
extern int tinyobj_parse_mtl_file(tinyobj_material_t **materials_out,
unsigned int *num_materials_out,
size_t *num_materials_out,
const char *filename, const char *obj_filename, file_reader_callback file_reader);
extern void tinyobj_attrib_init(tinyobj_attrib_t *attrib);
extern void tinyobj_attrib_free(tinyobj_attrib_t *attrib);
extern void tinyobj_shapes_free(tinyobj_shape_t *shapes, unsigned char num_shapes);
extern void tinyobj_shapes_free(tinyobj_shape_t *shapes, size_t num_shapes);
extern void tinyobj_materials_free(tinyobj_material_t *materials,
unsigned char num_materials);
size_t num_materials);
#ifdef TINYOBJ_LOADER_C_IMPLEMENTATION
#include <stdio.h>
@ -189,8 +189,8 @@ static int until_space(const char *token) {
return (int)(p - token);
}
static unsigned int length_until_newline(const char *token, unsigned int n) {
unsigned int len = 0;
static size_t length_until_newline(const char *token, size_t n) {
size_t len = 0;
/* Assume token[n-1] = '\0' */
for (len = 0; len < n - 1; len++) {
@ -205,8 +205,8 @@ static unsigned int length_until_newline(const char *token, unsigned int n) {
return len;
}
static unsigned int length_until_line_feed(const char *token, unsigned int n) {
unsigned int len = 0;
static size_t length_until_line_feed(const char *token, size_t n) {
size_t len = 0;
/* Assume token[n-1] = '\0' */
for (len = 0; len < n; len++) {
@ -236,7 +236,7 @@ static int my_atoi(const char *c) {
}
/* Make index zero-base, and also support relative index. */
static int fixIndex(int idx, unsigned int n) {
static int fixIndex(int idx, size_t n) {
if (idx > 0) return idx - 1;
if (idx == 0) return 0;
return (int)n + idx; /* negative value = relative */
@ -487,14 +487,14 @@ static void parseFloat3(float *x, float *y, float *z, const char **token) {
(*z) = parseFloat(token);
}
static unsigned int my_strnlen(const char *s, unsigned int n) {
static size_t my_strnlen(const char *s, size_t n) {
const char *p = memchr(s, 0, n);
return p ? (unsigned int)(p - s) : n;
return p ? (size_t)(p - s) : n;
}
static char *my_strdup(const char *s, unsigned int max_length) {
static char *my_strdup(const char *s, size_t max_length) {
char *d;
unsigned int len;
size_t len;
if (s == NULL) return NULL;
@ -504,15 +504,15 @@ static char *my_strdup(const char *s, unsigned int max_length) {
/* trim line ending and append '\0' */
d = (char *)TINYOBJ_MALLOC(len + 1); /* + '\0' */
memcpy(d, s, (unsigned int)(len));
memcpy(d, s, (size_t)(len));
d[len] = '\0';
return d;
}
static char *my_strndup(const char *s, unsigned int len) {
static char *my_strndup(const char *s, size_t len) {
char *d;
unsigned int slen;
size_t slen;
if (s == NULL) return NULL;
if (len == 0) return NULL;
@ -528,11 +528,11 @@ static char *my_strndup(const char *s, unsigned int len) {
return d;
}
static char *my_joinpath(const char *s, const char *t, const char delim, unsigned char max_len) {
static char *my_joinpath(const char *s, const char *t, const char delim, size_t max_len) {
char *d;
unsigned char slen;
unsigned char tlen;
unsigned char len;
size_t slen;
size_t tlen;
size_t len;
if ((s == NULL) && (t == NULL)) return NULL;
if (max_len == 0) return NULL;
@ -554,10 +554,10 @@ static char *my_joinpath(const char *s, const char *t, const char delim, unsigne
return d;
}
char *dynamic_fgets(char **buf, unsigned char *size, FILE *file) {
char *dynamic_fgets(char **buf, size_t *size, FILE *file) {
char *offset;
char *ret;
unsigned int old_size;
size_t old_size;
if (!(ret = fgets(*buf, (int)*size, file))) {
return ret;
@ -623,8 +623,8 @@ typedef struct
{
unsigned long* hashes;
hash_table_entry_t* entries;
unsigned int capacity;
unsigned int n;
size_t capacity;
size_t n;
} hash_table_t;
static unsigned long hash_djb2(const unsigned char* str)
@ -639,7 +639,7 @@ static unsigned long hash_djb2(const unsigned char* str)
return hash;
}
static void create_hash_table(unsigned int start_capacity, hash_table_t* hash_table)
static void create_hash_table(size_t start_capacity, hash_table_t* hash_table)
{
if (start_capacity < 1)
start_capacity = HASH_TABLE_DEFAULT_SIZE;
@ -659,10 +659,10 @@ static void destroy_hash_table(hash_table_t* hash_table)
static int hash_table_insert_value(unsigned long hash, long value, hash_table_t* hash_table)
{
/* Insert value */
unsigned int start_index = hash % hash_table->capacity;
unsigned int index = start_index;
size_t start_index = hash % hash_table->capacity;
size_t index = start_index;
hash_table_entry_t* start_entry = hash_table->entries + start_index;
unsigned int i;
size_t i;
hash_table_entry_t* entry;
for (i = 1; hash_table->entries[index].filled; i++)
@ -711,11 +711,11 @@ static hash_table_entry_t* hash_table_find(unsigned long hash, hash_table_t* has
return NULL;
}
static void hash_table_maybe_grow(unsigned int new_n, hash_table_t* hash_table)
static void hash_table_maybe_grow(size_t new_n, hash_table_t* hash_table)
{
unsigned int new_capacity;
size_t new_capacity;
hash_table_t new_hash_table;
unsigned char i;
size_t i;
if (new_n <= hash_table->capacity) {
return;
@ -743,7 +743,7 @@ static int hash_table_exists(const char* name, hash_table_t* hash_table)
return hash_table_find(hash_djb2((const unsigned char*)name), hash_table) != NULL;
}
static void hash_table_set(const char* name, unsigned int val, hash_table_t* hash_table)
static void hash_table_set(const char* name, size_t val, hash_table_t* hash_table)
{
/* Hash name */
unsigned long hash = hash_djb2((const unsigned char *)name);
@ -772,7 +772,7 @@ static long hash_table_get(const char* name, hash_table_t* hash_table)
}
static tinyobj_material_t *tinyobj_material_add(tinyobj_material_t *prev,
unsigned int num_materials,
size_t num_materials,
tinyobj_material_t *new_mat) {
tinyobj_material_t *dst;
dst = (tinyobj_material_t *)TINYOBJ_REALLOC(
@ -782,7 +782,7 @@ static tinyobj_material_t *tinyobj_material_add(tinyobj_material_t *prev,
return dst;
}
static int is_line_ending(const char *p, unsigned char i, unsigned char end_i) {
static int is_line_ending(const char *p, size_t i, size_t end_i) {
if (p[i] == '\0') return 1;
if (p[i] == '\n') return 1; /* this includes \r\n */
if (p[i] == '\r') {
@ -794,18 +794,18 @@ static int is_line_ending(const char *p, unsigned char i, unsigned char end_i) {
}
typedef struct {
unsigned char pos;
unsigned char len;
size_t pos;
size_t len;
} LineInfo;
/* Find '\n' and create line data. */
static int get_line_infos(const char *buf, unsigned char buf_len, LineInfo **line_infos, unsigned int *num_lines)
static int get_line_infos(const char *buf, size_t buf_len, LineInfo **line_infos, size_t *num_lines)
{
unsigned char i = 0;
unsigned char end_idx = buf_len;
unsigned char prev_pos = 0;
unsigned char line_no = 0;
unsigned char last_line_ending = 0;
size_t i = 0;
size_t end_idx = buf_len;
size_t prev_pos = 0;
size_t line_no = 0;
size_t last_line_ending = 0;
/* Count # of lines. */
for (i = 0; i < end_idx; i++) {
@ -844,19 +844,19 @@ static int get_line_infos(const char *buf, unsigned char buf_len, LineInfo **lin
}
static int tinyobj_parse_and_index_mtl_file(tinyobj_material_t **materials_out,
unsigned int *num_materials_out,
size_t *num_materials_out,
const char *mtl_filename, const char *obj_filename, file_reader_callback file_reader,
hash_table_t* material_table) {
tinyobj_material_t material;
unsigned int num_materials = 0;
size_t num_materials = 0;
tinyobj_material_t *materials = NULL;
int has_previous_material = 0;
const char *line_end = NULL;
unsigned int num_lines = 0;
size_t num_lines = 0;
LineInfo *line_infos = NULL;
unsigned char i = 0;
size_t i = 0;
char *buf = NULL;
unsigned char len = 0;
size_t len = 0;
if (materials_out == NULL) {
return TINYOBJ_ERROR_INVALID_PARAMETER;
@ -882,7 +882,7 @@ static int tinyobj_parse_and_index_mtl_file(tinyobj_material_t **materials_out,
for (i = 0; i < num_lines; i++) {
const char *p = &buf[line_infos[i].pos];
unsigned char p_len = line_infos[i].len;
size_t p_len = line_infos[i].len;
char linebuf[4096];
const char *token;
@ -924,7 +924,7 @@ static int tinyobj_parse_and_index_mtl_file(tinyobj_material_t **materials_out,
#else
sscanf(token, "%s", namebuf);
#endif
material.name = my_strdup(namebuf, (unsigned int) (line_end - token));
material.name = my_strdup(namebuf, (size_t) (line_end - token));
/* Add material to material table */
if (material_table)
@ -1025,56 +1025,56 @@ static int tinyobj_parse_and_index_mtl_file(tinyobj_material_t **materials_out,
/* ambient texture */
if ((0 == strncmp(token, "map_Ka", 6)) && IS_SPACE(token[6])) {
token += 7;
material.ambient_texname = my_strdup(token, (unsigned int) (line_end - token));
material.ambient_texname = my_strdup(token, (size_t) (line_end - token));
continue;
}
/* diffuse texture */
if ((0 == strncmp(token, "map_Kd", 6)) && IS_SPACE(token[6])) {
token += 7;
material.diffuse_texname = my_strdup(token, (unsigned int) (line_end - token));
material.diffuse_texname = my_strdup(token, (size_t) (line_end - token));
continue;
}
/* specular texture */
if ((0 == strncmp(token, "map_Ks", 6)) && IS_SPACE(token[6])) {
token += 7;
material.specular_texname = my_strdup(token, (unsigned int) (line_end - token));
material.specular_texname = my_strdup(token, (size_t) (line_end - token));
continue;
}
/* specular highlight texture */
if ((0 == strncmp(token, "map_Ns", 6)) && IS_SPACE(token[6])) {
token += 7;
material.specular_highlight_texname = my_strdup(token, (unsigned int) (line_end - token));
material.specular_highlight_texname = my_strdup(token, (size_t) (line_end - token));
continue;
}
/* bump texture */
if ((0 == strncmp(token, "map_bump", 8)) && IS_SPACE(token[8])) {
token += 9;
material.bump_texname = my_strdup(token, (unsigned int) (line_end - token));
material.bump_texname = my_strdup(token, (size_t) (line_end - token));
continue;
}
/* alpha texture */
if ((0 == strncmp(token, "map_d", 5)) && IS_SPACE(token[5])) {
token += 6;
material.alpha_texname = my_strdup(token, (unsigned int) (line_end - token));
material.alpha_texname = my_strdup(token, (size_t) (line_end - token));
continue;
}
/* bump texture */
if ((0 == strncmp(token, "bump", 4)) && IS_SPACE(token[4])) {
token += 5;
material.bump_texname = my_strdup(token, (unsigned int) (line_end - token));
material.bump_texname = my_strdup(token, (size_t) (line_end - token));
continue;
}
/* displacement texture */
if ((0 == strncmp(token, "disp", 4)) && IS_SPACE(token[4])) {
token += 5;
material.displacement_texname = my_strdup(token, (unsigned int) (line_end - token));
material.displacement_texname = my_strdup(token, (size_t) (line_end - token));
continue;
}
@ -1094,7 +1094,7 @@ static int tinyobj_parse_and_index_mtl_file(tinyobj_material_t **materials_out,
}
int tinyobj_parse_mtl_file(tinyobj_material_t **materials_out,
unsigned int *num_materials_out,
size_t *num_materials_out,
const char *mtl_filename, const char *obj_filename, file_reader_callback file_reader) {
return tinyobj_parse_and_index_mtl_file(materials_out, num_materials_out, mtl_filename, obj_filename, file_reader, NULL);
}
@ -1120,10 +1120,10 @@ typedef struct {
/* @todo { Use dynamic array } */
tinyobj_vertex_index_t f[TINYOBJ_MAX_FACES_PER_F_LINE];
unsigned int num_f;
size_t num_f;
int f_num_verts[TINYOBJ_MAX_FACES_PER_F_LINE];
unsigned int num_f_num_verts;
size_t num_f_num_verts;
const char *group_name;
unsigned int group_name_len;
@ -1143,7 +1143,7 @@ typedef struct {
CommandType type;
} Command;
static int parseLine(Command *command, const char *p, unsigned int p_len,
static int parseLine(Command *command, const char *p, size_t p_len,
int triangulate) {
char linebuf[4096];
const char *token;
@ -1205,7 +1205,7 @@ static int parseLine(Command *command, const char *p, unsigned int p_len,
/* face */
if (token[0] == 'f' && IS_SPACE((token[1]))) {
unsigned int num_f = 0;
size_t num_f = 0;
tinyobj_vertex_index_t f[TINYOBJ_MAX_FACES_PER_F_LINE];
token += 2;
@ -1222,8 +1222,8 @@ static int parseLine(Command *command, const char *p, unsigned int p_len,
command->type = COMMAND_F;
if (triangulate) {
unsigned int k;
unsigned int n = 0;
size_t k;
size_t n = 0;
tinyobj_vertex_index_t i0 = f[0];
tinyobj_vertex_index_t i1;
@ -1245,7 +1245,7 @@ static int parseLine(Command *command, const char *p, unsigned int p_len,
command->num_f_num_verts = n;
} else {
unsigned int k = 0;
size_t k = 0;
assert(num_f < TINYOBJ_MAX_FACES_PER_F_LINE);
for (k = 0; k < num_f; k++) {
command->f[k] = f[k];
@ -1266,7 +1266,7 @@ static int parseLine(Command *command, const char *p, unsigned int p_len,
skip_space(&token);
command->material_name = p + (token - linebuf);
command->material_name_len = (unsigned int)length_until_newline(
token, (p_len - (unsigned int)(token - linebuf)) + 1);
token, (p_len - (size_t)(token - linebuf)) + 1);
command->type = COMMAND_USEMTL;
return 1;
@ -1280,7 +1280,8 @@ static int parseLine(Command *command, const char *p, unsigned int p_len,
skip_space(&token);
command->mtllib_name = p + (token - linebuf);
command->mtllib_name_len = (unsigned int)length_until_newline(
token, (p_len - (unsigned int)(token - linebuf)) + 1);
token, p_len - (size_t)(token - linebuf)) +
1;
command->type = COMMAND_MTLLIB;
return 1;
@ -1293,7 +1294,7 @@ static int parseLine(Command *command, const char *p, unsigned int p_len,
command->group_name = p + (token - linebuf);
command->group_name_len = (unsigned int)length_until_newline(
token, p_len - (unsigned int)(token - linebuf)) +
token, p_len - (size_t)(token - linebuf)) +
1;
command->type = COMMAND_G;
@ -1307,7 +1308,7 @@ static int parseLine(Command *command, const char *p, unsigned int p_len,
command->object_name = p + (token - linebuf);
command->object_name_len = (unsigned int)length_until_newline(
token, p_len - (unsigned int)(token - linebuf)) +
token, p_len - (size_t)(token - linebuf)) +
1;
command->type = COMMAND_O;
@ -1348,28 +1349,28 @@ static char *get_dirname(char *path)
int tinyobj_parse_obj(tinyobj_attrib_t *attrib, tinyobj_shape_t **shapes,
unsigned int *num_shapes, tinyobj_material_t **materials_out,
unsigned int *num_materials_out, const char *obj_filename, file_reader_callback file_reader,
size_t *num_shapes, tinyobj_material_t **materials_out,
size_t *num_materials_out, const char *obj_filename, file_reader_callback file_reader,
unsigned int flags) {
LineInfo *line_infos = NULL;
Command *commands = NULL;
unsigned int num_lines = 0;
size_t num_lines = 0;
unsigned int num_v = 0;
unsigned int num_vn = 0;
unsigned int num_vt = 0;
unsigned int num_f = 0;
unsigned int num_faces = 0;
size_t num_v = 0;
size_t num_vn = 0;
size_t num_vt = 0;
size_t num_f = 0;
size_t num_faces = 0;
int mtllib_line_index = -1;
tinyobj_material_t *materials = NULL;
unsigned int num_materials = 0;
size_t num_materials = 0;
hash_table_t material_table;
char *buf = NULL;
unsigned char len = 0;
size_t len = 0;
file_reader(obj_filename, /* is_mtl */0, obj_filename, &buf, &len);
if (len < 1) return TINYOBJ_ERROR_INVALID_PARAMETER;
@ -1393,7 +1394,7 @@ int tinyobj_parse_obj(tinyobj_attrib_t *attrib, tinyobj_shape_t **shapes,
/* 2. parse each line */
{
unsigned char i = 0;
size_t i = 0;
for (i = 0; i < num_lines; i++) {
int ret = parseLine(&commands[i], &buf[line_infos[i].pos],
line_infos[i].len, flags & TINYOBJ_FLAG_TRIANGULATE);
@ -1462,13 +1463,13 @@ int tinyobj_parse_obj(tinyobj_attrib_t *attrib, tinyobj_shape_t **shapes,
/* Construct attributes */
{
unsigned char v_count = 0;
unsigned char n_count = 0;
unsigned char t_count = 0;
unsigned char f_count = 0;
unsigned char face_count = 0;
size_t v_count = 0;
size_t n_count = 0;
size_t t_count = 0;
size_t f_count = 0;
size_t face_count = 0;
int material_id = -1; /* -1 = default unknown material. */
unsigned char i = 0;
size_t i = 0;
attrib->vertices = (float *)TINYOBJ_MALLOC(sizeof(float) * num_v * 3);
attrib->num_vertices = (unsigned int)num_v;
@ -1531,7 +1532,7 @@ int tinyobj_parse_obj(tinyobj_attrib_t *attrib, tinyobj_shape_t **shapes,
attrib->texcoords[2 * t_count + 1] = commands[i].ty;
t_count++;
} else if (commands[i].type == COMMAND_F) {
unsigned char k = 0;
size_t k = 0;
for (k = 0; k < commands[i].num_f; k++) {
tinyobj_vertex_index_t vi = commands[i].f[k];
int v_idx = fixIndex(vi.v_idx, v_count);
@ -1556,9 +1557,9 @@ int tinyobj_parse_obj(tinyobj_attrib_t *attrib, tinyobj_shape_t **shapes,
/* 5. Construct shape information. */
{
unsigned int face_count = 0;
unsigned char i = 0;
unsigned char n = 0;
unsigned char shape_idx = 0;
size_t i = 0;
size_t n = 0;
size_t shape_idx = 0;
const char *shape_name = NULL;
unsigned int shape_name_len = 0;
@ -1630,7 +1631,7 @@ int tinyobj_parse_obj(tinyobj_attrib_t *attrib, tinyobj_shape_t **shapes,
}
if ((face_count - prev_face_offset) > 0) {
unsigned char length = face_count - prev_shape_face_offset;
size_t length = face_count - prev_shape_face_offset;
if (length > 0) {
(*shapes)[shape_idx].name =
my_strndup(prev_shape_name, prev_shape_name_len);
@ -1681,8 +1682,8 @@ void tinyobj_attrib_free(tinyobj_attrib_t *attrib) {
if (attrib->material_ids) TINYOBJ_FREE(attrib->material_ids);
}
void tinyobj_shapes_free(tinyobj_shape_t *shapes, unsigned char num_shapes) {
unsigned char i;
void tinyobj_shapes_free(tinyobj_shape_t *shapes, size_t num_shapes) {
size_t i;
if (shapes == NULL) return;
for (i = 0; i < num_shapes; i++) {
@ -1693,8 +1694,8 @@ void tinyobj_shapes_free(tinyobj_shape_t *shapes, unsigned char num_shapes) {
}
void tinyobj_materials_free(tinyobj_material_t *materials,
unsigned char num_materials) {
unsigned char i;
size_t num_materials) {
size_t i;
if (materials == NULL) return;
for (i = 0; i < num_materials; i++) {

View File

@ -2961,32 +2961,32 @@ static Model LoadOBJ(const char *fileName)
tinyobj_material_t *materials = NULL;
unsigned int materialCount = 0;
char *fileData = LoadFileText(fileName);
//char *fileData = LoadFileText(fileName);
if (fileData != NULL)
//if (fileData != NULL)
{
unsigned int dataSize = (unsigned int)strlen(fileData);
//unsigned int dataSize = (unsigned int)strlen(fileData);
char currentDir[1024] = { 0 };
strcpy(currentDir, GetWorkingDirectory());
chdir(GetDirectoryPath(fileName));
unsigned int flags = TINYOBJ_FLAG_TRIANGULATE;
int ret = tinyobj_parse_obj(&attrib, &meshes, &meshCount, &materials, &materialCount, fileData, dataSize, flags);
int ret = tinyobj_parse_obj(&attrib, &meshes, &meshCount, &materials, &materialCount, fileName, NULL, flags);
if (ret != TINYOBJ_SUCCESS) TRACELOG(LOG_WARNING, "MODEL: [%s] Failed to load OBJ data", fileName);
else TRACELOG(LOG_INFO, "MODEL: [%s] OBJ data loaded successfully: %i meshes / %i materials", fileName, meshCount, materialCount);
model.meshCount = materialCount;
// Init model materials array
if (materialCount > 0)
{
model.materialCount = materialCount;
model.materials = (Material *)RL_CALLOC(model.materialCount, sizeof(Material));
TraceLog(LOG_INFO, "MODEL: model has %i material meshes", materialCount);
} else {
}
else
{
model.meshCount = 1;
TraceLog(LOG_INFO, "MODEL: No materials, putting all meshes in a default material");
}
@ -2995,11 +2995,11 @@ static Model LoadOBJ(const char *fileName)
model.meshMaterial = (int *)RL_CALLOC(model.meshCount, sizeof(int));
// count the faces for each material
int* matFaces = RL_CALLOC(meshCount, sizeof(int));
int *matFaces = RL_CALLOC(meshCount, sizeof(int));
for (int mi=0; mi<meshCount; mi++)
for (int mi = 0; mi < meshCount; mi++)
{
for (int fi=0; fi<meshes[mi].length; fi++)
for (int fi = 0; fi < meshes[mi].length; fi++)
{
int idx = attrib.material_ids[meshes[mi].face_offset + fi];
if (idx == -1) idx = 0; // for no material face (which could be the whole model)
@ -3012,13 +3012,13 @@ static Model LoadOBJ(const char *fileName)
// running counts / indexes for each material mesh as we are
// building them at the same time
int* vCount = RL_CALLOC(model.meshCount, sizeof(int));
int* vtCount = RL_CALLOC(model.meshCount, sizeof(int));
int* vnCount = RL_CALLOC(model.meshCount, sizeof(int));
int* faceCount = RL_CALLOC(model.meshCount, sizeof(int));
int *vCount = RL_CALLOC(model.meshCount, sizeof(int));
int *vtCount = RL_CALLOC(model.meshCount, sizeof(int));
int *vnCount = RL_CALLOC(model.meshCount, sizeof(int));
int *faceCount = RL_CALLOC(model.meshCount, sizeof(int));
// allocate space for each of the material meshes
for (int mi=0; mi<model.meshCount; mi++)
for (int mi = 0; mi < model.meshCount; mi++)
{
model.meshes[mi].vertexCount = matFaces[mi] * 3;
model.meshes[mi].triangleCount = matFaces[mi];
@ -3034,6 +3034,7 @@ static Model LoadOBJ(const char *fileName)
{
int mm = attrib.material_ids[af]; // mesh material for this face
if (mm == -1) { mm = 0; } // no material object..
// Get indices for the face
tinyobj_vertex_index_t idx0 = attrib.faces[3 * af + 0];
tinyobj_vertex_index_t idx1 = attrib.faces[3 * af + 1];
@ -3071,9 +3072,6 @@ static Model LoadOBJ(const char *fileName)
{
// Init material to default
// NOTE: Uses default shader, which only supports MAP_DIFFUSE
// (codifies) TODO my lighting shader should support at least
// diffuse AND specular ...
model.materials[m] = LoadMaterialDefault();
model.materials[m].maps[MAP_DIFFUSE].texture = GetTextureDefault(); // Get default texture, in case no texture is defined
@ -3101,7 +3099,7 @@ static Model LoadOBJ(const char *fileName)
tinyobj_shapes_free(meshes, meshCount);
tinyobj_materials_free(materials, materialCount);
RL_FREE(fileData);
//RL_FREE(fileData);
RL_FREE(vCount);
RL_FREE(vtCount);