Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ##########################################
- ###### MAIN SCENE SCRIPT #######
- ##########################################
- # Spatial.gd
- # A script that is attached to a spatial node that acts as the main scene in which the cells will be spawned
- extends Spatial
- var Cell = load("res://Cell.gd")
- var cells: Dictionary = {} # { cell_name: cell_object }
- var rid: Dictionary = {} # { cell_body_RID: cell_object}
- var cellname = 1
- func newcell( global_startposition, scenario, space):
- cells[cellname] = Cell.new()
- var cell_body_RID = cells[cellname].setup( cellname, global_startposition, scenario, space)
- rid[cell_body_RID] = cells[cellname]
- cellname+=1
- func _ready():
- var das_vector: Vector3
- var das_indices = [-1, -0.5, 0, 0.5, 1]
- for i in das_indices:
- for j in das_indices:
- for k in das_indices:
- das_vector = Vector3(i,j,k)
- newcell( das_vector, get_world().scenario, get_world().space)
- #---------------------------------------------------------------------------------------------------------
- ##########################################
- ###### CELL CLASS SCRIPT #######
- ##########################################
- # Cell.gd
- # Cell script. This is implemented as a script that is NOT attached to a node in the node tree
- extends Spatial
- class_name Cell
- var cellname
- var contacts_physics: Array = [] # [ physics_body_RID ]
- var contacts_transmission: Array = [] # [ physics_body_RID ]
- var start_transform: Transform
- var visualinstance
- var visualmesh
- var body: RID
- var body_shape
- var contact_area: RID
- var contact_area_shape
- var contact_area_shape_idx = 0
- const FORCE_ATTRACTION = 1.0
- func _body_moved(state, index):
- # Move visualshape when physicsbody moves
- VisualServer.instance_set_transform(visualinstance, state.transform)
- # Move areas when physicsbody moves
- PhysicsServer.area_set_transform ( contact_area, state.transform )
- # Move cell transform when body moves
- self.transform = state.transform
- func _contact_area_body_interaction(body_entered_or_exited, body_RID, body_instance_ID, body_shape_idx, area_shape_idx):
- # if body enters, add it to the contact array if body is not the body of self
- if body_entered_or_exited == 0: # body has entered the area
- if not body_RID == body:
- contacts_physics.append(body_RID)
- elif body_entered_or_exited == 1: # body has exited the area
- contacts_physics.erase(body_RID)
- func setup(myname: int, startposition: Vector3, visual_scenario, physics_space) -> RID:
- # setting up the variables of a cell after instancing
- start_transform = Transform( Basis(), startposition )
- cellname = myname
- # VISUAL
- visualinstance = VisualServer.instance_create()
- VisualServer.instance_set_scenario(visualinstance, visual_scenario)
- visualmesh = SphereMesh.new()
- var visualradius = 2.0
- visualmesh.set_radius(visualradius)
- visualmesh.set_height( visualradius*2 )
- VisualServer.instance_set_base(visualinstance, visualmesh)
- VisualServer.instance_set_transform(visualinstance, start_transform)
- # PHYSICS AREA
- contact_area = PhysicsServer.area_create()
- PhysicsServer.area_set_space_override_mode ( contact_area, 1 ) # 0: disabled. 1: combine
- PhysicsServer.area_set_param ( contact_area, 0, 10.0 ) # 0: gravity strength
- PhysicsServer.area_set_param ( contact_area, 2, true ) # 2: gravity is point
- PhysicsServer.area_set_param ( contact_area, 1, Vector3(0,0,0) ) # 1: gravity vector
- PhysicsServer.area_set_param ( contact_area, 5, 10.0 ) # 5: linear damping
- contact_area_shape = SphereShape.new()
- contact_area_shape.set_radius(20.0)
- #contact_area_shape.set_height(contact_radius)
- PhysicsServer.area_set_space( contact_area, physics_space )
- PhysicsServer.area_add_shape( contact_area, contact_area_shape, start_transform )
- PhysicsServer.area_set_transform( contact_area, start_transform )
- #PhysicsServer.area_set_shape_transform( contact_area, contact_area_shape_idx, start_transform )
- PhysicsServer.area_set_monitor_callback(contact_area, self, "_contact_area_body_interaction")
- # PHYSICS BODY
- body = PhysicsServer.body_create()
- PhysicsServer.body_set_mode(body, PhysicsServer.BODY_MODE_RIGID)
- body_shape = SphereShape.new()
- var body_radius = visualradius
- body_shape.set_radius(body_radius)
- #body_shape.set_height(body_radius)
- PhysicsServer.body_add_shape(body, body_shape)
- PhysicsServer.body_set_space(body, physics_space )
- PhysicsServer.body_set_state(body, PhysicsServer.BODY_STATE_TRANSFORM, start_transform)
- PhysicsServer.body_set_force_integration_callback(body, self, "_body_moved", 0)
- # CELL TRANSFORM
- self.transform = start_transform
- # RETURN THE BODY RID
- return body
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement