newpoly

view src/main.c @ 0:224206bc554a

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 15 Dec 2017 09:24:39 +0200
parents
children
line source
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdint.h>
5 #include <SDL/SDL.h>
6 #include "poly.h"
7 #include "mgl.h"
9 int init(void);
10 void cleanup(void);
11 void draw(void);
12 void process_event(SDL_Event *ev);
13 void handle_key_event(int key, int pressed);
15 int win_width, win_height;
16 int fb_width = 80, fb_height = 60;
17 int fb_scale = 16;
18 uint32_t *fb_pixels;
19 SDL_Surface *surf;
20 int quit;
22 int opt_grid = 1;
24 int main(int argc, char **argv)
25 {
26 win_width = fb_width * fb_scale;
27 win_height = fb_height * fb_scale;
29 if(SDL_Init(SDL_INIT_VIDEO) == -1) {
30 return 1;
31 }
33 if(!(surf = SDL_SetVideoMode(win_width, win_height, 32, SDL_SWSURFACE))) {
34 fprintf(stderr, "failed to set video mode: %dx%d\n", win_width, win_height);
35 return 1;
36 }
37 SDL_WM_SetCaption("anotherpoly", 0);
39 if(init() == -1) {
40 return 1;
41 }
43 for(;;) {
44 SDL_Event ev;
45 while(SDL_PollEvent(&ev)) {
46 process_event(&ev);
47 if(quit) goto done;
48 }
50 draw();
51 }
53 done:
54 cleanup();
55 SDL_Quit();
56 return 0;
57 }
60 int init(void)
61 {
62 if(!(fb_pixels = malloc(fb_width * fb_height * sizeof *fb_pixels))) {
63 perror("failed to allocate framebuffer");
64 return -1;
65 }
66 if(polyfill_framebuffer(fb_pixels, fb_width, fb_height) == -1) {
67 return -1;
68 }
70 return 0;
71 }
73 void cleanup(void)
74 {
75 free(fb_pixels);
76 }
78 void draw(void)
79 {
80 int i, j;
81 uint32_t *dest, *src;
83 memset(fb_pixels, 0, fb_width * fb_height * sizeof *fb_pixels);
85 mgl_begin(MGL_TRIANGLES);
86 mgl_vertex3f(40, 8, 0);
87 mgl_vertex3f(15, 35, 0);
88 mgl_vertex3f(65, 50, 0);
89 mgl_end();
91 if(SDL_MUSTLOCK(surf)) {
92 SDL_LockSurface(surf);
93 }
94 dest = surf->pixels;
95 src = fb_pixels;
97 for(i=0; i<win_height; i++) {
98 if(opt_grid && (i % fb_scale) == 0) {
99 memset(dest, 0x40, win_width * sizeof *dest);
100 dest += win_width;
101 continue;
102 }
103 for(j=0; j<win_width; j++) {
104 if(opt_grid && (j % fb_scale) == 0) {
105 *dest++ = 0x40404040;
106 } else {
107 *dest++ = src[j / fb_scale];
108 }
109 }
110 if(i % fb_scale == fb_scale - 1) {
111 src += fb_width;
112 }
113 }
115 if(SDL_MUSTLOCK(surf)) {
116 SDL_UnlockSurface(surf);
117 }
119 SDL_Flip(surf);
120 }
122 void process_event(SDL_Event *ev)
123 {
124 switch(ev->type) {
125 case SDL_QUIT:
126 quit = 1;
127 break;
129 case SDL_KEYDOWN:
130 handle_key_event(ev->key.keysym.sym, 1);
131 break;
133 default:
134 break;
135 }
136 }
138 void handle_key_event(int key, int pressed)
139 {
140 if(pressed) {
141 switch(key) {
142 case SDLK_ESCAPE:
143 quit = 1;
144 break;
146 case 'g':
147 opt_grid = !opt_grid;
148 break;
150 default:
151 break;
152 }
153 }
154 }