Panda3D
|
00001 #include "zgl.h" 00002 #include <math.h> 00003 #include <stdlib.h> 00004 00005 static void calc_buf(GLSpecBuf *buf, const PN_stdfloat shininess) 00006 { 00007 int i; 00008 PN_stdfloat val, inc; 00009 val = 0.0f; 00010 inc = 1.0f/SPECULAR_BUFFER_SIZE; 00011 for (i = 0; i <= SPECULAR_BUFFER_SIZE; i++) { 00012 buf->buf[i] = pow(val, shininess); 00013 val += inc; 00014 } 00015 } 00016 00017 GLSpecBuf * 00018 specbuf_get_buffer(GLContext *c, const int shininess_i, 00019 const PN_stdfloat shininess) 00020 { 00021 GLSpecBuf *found, *oldest; 00022 found = oldest = c->specbuf_first; 00023 while (found && found->shininess_i != shininess_i) { 00024 if (found->last_used < oldest->last_used) { 00025 oldest = found; 00026 } 00027 found = found->next; 00028 } 00029 if (found) { /* hey, found one! */ 00030 found->last_used = c->specbuf_used_counter++; 00031 return found; 00032 } 00033 if (oldest == NULL || c->specbuf_num_buffers < MAX_SPECULAR_BUFFERS) { 00034 /* create new buffer */ 00035 GLSpecBuf *buf = (GLSpecBuf *)gl_malloc(sizeof(GLSpecBuf)); 00036 if (!buf) gl_fatal_error("could not allocate specular buffer"); 00037 c->specbuf_num_buffers++; 00038 buf->next = c->specbuf_first; 00039 c->specbuf_first = buf; 00040 buf->last_used = c->specbuf_used_counter++; 00041 buf->shininess_i = shininess_i; 00042 calc_buf(buf, shininess); 00043 return buf; 00044 } 00045 /* overwrite the lru buffer */ 00046 oldest->shininess_i = shininess_i; 00047 oldest->last_used = c->specbuf_used_counter++; 00048 calc_buf(oldest, shininess); 00049 return oldest; 00050 }