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

OpenGL

开发平台:

Visual C++

  1. // command.cpp
  2. //
  3. // Copyright (C) 2001 Chris Laurel <claurel@shatters.net>
  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. #include <iostream>
  10. #include <celutil/util.h>
  11. #include <celestia/celestiacore.h>
  12. #include <celestia/imagecapture.h>
  13. #include <celestia/celx_internal.h>
  14. #include "astro.h"
  15. #include "command.h"
  16. #include "execution.h"
  17. #include "glcontext.h"
  18. using namespace std;
  19. ////////////////
  20. // Wait command: a no-op with no side effect other than its duration
  21. CommandWait::CommandWait(double _duration) : TimedCommand(_duration)
  22. {
  23. }
  24. CommandWait::~CommandWait()
  25. {
  26. }
  27. void CommandWait::process(ExecutionEnvironment&, double, double)
  28. {
  29. }
  30. ////////////////
  31. // Select command: select a body
  32. CommandSelect::CommandSelect(string _target) : target(_target)
  33. {
  34. }
  35. CommandSelect::~CommandSelect()
  36. {
  37. }
  38. void CommandSelect::process(ExecutionEnvironment& env)
  39. {
  40.     Selection sel = env.getSimulation()->findObjectFromPath(target);
  41.     env.getSimulation()->setSelection(sel);
  42. }
  43. ////////////////
  44. // Goto command: go to the selected body
  45. CommandGoto::CommandGoto(double t,
  46.                          double dist,
  47.                          Vec3f _up,
  48.                          ObserverFrame::CoordinateSystem _upFrame) :
  49.     gotoTime(t), distance(dist), up(_up), upFrame(_upFrame)
  50. {
  51. }
  52. CommandGoto::~CommandGoto()
  53. {
  54. }
  55. void CommandGoto::process(ExecutionEnvironment& env)
  56. {
  57.     Selection sel = env.getSimulation()->getSelection();
  58.     env.getSimulation()->gotoSelection(gotoTime,
  59.                                        astro::kilometersToLightYears(sel.radius() * distance),
  60.                                        up, upFrame);
  61. }
  62. ////////////////
  63. // GotoLongLat command: go to the selected body and hover over
  64. CommandGotoLongLat::CommandGotoLongLat(double t,
  65.                                        double dist,
  66.                                        float _longitude,
  67.                                        float _latitude,
  68.                                        Vec3f _up) :
  69.     gotoTime(t),
  70.     distance(dist),
  71.     longitude(_longitude),
  72.     latitude(_latitude),
  73.     up(_up)
  74. {
  75. }
  76. CommandGotoLongLat::~CommandGotoLongLat()
  77. {
  78. }
  79. void CommandGotoLongLat::process(ExecutionEnvironment& env)
  80. {
  81.     Selection sel = env.getSimulation()->getSelection();
  82.     env.getSimulation()->gotoSelectionLongLat(gotoTime,
  83.                                               astro::kilometersToLightYears(sel.radius() * distance),
  84.                                               longitude, latitude,
  85.                                               up);
  86. }
  87. /////////////////////////////
  88. // GotoLocation
  89. CommandGotoLocation::CommandGotoLocation(double t,
  90.                                          const Point3d& _translation,
  91.                                          const Quatf& _rotation) :
  92.     gotoTime(t), translation(_translation), rotation(_rotation)
  93. {
  94. }
  95. CommandGotoLocation::~CommandGotoLocation()
  96. {
  97. }
  98. void CommandGotoLocation::process(ExecutionEnvironment& env)
  99. {
  100.     Quatd toOrientation = Quatd(rotation.w, rotation.x, rotation.y, rotation.z);
  101.     UniversalCoord toPosition = translation;
  102.     env.getSimulation()->gotoLocation(toPosition, toOrientation, gotoTime);
  103. }
  104. /////////////////////////////
  105. // SetUrl
  106. CommandSetUrl::CommandSetUrl(const std::string& _url) :
  107.     url(_url)
  108. {
  109. }
  110. void CommandSetUrl::process(ExecutionEnvironment& env)
  111. {
  112.     env.getCelestiaCore()->goToUrl(url);
  113. }
  114. ////////////////
  115. // Center command: go to the selected body
  116. CommandCenter::CommandCenter(double t) : centerTime(t)
  117. {
  118. }
  119. CommandCenter::~CommandCenter()
  120. {
  121. }
  122. void CommandCenter::process(ExecutionEnvironment& env)
  123. {
  124.     env.getSimulation()->centerSelection(centerTime);
  125. }
  126. ////////////////
  127. // Follow command: follow the selected body
  128. CommandFollow::CommandFollow()
  129. {
  130. }
  131. void CommandFollow::process(ExecutionEnvironment& env)
  132. {
  133.     env.getSimulation()->follow();
  134. }
  135. ////////////////
  136. // Synchronous command: maintain the current position relative to the
  137. // surface of the currently selected object.
  138. CommandSynchronous::CommandSynchronous()
  139. {
  140. }
  141. void CommandSynchronous::process(ExecutionEnvironment& env)
  142. {
  143.     env.getSimulation()->geosynchronousFollow();
  144. }
  145. ////////////////
  146. // Chase command:
  147. CommandChase::CommandChase()
  148. {
  149. }
  150. void CommandChase::process(ExecutionEnvironment& env)
  151. {
  152.     env.getSimulation()->chase();
  153. }
  154. ////////////////
  155. // Track command:
  156. CommandTrack::CommandTrack()
  157. {
  158. }
  159. void CommandTrack::process(ExecutionEnvironment& env)
  160. {
  161.     env.getSimulation()->setTrackedObject(env.getSimulation()->getSelection());
  162. }
  163. ////////////////
  164. // Lock command:
  165. CommandLock::CommandLock()
  166. {
  167. }
  168. void CommandLock::process(ExecutionEnvironment& env)
  169. {
  170.     env.getSimulation()->phaseLock();
  171. }
  172. ////////////////
  173. // Setframe command
  174. CommandSetFrame::CommandSetFrame(ObserverFrame::CoordinateSystem _coordSys,
  175.                                  const string& refName,
  176.                                  const string& targetName) :
  177.     coordSys(_coordSys), refObjectName(refName), targetObjectName(targetName)
  178. {
  179. }
  180. void CommandSetFrame::process(ExecutionEnvironment& env)
  181. {
  182.     Selection ref = env.getSimulation()->findObjectFromPath(refObjectName);
  183.     Selection target;
  184.     if (coordSys == ObserverFrame::PhaseLock)
  185.         target = env.getSimulation()->findObjectFromPath(targetObjectName);
  186.     env.getSimulation()->setFrame(coordSys, ref, target);
  187. }
  188. ////////////////
  189. // SetSurface command: select an alternate surface to show
  190. CommandSetSurface::CommandSetSurface(const string& _surfaceName) :
  191.     surfaceName(_surfaceName)
  192. {
  193. }
  194. void CommandSetSurface::process(ExecutionEnvironment& env)
  195. {
  196.     env.getSimulation()->getActiveObserver()->setDisplayedSurface(surfaceName);
  197. }
  198. ////////////////
  199. // Cancel command: stop all motion, set the coordinate system to absolute,
  200. //                 and cancel any tracking
  201. CommandCancel::CommandCancel()
  202. {
  203. }
  204. void CommandCancel::process(ExecutionEnvironment& env)
  205. {
  206.     env.getSimulation()->cancelMotion();
  207.     env.getSimulation()->setFrame(ObserverFrame::Universal, Selection());
  208.     env.getSimulation()->setTrackedObject(Selection());
  209. }
  210. ////////////////
  211. // Print command: print text to the console
  212. CommandPrint::CommandPrint(string _text,
  213.                            int horig, int vorig, int hoff, int voff,
  214.                            double _duration
  215.                            ) : text(_text),
  216.                                hOrigin(horig), vOrigin(vorig),
  217.                                hOffset(hoff), vOffset(voff),
  218.                                duration(_duration)
  219. {
  220. }
  221. void CommandPrint::process(ExecutionEnvironment& env)
  222. {
  223.     env.showText(text, hOrigin, vOrigin, hOffset, vOffset, duration);
  224. }
  225. ////////////////
  226. // Clear screen command: clear the console of all text
  227. CommandClearScreen::CommandClearScreen()
  228. {
  229. }
  230. void CommandClearScreen::process(ExecutionEnvironment&)
  231. {
  232. }
  233. ////////////////
  234. // Exit command: quit the program
  235. CommandExit::CommandExit()
  236. {
  237. }
  238. void CommandExit::process(ExecutionEnvironment&)
  239. {
  240.     exit(0);
  241. }
  242. ////////////////
  243. // Set time command: set the simulation time
  244. CommandSetTime::CommandSetTime(double _jd) : jd(_jd)
  245. {
  246. }
  247. void CommandSetTime::process(ExecutionEnvironment& env)
  248. {
  249.     env.getSimulation()->setTime(jd);
  250. }
  251. ////////////////
  252. // Set time rate command: set the simulation time rate
  253. CommandSetTimeRate::CommandSetTimeRate(double _rate) : rate(_rate)
  254. {
  255. }
  256. void CommandSetTimeRate::process(ExecutionEnvironment& env)
  257. {
  258.     env.getSimulation()->setTimeScale(rate);
  259. }
  260. ////////////////
  261. // Change distance command: change the distance from the selected object
  262. CommandChangeDistance::CommandChangeDistance(double _duration, double _rate) :
  263.     TimedCommand(_duration),
  264.     rate(_rate)
  265. {
  266. }
  267. void CommandChangeDistance::process(ExecutionEnvironment& env, double, double dt)
  268. {
  269.     env.getSimulation()->changeOrbitDistance((float) (rate * dt));
  270. }
  271. ////////////////
  272. // Oribt command: rotate about the selected object
  273. CommandOrbit::CommandOrbit(double _duration, const Vec3f& axis, float rate) :
  274.     TimedCommand(_duration),
  275.     spin(axis * rate)
  276. {
  277. }
  278. void CommandOrbit::process(ExecutionEnvironment& env, double, double dt)
  279. {
  280.     float v = spin.length();
  281.     if (v != 0.0f)
  282.     {
  283.         Quatf q;
  284.         q.setAxisAngle(spin / v, (float) (v * dt));
  285.         env.getSimulation()->orbit(q);
  286.     }
  287. }
  288. CommandRotate::CommandRotate(double _duration, const Vec3f& axis, float rate) :
  289.     TimedCommand(_duration),
  290.     spin(axis * rate)
  291. {
  292. }
  293. void CommandRotate::process(ExecutionEnvironment& env, double, double dt)
  294. {
  295.     float v = spin.length();
  296.     if (v != 0.0f)
  297.     {
  298.         Quatf q;
  299.         q.setAxisAngle(spin / v, (float) (v * dt));
  300.         env.getSimulation()->rotate(q);
  301.     }
  302. }
  303. CommandMove::CommandMove(double _duration, const Vec3d& _velocity) :
  304.     TimedCommand(_duration),
  305.     velocity(_velocity)
  306. {
  307. }
  308. void CommandMove::process(ExecutionEnvironment& env, double, double dt)
  309. {
  310.     env.getSimulation()->setObserverPosition(env.getSimulation()->getObserver().getPosition() + (velocity * dt));
  311. }
  312. ////////////////
  313. // Set position command: set the position of the camera
  314. CommandSetPosition::CommandSetPosition(const UniversalCoord& uc) : pos(uc)
  315. {
  316. }
  317. void CommandSetPosition::process(ExecutionEnvironment& env)
  318. {
  319.     env.getSimulation()->setObserverPosition(pos);
  320. }
  321. ////////////////
  322. // Set orientation command: set the orientation of the camera
  323. CommandSetOrientation::CommandSetOrientation(const Vec3f& _axis, float _angle) :
  324.     axis(_axis), angle(_angle)
  325. {
  326. }
  327. void CommandSetOrientation::process(ExecutionEnvironment& env)
  328. {
  329.     Quatf q(1);
  330.     q.setAxisAngle(axis, angle);
  331.     env.getSimulation()->setObserverOrientation(q);
  332. }
  333. ////////////////
  334. // Look back command: reverse observer orientation
  335. CommandLookBack::CommandLookBack()
  336. {
  337. }
  338. void CommandLookBack::process(ExecutionEnvironment& env)
  339. {
  340.   env.getSimulation()->reverseObserverOrientation();
  341. }
  342. //////////////////
  343. // Set render flags command
  344. CommandRenderFlags::CommandRenderFlags(int _setFlags, int _clearFlags) :
  345.     setFlags(_setFlags), clearFlags(_clearFlags)
  346. {
  347. }
  348. void CommandRenderFlags::process(ExecutionEnvironment& env)
  349. {
  350.     Renderer* r = env.getRenderer();
  351.     if (r != NULL)
  352.     {
  353.         r->setRenderFlags(r->getRenderFlags() | setFlags);
  354.         r->setRenderFlags(r->getRenderFlags() & ~clearFlags);
  355.     }
  356. }
  357. //////////////////
  358. // Set labels command
  359. CommandLabels::CommandLabels(int _setFlags, int _clearFlags) :
  360.     setFlags(_setFlags), clearFlags(_clearFlags)
  361. {
  362. }
  363. void CommandLabels::process(ExecutionEnvironment& env)
  364. {
  365.     Renderer* r = env.getRenderer();
  366.     if (r != NULL)
  367.     {
  368.         r->setLabelMode(r->getLabelMode() | setFlags);
  369.         r->setLabelMode(r->getLabelMode() & ~clearFlags);
  370.     }
  371. }
  372. //////////////////
  373. // Set orbit flags command
  374. CommandOrbitFlags::CommandOrbitFlags(int _setFlags, int _clearFlags) :
  375.     setFlags(_setFlags), clearFlags(_clearFlags)
  376. {
  377. }
  378. void CommandOrbitFlags::process(ExecutionEnvironment& env)
  379. {
  380.     Renderer* r = env.getRenderer();
  381.     if (r != NULL)
  382.     {
  383.         r->setOrbitMask(r->getOrbitMask() | setFlags);
  384.         r->setOrbitMask(r->getOrbitMask() & ~clearFlags);
  385.     }
  386. }
  387. ////////////////
  388. // Set limiting magnitude command
  389. CommandSetVisibilityLimit::CommandSetVisibilityLimit(double mag) :
  390.     magnitude(mag)
  391. {
  392. }
  393. void CommandSetVisibilityLimit::process(ExecutionEnvironment& env)
  394. {
  395.     env.getSimulation()->setFaintestVisible((float) magnitude);
  396. }
  397. ////////////////
  398. // Set FaintestAutoMag45deg command
  399. CommandSetFaintestAutoMag45deg::CommandSetFaintestAutoMag45deg(double mag) :
  400.     magnitude(mag)
  401. {
  402. }
  403. void CommandSetFaintestAutoMag45deg::process(ExecutionEnvironment& env)
  404. {
  405.     Renderer* r = env.getRenderer();
  406.     if (r != NULL)
  407.         r->setFaintestAM45deg((float) magnitude);
  408. }
  409. ////////////////
  410. // Set ambient light command
  411. CommandSetAmbientLight::CommandSetAmbientLight(float level) :
  412.     lightLevel(level)
  413. {
  414. }
  415. void CommandSetAmbientLight::process(ExecutionEnvironment& env)
  416. {
  417.     Renderer* r = env.getRenderer();
  418.     if (r != NULL)
  419.         r->setAmbientLightLevel(lightLevel);
  420. }
  421. ////////////////
  422. // Set galaxy light gain command
  423. CommandSetGalaxyLightGain::CommandSetGalaxyLightGain(float gain) :
  424.     lightGain(gain)
  425. {
  426. }
  427. void CommandSetGalaxyLightGain::process(ExecutionEnvironment& /* env */)
  428. {
  429.     Galaxy::setLightGain(lightGain);
  430. }
  431. ////////////////
  432. // Set command
  433. CommandSet::CommandSet(const std::string& _name, double _value) :
  434.     name(_name), value(_value)
  435. {
  436. }
  437. void CommandSet::process(ExecutionEnvironment& env)
  438. {
  439.     if (compareIgnoringCase(name, "MinOrbitSize") == 0)
  440.     {
  441.         if (env.getRenderer() != NULL)
  442.             env.getRenderer()->setMinimumOrbitSize((float) value);
  443.     }
  444.     else if (compareIgnoringCase(name, "AmbientLightLevel") == 0)
  445.     {
  446.         if (env.getRenderer() != NULL)
  447.             env.getRenderer()->setAmbientLightLevel((float) value);
  448.     }
  449.     else if (compareIgnoringCase(name, "FOV") == 0)
  450.     {
  451.         if (env.getRenderer() != NULL)
  452.             env.getSimulation()->getActiveObserver()->setFOV(degToRad((float) value));
  453.     }
  454.     else if (compareIgnoringCase(name, "StarDistanceLimit") == 0)
  455.     {
  456.         if (env.getRenderer() != NULL)
  457.             env.getRenderer()->setDistanceLimit((float) value);
  458.     }
  459.     else if (compareIgnoringCase(name, "StarStyle") == 0)
  460.     {
  461.         // The cast from double to an enum requires an intermediate cast to int
  462.         // Probably shouldn't be doing this at all, but other alternatives
  463.         // are more trouble than they're worth.
  464.         if (env.getRenderer() != NULL)
  465.             env.getRenderer()->setStarStyle((Renderer::StarStyle) (int) value);
  466.     }
  467. }
  468. ////////////////
  469. // Mark object command
  470. CommandMark::CommandMark(const string& _target,
  471.                          MarkerRepresentation _rep) :
  472.     target(_target),
  473.     rep(_rep)
  474. {
  475. }
  476. void CommandMark::process(ExecutionEnvironment& env)
  477. {
  478.     Selection sel = env.getSimulation()->findObjectFromPath(target);
  479.     if (sel.empty())
  480.         return;
  481.     if (env.getSimulation()->getUniverse() != NULL)
  482.     {
  483.         
  484.         env.getSimulation()->getUniverse()->markObject(sel, rep, 1);
  485.     }
  486. }
  487. ////////////////
  488. // Unmark object command
  489. CommandUnmark::CommandUnmark(const string& _target) :
  490.     target(_target)
  491. {
  492. }
  493. void CommandUnmark::process(ExecutionEnvironment& env)
  494. {
  495.     Selection sel = env.getSimulation()->findObjectFromPath(target);
  496.     if (sel.empty())
  497.         return;
  498.     if (env.getSimulation()->getUniverse() != NULL)
  499.         env.getSimulation()->getUniverse()->unmarkObject(sel, 1);
  500. }
  501. ///////////////
  502. // Unmarkall command - clear all current markers
  503. CommandUnmarkAll::CommandUnmarkAll()
  504. {
  505. }
  506. void CommandUnmarkAll::process(ExecutionEnvironment& env)
  507. {
  508.     if (env.getSimulation()->getUniverse() != NULL)
  509.         env.getSimulation()->getUniverse()->unmarkAll();
  510. }
  511. ////////////////
  512. // Preload textures command
  513. CommandPreloadTextures::CommandPreloadTextures(const string& _name) :
  514.     name(_name)
  515. {
  516. }
  517. void CommandPreloadTextures::process(ExecutionEnvironment& env)
  518. {
  519.     Selection target = env.getSimulation()->findObjectFromPath(name);
  520.     if (target.body() == NULL)
  521.         return;
  522.     if (env.getRenderer() != NULL)
  523.         env.getRenderer()->loadTextures(target.body());
  524. }
  525. ////////////////
  526. // Capture command
  527. CommandCapture::CommandCapture(const std::string& _type,
  528.     const std::string& _filename) : type(_type), filename(_filename)
  529. {
  530. }
  531. void CommandCapture::process(ExecutionEnvironment&)
  532. {
  533. #ifndef TARGET_OS_MAC
  534.     bool success = false;
  535.     // Get the dimensions of the current viewport
  536.     int viewport[4];
  537.     glGetIntegerv(GL_VIEWPORT, viewport);
  538.     if (compareIgnoringCase(type, "jpeg") == 0)
  539.     {
  540.         success = CaptureGLBufferToJPEG(filename,
  541.                                         viewport[0], viewport[1],
  542.                                         viewport[2], viewport[3]);
  543.     }
  544.     if (compareIgnoringCase(type, "png") == 0)
  545.     {
  546.         success = CaptureGLBufferToPNG(filename,
  547.                                        viewport[0], viewport[1],
  548.                                        viewport[2], viewport[3]);
  549.     }
  550. #endif
  551. }
  552. ////////////////
  553. // Set texture resolution command
  554. CommandSetTextureResolution::CommandSetTextureResolution(unsigned int _res) :
  555.     res(_res)
  556. {
  557. }
  558. void CommandSetTextureResolution::process(ExecutionEnvironment& env)
  559. {
  560.     if (env.getRenderer() != NULL)
  561.     {
  562.         env.getRenderer()->setResolution(res);
  563.         env.getCelestiaCore()->notifyWatchers(CelestiaCore::RenderFlagsChanged);
  564.     }
  565. }
  566. ////////////////
  567. // Set RenderPath command
  568. CommandRenderPath::CommandRenderPath(GLContext::GLRenderPath _path) :
  569.     path(_path)
  570. {
  571. }
  572. void CommandRenderPath::process(ExecutionEnvironment& env)
  573. {
  574.     GLContext* context = env.getRenderer()->getGLContext();
  575.     if (context != NULL)
  576.     {
  577.         context->setRenderPath(path);
  578.         env.getCelestiaCore()->notifyWatchers(CelestiaCore::RenderFlagsChanged);
  579.     }
  580. }
  581. ////////////////
  582. // SplitView command
  583. CommandSplitView::CommandSplitView(unsigned int _view, const string& _splitType, double _splitPos) :
  584.     view(_view),
  585.     splitType(_splitType),
  586.     splitPos(_splitPos)
  587. {
  588. }
  589. void CommandSplitView::process(ExecutionEnvironment& env)
  590. {
  591.     vector<Observer*> observer_list;
  592.     getObservers(env.getCelestiaCore(), observer_list);
  593.     if (view >= 1 && view <= observer_list.size())
  594.     {
  595.         Observer* obs = observer_list[view - 1];
  596.         View* view = getViewByObserver(env.getCelestiaCore(), obs);
  597.         View::Type type = (compareIgnoringCase(splitType, "h") == 0) ? View::HorizontalSplit : View::VerticalSplit;
  598.         env.getCelestiaCore()->splitView(type, view, (float)splitPos);
  599.     }
  600. }
  601. ////////////////
  602. // DeleteView command
  603. CommandDeleteView::CommandDeleteView(unsigned int _view) :
  604.     view(_view)
  605. {
  606. }
  607. void CommandDeleteView::process(ExecutionEnvironment& env)
  608. {
  609.     vector<Observer*> observer_list;
  610.     getObservers(env.getCelestiaCore(), observer_list);
  611.     if (view >= 1 && view <= observer_list.size())
  612.     {
  613.         Observer* obs = observer_list[view - 1];
  614.         View* view = getViewByObserver(env.getCelestiaCore(), obs);
  615.         env.getCelestiaCore()->deleteView(view);
  616.     }
  617. }
  618. ////////////////
  619. // SingleView command
  620. CommandSingleView::CommandSingleView()
  621. {
  622. }
  623. void CommandSingleView::process(ExecutionEnvironment& env)
  624. {
  625.     View* view = getViewByObserver(env.getCelestiaCore(), env.getSimulation()->getActiveObserver());
  626.     env.getCelestiaCore()->singleView(view);
  627. }
  628. ////////////////
  629. // SetActiveView command
  630. CommandSetActiveView::CommandSetActiveView(unsigned int _view) :
  631.     view(_view)
  632. {
  633. }
  634. void CommandSetActiveView::process(ExecutionEnvironment& env)
  635. {
  636.     vector<Observer*> observer_list;
  637.     getObservers(env.getCelestiaCore(), observer_list);
  638.     if (view >= 1 && view <= observer_list.size())
  639.     {
  640.         Observer* obs = observer_list[view - 1];
  641.         View* view = getViewByObserver(env.getCelestiaCore(), obs);
  642.         env.getCelestiaCore()->setActiveView(view);
  643.     }
  644. }
  645. ////////////////
  646. // SetRadius command
  647. CommandSetRadius::CommandSetRadius(const string& _object, double _radius) :
  648.     object(_object),
  649.     radius(_radius)
  650. {
  651. }
  652. void CommandSetRadius::process(ExecutionEnvironment& env)
  653. {
  654.     Selection sel = env.getSimulation()->findObjectFromPath(object);
  655.     if (sel.body() != NULL)
  656.     {
  657.         Body* body = sel.body();
  658.         float iradius = body->getRadius();
  659.         if ((radius > 0))
  660.         {
  661.             body->setSemiAxes(body->getSemiAxes() * ((float) radius / iradius));
  662.         }
  663.         
  664.         if (body->getRings() != NULL)
  665.         {
  666.             RingSystem rings(0.0f, 0.0f);
  667.             rings = *body->getRings();
  668.             float inner = rings.innerRadius;
  669.             float outer = rings.outerRadius;
  670.             rings.innerRadius = inner * (float) radius / iradius;
  671.             rings.outerRadius = outer * (float) radius / iradius;
  672.             body->setRings(rings);
  673.         }
  674.     }
  675. }
  676. ////////////////
  677. // SetLineColor command
  678. CommandSetLineColor::CommandSetLineColor(const string& _item, Color _color) :
  679.     item(_item),
  680.     color(_color)
  681. {
  682. }
  683. void CommandSetLineColor::process(ExecutionEnvironment& /* env */)
  684. {
  685.     if (CelxLua::LineColorMap.count(item) == 0)
  686.     {
  687.         cerr << "Unknown line style: " << item << "n";
  688.     }
  689.     else
  690.     {
  691.         *CelxLua::LineColorMap[item] = color;
  692.     }
  693. }
  694. ////////////////
  695. // SetLabelColor command
  696. CommandSetLabelColor::CommandSetLabelColor(const string& _item, Color _color) :
  697.     item(_item),
  698.     color(_color)
  699. {
  700. }
  701. void CommandSetLabelColor::process(ExecutionEnvironment& /* env */)
  702. {
  703.     if (CelxLua::LabelColorMap.count(item) == 0)
  704.     {
  705.         cerr << "Unknown label style: " << item << "n";
  706.     }
  707.     else
  708.     {
  709.         *CelxLua::LabelColorMap[item] = color;
  710.     }
  711. }
  712. ///////////////
  713. // Repeat command
  714. RepeatCommand::RepeatCommand(CommandSequence* _body, int _repeatCount) :
  715.     body(_body),
  716.     bodyDuration(0.0),
  717.     repeatCount(_repeatCount),
  718.     execution(NULL)
  719. {
  720.     for (CommandSequence::const_iterator iter = body->begin();
  721.          iter != body->end(); iter++)
  722.     {
  723.         bodyDuration += (*iter)->getDuration();
  724.     }
  725. }
  726. RepeatCommand::~RepeatCommand()
  727. {
  728.     if (execution != NULL)
  729.         delete execution;
  730.     // delete body;
  731. }
  732. void RepeatCommand::process(ExecutionEnvironment& env, double t, double dt)
  733. {
  734.     double t0 = t - dt;
  735.     int loop0 = (int) (t0 / bodyDuration);
  736.     int loop1 = (int) (t / bodyDuration);
  737.     // TODO: This is bogus . . . should not be storing a reference to an
  738.     // execution environment.
  739.     if (execution == NULL)
  740.         execution = new Execution(*body, env);
  741.     if (loop0 == loop1)
  742.     {
  743.         execution->tick(dt);
  744.     }
  745.     else
  746.     {
  747.         double timeLeft = (loop0 + 1) * bodyDuration - t0;
  748.         execution->tick(timeLeft);
  749.         for (int i = loop0 + 1; i < loop1; i++)
  750.         {
  751.             execution->reset(*body);
  752.             execution->tick(bodyDuration);
  753.         }
  754.         execution->reset(*body);
  755.         execution->tick(t - loop1 * bodyDuration);
  756.     }
  757. }
  758. double RepeatCommand::getDuration()
  759. {
  760.     return bodyDuration * repeatCount;
  761. }
  762. //====================================================
  763. // Add on by Javier Nieto from www.astrohenares.org
  764. //====================================================
  765. CommandConstellations::CommandConstellations()
  766. {
  767. numConstellations = 0;
  768. all = 0;
  769. none = 0;
  770. }
  771. void CommandConstellations::process(ExecutionEnvironment& env)
  772. {
  773.     Universe* u = env.getSimulation()->getUniverse();
  774.     if (u != NULL)
  775.     {
  776. AsterismList* asterisms = u->getAsterisms();
  777.         for (AsterismList::const_iterator iter = asterisms->begin();
  778.              iter != asterisms->end(); iter++)
  779.         {
  780. Asterism* ast = *iter;
  781. if (none) 
  782.             {
  783. ast->setActive(0);
  784.             }
  785. else if (all) 
  786.             {
  787. ast->setActive(1);
  788.             }
  789. else
  790.             {
  791. for (int i = 0; i < numConstellations; i++)
  792.                 {
  793. if (compareIgnoringCase(constellation[i],ast->getName(false)) == 0)
  794.                     {
  795. ast->setActive(active[i] != 0);
  796. break;
  797. }
  798.                 }
  799. }
  800.         }
  801.     }
  802. }
  803. void CommandConstellations::setValues(string cons, int act)
  804. {
  805. int found = 0;
  806. for (unsigned int j = 0; j < cons.size(); j++)
  807.     {
  808. if(cons[j] == '_')
  809. cons[j] = ' ';
  810.     }
  811. // ignore all above 99 constellations
  812. if (numConstellations == MAX_CONSTELLATIONS)
  813. return;
  814. for (int i = 0; i < numConstellations; i++)
  815.     {
  816. if (compareIgnoringCase(constellation[i], cons) == 0 )
  817.         {
  818. active[i]=act;
  819. found=1;
  820. break;
  821. }
  822. }
  823. if (!found)
  824.     {
  825. constellation[numConstellations]=cons;
  826. active[numConstellations]=act;
  827. numConstellations++;
  828. }
  829. }
  830. CommandConstellationColor::CommandConstellationColor()
  831. {
  832. numConstellations=0;
  833. all=0;
  834. none=0;
  835. unset=0;
  836. }
  837. void CommandConstellationColor::process(ExecutionEnvironment& env)
  838. {
  839.     Universe* u = env.getSimulation()->getUniverse();
  840.     if (u != NULL)
  841.     {
  842. AsterismList* asterisms = u->getAsterisms();
  843.         for (AsterismList::const_iterator iter = asterisms->begin();
  844.              iter != asterisms->end(); iter++)
  845.         {
  846. Asterism* ast = *iter;
  847. if (none) 
  848.             {
  849. ast->unsetOverrideColor();
  850.             }
  851. else if (all) 
  852.             {
  853. ast->setOverrideColor(rgb);
  854.             }
  855. else
  856.             {
  857. for(int i = 0; i < numConstellations; i++)
  858.                 {
  859. if (compareIgnoringCase(constellation[i],ast->getName(false)) ==0 )
  860.                     {
  861. if(unset)
  862. ast->unsetOverrideColor();
  863. else
  864. ast->setOverrideColor(rgb);
  865. break;
  866. }
  867.                 }
  868. }
  869.         }
  870.     }
  871. }
  872. void CommandConstellationColor::setColor(float r, float g, float b)
  873. {
  874.     rgb = Color(r, g, b);
  875. unset = 0;
  876. }
  877. void CommandConstellationColor::unsetColor()
  878. {
  879. unset = 1;
  880. }
  881. void CommandConstellationColor::setConstellations(string cons)
  882. {
  883. int found=0;
  884. for (unsigned int j = 0; j < cons.size(); j++)
  885.     {
  886. if (cons[j] == '_')
  887. cons[j] = ' ';
  888.     }
  889. // ignore all above 99 constellations
  890. if (numConstellations == MAX_CONSTELLATIONS)
  891. return;
  892. for (int i=0; i<numConstellations; i++)
  893.     {
  894. if (compareIgnoringCase(constellation[i], cons) == 0)
  895.         {
  896. found=1;
  897. break;
  898. }
  899. }
  900. if (!found)
  901.     {
  902. constellation[numConstellations]=cons;
  903. numConstellations++;
  904. }
  905. }