celestiacore.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:12k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // celestiacore.h
  2. // 
  3. // Copyright (C) 2001-2009, the Celestia Development Team
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #ifndef _CELESTIACORE_H_
  10. #define _CELESTIACORE_H_
  11. // #include "gl.h"
  12. #include <celutil/timer.h>
  13. #include <celutil/watcher.h>
  14. // #include <celutil/watchable.h>
  15. #include <celengine/solarsys.h>
  16. #include <celengine/overlay.h>
  17. #include <celengine/command.h>
  18. #include <celengine/execution.h>
  19. #include <celengine/texture.h>
  20. #include <celengine/universe.h>
  21. #include <celengine/render.h>
  22. #include <celengine/simulation.h>
  23. #include <celengine/gl.h>
  24. #include "configfile.h"
  25. #include "favorites.h"
  26. #include "destination.h"
  27. #include "moviecapture.h"
  28. #ifdef CELX
  29. #include "celx.h"
  30. #endif
  31. class Url;
  32. // class CelestiaWatcher;
  33. class CelestiaCore;
  34. // class astro::Date;
  35. typedef Watcher<CelestiaCore> CelestiaWatcher;
  36. class ProgressNotifier
  37. {
  38. public:
  39.     ProgressNotifier() {};
  40.     virtual ~ProgressNotifier() {};
  41.     
  42.     virtual void update(const std::string&) = 0;
  43. };
  44. class View
  45. {
  46.  public:
  47.     enum Type {
  48.         ViewWindow      = 1,
  49.         HorizontalSplit = 2,
  50.         VerticalSplit   = 3
  51.     };
  52.     View(Type, Observer*, float, float, float, float);
  53.     void mapWindowToView(float, float, float&, float&) const;
  54.  public:
  55.     Type type;
  56.     Observer* observer;
  57.     View *parent;
  58.     View *child1;
  59.     View *child2;
  60.     float x;
  61.     float y;
  62.     float width;
  63.     float height;
  64.     int renderFlags;
  65.     int labelMode;
  66.     float zoom;
  67.     float alternateZoom;
  68.     void walkTreeResize(View*, int);
  69.     bool walkTreeResizeDelta(View*, float, bool);
  70. };
  71. class CelestiaCore // : public Watchable<CelestiaCore>
  72. {
  73.  public:
  74.     enum {
  75.         LeftButton   = 0x01,
  76.         MiddleButton = 0x02,
  77.         RightButton  = 0x04,
  78.         ShiftKey     = 0x08,
  79.         ControlKey   = 0x10,
  80.     };
  81.     enum CursorShape {
  82.         ArrowCursor         = 0,
  83.         UpArrowCursor       = 1,
  84.         CrossCursor         = 2,
  85.         InvertedCrossCursor = 3,
  86.         WaitCursor          = 4,
  87.         BusyCursor          = 5,
  88.         IbeamCursor         = 6,
  89.         SizeVerCursor       = 7,
  90.         SizeHorCursor       = 8,
  91.         SizeBDiagCursor     = 9,
  92.         SizeFDiagCursor     = 10,
  93.         SizeAllCursor       = 11,
  94.         SplitVCursor        = 12,
  95.         SplitHCursor        = 13,
  96.         PointingHandCursor  = 14,
  97.         ForbiddenCursor     = 15,
  98.         WhatsThisCursor     = 16,
  99.     };
  100.     
  101.     enum {
  102.         Joy_XAxis           = 0,
  103.         Joy_YAxis           = 1,
  104.         Joy_ZAxis           = 2,
  105.     };
  106.     enum {
  107.         JoyButton1          = 0,
  108.         JoyButton2          = 1,
  109.         JoyButton3          = 2,
  110.         JoyButton4          = 3,
  111.         JoyButton5          = 4,
  112.         JoyButton6          = 5,
  113.         JoyButton7          = 6,
  114.         JoyButton8          = 7,
  115.         JoyButtonCount      = 8,
  116.     };
  117.     enum {
  118.         Key_Left            =  1,
  119.         Key_Right           =  2,
  120.         Key_Up              =  3,
  121.         Key_Down            =  4,
  122.         Key_Home            =  5,
  123.         Key_End             =  6,
  124.         Key_PageUp          =  7,
  125.         Key_PageDown        =  8,
  126.         Key_Insert          =  9,
  127.         Key_Delete          = 10,
  128.         Key_F1              = 11,
  129.         Key_F2              = 12,
  130.         Key_F3              = 13,
  131.         Key_F4              = 14,
  132.         Key_F5              = 15,
  133.         Key_F6              = 16,
  134.         Key_F7              = 17,
  135.         Key_F8              = 18,
  136.         Key_F9              = 19,
  137.         Key_F10             = 20,
  138.         Key_F11             = 21,
  139.         Key_F12             = 22,
  140.         Key_NumPadDecimal   = 23,
  141.         Key_NumPad0         = 24,
  142.         Key_NumPad1         = 25,
  143.         Key_NumPad2         = 26,
  144.         Key_NumPad3         = 27,
  145.         Key_NumPad4         = 28,
  146.         Key_NumPad5         = 29,
  147.         Key_NumPad6         = 30,
  148.         Key_NumPad7         = 31,
  149.         Key_NumPad8         = 32,
  150.         Key_NumPad9         = 33,
  151.         Key_BackTab         = 127,
  152.         KeyCount            = 128,
  153.     };
  154.     enum
  155.     {
  156.         LabelFlagsChanged       = 1,
  157.         RenderFlagsChanged      = 2,
  158.         VerbosityLevelChanged   = 4,
  159.         TimeZoneChanged         = 8,
  160.         AmbientLightChanged     = 16,
  161.         FaintestChanged         = 32,
  162.         HistoryChanged          = 64,
  163.         TextEnterModeChanged    = 128,
  164.         GalaxyLightGainChanged  = 256,
  165.     };
  166.     enum
  167.     {
  168.         KbNormal         = 0,
  169.         KbAutoComplete   = 1,
  170.         KbPassToScript   = 2,
  171.     };        
  172.     enum
  173.     {
  174.         ShowNoElement   = 0x001,
  175.         ShowTime = 0x002,
  176.         ShowVelocity  = 0x004,
  177.         ShowSelection    = 0x008,
  178.         ShowFrame   = 0x010,
  179.     };
  180.     typedef void (*ContextMenuFunc)(float, float, Selection);
  181.  public:
  182.     CelestiaCore();
  183.     ~CelestiaCore();
  184.     bool initSimulation(const std::string* = NULL,
  185.                         const std::vector<std::string>* extrasDirs = NULL,
  186.                         ProgressNotifier* progressNotifier = NULL);
  187.     bool initRenderer();
  188.     void start(double t);
  189.     void getLightTravelDelay(double distance, int&, int&, float&);
  190.     void setLightTravelDelay(double distance);
  191.     // URLs and history navigation
  192.     void setStartURL(std::string url);
  193.     void goToUrl(const std::string& url);
  194.     void addToHistory();
  195.     void back();
  196.     void forward();
  197.     const std::vector<Url>& getHistory() const;
  198.     std::vector<Url>::size_type getHistoryCurrent() const;
  199.     void setHistoryCurrent(std::vector<Url>::size_type curr);
  200.     // event processing methods
  201.     void charEntered(const char*, int modifiers = 0);
  202.     void charEntered(char, int modifiers = 0);
  203.     void keyDown(int key, int modifiers = 0);
  204.     void keyUp(int key, int modifiers = 0);
  205.     void mouseWheel(float, int);
  206.     void mouseButtonDown(float, float, int);
  207.     void mouseButtonUp(float, float, int);
  208.     void mouseMove(float, float, int);
  209.     void mouseMove(float, float);
  210.     void pickView(float, float);
  211.     void joystickAxis(int axis, float amount);
  212.     void joystickButton(int button, bool down);
  213.     void resize(GLsizei w, GLsizei h);
  214.     void draw();
  215.     void tick();
  216.     Simulation* getSimulation() const;
  217.     Renderer* getRenderer() const;
  218.     void showText(std::string s,
  219.                   int horig = 0, int vorig = 0,
  220.                   int hoff = 0, int voff = 0, 
  221.                   double duration = 1.0e9);
  222.     int getTextWidth(string s) const;
  223.     void readFavoritesFile();
  224.     void writeFavoritesFile();
  225.     void activateFavorite(FavoritesEntry&);
  226.     void addFavorite(std::string, std::string, FavoritesList::iterator* iter=NULL);
  227.     void addFavoriteFolder(std::string, FavoritesList::iterator* iter=NULL);
  228.     FavoritesList* getFavorites();
  229.     bool viewUpdateRequired() const;
  230.     void setViewChanged();
  231.     const DestinationList* getDestinations();
  232.     int getTimeZoneBias() const;
  233.     void setTimeZoneBias(int);
  234.     std::string getTimeZoneName() const;
  235.     void setTimeZoneName(const std::string&);
  236.     void setTextEnterMode(int);
  237.     int getTextEnterMode() const;
  238.     void initMovieCapture(MovieCapture*);
  239.     void recordBegin();
  240.     void recordPause();
  241.     void recordEnd();
  242.     bool isCaptureActive();
  243.     bool isRecording();
  244.     void runScript(CommandSequence*);
  245.     void runScript(const std::string& filename);
  246.     void cancelScript();
  247.     void resumeScript();
  248.     int getHudDetail();
  249.     void setHudDetail(int);
  250.     astro::Date::Format getDateFormat() const;
  251.     void setDateFormat(astro::Date::Format format);
  252.     int getOverlayElements() const;
  253.     void setOverlayElements(int);
  254.     void setContextMenuCallback(ContextMenuFunc);
  255.     void addWatcher(CelestiaWatcher*);
  256.     void removeWatcher(CelestiaWatcher*);
  257.     
  258.     void setFaintest(float);
  259.     void setFaintestAutoMag();
  260.     void splitView(View::Type type, View* av = NULL, float splitPos = 0.5f);
  261.     void singleView(View* av = NULL);
  262.     void deleteView(View* v = NULL);
  263.     void setActiveView(View* v = NULL);
  264.     bool getFramesVisible() const;
  265.     void setFramesVisible(bool);
  266.     bool getActiveFrameVisible() const;
  267.     void setActiveFrameVisible(bool);
  268.     bool getLightDelayActive() const;
  269.     void setLightDelayActive(bool);
  270.     bool getAltAzimuthMode() const;
  271.     void setAltAzimuthMode(bool);
  272.     int getScreenDpi() const;
  273.     void setScreenDpi(int);
  274.     int getDistanceToScreen() const;
  275.     void setDistanceToScreen(int);
  276.     void setFOVFromZoom();
  277.     void setZoomFromFOV();
  278.     void flash(const std::string&, double duration = 1.0);
  279.     CelestiaConfig* getConfig() const;
  280.     void notifyWatchers(int);
  281.     class Alerter
  282.     {
  283.     public:
  284.         virtual ~Alerter() {};
  285.         virtual void fatalError(const std::string&) = 0;
  286.     };
  287.     void setAlerter(Alerter*);
  288.     Alerter* getAlerter() const;
  289.     class CursorHandler
  290.     {
  291.     public:
  292.         virtual ~CursorHandler() {};
  293.         virtual void setCursorShape(CursorShape) = 0;
  294.         virtual CursorShape getCursorShape() const = 0;
  295.     };
  296.     
  297.     void setCursorHandler(CursorHandler*);
  298.     CursorHandler* getCursorHandler() const;
  299.     void toggleReferenceMark(const std::string& refMark, Selection sel = Selection());
  300.     bool referenceMarkEnabled(const std::string& refMark, Selection sel = Selection()) const;
  301.     
  302.  private:
  303.     bool readStars(const CelestiaConfig&, ProgressNotifier*);
  304.     void renderOverlay();
  305.     void fatalError(const std::string&);
  306. #ifdef CELX
  307.     bool initLuaHook(ProgressNotifier*);
  308. #endif // CELX
  309.  private:
  310.     CelestiaConfig* config;
  311.     Universe* universe;
  312.     FavoritesList* favorites;
  313.     DestinationList* destinations;
  314.     Simulation* sim;
  315.     Renderer* renderer;
  316.     Overlay* overlay;
  317.     int width;
  318.     int height;
  319.     TextureFont* font;
  320.     TextureFont* titleFont;
  321.     std::string messageText;
  322.     int messageHOrigin;
  323.     int messageVOrigin;
  324.     int messageHOffset;
  325.     int messageVOffset;
  326.     double messageStart;
  327.     double messageDuration;
  328.     std::string typedText;
  329.     std::vector<std::string> typedTextCompletion;
  330.     int typedTextCompletionIdx;
  331.     int textEnterMode;
  332.     int hudDetail;
  333.     astro::Date::Format dateFormat;
  334.     int dateStrWidth;
  335.     int overlayElements;
  336.     bool wireframe;
  337.     bool editMode;
  338.     bool altAzimuthMode;
  339.     bool showConsole;
  340.     bool lightTravelFlag;
  341.     double flashFrameStart;
  342.     Timer* timer;
  343.     Execution* runningScript;
  344.     ExecutionEnvironment* execEnv;
  345. #ifdef CELX
  346.     LuaState* celxScript;
  347.     LuaState* luaHook;     // Lua hook context
  348.     LuaState* luaSandbox;  // Safe Lua context for ssc scripts
  349. #endif // CELX
  350.     enum ScriptState
  351.     {
  352.         ScriptCompleted,
  353.         ScriptRunning,
  354.         ScriptPaused,
  355.     };
  356.     ScriptState scriptState;
  357.     int timeZoneBias;              // Diff in secs between local time and GMT
  358.     std:: string timeZoneName;    // Name of the current time zone
  359.     // Frame rate counter variables
  360.     bool showFPSCounter;
  361.     int nFrames;
  362.     double fps;
  363.     double fpsCounterStartTime;
  364.     float oldFOV;
  365.     float mouseMotion;
  366.     double dollyMotion;
  367.     double dollyTime;
  368.     double zoomMotion;
  369.     double zoomTime;
  370.     double sysTime;
  371.     double currentTime;
  372.     bool viewChanged;
  373.     Vec3f joystickRotation;
  374.     bool joyButtonsPressed[JoyButtonCount];
  375.     bool keysPressed[KeyCount];
  376.     bool shiftKeysPressed[KeyCount];
  377.     double KeyAccel;
  378.     MovieCapture* movieCapture;
  379.     bool recording;
  380.     ContextMenuFunc contextMenuCallback;
  381.     Texture* logoTexture;
  382.     Alerter* alerter;
  383.     std::vector<CelestiaWatcher*> watchers;
  384.     CursorHandler* cursorHandler;
  385.     CursorShape defaultCursorShape;
  386.     
  387.     std::vector<Url> history;
  388.     std::vector<Url>::size_type historyCurrent;
  389.     std::string startURL;
  390.     std::list<View*> views;
  391.     std::list<View*>::iterator activeView;
  392.     bool showActiveViewFrame;
  393.     bool showViewFrames;
  394.     View *resizeSplit;
  395.     int screenDpi;
  396.     int distanceToScreen;
  397.     Selection lastSelection;
  398.     string selectionNames;
  399. #ifdef CELX
  400.     friend View* getViewByObserver(CelestiaCore*, Observer*);
  401.     friend void getObservers(CelestiaCore*, std::vector<Observer*>&);
  402.     friend TextureFont* getFont(CelestiaCore*);
  403.     friend TextureFont* getTitleFont(CelestiaCore*);
  404. #endif
  405. };
  406. #endif // _CELESTIACORE_H_