From 44bc2f4d3d708cf6e2def83d024ae9d343173790 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20=E2=80=98Touky=E2=80=99=20Huet?=
 <huet.benjamin@gmail.com>
Date: Thu, 2 Apr 2015 02:48:16 +0000
Subject: [PATCH] Added the long forgotten meshviewer.h

---
 doc/samples/meshviewer/meshviewer.h | 311 ++++++++++++++++++++++++++++
 1 file changed, 311 insertions(+)
 create mode 100644 doc/samples/meshviewer/meshviewer.h

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 <huet.benjamin@gmail.com>
+//
+//  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<int64_t, String>& 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<MeshViewerKeyInputBase> 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<EasyMeshViewerObject*> 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<ViewerObject*>    m_objs;
+    
+    //Entities listing
+    array<Entity*>          m_entities;
+
+    //Input
+    Controller*             m_controller = nullptr;
+
+    //Thread stuff
+    FileUpdateTester*       m_file_check = nullptr;
+    DefaultThreadManager*   m_file_loader = nullptr;
+
+    //OLD ---------------------------------------------------------------------
+    array<LightData>    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<EasyMesh*, EasyMesh*> m_meshes;
+    array<EasyMesh*>    m_gizmos;
+
+    //File data
+    array<String>       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 */