#include "Model3DList.h"

#include "Model3D.h"
#include "Text.h"

using namespace Framework;

const char* Standart3DTypes::cube = "f_w�rfel";
const char* Standart3DTypes::texturModel = "f_texturModel";

// Inhalt der Model3DList Klasse
// Konstruktor
Model3DList::Model3DList()
    : ReferenceCounter()
{
    models = new RCArray<Model3DData>();
    names = new RCArray<Text>();
}

// Destruktor
Model3DList::~Model3DList()
{
    models->release();
    names->release();
}

// F�gt der Liste ein Model Hinzu
//  mdl: Das Model
//  name: Der name, unter dem das Model in der Liste gespeichert wird
bool Model3DList::addModel(Model3DData* mdl, const char* name)
{
    for (auto i : *names)
    {
        if (i->istGleich(name))
        {
            mdl->release();
            return 0;
        }
    }
    models->add(mdl);
    names->add(new Text(name));
    return 1;
}

// Entfernt ein Model aus der Liste
//  name: Der Name des Models
void Model3DList::removeModel(const char* name)
{
    int index = 0;
    for (auto i : *names)
    {
        if (i->istGleich(name))
        {
            names->remove(index);
            models->remove(index);
            return;
        }
        index++;
    }
}

// �berpr�ft, ob unter einem bestimmten Namen ein Model abgespeichert wurde
//  name: Der Name
//  return: true, wenn ein Model mit dem Namen existiert
bool Model3DList::hatModel(const char* name) const
{
    for (auto i : *names)
    {
        if (i->istGleich(name))
        {
            return 1;
        }
    }
    return 0;
}

// Gibt ein bestimmtes Model zur�ck
//  name: Der Name des Models
Model3DData* Model3DList::getModel(const char* name) const
{
    int index = 0;
    for (auto i : *names)
    {
        if (i->istGleich(name))
        {
            return models->get(index);
        }
        index++;
    }
    return 0;
}

// Gibt ein bestimmtes Model ohne erh�hten Reference Counter zur�ck
//  name: Der Name des Models
Model3DData* Model3DList::zModel(const char* name) const
{
    int index = 0;
    for (auto i : *names)
    {
        if (i->istGleich(name))
        {
            return models->z(index);
        }
        index++;
    }
    return 0;
}

//! remove All models
DLLEXPORT void Model3DList::removeAll()
{
    models->leeren();
    names->leeren();
}