var soundFiles = ["C4.wav", "D4.wav", "E4.wav", "F4.wav", "G4.wav", "A4.wav", "B4.wav", "C5.wav"]; var keyModelURL = Script.resolvePath("xyloKey_2_a_e.fbx"); var keyScriptURL = Script.resolvePath("xylophoneKey.js"); var TEXBLACK = Script.resolvePath("xylotex_bar_black.png"); var malletModelURL = Script.resolvePath("Mallet2-2pc.fbx"); var center = MyAvatar.position; var fwd = {x:0, y:0, z:-1}; var xyloFramePos = Vec3.sum(center, Vec3.multiply(fwd, 0.8)); var xyloFrameID = Entities.addEntity( { name: "Xylophone", type: "Model", modelURL: Script.resolvePath("xylophoneFrameWithWave.fbx"), position: xyloFramePos, rotation: Quat.fromVec3Radians({x:0, y:Math.PI, z:0}), shapeType: "static-mesh", }); center.y += (0.45); //key Y offset from frame var keyPos; var keyRot; for (i=1, len=soundFiles.length; i<=len; i++) { keyRot = Quat.fromVec3Radians({x:0, y:(0.9 - (i*0.2)), z:0}); keyPos = Vec3.sum(center, Vec3.multiplyQbyV(keyRot, fwd)); var ud = { soundFile: soundFiles[i-1] }; var td = { "file4": Script.resolvePath("xylotex_bar" + i + ".png"), "file5": TEXBLACK }; var keyID = Entities.addEntity( { name: ("XyloKey" + i), type: "Model", modelURL: keyModelURL, position: keyPos, rotation: keyRot, shapeType: "static-mesh", script: keyScriptURL, textures: JSON.stringify(td), userData: JSON.stringify(ud), parentID: xyloFrameID, } ); }; //if rezzed on/above something, wait until after model has loaded so you can read its dimensions then move object on to that surface. var pickRay = {origin: center, direction: {x:0, y:-1, z:0}}; var intersection = Entities.findRayIntersection(pickRay, true); if (intersection.intersects && (intersection.distance < 10)) { var surfaceY = intersection.intersection.y; Script.setTimeout( function() { //should add loop to check for fbx loaded instead of delay var xyloDimensions = Entities.getEntityProperties(xyloFrameID, ["dimensions"]).dimensions; xyloFramePos.y = surfaceY + (xyloDimensions.y/2); Entities.editEntity(xyloFrameID, {position: xyloFramePos}); rezMallets(); }, 2000); //timeout (ms) } else { print("No surface detected."); rezMallets(); } function rezMallets() { var malletProps = { name: "Xylophone Mallet", type: "Model", modelURL: malletModelURL, collidesWith: "static,dynamic,kinematic,", collisionMask: 7, collisionsWillMove: 1, dynamic: 1, damping: 1, angularDamping: 1, shapeType: "simple-compound", userData: "{\"grabbableKey\":{\"grabbable\":true}}" }; malletProps.position = Vec3.sum(xyloFramePos, {x: 0.1, y: 0.55, z: 0}); malletProps.rotation = Quat.fromVec3Radians({x:0, y:Math.PI - 0.1, z:0}), Entities.addEntity(malletProps); malletProps.position = Vec3.sum(xyloFramePos, {x: -0.1, y: 0.55, z: 0}); malletProps.rotation = Quat.fromVec3Radians({x:0, y:Math.PI + 0.1, z:0}), Entities.addEntity(malletProps); Script.stop(); };