Advertisement
Guest User

immediate geometry ribbon

a guest
Apr 11th, 2019
2,181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.19 KB | None | 0 0
  1. extends ImmediateGeometry
  2.  
  3. var num_of_points = 25
  4. var points = []
  5. var segment_length = .6
  6. var grav_speed = 20
  7. var vert_segments = 7
  8. var width = 0.5
  9.  
  10. func _ready():
  11. var cur = 1
  12. for p in num_of_points:
  13. points.append(global_transform.origin + Vector3(0, -segment_length * cur, 0))
  14. cur += 1
  15.  
  16. func set_root_pos(pos: Vector3):
  17. global_transform.origin = pos
  18.  
  19. func _physics_process(delta):
  20. #apply gravity
  21. var ind = 0
  22. var last_p = global_transform.origin
  23. for p in points:
  24. p -= Vector3(0, grav_speed * delta, 0)
  25. var dis = p.distance_to(last_p)
  26. if dis > segment_length:
  27. p = last_p + (p - last_p) / dis * segment_length
  28. last_p = p
  29. points[ind] = p
  30. ind += 1
  31.  
  32. func _process(_delta):
  33. clear()
  34. draw_hair()
  35. #print(points)
  36.  
  37. func draw_hair():
  38. begin(Mesh.PRIMITIVE_TRIANGLES)
  39. var local_points = []
  40. for p in points:
  41. local_points.append(p - global_transform.origin)
  42. var last_p = Vector3()
  43. var verts = []
  44. var ind = 0
  45. for p in local_points:
  46. var new_last_points = []
  47. var y_vec = (last_p - p).normalized()
  48. var x_vec = y_vec.cross(y_vec.rotated(Vector3(1, 0, 0), 0.3)) #cross product with random vector to get a perpendicular vector
  49. if ind != len(local_points) - 1:
  50. var seg_verts = []
  51. for i in range(vert_segments): # set up row of verts for each level
  52. var t_width = clamp((width - ind * (width / num_of_points)), 0.01, width)
  53. seg_verts.append(p + t_width * x_vec.rotated(y_vec, i * 2 * PI / vert_segments).normalized())
  54. verts.append(seg_verts)
  55. last_p = p
  56. ind += 1
  57. for j in range(len(verts) - 1):
  58. var cur = verts[j]
  59. var nxt = verts[j + 1]
  60. for i in range(vert_segments):
  61. var nxt_i = (i + 1) % vert_segments
  62. add_vertex(cur[i])
  63. add_vertex(cur[nxt_i])
  64. add_vertex(nxt[i])
  65. add_vertex(cur[nxt_i])
  66. add_vertex(nxt[nxt_i])
  67. add_vertex(nxt[i])
  68.  
  69. #cap off
  70. for i in range(vert_segments):
  71. var nxt = (i + 1) % vert_segments
  72.  
  73. add_vertex(verts[0][i])
  74. add_vertex(Vector3())
  75. add_vertex(verts[0][nxt])
  76.  
  77.  
  78. #cap off
  79. for i in range(vert_segments):
  80. var nxt = (i + 1) % vert_segments
  81. add_vertex(verts[num_of_points - 2][i])
  82. add_vertex(verts[num_of_points - 2][nxt])
  83. add_vertex(last_p)
  84.  
  85. end()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement