summaryrefslogtreecommitdiffstats
path: root/tools/editor/plugins/collision_polygon_editor_plugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/editor/plugins/collision_polygon_editor_plugin.cpp')
-rw-r--r--tools/editor/plugins/collision_polygon_editor_plugin.cpp648
1 files changed, 0 insertions, 648 deletions
diff --git a/tools/editor/plugins/collision_polygon_editor_plugin.cpp b/tools/editor/plugins/collision_polygon_editor_plugin.cpp
deleted file mode 100644
index 406c12b00a..0000000000
--- a/tools/editor/plugins/collision_polygon_editor_plugin.cpp
+++ /dev/null
@@ -1,648 +0,0 @@
-/*************************************************************************/
-/* collision_polygon_editor_plugin.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* http://www.godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-#include "collision_polygon_editor_plugin.h"
-
-#include "spatial_editor_plugin.h"
-#include "os/file_access.h"
-#include "tools/editor/editor_settings.h"
-#include "scene/3d/camera.h"
-#include "canvas_item_editor_plugin.h"
-
-#if 0
-
-void CollisionPolygonEditor::_notification(int p_what) {
-
- switch(p_what) {
-
- case NOTIFICATION_READY: {
-
- button_create->set_icon( get_icon("Edit","EditorIcons"));
- button_edit->set_icon( get_icon("MovePoint","EditorIcons"));
- button_edit->set_pressed(true);
- get_tree()->connect("node_removed",this,"_node_removed");
-
-
- } break;
- case NOTIFICATION_PROCESS: {
-
- if (node->get_depth() != prev_depth) {
- _polygon_draw();
- prev_depth=node->get_depth();
- }
-
- } break;
- }
-
-}
-void CollisionPolygonEditor::_node_removed(Node *p_node) {
-
- if(p_node==node) {
- node=NULL;
- if (imgeom->get_parent()==p_node)
- p_node->remove_child(imgeom);
- hide();
- set_process(false);
- }
-
-}
-
-
-void CollisionPolygonEditor::_menu_option(int p_option) {
-
- switch(p_option) {
-
- case MODE_CREATE: {
-
- mode=MODE_CREATE;
- button_create->set_pressed(true);
- button_edit->set_pressed(false);
- } break;
- case MODE_EDIT: {
-
- mode=MODE_EDIT;
- button_create->set_pressed(false);
- button_edit->set_pressed(true);
- } break;
-
- }
-}
-
-void CollisionPolygonEditor::_wip_close() {
-
- undo_redo->create_action(TTR("Create Poly3D"));
- undo_redo->add_undo_method(node,"set_polygon",node->get_polygon());
- undo_redo->add_do_method(node,"set_polygon",wip);
- undo_redo->add_do_method(this,"_polygon_draw");
- undo_redo->add_undo_method(this,"_polygon_draw");
- wip.clear();
- wip_active=false;
- mode=MODE_EDIT;
- button_edit->set_pressed(true);
- button_create->set_pressed(false);
- edited_point=-1;
- undo_redo->commit_action();
-
-}
-
-bool CollisionPolygonEditor::forward_spatial_gui_input(Camera* p_camera,const InputEvent& p_event) {
-
- if (!node)
- return false;
-
- Transform gt = node->get_global_transform();
- Transform gi = gt.affine_inverse();
- float depth = node->get_depth()*0.5;
- Vector3 n = gt.basis.get_axis(2).normalized();
- Plane p(gt.origin+n*depth,n);
-
-
- switch(p_event.type) {
-
- case InputEvent::MOUSE_BUTTON: {
-
- const InputEventMouseButton &mb=p_event.mouse_button;
-
-
-
- Vector2 gpoint=Point2(mb.x,mb.y);
- Vector3 ray_from = p_camera->project_ray_origin(gpoint);
- Vector3 ray_dir = p_camera->project_ray_normal(gpoint);
-
- Vector3 spoint;
-
- if (!p.intersects_ray(ray_from,ray_dir,&spoint))
- break;
-
- spoint = gi.xform(spoint);
-
- Vector2 cpoint(spoint.x,spoint.y);
-
- cpoint=CanvasItemEditor::get_singleton()->snap_point(cpoint);
-
- Vector<Vector2> poly = node->get_polygon();
-
- //first check if a point is to be added (segment split)
- real_t grab_treshold=EDITOR_DEF("editors/poly_editor/point_grab_radius",8);
-
- switch(mode) {
-
-
- case MODE_CREATE: {
-
- if (mb.button_index==BUTTON_LEFT && mb.pressed) {
-
-
- if (!wip_active) {
-
- wip.clear();
- wip.push_back( cpoint );
- wip_active=true;
- edited_point_pos=cpoint;
- _polygon_draw();
- edited_point=1;
- return true;
- } else {
-
-
- if (wip.size()>1 && p_camera->unproject_position(gt.xform(Vector3(wip[0].x,wip[0].y,depth))).distance_to(gpoint)<grab_treshold) {
- //wip closed
- _wip_close();
-
- return true;
- } else {
-
- wip.push_back( cpoint );
- edited_point=wip.size();
- _polygon_draw();
- return true;
-
- //add wip point
- }
- }
- } else if (mb.button_index==BUTTON_RIGHT && mb.pressed && wip_active) {
- _wip_close();
- }
-
-
-
- } break;
-
- case MODE_EDIT: {
-
- if (mb.button_index==BUTTON_LEFT) {
- if (mb.pressed) {
-
- if (mb.mod.control) {
-
-
- if (poly.size() < 3) {
-
- undo_redo->create_action(TTR("Edit Poly"));
- undo_redo->add_undo_method(node,"set_polygon",poly);
- poly.push_back(cpoint);
- undo_redo->add_do_method(node,"set_polygon",poly);
- undo_redo->add_do_method(this,"_polygon_draw");
- undo_redo->add_undo_method(this,"_polygon_draw");
- undo_redo->commit_action();
- return true;
- }
-
- //search edges
- int closest_idx=-1;
- Vector2 closest_pos;
- real_t closest_dist=1e10;
- for(int i=0;i<poly.size();i++) {
-
- Vector2 points[2] ={
- p_camera->unproject_position(gt.xform(Vector3(poly[i].x,poly[i].y,depth))),
- p_camera->unproject_position(gt.xform(Vector3(poly[(i+1)%poly.size()].x,poly[(i+1)%poly.size()].y,depth)))
- };
-
- Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint,points);
- if (cp.distance_squared_to(points[0])<CMP_EPSILON2 || cp.distance_squared_to(points[1])<CMP_EPSILON2)
- continue; //not valid to reuse point
-
- real_t d = cp.distance_to(gpoint);
- if (d<closest_dist && d<grab_treshold) {
- closest_dist=d;
- closest_pos=cp;
- closest_idx=i;
- }
-
-
- }
-
- if (closest_idx>=0) {
-
- pre_move_edit=poly;
- poly.insert(closest_idx+1,cpoint);
- edited_point=closest_idx+1;
- edited_point_pos=cpoint;
- node->set_polygon(poly);
- _polygon_draw();
- return true;
- }
- } else {
-
- //look for points to move
-
- int closest_idx=-1;
- Vector2 closest_pos;
- real_t closest_dist=1e10;
- for(int i=0;i<poly.size();i++) {
-
- Vector2 cp = p_camera->unproject_position(gt.xform(Vector3(poly[i].x,poly[i].y,depth)));
-
- real_t d = cp.distance_to(gpoint);
- if (d<closest_dist && d<grab_treshold) {
- closest_dist=d;
- closest_pos=cp;
- closest_idx=i;
- }
-
- }
-
- if (closest_idx>=0) {
-
- pre_move_edit=poly;
- edited_point=closest_idx;
- edited_point_pos=poly[closest_idx];
- _polygon_draw();
- return true;
- }
- }
- } else {
-
- if (edited_point!=-1) {
-
- //apply
-
- ERR_FAIL_INDEX_V(edited_point,poly.size(),false);
- poly[edited_point]=edited_point_pos;
- undo_redo->create_action(TTR("Edit Poly"));
- undo_redo->add_do_method(node,"set_polygon",poly);
- undo_redo->add_undo_method(node,"set_polygon",pre_move_edit);
- undo_redo->add_do_method(this,"_polygon_draw");
- undo_redo->add_undo_method(this,"_polygon_draw");
- undo_redo->commit_action();
-
- edited_point=-1;
- return true;
- }
- }
- } if (mb.button_index==BUTTON_RIGHT && mb.pressed && edited_point==-1) {
-
-
-
- int closest_idx=-1;
- Vector2 closest_pos;
- real_t closest_dist=1e10;
- for(int i=0;i<poly.size();i++) {
-
- Vector2 cp = p_camera->unproject_position(gt.xform(Vector3(poly[i].x,poly[i].y,depth)));
-
- real_t d = cp.distance_to(gpoint);
- if (d<closest_dist && d<grab_treshold) {
- closest_dist=d;
- closest_pos=cp;
- closest_idx=i;
- }
-
- }
-
- if (closest_idx>=0) {
-
-
- undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
- undo_redo->add_undo_method(node,"set_polygon",poly);
- poly.remove(closest_idx);
- undo_redo->add_do_method(node,"set_polygon",poly);
- undo_redo->add_do_method(this,"_polygon_draw");
- undo_redo->add_undo_method(this,"_polygon_draw");
- undo_redo->commit_action();
- return true;
- }
-
- }
-
-
-
- } break;
- }
-
-
-
- } break;
- case InputEvent::MOUSE_MOTION: {
-
- const InputEventMouseMotion &mm=p_event.mouse_motion;
-
- if (edited_point!=-1 && (wip_active || mm.button_mask&BUTTON_MASK_LEFT)) {
-
- Vector2 gpoint = Point2(mm.x,mm.y);
-
- Vector3 ray_from = p_camera->project_ray_origin(gpoint);
- Vector3 ray_dir = p_camera->project_ray_normal(gpoint);
-
- Vector3 spoint;
-
- if (!p.intersects_ray(ray_from,ray_dir,&spoint))
- break;
-
- spoint = gi.xform(spoint);
-
- Vector2 cpoint(spoint.x,spoint.y);
-
- cpoint=CanvasItemEditor::get_singleton()->snap_point(cpoint);
- edited_point_pos = cpoint;
-
- _polygon_draw();
-
- }
-
- } break;
- }
-
- return false;
-}
-void CollisionPolygonEditor::_polygon_draw() {
-
- if (!node)
- return;
-
- Vector<Vector2> poly;
-
- if (wip_active)
- poly=wip;
- else
- poly=node->get_polygon();
-
-
- float depth = node->get_depth()*0.5;
-
- imgeom->clear();
- imgeom->set_material_override(line_material);
- imgeom->begin(Mesh::PRIMITIVE_LINES,Ref<Texture>());
-
-
- Rect2 rect;
-
- for(int i=0;i<poly.size();i++) {
-
-
- Vector2 p,p2;
- p = i==edited_point ? edited_point_pos : poly[i];
- if ((wip_active && i==poly.size()-1) || (((i+1)%poly.size())==edited_point))
- p2=edited_point_pos;
- else
- p2 = poly[(i+1)%poly.size()];
-
- if (i==0)
- rect.pos=p;
- else
- rect.expand_to(p);
-
- Vector3 point = Vector3(p.x,p.y,depth);
- Vector3 next_point = Vector3(p2.x,p2.y,depth);
-
- imgeom->set_color(Color(1,0.3,0.1,0.8));
- imgeom->add_vertex(point);
- imgeom->set_color(Color(1,0.3,0.1,0.8));
- imgeom->add_vertex(next_point);
-
- //Color col=Color(1,0.3,0.1,0.8);
- //vpc->draw_line(point,next_point,col,2);
- //vpc->draw_texture(handle,point-handle->get_size()*0.5);
- }
-
- rect=rect.grow(1);
-
- AABB r;
- r.pos.x=rect.pos.x;
- r.pos.y=rect.pos.y;
- r.pos.z=depth;
- r.size.x=rect.size.x;
- r.size.y=rect.size.y;
- r.size.z=0;
-
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos);
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(0.3,0,0));
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos);
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(0.0,0.3,0));
-
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(r.size.x,0,0));
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(r.size.x,0,0)-Vector3(0.3,0,0));
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(r.size.x,0,0));
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(r.size.x,0,0)+Vector3(0,0.3,0));
-
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(0,r.size.y,0));
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(0,r.size.y,0)-Vector3(0,0.3,0));
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(0,r.size.y,0));
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+Vector3(0,r.size.y,0)+Vector3(0.3,0,0));
-
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+r.size);
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+r.size-Vector3(0.3,0,0));
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+r.size);
- imgeom->set_color(Color(0.8,0.8,0.8,0.2));
- imgeom->add_vertex(r.pos+r.size-Vector3(0.0,0.3,0));
-
- imgeom->end();
-
-
- while(m->get_surface_count()) {
- m->surface_remove(0);
- }
-
- if (poly.size()==0)
- return;
-
- Array a;
- a.resize(Mesh::ARRAY_MAX);
- PoolVector<Vector3> va;
- {
-
- va.resize(poly.size());
- PoolVector<Vector3>::Write w=va.write();
- for(int i=0;i<poly.size();i++) {
-
-
- Vector2 p,p2;
- p = i==edited_point ? edited_point_pos : poly[i];
-
- Vector3 point = Vector3(p.x,p.y,depth);
- w[i]=point;
- }
- }
- a[Mesh::ARRAY_VERTEX]=va;
- m->add_surface(Mesh::PRIMITIVE_POINTS,a);
- m->surface_set_material(0,handle_material);
-
-}
-
-
-
-void CollisionPolygonEditor::edit(Node *p_collision_polygon) {
-
-
-
- if (p_collision_polygon) {
-
- node=p_collision_polygon->cast_to<CollisionPolygon>();
- wip.clear();
- wip_active=false;
- edited_point=-1;
- p_collision_polygon->add_child(imgeom);
- _polygon_draw();
- set_process(true);
- prev_depth=-1;
-
- } else {
- node=NULL;
-
- if (imgeom->get_parent())
- imgeom->get_parent()->remove_child(imgeom);
-
- set_process(false);
- }
-
-}
-
-void CollisionPolygonEditor::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_menu_option"),&CollisionPolygonEditor::_menu_option);
- ClassDB::bind_method(D_METHOD("_polygon_draw"),&CollisionPolygonEditor::_polygon_draw);
- ClassDB::bind_method(D_METHOD("_node_removed"),&CollisionPolygonEditor::_node_removed);
-
-}
-
-CollisionPolygonEditor::CollisionPolygonEditor(EditorNode *p_editor) {
-
-
- node=NULL;
- editor=p_editor;
- undo_redo = editor->get_undo_redo();
-
- add_child( memnew( VSeparator ));
- button_create = memnew( ToolButton );
- add_child(button_create);
- button_create->connect("pressed",this,"_menu_option",varray(MODE_CREATE));
- button_create->set_toggle_mode(true);
-
- button_edit = memnew( ToolButton );
- add_child(button_edit);
- button_edit->connect("pressed",this,"_menu_option",varray(MODE_EDIT));
- button_edit->set_toggle_mode(true);
-
- //add_constant_override("separation",0);
-
-#if 0
- options = memnew( MenuButton );
- add_child(options);
- options->set_area_as_parent_rect();
- options->set_text("Polygon");
- //options->get_popup()->add_item("Parse BBCode",PARSE_BBCODE);
- options->get_popup()->connect("id_pressed", this,"_menu_option");
-#endif
-
- mode = MODE_EDIT;
- wip_active=false;
- imgeom = memnew( ImmediateGeometry );
- imgeom->set_transform(Transform(Matrix3(),Vector3(0,0,0.00001)));
-
-
- line_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
- line_material->set_flag(Material::FLAG_UNSHADED, true);
- line_material->set_line_width(3.0);
- line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA, true);
- line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY, true);
- line_material->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,Color(1,1,1));
-
-
-
-
- handle_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
- handle_material->set_flag(Material::FLAG_UNSHADED, true);
- handle_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_POINT_SIZE, true);
- handle_material->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,Color(1,1,1));
- handle_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA, true);
- handle_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY, false);
- Ref<Texture> handle=editor->get_gui_base()->get_icon("Editor3DHandle","EditorIcons");
- handle_material->set_point_size(handle->get_width());
- handle_material->set_texture(FixedSpatialMaterial::PARAM_DIFFUSE,handle);
-
- pointsm = memnew( MeshInstance );
- imgeom->add_child(pointsm);
- m = Ref<Mesh>( memnew( Mesh ) );
- pointsm->set_mesh(m);
- pointsm->set_transform(Transform(Matrix3(),Vector3(0,0,0.00001)));
-
-
-}
-
-CollisionPolygonEditor::~CollisionPolygonEditor() {
-
- memdelete( imgeom );
-}
-
-
-void CollisionPolygonEditorPlugin::edit(Object *p_object) {
-
- collision_polygon_editor->edit(p_object->cast_to<Node>());
-}
-
-bool CollisionPolygonEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_type("CollisionPolygon");
-}
-
-void CollisionPolygonEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- collision_polygon_editor->show();
- } else {
-
- collision_polygon_editor->hide();
- collision_polygon_editor->edit(NULL);
- }
-
-}
-
-CollisionPolygonEditorPlugin::CollisionPolygonEditorPlugin(EditorNode *p_node) {
-
- editor=p_node;
- collision_polygon_editor = memnew( CollisionPolygonEditor(p_node) );
- SpatialEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor);
-
- collision_polygon_editor->hide();
-
-
-
-}
-
-
-CollisionPolygonEditorPlugin::~CollisionPolygonEditorPlugin()
-{
-}
-
-#endif