Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.52 KB | None | 0 0
  1. import zlib, os, re
  2. from  more_itertools import unique_everseen
  3. from time import sleep
  4.  
  5. print('FACE EXPORT BiN2FeF'.center(30))
  6. print('=' * 30)
  7. print('Por: Fábio Vitor'.center(30))
  8. print('_'* 30)
  9.  
  10. search = input('\nFile_Name: ')
  11. file = open(search, 'r+b')
  12. location = os.path.dirname(os.path.abspath('f'))
  13. file_name = file.name
  14. explod_file = file.name.split('.')
  15. only_name = '.'.join(explod_file[:-1])
  16. textura = '"'+location+'/'+only_name+'.png"'
  17. file.seek(32, 0)
  18. data2 = file.read()
  19. data3 = zlib.decompress(data2,32)
  20. out = open(only_name+'.zlib_000',"wb+")
  21. out.write(data3)
  22. out.flush()
  23. out.close()
  24. file2 = open(only_name+'.zlib_000', "rb")
  25. dados = file2.read()
  26. textura = dados.find(b'\x94\x72\x85\x29\x01')
  27. #print(textura,'tset')
  28.  
  29. list_texture = []
  30. list_texture.append(textura)
  31. print('\n')
  32. print('~' * 30)
  33. print('Exporting Models from bin...')
  34. sleep(1)
  35. for mdl2 in list_texture:
  36.     if mdl2 == list_texture[0] > 1:
  37.         print('\nRaw Texture present in file!')
  38.         ctn = len(dados) - textura
  39.        
  40.         ctn_f = open(only_name+'_model.ctn',"wb+")
  41.         for m in range(textura):
  42.             m_1 = dados[m:m+1]
  43.             ctn_f.write(m_1)
  44.         f_text = open(only_name+'_texture_0.raw',"wb+")
  45.         start_textura = file2.seek(textura,0)
  46.         end_textura = len(dados)
  47.         tam_textura = (end_textura - start_textura)
  48.  
  49.         read_tex = file2.read()
  50.         for m in range(tam_textura):
  51.             m_3 = read_tex[m:m+1]
  52.             f_text.write(m_3)
  53.         sleep(1)
  54.         print('\nTexture Raw Exported...')
  55.         sleep(1)
  56.        
  57.     else:
  58.         sleep(1)
  59.         print('\nNot Raw Texture in file...')
  60.         sleep(1)
  61.         ctn = len(dados)
  62.         ctn_f = open(only_name+'_model.ctn',"wb+")
  63.         for m in range(ctn):
  64.             m_1 = dados[m:m+1]
  65.             ctn_f.write(m_1)
  66. ctn_f.flush()
  67. ctn_f.close()
  68.  
  69. file_ctn= open(only_name+'_model.ctn', "r+b")
  70. data_ctn = file_ctn.read() 
  71.  
  72. models_adrees=[]
  73.  
  74. cc = re.finditer(b'\x03\x00\xff\xff', data_ctn, flags = 0)
  75.  
  76. for result in cc:
  77.     models_adrees.append(result.start())
  78. #print(models_adrees)
  79.  
  80. count = 1
  81. for mdl in models_adrees:
  82.     if mdl == models_adrees[0] > 1:
  83.         print('MDL Model 1 Exported')
  84.         sleep(1)
  85.     elif mdl == -1:
  86.         continue
  87.     else:
  88.         count +=1
  89.         print('MDL Model '+ str(count)+ ' Exported')
  90.         sleep(1)
  91. contar = 0
  92.  
  93. for s in range(len(models_adrees)):
  94.     contar += 1
  95.     f_mdl1 = open(only_name+'_model_' + str(contar)+'.mdl',"wb+")
  96.     mdl_1_s = file2.seek((models_adrees[s]),0)
  97.    
  98.     mdl_1_m = file2.read()
  99.     m_save_1 = mdl_1_m
  100.  
  101.     if models_adrees[s] == models_adrees[-1]:
  102.         fim_mdl1 = len(data_ctn) - models_adrees[s]
  103.        
  104.         for m in range(fim_mdl1):
  105.             m_1 = m_save_1[m:m+1]
  106.             f_mdl1.write(m_1)
  107.     else:
  108.         fim_mdl1 = models_adrees[s+1] - models_adrees[s]
  109.         for m in range(fim_mdl1):
  110.             m_1 = m_save_1[m:m+1]
  111.             f_mdl1.write(m_1)  
  112.  
  113. f_mdl1.flush()
  114. f_mdl1.close()
  115.  
  116. #### star export FeF
  117. def formatNumber(num):
  118.  
  119.     if num % 1 == 0:
  120.         return int(num)
  121.     else:
  122.         return num
  123.  
  124. factor_xyz = 4
  125. factor = 512
  126. factor2 = 4096
  127. esp = ' '
  128. comp = '0xFFFFFFFF'
  129. models_adrees2=[]
  130. tam_range_fef = len(models_adrees)
  131. fef_m_count = 0
  132. print('\n')
  133. sleep(1)
  134. print('~' * 30)
  135. print('Exporting 3D-FeF from Models...\n')
  136. sleep(1)
  137.  
  138. hehe = 0
  139. for g in range(tam_range_fef):
  140.     fef_m_count += 1
  141.     mdl2fef = open(only_name + '_model_'+ str(fef_m_count)+'.mdl',"r+b")
  142.     read_mdl2fef = mdl2fef.read()
  143.    
  144.     cc = re.finditer(b'\x01\x01\x00\x01\x01', read_mdl2fef, flags = 0)
  145.     for result2 in cc:
  146.         models_adrees2.append(result2.start())
  147.     #print(models_adrees2)
  148.    
  149.     #### mtl
  150.    
  151.     mtl = open(only_name+'_model_'+str(fef_m_count)+'.mtl',"w+")
  152.     sleep(1)
  153.     print(only_name+'_model_'+str(fef_m_count)+'.mtl Exported...')
  154.     mtl.write('newmtl material_'+ str(fef_m_count))
  155.     mtl.write('\nNs 0.0\nd 1.0\nillum 2')
  156.     mtl.write('\nKd 0.7898538076923077 0.8133333333333334 0.6940444444444445')
  157.     mtl.write('\nKa 0.7898538076923077 0.8133333333333334 0.6940444444444445')
  158.     mtl.write('\nKs 0.0 0.0 0.0\nKe 0.0 0.0 0.0')
  159.     mtl.write('\nmap_Kd ' + only_name + '.png')
  160.    
  161.    
  162.    
  163.    
  164.     fef = open(only_name+'_model_'+str(fef_m_count)+'.obj',"w+")
  165.     sleep(1)
  166.     print(only_name+'_model_'+str(fef_m_count)+'.obj Exported...')
  167.     fef.write('\nmtllib ' + only_name +'_model_'+str(fef_m_count)+'.mtl')
  168.     fef.write('\no '+only_name +'_model_' + str(fef_m_count))
  169.     fef.write('\ng '+only_name +'_model_'+str(fef_m_count)+'.obj')
  170.     fef.write('\nusemtl material_'+str(fef_m_count))
  171.     fef.write('\ns 1')
  172. #   fef.write('\nName = "F01" '+ str(len(models_adrees2)))
  173.    
  174.     #for zzz in range(len(models_adrees2)):
  175.     for zzz in range(len(models_adrees2)):
  176.         start_model = models_adrees2[zzz]
  177.         match_uv = mdl2fef.seek(start_model,0)
  178.         #print(match_uv)
  179.         read_map = mdl2fef.read()
  180.         ref_memory = mdl2fef.seek(start_model+16,0)
  181.         #print(ref_memory)
  182.         start_3d_memory = mdl2fef.read()
  183.         b_ref_memory = start_3d_memory
  184.     #   print(b_ref_memory)
  185.         for m in range(1):
  186.             s_1 = b_ref_memory[m:m+1]
  187.             start_1 = s_1
  188.             v1= int.from_bytes(s_1, byteorder='little', signed=True)
  189.             #print(s_1)
  190.             r1_init_line = (int(v1))
  191.             #print('ser r1',r1_init_line)
  192.             r1_init_memory = int(v1 * 4)
  193.             #print(r1_init_memory)
  194.             vertex_r1 = r1_init_memory * 4
  195.             #print(vertex_r1)
  196.        
  197.         ref_xyz = mdl2fef.seek(start_model+18,0)
  198.         start_3d_f1 = mdl2fef.read()
  199.         b_ref_xyz = start_3d_f1
  200.        
  201.         for i in range(1):
  202.             s_1 = b_ref_xyz[i:i+2]
  203.             v1= int.from_bytes(s_1, byteorder='little', signed=True)
  204.            
  205.             r1_end_memory = int(v1 * 4)
  206.             r1_model = int((v1 / factor_xyz)-1)
  207.         #new code  
  208.         ref_line = mdl2fef.seek(start_model+88,0)
  209.         total_line = mdl2fef.read()
  210.         b_ref_line = total_line
  211.        
  212.         for i in range(1):
  213.             s_1 = b_ref_line[i:i+2]
  214.             #start_2 = s_1
  215.             v1= int.from_bytes(s_1, byteorder='little', signed=True)
  216.             r1_line = int(v1)
  217.             #print(r1_line)
  218.             #r1_model = int((v1 / factor_xyz)-1)
  219.         #end
  220.         tam_xyz = r1_model * 6
  221.         start_xyz_uv = ref_xyz + 78
  222.         leng_xyz = int(tam_xyz / r1_model)
  223.         ref_start_xyz = mdl2fef.seek(start_xyz_uv,0)
  224.         start_3d = mdl2fef.read()
  225.         byte = start_3d
  226.        
  227.         list0 =[]
  228.         list2 =[]
  229.         list4 =[]
  230.         comp_xyz = (b'\x69')
  231.        
  232.         comp_uv = (b'\x65')
  233.         comp80 = (b'\x80')
  234.        
  235.        
  236.         start1_uv_b = int.from_bytes(start_1, byteorder='little', signed=True)
  237.         start_1f = start1_uv_b + 3
  238.         start1_uv = start_1f.to_bytes(1, byteorder='little', signed=True)
  239.        
  240.         start_2 = r1_line.to_bytes(1, byteorder='little', signed=True)
  241. #       print(r1_line, 'sou model')
  242. #       print(ref_line,'sua linha')
  243.        
  244.        
  245.        
  246.        
  247.         xyx_busca = (start_1+comp80+ start_2+ comp_xyz)
  248.     #   xyx_busca1 = (b'\x04\x80\x10\x69')
  249. #       print(xyx_busca,'vit')
  250.         #print(xyx_busca1,'game')
  251.        
  252.         uv_busca = (start1_uv + comp80+ start_2+ comp_uv)
  253.         #print(uv_busca)
  254.         #adicao de codigo para comecar leitura 04801069
  255.         #start_leitura_xyz =
  256.         #print(start_3d)
  257.     #   print(models_adrees2[zzz], 'Sou seu start')
  258.         xyz_b2 = read_map.find(xyx_busca)
  259.     #   print(xyz_b2, 'kkk')
  260.         ref_xyz_b2 = mdl2fef.seek(models_adrees2[zzz] +xyz_b2+4,0)
  261.         #print(ref_xyz_b2,'valor da vez')
  262.        
  263. #       print("sou a bb",ref_xyz_b2)
  264.         start_3d_b2 = mdl2fef.read()
  265.         byte_xyz_b = start_3d_b2
  266.         #print(byte_xyz_b)
  267.        
  268.         for x in range(0,3,1):
  269.             for i in range(x+x, tam_xyz+x, leng_xyz):
  270.                 s_1 = byte_xyz_b[i:i + 2]
  271.                 v1 = int.from_bytes(s_1, byteorder='little', signed=True)
  272.                
  273.                 if x == 0:
  274.                     r1 = (v1 / factor)
  275.                     t1 = '{:.6f}'.format(r1)
  276.                     list0.append(t1)
  277.                 if x == 1:
  278.                     r1 = ((((32768-v1) / factor))-64.75)
  279.                     t1 = '{:.6f}'.format(r1)
  280.                     list2.append(t1)
  281.                 if x == 2:
  282.                     r1 = (v1 / factor)
  283.                     t1 = '{:.6f}'.format(r1)
  284.                     list4.append(t1)
  285.         #uv
  286.         start_uv = ((tam_xyz + 4)*2)
  287.         #print('sou start uv',start_uv)
  288.         tam_uv = start_uv + (r1_model *4)
  289.  
  290.         leng_uv = leng_xyz - 2
  291.    
  292.         list0_uv =[]
  293.         list2_uv =[]
  294.        
  295.         ###original
  296.         #uv_b2 = start_3d.find(uv_busca)
  297. #       ref_uv_b2 = mdl2fef.seek(uv_b2+4,0)
  298. #       start_uv_b2 = mdl2fef.read()
  299. #       byte_uv_b = start_3d
  300.         ###
  301.         #uv_busca = (start1_uv + comp80+ start_2+ comp_uv)
  302.         uv_b2 = read_map.find(uv_busca)
  303.         #print(uv_b2, 'kkk')
  304.         ref_uv_b2 = mdl2fef.seek(models_adrees2[zzz] +uv_b2+4,0)
  305.         #print("sou a bb",ref_uv_b2)
  306.         start_3d_uv = mdl2fef.read()
  307.         byte_uv_b = start_3d_uv
  308.     #   print(uv_busca)
  309.         #adicao de codigo para comecar leitura 04801069
  310.        
  311.         for x in range(0,2,1):
  312.             for i in range(0+x+x, tam_uv+x, leng_uv):
  313.                 s_1 = byte_uv_b[i:i + 2]
  314.                 v1 = int.from_bytes(s_1, byteorder='little', signed=True)
  315.                
  316.                 if x == 0:
  317.                     r1 = (v1 / factor2)
  318.                     t1 = '{:.6f}'.format(r1)
  319.                     list0_uv.append(t1)
  320.                 if x == 1:
  321.                     r1 = ((((65536-v1) / factor2)-15))
  322.                     t1 = '{:.6f}'.format(r1)
  323.                     list2_uv.append(t1)
  324.                    
  325.         list6 = []
  326.         list99 = []
  327.         list6_uv = []
  328.         list99_uv = []
  329.         cont_f_01 = int(r1_model)
  330.    
  331.         #fef.write('\n00-0'+str(zzz) + ' 0064')
  332.     #   fef.write('\n'+str(int(r1_model)))
  333.        
  334.         for w in range(0, r1_model, 1):
  335.                 lin1 = list0[w] + esp + list2[w] + esp + list4[w]
  336.                 list6.append(lin1)
  337.                
  338.         for w in range(0, r1_model, 1):
  339.                 lin1 =  list0_uv[w] + esp + list2_uv[w]
  340.                 list6_uv.append(lin1)
  341.        
  342.         for b in range(0, r1_model, 1):
  343.             list99.append(list6[b])
  344.        
  345.         for b in range(0, r1_model, 1):
  346.             list99_uv.append(list6_uv[b])
  347.        
  348.         start_tri = tam_uv + 12
  349.         tam_tri = start_xyz_uv + start_tri
  350.         ref_end_tri = mdl2fef.seek(start_xyz_uv,0)
  351.         start_3d_tri = mdl2fef.read()
  352.         end_tri = start_3d_tri.find(b'\x00\x00\x00\x05')
  353.        
  354.         list200 = []
  355.         for i200 in range(start_tri, end_tri, 2):
  356.             s_200 = byte[i200:i200 + 2]
  357.             v200 = int.from_bytes(s_200, byteorder='little', signed=True)
  358.             if hehe >0:
  359.                 r200 = ((((v200 * r1_init_memory) - vertex_r1) / vertex_r1)+1 + hehe)
  360.             else: r200 = ((((v200 * r1_init_memory) - vertex_r1) / vertex_r1)+1)
  361.             r300 = round(r200,0)
  362.             t100 = str(formatNumber(r300))
  363.             t200 = int(t100)
  364.             list200.append(t200)
  365.        
  366.         list400=[]
  367.        
  368.         for ii in range(0, len(list200)-2):
  369.             if(list200[ii]<0 and list200[ii+1]<0 and list200[ii+2]>=0):
  370.                 if (list200[ii] != list200[ii+1]) and (list200[ii+1] != list200[ii+2]) and (list200[ii+2] != list200[ii]):
  371.                     list400.append(list200[ii])
  372.                     list400.append(list200[ii+1])
  373.                     list400.append(list200[ii+2])
  374.                
  375.                
  376.             elif(list200[ii]<=0 and list200[ii+1]>=0 and list200[ii+2]>=0):
  377.                
  378.                 if (list200[ii] != list200[ii+1]) and (list200[ii+1] != list200[ii+2]) and (list200[ii+2] != list200[ii]):
  379.                     list400.append(list200[ii])
  380.                     list400.append(list200[ii+1])
  381.                     list400.append(list200[ii+2])
  382.            
  383.             elif(list200[ii+2]>=0 and list200[ii+1]>=0 and list200[ii]>0):
  384.                
  385.                 if (list200[ii+2] != list200[ii+1]) and (list200[ii+0] != list200[ii+2]) and (list200[ii+2] != list200[ii]):   
  386.                     list400.append(list200[ii+0])
  387.                     list400.append(list200[ii+1])
  388.                     list400.append(list200[ii+2])
  389.             else:
  390.                 continue
  391.                                        
  392.         list500=[]
  393.         for t in range(0, len(list400)):
  394.             if list400[t] >=0:
  395.                 list500.append(list400[t])
  396.             else:
  397.                 list500.append(8192 + list400[t])
  398.                
  399.         cont_tri = int((len(list500)) / 3)
  400.         fef.write('\n')
  401.         #fef.write('\n' + str(cont_tri))
  402.         cont_f_01_tri = cont_tri
  403.         if not list500:
  404.             continue
  405.         else:
  406.             hehe = max(list500, key=int)
  407.             for n in range(0, r1_model):
  408.                
  409.                 fef.write('\nv ' + list99[n])
  410.             fef.write('\n')
  411.             for n in range(0, r1_model):
  412.                
  413.                 fef.write('\nvt ' + list99_uv[n])
  414.                
  415.             fef.write('\n')
  416.             for x in range(0,len(list500),3):
  417.                 fef.write(('\nf ' + str(list500[x])+'/'+ str(list500[x])+ esp +str(list500[x+1]) +'/'+ str(list500[x+1]) + esp + str(list500[x+2])+'/'+ str(list500[x+2])))
  418.            
  419.         #   fef.write(('\nf ' + str(list500[x+5])+'/'+ str(list500[x+5])+ esp +str(list500[x+4]) +'/'+ str(list500[x+4]) + esp + str(list500[x+3])+'/'+ str(list500[x+3])))
  420.            
  421.            
  422.     #   fef.write('\n')
  423.         #print(list500)
  424.        
  425.        
  426.     models_adrees2=[]
  427. sleep(1)
  428. print('\nExport End')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement