您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

345 行
7.9 KiB

  1. //
  2. // Lol Engine — EasyMesh tutorial
  3. //
  4. // Copyright © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com>
  5. // © 2012—2018 Sam Hocevar <sam@hocevar.net>
  6. //
  7. // Lol Engine is free software. It comes without any warranty, to
  8. // the extent permitted by applicable law. You can redistribute it
  9. // and/or modify it under the terms of the Do What the Fuck You Want
  10. // to Public License, Version 2, as published by the WTFPL Task Force.
  11. // See http://www.wtfpl.net/ for more details.
  12. //
  13. #pragma once
  14. #include <string>
  15. #include <map>
  16. namespace lol
  17. {
  18. enum
  19. {
  20. IPT_MV_KBOARD = 0,
  21. IPT_MV_MOUSE,
  22. INPUT_MAX
  23. };
  24. enum MVKeyboardList
  25. {
  26. KEY_CAM_RESET = 0,
  27. KEY_CAM_POS,
  28. KEY_CAM_FOV,
  29. KEY_CAM_UP,
  30. KEY_CAM_DOWN,
  31. KEY_CAM_LEFT,
  32. KEY_CAM_RIGHT,
  33. KEY_MESH_NEXT,
  34. KEY_MESH_PREV,
  35. KEY_F1,
  36. KEY_F2,
  37. KEY_F3,
  38. KEY_F4,
  39. KEY_F5,
  40. KEY_ESC,
  41. KEY_MAX
  42. };
  43. enum MVMouseKeyList
  44. {
  45. MSE_CAM_ROT = KEY_MAX,
  46. MSE_CAM_POS,
  47. MSE_CAM_FOV,
  48. MSE_FOCUS,
  49. MSE_MAX
  50. };
  51. enum MVMouseAxisList
  52. {
  53. MSEX_CAM_Y = 0,
  54. MSEX_CAM_X,
  55. MSEX_MAX
  56. };
  57. #define MAX_KEYS MSE_MAX
  58. #define MAX_AXIS MSEX_MAX
  59. //MeshViewerInput ---------------------------------------------------------
  60. struct MeshViewerKeyInputBase : public StructSafeEnum
  61. {
  62. enum Type
  63. {
  64. KBD_BEG = 0,
  65. Exit = KBD_BEG,
  66. KBD_END,
  67. MSE_BEG = KBD_END,
  68. LeftClick = MSE_BEG,
  69. RightClick,
  70. MiddleClick,
  71. Focus,
  72. MSE_END,
  73. MAX = MSE_END,
  74. };
  75. protected:
  76. virtual bool BuildEnumMap(std::map<int64_t, std::string>& enum_map)
  77. {
  78. enum_map[Exit] = g_name_key_Escape;
  79. enum_map[LeftClick] = g_name_mouse_key_left;
  80. enum_map[RightClick] = g_name_mouse_key_right;
  81. enum_map[MiddleClick] = g_name_mouse_key_middle;
  82. enum_map[Focus] = g_name_mouse_key_in_screen;
  83. return true;
  84. }
  85. };
  86. typedef SafeEnum<MeshViewerKeyInputBase> MeshViewerKeyInput;
  87. #define ALL_FEATURES 1
  88. #define NO_SC_SETUP 0
  89. enum GizmoType
  90. {
  91. GZ_Editor = 0,
  92. GZ_LightPos,
  93. GZ_LightDir,
  94. GZ_MAX
  95. };
  96. struct LightData
  97. {
  98. LightData(vec3 pos, vec4 col)
  99. {
  100. m_pos = pos;
  101. m_col = col;
  102. }
  103. vec3 m_pos;
  104. vec4 m_col;
  105. };
  106. //ViewerObject ----------------------------------------------------------------
  107. class ViewerObject
  108. {
  109. public:
  110. ViewerObject() { }
  111. ViewerObject(std::string const& name) : m_name(name) { }
  112. virtual ~ViewerObject() { }
  113. virtual void tick_draw(float seconds, Scene &scene) { }
  114. std::string GetName() { return m_name; }
  115. protected:
  116. std::string m_name;
  117. };
  118. //EasyMeshViewerObject --------------------------------------------------------
  119. class EasyMeshViewerObject : public ViewerObject
  120. {
  121. typedef ViewerObject super;
  122. public:
  123. EasyMeshViewerObject()
  124. : ViewerObject() { }
  125. EasyMeshViewerObject(std::string const& name, EasyMesh const& mesh)
  126. : ViewerObject(name)
  127. {
  128. Init(name, mesh);
  129. }
  130. virtual ~EasyMeshViewerObject() { }
  131. virtual void tick_draw(float seconds, Scene &scene);
  132. void Init(std::string const& name, EasyMesh const& mesh)
  133. {
  134. m_name = name;
  135. m_mesh = mesh;
  136. }
  137. protected:
  138. EasyMesh m_mesh;
  139. };
  140. //MeshViewerLoadJob -----------------------------------------------------------
  141. class MeshViewerLoadJob : public ThreadJob
  142. {
  143. friend class BaseThreadManager;
  144. typedef ThreadJob super;
  145. public:
  146. inline MeshViewerLoadJob() : ThreadJob() { }
  147. inline MeshViewerLoadJob(std::string const& path)
  148. : ThreadJob(ThreadJobType::WORK_TODO), m_path(path) { }
  149. virtual ~MeshViewerLoadJob() { }
  150. virtual void RetrieveResult(class MeshViewer* app) { }
  151. protected:
  152. virtual bool DoWork() { return super::DoWork(); }
  153. protected:
  154. std::string m_path;
  155. };
  156. //EasyMeshLoadJob -------------------------------------------------------------
  157. class EasyMeshLoadJob : public MeshViewerLoadJob
  158. {
  159. friend class BaseThreadManager;
  160. typedef EasyMeshLoadJob super;
  161. public:
  162. inline EasyMeshLoadJob() : MeshViewerLoadJob() { }
  163. inline EasyMeshLoadJob(std::string const& path)
  164. : MeshViewerLoadJob(path) { }
  165. virtual ~EasyMeshLoadJob() { }
  166. static MeshViewerLoadJob* GetInstance(std::string const& path);
  167. virtual void RetrieveResult(class MeshViewer* app);
  168. protected:
  169. static bool Check(std::string const& path) { return path.find(".easymesh") != std::string::npos; }
  170. virtual bool DoWork();
  171. protected:
  172. EasyMeshLuaLoader m_loader;
  173. array<EasyMeshViewerObject*> m_meshes;
  174. };
  175. //MeshViewer ------------------------------------------------------------------
  176. class MeshViewer : public WorldEntity
  177. {
  178. typedef WorldEntity super;
  179. public:
  180. MeshViewer(char const *file_name = "../data/meshviewer.easymesh.lua");
  181. ~MeshViewer();
  182. void Start();
  183. void Stop();
  184. void UpdateSceneSetup(bool only_destroy = false);
  185. MeshViewerLoadJob* GetLoadJob(std::string const& path);
  186. void AddViewerObj(ViewerObject* obj) { m_objs << obj; }
  187. virtual void tick_game(float seconds);
  188. virtual void tick_draw(float seconds, Scene &scene);
  189. bool KeyReleased(MVKeyboardList index);
  190. bool KeyPressed(MVKeyboardList index);
  191. bool KeyDown(MVKeyboardList index);
  192. bool KeyReleased(MVMouseKeyList index);
  193. bool KeyPressed(MVMouseKeyList index);
  194. bool KeyDown(MVMouseKeyList index);
  195. float AxisValue(MVMouseAxisList index);
  196. void Prepare();
  197. void Unprepare();
  198. void Update(float seconds);
  199. void Draw(float seconds, Scene &scene);
  200. private:
  201. //Main stuff --------------------------------------------------------------
  202. bool m_init = false;
  203. bool m_first_tick = false;
  204. InputProfile m_profile;
  205. Camera* m_camera = nullptr;
  206. Text* m_text = nullptr;
  207. //ImGui stuff
  208. bool m_menu_cam_useage = true;
  209. float m_menu_cam_fov = radians(40.f);
  210. vec3 m_menu_cam_pos = vec3(20.f, 45.f, 45.f);
  211. int m_menu_mesh_idx = 0;
  212. array<char const *> m_menu_mesh_names_char;
  213. array<std::string> m_menu_mesh_names_str;
  214. //Scene setup data
  215. SceneSetupLuaLoader m_ssetup_loader;
  216. FileUpdateStatus *m_ssetup_file_status = nullptr;
  217. std::string m_ssetup_file_name;
  218. std::string m_ssetup_name;
  219. std::map<std::string, SceneSetup*> m_ssetups;
  220. //File data
  221. std::string m_file_name;
  222. FileUpdateStatus* m_file_status;
  223. //Object data
  224. array<ViewerObject*> m_objs;
  225. //Entities listing
  226. array<Entity*> m_entities;
  227. //Input
  228. Controller* m_controller = nullptr;
  229. //Thread stuff
  230. FileUpdateTester* m_file_check = nullptr;
  231. DefaultThreadManager* m_file_loader = nullptr;
  232. //OLD ---------------------------------------------------------------------
  233. SceneSetup *m_ssetup = nullptr;
  234. array<LightData> m_light_datas;
  235. short m_input_usage;
  236. mat4 m_mat;
  237. mat4 m_mat_prev;
  238. //Camera Setup
  239. float m_reset_timer;
  240. float m_fov;
  241. float m_fov_mesh;
  242. float m_fov_speed;
  243. float m_zoom;
  244. float m_zoom_mesh;
  245. float m_zoom_speed;
  246. vec2 m_rot;
  247. vec2 m_rot_mesh;
  248. vec2 m_rot_speed;
  249. vec2 m_pos;
  250. vec2 m_pos_mesh;
  251. vec2 m_pos_speed;
  252. vec2 m_hist_scale;
  253. vec2 m_hist_scale_mesh;
  254. vec2 m_hist_scale_speed;
  255. vec2 m_screen_offset;
  256. //Mesh update timer
  257. float m_build_timer;
  258. float m_build_time;
  259. //Mesh infos
  260. vec2 m_render_max;
  261. int m_mesh_render;
  262. int m_mesh_id;
  263. float m_mesh_id1;
  264. array<EasyMesh*, EasyMesh*> m_meshes;
  265. array<EasyMesh*> m_gizmos;
  266. //File data
  267. array<std::string> m_cmdlist;
  268. float m_stream_update_time;
  269. float m_stream_update_timer;
  270. //misc datas
  271. Shader * m_texture_shader;
  272. TileSet * m_default_texture;
  273. Texture * m_texture;
  274. ShaderUniform m_texture_uni;
  275. };
  276. } /* namespace lol */