Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- tool
- extends EditorScript
- var file
- var verts = PoolVector3Array()
- var uvs = PoolVector2Array()
- var no_verts = 0
- var faces=[]
- var vertex=PoolVector3Array()
- var vertex_Count=0
- var LITTLE_ENDIAN = true
- func charToStr(ch):
- var bla = PoolByteArray([ch])
- return bla.get_string_from_utf8()
- func readByte ():
- var value = file.get_8()
- if (value & 0x80 != 0):
- return value - 0x100
- else:
- return value
- func readUnsignedByte():
- return file.get_8()
- func readInt ():
- var ch1 = readUnsignedByte()
- var ch2 = readUnsignedByte()
- var ch3 = readUnsignedByte()
- var ch4 = readUnsignedByte()
- if (LITTLE_ENDIAN):
- return (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1
- else:
- return (ch1 << 24) | (ch2 << 16) | (ch3 << 8) | ch4
- func readShort ():
- var ch1 = readUnsignedByte ();
- var ch2 = readUnsignedByte ();
- var value;
- if (LITTLE_ENDIAN):
- value = ((ch2 << 8) | ch1)
- else:
- value = ((ch1 << 8) | ch2)
- if ((value & 0x8000) != 0):
- return value - 0x10000
- else:
- return value
- func readUnsignedInt ():
- var ch1 = readUnsignedByte ()
- var ch2 = readUnsignedByte ()
- var ch3 = readUnsignedByte ()
- var ch4 = readUnsignedByte ()
- if (LITTLE_ENDIAN):
- return (ch4 << 24) | (ch3 << 16) | (ch2 << 8) | ch1
- else:
- return (ch1 << 24) | (ch2 << 16) | (ch3 << 8) | ch4
- func readUnsignedShort ():
- var ch1 = readUnsignedByte ()
- var ch2 = readUnsignedByte ()
- if (LITTLE_ENDIAN):
- return (ch2 << 8) + ch1
- else:
- return (ch1 << 8) | ch2
- func get_string(size):
- var k=0
- var name=""
- var bytes=[]
- for i in range(size):
- var ch = readUnsignedByte()
- if (ch > 0x39 and ch <= 0x7A and k == 0):
- bytes.append(ch)
- if (ch >= 0x30 and ch <= 0x39):
- k+=1
- var utf8 = PoolByteArray(bytes)
- name = utf8.get_string_from_utf8()
- return name
- func loadMesh(filename, texturename,savepath,savename):
- file = File.new()
- #var err = file.open("res://assets/md2/blade/Blade.md2", File.READ)
- var err = file.open(filename, File.READ)
- if err != OK:
- print("Failure!")
- return
- no_verts=0
- var material = SpatialMaterial.new()
- #var texture = load("res://assets/md2/blade/Blade.jpg")
- var texture = load(texturename)
- if texture :
- material.set_texture(0,texture)
- material.albedo_color = Color(1.0, 1.0, 1.0)
- var size = file.get_len()
- print("size ",size)
- var Magic = readInt()
- var Version = readInt()
- var SkinWidth = readInt()
- var SkinHeight = readInt()
- var FrameSize = readInt()
- var NumSkins = readInt()
- var NumVertices = readInt()
- vertex_Count = NumVertices
- print("Vertex ",NumVertices)
- var NumTexCoords = readInt()
- print("NumTexCoords ",NumTexCoords)
- var NumTriangles = readInt()
- print("NumTriangles ",NumTriangles)
- var NumGlCommands = readInt()
- var NumFrames = readInt()
- print("NumFrames ",NumFrames)
- var OffsetSkins = readInt()
- var OffsetTexCoords = readInt()
- var OffsetTriangles = readInt()
- var OffsetFrames = readInt()
- var OffsetGlCommands = readInt()
- var OffsetEnd = readInt()
- file.seek(OffsetTriangles)
- var tfaces=[]
- for face in range (NumTriangles):
- var v0=readUnsignedShort()
- var v1=readUnsignedShort()
- var v2=readUnsignedShort()
- faces.append([v0,v1,v2])
- v0=readUnsignedShort()
- v1=readUnsignedShort()
- v2=readUnsignedShort()
- tfaces.append([v0,v1,v2])
- var modelUVs=PoolVector2Array()
- file.seek(OffsetTexCoords)
- for uvs in range (NumTexCoords):
- var u= readShort()/float(SkinWidth)
- var v= readShort()/float(SkinHeight)
- modelUVs.append(Vector2(u,v))
- var scaleFactor = 50
- file.seek(OffsetFrames)
- var lastname= ""
- var names=[]
- for frame in range (NumFrames):
- var sx = file.get_float()
- var sy = file.get_float()
- var sz = file.get_float()
- var tx = file.get_float()
- var ty = file.get_float()
- var tz = file.get_float()
- var name = get_string(16)
- if (lastname != name):
- lastname = name
- names.append(name)
- #print("Name ",name)
- for vtx in range (NumVertices):
- var x = readUnsignedByte()
- var y = readUnsignedByte()
- var z = readUnsignedByte()
- var w = readUnsignedByte()
- var fx = sx * x + tx;
- var fy = sz * z + tz;
- var fz = sy * y + ty;
- vertex.append(Vector3(fz/scaleFactor,fy/scaleFactor,fx/scaleFactor))
- print(names)
- print("Total vertex :",len(vertex))
- var mesh = MeshInstance.new()
- var arr_mesh = ArrayMesh.new()
- var currentFrame=0
- var nextFrame=0
- var poll=1.0
- verts = PoolVector3Array()
- uvs = PoolVector2Array()
- no_verts=0
- for i in range(len(faces)):
- var f0 = faces[i][0]
- var f1 = faces[i][1]
- var f2 = faces[i][2]
- var v0 = vertex[0 * NumVertices + f0];
- var v1 = vertex[0 * NumVertices + f1];
- var v2 = vertex[0 * NumVertices + f2];
- verts.append(v0)
- verts.append(v1)
- verts.append(v2)
- var uf0 = tfaces[i][0]
- var uf1 = tfaces[i][1]
- var uf2 = tfaces[i][2]
- var uv0 = modelUVs[0 * NumTexCoords + uf0];
- var uv1 = modelUVs[0 * NumTexCoords + uf1];
- var uv2 = modelUVs[0 * NumTexCoords + uf2];
- uvs.append(uv0)
- uvs.append(uv1)
- uvs.append(uv2)
- print("mesh vertex ",no_verts," faces",len(faces))
- print ("animnated vertex",len(vertex))
- var arrays = []
- arrays.resize(ArrayMesh.ARRAY_MAX)
- arrays[Mesh.ARRAY_VERTEX] = verts
- arrays[Mesh.ARRAY_TEX_UV] = uvs
- arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
- arr_mesh.surface_set_name(0,savename)
- arr_mesh.surface_set_material(0, material)
- mesh = arr_mesh
- var node = Node.new()
- #var instance = MeshInstance.new()
- #instance.mesh = mesh
- var script = preload("res://MD2Animation.gd")
- var nm = script.new()
- nm.animationVertex=[]
- nm.faces=[]
- nm.vertex_Count=NumVertices
- for face in faces:
- nm.faces.append(face)
- for vtx in vertex:
- nm.animationVertex.append(vtx)
- nm.NumFrames=NumFrames
- nm.mesh=mesh
- #node.add_child(nm)
- #nm.ad
- nm.add_child(node)
- #node.add_child(instance)
- #node.add_child(mesh)
- #ResourceSaver.save("res://assets/md2/blade/blade.res", nm)
- #ResourceSaver.save("res://assets/md2/blade/blade.res", node)
- #ResourceSaver.save("res://assets/md2/blade/material.tres", material, 32)
- #ResourceSaver.save(savepath+savename+".tscn", node,2)
- ResourceSaver.save(savepath+"mat_"+savename+".res", material,32)
- var scene = PackedScene.new()
- var result = scene.pack(nm)
- if result == OK:
- var error = ResourceSaver.save(savepath+savename+".tscn", scene) # Or "user://..."
- if error != OK:
- push_error("An error occurred while saving the scene to disk.")
- func _run():
- loadMesh("res://assets/md2/blade/Blade.md2","res://assets/md2/blade/Blade.jpg","res://assets/md2/blade/","blade")
- print("Model Imported")
Advertisement
Add Comment
Please, Sign In to add comment