From b077c3a8a0fa7a2bd1e8ae930112c3ff44882967 Mon Sep 17 00:00:00 2001 From: curt Date: Fri, 3 Aug 2001 00:17:58 +0000 Subject: [PATCH] - added support for conditions - added support for group layers --- src/Cockpit/panel.cxx | 217 ++++++++++++++++++++++++--------------- src/Cockpit/panel_io.cxx | 40 +++++++- 2 files changed, 174 insertions(+), 83 deletions(-) diff --git a/src/Cockpit/panel.cxx b/src/Cockpit/panel.cxx index c844d7497..f04952d17 100644 --- a/src/Cockpit/panel.cxx +++ b/src/Cockpit/panel.cxx @@ -48,6 +48,11 @@ #define WIN_W 1024 #define WIN_H 768 +#ifdef NONE +#pragma warn A sloppy coder has defined NONE as a macro!!! +#undef NONE +#endif + //////////////////////////////////////////////////////////////////////// @@ -460,9 +465,11 @@ FGPanelAction::addBinding (const FGBinding &binding) void FGPanelAction::doAction () { - int nBindings = _bindings.size(); - for (int i = 0; i < nBindings; i++) { - _bindings[i].fire(); + if (test()) { + int nBindings = _bindings.size(); + for (int i = 0; i < nBindings; i++) { + _bindings[i].fire(); + } } } @@ -558,12 +565,14 @@ FGPanelInstrument::addAction (FGPanelAction * action) bool FGPanelInstrument::doMouseAction (int button, int x, int y) { - action_list_type::iterator it = _actions.begin(); - action_list_type::iterator last = _actions.end(); - for ( ; it != last; it++) { - if ((*it)->inArea(button, x, y)) { - (*it)->doAction(); - return true; + if (test()) { + action_list_type::iterator it = _actions.begin(); + action_list_type::iterator last = _actions.end(); + for ( ; it != last; it++) { + if ((*it)->inArea(button, x, y)) { + (*it)->doAction(); + return true; + } } } return false; @@ -591,11 +600,13 @@ FGLayeredInstrument::~FGLayeredInstrument () void FGLayeredInstrument::draw () { - for (int i = 0; i < (int)_layers.size(); i++) { - glPushMatrix(); - glTranslatef(0.0, 0.0, (i / 100.0) + 0.1); - _layers[i]->draw(); - glPopMatrix(); + if (test()) { + for (int i = 0; i < (int)_layers.size(); i++) { + glPushMatrix(); + glTranslatef(0.0, 0.0, (i / 100.0) + 0.1); + _layers[i]->draw(); + glPopMatrix(); + } } } @@ -656,28 +667,30 @@ FGInstrumentLayer::transform () const transformation_list::const_iterator last = _transformations.end(); while (it != last) { FGPanelTransformation *t = *it; - float val = (t->node == 0 ? 0.0 : t->node->getFloatValue()); - if (val < t->min) { - val = t->min; - } else if (val > t->max) { - val = t->max; - } - if(t->table==0) { + if (t->test()) { + float val = (t->node == 0 ? 0.0 : t->node->getFloatValue()); + if (val < t->min) { + val = t->min; + } else if (val > t->max) { + val = t->max; + } + if(t->table==0) { val = val * t->factor + t->offset; - } else { + } else { val = t->table->interpolate(val) * t->factor + t->offset; - } - - switch (t->type) { - case FGPanelTransformation::XSHIFT: - glTranslatef(val, 0.0, 0.0); - break; - case FGPanelTransformation::YSHIFT: - glTranslatef(0.0, val, 0.0); - break; - case FGPanelTransformation::ROTATION: - glRotatef(-val, 0.0, 0.0, 1.0); - break; + } + + switch (t->type) { + case FGPanelTransformation::XSHIFT: + glTranslatef(val, 0.0, 0.0); + break; + case FGPanelTransformation::YSHIFT: + glTranslatef(0.0, val, 0.0); + break; + case FGPanelTransformation::ROTATION: + glRotatef(-val, 0.0, 0.0, 1.0); + break; + } } it++; } @@ -690,6 +703,38 @@ FGInstrumentLayer::addTransformation (FGPanelTransformation * transformation) } + +//////////////////////////////////////////////////////////////////////// +// Implementation of FGGroupLayer. +//////////////////////////////////////////////////////////////////////// + +FGGroupLayer::FGGroupLayer () +{ +} + +FGGroupLayer::~FGGroupLayer () +{ + for (int i = 0; i < _layers.size(); i++) + delete _layers[i]; +} + +void +FGGroupLayer::draw () +{ + if (test()) { + int nLayers = _layers.size(); + for (int i = 0; i < nLayers; i++) + _layers[i]->draw(); + } +} + +void +FGGroupLayer::addLayer (FGInstrumentLayer * layer) +{ + _layers.push_back(layer); +} + + //////////////////////////////////////////////////////////////////////// // Implementation of FGTexturedLayer. @@ -711,27 +756,29 @@ FGTexturedLayer::~FGTexturedLayer () void FGTexturedLayer::draw () { - int w2 = _w / 2; - int h2 = _h / 2; - - transform(); - glBindTexture(GL_TEXTURE_2D, _texture.getTexture()->getHandle()); - glBegin(GL_POLYGON); - + if (test()) { + int w2 = _w / 2; + int h2 = _h / 2; + + transform(); + glBindTexture(GL_TEXTURE_2D, _texture.getTexture()->getHandle()); + glBegin(GL_POLYGON); + // From Curt: turn on the panel // lights after sundown. - if ( cur_light_params.sun_angle * SGD_RADIANS_TO_DEGREES < 95.0 ) { + if ( cur_light_params.sun_angle * SGD_RADIANS_TO_DEGREES < 95.0 ) { glColor4fv( cur_light_params.scene_diffuse ); - } else { + } else { glColor4f(0.7, 0.2, 0.2, 1.0); + } + + + glTexCoord2f(_texture.getMinX(), _texture.getMinY()); glVertex2f(-w2, -h2); + glTexCoord2f(_texture.getMaxX(), _texture.getMinY()); glVertex2f(w2, -h2); + glTexCoord2f(_texture.getMaxX(), _texture.getMaxY()); glVertex2f(w2, h2); + glTexCoord2f(_texture.getMinX(), _texture.getMaxY()); glVertex2f(-w2, h2); + glEnd(); } - - - glTexCoord2f(_texture.getMinX(), _texture.getMinY()); glVertex2f(-w2, -h2); - glTexCoord2f(_texture.getMaxX(), _texture.getMinY()); glVertex2f(w2, -h2); - glTexCoord2f(_texture.getMaxX(), _texture.getMaxY()); glVertex2f(w2, h2); - glTexCoord2f(_texture.getMinX(), _texture.getMaxY()); glVertex2f(-w2, h2); - glEnd(); } @@ -760,24 +807,26 @@ FGTextLayer::~FGTextLayer () void FGTextLayer::draw () { - glPushMatrix(); - glColor4fv(_color); - transform(); - text_renderer.setFont(guiFntHandle); - text_renderer.setPointSize(_pointSize); - text_renderer.begin(); - text_renderer.start3f(0, 0, 0); + if (test()) { + glPushMatrix(); + glColor4fv(_color); + transform(); + text_renderer.setFont(guiFntHandle); + text_renderer.setPointSize(_pointSize); + text_renderer.begin(); + text_renderer.start3f(0, 0, 0); - _now.stamp(); - if (_now - _then > 100000) { - recalc_value(); - _then = _now; + _now.stamp(); + if (_now - _then > 100000) { + recalc_value(); + _then = _now; + } + text_renderer.puts((char *)(_value.c_str())); + + text_renderer.end(); + glColor4f(1.0, 1.0, 1.0, 1.0); // FIXME + glPopMatrix(); } - text_renderer.puts((char *)(_value.c_str())); - - text_renderer.end(); - glColor4f(1.0, 1.0, 1.0, 1.0); // FIXME - glPopMatrix(); } void @@ -849,18 +898,22 @@ FGTextLayer::Chunk::Chunk (ChunkType type, const SGPropertyNode * node, const char * FGTextLayer::Chunk::getValue () const { - switch (_type) { - case TEXT: - sprintf(_buf, _fmt.c_str(), _text.c_str()); + if (test()) { + switch (_type) { + case TEXT: + sprintf(_buf, _fmt.c_str(), _text.c_str()); + return _buf; + case TEXT_VALUE: + sprintf(_buf, _fmt.c_str(), _node->getStringValue().c_str()); + break; + case DOUBLE_VALUE: + sprintf(_buf, _fmt.c_str(), _node->getFloatValue() * _mult); + break; + } return _buf; - case TEXT_VALUE: - sprintf(_buf, _fmt.c_str(), _node->getStringValue().c_str()); - break; - case DOUBLE_VALUE: - sprintf(_buf, _fmt.c_str(), _node->getFloatValue() * _mult); - break; + } else { + return ""; } - return _buf; } @@ -885,11 +938,13 @@ FGSwitchLayer::~FGSwitchLayer () void FGSwitchLayer::draw () { - transform(); - if (_node->getBoolValue()) { - _layer1->draw(); - } else { - _layer2->draw(); + if (test()) { + transform(); + if (_node->getBoolValue()) { + _layer1->draw(); + } else { + _layer2->draw(); + } } } diff --git a/src/Cockpit/panel_io.cxx b/src/Cockpit/panel_io.cxx index aaf90b9e6..b9390429b 100644 --- a/src/Cockpit/panel_io.cxx +++ b/src/Cockpit/panel_io.cxx @@ -184,6 +184,24 @@ readTexture (const SGPropertyNode * node) } +/** + * Test for a condition in the current node. + */ + +//////////////////////////////////////////////////////////////////////// +// Read a condition and use it if necessary. +//////////////////////////////////////////////////////////////////////// + +static void +readConditions (FGConditional * component, const SGPropertyNode * node) +{ + const SGPropertyNode * conditionNode = node->getChild("condition"); + if (conditionNode != 0) + // The top level is implicitly AND + component->setCondition(fgReadCondition(conditionNode)); +} + + /** * Read an action from the instrument's property list. * @@ -230,6 +248,7 @@ readAction (const SGPropertyNode * node, float w_scale, float h_scale) action->addBinding(FGBinding(bindings[i])); // TODO: allow modifiers } + readConditions(action, node); return action; } @@ -340,6 +359,7 @@ readTransformation (const SGPropertyNode * node, float w_scale, float h_scale) return 0; } + readConditions(t, node); SG_LOG( SG_COCKPIT, SG_DEBUG, "Read transformation " << name ); return t; } @@ -405,6 +425,7 @@ readTextChunk (const SGPropertyNode * node) return 0; } + readConditions(chunk, node); return chunk; } @@ -458,6 +479,19 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) layer = new FGTexturedLayer(texture, w, h); } + // A group of sublayers. + else if (type == "group") { + layer = new FGGroupLayer(); + for (int i = 0; i < node->nChildren(); i++) { + const SGPropertyNode * child = node->getChild(i); + cerr << "Trying child " << child->getName() << endl; + if (child->getName() == "layer") { + cerr << "succeeded!" << endl; + ((FGGroupLayer *)layer)->addLayer(readLayer(child, w_scale, h_scale)); + } + } + } + // A textual instrument layer. else if (type == "text") { @@ -551,7 +585,8 @@ readLayer (const SGPropertyNode * node, float w_scale, float h_scale) } } } - + + readConditions(layer, node); SG_LOG( SG_COCKPIT, SG_DEBUG, "Read layer " << name ); return layer; } @@ -638,7 +673,8 @@ readInstrument (const SGPropertyNode * node) } } } - + + readConditions(instrument, node); SG_LOG( SG_COCKPIT, SG_DEBUG, "Done reading instrument " << name ); return instrument; }