Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5098 | clevermous | 1 | #include "zgl.h" |
2 | #include "msghandling.h" |
||
3 | #include |
||
4 | #include |
||
5 | |||
6 | static void calc_buf(GLSpecBuf *buf, const float shininess) |
||
7 | { |
||
8 | int i; |
||
9 | float val, inc; |
||
10 | val = 0.0f; |
||
11 | inc = 1.0f/SPECULAR_BUFFER_SIZE; |
||
12 | for (i = 0; i <= SPECULAR_BUFFER_SIZE; i++) { |
||
13 | buf->buf[i] = pow(val, shininess); |
||
14 | val += inc; |
||
15 | } |
||
16 | } |
||
17 | |||
18 | GLSpecBuf * |
||
19 | specbuf_get_buffer(GLContext *c, const int shininess_i, |
||
20 | const float shininess) |
||
21 | { |
||
22 | GLSpecBuf *found, *oldest; |
||
23 | found = oldest = c->specbuf_first; |
||
24 | while (found && found->shininess_i != shininess_i) { |
||
25 | if (found->last_used < oldest->last_used) { |
||
26 | oldest = found; |
||
27 | } |
||
28 | found = found->next; |
||
29 | } |
||
30 | if (found) { /* hey, found one! */ |
||
31 | found->last_used = c->specbuf_used_counter++; |
||
32 | return found; |
||
33 | } |
||
34 | if (oldest == NULL || c->specbuf_num_buffers < MAX_SPECULAR_BUFFERS) { |
||
35 | /* create new buffer */ |
||
36 | GLSpecBuf *buf = gl_malloc(sizeof(GLSpecBuf)); |
||
37 | if (!buf) gl_fatal_error("could not allocate specular buffer"); |
||
38 | c->specbuf_num_buffers++; |
||
39 | buf->next = c->specbuf_first; |
||
40 | c->specbuf_first = buf; |
||
41 | buf->last_used = c->specbuf_used_counter++; |
||
42 | buf->shininess_i = shininess_i; |
||
43 | calc_buf(buf, shininess); |
||
44 | return buf; |
||
45 | } |
||
46 | /* overwrite the lru buffer */ |
||
47 | /*tgl_trace("overwriting spec buffer :(\n");*/ |
||
48 | oldest->shininess_i = shininess_i; |
||
49 | oldest->last_used = c->specbuf_used_counter++; |
||
50 | calc_buf(oldest, shininess); |
||
51 | return oldest; |
||
52 | }>>=> |