BabylonJS - tags

Mesh tags

by gwenaelhagenmuller

HTML

<script src="https://rawgithub.com/BabylonJS/Babylon.js/v1.9.0/babylon.1.9.0.js"></script>
<canvas id="renderCanvas"></canvas>

CSS

#renderCanvas {
    width: 100%;
    height: 100%;
    min-height: 100%;
}

JavaScript

BABYLON.Scene.prototype.getMeshesByTags = function(tagsQuery) {
    var meshes = this.meshes;
    
    if (tagsQuery === undefined) { // returns all meshes
        return meshes;
    }
    
    var meshesByTags = [];
    
    if (tagsQuery === "") { // returns meshes which have at least one tag
        for(var i in meshes) {
            var mesh = meshes[i];
            if(mesh.tags && mesh.tags !== []) {
                meshesByTags.push(mesh);
            }
        }
    }
    else {
        var toEvaluate = tagsQuery.replace(/[\w-]+/g, function(r) { return "mesh.tags[\"" + r + "\"]"; });
        
        for(var i in meshes) {
            var mesh = meshes[i];
            if(mesh.tags && eval(toEvaluate)) {
                meshesByTags.push(mesh);
            }
        }
    }
    
    return meshesByTags;
}

if (BABYLON.Engine.isSupported()) {
    var canvas = document.getElementById("renderCanvas");
    var engine = new BABYLON.Engine(canvas, true);
    var scene = new BABYLON.Scene(engine);
    var camera = new BABYLON.FreeCamera("Camera", new BABYLON.Vector3(0, 0, -10), scene);
    var light = new BABYLON.PointLight("Omni0", new BABYLON.Vector3(0, 100, 100), scene);
    var cube = BABYLON.Mesh.CreateBox("Box", 2, scene);
   
    var alpha = 0;
    cube.scaling.x = 0.5;
    cube.scaling.z = 3.5;
    
    var cube2 = cube.clone();
    cube2.name = "Box2";
    cube2.rotation.y = Math.PI/4;
    
    var cube3 = cube.clone();
    cube3.name = "Box3";
    cube3.rotation.x = Math.PI/4;
    
    var cube4 = cube.clone();
    cube4.name = "Box4";
    cube4.rotation.Z = Math.PI/4;
    
    cube.tags = [];
    cube.tags["tag1"] = true;
    cube.tags["tag2"] = true;
    cube.tags["tag3"] = true;
    
    cube2.tags = [];
    cube2.tags["tag1"] = true;
    cube2.tags["tag3"] = true;
    cube2.tags["tag4"] = true;
    
    cube3.tags = [];
    
    // cube4 doesn't have the tags property
    
    // Material
    var material = new BABYLON.StandardMaterial("default",...