akadjoker

qualke md2 importer

Jul 27th, 2021
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.80 KB | None | 0 0
  1. tool
  2. extends EditorScript
  3.  
  4.  
  5.  
  6. var file
  7.  
  8. var verts = PoolVector3Array()
  9. var uvs = PoolVector2Array()
  10. var no_verts = 0
  11. var faces=[]
  12. var vertex=PoolVector3Array()
  13. var vertex_Count=0
  14.  
  15. var LITTLE_ENDIAN = true
  16. func charToStr(ch):
  17.     var bla = PoolByteArray([ch])
  18.     return bla.get_string_from_utf8()
  19.    
  20. func readByte ():
  21.     var value = file.get_8()
  22.     if (value & 0x80 != 0):
  23.         return value - 0x100
  24.     else:
  25.         return value
  26.        
  27. func readUnsignedByte():
  28.     return file.get_8()
  29.        
  30. func readInt ():
  31.         var ch1 = readUnsignedByte()
  32.         var ch2 = readUnsignedByte()
  33.         var ch3 = readUnsignedByte()
  34.         var ch4 = readUnsignedByte()
  35.         if (LITTLE_ENDIAN):
  36.             return (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1
  37.         else:
  38.             return (ch1 << 24) | (ch2 << 16) | (ch3 << 8) | ch4
  39.            
  40. func readShort ():
  41.         var ch1 = readUnsignedByte ();
  42.         var ch2 = readUnsignedByte ();
  43.         var value;
  44.        
  45.         if (LITTLE_ENDIAN):
  46.             value = ((ch2 << 8) | ch1)
  47.         else:
  48.             value = ((ch1 << 8) | ch2)
  49.  
  50.         if ((value & 0x8000) != 0):
  51.             return value - 0x10000
  52.            
  53.         else:
  54.             return value
  55.    
  56. func readUnsignedInt ():
  57.         var ch1 = readUnsignedByte ()
  58.         var ch2 = readUnsignedByte ()
  59.         var ch3 = readUnsignedByte ()
  60.         var ch4 = readUnsignedByte ()
  61.         if (LITTLE_ENDIAN):
  62.             return (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1
  63.         else:
  64.             return (ch1 << 24) | (ch2 << 16) | (ch3 << 8) | ch4
  65.    
  66. func readUnsignedShort ():
  67.         var ch1 = readUnsignedByte ()
  68.         var ch2 = readUnsignedByte ()
  69.         if (LITTLE_ENDIAN):
  70.             return (ch2 << 8) + ch1
  71.         else:
  72.             return (ch1 << 8) | ch2
  73.            
  74.            
  75.    
  76. func get_string(size):
  77.     var k=0
  78.     var name=""
  79.     var bytes=[]
  80.     for i in range(size):
  81.         var ch = readUnsignedByte()
  82.         if (ch > 0x39 and ch <= 0x7A and k == 0):
  83.             bytes.append(ch)
  84.         if (ch >= 0x30 and ch <= 0x39):
  85.             k+=1
  86.     var utf8 = PoolByteArray(bytes)
  87.     name = utf8.get_string_from_utf8()
  88.     return name
  89.  
  90.  
  91.  
  92.    
  93. func loadMesh(filename, texturename,savepath,savename):
  94.     file = File.new()
  95.     #var err = file.open("res://assets/md2/blade/Blade.md2", File.READ)
  96.     var err = file.open(filename, File.READ)
  97.     if err != OK:
  98.         print("Failure!")
  99.         return
  100.  
  101.  
  102.     no_verts=0
  103.    
  104.    
  105.    
  106.    
  107.     var material = SpatialMaterial.new()
  108.     #var texture = load("res://assets/md2/blade/Blade.jpg")
  109.     var texture = load(texturename)
  110.     if texture :
  111.         material.set_texture(0,texture)
  112.     material.albedo_color = Color(1.0, 1.0, 1.0)
  113.    
  114.     var size = file.get_len()
  115.     print("size ",size)
  116.     var Magic = readInt()
  117.     var Version = readInt()
  118.  
  119.  
  120.     var SkinWidth = readInt()
  121.     var SkinHeight = readInt()
  122.    
  123.  
  124.  
  125.     var FrameSize = readInt()
  126.  
  127.     var NumSkins = readInt()
  128.     var NumVertices = readInt()
  129.     vertex_Count = NumVertices
  130.     print("Vertex ",NumVertices)
  131.     var NumTexCoords = readInt()
  132.     print("NumTexCoords ",NumTexCoords)
  133.     var NumTriangles = readInt()
  134.     print("NumTriangles ",NumTriangles)
  135.     var NumGlCommands = readInt()
  136.     var NumFrames = readInt()
  137.     print("NumFrames ",NumFrames)
  138.  
  139.     var OffsetSkins = readInt()
  140.    
  141.     var OffsetTexCoords = readInt()
  142.    
  143.     var OffsetTriangles = readInt()
  144.    
  145.     var OffsetFrames = readInt()
  146.    
  147.     var OffsetGlCommands = readInt()
  148.     var OffsetEnd = readInt()
  149.    
  150.    
  151.     file.seek(OffsetTriangles)
  152.    
  153.  
  154.     var tfaces=[]
  155.     for face in range (NumTriangles):
  156.         var v0=readUnsignedShort()
  157.         var v1=readUnsignedShort()
  158.         var v2=readUnsignedShort()
  159.         faces.append([v0,v1,v2])
  160.         v0=readUnsignedShort()
  161.         v1=readUnsignedShort()
  162.         v2=readUnsignedShort()
  163.         tfaces.append([v0,v1,v2])
  164.  
  165.     var modelUVs=PoolVector2Array()
  166.     file.seek(OffsetTexCoords)
  167.     for uvs in range (NumTexCoords):
  168.         var u= readShort()/float(SkinWidth)
  169.         var v= readShort()/float(SkinHeight)
  170.        
  171.         modelUVs.append(Vector2(u,v))
  172.    
  173.     var scaleFactor = 50
  174.     file.seek(OffsetFrames)
  175.    
  176.     var lastname= ""
  177.  
  178.     var names=[]
  179.  
  180.     for frame in range (NumFrames):
  181.         var sx = file.get_float()
  182.         var sy = file.get_float()
  183.         var sz = file.get_float()
  184.         var tx = file.get_float()
  185.         var ty = file.get_float()
  186.         var tz = file.get_float()
  187.         var name = get_string(16)
  188.    
  189.  
  190.        
  191.         if (lastname != name):
  192.             lastname = name
  193.             names.append(name)
  194.  
  195.        
  196.        
  197.         #print("Name ",name)
  198.         for vtx in range (NumVertices):
  199.             var x = readUnsignedByte()
  200.             var y = readUnsignedByte()
  201.             var z = readUnsignedByte()
  202.             var w = readUnsignedByte()
  203.             var fx = sx * x  + tx;
  204.             var fy = sz * z  + tz;
  205.             var fz = sy * y  + ty;
  206.             vertex.append(Vector3(fz/scaleFactor,fy/scaleFactor,fx/scaleFactor))
  207.     print(names)       
  208.     print("Total vertex :",len(vertex))
  209.     var mesh = MeshInstance.new()
  210.     var arr_mesh = ArrayMesh.new()
  211.    
  212.     var currentFrame=0
  213.     var nextFrame=0
  214.     var poll=1.0
  215.  
  216.  
  217.     verts = PoolVector3Array()
  218.     uvs = PoolVector2Array()
  219.    
  220.     no_verts=0
  221.     for i in range(len(faces)):
  222.         var f0 = faces[i][0]
  223.         var f1 = faces[i][1]
  224.         var f2 = faces[i][2]
  225.        
  226.         var v0 = vertex[0 *  NumVertices + f0];
  227.         var v1 = vertex[0 *  NumVertices + f1];
  228.         var v2 = vertex[0 *  NumVertices + f2];
  229.        
  230.         verts.append(v0)
  231.         verts.append(v1)
  232.         verts.append(v2)
  233.                
  234.         var uf0 = tfaces[i][0]
  235.         var uf1 = tfaces[i][1]
  236.         var uf2 = tfaces[i][2]
  237.        
  238.         var uv0 = modelUVs[0 * NumTexCoords + uf0];
  239.         var uv1 = modelUVs[0 * NumTexCoords + uf1];
  240.         var uv2 = modelUVs[0 * NumTexCoords + uf2];
  241.  
  242.         uvs.append(uv0)
  243.         uvs.append(uv1)
  244.         uvs.append(uv2)
  245.        
  246.    
  247.     print("mesh vertex ",no_verts," faces",len(faces))
  248.     print ("animnated vertex",len(vertex))
  249.  
  250.    
  251.     var arrays = []
  252.     arrays.resize(ArrayMesh.ARRAY_MAX)
  253.     arrays[Mesh.ARRAY_VERTEX] = verts
  254.     arrays[Mesh.ARRAY_TEX_UV] = uvs
  255.     arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
  256.     arr_mesh.surface_set_name(0,savename)
  257.     arr_mesh.surface_set_material(0, material)
  258.     mesh = arr_mesh
  259.  
  260.    
  261.     var node = Node.new()
  262.    
  263.     #var instance = MeshInstance.new()
  264.     #instance.mesh = mesh
  265.    
  266.     var script = preload("res://MD2Animation.gd")
  267.     var nm =  script.new()
  268.     nm.animationVertex=[]
  269.     nm.faces=[]
  270.     nm.vertex_Count=NumVertices
  271.    
  272.     for face in faces:
  273.         nm.faces.append(face)
  274.     for vtx in vertex:
  275.         nm.animationVertex.append(vtx)
  276.        
  277.     nm.NumFrames=NumFrames
  278.     nm.mesh=mesh
  279.    
  280.     #node.add_child(nm)
  281.     #nm.ad
  282.     nm.add_child(node)
  283.    
  284.    
  285.    
  286.            
  287.    
  288.     #node.add_child(instance)
  289.     #node.add_child(mesh)
  290.    
  291.    
  292.     #ResourceSaver.save("res://assets/md2/blade/blade.res", nm)
  293.     #ResourceSaver.save("res://assets/md2/blade/blade.res", node)
  294.     #ResourceSaver.save("res://assets/md2/blade/material.tres", material, 32)
  295.     #ResourceSaver.save(savepath+savename+".tscn", node,2)
  296.     ResourceSaver.save(savepath+"mat_"+savename+".res", material,32)
  297.    
  298.     var scene = PackedScene.new()
  299.     var result = scene.pack(nm)
  300.     if result == OK:
  301.    
  302.         var error = ResourceSaver.save(savepath+savename+".tscn", scene)  # Or "user://..."
  303.         if error != OK:
  304.             push_error("An error occurred while saving the scene to disk.")
  305.  
  306.    
  307.  
  308.    
  309.  
  310.  
  311.        
  312.  
  313.  
  314. func _run():
  315.     loadMesh("res://assets/md2/blade/Blade.md2","res://assets/md2/blade/Blade.jpg","res://assets/md2/blade/","blade")
  316.     print("Model Imported")
  317.  
Advertisement
Add Comment
Please, Sign In to add comment