int XFileLoader::ReadMesh(istream& s) { vector<vec3> positions; vector<vec2> texCoords; vector<unsigned short> indices; vector<vec3> normals; vector<unsigned short> nindices; XFileToken t = XFileToken::NextToken(s); if (t.m_type == XFileToken::Identifier) { //m_meshes[meshIdx].m_name = t.m_content; t = XFileToken::NextToken(s); } if (t.m_type != XFileToken::LeftBrace) THROW_EXCEPTION_T("Parsing error", ParsingException); int nElems; ReadMember(s, nElems); positions.resize(nElems); ReadArray(s, positions.begin(), positions.end()); ReadFaceArray(s, indices); int materialIdx = -1; while (true) { t = XFileToken::NextToken(s); if (t.m_type == XFileToken::Identifier) { if (t.m_content == "MeshNormals") ReadMeshNormals(s, normals, nindices); else if(t.m_content == "MeshMaterialList") materialIdx = ReadMeshMaterials(s); else if(t.m_content == "MeshTextureCoords") ReadTexCoords(s, texCoords); else SkipDataObject(s); } else if (t.m_type == XFileToken::LeftBrace) SkipDataReference(s); else if (t.m_type == XFileToken::RightBrace) break; else THROW_EXCEPTION_T("Parsing error", ParsingException); } if (!texCoords.empty() && texCoords.size() != positions.size()) THROW_EXCEPTION_T("Parsing error", ParsingException); return CreateMesh(positions, texCoords, indices, normals, nindices, materialIdx); }
Mesh* Load3ds(string URL, Entity* parent_ent){ int Size; //Local OldDir:String unsigned char Red, Green, Blue; //unsigned char Percent; //Local Pixmap:TPixmap Stream = File::ReadResourceFile(URL); if (Stream == 0) return 0; //Size = Stream.Size() fseek(Stream->pFile, 0, SEEK_END); // seek to end of file Size = ftell(Stream->pFile); // get current file pointer fseek(Stream->pFile, 0, SEEK_SET); // Read Main-Chunk ReadChunk(); if (ChunkID != M3D_3DS_MAIN || ChunkSize != Size) { Stream->CloseFile(); //Print "No 3DS File" return 0; } // Find 3DEditor-Chunk while (Stream->Eof()==0){ ReadChunk(); if (ChunkID == M3D_3DS_3DEDITOR){ break; }else{ SkipChunk(); } } //OldDir = CurrentDir() //If String(URL) <> "" Then ChangeDir(ExtractDir(String(URL))) mesh = Mesh::CreateMesh(); while (Stream->Eof()==0){ ReadChunk(); switch (ChunkID){ case M3D_3DS_OBJECTBLOCK: ReadCString(); // ' ObjectName break; case M3D_3DS_BrushBLOCK: ReadBrushBlock(); break; case M3D_3DS_TRIMESH: ReadTriMesh(); break; case M3D_3DS_VERTEXLIST: ReadVertexList(); break; case M3D_3DS_FACELIST: ReadFaceList(); break; case M3D_3DS_FACEMATLIST: ReadFaceMatList(); break; case M3D_3DS_TEXCOORDS: ReadTexCoords(); break; case M3D_3DS_BrushNAME: //Loader.Brush = CreateBrush() brush->name = ReadCString(); break; case M3D_3DS_BrushAMBIENT: //ReadChunk(); //ReadRGB(ChunkID, Red, Green, Blue); //brush->SetAmbientColor(Red, Green, Blue); break; case M3D_3DS_BrushDIFFUSE: ReadChunk(); ReadRGB(ChunkID, Red, Green, Blue); brush->BrushColor(Red, Green, Blue); break; case M3D_3DS_BrushSPECULAR: //'Loader.ReadChunk() //'Loader.ReadRGB(Loader.ChunkID, Red, Green, Blue) //'Loader.Brush.SetSpecularColor(Red, Green, Blue) break; case M3D_3DS_BrushSHININESS: //'Loader.ReadChunk() //'Percent = Loader.ReadPercent(Loader.ChunkID) //'Loader.Brush.BrushShininess(Percent) break; case M3D_3DS_MAPFILENAME: LoadMap(); break; case M3D_3DS_MAPVSCALE: texture->v_scale = Stream->ReadFloat(); break; case M3D_3DS_MAPUSCALE: texture->u_scale = Stream->ReadFloat(); break; case M3D_3DS_MAPUOFFSET: texture->u_pos = Stream->ReadFloat(); break; case M3D_3DS_MAPVOFFSET: texture->v_pos = Stream->ReadFloat(); break; case M3D_3DS_MAPROTATION: texture->angle = Stream->ReadFloat(); break; default: if ((ChunkID == M3D_3DS_TEXTUREMAP1) || (ChunkID == M3D_3DS_TEXTUREMAP2)) { ReadMap(ChunkID); }else{ SkipChunk(); } } } Stream->CloseFile(); if (surface!=0){ MovedTris.sort(); int CheckSurface=0; for(list<int>::const_reverse_iterator it = MovedTris.rbegin(); it != MovedTris.rend(); it++){ surface->RemoveTri(*it); CheckSurface=1; } MovedTris.clear(); if (surface->no_tris==0 && CheckSurface !=0) { delete surface; mesh->surf_list.remove(surface); mesh->no_surfs=mesh->no_surfs-1; } } // ChangeDir(OldDir) // Loader.Surface.UpdateVertices() // Loader.Surface.UpdateTriangles() mesh->UpdateNormals(); /*Loader.Mesh.UpdateBuffer() Print Loader.Surface.Tris.Length Print Loader.Surface.no_verts 'Loader.Mesh.FlipMesh()*/ mesh->class_name="Mesh"; mesh->AddParent(*parent_ent); Entity::entity_list.push_back(mesh); if(mesh->parent!=0){ mesh->mat.Overwrite(mesh->parent->mat); mesh->UpdateMat(); }else{ mesh->UpdateMat(true); } return mesh; }
bool slFileObj::Load() { Reset(); ScenePtr = mScene; FILE* infile = fopen(mFilename, "r"); FileLineNumber = 0; if (!infile) { fprintf(stderr, "LoadObjFile: Unable to open file: %s\n", mFilename); return false; } char inbuffer[1026]; while (true) { if (!fgets(inbuffer, 1026, infile)) { fclose(infile); PrintCmdNotSupportedErrors(stderr); return true; } FileLineNumber++; char* findStart = Preparse(inbuffer); if (findStart == 0 || (*findStart) == '#') { continue; //Ignore if a comment or a blank line } bool parseErrorOccurred = false; char theCommand[17]; int scanCode = sscanf(inbuffer, "%16s", theCommand); if (scanCode != 1) { parseErrorOccurred = true; } int cmdNum = GetCommandNumber(theCommand); if (cmdNum == -1) { AddUnsupportedCmd(theCommand); continue; } char* args = ScanForSecondField(findStart); bool ok = true; switch (cmdNum) { case 0: //'v' command { vec4* vertData = Vertices.Add(); ok = ReadVectorR4Hg(args, vertData); } break; case 1: //"vt" command { vec2* texData = TextureCoords.Add(); ok = ReadTexCoords(args, texData); } break; case 2: //The 'f' command { ok = ProcessFace(args , mDefaultMat); } break; case 3: //'l' command UnsupportedLines(); break; default: parseErrorOccurred = true; break; } if (!ok) { parseErrorOccurred = true; } } }