Ne, hat doch geklappt.
Naja, ich poste dann mal hier den Code, kannst mir ja sagen, obs da irgendwelche Mängel gibt:
Code: Alles auswählen
string IntToString(int a){
stringstream b;
string c;
b << a;
c=b.str();
return c;
}
string CharToString(char a){
stringstream b;
string c;
b << static_cast<int>(a);
c=b.str();
return c;
}
string GetPathPart(const char* filen){
int b=0;
stringstream ftemp;
string path,file;
ftemp << filen;
file=ftemp.str();
for(unsigned int n=0;n<file.length();n++){
if(file.substr(file.length()-n,1)=="/" || file.substr(file.length()-n,1)=="\\"){
b=n;
break;
}
}
path=file.substr(0,file.length()-b+1);
return path;
}
struct Surface{
BBObject id;
int materialid;
};
class app
{
private:
BBObject camera;
public:
void Init(){
bbBeginBlitz3D();
bbGraphics3D(1024,768,0,2);
bbSetBlitz3DTitle("TMF example","");
this->camera=bbCreateCamera();
bbCameraClsColor(this->camera,255,255,255);
}
BBObject LoadTMF(const char* file){
BBObject mesh,csurf;
string line,normalstr,filepath,texfile,nmap;
int major=0,minor=0,surfaces=0,vertices=0,verts=0,t1=0,t2=0,t3=0,tris=0,matid=0,materials=0,r=0,g=0,b=0;
float x,y,z,u,v,nx,ny,nz,alpha,shininess;
char normals,sphr,alphamap;
vector<Surface> surflist;
vector<Surface>::iterator surfit;
filepath="D:\\";
ifstream *myfile=new ifstream;
myfile->open(file,ios::binary);
if(myfile->is_open()){
bbColor(255,255,255);
getline(*myfile,line);
myfile->read(reinterpret_cast<char*>(&major),sizeof(int));
myfile->read(reinterpret_cast<char*>(&minor),sizeof(int));
myfile->read(&normals,sizeof(char));
myfile->read(reinterpret_cast<char*>(&surfaces),sizeof(int));
mesh=bbCreateMesh();
for(int n=1;n<surfaces+1;n++){
csurf=bbCreateSurface(mesh);
myfile->read(reinterpret_cast<char*>(&vertices),sizeof(int));
//read vertexes
for(int k=0;k<vertices;k++){
myfile->read(reinterpret_cast<char*>(&x),sizeof(float));
myfile->read(reinterpret_cast<char*>(&y),sizeof(float));
myfile->read(reinterpret_cast<char*>(&z),sizeof(float));
bbAddVertex(csurf,x,y,z);
}
//read texture coordinates
for(int k=0;k<vertices;k++){
myfile->read(reinterpret_cast<char*>(&u),sizeof(float));
myfile->read(reinterpret_cast<char*>(&v),sizeof(float));
bbVertexTexCoords(csurf,k,u,v,1,0);
}
//read normals
if(normals==1){
for(int k=0;k<vertices;k++){
myfile->read(reinterpret_cast<char*>(&nx),sizeof(float));
myfile->read(reinterpret_cast<char*>(&ny),sizeof(float));
myfile->read(reinterpret_cast<char*>(&nz),sizeof(float));
bbVertexNormal(csurf,k,nx,ny,nz);
}
}
myfile->read(reinterpret_cast<char*>(&tris),sizeof(int));
//read triangles
for(int k=0;k<tris;k++){
myfile->read(reinterpret_cast<char*>(&t1),sizeof(int));
myfile->read(reinterpret_cast<char*>(&t2),sizeof(int));
myfile->read(reinterpret_cast<char*>(&t3),sizeof(int));
bbAddTriangle(csurf,t1,t2,t3);
}
myfile->read(reinterpret_cast<char*>(&matid),sizeof(int));
Surface surf;
surf.id=csurf;
surf.materialid=matid;
surflist.push_back(surf);
}
//======================================================
//materials
//======================================================
myfile->read(reinterpret_cast<char*>(&materials),sizeof(int));
for(int m=0;m<materials;m++){
getline(*myfile,texfile);
texfile=texfile.substr(0,texfile.length()-1);
getline(*myfile,nmap);
nmap=nmap.substr(0,nmap.length()-1);
myfile->read(&sphr,sizeof(char));
myfile->read(reinterpret_cast<char*>(&alpha),sizeof(float));
myfile->read(reinterpret_cast<char*>(&shininess),sizeof(float));
myfile->read(&alphamap,sizeof(char));
myfile->read(reinterpret_cast<char*>(&r),sizeof(int));
myfile->read(reinterpret_cast<char*>(&g),sizeof(int));
myfile->read(reinterpret_cast<char*>(&b),sizeof(int));
texfile=GetPathPart(file)+texfile;
BBObject tex,nrmtex;
if(alphamap==1){
alphamap=2;
}
if(sphr==0){
tex=bbLoadTexture(texfile.c_str(),alphamap);
}
else{
tex=bbLoadTexture(texfile.c_str(),64+alphamap);
}
if(nmap!=""){
nmap=GetPathPart(file)+nmap;
nrmtex=bbLoadTexture(nmap.c_str(),alphamap);
}
BBObject brush=bbCreateBrush(255,255,255);
bbBrushAlpha(brush,alpha);
bbBrushColor(brush,r,g,b);
bbBrushShininess(brush,shininess);
if(nmap!=""){
bbTextureBlend(nrmtex, 4); //Dot3-Bumpmap-flag
bbTextureBlend(tex, 5);
bbBrushTexture(brush,nrmtex,0,0);
bbBrushTexture(brush,tex,0,1);
bbBrushFX(brush,2);
}
else{
bbBrushTexture(brush,tex,0,0);
}
for(surfit=surflist.begin();surfit!=surflist.end();surfit++){
if((*surfit).materialid==m){
bbPaintSurface((*surfit).id,brush);
}
}
bbFreeBrush(brush);
}
myfile->close();
}
delete myfile;
return mesh;
}
void Run(){
BBObject mesh=this->LoadTMF("C:\\as.tmf");
bbPositionEntity(mesh,0,0,70);
while(bbKeyHit(1)==0)
{
bbTurnEntity(mesh,1,1,1);
bbRenderWorld();
bbFlip();
}
}
void End(){
bbEndBlitz3D();
};
};