akadjoker

godot md2 animated

Jul 27th, 2021
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. extends MeshInstance
  2.  
  3.  
  4.  
  5.  
  6. var nextFrame=0
  7. var currentFrame=0
  8. var animations=[]
  9. export var faces=[]
  10. export var NumFrames=0
  11. export var animationVertex =[]
  12. export var vertex_Count=0
  13.  
  14. var lastTime = 0
  15. var lastanimation=0
  16. var currentAnimation = 0
  17.  
  18. var rollto_anim = 0
  19. var RollOver = false
  20. var animlerp = 0
  21.  
  22. var animationEnd=false
  23.  
  24. var time_start = 0
  25. var time_now = 0
  26.  
  27.  
  28. #var mesh = null
  29.  
  30.  
  31.  
  32.  
  33. func addAnimation(name, startFrame, endFrame, fps):
  34. animations.append([name, startFrame, endFrame, fps])
  35.  
  36. return len(animations)
  37.  
  38. func numAnimations():
  39. return len(animations)
  40.  
  41. func BackAnimation():
  42. currentAnimation = (currentAnimation - 1) % (numAnimations())
  43. if (currentAnimation < 0):
  44. currentAnimation = numAnimations()
  45. setAnimation(currentAnimation);
  46.  
  47. func NextAnimation():
  48. currentAnimation = (currentAnimation +1) % (numAnimations())
  49. if (currentAnimation >numAnimations()):
  50. currentAnimation = 0
  51. setAnimation(currentAnimation)
  52.  
  53. func setAnimationNow(num):
  54. if (num == currentAnimation):
  55. return
  56. if num > len(animations):
  57. return
  58.  
  59.  
  60. currentAnimation = num
  61. currentFrame = animations[currentAnimation][1]
  62. lastanimation = currentAnimation
  63.  
  64. func setAnimation(num):
  65. if (num == currentAnimation):
  66. return
  67. if num > len(animations):
  68. return
  69.  
  70. #if currentFrame<animations[currentAnimation][2]:
  71. # return
  72.  
  73. currentAnimation = num
  74. currentFrame = animations[currentAnimation][1]
  75. lastanimation = currentAnimation
  76.  
  77. func setAnimationByNameNow(name):
  78. for i in range(len(animations)):
  79. if (animations[i][0] == name):
  80. setAnimationNow(i)
  81. return
  82. func setAnimationByName(name):
  83. for i in range(len(animations)):
  84. if (animations[i][0] == name):
  85. setAnimation(i)
  86. return
  87. func getAnimationByName(name):
  88. for i in range(len(animations)):
  89. if (animations[i][0] == name):
  90. return i
  91.  
  92. func SetAnimationRollOverByName(num ,next ):
  93. SetAnimationRollOver(getAnimationByName(num),getAnimationByName(next))
  94.  
  95. func SetAnimationRollOver(num ,next ):
  96. if (num == lastanimation):
  97. return
  98. if num > len(animations):
  99. return
  100.  
  101.  
  102. currentAnimation = num;
  103. currentFrame = animations[currentAnimation][1]
  104. lastanimation = currentAnimation
  105. RollOver = true
  106. rollto_anim = next
  107.  
  108.  
  109.  
  110. func Lerp(start , end , amount):
  111. var result = Vector3 ()
  112. result.x = start.x + ((end.x - start.x) * amount)
  113. result.y = start.y + ((end.y - start.y) * amount)
  114. result.z = start.z + ((end.z - start.z) * amount)
  115. return result
  116.  
  117.  
  118. func animate(currentFrame,nextFrame,poll):
  119. var mdt = MeshDataTool.new()
  120. var err = mdt.create_from_surface(mesh, 0)
  121. if err != OK:
  122. print("Failure!")
  123. return
  124. var index=0
  125. for i in range(mdt.get_face_count()):
  126. var a = faces[i][0]
  127. var b = faces[i][1]
  128. var c = faces[i][2]
  129. var acurrent = animationVertex[currentFrame * vertex_Count + a]
  130. var bcurrent = animationVertex[currentFrame * vertex_Count + b]
  131. var ccurrent = animationVertex[currentFrame * vertex_Count + c]
  132. var anext = animationVertex[nextFrame * vertex_Count + a]
  133. var bnext = animationVertex[nextFrame * vertex_Count + b]
  134. var cnext = animationVertex[nextFrame * vertex_Count + c]
  135. var n = (bcurrent - ccurrent).cross(acurrent - bcurrent).normalized()
  136.  
  137. mdt.set_vertex(index,Lerp(acurrent, anext, poll))
  138. mdt.set_vertex_normal(index, n + mdt.get_vertex_normal(index))
  139. index+=1
  140.  
  141. mdt.set_vertex(index,Lerp(bcurrent, bnext, poll))
  142. mdt.set_vertex_normal(index, n + mdt.get_vertex_normal(index))
  143. index+=1
  144.  
  145. mdt.set_vertex(index,Lerp(ccurrent, cnext, poll))
  146. mdt.set_vertex_normal(index, n + mdt.get_vertex_normal(index))
  147. index+=1
  148.  
  149.  
  150.  
  151.  
  152. mesh.surface_remove(0)
  153. mdt.commit_to_surface(mesh)
  154.  
  155. func getTimer():
  156. return OS.get_ticks_msec()/1000.0
  157.  
  158. func _ready():
  159. currentFrame=0
  160. nextFrame = 1
  161. addAnimation("all", 0, NumFrames-1, 15)
  162.  
  163.  
  164. time_start = 0
  165.  
  166. currentFrame=0
  167. nextFrame=0
  168.  
  169. setAnimation(0)
  170.  
  171. func get_Current_frame():
  172. return currentFrame
  173.  
  174. func _process(delta):
  175.  
  176. var diff=1000.0
  177. time_now = OS.get_ticks_msec()
  178. var elapsedTime = time_now - time_start
  179.  
  180. animlerp = elapsedTime / (diff / animations[currentAnimation][3])
  181. animationEnd=false
  182.  
  183.  
  184. #[name, startFrame, endFrame, fps])
  185. nextFrame = (currentFrame+1)
  186. if (nextFrame > animations[currentAnimation][2]):
  187. nextFrame = animations[currentAnimation][1]
  188. animationEnd=true
  189.  
  190.  
  191. if (RollOver):
  192. if (currentFrame >= animations[currentAnimation][2]):
  193. setAnimation(rollto_anim)
  194. RollOver = false
  195.  
  196.  
  197. #var timeEnd = (diff / animations[currentAnimation][3])
  198. if (elapsedTime >= (diff / animations[currentAnimation][3]) ):
  199. currentFrame = nextFrame
  200. time_start = time_now
  201.  
  202.  
  203. #print(elapsedTime," ",time_start, " ",animlerp," ",timeEnd," -> ",currentFrame," ",nextFrame)
  204.  
  205. animate(currentFrame,nextFrame,animlerp)
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
Advertisement
Add Comment
Please, Sign In to add comment