Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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. }
  53.