-
-
Notifications
You must be signed in to change notification settings - Fork 49
/
ex1_std_shaders.c
134 lines (103 loc) · 2.76 KB
/
ex1_std_shaders.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#define PGL_EXCLUDE_STUBS
#define PORTABLEGL_IMPLEMENTATION
#include "portablegl.h"
#include <stdio.h>
#include <SDL.h>
#define WIDTH 640
#define HEIGHT 480
#ifndef FPS_EVERY_N_SECS
#define FPS_EVERY_N_SECS 1
#endif
#define FPS_DELAY (FPS_EVERY_N_SECS*1000)
vec4 Red = { 1.0f, 0.0f, 0.0f, 1.0f };
SDL_Window* window;
SDL_Renderer* ren;
SDL_Texture* tex;
u32* bbufpix;
glContext the_Context;
void cleanup(void);
void setup_context(void);
int handle_events(void);
int main(int argc, char** argv)
{
setup_context();
float points[] = { -0.5, -0.5, 0,
0.5, -0.5, 0,
0, 0.5, 0 };
GLuint triangle;
glGenBuffers(1, &triangle);
glBindBuffer(GL_ARRAY_BUFFER, triangle);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
glEnableVertexAttribArray(PGL_ATTR_VERT);
glVertexAttribPointer(PGL_ATTR_VERT, 3, GL_FLOAT, GL_FALSE, 0, 0);
// create standard programs and select one for use
GLuint std_shaders[PGL_NUM_SHADERS];
pgl_init_std_shaders(std_shaders);
glUseProgram(std_shaders[PGL_SHADER_IDENTITY]);
pgl_uniforms the_uniforms;
pglSetUniform(&the_uniforms);
the_uniforms.color = Red;
int old_time = 0, new_time=0, counter = 0;
int ms;
while (handle_events()) {
new_time = SDL_GetTicks();
counter++;
ms = new_time - old_time;
if (ms >= FPS_DELAY) {
printf("%d %f FPS\n", ms, counter*1000.0f/ms);
old_time = new_time;
counter = 0;
}
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
SDL_UpdateTexture(tex, NULL, bbufpix, WIDTH * sizeof(u32));
//Render the scene
SDL_RenderCopy(ren, tex, NULL, NULL);
SDL_RenderPresent(ren);
}
cleanup();
return 0;
}
void setup_context()
{
if (SDL_Init(SDL_INIT_VIDEO)) {
printf("SDL_Init error: %s\n", SDL_GetError());
exit(0);
}
window = SDL_CreateWindow("c_ex1", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
if (!window) {
printf("Failed to create window\n");
SDL_Quit();
exit(0);
}
ren = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
tex = SDL_CreateTexture(ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, WIDTH, HEIGHT);
bbufpix = NULL; // should already be NULL since global/static but meh
if (!init_glContext(&the_Context, &bbufpix, WIDTH, HEIGHT, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000)) {
puts("Failed to initialize glContext");
exit(0);
}
}
void cleanup()
{
free_glContext(&the_Context);
SDL_DestroyTexture(tex);
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(window);
SDL_Quit();
}
int handle_events()
{
SDL_Event e;
int sc;
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
return 0;
} else if (e.type == SDL_KEYDOWN) {
sc = e.key.keysym.scancode;
if (sc == SDL_SCANCODE_ESCAPE)
return 0;
}
}
return 1;
}