Cornell Box MDL Reading Example
Cornell University Program of Computer Graphics
Cornell Seal

Suppose you had the folowing text mdl file:

    sphr "red sphere" 
       lmbrtn rgb 0.8 0.2 0.2 end end
       0.0 0.0 0.0 1.0  % center,radius

You could read this file with the following code:

    FILE *fp = fopen("red_sphere.mdla");
    mdlInput inp(fp);
    mdlKey k;
    char *s;
    float r, g, b;
    float rgb[3];
    k = inp.BeginChunk();    // k == "sphr"
    s = inp.ReadString();
    k = inp.BeginChunk();    // k == "lmbrtn"
    k = inp.BeginChunk();    // k == "rgb"
    r = inp.ReadFloat();
    g = inp.ReadFloat();
    b = inp.ReadFloat();
    inp.ReadFloats(xyz, 3);
    inp.EndChunk();          // You don't always have to read everything

Of course, any real code would use the keywords returned to decide what to read next. Usually one would have a switch statement that looks like this:

    // Read a geometric object
    mdlKey k = inp.BeginChunk();
    if (k == mdlKey("sphr")) {
       // Read a string, a material chunk, and four floats
    else if (k == mdlKey("msh")) {
       // Read a string and a material, then do a lot of work
    else {
       cerr << "I'm ignoring a chunk with the unrecognized keyword '" << k << "'." << endl;

When possible, it is preferable to have a function table whose use looks something like this:

    // Read a color chunk
    mdlKey k = inp.BeginChunk();

It is recommended that the function which begins a chunk ends the chunk, since mismatching the BeginChunks and EndChunks can lead to a lot of confusion.

Last updated 10/07/04 PCG www Home