Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

/*
** ARToolKit object parsing function
**   - reads in object data from object file in Data/object_data
**
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <AR/ar.h>
#include <AR/arvrml.h>
#include "object.h"

static char *get_buff(char *buf, int n, FILE *fp)
{
    char *ret;
       
    for(;;) {
        ret = fgets(buf, n, fp);
        if (ret == NULL) return(NULL);
        if (buf[0] != '\n' && buf[0] != '#') return(ret); // Skip blank lines and comments.
    }
}

ObjectData_T *read_VRMLdata( char *name, int *objectnum )
{
    FILE          *fp;
    ObjectData_T  *object;
    char           buf[256], buf1[256];
    int            i;

        printf("Opening model file %s\n", name);

    if ((fp=fopen(name, "r")) == NULL) return(0);

    get_buff(buf, 256, fp);
    if (sscanf(buf, "%d", objectnum) != 1) {
                fclose(fp); return(0);
        }

        printf("About to load %d models.\n", *objectnum);

    if ((object = (ObjectData_T *)malloc(sizeof(ObjectData_T) * (*objectnum))) == NULL) exit (-1);

    for (i = 0; i < *objectnum; i++) {
               
        get_buff(buf, 256, fp);
        if (sscanf(buf, "%s %s", buf1, object[i].name) != 2) {
            fclose(fp); free(object); return(0);
        }
               
                printf("Model %d: %20s\n", i + 1, &(object[i].name[0]));
               
        if (strcmp(buf1, "VRML") == 0) {
            object[i].vrml_id = arVrmlLoadFile(object[i].name);
                        printf("VRML id - %d \n", object[i].vrml_id);
            if (object[i].vrml_id < 0) {
                fclose(fp); free(object); return(0);
            }
        } else {
                        object[i].vrml_id = -1;
                }
                object[i].vrml_id_orig = object[i].vrml_id;
                object[i].visible = 0;

        get_buff(buf, 256, fp);
        if (sscanf(buf, "%s", buf1) != 1) {
                        fclose(fp); free(object); return(0);
                }
       
        if ((object[i].id = arLoadPatt(buf1)) < 0) {
                        fclose(fp); free(object); return(0);
                }

        get_buff(buf, 256, fp);
        if (sscanf(buf, "%lf", &object[i].marker_width) != 1) {
                        fclose(fp); free(object); return(0);
                }

        get_buff(buf, 256, fp);
        if (sscanf(buf, "%lf %lf", &object[i].marker_center[0], &object[i].marker_center[1]) != 2) {
            fclose(fp); free(object); return(0);
        }
       
    }

    fclose(fp);

    return( object );
}