/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2004 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #include #include "obj.h" #include using namespace obj; bool Model::readline(std::istream& fin, char* line, const int LINE_SIZE) { if (LINE_SIZE<1) return false; bool eatWhiteSpaceAtStart = true; char* ptr = line; char* end = line+LINE_SIZE-1; bool skipNewline = false; while (fin && ptr0) { if (strncmp(line,"Ka ",3)==0) { unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a); if (fieldsRead==1) material->ambient.set(r,0.0f,0.0f,1.0f); else if (fieldsRead==2) material->ambient.set(r,g,0.0f,1.0f); else if (fieldsRead==3) material->ambient.set(r,g,b,1.0f); else if (fieldsRead==4) material->ambient.set(r,g,b,a); } else if (strncmp(line,"Kd ",3)==0) { unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a); if (fieldsRead==1) material->diffuse.set(r,0.0f,0.0f,1.0f); else if (fieldsRead==2) material->diffuse.set(r,g,0.0f,1.0f); else if (fieldsRead==3) material->diffuse.set(r,g,b,1.0f); else if (fieldsRead==4) material->diffuse.set(r,g,b,a); } else if (strncmp(line,"Ks ",3)==0) { unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a); if (fieldsRead==1) material->specular.set(r,0.0f,0.0f,1.0f); else if (fieldsRead==2) material->specular.set(r,g,0.0f,1.0f); else if (fieldsRead==3) material->specular.set(r,g,b,1.0f); else if (fieldsRead==4) material->specular.set(r,g,b,a); } else if (strncmp(line,"Ke ",3)==0) { unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a); if (fieldsRead==1) material->emissive.set(r,0.0f,0.0f,1.0f); else if (fieldsRead==2) material->emissive.set(r,g,0.0f,1.0f); else if (fieldsRead==3) material->emissive.set(r,g,b,1.0f); else if (fieldsRead==4) material->emissive.set(r,g,b,a); } else if (strncmp(line,"Tf ",3)==0) { unsigned int fieldsRead = sscanf(line+3,"%f %f %f %f", &r, &g, &b, &a); if (fieldsRead==1) material->Tf.set(r,0.0f,0.0f,1.0f); else if (fieldsRead==2) material->Tf.set(r,g,0.0f,1.0f); else if (fieldsRead==3) material->Tf.set(r,g,b,1.0f); else if (fieldsRead==4) material->Tf.set(r,g,b,a); } else if (strncmp(line,"newmtl ",7)==0) { std::string materialName(line+7); if (material->name != materialName) { material = & materialMap[materialName]; material->name = materialName; } } else if (strncmp(line,"sharpness ",10)==0) { float sharpness = 0.0f; unsigned int fieldsRead = sscanf(line+10,"%f", &sharpness); if (fieldsRead==1) material->sharpness = sharpness; } else if (strncmp(line,"illum ",6)==0) { int illum = 0; unsigned int fieldsRead = sscanf(line+6,"%d", &illum); if (fieldsRead==1) material->illum = illum; } else if (strncmp(line,"Ns ",3)==0) { int Ns = 0; unsigned int fieldsRead = sscanf(line+3,"%d", &Ns); if (fieldsRead==1) material->Ns = Ns; } else if (strncmp(line,"Ni ",3)==0) { int Ni = 0; unsigned int fieldsRead = sscanf(line+3,"%d", &Ni); if (fieldsRead==1) material->Ni = Ni; } else if (strncmp(line,"illum ",6)==0) { int illum = 0; unsigned int fieldsRead = sscanf(line+6,"%d", &illum); if (fieldsRead==1) material->illum = illum; } else if (strncmp(line,"Tr ",3)==0) { float alpha=1.0f; unsigned int fieldsRead = sscanf(line+3,"%f", &alpha); if (fieldsRead==1) { material->ambient[3] = alpha; material->diffuse[3] = alpha; material->specular[3] = alpha; material->emissive[3] = alpha; } } else if (strncmp(line,"d ",2)==0) { float alpha=1.0f; unsigned int fieldsRead = sscanf(line+2,"%f", &alpha); if (fieldsRead==1) { material->ambient[3] = alpha; material->diffuse[3] = alpha; material->specular[3] = alpha; material->emissive[3] = alpha; } } else if (strncmp(line,"map_Ka ",7)==0) { std::string filename(line+7); material->map_Ka = filename; } else if (strncmp(line,"map_Kd ",7)==0) { std::string filename(line+7); material->map_Kd = filename; } else if (strncmp(line,"map_Ks ",7)==0) { std::string filename(line+7); material->map_Ks = filename; } else { osg::notify(osg::NOTICE) <<"*** line not handled *** :"<0) { if (strncmp(line,"v ",2)==0) { unsigned int fieldsRead = sscanf(line+2,"%f %f %f %f", &x, &y, &z, &w); if (fieldsRead==1) vertices.push_back(osg::Vec3(x,0.0f,0.0f)); else if (fieldsRead==2) vertices.push_back(osg::Vec3(x,y,0.0f)); else if (fieldsRead==3) vertices.push_back(osg::Vec3(x,y,z)); else if (fieldsRead>=4) vertices.push_back(osg::Vec3(x/w,y/w,z/w)); } else if (strncmp(line,"vn ",3)==0) { unsigned int fieldsRead = sscanf(line+3,"%f %f %f", &x, &y, &z); if (fieldsRead==1) normals.push_back(osg::Vec3(x,0.0f,0.0f)); else if (fieldsRead==2) normals.push_back(osg::Vec3(x,y,0.0f)); else if (fieldsRead==3) normals.push_back(osg::Vec3(x,y,z)); } else if (strncmp(line,"vt ",3)==0) { unsigned int fieldsRead = sscanf(line+3,"%f %f %f", &x, &y, &z); if (fieldsRead==1) texcoords.push_back(osg::Vec2(x,0.0f)); else if (fieldsRead==2) texcoords.push_back(osg::Vec2(x,y)); else if (fieldsRead==3) texcoords.push_back(osg::Vec2(x,y)); } else if (strncmp(line,"l ",2)==0 || strncmp(line,"p ",2)==0 || strncmp(line,"f ",2)==0) { char* ptr = line+2; Element* element = new Element( (line[0]=='p') ? Element::POINTS : (line[0]=='l') ? Element::POLYLINE : Element::POLYGON ); // osg::notify(osg::NOTICE)<<"face"<first; ElementList& el = itr->second; osg::notify(osg::NOTICE)<<"ElementState "<