2 #ifndef __AL_ROTATE_HANDLE_HPP__
3 #define __AL_ROTATE_HANDLE_HPP__
5 #include <al/ui/al_Pickable.hpp>
13 Vec3f downPos, newPos;
14 Vec3f downDir, newDir;
16 bool hover[3] = {
false,
false,
false};
17 bool selected[3] = {
false,
false,
false};
24 void addCircle(
Mesh &m,
float r,
int n) {
25 double inc = M_2PI / n;
27 for (
int i = 0; i <= n; i++) {
28 float x = cos(phase) * r;
29 float y = sin(phase) * r;
36 downPos.
set(rh.downPos);
37 downDir.
set(rh.downDir);
38 newPos.
set(rh.newPos);
39 newDir.
set(rh.newDir);
40 rotate.set(rh.rotate);
41 for (
int i = 0; i < 3; i++) {
42 hover[i] = rh.hover[i];
43 selected[i] = rh.selected[i];
50 m.primitive(Mesh::LINE_STRIP);
53 for (
int i = 0; i < 3; i++) {
55 addCircle(m, size, 30);
58 g.color(i == 0, i == 1, i == 2);
72 addCircle(m, size - dr,
80 for (
int i = 0; i < 3; i++) {
83 m.primitive(Mesh::LINES);
88 g.color(i == 0, i == 1, i == 2);
96 double t = r.intersectSphere(pose.
get().
pos(), size);
98 return Hit(
true, r, t,
this);
100 return Hit(
false, r, t,
this);
106 if (h.ray.intersectsSphere(pose.
get().
pos(), size)) {
110 for (
int i = 0; i < 3; i++) {
112 t = h.ray.intersectCircle(pose.
get().
pos(),
113 Vec3f(i == 0, i == 1, i == 2), size,
115 if (t > 0 && t <
min) {
121 hover[minIdx] =
true;
125 for (
int i = 0; i < 3; i++) hover[i] =
false;
130 if (h.ray.intersectsSphere(pose.
get().
pos(), size)) {
134 for (
int i = 0; i < 3; i++) {
136 t = h.ray.intersectCircle(pose.
get().
pos(),
137 Vec3f(i == 0, i == 1, i == 2), size,
139 if (t > 0 && t <
min) {
145 selected[minIdx] =
true;
149 parent->prevPose.
set(parent->pose.
get());
158 for (
int i = 0; i < 3; i++) {
160 float t = h.ray.intersectPlane(pose.
get().
pos(),
161 Vec3f(i == 0, i == 1, i == 2));
170 parent->pose.setQuat(parent->pose.
get().
quat() * rotate);
172 parent->pose.setPos(parent->pose.
get().
pos() + p1 - p2);
182 for (
int i = 0; i < 3; i++) selected[i] =
false;
Interface for loading fonts and rendering text.
Stores buffers related to rendering graphical objects.
void vertex(float x, float y, float z=0)
Append vertex to vertex buffer.
Mesh & reset()
Reset all buffers.
virtual ParameterType get()
get the parameter's value
Vec3d & pos()
Get "position" vector.
Quatd & quat()
Get quaternion component (represents orientation)
Pose & set(Pose &src)
Copy all attributes from another Pose.
Quat & fromEuler(const Vec< 3, T > &aeb)
Set as versor rotated by YXZ Euler angles, in radians.
static Quat getRotationTo(const Vec< 3, float > &usrc, const Vec< 3, float > &udst)
static Quat identity()
Returns identity.
void rotate(float angle, float x=0., float y=0., float z=1.)
void translate(float x, float y, float z=0.)
Translate current matrix.
void popMatrix()
Pop current matrix stack.
void pushMatrix()
Push current matrix stack.
Vec & set(const Vec< N, T2 > &v)
Set elements from another vector.
Vec normalized(T scale=T(1)) const
Return closest vector lying on unit sphere.
T min(const T &v1, const T &v2, const T &v3)
Vec3f transformVecWorld(const Vec3f &v, float w=1)
transfrom a vector in local space to world space
Hit intersect(Rayd r) override
intersection test must be implemented
bool onEvent(PickEvent e, Hit h) override
override callback