Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Qt3d Sceneloader: Replace the material component of an Entity with my custom material at runtime



  • i have the following code to load a collada scene using the SceneLoader:

    SceneLoader{
        id: sceneLoader
        source: "file:///home/rui/projects/cad/bodyplacement_lm36_v2.dae"
        
        
        MetalRoughMaterial {
            
            id:metal_mat
            objectName: "MetalRoughMaterial"
            
            metalness: 0
            roughness: 0.9
        }
        
        
        onStatusChanged: {
            console.log("SceneLoader status: " + status);
            if (status == SceneLoader.Ready) {
                console.log("Scene is ready");
                
                var entitynames=sceneLoader.entityNames();
                for (var i = 0; i < entitynames.length; ++i) {
                    
                    var entityname=entitynames[i];
                    var entityvar=sceneLoader.entity(entityname);
                    
                    for (var j = 0; j< entityvar.components.length; ++j) {
                        
                        
                        var cmp=entityvar.components[j]
                        if(cmp){
                            var cmp_class=cmp.toString();
                            if(cmp_class.indexOf("QPhongMaterial")>=0){
                                entityvar.components[j]=metal_mat;
                            }
                            
                        }
                        
                        
                        
                    }
                    
                    
                    
                }
                
                
                
            }
        }
        
        
        
        
    }
    

    as stated in docs (https://doc.qt.io/qt-5/qt3drender-qsceneloader.html#details):

    The loader will try to determine the best material to be used based on the properties of the model file. If you wish to use a custom material, you will have to traverse the tree and replace the default associated materials with yours.

    after i iterate all the entities i try to replace the material component wit the code:

    entityvar.components[j]=metal_mat;
    

    but isn't working. After debugging i can see that the loaded material isn't replaced.

    How can i replace the material component with my custom material at runtime?


Log in to reply