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

Projets Discussion :

Nouveau moteur de jeux vidéo - présentation et recrutement.


Sujet :

Projets

  1. #261
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 053
    Billets dans le blog
    12
    Par défaut
    Chez moi aucun soucis, j'utilise la version de gli dans vcpkg, datée de 2021-07-06.

    Le résultat, après ajustement de l'intensité lumineuse à 2 au lieu des 110 du fbx (environ 12ms de frame time) :
    Nom : Bistro_v5_2.jpg
Affichages : 112
Taille : 784,9 Ko

    J'ai noté quelques soucis dans le modèle, comme des faces inversées (en haut à gauche, ici, autour des fenêtres on voit qu'il y a quelque chose qui cloche), et l'alpha rejection qui n'est pas correctement prise en compte.
    Mais aucun soucis de textures.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  2. #262
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2023
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Novembre 2023
    Messages : 220
    Par défaut
    gli le charge mais c'est ma fonction qui ne trouve pas le format, il va dans le default ici :

    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
    VkFormat Texture::toVkFormat(gli::format format)
            {
                std::cout << format<<std::endl;;
                switch (format)
                {
                    // BC1
                    case gli::FORMAT_RGBA_DXT1_UNORM_BLOCK8:
                        return VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
                    case gli::FORMAT_RGBA_DXT1_SRGB_BLOCK8:
                        return VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
     
                        // BC3
                    case gli::FORMAT_RGBA_DXT5_UNORM_BLOCK16:
                        return VK_FORMAT_BC3_UNORM_BLOCK;
                    case gli::FORMAT_RGBA_DXT5_SRGB_BLOCK16:
                        return VK_FORMAT_BC3_SRGB_BLOCK;
     
                        // BC4
                    case gli::FORMAT_R_EAC_UNORM_BLOCK8:
                        return VK_FORMAT_BC4_UNORM_BLOCK;
                    case gli::FORMAT_R_EAC_SNORM_BLOCK8:
                        return VK_FORMAT_BC4_SNORM_BLOCK;
     
                        // BC5
                    case gli::FORMAT_RG_EAC_UNORM_BLOCK16:
                        return VK_FORMAT_BC5_UNORM_BLOCK;
                    case gli::FORMAT_RG_EAC_SNORM_BLOCK16:
                        return VK_FORMAT_BC5_SNORM_BLOCK;
     
                        // BC6H
                    case gli::FORMAT_RGB_BP_UFLOAT_BLOCK16:
                        return VK_FORMAT_BC6H_UFLOAT_BLOCK;
                    case gli::FORMAT_RGB_BP_SFLOAT_BLOCK16:
                        return VK_FORMAT_BC6H_SFLOAT_BLOCK;
     
                        // BC7
                    case gli::FORMAT_RGBA_BP_UNORM_BLOCK16:
                        return VK_FORMAT_BC7_UNORM_BLOCK;
                    case gli::FORMAT_RGBA_BP_SRGB_BLOCK16:
                        return VK_FORMAT_BC7_SRGB_BLOCK;
     
                        // RGBA8
                    case gli::FORMAT_RGBA8_UNORM_PACK8:
                        return VK_FORMAT_R8G8B8A8_UNORM;
                    case gli::FORMAT_RGBA8_SRGB_PACK8:
                        return VK_FORMAT_R8G8B8A8_SRGB;               
                    default:
                        throw std::runtime_error("Unsupported DDS format");
                }
            }
    Et le format 141 je sais pas c'est lequel et l'IA non plus a, quand je compte l'enum j'arrive à celui-ci, gli::FORMAT_RGB_BP_UFLOAT_BLOCK16, mais c'est pas celui là il va toujours dans le default. Faudrait une fonction toute faîte pour faire ça parce que faire ça à l'a main c'est vraiment galère!!! Surtout qu'il y a pleins de format différent!!!

    EIDT : C''est bon j'ai trouvé c'était lequel.

  3. #263
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 053
    Billets dans le blog
    12
    Par défaut
    Les formats EAC ne sont pas les formats BC...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  4. #264
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2023
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Novembre 2023
    Messages : 220
    Par défaut
    Ah! C'est pour ça que j'ai des soucis avec l'affichage des textures...

    Au sinon, j'ai mis à jour le repo, j'ai fait plusieurs descripteurs sets par type de texture, j'ai aussi utilisé meshoptimizer pour faire du lod, et après, j'attaque la gestion des mipmap, et j'en aurait terminé une bonne fois pour toute avec les fondations du moteur, ça fait 10-15 ans que je cherche à avoir une architecture solide/performante/stable et simple.

  5. #265
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2023
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Novembre 2023
    Messages : 220
    Par défaut
    Ok j'ai réussi à faire une fonction de conversion de format qui fonctionne, la version de gli de vcpkg sur linux, et sur git est trop ancienne pour convertir les formats automatiquement, gli::vk n'existe pas, y'a que les conversion pour directX et opengl, maintenant je dois optimiser la lecture des .dxx qui est..., trop lente. Et après, voir si mes mipmaps sont bonnes, et enfin si le rendu texturé est enfin bon, inversé mes meshs sur l'axe y qui sont à l'envers, assimp me donne pas les méta-infos correcte pour la scène apparemment.

    Et mon moteur pourra ENFIN AFFICHER BISTRO CORRECTEMENT.

  6. #266
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 053
    Billets dans le blog
    12
    Par défaut
    Avec Assimp, pour les FBX, il y a ces deux flags, que je désactive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    importer.SetPropertyInteger( AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS, 0 ); //< Get rid of $AssimpFbx$_PreRotation nodes
    importer.SetPropertyInteger( AI_CONFIG_FBX_CONVERT_TO_M, 0 ); //< Convert FBX cm to m.
    Et voilà mes flags d'import :
    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
    uint32_t importFlags{ aiProcess_Triangulate
    	| aiProcess_FixInfacingNormals
    	| aiProcess_LimitBoneWeights
    	| aiProcess_FindDegenerates };
    if ( !parameters.get< bool >( cuT( "no_validation" ) ) )
    	importFlags |= aiProcess_ValidateDataStructure
    		| aiProcess_FindInvalidData;
    if ( !parameters.get< bool >( cuT( "no_optimisations" ) ) )
    	importFlags |= aiProcess_JoinIdenticalVertices
    		| aiProcess_OptimizeMeshes
    		| aiProcess_OptimizeGraph
    		| aiProcess_ImproveCacheLocality
    		| aiProcess_RemoveRedundantMaterials;
    if ( parameters.get< c3d::String >( cuT( "normals" ) ) == cuT( "smooth" ) )
    	importFlags |= aiProcess_GenSmoothNormals;
    if ( parameters.get< bool >( cuT( "tangent_space" ) ) )
    	importFlags |= aiProcess_CalcTangentSpace;
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #267
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2023
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Novembre 2023
    Messages : 220
    Par défaut
    Ok, merci, j'ai optimisé le chargement de la scène, ça va beaucoup plus vite qu'avant, 9-10 secondes hors qu'avant il fallait plusieurs minutes. Mais j'ai toujours un soucis avec les textures (dernier problème à régler) :
    Nom : Capture d’écran du 2026-06-04 11-01-17.png
Affichages : 81
Taille : 182,4 Ko

  8. #268
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2023
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Novembre 2023
    Messages : 220
    Par défaut
    Ok, j'ai corrigé le soucis, problème de format :

    Nom : Capture d’écran du 2026-06-04 15-32-50.png
Affichages : 73
Taille : 306,0 Ko

  9. #269
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 053
    Billets dans le blog
    12
    Par défaut
    Tu as des soucis dans ton import des positions/rotations des nodes, je pense.

    Pour t'aider à les débugger et corriger, je te conseille les Deccer's cubes, qui sont pas mal pour s'assurer que les hiérarchies de noeuds sont traitées correctement.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  10. #270
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2023
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Novembre 2023
    Messages : 220
    Par défaut
    Oui, j'ai encore des soucis avec ça..., pour la scène bistro, les nodes (ou mesh ?) ne sont pas au bonne endroit. J'ai fini d'implémenter mon système de particules "GPU-Driven", ça fonctionne : Nom : Capture d’écran du 2026-06-06 19-23-50.png
Affichages : 48
Taille : 10,2 Ko

    Je vais attaquer les animations donc. (Bones et par frame, donc, skinning et morphing)

  11. #271
    Membre actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Novembre 2023
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Novembre 2023
    Messages : 220
    Par défaut Scène bistro, correction.
    Voilà j'ai corrigé le bug avec la scènes bistro est les mauvaise positions des meshes, déjà j'ai dû faire un scale de -1 en z. (Sinon c'est à l'envers) J'ai dû inverser la normale dans le fragment shader. (sinon éclairage pas bon) Scène bistro en left handed ?

    Par contre y'a un soucis de pivo ou l'AABB du node avec les guirlandes dont le centre est au niveau du sol : J'ai désactivé le blending j'ai changé le signe z de l'axe forward de la vue pour que mon moteur soit en right-handed, tout comme avec vulkan.

    Nom : Capture d’écran du 2026-06-07 21-34-08.png
Affichages : 29
Taille : 396,6 Ko

    Pourtant je multiplie bien par le node du parent :

    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    GameObject* ModelLoader::loadModel(std::string path, bool loadTextures) {
                //std::cout<<"load model : "<<path<<std::endl;
                Model* model = new Model(math::Vec3f(0.f, 0.f, 0.f), math::Vec3f(0.f, 0.f, 0.f),math::Vec3f(0.f, 0.f, 0.f), "E_MODEL");
                Assimp::Importer importer;
                //std::cout<<"import"<<std::endl;
                const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate |
                                                                    /*aiProcess_JoinIdenticalVertices |
                                                                    aiProcess_SortByPType |
                                                                    aiProcess_GenNormals |
                                                                    aiProcess_ImproveCacheLocality |
                                                                    aiProcess_OptimizeMeshes |
                                                                    aiProcess_OptimizeGraph |
                                                                    aiProcess_GlobalScale |*/
                                                                    aiProcess_FlipUVs);
                //std::cout<<"imported"<<std::endl;
                if(!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
                {
                    std::cerr << "ERROR::ASSIMP::" << importer.GetErrorString() << std::endl;
                    return model;
                }
                if(path.find("/") != std::string::npos)
                    directory = path.substr(0, path.find_last_of('/'));
                else
                    directory = "";
                math::Matrix4f transform;
                transform.identity();
                clk2.restart();
                processNode(transform, scene->mRootNode, scene, model, loadTextures);
                //Material::updateIds();
     
     
                std::vector<ImageLoader> imageLoaders;
                size_t totalImagesSize = 0;
                for (unsigned int i = 0; i < textureManager.getAliases().size(); i++) {
                    std::string alias = textureManager.getAliases()[i];
                    ImageLoader imageLoader;
     
                    if (textureManager.getAliases()[i].length() > 0 && textureManager.getAliases()[i].at(0) == '*') {
                        //std::cout<<"load texture from memory!"<<std::endl;
                        int index = atoi(textureManager.getAliases()[i].data() + 1);
                        aiTexture* tex = scene->mTextures[index];
                        //std::cout<<"enqueue!"<<std::endl;
                        imageLoader.loadFromMemory(tex->pcData, tex->mWidth);
                    } else {
                        imageLoader.loadFromFile(alias);
                    }
                    /*std::cout << "Texture " << i
                      <<" size=" << imageLoaders[i].getDataSize()
                      <<" w=" << imageLoaders[i].getSize().x()
                      <<" h=" << imageLoaders[i].getSize().y()
                      <<" offset=" << dataOffset
                      <<" offset + size : "<<dataOffset+imageLoaders[i].getDataSize()
                      <<" total image size : "<<totalImagesSize.load()
                      << std::endl;*/
                    Texture* texture = textureManager.getResourceByAlias(alias);
                    if (imageLoader.isCompressed()) {
                        texture->setFormat(imageLoader.getVkFormat());
                    } else {
                        texture->setFormat(VK_FORMAT_R8G8B8A8_SRGB);
                    }
                    texture->setSize(imageLoader.getSize());
                    texture->create(imageLoader.getSize().x(), imageLoader.getSize().y(),1, imageLoader.getMipLevels());
                    for (unsigned int j = 0; j < imageLoader.getMipLevels(); j++) {
                        totalImagesSize = (totalImagesSize + 15) & ~15;
                        totalImagesSize += imageLoader.getDataSize(j);
     
                    }
                    imageLoaders.push_back(imageLoader);
                }
                commandPool.beginRecordCommandBuffer(0);
                staggingBuffer.create(totalImagesSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY);
                std::size_t dataOffset = 0;
                for (unsigned int i = 0; i < imageLoaders.size(); i++) {
                    //std::cout<<"compressée ? : "<<imageLoaders[i].isCompressed()<<std::endl;
                    for (unsigned int j = 0; j < imageLoaders[i].getMipLevels(); j++) {
                        // align offset to 16 bytes
                        /*for (unsigned int p = 0; p < imageLoaders[i].getDataSize(j); p++) {
                            std::cout<<"pixel : "<<(int)imageLoaders[i].getPixelsPtr(j)[p]<<std::endl;
                        }*/
                        dataOffset = (dataOffset + 15) & ~15;
                        staggingBuffer.update(imageLoaders[i].getPixelsPtr(j), imageLoaders[i].getDataSize(j), dataOffset);
                        textureManager.getResourceByAlias(textureManager.getAliases()[i])->update(commandPool, staggingBuffer, imageLoaders[i].getSize(j).x(), imageLoaders[i].getSize(j).y(), 0, 0, dataOffset, j);
                        /*std::cout << "mip " << j << " size = " << imageLoaders[i].getDataSize(j)
                        << "  offset : " << dataOffset << std::endl;*/
     
                        dataOffset += imageLoaders[i].getDataSize(j);
     
     
                    }
                }
                commandPool.endRecordCommandBuffer(0);
                VkSubmitInfo submitInfo{};
                submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
                submitInfo.commandBufferCount = 1;
                submitInfo.pCommandBuffers = &commandPool.getHandle(0);
                Device::QueueFamilyIndices indices = device.findQueueFamilies(device.getPhysicalDevice());
                if (vkQueueSubmit(device.getQueue(indices.graphicsFamily.value(), 0), 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS) {
                    throw std::runtime_error("Echec de l'envoi d'un command buffer!");
                }
                vkDeviceWaitIdle(device.getDevice());
                std::cout<<"scene loading time : "<<clk2.getElapsedTime().asMilliseconds()<<"ms"<<std::endl;
                return model;
            }
            void ModelLoader::processNode(math::Matrix4f parentTransform, aiNode *node, const aiScene *scene, Model* model, bool loadTextures)
            {
                //std::cout<<"process node"<<std::endl;
                // process all the node's meshes (if any)
                math::Matrix4f nodeLocal = AssimpHelpers::convertAssimpToODFAEGMatrix(node->mTransformation);
                math::Matrix4f world = parentTransform * nodeLocal;
                //std::cout<<"parent : "<<parentTransform<<std::endl<<"node : "<<nodeLocal<<std::endl;
                //std::cout<<"nb meshes to load : "<<node->mNumMeshes<<std::endl;
                clk.restart();
                jobFence.reset(node->mNumMeshes);
                for(unsigned int i = 0; i < node->mNumMeshes; i++)
                {
                    aiMesh *mesh = scene->mMeshes[node->mMeshes[i]];
                    threadPool.enqueue([this, world, mesh, node, scene, model, loadTextures] {
                        processMesh(world, node, mesh, scene, model, loadTextures);
                        jobFence.jobDone();
                    });
                }
                jobFence.wait();
                //std::cout<<"loading meshes time : "<<clk.getElapsedTime().asMilliseconds()<<"ms"<<std::endl;
                // then do the same for each of its children
                for(unsigned int i = 0; i < node->mNumChildren; i++)
                {
                    processNode(world, node->mChildren[i], scene, model, loadTextures);
                }
            }
            void ModelLoader::processMesh(math::Matrix4f world, aiNode* node, aiMesh *mesh, const aiScene *scene, Model* model, bool loadTextures) {
                //world = world.transpose();
                //std::lock_guard<std::recursive_mutex> lock(rec_mutex);
                SubMesh subMesh(device);
     
                for (unsigned int i = 0; i < Material::NBTEXTYPES; i++)
                    subMesh.getMaterial().setTexture(nullptr, static_cast<Material::TexType>(i));
     
                if(mesh->mMaterialIndex >= 0) {
                    //std::cout<<"load materials"<<std::endl;
     
     
                    aiMaterial *material = scene->mMaterials[mesh->mMaterialIndex];
     
                    if (loadTextures) {
                        std::vector<Texture*> diffuseMaps = loadMaterialTextures(scene, material,
                                                            aiTextureType_DIFFUSE);
                        for (unsigned int i = 0; i < diffuseMaps.size(); i++) {
                            subMesh.getMaterial().setTexture(diffuseMaps[i], Material::DIFFUSE, i);
                        }
                        std::vector<Texture*> specularMaps = loadMaterialTextures(scene, material,
                                                            aiTextureType_SPECULAR);
                        for (unsigned int i = 0; i < specularMaps.size(); i++) {
                            specularMaps[i]->setTexType(Material::SPECULAR);
                            subMesh.getMaterial().setTexture(specularMaps[i], Material::SPECULAR, i);
                        }
                        std::vector<Texture*> normalMaps = loadMaterialTextures(scene, material, aiTextureType_NORMALS);
                        for (unsigned int i = 0; i < normalMaps.size(); i++) {
                            //std::cout<<"normals"<<std::endl;
                            normalMaps[i]->setTexType(Material::NORMAL);
                            subMesh.getMaterial().setTexture(normalMaps[i], Material::NORMAL,i);
                        }
                        std::vector<Texture*> metalnessMaps = loadMaterialTextures(scene, material, aiTextureType_METALNESS);
                        for (unsigned int i = 0; i < metalnessMaps.size(); i++) {
                            //std::cout<<"metalness"<<std::endl;
                            metalnessMaps[i]->setTexType(Material::METALNESS);
                            subMesh.getMaterial().setTexture(metalnessMaps[i], Material::METALNESS, i);
                        }
                        std::vector<Texture*> roughnessMaps = loadMaterialTextures(scene, material, aiTextureType_DIFFUSE_ROUGHNESS);
                        for (unsigned int i = 0; i < roughnessMaps.size(); i++) {
                            //std::cout<<"roughness"<<std::endl;
                            roughnessMaps[i]->setTexType(Material::ROUGHNESS);
                            subMesh.getMaterial().setTexture(roughnessMaps[i], Material::ROUGHNESS, i);
                        }
                        std::vector<Texture*> aoMaps = loadMaterialTextures(scene, material, aiTextureType_AMBIENT_OCCLUSION);
                        for (unsigned int i = 0; i < aoMaps.size(); i++) {
                            //std::cout<<"ao"<<std::endl;
                            aoMaps[i]->setTexType(Material::AO);
                            subMesh.getMaterial().setTexture(aoMaps[i], Material::AO, i);
                        }
                        std::vector<Texture*> emissiveMaps = loadMaterialTextures(scene, material, aiTextureType_EMISSIVE);
                        for (unsigned int i = 0; i < emissiveMaps.size(); i++) {
                            //std::cout<<"emissive"<<std::endl;
                            emissiveMaps[i]->setTexType(Material::EMISSIVE);
                            subMesh.getMaterial().setTexture(emissiveMaps[i], Material::EMISSIVE, i);
                        }
                    }
     
                }
     
                int upAxis = 1;
                int upSign = 1;
                int frontAxis = 2;    // default Z-forward
                int frontSign = 1;
                int coordAxis = 0;    // default X-right
                int coordSign = 1;
                if (scene->mMetaData) {
                    scene->mMetaData->Get("UpAxis", upAxis);
                    scene->mMetaData->Get("UpAxisSign", upSign);
                    scene->mMetaData->Get("FrontAxis", frontAxis);
                    scene->mMetaData->Get("FrontAxisSign", frontSign);
                    scene->mMetaData->Get("CoordAxis", coordAxis);
                    scene->mMetaData->Get("CoordAxisSign", coordSign);
                }
                enum Axis { X = 0, Y = 1, Z = 2 };
                Axis sceneUpAxis    = (Axis)upAxis;
                Axis sceneFrontAxis = (Axis)frontAxis;
                Axis sceneCoordAxis = (Axis)coordAxis;
                int sceneUpSign     = upSign;
                int sceneFrontSign  = frontSign;
                int sceneCoordSign  = coordSign;
                bool isLeftHandled = false;
                //math::Matrix4f m = AssimpHelpers::convertAssimpToODFAEGMatrix(node->mTransformation);
                float det = world.getDet();
                bool isLeftHanded = false;
                if (det > 0.0f) {
                    //std::cout<<"left handed!"<<std::endl;
                    isLeftHanded = true;
                }
                entity::TransformMatrix axisCorrection, handednessCorrection, scaleCorrection;
                axisCorrection.reset();
                handednessCorrection.reset();
                scaleCorrection.reset();
                // 1. Correction UP (Z-up → Y-up)
                if (sceneUpAxis == Axis::Z) {
                    axisCorrection.setRotation(math::Vec3f(1.f,0.f,0.f), -90.f);
                }
     
                // 2. Correction FRONT (Y-forward → -Z-forward)
                if (sceneFrontAxis == Axis::Y) {
                    axisCorrection.setRotation(math::Vec3f(0.f,0.f,1.f), 180.f);
                }
     
                // 3. Correction handedness
                if (isLeftHanded) {
                    axisCorrection.setScale(math::Vec3f(1.f,1.f,-1.f));
                }
                //std::cout<<"materials loaded : "<<mat.getTexture()<<std::endl;
                std::vector<Vertex> vertices;
                vertices.resize(mesh->mNumVertices);
                VertexBuffer vb(device, Triangles, MAX_FRAMES_IN_FLIGHT);
                vb.resize(mesh->mNumVertices, 0);
                /*unsigned int uvCount = 0;
                for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; i++) {
                    if (mesh->mTextureCoords[i] != nullptr)
                        uvCount++;
                }
                std::cout<<"nb uvs : "<<uvCount<<std::endl;*/
                for (unsigned int i = 0; i < mesh->mNumVertices; i++)
                {
                    vertices[i].position[0] = mesh->mVertices[i].x;
                    vertices[i].position[1] = mesh->mVertices[i].y;
                    vertices[i].position[2] = mesh->mVertices[i].z;
                    if (mesh->mTextureCoords[0] && subMesh.getMaterial().getTexture(Material::DIFFUSE) != nullptr)
                    {
                        vertices[i].texCoords[0] = mesh->mTextureCoords[0][i].x/* * mat.getTexture()->getSize().x()*/;
                        vertices[i].texCoords[1] = mesh->mTextureCoords[0][i].y/* * mat.getTexture()->getSize().y()*/;
                        /*if (vertices[i].texCoords[0] == 0 && vertices[i].texCoords[1] == 0) {
                            std::cout<<"error!"<<std::endl;
                        }*/
                        /*std::cout<<"tex coords : "<<vertices[i].texCoords[0]<<std::endl;
                        std::cout<<"tex coords : "<<vertices[i].texCoords[1]<<std::endl;*/
                    } else {
                        vertices[i].texCoords = math::Vec2f(0.f, 0.f);
                    }
                    vertices[i].normal[0] = mesh->mNormals[i].x;
                    vertices[i].normal[1] = mesh->mNormals[i].y;
                    vertices[i].normal[2] = mesh->mNormals[i].z;
                    vb[i] = vertices[i];
                }
                physic::BoundingBox bounds = vb.getBounds();
     
                if (bounds.getSize().x() > 1000 && bounds.getSize().y() > 1000 && bounds.getSize().z() > 1000) {
                    scaleCorrection.setScale(math::Vec3f(0.01f, 0.01f, 0.01f));
                }
                math::Matrix4f finalCorrection = scaleCorrection.getMatrix() *
                                                axisCorrection.getMatrix() *
                                                handednessCorrection.getMatrix();
                math::Matrix4f finalTransform = world * finalCorrection;
                //std::cout<<"final correction : "<<finalCorrection<<std::endl;
                for (unsigned int i = 0; i < vb.getVertexCount(); i++) {
                    vb[i].position = finalTransform * vb[i].position;
                    vb[i].normal = finalCorrection * vb[i].normal;
                    //std::cout<<"vertex position : "<<vb[i].position<<std::endl;
                }
                for(unsigned int i = 0; i < mesh->mNumFaces; i++)
                {
                    aiFace face = mesh->mFaces[i];
                    //std::cout<<"add face : "<<face.mNumIndices<<std::endl;
                    for(unsigned int j = 0; j < face.mNumIndices; j++) {
                        //std::cout<<"index : "<<face.mIndices[j]<<std::endl;
                        vb.addIndex(face.mIndices[j]);
                    }
                }
                subMesh.setVertexBuffer(vb);
                std::lock_guard<std::recursive_mutex> lock(rec_mutex);
                /*math::Vec3f center = vb.getBounds().getCenter();
                math::Vec3f worldPos = finalTransform * center;
     
                std::cout << "Mesh world pos = " << worldPos << std::endl;*/
                //std::cout<<"vertices loaded"<<std::endl;
                extractBoneWeightForVertices(vertices, mesh, scene, model);
     
     
                //std::cout<<"bone loaded"<<std::endl;
     
     
     
     
                //std::cout<<"vertices : "<<vb.getVertexCount()<<std::endl;
                //std::cout<<"indexes : "<<vb.getIndexCount()<<std::endl;
                /*if (mat.getTexture() == nullptr) {
                    std::cout<<"material id : "<<mat.getId()<<std::endl;
                } else {
                    //std::cout<<"texture"<<std::endl;
                }*/
                model->addSubMesh(std::move(subMesh));
                model->setSize(vb.getBounds().getSize());
            }
    PS : J'ai corrigé aussi un bug avec les textures. (id détruit à cause de move, j'ai retiré le move et fait une copie)

Discussions similaires

  1. MANU, un nouveau moteur de jeux vidéo ne nécessitant pas de code
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 12/04/2020, 14h53
  2. Intrinsic : un nouveau moteur de jeux open source basé sur Vulkan
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 18
    Dernier message: 23/11/2016, 11h09
  3. Un nouveau moteur de jeux vidéo voit le jour : Lumberyard, développé par Amazon
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 11/02/2016, 15h02
  4. Paladin : un nouveau projet de moteur de jeux par la communauté Mozilla.
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 19
    Dernier message: 09/09/2011, 12h40
  5. Creer un nouveau moteur de jeux
    Par khenissi dans le forum Moteurs de jeux vidéo
    Réponses: 4
    Dernier message: 28/07/2010, 14h54

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