aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/extantz/extantz.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/extantz/extantz.c')
-rw-r--r--src/extantz/extantz.c1069
1 files changed, 4 insertions, 1065 deletions
diff --git a/src/extantz/extantz.c b/src/extantz/extantz.c
index 7eec6dd..a731e6a 100644
--- a/src/extantz/extantz.c
+++ b/src/extantz/extantz.c
@@ -3,242 +3,6 @@
3 3
4globals ourGlobals; 4globals ourGlobals;
5 5
6Eina_Hash *grids;
7Eina_Hash *viewers;
8
9static char *gridTest[][3] =
10{
11 {"3rd Rock Grid", "http://grid.3rdrockgrid.com:8002/", "http://grid.3rdrockgrid.com/3rg_login"},
12 {"Infinite Grid", "http://grid.infinitegrid.org:8002/", "http://www.infinitegrid.org/loginscreen.php"},
13 {"Second Life Grid", "https://login.agni.lindenlab.com/cgi-bin/login.cgi", "http://secondlife.com/"},
14 {NULL, NULL, NULL}
15};
16
17static char *accountTest[][3] =
18{
19 {"3rd Rock Grid", "onefang rejected", "password"},
20 {"Infinite Grid", "infinite onefang", "MyB1GSecrit"},
21 {"Infinite Grid", "onefang rejected", "MySecrit"},
22 {NULL, NULL, NULL}
23};
24
25
26static char *viewerTest[][3] =
27{
28 {"Imprudence", "1.4.0 beta 3", ""},
29 {"Kokua", "3.4.4.25633", ""},
30 {"meta-impy", "1.4.0 beta 1.5", ""},
31 {"SL", "v3", ""},
32 {NULL, NULL, NULL}
33};
34
35
36static Elm_Genlist_Item_Class *grid_gic = NULL;
37static Elm_Genlist_Item_Class *account_gic = NULL;
38static Elm_Genlist_Item_Class *viewer_gic = NULL;
39
40//static const char *img1 = PACKAGE_DATA_DIR "/media/plant_01.jpg";
41//static const char *img2 = PACKAGE_DATA_DIR "/media/sky_01.jpg";
42static const char *img3 = "rock_01.jpg";
43
44
45#define EPHYSICS_TEST_THEME "extantz"
46
47
48#if DO_GEARS
49//--------------------------------//
50// Gear Stuff.
51
52static GLfloat *vert(GLfloat *p, GLfloat x, GLfloat y, GLfloat z, GLfloat *n)
53{
54 p[0] = x;
55 p[1] = y;
56 p[2] = z;
57 p[3] = n[0];
58 p[4] = n[1];
59 p[5] = n[2];
60
61 return p + 6;
62}
63
64/* Draw a gear wheel. You'll probably want to call this function when
65 * building a display list since we do a lot of trig here.
66 *
67 * Input: inner_radius - radius of hole at center
68 * outer_radius - radius at center of teeth
69 * width - width of gear
70 * teeth - number of teeth
71 * tooth_depth - depth of tooth
72 */
73static Gear *make_gear(GLData *gld, GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth)
74{
75 GLint i;
76 GLfloat r0, r1, r2;
77 GLfloat da;
78 GLfloat *v;
79 Gear *gear;
80 double s[5], c[5];
81 GLfloat normal[3];
82 const int tris_per_tooth = 20;
83 Evas_GL_API *gl = gld->glApi;
84
85 gear = (Gear*)malloc(sizeof(Gear));
86 if (gear == NULL)
87 return NULL;
88
89 r0 = inner_radius;
90 r1 = outer_radius - tooth_depth / 2.0;
91 r2 = outer_radius + tooth_depth / 2.0;
92
93 da = 2.0 * M_PI / teeth / 4.0;
94
95 gear->vertices = calloc(teeth * tris_per_tooth * 3 * 6, sizeof *gear->vertices);
96 s[4] = 0;
97 c[4] = 1;
98 v = gear->vertices;
99 for (i = 0; i < teeth; i++)
100 {
101 s[0] = s[4];
102 c[0] = c[4];
103 s[1] = sin(i * 2.0 * M_PI / teeth + da);
104 c[1] = cos(i * 2.0 * M_PI / teeth + da);
105 s[2] = sin(i * 2.0 * M_PI / teeth + da * 2);
106 c[2] = cos(i * 2.0 * M_PI / teeth + da * 2);
107 s[3] = sin(i * 2.0 * M_PI / teeth + da * 3);
108 c[3] = cos(i * 2.0 * M_PI / teeth + da * 3);
109 s[4] = sin(i * 2.0 * M_PI / teeth + da * 4);
110 c[4] = cos(i * 2.0 * M_PI / teeth + da * 4);
111
112 normal[0] = 0.0;
113 normal[1] = 0.0;
114 normal[2] = 1.0;
115
116 v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal);
117
118 v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal);
119 v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal);
120 v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal);
121 v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal);
122 v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal);
123 v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal);
124 v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal);
125
126 v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal);
127 v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal);
128 v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal);
129 v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal);
130
131 normal[0] = 0.0;
132 normal[1] = 0.0;
133 normal[2] = -1.0;
134
135 v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal);
136
137 v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal);
138 v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal);
139 v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal);
140 v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal);
141 v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal);
142 v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal);
143 v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal);
144
145 v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal);
146
147 v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal);
148 v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal);
149 v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal);
150 v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal);
151 v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal);
152 v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal);
153 v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal);
154 v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal);
155 v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal);
156 v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal);
157
158 v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal);
159 }
160
161 gear->count = (v - gear->vertices) / 6;
162
163 gl->glGenBuffers(1, &gear->vbo);
164 gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo);
165 gl->glBufferData(GL_ARRAY_BUFFER, gear->count * 6 * 4, gear->vertices, GL_STATIC_DRAW);
166
167
168 return gear;
169}
170
171static void free_gear(Gear *gear)
172{
173 free(gear->vertices);
174 free(gear);
175 gear = NULL;
176}
177
178static void multiply(GLfloat *m, const GLfloat *n)
179{
180 GLfloat tmp[16];
181 const GLfloat *row, *column;
182 div_t d;
183 int i, j;
184
185 for (i = 0; i < 16; i++)
186 {
187 tmp[i] = 0;
188 d = div(i, 4);
189 row = n + d.quot * 4;
190 column = m + d.rem;
191 for (j = 0; j < 4; j++)
192 tmp[i] += row[j] * column[j * 4];
193 }
194 memcpy(m, &tmp, sizeof tmp);
195}
196
197static void rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
198{
199 double s, c;
200
201 s = sin(angle);
202 c = cos(angle);
203 GLfloat r[16] =
204 {
205 x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0,
206 x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0,
207 x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0,
208 0, 0, 0, 1
209 };
210
211 multiply(m, r);
212}
213
214static void translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z)
215{
216 GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 };
217
218 multiply(m, t);
219}
220
221static void draw_gear(GLData *gld, Gear *gear, GLfloat *m, GLfloat x, GLfloat y, GLfloat angle, const GLfloat *color)
222{
223 Evas_GL_API *gl = gld->glApi;
224 GLfloat tmp[16];
225
226 memcpy(tmp, m, sizeof tmp);
227 translate(tmp, x, y, 0);
228 rotate(tmp, 2 * M_PI * angle / 360.0, 0, 0, 1);
229 gl->glUniformMatrix4fv(gld->proj_location, 1, GL_FALSE, tmp);
230 gl->glUniform3fv(gld->light_location, 1, gld->light);
231 gl->glUniform4fv(gld->color_location, 1, color);
232
233 gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo);
234
235 gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), NULL);
236 gl->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLfloat *) 0 + 3);
237 gl->glEnableVertexAttribArray(0);
238 gl->glEnableVertexAttribArray(1);
239 gl->glDrawArrays(GL_TRIANGLE_STRIP, 0, gear->count);
240}
241#endif
242 6
243 7
244static void gldata_init(GLData *gld) 8static void gldata_init(GLData *gld)
@@ -259,318 +23,6 @@ static void gldata_init(GLData *gld)
259//-------------------------// 23//-------------------------//
260 24
261 25
262#if DO_GEARS
263static const char vertex_shader[] =
264 "uniform mat4 proj;\n"
265 "attribute vec4 position;\n"
266 "attribute vec4 normal;\n"
267 "varying vec3 rotated_normal;\n"
268 "varying vec3 rotated_position;\n"
269 "vec4 tmp;\n"
270 "void main()\n"
271 "{\n"
272 " gl_Position = proj * position;\n"
273 " rotated_position = gl_Position.xyz;\n"
274 " tmp = proj * normal;\n"
275 " rotated_normal = tmp.xyz;\n"
276 "}\n";
277
278 static const char fragment_shader[] =
279 "#ifdef GL_ES\n"
280 "precision mediump float;\n"
281 "#endif\n"
282 "uniform vec4 color;\n"
283 "uniform vec3 light;\n"
284 "varying vec3 rotated_normal;\n"
285 "varying vec3 rotated_position;\n"
286 "vec3 light_direction;\n"
287 "vec4 white = vec4(0.5, 0.5, 0.5, 1.0);\n"
288 "void main()\n"
289 "{\n"
290 " light_direction = normalize(light - rotated_position);\n"
291 " gl_FragColor = color + white * dot(light_direction, rotated_normal);\n"
292 "}\n";
293
294static GLuint load_shader(GLData *gld, GLenum type, const char *shader_src)
295{
296 Evas_GL_API *gl = gld->glApi;
297 GLuint shader;
298 GLint compiled = 0;
299
300 // Create the shader object
301 if (!(shader = gl->glCreateShader(type))) return 0;
302 gl->glShaderSource(shader, 1, &shader_src, NULL);
303 // Compile the shader
304 gl->glCompileShader(shader);
305 gl->glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
306
307 if (!compiled)
308 {
309 GLint len = 0;
310
311 gl->glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
312 if (len > 1)
313 {
314 char *info = malloc(sizeof(char) * len);
315
316 if (info)
317 {
318 gl->glGetShaderInfoLog(shader, len, NULL, info);
319 printf("Error compiling shader:\n"
320 "%s\n", info);
321 free(info);
322 }
323 }
324 gl->glDeleteShader(shader);
325 return 0;
326 }
327 return shader;
328}
329
330static void gears_init(GLData *gld)
331{
332 Evas_GL_API *gl = gld->glApi;
333 GLint linked = 0;
334
335// char msg[512];
336
337 gl->glEnable(GL_CULL_FACE);
338 gl->glEnable(GL_DEPTH_TEST);
339 gl->glEnable(GL_BLEND);
340
341 // Load the vertex/fragment shaders
342 gld->vtx_shader = load_shader(gld, GL_VERTEX_SHADER, vertex_shader);
343 gld->fgmt_shader = load_shader(gld, GL_FRAGMENT_SHADER, fragment_shader);
344
345 // Create the program object
346 if (!(gld->program = gl->glCreateProgram()))
347 return;
348
349 gl->glAttachShader(gld->program, gld->vtx_shader);
350 gl->glAttachShader(gld->program, gld->fgmt_shader);
351
352 // Bind shader attributes.
353 gl->glBindAttribLocation(gld->program, 0, "position");
354 gl->glBindAttribLocation(gld->program, 1, "normal");
355
356 // Link the program
357 gl->glLinkProgram(gld->program);
358 gld->glApi->glGetProgramiv(gld->program, GL_LINK_STATUS, &linked);
359
360 if (!linked)
361 {
362 GLint len = 0;
363
364 gld->glApi->glGetProgramiv(gld->program, GL_INFO_LOG_LENGTH, &len);
365 if (len > 1)
366 {
367 char *info = malloc(sizeof(char) * len);
368
369 if (info)
370 {
371 gld->glApi->glGetProgramInfoLog(gld->program, len, NULL, info);
372 printf("Error linking program:\n%s\n", info);
373 free(info);
374 }
375 }
376 gld->glApi->glDeleteProgram(gld->program);
377 }
378
379 gl->glUseProgram(gld->program);
380 gld->proj_location = gl->glGetUniformLocation(gld->program, "proj");
381 gld->light_location = gl->glGetUniformLocation(gld->program, "light");
382 gld->color_location = gl->glGetUniformLocation(gld->program, "color");
383
384 /* make the gears */
385 gld->gear1 = make_gear(gld, 1.0, 4.0, 1.0, 20, 0.7);
386 gld->gear2 = make_gear(gld, 0.5, 2.0, 2.0, 10, 0.7);
387 gld->gear3 = make_gear(gld, 1.3, 2.0, 0.5, 10, 0.7);
388
389 gld->gearsInited = EINA_TRUE;
390}
391#endif
392
393static void _on_camera_input_down(void *data, Evas *evas, Evas_Object *obj, void *event_info)
394{
395 GLData *gld = data;
396 Evas_Event_Key_Down *ev = event_info;
397
398 if (gld->move)
399 {
400 // TODO - Careful, gld->move MIGHT be read at the other end by another thread. MIGHT, coz I really don't know at what point the camera animate routine is actually called.
401
402 // Yes, we are dealing with the horrid Evas keyboard handling FUCKING STRING COMPARES! Soooo ...
403 // TODO - make this a hash lookup dammit.
404 if (0 == strcmp(ev->key, "Escape"))
405 {
406 }
407 else if (0 == strcmp(ev->key, "Left"))
408 gld->move->r = 2.0;
409 else if (0 == strcmp(ev->key, "Right"))
410 gld->move->r = -2.0;
411 else if (0 == strcmp(ev->key, "Up"))
412 gld->move->x = 2.0;
413 else if (0 == strcmp(ev->key, "Down"))
414 gld->move->x = -2.0;
415// else if (0 == strcmp(ev->key, "Prior"))
416// ;
417// else if (0 == strcmp(ev->key, "Next"))
418// ;
419// else if (0 == strcmp(ev->key, "Home"))
420// ;
421// else if (0 == strcmp(ev->key, "End"))
422// ;
423 else if (0 == strcmp(ev->key, "space"))
424 gld->move->jump = 1.0;
425 else
426 printf("Unexpected down keystroke - %s\n", ev->key);
427 }
428 else
429 printf("Camera input not ready\n");
430}
431
432/* SL / OS camera controls
433 up / down / w / s moves avatar forward / backward
434 shifted version does the same
435 double tap triggers run mode / or fast fly mode
436 Running backwards turns your avatar to suit, walking does not.
437 left / right / a / d rotates avatar left / right, strafes in mouselook
438 shifted version turns the avatar to walk sideways, so not really a strafe.
439 So not sure if the "strafe" in mouse look turns the avatar as well?
440 PgDn / c crouch while it is held down move up in flight mode
441 PgUp jump move down in flight mode
442 Home toggle flying
443 End Nothing?
444 Esc return to third person view
445 m toggle mouse look
446 mouse wheel move view closer / further away from current focused object or avatar
447 Alt left click focus on some other object
448 Ins ???
449 Del ???
450 BS ???
451 Tab ???
452
453 Mouse look is just first person view, moving mouse looks left / right / up / down.
454 Not sure if the avatar rotates with left / right, but that's likely.
455
456 mouse moves With the left mouse button held down -
457 left / right up / down
458 ---------------------------------
459 for avatar swings avatar around zoom in and out of avatar
460 for object nothing
461 alt orbit left / right zoom in and out
462 alt ctrl orbit left / right orbit up / down
463 alt shift orbit left / right zoom in and out
464 alt ctrl shift shift view left / right / up / down
465 ctrl Nothing?
466 shift Nothing?
467 ctrl shift Nothing?
468
469 Need to also consider when looking at a moving object / avatar.
470
471 I think there are other letter keys that duplicate arrow keys and such. I'll look for them later, but I don't use them.
472 No idea what the function keys are mapped to, but think it's various non camera stuff.
473 I'm damn well leaving the Win/Command and Menu keys for the OS / window manager. lol
474 Keypad keys? Not interested, I don't have them.
475 Print Screen / SysRq, Pause / Break, other oddball keys, also not interested.
476 NOTE - gonna have an easily programmable "bind key to command" thingy, like E17s, so that can deal with other keys.
477 Should even let them be saveable so people can swap them with other people easily.
478
479 TODO - implement things like space mouse, sixaxis, phone as controller, joysticks, data gloves, etc.
480*/
481
482/* A moveRotate array of floats.
483 * X, Y, Z, and whatever the usual letters are for rotations. lol
484 * Each one means "move or rotate this much in this direction".
485 * Where 1.0 means "what ever the standard move is if that key is held down".
486 * So a keyboard move would just change it's part to 1.0 or -1.0 on key down,
487 * and back to 0.0 on key up. Or 2.0 / -2.0 if in run mode.
488 * Which would even work in fly mode.
489 * A joystick could be set to range over -2.0 to 2.0, and just set it's part directly.
490 * A mouse look rotate, well will come to that when we need to. B-)
491 * Setting the x or y to be the DIFFERENCE in window position of the mouse (-1.0 to 1.0) since the last frame.
492 *
493 * TODO - In the Elm_glview version, 2.0 seems to be correct speed for walking, but I thought 1.0 was in Evas_GL.
494 */
495
496static void _on_camera_input_up(void *data, Evas *evas, Evas_Object *obj, void *event_info)
497{
498 GLData *gld = data;
499 Evas_Event_Key_Up *ev = event_info;
500
501 if (gld->move)
502 {
503 // TODO - Careful, gld->move MIGHT be read at the other end by another thread. MIGHT, coz I really don't know at what point the camera animate routine is actually called.
504
505 // Yes, we are dealing with the horrid Evas keyboard handling FUCKING STRING COMPARES! Soooo ...
506 // TODO - make this a hash lookup dammit.
507 if (0 == strcmp(ev->key, "Escape"))
508 {
509 }
510 else if (0 == strcmp(ev->key, "Left"))
511 gld->move->r = 0.0;
512 else if (0 == strcmp(ev->key, "Right"))
513 gld->move->r = 0.0;
514 else if (0 == strcmp(ev->key, "Up"))
515 gld->move->x = 0.0;
516 else if (0 == strcmp(ev->key, "Down"))
517 gld->move->x = 0.0;
518// else if (0 == strcmp(ev->key, "Prior"))
519// ;
520// else if (0 == strcmp(ev->key, "Next"))
521// ;
522// else if (0 == strcmp(ev->key, "Home"))
523// ;
524// else if (0 == strcmp(ev->key, "End"))
525// ;
526 else if (0 == strcmp(ev->key, "space"))
527 gld->move->jump = 0.0;
528 else
529 printf("Unexpected up keystroke - %s\n", ev->key);
530 }
531 else
532 printf("Camera input not ready\n");
533}
534
535// Elm style event callback.
536static Eina_Bool _cb_event_GL(void *data, Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info)
537{
538 GLData *gld = data;
539 Eina_Bool processed = EINA_FALSE;
540
541 switch (type)
542 {
543 case EVAS_CALLBACK_KEY_DOWN :
544 {
545 _on_camera_input_down(gld, evas_object_evas_get(obj), obj, event_info);
546 processed = EINA_TRUE;
547 break;
548 }
549
550 case EVAS_CALLBACK_KEY_UP :
551 {
552 _on_camera_input_up(gld, evas_object_evas_get(obj), obj, event_info);
553 processed = EINA_TRUE;
554 break;
555 }
556
557 default :
558 printf("Unknown GL input event.\n");
559 }
560
561 return processed;
562}
563
564// Elm inlined image windows needs this to change focus on mouse click.
565// Evas style event callback.
566static void _cb_mouse_down_elm(void *data, Evas *evas, Evas_Object *obj, void *event_info)
567{
568// GLData *gld = data;
569 Evas_Event_Mouse_Down *ev = event_info;
570
571 if (1 == ev->button)
572 elm_object_focus_set(obj, EINA_TRUE);
573}
574 26
575static void _resize_winwin(GLData *gld) 27static void _resize_winwin(GLData *gld)
576{ 28{
@@ -673,29 +125,7 @@ static void on_pixels(void *data, Evas_Object *obj)
673 125
674#if DO_GEARS 126#if DO_GEARS
675 if (gld->useEGL) 127 if (gld->useEGL)
676 { 128 drawGears(gld);
677 static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };
678 static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };
679 static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };
680 GLfloat m[16];
681
682 // Draw the gears.
683 if (!gld->useIrr)
684 {
685 gl->glClearColor(0.7, 0.0, 1.0, 1.0);
686 gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
687 }
688
689 memcpy(m, gld->proj, sizeof m);
690 rotate(m, 2 * M_PI * gld->view_rotx / 360.0, 1, 0, 0);
691 rotate(m, 2 * M_PI * gld->view_roty / 360.0, 0, 1, 0);
692 rotate(m, 2 * M_PI * gld->view_rotz / 360.0, 0, 0, 1);
693
694 draw_gear(gld, gld->gear1, m, -3.0, -2.0, gld->angle, red);
695 draw_gear(gld, gld->gear2, m, 3.1, -2.0, -2 * gld->angle - 9.0, green);
696 draw_gear(gld, gld->gear3, m, -3.1, 4.2, -2 * gld->angle - 25.0, blue);
697 gld->angle += 2.0;
698 }
699#endif 129#endif
700 130
701 drawIrr_end(gld); 131 drawIrr_end(gld);
@@ -927,180 +357,6 @@ static void init_evas_gl(GLData *gld)
927//-------------------------// 357//-------------------------//
928 358
929 359
930static Evas_Object *_content_image_new(Evas_Object *parent, const char *img)
931{
932 Evas_Object *ic;
933
934 ic = elm_icon_add(parent);
935 elm_image_file_set(ic, img, NULL);
936 return ic;
937}
938
939static void _promote(void *data, Evas_Object *obj , void *event_info )
940{
941 elm_naviframe_item_promote(data);
942}
943
944static char *_grid_label_get(void *data, Evas_Object *obj, const char *part)
945{
946 ezGrid *thisGrid = data;
947 char buf[256];
948
949 if (!strcmp(part, "elm.text"))
950 {
951 int count = eina_clist_count(&(thisGrid->accounts));
952
953 if (0 == count)
954 snprintf(buf, sizeof(buf), "%s (no accounts)", thisGrid->name);
955 else if (1 == count)
956 snprintf(buf, sizeof(buf), "%s (%d account)", thisGrid->name, count);
957 else
958 snprintf(buf, sizeof(buf), "%s (%d accounts)", thisGrid->name, count);
959 }
960 else
961 snprintf(buf, sizeof(buf), "%s", thisGrid->loginURI);
962 return strdup(buf);
963}
964
965static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, const char *part)
966{
967 ezGrid *thisGrid = data;
968 Evas_Object *ic = elm_icon_add(obj);
969
970 if (!strcmp(part, "elm.swallow.icon"))
971 elm_icon_standard_set(ic, thisGrid->icon);
972
973 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
974 return ic;
975}
976
977static char * _account_label_get(void *data, Evas_Object *obj, const char *part)
978{
979 ezAccount *thisAccount = data;
980 char buf[256];
981
982 buf[0] = '\0';
983 if (!strcmp(part, "elm.text"))
984 snprintf(buf, sizeof(buf), "%s", thisAccount->name);
985
986 return strdup(buf);
987}
988
989static Evas_Object *_account_content_get(void *data, Evas_Object *obj, const char *part)
990{
991 ezAccount *thisAccount = data;
992 Evas_Object *ic = elm_icon_add(obj);
993
994 if (!strcmp(part, "elm.swallow.icon"))
995 elm_icon_standard_set(ic, thisAccount->icon);
996
997 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
998 return ic;
999}
1000
1001static char *_viewer_label_get(void *data, Evas_Object *obj, const char *part)
1002{
1003 ezViewer *thisViewer = data;
1004 char buf[256];
1005
1006 if (!strcmp(part, "elm.text"))
1007 snprintf(buf, sizeof(buf), "%s", thisViewer->name);
1008 else
1009 snprintf(buf, sizeof(buf), "%s", thisViewer->version);
1010 return strdup(buf);
1011}
1012
1013static Evas_Object *_viewer_content_get(void *data, Evas_Object *obj, const char *part)
1014{
1015 ezViewer *thisViewer = data;
1016 Evas_Object *ic = elm_icon_add(obj);
1017
1018 if (!strcmp(part, "elm.swallow.icon"))
1019 elm_icon_standard_set(ic, thisViewer->icon);
1020
1021 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1022 return ic;
1023}
1024
1025
1026static void _grid_sel_cb(void *data, Evas_Object *obj, void *event_info)
1027{
1028 ezGrid *thisGrid = data;
1029 GLData *gld = thisGrid->gld;
1030 char buf[PATH_MAX];
1031
1032// sprintf(buf, "dillo -f -g '%dx%d+%d+%d' %s &", gld->win_w - (gld->win_w / 5), gld->win_h - 30, gld->win_w / 5, gld->win_y, thisGrid->splashPage);
1033 sprintf(buf, "uzbl -g '%dx%d+%d+%d' -u %s &", gld->win_w - (gld->win_w / 5), gld->win_h - 30, gld->win_w / 5, gld->win_y, thisGrid->splashPage);
1034 printf("%s ### genlist obj [%p], item pointer [%p]\n", buf, obj, event_info);
1035// comment this out for now, busy dealing with input stuff, don't want to trigger this multiple times.
1036// system(buf);
1037}
1038
1039static void cb_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_info)
1040{
1041 Evas_Event_Mouse_Move *ev = event_info;
1042 Evas_Object *orig = data;
1043 Evas_Coord x, y;
1044 Evas_Map *p;
1045 int i, w, h;
1046
1047 if (!ev->buttons) return;
1048 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
1049 evas_object_move(obj,
1050 x + (ev->cur.canvas.x - ev->prev.output.x),
1051 y + (ev->cur.canvas.y - ev->prev.output.y));
1052 evas_object_image_size_get(orig, &w, &h);
1053 p = evas_map_new(4);
1054 evas_object_map_enable_set(orig, EINA_TRUE);
1055// evas_object_raise(orig);
1056 for (i = 0; i < 4; i++)
1057 {
1058 Evas_Object *hand;
1059 char key[32];
1060
1061 snprintf(key, sizeof(key), "h-%i\n", i);
1062 hand = evas_object_data_get(orig, key);
1063 evas_object_raise(hand);
1064 evas_object_geometry_get(hand, &x, &y, NULL, NULL);
1065 x += 15;
1066 y += 15;
1067 evas_map_point_coord_set(p, i, x, y, 0);
1068 if (i == 0) evas_map_point_image_uv_set(p, i, 0, 0);
1069 else if (i == 1) evas_map_point_image_uv_set(p, i, w, 0);
1070 else if (i == 2) evas_map_point_image_uv_set(p, i, w, h);
1071 else if (i == 3) evas_map_point_image_uv_set(p, i, 0, h);
1072 }
1073 evas_object_map_set(orig, p);
1074 evas_map_free(p);
1075}
1076
1077static void create_handles(Evas_Object *obj)
1078{
1079 int i;
1080 Evas_Coord x, y, w, h;
1081
1082 evas_object_geometry_get(obj, &x, &y, &w, &h);
1083 for (i = 0; i < 4; i++)
1084 {
1085 Evas_Object *hand;
1086 char buf[PATH_MAX];
1087 char key[32];
1088
1089 hand = evas_object_image_filled_add(evas_object_evas_get(obj));
1090 evas_object_resize(hand, 31, 31);
1091 snprintf(buf, sizeof(buf), "%s/media/pt.png", elm_app_data_dir_get());
1092 evas_object_image_file_set(hand, buf, NULL);
1093 if (i == 0) evas_object_move(hand, x - 15, y - 15);
1094 else if (i == 1) evas_object_move(hand, x + w - 15, y - 15);
1095 else if (i == 2) evas_object_move(hand, x + w - 15, y + h - 15);
1096 else if (i == 3) evas_object_move(hand, x - 15, y + h - 15);
1097 evas_object_event_callback_add(hand, EVAS_CALLBACK_MOUSE_MOVE, cb_mouse_move, obj);
1098 evas_object_show(hand);
1099 snprintf(key, sizeof(key), "h-%i\n", i);
1100 evas_object_data_set(obj, key, hand);
1101 }
1102}
1103
1104static Evas_Object *_toolbar_menu_add(Evas_Object *win, Evas_Object *tb, char *label) 360static Evas_Object *_toolbar_menu_add(Evas_Object *win, Evas_Object *tb, char *label)
1105{ 361{
1106 Evas_Object *menu= NULL; 362 Evas_Object *menu= NULL;
@@ -1117,283 +373,14 @@ static Evas_Object *_toolbar_menu_add(Evas_Object *win, Evas_Object *tb, char *l
1117 return menu; 373 return menu;
1118} 374}
1119 375
1120static Evas_Object *fang_win_add(GLData *gld)
1121{
1122 Evas_Object *win, *bg;
1123
1124 // In theory this should create an EWS window, in practice, I'm not seeing any difference.
1125 // Guess I'll have to implement my own internal window manager. I don't think a basic one will be that hard. Famous last words.
1126// elm_config_engine_set("ews");
1127 win = elm_win_add(gld->win, "inlined", ELM_WIN_INLINED_IMAGE);
1128 // On mouse down we try to shift focus to the backing image, this seems to be the correct thing to force focus onto it's widgets.
1129 // According to the Elm inlined image window example, this is what's needed to.
1130 evas_object_event_callback_add(elm_win_inlined_image_object_get(win), EVAS_CALLBACK_MOUSE_DOWN, _cb_mouse_down_elm, gld);
1131 elm_win_alpha_set(win, EINA_TRUE);
1132
1133 // Apparently transparent is not good enough for ELM backgrounds, so make it a rectangle.
1134 // Apparently coz ELM prefers stuff to have edjes. A bit over the top if all I want is a transparent rectangle.
1135 bg = evas_object_rectangle_add(evas_object_evas_get(win));
1136 evas_object_color_set(bg, 50, 0, 100, 100);
1137 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1138 elm_win_resize_object_add(win, bg);
1139 evas_object_show(bg);
1140
1141 return win;
1142}
1143
1144static void fang_win_complete(GLData *gld, Evas_Object *win, int x, int y, int w, int h)
1145{
1146 // image object for win is unlinked to its pos/size - so manual control
1147 // this allows also for using map and other things with it.
1148 evas_object_move(elm_win_inlined_image_object_get(win), x, y);
1149 // Odd, it needs to be resized twice. WTF?
1150 evas_object_resize(win, w, h);
1151 evas_object_resize(elm_win_inlined_image_object_get(win), w, h);
1152 evas_object_show(win);
1153 create_handles(elm_win_inlined_image_object_get(win));
1154}
1155
1156static void overlay_add(GLData *gld)
1157{
1158 Evas_Object *bg;
1159//, *bx, *tb, *menu;
1160// Elm_Object_Item *tb_it, *menu_it;
1161
1162 // There many are reasons for this window.
1163 // The first is to cover the GL and provide something to click on to change focus.
1164 // The second is to provide something to click on for all the GL type clicking stuff that needs to be done. In other words, no click through,we catch the clicks here.
1165 // So we can probably avoid the following issue -
1166 // How to do click through? evas_object_pass_events_set(rectangle, EINA_TRUE), and maybe need to do that to the underlaying window to?
1167 // Though if the rectangle is entirely transparent, or even hidden, events might pass through anyway.
1168 // Gotta have click through on the parts where there's no other window.
1169 // The third is to have the other windows live here.
1170 // This idea doesn't work, as it breaks the damn focus again.
1171 // Don't think it's needed anyway.
1172 // While on the subject of layers, need a HUD layer of some sort, but Irrlicht might support that itself.
1173
1174 gld->winwin = elm_win_add(gld->win, "inlined", ELM_WIN_INLINED_IMAGE);
1175 // On mouse down we try to shift focus to the backing image, this seems to be the correct thing to force focus onto it's widgets.
1176 // According to the Elm inlined image window example, this is what's needed to.
1177 evas_object_event_callback_add(elm_win_inlined_image_object_get(gld->winwin), EVAS_CALLBACK_MOUSE_DOWN, _cb_mouse_down_elm, gld);
1178 // In this code, we are making our own camera, so grab it's input when we are focused.
1179 evas_object_event_callback_add(gld->winwin, EVAS_CALLBACK_KEY_DOWN, _on_camera_input_down, gld);
1180 evas_object_event_callback_add(gld->winwin, EVAS_CALLBACK_KEY_UP, _on_camera_input_up, gld);
1181 elm_object_event_callback_add(gld->winwin, _cb_event_GL, gld);
1182
1183 elm_win_alpha_set(gld->winwin, EINA_TRUE);
1184 // Apparently transparent is not good enough for ELM backgrounds, so make it a rectangle.
1185 // Apparently coz ELM prefers stuff to have edjes. A bit over the top if all I want is a transparent rectangle.
1186 bg = evas_object_rectangle_add(evas_object_evas_get(gld->winwin));
1187 evas_object_color_set(bg, 0, 0, 0, 0);
1188 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1189 elm_win_resize_object_add(gld->winwin, bg);
1190 evas_object_show(bg);
1191
1192 // image object for win is unlinked to its pos/size - so manual control
1193 // this allows also for using map and other things with it.
1194 evas_object_move(elm_win_inlined_image_object_get(gld->winwin), 0, 0);
1195 // Odd, it needs to be resized twice. WTF?
1196 evas_object_resize(gld->winwin, gld->win_w, gld->win_h);
1197 evas_object_resize(elm_win_inlined_image_object_get(gld->winwin), gld->win_w, gld->win_h);
1198 evas_object_show(gld->winwin);
1199}
1200
1201static void chat_add(GLData *gld)
1202{
1203 Evas_Object *win, *bx, *en;
1204
1205 win = fang_win_add(gld);
1206
1207 bx = elm_box_add(win);
1208 elm_win_resize_object_add(win, bx);
1209 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1210 evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
1211
1212 en = elm_entry_add(win);
1213 elm_entry_scrollable_set(en, EINA_TRUE);
1214 evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1215 evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
1216 elm_object_text_set(en, "History is shown here");
1217 elm_entry_editable_set(en, EINA_FALSE);
1218 evas_object_show(en);
1219 elm_box_pack_end(bx, en);
1220
1221 en = elm_entry_add(win);
1222 elm_entry_scrollable_set(en, EINA_TRUE);
1223 evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1224 evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
1225 elm_object_text_set(en, "");
1226 elm_entry_editable_set(en, EINA_TRUE);
1227 evas_object_show(en);
1228 elm_box_pack_end(bx, en);
1229
1230 evas_object_show(bx);
1231
1232 fang_win_complete(gld, win, 30, 500, gld->win_w / 3, gld->win_h / 3);
1233}
1234
1235
1236static void woMan_add(GLData *gld)
1237{
1238// Evas_Object *win, *bg, *bx, *ic, *bb, *av, *en, *bt, *nf, *tab, *tb, *gridList, *viewerList, *menu;
1239 Evas_Object *win, *bx, *bt, *nf, *tab, *tb, *gridList, *viewerList, *menu;
1240 Elm_Object_Item *tb_it, *menu_it, *tab_it;
1241 char buf[PATH_MAX];
1242 int i;
1243
1244 win = fang_win_add(gld);
1245
1246 bx = elm_box_add(win);
1247 elm_win_resize_object_add(win, bx);
1248 evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1249 evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
1250
1251 // A tab thingy.
1252 tb = elm_toolbar_add(win);
1253 evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, 0.0);
1254 evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
1255 elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_SCROLL);
1256
1257 // Menu.
1258 tb_it = elm_toolbar_item_append(tb, NULL, "Menu", NULL, NULL);
1259 elm_toolbar_item_menu_set(tb_it, EINA_TRUE);
1260 // Priority is for when toolbar items are set to hide or menu when there are too many of them. They get hidden or put on the menu based on priority.
1261 elm_toolbar_item_priority_set(tb_it, 9999);
1262 elm_toolbar_menu_parent_set(tb, win);
1263 menu = elm_toolbar_item_menu_get(tb_it);
1264
1265 menu_it = elm_menu_item_add(menu, NULL, NULL, "edit", NULL, NULL);
1266 elm_menu_item_add(menu, menu_it, NULL, "preferences", NULL, NULL);
1267 menu_it = elm_menu_item_add(menu, NULL, NULL, "help", NULL, NULL);
1268 elm_menu_item_add(menu, menu_it, NULL, "about woMan", NULL, NULL);
1269 elm_menu_item_separator_add(menu, NULL);
1270 menu_it = elm_menu_item_add(menu, NULL, NULL, "advanced", NULL, NULL);
1271 elm_menu_item_add(menu, menu_it, NULL, "debug settings", NULL, NULL);
1272
1273 // The toolbar needs to be packed into the box AFTER the menus are added.
1274 elm_box_pack_end(bx, tb);
1275 evas_object_show(tb);
1276
1277 gridList = elm_genlist_add(win);
1278 grids = eina_hash_stringshared_new(free);
1279
1280 grid_gic = elm_genlist_item_class_new();
1281 grid_gic->item_style = "double_label";
1282 grid_gic->func.text_get = _grid_label_get;
1283 grid_gic->func.content_get = _grid_content_get;
1284 grid_gic->func.state_get = NULL;
1285 grid_gic->func.del = NULL;
1286 for (i = 0; NULL != gridTest[i][0]; i++)
1287 {
1288 ezGrid *thisGrid = calloc(1, sizeof(ezGrid));
1289
1290 if (thisGrid)
1291 {
1292 eina_clist_init(&(thisGrid->accounts));
1293 eina_clist_init(&(thisGrid->landmarks));
1294 thisGrid->name = gridTest[i][0];
1295 thisGrid->loginURI = gridTest[i][1];
1296 thisGrid->splashPage = gridTest[i][2];
1297 thisGrid->icon = "folder";
1298 thisGrid->gld = gld;
1299 thisGrid->item = elm_genlist_item_append(gridList, grid_gic, thisGrid, NULL, ELM_GENLIST_ITEM_TREE, _grid_sel_cb, thisGrid);
1300 eina_hash_add(grids, thisGrid->name, thisGrid);
1301 }
1302 }
1303
1304 account_gic = elm_genlist_item_class_new();
1305 account_gic->item_style = "default";
1306 account_gic->func.text_get = _account_label_get;
1307 account_gic->func.content_get = _account_content_get;
1308 account_gic->func.state_get = NULL;
1309 account_gic->func.del = NULL;
1310 for (i = 0; NULL != accountTest[i][0]; i++)
1311 {
1312 ezAccount *thisAccount = calloc(1, sizeof(ezAccount));
1313 ezGrid *grid = eina_hash_find(grids, accountTest[i][0]);
1314
1315 if (thisAccount && grid)
1316 {
1317 thisAccount->name = accountTest[i][1];
1318 thisAccount->password = accountTest[i][2];
1319 thisAccount->icon = "file";
1320 elm_genlist_item_append(gridList, account_gic, thisAccount, grid->item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1321 eina_clist_add_tail(&(grid->accounts), &(thisAccount->grid));
1322 }
1323 }
1324
1325 // Viewers stuff
1326 viewerList = elm_genlist_add(win);
1327 viewer_gic = elm_genlist_item_class_new();
1328 viewer_gic->item_style = "double_label";
1329 viewer_gic->func.text_get = _viewer_label_get;
1330 viewer_gic->func.content_get = _viewer_content_get;
1331 viewer_gic->func.state_get = NULL;
1332 viewer_gic->func.del = NULL;
1333 for (i = 0; NULL != viewerTest[i][0]; i++)
1334 {
1335 ezViewer *thisViewer = calloc(1, sizeof(ezViewer));
1336
1337 if (thisViewer)
1338 {
1339 thisViewer->name = viewerTest[i][0];
1340 thisViewer->version = viewerTest[i][1];
1341 thisViewer->path = viewerTest[i][2];
1342 thisViewer->icon = "file";
1343 thisViewer->item = elm_genlist_item_append(viewerList, viewer_gic, thisViewer, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1344 }
1345 }
1346
1347 // Toolbar pages
1348 nf = elm_naviframe_add(win);
1349 evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1350 evas_object_size_hint_align_set(nf, EVAS_HINT_FILL, EVAS_HINT_FILL);
1351 evas_object_show(nf);
1352
1353 sprintf(buf, "%s/%s", elm_app_data_dir_get(), img3);
1354 tab = viewerList; tab_it = elm_naviframe_item_push(nf, NULL, NULL, NULL, tab, NULL); elm_naviframe_item_title_enabled_set(tab_it, EINA_FALSE, EINA_TRUE); elm_toolbar_item_append(tb, NULL, "Viewers", _promote, tab_it);
1355 tab = _content_image_new(win, strdup(buf)); tab_it = elm_naviframe_item_push(nf, NULL, NULL, NULL, tab, NULL); elm_naviframe_item_title_enabled_set(tab_it, EINA_FALSE, EINA_TRUE); elm_toolbar_item_append(tb, NULL, "Landmarks", _promote, tab_it);
1356 tab = gridList; tab_it = elm_naviframe_item_push(nf, NULL, NULL, NULL, tab, NULL); elm_naviframe_item_title_enabled_set(tab_it, EINA_FALSE, EINA_TRUE); elm_toolbar_item_append(tb, NULL, "Grids", _promote, tab_it);
1357 elm_box_pack_end(bx, nf);
1358
1359#if USE_EO
1360 // Not ready for prime time yet, or I'm missing a step. Causes it to hang after closing the window.
1361 // Slightly better now, it bitches instead of hanging.
1362 bt = eo_add(ELM_OBJ_BUTTON_CLASS, win);
1363 elm_object_text_set(bt, "Login"); // No eo interface for this that I can find.
1364 eo_do(bt,
1365// evas_obj_text_set("Login"),
1366 evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL),
1367 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, 0.0),
1368 evas_obj_visibility_set(EINA_TRUE)
1369 );
1370#else
1371 bt = elm_button_add(win);
1372 elm_object_text_set(bt, "Login");
1373 evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
1374 evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
1375 evas_object_show(bt);
1376#endif
1377// evas_object_smart_callback_add(bt, "clicked", NULL, NULL);
1378 elm_box_pack_end(bx, bt);
1379 evas_object_show(bx);
1380
1381 fang_win_complete(gld, win, 30, 30, gld->win_w / 3, gld->win_h / 3);
1382}
1383 376
1384EAPI_MAIN int elm_main(int argc, char **argv) 377EAPI_MAIN int elm_main(int argc, char **argv)
1385{ 378{
1386// Evas_Object *bg, *menu, *bt, *tb;
1387 Evas_Object *obj, *menu, *tb; 379 Evas_Object *obj, *menu, *tb;
1388 Elm_Object_Item *tb_it; 380 Elm_Object_Item *tb_it;
1389//, *menu_it;
1390 EPhysics_Body *boundary;
1391 EPhysics_World *world; 381 EPhysics_World *world;
1392 EPhysics_Body *box_body1, *box_body2;
1393 Evas_Object *box1, *box2;
1394 GLData *gld = NULL; 382 GLData *gld = NULL;
1395 char buf[PATH_MAX]; 383 char buf[PATH_MAX];
1396// int i;
1397// Eina_Bool gotWebKit = elm_need_web(); // Initialise ewebkit if it exists, or return EINA_FALSE if it don't. 384// Eina_Bool gotWebKit = elm_need_web(); // Initialise ewebkit if it exists, or return EINA_FALSE if it don't.
1398 385
1399 HamrTime(elm_main, "extantz"); 386 HamrTime(elm_main, "extantz");
@@ -1433,7 +420,6 @@ EAPI_MAIN int elm_main(int argc, char **argv)
1433 return 1; 420 return 1;
1434#endif 421#endif
1435 422
1436// elm_win_title_set(gld->win, "extantz virtual world manager");
1437 evas_object_smart_callback_add(gld->win, "delete,request", _on_done, gld); 423 evas_object_smart_callback_add(gld->win, "delete,request", _on_done, gld);
1438 424
1439 // Get the screen size. 425 // Get the screen size.
@@ -1467,7 +453,8 @@ EAPI_MAIN int elm_main(int argc, char **argv)
1467 453
1468 overlay_add(gld); 454 overlay_add(gld);
1469 woMan_add(gld); 455 woMan_add(gld);
1470 chat_add(gld); 456 // TODO - This is what causes it to hang after quitting. Fix it.
457// chat_add(gld);
1471 458
1472 // Gotta do this after adding the windows, otherwise the menu renders under the window. 459 // Gotta do this after adding the windows, otherwise the menu renders under the window.
1473 // This sucks, gotta redefine this menu each time we create a new window? 460 // This sucks, gotta redefine this menu each time we create a new window?
@@ -1526,55 +513,7 @@ EAPI_MAIN int elm_main(int argc, char **argv)
1526 513
1527#if USE_PHYSICS 514#if USE_PHYSICS
1528 // ePhysics stuff. 515 // ePhysics stuff.
1529 world = ephysics_world_new(); 516 world = ephysicsAdd(gld);
1530 ephysics_world_render_geometry_set(world, 0, 0, -50, gld->win_w, gld->win_h, 100);
1531
1532 boundary = ephysics_body_bottom_boundary_add(world);
1533 ephysics_body_restitution_set(boundary, 1);
1534 ephysics_body_friction_set(boundary, 0);
1535
1536 boundary = ephysics_body_top_boundary_add(world);
1537 ephysics_body_restitution_set(boundary, 1);
1538 ephysics_body_friction_set(boundary, 0);
1539
1540 boundary = ephysics_body_left_boundary_add(world);
1541 ephysics_body_restitution_set(boundary, 1);
1542 ephysics_body_friction_set(boundary, 0);
1543
1544 boundary = ephysics_body_right_boundary_add(world);
1545 ephysics_body_restitution_set(boundary, 1);
1546 ephysics_body_friction_set(boundary, 0);
1547
1548 box1 = elm_image_add(gld->win);
1549 sprintf(buf, "%s/%s.edj", elm_app_data_dir_get(), EPHYSICS_TEST_THEME);
1550 elm_image_file_set(box1, strdup(buf), "blue-cube");
1551 evas_object_move(box1, gld->win_w / 2 - 80, gld->win_h - 200);
1552 evas_object_resize(box1, 70, 70);
1553 evas_object_show(box1);
1554
1555 box_body1 = ephysics_body_box_add(world);
1556 ephysics_body_evas_object_set(box_body1, box1, EINA_TRUE);
1557 ephysics_body_restitution_set(box_body1, 0.7);
1558 ephysics_body_friction_set(box_body1, 0);
1559 ephysics_body_linear_velocity_set(box_body1, -150, 200, 0);
1560 ephysics_body_angular_velocity_set(box_body1, 0, 0, 36);
1561 ephysics_body_sleeping_threshold_set(box_body1, 0.1, 0.1);
1562
1563 box2 = elm_image_add(gld->win);
1564 elm_image_file_set(box2, strdup(buf), "purple-cube");
1565 evas_object_move(box2, gld->win_w / 2 + 10, gld->win_h - 200);
1566 evas_object_resize(box2, 70, 70);
1567 evas_object_show(box2);
1568
1569 box_body2 = ephysics_body_box_add(world);
1570 ephysics_body_evas_object_set(box_body2, box2, EINA_TRUE);
1571 ephysics_body_restitution_set(box_body2, 0.7);
1572 ephysics_body_friction_set(box_body2, 0);
1573 ephysics_body_linear_velocity_set(box_body2, 80, -60, 0);
1574 ephysics_body_angular_velocity_set(box_body2, 0, 0, 360);
1575 ephysics_body_sleeping_threshold_set(box_body2, 0.1, 0.1);
1576
1577 ephysics_world_gravity_set(world, 0, 0, 0);
1578#endif 517#endif
1579 518
1580 evas_object_move(gld->win, gld->win_x, gld->win_y); 519 evas_object_move(gld->win, gld->win_x, gld->win_y);