waternode.gd 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. extends Node2D
  2. class_name WaterNode
  3. var circle
  4. var circle2
  5. var speed: Vector2 = Vector2.ZERO
  6. var force: Vector2 = Vector2.ZERO
  7. var mass = 10
  8. var drag_k = 10
  9. var force_strength = 40000
  10. var water_sampling_dist = 3
  11. var water_force_k = 20000
  12. var max_speed = 200.0
  13. var gravity = 3000
  14. onready var MAIN = find_parent("MAIN")
  15. func _process(delta):
  16. circle2.position = position
  17. integrate_forces(delta)
  18. circle.color.g = (max_speed + speed.x) / 2 / max_speed
  19. circle.color.b = (max_speed + speed.y) / 2 / max_speed
  20. #print (circle.color.g," ", speed.x)
  21. position += speed*delta
  22. speed += force*delta/mass
  23. if position.x < 0 or position.x>1023:
  24. position.x = clamp(position.x, 0, 1023)
  25. speed.x = -speed.x
  26. if position.y < 0 or position.y>539:
  27. position.y = clamp(position.y, 0, 539)
  28. speed.y = -speed.y
  29. func integrate_forces(delta):
  30. force = Vector2.ZERO
  31. var vector_to_mouse = (get_viewport().get_mouse_position() - position)
  32. var distance_from_mouse = vector_to_mouse.length()
  33. if distance_from_mouse > 10 and Input.is_mouse_button_pressed(1):
  34. force += vector_to_mouse.normalized() * (force_strength / sqrt(distance_from_mouse))
  35. var drag = -speed * drag_k
  36. force += drag
  37. force += Vector2(0,1) * gravity
  38. #var viscous = (get_speed_here()-speed) * get_viscosity_here()
  39. #force += viscous
  40. var water = get_water_force()
  41. force += water
  42. #print(water.length()/force.length())
  43. pass
  44. func get_viscosity_here():
  45. var field = MAIN.field_at_vector(position).x
  46. var viscosity = 0
  47. if field >=1.0:
  48. viscosity = (field - 0.6)/(1-0.6)*100
  49. return viscosity
  50. func get_speed_here():
  51. var s = Vector2.ZERO
  52. var f = MAIN.field_at_vector(position)
  53. s = Vector2(
  54. f.x,
  55. f.z
  56. )
  57. s *= max_speed
  58. s -= Vector2.ONE*max_speed
  59. return s
  60. func potential_at_pixel(vec2):
  61. var coords = Vector2(floor(vec2.x),floor(vec2.y))
  62. var potential = MAIN.field_at_vector(coords).x
  63. #print (potential, coords)
  64. return MAIN.potential_curve.interpolate( potential)
  65. func get_water_force():
  66. var upper_pixel = position + Vector2(0,water_sampling_dist)
  67. var lower_pixel = position + Vector2(0,-water_sampling_dist)
  68. var right_pixel = position + Vector2(water_sampling_dist,0)
  69. var left_pixel = position + Vector2(-water_sampling_dist,0)
  70. #var potential_here = potential_at_pixel(position)
  71. var f = Vector2(
  72. potential_at_pixel(right_pixel) - potential_at_pixel(left_pixel),
  73. potential_at_pixel(upper_pixel) - potential_at_pixel(lower_pixel)
  74. )
  75. f *= -1*water_force_k
  76. #print(f)
  77. return f
  78. # Declare member variables here. Examples:
  79. # var a = 2
  80. # var b = "text"
  81. # Called when the node enters the scene tree for the first time.
  82. func _ready():
  83. circle = Circle.new(5)
  84. circle2 = Circle.new(5)
  85. circle2.z_index = 5
  86. call_deferred("add_child", circle)
  87. MAIN.call_deferred("add_child", circle2)
  88. pass # Replace with function body.
  89. # Called every frame. 'delta' is the elapsed time since the previous frame.
  90. #func _process(delta):
  91. # pass