Advertisement
Guest User

Untitled

a guest
Apr 27th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. ##########################################
  2. ###### MAIN SCENE SCRIPT #######
  3. ##########################################
  4.  
  5. # Spatial.gd
  6. # A script that is attached to a spatial node that acts as the main scene in which the cells will be spawned
  7. extends Spatial
  8.  
  9. var Cell = load("res://Cell.gd")
  10. var cells: Dictionary = {} # { cell_name: cell_object }
  11. var rid: Dictionary = {} # { cell_body_RID: cell_object}
  12. var cellname = 1
  13.  
  14. func newcell( global_startposition, scenario, space):
  15. cells[cellname] = Cell.new()
  16. var cell_body_RID = cells[cellname].setup( cellname, global_startposition, scenario, space)
  17. rid[cell_body_RID] = cells[cellname]
  18. cellname+=1
  19.  
  20. func _ready():
  21. var das_vector: Vector3
  22. var das_indices = [-1, -0.5, 0, 0.5, 1]
  23. for i in das_indices:
  24. for j in das_indices:
  25. for k in das_indices:
  26. das_vector = Vector3(i,j,k)
  27. newcell( das_vector, get_world().scenario, get_world().space)
  28.  
  29.  
  30. #---------------------------------------------------------------------------------------------------------
  31.  
  32. ##########################################
  33. ###### CELL CLASS SCRIPT #######
  34. ##########################################
  35.  
  36. # Cell.gd
  37. # Cell script. This is implemented as a script that is NOT attached to a node in the node tree
  38. extends Spatial
  39.  
  40. class_name Cell
  41. var cellname
  42. var contacts_physics: Array = [] # [ physics_body_RID ]
  43. var contacts_transmission: Array = [] # [ physics_body_RID ]
  44. var start_transform: Transform
  45. var visualinstance
  46. var visualmesh
  47. var body: RID
  48. var body_shape
  49. var contact_area: RID
  50. var contact_area_shape
  51. var contact_area_shape_idx = 0
  52. const FORCE_ATTRACTION = 1.0
  53.  
  54.  
  55. func _body_moved(state, index):
  56. # Move visualshape when physicsbody moves
  57. VisualServer.instance_set_transform(visualinstance, state.transform)
  58. # Move areas when physicsbody moves
  59. PhysicsServer.area_set_transform ( contact_area, state.transform )
  60. # Move cell transform when body moves
  61. self.transform = state.transform
  62.  
  63.  
  64. func _contact_area_body_interaction(body_entered_or_exited, body_RID, body_instance_ID, body_shape_idx, area_shape_idx):
  65. # if body enters, add it to the contact array if body is not the body of self
  66. if body_entered_or_exited == 0: # body has entered the area
  67. if not body_RID == body:
  68. contacts_physics.append(body_RID)
  69. elif body_entered_or_exited == 1: # body has exited the area
  70. contacts_physics.erase(body_RID)
  71.  
  72.  
  73.  
  74. func setup(myname: int, startposition: Vector3, visual_scenario, physics_space) -> RID:
  75. # setting up the variables of a cell after instancing
  76. start_transform = Transform( Basis(), startposition )
  77. cellname = myname
  78.  
  79. # VISUAL
  80. visualinstance = VisualServer.instance_create()
  81. VisualServer.instance_set_scenario(visualinstance, visual_scenario)
  82. visualmesh = SphereMesh.new()
  83. var visualradius = 2.0
  84. visualmesh.set_radius(visualradius)
  85. visualmesh.set_height( visualradius*2 )
  86. VisualServer.instance_set_base(visualinstance, visualmesh)
  87. VisualServer.instance_set_transform(visualinstance, start_transform)
  88.  
  89. # PHYSICS AREA
  90. contact_area = PhysicsServer.area_create()
  91. PhysicsServer.area_set_space_override_mode ( contact_area, 1 ) # 0: disabled. 1: combine
  92. PhysicsServer.area_set_param ( contact_area, 0, 10.0 ) # 0: gravity strength
  93. PhysicsServer.area_set_param ( contact_area, 2, true ) # 2: gravity is point
  94. PhysicsServer.area_set_param ( contact_area, 1, Vector3(0,0,0) ) # 1: gravity vector
  95. PhysicsServer.area_set_param ( contact_area, 5, 10.0 ) # 5: linear damping
  96. contact_area_shape = SphereShape.new()
  97. contact_area_shape.set_radius(20.0)
  98. #contact_area_shape.set_height(contact_radius)
  99. PhysicsServer.area_set_space( contact_area, physics_space )
  100. PhysicsServer.area_add_shape( contact_area, contact_area_shape, start_transform )
  101. PhysicsServer.area_set_transform( contact_area, start_transform )
  102. #PhysicsServer.area_set_shape_transform( contact_area, contact_area_shape_idx, start_transform )
  103. PhysicsServer.area_set_monitor_callback(contact_area, self, "_contact_area_body_interaction")
  104.  
  105. # PHYSICS BODY
  106. body = PhysicsServer.body_create()
  107. PhysicsServer.body_set_mode(body, PhysicsServer.BODY_MODE_RIGID)
  108. body_shape = SphereShape.new()
  109. var body_radius = visualradius
  110. body_shape.set_radius(body_radius)
  111. #body_shape.set_height(body_radius)
  112. PhysicsServer.body_add_shape(body, body_shape)
  113. PhysicsServer.body_set_space(body, physics_space )
  114. PhysicsServer.body_set_state(body, PhysicsServer.BODY_STATE_TRANSFORM, start_transform)
  115. PhysicsServer.body_set_force_integration_callback(body, self, "_body_moved", 0)
  116.  
  117. # CELL TRANSFORM
  118. self.transform = start_transform
  119.  
  120. # RETURN THE BODY RID
  121. return body
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement