Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 3 of 3

Thread: openGL + lib3ds

  1. #1
    Newbie Newbie
    Join Date
    Jul 2012
    Posts
    3

    openGL + lib3ds

    Hello all. I have simple code for load and display .3ds model, but he dont load 2 or more models.
    Help how load more models in scene.
    this my code
    Code :
    #include <windows.h>
    #include <gl/gl.h>
    #include <gl/glu.h>
    #include <gl/glut.h>
    #include "lib3ds.h"
    #include <iostream>
    typedef float Lib3dsVector[3];
    typedef float Lib3dsTexel[2];
    using namespace std;
    Lib3dsFile* model;
    Lib3dsMesh** mesh;
    Lib3dsCamera** camera;
    Lib3dsFace* face;
    Lib3dsLight** light;
    Lib3dsMaterial** material;
    float rotat=0;
    GLuint vertexVBO,normalVBO,textureVBO;
    unsigned long total_face;
    void lightup()
    {
        glShadeModel(GL_SMOOTH);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_CULL_FACE);
        glFrontFace(GL_CCW);
        float gambient[]={0.2,0.2,0.2,1.0};
        float lightpos[]={1.0,1.0,1.0,0.0};
        float lambient[]={1.0,1.0,1.0,1.0};
        float ldiffuse[]={0.8,0.8,0.8,1.0};
        float lspecular[]={0.3,0.3,0.3,1.0};
        glLightfv(GL_LIGHT0,GL_DIFFUSE,ldiffuse);
        glLightfv(GL_LIGHT0,GL_AMBIENT,lambient);
        glLightfv(GL_LIGHT0,GL_SPECULAR,lspecular);
        glLightfv(GL_LIGHT0,GL_POSITION,lightpos);
        glLightModelfv(GL_LIGHT_MODEL_AMBIENT,gambient);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
    }
    void getfaces()
    {
        total_face=0;
        for(long meshcount=0;meshcount<model->nmeshes;meshcount++)
            total_face+=mesh[meshcount]->nfaces;
    }
     
    void display()
    {
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LEQUAL);
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BITS);
        glLoadIdentity();
        glPushMatrix();
        lightup();
        glScalef(0.5,0.5,0.5);
        glTranslatef(0.0,-1000.0,-2500.0);
    	glRotatef(280, 1, 0, 0);
    	glRotatef(rotat, 0, 0, 1);
        long meshcount;
        for(meshcount=0;meshcount<model->nmeshes;meshcount++)
        {
            face=mesh[meshcount]->faces;
            for(long i=0;i<mesh[meshcount]->nfaces;i++)
            {
                glMaterialfv(GL_FRONT,GL_DIFFUSE,material[face[i].material]->diffuse);
                glMaterialfv(GL_FRONT,GL_AMBIENT,material[face[i].material]->ambient);
                glMaterialfv(GL_FRONT,GL_SPECULAR,material[face[i].material]->specular);
                glBegin(GL_TRIANGLES);
    			glColor3f(50.0,100.0,0.0);
                glVertex3fv(mesh[meshcount]->vertices[face[i].index[0]]);
                glVertex3fv(mesh[meshcount]->vertices[face[i].index[1]]);
                glVertex3fv(mesh[meshcount]->vertices[face[i].index[2]]);
                glEnd();
            }
        }
        glPopMatrix();
        glutSwapBuffers();
    }
    static void Timer(int value)
    {
        rotat+=1.0f;
    	if(rotat>=360)
    		rotat=0;
        glutPostRedisplay();
        glutTimerFunc(30, Timer, 0);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
    }
     
    void keypress(unsigned char key,int x,int y)
    {
        switch(key)
        {
        case 27:
            exit(0);
            break;
        }
    }
    void reshape(int w,int h)
    {
        if(h==0) h=1;
        glViewport(0,0,w,h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0,w/h,0.0,1000.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
    int main(int argc,char* argv[])
    {
        glutInit(&argc,argv);
        model=lib3ds_file_open("torce.3DS");
        if(model==NULL) cout<<"Error"<<endl; else cout<<model->nmaterials<<endl;
        mesh=model->meshes;
        material=model->materials;
        camera=model->cameras;
        light=model->lights;
        cout<<"Light Num:"<<model->nlights<<endl;
        glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
        glutInitWindowSize(800,800);
        glutInitWindowPosition(100,100);
        glutCreateWindow("VC 2008 Glut");
    	glClearColor(0.0, 0.0, 0.0, 0.0);
        glClearDepth(1.0);
        glShadeModel(GL_FLAT);
        glutKeyboardFunc(keypress);
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
    	Timer(0);
        glutMainLoop();
        return 0;
    }

  2. #2
    Super Moderator OpenGL Guru
    Join Date
    Feb 2000
    Location
    Montreal, Canada
    Posts
    4,421
    Make an array of Lib3dsFile.
    Code :
    Lib3dsFile** model;
    *model=new Lib3dsFile*[5];
    model[0]=lib3ds_file_open("thing0.3DS");
    model[1]=lib3ds_file_open("thing1.3DS");
    model[2]=lib3ds_file_open("thing2.3DS");
    model[3]=lib3ds_file_open("thing3.3DS");
    model[4]=lib3ds_file_open("thing4.3DS");

    or if you don't like using "new", use the vector class from std.
    ------------------------------
    Sig: http://glhlib.sourceforge.net
    an open source GLU replacement library. Much more modern than GLU.
    float matrix[16], inverse_matrix[16];
    glhLoadIdentityf2(matrix);
    glhTranslatef2(matrix, 0.0, 0.0, 5.0);
    glhRotateAboutXf2(matrix, angleInRadians);
    glhScalef2(matrix, 1.0, 1.0, -1.0);
    glhQuickInvertMatrixf2(matrix, inverse_matrix);
    glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
    glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);

  3. #3
    Newbie Newbie
    Join Date
    Jul 2012
    Posts
    3
    thx, its work.

    but i have any question.
    I loaded many models on scene, how save this models in one .3ds file.
    Function lib3ds_file_save taked one parametr type Lib3dsFile, if i saved model that saved only one object becouse file owerwrited every time wen i called function.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •