5 // Created by 柳 on 09/09/15.
6 // Copyright 2009 __MyCompanyName__. All rights reserved.
9 #import "ElisKeyframe.h"
11 static float convertQTTimeToSecond(QTTime t)
13 return (float)t.timeValue/t.timeScale;
16 @implementation ElisKeyframe
21 timesAndValues = [[NSMutableDictionary alloc] init];
26 - (void)setValueForTime:(float)value time:(QTTime)time
31 [timesAndValues setObject:[NSNumber numberWithFloat:value] forKey:[NSNumber numberWithFloat:convertQTTimeToSecond(time)]];
32 sortedTimes = [[timesAndValues allKeys] sortedArrayUsingSelector:@selector(compare:)];
33 // 常識的に考えて、NSArrayである必要なくね? Cの配列でよくね?
38 // for(i = 0; i < index-1; i++){
39 // if(times[i].timeValue == time.timeValue){
43 // if(times[i].timeValue <= time.timeValue && time.timeValue <= times[i+1].timeValue){
44 // for(j = index; j > i+1; j--){
45 // times[j] = times[j-1];
46 // values[j] = values[j-1];
49 // values[i+1] = value;
53 // if(times[index-1].timeValue == time.timeValue) values[index-1] = value;
54 // else if(times[index-1].timeValue <= time.timeValue){
55 // times[index] = time;
56 // values[index++] = value;
58 // times[index] = times[index-1];
59 // values[index] = values[index-1];
60 // times[index-1] = time;
61 // values[index-1] = value;
67 // いろいろすさまじい。ボトルネックになりそうだなあここ。
68 // 描画を実行する度に2回呼ばれる。キャッシュするか。
69 - (float)getValueForTime:(QTTime)time
71 // long long now = time.timeValue;
73 // for(i = 0; i < index-1; i++){
74 // if(times[i].timeValue <= now && now <= times[i+1].timeValue){
75 // return ((float)(times[i+1].timeValue - now) * values[i] +
76 // (float)(now - times[i].timeValue) * values[i+1])/(times[i+1].timeValue - times[i].timeValue);
79 // if(now <= times[0].timeValue) return values[0];
80 // if(times[index-1].timeValue <= now) return values[index-1];
81 float now = convertQTTimeToSecond(time);
83 if(cacheTime == now) return cacheValue;
86 int i, size = [sortedTimes count];
89 cacheValue = [[timesAndValues objectForKey:[sortedTimes objectAtIndex:0]] floatValue];
93 if([[sortedTimes lastObject] floatValue] <= now){
94 cacheValue = [[timesAndValues objectForKey:[sortedTimes lastObject]] floatValue];
98 for(i = 0; i < size-1; i++){
99 if([[sortedTimes objectAtIndex:i] floatValue] <= now &&
100 now <= [[sortedTimes objectAtIndex:i+1] floatValue]){
101 cacheValue = (([[sortedTimes objectAtIndex:i+1] floatValue] - now) *
102 [[timesAndValues objectForKey:[sortedTimes objectAtIndex:i]] floatValue] +
103 (now - [[sortedTimes objectAtIndex:i] floatValue]) *
104 [[timesAndValues objectForKey:[sortedTimes objectAtIndex:i+1]] floatValue]) /
105 ([[sortedTimes objectAtIndex:i+1] floatValue] - [[sortedTimes objectAtIndex:i] floatValue]);