// 加载 AEJSBridge.js light.execute("light://js/AEJSBridge.js"); (function () { //定义素材对象 //并挂在global对象下 var global = global || (function () { return this; }()); var template = {}; global.template = template; template.actionList = []; template.traceList = []; // 用于记录traceID,随人脸检测变化而变化 template.ageList = []; // 用于记录当前的年龄,如果已经>=0,那么不走修改的逻辑 template.faceSizeList = []; // 人脸占比大小list template.compList = []; // 用于记录每一个index对应的节点。每个节点6个元素,包括:baby*2, male*2, female*2 template.offsetList = []; // 用于记录每一个index对应的timeOffset节点。每个节点6个元素,包括:baby*2, male*2, female*2 template.transList = []; // 用于记录每一个index对应的screenTransform节点。每个节点6个元素,包括:baby*2, male*2, female*2 template.hasShown = 0; // 是否发送过消息 template.currTime = 0; template.cacheScale1 = 1; template.cacheScale2 = 1; template.hasFace = false; template.hasLastFace = false; var currShowingID = new Set(); template.needAction = function (action) { var needAction = template.actionList.indexOf(action) === -1; if (needAction) { template.actionList.push(action); } return needAction; } template.resetAction = function () { template.actionList = []; } template.onTemplateInit = function (entityManager, eventManager) { var raw_ids = [84, 288, 21, 140, 40, 208]; var dup_comps = []; var dup_offset = []; var dup_transform = []; for (var i = 0; i < 6; i++) { var comp_image = light.getComponent(entityManager.getEntity(raw_ids[i]), "Image"); comp_image.enabled = false; var comp = light.getComponent(entityManager.getEntity(raw_ids[i]), "FaceTracking"); var subdup = comp.duplicate_entity_id_; var subcomps = []; var suboffset = []; var subtrans = []; // console.error('GYGYGY entity size %d',subdup.size()) for (var j = 0; j <= subdup.size(); j++) { // 每一个复制项,都置为false var sub_id = raw_ids[i]; if (j > 0) { sub_id = subdup.get(j - 1); } var item = light._getComponent(entityManager.getEntity(sub_id), "Image"); // console.error('GYGYGY entity %d',sub_id) item.enabled = false; subcomps.push(item); var item2 = light._getComponent(entityManager.getEntity(sub_id), "TimeOffset"); suboffset.push(item2); var item3 = light._getComponent(entityManager.getEntity(sub_id), "ScreenTransform"); subtrans.push(item3); } dup_comps.push(subcomps); dup_offset.push(suboffset); dup_transform.push(subtrans); } for (var i = 0; i < 5; i++){ template.traceList.push(-999); template.ageList.push(-999); template.faceSizeList.push(0); var compArr = []; var offsetArr = []; var transArr = []; for (var j = 0; j < 6; j++) { compArr.push(dup_comps[j][i]); offsetArr.push(dup_offset[j][i]); transArr.push(dup_transform[j][i]); } template.compList.push(compArr); // 记录全局的节点们 template.offsetList.push(offsetArr); // 记录全局的节点们 template.transList.push(transArr); // 记录全局的节点们 } // 获取脚本Component template.script_component_1 = light.getComponent(entityManager.getEntity(30), "Script"); // new出一个VectorString对象 var aiRequire = new light.VectorString(); // 并add需要打开的AIKey aiRequire.add("event.touchPoint"); aiRequire.add("Age"); aiRequire.add("Gender"); aiRequire.add("Expression"); aiRequire.add("Face_Point"); // 要求给人脸点 // 将VectorString对象赋值给脚本Component template.script_component_1.aiRequire = aiRequire; // 并通过事件发射出去 eventManager.emit(new light.ScriptOpenAIEvent(entityManager, aiRequire)); // console.error('GYGYGY on init!'); } template.onFacedetected = function (trackIds, entityManager, eventManager) { // console.error(trackIds); if (trackIds.length <= 0) { return; } template.hasFace = true; var traceID_size = trackIds.length; for (var i = 0; i < traceID_size; i++) { template.traceList[i] = trackIds[traceID_size - 1 - i]; // console.error('GYGYGY did trace %d %d', i, trackIds[i]); } for (var i = traceID_size; i < 5; i++) { template.traceList[i] = -999; } // // 这里让第0个人显示 // var complist = template.compList[0]; // complist[0].enabled = true; // complist[1].enabled = true; } template.onFrameUpdate = function (currentTime, entityManager, eventManager) { template.currTime = currentTime; if(template.hasFace && !template.hasLastFace) { template.hasLastFace = true; var raw_ids = [84, 288, 21, 140, 40, 208]; for (var i = 0; i < 6; i++) { var comp = light.getComponent(entityManager.getEntity(raw_ids[i]), "TimeOffset"); comp.startOffset = template.currTime * 1000; } } } template.onAIDataRequire = function (params) { var key = "Face_Point"; // "Hand_Point", "Body_Point" var personIndex = 0; var value; if (params.hasOwnProperty(key)) { value = params[key]; if (value) { // console.error('GYGYGY value', value.length); for (var i = 0; i < value.length; i++){ var person = value[i]; if (person) { var minx = 99999, miny = 99999, maxx = -99999, maxy = -99999; // for (let j = 0; j < person.point_array_.size(); j+=2) { // var fvalue = person.point_array_.get(j); // if (minx > fvalue) minx = fvalue; // if (maxx < fvalue) maxx = fvalue; // fvalue = person.point_array_.get(j+1); // if (miny > fvalue) miny = fvalue; // if (maxy < fvalue) maxy = fvalue; // } var dx = person.point_array_.get(18*2) - person.point_array_.get(0); var dy = person.point_array_.get(18*2+1) - person.point_array_.get(0+1); var faceSizeX = (Math.sqrt(dx * dx + dy * dy)) / person.canvas_width_; // var faceSizeX = (Math.sqrt(dx * dx + dy * dy)) / (480.0 * (person.canvas_height_ / 1280.0)); for (var j = 0; j < 5; j++){ if (template.traceList[j] == person.id_) { template.faceSizeList[j] = faceSizeX; } } // console.error('GYGYGY ', i, person.id_); } } } } } function changeComponentState(component, item, index, enable) { var cID = item * 10 + index; if (!enable) { component.enabled = false; currShowingID.delete(cID); template.offsetList[item][index].startOffset = 0; return; } var face_size = template.faceSizeList[item]; if (face_size <= 0) { return; } component.enabled = true; // 这里根据大小,设置scale var min = 0.3; var max = 0.424; var scale = 0.6 / face_size; if (face_size > min && face_size < max) { scale = 1; } else if (face_size < min) { scale = scale / (0.6 / min); } else { scale = scale / (0.6 / max); } // console.error('GYGYGY scale ', scale, face_size); if (index % 2 == 1) { template.transList[item][index].scale = new light.Vec3(scale,scale,scale); } } template.onAge = function (ageMap, entityManager, eventManager) { // console.error('GYGYGY ',template.faceSizeList[0], template.faceSizeList[1], template.faceSizeList[2]); // console.error(ageMap); var filled = [0,0,0,0,0]; var has_fill = 0; for (var i = 0; i < 5 && i < ageMap.length; i++){ var ii = -999; for (var j = 0; j < 5; j++){ if (ageMap[i][0] == template.traceList[j]) { ii = j; break; } } if (ii < 0) { continue; } var cur_age = ageMap[i][1]; if (cur_age < 0 || cur_age > 999) { // age not currect continue; } filled[ii] = 1; var complist = template.compList[ii]; if (cur_age < 15) { // 15岁以下,前两个节点enabled changeComponentState(complist[0], ii, 0, true); changeComponentState(complist[1], ii, 1, true); changeComponentState(complist[2], ii, 2, false); changeComponentState(complist[3], ii, 3, false); changeComponentState(complist[4], ii, 4, false); changeComponentState(complist[5], ii, 5, false); } else { // 后4个节点enabled changeComponentState(complist[0], ii, 0, false); changeComponentState(complist[1], ii, 1, false); changeComponentState(complist[2], ii, 2, true); changeComponentState(complist[3], ii, 3, true); changeComponentState(complist[4], ii, 4, true); changeComponentState(complist[5], ii, 5, true); } if (template.hasShown == 0) { template.hasShown = 1; } } for (var i = 0; i < 5; i++){ if (filled[i] == 1) { continue; } var complist = template.compList[i]; for (var j = 0; j < 6; j++){ changeComponentState(complist[j], i, j, false); } } if (template.hasShown == 1) { // 通知上层 let result = new light.MapStringString(); result.set("material_result", "did_show_image"); eventManager.emit(new light.LightAssetStatusEvent(entityManager,"lightAsset.process.result", result)); template.hasShown = 2; } } }());