Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- tool
- extends EditorPlugin
- const BUTTON_START_ID = 0
- const BUTTON_WIRE_ID = 1
- const BUTTON_CLOUD_ID = 2
- const BUTTON_HELP_ID = 4
- var meshInstance #edited meshInstance
- var editedMaterial = preload("res://addons/Line Tool/editMat.tres") #material for vertex color preview (unshaded)
- var toolsMenu = preload("res://addons/Line Tool/toolsMenu.tscn").instance()
- var helpDialog = preload("res://addons/Line Tool/helpDialog.tscn").instance()
- var alertPopup = AcceptDialog.new()
- var edgeSelector1 = -1
- var edgeSelector2 = -1
- var selectorColor = Color(1.0, 0.0, 0.0)
- func _enter_tree():
- toolsMenu.hide()
- toolsMenu.get_popup().connect("item_pressed", self, "menuItemPressed")
- get_base_control().add_child(alertPopup)
- get_base_control().add_child(helpDialog)
- add_control_to_container(1, toolsMenu)
- func _exit_tree():
- toolsMenu.get_popup().disconnect("item_pressed", self, "menuItemPressed")
- toolsMenu.free()
- get_base_control().remove_child(alertPopup)
- get_base_control().remove_child(helpDialog)
- alertPopup.free()
- helpDialog.free()
- func forward_spatial_input_event(camera, event):
- if (event.type == InputEvent.MOUSE_BUTTON):
- if (event.button_index == BUTTON_LEFT and event.pressed):
- if (meshInstance.has_meta("orgMesh")):
- var meshTool = MeshDataTool.new()
- meshTool.create_from_surface(meshInstance.get_meta("orgMesh"), 0)
- var index
- var oldDistance = 400000
- for i in range(meshTool.get_vertex_count()):
- var unprVer = camera.unproject_position(meshTool.get_vertex(i))
- var distance = unprVer.distance_to(event.pos)
- if (distance < oldDistance):
- oldDistance = distance
- index = i
- if (event.alt):
- edgeSelector2 = index
- else:
- edgeSelector1 = index
- meshTool.set_vertex_color(index, selectorColor)
- print("sel1: ", edgeSelector1, " - ", "sel2: ", edgeSelector2)
- #possible memory leak?
- var newWireMesh = generateWireframeMesh(meshTool)
- meshInstance.get_meta("orgMesh").surface_remove(0)
- meshTool.commit_to_surface(meshInstance.get_meta("orgMesh"))
- #if you comment out these two lines, no memory is leaking
- meshInstance.get_mesh().surface_remove(0)
- meshInstance.set_mesh(newWireMesh)
- elif (event.type == InputEvent.KEY):
- pass #check delete key
- func startEditing():
- if (!meshInstance.has_meta("orgMesh")):
- var meshTool = MeshDataTool.new()
- meshTool.create_from_surface(meshInstance.get_mesh(), 0)
- var previewMesh = generateWireframeMesh(meshTool)
- meshInstance.set_meta("orgMesh", meshInstance.get_mesh())
- meshInstance.set_mesh(previewMesh)
- meshInstance.set_material_override(editedMaterial)
- func generateWireframeMesh(meshTool):
- var surfaceTool = SurfaceTool.new()
- surfaceTool.begin(Mesh.PRIMITIVE_LINES)
- for i in range(meshTool.get_edge_count()):
- if (meshTool.get_edge_vertex(i, 0) == edgeSelector1 or meshTool.get_edge_vertex(i, 0) == edgeSelector2):
- surfaceTool.add_color(selectorColor.inverted())
- else:
- surfaceTool.add_color(meshTool.get_vertex_color(meshTool.get_edge_vertex(i, 0)))
- surfaceTool.add_normal(meshTool.get_vertex_normal(meshTool.get_edge_vertex(i, 0)))
- surfaceTool.add_vertex(meshTool.get_vertex(meshTool.get_edge_vertex(i, 0)))
- if (meshTool.get_edge_vertex(i, 1) == edgeSelector1 or meshTool.get_edge_vertex(i, 1) == edgeSelector2):
- surfaceTool.add_color(selectorColor.inverted())
- else:
- surfaceTool.add_color(meshTool.get_vertex_color(meshTool.get_edge_vertex(i, 1)))
- surfaceTool.add_normal(meshTool.get_vertex_normal(meshTool.get_edge_vertex(i, 1)))
- surfaceTool.add_vertex(meshTool.get_vertex(meshTool.get_edge_vertex(i, 1)))
- var wireMesh = surfaceTool.commit()
- return wireMesh
- func commitWireframe():
- if (meshInstance.has_meta("orgMesh")):
- ##not implemented
- pass
- func menuItemPressed(ID):
- if (ID == BUTTON_WIRE_ID):
- pass
- elif (ID == BUTTON_CLOUD_ID):
- pass
- elif (ID == BUTTON_START_ID):
- startEditing()
- elif (ID == BUTTON_HELP_ID):
- helpDialog.popup_centered()
- func showWarning(message):
- alertPopup.set_text(message)
- alertPopup.popup_centered()
- func handles(object):
- if (object.is_type("MeshInstance")):
- return true
- else:
- return false
- func edit(object):
- meshInstance = object
- print("newSelection")
- edgeSelector1 = -1
- edgeSelector2 = -1
- func clear():
- meshInstance = null
- func make_visible(visible):
- if (visible == true):
- toolsMenu.show()
- else:
- toolsMenu.hide()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement