You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 12 година
пре 12 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. //
  2. // Lol Engine - EasyMesh tutorial
  3. //
  4. // Copyright: (c) 2011-2013 Sam Hocevar <sam@hocevar.net>
  5. // (c) 2012-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com>
  6. // This program is free software; you can redistribute it and/or
  7. // modify it under the terms of the Do What The Fuck You Want To
  8. // Public License, Version 2, as published by Sam Hocevar. See
  9. // http://www.wtfpl.net/ for more details.
  10. //
  11. #if defined HAVE_CONFIG_H
  12. # include "config.h"
  13. #endif
  14. #include <cfloat> /* for FLT_MAX */
  15. #include "core.h"
  16. #include "scenesetup.h"
  17. using namespace std;
  18. using namespace lol;
  19. static int const TEXTURE_WIDTH = 256;
  20. #define R_M 1.f
  21. #define DEFAULT_WIDTH (770.f * R_M)
  22. #define DEFAULT_HEIGHT (200.f * R_M)
  23. #define WIDTH ((float)Video::GetSize().x)
  24. #define HEIGHT ((float)Video::GetSize().y)
  25. #define SCREEN_W (10.f / WIDTH)
  26. #define SCREEN_LIMIT 1.1f
  27. #define RATIO_HW (HEIGHT / WIDTH)
  28. #define RATIO_WH (WIDTH / HEIGHT)
  29. #define RESET_TIMER .2f
  30. #define ROT_SPEED vec2(50.f)
  31. #define ROT_CLAMP 89.f
  32. #define POS_SPEED vec2(1.2f)
  33. #define POS_CLAMP 1.f
  34. #define FOV_SPEED 20.f
  35. #define FOV_CLAMP 120.f
  36. #define ZOM_SPEED 3.f
  37. #define ZOM_CLAMP 20.f
  38. #define HST_SPEED .5f
  39. #define HST_CLAMP 1.f
  40. #define WITH_TEXTURE 0
  41. #define NO_NACL_EM (!__native_client__ && !EMSCRIPTEN)
  42. #define NACL_EM (__native_client__ || EMSCRIPTEN)
  43. #define HAS_KBOARD (m_input_usage & (1<<IPT_MV_KBOARD))
  44. #define HAS_MOUSE (m_input_usage & (1<<IPT_MV_MOUSE))
  45. LOLFX_RESOURCE_DECLARE(shinyfur);
  46. LOLFX_RESOURCE_DECLARE(shinymvtexture);
  47. enum
  48. {
  49. IPT_MV_KBOARD = 0,
  50. IPT_MV_MOUSE,
  51. INPUT_MAX
  52. };
  53. enum MVKeyboardList
  54. {
  55. KEY_CAM_RESET = 0,
  56. KEY_CAM_POS,
  57. KEY_CAM_FOV,
  58. KEY_CAM_UP,
  59. KEY_CAM_DOWN,
  60. KEY_CAM_LEFT,
  61. KEY_CAM_RIGHT,
  62. KEY_MESH_NEXT,
  63. KEY_MESH_PREV,
  64. KEY_F1,
  65. KEY_F2,
  66. KEY_F3,
  67. KEY_F4,
  68. KEY_F5,
  69. KEY_ESC,
  70. KEY_MAX
  71. };
  72. enum MVMouseKeyList
  73. {
  74. MSE_CAM_ROT = KEY_MAX,
  75. MSE_CAM_POS,
  76. MSE_CAM_FOV,
  77. MSE_MAX
  78. };
  79. enum MVMouseAxisList
  80. {
  81. MSEX_CAM_Y = 0,
  82. MSEX_CAM_X,
  83. MSEX_MAX
  84. };
  85. #define MAX_KEYS MSE_MAX
  86. #define MAX_AXIS MSEX_MAX
  87. enum MessageType
  88. {
  89. MSG_IN,
  90. MSG_OUT,
  91. MSG_MAX
  92. };
  93. class MeshViewer : public WorldEntity
  94. {
  95. public:
  96. MeshViewer(char const *file_name = "data/mesh-buffer.txt")
  97. : m_file_name(file_name)
  98. {
  99. m_init = false;
  100. }
  101. ~MeshViewer()
  102. {
  103. if (m_camera)
  104. g_scene->PopCamera(m_camera);
  105. if (m_ssetup)
  106. delete(m_ssetup);
  107. MessageService::Destroy();
  108. m_ssetup = nullptr;
  109. m_camera = nullptr;
  110. }
  111. #if NO_NACL_EM
  112. bool KeyReleased(MVKeyboardList index) { return (HAS_KBOARD && m_controller->GetKey(index).IsReleased()); }
  113. bool KeyPressed(MVKeyboardList index) { return (HAS_KBOARD && m_controller->GetKey(index).IsPressed()); }
  114. bool KeyDown(MVKeyboardList index) { return (HAS_KBOARD && m_controller->GetKey(index).IsDown()); }
  115. bool KeyReleased(MVMouseKeyList index) { return (HAS_MOUSE && m_controller->GetKey(index).IsReleased()); }
  116. bool KeyPressed(MVMouseKeyList index) { return (HAS_MOUSE && m_controller->GetKey(index).IsPressed()); }
  117. bool KeyDown(MVMouseKeyList index) { return (HAS_MOUSE && m_controller->GetKey(index).IsDown()); }
  118. float AxisValue(MVMouseAxisList index) { return (HAS_MOUSE)?(m_controller->GetAxis(index).GetValue()):(0.f); }
  119. #endif //NO_NACL_EM
  120. void Init()
  121. {
  122. m_init = true;
  123. m_input_usage = 0;
  124. #if NO_NACL_EM
  125. /* Register an input controller for the keyboard */
  126. m_controller = new Controller("Default", MAX_KEYS, MAX_AXIS);
  127. if (InputDevice::Get("Mouse"))
  128. {
  129. m_input_usage |= (1<<IPT_MV_MOUSE);
  130. m_controller->GetKey(MSE_CAM_ROT).Bind("Mouse", "Left");
  131. m_controller->GetKey(MSE_CAM_POS).Bind("Mouse", "Right");
  132. m_controller->GetKey(MSE_CAM_FOV).Bind("Mouse", "Middle");
  133. m_controller->GetAxis(MSEX_CAM_Y).Bind("Mouse", "Y");
  134. m_controller->GetAxis(MSEX_CAM_X).Bind("Mouse", "X");
  135. }
  136. if (InputDevice::Get("Keyboard"))
  137. {
  138. m_input_usage |= (1<<IPT_MV_KBOARD);
  139. //Camera keyboard rotation
  140. m_controller->GetKey(KEY_CAM_UP ).Bind("Keyboard", "Up");
  141. m_controller->GetKey(KEY_CAM_DOWN ).Bind("Keyboard", "Down");
  142. m_controller->GetKey(KEY_CAM_LEFT ).Bind("Keyboard", "Left");
  143. m_controller->GetKey(KEY_CAM_RIGHT).Bind("Keyboard", "Right");
  144. //Camera keyboard position switch
  145. m_controller->GetKey(KEY_CAM_POS ).Bind("Keyboard", "LeftShift");
  146. m_controller->GetKey(KEY_CAM_FOV ).Bind("Keyboard", "LeftCtrl");
  147. //Camera unzoom switch
  148. m_controller->GetKey(KEY_CAM_RESET).Bind("Keyboard", "Space");
  149. //Mesh change
  150. m_controller->GetKey(KEY_MESH_NEXT).Bind("Keyboard", "PageUp");
  151. m_controller->GetKey(KEY_MESH_PREV).Bind("Keyboard", "PageDown");
  152. //Base setup
  153. m_controller->GetKey(KEY_F1).Bind("Keyboard", "F1");
  154. m_controller->GetKey(KEY_F2).Bind("Keyboard", "F2");
  155. m_controller->GetKey(KEY_F3).Bind("Keyboard", "F3");
  156. m_controller->GetKey(KEY_F4).Bind("Keyboard", "F4");
  157. m_controller->GetKey(KEY_F5).Bind("Keyboard", "F5");
  158. m_controller->GetKey(KEY_ESC).Bind("Keyboard", "Escape");
  159. }
  160. #endif //NO_NACL_EM
  161. // Message Service
  162. MessageService::Setup();
  163. // Mesh Setup
  164. m_render_max = vec2(-.9f, 6.1f);
  165. m_mesh_id = 0;
  166. m_mesh_id1 = 0.f;
  167. m_default_texture = NULL;
  168. //Camera Setup
  169. m_reset_timer = -1.f;
  170. m_fov = -100.f;
  171. m_fov_mesh = 0.f;
  172. m_fov_speed = 0.f;
  173. m_zoom = -100.f;
  174. m_zoom_mesh = 0.f;
  175. m_zoom_speed = 0.f;
  176. m_rot = vec2(45.f);
  177. m_rot_mesh = vec2::zero;
  178. m_rot_speed = vec2::zero;
  179. m_pos = vec2::zero;
  180. m_pos_mesh = vec2::zero;
  181. m_pos_speed = vec2::zero;
  182. m_screen_offset = vec2::zero;
  183. m_hist_scale = vec2(.13f, .03f);
  184. m_hist_scale_mesh = vec2(.0f);
  185. m_hist_scale_speed = vec2(.0f);
  186. m_camera = new Camera();
  187. m_camera->SetView(vec3(0.f, 0.f, 10.f), vec3(0.f, 0.f, 0.f), vec3(0.f, 1.f, 0.f));
  188. m_camera->SetProjection(0.f, .0001f, 2000.f, WIDTH * SCREEN_W, RATIO_HW);
  189. m_camera->UseShift(true);
  190. g_scene->PushCamera(m_camera);
  191. //Lights setup
  192. m_ssetup = new SceneSetup();
  193. m_ssetup->Compile(" addlight 0.0 position (4 -1 -4) color (.0 .2 .5 1)"
  194. " addlight 0.0 position (8 2 6) color #ffff"
  195. " custom setmesh \"sc#fff ab 1\"");
  196. m_ssetup->Startup();
  197. //stream update
  198. m_stream_update_time = 2.0f;
  199. m_stream_update_timer = 1.0f;
  200. }
  201. virtual void TickGame(float seconds)
  202. {
  203. WorldEntity::TickGame(seconds);
  204. if (!m_init && g_scene)
  205. {
  206. Init();
  207. return;
  208. }
  209. if (!m_init)
  210. return;
  211. //TODO : This should probably be "standard LoL behaviour"
  212. #if NO_NACL_EM
  213. {
  214. //Shutdown logic
  215. if (KeyReleased(KEY_ESC))
  216. Ticker::Shutdown();
  217. }
  218. #endif //NO_NACL_EM
  219. //Mesh Change
  220. #if NO_NACL_EM
  221. m_mesh_id = clamp(m_mesh_id + ((int)KeyPressed(KEY_MESH_PREV) - (int)KeyPressed(KEY_MESH_NEXT)), 0, m_meshes.Count() - 1);
  222. #endif //NO_NACL_EM
  223. m_mesh_id1 = damp(m_mesh_id1, (float)m_mesh_id, .2f, seconds);
  224. //Camera update
  225. bool is_pos = false;
  226. bool is_fov = false;
  227. bool is_hsc = false;
  228. vec2 tmp = vec2::zero;
  229. #if NO_NACL_EM
  230. is_pos = KeyDown(KEY_CAM_POS) || KeyDown(MSE_CAM_POS);
  231. is_fov = KeyDown(KEY_CAM_FOV) || KeyDown(MSE_CAM_FOV);
  232. if (KeyDown(MSE_CAM_ROT) || KeyDown(MSE_CAM_POS) || KeyDown(MSE_CAM_FOV))
  233. {
  234. tmp += vec2(AxisValue(MSEX_CAM_Y), AxisValue(MSEX_CAM_X));
  235. if (KeyDown(MSE_CAM_ROT))
  236. tmp *= 6.f;
  237. if (KeyDown(MSE_CAM_POS))
  238. tmp *= vec2(1.f, -1.f) * 3.f;
  239. if (KeyDown(MSE_CAM_FOV))
  240. tmp = vec2(tmp.y * 4.f, tmp.x * 6.f);
  241. }
  242. tmp += vec2((float)KeyDown(KEY_CAM_UP ) - (float)KeyDown(KEY_CAM_DOWN),
  243. (float)KeyDown(KEY_CAM_RIGHT) - (float)KeyDown(KEY_CAM_LEFT));
  244. #endif //NO_NACL_EM
  245. //Base data
  246. vec2 rot = (!is_pos && !is_fov)?(tmp):(vec2(.0f)); rot = vec2(rot.x, rot.y);
  247. vec2 pos = ( is_pos && !is_fov)?(tmp):(vec2(.0f)); pos = -vec2(pos.y, pos.x);
  248. vec2 fov = (!is_pos && is_fov )?(tmp):(vec2(.0f)); fov = vec2(-fov.x, fov.y);
  249. vec2 hsc = (is_hsc)?(vec2(0.f)):(vec2(0.f));
  250. //speed
  251. m_rot_speed = damp(m_rot_speed, rot * ROT_SPEED, .2f, seconds);
  252. float pos_factor = 1.f / (1.f + m_zoom_mesh * .5f);
  253. m_pos_speed = damp(m_pos_speed, pos * POS_SPEED * pos_factor, .2f, seconds);
  254. float fov_factor = 1.f + lol::pow((m_fov_mesh / FOV_CLAMP) * 1.f, 2.f);
  255. m_fov_speed = damp(m_fov_speed, fov.x * FOV_SPEED * fov_factor, .2f, seconds);
  256. float zom_factor = 1.f + lol::pow((m_zoom_mesh / ZOM_CLAMP) * 1.f, 2.f);
  257. m_zoom_speed = damp(m_zoom_speed, fov.y * ZOM_SPEED * zom_factor, .2f, seconds);
  258. m_hist_scale_speed = damp(m_hist_scale_speed, hsc * HST_SPEED, .2f, seconds);
  259. m_rot += m_rot_speed * seconds;
  260. #if NO_NACL_EM
  261. if (m_reset_timer >= 0.f)
  262. m_reset_timer -= seconds;
  263. if (KeyPressed(KEY_CAM_RESET))
  264. {
  265. if (m_reset_timer >= 0.f)
  266. {
  267. m_pos = vec2(0.f);
  268. m_zoom = -100.f;
  269. }
  270. else
  271. m_reset_timer = RESET_TIMER;
  272. }
  273. //Transform update
  274. if (!KeyDown(KEY_CAM_RESET))
  275. {
  276. m_pos += m_pos_speed * seconds;
  277. m_fov += m_fov_speed * seconds;
  278. m_zoom += m_zoom_speed * seconds;
  279. m_hist_scale += m_hist_scale_speed * seconds;
  280. }
  281. #endif //NO_NACL_EM
  282. //clamp
  283. vec2 rot_mesh = vec2(SmoothClamp(m_rot.x, -ROT_CLAMP, ROT_CLAMP, ROT_CLAMP * .1f), m_rot.y);
  284. vec2 pos_mesh = vec2(SmoothClamp(m_pos.x, -POS_CLAMP, POS_CLAMP, POS_CLAMP * .1f),
  285. SmoothClamp(m_pos.y, -POS_CLAMP, POS_CLAMP, POS_CLAMP * .1f));
  286. float fov_mesh = SmoothClamp(m_fov, 0.f, FOV_CLAMP, FOV_CLAMP * .1f);
  287. float zoom_mesh = SmoothClamp(m_zoom, 0.f, ZOM_CLAMP, ZOM_CLAMP * .1f);
  288. vec2 hist_scale_mesh = vec2(SmoothClamp(m_hist_scale.x, 0.f, HST_CLAMP, HST_CLAMP * .1f),
  289. SmoothClamp(m_hist_scale.y, 0.f, HST_CLAMP, HST_CLAMP * .1f));
  290. #if NO_NACL_EM
  291. if (KeyDown(KEY_CAM_RESET) && m_reset_timer < 0.f)
  292. {
  293. pos_mesh = vec2::zero;
  294. zoom_mesh = 0.f;
  295. }
  296. #endif //NO_NACL_EM
  297. m_rot_mesh = vec2(damp(m_rot_mesh.x, rot_mesh.x, .2f, seconds), damp(m_rot_mesh.y, rot_mesh.y, .2f, seconds));
  298. m_pos_mesh = vec2(damp(m_pos_mesh.x, pos_mesh.x, .2f, seconds), damp(m_pos_mesh.y, pos_mesh.y, .2f, seconds));
  299. m_fov_mesh = damp(m_fov_mesh, fov_mesh, .2f, seconds);
  300. m_zoom_mesh = damp(m_zoom_mesh, zoom_mesh, .2f, seconds);
  301. m_hist_scale_mesh = damp(m_hist_scale_mesh, hist_scale_mesh, .2f, seconds);
  302. //Mesh mat calculation
  303. m_mat = mat4(quat::fromeuler_xyz(vec3(m_rot_mesh, .0f)));
  304. //Target List Setup
  305. Array<vec3> target_list;
  306. if (m_meshes.Count() && m_mesh_id >= 0)
  307. for (int i = 0; i < m_meshes[m_mesh_id]->GetVertexCount(); i++)
  308. target_list << (m_mat * mat4::translate(m_meshes[m_mesh_id]->GetVertexLocation(i))).v3.xyz;
  309. //--
  310. //Update mesh screen location - Get the Min/Max needed
  311. //--
  312. vec2 cam_center(0.f);
  313. float cam_factor = .0f;
  314. vec3 local_min_max[2] = { vec3(FLT_MAX), vec3(-FLT_MAX) };
  315. vec2 screen_min_max[2] = { vec2(FLT_MAX), vec2(-FLT_MAX) };
  316. mat4 world_cam = m_camera->GetView();
  317. mat4 cam_screen = m_camera->GetProjection();
  318. //target on-screen computation
  319. for (int i = 0; i < target_list.Count(); i++)
  320. {
  321. vec3 obj_loc = target_list[i];
  322. {
  323. //Debug::DrawBox(obj_loc - vec3(4.f), obj_loc + vec3(4.f), vec4(1.f, 0.f, 0.f, 1.f));
  324. mat4 target_mx = mat4::translate(obj_loc);
  325. vec3 vpos;
  326. //Get location in cam coordinates
  327. target_mx = world_cam * target_mx;
  328. vpos = target_mx.v3.xyz;
  329. local_min_max[0] = min(vpos.xyz, local_min_max[0]);
  330. local_min_max[1] = max(vpos.xyz, local_min_max[1]);
  331. //Get location in screen coordinates
  332. target_mx = cam_screen * target_mx;
  333. vpos = (target_mx.v3 / target_mx.v3.w).xyz;
  334. screen_min_max[0] = min(screen_min_max[0], vpos.xy * vec2(RATIO_WH, 1.f));
  335. screen_min_max[1] = max(screen_min_max[1], vpos.xy * vec2(RATIO_WH, 1.f));
  336. //Build Barycenter
  337. cam_center += vpos.xy;
  338. cam_factor += 1.f;
  339. }
  340. }
  341. float screen_ratio = max(max(lol::abs(local_min_max[0].x), lol::abs(local_min_max[0].y)),
  342. max(lol::abs(local_min_max[1].x), lol::abs(local_min_max[1].y)));
  343. float scale_ratio = max(max(lol::abs(screen_min_max[0].x), lol::abs(screen_min_max[0].y)),
  344. max(lol::abs(screen_min_max[1].x), lol::abs(screen_min_max[1].y)));
  345. vec2 screen_offset = vec2(0.f, -(screen_min_max[1].y + screen_min_max[0].y) * .5f);
  346. m_screen_offset = damp(m_screen_offset, screen_offset, .9f, seconds);
  347. float z_pos = (inverse(world_cam) * mat4::translate(vec3(0.f, 0.f, max(local_min_max[0].z, local_min_max[1].z)))).v3.z;
  348. if (cam_factor > 0.f)
  349. {
  350. vec2 new_screen_scale = m_camera->GetScreenScale();
  351. m_camera->SetScreenScale(max(vec2(0.001f), new_screen_scale * ((1.0f + m_zoom_mesh) / (scale_ratio * SCREEN_LIMIT))));
  352. m_camera->m_position.z = damp(m_camera->m_position.z, z_pos + screen_ratio * 2.f, .1f, seconds);
  353. m_camera->SetFov(m_fov_mesh);
  354. m_camera->SetScreenInfos(damp(m_camera->GetScreenSize(), max(1.f, screen_ratio), 1.2f, seconds));
  355. }
  356. //--
  357. //Message Service
  358. //--
  359. String mesh("");
  360. int u = 4;
  361. while (u-- > 0 && MessageService::FetchFirst(MessageBucket::AppIn, mesh))
  362. {
  363. int o = 1;
  364. while (o-- > 0)
  365. {
  366. SceneSetup* new_ssetup = new SceneSetup();
  367. if (new_ssetup->Compile(mesh.C()))
  368. {
  369. delete(m_ssetup);
  370. m_ssetup = new_ssetup;
  371. m_ssetup->Startup();
  372. for (int i = 0; i < m_ssetup->m_custom_cmd.Count(); ++i)
  373. {
  374. if (m_ssetup->m_custom_cmd[i].m1 == "setmesh")
  375. {
  376. //Create a new mesh
  377. EasyMesh* em = new EasyMesh();
  378. if (em->Compile(m_ssetup->m_custom_cmd[i].m2.C()))
  379. {
  380. if (m_mesh_id == m_meshes.Count() - 1)
  381. m_mesh_id++;
  382. m_meshes.Push(em);
  383. }
  384. else
  385. delete(em);
  386. }
  387. }
  388. m_ssetup->m_custom_cmd.Empty();
  389. }
  390. }
  391. }
  392. #if NACL_EM
  393. if (m_stream_update_time > .0f)
  394. {
  395. m_stream_update_time = -1.f;
  396. // MessageService::Send(MessageBucket::AppIn, "[sc#f8f ab 1]");
  397. // MessageService::Send(MessageBucket::AppIn, "[sc#f8f ab 1 splt 4 twy 90]");
  398. // MessageService::Send(MessageBucket::AppIn, "[sc#8ff afcb 1 1 1 0]");
  399. // MessageService::Send(MessageBucket::AppIn, "[sc#ff8 afcb 1 1 1 0]");
  400. }
  401. #elif WIN32
  402. //--
  403. //File management
  404. //--
  405. m_stream_update_time += seconds;
  406. if (m_stream_update_time > m_stream_update_timer)
  407. {
  408. m_stream_update_time = 0.f;
  409. File f;
  410. f.Open(m_file_name.C(), FileAccess::Read);
  411. String cmd = f.ReadString();
  412. f.Close();
  413. if (cmd.Count()
  414. && (!m_cmdlist.Count() || cmd != m_cmdlist.Last()))
  415. {
  416. m_cmdlist << cmd;
  417. cmd = String(" addlight 0.0 position (4 -1 -4) color (.0 .2 .5 1) \
  418. addlight 0.0 position (8 2 6) color #ffff \
  419. custom setmesh \"") + cmd + "\"";
  420. MessageService::Send(MessageBucket::AppIn, cmd);
  421. }
  422. }
  423. #endif //WINDOWS
  424. }
  425. virtual void TickDraw(float seconds)
  426. {
  427. WorldEntity::TickDraw(seconds);
  428. if (!m_init)
  429. return;
  430. //TODO : This should probably be "standard LoL behaviour"
  431. #if NO_NACL_EM
  432. {
  433. if (KeyReleased(KEY_F1))
  434. Video::SetDebugRenderMode(DebugRenderMode::Default);
  435. if (KeyReleased(KEY_F2))
  436. Video::SetDebugRenderMode(DebugRenderMode::Wireframe);
  437. if (KeyReleased(KEY_F3))
  438. Video::SetDebugRenderMode(DebugRenderMode::Lighting);
  439. if (KeyReleased(KEY_F4))
  440. Video::SetDebugRenderMode(DebugRenderMode::Normal);
  441. if (KeyReleased(KEY_F5))
  442. Video::SetDebugRenderMode(DebugRenderMode::UV);
  443. }
  444. #endif //NO_NACL_EM
  445. #if NO_NACL_EM
  446. if (!m_default_texture)
  447. {
  448. m_texture_shader = Shader::Create(LOLFX_RESOURCE_NAME(shinymvtexture));
  449. m_texture_uni = m_texture_shader->GetUniformLocation("u_Texture");
  450. m_default_texture = Tiler::Register("data/test-texture.png", ivec2::zero, ivec2(0,1));
  451. }
  452. else if (m_texture && m_default_texture)
  453. m_texture_shader->SetUniform(m_texture_uni, m_default_texture->GetTexture(), 0);
  454. #endif //NO_NACL_EM
  455. g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
  456. vec3 x = vec3(1.f,0.f,0.f);
  457. vec3 y = vec3(0.f,1.f,0.f);
  458. for (int i = 0; i < m_meshes.Count(); i++)
  459. {
  460. {
  461. if (m_meshes[i]->GetMeshState() == MeshRender::NeedConvert)
  462. {
  463. #if WITH_TEXTURE
  464. m_meshes[i]->MeshConvert(new DefaultShaderData(((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) |
  465. (1 << VertexUsage::Color) | (1 << VertexUsage::TexCoord)),
  466. m_texture_shader, true));
  467. #else
  468. m_meshes[i]->MeshConvert();
  469. #endif //WITH_TEXTURE
  470. }
  471. mat4 save_proj = m_camera->GetProjection();
  472. float j = -(float)(m_meshes.Count() - (i + 1)) + (-m_mesh_id1 + (float)(m_meshes.Count() - 1));
  473. if (m_mesh_id1 - m_render_max[0] > (float)i && m_mesh_id1 - m_render_max[1] < (float)i &&
  474. m_meshes[i]->GetMeshState() > MeshRender::NeedConvert)
  475. {
  476. float a_j = lol::abs(j);
  477. float i_trans = (a_j * a_j * m_hist_scale_mesh.x + a_j * m_hist_scale_mesh.x) * .5f;
  478. float i_scale = clamp(1.f - (m_hist_scale_mesh.y * (m_mesh_id1 - (float)i)), 0.f, 1.f);
  479. mat4 new_proj =
  480. //Y object Offset
  481. mat4::translate(x * m_screen_offset.x + y * m_screen_offset.y) *
  482. //Mesh Pos Offset
  483. mat4::translate((x * m_pos_mesh.x * RATIO_HW + y * m_pos_mesh.y) * 2.f * (1.f + .5f * m_zoom_mesh / SCREEN_LIMIT)) *
  484. //Mesh count offset
  485. mat4::translate(x * RATIO_HW * 2.f * (j + i_trans)) *
  486. //Align right meshes
  487. mat4::translate(x - x * RATIO_HW) *
  488. //Mesh count scale
  489. mat4::scale(vec3(vec2(i_scale), 1.f)) *
  490. //Camera projection
  491. save_proj;
  492. m_camera->SetProjection(new_proj);
  493. //#if NO_NACL_EM
  494. m_meshes[i]->Render(m_mat);
  495. //#endif //NO_NACL_EM
  496. g_renderer->Clear(ClearMask::Depth);
  497. }
  498. m_camera->SetProjection(save_proj);
  499. }
  500. }
  501. }
  502. private:
  503. SceneSetup* m_ssetup;
  504. short m_input_usage;
  505. Controller* m_controller;
  506. mat4 m_mat;
  507. bool m_init;
  508. //Camera Setup
  509. Camera * m_camera;
  510. float m_reset_timer;
  511. float m_fov;
  512. float m_fov_mesh;
  513. float m_fov_speed;
  514. float m_zoom;
  515. float m_zoom_mesh;
  516. float m_zoom_speed;
  517. vec2 m_rot;
  518. vec2 m_rot_mesh;
  519. vec2 m_rot_speed;
  520. vec2 m_pos;
  521. vec2 m_pos_mesh;
  522. vec2 m_pos_speed;
  523. vec2 m_hist_scale;
  524. vec2 m_hist_scale_mesh;
  525. vec2 m_hist_scale_speed;
  526. vec2 m_screen_offset;
  527. //Mesh infos
  528. vec2 m_render_max;
  529. int m_mesh_id;
  530. float m_mesh_id1;
  531. Array<EasyMesh*> m_meshes;
  532. //File data
  533. String m_file_name;
  534. Array<String> m_cmdlist;
  535. float m_stream_update_time;
  536. float m_stream_update_timer;
  537. //misc datas
  538. Shader * m_texture_shader;
  539. TileSet * m_default_texture;
  540. Texture * m_texture;
  541. ShaderUniform m_texture_uni;
  542. Image * m_image;
  543. };
  544. //The basic main :
  545. int main(int argc, char **argv)
  546. {
  547. System::Init(argc, argv);
  548. Application app("MeshViewer", ivec2((int)DEFAULT_WIDTH, (int)DEFAULT_HEIGHT), 60.0f);
  549. if (argc > 1)
  550. new MeshViewer(argv[1]);
  551. else
  552. new MeshViewer();
  553. app.Run();
  554. return EXIT_SUCCESS;
  555. }