/* * Copyright (c) 2015 Tricoire Sebastien 3dsman@free.fr * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. * */ #include "curves/OE_joincurve.h" #include #include #include #include #include OE_joincurve::OE_joincurve() { } OE_joincurve::OE_joincurve(OE_subcurve* curve1, OE_subcurve* curve2) { if (curve1) { curves.push_back(curve1); curve1->addDependency(this); } if (curve2) { curves.push_back(curve2); curve2->addDependency(this); } //refresh(); } void OE_joincurve::persist(Pakal::Archive* archive) { archive->value("subcurves", curves); } OE_joincurve::~OE_joincurve() { std::list::iterator i = curves.begin(); while (i != curves.end()) { (*i)->removeDependency(this); i++; } } void OE_joincurve::addCurve(OE_subcurve* curve, int pos) { if (curve) { if (pos < 0) { curves.push_back(curve); } else { pos = std::min((int)curves.size(), pos); std::list::iterator it = std::next(curves.begin(), pos); curves.insert(it, curve); } curve->addDependency(this); setNeedRefresh(); } } void OE_joincurve::removeLastCurve() { if (curves.size()) { OE_subcurve* curve = curves.back(); curves.pop_back(); curve->removeDependency(this); setNeedRefresh(); } } void OE_joincurve::removeCurve(OE_subcurve* curve) { if (curves.size()) { curve->removeDependency(this); curves.remove(curve); needRefresh = true; } } OE_subcurve* OE_joincurve::getCurve(int index) { if (index<0) { index = curves.size()+index; } std::list::iterator curve = curves.begin(); for(int i=0; i::iterator i = curves.begin(); while (i != curves.end()) { if (!(*i)->check()) { return false; } i++; } return true; } return false; } /** \brief refresh the discPts array. */ void OE_joincurve::refresh(float dpi, bool force) { if (!check() || !(needRefresh||force)) { return; } pts.clear(); std::list::iterator i = curves.begin(); while (i != curves.end()) { (*i)->refresh(dpi); //pts.push_back((pts.end()+curves.at(i)->pts.begin())/2.0); //pts.push_back((pts.end()+curves.at(i)->pts.begin())/2.0); if (pts.size() && (*i)->pts.size()) { pts.push_back(((*i)->pts.at(0)-pts.at(pts.size()-1))/3.0f+pts.at(pts.size()-1)); pts.push_back(((*i)->pts.at(0)-pts.at(pts.size()-1))*2.0f /3.0f+pts.at(pts.size()-1)); } pts.insert(pts.end(), (*i)->pts.begin(), (*i)->pts.end()); i++; } } void OE_joincurve::delDependency(OE_base * object) { if (curves.size()) { curves.remove(static_cast(object)); } } void OE_joincurve::refreshDependency() { std::list::iterator i = curves.begin(); while (i != curves.end()) { (*i)->refreshDependency(); (*i)->addDependency(this); i++; } }