better rendering loop
This commit is contained in:
parent
938e2434e4
commit
4162e6d302
@ -58,17 +58,6 @@ int w_height(SDL_Window *);
|
||||
int w_width(SDL_Window *);
|
||||
|
||||
|
||||
//#define VNUM(s) (sizeof(s)/sizeof(s[0]))
|
||||
//struct vertex vertbuffer[] = {
|
||||
// { .pos={.x= 0.75f, .y= 0.75f}, .col={ .r=1.0f, .g=0.0f, .b=0.0f, .a=1.0f} },
|
||||
// { .pos={.x=-0.75f, .y=-0.75f}, .col={ .r=1.0f, .g=0.0f, .b=0.0f, .a=1.0f} },
|
||||
// { .pos={.x= 0.75f, .y=-0.75f}, .col={ .r=1.0f, .g=0.0f, .b=0.0f, .a=1.0f} },
|
||||
// { .pos={.x= 0.75f, .y= 0.75f}, .col={ .r=1.0f, .g=0.0f, .b=0.0f, .a=1.0f} },
|
||||
// { .pos={.x=-0.75f, .y=-0.75f}, .col={ .r=1.0f, .g=0.0f, .b=0.0f, .a=1.0f} },
|
||||
// { .pos={.x=-0.75f, .y= 0.75f}, .col={ .r=1.0f, .g=0.0f, .b=0.0f, .a=1.0f} },
|
||||
//};
|
||||
|
||||
|
||||
// this just descrives a farbfeld image
|
||||
// https://tools.suckless.org/farbfeld/
|
||||
struct PACKED _ff {
|
||||
@ -83,6 +72,8 @@ unsigned int fw, fh;
|
||||
struct {
|
||||
struct vertex *v;
|
||||
int size, idx;
|
||||
int prev_idx;
|
||||
unsigned long int hash, prev_hash;
|
||||
} vstack = {0};
|
||||
|
||||
|
||||
@ -95,12 +86,49 @@ void grow_stack(int step)
|
||||
vstack.size += step;
|
||||
}
|
||||
|
||||
|
||||
int vstack_push_quad_c(int x, int y, int w, int h, vec4 color)
|
||||
void push(struct vertex v)
|
||||
{
|
||||
if (vstack.idx <= vstack.size)
|
||||
grow_stack(6);
|
||||
|
||||
vstack.v[vstack.idx++] = v;
|
||||
}
|
||||
|
||||
|
||||
void update_hash()
|
||||
{
|
||||
if (!vstack.idx)
|
||||
return;
|
||||
unsigned int hash = 0x5400F1B3;
|
||||
unsigned char *v = (unsigned char *)vstack.v;
|
||||
int size = vstack.idx;
|
||||
|
||||
for (; size; size--) {
|
||||
hash += v[size-1];
|
||||
hash += hash << 10;
|
||||
hash ^= hash >> 6;
|
||||
}
|
||||
hash += hash << 3;
|
||||
hash ^= hash >> 11;
|
||||
hash += hash << 15;
|
||||
|
||||
vstack.hash = hash;
|
||||
}
|
||||
|
||||
|
||||
void force_changed()
|
||||
{
|
||||
vstack.prev_idx = 0;
|
||||
}
|
||||
|
||||
|
||||
int changed()
|
||||
{
|
||||
return vstack.prev_idx != vstack.idx || vstack.prev_hash != vstack.hash;
|
||||
}
|
||||
|
||||
|
||||
int vstack_push_quad_c(int x, int y, int w, int h, vec4 color)
|
||||
{
|
||||
// x4,y4 x3,y3
|
||||
// +-------------+
|
||||
// |(x,y) /|
|
||||
@ -124,12 +152,12 @@ int vstack_push_quad_c(int x, int y, int w, int h, vec4 color)
|
||||
y4 = y3 = (float)(hh - y) / hh;
|
||||
y1 = y2 = (float)(hh - y-h) / hh;
|
||||
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x1, .pos.y=y1, .color=color };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x2, .pos.y=y2, .color=color };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x3, .pos.y=y3, .color=color };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x1, .pos.y=y1, .color=color };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x3, .pos.y=y3, .color=color };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x4, .pos.y=y4, .color=color };
|
||||
push((struct vertex){ .pos.x=x1, .pos.y=y1, .color=color });
|
||||
push((struct vertex){ .pos.x=x2, .pos.y=y2, .color=color });
|
||||
push((struct vertex){ .pos.x=x3, .pos.y=y3, .color=color });
|
||||
push((struct vertex){ .pos.x=x1, .pos.y=y1, .color=color });
|
||||
push((struct vertex){ .pos.x=x3, .pos.y=y3, .color=color });
|
||||
push((struct vertex){ .pos.x=x4, .pos.y=y4, .color=color });
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -137,9 +165,6 @@ int vstack_push_quad_c(int x, int y, int w, int h, vec4 color)
|
||||
|
||||
int vstack_push_quad_t(int x, int y, int w, int h, int u, int v)
|
||||
{
|
||||
if (vstack.idx <= vstack.size)
|
||||
grow_stack(6);
|
||||
|
||||
// x4,y4 x3,y3
|
||||
// +-------------+
|
||||
// |(x,y) /|
|
||||
@ -171,12 +196,12 @@ int vstack_push_quad_t(int x, int y, int w, int h, int u, int v)
|
||||
v1 = v2 = (float)(v+gh) / fh;
|
||||
v3 = v4 = (float)(v) / fh;
|
||||
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x1, .pos.y=y1, .texture.x=u1, .texture.y=v1 };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x2, .pos.y=y2, .texture.x=u2, .texture.y=v2 };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x3, .pos.y=y3, .texture.x=u3, .texture.y=v3 };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x1, .pos.y=y1, .texture.x=u1, .texture.y=v1 };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x3, .pos.y=y3, .texture.x=u3, .texture.y=v3 };
|
||||
vstack.v[vstack.idx++] = (struct vertex){ .pos.x=x4, .pos.y=y4, .texture.x=u4, .texture.y=v4 };
|
||||
push((struct vertex){ .pos.x=x1, .pos.y=y1, .texture.x=u1, .texture.y=v1 });
|
||||
push((struct vertex){ .pos.x=x2, .pos.y=y2, .texture.x=u2, .texture.y=v2 });
|
||||
push((struct vertex){ .pos.x=x3, .pos.y=y3, .texture.x=u3, .texture.y=v3 });
|
||||
push((struct vertex){ .pos.x=x1, .pos.y=y1, .texture.x=u1, .texture.y=v1 });
|
||||
push((struct vertex){ .pos.x=x3, .pos.y=y3, .texture.x=u3, .texture.y=v3 });
|
||||
push((struct vertex){ .pos.x=x4, .pos.y=y4, .texture.x=u4, .texture.y=v4 });
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -184,6 +209,8 @@ int vstack_push_quad_t(int x, int y, int w, int h, int u, int v)
|
||||
|
||||
void vstack_clear(void)
|
||||
{
|
||||
vstack.prev_hash = vstack.hash;
|
||||
vstack.prev_idx = vstack.idx;
|
||||
vstack.idx = 0;
|
||||
}
|
||||
|
||||
@ -343,12 +370,19 @@ void ren_initshaders()
|
||||
|
||||
void ren_drawvertbuffer()
|
||||
{
|
||||
if (!changed())
|
||||
return;
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, ren.gl_vertbuffer);
|
||||
// upload vertex data
|
||||
glBufferData(GL_ARRAY_BUFFER, vstack.idx*sizeof(struct vertex), vstack.v, GL_DYNAMIC_DRAW);
|
||||
if (vstack.idx != vstack.prev_idx)
|
||||
glBufferData(GL_ARRAY_BUFFER, vstack.idx*sizeof(struct vertex), vstack.v, GL_DYNAMIC_DRAW);
|
||||
else
|
||||
glBufferSubData(GL_ARRAY_BUFFER, 0, vstack.idx*sizeof(struct vertex), vstack.v);
|
||||
// draw vertex data
|
||||
glDrawArrays(GL_TRIANGLES, 0, vstack.idx);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
SDL_GL_SwapWindow(ren.w);
|
||||
}
|
||||
|
||||
|
||||
@ -445,6 +479,7 @@ int main (void)
|
||||
ren_initvertbuffer();
|
||||
|
||||
glClearColor(0.3f, 0.3f, 0.3f, 0.f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
// event loop and drawing
|
||||
SDL_Event ev = {0};
|
||||
@ -454,10 +489,10 @@ int main (void)
|
||||
switch (ev.type) {
|
||||
case SDL_QUIT: running = 0; break;
|
||||
case SDL_WINDOWEVENT:
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
if(ev.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
|
||||
glViewport(0, 0, w_width(ren.w), w_height(ren.w));
|
||||
glScissor(0, 0, w_width(ren.w), w_height(ren.w));
|
||||
force_changed();
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
@ -467,11 +502,10 @@ int main (void)
|
||||
vstack_push_quad_c(200, 0, 10, 10, magenta);
|
||||
vstack_push_quad_c(10, 150, 100, 100, magenta);
|
||||
push_text(250, 250, "ò Ciao Victoria <3");
|
||||
update_hash();
|
||||
|
||||
ren_drawvertbuffer();
|
||||
|
||||
SDL_GL_SwapWindow(ren.w);
|
||||
|
||||
vstack_clear();
|
||||
|
||||
} while(running);
|
||||
|
Loading…
Reference in New Issue
Block a user