diff --git a/doc/samples/meshviewer/meshviewer.h b/doc/samples/meshviewer/meshviewer.h new file mode 100644 index 00000000..da39b1bc --- /dev/null +++ b/doc/samples/meshviewer/meshviewer.h @@ -0,0 +1,311 @@ +// +// Copyright © 2009-2015 Benjamin "Touky" Huet +// +// This program is free software. It comes without any warranty, to +// the extent permitted by applicable law. You can redistribute it +// and/or modify it under the terms of the Do What the Fuck You Want +// to Public License, Version 2, as published by the WTFPL Task Force. +// See http://www.wtfpl.net/ for more details. +// + +#pragma once + +namespace lol +{ + +enum +{ + IPT_MV_KBOARD = 0, + IPT_MV_MOUSE, + + INPUT_MAX +}; + +enum MVKeyboardList +{ + KEY_CAM_RESET = 0, + KEY_CAM_POS, + KEY_CAM_FOV, + + KEY_CAM_UP, + KEY_CAM_DOWN, + KEY_CAM_LEFT, + KEY_CAM_RIGHT, + + KEY_MESH_NEXT, + KEY_MESH_PREV, + + KEY_F1, + KEY_F2, + KEY_F3, + KEY_F4, + KEY_F5, + KEY_ESC, + + KEY_MAX +}; + +enum MVMouseKeyList +{ + MSE_CAM_ROT = KEY_MAX, + MSE_CAM_POS, + MSE_CAM_FOV, + MSE_FOCUS, + + MSE_MAX +}; + +enum MVMouseAxisList +{ + MSEX_CAM_Y = 0, + MSEX_CAM_X, + + MSEX_MAX +}; +#define MAX_KEYS MSE_MAX +#define MAX_AXIS MSEX_MAX + +//MeshViewerInput --------------------------------------------------------- +struct MeshViewerKeyInputBase : public StructSafeEnum +{ + enum Type + { + KBD_BEG = 0, + + Exit = KBD_BEG, + + KBD_END, + + MSE_BEG = KBD_END, + + LeftClick = MSE_BEG, + RightClick, + MiddleClick, + Focus, + + MSE_END, + + MAX = MSE_END, + }; +protected: + virtual bool BuildEnumMap(map& enum_map) + { + enum_map[Exit] = g_name_key_Escape; + + enum_map[LeftClick] = g_name_mouse_key_left; + enum_map[RightClick] = g_name_mouse_key_right; + enum_map[MiddleClick] = g_name_mouse_key_middle; + enum_map[Focus] = g_name_mouse_key_in_screen; + + return true; + } +}; +typedef SafeEnum MeshViewerKeyInput; + +#define ALL_FEATURES 1 +#define NO_SC_SETUP 0 + +enum GizmoType +{ + GZ_Editor = 0, + GZ_LightPos, + GZ_LightDir, + + GZ_MAX +}; + +struct LightData +{ + LightData(vec3 pos, vec4 col) + { + m_pos = pos; + m_col = col; + } + + vec3 m_pos; + vec4 m_col; +}; + +//ViewerObject ---------------------------------------------------------------- +class ViewerObject +{ +public: + ViewerObject() { } + virtual ~ViewerObject() { } + +protected: +}; + +//EasyMeshViewerObject -------------------------------------------------------- +class EasyMeshViewerObject : public ViewerObject +{ +public: + EasyMeshViewerObject() + : ViewerObject() { } + EasyMeshViewerObject(EasyMesh const& mesh) + : EasyMeshViewerObject() + { + Init(mesh); + } + virtual ~EasyMeshViewerObject() { } + + void Init(EasyMesh const& mesh) + { + m_mesh = mesh; + } + +protected: + EasyMesh m_mesh; +}; + +//MeshViewerLoadJob ----------------------------------------------------------- +class MeshViewerLoadJob : public ThreadJob +{ + friend class BaseThreadManager; + typedef ThreadJob super; + +public: + inline MeshViewerLoadJob() : ThreadJob() { } + inline MeshViewerLoadJob(String const& path) + : ThreadJob(ThreadJobType::WORK_TODO), m_path(path) { } + virtual ~MeshViewerLoadJob() { } + + virtual void RetrieveResult(class MeshViewer* app) { } + +protected: + virtual bool DoWork() { return super::DoWork(); } + +protected: + String m_path; +}; + +//EasyMeshLoadJob ------------------------------------------------------------- +class EasyMeshLoadJob : public MeshViewerLoadJob +{ + friend class BaseThreadManager; + typedef EasyMeshLoadJob super; + +public: + inline EasyMeshLoadJob() : MeshViewerLoadJob() { } + inline EasyMeshLoadJob(String const& path) + : MeshViewerLoadJob(path) { } + virtual ~EasyMeshLoadJob() { } + + static MeshViewerLoadJob* GetInstance(String const& path); + virtual void RetrieveResult(class MeshViewer* app); + +protected: + static bool Check(String const& path) { return path.contains(".easymesh"); } + virtual bool DoWork(); + +protected: + EasyMeshLuaLoader m_loader; + array m_meshes; +}; + +//MeshViewer ------------------------------------------------------------------ +class MeshViewer : public WorldEntity +{ + typedef WorldEntity super; +public: + MeshViewer(char const *file_name = "data/meshviewer.easymesh.lua"); + ~MeshViewer(); + + void Start(); + void Stop(); + + MeshViewerLoadJob* GetLoadJob(String const& path); + void AddViewerObj(ViewerObject* obj) { m_objs << obj; } + + virtual void TickGame(float seconds); + virtual void TickDraw(float seconds, Scene &scene); + + bool KeyReleased(MVKeyboardList index); + bool KeyPressed(MVKeyboardList index); + bool KeyDown(MVKeyboardList index); + bool KeyReleased(MVMouseKeyList index); + bool KeyPressed(MVMouseKeyList index); + bool KeyDown(MVMouseKeyList index); + float AxisValue(MVMouseAxisList index); + + void Prepare(); + void Unprepare(); + void Update(float seconds); + void Draw(float seconds, Scene &scene); + +private: + //Main stuff -------------------------------------------------------------- + bool m_init = false; + bool m_first_tick = false; + InputProfile m_profile; + Camera * m_camera = nullptr; + SceneSetup* m_ssetup = nullptr; + SceneSetupLuaLoader m_setup_loader; + + //File data + String m_file_name; + FileUpdateStatus* m_file_status; + + //Object data + array m_objs; + + //Entities listing + array m_entities; + + //Input + Controller* m_controller = nullptr; + + //Thread stuff + FileUpdateTester* m_file_check = nullptr; + DefaultThreadManager* m_file_loader = nullptr; + + //OLD --------------------------------------------------------------------- + array m_light_datas; + short m_input_usage; + mat4 m_mat; + mat4 m_mat_prev; + + //Camera Setup + float m_reset_timer; + float m_fov; + float m_fov_mesh; + float m_fov_speed; + float m_zoom; + float m_zoom_mesh; + float m_zoom_speed; + vec2 m_rot; + vec2 m_rot_mesh; + vec2 m_rot_speed; + vec2 m_pos; + vec2 m_pos_mesh; + vec2 m_pos_speed; + vec2 m_hist_scale; + vec2 m_hist_scale_mesh; + vec2 m_hist_scale_speed; + vec2 m_screen_offset; + + //Mesh update timer + float m_build_timer; + float m_build_time; + + //Mesh infos + vec2 m_render_max; + int m_mesh_render; + int m_mesh_id; + float m_mesh_id1; + array m_meshes; + array m_gizmos; + + //File data + array m_cmdlist; + float m_stream_update_time; + float m_stream_update_timer; + + //misc datas + Shader * m_texture_shader; + TileSet * m_default_texture; + Texture * m_texture; + ShaderUniform m_texture_uni; +}; + +} /* namespace lol */