All pastes #963937 Raw Edit

Something

public text v1 · immutable
#963937 ·published 2008-03-30 22:24 UTC
rendered paste body
#include <fstream>
#include <string>
#include <iostream>

class ObjModel {
private:
	float *x; // x coord
	float *y; // y coord
	float *z; // z coord
	float *t1,*t2,*t3;
	float *n1,*n2,*n3;
	int *f1,*f2,*f3;  
	int *ft1,*ft2,*ft3;
	int *fn1,*fn2,*fn3;
	int vNum;
    int fNum;
	int vtNum;
	int vnNum;
public:
	char *file;
	void Read();
	void Draw();
};

void ObjModel::Read() {
  char cchar[512];
  int vv=1;
  int ff=0;
 	int ttft1,ttft2,ttft3,tf1,tf2,tf3,ttf1,ttf2,ttf3,ft1f1,ft1ft1,ft1f2,ft1ft2,ft1f3,ft1ft3;
	int ft2fn1,ft2fn2,ft2fn3,ft3f1,ft3f2,ft3f3,ft3fn1,ft3fn2,ft3fn3;
  vNum=0;
  fNum=0;
  std::string line;
  
  char tmp[10];
  std::ifstream ModelFile (file);
  std::cout<<"open"<<std::endl;
  if (ModelFile.is_open()) {
   std::cout<<"opened"<<std::endl;
    while (! ModelFile.eof() ) {
      getline (ModelFile,line);
	  if(line.substr(0,1)=="v") {
		vNum++; }							// we want to know how big array to make for vert info
      if(line.substr(0,1)=="f") {	
		fNum++; }							// we also want to know how big array to make for face info
	  if(line.substr(0,2)=="vt") {
	    vtNum++; }
	  if(line.substr(0,2)=="vn") {
	    vnNum++; }
    }
    ModelFile.close();
	vNum++;
	fNum++;
	vtNum++;
	vnNum++;
	x = (float*)malloc(vNum * sizeof(float));
	z = (float*)malloc(vNum * sizeof(float));
	y = (float*)malloc(vNum * sizeof(float));
	
	t1 = (float*)malloc(vtNum * sizeof(float));
	t2 = (float*)malloc(vtNum * sizeof(float));
	t3 = (float*)malloc(vtNum * sizeof(float));	
	
	n1 = (float*)malloc(vnNum * sizeof(float));
	n2 = (float*)malloc(vnNum * sizeof(float));
	n3 = (float*)malloc(vnNum * sizeof(float));
	
	f1 = (int*)malloc(fNum * sizeof(int));
	f2 = (int*)malloc(fNum * sizeof(int));
	f3 = (int*)malloc(fNum * sizeof(int));	
	
	ft1 = (int*)malloc(fNum * sizeof(int));
	ft2 = (int*)malloc(fNum * sizeof(int));
	ft3 = (int*)malloc(fNum * sizeof(int));
	
	fn1 = (int*)malloc(fNum * sizeof(int));
	fn2 = (int*)malloc(fNum * sizeof(int));
	fn3 = (int*)malloc(fNum * sizeof(int));

	std::ifstream ModelFile(file);
	if(ModelFile.is_open()) {
		while(!ModelFile.eof()){
			getline (ModelFile,line);
                if(line.substr(0,2)=="v ") {	// v = vertecs
                    strcpy(cchar, line.c_str());
                    int result = sscanf (cchar,"%s %f %f %f", tmp, &x[vv], &y[vv], &z[vv]);
					std::cout<<tmp<<": "<<x[vv] << " " << y[vv] << " "<<z[vv] << std::endl;
                    vv++;
                }
                

               /* if(line.substr(0,2)=="vt") {	// v = vertecs
                    strcpy(cchar, line.c_str());
                    int result = sscanf (cchar,"%s %f %f %f", tmp, &t1[vv], &t2[vv], &t3[vv]);
                    //std::cout << "Textures: " << t1[vv] << " "<< t2[vv] << " " << t3[vv] << std::endl;
                    vv++;
                }
                
                if(line.substr(0,2)=="vn") {	// v = vertecs
                    strcpy(cchar, line.c_str());
                    int result = sscanf (cchar,"%s %f %f %f", tmp, &n1[vv], &y[vv], &z[vv]);
                    vv++;
                }*/

                if(line.substr(0,1)=="f") {	// f = face
                    strcpy(cchar, line.c_str());
                    sscanf (cchar,"%s %d %d %d", tmp, &f1[ff], &f2[ff], &f3[ff]); // only face info
                  //  int resulft2=sscanf(cchar,"%s %d/%d %d/%d %d/%d", tmp, &ft1f1,&ft1ft1, &ft1f2,&ft1ft2, &ft1f3,&ft1ft3); // face and texture
                  //  int resulft3=sscanf(cchar,"%s %d/%d/%d %d/%d/%d %d/%d/%d", tmp, &ttf1,&ttft1,&ft2fn1, &ttf2,&ttft2,&ft2fn2, &ttf3,&ttft3,&ft2fn3); // face, text and norms
                  //  int result4=sscanf(cchar,"%s %d//%d %d//%d %d//%d", tmp, &ft3f1,&ft3fn1, &ft3f2,&ft3fn2, &ft3f3,&ft3fn3); // face and norms
                   // if(result>3) {
                            //f1[ff]=tf1; f2[ff]=tf2; f3[ff]=tf3;
                           //std::cout<<"Model d"<<std::endl;
                   // }/*
                  /* else if(resulft2>6) {
                           f1[ff]=ft1f1; f2[ff]=ft1f2; f3[ff]=ft1f3;
                           ft1[ff]=ft1ft1; ft2[ff]=ft1ft2; ft3[ff]=ft1ft3;
                           std::cout << "model faces: " << f1[ff] << f2[ff] <<" "<< f3[ff] <<std::endl;
                    }
                    else if(resulft3>9) {
                            f1[ff]=ttf1; f2[ff]=ttf2; f3[ff]=ttf3;
                            ft1[ff]=ttft1; ft2[ff]=ttft2; ft3[ff]=ttft3;
                            fn1[ff]=ft2fn1; fn2[ff]=ft2fn2; fn3[ff]=ft2fn3;
                    //       std::cout << "face: "<<f1[ff]<<" "<<f2[ff]<<" "<<f3[ff]<<std::endl;
                    }
                    else if(result4>6) {
                            f1[ff]=ft3f1; f2[ff]=ft3f2; f3[ff]=ft3f3;
                            fn1[ff]=ft3fn1; fn2[ff]=ft3fn2; fn3[ff]=ft3fn3;
                           std::cout << "Model, normals"<<std::endl;

                    }*/
                  /*  else {
                    std::cout << "hmm" << std::endl;
                    }*/
                    ff++;
                }
			
			
		}

	}
	ModelFile.close();
  }
  return;
}

void ObjModel::Draw() {
//std::cout<< "testi"<<std::endl;
		glBegin(GL_TRIANGLES);
		for(int i=0; i< fNum-1; i++) {
				//glTexCoord2d(t1[ft1[i]], t2[ft1[i]]); 
				glVertex3f ( x[f1[i]] , y[f1[i]] , z[f1[i]]);
				//glTexCoord2d(t1[ft2[i]], t2[ft2[i]]); 
				glVertex3f ( x[f2[i]] , y[f2[i]] , z[f2[i]]);
				//glTexCoord2d(t1[ft2[i]], t2[ft2[i]]); 
				glVertex3f ( x[f3[i]] , y[f3[i]] , z[f3[i]]);
		}
		glEnd();
		return;
}