gl_spider.h
3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#ifndef STIM_GL_SPIDER_H
#define STIM_GL_SPIDER_H
#include <GL/glut.h>
//#include <GL/glew.h>
#include "gl_texture.h"
#include "../visualization/camera.h"
#include "./error.h"
#include "../math/vector.h"
#include "../math/rect.h"
namespace stim
{
template<typename T>
class gl_spider : public virtual gl_texture<T>
{
//doen't use gl_texture really, just needs the GLuint id.
//doesn't even need the texture iD really.
private:
stim::camera rotator;
stim::vec<float> position; //vector designating the position of the spider.
stim::vec<float> direction; //vector designating the orientation of the spider
//always a unit vector.
stim::vec<float> magnitude; //magnitude of the direction vector.
//mag[0] = length.
//mag[1] = width.
// Also maybe we some texture representation of
// of the spider i.e [WH_pxl, BL_pxl, WH_pxl].
using gl_texture<T>::texID;
void
findOptimalDirection()
{
/* Method for finding the best direction for the spider.
Uses the camera to rotate. Then Calls Evaluate to find new cost.
*/
}
void
findOptimalPosition()
{
/* Method for finding the best direction for the spider.
Not sure if necessary since the next position for the spider
will be at direction * magnitude. */
}
void
findOptimalScale()
{
/* Method for finding the best scale for the spider.
changes the x, y, z size of the spider to minimize the cost
function. */
}
void
Evaluate()
{
/* Uses uniform sampler2D in order to take a difference between
the colors of two textures. 1st texture is the spider template,
the 2nd is the location of the spider's overlap with the
gl_template
does the spider need to track it's location? Prob not since
position can be set with gl_texture coordinates */
}
void
Optimize()
{
/*find the optimum direction and scale */
}
/*
void
Step()
{
// move to the new position
}
*/
public:
stim::rect<float> hor;
stim::rect<float> ver;
gl_spider
()
{
setPosition(0.0,0.0,0.0);
setDirection(1.0,1.0,1.0);
setMagnitude(0.1,0.1);
Update();
}
gl_spider
(vec<float> pos, vec<float> dir, vec<float> mag)
{
position = pos;
direction = dir;
magnitude = mag;
Update();
}
//temporary cost for convenience.
gl_spider
(float pos_x, float pos_y, float pos_z, float dir_x, float dir_y, float dir_z,
float mag_x, float mag_y)
{
setPosition(pos_x, pos_y, pos_z);
setDirection(dir_x, dir_y, dir_z);
setMagnitude(mag_x, mag_y);
Update();
}
void
Update()
{
vec<float> Y(1.0,0.0,0.0);
if(cos(Y.dot(direction))< 0.087){
Y[0] = 0.0; Y[1] = 1.0;}
hor = stim::rect<float>(magnitude, position, direction.norm(),
((Y.cross(direction)).cross(direction)).norm());
ver = stim::rect<float>(magnitude, position, direction.norm(),
hor.n());
}
vec<float>
getPosition()
{
return position;
}
vec<float>
getDirection()
{
return direction;
}
vec<float>
getMagnitude()
{
return magnitude;
}
void
setPosition(vec<float> pos)
{
position = pos;
}
void
setPosition(float x, float y, float z)
{
position[0] = x;
position[1] = y;
position[2] = z;
}
void
setDirection(vec<float> dir)
{
direction = dir;
}
void
setDirection(float x, float y, float z)
{
direction[0] = x;
direction[1] = y;
direction[2] = z;
}
void
setMagnitude(vec<float> mag)
{
magnitude = mag;
}
void
setMagnitude(float x, float y)
{
magnitude[0] = x;
magnitude[1] = y;
}
void
Step()
{
std::cout << position[0] << "," << position[1] << "," << position[1]
<< std::endl;
setPosition(direction*magnitude[1]/2+position);
Update();
std::cout << position[0] << "," << position[1] << "," << position[1]
<< std::endl;
}
};
}
#endif