#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();
}