示例#1
0
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);
}
示例#2
0
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;
}
示例#3
0
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;
		}
	}
}