PDA

View Full Version : openGL + lib3ds



revaldo666
07-20-2012, 07:38 AM
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


#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_DEPT H);
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;
}

V-man
07-22-2012, 07:01 AM
Make an array of Lib3dsFile.


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.

revaldo666
07-23-2012, 12:10 AM
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.