Skip to content
OE_joincurve.cpp 3.91 KiB
Newer Older
/*
 * 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 <iostream>

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>

OE_joincurve::OE_joincurve(){}

3dsman's avatar
3dsman committed
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();
raoul's avatar
raoul committed
void OE_joincurve::persist(Pakal::Archive* archive)
raoul's avatar
raoul committed
{
raoul's avatar
raoul committed
	OE_base::persist(archive);
	archive->value("subcurves" ,curves);
raoul's avatar
raoul committed
}

OE_joincurve::~OE_joincurve()
{
3dsman's avatar
3dsman committed
    std::list<OE_subcurve*>::iterator i = curves.begin();
    while (i != curves.end())
    {
        (*i)->removeDependency(this);
        i++;
    }
3dsman's avatar
3dsman committed
void OE_joincurve::addCurve(OE_subcurve* curve, int pos)
{
    if (curve)
    {
        if (pos == -1)
            curves.push_back(curve);
        else  if (curves.size() > pos)
        {
3dsman's avatar
3dsman committed
            std::list<OE_subcurve*>::iterator it = std::next(curves.begin(), pos);
             curves.insert (it,curve);
        }
        curve->addDependency(this);
        setNeedRefresh();
void OE_joincurve::removeLastCurve()
{
    if (curves.size())
    {
3dsman's avatar
3dsman committed
        OE_subcurve* curve = curves.back();
        curves.pop_back();
        curve->removeDependency(this);
        setNeedRefresh();
3dsman's avatar
3dsman committed
void OE_joincurve::removeCurve(OE_subcurve* curve)
{
    if (curves.size())
    {
        curve->removeDependency(this);
        curves.remove(curve);
        needRefresh = true;
    }
3dsman's avatar
3dsman committed
OE_subcurve* OE_joincurve::getCurve( int index)
{
    if (index<0)
        index = curves.size()+index;
    std::list<OE_subcurve*>::iterator curve = curves.begin();
    for(unsigned i=0; i<index;i++)
        curve++;
    return (*curve);
}

/** \brief check if the curve is valid.	 */
bool OE_joincurve::check()
{
	if (curves.size())
	{
3dsman's avatar
3dsman committed
        std::list<OE_subcurve*>::iterator i = curves.begin();
			if (!((*i)->check())) return false;
			i++;
		}
		return true;
	}
	return false;
}
		
/** \brief refresh the discPts array.	 */
void OE_joincurve::refresh(float dpi)
3dsman's avatar
3dsman committed
        std::list<OE_subcurve*>::iterator i = curves.begin();
            (*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);
				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())
3dsman's avatar
3dsman committed
        curves.remove((OE_subcurve*)object);

void OE_joincurve::refreshDependency()
{
    std::list<OE_subcurve*>::iterator i = curves.begin();
    while (i != curves.end())
    {
        (*i)->addDependency(this);
        i++;
    }
};