[1] | 1 | #include "zgl.h" |
---|
| 2 | #include "msghandling.h" |
---|
| 3 | #include <math.h> |
---|
| 4 | #include <stdlib.h> |
---|
| 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 | } |
---|