📄 obj.c
字号:
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 + -