Not logged in, Join Here! or Log In Below:  
 
News Articles Search    
 

 Home / 3D Theory & Graphics / No Lib3DS exporter examples? Account Manager
 
Archive Notice: This thread is old and no longer active. It is here for reference purposes. This thread was created on an older version of the flipcode forums, before the site closed in 2005. Please keep that in mind as you view this thread, as many of the topics and opinions may be outdated.
 
IndrekSnt

May 07, 2005, 07:18 AM

Could someone here please explain me, why there aren't any Lib3DS examples about exporting?
For some reason my exporter zeros the structures after leaving the scope and i can't find any example or tutorial on how a correct exporter should look like in code. And Google finds nothing usable about this, Why?
So many people have managed to finish a 3DS exporter, but no one has ever published any source code?

I'm sorry for disturbing you in this forum, but it would be really nice to get a link to some examples.

All suggestions are welcome, Thank You..

 
Ryan Gregg

May 07, 2005, 11:50 AM

Here is one I wrote, never said it was pretty...

  1.  
  2. bool CBSP::Export3DS(const char *c3DSFile, bool bMaterials , bool bLights , bool bSpecial)
  3. {
  4.         char cTemp[512];
  5.  
  6.         Lib3dsFile *pFile = lib3ds_file_new();
  7.  
  8.         if(bLights)
  9.         {
  10.                 unsigned int uiLight = 0;
  11.                 for(CBSP::CBSPEntityList::iterator it = this->BSPEntityList.begin(); it != this->BSPEntityList.end(); ++it)
  12.                 {
  13.                         CBSPEntity *Entity = *it;
  14.  
  15.                         const char *cClassName = Entity->GetValue("classname");
  16.                         if(cClassName != 0 && stricmp(cClassName, "light") == 0)
  17.                         {
  18.                                 float fOrigin[3];
  19.  
  20.                                 const char *cOrigin = Entity->GetValue("origin");
  21.                                 if(cOrigin == 0 || sscanf(cOrigin, "%f %f %f", &fOrigin[0], &fOrigin[1], &fOrigin[2]) != 3)
  22.                                 {
  23.                                         continue;
  24.                                 }
  25.  
  26.                                 float fRange;
  27.                                 unsigned int uiColor[3];
  28.  
  29.                                 const char *cColor = Entity->GetValue("_light");
  30.                                 if(cColor == 0 || sscanf(cColor, "%u %u %u %f", &uiColor[0], &uiColor[1], &uiColor[2], &fRange) != 4)
  31.                                 {
  32.                                         continue;
  33.                                 }
  34.  
  35.                                 sprintf(cTemp, "Light_%.4u", uiLight);
  36.  
  37.                                 Lib3dsLight *pLight = lib3ds_light_new(cTemp);
  38.  
  39.                                 pLight->position[0] = fOrigin[0];
  40.                                 pLight->position[1] = fOrigin[1];
  41.                                 pLight->position[2] = fOrigin[2];
  42.  
  43.                                 pLight->color[0] = (float)uiColor[0] / 255.0f;
  44.                                 pLight->color[1] = (float)uiColor[1] / 255.0f;
  45.                                 pLight->color[2] = (float)uiColor[2] / 255.0f;
  46.  
  47.                                 pLight->inner_range = 0.0f;
  48.                                 pLight->outer_range = fRange;
  49.  
  50.                                 lib3ds_file_insert_light(pFile, pLight);
  51.  
  52.                                 uiLight++;
  53.                         }
  54.                 }
  55.         }
  56.  
  57.         if(bMaterials)
  58.         {
  59.                 LPBSPMIPTEXTURELUMP pMipTextureLump = (LPBSPMIPTEXTURELUMP)(this->lpTextureData);
  60.  
  61.                 // Loop through each lump in the BSP file.
  62.                 for(INT i = 0; i < pMipTextureLump->MipTextureCount; i++)
  63.                 {
  64.                         // If the lump doesn't exist don't process it.
  65.                         if(pMipTextureLump->Offsets[i] == -1)
  66.                         {
  67.                                 continue;
  68.                         }
  69.  
  70.                         LPBSPMIPTEXTURE pMipTexture = (LPBSPMIPTEXTURE)((LPBYTE)this->lpTextureData + pMipTextureLump->Offsets[i]);
  71.  
  72.                         Lib3dsMaterial *pMaterial = lib3ds_material_new();
  73.  
  74.                         strcpy(pMaterial->name, pMipTexture->Name);
  75.  
  76.                         strcpy(pMaterial->texture1_map.name, pMipTexture->Name);
  77.                         strcat(pMaterial->texture1_map.name, ".bmp");
  78.  
  79.                         //pMaterial->texture1_map.tint_1[0] = 0;
  80.                         //pMaterial->texture1_map.tint_1[1] = 0;
  81.                         //pMaterial->texture1_map.tint_1[2] = 0;
  82.  
  83.                         //pMaterial->texture1_map.tint_2[0] = 255;
  84.                         //pMaterial->texture1_map.tint_2[1] = 255;
  85.                         //pMaterial->texture1_map.tint_2[2] = 255;
  86.  
  87.                         //pMaterial->texture1_map.tint_r[0] = 255;
  88.                         //pMaterial->texture1_map.tint_r[1] = 0;
  89.                         //pMaterial->texture1_map.tint_r[2] = 0;
  90.  
  91.                         //pMaterial->texture1_map.tint_g[0] = 0;
  92.                         //pMaterial->texture1_map.tint_g[1] = 255;
  93.                         //pMaterial->texture1_map.tint_g[2] = 0;
  94.  
  95.                         //pMaterial->texture1_map.tint_b[0] = 0;
  96.                         //pMaterial->texture1_map.tint_b[1] = 0;
  97.                         //pMaterial->texture1_map.tint_b[2] = 255;
  98.  
  99.                         lib3ds_file_insert_material(pFile, pMaterial);
  100.                 }
  101.         }
  102.  
  103.         //
  104.         // Export each model.
  105.         //
  106.  
  107.         LPBSPMIPTEXTURELUMP pMipTextureLump = ((LPBSPMIPTEXTURELUMP)this->lpTextureData);
  108.  
  109.         unsigned int uiModel = 0;
  110.         for(unsigned int i = 0; i < this->uiModelCount; i++)
  111.         {
  112.                 LPBSPMODEL lpModel = &this->lpModels[i];
  113.  
  114.                 //
  115.                 // Count face and vertex info.
  116.                 //
  117.  
  118.                 unsigned int uiFaces = 0;
  119.                 unsigned int uiVertices = 0;
  120.                 for(int j = 0; j < lpModel->FaceCount; j++)
  121.                 {
  122.                         CBSPFace *lpFace = &this->lpBSPFaces[lpModel->FaceIndex + j];
  123.  
  124.                         if(!bSpecial && lpFace->IsSpecial)
  125.                         {
  126.                                 continue;
  127.                         }
  128.  
  129.                         uiFaces += lpFace->VertexCount - 2;
  130.                         uiVertices += lpFace->VertexCount;
  131.                 }
  132.  
  133.                 // If empty discard model.
  134.                 if(uiFaces == 0)
  135.                 {
  136.                         continue;
  137.                 }
  138.  
  139.                 sprintf(cTemp, "Model_%.4u", uiModel);
  140.  
  141.                 //
  142.                 // Create new mesh.
  143.                 //
  144.  
  145.                 Lib3dsMesh *pMesh = lib3ds_mesh_new(cTemp);
  146.  
  147.                 if(!lib3ds_mesh_new_point_list(pMesh, uiVertices))
  148.                 {
  149.                         lib3ds_mesh_free(pMesh);
  150.                         continue;
  151.                 }
  152.  
  153.                 if(!lib3ds_mesh_new_texel_list(pMesh, uiVertices))
  154.                 {
  155.                         lib3ds_mesh_free(pMesh);
  156.                         continue;
  157.                 }
  158.  
  159.                 if(!lib3ds_mesh_new_face_list(pMesh, uiFaces))
  160.                 {
  161.                         lib3ds_mesh_free(pMesh);
  162.                         continue;
  163.                 }
  164.  
  165.                 //
  166.                 // Fill in vertex, texel and face data.
  167.                 //
  168.  
  169.                 unsigned int uiFace = 0;
  170.                 unsigned int uiVertex = 0;
  171.                 for(int j = 0; j < lpModel->FaceCount; j++)
  172.                 {
  173.                         CBSPFace *lpFace = &this->lpBSPFaces[lpModel->FaceIndex + j];
  174.  
  175.                         if(!bSpecial && lpFace->IsSpecial)
  176.                         {
  177.                                 continue;
  178.                         }
  179.  
  180.                         LPBSPTEXTUREINFO pTextureInfo = &this->lpTextureInfos[this->lpFaces[lpModel->FaceIndex + j].TextureInfoIndex];
  181.  
  182.                         if(pMipTextureLump->Offsets[pTextureInfo->MipTextureIndex] == -1)
  183.                         {
  184.                                 continue;
  185.                         }
  186.  
  187.                         LPBSPMIPTEXTURE pMipTexture = (LPBSPMIPTEXTURE)(this->lpTextureData + pMipTextureLump->Offsets[pTextureInfo->MipTextureIndex]);
  188.  
  189.                         unsigned int uiBaseVertex = uiVertex;
  190.                         for(unsigned int k = 0; k < lpFace->VertexCount; k++)
  191.                         {
  192.                                 CBSPVertex *lpVertex = &this->lpBSPVertices[lpFace->VertexIndex + k];
  193.  
  194.                                 pMesh->pointL[uiVertex].pos[0] = lpVertex->WorldPoint[0];
  195.                                 pMesh->pointL[uiVertex].pos[1] = lpVertex->WorldPoint[1];
  196.                                 pMesh->pointL[uiVertex].pos[2] = lpVertex->WorldPoint[2];
  197.  
  198.                                 pMesh->texelL[uiVertex][0] = lpVertex->TexPoint[0];
  199.                                 pMesh->texelL[uiVertex][1] = -lpVertex->TexPoint[1];
  200.  
  201.                                 if(k >= 2)
  202.                                 {
  203.                                         if(bMaterials)
  204.                                         {
  205.                                                 strcpy(pMesh->faceL[uiFace].material, pMipTexture->Name);
  206.                                         }
  207.  
  208.                                         pMesh->faceL[uiFace].points[0] = uiBaseVertex + k;
  209.                                         pMesh->faceL[uiFace].points[1] = uiBaseVertex + k - 1;
  210.                                         pMesh->faceL[uiFace].points[2] = uiBaseVertex;
  211.  
  212.                                         uiFace++;
  213.                                 }
  214.  
  215.                                 uiVertex++;
  216.                         }
  217.                 }
  218.  
  219.                 lib3ds_file_insert_mesh(pFile, pMesh);
  220.  
  221.                 uiModel++;
  222.         }
  223.  
  224.         bool bResult = lib3ds_file_save(pFile, c3DSFile) == LIB3DS_TRUE;
  225.  
  226.         lib3ds_file_free(pFile);
  227.  
  228.         return bResult;
  229. }
  230.  

 
IndrekSnt

May 07, 2005, 12:30 PM

Wow, Thank You, it helped me out from this problem..

It seems that my only mistake was calling Lib3dsMesh *Mesh = lib3ds_mesh_new(); at the beginning of a loop and in the end of the loop i freed it with lib3ds_mesh_free (Mesh); and that probably wasn't a very good idea, as it cleared the whole Lib3dsFile structure.

Sorry, i was somewhat angry on my exporter plugin before..

Thank You again!

 
This thread contains 3 messages.
 
 
Hosting by Solid Eight Studios, maker of PhotoTangler Collage Maker.