var materialEntityName = MyAvatar.displayName + "-Avatar-Material-Entity"; var MATERIAL_JSON = "URL TO YOUR MATERIAL HERE!!"; var createAvatarMaterialEntity = function (name) { return Entities.addEntity({ type: "Material", name: name, position: MyAvatar.position, userData: "", materialURL: MATERIAL_JSON, scale: { x: 1, y: 1, z: 1 }, priority: 1, parentMaterialName: "mat::Material", parentID: MyAvatar.sessionUUID }, true) } var clearAllMaterialEntities = function () { var entities = Entities.findEntities(MyAvatar.position, 10); if (entities.length > 0) { for (var index in entities) { var entity = Entities.getEntityProperties(entities[index]); if (entity.clientOnly && entity.type === "Material" && entity.owningAvatarID === MyAvatar.sessionUUID && entity.name.indexOf("Avatar-Material-Entity") !== -1) { Entities.deleteEntity(entity.id); console.log("Found a potential Avatar Material Entity. Removing it.") } } } } clearAllMaterialEntities(); var materialEntity; materialEntity = createAvatarMaterialEntity(materialEntityName); console.log("Created materialEntity", materialEntity); var FPSThrottle = 1 / 24; var timer = 0; var currentTimer = 0; var update = function (dt) { timer += dt; if (timer > FPSThrottle) { currentTimer += dt; // Illusion update var posX = Math.cos(currentTimer * 0.02) + 0.05; var posY = Math.sin(currentTimer * 0.01) + 0.05; var scaleX = Math.abs(2.0 * Math.sin(currentTimer * 0.01)) + 0.1; var scaleY = Math.abs(2.0 * Math.sin(currentTimer * 0.01)) + 0.1; var rot = Math.sin(currentTimer * -0.2) * 360 Entities.editEntity(materialEntity, { materialMappingPos: { x: posX, y: posY }, materialMappingScale: { x: scaleX, y: scaleY }, materialMappingRot: rot }); timer = 0; } // TODO: Throttle Entitity update to 24 fpsw } Script.update.connect(update); Script.scriptEnding.connect(function () { Script.update.disconnect(update); clearAllMaterialEntities(); });