IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

1 SOLUTION : plusieurs anim dans un fichier x


Sujet :

DirectX

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 11
    Points : 6
    Points
    6
    Par défaut 1 SOLUTION : plusieurs anim dans un fichier x
    voila , j'ai trouvé une solution qui n'est surement pas la meilleure mais ca marche.

    Creer a partir du meme personnage plusieurs fichiers 3DSMax contenant chacune une seule animation.

    Exporter chacun de ces fichiers avec panda Directx exporter en n'oubliant pas de nommer l'animation, de preference en mode texte.

    Ecrire un programme qui copie dans un fichier filename.x :
    - un des fichier en entier (pour avoir toutes les infos sur le personnage)
    - les parties concernant les animationSet des autres fichier(tant que la ligne que je lis ne contient pas "AnimationSet", des que je le trouve je copie les lignes jusqu'a la fin dans le fichier filename.x)

    Ce servir normalement de filename.x qui maintenant contient plusierus animations qui peuvent etre appelees independament.


    Voila j'ai eu du mal, mais en fait la solution etait toute simple.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    OK, voici le code de concatenation des fichiers. Vous pourrez me remercier car moi toutes les aides qu'on m'a données se sont révélées peu pratiques

    Il suffit d'appeler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fusion fusion(test);   //test est le chemin et le debut du nom des fichier a concatener
    char * fichierComplet = fusion.getFichierComplet();
    fichier fusion.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #ifndef FUSION_H
    #define FUSION_H
     
    class Fusion{
    protected:
        char * fichierComplet ;   // nom du fichier X qui contient toutes les info et les anims
        const char * filename ;   // nom du fichier sans extension
     
    public:
        /* Constructeur */
        Fusion ( const char * file ) ;
        /* Retourne le nom du fichier complet, une fois qu'il a ete mis a jour */
        char * getFichierComplet ( );
     
    protected:
        /* Fusionne tous les fichiers X commencant par filename */
        char * fusionne ( );
        /* Copie tout le fichier file en debut de fichierComplet (il est ecrase)*/
        void copieFichier ( char * file );
        /* Copie les animations de file a la fin de fichierComplet */
        void copieAnim ( char * file );
    };
     
    #endif
    fichier fusion.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    #include <stdio.h>
    #include <fstream> 
     
     
    const int MAX = 256;      // la longueur max d'une ligne
     
    /****************/
    /* CONSTRUCTEUR */
    /****************/
    Fusion :: Fusion ( const char * filename ) {
        this->filename = filename;
        string file(filename);
        fichierComplet = new char [file.length() + 2];
        strcpy ( fichierComplet, filename );
        strcat ( fichierComplet, ".x" );
    }
     
    /*************************************************************/
    /* RENVOIE LE NOM DU FICHIER CONTENANT TOUTES LES ANIMATIONS */
    /*************************************************************/
    char * Fusion :: getFichierComplet ( ) {  
        FILE * fp = fopen (fichierComplet, "r");
     
        // si le fichier existe on renvoie le nom du fichier
        if (fp != NULL ) 
             fclose(fp);
     
        // sinon on fusionne les fichiers dont le nom commence par filename
        else 
            fusionne( );
     
        return  fichierComplet;
    }
     
    /************************************************************************************/
    /* FUSIONNE TOUS LES FICHIERS DONT LE NOM COMMENCE PAR FILENAME ( SAUF FILENAME.X ) */
    /************************************************************************************/
    char * Fusion :: fusionne ( ) {
        // recherche du nom du repertoire dans lequel se trouvent les fichiers
        string file(filename);
        int index = file.find_last_of("\\");
        string chemin = file.substr(0,index+1);
     
        // recherche des fichiers x commencant par filename   
        char recherche [file.length() + 3];
        strcpy(recherche, filename);
        strcat(recherche, "*.x");
        WIN32_FIND_DATA File;
        HANDLE hSearch;
     
        hSearch = FindFirstFile(recherche, &File);
        if (hSearch == INVALID_HANDLE_VALUE){
            throw Exception("Pas de fichier trouve"); 
        } 
        //cout<<"FUSION\n";
        BOOL result = TRUE;
        int passage = 0;
        do {
            // recuperation du nom de fichier
            char fichierX [ chemin.length() + strlen(File.cFileName) ];
            strcpy ( fichierX, chemin.c_str() );
            strcat ( fichierX, File.cFileName );
     
            // s'il s'agit de fichierComplet, on l'oublie 
            //(il ne doit pas etre fusionne avec les autres car c'est lui qui recoit la fusion )
            if ( strcmp( fichierX, fichierComplet ) == 0 ){
                result = FindNextFile(hSearch, &File);
                continue;
            }
            cout<<fichierX<<endl;
            // on recupere une seule fois les donnees concernant les meshs, textures, materiel ...
            if ( passage == 0 ){
                copieFichier ( fichierX );
                passage ++;
            }
            // pour tous les autres fichiers, on ne recupere que les anims, presentes en fin de fichier
            else
                copieAnim ( fichierX );
     
            // recherche du suivant     
            result = FindNextFile(hSearch, &File); 
        } while (result); 
        FindClose(hSearch);
    }
     
    /***********************************************************************/
    /* COPIE DU FICHIER DONNE EN PARAMETRE DANS LE FICHIER FICHIERCOMPLET, */
    /* QUI SERA ECRASE S'IL EXISTE                                         */
    /***********************************************************************/
    void Fusion :: copieFichier( char * fileToAdd ){
        ifstream lecture ( fileToAdd, ios::in);
        ofstream ecriture ( fichierComplet, ios::out );
        char buf[MAX];
     
        while ( !lecture.eof() ) {
            lecture.getline(buf, MAX);
            ecriture << buf << endl; 
        }
     
        ecriture.close();
        lecture.close();
    }
     
    /**********************************************************************************/
    /* COPIE DES ANIMATIONS DU FICHIER DONNE EN PARAMETRE, A LA FIN DE FICHIERCOMPLET */
    /**********************************************************************************/
    void Fusion :: copieAnim( char * fileToAdd ){
        ifstream lecture ( fileToAdd, ios::in);
        ofstream ecriture ( fichierComplet, ios::ate );
        char buf[MAX];
        bool copy = false;
     
        // les animations du fichiers x se trouvent a la fin du fichier.
        // Nous lisons donc tout le fichier jusqu'a rencontrer la chaine "AnimationSet", 
        // et alors nous copions toutes les lignes suivantes jusqu'a la fin du fichier 
        while ( !lecture.eof() ) {
            lecture.getline(buf, MAX);
            string lu (buf);
            if ( lu.find ( "AnimationSet" ) != string::npos )  // si la ligne contient "AnimationSet"
                    copy = true;
     
            if (copy == true )
                ecriture << buf << endl; 
        }
     
        ecriture.close();
        lecture.close();
    }

Discussions similaires

  1. Recherche plusieurs termes dans un fichier
    Par Kaoziun dans le forum Linux
    Réponses: 2
    Dernier message: 03/10/2006, 15h02
  2. Plusieurs formulaires dans un fichier avec plusieurs méthodes post
    Par cyberdevelopment dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2006, 15h04
  3. Réponses: 5
    Dernier message: 21/04/2006, 12h03
  4. Declaration plusieurs DTD dans un fichier XML
    Par sebastien2222 dans le forum Valider
    Réponses: 4
    Dernier message: 02/03/2006, 14h34
  5. Plusieurs animations dans un fichier .X
    Par heidi79 dans le forum DirectX
    Réponses: 6
    Dernier message: 25/08/2003, 02h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo