Ejemplo n.º 1
0
///////////////////////////////////////////////////////////////////////////////
///  public  TraiterFichierDeScene \n
///  Description : Traite le fichier de données de la scène
///
///  @param [in]       Fichier const char *    Fichier à traiter
///
///  @return None
///
///  @author Olivier Dionne 
///  @date   13/08/2008
///
///////////////////////////////////////////////////////////////////////////////
void CScene::TraiterFichierDeScene( const char* Fichier )
{
    fstream FichierScene( Fichier, ios::in );

    if( FichierScene.is_open() )
    {
        EtatTraitementScene EtatCourant = TRAITEMENT_SCENE;
        EtatTraitementScene EtatNouveau = TRAITEMENT_SCENE;

        char Line[ NB_MAX_CAR_PAR_LIGNE ];
        string Buffer;
        int count = 0;

        CLumiere* Lumiere = NULL;
        ISurface* Surface = NULL;

        float Val0, Val1, Val2;
        int  R, G, B;

        while( !FichierScene.eof() )
        {
            FichierScene.getline( Line, NB_MAX_CAR_PAR_LIGNE );
            Buffer = Line;
            CStringUtils::Trim( Buffer, " " );
            
            // Passer les lignes vides et les commentaires
            if( Buffer.empty() || Buffer[ 0 ] == '*' )
                continue;
            else
            {
                // Vérifier l'arrivée d'un nouvel état de traitement
                bool EstNouvelObjetScene = true;
                if     ( STRING_CHECKFIND( Buffer, "Lumiere:" ) ) EtatNouveau = TRAITEMENT_LUMIERE;
                else if( STRING_CHECKFIND( Buffer, "Poly:"    ) ) EtatNouveau = TRAITEMENT_TRIANGLE;
                else if( STRING_CHECKFIND( Buffer, "Plane:"   ) ) EtatNouveau = TRAITEMENT_PLAN;
                else if( STRING_CHECKFIND( Buffer, "Quad:"    ) ) EtatNouveau = TRAITEMENT_QUADRIQUE;
                else
                    EstNouvelObjetScene = false;

                if( EstNouvelObjetScene )
                {
                    // Ajouter objet nouvellement traité à la scène
                    if( EtatCourant != TRAITEMENT_SCENE )
                    {
                        if( EtatCourant == TRAITEMENT_LUMIERE ) 
                            AjouterLumiere( Lumiere );
                        else        
                            AjouterSurface( Surface );

                        Surface = NULL;
                        Lumiere = NULL;
                    }

                    // Substituer le nouvel état pour l'ancien
                    EtatCourant = EtatNouveau;
                    
                    // créer un nouvel objet de scène puis le remplir
                    switch( EtatCourant )
                    {
                        case TRAITEMENT_LUMIERE:
                            Lumiere = new CLumiere();
                            cout << "[ACTION]: Creation d'une lumiere..." << endl;
                            break;
                        case TRAITEMENT_TRIANGLE:
                            Surface = new CTriangle();
                            cout << "[ACTION]: Creation d'un triangle..." << endl;
                            break;
                        case TRAITEMENT_PLAN:
                            Surface = new CPlan();
                            cout << "[ACTION]: Creation d'un plan..." << endl;
                            break;
                        case TRAITEMENT_QUADRIQUE:
                            Surface = new CQuadrique();
                            cout << "[ACTION]: Creation d'une quadrique..." << endl;
                            break;
                    }
                }
                else
                {
                    // Remplir les informations génériques de l'objet courant
                    if( Surface != NULL )
                    {
                        bool IsGenericSurfaceInfo = true;

                        if( STRING_CHECKFIND( Buffer, "color:" ) )
                        { 
                            sscanf( Buffer.c_str(), "%s %i %i %i", Line, &R, &G, &B );
                            Surface->AjusterCouleur( CCouleur( R, G, B ) );
                        }
                        else if( STRING_CHECKFIND( Buffer, "ambient:" ) )
                        {
                            sscanf( Buffer.c_str(), "%s %f", Line, &Val0 );
                            Surface->AjusterCoeffAmbiant( Val0 );
                        }
                        else if( STRING_CHECKFIND( Buffer, "diffus:" ) )
                        {
                            sscanf( Buffer.c_str(), "%s %f", Line, &Val0 );
                            Surface->AjusterCoeffDiffus( Val0 );
                        }
                        else if( STRING_CHECKFIND( Buffer, "specular:" ) )
                        {
                            sscanf( Buffer.c_str(), "%s %f %f", Line, &Val0, &Val1 );
                            Surface->AjusterCoeffSpeculaire( Val0 );
                            Surface->AjusterCoeffBrillance( Val1 );
                        }
                        else if( STRING_CHECKFIND( Buffer, "reflect:" ) )
                        {
                            sscanf( Buffer.c_str(), "%s %f", Line, &Val0 );
                            Surface->AjusterCoeffReflexion( Val0 );
                        }
                        else if( STRING_CHECKFIND( Buffer, "refract:" ) )
                        {
                            sscanf( Buffer.c_str(), "%s %f %f", Line, &Val0, &Val1 );
                            Surface->AjusterCoeffRefraction( Val0 );
                            Surface->AjusterIndiceRefraction( Val1 );
                        }
                        else if( STRING_CHECKFIND( Buffer, "rotate:" ) )
                        {
                            sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                            
                            CMatrice4 Transform = Surface->ObtenirTransformation();
                            Transform.RotationAutourDesX( Deg2Rad<REAL>( Val0 ) );
                            Transform.RotationAutourDesY( Deg2Rad<REAL>( Val1 ) );
                            Transform.RotationAutourDesZ( Deg2Rad<REAL>( Val2 ) );
                            Surface->AjusterTransformation( Transform );
                        }
                        else if( STRING_CHECKFIND( Buffer, "translate:" ) )
                        {
                            sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                            CMatrice4 Transform = Surface->ObtenirTransformation();
                            Transform.Translation( Val0, Val1, Val2 );
                            Surface->AjusterTransformation( Transform );
                        }
                        else if( STRING_CHECKFIND( Buffer, "scale:" ) )
                        {
                            sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                            CMatrice4 Transform = Surface->ObtenirTransformation();
                            Transform.MiseAEchelle( Val0, Val1, Val2 );
                            Surface->AjusterTransformation( Transform );
                        }
                        else
                            IsGenericSurfaceInfo = false;

                        if( IsGenericSurfaceInfo )
                            continue;
                    }

                    // Remplir les infos spécifiques à l'objet
                    switch( EtatCourant )
                    {
                        case TRAITEMENT_SCENE:

                            if( STRING_CHECKFIND( Buffer, "background:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %i %i %i", Line, &R, &G, &B );
                                AjusterCouleurArrierePlan( CCouleur( R, G, B ) );
                            }
                            else if( STRING_CHECKFIND( Buffer, "origin:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                                AjusterPositionCamera( CVecteur3( Val0, Val1, Val2 ) );
                            }
                            else if( STRING_CHECKFIND( Buffer, "eye:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                                AjusterPointViseCamera( CVecteur3( Val0, Val1, Val2 ) );
                            }
                            else if( STRING_CHECKFIND( Buffer, "up:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                                AjusterVecteurUpCamera( CVecteur3( Val0, Val1, Val2 ) );
                            }
                            
                            
                            break;

                        case TRAITEMENT_LUMIERE:

                            if( STRING_CHECKFIND( Buffer, "position:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                                Lumiere->SetPosition( CVecteur3( Val0, Val1, Val2 ) );
                            }
                            else if( STRING_CHECKFIND( Buffer, "intens:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f", Line, &Val0 );
                                Lumiere->SetIntensity( Val0 );
                            }
                            else if( STRING_CHECKFIND( Buffer, "color:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %i %i %i", Line, &R, &G, &B );
                                Lumiere->AjusterCouleur( CCouleur( R, G, B ) );    
                            }

                            break;

                        case TRAITEMENT_TRIANGLE:

                            if( STRING_CHECKFIND( Buffer, "point:" ) )
                            {
                                int PtIdx;
                                sscanf( Buffer.c_str(), "%s %i %f %f %f", Line, &PtIdx, &Val0, &Val1, &Val2 );
                                ( ( CTriangle* )Surface )->AjusterPoint( PtIdx, CVecteur3( Val0, Val1, Val2 ) );
                            }

                            break;

                        case TRAITEMENT_PLAN:

                            if( STRING_CHECKFIND( Buffer, "v_linear:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                                ( ( CPlan* )Surface )->AjusterNormale( CVecteur3( Val0, Val1, Val2 ) );
                            }
                            else if( STRING_CHECKFIND( Buffer, "v_const:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f", Line, &Val0 );
                                ( ( CPlan* )Surface )->AjusterConstante( Val0 );
                            }

                            break;

                        case TRAITEMENT_QUADRIQUE:

                            if( STRING_CHECKFIND( Buffer, "v_quad:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                                ( ( CQuadrique* )Surface )->AjusterQuadratique( CVecteur3( Val0, Val1, Val2 ) );
                            }
                            else if( STRING_CHECKFIND( Buffer, "v_mixte:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                                ( ( CQuadrique* )Surface )->AjusterMixte( CVecteur3( Val0, Val1, Val2 ) );
                            }
                            else if( STRING_CHECKFIND( Buffer, "v_linear:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f %f %f", Line, &Val0, &Val1, &Val2 );
                                ( ( CQuadrique* )Surface )->AjusterLineaire( CVecteur3( Val0, Val1, Val2 ) );
                            }
                            else if( STRING_CHECKFIND( Buffer, "v_const:" ) )
                            {
                                sscanf( Buffer.c_str(), "%s %f", Line, &Val0 );
                                ( ( CQuadrique* )Surface )->AjusterConstante( Val0 );
                            }

                            break;
                    }
                }
            }
        }

        // Fermer le fichier de scène
        FichierScene.close();

        // Ajouter le dernier objet traité
        if( Surface != NULL ) AjouterSurface( Surface );
        if( Lumiere != NULL ) AjouterLumiere( Lumiere );
    }
    else
        cerr << "[CScene::TraiterFichierDeScene()] : Incapable d'ouvrir " << Fichier << "." << endl;

}