home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 22088 / jericho_import.7z / jericho_import.py < prev   
Encoding:
Python Source  |  2022-04-17  |  11.8 KB  |  423 lines

  1. # 2011-01-22 Glogow Poland Mariusz Szkaradek
  2. dir = 'C:\\Users\\Glaster\\Desktop\\testcrap\\files\\'
  3. import bpy,struct,os
  4. import Blender
  5. from Blender import *
  6. from struct import *
  7. from Blender.Mathutils import *
  8. from Blender import Armature as A
  9. import math
  10.  
  11. def word(long): 
  12.    s=''
  13.    for j in range(0,long): 
  14.        lit =  struct.unpack('c',plik.read(1))[0]
  15.        if ord(lit)!=0:
  16.            s+=lit
  17.            if len(s)>100:
  18.                break
  19.    return s
  20.  
  21. bigendian    = 0
  22. littleendian = 1
  23.  
  24.  
  25. if littleendian == True:
  26.     def b(n):
  27.         return struct.unpack(n*'b', plik.read(n))
  28.     def B(n):
  29.         return struct.unpack(n*'B', plik.read(n))
  30.     def h(n):
  31.         return struct.unpack(n*'h', plik.read(n*2))
  32.     def H(n):
  33.         return struct.unpack(n*'H', plik.read(n*2))
  34.     def i(n):
  35.         return struct.unpack(n*'i', plik.read(n*4))
  36.     def f(n):
  37.         return struct.unpack(n*'f', plik.read(n*4))
  38.  
  39.  
  40. def read_faces():
  41.     faceslist=[]
  42.     data = i(3)
  43.     word(data[2])
  44.     data = i(2)
  45.     for m in range(data[0]):
  46.          v = H(3)
  47.          faceslist.append(v)
  48.     return faceslist
  49.  
  50. def read_vertexes():
  51.     vertexes = []
  52.     uvcoord =[]
  53.     data = i(6)
  54.     print data
  55.     if data[4] == 48:
  56.         for m in range(data[5]):
  57.             v = f(3)
  58.             vertexes.append(v)
  59.             f(3)
  60.             u = f(1)[0]
  61.             v = f(1)[0]
  62.             uvcoord.append([u,1-v])
  63.             f(4)
  64.                  
  65.     if data[4] == 80:
  66.         for m in range(data[5]):
  67.             v = f(3)
  68.             vertexes.append(v)
  69.             f(3)
  70.             u = f(1)[0]
  71.             v = f(1)[0]
  72.             uvcoord.append([u,1-v])
  73.             f(6)
  74.             f(2) 
  75.             f(4) 
  76.  
  77.     return vertexes,uvcoord
  78.  
  79. def drawmesh(name): 
  80.     global obj,mesh
  81.     mesh = bpy.data.meshes.new(name)
  82.     mesh.verts.extend(vertexy)
  83.     mesh.faces.extend(faceslist,ignoreDups=True)
  84.     if len(uvcoord)!=0:
  85.         uv()
  86.     scene = bpy.data.scenes.active
  87.     obj = scene.objects.new(mesh,name)
  88.     mesh.recalcNormals()
  89.     mesh.update()
  90.     Redraw()
  91.  
  92. def uv():
  93.     for faceID in range(0,len(mesh.faces)):
  94.             face = mesh.faces[faceID]
  95.             index1 = faceslist[faceID][0]
  96.             index2 = faceslist[faceID][1]
  97.             index3 = faceslist[faceID][2]
  98.             uv1 = Vector(uvcoord[index1])
  99.             uv2 = Vector(uvcoord[index2])
  100.             uv3 = Vector(uvcoord[index3])
  101.             face.uv = [uv1, uv2, uv3]
  102.             face.smooth=True
  103.  
  104.  
  105.  
  106. def make_armature(filename):
  107.     namefile = filename.split(os.sep)[-1].split('.')[0]
  108.     global armobj,newarm
  109.     armobj=None
  110.     newarm=None
  111.     scn = Scene.GetCurrent()
  112.     scene = bpy.data.scenes.active
  113.     for object in scene.objects:
  114.         if object.getType()=='Armature':
  115.             if object.name == namefile+'-armobj':
  116.                 scn.unlink(object)
  117.     for object in bpy.data.objects:
  118.         if object.name == namefile+'-armobj':
  119.             armobj = Blender.Object.Get(namefile+'-armobj')
  120.             newarm = armobj.getData()
  121.             newarm.makeEditable()         
  122.             for bone in newarm.bones.values():
  123.                 del newarm.bones[bone.name]
  124.             newarm.update()
  125.     if armobj==None: 
  126.         armobj = Blender.Object.New('Armature',namefile+'-armobj')
  127.     if newarm==None: 
  128.         newarm = Armature.New(namefile+'-arm')
  129.         armobj.link(newarm)
  130.     scn.link(armobj)
  131.     newarm.drawType = Armature.STICK
  132.  
  133. def make_vertex_group():
  134.     for v_id in range(len(grupy)):
  135.         data_id = grupy[v_id]
  136.         data = groups[data_id]          
  137.         for m in range(data[0]): 
  138.             gr = data[1][m]
  139.             try:
  140.                 gr = bonenames[gr] 
  141.             except:
  142.                 gr = str(gr)
  143.                 pass 
  144.             w  = data[2][m] 
  145.             if gr not in mesh.getVertGroupNames():
  146.                 mesh.addVertGroup(gr)          
  147.                 mesh.update()
  148.             mesh.assignVertsToGroup(gr,[v_id],w,1)
  149.     mesh.update()
  150.  
  151. def create_material(m):
  152.     global mat
  153.     word(8),i(1)#MAT
  154.     print 'MATERIAL ', word(i(1)[0])
  155.     try:
  156.         mat = Material.Get('mat-'+str(m))
  157.     except:
  158.         mat = Material.New('mat-'+str(m))
  159.     B(44),i(3)#NOTHING  
  160.  
  161. def create_texture_diffuse(m):
  162.     try:
  163.         tex = Texture.Get('tex-'+str(m))
  164.     except:
  165.         tex = Texture.New('tex-'+str(m))
  166.     tex.setType('Image')
  167.     try:
  168.         img = Blender.Image.Load(dir_images+name_image+'.dds')                          
  169.         tex.image = img 
  170.         mat.setTexture(0,tex,Texture.TexCo.UV,Texture.MapTo.COL) 
  171.     except:
  172.         pass
  173.  
  174. def create_texture_specular(m):
  175.     try:
  176.         tex_alpha = Texture.Get('tex_alpha-'+str(m))
  177.     except:
  178.         tex_alpha = Texture.New('tex_alpha-'+str(m))
  179.     tex_alpha.setType('Image')
  180.     try:
  181.         img = Blender.Image.Load(dir_images+name_image+'.alpha.dds')                      
  182.         tex_alpha.image = img 
  183.         mat.setTexture(1,tex_alpha,Texture.TexCo.UV,Texture.MapTo.COL) 
  184.     except:
  185.         pass
  186.  
  187. def create_texture_normal(m):
  188.     try:
  189.         tex_norm = Texture.Get('tex_norm-'+str(m))
  190.     except:
  191.         tex_norm = Texture.New('tex_norm-'+str(m))
  192.     tex_norm.setType('Image')
  193.     tex_norm.setImageFlags('NormalMap')  
  194.     try:
  195.         img = Blender.Image.Load(dir_images+name_image+'.dds')                      
  196.         tex_norm.image = img 
  197.         mat.setTexture(2,tex_norm,Texture.TexCo.UV,Texture.MapTo.NOR) 
  198.     except:
  199.         pass
  200.  
  201. def read_materials(): 
  202.     global dir_images,name_image
  203.     dir_images = sys.dirname(filename)+os.sep+'dds'+os.sep
  204.     dir_images = dir_images.lower()
  205.     num_mat = i(1)[0]
  206.     print 'num_mat =',num_mat
  207.     for m in range(num_mat):
  208.         create_material(m)
  209.         while(True):
  210.             data = i(1)[0]
  211.             if data == 0:
  212.                 pass 
  213.             elif data ==1: 
  214.                 word(8),i(1) 
  215.                 name_image = word(i(1)[0]).split('/')[-1].split('.')[0]
  216.                 name_image = name_image.lower() 
  217.                 #print name_image
  218.                 if '-d' in name_image:
  219.                     create_texture_diffuse(m)
  220.                 if '-m' in name_image:
  221.                     create_texture_specular(m)
  222.                 if '-b' in name_image:
  223.                     create_texture_normal(m)
  224.  
  225.                 data = i(4)
  226.                 if data[3]!=0:
  227.                     break 
  228.                 B(11) 
  229.             else:
  230.                 seek = plik.tell()
  231.                 plik.seek(seek-4)
  232.                 break      
  233.  
  234. def make_bones(m):
  235.     global namebone 
  236.     newarm.makeEditable()
  237.     data = i(6)
  238.     print data
  239.     namebone = word(i(1)[0])[-25:]
  240.     #print namebone
  241.     bonenames[data[1]] = namebone
  242.     eb = A.Editbone() 
  243.     newarm.bones[namebone] = eb
  244.     newarm.update()
  245.     newarm.makeEditable()
  246.     nameparent = word(i(1)[0])[-25:]        
  247.     if len(nameparent)>0:
  248.         parent = newarm.bones[nameparent]
  249.         newarm.bones[namebone].parent = parent
  250.     f(8)
  251.     bonematrix = Matrix(f(4),f(4),f(4),f(4))
  252.     f(23)
  253.     newarm.update()
  254.     newarm.makeEditable()
  255.     bone = newarm.bones[namebone]
  256.     bone.matrix = bonematrix
  257.     newarm.update()
  258.  
  259. def read_mesh_data(num):
  260.     global grupy
  261.     grupy = []
  262.     print namebone+'='+str(num)
  263.     meshes[namebone+'='+str(num)]=[]
  264.     print 'ADD FACES'
  265.     meshes[namebone+'='+str(num)].append(read_faces())
  266.     word(4)
  267.     print 'ADD VERTEXES UVCOORD'
  268.     meshes[namebone+'='+str(num)].append(read_vertexes())
  269.     #print 'ADD GROUPS'
  270.     meshes[namebone+'='+str(num)].append(groups)
  271.     data = i(2) 
  272.     print namebone+'='+str(num) 
  273.     print 'ADD GROUPS',data
  274.     for k in range(data[0]):
  275.         gr =  H(1)[0]
  276.         grupy.append(gr)
  277.     print 'ADD GRUPY'
  278.     meshes[namebone+'='+str(num)].append(grupy)
  279.     i(2),i(2),i(2),i(2)
  280.     data = i(2)
  281.     if data[1]==0:
  282.         data1 = i(2)
  283.         print 'making limited groups',data1
  284.         for m in range(data1[0]):
  285.             num_gr = B(1)[0]
  286.             gr = B(3) 
  287.             w  = f(3) 
  288.             #print num,gr,w
  289.             groups.append([num_gr,gr,w])    
  290.     data = i(2)
  291.     for m in range(data[0]):
  292.         B(data[1])
  293.     data = i(2)
  294.     i(1) 
  295.     objectmatrix = f(16)
  296.     print id_object
  297.     meshes[namebone+'='+str(num)].append(objectmatrix)
  298.     #add id_mat
  299.     meshes[namebone+'='+str(num)].append(0)
  300.  
  301. def readdata():
  302.     global bonenames,meshes,id_object
  303.     bonenames = []
  304.     meshes = {}
  305.     id_object = 0
  306.     word(8),B(12),word(4),i(3),word(i(1)[0]),i(1),word(4)
  307.     data = i(3)
  308.     print data
  309.     for m in range(data[2]):
  310.         long = i(1)[0]
  311.         print word(long)
  312.     print f(15) 
  313.     read_materials()#----------------MATERIALS
  314.     seek = plik.tell()
  315.     plik.seek(seek-36)
  316.     print plik.tell()  
  317.     data = i(2)
  318.     print  
  319.     print '==== MAKING NODES ===='
  320.     print
  321.     print 'begin----------',data[0]
  322.     print 'num nodes------',data[1]
  323.     for m in range(data[1]):
  324.         bonenames.append('')
  325.     for m in range(data[1]):
  326.     #for m in range(10):
  327.         make_bones(m)
  328.         long =  i(1)[0]
  329.         for n in range(long):
  330.             word(4)
  331.             data = i(3)
  332.             for k in range(data[2]):
  333.                 long = i(1)[0]
  334.                 word(long)
  335.         long = i(1)[0]
  336.         for n in range(long):
  337.             id_object+=1
  338.             i(1)
  339.             num = 0 
  340.             global groups
  341.             groups = []
  342.             while(True):
  343.                 name = word(4)
  344.                 if name == 'CAM':
  345.                     i(5),f(14)
  346.                     break
  347.                 elif name == 'MD3D':
  348.                     read_mesh_data(num)
  349.                     data = i(1)[0]
  350.                     if data==0:
  351.                         break
  352.                     num+=1
  353.                 else: 
  354.                     break
  355.     print struct.unpack('i',plik.read(4))[0]
  356.     print 'KONIEC AT OFFSET ',plik.tell()
  357.  
  358.  
  359. def make_right_mesh_position(): 
  360.     name = mesh_name.split('=')[0]
  361.     obj_matrix = obj.matrixWorld
  362.     bones= newarm.bones.values()
  363.     for bone in bones:
  364.         if bone.name == name:
  365.             bone_mat= bone.matrix['ARMATURESPACE']
  366.             bone_mat_world= bone_mat*obj_matrix
  367.     return bone_mat_world
  368.  
  369.  
  370.  
  371.  
  372. def draw_all():
  373.     global mesh_name,faceslist,vertexy,uvcoord,groups,grupy
  374.     for mesh_name in meshes:
  375.         mesh_data = meshes[mesh_name]
  376.         faceslist = mesh_data[0]
  377.         vertexy   = mesh_data[1][0]
  378.         uvcoord   = mesh_data[1][1]
  379.         groups    = mesh_data[2] 
  380.         grupy     = mesh_data[3]
  381.         mat_id    = mesh_data[5]
  382.         drawmesh(mesh_name)
  383.         if len(groups) == 0:
  384.             matrix = make_right_mesh_position()
  385.             obj.setMatrix(matrix)
  386.             Redraw()
  387.             armobj.makeParentBone([obj],mesh_name.split('=')[0],0,0) 
  388.         else:
  389.             make_vertex_group()
  390.             armobj.makeParentDeform([obj],1,0)
  391.         mesh.materials+=[Material.Get('mat-'+str(mat_id))]
  392.         Redraw()
  393.   
  394.  
  395.  
  396.  
  397. #=========== open file ======================
  398. global plik,filename
  399. extends=['sm3']
  400. g = os.listdir(dir)
  401. bool={}
  402. draw={}  
  403. block=[] 
  404. for plik in g:
  405.   extend = plik[plik.lower().find('.')+1:]
  406.   if extend.lower() in extends: 
  407.       bool[plik] = False
  408.       draw[plik] = Draw.Create(bool[plik])
  409.       block.append((plik,draw[plik]))
  410. Draw.PupBlock("sm3 files",block) 
  411. for file in bool:
  412.         bool[file] = draw[file].val
  413.         if bool[file]==True: 
  414.             filename = dir+os.sep+file
  415.             print '===================================='
  416.             print file
  417.             print '===================================='    
  418.             plik = open(filename,'rb')
  419.             make_armature(filename)
  420.             readdata()
  421.             draw_all()
  422.         else:
  423.             Draw.Exit()