Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
10 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
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 лет назад
10 лет назад
11 лет назад
11 лет назад
11 лет назад
10 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
10 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
10 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966
  1. //
  2. // Lol Engine - EasyMesh tutorial
  3. //
  4. // Copyright: (c) 2011-2014 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 HAVE_CONFIG_H
  12. # include "config.h"
  13. #endif
  14. #include <cfloat> /* for FLT_MAX */
  15. #include <lol/engine.h>
  16. #include "scenesetup.h"
  17. using namespace lol;
  18. static int const TEXTURE_WIDTH = 256;
  19. #define NO_NACL_EM (!__native_client__ && !EMSCRIPTEN)
  20. #define NACL_EM (__native_client__ || EMSCRIPTEN)
  21. #define NO_NACL_EM_INPUT (1)
  22. #define R_M 1.f
  23. #if NACL_EM
  24. #define DEFAULT_WIDTH (800.f * R_M)
  25. #define DEFAULT_HEIGHT (400.f * R_M)
  26. #else
  27. #define DEFAULT_WIDTH (1200.f * R_M)
  28. #define DEFAULT_HEIGHT (400.f * R_M)
  29. #endif //NACL_EM
  30. #define WIDTH ((float)Video::GetSize().x)
  31. #define HEIGHT ((float)Video::GetSize().y)
  32. #define SCREEN_W (10.f / WIDTH)
  33. #define RATIO_HW (HEIGHT / WIDTH)
  34. #define RATIO_WH (WIDTH / HEIGHT)
  35. #define SCREEN_LIMIT 1.4f
  36. #define RESET_TIMER .2f
  37. #define ROT_SPEED vec2(50.f)
  38. #define ROT_CLAMP 89.f
  39. #define POS_SPEED vec2(1.2f)
  40. #define POS_CLAMP 1.f
  41. #define FOV_SPEED 20.f
  42. #define FOV_CLAMP 120.f
  43. #define ZOM_SPEED 3.f
  44. #define ZOM_CLAMP 20.f
  45. #define HST_SPEED .5f
  46. #define HST_CLAMP 1.f
  47. #define WITH_TEXTURE 0
  48. #define HAS_KBOARD (m_input_usage & (1<<IPT_MV_KBOARD))
  49. #define HAS_MOUSE (m_input_usage & (1<<IPT_MV_MOUSE))
  50. LOLFX_RESOURCE_DECLARE(shinyfur);
  51. LOLFX_RESOURCE_DECLARE(shinymvtexture);
  52. enum
  53. {
  54. IPT_MV_KBOARD = 0,
  55. IPT_MV_MOUSE,
  56. INPUT_MAX
  57. };
  58. enum MVKeyboardList
  59. {
  60. KEY_CAM_RESET = 0,
  61. KEY_CAM_POS,
  62. KEY_CAM_FOV,
  63. KEY_CAM_UP,
  64. KEY_CAM_DOWN,
  65. KEY_CAM_LEFT,
  66. KEY_CAM_RIGHT,
  67. KEY_MESH_NEXT,
  68. KEY_MESH_PREV,
  69. KEY_F1,
  70. KEY_F2,
  71. KEY_F3,
  72. KEY_F4,
  73. KEY_F5,
  74. KEY_ESC,
  75. KEY_MAX
  76. };
  77. enum MVMouseKeyList
  78. {
  79. MSE_CAM_ROT = KEY_MAX,
  80. MSE_CAM_POS,
  81. MSE_CAM_FOV,
  82. MSE_FOCUS,
  83. MSE_MAX
  84. };
  85. enum MVMouseAxisList
  86. {
  87. MSEX_CAM_Y = 0,
  88. MSEX_CAM_X,
  89. MSEX_MAX
  90. };
  91. #define MAX_KEYS MSE_MAX
  92. #define MAX_AXIS MSEX_MAX
  93. #define ALL_FEATURES 1
  94. #define NO_SC_SETUP 0
  95. enum GizmoType
  96. {
  97. GZ_Editor = 0,
  98. GZ_LightPos,
  99. GZ_LightDir,
  100. GZ_MAX
  101. };
  102. struct LightData
  103. {
  104. LightData(vec3 pos, vec4 col)
  105. {
  106. m_pos = pos;
  107. m_col = col;
  108. }
  109. vec3 m_pos;
  110. vec4 m_col;
  111. };
  112. class TargetCamera
  113. {
  114. public:
  115. void EmptyTargets() { m_targets.Empty(); }
  116. void AddTarget(vec3 new_target) { m_targets << new_target; }
  117. //This considers the box usage A to B as top-left to bottom-right
  118. void AddTarget(box3 new_target)
  119. {
  120. vec3 base_off = .5f * (new_target.B - new_target.A);
  121. vec3 base_pos = new_target.A + base_off;
  122. int pass = 0;
  123. while (pass < 3)
  124. {
  125. int mask = 3 - max(0, pass - 1);
  126. while (mask-- > 0)
  127. {
  128. ivec3 A((pass == 1 || (pass == 2 && mask == 1))?(1):(0));
  129. ivec3 B((pass == 2)?(1):(0)); B[mask] = 1;
  130. vec3 offset = vec3(ivec3((int)(!A.x != !B.x), (int)(!A.y != !B.y), (int)(!A.z != !B.z)));
  131. AddTarget(base_pos + offset * base_off * 2.f - base_off);
  132. }
  133. pass++;
  134. }
  135. }
  136. array<vec3> m_targets;
  137. };
  138. class MeshViewer : public WorldEntity
  139. {
  140. public:
  141. MeshViewer(char const *file_name = "data/mesh-buffer.txt")
  142. : m_file_name(file_name)
  143. {
  144. m_init = false;
  145. m_first_tick = false;
  146. // Message Service
  147. MessageService::Setup();
  148. m_ssetup = nullptr;
  149. m_camera = nullptr;
  150. m_controller = nullptr;
  151. //Scene setup
  152. m_setup_loader.ExecLua("meshviewer_init.lua");
  153. //Compile ref meshes
  154. m_gizmos << new EasyMesh();
  155. m_gizmos.Last()->Compile("[sc#0f0 ac 3 .5 .4 0 ty .25 [ad 3 .4 sy -1] ty .5 ac 3 1 .075 ty .5 dup[rz 90 ry 90 scv#00f dup[ry 90 scv#f00]]][sc#fff ab .1]");
  156. m_gizmos << new EasyMesh();
  157. m_gizmos.Last()->Compile("[sc#666 acap 1 .5 .5 ty -.5 sc#fff asph 2 1]");
  158. m_gizmos << new EasyMesh();
  159. m_gizmos.Last()->Compile("[sc#fff ac 3 .5 .4 0 ty .25 [ad 3 .4 sy -1] ty .5 ac 3 1 .1 ty .5 [ad 3 .1 sy -1] ty 1 rz 90 ry 90]");
  160. // Mesh Setup
  161. m_render_max = vec2(-.9f, 4.1f);
  162. m_mesh_render = 0;
  163. m_mesh_id = 0;
  164. m_mesh_id1 = 0.f;
  165. m_default_texture = nullptr;
  166. m_texture_shader = nullptr;
  167. m_texture = nullptr;
  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 = 0.f;
  174. m_zoom_mesh = 0.f;
  175. m_zoom_speed = 0.f;
  176. m_rot = vec2(/*45.f*/0.f, -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_mat_prev = mat4(quat::fromeuler_xyz(vec3::zero));
  187. m_mat = mat4::translate(vec3(0.f));//mat4(quat::fromeuler_xyz(vec3(m_rot_mesh, .0f)));
  188. m_build_timer = 0.1f;
  189. m_build_time = -1.f;
  190. //stream update
  191. m_stream_update_time = 2.0f;
  192. m_stream_update_timer = 1.0f;
  193. }
  194. ~MeshViewer()
  195. {
  196. if (m_camera)
  197. g_scene->PopCamera(m_camera);
  198. if (m_ssetup)
  199. delete m_ssetup;
  200. MessageService::Destroy();
  201. m_controller = nullptr;
  202. m_camera = nullptr;
  203. m_ssetup = nullptr;
  204. }
  205. #if NO_NACL_EM_INPUT
  206. bool KeyReleased(MVKeyboardList index) { return (HAS_KBOARD && m_controller->GetKey(index).IsReleased()); }
  207. bool KeyPressed(MVKeyboardList index) { return (HAS_KBOARD && m_controller->GetKey(index).IsPressed()); }
  208. bool KeyDown(MVKeyboardList index) { return (HAS_KBOARD && m_controller->GetKey(index).IsDown()); }
  209. bool KeyReleased(MVMouseKeyList index) { return (HAS_MOUSE && m_controller->GetKey(index).IsReleased()); }
  210. bool KeyPressed(MVMouseKeyList index) { return (HAS_MOUSE && m_controller->GetKey(index).IsPressed()); }
  211. bool KeyDown(MVMouseKeyList index) { return (HAS_MOUSE && m_controller->GetKey(index).IsDown()); }
  212. float AxisValue(MVMouseAxisList index) { return (HAS_MOUSE)?(m_controller->GetAxis(index).GetValue()):(0.f); }
  213. #endif //NO_NACL_EM_INPUT
  214. void Init()
  215. {
  216. m_init = true;
  217. m_input_usage = 0;
  218. #if NO_NACL_EM_INPUT
  219. /* Register an input controller for the keyboard */
  220. m_controller = new Controller("Default", MAX_KEYS, MAX_AXIS);
  221. if (InputDevice::Get(g_name_mouse.C()))
  222. {
  223. m_input_usage |= (1<<IPT_MV_MOUSE);
  224. m_controller->GetKey(MSE_CAM_ROT).BindMouse("Left");
  225. m_controller->GetKey(MSE_CAM_POS).BindMouse("Right");
  226. m_controller->GetKey(MSE_CAM_FOV).BindMouse("Middle");
  227. m_controller->GetKey(MSE_FOCUS).BindMouse("InScreen");
  228. m_controller->GetAxis(MSEX_CAM_Y).BindMouse("Y");
  229. m_controller->GetAxis(MSEX_CAM_X).BindMouse("X");
  230. }
  231. if (InputDevice::Get(g_name_keyboard.C()))
  232. {
  233. m_input_usage |= (1<<IPT_MV_KBOARD);
  234. //Camera keyboard rotation
  235. m_controller->GetKey(KEY_CAM_UP ).BindKeyboard("Up");
  236. m_controller->GetKey(KEY_CAM_DOWN ).BindKeyboard("Down");
  237. m_controller->GetKey(KEY_CAM_LEFT ).BindKeyboard("Left");
  238. m_controller->GetKey(KEY_CAM_RIGHT).BindKeyboard("Right");
  239. //Camera keyboard position switch
  240. m_controller->GetKey(KEY_CAM_POS ).BindKeyboard("LeftShift");
  241. m_controller->GetKey(KEY_CAM_FOV ).BindKeyboard("LeftCtrl");
  242. //Camera unzoom switch
  243. m_controller->GetKey(KEY_CAM_RESET).BindKeyboard("Space");
  244. //Mesh change
  245. m_controller->GetKey(KEY_MESH_NEXT).BindKeyboard("PageUp");
  246. m_controller->GetKey(KEY_MESH_PREV).BindKeyboard("PageDown");
  247. //Base setup
  248. m_controller->GetKey(KEY_F1).BindKeyboard("F1");
  249. m_controller->GetKey(KEY_F2).BindKeyboard("F2");
  250. m_controller->GetKey(KEY_F3).BindKeyboard("F3");
  251. m_controller->GetKey(KEY_F4).BindKeyboard("F4");
  252. m_controller->GetKey(KEY_F5).BindKeyboard("F5");
  253. m_controller->GetKey(KEY_ESC).BindKeyboard("Escape");
  254. }
  255. #endif //NO_NACL_EM_INPUT
  256. m_camera = new Camera();
  257. m_camera->SetView(vec3(0.f, 0.f, 10.f), vec3::zero, vec3::axis_y);
  258. m_camera->SetProjection(0.f, .0001f, 2000.f, WIDTH * SCREEN_W, RATIO_HW);
  259. m_camera->UseShift(true);
  260. g_scene->PushCamera(m_camera);
  261. //Lights setup
  262. m_ssetup = new SceneSetup();
  263. #if NO_SC_SETUP
  264. m_ssetup->m_lights << new Light();
  265. m_ssetup->m_lights.Last()->SetPosition(vec4(4.f, -1.f, -4.f, 0.f));
  266. m_ssetup->m_lights.Last()->SetColor(vec4(.0f, .2f, .5f, 1.f));
  267. Ticker::Ref(m_ssetup->m_lights.Last());
  268. m_ssetup->m_lights << new Light();
  269. m_ssetup->m_lights.Last()->SetPosition(vec4(8.f, 2.f, 6.f, 0.f));
  270. m_ssetup->m_lights.Last()->SetColor(vec4(1.f));
  271. Ticker::Ref(m_ssetup->m_lights.Last());
  272. EasyMesh* em = new EasyMesh();
  273. if (em->Compile("sc#fff ab 1"))
  274. {
  275. if (m_mesh_id == m_meshes.Count() - 1)
  276. m_mesh_id++;
  277. m_meshes.Push(em, nullptr);
  278. }
  279. #else
  280. //TOUKY CHANGE THAT
  281. /*
  282. m_ssetup->Compile("addlight 0.0 position (4 -1 -4) color (.0 .2 .5 1) "
  283. "addlight 0.0 position (8 2 6) color #ffff "
  284. "showgizmo true ");
  285. */
  286. m_ssetup->Startup();
  287. #endif //NO_SC_SETUP
  288. for (int i = 0; i < m_ssetup->m_lights.Count(); ++i)
  289. {
  290. m_light_datas << LightData(m_ssetup->m_lights[i]->GetPosition().xyz, m_ssetup->m_lights[i]->GetColor());
  291. m_ssetup->m_lights[i]->SetPosition(vec3::zero);
  292. m_ssetup->m_lights[i]->SetColor(vec4::zero);
  293. }
  294. }
  295. virtual void TickGame(float seconds)
  296. {
  297. WorldEntity::TickGame(seconds);
  298. if (!m_init && g_scene)
  299. {
  300. Init();
  301. return;
  302. }
  303. if (!m_init)
  304. return;
  305. m_first_tick = true;
  306. //TODO : This should probably be "standard LoL behaviour"
  307. #if NO_NACL_EM_INPUT
  308. {
  309. //Shutdown logic
  310. if (KeyReleased(KEY_ESC))
  311. Ticker::Shutdown();
  312. }
  313. #endif //NO_NACL_EM_INPUT
  314. //Compute render mesh count
  315. float a_j = lol::abs(m_render_max[1]);
  316. float i_m = m_hist_scale_mesh.x;
  317. float i_trans = a_j - ((a_j * a_j * i_m * i_m + a_j * i_m) * .5f);
  318. m_render_max[1] = a_j * ((RATIO_WH * 1.f) / ((i_trans != 0.f)?(i_trans):(RATIO_WH))) - RATIO_HW * .3f;
  319. //Mesh Change
  320. #if NO_NACL_EM_INPUT
  321. m_mesh_id = clamp(m_mesh_id + ((int)KeyPressed(KEY_MESH_PREV) - (int)KeyPressed(KEY_MESH_NEXT)), 0, (int)m_meshes.Count() - 1);
  322. #endif //NO_NACL_EM_INPUT
  323. m_mesh_id1 = damp(m_mesh_id1, (float)m_mesh_id, .2f, seconds);
  324. #if ALL_FEATURES
  325. //Update light position & damping
  326. for (int i = 0; i < m_ssetup->m_lights.Count(); ++i)
  327. {
  328. vec3 pos = (m_mat * inverse(m_mat_prev) * vec4(m_ssetup->m_lights[i]->GetPosition(), 1.f)).xyz;
  329. vec3 tgt = (m_mat * vec4(m_light_datas[i].m_pos, 1.f)).xyz;
  330. vec3 new_pos = damp(pos, tgt, .3f, seconds);
  331. vec4 new_col = damp(m_ssetup->m_lights[i]->GetColor(), m_light_datas[i].m_col, .3f, seconds);
  332. m_ssetup->m_lights[i]->SetPosition(new_pos);
  333. m_ssetup->m_lights[i]->SetColor(new_col);
  334. }
  335. //Camera update
  336. bool is_pos = false;
  337. bool is_fov = false;
  338. bool is_hsc = false;
  339. vec2 tmpv = vec2::zero;
  340. #if NO_NACL_EM_INPUT
  341. is_pos = KeyDown(KEY_CAM_POS) || KeyDown(MSE_CAM_POS);
  342. is_fov = KeyDown(KEY_CAM_FOV) || KeyDown(MSE_CAM_FOV);
  343. if (KeyDown(MSE_FOCUS) && (KeyDown(MSE_CAM_ROT) || KeyDown(MSE_CAM_POS) || KeyDown(MSE_CAM_FOV)))
  344. {
  345. tmpv += vec2(AxisValue(MSEX_CAM_Y), AxisValue(MSEX_CAM_X));
  346. if (KeyDown(MSE_CAM_ROT))
  347. tmpv *= vec2(1.f, 1.f) * 6.f;
  348. if (KeyDown(MSE_CAM_POS))
  349. tmpv *= vec2(1.f, -1.f) * 3.f;
  350. if (KeyDown(MSE_CAM_FOV))
  351. tmpv = vec2(tmpv.y * 4.f, tmpv.x * 6.f);
  352. }
  353. tmpv += vec2((float)KeyDown(KEY_CAM_UP ) - (float)KeyDown(KEY_CAM_DOWN),
  354. (float)KeyDown(KEY_CAM_RIGHT) - (float)KeyDown(KEY_CAM_LEFT));
  355. #endif //NO_NACL_EM_INPUT
  356. //Base data
  357. vec2 rot = (!is_pos && !is_fov)?(tmpv):(vec2(.0f)); rot = vec2(rot.x, -rot.y);
  358. vec2 pos = ( is_pos && !is_fov)?(tmpv):(vec2(.0f)); pos = -vec2(pos.y, pos.x);
  359. vec2 fov = (!is_pos && is_fov )?(tmpv):(vec2(.0f)); fov = vec2(-fov.x, fov.y);
  360. vec2 hsc = (is_hsc)?(vec2(0.f)):(vec2(0.f));
  361. //speed
  362. m_rot_speed = damp(m_rot_speed, rot * ROT_SPEED, .2f, seconds);
  363. float pos_factor = 1.f / (1.f + m_zoom_mesh * .5f);
  364. m_pos_speed = damp(m_pos_speed, pos * POS_SPEED * pos_factor, .2f, seconds);
  365. float fov_factor = 1.f + lol::pow((m_fov_mesh / FOV_CLAMP) * 1.f, 2.f);
  366. m_fov_speed = damp(m_fov_speed, fov.x * FOV_SPEED * fov_factor, .2f, seconds);
  367. float zom_factor = 1.f + lol::pow((m_zoom_mesh / ZOM_CLAMP) * 1.f, 2.f);
  368. m_zoom_speed = damp(m_zoom_speed, fov.y * ZOM_SPEED * zom_factor, .2f, seconds);
  369. m_hist_scale_speed = damp(m_hist_scale_speed, hsc * HST_SPEED, .2f, seconds);
  370. m_rot += m_rot_speed * seconds;
  371. #if NO_NACL_EM_INPUT
  372. if (m_reset_timer >= 0.f)
  373. m_reset_timer -= seconds;
  374. if (KeyPressed(KEY_CAM_RESET))
  375. {
  376. if (m_reset_timer >= 0.f)
  377. {
  378. m_pos = vec2(0.f);
  379. m_zoom = 0.f;
  380. }
  381. else
  382. m_reset_timer = RESET_TIMER;
  383. }
  384. //Transform update
  385. if (!KeyDown(KEY_CAM_RESET))
  386. {
  387. m_pos += m_pos_speed * seconds;
  388. m_fov += m_fov_speed * seconds;
  389. m_zoom += m_zoom_speed * seconds;
  390. m_hist_scale += m_hist_scale_speed * seconds;
  391. }
  392. #endif //NO_NACL_EM_INPUT
  393. //clamp
  394. vec2 rot_mesh = vec2(SmoothClamp(m_rot.x, -ROT_CLAMP, ROT_CLAMP, ROT_CLAMP * .1f), m_rot.y);
  395. vec2 pos_mesh = vec2(SmoothClamp(m_pos.x, -POS_CLAMP, POS_CLAMP, POS_CLAMP * .1f),
  396. SmoothClamp(m_pos.y, -POS_CLAMP, POS_CLAMP, POS_CLAMP * .1f));
  397. float fov_mesh = SmoothClamp(m_fov, 0.f, FOV_CLAMP, FOV_CLAMP * .1f);
  398. float zoom_mesh = SmoothClamp(m_zoom, -ZOM_CLAMP, ZOM_CLAMP, ZOM_CLAMP * .1f);
  399. vec2 hist_scale_mesh = vec2(SmoothClamp(m_hist_scale.x, 0.f, HST_CLAMP, HST_CLAMP * .1f),
  400. SmoothClamp(m_hist_scale.y, 0.f, HST_CLAMP, HST_CLAMP * .1f));
  401. #if NO_NACL_EM_INPUT
  402. if (KeyDown(KEY_CAM_RESET) && m_reset_timer < 0.f)
  403. {
  404. pos_mesh = vec2::zero;
  405. zoom_mesh = 0.f;
  406. }
  407. #endif //NO_NACL_EM_INPUT
  408. m_rot_mesh = vec2(damp(m_rot_mesh.x, rot_mesh.x, .2f, seconds), damp(m_rot_mesh.y, rot_mesh.y, .2f, seconds));
  409. m_pos_mesh = vec2(damp(m_pos_mesh.x, pos_mesh.x, .2f, seconds), damp(m_pos_mesh.y, pos_mesh.y, .2f, seconds));
  410. m_fov_mesh = damp(m_fov_mesh, fov_mesh, .2f, seconds);
  411. m_zoom_mesh = damp(m_zoom_mesh, zoom_mesh, .2f, seconds);
  412. m_hist_scale_mesh = damp(m_hist_scale_mesh, hist_scale_mesh, .2f, seconds);
  413. //Mesh mat calculation
  414. m_mat_prev = m_mat;
  415. m_mat = mat4::translate(vec3(0.f));
  416. //Target List Setup
  417. TargetCamera tc;
  418. if (m_meshes.Count() && m_mesh_id >= 0)
  419. for (int i = 0; i < m_meshes[m_mesh_id].m1->GetVertexCount(); i++)
  420. tc.AddTarget((m_mat * mat4::translate(m_meshes[m_mesh_id].m1->GetVertexLocation(i)))[3].xyz);
  421. tc.AddTarget(box3(vec3(0.f), vec3(1.f)));
  422. for (int k = 0; k < m_ssetup->m_lights.Count() && m_ssetup->m_show_lights; ++k)
  423. {
  424. vec3 light_pos = m_ssetup->m_lights[k]->GetPosition();
  425. mat4 world_cam = m_camera->GetView();
  426. light_pos = (inverse(world_cam) * vec4((world_cam * vec4(light_pos, 1.0f)).xyz * vec3::axis_z, 1.0f)).xyz;
  427. tc.AddTarget(box3(vec3(-1.f), vec3(1.f)) + light_pos *
  428. ((m_ssetup->m_lights[k]->GetType() == LightType::Directional)?(-1.f):(1.f)));
  429. }
  430. //--
  431. //Update mesh screen location - Get the Min/Max needed
  432. //--
  433. vec2 cam_center(0.f);
  434. float cam_factor = .0f;
  435. vec3 local_min_max[2] = { vec3(FLT_MAX), vec3(-FLT_MAX) };
  436. vec2 screen_min_max[2] = { vec2(FLT_MAX), vec2(-FLT_MAX) };
  437. mat4 world_cam = m_camera->GetView();
  438. mat4 cam_screen = m_camera->GetProjection();
  439. //target on-screen computation
  440. for (int i = 0; i < tc.m_targets.Count(); i++)
  441. {
  442. vec3 obj_loc = tc.m_targets[i];
  443. {
  444. //Debug::DrawBox(obj_loc - vec3(4.f), obj_loc + vec3(4.f), vec4(1.f, 0.f, 0.f, 1.f));
  445. mat4 target_mx = mat4::translate(obj_loc);
  446. vec3 vpos;
  447. //Get location in cam coordinates
  448. target_mx = world_cam * target_mx;
  449. vpos = target_mx[3].xyz;
  450. local_min_max[0] = min(vpos.xyz, local_min_max[0]);
  451. local_min_max[1] = max(vpos.xyz, local_min_max[1]);
  452. //Get location in screen coordinates
  453. target_mx = cam_screen * target_mx;
  454. vpos = (target_mx[3] / target_mx[3].w).xyz;
  455. screen_min_max[0] = min(screen_min_max[0], vpos.xy * vec2(RATIO_WH, 1.f));
  456. screen_min_max[1] = max(screen_min_max[1], vpos.xy * vec2(RATIO_WH, 1.f));
  457. //Build Barycenter
  458. cam_center += vpos.xy;
  459. cam_factor += 1.f;
  460. }
  461. }
  462. float screen_ratio = max(max(lol::abs(screen_min_max[0].x), lol::abs(screen_min_max[0].y)),
  463. max(lol::abs(screen_min_max[1].x), lol::abs(screen_min_max[1].y)));
  464. float z_dist = //m_camera->m_target_distance
  465. length(m_camera->m_position)
  466. + max(local_min_max[0].z, local_min_max[1].z);
  467. vec2 screen_offset = vec2(0.f, -(screen_min_max[1].y + screen_min_max[0].y) * .5f);
  468. m_screen_offset = damp(m_screen_offset, screen_offset, .9f, seconds);
  469. float forced_zoom = m_zoom_mesh;
  470. if (cam_factor > 0.f)
  471. {
  472. vec2 old_sscale = m_camera->GetScreenScale();
  473. float old_ssize = m_camera->GetScreenSize();
  474. float zoom_in = 1.f + lol::max(0.f, forced_zoom);
  475. float zoom_out = 1.f + lol::max(0.f, -forced_zoom);
  476. m_camera->SetScreenScale(max(vec2(0.001f), ((old_sscale * zoom_in) / (screen_ratio * zoom_out * SCREEN_LIMIT))));
  477. m_camera->SetFov(m_fov_mesh);
  478. m_camera->SetScreenInfos(damp(old_ssize, max(1.f, screen_ratio * zoom_out), 1.2f, seconds));
  479. vec3 posz = ((mat4::rotate(m_rot_mesh.y, vec3::axis_y) * mat4::rotate(-m_rot_mesh.x, vec3::axis_x) * vec4::axis_z)).xyz;
  480. vec3 newpos = posz * damp(length(m_camera->m_position), z_dist * 1.2f, .1f, seconds);
  481. m_camera->SetView(newpos, vec3(0.f), vec3::axis_y);
  482. }
  483. //--
  484. //Message Service
  485. //--
  486. String mesh("");
  487. int u = 1;
  488. while (u-- > 0 && MessageService::FetchFirst(MessageBucket::AppIn, mesh))
  489. {
  490. int o = 1;
  491. while (o-- > 0)
  492. {
  493. SceneSetup* new_ssetup = new SceneSetup();
  494. if (false) //new_ssetup->Compile(mesh.C()) && new_ssetup->m_lights.Count())
  495. {
  496. //Store current light datas, in World
  497. array<LightData> light_datas;
  498. for (int i = 0; i < m_ssetup->m_lights.Count(); ++i)
  499. light_datas << LightData(m_ssetup->m_lights[i]->GetPosition(), m_ssetup->m_lights[i]->GetColor());
  500. if (m_ssetup)
  501. delete m_ssetup;
  502. m_ssetup = new_ssetup;
  503. m_ssetup->Startup();
  504. //Restore all light datas so blend can occur
  505. mat4 light_mat = m_mat * inverse(mat4(quat::fromeuler_xyz(vec3::zero)));
  506. for (int i = 0; i < m_ssetup->m_lights.Count(); ++i)
  507. {
  508. //Store local dst in current m_ld
  509. LightData ltmp = LightData(m_ssetup->m_lights[i]->GetPosition(), m_ssetup->m_lights[i]->GetColor());
  510. if (i < m_light_datas.Count())
  511. m_light_datas[i] = ltmp;
  512. else
  513. m_light_datas << ltmp;
  514. vec3 loc = vec3::zero;
  515. vec4 col = vec4::zero;
  516. if (i < light_datas.Count())
  517. {
  518. loc = light_datas[i].m_pos;
  519. col = light_datas[i].m_col;
  520. }
  521. //Restore old light datas in new lights
  522. m_ssetup->m_lights[i]->SetPosition(loc);
  523. m_ssetup->m_lights[i]->SetColor(col);
  524. }
  525. }
  526. else
  527. {
  528. m_ssetup->m_custom_cmd += new_ssetup->m_custom_cmd;
  529. delete new_ssetup;
  530. }
  531. }
  532. }
  533. //Check the custom cmd even if we don't have new messages.
  534. int o = 1;
  535. while (o-- > 0)
  536. {
  537. for (int i = 0; m_ssetup && i < m_ssetup->m_custom_cmd.Count(); ++i)
  538. {
  539. if (m_ssetup->m_custom_cmd[i].m1 == "setmesh")
  540. {
  541. //Create a new mesh
  542. EasyMesh* em = new EasyMesh();
  543. if (em->Compile(m_ssetup->m_custom_cmd[i].m2.C(), false))
  544. {
  545. em->BD()->Cmdi() = 0;
  546. if (m_mesh_id == m_meshes.Count() - 1)
  547. m_mesh_id++;
  548. m_meshes.Push(em, nullptr);
  549. }
  550. else
  551. delete em;
  552. }
  553. }
  554. }
  555. m_ssetup->m_custom_cmd.Empty();
  556. #endif //ALL_FEATURES
  557. #if NACL_EM
  558. /*
  559. if (m_stream_update_time > .0f)
  560. {
  561. m_stream_update_time = -1.f;
  562. MessageService::Send(MessageBucket::AppIn,
  563. " addlight 0.0 position (4 -1 -4) color (.0 .2 .5 1) \
  564. addlight 0.0 position (8 2 6) color #ffff \
  565. custom setmesh \"[sc#f8f ab 1]\"");
  566. // MessageService::Send(MessageBucket::AppIn, "[sc#f8f ab 1]");
  567. // MessageService::Send(MessageBucket::AppIn, "[sc#f8f ab 1 splt 4 twy 90]");
  568. // MessageService::Send(MessageBucket::AppIn, "[sc#8ff afcb 1 1 1 0]");
  569. // MessageService::Send(MessageBucket::AppIn, "[sc#ff8 afcb 1 1 1 0]");
  570. }
  571. */
  572. #elif defined(_WIN32)
  573. //--
  574. //File management
  575. //--
  576. m_stream_update_time += seconds;
  577. if (m_stream_update_time > m_stream_update_timer)
  578. {
  579. m_stream_update_time = 0.f;
  580. File f;
  581. f.Open(m_file_name.C(), FileAccess::Read);
  582. String cmd = f.ReadString();
  583. f.Close();
  584. if (cmd.Count()
  585. && (!m_cmdlist.Count() || cmd != m_cmdlist.Last()))
  586. {
  587. m_cmdlist << cmd;
  588. MessageService::Send(MessageBucket::AppIn, cmd);
  589. }
  590. }
  591. #endif //WINDOWS
  592. }
  593. virtual void TickDraw(float seconds, Scene &scene)
  594. {
  595. WorldEntity::TickDraw(seconds, scene);
  596. if (!m_init || !m_first_tick)
  597. return;
  598. //TODO : This should probably be "standard LoL behaviour"
  599. #if NO_NACL_EM_INPUT
  600. {
  601. if (KeyReleased(KEY_F2))
  602. Video::SetDebugRenderMode((Video::GetDebugRenderMode() + 1) % DebugRenderMode::Max);
  603. else if (KeyReleased(KEY_F1))
  604. Video::SetDebugRenderMode((Video::GetDebugRenderMode() + DebugRenderMode::Max - 1) % DebugRenderMode::Max);
  605. }
  606. #endif //NO_NACL_EM_INPUT
  607. #if NO_NACL_EM && WITH_TEXTURE
  608. if (!m_default_texture)
  609. {
  610. m_texture_shader = Shader::Create(LOLFX_RESOURCE_NAME(shinymvtexture));
  611. m_texture_uni = m_texture_shader->GetUniformLocation("u_Texture");
  612. m_default_texture = Tiler::Register("data/test-texture.png", ivec2::zero, ivec2(0,1));
  613. }
  614. else if (m_texture && m_default_texture)
  615. m_texture_shader->SetUniform(m_texture_uni, m_default_texture->GetTexture(), 0);
  616. #endif //NO_NACL_EM
  617. g_renderer->SetClearColor(m_ssetup->m_clear_color);
  618. for (int i = 0; i < m_gizmos.Count(); ++i)
  619. {
  620. if (m_gizmos[i]->GetMeshState() == MeshRender::NeedConvert)
  621. m_gizmos[i]->MeshConvert();
  622. else
  623. break;
  624. }
  625. if (m_build_timer > .0f)
  626. {
  627. if (m_build_time < .0f)
  628. {
  629. m_build_time = m_build_timer;
  630. for (int i = 0; i < m_meshes.Count(); ++i)
  631. {
  632. if (m_meshes[i].m1 && m_meshes[i].m1->BD()->Cmdi() < m_meshes[i].m1->BD()->CmdStack().GetCmdNb())
  633. {
  634. EasyMesh* tmp = m_meshes[i].m1;
  635. EasyMesh* newtmp = new EasyMesh(*tmp);
  636. int ii = 1;
  637. #if 1
  638. bool stop = false;
  639. while (!stop)
  640. {
  641. int cmdi = newtmp->BD()->Cmdi() + ii;
  642. if (cmdi < newtmp->BD()->CmdStack().GetCmdNb())
  643. {
  644. switch (newtmp->BD()->CmdStack().GetCmd(cmdi))
  645. {
  646. case EasyMeshCmdType::LoopStart:
  647. case EasyMeshCmdType::LoopEnd:
  648. case EasyMeshCmdType::OpenBrace:
  649. case EasyMeshCmdType::CloseBrace:
  650. case EasyMeshCmdType::ScaleWinding:
  651. case EasyMeshCmdType::QuadWeighting:
  652. case EasyMeshCmdType::PostBuildNormal:
  653. case EasyMeshCmdType::PreventVertCleanup:
  654. case EasyMeshCmdType::SetColorA:
  655. case EasyMeshCmdType::SetColorB:
  656. {
  657. ii++;
  658. break;
  659. }
  660. default:
  661. {
  662. stop = true;
  663. break;
  664. }
  665. }
  666. }
  667. else
  668. stop = true;
  669. }
  670. #endif
  671. newtmp->BD()->CmdExecNb() = ii;
  672. newtmp->ExecuteCmdStack(false);
  673. m_meshes[i].m1 = newtmp;
  674. delete tmp;
  675. }
  676. }
  677. }
  678. m_build_time -= seconds;
  679. }
  680. #define NORMAL_USAGE 1
  681. #if NORMAL_USAGE
  682. vec3 x = vec3(1.f,0.f,0.f);
  683. vec3 y = vec3(0.f,1.f,0.f);
  684. mat4 save_proj = m_camera->GetProjection();
  685. //Y object Offset
  686. mat4 mat_obj_offset = mat4::translate(x * m_screen_offset.x + y * m_screen_offset.y) *
  687. //Mesh Pos Offset
  688. mat4::translate((x * m_pos_mesh.x * RATIO_HW + y * m_pos_mesh.y) * 2.f * (1.f + .5f * m_zoom_mesh / SCREEN_LIMIT));
  689. //Align right meshes
  690. mat4 mat_align = mat4::translate(x - x * RATIO_HW);
  691. mat4 mat_gizmo = mat_obj_offset * mat_align * save_proj;
  692. for (int i = 0; i < m_meshes.Count(); i++)
  693. {
  694. {
  695. if (m_meshes[i].m1->GetMeshState() == MeshRender::NeedConvert)
  696. {
  697. #if WITH_TEXTURE
  698. m_meshes[i].m1->MeshConvert(new DefaultShaderData(((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) |
  699. (1 << VertexUsage::Color) | (1 << VertexUsage::TexCoord)),
  700. m_texture_shader, true));
  701. #else
  702. m_meshes[i].m1->MeshConvert();
  703. #endif //WITH_TEXTURE
  704. }
  705. #if ALL_FEATURES
  706. float j = -(float)(m_meshes.Count() - (i + 1)) + (-m_mesh_id1 + (float)(m_meshes.Count() - 1));
  707. if (m_mesh_id1 - m_render_max[0] > (float)i && m_mesh_id1 - m_render_max[1] < (float)i &&
  708. m_meshes[i].m1->GetMeshState() > MeshRender::NeedConvert)
  709. {
  710. float a_j = lol::abs(j);
  711. float i_trans = (a_j * a_j * m_hist_scale_mesh.x + a_j * m_hist_scale_mesh.x) * .5f;
  712. float i_scale = clamp(1.f - (m_hist_scale_mesh.y * (m_mesh_id1 - (float)i)), 0.f, 1.f);
  713. //Mesh count offset
  714. mat4 mat_count_offset = mat4::translate(x * RATIO_HW * 2.f * (j + i_trans));
  715. //Mesh count scale
  716. mat4 mat_count_scale = mat4::scale(vec3(vec2(i_scale), 1.f));
  717. //Camera projection
  718. mat4 new_proj = mat_obj_offset * mat_count_offset * mat_align * mat_count_scale * save_proj;
  719. m_camera->SetProjection(new_proj);
  720. scene.AddPrimitive(*m_meshes[i].m1, m_mat);
  721. g_renderer->Clear(ClearMask::Depth);
  722. }
  723. m_camera->SetProjection(save_proj);
  724. #else
  725. scene.AddPrimitive(*m_meshes[i].m1, m_mat);
  726. #endif //ALL_FEATURES
  727. }
  728. }
  729. //Scene setup update
  730. if (m_ssetup)
  731. {
  732. m_camera->SetProjection(mat_gizmo);
  733. if (m_ssetup->m_show_gizmo)
  734. scene.AddPrimitive(*m_gizmos[GZ_Editor], m_mat);
  735. if (m_ssetup->m_show_lights)
  736. {
  737. for (int k = 0; k < m_ssetup->m_lights.Count(); ++k)
  738. {
  739. Light* ltmp = m_ssetup->m_lights[k];
  740. mat4 world = mat4::translate(ltmp->GetPosition());
  741. mat4 local = mat4::translate((inverse(m_mat) * world)[3].xyz);
  742. //dir light
  743. if (ltmp->GetType() == LightType::Directional)
  744. {
  745. scene.AddPrimitive(*m_gizmos[GZ_LightPos], m_mat * inverse(local));
  746. scene.AddPrimitive(*m_gizmos[GZ_LightDir], inverse(world) * inverse(mat4::lookat(vec3::zero, -ltmp->GetPosition(), vec3::axis_y)));
  747. }
  748. else //point light
  749. {
  750. scene.AddPrimitive(*m_gizmos[GZ_LightPos], m_mat * local);
  751. }
  752. }
  753. }
  754. m_camera->SetProjection(save_proj);
  755. }
  756. #endif //NORMAL_USAGE
  757. #if 0 //Debug normal draw
  758. for (int i = m_meshes.Count() - 1; 0 <= i && i < m_meshes.Count(); i++)
  759. {
  760. for (int j = 0; j < m_meshes[i].m1->m_indices.Count(); j += 3)
  761. {
  762. VertexData v[3] = { m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j ]],
  763. m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j+1]],
  764. m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j+2]]
  765. };
  766. for (int k = 0; k < 3; k++)
  767. Debug::DrawLine((m_mat * mat4::translate(v[k].m_coord))[3].xyz,
  768. (m_mat * mat4::translate(v[(k+1)%3].m_coord))[3].xyz, vec4(vec3((v[k].m_coord.z + 1.f)*.5f),1.f));
  769. }
  770. for (int j = 0; j < m_meshes[i].m1->m_vert.Count(); j++)
  771. {
  772. VertexData &v = m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j]];
  773. Debug::DrawLine((m_mat * mat4::translate(v.m_coord))[3].xyz,
  774. (m_mat * mat4::translate(v.m_coord))[3].xyz +
  775. (m_mat * vec4(v.m_normal * 5.f, 0.f)).xyz, vec4(lol::abs(v.m_normal), 1.f));
  776. }
  777. }
  778. #endif
  779. }
  780. private:
  781. SceneSetup* m_ssetup;
  782. SceneSetupLuaLoader m_setup_loader;
  783. array<LightData> m_light_datas;
  784. Controller* m_controller;
  785. short m_input_usage;
  786. mat4 m_mat;
  787. mat4 m_mat_prev;
  788. bool m_init;
  789. bool m_first_tick;
  790. //Camera Setup
  791. Camera * m_camera;
  792. float m_reset_timer;
  793. float m_fov;
  794. float m_fov_mesh;
  795. float m_fov_speed;
  796. float m_zoom;
  797. float m_zoom_mesh;
  798. float m_zoom_speed;
  799. vec2 m_rot;
  800. vec2 m_rot_mesh;
  801. vec2 m_rot_speed;
  802. vec2 m_pos;
  803. vec2 m_pos_mesh;
  804. vec2 m_pos_speed;
  805. vec2 m_hist_scale;
  806. vec2 m_hist_scale_mesh;
  807. vec2 m_hist_scale_speed;
  808. vec2 m_screen_offset;
  809. //Mesh update timer
  810. float m_build_timer;
  811. float m_build_time;
  812. //Mesh infos
  813. vec2 m_render_max;
  814. int m_mesh_render;
  815. int m_mesh_id;
  816. float m_mesh_id1;
  817. array<EasyMesh*, EasyMesh*> m_meshes;
  818. array<EasyMesh*> m_gizmos;
  819. //File data
  820. String m_file_name;
  821. array<String> m_cmdlist;
  822. float m_stream_update_time;
  823. float m_stream_update_timer;
  824. //misc datas
  825. Shader * m_texture_shader;
  826. TileSet * m_default_texture;
  827. Texture * m_texture;
  828. ShaderUniform m_texture_uni;
  829. };
  830. //The basic main :
  831. int main(int argc, char **argv)
  832. {
  833. System::Init(argc, argv);
  834. Application app("MeshViewer", ivec2((int)DEFAULT_WIDTH, (int)DEFAULT_HEIGHT), 60.0f);
  835. if (argc > 1)
  836. new MeshViewer(argv[1]);
  837. else
  838. new MeshViewer();
  839. app.Run();
  840. return EXIT_SUCCESS;
  841. }