Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import zlib, os, re
- from more_itertools import unique_everseen
- from time import sleep
- print('FACE EXPORT BiN2FeF'.center(30))
- print('=' * 30)
- print('Por: Fábio Vitor'.center(30))
- print('_'* 30)
- search = input('\nFile_Name: ')
- file = open(search, 'r+b')
- location = os.path.dirname(os.path.abspath('f'))
- file_name = file.name
- explod_file = file.name.split('.')
- only_name = '.'.join(explod_file[:-1])
- textura = '"'+location+'/'+only_name+'.png"'
- file.seek(32, 0)
- data2 = file.read()
- data3 = zlib.decompress(data2,32)
- out = open(only_name+'.zlib_000',"wb+")
- out.write(data3)
- out.flush()
- out.close()
- file2 = open(only_name+'.zlib_000', "rb")
- dados = file2.read()
- textura = dados.find(b'\x94\x72\x85\x29\x01')
- #print(textura,'tset')
- list_texture = []
- list_texture.append(textura)
- print('\n')
- print('~' * 30)
- print('Exporting Models from bin...')
- sleep(1)
- for mdl2 in list_texture:
- if mdl2 == list_texture[0] > 1:
- print('\nRaw Texture present in file!')
- ctn = len(dados) - textura
- ctn_f = open(only_name+'_model.ctn',"wb+")
- for m in range(textura):
- m_1 = dados[m:m+1]
- ctn_f.write(m_1)
- f_text = open(only_name+'_texture_0.raw',"wb+")
- start_textura = file2.seek(textura,0)
- end_textura = len(dados)
- tam_textura = (end_textura - start_textura)
- read_tex = file2.read()
- for m in range(tam_textura):
- m_3 = read_tex[m:m+1]
- f_text.write(m_3)
- sleep(1)
- print('\nTexture Raw Exported...')
- sleep(1)
- else:
- sleep(1)
- print('\nNot Raw Texture in file...')
- sleep(1)
- ctn = len(dados)
- ctn_f = open(only_name+'_model.ctn',"wb+")
- for m in range(ctn):
- m_1 = dados[m:m+1]
- ctn_f.write(m_1)
- ctn_f.flush()
- ctn_f.close()
- file_ctn= open(only_name+'_model.ctn', "r+b")
- data_ctn = file_ctn.read()
- models_adrees=[]
- cc = re.finditer(b'\x03\x00\xff\xff', data_ctn, flags = 0)
- for result in cc:
- models_adrees.append(result.start())
- #print(models_adrees)
- count = 1
- for mdl in models_adrees:
- if mdl == models_adrees[0] > 1:
- print('MDL Model 1 Exported')
- sleep(1)
- elif mdl == -1:
- continue
- else:
- count +=1
- print('MDL Model '+ str(count)+ ' Exported')
- sleep(1)
- contar = 0
- for s in range(len(models_adrees)):
- contar += 1
- f_mdl1 = open(only_name+'_model_' + str(contar)+'.mdl',"wb+")
- mdl_1_s = file2.seek((models_adrees[s]),0)
- mdl_1_m = file2.read()
- m_save_1 = mdl_1_m
- if models_adrees[s] == models_adrees[-1]:
- fim_mdl1 = len(data_ctn) - models_adrees[s]
- for m in range(fim_mdl1):
- m_1 = m_save_1[m:m+1]
- f_mdl1.write(m_1)
- else:
- fim_mdl1 = models_adrees[s+1] - models_adrees[s]
- for m in range(fim_mdl1):
- m_1 = m_save_1[m:m+1]
- f_mdl1.write(m_1)
- f_mdl1.flush()
- f_mdl1.close()
- #### star export FeF
- def formatNumber(num):
- if num % 1 == 0:
- return int(num)
- else:
- return num
- factor_xyz = 4
- factor = 512
- factor2 = 4096
- esp = ' '
- comp = '0xFFFFFFFF'
- models_adrees2=[]
- tam_range_fef = len(models_adrees)
- fef_m_count = 0
- print('\n')
- sleep(1)
- print('~' * 30)
- print('Exporting 3D-FeF from Models...\n')
- sleep(1)
- hehe = 0
- for g in range(tam_range_fef):
- fef_m_count += 1
- mdl2fef = open(only_name + '_model_'+ str(fef_m_count)+'.mdl',"r+b")
- read_mdl2fef = mdl2fef.read()
- cc = re.finditer(b'\x01\x01\x00\x01\x01', read_mdl2fef, flags = 0)
- for result2 in cc:
- models_adrees2.append(result2.start())
- #print(models_adrees2)
- #### mtl
- mtl = open(only_name+'_model_'+str(fef_m_count)+'.mtl',"w+")
- sleep(1)
- print(only_name+'_model_'+str(fef_m_count)+'.mtl Exported...')
- mtl.write('newmtl material_'+ str(fef_m_count))
- mtl.write('\nNs 0.0\nd 1.0\nillum 2')
- mtl.write('\nKd 0.7898538076923077 0.8133333333333334 0.6940444444444445')
- mtl.write('\nKa 0.7898538076923077 0.8133333333333334 0.6940444444444445')
- mtl.write('\nKs 0.0 0.0 0.0\nKe 0.0 0.0 0.0')
- mtl.write('\nmap_Kd ' + only_name + '.png')
- fef = open(only_name+'_model_'+str(fef_m_count)+'.obj',"w+")
- sleep(1)
- print(only_name+'_model_'+str(fef_m_count)+'.obj Exported...')
- fef.write('\nmtllib ' + only_name +'_model_'+str(fef_m_count)+'.mtl')
- fef.write('\no '+only_name +'_model_' + str(fef_m_count))
- fef.write('\ng '+only_name +'_model_'+str(fef_m_count)+'.obj')
- fef.write('\nusemtl material_'+str(fef_m_count))
- fef.write('\ns 1')
- # fef.write('\nName = "F01" '+ str(len(models_adrees2)))
- #for zzz in range(len(models_adrees2)):
- for zzz in range(len(models_adrees2)):
- start_model = models_adrees2[zzz]
- match_uv = mdl2fef.seek(start_model,0)
- #print(match_uv)
- read_map = mdl2fef.read()
- ref_memory = mdl2fef.seek(start_model+16,0)
- #print(ref_memory)
- start_3d_memory = mdl2fef.read()
- b_ref_memory = start_3d_memory
- # print(b_ref_memory)
- for m in range(1):
- s_1 = b_ref_memory[m:m+1]
- start_1 = s_1
- v1= int.from_bytes(s_1, byteorder='little', signed=True)
- #print(s_1)
- r1_init_line = (int(v1))
- #print('ser r1',r1_init_line)
- r1_init_memory = int(v1 * 4)
- #print(r1_init_memory)
- vertex_r1 = r1_init_memory * 4
- #print(vertex_r1)
- ref_xyz = mdl2fef.seek(start_model+18,0)
- start_3d_f1 = mdl2fef.read()
- b_ref_xyz = start_3d_f1
- for i in range(1):
- s_1 = b_ref_xyz[i:i+2]
- v1= int.from_bytes(s_1, byteorder='little', signed=True)
- r1_end_memory = int(v1 * 4)
- r1_model = int((v1 / factor_xyz)-1)
- #new code
- ref_line = mdl2fef.seek(start_model+88,0)
- total_line = mdl2fef.read()
- b_ref_line = total_line
- for i in range(1):
- s_1 = b_ref_line[i:i+2]
- #start_2 = s_1
- v1= int.from_bytes(s_1, byteorder='little', signed=True)
- r1_line = int(v1)
- #print(r1_line)
- #r1_model = int((v1 / factor_xyz)-1)
- #end
- tam_xyz = r1_model * 6
- start_xyz_uv = ref_xyz + 78
- leng_xyz = int(tam_xyz / r1_model)
- ref_start_xyz = mdl2fef.seek(start_xyz_uv,0)
- start_3d = mdl2fef.read()
- byte = start_3d
- list0 =[]
- list2 =[]
- list4 =[]
- comp_xyz = (b'\x69')
- comp_uv = (b'\x65')
- comp80 = (b'\x80')
- start1_uv_b = int.from_bytes(start_1, byteorder='little', signed=True)
- start_1f = start1_uv_b + 3
- start1_uv = start_1f.to_bytes(1, byteorder='little', signed=True)
- start_2 = r1_line.to_bytes(1, byteorder='little', signed=True)
- # print(r1_line, 'sou model')
- # print(ref_line,'sua linha')
- xyx_busca = (start_1+comp80+ start_2+ comp_xyz)
- # xyx_busca1 = (b'\x04\x80\x10\x69')
- # print(xyx_busca,'vit')
- #print(xyx_busca1,'game')
- uv_busca = (start1_uv + comp80+ start_2+ comp_uv)
- #print(uv_busca)
- #adicao de codigo para comecar leitura 04801069
- #start_leitura_xyz =
- #print(start_3d)
- # print(models_adrees2[zzz], 'Sou seu start')
- xyz_b2 = read_map.find(xyx_busca)
- # print(xyz_b2, 'kkk')
- ref_xyz_b2 = mdl2fef.seek(models_adrees2[zzz] +xyz_b2+4,0)
- #print(ref_xyz_b2,'valor da vez')
- # print("sou a bb",ref_xyz_b2)
- start_3d_b2 = mdl2fef.read()
- byte_xyz_b = start_3d_b2
- #print(byte_xyz_b)
- for x in range(0,3,1):
- for i in range(x+x, tam_xyz+x, leng_xyz):
- s_1 = byte_xyz_b[i:i + 2]
- v1 = int.from_bytes(s_1, byteorder='little', signed=True)
- if x == 0:
- r1 = (v1 / factor)
- t1 = '{:.6f}'.format(r1)
- list0.append(t1)
- if x == 1:
- r1 = ((((32768-v1) / factor))-64.75)
- t1 = '{:.6f}'.format(r1)
- list2.append(t1)
- if x == 2:
- r1 = (v1 / factor)
- t1 = '{:.6f}'.format(r1)
- list4.append(t1)
- #uv
- start_uv = ((tam_xyz + 4)*2)
- #print('sou start uv',start_uv)
- tam_uv = start_uv + (r1_model *4)
- leng_uv = leng_xyz - 2
- list0_uv =[]
- list2_uv =[]
- ###original
- #uv_b2 = start_3d.find(uv_busca)
- # ref_uv_b2 = mdl2fef.seek(uv_b2+4,0)
- # start_uv_b2 = mdl2fef.read()
- # byte_uv_b = start_3d
- ###
- #uv_busca = (start1_uv + comp80+ start_2+ comp_uv)
- uv_b2 = read_map.find(uv_busca)
- #print(uv_b2, 'kkk')
- ref_uv_b2 = mdl2fef.seek(models_adrees2[zzz] +uv_b2+4,0)
- #print("sou a bb",ref_uv_b2)
- start_3d_uv = mdl2fef.read()
- byte_uv_b = start_3d_uv
- # print(uv_busca)
- #adicao de codigo para comecar leitura 04801069
- for x in range(0,2,1):
- for i in range(0+x+x, tam_uv+x, leng_uv):
- s_1 = byte_uv_b[i:i + 2]
- v1 = int.from_bytes(s_1, byteorder='little', signed=True)
- if x == 0:
- r1 = (v1 / factor2)
- t1 = '{:.6f}'.format(r1)
- list0_uv.append(t1)
- if x == 1:
- r1 = ((((65536-v1) / factor2)-15))
- t1 = '{:.6f}'.format(r1)
- list2_uv.append(t1)
- list6 = []
- list99 = []
- list6_uv = []
- list99_uv = []
- cont_f_01 = int(r1_model)
- #fef.write('\n00-0'+str(zzz) + ' 0064')
- # fef.write('\n'+str(int(r1_model)))
- for w in range(0, r1_model, 1):
- lin1 = list0[w] + esp + list2[w] + esp + list4[w]
- list6.append(lin1)
- for w in range(0, r1_model, 1):
- lin1 = list0_uv[w] + esp + list2_uv[w]
- list6_uv.append(lin1)
- for b in range(0, r1_model, 1):
- list99.append(list6[b])
- for b in range(0, r1_model, 1):
- list99_uv.append(list6_uv[b])
- start_tri = tam_uv + 12
- tam_tri = start_xyz_uv + start_tri
- ref_end_tri = mdl2fef.seek(start_xyz_uv,0)
- start_3d_tri = mdl2fef.read()
- end_tri = start_3d_tri.find(b'\x00\x00\x00\x05')
- list200 = []
- for i200 in range(start_tri, end_tri, 2):
- s_200 = byte[i200:i200 + 2]
- v200 = int.from_bytes(s_200, byteorder='little', signed=True)
- if hehe >0:
- r200 = ((((v200 * r1_init_memory) - vertex_r1) / vertex_r1)+1 + hehe)
- else: r200 = ((((v200 * r1_init_memory) - vertex_r1) / vertex_r1)+1)
- r300 = round(r200,0)
- t100 = str(formatNumber(r300))
- t200 = int(t100)
- list200.append(t200)
- list400=[]
- for ii in range(0, len(list200)-2):
- if(list200[ii]<0 and list200[ii+1]<0 and list200[ii+2]>=0):
- if (list200[ii] != list200[ii+1]) and (list200[ii+1] != list200[ii+2]) and (list200[ii+2] != list200[ii]):
- list400.append(list200[ii])
- list400.append(list200[ii+1])
- list400.append(list200[ii+2])
- elif(list200[ii]<=0 and list200[ii+1]>=0 and list200[ii+2]>=0):
- if (list200[ii] != list200[ii+1]) and (list200[ii+1] != list200[ii+2]) and (list200[ii+2] != list200[ii]):
- list400.append(list200[ii])
- list400.append(list200[ii+1])
- list400.append(list200[ii+2])
- elif(list200[ii+2]>=0 and list200[ii+1]>=0 and list200[ii]>0):
- if (list200[ii+2] != list200[ii+1]) and (list200[ii+0] != list200[ii+2]) and (list200[ii+2] != list200[ii]):
- list400.append(list200[ii+0])
- list400.append(list200[ii+1])
- list400.append(list200[ii+2])
- else:
- continue
- list500=[]
- for t in range(0, len(list400)):
- if list400[t] >=0:
- list500.append(list400[t])
- else:
- list500.append(8192 + list400[t])
- cont_tri = int((len(list500)) / 3)
- fef.write('\n')
- #fef.write('\n' + str(cont_tri))
- cont_f_01_tri = cont_tri
- if not list500:
- continue
- else:
- hehe = max(list500, key=int)
- for n in range(0, r1_model):
- fef.write('\nv ' + list99[n])
- fef.write('\n')
- for n in range(0, r1_model):
- fef.write('\nvt ' + list99_uv[n])
- fef.write('\n')
- for x in range(0,len(list500),3):
- 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])))
- # 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])))
- # fef.write('\n')
- #print(list500)
- models_adrees2=[]
- sleep(1)
- print('\nExport End')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement