blob: 608b6d34cf9409a30a1d607983a6011f42eac19d [file] [log] [blame]
var ExpressionManager = (function(){
var ob = {};
function sum(a,b) {
if(typeof a === 'number' && typeof b === 'number') {
return a + b;
}
if(typeof a === 'object' && typeof b === 'number'){
a[0] = a[0] + b;
return a;
}
if(typeof a === 'number' && typeof b === 'object'){
b[0] = a + b[0];
return b;
}
if(typeof a === 'object' && typeof b === 'object'){
var i = 0, lenA = a.length, lenB = b.length;
var retArr = [];
while(i<lenA || i < lenB){
if(a[i] && b[i]){
retArr[i] = a[i] + b[i];
}else{
retArr[i] = a[i] || b[i];
}
i += 1;
}
return retArr;
}
return 0;
}
function sub(a,b) {
if(typeof a === 'number' && typeof b === 'number') {
return a - b;
}
if(typeof a === 'object' && typeof b === 'number'){
a[0] = a[0] - b;
return a;
}
if(typeof a === 'number' && typeof b === 'object'){
b[0] = a - b[0];
return b;
}
if(typeof a === 'object' && typeof b === 'object'){
var i = 0, lenA = a.length, lenB = b.length;
var retArr = [];
while(i<lenA || i < lenB){
if(a[i] && b[i]){
retArr[i] = a[i] - b[i];
}else{
retArr[i] = a[i] || b[i];
}
i += 1;
}
return retArr;
}
return 0;
}
function mul(a,b) {
if(typeof a === 'number' && typeof b === 'number') {
return a * b;
}
var i, len;
if(typeof a === 'object' && typeof b === 'number'){
len = a.length;
for(i=0;i<len;i+=1){
a[i] = a[i] * b;
}
return a;
}
if(typeof a === 'number' && typeof b === 'object'){
len = b.length;
for(i=0;i<len;i+=1){
b[i] = a * b[i];
}
return b;
}
return 0;
}
function div(a,b) {
if(typeof a === 'number' && typeof b === 'number') {
return a / b;
}
var i, len;
if(typeof a === 'object' && typeof b === 'number'){
len = a.length;
for(i=0;i<len;i+=1){
a[i] = a[i] / b;
}
return a;
}
if(typeof a === 'number' && typeof b === 'object'){
len = b.length;
for(i=0;i<len;i+=1){
b[i] = a / b[i];
}
return b;
}
return 0;
}
function clamp(num, min, max) {
return Math.min(Math.max(num, min), max);
}
function random(min,max){
if(!max){
max = 0;
}
if(min > max){
var _m = max;
max = min;
min = _m;
}
return min + (Math.random()*(max-min));
}
function initiateExpression(elem,data){
var val = data.x;
var transform,content,effect;
var thisComp = elem.comp;
var fnStr = 'var fn = function(){'+val+';this.v = $bm_rt;}';
eval(fnStr);
var bindedFn = fn.bind(this);
var numKeys = data.k ? data.k.length : 0;
function effect(nm){
return elem.effectsManager.getEffect(nm);
}
function nearestKey(time){
var i = 0, len = data.k.length, ob = {};
for(i=0;i<len;i+=1){
if(time === data.k[i].t){
ob.index = i;
break;
}else if(time<data.k[i].t){
ob.index = i;
break;
}else if(time>data.k[i].t && i === len - 1){
ob.index = len - 1;
break;
}
}
return ob;
}
function key(ind){
ind -= 1;
var ob = {
time: data.k[ind].t/thisComp.globalData.frameRate
};
var arr;
if(ind === data.k.length - 1){
arr = data.k[ind-1].e;
}else{
arr = data.k[ind].s;
}
var i, len = arr.length;
for(i=0;i<len;i+=1){
ob[i] = arr[i];
}
return ob;
}
var time, value,textIndex,textTotal,selectorValue;
function execute(){
if(this.type === 'textSelector'){
textIndex = this.textIndex;
textTotal = this.textTotal;
selectorValue = this.selectorValue;
}
if(!transform){
transform = elem.transform;
}
if(!content && elem.content){
content = elem.content.bind(elem);
}
if(this.getPreValue){
this.getPreValue();
}
value = this.pv;
time = this.comp.renderedFrame/this.comp.globalData.frameRate;
bindedFn();
var i,len;
if(this.mult){
if(typeof this.v === 'number'){
this.v *= this.mult;
}else{
len = this.v.length;
if(value === this.v){
this.v = len === 2 ? [value[0],value[1]] : [value[0],value[1],value[2]];
}
for(i = 0; i < len; i += 1){
this.v[i] *= this.mult;
}
}
}
if(typeof this.v === 'number'){
if(this.lastValue !== this.v){
this.lastValue = this.v;
this.mdf = true;
}
}else if(this.v.i){
// Todo Improve validation for masks and shapes
this.mdf = true;
}else{
len = this.v.length;
console.log(this.v);
for(i = 0; i < len; i += 1){
if(this.v[i] !== this.lastValue[i]){
this.lastValue[i] = this.v[i];
this.mdf = true;
}
}
}
}
return execute;
}
ob.initiateExpression = initiateExpression;
return ob;
}());