Advertisement
glitchdetector

[GML] create_model (REUPLOAD, OBJ IMPORTER)

Jan 13th, 2015
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ///create_model(file,flipnormals)
  2. // MOSAIC Light 3D OBJ IMPORTER
  3. // (c) 2006. Zoltan Percsich. All Rights Reserved.
  4. // reuploaded on pastebin by /u/glitchdetector, no modifications made, credit the original author, Zoltan Percsich.
  5. // Example use:
  6. // plane_model = create_model("modelOfPlane.obj",false);
  7.  
  8. filename=argument0;
  9. flipnormals = 1;
  10. if (argument1>0) flipnormals=-1;
  11. vertex_list1=ds_list_create();ds_list_clear(vertex_list1);ds_list_add(vertex_list1,0);
  12. vertex_list2=ds_list_create();ds_list_clear(vertex_list2);ds_list_add(vertex_list2,0);
  13. vertex_list3=ds_list_create();ds_list_clear(vertex_list3);ds_list_add(vertex_list3,0);
  14. normal_list1=ds_list_create();ds_list_clear(normal_list1);ds_list_add(normal_list1,0);
  15. normal_list2=ds_list_create();ds_list_clear(normal_list2);ds_list_add(normal_list2,0);
  16. normal_list3=ds_list_create();ds_list_clear(normal_list3);ds_list_add(normal_list3,0);
  17. texture_list1=ds_list_create();ds_list_clear(texture_list1);ds_list_add(texture_list1,0);
  18. texture_list2=ds_list_create();ds_list_clear(texture_list2);ds_list_add(texture_list2,0);
  19. faces_list=ds_list_create();ds_list_clear(faces_list);
  20. fp=file_text_open_read(filename);
  21.  
  22. for (i=0;file_text_eof(fp)==false;i+=1) {
  23.  
  24.     row=file_text_read_string(fp);row=string_replace_all(row,"  "," ");
  25.  
  26.     if (string_char_at(row,1)=="v" && string_char_at(row,2)==" ") {
  27.         row=string_delete(row,1,string_pos(" ",row));
  28.         vx=real(string_copy(row,1,string_pos(" ",row)));
  29.         row=string_delete(row,1,string_pos(" ",row));
  30.         vy=real(string_copy(row,1,string_pos(" ",row)));
  31.         row=string_delete(row,1,string_pos(" ",row));
  32.         vz=real(string_copy(row,1,string_length(row)));
  33.         ds_list_add(vertex_list1,vx);
  34.         ds_list_add(vertex_list2,vy);
  35.         ds_list_add(vertex_list3,vz);
  36.     }
  37.  
  38.     if (string_char_at(row,1)=="v" && string_char_at(row,2)=="n") {
  39.         row=string_delete(row,1,string_pos(" ",row));
  40.         nx=real(string_copy(row,1,string_pos(" ",row)));
  41.         row=string_delete(row,1,string_pos(" ",row));
  42.         ny=real(string_copy(row,1,string_pos(" ",row)));
  43.         row=string_delete(row,1,string_pos(" ",row));
  44.         nz=real(string_copy(row,1,string_length(row)));
  45.         ds_list_add(normal_list1,nx);
  46.         ds_list_add(normal_list2,ny);
  47.         ds_list_add(normal_list3,nz);
  48.     }
  49.  
  50.     if (string_char_at(row,1)=="v" && string_char_at(row,2)=="t") {
  51.         row=string_delete(row,1,string_pos(" ",row));
  52.         tx=real(string_copy(row,1,string_pos(" ",row)));
  53.         row=string_delete(row,1,string_pos(" ",row));
  54.         ty=real(string_copy(row,1,string_length(row)));
  55.         ds_list_add(texture_list1,tx);
  56.         ds_list_add(texture_list2,ty);
  57.     }
  58.  
  59.     if (string_char_at(row,1)=="f" && string_char_at(row,2)==" ") {
  60.         row=string_replace_all(row,"  "," ");
  61.         row=string_delete(row,1,string_pos(" ",row));
  62.         if (string_char_at(row,string_length(row))==" ") row=string_copy(row,0,string_length(row)-1);
  63.         face_num=string_count(" ",row);
  64.         face_division=1;
  65.         temp_faces[0]=0;
  66.  
  67.         for (fc=0;fc<face_num;fc+=1) {
  68.             f=string_copy(row,1,string_pos(" ",row));
  69.             row=string_delete(row,1,string_pos(" ",row));
  70.             temp_faces[face_division]=f;
  71.             face_division+=1;
  72.         }
  73.  
  74.         f=string_copy(row,1,string_length(row));temp_faces[face_division]=f;
  75.         if (face_division==3) {
  76.             f1=temp_faces[2];
  77.             f2=temp_faces[3];
  78.             f3=temp_faces[1];
  79.             ds_list_add(faces_list,f1);
  80.             ds_list_add(faces_list,f2);
  81.             ds_list_add(faces_list,f3);
  82.         } else {
  83.             f1=temp_faces[2];
  84.             f2=temp_faces[3];
  85.             f3=temp_faces[1];
  86.             ds_list_add(faces_list,f1);
  87.             ds_list_add(faces_list,f2);
  88.             ds_list_add(faces_list,f3);
  89.             for (t=0;t<face_division-3;t+=1) {
  90.                 f1=temp_faces[4+t];
  91.                 f2=temp_faces[1];
  92.                 f3=temp_faces[3+t];
  93.                 ds_list_add(faces_list,f1);
  94.                 ds_list_add(faces_list,f2);
  95.                 ds_list_add(faces_list,f3);
  96.             }
  97.         }
  98.     }
  99.  
  100.     file_text_readln(fp);
  101. }
  102. file_text_close(fp);
  103.  
  104. tm=d3d_model_create();
  105. tsn=0;
  106. d3d_model_primitive_begin(tm,pr_trianglelist);
  107.  
  108. for (fc=0;fc<ds_list_size(faces_list);fc+=1) {
  109.  
  110.     sub_face=ds_list_find_value(faces_list,fc);
  111.  
  112.     if (string_count("/",sub_face)==0) {
  113.         f_index=sub_face;
  114.         t_index=-1;
  115.         n_index=-1;
  116.     }
  117.  
  118.     if (string_count("/",sub_face)==1) {
  119.         f_index=string_copy(sub_face,1,string_pos("/",sub_face)-1);
  120.         sub_face=string_delete(sub_face,1,string_pos("/",sub_face));
  121.         t_index=string_copy(sub_face,1,string_length(sub_face));
  122.         n_index=-1;
  123.     }
  124.  
  125.     if (string_count("/",sub_face)==2 && string_count("//",sub_face)==0) {
  126.         f_index=string_copy(sub_face,1,string_pos("/",sub_face)-1);
  127.         sub_face= string_delete(sub_face,1,string_pos("/",sub_face));
  128.         t_index=string_copy(sub_face,1,string_pos("/",sub_face)-1);
  129.         sub_face= string_delete(sub_face,1,string_pos("/",sub_face));
  130.         n_index=string_copy(sub_face,1,string_length(sub_face));
  131.     }
  132.  
  133.     if (string_count("/",sub_face)==2 && string_count("//",sub_face)==1) {
  134.         sub_face=string_replace(sub_face,"//","/");
  135.         f_index=string_copy(sub_face,1,string_pos("/",sub_face)-1);
  136.         sub_face= string_delete(sub_face,1,string_pos("/",sub_face));
  137.         t_index=-1;
  138.         n_index=string_copy(sub_face,1,string_length(sub_face));
  139.     }
  140.  
  141.     vx=ds_list_find_value(vertex_list1,floor(real(f_index)));
  142.     vy=ds_list_find_value(vertex_list2,floor(real(f_index)));
  143.     vz=ds_list_find_value(vertex_list3,floor(real(f_index)));
  144.  
  145.     if (floor(real(n_index))!=-1 && ds_list_size(normal_list1)>=1) {
  146.         nx=flipnormals*ds_list_find_value(normal_list1,floor(real(n_index)));
  147.         ny=flipnormals*ds_list_find_value(normal_list2,floor(real(n_index)));
  148.         nz=flipnormals*ds_list_find_value(normal_list3,floor(real(n_index)));
  149.     } else {
  150.         nx=0;
  151.         ny=0;
  152.         nz=0;
  153.     }
  154.  
  155.     if (floor(real(t_index))!=-1 && ds_list_size(texture_list1)>=1) {
  156.         tx=ds_list_find_value(texture_list1,floor(real(t_index)));
  157.         ty=ds_list_find_value(texture_list2,floor(real(t_index)));
  158.     } else {
  159.         tx=0;
  160.         ty=0;
  161.     }
  162.  
  163.     d3d_model_vertex_normal_texture(tm,vx,vy,vz,nx,ny,nz,tx,ty);
  164.  
  165.     tsn+=1;
  166.     if (tsn==999) {
  167.         tsn=0;
  168.         d3d_model_primitive_end(tm);
  169.         d3d_model_primitive_begin(tm,pr_trianglelist);
  170.     }
  171. }
  172.  
  173. d3d_model_primitive_end(tm);
  174. return tm;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement