diff options
Diffstat (limited to '')
-rw-r--r-- | ClientHamr/extantz/extantz.c | 504 |
1 files changed, 297 insertions, 207 deletions
diff --git a/ClientHamr/extantz/extantz.c b/ClientHamr/extantz/extantz.c index 6eda717..832003a 100644 --- a/ClientHamr/extantz/extantz.c +++ b/ClientHamr/extantz/extantz.c | |||
@@ -1,9 +1,6 @@ | |||
1 | #include "extantz.h" | 1 | #include "extantz.h" |
2 | 2 | ||
3 | 3 | ||
4 | #define DO_GEARS 0 | ||
5 | #define USE_EO 0 | ||
6 | |||
7 | int _log_domain = -1; | 4 | int _log_domain = -1; |
8 | 5 | ||
9 | Eina_Hash *grids; | 6 | Eina_Hash *grids; |
@@ -40,9 +37,6 @@ static Elm_Genlist_Item_Class *grid_gic = NULL; | |||
40 | static Elm_Genlist_Item_Class *account_gic = NULL; | 37 | static Elm_Genlist_Item_Class *account_gic = NULL; |
41 | static Elm_Genlist_Item_Class *viewer_gic = NULL; | 38 | static Elm_Genlist_Item_Class *viewer_gic = NULL; |
42 | 39 | ||
43 | static int x, y, w, h; | ||
44 | |||
45 | |||
46 | static const char *img1 = PACKAGE_DATA_DIR "/images/plant_01.jpg"; | 40 | static const char *img1 = PACKAGE_DATA_DIR "/images/plant_01.jpg"; |
47 | static const char *img2 = PACKAGE_DATA_DIR "/images/sky_01.jpg"; | 41 | static const char *img2 = PACKAGE_DATA_DIR "/images/sky_01.jpg"; |
48 | static const char *img3 = PACKAGE_DATA_DIR "/images/rock_01.jpg"; | 42 | static const char *img3 = PACKAGE_DATA_DIR "/images/rock_01.jpg"; |
@@ -51,8 +45,6 @@ static const char *img3 = PACKAGE_DATA_DIR "/images/rock_01.jpg"; | |||
51 | #define EPHYSICS_TEST_THEME "extantz" | 45 | #define EPHYSICS_TEST_THEME "extantz" |
52 | 46 | ||
53 | 47 | ||
54 | static void free_gear(Gear *gear); | ||
55 | |||
56 | //--------------------------------// | 48 | //--------------------------------// |
57 | // Gear Stuff. | 49 | // Gear Stuff. |
58 | 50 | ||
@@ -87,7 +79,7 @@ static Gear *make_gear(GLData *gld, GLfloat inner_radius, GLfloat outer_radius, | |||
87 | double s[5], c[5]; | 79 | double s[5], c[5]; |
88 | GLfloat normal[3]; | 80 | GLfloat normal[3]; |
89 | const int tris_per_tooth = 20; | 81 | const int tris_per_tooth = 20; |
90 | Evas_GL_API *gl = gld->glapi; | 82 | Evas_GL_API *gl = gld->glApi; |
91 | 83 | ||
92 | gear = (Gear*)malloc(sizeof(Gear)); | 84 | gear = (Gear*)malloc(sizeof(Gear)); |
93 | if (gear == NULL) | 85 | if (gear == NULL) |
@@ -227,7 +219,7 @@ static void translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z) | |||
227 | 219 | ||
228 | static void draw_gear(GLData *gld, Gear *gear, GLfloat *m, GLfloat x, GLfloat y, GLfloat angle, const GLfloat *color) | 220 | static void draw_gear(GLData *gld, Gear *gear, GLfloat *m, GLfloat x, GLfloat y, GLfloat angle, const GLfloat *color) |
229 | { | 221 | { |
230 | Evas_GL_API *gl = gld->glapi; | 222 | Evas_GL_API *gl = gld->glApi; |
231 | GLfloat tmp[16]; | 223 | GLfloat tmp[16]; |
232 | 224 | ||
233 | memcpy(tmp, m, sizeof tmp); | 225 | memcpy(tmp, m, sizeof tmp); |
@@ -296,7 +288,7 @@ static const char vertex_shader[] = | |||
296 | 288 | ||
297 | static GLuint load_shader(GLData *gld, GLenum type, const char *shader_src) | 289 | static GLuint load_shader(GLData *gld, GLenum type, const char *shader_src) |
298 | { | 290 | { |
299 | Evas_GL_API *gl = gld->glapi; | 291 | Evas_GL_API *gl = gld->glApi; |
300 | GLuint shader; | 292 | GLuint shader; |
301 | GLint compiled = 0; | 293 | GLint compiled = 0; |
302 | 294 | ||
@@ -330,6 +322,68 @@ static GLuint load_shader(GLData *gld, GLenum type, const char *shader_src) | |||
330 | return shader; | 322 | return shader; |
331 | } | 323 | } |
332 | 324 | ||
325 | static void gears_init(GLData *gld) | ||
326 | { | ||
327 | Evas_GL_API *gl = gld->glApi; | ||
328 | GLint linked = 0; | ||
329 | |||
330 | char msg[512]; | ||
331 | |||
332 | gl->glEnable(GL_CULL_FACE); | ||
333 | gl->glEnable(GL_DEPTH_TEST); | ||
334 | gl->glEnable(GL_BLEND); | ||
335 | |||
336 | // Load the vertex/fragment shaders | ||
337 | gld->vtx_shader = load_shader(gld, GL_VERTEX_SHADER, vertex_shader); | ||
338 | gld->fgmt_shader = load_shader(gld, GL_FRAGMENT_SHADER, fragment_shader); | ||
339 | |||
340 | // Create the program object | ||
341 | if (!(gld->program = gl->glCreateProgram())) | ||
342 | return; | ||
343 | |||
344 | gl->glAttachShader(gld->program, gld->vtx_shader); | ||
345 | gl->glAttachShader(gld->program, gld->fgmt_shader); | ||
346 | |||
347 | // Bind shader attributes. | ||
348 | gl->glBindAttribLocation(gld->program, 0, "position"); | ||
349 | gl->glBindAttribLocation(gld->program, 1, "normal"); | ||
350 | |||
351 | // Link the program | ||
352 | gl->glLinkProgram(gld->program); | ||
353 | gld->glApi->glGetProgramiv(gld->program, GL_LINK_STATUS, &linked); | ||
354 | |||
355 | if (!linked) | ||
356 | { | ||
357 | GLint len = 0; | ||
358 | |||
359 | gld->glApi->glGetProgramiv(gld->program, GL_INFO_LOG_LENGTH, &len); | ||
360 | if (len > 1) | ||
361 | { | ||
362 | char *info = malloc(sizeof(char) * len); | ||
363 | |||
364 | if (info) | ||
365 | { | ||
366 | gld->glApi->glGetProgramInfoLog(gld->program, len, NULL, info); | ||
367 | printf("Error linking program:\n%s\n", info); | ||
368 | free(info); | ||
369 | } | ||
370 | } | ||
371 | gld->glApi->glDeleteProgram(gld->program); | ||
372 | } | ||
373 | |||
374 | gl->glUseProgram(gld->program); | ||
375 | gld->proj_location = gl->glGetUniformLocation(gld->program, "proj"); | ||
376 | gld->light_location = gl->glGetUniformLocation(gld->program, "light"); | ||
377 | gld->color_location = gl->glGetUniformLocation(gld->program, "color"); | ||
378 | |||
379 | /* make the gears */ | ||
380 | gld->gear1 = make_gear(gld, 1.0, 4.0, 1.0, 20, 0.7); | ||
381 | gld->gear2 = make_gear(gld, 0.5, 2.0, 2.0, 10, 0.7); | ||
382 | gld->gear3 = make_gear(gld, 1.3, 2.0, 0.5, 10, 0.7); | ||
383 | |||
384 | gld->gearsInited = EINA_TRUE; | ||
385 | } | ||
386 | |||
333 | static void _cb_mouse_down_GL(void *data, Evas *evas, Evas_Object *obj, void *event_info) | 387 | static void _cb_mouse_down_GL(void *data, Evas *evas, Evas_Object *obj, void *event_info) |
334 | { | 388 | { |
335 | GLData *gld = data; | 389 | GLData *gld = data; |
@@ -501,9 +555,11 @@ static void _on_camera_input_up(void *data, Evas *evas, Evas_Object *obj, void * | |||
501 | } | 555 | } |
502 | } | 556 | } |
503 | 557 | ||
558 | |||
559 | // Called from on_pixels (), or the Elm_gliew resize callback. | ||
504 | static void _resize(GLData *gld) | 560 | static void _resize(GLData *gld) |
505 | { | 561 | { |
506 | Evas_GL_API *gl = gld->glapi; | 562 | Evas_GL_API *gl = gld->glApi; |
507 | 563 | ||
508 | #if DO_GEARS | 564 | #if DO_GEARS |
509 | GLfloat ar, m[16] = { | 565 | GLfloat ar, m[16] = { |
@@ -524,17 +580,25 @@ static void _resize(GLData *gld) | |||
524 | m[5] = 0.1 * ar / gld->img_h; | 580 | m[5] = 0.1 * ar / gld->img_h; |
525 | memcpy(gld->proj, m, sizeof gld->proj); | 581 | memcpy(gld->proj, m, sizeof gld->proj); |
526 | #endif | 582 | #endif |
527 | // gl->glViewport(0, 0, (GLint) gld->img_w, (GLint) gld->img_h); | 583 | gl->glViewport(0, 0, (GLint) gld->img_w, (GLint) gld->img_h); |
584 | } | ||
585 | |||
586 | static void _resize_gl(Evas_Object *obj) | ||
587 | { | ||
588 | int w, h; | ||
589 | GLData *gld = evas_object_data_get(obj, "gld"); | ||
590 | |||
591 | elm_glview_size_get(obj, &w, &h); | ||
592 | |||
593 | gld->img_w = w; | ||
594 | gld->img_h = h; | ||
595 | _resize(gld); | ||
528 | } | 596 | } |
529 | 597 | ||
530 | static void on_pixels(void *data, Evas_Object *obj) | 598 | static void on_pixels(void *data, Evas_Object *obj) |
531 | { | 599 | { |
532 | static int count = 0; | ||
533 | GLData *gld = data; | 600 | GLData *gld = data; |
534 | if (!gld) | 601 | Evas_GL_API *gl = gld->glApi; |
535 | return; | ||
536 | |||
537 | Evas_GL_API *gl = gld->glapi; | ||
538 | 602 | ||
539 | // get the image size in case it changed with evas_object_image_size_set() | 603 | // get the image size in case it changed with evas_object_image_size_set() |
540 | if (gld->r1) | 604 | if (gld->r1) |
@@ -542,15 +606,18 @@ static void on_pixels(void *data, Evas_Object *obj) | |||
542 | Evas_Coord w, h; | 606 | Evas_Coord w, h; |
543 | 607 | ||
544 | // Poor mans resize check. coz Elm wont do it easily. | 608 | // Poor mans resize check. coz Elm wont do it easily. |
545 | evas_object_geometry_get(gld->r1, NULL, NULL, &w, &h); | 609 | evas_object_image_size_get(gld->r1, &w, &h); |
546 | if ((gld->img_w != w) || (gld->img_h != h)) | 610 | if ((gld->img_w != w) || (gld->img_h != h)) |
547 | { | 611 | { |
548 | float new_w = ((float) gld->scr_w / ((float) gld->scr_w * (float) w)); | 612 | // No idea where this crap came from. |
549 | float new_h = ((float) gld->scr_h / ((float) gld->scr_h * (float) h)); | 613 | //float new_w = ((float) gld->scr_w / ((float) gld->scr_w * (float) w)); |
614 | //float new_h = ((float) gld->scr_h / ((float) gld->scr_h * (float) h)); | ||
550 | 615 | ||
551 | gld->img_w = new_w; | 616 | //gld->sfc_w = new_w; |
552 | gld->img_h = new_h; | 617 | //gld->sfc_h = new_h; |
553 | evas_object_image_fill_set(gld->r1, 0, 0, gld->img_w, gld->img_h); | 618 | //evas_object_image_fill_set(gld->r1, 0, 0, gld->sfc_w, gld->sfc_h); |
619 | gld->img_w = w; | ||
620 | gld->img_h = h; | ||
554 | gld->resized = 1; | 621 | gld->resized = 1; |
555 | } | 622 | } |
556 | } | 623 | } |
@@ -558,29 +625,36 @@ static void on_pixels(void *data, Evas_Object *obj) | |||
558 | if (gld->useEGL) | 625 | if (gld->useEGL) |
559 | { | 626 | { |
560 | // Yes, we DO need to do our own make current, coz aparently the Irrlicht one is useless. | 627 | // Yes, we DO need to do our own make current, coz aparently the Irrlicht one is useless. |
561 | evas_gl_make_current(gld->evasgl, gld->sfc, gld->ctx); | 628 | // Hopefully Elm_GL has done this for us by now. |
562 | if (gld->resized) | 629 | // Evas_GL needs it to. |
563 | _resize(gld); | 630 | if (gld->ctx) |
631 | evas_gl_make_current(gld->evasGl, gld->sfc, gld->ctx); | ||
564 | } | 632 | } |
565 | 633 | ||
566 | if (!gld->doneIrr) | 634 | if (!gld->doneIrr) |
567 | gld->doneIrr = startIrr(gld); // Needs to be after gld->win is shown, and needs to be done in the render thread. | 635 | gld->doneIrr = startIrr(gld); // Needs to be after gld->win is shown, and needs to be done in the render thread. |
636 | #if DO_GEARS | ||
637 | if (!gld->gearsInited) | ||
638 | gears_init(gld); | ||
639 | #endif | ||
640 | |||
641 | if (gld->resized) | ||
642 | _resize(gld); | ||
568 | 643 | ||
569 | drawIrr_start(gld); | 644 | drawIrr_start(gld); |
570 | 645 | ||
646 | #if DO_GEARS | ||
571 | if (gld->useEGL) | 647 | if (gld->useEGL) |
572 | { | 648 | { |
573 | #if DO_GEARS | ||
574 | static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; | 649 | static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; |
575 | static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; | 650 | static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; |
576 | static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; | 651 | static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; |
577 | GLfloat m[16]; | 652 | GLfloat m[16]; |
578 | 653 | ||
579 | |||
580 | // Draw the gears. | 654 | // Draw the gears. |
581 | if (!gld->useIrr) | 655 | if (!gld->useIrr) |
582 | { | 656 | { |
583 | gl->glClearColor(0.8, 0.8, 0.1, 0.1); | 657 | gl->glClearColor(0.7, 0.0, 1.0, 1.0); |
584 | gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 658 | gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
585 | } | 659 | } |
586 | 660 | ||
@@ -593,101 +667,163 @@ static void on_pixels(void *data, Evas_Object *obj) | |||
593 | draw_gear(gld, gld->gear2, m, 3.1, -2.0, -2 * gld->angle - 9.0, green); | 667 | draw_gear(gld, gld->gear2, m, 3.1, -2.0, -2 * gld->angle - 9.0, green); |
594 | draw_gear(gld, gld->gear3, m, -3.1, 4.2, -2 * gld->angle - 25.0, blue); | 668 | draw_gear(gld, gld->gear3, m, -3.1, 4.2, -2 * gld->angle - 25.0, blue); |
595 | gld->angle += 2.0; | 669 | gld->angle += 2.0; |
596 | #endif | ||
597 | } | 670 | } |
671 | #endif | ||
598 | 672 | ||
599 | drawIrr_end(gld); | 673 | drawIrr_end(gld); |
600 | count++; | 674 | |
675 | #if USE_IR | ||
676 | #else | ||
677 | // This might get done deep within drawIrr_end, but only if we are using Irrlicht. | ||
678 | |||
679 | // Optional - Flush the GL pipeline | ||
680 | gl->glFlush(); | ||
681 | // gl->glFinish(); | ||
682 | #endif | ||
683 | |||
601 | gld->resized = 0; | 684 | gld->resized = 0; |
602 | } | 685 | } |
603 | 686 | ||
604 | static void on_del(void *data, Evas *e, Evas_Object *obj, void *event_info) | 687 | static void _draw_gl(Evas_Object *obj) |
605 | { | 688 | { |
606 | // on delete of our object clean up some things that don't get auto | 689 | Evas_GL_API *gl = elm_glview_gl_api_get(obj); |
607 | // deleted for us as they are not intrinsically bound to the image | 690 | GLData *gld = evas_object_data_get(obj, "gld"); |
608 | // object as such (you could use the same context and surface across | ||
609 | // multiple image objects and re-use the evasgl handle too multiple times. | ||
610 | // here we bind them to 1 object only though by doing this. | ||
611 | GLData *gld = data; | ||
612 | if (!gld) return; | 691 | if (!gld) return; |
613 | Evas_GL_API *gl = gld->glapi; | 692 | |
693 | on_pixels(gld, obj); | ||
694 | } | ||
695 | |||
696 | // Callback from Evas, also used as the general callback for deleting the GL stuff. | ||
697 | static void _clean_gl(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) | ||
698 | { | ||
699 | GLData *gld = data; | ||
700 | Evas_GL_API *gl = gld->glApi; | ||
614 | 701 | ||
615 | ecore_animator_del(gld->animator); | 702 | ecore_animator_del(gld->animator); |
616 | 703 | ||
617 | if (gld->useEGL) | 704 | if (gld->useEGL) |
618 | { | 705 | { |
619 | // Do a make_current before deleting all the GL stuff. | 706 | // Do a make_current before deleting all the GL stuff. |
620 | evas_gl_make_current(gld->evasgl, gld->sfc, gld->ctx); | 707 | evas_gl_make_current(gld->evasGl, gld->sfc, gld->ctx); |
621 | |||
622 | #if DO_GEARS | ||
623 | gl->glDeleteShader(gld->vtx_shader); | ||
624 | gl->glDeleteShader(gld->fgmt_shader); | ||
625 | gl->glDeleteProgram(gld->program); | ||
626 | 708 | ||
627 | gl->glDeleteBuffers(1, &gld->gear1->vbo); | 709 | } |
628 | gl->glDeleteBuffers(1, &gld->gear2->vbo); | ||
629 | gl->glDeleteBuffers(1, &gld->gear3->vbo); | ||
630 | 710 | ||
631 | free_gear(gld->gear1); | 711 | gl->glDeleteShader(gld->vtx_shader); |
632 | free_gear(gld->gear2); | 712 | gl->glDeleteShader(gld->fgmt_shader); |
633 | free_gear(gld->gear3); | 713 | gl->glDeleteProgram(gld->program); |
634 | #endif | ||
635 | 714 | ||
715 | if (gld->evasGl) | ||
716 | { | ||
636 | // Irrlicht wants to destroy the context and surface, so only do this if Irrlicht wont. | 717 | // Irrlicht wants to destroy the context and surface, so only do this if Irrlicht wont. |
637 | if (!gld->doneIrr) | 718 | if (!gld->doneIrr) |
638 | { | 719 | { |
639 | evas_gl_surface_destroy(gld->evasgl, gld->sfc); | 720 | evas_gl_surface_destroy(gld->evasGl, gld->sfc); |
640 | evas_gl_context_destroy(gld->evasgl, gld->ctx); | 721 | evas_gl_context_destroy(gld->evasGl, gld->ctx); |
641 | } | 722 | } |
642 | // TODO - hope this is OK, considering the context and surface might get dealt with by Irrlicht. | 723 | // TODO - hope this is OK, considering the context and surface might get dealt with by Irrlicht. |
643 | // Might be better to teach Irrlicht to not destroy shit it did not create. | 724 | // Might be better to teach Irrlicht to not destroy shit it did not create. |
644 | evas_gl_config_free(gld->cfg); | 725 | evas_gl_config_free(gld->cfg); |
645 | evas_gl_free(gld->evasgl); | 726 | evas_gl_free(gld->evasGl); |
646 | } | 727 | } |
647 | 728 | ||
648 | // TODO - Since this is created on the render thread, better hope this is being deleted on the render thread. | 729 | // TODO - Since this is created on the render thread, better hope this is being deleted on the render thread. |
649 | finishIrr(gld); | 730 | finishIrr(gld); |
650 | 731 | ||
651 | free(gld); | 732 | #if DO_GEARS |
733 | gl->glDeleteBuffers(1, &gld->gear1->vbo); | ||
734 | gl->glDeleteBuffers(1, &gld->gear2->vbo); | ||
735 | gl->glDeleteBuffers(1, &gld->gear3->vbo); | ||
736 | |||
737 | free_gear(gld->gear1); | ||
738 | free_gear(gld->gear2); | ||
739 | free_gear(gld->gear3); | ||
740 | #endif | ||
741 | } | ||
742 | |||
743 | // Callback from Elm, coz they do shit different. | ||
744 | static void _del_gl(Evas_Object *obj) | ||
745 | { | ||
746 | GLData *gld = evas_object_data_get(obj, "gld"); | ||
747 | if (!gld) | ||
748 | { | ||
749 | printf("Unable to get GLData. \n"); | ||
750 | return; | ||
751 | } | ||
752 | |||
753 | _clean_gl(gld, NULL, NULL, NULL); | ||
754 | |||
755 | evas_object_data_del((Evas_Object*)obj, "gld"); | ||
756 | } | ||
757 | |||
758 | // Callback for when the app quits. | ||
759 | static void _on_done(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) | ||
760 | { | ||
761 | GLData *gld = data; | ||
762 | |||
763 | evas_object_del(gld->win); | ||
764 | free(gld); | ||
765 | elm_exit(); | ||
652 | } | 766 | } |
653 | 767 | ||
768 | // Callback from the animator. | ||
654 | static Eina_Bool doFrame(void *data) | 769 | static Eina_Bool doFrame(void *data) |
655 | { | 770 | { |
656 | GLData *gld = data; | 771 | GLData *gld = data; |
657 | 772 | ||
658 | // Mark the pixels as dirty, so they get rerendered each frame, then Irrlicht can draw it's stuff each frame. | 773 | // Mark the pixels as dirty, so they get rerendered each frame, then Irrlicht can draw it's stuff each frame. |
659 | // This causes on_pixel to be triggered by Evas_GL. | 774 | // This causes on_pixel to be triggered by Evas_GL, and _draw_gl for Elm_glview. |
660 | if (gld->r1) | 775 | if (gld->r1) |
661 | evas_object_image_pixels_dirty_set(gld->r1, EINA_TRUE); | 776 | evas_object_image_pixels_dirty_set(gld->r1, EINA_TRUE); |
777 | if (gld->elmGl) | ||
778 | elm_glview_changed_set(gld->elmGl); | ||
662 | 779 | ||
663 | // If not using Evas_GL, we need to call on_pixel() manually. | 780 | // If not using Evas_GL, we need to call on_pixel() manually. |
664 | if (!gld->useEGL) | 781 | if (!gld->useEGL) |
665 | on_pixels(gld, gld->r1); | 782 | on_pixels(gld, gld->r1); |
666 | 783 | ||
667 | return EINA_TRUE; | 784 | return EINA_TRUE; // Keep calling us. |
668 | } | 785 | } |
669 | 786 | ||
670 | static void init_evas_gl(GLData *gld, int w, int h) | 787 | static void init_evas_gl(GLData *gld) |
671 | { | 788 | { |
672 | Ecore_Evas *ee; | ||
673 | Evas *canvas; | ||
674 | Evas_Native_Surface ns; | ||
675 | |||
676 | if (!gld->useEGL) | 789 | if (!gld->useEGL) |
677 | return; | 790 | return; |
678 | 791 | ||
679 | w *= 2; // Compensate for the original halving of the window. | 792 | gld->sfc_w = gld->win_w; |
680 | w -= 1; | 793 | gld->sfc_h = gld->win_h; |
681 | h -= 1; | 794 | |
682 | 795 | // Get the Evas / canvas from the elm window (that the Evas_Object "lives on"), which is itself an Evas_Object created by Elm, so not sure if it was created internally with Ecore_Evas. | |
683 | ee = ecore_evas_ecore_evas_get(evas_object_evas_get(gld->win)); | 796 | gld->canvas = evas_object_evas_get(gld->win); |
684 | canvas = ecore_evas_get(ee); | 797 | // An Ecore_Evas holds an Evas. |
685 | 798 | // Get the Ecore_Evas that wraps an Evas. | |
686 | //-//-//-// THIS IS WHERE GL INIT STUFF HAPPENS (ALA EGL) | 799 | gld->ee = ecore_evas_ecore_evas_get(gld->canvas); // Only use this on Evas that was created with Ecore_Evas. |
687 | //-// | 800 | |
801 | #if USE_ELM_GL | ||
802 | // Add a GLView | ||
803 | gld->elmGl = elm_glview_add(gld->win); | ||
804 | evas_object_size_hint_align_set(gld->elmGl, EVAS_HINT_FILL, EVAS_HINT_FILL); | ||
805 | evas_object_size_hint_weight_set(gld->elmGl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); | ||
806 | elm_glview_mode_set(gld->elmGl, 0 | ELM_GLVIEW_ALPHA | ELM_GLVIEW_DEPTH | ELM_GLVIEW_DIRECT); | ||
807 | elm_glview_resize_policy_set(gld->elmGl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); // Destroy the current surface on a resize and create a new one. | ||
808 | elm_glview_render_policy_set(gld->elmGl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); | ||
809 | // elm_glview_render_policy_set(gld->elmGl, ELM_GLVIEW_RENDER_POLICY_ALWAYS); | ||
810 | // These get called in the render thread I think. | ||
811 | //elm_glview_init_func_set(gld->elmGl, _init_gl); // Not actually needed, it gets done in on_pixels. | ||
812 | elm_glview_del_func_set(gld->elmGl, _del_gl); | ||
813 | elm_glview_resize_func_set(gld->elmGl, _resize_gl); | ||
814 | elm_glview_render_func_set(gld->elmGl, (Elm_GLView_Func_Cb) _draw_gl); | ||
815 | |||
816 | elm_box_pack_end(gld->bx, gld->elmGl); | ||
817 | elm_win_resize_object_add(gld->win, gld->elmGl); | ||
818 | evas_object_show(gld->elmGl); | ||
819 | |||
820 | elm_object_focus_set(gld->elmGl, EINA_TRUE); | ||
821 | gld->glApi = elm_glview_gl_api_get(gld->elmGl); | ||
822 | evas_object_data_set(gld->elmGl, "gld", gld); | ||
823 | #else | ||
688 | // get the evas gl handle for doing gl things | 824 | // get the evas gl handle for doing gl things |
689 | gld->evasgl = evas_gl_new(canvas); | 825 | gld->evasGl = evas_gl_new(gld->canvas); |
690 | gld->glapi = evas_gl_api_get(gld->evasgl); | 826 | gld->glApi = evas_gl_api_get(gld->evasGl); |
691 | 827 | ||
692 | // Set a surface config | 828 | // Set a surface config |
693 | gld->cfg = evas_gl_config_new(); | 829 | gld->cfg = evas_gl_config_new(); |
@@ -697,121 +833,69 @@ static void init_evas_gl(GLData *gld, int w, int h) | |||
697 | gld->cfg->options_bits = EVAS_GL_OPTIONS_DIRECT; | 833 | gld->cfg->options_bits = EVAS_GL_OPTIONS_DIRECT; |
698 | 834 | ||
699 | // create a surface and context | 835 | // create a surface and context |
700 | gld->sfc_w = gld->scr_w; | 836 | gld->sfc = evas_gl_surface_create(gld->evasGl, gld->cfg, gld->sfc_w, gld->sfc_h); |
701 | gld->sfc_h = gld->scr_h; | 837 | gld->ctx = evas_gl_context_create(gld->evasGl, NULL); // The second NULL is for sharing contexts I think, which might be what we want to do with Irrlicht. It's not documented. |
702 | gld->sfc = evas_gl_surface_create(gld->evasgl, gld->cfg, gld->sfc_w, gld->sfc_h); | 838 | |
703 | gld->ctx = evas_gl_context_create(gld->evasgl, NULL); // The second NULL is for sharing contexts I think, which might be what we want to do with Irrlicht. | 839 | // Set up the image object, a filled one by default. |
704 | //-// | 840 | gld->r1 = evas_object_image_filled_add(gld->canvas); |
705 | //-//-//-// END GL INIT BLOB | 841 | |
706 | 842 | // attach important data we need to the object using key names. This just | |
707 | // set up the image object. a filled one by default | 843 | // avoids some global variables and means we can do nice cleanup. You can |
708 | gld->r1 = evas_object_image_add(canvas); | 844 | // avoid this if you are lazy |
709 | evas_object_image_filled_set(gld->r1, EINA_FALSE); | 845 | // Not actually needed, with evas we can pass data pointers to stuff. |
846 | //evas_object_data_set(gld->r1, "gld", gld); | ||
847 | |||
848 | // when the object is deleted - call the on_del callback. like the above, | ||
849 | // this is just being clean | ||
850 | evas_object_event_callback_add(gld->r1, EVAS_CALLBACK_DEL, _clean_gl, gld); | ||
851 | |||
852 | // set up an actual pixel size for the buffer data. it may be different | ||
853 | // to the output size. any windowing system has something like this, just | ||
854 | // evas has 2 sizes, a pixel size and the output object size | ||
855 | evas_object_image_size_set(gld->r1, gld->sfc_w, gld->sfc_h); | ||
856 | // Not actualy needed, as we create the image already filled. | ||
857 | //evas_object_image_fill_set(gld->r1, 0, 0, gld->sfc_w, gld->sfc_h); | ||
858 | |||
859 | // These two are not in the original example, but I get black r1 when I leave them out. | ||
710 | evas_object_size_hint_align_set(gld->r1, EVAS_HINT_FILL, EVAS_HINT_FILL); | 860 | evas_object_size_hint_align_set(gld->r1, EVAS_HINT_FILL, EVAS_HINT_FILL); |
711 | evas_object_size_hint_weight_set(gld->r1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); | 861 | evas_object_size_hint_weight_set(gld->r1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); |
712 | elm_win_resize_object_add(gld->win, gld->r1); | 862 | |
713 | // when the object is deleted - call the on_del callback. like the above, | 863 | // set up the native surface info to use the context and surface created |
714 | // this is just being clean | 864 | // above |
715 | evas_object_event_callback_add(gld->r1, EVAS_CALLBACK_DEL, on_del, gld); | 865 | evas_gl_native_surface_get(gld->evasGl, gld->sfc, &(gld->ns)); |
716 | // set up an actual pixel size for the buffer data. it may be different | 866 | evas_object_image_native_surface_set(gld->r1, &(gld->ns)); |
717 | // to the output size. any windowing system has something like this, just | ||
718 | // evas has 2 sizes, a pixel size and the output object size | ||
719 | evas_object_image_size_set(gld->r1, gld->scr_w, gld->scr_h); | ||
720 | evas_object_image_fill_set(gld->r1, 0, 0, w, h); | ||
721 | // set up the native surface info to use the context and surface created | ||
722 | // above | ||
723 | |||
724 | // The ELM version does these as well. | ||
725 | // elm_glview_resize_policy_set(gld->gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); // Destroy the current surface on a resize and create a new one. | ||
726 | // elm_glview_render_policy_set(gld->gl, ELM_GLVIEW_RENDER_POLICY_ALWAYS); // Always render, even if not visible. | ||
727 | |||
728 | //-//-//-// THIS IS WHERE GL INIT STUFF HAPPENS (ALA EGL) | ||
729 | //-// | ||
730 | evas_gl_native_surface_get(gld->evasgl, gld->sfc, &ns); | ||
731 | evas_object_image_native_surface_set(gld->r1, &ns); | ||
732 | evas_object_image_pixels_get_callback_set(gld->r1, on_pixels, gld); | 867 | evas_object_image_pixels_get_callback_set(gld->r1, on_pixels, gld); |
733 | //-// | ||
734 | //-//-//-// END GL INIT BLOB | ||
735 | 868 | ||
869 | // move the image object somewhere, resize it and show it. any windowing | ||
870 | // system would need this kind of thing - place a child "window" | ||
871 | // Hmm, no need to resize it anyway, it's sized above. | ||
872 | evas_object_move(gld->r1, 0, 0); | ||
873 | //evas_object_resize(gld->r1, gld->sfc_w, gld->sfc_h); | ||
874 | elm_win_resize_object_add(gld->win, gld->r1); | ||
736 | evas_object_show(gld->r1); | 875 | evas_object_show(gld->r1); |
737 | // Might be good to pack it when I get the menu / address / indicator bar working. | 876 | elm_box_pack_end(gld->bx, gld->r1); |
738 | // elm_box_pack_end(gld->bx, gld->r1); | ||
739 | |||
740 | evas_gl_make_current(gld->evasgl, gld->sfc, gld->ctx); | ||
741 | |||
742 | gld->glapi->glEnable(GL_CULL_FACE); | ||
743 | gld->glapi->glEnable(GL_DEPTH_TEST); | ||
744 | gld->glapi->glEnable(GL_BLEND); | ||
745 | gld->glapi->glViewport(0, 0, (GLint) gld->sfc_w, (GLint) gld->sfc_h); | ||
746 | |||
747 | #if DO_GEARS | ||
748 | GLint linked = 0; | ||
749 | |||
750 | // Load the vertex/fragment shaders | ||
751 | gld->vtx_shader = load_shader(gld, GL_VERTEX_SHADER, vertex_shader); | ||
752 | gld->fgmt_shader = load_shader(gld, GL_FRAGMENT_SHADER, fragment_shader); | ||
753 | |||
754 | // Create the program object | ||
755 | if (!(gld->program = gld->glapi->glCreateProgram())) | ||
756 | return; | ||
757 | |||
758 | gld->glapi->glAttachShader(gld->program, gld->vtx_shader); | ||
759 | gld->glapi->glAttachShader(gld->program, gld->fgmt_shader); | ||
760 | |||
761 | // Bind shader attributes. | ||
762 | gld->glapi->glBindAttribLocation(gld->program, 0, "position"); | ||
763 | gld->glapi->glBindAttribLocation(gld->program, 1, "normal"); | ||
764 | // Link the program | ||
765 | gld->glapi->glLinkProgram(gld->program); | ||
766 | gld->glapi->glGetProgramiv(gld->program, GL_LINK_STATUS, &linked); | ||
767 | |||
768 | if (!linked) | ||
769 | { | ||
770 | GLint len = 0; | ||
771 | 877 | ||
772 | gld->glapi->glGetProgramiv(gld->program, GL_INFO_LOG_LENGTH, &len); | 878 | // evas_object_event_callback_add(gld->r1, EVAS_CALLBACK_MOUSE_DOWN, _cb_mouse_down_GL, gld); |
773 | if (len > 1) | ||
774 | { | ||
775 | char *info = malloc(sizeof(char) * len); | ||
776 | |||
777 | if (info) | ||
778 | { | ||
779 | gld->glapi->glGetProgramInfoLog(gld->program, len, NULL, info); | ||
780 | printf("Error linking program:\n%s\n", info); | ||
781 | free(info); | ||
782 | } | ||
783 | } | ||
784 | gld->glapi->glDeleteProgram(gld->program); | ||
785 | } | ||
786 | |||
787 | gld->glapi->glUseProgram(gld->program); | ||
788 | gld->proj_location = gld->glapi->glGetUniformLocation(gld->program, "proj"); | ||
789 | gld->light_location = gld->glapi->glGetUniformLocation(gld->program, "light"); | ||
790 | gld->color_location = gld->glapi->glGetUniformLocation(gld->program, "color"); | ||
791 | |||
792 | /* make the gears */ | ||
793 | gld->gear1 = make_gear(gld, 1.0, 4.0, 1.0, 20, 0.7); | ||
794 | gld->gear2 = make_gear(gld, 0.5, 2.0, 2.0, 10, 0.7); | ||
795 | gld->gear3 = make_gear(gld, 1.3, 2.0, 0.5, 10, 0.7); | ||
796 | #endif | 879 | #endif |
797 | 880 | ||
881 | // In this code, we are making our own camera, so grab it's input when we are focused. | ||
882 | evas_object_event_callback_add(gld->win, EVAS_CALLBACK_KEY_DOWN, _on_camera_input_down, gld); | ||
883 | evas_object_event_callback_add(gld->win, EVAS_CALLBACK_KEY_UP, _on_camera_input_up, gld); | ||
884 | gld->camFocus = 1; // Start with the GL camera focused. | ||
885 | |||
798 | // NOTE: if you delete r1, this animator will keep running trying to access | 886 | // NOTE: if you delete r1, this animator will keep running trying to access |
799 | // r1 so you'd better delete this animator with ecore_animator_del() or | 887 | // r1 so you'd better delete this animator with ecore_animator_del() or |
800 | // structure how you do animation differently. you can also attach it like | 888 | // structure how you do animation differently. you can also attach it like |
801 | // evasgl, sfc, etc. etc. if this animator is specific to this object | 889 | // evasGl, sfc, etc. etc. if this animator is specific to this object |
802 | // only and delete it in the del handler for the obj. | 890 | // only and delete it in the del handler for the obj. |
803 | // | 891 | // |
804 | // TODO - apparently the proper way to deal with the new async rendering is to have this animator do the dirty thing, and call the Irrlicht rendering stuff in the on_pixel call set above. | 892 | // TODO - apparently the proper way to deal with the new async rendering is to have this animator do the dirty thing, and call the Irrlicht rendering stuff in the on_pixel call set above. |
805 | // That still leaves the problem of the Irrlicht setup being in the main thread. Which also should be done in on_pixel, as that's done in the correct thread. | 893 | // That still leaves the problem of the Irrlicht setup being in the main thread. Which also should be done in on_pixel, as that's done in the correct thread. |
806 | // ecore_animator_frametime_set(1.0); | 894 | |
895 | // Jiggling this seems to produce a trade off between flickering and frame rate. Nothing else changed the flickering. | ||
896 | ecore_animator_frametime_set(0.04); // Default is 1/30, or 0.033333 | ||
807 | gld->animator = ecore_animator_add(doFrame, gld); // This animator will be called every frame tick, which defaults to 1/30 seconds. | 897 | gld->animator = ecore_animator_add(doFrame, gld); // This animator will be called every frame tick, which defaults to 1/30 seconds. |
808 | 898 | ||
809 | // In this code, we are making our own camera, so grab it's input when we are focused. | ||
810 | evas_object_event_callback_add(gld->win, EVAS_CALLBACK_KEY_DOWN, _on_camera_input_down, gld); | ||
811 | evas_object_event_callback_add(gld->win, EVAS_CALLBACK_KEY_UP, _on_camera_input_up, gld); | ||
812 | evas_object_event_callback_add(gld->r1, EVAS_CALLBACK_MOUSE_DOWN, _cb_mouse_down_GL, gld); | ||
813 | gld->camFocus = 1; // Start with the GL camera focused. | ||
814 | |||
815 | return; | 899 | return; |
816 | } | 900 | } |
817 | 901 | ||
@@ -833,12 +917,6 @@ static void _promote(void *data, Evas_Object *obj , void *event_info ) | |||
833 | elm_naviframe_item_promote(data); | 917 | elm_naviframe_item_promote(data); |
834 | } | 918 | } |
835 | 919 | ||
836 | static void _on_done(void *data, Evas_Object *obj, void *event_info) | ||
837 | { | ||
838 | evas_object_del((Evas_Object*)data); | ||
839 | elm_exit(); | ||
840 | } | ||
841 | |||
842 | static char *_grid_label_get(void *data, Evas_Object *obj, const char *part) | 920 | static char *_grid_label_get(void *data, Evas_Object *obj, const char *part) |
843 | { | 921 | { |
844 | ezGrid *thisGrid = data; | 922 | ezGrid *thisGrid = data; |
@@ -924,16 +1002,17 @@ static Evas_Object *_viewer_content_get(void *data, Evas_Object *obj, const char | |||
924 | static void _grid_sel_cb(void *data, Evas_Object *obj, void *event_info) | 1002 | static void _grid_sel_cb(void *data, Evas_Object *obj, void *event_info) |
925 | { | 1003 | { |
926 | ezGrid *thisGrid = data; | 1004 | ezGrid *thisGrid = data; |
1005 | GLData *gld = thisGrid->gld; | ||
927 | char buf[PATH_MAX]; | 1006 | char buf[PATH_MAX]; |
928 | 1007 | ||
929 | // sprintf(buf, "dillo -f -g '%dx%d+%d+%d' %s &", w - (w / 5), h - 30, w / 5, y, thisGrid->splashPage); | 1008 | // 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); |
930 | sprintf(buf, "uzbl -g '%dx%d+%d+%d' -u %s &", w - (w / 5), h - 30, w / 5, y, thisGrid->splashPage); | 1009 | 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); |
931 | printf("%s ### genlist obj [%p], item pointer [%p]\n", buf, obj, event_info); | 1010 | printf("%s ### genlist obj [%p], item pointer [%p]\n", buf, obj, event_info); |
932 | // comment this out for now, busy dealing with input stuff, don't want to trigger this multiple times. | 1011 | // comment this out for now, busy dealing with input stuff, don't want to trigger this multiple times. |
933 | // system(buf); | 1012 | // system(buf); |
934 | } | 1013 | } |
935 | 1014 | ||
936 | static void fill(Evas_Object *win) | 1015 | static void fill(GLData *gld, Evas_Object *win) |
937 | { | 1016 | { |
938 | Evas_Object *bg, *bx, *ic, *bb, *av, *en, *bt, *nf, *tab, *tb, *gridList, *viewerList, *menu; | 1017 | Evas_Object *bg, *bx, *ic, *bb, *av, *en, *bt, *nf, *tab, *tb, *gridList, *viewerList, *menu; |
939 | Elm_Object_Item *tb_it, *menu_it, *tab_it; | 1018 | Elm_Object_Item *tb_it, *menu_it, *tab_it; |
@@ -943,7 +1022,7 @@ static void fill(Evas_Object *win) | |||
943 | // Apparently transparent is not good enough for ELM backgrounds, so make it a rectangle. | 1022 | // Apparently transparent is not good enough for ELM backgrounds, so make it a rectangle. |
944 | // Apparently coz ELM prefers stuff to have edjes. A bit over the top if all I want is a transparent rectangle. | 1023 | // Apparently coz ELM prefers stuff to have edjes. A bit over the top if all I want is a transparent rectangle. |
945 | bg = evas_object_rectangle_add(evas_object_evas_get(win)); | 1024 | bg = evas_object_rectangle_add(evas_object_evas_get(win)); |
946 | evas_object_color_set(bg, 100, 0, 200, 200); | 1025 | evas_object_color_set(bg, 50, 0, 100, 100); |
947 | evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); | 1026 | evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); |
948 | elm_win_resize_object_add(win, bg); | 1027 | elm_win_resize_object_add(win, bg); |
949 | evas_object_show(bg); | 1028 | evas_object_show(bg); |
@@ -979,7 +1058,7 @@ static void fill(Evas_Object *win) | |||
979 | elm_menu_item_separator_add(menu, menu_it); | 1058 | elm_menu_item_separator_add(menu, menu_it); |
980 | elm_menu_item_add(menu, menu_it, NULL, "about extantz", NULL, NULL); | 1059 | elm_menu_item_add(menu, menu_it, NULL, "about extantz", NULL, NULL); |
981 | elm_menu_item_separator_add(menu, menu_it); | 1060 | elm_menu_item_separator_add(menu, menu_it); |
982 | elm_menu_item_add(menu, NULL, NULL, "quit", _on_done, win); | 1061 | elm_menu_item_add(menu, NULL, NULL, "quit", _on_done, gld); |
983 | 1062 | ||
984 | // The toolbar needs to be packed into the box AFTER the menus are added. | 1063 | // The toolbar needs to be packed into the box AFTER the menus are added. |
985 | elm_box_pack_end(bx, tb); | 1064 | elm_box_pack_end(bx, tb); |
@@ -1006,6 +1085,7 @@ static void fill(Evas_Object *win) | |||
1006 | thisGrid->loginURI = gridTest[i][1]; | 1085 | thisGrid->loginURI = gridTest[i][1]; |
1007 | thisGrid->splashPage = gridTest[i][2]; | 1086 | thisGrid->splashPage = gridTest[i][2]; |
1008 | thisGrid->icon = "folder"; | 1087 | thisGrid->icon = "folder"; |
1088 | thisGrid->gld = gld; | ||
1009 | thisGrid->item = elm_genlist_item_append(gridList, grid_gic, thisGrid, NULL, ELM_GENLIST_ITEM_TREE, _grid_sel_cb, thisGrid); | 1089 | thisGrid->item = elm_genlist_item_append(gridList, grid_gic, thisGrid, NULL, ELM_GENLIST_ITEM_TREE, _grid_sel_cb, thisGrid); |
1010 | eina_hash_add(grids, thisGrid->name, thisGrid); | 1090 | eina_hash_add(grids, thisGrid->name, thisGrid); |
1011 | } | 1091 | } |
@@ -1066,9 +1146,11 @@ static void fill(Evas_Object *win) | |||
1066 | 1146 | ||
1067 | #if USE_EO | 1147 | #if USE_EO |
1068 | // Not ready for prime time yet, or I'm missing a step. Causes it to hang after closing the window. | 1148 | // Not ready for prime time yet, or I'm missing a step. Causes it to hang after closing the window. |
1149 | // Slightly better now, it bitches instead of hanging. | ||
1069 | bt = eo_add(ELM_OBJ_BUTTON_CLASS, win); | 1150 | bt = eo_add(ELM_OBJ_BUTTON_CLASS, win); |
1070 | elm_object_text_set(bt, "Login"); // No eo interface for this that I can find. | 1151 | elm_object_text_set(bt, "Login"); // No eo interface for this that I can find. |
1071 | eo_do(bt, | 1152 | eo_do(bt, |
1153 | // evas_obj_text_set("Login"), | ||
1072 | evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL), | 1154 | evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL), |
1073 | evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, 0.0), | 1155 | evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, 0.0), |
1074 | evas_obj_visibility_set(EINA_TRUE) | 1156 | evas_obj_visibility_set(EINA_TRUE) |
@@ -1184,58 +1266,65 @@ EAPI_MAIN int elm_main(int argc, char **argv) | |||
1184 | if (!(gld = calloc(1, sizeof(GLData)))) return; | 1266 | if (!(gld = calloc(1, sizeof(GLData)))) return; |
1185 | gldata_init(gld); | 1267 | gldata_init(gld); |
1186 | 1268 | ||
1187 | // Set the engine to opengl_x11 | 1269 | // Set the engine to opengl_x11, then open our window. |
1188 | if (gld->useEGL) | 1270 | if (gld->useEGL) |
1189 | elm_config_preferred_engine_set("opengl_x11"); | 1271 | elm_config_preferred_engine_set("opengl_x11"); |
1190 | // else | ||
1191 | // elm_config_preferred_engine_set("software_x11"); | ||
1192 | gld->win = elm_win_add(NULL, "extantz", ELM_WIN_BASIC); | 1272 | gld->win = elm_win_add(NULL, "extantz", ELM_WIN_BASIC); |
1193 | // Set preferred engine back to default from config | 1273 | // Set preferred engine back to default from config |
1194 | elm_config_preferred_engine_set(NULL); | 1274 | elm_config_preferred_engine_set(NULL); |
1195 | 1275 | ||
1276 | #if USE_PHYSICS | ||
1196 | if (!ephysics_init()) | 1277 | if (!ephysics_init()) |
1197 | return 1; | 1278 | return 1; |
1279 | #endif | ||
1198 | 1280 | ||
1199 | elm_win_title_set(gld->win, "extantz virtual world manager"); | 1281 | elm_win_title_set(gld->win, "extantz virtual world manager"); |
1200 | evas_object_smart_callback_add(gld->win, "delete,request", _on_done, NULL); | 1282 | evas_object_smart_callback_add(gld->win, "delete,request", _on_done, gld); |
1201 | 1283 | ||
1202 | elm_win_screen_size_get(gld->win, &x, &y, &gld->scr_w, &gld->scr_h); | 1284 | // Get the screen size. |
1203 | w = gld->scr_w / 2; | 1285 | elm_win_screen_size_get(gld->win, &gld->win_x, &gld->win_y, &gld->scr_w, &gld->scr_h); |
1204 | h = gld->scr_h - 30; | 1286 | gld->win_w = gld->scr_w / 2; |
1287 | gld->win_h = gld->scr_h - 30; | ||
1205 | 1288 | ||
1289 | // Note, we don't need an Elm_bg, the entire thing gets covered with the GL rendering surface anyway. | ||
1290 | #if 0 | ||
1206 | bg = elm_bg_add(gld->win); | 1291 | bg = elm_bg_add(gld->win); |
1207 | elm_bg_load_size_set(bg, w, h); | 1292 | elm_bg_load_size_set(bg, gld->win_w, gld->win_h); |
1208 | elm_bg_option_set(bg, ELM_BG_OPTION_CENTER); | 1293 | elm_bg_option_set(bg, ELM_BG_OPTION_CENTER); |
1209 | snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); | 1294 | snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); |
1210 | elm_bg_file_set(bg, buf, NULL); | 1295 | elm_bg_file_set(bg, buf, NULL); |
1211 | evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); | 1296 | evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); |
1212 | elm_win_resize_object_add(gld->win, bg); | 1297 | elm_win_resize_object_add(gld->win, bg); |
1213 | evas_object_show(bg); | 1298 | evas_object_show(bg); |
1299 | #endif | ||
1214 | 1300 | ||
1215 | gld->bx = elm_box_add(gld->win); | 1301 | gld->bx = elm_box_add(gld->win); |
1216 | elm_win_resize_object_add(gld->win, gld->bx); | ||
1217 | evas_object_size_hint_weight_set(gld->bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); | 1302 | evas_object_size_hint_weight_set(gld->bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); |
1218 | evas_object_size_hint_align_set(gld->bx, EVAS_HINT_FILL, EVAS_HINT_FILL); | 1303 | evas_object_size_hint_align_set(gld->bx, EVAS_HINT_FILL, EVAS_HINT_FILL); |
1219 | // elm_win_resize_object_add(gld->bx, bg); | 1304 | elm_win_resize_object_add(gld->win, gld->bx); |
1220 | evas_object_show(gld->bx); | 1305 | evas_object_show(gld->bx); |
1221 | 1306 | ||
1307 | // TODO - add the main menu here, in a toolbar, in the box. The windows still need their own menus, just different from the ones we have now. | ||
1308 | |||
1309 | #if 1 | ||
1222 | win3 = elm_win_add(gld->win, "inlined", ELM_WIN_INLINED_IMAGE); | 1310 | win3 = elm_win_add(gld->win, "inlined", ELM_WIN_INLINED_IMAGE); |
1223 | evas_object_event_callback_add(elm_win_inlined_image_object_get(win3), EVAS_CALLBACK_MOUSE_DOWN, _cb_mouse_down_elm, gld); | 1311 | evas_object_event_callback_add(elm_win_inlined_image_object_get(win3), EVAS_CALLBACK_MOUSE_DOWN, _cb_mouse_down_elm, gld); |
1224 | elm_win_alpha_set(win3, EINA_TRUE); | 1312 | elm_win_alpha_set(win3, EINA_TRUE); |
1225 | fill(win3); | 1313 | fill(gld, win3); |
1226 | // Odd, it needs to be resized twice? | 1314 | // image object for win3 is unlinked to its pos/size - so manual control |
1227 | evas_object_resize(win3, w / 3, h / 4); | 1315 | // this allows also for using map and other things with it. |
1228 | // image object for win3 is unlinked to its pos/size - so manual control | ||
1229 | // this allows also for using map and other things with it. | ||
1230 | evas_object_move(elm_win_inlined_image_object_get(win3), 13, 13); | 1316 | evas_object_move(elm_win_inlined_image_object_get(win3), 13, 13); |
1231 | evas_object_resize(elm_win_inlined_image_object_get(win3), w / 3, h / 4); | 1317 | // Odd, it needs to be resized twice. WTF? |
1318 | evas_object_resize(win3, gld->win_w / 3, gld->win_h / 3); | ||
1319 | evas_object_resize(elm_win_inlined_image_object_get(win3), gld->win_w / 3, gld->win_h / 3); | ||
1232 | evas_object_show(win3); | 1320 | evas_object_show(win3); |
1233 | create_handles(elm_win_inlined_image_object_get(win3)); | 1321 | create_handles(elm_win_inlined_image_object_get(win3)); |
1322 | #endif | ||
1234 | 1323 | ||
1235 | #if USE_PHYSICS | 1324 | #if USE_PHYSICS |
1236 | // ePhysics stuff. | 1325 | // ePhysics stuff. |
1237 | world = ephysics_world_new(); | 1326 | world = ephysics_world_new(); |
1238 | ephysics_world_render_geometry_set(world, 0, 0, -50, w, h, 100); | 1327 | ephysics_world_render_geometry_set(world, 0, 0, -50, gld->win_w, gld->win_h, 100); |
1239 | 1328 | ||
1240 | boundary = ephysics_body_bottom_boundary_add(world); | 1329 | boundary = ephysics_body_bottom_boundary_add(world); |
1241 | ephysics_body_restitution_set(boundary, 1); | 1330 | ephysics_body_restitution_set(boundary, 1); |
@@ -1255,7 +1344,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) | |||
1255 | 1344 | ||
1256 | box1 = elm_image_add(gld->win); | 1345 | box1 = elm_image_add(gld->win); |
1257 | elm_image_file_set(box1, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "blue-cube"); | 1346 | elm_image_file_set(box1, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "blue-cube"); |
1258 | evas_object_move(box1, w / 2 - 80, h - 200); | 1347 | evas_object_move(box1, gld->win_w / 2 - 80, gld->win_h - 200); |
1259 | evas_object_resize(box1, 70, 70); | 1348 | evas_object_resize(box1, 70, 70); |
1260 | evas_object_show(box1); | 1349 | evas_object_show(box1); |
1261 | 1350 | ||
@@ -1269,7 +1358,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) | |||
1269 | 1358 | ||
1270 | box2 = elm_image_add(gld->win); | 1359 | box2 = elm_image_add(gld->win); |
1271 | elm_image_file_set(box2, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "purple-cube"); | 1360 | elm_image_file_set(box2, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "purple-cube"); |
1272 | evas_object_move(box2, w / 2 + 10, h - 200); | 1361 | evas_object_move(box2, gld->win_w / 2 + 10, gld->win_h - 200); |
1273 | evas_object_resize(box2, 70, 70); | 1362 | evas_object_resize(box2, 70, 70); |
1274 | evas_object_show(box2); | 1363 | evas_object_show(box2); |
1275 | 1364 | ||
@@ -1284,11 +1373,12 @@ EAPI_MAIN int elm_main(int argc, char **argv) | |||
1284 | ephysics_world_gravity_set(world, 0, 0, 0); | 1373 | ephysics_world_gravity_set(world, 0, 0, 0); |
1285 | #endif | 1374 | #endif |
1286 | 1375 | ||
1287 | // This does an elm_box_pack_end(), so needs to be after the others. | 1376 | // This does a elm_box_pack_end(), so needs to be after the others. |
1288 | init_evas_gl(gld, w, h); | 1377 | init_evas_gl(gld); |
1378 | evas_object_show(gld->win); | ||
1289 | 1379 | ||
1290 | evas_object_move(gld->win, x, y); | 1380 | evas_object_move(gld->win, gld->win_x, gld->win_y); |
1291 | evas_object_resize(gld->win, w, h); | 1381 | evas_object_resize(gld->win, gld->win_w, gld->win_h); |
1292 | evas_object_show(gld->win); | 1382 | evas_object_show(gld->win); |
1293 | 1383 | ||
1294 | elm_run(); | 1384 | elm_run(); |