⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 obj.c

📁 游戏编程精华01-含有几十个游戏编程例子
💻 C
📖 第 1 页 / 共 2 页
字号:
    sprintf(LMtlFileName,"%s%s",LPathName,LBuffer);    LMaterials=E3d_MaterialReadMTL(LMtlFileName, &LNumOfMaterials);   break;   case 'u':    if(EStr_StringsEqual(LBuffer,"usemtl"))    {     fgets(LBuffer, sizeof(LBuffer), LFile);				// Skip the rest of the line     sscanf(LBuffer, "%s", LMaterialName);// Find Material with that name//     for(LC=0;LC<LNumOfMaterials;LC++)     {      if(EStr_StringsEqual(LMaterials[LC]->Name,LMaterialName)) { LMaterial=LMaterials[LC];break; }     }     if(LOBJPolyGroup!=NULL) LOBJPolyGroup->Material=LMaterial;    }   break;   case 'g':								// Group    fgets(LBuffer, sizeof(LBuffer), LFile);				// Skip the rest of the line    sscanf(LBuffer, "%s", LGroupName);    if(LNumOfPolyGroups>0)    {     LOBJPolyGroup=LOBJPolyGroups;     for(LC=0;LC<LNumOfPolyGroups;LC++)     {      if(LOBJPolyGroup->Name!=NULL)      {       if(EStr_StringsEqual(LOBJPolyGroup->Name,LGroupName)) break;      }      LOBJPolyGroup++;     }// PolyGroup with that name was not found//     if(LC>=LNumOfPolyGroups)     {      if((LOBJPolyGroups=E3d_OBJPolyGroupAdd(LOBJPolyGroups,LNumOfPolyGroups,LGroupName))!=NULL)      {       LOBJPolyGroup=LOBJPolyGroups+LNumOfPolyGroups;       LNumOfPolyGroups++;      }     }    }    else    {     if((LOBJPolyGroups=E3d_OBJPolyGroupAdd(LOBJPolyGroups,LNumOfPolyGroups,LGroupName))!=NULL)     {      LOBJPolyGroup=LOBJPolyGroups+LNumOfPolyGroups;      LNumOfPolyGroups++;     }    }    LOBJPolyGroup->Material=LMaterial;   break;   case 'f':								// Polygons ("Faces")    if(LNumOfPolyGroups==0)						// If there is no PolyGroup yet, create one    {     if((LOBJPolyGroups=E3d_OBJPolyGroupAdd(LOBJPolyGroups,LNumOfPolyGroups,LGroupName))!=NULL)     {      LOBJPolyGroup=LOBJPolyGroups+LNumOfPolyGroups;      LOBJPolyGroup->Material=LMaterial;      LNumOfPolyGroups++;     }    }    LVtxId = LNormalId = LSTId = 0;    fscanf(LFile, "%s", LBuffer);// Can be %d, %d//%d, %d/%d or %d/%d/%d %d//%d//    if(strstr(LBuffer, "//"))						// "v//n"    {     LN=1;     sscanf(LBuffer, "%d//%d", &LVtxId, &LNormalId);     LFilePos=ftell(LFile);     while(fscanf(LFile, "%d//%d", &LI, &LI) > 0) LN++;     fseek(LFile,LFilePos,SEEK_SET);     if(LN>2)     {      if((LOBJPolyGroup->Polygons=E3d_PolygonAddOneToArray(LOBJPolyGroup->Polygons,LOBJPolyGroup->NumOfPolygons,&(LOBJPolyGroup->NumOfPolygonsAllocated)))!=NULL)      {       LPolygon=LOBJPolyGroup->Polygons+LOBJPolyGroup->NumOfPolygons;       LOBJPolyGroup->NumOfPolygons+=1;      }      LVertexNode=E3d_PolygonVertexNodeAllocate(LPolygon,LN);      LVertexNode->VertexID=LVtxId-1;// Set vertex normal//      if(LNormalId<=LNumOfNormals)      {       LNormal=LNormals+LNormalId-1;       LVertexNode->Normal.X=LNormal->X;LVertexNode->Normal.Y=LNormal->Y;LVertexNode->Normal.Z=LNormal->Z;      }      LVertexNode++;      for(LC=1;LC<LN;LC++)      {       fscanf(LFile, "%d//%d", &LVtxId, &LNormalId);       LVertexNode->VertexID=LVtxId-1;// Set vertex normal//       if(LNormalId<=LNumOfNormals)       {	LNormal=LNormals+LNormalId-1;	LVertexNode->Normal.X=LNormal->X;LVertexNode->Normal.Y=LNormal->Y;LVertexNode->Normal.Z=LNormal->Z;       }       LVertexNode++;      }      LPolygon->NumOfVertices=LN;     }    }    else    if(sscanf(LBuffer, "%d/%d/%d", &LVtxId, &LSTId, &LNormalId) == 3)	// "v/t/n"    {     LN=1;     LFilePos=ftell(LFile);     while(fscanf(LFile, "%d/%d/%d", &LI, &LI, &LI) > 0) LN++;     fseek(LFile, LFilePos, SEEK_SET);     if(LN>2)     {      if((LOBJPolyGroup->Polygons=E3d_PolygonAddOneToArray(LOBJPolyGroup->Polygons,LOBJPolyGroup->NumOfPolygons,&(LOBJPolyGroup->NumOfPolygonsAllocated)))!=NULL)      {       LPolygon=LOBJPolyGroup->Polygons+LOBJPolyGroup->NumOfPolygons;       LOBJPolyGroup->NumOfPolygons+=1;      }      LVertexNode=E3d_PolygonVertexNodeAllocate(LPolygon, LN);      LVertexNode->VertexID=LVtxId-1;// Set vertex normal//      if(LNormalId<=LNumOfNormals)      {       LNormal=LNormals+LNormalId-1;       LVertexNode->Normal.X=LNormal->X;LVertexNode->Normal.Y=LNormal->Y;LVertexNode->Normal.Z=LNormal->Z;      }// Set vertex ST//      if(LSTId<=LNumOfSTs)      {       LST=LSTs+LSTId-1;       LVertexNode->ST[0]=LST->S;LVertexNode->ST[1]=LST->T;      }      LVertexNode++;      for(LC=1;LC<LN;LC++)      {       fscanf(LFile, "%d/%d/%d", &LVtxId, &LSTId, &LNormalId);       LVertexNode->VertexID=LVtxId-1;// Set vertex normal//       if(LNormalId<=LNumOfNormals)       {	LNormal=LNormals+LNormalId-1;	LVertexNode->Normal.X=LNormal->X;LVertexNode->Normal.Y=LNormal->Y;LVertexNode->Normal.Z=LNormal->Z;       }// Set vertex ST//       if(LSTId<=LNumOfSTs)       {	LST=LSTs+LSTId-1;	LVertexNode->ST[0]=LST->S;LVertexNode->ST[1]=LST->T;       }       LVertexNode++;      }      LPolygon->NumOfVertices=LN;     }    }    else    if(sscanf(LBuffer, "%d/%d/", &LVtxId, &LSTId) == 2)			// "v/t"    {     LN=1;     LFilePos=ftell(LFile);     while(fscanf(LFile, "%d/%d/", &LI, &LI) > 0) LN++;     fseek(LFile,LFilePos,SEEK_SET);     if(LN>2)     {      if((LOBJPolyGroup->Polygons=E3d_PolygonAddOneToArray(LOBJPolyGroup->Polygons,LOBJPolyGroup->NumOfPolygons,&(LOBJPolyGroup->NumOfPolygonsAllocated)))!=NULL)      {       LPolygon=LOBJPolyGroup->Polygons+LOBJPolyGroup->NumOfPolygons;       LOBJPolyGroup->NumOfPolygons+=1;      }      LVertexNode=E3d_PolygonVertexNodeAllocate(LPolygon,LN);      LVertexNode->VertexID=LVtxId-1;      LVertexNode++;      for(LC=1;LC<LN;LC++)      {       fscanf(LFile, "%d/%d/", &LVtxId, &LSTId);       LVertexNode->VertexID=LVtxId-1;       LVertexNode++;      }      LPolygon->NumOfVertices=LN;     }    }    else								// "v"    {     LN=1;     sscanf(LBuffer, "%d", &LVtxId);     LFilePos=ftell(LFile);     while(fscanf(LFile, "%d", &LI) > 0) LN++;     fseek(LFile,LFilePos,SEEK_SET);     if(LN>2)     {      if((LOBJPolyGroup->Polygons=E3d_PolygonAddOneToArray(LOBJPolyGroup->Polygons,LOBJPolyGroup->NumOfPolygons,&(LOBJPolyGroup->NumOfPolygonsAllocated)))!=NULL)      {       LPolygon=LOBJPolyGroup->Polygons+LOBJPolyGroup->NumOfPolygons;       LOBJPolyGroup->NumOfPolygons+=1;      }      LVertexNode=E3d_PolygonVertexNodeAllocate(LPolygon,LN);      LVertexNode->VertexID=LVtxId-1;      LVertexNode++;      for(LC=1;LC<LN;LC++)      {       fscanf(LFile, "%dd", &LVtxId);       LVertexNode->VertexID=LVtxId-1;       LVertexNode++;      }      LPolygon->NumOfVertices=LN;     }    }   break;   default:	fgets(LBuffer, sizeof(LBuffer), LFile);break;		// Skip the rest of the line  } }// Set the stats in the E3dMesh structure// LMesh->NumOfVertices  = LNumOfVertices; if(LNumOfVertices>0) {// Free unnecesserarily allocated Mesh vertices//  if(LNumOfVerticesAllocated>LNumOfVertices)  {   LMesh->Vertices=(E3dVertex*)ERealloc(LVertices,sizeof(E3dVertex)*LNumOfVertices);  }  else LMesh->Vertices=LVertices;  LMesh->NumOfVertices=LNumOfVertices; } else EFree(LVertices);// Convert PolyGroups// if((LNumOfPolyGroups>0)&&(LOBJPolyGroups!=NULL)) {  LOBJPolyGroup = LOBJPolyGroups;  for(LC = 0; LC < LNumOfPolyGroups; LC++, LOBJPolyGroup++)  {   if((LPolyGroup=E3d_MeshAddPolyGroup(LMesh))!=NULL)   {    LPolyGroup->Name=LOBJPolyGroup->Name;// Free unnecesserarily allocated Polygons//    if(LOBJPolyGroup->NumOfPolygonsAllocated>LOBJPolyGroup->NumOfPolygons)    {     LPolyGroup->Polygons=(E3dPolygon*)ERealloc(LOBJPolyGroup->Polygons,sizeof(E3dPolygon)*LOBJPolyGroup->NumOfPolygons);    }    else LPolyGroup->Polygons=LOBJPolyGroup->Polygons;    LPolyGroup->Material=LOBJPolyGroup->Material;    if(LOBJPolyGroup->Material!=NULL) LOBJPolyGroup->Material->RefCnt+=1;    LPolyGroup->NumOfPolygons=LOBJPolyGroup->NumOfPolygons;// Compute polygon normals for this PolyGroup//    E3d_PolyGroupRefreshPolygonNormals(LMesh,LPolyGroup);    if(LNumOfNormals>0) LPolyGroup->NormalFlags|=E3dUSE_VERTEX_NORMALS;   }  }  EFree(LOBJPolyGroups); } if(LMaterials!=NULL) EFree(LMaterials); EFree(LNormals); if(LSTs!=NULL) EFree(LSTs); return(LNumOfPolyGroups);}/*======================================*//* Read an OBJ file			*//*======================================*/E3dModel* E3d_ReadOBJFile(char* LFileName){ E3dModel*	LModel; E3dMesh*	LMesh; FILE* 		LInFile; if((LInFile=fopen(LFileName,"r"))!=NULL) {  LModel=NULL;  if((LMesh=E3d_MeshAllocate())!=NULL)  {   E3d_OBJReadMesh(LInFile, LFileName, LMesh);   if(LMesh->NumOfPolyGroups>0)   {    E3d_MeshRefreshGLPolyVertices(LMesh, TRUE);    if((LModel=E3d_ModelAllocate(LFileName))!=NULL)    {     LModel->Geometry=(E3dGeometry*)LMesh;     fclose(LInFile);return(LModel);    }   }  }  fclose(LInFile); } return(NULL);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -