Code: Select all
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include "bms.h"
// function declarations
void exitusage ();
void recurse ();
void findbms ();
int convert (char *filename);
int loadfile (const char *filename, char **buffer);
int loadmesh (char *buffer, bms **mesh);
int writeobj (char *filename, bms *mesh);
int main(int argc, char *argv[])
{
int i, n = 0;
char *buffer;
bms *mesh;
if (argc == 1) {
/*printf("bmstool: No input files specified\n\n");
exitusage();*/
recurse();
}
for (i = 1; i < argc; i++) {
if(loadfile(argv[i], &buffer) == 0) {
if (loadmesh(buffer, &mesh) == 0) {writeobj(argv[i], mesh); ++n;}
free(mesh);
free(buffer);
}
}
printf("bmstool: Converted %d files\n", n);
return 0;
}
void exitusage() {
printf("Converts Joymax BMS files to Wavefront OBJ files\n");
printf("BMS files\n");
printf(" files Specifies the BMS files to be converted.\n");
exit(1);
}
void recurse() {
findbms();
WIN32_FIND_DATA fd;
HANDLE hFind = FindFirstFile("*",&fd);
BOOL bFoundAnother = (hFind!=INVALID_HANDLE_VALUE);
while(bFoundAnother){
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (fd.cFileName[0]!='.')){
SetCurrentDirectory(fd.cFileName);
recurse();
SetCurrentDirectory("..");}
bFoundAnother = FindNextFile(hFind,&fd);}
FindClose(hFind);
}
void findbms() {
WIN32_FIND_DATA fd;
HANDLE hFind = FindFirstFile("*.bms",&fd);
BOOL bFoundAnother = (hFind!=INVALID_HANDLE_VALUE);
while(bFoundAnother){
convert(fd.cFileName);
//remove(fd.cFileName);
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (fd.cFileName[0]!='.')){
SetCurrentDirectory(fd.cFileName);
recurse();
SetCurrentDirectory("..");}
bFoundAnother = FindNextFile(hFind,&fd);}
FindClose(hFind);
}
int convert(char *filename) {
char *buffer;
bms *mesh;
if(loadfile(filename, &buffer) == 0) {
if (loadmesh(buffer, &mesh) == 0) {writeobj(filename, mesh);}
free(mesh);
free(buffer);
}
return 0;
}
int loadfile(const char *filename, char **buffer)
{
int size, result;
FILE *file = fopen(filename, "rb");
if (file == NULL) {printf("bmstool: Failed to open file %s\n", filename); return -1;}
fseek(file, 0, SEEK_END);
size = ftell(file);
rewind(file);
*buffer = (char *)malloc(sizeof(char)*size);
if (*buffer == NULL) {printf("bmstool: Failed to allocate memory\n"); return -2;}
result = fread(*buffer, sizeof(char), size, file);
if (result != size) {printf("bmstool: Failed to read %s\n", filename); return -3;}
fclose(file);
printf("bmstool: Read %d bytes from %s\n", result, filename);
return 0;
}
int loadmesh(char *buffer, bms **mesh)
{
*mesh = (bms *)malloc(sizeof(bms));
(*mesh)->header = (header *) buffer;
if (strncmp((*mesh)->header->id, "JMXVBMS", sizeof(*(*mesh)->header->id)) != 0) {
printf("bmstool: File is not a binary mesh\n");
return -1;
}
(*mesh)->index = (index *) (buffer + sizeof(header));
// allocate enough memory for group cstr
dword *lengroup = (dword *) (buffer + sizeof(header) + sizeof(index));
(*mesh)->group = (char*)malloc(*lengroup + 1);
(*mesh)->group = (char *) ((char*)lengroup + sizeof(dword));
(*mesh)->group[*lengroup] = '\0';
(*mesh)->numvertices = (int *) (buffer + (*mesh)->index->vertex);
(*mesh)->vertex = (vertex *) ((*mesh)->numvertices + 1);
(*mesh)->numtriangles = (int *) (buffer + (*mesh)->index->triangle);
(*mesh)->triangle = (triangle *) ((*mesh)->numtriangles + 1);
if (*(*mesh)->numvertices) printf("bmstool: Found %d vertices\n", *(*mesh)->numvertices);
if (*(*mesh)->numtriangles) printf("bmstool: Found %d triangles\n", *(*mesh)->numtriangles);
return 0;
}
int writeobj(char *filename, bms *mesh)
{
int i = 0;
FILE *file = fopen(strcat(strtok(filename, "."), ".obj"), "w");
if (file == NULL) {
printf("bmstool: Failed to write %s\n", strcat(strtok(filename, "."), ".obj"));
return -1;
}
for (i = 0; i < *mesh->numvertices; i++)
fprintf(file, "v %f %f %f\n", mesh->vertex[i].position[0],
mesh->vertex[i].position[1], mesh->vertex[i].position[2]);
for (i = 0; i < *mesh->numvertices; i++)
fprintf(file, "vn %f %f %f\n", mesh->vertex[i].normal[0],
mesh->vertex[i].normal[1], mesh->vertex[i].normal[2]);
for (i = 0; i < *mesh->numvertices; i++)
fprintf(file, "vt %f %f\n", mesh->vertex[i].texture[0],
1-mesh->vertex[i].texture[1]);
fprintf(file, "# %d vertices\n\ng %s\n", *mesh->numvertices, mesh->group);
for (i = 0; i < *mesh->numtriangles; i++)
fprintf(file, "f %d/%d/%d %d/%d/%d %d/%d/%d\n", mesh->triangle[i].index[0]+1,
mesh->triangle[i].index[0]+1, mesh->triangle[i].index[0]+1,
mesh->triangle[i].index[1]+1, mesh->triangle[i].index[1]+1,
mesh->triangle[i].index[1]+1, mesh->triangle[i].index[2]+1,
mesh->triangle[i].index[2]+1, mesh->triangle[i].index[2]+1);
fprintf(file, "# %d faces\n", *mesh->numtriangles);
printf("bmstool: Wrote %ld bytes to %s\n", ftell(file), strcat(strtok(filename, "."), ".obj"));
fclose(file);
return 0;
}