virtualx-engine/tools/editor/spatial_editor_gizmos.h
Rémi Verschelde d8223ffa75 Welcome in 2017, dear changelog reader!
That year should bring the long-awaited OpenGL ES 3.0 compatible renderer
with state-of-the-art rendering techniques tuned to work as low as middle
end handheld devices - without compromising with the possibilities given
for higher end desktop games of course. Great times ahead for the Godot
community and the gamers that will play our games!

(cherry picked from commit c7bc44d5ad)
2017-01-12 19:15:30 +01:00

509 lines
12 KiB
C++

/*************************************************************************/
/* spatial_editor_gizmos.h */
/*************************************************************************/
/* 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. */
/*************************************************************************/
#ifndef SPATIAL_EDITOR_GIZMOS_H
#define SPATIAL_EDITOR_GIZMOS_H
#include "tools/editor/plugins/spatial_editor_plugin.h"
#include "scene/3d/light.h"
#include "scene/3d/listener.h"
#include "scene/3d/camera.h"
#include "scene/3d/position_3d.h"
#include "scene/3d/spatial_sample_player.h"
#include "scene/3d/spatial_stream_player.h"
#include "scene/3d/test_cube.h"
#include "scene/3d/mesh_instance.h"
#include "scene/3d/body_shape.h"
#include "scene/3d/room_instance.h"
#include "scene/3d/visibility_notifier.h"
#include "scene/3d/portal.h"
#include "scene/3d/ray_cast.h"
#include "scene/3d/navigation_mesh.h"
#include "scene/3d/vehicle_body.h"
#include "scene/3d/collision_polygon.h"
#include "scene/3d/physics_joint.h"
class Camera;
class EditorSpatialGizmo : public SpatialEditorGizmo {
OBJ_TYPE(EditorSpatialGizmo,SpatialGizmo);
struct Instance{
RID instance;
Ref<Mesh> mesh;
RID skeleton;
bool billboard;
bool unscaled;
bool can_intersect;
bool extra_margin;
Instance() {
billboard=false;
unscaled=false;
can_intersect=false;
extra_margin=false;
}
void create_instance(Spatial *p_base);
};
Vector<Vector3> collision_segments;
Ref<TriangleMesh> collision_mesh;
struct Handle {
Vector3 pos;
bool billboard;
};
Vector<Vector3> handles;
Vector<Vector3> secondary_handles;
bool billboard_handle;
bool valid;
Spatial *base;
Vector<Instance> instances;
Spatial *spatial_node;
void _set_spatial_node(Node *p_node) { set_spatial_node(p_node->cast_to<Spatial>()); }
protected:
void add_lines(const Vector<Vector3> &p_lines,const Ref<Material>& p_material,bool p_billboard=false);
void add_mesh(const Ref<Mesh>& p_mesh,bool p_billboard=false,const RID& p_skeleton=RID());
void add_collision_segments(const Vector<Vector3> &p_lines);
void add_collision_triangles(const Ref<TriangleMesh>& p_tmesh);
void add_unscaled_billboard(const Ref<Material>& p_material,float p_scale=1);
void add_handles(const Vector<Vector3> &p_handles,bool p_billboard=false,bool p_secondary=false);
void set_spatial_node(Spatial *p_node);
static void _bind_methods();
public:
virtual Vector3 get_handle_pos(int p_idx) const;
virtual bool intersect_frustum(const Camera *p_camera,const Vector<Plane> &p_frustum);
virtual bool intersect_ray(const Camera *p_camera,const Point2& p_point, Vector3& r_pos, Vector3& r_normal,int *r_gizmo_handle=NULL,bool p_sec_first=false);
void clear();
void create();
void transform();
virtual void redraw();
void free();
EditorSpatialGizmo();
~EditorSpatialGizmo();
};
class LightSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(LightSpatialGizmo,EditorSpatialGizmo);
Light* light;
public:
virtual String get_handle_name(int p_idx) const;
virtual Variant get_handle_value(int p_idx) const;
virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
void redraw();
LightSpatialGizmo(Light* p_light=NULL);
};
class ListenerSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(ListenerSpatialGizmo, EditorSpatialGizmo);
Listener* listener;
public:
void redraw();
ListenerSpatialGizmo(Listener* p_listener = NULL);
};
class CameraSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(CameraSpatialGizmo,EditorSpatialGizmo);
Camera* camera;
public:
virtual String get_handle_name(int p_idx) const;
virtual Variant get_handle_value(int p_idx) const;
virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
void redraw();
CameraSpatialGizmo(Camera* p_camera=NULL);
};
class MeshInstanceSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(MeshInstanceSpatialGizmo,EditorSpatialGizmo);
MeshInstance* mesh;
public:
void redraw();
MeshInstanceSpatialGizmo(MeshInstance* p_mesh=NULL);
};
class Position3DSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(Position3DSpatialGizmo,EditorSpatialGizmo);
Position3D* p3d;
public:
void redraw();
Position3DSpatialGizmo(Position3D* p_p3d=NULL);
};
class SkeletonSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(SkeletonSpatialGizmo,EditorSpatialGizmo);
Skeleton* skel;
public:
void redraw();
SkeletonSpatialGizmo(Skeleton* p_skel=NULL);
};
class SpatialPlayerSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(SpatialPlayerSpatialGizmo,EditorSpatialGizmo);
SpatialPlayer* splayer;
public:
void redraw();
SpatialPlayerSpatialGizmo(SpatialPlayer* p_splayer=NULL);
};
class TestCubeSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(TestCubeSpatialGizmo,EditorSpatialGizmo);
TestCube* tc;
public:
void redraw();
TestCubeSpatialGizmo(TestCube* p_tc=NULL);
};
class RoomSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(RoomSpatialGizmo,EditorSpatialGizmo);
struct _EdgeKey {
Vector3 from;
Vector3 to;
bool operator<(const _EdgeKey& p_with) const { return from==p_with.from ? to < p_with.to : from < p_with.from; }
};
Room* room;
public:
void redraw();
RoomSpatialGizmo(Room* p_room=NULL);
};
class PortalSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(PortalSpatialGizmo,EditorSpatialGizmo);
Portal* portal;
public:
void redraw();
PortalSpatialGizmo(Portal* p_portal=NULL);
};
class VisibilityNotifierGizmo : public EditorSpatialGizmo {
OBJ_TYPE(VisibilityNotifierGizmo ,EditorSpatialGizmo);
VisibilityNotifier* notifier;
public:
virtual String get_handle_name(int p_idx) const;
virtual Variant get_handle_value(int p_idx) const;
virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
void redraw();
VisibilityNotifierGizmo(VisibilityNotifier* p_notifier=NULL);
};
class CollisionShapeSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(CollisionShapeSpatialGizmo,EditorSpatialGizmo);
CollisionShape* cs;
public:
virtual String get_handle_name(int p_idx) const;
virtual Variant get_handle_value(int p_idx) const;
virtual void set_handle(int p_idx,Camera *p_camera, const Point2& p_point);
virtual void commit_handle(int p_idx,const Variant& p_restore,bool p_cancel=false);
void redraw();
CollisionShapeSpatialGizmo(CollisionShape* p_cs=NULL);
};
class CollisionPolygonSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(CollisionPolygonSpatialGizmo,EditorSpatialGizmo);
CollisionPolygon* polygon;
public:
void redraw();
CollisionPolygonSpatialGizmo(CollisionPolygon* p_polygon=NULL);
};
class RayCastSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(RayCastSpatialGizmo,EditorSpatialGizmo);
RayCast* raycast;
public:
void redraw();
RayCastSpatialGizmo(RayCast* p_raycast=NULL);
};
class VehicleWheelSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(VehicleWheelSpatialGizmo,EditorSpatialGizmo);
VehicleWheel* car_wheel;
public:
void redraw();
VehicleWheelSpatialGizmo(VehicleWheel* p_car_wheel=NULL);
};
class NavigationMeshSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(NavigationMeshSpatialGizmo,EditorSpatialGizmo);
struct _EdgeKey {
Vector3 from;
Vector3 to;
bool operator<(const _EdgeKey& p_with) const { return from==p_with.from ? to < p_with.to : from < p_with.from; }
};
NavigationMeshInstance* navmesh;
public:
void redraw();
NavigationMeshSpatialGizmo(NavigationMeshInstance* p_navmesh=NULL);
};
class PinJointSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(PinJointSpatialGizmo,EditorSpatialGizmo);
PinJoint* p3d;
public:
void redraw();
PinJointSpatialGizmo(PinJoint* p_p3d=NULL);
};
class HingeJointSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(HingeJointSpatialGizmo,EditorSpatialGizmo);
HingeJoint* p3d;
public:
void redraw();
HingeJointSpatialGizmo(HingeJoint* p_p3d=NULL);
};
class SliderJointSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(SliderJointSpatialGizmo,EditorSpatialGizmo);
SliderJoint* p3d;
public:
void redraw();
SliderJointSpatialGizmo(SliderJoint* p_p3d=NULL);
};
class ConeTwistJointSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(ConeTwistJointSpatialGizmo,EditorSpatialGizmo);
ConeTwistJoint* p3d;
public:
void redraw();
ConeTwistJointSpatialGizmo(ConeTwistJoint* p_p3d=NULL);
};
class Generic6DOFJointSpatialGizmo : public EditorSpatialGizmo {
OBJ_TYPE(Generic6DOFJointSpatialGizmo,EditorSpatialGizmo);
Generic6DOFJoint* p3d;
public:
void redraw();
Generic6DOFJointSpatialGizmo(Generic6DOFJoint* p_p3d=NULL);
};
class SpatialEditorGizmos {
public:
Ref<FixedMaterial> create_line_material(const Color& p_base_color);
Ref<FixedMaterial> create_solid_material(const Color& p_base_color);
Ref<FixedMaterial> handle2_material;
Ref<FixedMaterial> handle_material;
Ref<FixedMaterial> light_material;
Ref<FixedMaterial> light_material_omni_icon;
Ref<FixedMaterial> light_material_directional_icon;
Ref<FixedMaterial> camera_material;
Ref<FixedMaterial> skeleton_material;
Ref<FixedMaterial> room_material;
Ref<FixedMaterial> portal_material;
Ref<FixedMaterial> raycast_material;
Ref<FixedMaterial> visibility_notifier_material;
Ref<FixedMaterial> car_wheel_material;
Ref<FixedMaterial> joint_material;
Ref<FixedMaterial> navmesh_edge_material;
Ref<FixedMaterial> navmesh_solid_material;
Ref<FixedMaterial> navmesh_edge_material_disabled;
Ref<FixedMaterial> navmesh_solid_material_disabled;
Ref<FixedMaterial> listener_icon;
Ref<FixedMaterial> sample_player_icon;
Ref<FixedMaterial> stream_player_icon;
Ref<FixedMaterial> visibility_notifier_icon;
Ref<FixedMaterial> shape_material;
Ref<Texture> handle_t;
Ref<Mesh> pos3d_mesh;
Ref<Mesh> listener_line_mesh;
static SpatialEditorGizmos *singleton;
Ref<TriangleMesh> test_cube_tm;
Ref<SpatialEditorGizmo> get_gizmo(Spatial *p_spatial);
SpatialEditorGizmos();
};
#endif // SPATIAL_EDITOR_GIZMOS_H