1 /*************************************************************************/
2 /* convex_polygon_shape.cpp */
3 /*************************************************************************/
4 /* This file is part of: */
5 /* GODOT ENGINE */
6 /* https://godotengine.org */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
9 /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
10 /* */
11 /* Permission is hereby granted, free of charge, to any person obtaining */
12 /* a copy of this software and associated documentation files (the */
13 /* "Software"), to deal in the Software without restriction, including */
14 /* without limitation the rights to use, copy, modify, merge, publish, */
15 /* distribute, sublicense, and/or sell copies of the Software, and to */
16 /* permit persons to whom the Software is furnished to do so, subject to */
17 /* the following conditions: */
18 /* */
19 /* The above copyright notice and this permission notice shall be */
20 /* included in all copies or substantial portions of the Software. */
21 /* */
22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29 /*************************************************************************/
30 #include "convex_polygon_shape.h"
31 #include "quick_hull.h"
32 #include "servers/physics_server.h"
33
_gen_debug_mesh_lines()34 Vector<Vector3> ConvexPolygonShape::_gen_debug_mesh_lines() {
35
36 DVector<Vector3> points = get_points();
37
38 if (points.size() > 3) {
39
40 QuickHull qh;
41 Vector<Vector3> varr = Variant(points);
42 Geometry::MeshData md;
43 Error err = qh.build(varr, md);
44 if (err == OK) {
45 Vector<Vector3> lines;
46 lines.resize(md.edges.size() * 2);
47 for (int i = 0; i < md.edges.size(); i++) {
48 lines[i * 2 + 0] = md.vertices[md.edges[i].a];
49 lines[i * 2 + 1] = md.vertices[md.edges[i].b];
50 }
51 return lines;
52 }
53 }
54
55 return Vector<Vector3>();
56 }
57
_update_shape()58 void ConvexPolygonShape::_update_shape() {
59
60 PhysicsServer::get_singleton()->shape_set_data(get_shape(), points);
61 emit_changed();
62 }
63
set_points(const DVector<Vector3> & p_points)64 void ConvexPolygonShape::set_points(const DVector<Vector3> &p_points) {
65
66 points = p_points;
67 _update_shape();
68 notify_change_to_owners();
69 }
70
get_points() const71 DVector<Vector3> ConvexPolygonShape::get_points() const {
72
73 return points;
74 }
75
_bind_methods()76 void ConvexPolygonShape::_bind_methods() {
77
78 ObjectTypeDB::bind_method(_MD("set_points", "points"), &ConvexPolygonShape::set_points);
79 ObjectTypeDB::bind_method(_MD("get_points"), &ConvexPolygonShape::get_points);
80
81 ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "points"), _SCS("set_points"), _SCS("get_points"));
82 }
83
ConvexPolygonShape()84 ConvexPolygonShape::ConvexPolygonShape() :
85 Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONVEX_POLYGON)) {
86
87 //set_points(Vector3(1,1,1));
88 }
89