Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends ImmediateGeometry
- var num_of_points = 25
- var points = []
- var segment_length = .6
- var grav_speed = 20
- var vert_segments = 7
- var width = 0.5
- func _ready():
- var cur = 1
- for p in num_of_points:
- points.append(global_transform.origin + Vector3(0, -segment_length * cur, 0))
- cur += 1
- func set_root_pos(pos: Vector3):
- global_transform.origin = pos
- func _physics_process(delta):
- #apply gravity
- var ind = 0
- var last_p = global_transform.origin
- for p in points:
- p -= Vector3(0, grav_speed * delta, 0)
- var dis = p.distance_to(last_p)
- if dis > segment_length:
- p = last_p + (p - last_p) / dis * segment_length
- last_p = p
- points[ind] = p
- ind += 1
- func _process(_delta):
- clear()
- draw_hair()
- #print(points)
- func draw_hair():
- begin(Mesh.PRIMITIVE_TRIANGLES)
- var local_points = []
- for p in points:
- local_points.append(p - global_transform.origin)
- var last_p = Vector3()
- var verts = []
- var ind = 0
- for p in local_points:
- var new_last_points = []
- var y_vec = (last_p - p).normalized()
- 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
- if ind != len(local_points) - 1:
- var seg_verts = []
- for i in range(vert_segments): # set up row of verts for each level
- var t_width = clamp((width - ind * (width / num_of_points)), 0.01, width)
- seg_verts.append(p + t_width * x_vec.rotated(y_vec, i * 2 * PI / vert_segments).normalized())
- verts.append(seg_verts)
- last_p = p
- ind += 1
- for j in range(len(verts) - 1):
- var cur = verts[j]
- var nxt = verts[j + 1]
- for i in range(vert_segments):
- var nxt_i = (i + 1) % vert_segments
- add_vertex(cur[i])
- add_vertex(cur[nxt_i])
- add_vertex(nxt[i])
- add_vertex(cur[nxt_i])
- add_vertex(nxt[nxt_i])
- add_vertex(nxt[i])
- #cap off
- for i in range(vert_segments):
- var nxt = (i + 1) % vert_segments
- add_vertex(verts[0][i])
- add_vertex(Vector3())
- add_vertex(verts[0][nxt])
- #cap off
- for i in range(vert_segments):
- var nxt = (i + 1) % vert_segments
- add_vertex(verts[num_of_points - 2][i])
- add_vertex(verts[num_of_points - 2][nxt])
- add_vertex(last_p)
- end()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement