ui.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. #include "corange.h"
  2. //sample splash and loading colored bar
  3. void splash(float speed,bool fake_loading);
  4. static bool running = true;
  5. int main(int argc, char *argv[])
  6. {
  7. //default init and loading resources
  8. corange_init("../../assets_core");
  9. folder_load_recursive(P("./assets"));
  10. splash(0.008,true);
  11. graphics_viewport_set_size(1280,720);
  12. audio_music_play(asset_get(P("./assets/sound/adventure.mp3")));
  13. audio_music_set_volume(1.0);
  14. splash(0.005,false);
  15. asset_hndl opt_graphics = asset_hndl_new_load(P("./graphics.cfg"));
  16. renderer * dr = renderer_new(opt_graphics);
  17. entity_new("cam",camera);
  18. entity_get_as("cam",camera)->far_clip *=4;
  19. renderer_set_camera(dr,entity_get("cam"));
  20. renderer_set_sea_enabled(dr,true);
  21. renderer_set_skydome_enabled(dr,true);
  22. renderer_set_tod(dr,0.17,1);
  23. //just magic effect :D
  24. entity_new("magic",particles);
  25. particles_set_effect(entity_get("magic"),asset_hndl_new(P("./assets/effect/magic.effect")));
  26. //just objects for background
  27. static_object * object = entity_new("object",static_object);
  28. static_object * box = entity_new("box",static_object);
  29. object->renderable = asset_hndl_new(P("./assets/object/object.obj"));
  30. box->renderable = asset_hndl_new(P("./assets/object/box.obj"));
  31. object->scale = vec3_new(10,10,10);
  32. box->scale = vec3_new(2,2,2);
  33. //change current style back image
  34. extern ui_style * ui_style_current;
  35. ui_style_current->box_back_image = P("./assets/themes/custom.tga");
  36. //ui button example
  37. ui_elem_new("button",ui_button);
  38. ui_button_resize(ui_elem_get("button"),vec2_new(80,30));
  39. ui_button_move(ui_elem_get("button"),vec2_new(10,10));
  40. void handle_button(ui_button * btn,void * data)
  41. {
  42. ui_toast_popup("Click framerate button");
  43. }
  44. ui_button_set_onclick(ui_elem_get("button"),handle_button);
  45. //ui options example
  46. ui_elem_new("option",ui_option);
  47. char * options_level[]= { "SIMPLE","NORMAL","HARDCORE"};
  48. ui_option_set_options(ui_elem_get("option"),"Options:",3,options_level);
  49. ui_option_move(ui_elem_get("option"),vec2_new(120,10));
  50. void handle_option(ui_option * opt)
  51. {
  52. switch(ui_option_get_selected(opt))
  53. { //ui popup example
  54. case 0: ui_toast_popup("Option select: SIMPLE"); break;
  55. case 1: ui_toast_popup("Option select: NORMAL"); break;
  56. case 2: ui_toast_popup("Option select: HARDCORE"); break;
  57. default:break;
  58. }
  59. }
  60. ui_option_set_onselect(ui_elem_get("option"),handle_option);
  61. //ui browser example, need more implements functions, just do it! :D
  62. ui_browser * browser = ui_elem_new("browser",ui_browser);
  63. void browser_handle(ui_text * text)
  64. {
  65. //change directory and select files
  66. if(!SDL_PathIsDirectory(text->string))
  67. {
  68. text->color = vec4_green();
  69. ui_toast_popup("Browser select file: %s",text->string);
  70. }else if(SDL_PathIsDirectory(text->string)){
  71. text->color = vec4_red();
  72. ui_browser_chdir(ui_elem_get("browser"),P(text->string));
  73. ui_toast_popup("Browser chande dir: %s",text->string);
  74. };
  75. }
  76. ui_listbox_set_onselect(browser->inner,browser_handle);
  77. //ui dialog example (dialog not have "active" option, i just create/delete dialog)
  78. ui_button * ebtn = ui_elem_new("exit",ui_button);
  79. ebtn->up_color = vec4_red();
  80. ui_button_set_label(ui_elem_get("exit"),"Exit");
  81. ui_button_set_label_color(ui_elem_get("exit"),vec4_red());
  82. ui_button_resize(ui_elem_get("exit"),vec2_new(120,30));
  83. ui_button_move(ui_elem_get("exit"),vec2_new(845,10));
  84. void create_dialog(ui_button * btn,void * data)
  85. {
  86. ui_dialog * dia = ui_elem_new("dialog",ui_dialog);
  87. ui_dialog_set_title(ui_elem_get("dialog"),"Exit :( Or not! :)");
  88. ui_rectangle_set_texture(dia->back->back,asset_hndl_new(P("./assets/themes/mlp.tga")),0,0,false);
  89. ui_dialog_set_contents(ui_elem_get("dialog"),"Are you sure you want to exit\n"
  90. "No, you sure?\n"
  91. "Are you sure sure? :D\n"
  92. "Let`s go write code!");
  93. void dialog_handler(ui_button * btn,void * data)
  94. {
  95. if(strstr(btn->label->string,"Exit"))
  96. {
  97. running = false;
  98. }else{
  99. ui_dialog * dia = ui_elem_get("dialog");
  100. ui_elem_delete("dialog");
  101. };
  102. }
  103. ui_dialog_set_button_left(ui_elem_get("dialog"),"Exit",dialog_handler);
  104. ui_dialog_set_button_right(ui_elem_get("dialog"),"Stay",dialog_handler);
  105. }
  106. ui_button_set_onclick(ui_elem_get("exit"),create_dialog);
  107. //ui listbox example
  108. ui_elem_new("listbox",ui_listbox);
  109. ui_listbox_move(ui_elem_get("listbox"),vec2_new(10,80));
  110. ui_listbox_resize(ui_elem_get("listbox"),vec2_new(180,210));
  111. void listbox_handler(ui_text * text)
  112. {
  113. ui_toast_popup("Textbox select item: %s",text->string);
  114. };
  115. ui_listbox_set_onselect(ui_elem_get("listbox"),listbox_handler);
  116. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 1");
  117. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 2");
  118. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 3");
  119. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 4");
  120. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 5");
  121. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 6");
  122. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 7");
  123. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 8");
  124. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 9");
  125. ui_listbox_add_item(ui_elem_get("listbox"),"Listbox example item 10");
  126. //ui textbox example
  127. ui_textbox * tb = ui_elem_new("textbox",ui_textbox);
  128. tb->contents->color = vec4_new(0.9,0.6,0.7,1);
  129. ui_textbox_resize(ui_elem_get("textbox"),vec2_new(180,210));
  130. ui_textbox_move(ui_elem_get("textbox"),vec2_new(200,85));
  131. ui_textbox_set_max_chars(ui_elem_get("textbox"),20);
  132. ui_textbox_set_label(ui_elem_get("textbox"),"Textbox \n you can write text! \n limit 20 chars");
  133. //ui slider example
  134. ui_slider * vs = ui_elem_new("volume_slider",ui_slider);
  135. vs->pressed = false;
  136. vs->bar->color = vec4_green();
  137. ui_slider_set_amount(ui_elem_get("volume_slider"),1);
  138. ui_slider_activate(ui_elem_get("volume_slider"));
  139. ui_slider_set_label(ui_elem_get("volume_slider"),"Music volume");
  140. ui_slider_move(ui_elem_get("volume_slider"),vec2_new(10,300));
  141. ui_slider * ss = ui_elem_new("sun_slider",ui_slider);
  142. ss->pressed = false;
  143. ss->bar->color = vec4_red();
  144. ui_slider_set_amount(ui_elem_get("sun_slider"),1);
  145. ui_slider_activate(ui_elem_get("sun_slider"));
  146. ui_slider_set_label(ui_elem_get("sun_slider"),"Sun position");
  147. ui_slider_move(ui_elem_get("sun_slider"),vec2_new(10,350));
  148. //ui spinner example
  149. ui_spinner * rs = ui_elem_new("red_spinner",ui_spinner);
  150. rs->color = vec4_green();
  151. rs->top_left = vec2_new(10,410);
  152. rs->bottom_right = vec2_add(rs->top_left, vec2_new(24,24));
  153. ui_spinner * gs = ui_elem_new("green_spinner",ui_spinner);
  154. gs->color = vec4_red();
  155. gs->top_left = vec2_new(80,410);
  156. gs->bottom_right = vec2_add(gs->top_left, vec2_new(24,24));
  157. ui_spinner * bs = ui_elem_new("blue_spinner",ui_spinner);
  158. bs->color = vec4_blue();
  159. bs->top_left = vec2_new(160,410);
  160. bs->bottom_right = vec2_add(bs->top_left, vec2_new(24,24));
  161. // ui text example
  162. ui_elem_new("text",ui_text);
  163. ui_text_set_color(ui_elem_get("text"),vec4_green());
  164. ui_text_draw_string(ui_elem_get("text"),"Simple text ui element");
  165. ui_text_move(ui_elem_get("text"),vec2_new(600,600));
  166. ui_text_set_scale(ui_elem_get("text"),vec2_new(2,2));
  167. ui_elem_new("text2",ui_text);
  168. ui_text_set_color(ui_elem_get("text2"),vec4_red());
  169. ui_text_draw_string(ui_elem_get("text2"),"Simple text ui element");
  170. ui_text_move(ui_elem_get("text2"),vec2_new(600,640));
  171. ui_text_set_scale(ui_elem_get("text2"),vec2_new(1.8,1.8));
  172. ui_elem_new("text3",ui_text);
  173. ui_text_set_color(ui_elem_get("text3"),vec4_white());
  174. ui_text_draw_string(ui_elem_get("text3"),"Simple text ui element");
  175. ui_text_move(ui_elem_get("text3"),vec2_new(600,680));
  176. ui_text_set_scale(ui_elem_get("text3"),vec2_new(1.5,1.5));
  177. SDL_Event e = {0};
  178. float moving = 0.00005;
  179. float movinl = false;
  180. float rotate_object = 0.1;
  181. float rotate_box = 0.1;
  182. while(running)
  183. {
  184. frame_begin();
  185. frame_end_at_rate(240);
  186. ui_button_set_label(ui_elem_get("button"),frame_rate_string());
  187. audio_music_set_volume(ui_slider_get_amount(ui_elem_get("volume_slider")));
  188. renderer_set_tod(dr,ui_slider_get_amount(ui_elem_get("sun_slider")),1);
  189. while(SDL_PollEvent(&e))
  190. {
  191. ui_event(e);
  192. switch(e.type) {
  193. case SDL_KEYDOWN:{
  194. }break;
  195. case SDL_KEYUP:
  196. {
  197. };
  198. if (e.key.keysym.sym == SDLK_ESCAPE) { create_dialog(NULL,NULL); }
  199. if (e.key.keysym.sym == SDLK_p) { graphics_viewport_screenshot(); }
  200. break;
  201. case SDL_QUIT:
  202. running = 0;
  203. break;
  204. }
  205. };
  206. entity_get_as("cam",camera)->position = vec3_smootherstep(vec3_new(10,10,10),vec3_new(90,120,80),moving);
  207. entity_get_as("cam",camera)->position = vec3_smootherstep(vec3_new(90,120,80),vec3_new(300,10,-25),moving);
  208. entity_get_as("cam",camera)->position = vec3_smootherstep(vec3_new(300,10,-25),vec3_new(10,10,10),moving);
  209. entity_get_as("cam",camera)->position = vec3_smootherstep(vec3_new(-300,10,-25),vec3_new(10,10,10),moving);
  210. if(movinl == true && moving > 1.5)
  211. {
  212. movinl = false;
  213. };
  214. if(movinl == false && moving < -0.5)
  215. {
  216. movinl = true;
  217. };
  218. if(movinl)
  219. {
  220. moving += frame_time() / 2;
  221. }else{
  222. moving -= frame_time() / 2;
  223. };
  224. entity_get_as("magic",particles)->position = entity_get_as("cam",camera)->position;
  225. entity_get_as("magic",particles)->position.x = 10;
  226. entity_get_as("magic",particles)->position.z += 10;
  227. particles_update(entity_get("magic"),frame_time()*8,entity_get("cam"));
  228. entity_get_as("object",static_object)->rotation = quat_rotation_y(rotate_object -=frame_time()*5);
  229. entity_get_as("box",static_object)->rotation = quat_rotation_y(rotate_box +=frame_time()*5);
  230. renderer_add(dr,render_object_particles(entity_get("magic")));
  231. renderer_add(dr,render_object_static(entity_get("object")));
  232. renderer_add(dr,render_object_static(entity_get("box")));
  233. renderer_render(dr);
  234. ui_update();
  235. ui_render();
  236. graphics_swap();
  237. frame_end();
  238. };
  239. corange_finish();
  240. return 0;
  241. }
  242. //example how use ui_rectangle
  243. void splash(float speed, bool fake_loading)
  244. {
  245. //create splash
  246. ui_rectangle * splash = ui_elem_new("_splash_",ui_rectangle);
  247. splash->top_left = vec2_new(0,0);
  248. ui_rectangle_resize(splash,vec2_new(graphics_viewport_width(),graphics_viewport_height()));
  249. //set texture and filtrating for splash
  250. texture * splash_texture = asset_get(P("./assets/splash/splash.tga"));
  251. texture_set_filtering_anisotropic(splash_texture);
  252. ui_rectangle_set_texture(splash,asset_hndl_new(P("./assets/splash/splash.tga")),0,0,false);
  253. //create loading bar
  254. ui_rectangle * fake_load = ui_elem_new("_load_",ui_rectangle);
  255. fake_load->color = vec4_red();
  256. ui_rectangle_resize(ui_elem_get("_load_"),vec2_new(10,10));
  257. ui_rectangle_move(ui_elem_get("_load_"),vec2_new(100,graphics_viewport_height()-250));
  258. //enable disable loading bar
  259. if(fake_loading)
  260. {
  261. fake_load->active = true;
  262. }else{
  263. fake_load->active = false;
  264. };
  265. //create and play splash sound
  266. asset_get_as(P("./assets/splash/splash.wav"),sound)->sample->volume = 50;
  267. audio_sound_play(asset_get(P("./assets/splash/splash.wav")),0);
  268. //render splash
  269. while(splash->active)
  270. {
  271. frame_begin();
  272. frame_end_at_rate(60);
  273. if(splash->color.w > 0 || splash->color.x > 0 || splash->color.y > 0 || splash->color.z > 0)
  274. { //splash colors down
  275. splash->color.w-=speed;
  276. splash->color.x-=speed;
  277. splash->color.y-=speed;
  278. splash->color.z-=speed;
  279. //resize load bar to right
  280. if(fake_load->top_left.x < graphics_viewport_width()-100)
  281. {
  282. fake_load->top_left.x +=10;
  283. }
  284. //dynamic color load bar red to green
  285. fake_load->color.x -= speed;
  286. fake_load->color.y += speed;
  287. }else{
  288. //hide splash if alpha is 0
  289. splash->active = false;
  290. };
  291. ui_render();
  292. graphics_swap();
  293. frame_end();
  294. };
  295. //delete elements and exit
  296. ui_elem_delete("_splash_");
  297. ui_elem_delete("_load_");
  298. };