Dimenticare

Ancient Game Maker Obj Importer

Jun 7th, 2018
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /// loadModelObject(String objectName);
  2.  
  3. /*
  4.  * This was made for something like Game Maker 7 and you'll want to adapt it to use vertex
  5.  * buffers and stuff instead of d3d.
  6.  *
  7.  * Also, the last time I used this was in 2014 so I have no idea how well it works . . .
  8.  * . . . if it works at all.
  9.  */
  10.  
  11. /*
  12.  * This is a little bit obsolete because .gmmod is much simpler to import.
  13.  */
  14.  
  15. /*
  16.     scr_load_model_obj(model_file);
  17.  
  18.     argument0: Path to the obj file (.obj)
  19.    
  20. returns: 3D model
  21.  
  22.     Make sure that the imported model only consists of triangles!
  23. */
  24. var file;
  25. file = file_text_open_read(argument0+".obj");
  26.  
  27. var v_listX,v_listY,v_listZ,vt_listX,vt_listY,vn_listX,vn_listY,vn_listZ, _r, g, b;
  28.  
  29. var matFileName,matFile;
  30.  
  31. matFileName = argument0+".mtl"; //directory of the material file
  32.  
  33. var vertexColor;
  34. vertexColor = c_white;
  35.  
  36. v_listX = ds_list_create();
  37. v_listY = ds_list_create();
  38. v_listZ = ds_list_create();
  39.  
  40. vt_listX = ds_list_create();
  41. vt_listY = ds_list_create();
  42. vt_listZ = ds_list_create();
  43.  
  44. vn_listX = ds_list_create();
  45. vn_listY = ds_list_create();
  46. vn_listZ = ds_list_create();
  47.  
  48. var model;
  49. model = d3d_model_create();
  50. d3d_model_primitive_begin(model,pr_trianglelist);
  51.  
  52. var zeile,nx,ny,nz,tx,ty,sx,vx,vy,vz;
  53.  
  54. while (!file_text_eof(file)){
  55.     zeile = file_text_read_string(file);
  56.     if (string_char_at(zeile,1) != '#'){ //if the first character is not a comment
  57.  
  58.         switch (string_char_at(zeile,1)){
  59.             case 'v':
  60.            
  61.             switch (string_char_at(zeile,2)){
  62.                 case 'n':
  63.                     zeile=string_delete(zeile,1,string_pos(" ",zeile));
  64.                     nx=real(string_copy(zeile,1,string_pos(" ",zeile)));
  65.                     zeile=string_delete(zeile,1,string_pos(" ",zeile));
  66.                     ny=-1*real(string_copy(zeile,1,string_pos(" ",zeile)));
  67.                     zeile=string_delete(zeile,1,string_pos(" ",zeile));
  68.                     nz=real(string_copy(zeile,1,string_length(zeile)));
  69.                    
  70.                     ds_list_add(vn_listX,nx);
  71.                     ds_list_add(vn_listY,ny);
  72.                     ds_list_add(vn_listZ,nz);  
  73.                 break;
  74.                
  75.                 case 't':
  76.                     zeile=string_delete(zeile,1,string_pos(" ",zeile));
  77.                     tx=real(string_copy(zeile,1,string_pos(" ",zeile)));
  78.                     zeile=string_delete(zeile,1,string_pos(" ",zeile));
  79.                     ty=1-real(string_copy(zeile,1,string_length(zeile)));
  80.                    
  81.                     ds_list_add(vt_listX,tx);
  82.                     ds_list_add(vt_listY,ty);
  83.                 break;
  84.                
  85.                
  86.                 default:
  87.                     zeile=string_delete(zeile,1,string_pos(" ",zeile));
  88.                     vx=real(string_copy(zeile,1,string_pos(" ",zeile)));
  89.                     zeile=string_delete(zeile,1,string_pos(" ",zeile));
  90.                     vy=real(string_copy(zeile,1,string_pos(" ",zeile)))*-1;
  91.                     zeile=string_delete(zeile,1,string_pos(" ",zeile));
  92.                     vz=real(string_copy(zeile,1,string_length(zeile)));
  93.                    
  94.                     ds_list_add(v_listX,vx);
  95.                     ds_list_add(v_listY,vy);
  96.                     ds_list_add(v_listZ,vz);
  97.                 break;
  98.                
  99.             }
  100.            
  101.             break;
  102.            
  103.            
  104.             case 's':
  105.                 zeile=string_delete(zeile,1,string_pos(" ",zeile));
  106.                 sx=string(string_copy(zeile,1,string_pos(" ",zeile)));
  107.                 if (sx != "off"){
  108.                
  109.                 }
  110.            
  111.             break;
  112.            
  113.            
  114.             case 'u':
  115.                 if(string_copy(zeile,2,5) == "semtl"){
  116.                 var vertexColorName,matFile;
  117.                
  118.                     zeile=string_delete(zeile,1,string_pos(" ",zeile));
  119.                     vertexColorName=string(string_copy(zeile,1,string_length(zeile))); //Materialname in modelfile
  120.                  
  121.                     matFile = file_text_open_read(matFileName);
  122.        
  123.                    
  124.                     while (file_text_eof(matFile)==false){
  125.                         zeile = file_text_read_string(matFile);
  126.                        
  127.                         if (string_char_at(zeile,1) != '#'){ //if not comment
  128.                    
  129.                             switch (string_char_at(zeile,1)){
  130.                                
  131.                                 case 'n':
  132.                                
  133.                                     if(string_copy(zeile,2,5) == "ewmtl"){
  134.                                    
  135.                                         zeile=string_delete(zeile,1,string_pos(" ",zeile));
  136.                                         vertexColorNameMat=string(string_copy(zeile,1,string_length(zeile))); //Colorname in Materialfile
  137.                                     }                
  138.                                
  139.                                
  140.                                 break;
  141.                                
  142.                                
  143.                                 case 'K':
  144.                                
  145.                                 switch (string_char_at(zeile,2)){
  146.                                     case 'd':
  147.                                    
  148.                                         if (vertexColorName == vertexColorNameMat){//if colorname in modelfile and materialfile are equal
  149.                                    
  150.                                             zeile=string_delete(zeile,1,string_pos(" ",zeile));
  151.                                             _r=256*real(string_copy(zeile,1,string_pos(" ",zeile)));
  152.                                             zeile=string_delete(zeile,1,string_pos(" ",zeile));
  153.                                             g=256*real(string_copy(zeile,1,string_pos(" ",zeile)));
  154.                                             zeile=string_delete(zeile,1,string_pos(" ",zeile));
  155.                                             b=256*real(string_copy(zeile,1,string_length(zeile)));
  156.                                            
  157.                                             vertexColor = make_color_rgb(_r,g,b);
  158.                                         }
  159.                                     break;
  160.                                    
  161.                                 }
  162.                                
  163.                                 break;
  164.                             }
  165.                            
  166.                         }
  167.                         file_text_readln(matFile);
  168.                    
  169.                     }
  170.                    
  171.                     file_text_close(matFile);
  172.                    
  173.                     //---------------------------------------------------------------------------------------------------
  174.                 }
  175.            
  176.             break;
  177.            
  178.            
  179.             case 'f':
  180.             var f;
  181.            
  182.             zeile=string_delete(zeile,1,string_pos(" ",zeile));
  183.             f[0]=string(string_copy(zeile,1,string_pos(" ",zeile)));
  184.             zeile=string_delete(zeile,1,string_pos(" ",zeile));
  185.             f[2]=string(string_copy(zeile,1,string_pos(" ",zeile)));
  186.             zeile=string_delete(zeile,1,string_pos(" ",zeile));
  187.             f[1]=string(string_copy(zeile,1,string_length(zeile)));
  188.            
  189.                 var p,z,e1,e2,e3;
  190.                 p=0;
  191.                 repeat(3){
  192.                     z = f[p];
  193.                    
  194.                     z=string_delete(z,0,string_pos("/",z));
  195.                     e1=real(string(string_copy(z,1,string_pos("/",z)-1)))-1;
  196.                     z=string_delete(z,1,string_pos("/",z));
  197.                     e2=real(string(string_copy(z,1,string_pos("/",z)-1)))-1;
  198.                     z=string_delete(z,1,string_pos("/",z));
  199.                     e3=real(string(string_copy(z,1,string_length(z))))-1;
  200.                    
  201.                     p+=+1;
  202.                                      
  203.                     d3d_model_vertex_normal_texture_color(model,ds_list_find_value(v_listX,e1),ds_list_find_value(v_listY,e1),ds_list_find_value(v_listZ,e1),
  204.                                 ds_list_find_value(vn_listX,e3),ds_list_find_value(vn_listY,e3),ds_list_find_value(vn_listZ,e3),
  205.                                 ds_list_find_value(vt_listX,e2),ds_list_find_value(vt_listY,e2),vertexColor,1);
  206.                
  207.                 }
  208.             break;
  209.         }
  210.     }
  211.     file_text_readln(file);
  212. }
  213.  
  214. file_text_close(file);
  215.  
  216. d3d_model_primitive_end(model);
  217.  
  218. //delete lists
  219. ds_list_destroy(v_listX);
  220. ds_list_destroy(v_listY);
  221. ds_list_destroy(v_listZ);
  222. ds_list_destroy(vt_listX);
  223. ds_list_destroy(vt_listY);
  224. ds_list_destroy(vn_listX);
  225. ds_list_destroy(vn_listY);
  226. ds_list_destroy(vn_listZ);
  227.  
  228. return model;
Advertisement
Add Comment
Please, Sign In to add comment