magnet::GL::Buffer<GLfloat>& getBuffer() { if (singleValueMode()) M_throw() << "Cannot get the attribute "; Gtk::TreeModel::iterator iter = _comboBox.get_active(); std::tr1::shared_ptr<Attribute> ptr = (*iter)[_modelColumns.m_ptr]; if ((!_componentSelect.get_visible()) || (_componentSelect.get_active_row_number() == 0)) return ptr->getBuffer(); //Check if the data actually needs updating if ((_lastAttribute != ptr.get()) || (_lastAttributeDataCount != ptr->getUpdateCount()) || (_lastComponentSelected != _componentSelect.get_active_row_number()) || _filteredData.empty()) { _lastAttribute = ptr.get(); _lastAttributeDataCount = ptr->getUpdateCount(); _lastComponentSelected = _componentSelect.get_active_row_number(); std::vector<GLfloat> scalardata; generateFilteredData(scalardata, ptr, _lastComponentSelected); _filteredData = scalardata; } return _filteredData; }
virtual void bindAttribute(size_t attrnum, size_t divisor = 1) { Gtk::TreeModel::iterator iter = _comboBox.get_active(); if (singleValueMode()) setConstantAttribute(attrnum); else { std::shared_ptr<Attribute> ptr = (*iter)[_modelColumns.m_ptr]; //We have an attribute, check the mode the ComboBox is in, //and determine if we have to do something with the data! //Detect if it is in simple pass-through mode if ((_componentSelect.get_visible()) && (_componentSelect.get_active_row_number() == 0)) { ptr->bindAttribute(attrnum, false, divisor); return; } //Check if the data actually needs updating if ((_lastAttribute != ptr.get()) || (_lastAttributeDataCount != ptr->getUpdateCount()) || (_lastComponentSelected != _componentSelect.get_active_row_number()) || (_lastColorMap != _colorMapSelector.getMode()) || _filteredData.empty()) { std::vector<GLfloat> scalardata; generateFilteredData(scalardata, ptr, _lastComponentSelected); if (_autoScaling.get_active() && !scalardata.empty()) { GLfloat min(scalardata[0]), max(scalardata[0]); for (std::vector<GLfloat>::const_iterator iPtr = scalardata.begin(); iPtr != scalardata.end(); ++iPtr) { min = std::min(min, *iPtr); max = std::max(max, *iPtr); } _colorMapSelector.setRange(min, max); } //Now convert to HSV or whatever _filteredData.init(4 * scalardata.size(), 4); GLfloat* data_ptr = _filteredData.map(); for (size_t i(0); i < scalardata.size(); ++i) _colorMapSelector.map(data_ptr + 4 * i, scalardata[i]); _filteredData.unmap(); _lastAttribute = ptr.get(); _lastAttributeDataCount = ptr->getUpdateCount(); _lastComponentSelected = _componentSelect.get_active_row_number(); _lastColorMap = _colorMapSelector.getMode(); } _filteredData.attachToAttribute(attrnum, divisor); } }