diff options
author | inmarket <andrewh@inmarket.com.au> | 2014-08-20 17:44:40 +1000 |
---|---|---|
committer | inmarket <andrewh@inmarket.com.au> | 2014-08-20 17:44:40 +1000 |
commit | 2b47a0708602b45b0b5db120a496bf92232aa4b1 (patch) | |
tree | 6c5965b6bf1d109b853efe64777bbc7ee5548882 /3rdparty/tinygl-0.4-ugfx/src/specbuf.c | |
parent | c06bff3304ed234c3a7f96fd049755ac59228ef7 (diff) | |
parent | 0f3f8f68f87233bf59c3fa68c3dfe1f492a1a478 (diff) | |
download | uGFX-2b47a0708602b45b0b5db120a496bf92232aa4b1.tar.gz uGFX-2b47a0708602b45b0b5db120a496bf92232aa4b1.tar.bz2 uGFX-2b47a0708602b45b0b5db120a496bf92232aa4b1.zip |
Merge branch 'master' into newmouse
Diffstat (limited to '3rdparty/tinygl-0.4-ugfx/src/specbuf.c')
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/src/specbuf.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/3rdparty/tinygl-0.4-ugfx/src/specbuf.c b/3rdparty/tinygl-0.4-ugfx/src/specbuf.c new file mode 100644 index 00000000..7cbfb057 --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/src/specbuf.c @@ -0,0 +1,52 @@ +#include "zgl.h" +#include "msghandling.h" +#include <math.h> +#include <stdlib.h> + +static void calc_buf(GLSpecBuf *buf, const float shininess) +{ + int i; + float val, inc; + val = 0.0f; + inc = 1.0f/SPECULAR_BUFFER_SIZE; + for (i = 0; i <= SPECULAR_BUFFER_SIZE; i++) { + buf->buf[i] = pow(val, shininess); + val += inc; + } +} + +GLSpecBuf * +specbuf_get_buffer(GLContext *c, const int shininess_i, + const float shininess) +{ + GLSpecBuf *found, *oldest; + found = oldest = c->specbuf_first; + while (found && found->shininess_i != shininess_i) { + if (found->last_used < oldest->last_used) { + oldest = found; + } + found = found->next; + } + if (found) { /* hey, found one! */ + found->last_used = c->specbuf_used_counter++; + return found; + } + if (oldest == NULL || c->specbuf_num_buffers < MAX_SPECULAR_BUFFERS) { + /* create new buffer */ + GLSpecBuf *buf = gl_malloc(sizeof(GLSpecBuf)); + if (!buf) gl_fatal_error("could not allocate specular buffer"); + c->specbuf_num_buffers++; + buf->next = c->specbuf_first; + c->specbuf_first = buf; + buf->last_used = c->specbuf_used_counter++; + buf->shininess_i = shininess_i; + calc_buf(buf, shininess); + return buf; + } + /* overwrite the lru buffer */ + /*tgl_trace("overwriting spec buffer :(\n");*/ + oldest->shininess_i = shininess_i; + oldest->last_used = c->specbuf_used_counter++; + calc_buf(oldest, shininess); + return oldest; +} |