From 35dbbee6cdb0bd73ca9640ca4b7b179e435732a0 Mon Sep 17 00:00:00 2001 From: Chris Laurel Date: Thu, 26 Apr 2001 19:14:17 +0000 Subject: [PATCH] Added renderflags and labels commands --- src/cmdparser.cpp | 106 ++++++++++++++++++++++++++++++++++++++++++++++ src/command.cpp | 36 ++++++++++++++++ src/command.h | 24 +++++++++++ 3 files changed, 166 insertions(+) diff --git a/src/cmdparser.cpp b/src/cmdparser.cpp index e264b4f0b..00ce59e65 100644 --- a/src/cmdparser.cpp +++ b/src/cmdparser.cpp @@ -10,6 +10,7 @@ // of the License, or (at your option) any later version. #include +#include #include "util.h" #include "astro.h" #include "cmdparser.h" @@ -17,6 +18,9 @@ using namespace std; +static int parseRenderFlags(string); +static int parseLabelFlags(string); + CommandParser::CommandParser(istream& in) { tokenizer = new Tokenizer(&in); @@ -198,6 +202,32 @@ Command* CommandParser::parseCommand() cmd = new CommandSetPosition(astro::universalPosition(Point3d(offset.x, offset.y, offset.z), Point3f((float) base.x, (float) base.y, (float) base.z))); } + else if (commandName == "renderflags") + { + int setFlags = 0; + int clearFlags = 0; + string s; + + if (paramList->getString("set", s)) + setFlags = parseRenderFlags(s); + if (paramList->getString("clear", s)) + clearFlags = parseRenderFlags(s); + + cmd = new CommandRenderFlags(setFlags, clearFlags); + } + else if (commandName == "labels") + { + int setFlags = 0; + int clearFlags = 0; + string s; + + if (paramList->getString("set", s)) + setFlags = parseLabelFlags(s); + if (paramList->getString("clear", s)) + clearFlags = parseLabelFlags(s); + + cmd = new CommandLabels(setFlags, clearFlags); + } else { error("Unknown command name '" + commandName + "'"); @@ -208,3 +238,79 @@ Command* CommandParser::parseCommand() return cmd; } + + +int parseRenderFlags(string s) +{ + istringstream in(s); + Tokenizer tokenizer(&in); + int flags = 0; + + Tokenizer::TokenType ttype = tokenizer.nextToken(); + while (ttype != Tokenizer::TokenEnd) + { + if (ttype == Tokenizer::TokenName) + { + string name = tokenizer.getNameValue(); + if (compareIgnoringCase(name, "orbits") == 0) + flags |= Renderer::ShowOrbits; + else if (compareIgnoringCase(name, "cloudmaps") == 0) + flags |= Renderer::ShowCloudMaps; + else if (compareIgnoringCase(name, "constellations") == 0) + flags |= Renderer::ShowDiagrams; + else if (compareIgnoringCase(name, "galaxies") == 0) + flags |= Renderer::ShowGalaxies; + else if (compareIgnoringCase(name, "planets") == 0) + flags |= Renderer::ShowPlanets; + else if (compareIgnoringCase(name, "stars") == 0) + flags |= Renderer::ShowStars; + + ttype = tokenizer.nextToken(); + if (ttype == Tokenizer::TokenBar) + ttype = tokenizer.nextToken(); + } + else + { + DPRINTF("Error parsing render flags\n"); + return 0; + } + } + + return flags; +} + + +int parseLabelFlags(string s) +{ + istringstream in(s); + Tokenizer tokenizer(&in); + int flags = 0; + + Tokenizer::TokenType ttype = tokenizer.nextToken(); + while (ttype != Tokenizer::TokenEnd) + { + if (ttype == Tokenizer::TokenName) + { + string name = tokenizer.getNameValue(); + if (compareIgnoringCase(name, "planets") == 0) + flags |= Renderer::MajorPlanetLabels; + else if (compareIgnoringCase(name, "minorplanets") == 0) + flags |= Renderer::MinorPlanetLabels; + else if (compareIgnoringCase(name, "constellations") == 0) + flags |= Renderer::ConstellationLabels; + else if (compareIgnoringCase(name, "stars") == 0) + flags |= Renderer::StarLabels; + + ttype = tokenizer.nextToken(); + if (ttype == Tokenizer::TokenBar) + ttype = tokenizer.nextToken(); + } + else + { + DPRINTF("Error parsing label flags\n"); + return 0; + } + } + + return flags; +} diff --git a/src/command.cpp b/src/command.cpp index 1fdedf6bf..52a3413cc 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -223,3 +223,39 @@ void CommandSetOrientation::process(Simulation* sim, Renderer* renderer) q.setAxisAngle(axis, angle); sim->getObserver().setOrientation(q); } + + +////////////////// +// Set render flags command + +CommandRenderFlags::CommandRenderFlags(int _setFlags, int _clearFlags) : + setFlags(_setFlags), clearFlags(_clearFlags) +{ +} + +void CommandRenderFlags::process(Simulation* sim, Renderer* renderer) +{ + if (renderer != NULL) + { + renderer->setRenderFlags(renderer->getRenderFlags() | setFlags); + renderer->setRenderFlags(renderer->getRenderFlags() & ~clearFlags); + } +} + + +////////////////// +// Set labels command + +CommandLabels::CommandLabels(int _setFlags, int _clearFlags) : + setFlags(_setFlags), clearFlags(_clearFlags) +{ +} + +void CommandLabels::process(Simulation* sim, Renderer* renderer) +{ + if (renderer != NULL) + { + renderer->setLabelMode(renderer->getLabelMode() | setFlags); + renderer->setLabelMode(renderer->getLabelMode() & ~clearFlags); + } +} diff --git a/src/command.h b/src/command.h index f1eaf8c40..7d09d8e18 100644 --- a/src/command.h +++ b/src/command.h @@ -208,4 +208,28 @@ class CommandSetOrientation : public InstantaneousCommand }; +class CommandRenderFlags : public InstantaneousCommand +{ + public: + CommandRenderFlags(int _setFlags, int _clearFlags); + void process(Simulation*, Renderer*); + + private: + int setFlags; + int clearFlags; +}; + + +class CommandLabels : public InstantaneousCommand +{ + public: + CommandLabels(int _setFlags, int _clearFlags); + void process(Simulation*, Renderer*); + + private: + int setFlags; + int clearFlags; +}; + + #endif // _COMMAND_H_