Skip to content

Commit

Permalink
Merge pull request #11 from erayzesen/feature/add_disabled_particles_…
Browse files Browse the repository at this point in the history
…and_one_time_collidable_particles

Add Support for Disabled Particles and Lazy Particles
  • Loading branch information
erayzesen authored Jan 15, 2025
2 parents a43f6eb + 5f5486f commit 150fa02
Show file tree
Hide file tree
Showing 62 changed files with 582 additions and 47 deletions.
Binary file modified .sconsign.dblite
Binary file not shown.
Binary file not shown.
38 changes: 38 additions & 0 deletions project/addons/quarkphysics/qmesh_editor/qmesh_editor_tool.gd
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ var last_mouse_motion_position=Vector2.ZERO

#Plugin References
var radiusSpinBox:SpinBox
var enabledCheckBox:CheckBox
var internalCheckBox:CheckBox
var lazyCheckBox:CheckBox
var operationOptionButton:OptionButton
var plugin:EditorPlugin

Expand All @@ -30,9 +32,15 @@ func _handle_event(event:InputEvent)->bool:

func _handle_canvas_draw(overlay: Control):
pass

func _enabled_checkbox_toggled(toggled_on:bool) :
pass

func _internal_checkbox_toggled(toggled_on:bool) :
pass

func _lazy_checkbox_toggled(toggled_on:bool) :
pass

func _radius_bar_changed(value:float) :
pass
Expand Down Expand Up @@ -128,3 +136,33 @@ func is_particle_exist_in_uv(targetMeshNode:QMeshNode,particleIndex:int)->bool:
if map[j]==particleIndex :
return true
return false

static func solve_faulty_particle_data_issues(targetMeshNode:QMeshNode) :
var particleCount=targetMeshNode.data_particle_positions.size()
#Check Particle Enabled Values
if targetMeshNode.data_particle_is_enabled.size()<particleCount :
var temp_collection=targetMeshNode.data_particle_is_enabled.duplicate()
for i in range(temp_collection.size(),particleCount) :
temp_collection.append(true)
targetMeshNode.data_particle_is_enabled=temp_collection
#Check Particle Internal Values
if targetMeshNode.data_particle_is_internal.size()<particleCount :
var temp_collection=targetMeshNode.data_particle_is_internal.duplicate()
for i in range(temp_collection.size(),particleCount) :
temp_collection.append(false)
targetMeshNode.data_particle_is_internal=temp_collection

#Check Particle Lazy Values
if targetMeshNode.data_particle_is_lazy.size()<particleCount :
var temp_collection=targetMeshNode.data_particle_is_lazy.duplicate()
for i in range(temp_collection.size(),particleCount) :
temp_collection.append(false)
targetMeshNode.data_particle_is_lazy=temp_collection

#Check Particle Radius Values
if targetMeshNode.data_particle_radius.size()<particleCount :
var temp_collection=targetMeshNode.data_particle_radius.duplicate()
for i in range(temp_collection.size(),particleCount) :
temp_collection.append(0.5)
targetMeshNode.data_particle_radius=temp_collection
pass
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,21 @@ popup/item_0/text = "ADD"
popup/item_1/text = "REMOVE"
popup/item_1/id = 1

[node name="EnabledCheckBox" type="CheckBox" parent="."]
visible = false
layout_mode = 2
text = "Enabled"

[node name="InternalCheckBox" type="CheckBox" parent="."]
visible = false
layout_mode = 2
text = "Internal"

[node name="LazyCheckBox" type="CheckBox" parent="."]
visible = false
layout_mode = 2
text = "Lazy"

[node name="RadiusBar" type="HBoxContainer" parent="."]
visible = false
layout_mode = 2
Expand Down
108 changes: 103 additions & 5 deletions project/addons/quarkphysics/qmesh_editor/qmesh_editor_tool_select.gd
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ func _handle_event(event:InputEvent)->bool:
#Update Radius SpinBox
update_radius_spin_box()
update_internal_check_box()
update_enabled_check_box()
update_lazy_check_box()


#Clearing the selection rect and mouse drag&repositioning values
Expand Down Expand Up @@ -125,6 +127,38 @@ func _internal_checkbox_toggled(toggled_on:bool) :
undo_redo.add_do_method(self,"command_set_particle_internal_values",plugin,meshNode,particle_indexes,new_values )
undo_redo.commit_action(true)

func _enabled_checkbox_toggled(toggled_on:bool) :
var value:int=1 if toggled_on else 0
if selected_particle_indexes.size()>0 :
var particle_indexes:PackedInt32Array=selected_particle_indexes.duplicate()
var new_values:PackedByteArray
var old_values:PackedByteArray
for i in range(selected_particle_indexes.size() ) :
var p_index=particle_indexes[i]
old_values.append(meshNode.data_particle_is_enabled[p_index])
new_values.append(value)
var undo_redo=plugin.get_undo_redo()
undo_redo.create_action("Set Enabled Values of Particles: "+str(value) )
undo_redo.add_undo_method(self,"command_set_particle_enabled_values",plugin,meshNode,particle_indexes,old_values )
undo_redo.add_do_method(self,"command_set_particle_enabled_values",plugin,meshNode,particle_indexes,new_values )
undo_redo.commit_action(true)

func _lazy_checkbox_toggled(toggled_on:bool) :
var value:int=1 if toggled_on else 0
if selected_particle_indexes.size()>0 :
var particle_indexes:PackedInt32Array=selected_particle_indexes.duplicate()
var new_values:PackedByteArray
var old_values:PackedByteArray
for i in range(selected_particle_indexes.size() ) :
var p_index=particle_indexes[i]
old_values.append(meshNode.data_particle_is_lazy[p_index])
new_values.append(value)
var undo_redo=plugin.get_undo_redo()
undo_redo.create_action("Set Lazy Values of Particles: "+str(value) )
undo_redo.add_undo_method(self,"command_set_particle_lazy_values",plugin,meshNode,particle_indexes,old_values )
undo_redo.add_do_method(self,"command_set_particle_lazy_values",plugin,meshNode,particle_indexes,new_values )
undo_redo.commit_action(true)


func _radius_bar_changed(value:float) :

Expand All @@ -145,7 +179,7 @@ func _radius_bar_changed(value:float) :

pass

func get_common_radius_of_particles(particle_indexes:PackedInt32Array) ->float:
func get_common_radius_value_of_particles(particle_indexes:PackedInt32Array) ->float:
var common_value=0.5
if particle_indexes.size()>1 :
for i in range(particle_indexes.size()-1) :
Expand All @@ -159,7 +193,7 @@ func get_common_radius_of_particles(particle_indexes:PackedInt32Array) ->float:

return common_value

func get_common_internal_mode_of_particles(particle_indexes:PackedInt32Array) ->bool:
func get_common_internal_value_of_particles(particle_indexes:PackedInt32Array) ->bool:
var common_value:bool=false
if particle_indexes.size()>1 :
for i in range(particle_indexes.size()-1) :
Expand All @@ -173,12 +207,40 @@ func get_common_internal_mode_of_particles(particle_indexes:PackedInt32Array) ->

return common_value

func get_common_enabled_value_of_particles(particle_indexes:PackedInt32Array) ->bool:
var common_value:bool=false
if particle_indexes.size()>1 :
for i in range(particle_indexes.size()-1) :
var cpr=meshNode.data_particle_is_enabled[particle_indexes[i]]
var npr=meshNode.data_particle_is_enabled[particle_indexes[i+1]]
common_value=cpr
if cpr!=npr :
break
elif particle_indexes.size()==1 :
common_value=meshNode.data_particle_is_enabled[particle_indexes[0]]

return common_value

func get_common_lazy_value_of_particles(particle_indexes:PackedInt32Array) ->bool:
var common_value:bool=false
if particle_indexes.size()>1 :
for i in range(particle_indexes.size()-1) :
var cpr=meshNode.data_particle_is_lazy[particle_indexes[i]]
var npr=meshNode.data_particle_is_lazy[particle_indexes[i+1]]
common_value=cpr
if cpr!=npr :
break
elif particle_indexes.size()==1 :
common_value=meshNode.data_particle_is_lazy[particle_indexes[0]]

return common_value

func update_radius_spin_box():
if selected_particle_indexes.size()==0:
radiusSpinBox.set_value_no_signal(0.5)
radiusSpinBox.editable=false
else :
var common_radius_value=get_common_radius_of_particles(selected_particle_indexes)
var common_radius_value=get_common_radius_value_of_particles(selected_particle_indexes)
radiusSpinBox.set_value_no_signal(common_radius_value)
radiusSpinBox.editable=true
pass
Expand All @@ -188,9 +250,27 @@ func update_internal_check_box():
internalCheckBox.set_pressed_no_signal(false)
internalCheckBox.disabled=true
else :
var common_internal_value=get_common_internal_mode_of_particles(selected_particle_indexes)
internalCheckBox.set_pressed_no_signal(common_internal_value)
var common_value=get_common_internal_value_of_particles(selected_particle_indexes)
internalCheckBox.set_pressed_no_signal(common_value)
internalCheckBox.disabled=false

func update_enabled_check_box():
if selected_particle_indexes.size()==0:
enabledCheckBox.set_pressed_no_signal(false)
enabledCheckBox.disabled=true
else :
var common_value=get_common_enabled_value_of_particles(selected_particle_indexes)
enabledCheckBox.set_pressed_no_signal(common_value)
enabledCheckBox.disabled=false

func update_lazy_check_box():
if selected_particle_indexes.size()==0:
lazyCheckBox.set_pressed_no_signal(false)
lazyCheckBox.disabled=true
else :
var common_value=get_common_lazy_value_of_particles(selected_particle_indexes)
lazyCheckBox.set_pressed_no_signal(common_value)
lazyCheckBox.disabled=false

#Tool Commands
func command_set_particle_radius_values(targetPlugin:EditorPlugin, targetMeshNode:QMeshNode, particle_indexes:PackedInt32Array, values:PackedFloat32Array) :
Expand All @@ -211,6 +291,24 @@ func command_set_particle_internal_values(targetPlugin:EditorPlugin, targetMeshN
targetPlugin.update_overlays()
update_internal_check_box()

func command_set_particle_enabled_values(targetPlugin:EditorPlugin, targetMeshNode:QMeshNode, particle_indexes:PackedInt32Array, values:PackedByteArray) :
for i in range(particle_indexes.size() ):
var p_index=particle_indexes[i]
var p_value=values[i]
targetMeshNode.data_particle_is_enabled[p_index]=p_value
targetMeshNode.queue_redraw()
targetPlugin.update_overlays()
update_enabled_check_box()

func command_set_particle_lazy_values(targetPlugin:EditorPlugin, targetMeshNode:QMeshNode, particle_indexes:PackedInt32Array, values:PackedByteArray) :
for i in range(particle_indexes.size() ):
var p_index=particle_indexes[i]
var p_value=values[i]
targetMeshNode.data_particle_is_lazy[p_index]=p_value
targetMeshNode.queue_redraw()
targetPlugin.update_overlays()
update_lazy_check_box()


func command_move_particle_positions(targetPlugin:EditorPlugin, targetMeshNode:QMeshNode, particle_indexes:PackedInt32Array, delta:Vector2) :
for i in range(particle_indexes.size() ):
Expand Down
19 changes: 19 additions & 0 deletions project/addons/quarkphysics/qmesh_editor_plugin.gd
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ func _enter_tree() -> void:
func on_tool_bar_edit_pressed(toggled_on:bool):
if toggled_on :
edit_mode=true
QMeshEditorTool.solve_faulty_particle_data_issues(meshNode)
tool_bar.get_node("SelectButton").visible=true
tool_bar.get_node("ParticleButton").visible=true
tool_bar.get_node("SpringButton").visible=true
Expand All @@ -95,7 +96,9 @@ func on_tool_bar_edit_pressed(toggled_on:bool):
tool_bar.get_node("SpringButton").visible=false
tool_bar.get_node("PolygonButton").visible=false
tool_bar.get_node("UVButton").visible=false
tool_bar.get_node("EnabledCheckBox").visible=false
tool_bar.get_node("InternalCheckBox").visible=false
tool_bar.get_node("LazyCheckBox").visible=false
tool_bar.get_node("RadiusBar").visible=false
tool_bar.get_node("OperationOptionButton").visible=false
update_overlays()
Expand All @@ -110,42 +113,58 @@ func on_tool_button_pressed(button: BaseButton) :
match button:
select_button:
editor_tool=QMeshEditorToolSelect.new()
tool_bar.get_node("EnabledCheckBox").visible=true
tool_bar.get_node("InternalCheckBox").visible=true
tool_bar.get_node("LazyCheckBox").visible=true
tool_bar.get_node("RadiusBar").visible=true
tool_bar.get_node("OperationOptionButton").visible=false
tool_bar.get_node("EnabledCheckBox").connect("toggled",editor_tool._enabled_checkbox_toggled)
tool_bar.get_node("InternalCheckBox").connect("toggled",editor_tool._internal_checkbox_toggled)
tool_bar.get_node("LazyCheckBox").connect("toggled",editor_tool._lazy_checkbox_toggled)
tool_bar.get_node("RadiusBar/SpinBox").connect("value_changed",editor_tool._radius_bar_changed)
tool_bar.get_node("InternalCheckBox").disabled=true
tool_bar.get_node("EnabledCheckBox").disabled=true
tool_bar.get_node("LazyCheckBox").disabled=true
particle_button:
editor_tool=QMeshEditorToolParticle.new()
tool_bar.get_node("EnabledCheckBox").visible=false
tool_bar.get_node("InternalCheckBox").visible=true
tool_bar.get_node("LazyCheckBox").visible=false
tool_bar.get_node("RadiusBar").visible=false
tool_bar.get_node("OperationOptionButton").visible=true
tool_bar.get_node("OperationOptionButton").selected=0
tool_bar.get_node("InternalCheckBox").disabled=false
spring_button:
editor_tool=QMeshEditorToolSpring.new()
tool_bar.get_node("EnabledCheckBox").visible=false
tool_bar.get_node("InternalCheckBox").visible=true
tool_bar.get_node("LazyCheckBox").visible=false
tool_bar.get_node("RadiusBar").visible=false
tool_bar.get_node("OperationOptionButton").visible=true
tool_bar.get_node("OperationOptionButton").selected=0
tool_bar.get_node("InternalCheckBox").disabled=false
polygon_button:
editor_tool=QMeshEditorToolPolygon.new()
tool_bar.get_node("EnabledCheckBox").visible=false
tool_bar.get_node("InternalCheckBox").visible=false
tool_bar.get_node("LazyCheckBox").visible=false
tool_bar.get_node("RadiusBar").visible=false
tool_bar.get_node("OperationOptionButton").visible=true
tool_bar.get_node("OperationOptionButton").selected=0
uv_button:
editor_tool=QMeshEditorToolUV.new()
tool_bar.get_node("EnabledCheckBox").visible=false
tool_bar.get_node("InternalCheckBox").visible=false
tool_bar.get_node("LazyCheckBox").visible=false
tool_bar.get_node("RadiusBar").visible=false
tool_bar.get_node("OperationOptionButton").visible=true
tool_bar.get_node("OperationOptionButton").selected=0
editor_tool.plugin=self
editor_tool.meshNode=meshNode
editor_tool.radiusSpinBox=tool_bar.get_node("RadiusBar/SpinBox")
editor_tool.enabledCheckBox=tool_bar.get_node("EnabledCheckBox")
editor_tool.internalCheckBox=tool_bar.get_node("InternalCheckBox")
editor_tool.lazyCheckBox=tool_bar.get_node("LazyCheckBox")
editor_tool.operationOptionButton=tool_bar.get_node("OperationOptionButton")
editor_tool.radiusSpinBox.editable=false

Expand Down
6 changes: 6 additions & 0 deletions project/examples/1_welcome/main.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ enable_stroke = true
data_particle_positions = PackedVector2Array(-500, -150, 500, -150, 500, 150, -500, 150)
data_particle_radius = PackedFloat32Array(0.5, 0.5, 0.5, 0.5)
data_particle_is_internal = PackedByteArray(0, 0, 0, 0)
data_particle_is_enabled = PackedByteArray(1, 1, 1, 1)
data_particle_is_lazy = PackedByteArray(0, 0, 0, 0)
data_springs = Array[PackedInt32Array]([PackedInt32Array(0, 1), PackedInt32Array(1, 2), PackedInt32Array(2, 3), PackedInt32Array(3, 0)])
data_internal_springs = Array[PackedInt32Array]([PackedInt32Array(0, 2), PackedInt32Array(1, 3)])
data_polygon = PackedInt32Array(0, 1, 2, 3)
Expand All @@ -45,6 +47,8 @@ stroke_color = Color(0.0862745, 0.0901961, 0.101961, 1)
data_particle_positions = PackedVector2Array(-150, -2500, 150, -2500, 150, 2500, -150, 2500)
data_particle_radius = PackedFloat32Array(0.5, 0.5, 0.5, 0.5)
data_particle_is_internal = PackedByteArray(0, 0, 0, 0)
data_particle_is_enabled = PackedByteArray(1, 1, 1, 1)
data_particle_is_lazy = PackedByteArray(0, 0, 0, 0)
data_springs = Array[PackedInt32Array]([PackedInt32Array(0, 1), PackedInt32Array(1, 2), PackedInt32Array(2, 3), PackedInt32Array(3, 0)])
data_internal_springs = Array[PackedInt32Array]([PackedInt32Array(0, 2), PackedInt32Array(1, 3)])
data_polygon = PackedInt32Array(0, 1, 2, 3)
Expand All @@ -63,6 +67,8 @@ stroke_color = Color(0.0862745, 0.0901961, 0.101961, 1)
data_particle_positions = PackedVector2Array(-150, -2500, 150, -2500, 150, 2500, -150, 2500)
data_particle_radius = PackedFloat32Array(0.5, 0.5, 0.5, 0.5)
data_particle_is_internal = PackedByteArray(0, 0, 0, 0)
data_particle_is_enabled = PackedByteArray(1, 1, 1, 1)
data_particle_is_lazy = PackedByteArray(0, 0, 0, 0)
data_springs = Array[PackedInt32Array]([PackedInt32Array(0, 1), PackedInt32Array(1, 2), PackedInt32Array(2, 3), PackedInt32Array(3, 0)])
data_internal_springs = Array[PackedInt32Array]([PackedInt32Array(0, 2), PackedInt32Array(1, 3)])
data_polygon = PackedInt32Array(0, 1, 2, 3)
Expand Down
Loading

0 comments on commit 150fa02

Please sign in to comment.