1 #include "video/video.h"
2 #include <math.h>
3 
4 static float alpha = 0;
5 
6 const static float rec_scale_factor = 0.25f;
7 
8 static float xv[] = { 0.5f, 0.3245f, 0.6f, 0.5f, 0.68f, -0.3f };
9 static float yv[] = { 0.8f, 1.0f, 0.0f, 0.2f, 0.2f, 0.0f };
10 
x(void)11 static float x(void) { return xv[0] * sinf(xv[1] * alpha + xv[2]) - xv[3] * sinf(xv[4] * alpha + xv[5]); }
y(void)12 static float y(void) { return yv[0] * cosf(yv[1] * alpha + yv[2]) - yv[3] * sinf(yv[4] * alpha + yv[5]); }
13 
dx(void)14 static float dx(void) { return xv[1] * xv[0] * cosf(xv[1] * alpha + xv[2]) - xv[4] * xv[3] * cosf(xv[4] * alpha + xv[5]); }
dy(void)15 static float dy(void) { return - yv[1] * yv[0] * sinf(yv[1] * alpha + yv[2]) - yv[4] * yv[3] * sinf(yv[4] * alpha + yv[5]); }
16 
getRecognizerAngle(vec2 * velocity)17 float getRecognizerAngle(vec2 *velocity)
18 {
19   float dxval = velocity->v[0];
20   float dyval = velocity->v[0];
21 
22   float phi = acosf ( dxval / sqrtf( dxval * dxval + dyval * dyval ) );
23   if (dyval < 0) {
24     phi = 2 * PI - phi;
25   }
26   return (phi + PI / 2) * 180 / PI;
27 }
28 
getRecognizerPositionVelocity(vec2 * p,vec2 * v)29 void getRecognizerPositionVelocity(vec2 *p, vec2 *v) {
30   float max = recognizer->BBox.vSize.v[0] * rec_scale_factor;
31   float rec_boundry = game2->rules.grid_size - max;
32   p->v[0] = (max + (x() + 1.0f) * rec_boundry) / 2.0f;
33   p->v[1] = (max + (y() + 1.0f) * rec_boundry) / 2.0f;
34   v->v[0] = dx() * game2->rules.grid_size / 100.f;
35   v->v[1] = dy() * game2->rules.grid_size / 100.f;
36 }
37 
drawRecognizerShadow(void)38 void drawRecognizerShadow(void) {
39   float dirx;
40   vec2 p, v;
41   /* states */
42 
43   glEnable(GL_CULL_FACE);
44   if(gSettingsCache.use_stencil) {
45     glEnable(GL_STENCIL_TEST);
46     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
47     glStencilFunc(GL_GREATER, 1, 1);
48     glEnable(GL_BLEND);
49     glColor4fv(shadow_color);
50     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
51   } else {
52     glColor3f(0, 0, 0);
53     glDisable(GL_BLEND);
54   }
55 
56   /* transformations */
57   getRecognizerPositionVelocity(&p, &v);
58   dirx = getRecognizerAngle(&v);
59 
60   glPushMatrix();
61   glMultMatrixf(shadow_matrix);
62   glTranslatef( p.v[0], p.v[1], RECOGNIZER_HEIGHT);
63   glRotatef(dirx, 0, 0, 1); /* up */
64   glScalef(rec_scale_factor, rec_scale_factor, rec_scale_factor);
65   glEnable(GL_NORMALIZE);
66 
67   /* render */
68 
69   drawModel(recognizer, TRI_MESH);
70 
71   /* restore */
72 
73   if(gSettingsCache.use_stencil)
74     glDisable(GL_STENCIL_TEST);
75 
76   glDisable(GL_BLEND);
77   glDisable(GL_CULL_FACE);
78   glPopMatrix();
79 }
80 
drawRecognizer(void)81 void drawRecognizer(void) {
82   float dirx;
83   vec2 p, v;
84 
85   glPushMatrix();
86 
87   /* transformations */
88   getRecognizerPositionVelocity(&p, &v);
89   dirx = getRecognizerAngle(&v);
90 
91   glTranslatef( p.v[0], p.v[1], RECOGNIZER_HEIGHT);
92   glRotatef(dirx, 0, 0, 1); /* up */
93 
94   glScalef(rec_scale_factor, rec_scale_factor, rec_scale_factor);
95 
96   glDisable(GL_LIGHT0);
97   glDisable(GL_LIGHT1);
98   glLightfv(GL_LIGHT2, GL_SPECULAR, rec_spec_color);
99   glEnable(GL_LIGHT2);
100 
101   glDisable(GL_BLEND);
102 
103   glEnable(GL_CULL_FACE);
104 
105   if (gSettingsCache.light_cycles) {
106     glEnable(GL_LIGHTING);
107   }
108 
109   glEnable(GL_POLYGON_OFFSET_FILL);
110   glPolygonOffset(1,1);
111 
112   glEnable(GL_NORMALIZE);
113   glColor3f(0.0, 0.0, 0.0);
114   drawModel(recognizer, TRI_MESH);
115 
116   glDisable(GL_POLYGON_OFFSET_FILL);
117 
118   glDisable(GL_LIGHT2);
119   glEnable(GL_LIGHT1);
120   glDisable(GL_LIGHTING);
121 
122   glColor3fv(rec_outline_color);
123   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
124   glEnable(GL_BLEND);
125   glEnable(GL_LINE_SMOOTH);
126   drawModel(recognizer_quad, QUAD_MESH);
127   glDisable(GL_LINE_SMOOTH);
128   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
129 
130   glDisable(GL_CULL_FACE);
131 
132   glPopMatrix();
133 }
134 
doRecognizerMovement(void)135 void doRecognizerMovement(void) {
136   alpha += game2->time.dt / 2000.0f;
137 }
138 
resetRecognizer(void)139 void resetRecognizer(void) {
140 	alpha = 0;
141 }
142 
143 
144 
145 
146