
#include <stdio.h>
#include "createLoader.h"

static lsInterface *ls = NULL;

void createLoaderInit(lsInterface *l)
{
    ls = l;
}

lsGroup gr1,gr2;
lsGeometry geo1,geo2;
lsStateSet st1,st1;
lsLightSource li1,li2;
lsTransformation tr1;
lsTexture tex1,tex2;

int createSupportsFile(FILE *file)
{
    return 1;
}

void createLoad(FILE *file)
{
    if(ls == NULL)
    {
        printf("CreateLoad: Lodestone interface not set, aborting!\n");
        return;
    }
    
    printf("Create Loader: loading %p\n", file);
    
    printf("Lodestone version %d.%d\n", ls->getMajorVersion(),
                                        ls->getMinorVersion());
     
    printf("Backend supports extension 'foo': %d\n", ls->hasExtension("foo"));
    printf("Backend supports extension 'bar': %d\n", ls->hasExtension("bar"));
    printf("Backend supports extension 'baz': %d\n", ls->hasExtension("baz"));
    
    printf("Backend function 'fooFunc': %d\n", ls->getExtensionFunction("fooFunc"));
    printf("Backend function 'barFunc': %d\n", ls->getExtensionFunction("barFunc"));

    gr1 = ls->createGroup();
    gr2 = ls->createGroup();
    
    ls->addChild(gr1, gr2);
    
    /* texture */
    
    tex1 = ls->createTexture();
    
    ls->texSetImage(tex1, "test.jpg");
    ls->texGenf(tex1, GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
    
    ls->closeTexture(tex1);
    
    /* state 1 */
    
    st1 = ls->createStateSet();
    
    ls->openStateSet(st1);
    ls->stateEnable(st1, GL_LIGHTING);
    {
    float c[4] = { 1,0,0,1 };
    ls->stateMaterialfv(st1, GL_FRONT_AND_BACK, GL_DIFFUSE, c);
    }
    ls->stateMaterialf(st1, GL_FRONT_AND_BACK, GL_SHININESS, 20);
    ls->stateColorMaterial(st1, GL_FRONT_AND_BACK, GL_DIFFUSE);
    ls->statePolygonMode(st1, GL_FRONT_AND_BACK, GL_LINE);
    ls->statePolygonOffset(st1, 1, 2);
    ls->stateCullFace(st1, GL_FRONT);
    ls->closeStateSet(st1);
    
    /* geometry 1 */
    
    geo1 = ls->createGeometry();
    {
    float v[4][3] = { {0,0,0}, {1,0,0}, {2,2,0}, {2,3,0} };
    ls->setVertexCount(geo1, 4);
    ls->setVertices(geo1, v);
    }
    {
    unsigned int indices[] = { 0,1,3,2 };
    ls->addFace(geo1, GL_POLYGON, 4, indices);
    ls->addFace(geo1, GL_TRIANGLE_STRIP, 4, indices);
    }
    ls->closeGeometry(geo1);
    
    ls->addChild(gr1, geo1);
    
    /* geometry 2 */
   
    geo2 = ls->createGeometry();
    {
    float v[4][3] = { {0,0,1}, {0,0,2}, {0,2,2}, {0,3,2} };
    ls->setVertexCount(geo1, 4);
    ls->addVertex(geo1, v[0]);
    ls->addVertex(geo1, v[1]);
    ls->addVertex(geo1, v[2]);
    ls->addVertex(geo1, v[3]);
    }
       
    ls->closeGeometry(geo2);
      
    ls->addChild(gr2, geo2);
   
    /* Light Source */
    
    li1 = ls->createLightSource();
    {
    float v[3] = { 1,2,3 };
    ls->lightfv(li1, GL_POSITION, v);
    }
    ls->closeLightSource(li1);

    li2 = ls->createLightSource();
    {
    float v[3] = { 1,2,3 };
    ls->lightfv(li2, GL_DIFFUSE, v);
    }
    ls->closeLightSource(li2);
    
    
}

