TinyGL 0.4.1 for MinGW
specbuf.c
Go to the documentation of this file.
1#include "zgl.h"
2#include "msghandling.h"
3#include <math.h>
4#include <stdlib.h>
5
6static 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
19specbuf_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");
39 buf->next = c->specbuf_first;
40 c->specbuf_first = buf;
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}
void gl_fatal_error(char *format,...)
Definition: error.c:4
void * gl_malloc(int size)
Definition: memory.c:13
GLSpecBuf * specbuf_get_buffer(GLContext *c, const int shininess_i, const float shininess)
Definition: specbuf.c:19
#define SPECULAR_BUFFER_SIZE
Definition: specbuf.h:7
#define MAX_SPECULAR_BUFFERS
Definition: specbuf.h:5
Definition: zgl.h:159
int specbuf_num_buffers
Definition: zgl.h:269
GLSpecBuf * specbuf_first
Definition: zgl.h:267
int specbuf_used_counter
Definition: zgl.h:268
float buf[SPECULAR_BUFFER_SIZE+1]
Definition: specbuf.h:14
int last_used
Definition: specbuf.h:13
int shininess_i
Definition: specbuf.h:12
struct GLSpecBuf * next
Definition: specbuf.h:15