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

OpenGL

开发平台:

Visual C++

  1. // cmdparser.cpp
  2. //
  3. // Parse Celestia command files and turn them into CommandSequences.
  4. //
  5. // Copyright (C) 2001 Chris Laurel <claurel@shatters.net>
  6. //
  7. // This program is free software; you can redistribute it and/or
  8. // modify it under the terms of the GNU General Public License
  9. // as published by the Free Software Foundation; either version 2
  10. // of the License, or (at your option) any later version.
  11. #include <algorithm>
  12. #include <cstdio>
  13. #include "celestia.h"
  14. // Older gcc versions used <strstream> instead of <sstream>.
  15. // This has been corrected in GCC 3.2, but name clashing must
  16. // be avoided
  17. #ifdef __GNUC__
  18. #undef min
  19. #undef max
  20. #endif
  21. #include <sstream>
  22. #include <celutil/util.h>
  23. #include <celutil/debug.h>
  24. #include <celmath/mathlib.h>
  25. #include <celengine/astro.h>
  26. #include <celestia/celx.h>
  27. #include <celestia/celx_internal.h>
  28. #include "astro.h"
  29. #include "cmdparser.h"
  30. #include "glcontext.h"
  31. using namespace std;
  32. static int parseRenderFlags(string);
  33. static int parseLabelFlags(string);
  34. static int parseOrbitFlags(string);
  35. static int parseConstellations(CommandConstellations* cmd, string s, int act);
  36. int parseConstellationColor(CommandConstellationColor* cmd, string s, Vec3d *col, int act);
  37. CommandParser::CommandParser(istream& in)
  38. {
  39.     tokenizer = new Tokenizer(&in);
  40.     parser = new Parser(tokenizer);
  41. }
  42. CommandParser::CommandParser(Tokenizer& tok)
  43. {
  44.     tokenizer = &tok;
  45.     parser = new Parser(tokenizer);
  46. }
  47. CommandParser::~CommandParser()
  48. {
  49.     delete parser;
  50.     delete tokenizer;
  51. }
  52. CommandSequence* CommandParser::parse()
  53. {
  54.     CommandSequence* seq = new CommandSequence();
  55.     if (tokenizer->nextToken() != Tokenizer::TokenBeginGroup)
  56.     {
  57.         error("'{' expected at start of script.");
  58.         delete seq;
  59.         return NULL;
  60.     }
  61.     Tokenizer::TokenType ttype = tokenizer->nextToken();
  62.     while (ttype != Tokenizer::TokenEnd && ttype != Tokenizer::TokenEndGroup)
  63.     {
  64.         tokenizer->pushBack();
  65.         Command* cmd = parseCommand();
  66.         if (cmd == NULL)
  67.         {
  68.             for (CommandSequence::const_iterator iter = seq->begin();
  69.                  iter != seq->end();
  70.                  iter++)
  71.             {
  72.                 delete *iter;
  73.             }
  74.             delete seq;
  75.             return NULL;
  76.         }
  77.         else
  78.         {
  79.             seq->insert(seq->end(), cmd);
  80.         }
  81.         ttype = tokenizer->nextToken();
  82.     }
  83.     if (ttype != Tokenizer::TokenEndGroup)
  84.     {
  85.         error("Missing '}' at end of script.");
  86.         for_each(seq->begin(), seq->end(), deleteFunc<Command*>());;
  87.         delete seq;
  88.         return NULL;
  89.     }
  90.     return seq;
  91. }
  92. const vector<string>* CommandParser::getErrors() const
  93. {
  94.     return &errorList;
  95. }
  96. void CommandParser::error(const string errMsg)
  97. {
  98.     errorList.insert(errorList.end(), errMsg);
  99. }
  100. static ObserverFrame::CoordinateSystem parseCoordinateSystem(const string& name)
  101. {
  102. // 'geographic' is a deprecated name for the bodyfixed coordinate system,
  103. // maintained here for compatibility with older scripts.
  104.     if (compareIgnoringCase(name, "observer") == 0)
  105.         return ObserverFrame::ObserverLocal;
  106.     else if (compareIgnoringCase(name, "bodyfixed") == 0)
  107.         return ObserverFrame::BodyFixed;
  108.     else if (compareIgnoringCase(name, "geographic") == 0)
  109.         return ObserverFrame::BodyFixed;
  110.     else if (compareIgnoringCase(name, "equatorial") == 0)
  111.         return ObserverFrame::Equatorial;
  112.     else if (compareIgnoringCase(name, "ecliptical") == 0)
  113.         return ObserverFrame::Ecliptical;
  114.     else if (compareIgnoringCase(name, "universal") == 0)
  115.         return ObserverFrame::Universal;
  116.     else if (compareIgnoringCase(name, "lock") == 0)
  117.         return ObserverFrame::PhaseLock;
  118.     else if (compareIgnoringCase(name, "chase") == 0)
  119.         return ObserverFrame::Chase;
  120.     else
  121.         return ObserverFrame::ObserverLocal;
  122. }
  123. Command* CommandParser::parseCommand()
  124. {
  125.     if (tokenizer->nextToken() != Tokenizer::TokenName)
  126.     {
  127.         error("Invalid command name");
  128.         return NULL;
  129.     }
  130.     string commandName = tokenizer->getStringValue();
  131.     Value* paramListValue = parser->readValue();
  132.     if (paramListValue == NULL || paramListValue->getType() != Value::HashType)
  133.     {
  134.         error("Bad parameter list");
  135.         return NULL;
  136.     }
  137.     Hash* paramList = paramListValue->getHash();
  138.     Command* cmd = NULL;
  139.     if (commandName == "wait")
  140.     {
  141.         double duration = 1.0;
  142.         paramList->getNumber("duration", duration);
  143.         cmd = new CommandWait(duration);
  144.     }
  145.     else if (commandName == "set")
  146.     {
  147.         double value = 0.0;
  148.         string name;
  149.         paramList->getString("name", name);
  150.         if (!paramList->getNumber("value", value))
  151.         {
  152.             // Some values may be specified via strings
  153.             string valstr;
  154.             if (paramList->getString("value", valstr))
  155.             {
  156.                 if (compareIgnoringCase(valstr, "fuzzypoints") == 0)
  157.                     value = (double) Renderer::FuzzyPointStars;
  158.                 else if (compareIgnoringCase(valstr, "points") == 0)
  159.                     value = (double) Renderer::PointStars;
  160.                 else if (compareIgnoringCase(valstr, "scaleddiscs") == 0)
  161.                     value = (double) Renderer::ScaledDiscStars;
  162.             }
  163.         }
  164.         cmd = new CommandSet(name, value);
  165.     }
  166.     else if (commandName == "select")
  167.     {
  168.         string object;
  169.         paramList->getString("object", object);
  170.         cmd = new CommandSelect(object);
  171.     }
  172.     else if (commandName == "setframe")
  173.     {
  174.         string refName;
  175.         paramList->getString("ref", refName);
  176.         string targetName;
  177.         paramList->getString("target", targetName);
  178.         string coordSysName;
  179.         ObserverFrame::CoordinateSystem coordSys = ObserverFrame::Universal;
  180.         if (paramList->getString("coordsys", coordSysName))
  181.             coordSys = parseCoordinateSystem(coordSysName);
  182.         cmd = new CommandSetFrame(coordSys, refName, targetName);
  183.     }
  184.     else if (commandName == "setsurface")
  185.     {
  186.         string name;
  187.         paramList->getString("name", name);
  188.         cmd = new CommandSetSurface(name);
  189.     }
  190.     else if (commandName == "goto")
  191.     {
  192.         double t = 1.0;
  193.         paramList->getNumber("time", t);
  194.         double distance = 5.0;
  195.         paramList->getNumber("distance", distance);
  196.         ObserverFrame::CoordinateSystem upFrame = ObserverFrame::ObserverLocal;
  197.         string frameString;
  198.         if (paramList->getString("upframe", frameString))
  199.             upFrame = parseCoordinateSystem(frameString);
  200.         Vec3d up(0, 1, 0);
  201.         paramList->getVector("up", up);
  202.         cmd = new CommandGoto(t,
  203.                               distance,
  204.                               Vec3f((float) up.x, (float) up.y, (float) up.z),
  205.                               upFrame);
  206.     }
  207.     else if (commandName == "gotolonglat")
  208.     {
  209.         double t = 1.0;
  210.         paramList->getNumber("time", t);
  211.         double distance = 5.0;
  212.         paramList->getNumber("distance", distance);
  213.         Vec3d up(0, 1, 0);
  214.         paramList->getVector("up", up);
  215.         double longitude;
  216.         paramList->getNumber("longitude", longitude);
  217.         double latitude;
  218.         paramList->getNumber("latitude", latitude);
  219.         cmd = new CommandGotoLongLat(t,
  220.                                      distance,
  221.                                      (float) degToRad(longitude),
  222.                                      (float) degToRad(latitude),
  223.                                      Vec3f((float) up.x, (float) up.y, (float) up.z));
  224.     }
  225.     else if (commandName == "gotoloc")
  226.     {
  227.         double t = 1.0;
  228.         paramList->getNumber("time", t);
  229.         Vec3d pos(0, 1, 0);
  230.         if (paramList->getVector("position", pos))
  231.         {
  232.             pos = pos * astro::kilometersToMicroLightYears(1.0);
  233.             double xrot = 0.0;
  234.             paramList->getNumber("xrot", xrot);
  235.             double yrot = 0.0;
  236.             paramList->getNumber("yrot", yrot);
  237.             double zrot = 0.0;
  238.             paramList->getNumber("zrot", zrot);
  239.             zrot = degToRad(zrot);
  240.             Quatf rotation = Quatf::xrotation((float) degToRad(xrot)) *
  241.                 Quatf::yrotation((float) degToRad(yrot)) *
  242.                 Quatf::zrotation((float) degToRad(zrot));
  243.             cmd = new CommandGotoLocation(t, Point3d(0.0, 0.0, 0.0) + pos,
  244.                                           rotation);
  245.         }
  246.         else
  247.         {
  248.             std::string x, y, z;
  249.             paramList->getString("x", x);
  250.             paramList->getString("y", y);
  251.             paramList->getString("z", z);
  252.             double ow, ox, oy, oz;
  253.             paramList->getNumber("ow", ow);
  254.             paramList->getNumber("ox", ox);
  255.             paramList->getNumber("oy", oy);
  256.             paramList->getNumber("oz", oz);
  257.             Quatf orientation((float)ow, (float)ox, (float)oy, (float)oz);
  258.             cmd = new CommandGotoLocation(t, Point3d((double)BigFix(x), (double)BigFix(y), (double)BigFix(z)),
  259.                                           orientation);
  260.         }
  261.     }
  262.     else if (commandName == "seturl")
  263.     {
  264.         std::string url;
  265.         paramList->getString("url", url);
  266.         cmd = new CommandSetUrl(url);
  267.     }
  268.     else if (commandName == "center")
  269.     {
  270.         double t = 1.0;
  271.         paramList->getNumber("time", t);
  272.         cmd = new CommandCenter(t);
  273.     }
  274.     else if (commandName == "follow")
  275.     {
  276.         cmd = new CommandFollow();
  277.     }
  278.     else if (commandName == "synchronous")
  279.     {
  280.         cmd = new CommandSynchronous();
  281.     }
  282.     else if (commandName == "lock")
  283.     {
  284.         cmd = new CommandLock();
  285.     }
  286.     else if (commandName == "chase")
  287.     {
  288.         cmd = new CommandChase();
  289.     }
  290.     else if (commandName == "track")
  291.     {
  292.         cmd = new CommandTrack();
  293.     }
  294.     else if (commandName == "cancel")
  295.     {
  296.         cmd = new CommandCancel();
  297.     }
  298.     else if (commandName == "exit")
  299.     {
  300.         cmd = new CommandExit();
  301.     }
  302.     else if (commandName == "print")
  303.     {
  304.         string text;
  305.         string origin;
  306.         int horig = -1;
  307.         int vorig = -1;
  308.         double hoff = 0;
  309.         double voff = 0;
  310.         double duration = 1.0e9;
  311.         paramList->getString("text", text);
  312.         paramList->getString("origin", origin);
  313.         paramList->getNumber("duration", duration);
  314.         paramList->getNumber("row", voff);
  315.         paramList->getNumber("column", hoff);
  316.         if (compareIgnoringCase(origin, "left") == 0)
  317.         {
  318.             horig = -1;
  319.             vorig = 0;
  320.         }
  321.         else if (compareIgnoringCase(origin, "right") == 0)
  322.         {
  323.             horig = 1;
  324.             vorig = 0;
  325.         }
  326.         else if (compareIgnoringCase(origin, "center") == 0)
  327.         {
  328.             horig = 0;
  329.             vorig = 0;
  330.         }
  331.         else if (compareIgnoringCase(origin, "left") == 0)
  332.         {
  333.             horig = -1;
  334.             vorig = 0;
  335.         }
  336.         else if (compareIgnoringCase(origin, "top") == 0)
  337.         {
  338.             horig = 0;
  339.             vorig = 1;
  340.         }
  341.         else if (compareIgnoringCase(origin, "bottom") == 0)
  342.         {
  343.             horig = 0;
  344.             vorig = -1;
  345.         }
  346.         else if (compareIgnoringCase(origin, "topright") == 0)
  347.         {
  348.             horig = 1;
  349.             vorig = 1;
  350.         }
  351.         else if (compareIgnoringCase(origin, "topleft") == 0)
  352.         {
  353.             horig = -1;
  354.             vorig = 1;
  355.         }
  356.         else if (compareIgnoringCase(origin, "bottomleft") == 0)
  357.         {
  358.             horig = -1;
  359.             vorig = -1;
  360.         }
  361.         else if (compareIgnoringCase(origin, "bottomright") == 0)
  362.         {
  363.             horig = 1;
  364.             vorig = -1;
  365.         }
  366.         cmd = new CommandPrint(text,
  367.                                horig, vorig, (int) hoff, (int) -voff,
  368.                                duration);
  369.     }
  370.     else if (commandName == "cls")
  371.     {
  372.         cmd = new CommandClearScreen();
  373.     }
  374.     else if (commandName == "time")
  375.     {
  376.         double jd = 2451545;
  377.         if (!paramList->getNumber("jd", jd))
  378.         {
  379.             std::string utc;
  380.             paramList->getString("utc", utc);
  381.             astro::Date date = astro::Date(0.0);
  382.             sscanf(utc.c_str(), "%d-%d-%dT%d:%d:%lf",
  383.                 &date.year, &date.month, &date.day,
  384.                 &date.hour, &date.minute, &date.seconds);
  385.             jd = (double)date;
  386.         }
  387.         cmd = new CommandSetTime(jd);
  388.     }
  389.     else if (commandName == "timerate")
  390.     {
  391.         double rate = 1.0;
  392.         paramList->getNumber("rate", rate);
  393.         cmd = new CommandSetTimeRate(rate);
  394.     }
  395.     else if (commandName == "changedistance")
  396.     {
  397.         double rate = 0.0;
  398.         double duration = 1.0;
  399.         paramList->getNumber("rate", rate);
  400.         paramList->getNumber("duration", duration);
  401.         cmd = new CommandChangeDistance(duration, rate);
  402.     }
  403.     else if (commandName == "orbit")
  404.     {
  405.         double rate = 0.0;
  406.         double duration = 1.0;
  407.         Vec3d axis;
  408.         paramList->getNumber("duration", duration);
  409.         paramList->getNumber("rate", rate);
  410.         paramList->getVector("axis", axis);
  411.         cmd = new CommandOrbit(duration,
  412.                                Vec3f((float) axis.x, (float) axis.y, (float) axis.z),
  413.                                (float) degToRad(rate));
  414.     }
  415.     else if (commandName == "rotate")
  416.     {
  417.         double rate = 0.0;
  418.         double duration = 1.0;
  419.         Vec3d axis;
  420.         paramList->getNumber("duration", duration);
  421.         paramList->getNumber("rate", rate);
  422.         paramList->getVector("axis", axis);
  423.         cmd = new CommandRotate(duration,
  424.                                 Vec3f((float) axis.x, (float) axis.y, (float) axis.z),
  425.                                 (float) degToRad(rate));
  426.     }
  427.     else if (commandName == "move")
  428.     {
  429.         Vec3d velocity;
  430.         double duration;
  431.         paramList->getNumber("duration", duration);
  432.         paramList->getVector("velocity", velocity);
  433.         cmd = new CommandMove(duration, velocity * astro::kilometersToMicroLightYears(1.0));
  434.     }
  435.     else if (commandName == "setposition")
  436.     {
  437.         Vec3d base, offset;
  438.         if (paramList->getVector("base", base))
  439.         {
  440.             paramList->getVector("offset", offset);
  441.             cmd = new CommandSetPosition(astro::universalPosition(Point3d(offset.x, offset.y, offset.z),
  442.                                                                   Point3f((float) base.x, (float) base.y, (float) base.z)));
  443.         }
  444.         else
  445.         {
  446.             std::string x, y, z;
  447.             paramList->getString("x", x);
  448.             paramList->getString("y", y);
  449.             paramList->getString("z", z);
  450.             cmd = new CommandSetPosition(UniversalCoord(BigFix(x), BigFix(y), BigFix(z)));
  451.         }
  452.     }
  453.     else if (commandName == "setorientation")
  454.     {
  455.         Vec3d axis;
  456.         double angle;
  457.         if (paramList->getNumber("angle", angle))
  458.         {
  459.             paramList->getVector("axis", axis);
  460.             cmd = new CommandSetOrientation(Vec3f((float) axis.x, (float) axis.y, (float) axis.z),
  461.                                             (float) degToRad(angle));
  462.         }
  463.         else
  464.         {
  465.             double ow, ox, oy, oz;
  466.             paramList->getNumber("ow", ow);
  467.             paramList->getNumber("ox", ox);
  468.             paramList->getNumber("oy", oy);
  469.             paramList->getNumber("oz", oz);
  470.             Quatf orientation((float)ow, (float)ox, (float)oy, (float)oz);
  471.             Vec3f axis;
  472.             float angle;
  473.             orientation.getAxisAngle(axis, angle);
  474.             cmd = new CommandSetOrientation(axis, angle);
  475.         }
  476.     }
  477.     else if (commandName == "lookback")
  478.     {
  479.         cmd = new CommandLookBack();
  480.     }
  481.     else if (commandName == "renderflags")
  482.     {
  483.         int setFlags = 0;
  484.         int clearFlags = 0;
  485.         string s;
  486.         if (paramList->getString("set", s))
  487.             setFlags = parseRenderFlags(s);
  488.         if (paramList->getString("clear", s))
  489.             clearFlags = parseRenderFlags(s);
  490.         cmd = new CommandRenderFlags(setFlags, clearFlags);
  491.     }
  492.     else if (commandName == "labels")
  493.     {
  494.         int setFlags = 0;
  495.         int clearFlags = 0;
  496.         string s;
  497.         if (paramList->getString("set", s))
  498.             setFlags = parseLabelFlags(s);
  499.         if (paramList->getString("clear", s))
  500.             clearFlags = parseLabelFlags(s);
  501.         cmd = new CommandLabels(setFlags, clearFlags);
  502.     }
  503.     else if (commandName == "orbitflags")
  504.     {
  505.         int setFlags = 0;
  506.         int clearFlags = 0;
  507.         string s;
  508.         if (paramList->getString("set", s))
  509.             setFlags = parseOrbitFlags(s);
  510.         if (paramList->getString("clear", s))
  511.             clearFlags = parseOrbitFlags(s);
  512.         cmd = new CommandOrbitFlags(setFlags, clearFlags);
  513.     }
  514. else if (commandName == "constellations")
  515.     {
  516.         string s;
  517. CommandConstellations *cmdcons= new CommandConstellations();
  518.         if (paramList->getString("set", s))
  519.             parseConstellations(cmdcons, s, 1);
  520.         if (paramList->getString("clear", s))
  521.             parseConstellations(cmdcons, s, 0);   
  522. cmd = cmdcons;
  523.     }
  524. else if (commandName == "constellationcolor")
  525.     {
  526.         string s;
  527. CommandConstellationColor *cmdconcol= new CommandConstellationColor();
  528. Vec3d colorv(1.0f, 0.0f, 0.0f);
  529.         paramList->getVector("color", colorv);
  530.         if (paramList->getString("set", s))
  531.             parseConstellationColor(cmdconcol, s, &colorv, 1);
  532.         if (paramList->getString("clear", s))
  533.             parseConstellationColor(cmdconcol, s, &colorv, 0);   
  534. cmd = cmdconcol;
  535.     }
  536.     else if (commandName == "setvisibilitylimit")
  537.     {
  538.         double mag = 6.0;
  539.         paramList->getNumber("magnitude", mag);
  540.         cmd = new CommandSetVisibilityLimit(mag);
  541.     }
  542.     else if (commandName == "setfaintestautomag45deg")
  543.     {
  544.         double mag = 8.5;
  545.         paramList->getNumber("magnitude", mag);
  546.         cmd = new CommandSetFaintestAutoMag45deg(mag);
  547.     }
  548.     else if (commandName == "setambientlight")
  549.     {
  550.         double brightness = 0.0;
  551.         paramList->getNumber("brightness", brightness);
  552.         cmd = new CommandSetAmbientLight((float) brightness);
  553.     }
  554.     else if (commandName == "setgalaxylightgain")
  555.     {
  556.         double gain = 0.0;
  557.         paramList->getNumber("gain", gain);
  558.         cmd = new CommandSetGalaxyLightGain((float) gain);
  559.     }
  560.     else if (commandName == "settextureresolution")
  561.     {
  562.         string textureRes;
  563.         unsigned int res = 1;
  564.         paramList->getString("resolution", textureRes);
  565.         if (compareIgnoringCase(textureRes, "low") == 0)
  566.             res = 0;
  567.         else if (compareIgnoringCase(textureRes, "medium") == 0)
  568.             res = 1;
  569.         else if (compareIgnoringCase(textureRes, "high") == 0)
  570.             res = 2;
  571.         cmd = new CommandSetTextureResolution(res);
  572.     }
  573.     else if (commandName == "preloadtex")
  574.     {
  575.         string object;
  576.         paramList->getString("object", object);
  577.         cmd = new CommandPreloadTextures(object);
  578.     }
  579.     else if (commandName == "mark")
  580.     {
  581.         string object;
  582.         paramList->getString("object", object);
  583.         double size = 10.0f;
  584.         paramList->getNumber("size", size);
  585.         Vec3d colorv(1.0f, 0.0f, 0.0f);
  586.         paramList->getVector("color", colorv);
  587.         double alpha = 0.9f;
  588.         paramList->getNumber("alpha", alpha);
  589.         Color color((float) colorv.x, (float) colorv.y, (float) colorv.z, (float) alpha);
  590.         MarkerRepresentation rep(MarkerRepresentation::Diamond);
  591.         string symbolString;
  592.         if (paramList->getString("symbol", symbolString))
  593.         {
  594.             if (compareIgnoringCase(symbolString, "diamond") == 0)
  595.                 rep = MarkerRepresentation(MarkerRepresentation::Diamond);
  596.             else if (compareIgnoringCase(symbolString, "triangle") == 0)
  597.                 rep = MarkerRepresentation(MarkerRepresentation::Triangle);
  598.             else if (compareIgnoringCase(symbolString, "square") == 0)
  599.                 rep = MarkerRepresentation(MarkerRepresentation::Square);
  600.             else if (compareIgnoringCase(symbolString, "filledsquare") == 0)
  601.                 rep = MarkerRepresentation(MarkerRepresentation::FilledSquare);
  602.             else if (compareIgnoringCase(symbolString, "plus") == 0)
  603.                 rep = MarkerRepresentation(MarkerRepresentation::Plus);
  604.             else if (compareIgnoringCase(symbolString, "x") == 0)
  605.                 rep = MarkerRepresentation(MarkerRepresentation::X);
  606.             else if (compareIgnoringCase(symbolString, "leftarrow") == 0)
  607.                 rep = MarkerRepresentation(MarkerRepresentation::LeftArrow);
  608.             else if (compareIgnoringCase(symbolString, "rightarrow") == 0)
  609.                 rep = MarkerRepresentation(MarkerRepresentation::RightArrow);
  610.             else if (compareIgnoringCase(symbolString, "uparrow") == 0)
  611.                 rep = MarkerRepresentation(MarkerRepresentation::UpArrow);
  612.             else if (compareIgnoringCase(symbolString, "downarrow") == 0)
  613.                 rep = MarkerRepresentation(MarkerRepresentation::DownArrow);
  614.             else if (compareIgnoringCase(symbolString, "circle") == 0)
  615.                 rep = MarkerRepresentation(MarkerRepresentation::Circle);
  616.             else if (compareIgnoringCase(symbolString, "disk") == 0)
  617.                 rep = MarkerRepresentation(MarkerRepresentation::Disk);
  618.         }
  619.         
  620.         string label;
  621.         paramList->getString("label", label);
  622.         rep.setSize((float) size);
  623.         rep.setColor(color);
  624.         rep.setLabel(label);        
  625.         cmd = new CommandMark(object, rep);
  626.     }
  627.     else if (commandName == "unmark")
  628.     {
  629.         string object;
  630.         paramList->getString("object", object);
  631.         cmd = new CommandUnmark(object);
  632.     }
  633.     else if (commandName == "unmarkall")
  634.     {
  635.         cmd = new CommandUnmarkAll();
  636.     }
  637.     else if (commandName == "capture")
  638.     {
  639.         string type, filename;
  640.         paramList->getString("type", type);
  641.         paramList->getString("filename", filename);
  642.         cmd = new CommandCapture(type, filename);
  643.     }
  644.     else if (commandName == "renderpath")
  645.     {
  646.         GLContext::GLRenderPath glcpath = GLContext::GLPath_Basic;
  647.         string path;
  648.         paramList->getString("path", path);
  649.         if (compareIgnoringCase(path, "basic") == 0)
  650.             glcpath = GLContext::GLPath_Basic;
  651.         else if (compareIgnoringCase(path, "multitexture") == 0)
  652.             glcpath = GLContext::GLPath_Multitexture;
  653.         else if (compareIgnoringCase(path, "vp") == 0)
  654.             glcpath = GLContext::GLPath_DOT3_ARBVP;
  655.         else if (compareIgnoringCase(path, "vp-nv") == 0)
  656.             glcpath = GLContext::GLPath_NvCombiner_ARBVP;
  657.         else if (compareIgnoringCase(path, "glsl") == 0)
  658.             glcpath = GLContext::GLPath_GLSL;
  659.         cmd = new CommandRenderPath(glcpath);
  660.     }
  661.     else if (commandName == "splitview")
  662.     {
  663.         unsigned int view = 1;
  664.         paramList->getNumber("view", view);
  665.         string splitType;
  666.         paramList->getString("type", splitType);
  667.         double splitPos = 0.5;
  668.         paramList->getNumber("position", splitPos);
  669.         cmd = new CommandSplitView(view, splitType, (float) splitPos);
  670.     }
  671.     else if (commandName == "deleteview")
  672.     {
  673.         unsigned int view = 1;
  674.         paramList->getNumber("view", view);
  675.         cmd = new CommandDeleteView(view);
  676.     }
  677.     else if (commandName == "singleview")
  678.     {
  679.         cmd = new CommandSingleView();
  680.     }
  681.     else if (commandName == "setactiveview")
  682.     {
  683.         unsigned int view = 1;
  684.         paramList->getNumber("view", view);
  685.         cmd = new CommandSetActiveView(view);
  686.     }
  687.     else if (commandName == "setradius")
  688.     {
  689.         string object;
  690.         paramList->getString("object", object);
  691.         double radius = 1.0;
  692.         paramList->getNumber("radius", radius);
  693.         cmd = new CommandSetRadius(object, (float) radius);
  694.     }
  695.     else if (commandName == "setlinecolor")
  696.     {
  697.         string item;
  698.         paramList->getString("item", item);
  699.         Vec3d colorv(1.0f, 0.0f, 0.0f);
  700.         paramList->getVector("color", colorv);
  701.         Color color((float) colorv.x, (float) colorv.y, (float) colorv.z);
  702.         cmd = new CommandSetLineColor(item, color);
  703.     }
  704.     else if (commandName == "setlabelcolor")
  705.     {
  706.         string item;
  707.         paramList->getString("item", item);
  708.         Vec3d colorv(1.0f, 0.0f, 0.0f);
  709.         paramList->getVector("color", colorv);
  710.         Color color((float) colorv.x, (float) colorv.y, (float) colorv.z);
  711.         cmd = new CommandSetLabelColor(item, color);
  712.     }
  713.     else
  714.     {
  715.         error("Unknown command name '" + commandName + "'");
  716.         cmd = NULL;
  717.     }
  718.     delete paramListValue;
  719.     return cmd;
  720. }
  721. int parseRenderFlags(string s)
  722. {
  723.     istringstream in(s);
  724.     Tokenizer tokenizer(&in);
  725.     int flags = 0;
  726.     Tokenizer::TokenType ttype = tokenizer.nextToken();
  727.     while (ttype != Tokenizer::TokenEnd)
  728.     {
  729.         if (ttype == Tokenizer::TokenName)
  730.         {
  731.             string name = tokenizer.getNameValue();
  732.             if (CelxLua::RenderFlagMap.count(name) == 0)
  733.                 cerr << "Unknown render flag: " << name << "n";
  734.             else
  735.                 flags |= CelxLua::RenderFlagMap[name];
  736.             ttype = tokenizer.nextToken();
  737.             if (ttype == Tokenizer::TokenBar)
  738.                 ttype = tokenizer.nextToken();
  739.         }
  740.     }
  741.     return flags;
  742. }
  743. int parseLabelFlags(string s)
  744. {
  745.     istringstream in(s);
  746.     Tokenizer tokenizer(&in);
  747.     int flags = 0;
  748.     Tokenizer::TokenType ttype = tokenizer.nextToken();
  749.     while (ttype != Tokenizer::TokenEnd)
  750.     {
  751.         if (ttype == Tokenizer::TokenName)
  752.         {
  753.             string name = tokenizer.getNameValue();
  754.             if (CelxLua::LabelFlagMap.count(name) == 0)
  755.                 cerr << "Unknown label flag: " << name << "n";
  756.             else
  757.                 flags |= CelxLua::LabelFlagMap[name];
  758.             ttype = tokenizer.nextToken();
  759.             if (ttype == Tokenizer::TokenBar)
  760.                 ttype = tokenizer.nextToken();
  761.         }
  762.     }
  763.     return flags;
  764. }
  765. int parseOrbitFlags(string s)
  766. {
  767.     istringstream in(s);
  768.     Tokenizer tokenizer(&in);
  769.     int flags = 0;
  770.     Tokenizer::TokenType ttype = tokenizer.nextToken();
  771.     while (ttype != Tokenizer::TokenEnd)
  772.     {
  773.         if (ttype == Tokenizer::TokenName)
  774.         {
  775.             string name = tokenizer.getNameValue();
  776.             name[0] = toupper(name[0]);
  777.             if (CelxLua::BodyTypeMap.count(name) == 0)
  778.                 cerr << "Unknown orbit flag: " << name << "n";
  779.             else
  780.                 flags |= CelxLua::BodyTypeMap[name];
  781.             ttype = tokenizer.nextToken();
  782.             if (ttype == Tokenizer::TokenBar)
  783.                 ttype = tokenizer.nextToken();
  784.         }
  785.     }
  786.     return flags;
  787. }
  788. int parseConstellations(CommandConstellations* cmd, string s, int act)
  789. {
  790.     istringstream in(s);
  791.     Tokenizer tokenizer(&in);
  792.     int flags = 0;
  793.     Tokenizer::TokenType ttype = tokenizer.nextToken();
  794.     while (ttype != Tokenizer::TokenEnd)
  795.     {
  796.         if (ttype == Tokenizer::TokenName)
  797.         {
  798.             string name = tokenizer.getNameValue();
  799. if (compareIgnoringCase(name, "all") == 0 && act==1)
  800. cmd->all=1;
  801. else if (compareIgnoringCase(name, "all") == 0 && act==0)
  802. cmd->none=1;
  803. else 
  804. cmd->setValues(name,act);
  805.             ttype = tokenizer.nextToken();
  806.             if (ttype == Tokenizer::TokenBar)
  807.                 ttype = tokenizer.nextToken();
  808.         }
  809.         else
  810.         {
  811.             DPRINTF(0, "Command Parser: error parsing render flagsn");
  812.             return 0;
  813.         }
  814.     }
  815.     return flags;
  816. }
  817. int parseConstellationColor(CommandConstellationColor* cmd, string s, Vec3d *col, int act)
  818. {
  819.     istringstream in(s);
  820.     Tokenizer tokenizer(&in);
  821.     int flags = 0;
  822. if(!act)
  823. cmd->unsetColor();
  824. else
  825. cmd->setColor((float)col->x, (float)col->y, (float)col->z);
  826.     Tokenizer::TokenType ttype = tokenizer.nextToken();
  827.     while (ttype != Tokenizer::TokenEnd)
  828.     {
  829.         if (ttype == Tokenizer::TokenName)
  830.         {
  831.             string name = tokenizer.getNameValue();
  832. if (compareIgnoringCase(name, "all") == 0 && act==1)
  833. cmd->all=1;
  834. else if (compareIgnoringCase(name, "all") == 0 && act==0)
  835. cmd->none=1;
  836. else 
  837. cmd->setConstellations(name);
  838.             ttype = tokenizer.nextToken();
  839.             if (ttype == Tokenizer::TokenBar)
  840.                 ttype = tokenizer.nextToken();
  841.         }
  842.         else
  843.         {
  844.             DPRINTF(0, "Command Parser: error parsing render flagsn");
  845.             return 0;
  846.         }
  847.     }
  848.     return flags;
  849. }