/**************************************************************************** Copyright (C) 2010-2012 the Office National des Forêts (ONF), France and the Association de Recherche Technologie et Sciences (ARTS), Ecole Nationale Suprieure d'Arts et Métiers (ENSAM), Cluny, France. All rights reserved. Contact : alexandre.piboule@onf.fr Developers : Michaël KREBS (ARTS/ENSAM) This file is part of Computree version 2.0. Computree is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Computree is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Computree. If not, see . *****************************************************************************/ #include "dm_graphicsviewoptions.h" #include "cdm_configfile.h" #include "dm_domutils.h" #include "renderer/drawmodeaccessor.h" #define CHECK_CHANGE(XXX) if(XXX != options.XXX) \ { \ XXX = options.XXX; \ emitChanged = true; \ } #define CHECK_CHANGE_AND_EMIT(XXX, YYY) if(XXX != options.XXX) \ { \ XXX = options.XXX; \ emit YYY(XXX); \ emitChanged = true; \ } #define CHECK_DIFFERENT(XXX) if(XXX != options.XXX) \ { \ return true; \ } DM_GraphicsViewOptions::DM_GraphicsViewOptions() : QObject(nullptr) { _backgroundColor = QColor(48, 48, 48); _selectedColor = Qt::red; _pointSize = 1.0; _drawAxis = false; m_drawGrid = false; _useColor = true; _useTransparency = false; _useLight = false; _cameraInfoDisplayed = DM_GraphicsViewOptions::CameraNone; _cameraInfoPosition = DM_GraphicsViewOptions::InfoInLowerRightCorner; _cameraType = CameraInterface::ORTHOGRAPHIC; m_normalColor = Qt::yellow; m_normalLength = 0.05f; m_mustShowNormals = false; int size = Scene::NumberOfElements; for(int i=0; iupdateFromOtherOptions(other); } DM_GraphicsViewOptions::~DM_GraphicsViewOptions() { } DrawMode DM_GraphicsViewOptions::getDrawModeToUse(Scene::ObjectType type) const { return m_drawModes.value(type, DM_VAO); } void DM_GraphicsViewOptions::setDrawAxis(bool draw) { _drawAxis = draw; } void DM_GraphicsViewOptions::setDrawGrid(bool draw) { m_drawGrid = draw; } void DM_GraphicsViewOptions::setUseColor(bool enable) { _useColor = enable; } void DM_GraphicsViewOptions::setUseTransparency(bool use) { _useTransparency = use; } void DM_GraphicsViewOptions::setUseLight(bool use) { _useLight = use; } void DM_GraphicsViewOptions::setSelectedColor(QColor &color) { _selectedColor = color; } void DM_GraphicsViewOptions::setBackgroudColor(QColor &color) { _backgroundColor = color; } void DM_GraphicsViewOptions::setPointSize(float size) { _pointSize = size; } void DM_GraphicsViewOptions::setCameraInformationDisplayed(DM_GraphicsViewOptions::CameraInfoDisplayed info) { _cameraInfoDisplayed = info; } void DM_GraphicsViewOptions::setCameraInformationPosition(DM_GraphicsViewOptions::CameraInfoPosition pos) { _cameraInfoPosition = pos; } void DM_GraphicsViewOptions::setCameraType(CameraInterface::CameraType type) { _cameraType = type; } void DM_GraphicsViewOptions::setCameraType(QString type) { _cameraType = (type == "ORTHOGRAPHIC")? CameraInterface::ORTHOGRAPHIC : CameraInterface::PERSPECTIVE; } void DM_GraphicsViewOptions::setNormalColor(const QColor &color) { m_normalColor = color; } void DM_GraphicsViewOptions::setNormalLength(float l) { m_normalLength = l; } void DM_GraphicsViewOptions::setMustShowNormals(bool enabled) { m_mustShowNormals = enabled; } void DM_GraphicsViewOptions::setDrawModeToUse(DrawMode mode) { DrawModesCollectionMutableIterator it(m_drawModes); while(it.hasNext()) { it.next(); it.setValue(mode); } } void DM_GraphicsViewOptions::setDrawModeToUse(Scene::ObjectType type, DrawMode mode) { m_drawModes.insert(type, mode); } void DM_GraphicsViewOptions::setMustReduceNbrPointsInFastDraw(bool enabled) { m_reducePointNbrInFastDraw = enabled; } void DM_GraphicsViewOptions::setMustReduceNbrPointsInNormalDraw(bool enabled) { m_reducePointNbrInNormalDraw = enabled; } void DM_GraphicsViewOptions::setMaxNbrPointsInFastDraw(int n) { m_maxPointInFastDraw = qMax(n, 1); } void DM_GraphicsViewOptions::updateFromOtherOptions(const DM_GraphicsViewOptions &options) { bool emitChanged = false; CHECK_CHANGE_AND_EMIT(_selectedColor, selectionColorChanged) CHECK_CHANGE_AND_EMIT(m_normalColor, normalColorChanged) CHECK_CHANGE_AND_EMIT(m_normalLength, normalLengthChanged) CHECK_CHANGE(_backgroundColor) CHECK_CHANGE(_pointSize) CHECK_CHANGE(_drawAxis) CHECK_CHANGE(m_drawGrid) CHECK_CHANGE(_useColor) CHECK_CHANGE(_useTransparency) CHECK_CHANGE(_useLight) CHECK_CHANGE(_cameraInfoDisplayed) CHECK_CHANGE(_cameraInfoPosition) CHECK_CHANGE(_cameraType) CHECK_CHANGE(m_mustShowNormals) CHECK_CHANGE(m_reducePointNbrInFastDraw) CHECK_CHANGE(m_reducePointNbrInNormalDraw) CHECK_CHANGE(m_maxPointInFastDraw) DrawModesCollectionIterator it(options.m_drawModes); while(it.hasNext()) { it.next(); if(m_drawModes.value(it.key(), DM_VAO) != it.value()) { m_drawModes.insert(it.key(), it.value()); emitChanged = true; } } if(emitChanged) emit optionsChanged(); } DrawModeAccessor &DM_GraphicsViewOptions::operator =(const DrawModeAccessor &other) { bool emitChanged = false; DrawModesCollectionMutableIterator it(m_drawModes); while(it.hasNext()) { it.next(); const DrawMode nDm = other.getDrawModeToUse(it.key()); if(nDm != it.value()) { it.setValue(nDm); emitChanged = true; } } if(emitChanged) emit optionsChanged(); return *this; } bool DM_GraphicsViewOptions::operator !=(const DM_GraphicsViewOptions &options) const { CHECK_DIFFERENT(_selectedColor) CHECK_DIFFERENT(m_normalColor) CHECK_DIFFERENT(m_normalLength) CHECK_DIFFERENT(_backgroundColor) CHECK_DIFFERENT(_pointSize) CHECK_DIFFERENT(_drawAxis) CHECK_DIFFERENT(m_drawGrid) CHECK_DIFFERENT(_useColor) CHECK_DIFFERENT(_useTransparency) CHECK_DIFFERENT(_useLight) CHECK_DIFFERENT(_cameraInfoDisplayed) CHECK_DIFFERENT(_cameraInfoPosition) CHECK_DIFFERENT(_cameraType) CHECK_DIFFERENT(m_mustShowNormals) CHECK_DIFFERENT(m_reducePointNbrInFastDraw) CHECK_DIFFERENT(m_reducePointNbrInNormalDraw) CHECK_DIFFERENT(m_maxPointInFastDraw) DrawModesCollectionIterator it(options.m_drawModes); while(it.hasNext()) { it.next(); if(m_drawModes.value(it.key(), DM_VAO) != it.value()) { return true; } } return false; } DM_GraphicsViewOptions& DM_GraphicsViewOptions::operator =(const DM_GraphicsViewOptions &other) { this->updateFromOtherOptions(other); return *this; } bool DM_GraphicsViewOptions::load() { CONFIG_FILE->beginGroup("GraphicsOptions"); _backgroundColor = CONFIG_FILE->colorValue("backgroundColor", _backgroundColor); _selectedColor = CONFIG_FILE->colorValue("selectedColor", _selectedColor); _pointSize = CONFIG_FILE->value("pointSize", (double)_pointSize).toDouble(); _drawAxis = CONFIG_FILE->value("drawAxis", _drawAxis).toBool(); m_drawGrid = CONFIG_FILE->value("drawGrid", drawGrid()).toBool(); _useColor = CONFIG_FILE->value("useColor", _useColor).toBool(); _useTransparency = CONFIG_FILE->value("useTransparency", _useTransparency).toBool(); _useLight = CONFIG_FILE->value("useLight", _useLight).toBool(); _cameraInfoDisplayed = (CameraInfoDisplayed)CONFIG_FILE->value("cameraInfoDisplayed", (int)_cameraInfoDisplayed).toInt(); _cameraInfoPosition = (CameraInfoPosition)CONFIG_FILE->value("cameraInfoPosition", (int)_cameraInfoPosition).toInt(); _cameraType = (CameraInterface::CameraType)CONFIG_FILE->value("cameraType", (int)_cameraType).toInt(); setNormalColor(CONFIG_FILE->colorValue("normalColor", m_normalColor)); setNormalLength(CONFIG_FILE->value("normalLength", m_normalLength).toFloat()); setMustShowNormals(CONFIG_FILE->value("showNormals", m_mustShowNormals).toBool()); setMustReduceNbrPointsInFastDraw(CONFIG_FILE->value("reduceNbrPointsInFastDraw", m_reducePointNbrInFastDraw).toBool()); setMustReduceNbrPointsInNormalDraw(CONFIG_FILE->value("reduceNbrPointsInNormalDraw", m_reducePointNbrInNormalDraw).toBool()); setMaxNbrPointsInFastDraw(CONFIG_FILE->value("maxNbrPointsInFastDraw", m_maxPointInFastDraw).toInt()); DrawModesCollectionMutableIterator it(m_drawModes); while(it.hasNext()) { it.next(); DrawMode dm = (DrawMode)CONFIG_FILE->value(QString("DrawMode_%1").arg((int)it.key()), (int)DM_VAO).toInt(); it.setValue(dm); } CONFIG_FILE->endGroup(); return true; } bool DM_GraphicsViewOptions::save() { CONFIG_FILE->beginGroup("GraphicsOptions"); CONFIG_FILE->setColorValue("backgroundColor", _backgroundColor); CONFIG_FILE->setColorValue("selectedColor", _selectedColor); CONFIG_FILE->setValue("pointSize", (double)_pointSize); CONFIG_FILE->setValue("drawAxis", _drawAxis); CONFIG_FILE->setValue("drawGrid", m_drawGrid); CONFIG_FILE->setValue("useColor", _useColor); CONFIG_FILE->setValue("useTransparency", _useTransparency); CONFIG_FILE->setValue("useLight", _useLight); CONFIG_FILE->setValue("cameraInfoDisplayed", (int)_cameraInfoDisplayed); CONFIG_FILE->setValue("cameraInfoPosition", (int)_cameraInfoPosition); CONFIG_FILE->setValue("cameraType", (int)_cameraType); CONFIG_FILE->setColorValue("normalColor", m_normalColor); CONFIG_FILE->setValue("showNormals", m_mustShowNormals); CONFIG_FILE->setValue("reduceNbrPointsInFastDraw", m_reducePointNbrInFastDraw); CONFIG_FILE->setValue("reduceNbrPointsInNormalDraw", m_reducePointNbrInNormalDraw); CONFIG_FILE->setValue("maxNbrPointsInFastDraw", m_maxPointInFastDraw); DrawModesCollectionIterator it(m_drawModes); while(it.hasNext()) { it.next(); CONFIG_FILE->setValue(QString("DrawMode_%1").arg((int)it.key()), (int)it.value()); } CONFIG_FILE->endGroup(); return true; } bool DM_GraphicsViewOptions::loadFromXml(const QDomElement &el) { QDomNodeList l = el.elementsByTagName("backgroundColor"); if(!l.isEmpty()) _backgroundColor = DM_DomUtils::QColorFromDom(l.at(0).toElement()); l = el.elementsByTagName("selectedColor"); if(!l.isEmpty()) _selectedColor = DM_DomUtils::QColorFromDom(l.at(0).toElement()); _pointSize = DM_DomUtils::qrealFromDom(el, "pointSize", _pointSize); _drawAxis = DM_DomUtils::boolFromDom(el, "drawAxis", _drawAxis); m_drawGrid = DM_DomUtils::boolFromDom(el, "drawGrid", m_drawGrid); _useColor = DM_DomUtils::boolFromDom(el, "useColor", _useColor); _useTransparency = DM_DomUtils::boolFromDom(el, "useTransparency", _useTransparency); _useLight = DM_DomUtils::boolFromDom(el, "useLight", _useLight); _cameraInfoDisplayed = (CameraInfoDisplayed)DM_DomUtils::intFromDom(el, "cameraInfoDisplayed", (int)_cameraInfoDisplayed); _cameraInfoPosition = (CameraInfoPosition) DM_DomUtils::intFromDom(el, "cameraInfoPosition", (int)_cameraInfoPosition); _cameraType = (CameraInterface::CameraType) DM_DomUtils::intFromDom(el, "cameraType", (int)_cameraType); l = el.elementsByTagName("normalColor"); if(!l.isEmpty()) setNormalColor(DM_DomUtils::QColorFromDom(l.at(0).toElement())); setNormalLength(DM_DomUtils::qrealFromDom(el, "normalLength", m_normalLength)); setMustShowNormals(DM_DomUtils::boolFromDom(el, "showNormals", m_mustShowNormals)); setMustReduceNbrPointsInFastDraw(DM_DomUtils::boolFromDom(el, "reduceNbrPointsInFastDraw", m_reducePointNbrInFastDraw)); setMustReduceNbrPointsInNormalDraw(DM_DomUtils::boolFromDom(el, "reduceNbrPointsInNormalDraw", m_reducePointNbrInNormalDraw)); setMaxNbrPointsInFastDraw(DM_DomUtils::intFromDom(el, "maxNbrPointsInFastDraw", m_maxPointInFastDraw)); QDomElement drawModes = el.firstChildElement("DrawModes"); if(!drawModes.isNull()) { DrawModesCollectionMutableIterator it(m_drawModes); while(it.hasNext()) { it.next(); DrawMode dm = (DrawMode)DM_DomUtils::intFromDom(drawModes, QString("DrawMode_%1").arg((int)it.key()), (int)DM_VAO); it.setValue(dm); } } return true; } bool DM_GraphicsViewOptions::saveToXml(QDomElement &main, QDomDocument &doc) const { main.appendChild(DM_DomUtils::QColorDomElement(_backgroundColor, "backgroundColor", doc)); main.appendChild(DM_DomUtils::QColorDomElement(_selectedColor, "selectedColor", doc)); main.setAttribute("pointSize", _pointSize); DM_DomUtils::setBoolAttribute(main, "drawAxis", _drawAxis); DM_DomUtils::setBoolAttribute(main, "drawGrid", m_drawGrid); DM_DomUtils::setBoolAttribute(main, "useColor", _useColor); DM_DomUtils::setBoolAttribute(main, "useTransparency", _useTransparency); DM_DomUtils::setBoolAttribute(main, "useLight", _useLight); main.setAttribute("cameraInfoDisplayed", (int)_cameraInfoDisplayed); main.setAttribute("cameraInfoPosition", (int)_cameraInfoPosition); main.setAttribute("cameraType", (int)_cameraType); main.appendChild(DM_DomUtils::QColorDomElement(m_normalColor, "normalColor", doc)); main.setAttribute("normalLength", m_normalLength); DM_DomUtils::setBoolAttribute(main, "showNormals", m_mustShowNormals); DM_DomUtils::setBoolAttribute(main, "reduceNbrPointsInFastDraw", m_reducePointNbrInFastDraw); DM_DomUtils::setBoolAttribute(main, "reduceNbrPointsInNormalDraw", m_reducePointNbrInNormalDraw); main.setAttribute("maxNbrPointsInFastDraw", m_maxPointInFastDraw); QDomElement drawModes = doc.createElement("DrawModes"); DrawModesCollectionIterator it(m_drawModes); while(it.hasNext()) { it.next(); drawModes.setAttribute(QString("DrawMode_%1").arg((int)it.key()), (int)it.value()); } main.appendChild(drawModes); return true; }