OSDN Git Service

first commit
[eliscolors/main.git] / ElisKeyframe.m
1 //
2 //  ElisKeyframe.m
3 //  Elis Colors
4 //
5 //  Created by 柳 on 09/09/15.
6 //  Copyright 2009 __MyCompanyName__. All rights reserved.
7 //
8
9 #import "ElisKeyframe.h"
10
11 static float convertQTTimeToSecond(QTTime t)
12 {
13     return (float)t.timeValue/t.timeScale;
14 }
15
16 @implementation ElisKeyframe
17
18 - (id)init
19 {
20     [super init];
21     timesAndValues = [[NSMutableDictionary alloc] init];
22     cacheTime = NAN;
23     return self;
24 }
25
26 - (void)setValueForTime:(float)value time:(QTTime)time
27 {
28     int i, j;
29     long long tmp1, tmp2;
30     
31     [timesAndValues setObject:[NSNumber numberWithFloat:value] forKey:[NSNumber numberWithFloat:convertQTTimeToSecond(time)]];
32     sortedTimes = [[timesAndValues allKeys] sortedArrayUsingSelector:@selector(compare:)];
33     // 常識的に考えて、NSArrayである必要なくね? Cの配列でよくね?
34     
35     cacheTime = NAN;
36     
37 // Cの配列時代の実装。挿入ソート?
38 //    for(i = 0; i < index-1; i++){
39 //        if(times[i].timeValue == time.timeValue){
40 //            values[i] = value;
41 //            return;
42 //        }
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];
47 //            }
48 //            times[i+1] = time;
49 //            values[i+1] = value;
50 //            return;
51 //        }
52 //    }
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; 
57 //    }else{
58 //        times[index] = times[index-1];
59 //        values[index] = values[index-1];
60 //        times[index-1] = time;
61 //        values[index-1] = value;
62 //        index++;
63 //    }
64 //    return;
65 }
66
67 // いろいろすさまじい。ボトルネックになりそうだなあここ。
68 // 描画を実行する度に2回呼ばれる。キャッシュするか。
69 - (float)getValueForTime:(QTTime)time
70 {
71 //    long long now = time.timeValue;
72 //    int i;
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);
77 //        }
78 //    }
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);
82     
83     if(cacheTime == now) return cacheValue;
84     cacheTime = now;
85     
86     int i, size = [sortedTimes count];
87     
88     if(size == 1){
89         cacheValue = [[timesAndValues objectForKey:[sortedTimes objectAtIndex:0]] floatValue];
90         return cacheValue;
91     }
92     
93     if([[sortedTimes lastObject] floatValue] <= now){
94         cacheValue = [[timesAndValues objectForKey:[sortedTimes lastObject]] floatValue];
95         return cacheValue;
96     }
97     
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]);
106             return cacheValue;
107         }
108     }
109
110
111     return cacheValue;
112 }
113
114 @end