home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 5257 / source.7z / x_max.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2012-03-18  |  9.7 KB  |  247 lines

  1. #include "xentax.h"
  2. #include "x_smc.h"
  3. #include "x_max.h"
  4.  
  5. /*
  6. template<class T>
  7. bool MAXOutputTriangleFaceMaterials(const SIMPLEMODELCONTAINER& data, const IDX_BUFFER& ib, std::ofstream& ofile)
  8. {
  9.  // pointer to data
  10.  const T* pointer = reinterpret_cast<const T*>(ib.data.get());
  11.  if(!pointer) return error("MAX EXPORT: Invalid data pointer.");
  12.  
  13.  // output triangles
  14.  ofile << "  -- materials" << std::endl;
  15.  for(size_t j = 0; j < ib.elem/3; j++) {
  16.      if(ib.material != 0xFFFFFFFF) ofile << "  append mbuffer mm.materialIDList[" << (ib.material + 1) << "]" << std::endl;
  17.      else ofile << "  append mbuffer 2" << std::endl;
  18.     }
  19.  
  20.  return true;
  21. }
  22.  
  23. template<class T>
  24. bool MAXOutputTriangles(const IDX_BUFFER& ib, std::ofstream& ofile)
  25. {
  26.  // pointer to data
  27.  const T* pointer = reinterpret_cast<const T*>(ib.data.get());
  28.  if(!pointer) return error("MAX EXPORT: Invalid data pointer.");
  29.  
  30.  // output triangles
  31.  ofile << "  -- triangles" << std::endl;
  32.  for(size_t j = 0; j < ib.elem/3; j++) {
  33.      T a = pointer[3*j + 0] + 1;
  34.      T b = pointer[3*j + 1] + 1;
  35.      T c = pointer[3*j + 2] + 1;
  36.      ofile << "  append ibuffer [" << a << "," << b << "," << c << "]" << std::endl;
  37.     }
  38.  
  39.  return true;
  40. }
  41.  
  42. template<class T>
  43. bool MAXOutputMapVert(const IDX_BUFFER& ib, uint32 channel, std::ofstream& ofile)
  44. {
  45.  // pointer to data
  46.  const T* pointer = reinterpret_cast<const T*>(ib.data.get());
  47.  if(!pointer) return error("MAX EXPORT: Invalid data pointer.");
  48.  
  49.  // output texture coordinates
  50.  ofile << "  -- set texture coordinates # " << channel << std::endl;
  51.  ofile << "  meshop.setNumMapVerts model " << channel << " " << ib.elem << std::endl;
  52.  for(size_t j = 0; j < ib.elem; j++) {
  53.      uint32 vertex_index = pointer[j] + 1;
  54.      ofile << "  meshop.setMapVert model " << channel << " " << (j + 1) << " tbuffer[" << vertex_index << "]" << std::endl;
  55.     }
  56.  
  57.  return true;
  58. }
  59.  
  60. bool GeometryToMAX(const char* path, const char* name, const SIMPLEMODELCONTAINER& data)
  61. {
  62.  // create maxscript file
  63.  std::stringstream ss;
  64.  ss << path << name << ".ms";
  65.  std::ofstream ofile(ss.str().c_str());
  66.  if(!ofile) return error("MAXSCRIPT EXPORT: Error creating output file.");
  67.  
  68.  ofile << "--" << std::endl;
  69.  ofile << "-- INITIALIZATION " << std::endl;
  70.  ofile << "--" << std::endl;
  71.  ofile << std::endl;
  72.  
  73.  ofile << "  -- initialize buffers" << std::endl;
  74.  ofile << "  clearListner()" << std::endl;
  75.  if(data.model->vbuffer.flags & VERTEX_POSITION) ofile << "  vbuffer = #()" << std::endl;
  76.  if(data.model->vbuffer.flags & VERTEX_NORMAL) ofile << "  nbuffer = #()" << std::endl;
  77.  if(data.model->vbuffer.flags & VERTEX_UV) ofile << "  tbuffer = #()" << std::endl;
  78.  if(data.model->ibuffer.size()) ofile << "  ibuffer" << " = #()" << std::endl;
  79.  if(data.materials.size()) ofile << "  mbuffer" << " = #()" << std::endl;
  80.  ofile << std::endl;
  81.  
  82.  if(data.materials.size())
  83.    {
  84.     ofile << "--" << std::endl;
  85.     ofile << "-- MATERIALS " << std::endl;
  86.     ofile << "--" << std::endl;
  87.     ofile << std::endl;
  88.    
  89.     ofile << "  texturePathName = getSavePath caption:\"Select Texture Folder\"" << std::endl;
  90.     ofile << std::endl;
  91.    
  92.     ofile << "  mm = multimaterial()" << std::endl;
  93.     ofile << "  mm.numsubs = " << data.materials.size() << std::endl;
  94.  
  95.     for(size_t i = 0; i < data.materials.size(); i++)
  96.        {
  97.         ofile << "  -- create material" << std::endl;
  98.         ofile << "  mat = standardMaterial()" << std::endl;
  99.         ofile << "  mat.shaderByName = " << "\"" << "Blinn" << "\"" << std::endl;
  100.         ofile << "  mat.name = " << "\"" << data.materials[i].id << "\"" << std::endl;
  101.         ofile << "  mat.twoSided = false" << std::endl;
  102.         ofile << "  mat.showInViewport = true" << std::endl;
  103.         ofile << "  mat.faceMap = false" << std::endl;
  104.         ofile << std::endl;
  105.    
  106.         uint32 basemap = data.materials[i].basemap;
  107.         if(data.materials[i].basemap != 0xFFFFFFFF) {
  108.            ofile << "  -- assign base texture to material" << std::endl;
  109.            ofile << "  mat.diffuseMap = BitmapTexture()" << std::endl;        
  110.            ofile << "  mat.diffuseMap.filename = texturePathName + " << "\"/" << data.textures[basemap].filename << "\"" << std::endl;
  111.            ofile << std::endl;
  112.           }
  113.    
  114.         uint32 specmap = data.materials[i].specmap;
  115.         if(data.materials[i].specmap != 0xFFFFFFFF) {
  116.            ofile << "  -- assign specular texture to material" << std::endl;
  117.            ofile << "  mat.specularMap = BitmapTexture()" << std::endl;        
  118.            ofile << "  mat.specularMap.filename = texturePathName + " << "\"/" << data.textures[specmap].filename << "\"" << std::endl;
  119.            ofile << std::endl;
  120.           }
  121.  
  122.         uint32 normmap = data.materials[i].normmap;
  123.         if(data.materials[i].normmap != 0xFFFFFFFF) {
  124.            ofile << "  -- assign normal texture to material" << std::endl;
  125.            ofile << "  bt = BitmapTexture()" << std::endl;        
  126.            ofile << "  bt.filename = texturePathName + " << "\"/" << data.textures[normmap].filename << "\"" << std::endl;
  127.            ofile << "  mat.bumpMapEnable = true" << std::endl;
  128.            ofile << "  mat.bumpMapAmount = 100" << std::endl;
  129.            ofile << "  mat.bumpMap = Normal_Bump()" << std::endl;
  130.            ofile << "  mat.bumpMap.normal_map = bt" << std::endl;
  131.            ofile << std::endl;
  132.           }
  133.  
  134.         ofile << "  -- insert material" << std::endl;
  135.         ofile << "  mm.mapEnabled[" << (i + 1) << "] = true" << std::endl;
  136.         ofile << "  mm[" << (i + 1) << "] = mat" << std::endl;
  137.         ofile << std::endl;
  138.        }
  139.  
  140.     ofile << "--" << std::endl;
  141.     ofile << "-- FACE MATERIALS " << std::endl;
  142.     ofile << "--" << std::endl;
  143.     ofile << std::endl;
  144.    
  145.     // process faces
  146.     for(size_t i = 0; i < data.model->ibuffer.size(); i++)
  147.        {
  148.         const IDX_BUFFER& ib = data.model->ibuffer[i];
  149.         if(ib.type == FACE_TYPE_TRIANGLES) {
  150.            if(ib.elem < 3) return error("MAX EXPORT: Invalid index buffer.");
  151.            if(ib.elem % 3) return error("MAX EXPORT: Invalid index buffer.");
  152.            if(ib.format == FACE_FORMAT_UINT_08) { if(!MAXOutputTriangleFaceMaterials<uint08>(data, ib, ofile)) return false; }
  153.            if(ib.format == FACE_FORMAT_UINT_16) { if(!MAXOutputTriangleFaceMaterials<uint16>(data, ib, ofile)) return false; }
  154.            if(ib.format == FACE_FORMAT_UINT_32) { if(!MAXOutputTriangleFaceMaterials<uint32>(data, ib, ofile)) return false; }
  155.            ofile << std::endl;
  156.           }
  157.        }
  158.    }
  159.  
  160.  ofile << "--" << std::endl;
  161.  ofile << "-- VERTEX BUFFER " << std::endl;
  162.  ofile << "--" << std::endl;
  163.  ofile << std::endl;
  164.  
  165.  if(data.model->vbuffer.flags & VERTEX_POSITION)
  166.    {
  167.     for(size_t i = 0; i < data.model->vbuffer.elem; i++) {
  168.         float x = data.model->vbuffer.data[i].vx;
  169.         float y = data.model->vbuffer.data[i].vy;
  170.         float z = data.model->vbuffer.data[i].vz;
  171.         ofile << "  append vbuffer [" << x << "," << y << "," << z << "]" << std::endl;
  172.        }
  173.     ofile << std::endl;
  174.    }
  175.  ofile << std::endl;
  176.  
  177.  if(data.model->vbuffer.flags & VERTEX_NORMAL)
  178.    {
  179.     for(size_t i = 0; i < data.model->vbuffer.elem; i++) {
  180.         float x = data.model->vbuffer.data[i].nx;
  181.         float y = data.model->vbuffer.data[i].ny;
  182.         float z = data.model->vbuffer.data[i].nz;
  183.         ofile << "  append nbuffer [" << x << "," << y << "," << z << "]" << std::endl;
  184.        }
  185.     ofile << std::endl;
  186.    }
  187.  
  188.  if(data.model->vbuffer.flags & VERTEX_UV)
  189.    {
  190.     for(size_t i = 0; i < data.model->vbuffer.elem; i++) {
  191.         float x = data.model->vbuffer.data[i].tu;
  192.         float y = data.model->vbuffer.data[i].tv;
  193.         float z = 0.0f;
  194.         ofile << "  append tbuffer [" << x << "," << y << "," << z << "]" << std::endl;
  195.        }
  196.     ofile << std::endl;
  197.    }
  198.  
  199.  ofile << "--" << std::endl;
  200.  ofile << "-- INDEX BUFFERS " << std::endl;
  201.  ofile << "--" << std::endl;
  202.  ofile << std::endl;
  203.  
  204.  // process index buffers
  205.  for(size_t i = 0; i < data.model->ibuffer.size(); i++)
  206.     {
  207.      const IDX_BUFFER& ib = data.model->ibuffer[i];
  208.      if(ib.type == FACE_TYPE_TRIANGLES) {
  209.         if(ib.elem < 3) return error("MAX EXPORT: Invalid index buffer.");
  210.         if(ib.elem % 3) return error("MAX EXPORT: Invalid index buffer.");
  211.         if(ib.format == FACE_FORMAT_UINT_08) { if(!MAXOutputTriangles<uint08>(ib, ofile)) return false; }
  212.         if(ib.format == FACE_FORMAT_UINT_16) { if(!MAXOutputTriangles<uint16>(ib, ofile)) return false; }
  213.         if(ib.format == FACE_FORMAT_UINT_32) { if(!MAXOutputTriangles<uint32>(ib, ofile)) return false; }
  214.         ofile << std::endl;
  215.        }
  216.     }
  217.  
  218.  ofile << "  -- create model" << std::endl;
  219.  if(data.materials.size()) ofile << "  model = mesh vertices:vbuffer faces:ibuffer materialIDs:mbuffer" << std::endl;
  220.  else ofile << "  model = mesh vertices:vbuffer faces:ibuffer" << std::endl;
  221.  ofile << "  model.name = " << "\"" << data.model->id << "\"" << std::endl;
  222.  ofile << "  update model" << std::endl;
  223.  ofile << std::endl;
  224.  
  225.  ofile << "--" << std::endl;
  226.  ofile << "-- TEXTURE COORDINATES " << std::endl;
  227.  ofile << "--" << std::endl;
  228.  ofile << std::endl;
  229.  
  230.  ofile << "  -- enable texture map channels" << std::endl;
  231.  ofile << "  meshop.setNumMaps model 2" << std::endl;
  232.  ofile << "  update model" << std::endl;
  233.  ofile << std::endl;
  234.  
  235.  // for each index buffer
  236.  ofile << "  meshop.setNumTVerts model " << data.model->vbuffer.elem << std::endl;
  237.  for(size_t i = 0; i < data.model->vbuffer.elem; i++)
  238.      ofile << "  setTVert model " << (i + 1) << " tbuffer[" << (i + 1) << "]" << std::endl;
  239.  ofile << std::endl;
  240.  
  241.  ofile << "  -- update model" << std::endl;
  242.  ofile << "  model.material = mm" << std::endl;
  243.  ofile << "  update model" << std::endl;
  244.  
  245.  return true;
  246. }
  247. */