From f343f7effb9ed2d7aa64f07b03a49c251d3abc05 Mon Sep 17 00:00:00 2001 From: Crayon2000 Date: Thu, 28 Mar 2024 21:49:12 -0400 Subject: [PATCH] Rebase old "3D_test" branch onto master --- GRRLIB/GRRLIB/GRRLIB_3Dobj.c | 1405 ++++++++++++++++++++++++++++ GRRLIB/GRRLIB/grrlib.h | 65 ++ GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h | 12 + examples/3D_obj/Makefile | 146 +++ examples/3D_obj/data/font.png | Bin 0 -> 932 bytes examples/3D_obj/data/texture.jpg | Bin 0 -> 163281 bytes examples/3D_obj/source/main.c | 101 ++ 7 files changed, 1729 insertions(+) create mode 100644 GRRLIB/GRRLIB/GRRLIB_3Dobj.c create mode 100644 examples/3D_obj/Makefile create mode 100644 examples/3D_obj/data/font.png create mode 100644 examples/3D_obj/data/texture.jpg create mode 100644 examples/3D_obj/source/main.c diff --git a/GRRLIB/GRRLIB/GRRLIB_3Dobj.c b/GRRLIB/GRRLIB/GRRLIB_3Dobj.c new file mode 100644 index 0000000..1bcb48b --- /dev/null +++ b/GRRLIB/GRRLIB/GRRLIB_3Dobj.c @@ -0,0 +1,1405 @@ +/*------------------------------------------------------------------------------ +Copyright (c) 2012 The GRRLIB Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +------------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include + +/** + * Shortcut to access triangles values. + */ +#define T(x) model->triangles[(x)] + +/** + * Elements of a vertex. + */ +enum { X, Y, Z }; + +/** + * General purpose node. + */ +typedef struct _GRRLIB_Node { + u32 index; + bool averaged; + struct _GRRLIB_Node* next; +} GRRLIB_Node; + +/** + * Find a group in the model. + * @param model Structure that defines the model in wich the group will be searched. + * @param name Yhe name of the group to find. + * @return The group found in the model. + */ +static GRRLIB_Group* GRRLIB_FindGroup(GRRLIB_Model* model, char* name) { + GRRLIB_Group* group = model->groups; + while(group) { + if (!strcmp(name, group->name)) + break; + group = group->next; + } + return group; +} + +/** + * Add a group to the model. + * @param model Structure that defines the model to wich the group will be added. + * @param name Yhe name of the group to add. + * @return The group added to the model. + */ +static GRRLIB_Group* GRRLIB_AddGroup(GRRLIB_Model* model, char* name) { + GRRLIB_Group* group = GRRLIB_FindGroup(model, name); + if (!group) { + group = (GRRLIB_Group*)malloc(sizeof(GRRLIB_Group)); + group->name = strdup(name); + group->material = 0; + group->numtriangles = 0; + group->triangles = NULL; + group->next = model->groups; + model->groups = group; + model->numgroups++; + } + return group; +} + +/** + * Find a material in the model. + * @param model Structure that defines the model in wich to find the material. + * @param name The name of the material. + * @return The position of the material, zero if not found. + */ +u32 GRRLIB_FindMaterial(GRRLIB_Model* model, char* name) { + u32 i; + + if(model == NULL || name == NULL) + return 0; + + for (i = 0; i < model->nummaterials; i++) { + if (!strcmp(model->materials[i].name, name)) { + goto found; + } + } + + i = 0; + +found: + return i; +} + +/** + * Return the directory given a path. + * @param path Filesystem path. + * @return The directory given a path. The return value should be free'd. + */ +static char* GRRLIB_DirName(char* path) { + char* dir; + char* s; + + dir = strdup(path); + + s = strrchr(dir, '/'); + if (s) + s[1] = '\0'; + else + dir[0] = '\0'; + + return dir; +} + +/** + * Read a wavefront material library file. + * @param model Properly initialized GRRLIB_Model structure. + * @param name The name of the material library. + */ +static void GRRLIB_ReadMTL(GRRLIB_Model* model, char* name) { + FILE* file; + char* dir; + char* filename; + char buf[128]; + u32 nummaterials, i; + f32 Red, Blue, Green; + + dir = GRRLIB_DirName(model->pathname); + filename = (char*)malloc(sizeof(char) * (strlen(dir) + strlen(name) + 1)); + strcpy(filename, dir); + strcat(filename, name); + + // open the file + file = fopen(filename, "r"); + if (!file) { + exit(1); + } + free(filename); + + // count the number of materials in the file + nummaterials = 1; + while (fscanf(file, "%s", buf) != EOF) { + switch (buf[0]) { + case '#': // comment + // eat up rest of line + fgets(buf, sizeof(buf), file); + break; + case 'n': // newmtl + fgets(buf, sizeof(buf), file); + nummaterials++; + sscanf(buf, "%s %s", buf, buf); + break; + default: + // eat up rest of line + fgets(buf, sizeof(buf), file); + break; + } + } + + rewind(file); + + // allocate memory for the materials + model->materials = (GRRLIB_Material*)malloc(sizeof(GRRLIB_Material) * nummaterials); + model->nummaterials = nummaterials; + + // set the default material + for (i = 0; i < nummaterials; i++) { + model->materials[i].name = NULL; + model->materials[i].shininess = 0; + model->materials[i].diffuse[0] = 204; + model->materials[i].diffuse[1] = 204; + model->materials[i].diffuse[2] = 204; + model->materials[i].ambient[0] = 51; + model->materials[i].ambient[1] = 51; + model->materials[i].ambient[2] = 51; + model->materials[i].specular[0] = 0; + model->materials[i].specular[1] = 0; + model->materials[i].specular[2] = 0; + model->materials[i].alpha = 255; + model->materials[i].diffusetex = NULL; + model->materials[i].ambienttex = NULL; + model->materials[i].speculartex = NULL; + } + model->materials[0].name = strdup("default"); + + // now, read in the data + nummaterials = 0; + + while (fscanf(file, "%s", buf) != EOF) { + switch (buf[0]) { + case '#': // comment + // eat up rest of line + fgets(buf, sizeof(buf), file); + break; + case 'n': // newmtl + fgets(buf, sizeof(buf), file); + sscanf(buf, "%s %s", buf, buf); + nummaterials++; + model->materials[nummaterials].name = strdup(buf); + break; + case 'N': + fscanf(file, "%f", &model->materials[nummaterials].shininess); + // wavefront shininess is from [0, 1000], so scale for OpenGL + model->materials[nummaterials].shininess /= 1000.0; + model->materials[nummaterials].shininess *= 128.0; + break; + case 'm': // texture map + switch (buf[5]) { + case 'd': // the diffuse texture map + fgets(buf, sizeof(buf), file); + sscanf(buf, "%s %s", buf, buf); // Get file name + if(buf[0] != ' ') { + filename = (char*)malloc(sizeof(char) * (strlen(dir) + strlen(buf) + 1)); + strcpy(filename, dir); + strcat(filename, buf); + model->materials[nummaterials].diffusetex = GRRLIB_LoadTextureFromFile(filename); + free(filename); + } + break; + case 's': // the specular texture map + fgets(buf, sizeof(buf), file); + sscanf(buf, "%s %s", buf, buf); // Get file name + if(buf[0] != ' ') { + filename = (char*)malloc(sizeof(char) * (strlen(dir) + strlen(buf) + 1)); + strcpy(filename, dir); + strcat(filename, buf); + model->materials[nummaterials].speculartex = GRRLIB_LoadTextureFromFile(filename); + free(filename); + } + break; + case 'a': // the ambient texture map + fgets(buf, sizeof(buf), file); + sscanf(buf, "%s %s", buf, buf); // Get file name + if(buf[0] != ' ') { + filename = (char*)malloc(sizeof(char) * (strlen(dir) + strlen(buf) + 1)); + strcpy(filename, dir); + strcat(filename, buf); + model->materials[nummaterials].ambienttex = GRRLIB_LoadTextureFromFile(filename); + free(filename); + } + break; + default: + // eat up rest of line + fgets(buf, sizeof(buf), file); + break; + } + break; + case 'K': + switch (buf[1]) { + case 'd': // diffuse color of the material + fscanf(file, "%f %f %f", &Red, &Green, &Blue); + model->materials[nummaterials].diffuse[0] = (u8)(255.0f * Red + 0.5f); + model->materials[nummaterials].diffuse[1] = (u8)(255.0f * Green + 0.5f); + model->materials[nummaterials].diffuse[2] = (u8)(255.0f * Blue + 0.5f); + break; + case 's': // specular color of the material + fscanf(file, "%f %f %f", &Red, &Green, &Blue); + model->materials[nummaterials].specular[0] = (u8)(255.0f * Red + 0.5f); + model->materials[nummaterials].specular[1] = (u8)(255.0f * Green + 0.5f); + model->materials[nummaterials].specular[2] = (u8)(255.0f * Blue + 0.5f); + break; + case 'a': // ambient color of the material + fscanf(file, "%f %f %f", &Red, &Green, &Blue); + model->materials[nummaterials].ambient[0] = (u8)(255.0f * Red + 0.5f); + model->materials[nummaterials].ambient[1] = (u8)(255.0f * Green + 0.5f); + model->materials[nummaterials].ambient[2] = (u8)(255.0f * Blue + 0.5f); + break; + default: + // eat up rest of line + fgets(buf, sizeof(buf), file); + break; + } + break; + default: + // eat up rest of line + fgets(buf, sizeof(buf), file); + break; + } + } + free(dir); +} + +/** + * Compute the dot product of two vectors. + * @param u An array of 3 f32 (f32 u[3]). + * @param v An array of 3 f32 (f32 v[3]). + */ +static f32 GRRLIB_Dot(f32* u, f32* v) { + if(u == NULL || v == NULL) + return 0.0; + return u[X] * v[X] + u[Y] * v[Y] + u[Z] * v[Z]; +} + +/** + * Compute the cross product of two vectors. + * @param u An array of 3 f32 (f32 u[3]). + * @param v An array of 3 f32 (f32 v[3]). + * @param n An array of 3 f32 (f32 n[3]) to return the cross product in. + */ +static void GRRLIB_Cross(f32* u, f32* v, f32* n) { + if(u == NULL || v == NULL || n == NULL) + return; + + // compute the cross product (u x v for right-handed [ccw]) + n[X] = u[Y] * v[Z] - u[Z] * v[Y]; + n[Y] = u[Z] * v[X] - u[X] * v[Z]; + n[Z] = u[X] * v[Y] - u[Y] * v[X]; +} + +/** + * Normalize a vector. + * @param n An array of 3 f32 (f32 n[3]) to be normalized. + */ +static void GRRLIB_Normalize(f32* n) { + f32 l; + + if(n == NULL) + return; + + l = (f32)sqrt(n[X] * n[X] + n[Y] * n[Y] + n[Z] * n[Z]); + n[0] /= l; + n[1] /= l; + n[2] /= l; +} + +/** + * Returns the maximum of two floats. + * @return The maximum of two floats. +*/ +static f32 GRRLIB_Max(f32 a, f32 b) { + if (a > b) + return a; + return b; +} + +/** + * Returns the absolute value of a float. + * @return The absolute value of a float. + */ +static f32 GRRLIB_Abs(f32 f) +{ + if (f < 0) + return -f; + return f; +} + +/** + * Calculates the dimensions (width, height, depth) of a model. + * + * @param model Initialized GRRLIB_Model structure. + * @param dimensions Array of 3 f32 (f32 dimensions[3]) + */ +static void GRRLIB_Dimensions(GRRLIB_Model* model, f32* dimensions) { + u32 i; + f32 maxx, minx, maxy, miny, maxz, minz; + + if(model == NULL || model->vertices == NULL || dimensions == NULL) { + dimensions[X] = 0; + dimensions[Y] = 0; + dimensions[Z] = 0; + return; + } + + // get the max/mins + maxx = minx = model->vertices[3 + X]; + maxy = miny = model->vertices[3 + Y]; + maxz = minz = model->vertices[3 + Z]; + for (i = 1; i <= model->numvertices; i++) { + if (maxx < model->vertices[3 * i + X]) + maxx = model->vertices[3 * i + X]; + if (minx > model->vertices[3 * i + X]) + minx = model->vertices[3 * i + X]; + + if (maxy < model->vertices[3 * i + Y]) + maxy = model->vertices[3 * i + Y]; + if (miny > model->vertices[3 * i + Y]) + miny = model->vertices[3 * i + Y]; + + if (maxz < model->vertices[3 * i + Z]) + maxz = model->vertices[3 * i + Z]; + if (minz > model->vertices[3 * i + Z]) + minz = model->vertices[3 * i + Z]; + } + + // calculate model width, height, and depth + dimensions[X] = GRRLIB_Abs(maxx) + GRRLIB_Abs(minx); + dimensions[Y] = GRRLIB_Abs(maxy) + GRRLIB_Abs(miny); + dimensions[Z] = GRRLIB_Abs(maxz) + GRRLIB_Abs(minz); +} + +/** + * Second pass at a Wavefront OBJ file that gets all the data. + * + * @param model Properly initialized GRRLIB_Model structure. + * @param file File descriptor. + */ +static void GRRLIB_SecondPass(GRRLIB_Model* model, FILE* file) { + u32 numvertices; /* number of vertices in model */ + u32 numnormals; /* number of normals in model */ + u32 numtexcoords; /* number of texcoords in model */ + u32 numtriangles; /* number of triangles in model */ + f32* vertices; /* array of vertices */ + f32* normals; /* array of normals */ + f32* texcoords; /* array of texture coordinates */ + GRRLIB_Group* group; /* current group pointer */ + u32 material; /* current material */ + u32 v, n, t; + char buf[128]; + + // set the pointer shortcuts + vertices = model->vertices; + normals = model->normals; + texcoords = model->texcoords; + group = model->groups; + + /* on the second pass through the file, read all the data into the + allocated arrays */ + numvertices = numnormals = numtexcoords = 1; + numtriangles = 0; + material = 0; + while(fscanf(file, "%s", buf) != EOF) { + switch(buf[0]) { + case '#': /* comment */ + /* eat up rest of line */ + fgets(buf, sizeof(buf), file); + break; + case 'v': /* v, vn, vt */ + switch(buf[1]) { + case '\0': /* vertex */ + fscanf(file, "%f %f %f", + &vertices[3 * numvertices + X], + &vertices[3 * numvertices + Y], + &vertices[3 * numvertices + Z]); + numvertices++; + break; + case 'n': /* normal */ + fscanf(file, "%f %f %f", + &normals[3 * numnormals + X], + &normals[3 * numnormals + Y], + &normals[3 * numnormals + Z]); + numnormals++; + break; + case 't': /* texcoord */ + fscanf(file, "%f %f", + &texcoords[2 * numtexcoords + X], + &texcoords[2 * numtexcoords + Y]); + numtexcoords++; + break; + } + break; + case 'u': /* usemtl */ + fgets(buf, sizeof(buf), file); + sscanf(buf, "%s %s", buf, buf); + group->material = material = GRRLIB_FindMaterial(model, buf); + break; + case 'g': /* group */ + /* eat up rest of line */ + fgets(buf, sizeof(buf), file); + sscanf(buf, "%s", buf); + group = GRRLIB_AddGroup(model, buf); + group->material = material; + break; + case 'f': /* face */ + v = n = t = 0; + fscanf(file, "%s", buf); + // can be one of %d, %d//%d, %d/%d, %d/%d/%d %d//%d + if (strstr(buf, "//")) { + // v//n + sscanf(buf, "%d//%d", &v, &n); + T(numtriangles).vindices[0] = v; + T(numtriangles).nindices[0] = n; + fscanf(file, "%d//%d", &v, &n); + T(numtriangles).vindices[1] = v; + T(numtriangles).nindices[1] = n; + fscanf(file, "%d//%d", &v, &n); + T(numtriangles).vindices[2] = v; + T(numtriangles).nindices[2] = n; + group->triangles[group->numtriangles++] = numtriangles; + numtriangles++; + while(fscanf(file, "%d//%d", &v, &n) > 0) { + T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0]; + T(numtriangles).nindices[0] = T(numtriangles-1).nindices[0]; + T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2]; + T(numtriangles).nindices[1] = T(numtriangles-1).nindices[2]; + T(numtriangles).vindices[2] = v; + T(numtriangles).nindices[2] = n; + group->triangles[group->numtriangles++] = numtriangles; + numtriangles++; + } + } else if (sscanf(buf, "%d/%d/%d", &v, &t, &n) == 3) { + // v/t/n + T(numtriangles).vindices[0] = v; + T(numtriangles).tindices[0] = t; + T(numtriangles).nindices[0] = n; + fscanf(file, "%d/%d/%d", &v, &t, &n); + T(numtriangles).vindices[1] = v; + T(numtriangles).tindices[1] = t; + T(numtriangles).nindices[1] = n; + fscanf(file, "%d/%d/%d", &v, &t, &n); + T(numtriangles).vindices[2] = v; + T(numtriangles).tindices[2] = t; + T(numtriangles).nindices[2] = n; + group->triangles[group->numtriangles++] = numtriangles; + numtriangles++; + while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0) { + T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0]; + T(numtriangles).tindices[0] = T(numtriangles-1).tindices[0]; + T(numtriangles).nindices[0] = T(numtriangles-1).nindices[0]; + T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2]; + T(numtriangles).tindices[1] = T(numtriangles-1).tindices[2]; + T(numtriangles).nindices[1] = T(numtriangles-1).nindices[2]; + T(numtriangles).vindices[2] = v; + T(numtriangles).tindices[2] = t; + T(numtriangles).nindices[2] = n; + group->triangles[group->numtriangles++] = numtriangles; + numtriangles++; + } + } else if (sscanf(buf, "%d/%d", &v, &t) == 2) { + // v/t + T(numtriangles).vindices[0] = v; + T(numtriangles).tindices[0] = t; + fscanf(file, "%d/%d", &v, &t); + T(numtriangles).vindices[1] = v; + T(numtriangles).tindices[1] = t; + fscanf(file, "%d/%d", &v, &t); + T(numtriangles).vindices[2] = v; + T(numtriangles).tindices[2] = t; + group->triangles[group->numtriangles++] = numtriangles; + numtriangles++; + while(fscanf(file, "%d/%d", &v, &t) > 0) { + T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0]; + T(numtriangles).tindices[0] = T(numtriangles-1).tindices[0]; + T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2]; + T(numtriangles).tindices[1] = T(numtriangles-1).tindices[2]; + T(numtriangles).vindices[2] = v; + T(numtriangles).tindices[2] = t; + group->triangles[group->numtriangles++] = numtriangles; + numtriangles++; + } + } else { + // v + sscanf(buf, "%d", &v); + T(numtriangles).vindices[0] = v; + fscanf(file, "%d", &v); + T(numtriangles).vindices[1] = v; + fscanf(file, "%d", &v); + T(numtriangles).vindices[2] = v; + group->triangles[group->numtriangles++] = numtriangles; + numtriangles++; + while(fscanf(file, "%d", &v) > 0) { + T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0]; + T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2]; + T(numtriangles).vindices[2] = v; + group->triangles[group->numtriangles++] = numtriangles; + numtriangles++; + } + } + break; + default: + /* eat up rest of line */ + fgets(buf, sizeof(buf), file); + break; + } + } +} + +/** + * First pass at a Wavefront OBJ file that gets all the + * statistics of the model (such as #vertices, #normals, etc). + * + * @param model Properly initialized GRRLIB_Model structure. + * @param file File descriptor. + */ +static void GRRLIB_FirstPass(GRRLIB_Model* model, FILE* file) { + u32 numvertices; /* number of vertices in model */ + u32 numnormals; /* number of normals in model */ + u32 numtexcoords; /* number of texcoords in model */ + u32 numtriangles; /* number of triangles in model */ + GRRLIB_Group* group; /* current group */ + unsigned v, n, t; + char buf[128]; + + // make a default group + group = GRRLIB_AddGroup(model, "default"); + + numvertices = numnormals = numtexcoords = numtriangles = 0; + + while(fscanf(file, "%s", buf) != EOF) { + switch(buf[0]) { + case '#': /* comment */ + fgets(buf, sizeof(buf), file); + break; + case 'v': /* v, vn, vt */ + switch(buf[1]) { + case '\0': /* vertex */ + fgets(buf, sizeof(buf), file); + numvertices++; + break; + case 'n': /* normal */ + fgets(buf, sizeof(buf), file); + numnormals++; + break; + case 't': /* texcoord */ + fgets(buf, sizeof(buf), file); + numtexcoords++; + break; + default: + exit(1); + } + break; + case 'm': + fgets(buf, sizeof(buf), file); + sscanf(buf, "%s %s", buf, buf); + model->mtllibname = strdup(buf); + GRRLIB_ReadMTL(model, buf); + break; + case 'u': /* usemtl */ + fgets(buf, sizeof(buf), file); + break; + case 'g': /* group */ + fgets(buf, sizeof(buf), file); + sscanf(buf, "%s", buf); + group = GRRLIB_AddGroup(model, buf); + break; + case 'f': /* face */ + v = n = t = 0; + fscanf(file, "%s", buf); + /* can be one of %d, %d//%d, %d/%d, %d/%d/%d %d//%d */ + if (strstr(buf, "//")) { + /* v//n */ + sscanf(buf, "%d//%d", &v, &n); + fscanf(file, "%d//%d", &v, &n); + fscanf(file, "%d//%d", &v, &n); + numtriangles++; + group->numtriangles++; + while(fscanf(file, "%d//%d", &v, &n) > 0) { + numtriangles++; + group->numtriangles++; + } + } + else if (sscanf(buf, "%d/%d/%d", &v, &t, &n) == 3) { + /* v/t/n */ + fscanf(file, "%d/%d/%d", &v, &t, &n); + fscanf(file, "%d/%d/%d", &v, &t, &n); + numtriangles++; + group->numtriangles++; + while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0) { + numtriangles++; + group->numtriangles++; + } + } + else if (sscanf(buf, "%d/%d", &v, &t) == 2) { + /* v/t */ + fscanf(file, "%d/%d", &v, &t); + fscanf(file, "%d/%d", &v, &t); + numtriangles++; + group->numtriangles++; + while(fscanf(file, "%d/%d", &v, &t) > 0) { + numtriangles++; + group->numtriangles++; + } + } + else { + /* v */ + fscanf(file, "%d", &v); + fscanf(file, "%d", &v); + numtriangles++; + group->numtriangles++; + while(fscanf(file, "%d", &v) > 0) { + numtriangles++; + group->numtriangles++; + } + } + break; + default: + fgets(buf, sizeof(buf), file); + break; + } + } + + model->numvertices = numvertices; + model->numnormals = numnormals; + model->numtexcoords = numtexcoords; + model->numtriangles = numtriangles; + + // allocate memory for the triangles in each group + group = model->groups; + while(group) { + group->triangles = (u32*)malloc(sizeof(u32) * group->numtriangles); + group->numtriangles = 0; + group = group->next; + } +} + +/** + * Reads a model description from a Wavefront .OBJ file. + * @param filename Name of the file containing the Wavefront .OBJ format data. + * @return Returns a pointer to the created object which should be free'd with GRRLIB_DeleteObj. + */ +GRRLIB_Model* GRRLIB_ReadOBJ(char* filename) { + GRRLIB_Model* model; + FILE* file; + + file = fopen(filename, "r"); + if (!file) { + exit(1); + } + + model = (GRRLIB_Model*)malloc(sizeof(GRRLIB_Model)); + model->pathname = strdup(filename); + model->mtllibname = NULL; + model->numvertices = 0; + model->vertices = NULL; + model->numnormals = 0; + model->normals = NULL; + model->numtexcoords = 0; + model->texcoords = NULL; + model->numfacetnorms = 0; + model->facetnorms = NULL; + model->numtriangles = 0; + model->triangles = NULL; + model->nummaterials = 0; + model->materials = NULL; + model->numgroups = 0; + model->groups = NULL; + model->position.x = 0.0; + model->position.y = 0.0; + model->position.z = 0.0; + + // Get a count of the number of stuff + GRRLIB_FirstPass(model, file); + + // allocate memory + model->vertices = (f32*)malloc(sizeof(f32) * 3 * (model->numvertices + 1)); + model->triangles = (GRRLIB_Triangle*)malloc(sizeof(GRRLIB_Triangle) * model->numtriangles); + if (model->numnormals) { + model->normals = (f32*)malloc(sizeof(f32) * 3 * (model->numnormals + 1)); + } + if (model->numtexcoords) { + model->texcoords = (f32*)malloc(sizeof(f32) * 2 * (model->numtexcoords + 1)); + } + + rewind(file); + + GRRLIB_SecondPass(model, file); + + fclose(file); + + return model; +} + +/** + * Deletes a GRRLIB_Material structure. + * @param material Initialized GRRLIB_Material structure. + */ +static void GRRLIB_DeleteMaterial(GRRLIB_Material* material) { + free(material->name); + GRRLIB_FreeTexture(material->diffusetex); + GRRLIB_FreeTexture(material->ambienttex); + GRRLIB_FreeTexture(material->speculartex); +} + +/** + * Deletes a GRRLIB_Model structure. + * @param model Initialized GRRLIB_Model structure. + */ +void GRRLIB_DeleteObj(GRRLIB_Model* model) { + GRRLIB_Group* group; + u32 i; + + if (model->pathname) free(model->pathname); + if (model->mtllibname) free(model->mtllibname); + if (model->vertices) free(model->vertices); + if (model->normals) free(model->normals); + if (model->texcoords) free(model->texcoords); + if (model->facetnorms) free(model->facetnorms); + if (model->triangles) free(model->triangles); + if (model->materials) { + for (i = 0; i < model->nummaterials; i++) { + GRRLIB_DeleteMaterial(&model->materials[i]); + } + } + free(model->materials); + while(model->groups) { + group = model->groups; + model->groups = model->groups->next; + free(group->name); + free(group->triangles); + free(group); + } + + free(model); +} + +/** + * Draw a 3D object. + * @param model Structure that defines the model to draw. + */ +void GRRLIB_Draw3dObj(GRRLIB_Model* model) { + GRRLIB_Group* group; + GRRLIB_texImg* tex; + int i; + + if(model == NULL) { + return; + } + + group = model->groups; + while (group) { + u32 Color = RGBA(model->materials[group->material].diffuse[0], + model->materials[group->material].diffuse[1], + model->materials[group->material].diffuse[2], + 0xFF); + + tex = model->materials[group->material].diffusetex; + + GX_ClearVtxDesc(); + + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + if(model->numnormals) + GX_SetVtxDesc(GX_VA_NRM, GX_DIRECT); + GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); + if(model->numtexcoords && tex) + GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); + + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + if(model->numnormals) + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0); + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); + if(model->numtexcoords && tex) + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + + if(model->numtexcoords && tex) { + GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); + GRRLIB_SetTexture(tex, 0); + } + else { + GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + } + + GX_Begin(GX_TRIANGLES, GX_VTXFMT0, group->numtriangles*3); + for (i = 0; i < group->numtriangles; i++) { + GX_Position3f32(model->vertices[3 * T(group->triangles[i]).vindices[0] + X], + model->vertices[3 * T(group->triangles[i]).vindices[0] + Y], + model->vertices[3 * T(group->triangles[i]).vindices[0] + Z]); + if(model->numnormals) { + GX_Normal3f32(model->normals[3 * T(group->triangles[i]).nindices[0] + X], + model->normals[3 * T(group->triangles[i]).nindices[0] + Y], + model->normals[3 * T(group->triangles[i]).nindices[0] + Z]); + } + GX_Color1u32(Color); + if(model->numtexcoords && tex) { + GX_TexCoord2f32(model->texcoords[2*T(group->triangles[i]).tindices[0] + X], + model->texcoords[2*T(group->triangles[i]).tindices[0] + Y]); + } + + + GX_Position3f32(model->vertices[3 * T(group->triangles[i]).vindices[1] + X], + model->vertices[3 * T(group->triangles[i]).vindices[1] + Y], + model->vertices[3 * T(group->triangles[i]).vindices[1] + Z]); + if(model->numnormals) { + GX_Normal3f32(model->normals[3 * T(group->triangles[i]).nindices[1] + X], + model->normals[3 * T(group->triangles[i]).nindices[1] + Y], + model->normals[3 * T(group->triangles[i]).nindices[1] + Z]); + } + GX_Color1u32(Color); + if(model->numtexcoords && tex) { + GX_TexCoord2f32(model->texcoords[2*T(group->triangles[i]).tindices[1] + X], + model->texcoords[2*T(group->triangles[i]).tindices[1] + Y]); + } + + + GX_Position3f32(model->vertices[3 * T(group->triangles[i]).vindices[2] + X], + model->vertices[3 * T(group->triangles[i]).vindices[2] + Y], + model->vertices[3 * T(group->triangles[i]).vindices[2] + Z]); + if(model->numnormals) { + GX_Normal3f32(model->normals[3 * T(group->triangles[i]).nindices[2] + X], + model->normals[3 * T(group->triangles[i]).nindices[2] + Y], + model->normals[3 * T(group->triangles[i]).nindices[2] + Z]); + } + GX_Color1u32(Color); + if(model->numtexcoords && tex) { + GX_TexCoord2f32(model->texcoords[2*T(group->triangles[i]).tindices[2] + X], + model->texcoords[2*T(group->triangles[i]).tindices[2] + Y]); + } + } + GX_End(); + group = group->next; + } +} + +/** + * Generates smooth vertex normals for a model. + * First builds a list of all the triangles each vertex is in. Then + * loops through each vertex in the the list averaging all the facet + * normals of the triangles each vertex is in. Finally, sets the + * normal index in the triangle for the vertex to the generated smooth + * normal. If the dot product of a facet normal and the facet normal + * associated with the first triangle in the list of triangles the + * current vertex is in is greater than the cosine of the angle + * parameter to the function, that facet normal is not added into the + * average normal calculation and the corresponding vertex is given + * the facet normal. This tends to preserve hard edges. The angle to + * use depends on the model, but 90 degrees is usually a good start. + * + * @param model Initialized GRRLIB_Model structure. + * @param angle Maximum angle (in degrees) to smooth across. + */ +void GRRLIB_VertexNormals(GRRLIB_Model* model, f32 angle) { + GRRLIB_Node* node; + GRRLIB_Node* tail; + GRRLIB_Node** members; + f32* normals; + u32 numnormals; + f32 average[3]; + f32 dot, cos_angle; + u32 i, avg; + + if(model == NULL || model->facetnorms == NULL) + return; + + // calculate the cosine of the angle (in degrees) + cos_angle = cos(angle * M_PI / 180.0); + + // nuke any previous normals + if (model->normals) + free(model->normals); + + // allocate space for new normals + model->numnormals = model->numtriangles * 3; /* 3 normals per triangle */ + model->normals = (f32*)malloc(sizeof(f32)* 3* (model->numnormals+1)); + + // allocate a structure that will hold a linked list of triangle indices for each vertex + members = (GRRLIB_Node**)malloc(sizeof(GRRLIB_Node*) * (model->numvertices + 1)); + for (i = 1; i <= model->numvertices; i++) { + members[i] = NULL; + } + + // for every triangle, create a node for each vertex in it + for (i = 0; i < model->numtriangles; i++) { + node = (GRRLIB_Node*)malloc(sizeof(GRRLIB_Node)); + node->index = i; + node->next = members[T(i).vindices[0]]; + members[T(i).vindices[0]] = node; + + node = (GRRLIB_Node*)malloc(sizeof(GRRLIB_Node)); + node->index = i; + node->next = members[T(i).vindices[1]]; + members[T(i).vindices[1]] = node; + + node = (GRRLIB_Node*)malloc(sizeof(GRRLIB_Node)); + node->index = i; + node->next = members[T(i).vindices[2]]; + members[T(i).vindices[2]] = node; + } + + // calculate the average normal for each vertex + numnormals = 1; + for (i = 1; i <= model->numvertices; i++) { + // calculate an average normal for this vertex by averaging the + // facet normal of every triangle this vertex is in + node = members[i]; + + average[0] = 0.0; average[1] = 0.0; average[2] = 0.0; + avg = 0; + while (node) { + /* only average if the dot product of the angle between the two + facet normals is greater than the cosine of the threshold + angle -- or, said another way, the angle between the two + facet normals is less than (or equal to) the threshold angle */ + dot = GRRLIB_Dot(&model->facetnorms[3 * T(node->index).findex], + &model->facetnorms[3 * T(members[i]->index).findex]); + if (dot > cos_angle) { + node->averaged = true; + average[0] += model->facetnorms[3 * T(node->index).findex + 0]; + average[1] += model->facetnorms[3 * T(node->index).findex + 1]; + average[2] += model->facetnorms[3 * T(node->index).findex + 2]; + avg = 1; // we averaged at least one normal! + } + else { + node->averaged = false; + } + node = node->next; + } + + if (avg) { + // normalize the averaged normal + GRRLIB_Normalize(average); + + // add the normal to the vertex normals list + model->normals[3 * numnormals + 0] = average[0]; + model->normals[3 * numnormals + 1] = average[1]; + model->normals[3 * numnormals + 2] = average[2]; + avg = numnormals; + numnormals++; + } + + // set the normal of this vertex in each triangle it is in + node = members[i]; + while (node) { + if (node->averaged) { + // if this node was averaged, use the average normal + if (T(node->index).vindices[0] == i) + T(node->index).nindices[0] = avg; + else if (T(node->index).vindices[1] == i) + T(node->index).nindices[1] = avg; + else if (T(node->index).vindices[2] == i) + T(node->index).nindices[2] = avg; + } + else { + // if this node wasn't averaged, use the facet normal + model->normals[3 * numnormals + 0] = + model->facetnorms[3 * T(node->index).findex + 0]; + model->normals[3 * numnormals + 1] = + model->facetnorms[3 * T(node->index).findex + 1]; + model->normals[3 * numnormals + 2] = + model->facetnorms[3 * T(node->index).findex + 2]; + if (T(node->index).vindices[0] == i) + T(node->index).nindices[0] = numnormals; + else if (T(node->index).vindices[1] == i) + T(node->index).nindices[1] = numnormals; + else if (T(node->index).vindices[2] == i) + T(node->index).nindices[2] = numnormals; + numnormals++; + } + node = node->next; + } + } + + model->numnormals = numnormals - 1; + + // free the member information + for (i = 1; i <= model->numvertices; i++) { + node = members[i]; + while (node) { + tail = node; + node = node->next; + free(tail); + } + } + free(members); + + /* pack the normals array (we previously allocated the maximum + number of normals that could possibly be created (numtriangles * + 3), so get rid of some of them (usually alot unless none of the + facet normals were averaged)) */ + normals = model->normals; + model->normals = (f32*)malloc(sizeof(f32)* 3* (model->numnormals+1)); + for (i = 1; i <= model->numnormals; i++) { + model->normals[3 * i + 0] = normals[3 * i + 0]; + model->normals[3 * i + 1] = normals[3 * i + 1]; + model->normals[3 * i + 2] = normals[3 * i + 2]; + } + free(normals); +} + +/** + * Generates facet normals for a model (by taking the + * cross product of the two vectors derived from the sides of each + * triangle). Assumes a counter-clockwise winding. + * + * @param model Initialized GRRLIB_Model structure. + */ +void GRRLIB_FacetNormals(GRRLIB_Model* model) { + u32 i; + f32 u[3]; + f32 v[3]; + + if(model == NULL || model->vertices == NULL) + return; + + // clobber any old facetnormals + if (model->facetnorms) + free(model->facetnorms); + + // allocate memory for the new facet normals + model->numfacetnorms = model->numtriangles; + model->facetnorms = (f32*)malloc(sizeof(f32) * 3 * (model->numfacetnorms + 1)); + + for (i = 0; i < model->numtriangles; i++) { + model->triangles[i].findex = i+1; + + u[X] = model->vertices[3 * T(i).vindices[1] + X] - + model->vertices[3 * T(i).vindices[0] + X]; + u[Y] = model->vertices[3 * T(i).vindices[1] + Y] - + model->vertices[3 * T(i).vindices[0] + Y]; + u[Z] = model->vertices[3 * T(i).vindices[1] + Z] - + model->vertices[3 * T(i).vindices[0] + Z]; + + v[X] = model->vertices[3 * T(i).vindices[2] + X] - + model->vertices[3 * T(i).vindices[0] + X]; + v[Y] = model->vertices[3 * T(i).vindices[2] + Y] - + model->vertices[3 * T(i).vindices[0] + Y]; + v[Z] = model->vertices[3 * T(i).vindices[2] + Z] - + model->vertices[3 * T(i).vindices[0] + Z]; + + GRRLIB_Cross(u, v, &model->facetnorms[3 * (i+1)]); + GRRLIB_Normalize(&model->facetnorms[3 * (i+1)]); + } +} + +/** + * Generates texture coordinates according to a + * linear projection of the texture map. It generates these by + * linearly mapping the vertices onto a square. + * + * @param model Pointer to initialized GRRLIB_Model structure. + */ +void GRRLIB_LinearTexture(GRRLIB_Model* model) { + GRRLIB_Group *group; + f32 dimensions[3]; + f32 x, y, scalefactor; + u32 i; + + if(model == NULL) + return; + + if(model->texcoords) + free(model->texcoords); + model->numtexcoords = model->numvertices; + model->texcoords=(f32*)malloc(sizeof(f32)*2*(model->numtexcoords+1)); + + GRRLIB_Dimensions(model, dimensions); + scalefactor = 2.0 / GRRLIB_Abs(GRRLIB_Max(GRRLIB_Max(dimensions[0], dimensions[1]), dimensions[2])); + + // do the calculations + for(i = 1; i <= model->numvertices; i++) { + x = model->vertices[3 * i + 0] * scalefactor; + y = model->vertices[3 * i + 2] * scalefactor; + model->texcoords[2 * i + 0] = (x + 1.0) / 2.0; + model->texcoords[2 * i + 1] = (y + 1.0) / 2.0; + } + + // go through and put texture coordinate indices in all the triangles + group = model->groups; + while(group) { + for(i = 0; i < group->numtriangles; i++) { + T(group->triangles[i]).tindices[0] = T(group->triangles[i]).vindices[0]; + T(group->triangles[i]).tindices[1] = T(group->triangles[i]).vindices[1]; + T(group->triangles[i]).tindices[2] = T(group->triangles[i]).vindices[2]; + } + group = group->next; + } +} + +/** + * Generates texture coordinates according to a + * spherical projection of the texture map. Sometimes referred to as + * spheremap, or reflection map texture coordinates. It generates + * these by using the normal to calculate where that vertex would map + * onto a sphere. Since it is impossible to map something flat + * perfectly onto something spherical, there is distortion at the + * poles. This particular implementation causes the poles along the X + * axis to be distorted. + * + * @param model Pointer to initialized GRRLIB_Model structure. + */ +void GRRLIB_SpheremapTexture(GRRLIB_Model* model) { + GRRLIB_Group* group; + f32 theta, phi, rho, x, y, z, r; + u32 i; + + if(model == NULL || model->normals == NULL) + return; + + if (model->texcoords) + free(model->texcoords); + model->numtexcoords = model->numnormals; + model->texcoords=(f32*)malloc(sizeof(f32)*2*(model->numtexcoords+1)); + + // do the calculations + for (i = 1; i <= model->numnormals; i++) { + z = model->normals[3 * i + 0]; /* re-arrange for pole distortion */ + y = model->normals[3 * i + 1]; + x = model->normals[3 * i + 2]; + r = sqrt((x * x) + (y * y)); + rho = sqrt((r * r) + (z * z)); + + if(r == 0.0) { + theta = 0.0; + phi = 0.0; + } + else { + if(z == 0.0) + phi = M_PI / 2.0; + else + phi = acos(z / rho); + + if(y == 0.0) + theta = M_PI / 2.0; /* acos(x / r); */ + else + theta = asin(y / r) + (M_PI / 2.0); + } + + model->texcoords[2 * i + 0] = theta / M_PI; + model->texcoords[2 * i + 1] = phi / M_PI; + } + + // go through and put texcoord indices in all the triangles + group = model->groups; + while(group) { + for (i = 0; i < group->numtriangles; i++) { + T(group->triangles[i]).tindices[0] = T(group->triangles[i]).nindices[0]; + T(group->triangles[i]).tindices[1] = T(group->triangles[i]).nindices[1]; + T(group->triangles[i]).tindices[2] = T(group->triangles[i]).nindices[2]; + } + group = group->next; + } +} + + + + + + + + +static void GRRLIB_FirstPassMem(GRRLIB_Model* model, const char *buffer, u32 size) { + u32 numvertices; /* number of vertices in model */ + u32 numnormals; /* number of normals in model */ + u32 numtexcoords; /* number of texcoords in model */ + u32 numtriangles; /* number of triangles in model */ + GRRLIB_Group* group; /* current group */ + unsigned v, n, t; + char buf[128]; + int ss; +/* + char *buffer; + buffer = (char*)malloc(sizeof(char) * size); + memcpy(buffer, buffer_o, size); +*/ + // make a default group + group = GRRLIB_AddGroup(model, "default"); + + numvertices = numnormals = numtexcoords = numtriangles = 0; + + while((ss = sscanf(buffer, "%s", buf)) != EOF) { + buffer += (ss + 1); + switch(buf[0]) { + case '#': /* comment */ + buffer = strchr(buffer, '\n') + 1; + break; + case 'v': /* v, vn, vt */ + switch(buf[1]) { + case '\0': /* vertex */ + numvertices++; + break; + case 'n': /* normal */ + numnormals++; + break; + case 't': /* texcoord */ + numtexcoords++; + break; + default: + exit(1); + } + buffer = strchr(buffer, '\n') + 1; + break; + case 'm': + buffer = strchr(buffer, '\n') + 1; + sscanf(buf, "%s %s", buf, buf); + model->mtllibname = strdup(buf); + //GRRLIB_ReadMTL(model, buf); + break; + case 'u': + buffer = strchr(buffer, '\n') + 1; + break; + case 'g': /* group */ + buffer = strchr(buffer, '\n') + 1; + sscanf(buf, "%s", buf); + group = GRRLIB_AddGroup(model, buf); + break; + case 'f': /* face */ + v = n = t = 0; + sscanf(buffer, "%s", buf); + /* can be one of %d, %d//%d, %d/%d, %d/%d/%d %d//%d */ + if (strstr(buf, "//")) { + /* v//n */ + sscanf(buf, "%d//%d", &v, &n); + buffer = strchr(buffer, 32) + 1; + sscanf(buffer, "%d//%d", &v, &n); + buffer = strchr(buffer, 32) + 1; + sscanf(buffer, "%d//%d", &v, &n); + buffer = strchr(buffer, 32); + numtriangles++; + group->numtriangles++; + while(sscanf(buffer, "%d//%d", &v, &n) > 0) { + buffer = strchr(buffer, 32) + 1; + numtriangles++; + group->numtriangles++; + } + } + else if (sscanf(buf, "%d/%d/%d", &v, &t, &n) == 3) { + /* v/t/n */ + sscanf(buffer, "%d/%d/%d", &v, &t, &n); + sscanf(buffer, "%d/%d/%d", &v, &t, &n); + numtriangles++; + group->numtriangles++; + while(sscanf(buffer, "%d/%d/%d", &v, &t, &n) > 0) { + numtriangles++; + group->numtriangles++; + } + } + else if (sscanf(buf, "%d/%d", &v, &t) == 2) { + /* v/t */ + sscanf(buffer, "%d/%d", &v, &t); + sscanf(buffer, "%d/%d", &v, &t); + numtriangles++; + group->numtriangles++; + while(sscanf(buffer, "%d/%d", &v, &t) > 0) { + numtriangles++; + group->numtriangles++; + } + } + else { + /* v */ + sscanf(buffer, "%d", &v); + sscanf(buffer, "%d", &v); + numtriangles++; + group->numtriangles++; + while(sscanf(buffer, "%d", &v) > 0) { + numtriangles++; + group->numtriangles++; + } + } + break; + default: + buffer = strchr(buffer, '\n') + 1; + break; + } + if(*buffer == '\n') { + buffer++; + } + } + + model->numvertices = numvertices; + model->numnormals = numnormals; + model->numtexcoords = numtexcoords; + model->numtriangles = numtriangles; + + // allocate memory for the triangles in each group + group = model->groups; + while(group) { + group->triangles = (u32*)malloc(sizeof(u32) * group->numtriangles); + group->numtriangles = 0; + group = group->next; + } +} + +GRRLIB_Model* GRRLIB_ReadOBJMem(const char *buffer, u32 size) { + GRRLIB_Model* model; + + model = (GRRLIB_Model*)malloc(sizeof(GRRLIB_Model)); + model->pathname = "MEMORY"; + model->mtllibname = NULL; + model->numvertices = 0; + model->vertices = NULL; + model->numnormals = 0; + model->normals = NULL; + model->numtexcoords = 0; + model->texcoords = NULL; + model->numfacetnorms = 0; + model->facetnorms = NULL; + model->numtriangles = 0; + model->triangles = NULL; + model->nummaterials = 0; + model->materials = NULL; + model->numgroups = 0; + model->groups = NULL; + model->position.x = 0.0; + model->position.y = 0.0; + model->position.z = 0.0; + + // Get a count of the number of stuff + GRRLIB_FirstPassMem(model, buffer, size); + + // allocate memory + model->vertices = (f32*)malloc(sizeof(f32) * 3 * (model->numvertices + 1)); + model->triangles = (GRRLIB_Triangle*)malloc(sizeof(GRRLIB_Triangle) * model->numtriangles); + if (model->numnormals) { + model->normals = (f32*)malloc(sizeof(f32) * 3 * (model->numnormals + 1)); + } + if (model->numtexcoords) { + model->texcoords = (f32*)malloc(sizeof(f32) * 2 * (model->numtexcoords + 1)); + } + + //GRRLIB_SecondPassMem(model, buffer, size); + + return model; +} \ No newline at end of file diff --git a/GRRLIB/GRRLIB/grrlib.h b/GRRLIB/GRRLIB/grrlib.h index a2b30e8..249eb1f 100644 --- a/GRRLIB/GRRLIB/grrlib.h +++ b/GRRLIB/GRRLIB/grrlib.h @@ -161,6 +161,71 @@ typedef struct GRRLIB_Font { bool kerning; /**< true whenever a face object contains kerning data that can be accessed with FT_Get_Kerning. */ } GRRLIB_ttfFont; +//------------------------------------------------------------------------------ +/** + * Structure that defines a material in a model. + */ +typedef struct _GRRLIB_Material { + char* name; /**< Name of material (newmtl).*/ + u8 diffuse[3]; /**< Diffuse component (Kd). */ + u8 ambient[3]; /**< Ambient component (Ka). */ + u8 specular[3]; /**< Specular component (Ks). */ + u8 alpha; /**< Transparency of the material (d or Tr). */ + GRRLIB_texImg* diffusetex; /**< Diffuse texture map (map_Kd). */ + GRRLIB_texImg* ambienttex; /**< Ambient texture map (map_Ka). */ + GRRLIB_texImg* speculartex; /**< Specular texture map (map_Ks). */ + f32 shininess; /**< Specular exponent (Ns).*/ +} GRRLIB_Material; +/** + * Structure that defines a group in a model. + */ +typedef struct _GRRLIB_Group { + char* name; /**< Name of this group. */ + u32 numtriangles; /**< Number of triangles in this group. */ + u32* triangles; /**< Array of triangle indices. */ + u32 material; /**< Index to material for group. */ + struct _GRRLIB_Group* next; /**< Pointer to next group in model. */ +} GRRLIB_Group; +/** + * Structure that defines a triangle in a model. + */ +typedef struct { + u32 vindices[3]; /**< Array of triangle vertex indices. */ + u32 nindices[3]; /**< Array of triangle normal indices. */ + u32 tindices[3]; /**< Array of triangle texcoord indices.*/ + u32 findex; /**< Index of triangle facet normal. */ +} GRRLIB_Triangle; +/** + * Structure that defines a model. + */ +typedef struct { + char* pathname; /**< Path to this model. */ + char* mtllibname; /**< Name of the material library. */ + + u32 numvertices; /**< Number of vertices in model. */ + f32* vertices; /**< Array of vertices. */ + + u32 numnormals; /**< Number of normals in model. */ + f32* normals; /**< Array of normals. */ + + u32 numtexcoords; /**< Number of texcoords in model. */ + f32* texcoords; /**< Array of texture coordinates. */ + + u32 numfacetnorms; /**< Number of facetnorms in model. */ + f32* facetnorms; /**< Array of facetnorms. */ + + u32 numtriangles; /**< Number of triangles in model. */ + GRRLIB_Triangle* triangles; /**< Array of triangles. */ + + u32 nummaterials; /**< Number of materials in model. */ + GRRLIB_Material* materials; /**< Array of materials. */ + + u32 numgroups; /**< Number of groups in model. */ + GRRLIB_Group* groups; /**< Linked list of groups. */ + + guVector position; /**< Position of the model. */ +} GRRLIB_Model; + //============================================================================== // Allow general access to screen and frame information //============================================================================== diff --git a/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h b/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h index d79a6aa..aa35ff6 100644 --- a/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h +++ b/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h @@ -183,5 +183,17 @@ void GRRLIB_PrintfTTFW(int x, int y, GRRLIB_ttfFont *myFont, const wchar_t *stri u32 GRRLIB_WidthTTF(GRRLIB_ttfFont *myFont, const char *, unsigned int); u32 GRRLIB_WidthTTFW(GRRLIB_ttfFont *myFont, const wchar_t *, unsigned int); +//------------------------------------------------------------------------------ +// GRRLIB_3Dobj.c - 3D obj file functions for GRRLIB +void GRRLIB_Draw3dObj(GRRLIB_Model* model); +GRRLIB_Model* GRRLIB_ReadOBJ(char* filename); +GRRLIB_Model* GRRLIB_ReadOBJMem(const char *buffer, u32 size); +void GRRLIB_DeleteObj(GRRLIB_Model* model); +void GRRLIB_VertexNormals(GRRLIB_Model* model, f32 angle); +void GRRLIB_FacetNormals(GRRLIB_Model* model); +void GRRLIB_LinearTexture(GRRLIB_Model* model); +void GRRLIB_SpheremapTexture(GRRLIB_Model* model); +u32 GRRLIB_FindMaterial(GRRLIB_Model* model, char* name); + #endif // __GRRLIB_FNLIB_H__ /** @} */ // end of group diff --git a/examples/3D_obj/Makefile b/examples/3D_obj/Makefile new file mode 100644 index 0000000..24ce24c --- /dev/null +++ b/examples/3D_obj/Makefile @@ -0,0 +1,146 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif + +include $(DEVKITPPC)/wii_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) +CXXFLAGS = $(CFLAGS) + +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat +LIBS += -lwiiuse +#LIBS += -lmodplay -lasnd +LIBS += -lbte -logc -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES), -iquote $(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +run: + wiiload $(TARGET).dol + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dol: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .jpg extension +#--------------------------------------------------------------------------------- +%.jpg.o : %.jpg +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + $(bin2o) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .png extension +#--------------------------------------------------------------------------------- +%.png.o : %.png +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + $(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/examples/3D_obj/data/font.png b/examples/3D_obj/data/font.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5131a1526b947780dd01aabee2f79a531f6435 GIT binary patch literal 932 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

j7yB;wFValX!_hS%bd9m3w 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 bb$xX6KJvv9u~D(;X +#include +#include + +// Graphics +#include "texture_jpg.h" +#include "font_png.h" + + +int main() { + f32 modelRotX = 0.0f; + f32 modelRotY = 0.0f; + f32 modelRotZ = 0.0f; + f32 camZ = 50.0f; + u8 Amb = 0x00; + f32 zlight = 0.0f; + GRRLIB_Model* model; + const char strCtl1[] = "DPAD TO ROTATE MODEL"; + const char strCtl2[] = "PLUS/MINUS TO ZOOM MODEL"; + const char strCredit[] = "BY NONAMENO/CRAYON FROM GRRLIB TEAM"; + + GRRLIB_Init(); + WPAD_Init(); + + GRRLIB_texImg *tex_font = GRRLIB_LoadTexture(font_png); + GRRLIB_InitTileSet(tex_font, 16, 16, 32); + + GRRLIB_texImg *tex_obj = GRRLIB_LoadTextureJPGEx(texture_jpg, texture_jpg_size); + + GRRLIB_SetBackgroundColour(0x30, 0x30, 0x30, 0xFF); + + model = GRRLIB_ReadOBJ("sd:/data/head_chord.obj"); + + if(model->numnormals == 0) { + GRRLIB_FacetNormals(model); + GRRLIB_VertexNormals(model, 90.0); + } + + if(model->numtexcoords == 0) { + GRRLIB_LinearTexture(model); + } + + while(1) { + GRRLIB_Camera3dSettings(0.0f,0.0f,camZ, 0,1,0, 0,0,0); + + GRRLIB_3dMode(0.1, 1000, 45, model->numtexcoords, model->numnormals); + + if(model->numtexcoords) { + GRRLIB_SetTexture(tex_obj, 0); + } + + GRRLIB_ObjectView(0, 0, 0, modelRotX, modelRotY, modelRotZ, 1, 1, 1); + + GRRLIB_SetLightAmbient(RGBA(Amb,Amb,Amb,0xFF)); + GRRLIB_SetLightDiff(0, (guVector){-6, 0, zlight}, 20.0f, 1.0f, 0xFFFFFFFF); + GRRLIB_SetLightDiff(1, (guVector){ 6, 0, zlight}, 20.0f, 1.0f, 0xFFFFFFFF); + GRRLIB_SetLightDiff(2, (guVector){ 0,-6, zlight}, 20.0f, 1.0f, 0xFFFFFFFF); + + GRRLIB_Draw3dObj(model); + + GRRLIB_SetLightOff(); + GRRLIB_2dMode(); + GRRLIB_Printf(rmode->fbWidth/2.0 - (tex_font->tilew*strlen(strCtl1))/2.0, 20, + tex_font, 0xFFFFFF33, 1, strCtl1); + GRRLIB_Printf(rmode->fbWidth/2.0 - (tex_font->tilew*strlen(strCtl2))/2.0, 52, + tex_font, 0xFFFFFF33, 1, strCtl2); + GRRLIB_Printf(rmode->fbWidth/2.0 - (tex_font->tilew*strlen(strCredit))/2.0, + rmode->efbHeight - tex_font->tileh - 7, + tex_font, 0xFFFFFF33, 1, strCredit); + + GRRLIB_Render(); + + WPAD_ScanPads(); + if(WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME) break; + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_RIGHT) modelRotY++; + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_LEFT) modelRotY--; + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_DOWN) modelRotX++; + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_UP) modelRotX--; + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_PLUS) camZ -= 0.3f; + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_MINUS) camZ += 0.3f; + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_A) zlight += 0.4f; + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_B) zlight -= 0.4f; + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_1 && WPAD_ButtonsHeld(0) & WPAD_BUTTON_2) { + WPAD_Rumble(0, true); // Rumble on + GRRLIB_ScrShot("sd:/grrlib_3d.png"); + WPAD_Rumble(0, false); // Rumble off + } + } + GRRLIB_Exit(); // Be a good boy, clear the memory allocated by GRRLIB + + GRRLIB_DeleteObj(model); + + GRRLIB_FreeTexture(tex_obj); + GRRLIB_FreeTexture(tex_font); + + exit(0); +} +