mirror of
https://github.com/pevans/erc-c.git
synced 2025-01-02 09:29:58 +00:00
Really basic implementation of SDL2.
Plus a crappy rectangle to prove that our vm screen code is working in principle. (It will be removed shortly.)
This commit is contained in:
parent
ad37d59b2d
commit
4ef9e50792
@ -6,11 +6,12 @@ project(erc)
|
|||||||
include(sources.cmake)
|
include(sources.cmake)
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(opengl_library /System/Library/Frameworks/OpenGL.framework)
|
set(sdl_library /Library/Frameworks/SDL2.framework)
|
||||||
|
set(sdl_headers /Library/Frameworks/SDL2.framework/Headers)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT opengl_library)
|
if(NOT sdl_library)
|
||||||
message(FATAL_ERROR "This CMake file is not yet educated as to where OpenGL resides on your platform. Sorry!")
|
message(FATAL_ERROR "This CMake file is not yet educated as to where SDL2 resides on your platform. Sorry!")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
foreach(src ${erc_sources})
|
foreach(src ${erc_sources})
|
||||||
@ -19,7 +20,7 @@ foreach(src ${erc_sources})
|
|||||||
endforeach(src)
|
endforeach(src)
|
||||||
|
|
||||||
# our header files
|
# our header files
|
||||||
include_directories(include /usr/local/include)
|
include_directories(include /usr/local/include ${sdl_headers})
|
||||||
|
|
||||||
link_directories(/usr/local/lib)
|
link_directories(/usr/local/lib)
|
||||||
|
|
||||||
@ -27,4 +28,4 @@ link_directories(/usr/local/lib)
|
|||||||
add_executable(erc ${sources} src/main.c)
|
add_executable(erc ${sources} src/main.c)
|
||||||
|
|
||||||
# Graphics
|
# Graphics
|
||||||
target_link_libraries(erc)
|
target_link_libraries(erc ${sdl_library})
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define _VM_SCREEN_H_
|
#define _VM_SCREEN_H_
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
#define VM_SCREEN_DEFWIDTH 800
|
#define VM_SCREEN_DEFWIDTH 800
|
||||||
#define VM_SCREEN_DEFHEIGHT 600
|
#define VM_SCREEN_DEFHEIGHT 600
|
||||||
@ -15,13 +16,14 @@
|
|||||||
vm_screen_draw_rect(screen, xpos, ypos, 1, 1)
|
vm_screen_draw_rect(screen, xpos, ypos, 1, 1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/*
|
SDL_Window *window;
|
||||||
* These form the components of an RGBA composite color.
|
SDL_Renderer *render;
|
||||||
*/
|
SDL_Rect rect;
|
||||||
int color_red;
|
|
||||||
int color_green;
|
int xcoords;
|
||||||
int color_blue;
|
int ycoords;
|
||||||
int color_alpha;
|
|
||||||
|
int scale;
|
||||||
} vm_screen;
|
} vm_screen;
|
||||||
|
|
||||||
extern int vm_screen_add_window(vm_screen *);
|
extern int vm_screen_add_window(vm_screen *);
|
||||||
@ -32,6 +34,6 @@ extern bool vm_screen_active(vm_screen *);
|
|||||||
extern void vm_screen_draw_rect(vm_screen *, int, int, int, int);
|
extern void vm_screen_draw_rect(vm_screen *, int, int, int, int);
|
||||||
extern void vm_screen_free(vm_screen *);
|
extern void vm_screen_free(vm_screen *);
|
||||||
extern vm_screen *vm_screen_create();
|
extern vm_screen *vm_screen_create();
|
||||||
extern void vm_screen_set_color(vm_screen *, int, int, int, int);
|
extern void vm_screen_set_color(vm_screen *, uint8_t, uint8_t, uint8_t, uint8_t);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -45,7 +45,10 @@ init(int argc, char **argv)
|
|||||||
// We're literally using stdout in this heavy phase of development.
|
// We're literally using stdout in this heavy phase of development.
|
||||||
log_open(stdout);
|
log_open(stdout);
|
||||||
|
|
||||||
vm_screen_init();
|
if (vm_screen_init() != OK) {
|
||||||
|
fprintf(stderr, "Couldn't initialize video\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -94,7 +97,7 @@ main(int argc, char **argv)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
screen = vm_screen_create();
|
screen = vm_screen_create(320, 240, 2);
|
||||||
if (screen == NULL) {
|
if (screen == NULL) {
|
||||||
fprintf(stderr, "Screen creation failed!\n");
|
fprintf(stderr, "Screen creation failed!\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -106,6 +109,8 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (vm_screen_active(screen)) {
|
while (vm_screen_active(screen)) {
|
||||||
|
vm_screen_set_color(screen, 255, 0, 0, 255);
|
||||||
|
vm_screen_draw_rect(screen, 50, 50, 20, 20);
|
||||||
vm_screen_refresh(screen);
|
vm_screen_refresh(screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,19 +15,25 @@
|
|||||||
int
|
int
|
||||||
vm_screen_init()
|
vm_screen_init()
|
||||||
{
|
{
|
||||||
|
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||||
|
log_critical("Could not initialize video: %s", SDL_GetError());
|
||||||
|
return ERR_GFXINIT;
|
||||||
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
vm_screen_finish()
|
vm_screen_finish()
|
||||||
{
|
{
|
||||||
|
SDL_Quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return a new screen. We also set the color to black.
|
* Return a new screen. We also set the color to black.
|
||||||
*/
|
*/
|
||||||
vm_screen *
|
vm_screen *
|
||||||
vm_screen_create()
|
vm_screen_create(int xcoords, int ycoords, int scale)
|
||||||
{
|
{
|
||||||
vm_screen *screen;
|
vm_screen *screen;
|
||||||
|
|
||||||
@ -37,13 +43,35 @@ vm_screen_create()
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
vm_screen_set_color(screen, 0, 0, 0, 0);
|
screen->xcoords = xcoords;
|
||||||
|
screen->ycoords = ycoords;
|
||||||
|
screen->scale = scale;
|
||||||
|
|
||||||
|
screen->window = NULL;
|
||||||
|
screen->render = NULL;
|
||||||
|
screen->rect.x = 0;
|
||||||
|
screen->rect.y = 0;
|
||||||
|
screen->rect.w = 0;
|
||||||
|
screen->rect.h = 0;
|
||||||
|
|
||||||
return screen;
|
return screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
vm_screen_add_window(vm_screen *screen)
|
vm_screen_add_window(vm_screen *screen)
|
||||||
{
|
{
|
||||||
|
SDL_CreateWindowAndRenderer(screen->xcoords * screen->scale,
|
||||||
|
screen->ycoords * screen->scale,
|
||||||
|
0, &screen->window, &screen->render);
|
||||||
|
|
||||||
|
if (screen->window == NULL || screen->render == NULL) {
|
||||||
|
log_critical("Could not create window: %s", SDL_GetError());
|
||||||
|
return ERR_GFXINIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
vm_screen_set_color(screen, 0, 0, 0, 0);
|
||||||
|
SDL_RenderClear(screen->render);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,18 +81,28 @@ vm_screen_add_window(vm_screen *screen)
|
|||||||
void
|
void
|
||||||
vm_screen_free(vm_screen *screen)
|
vm_screen_free(vm_screen *screen)
|
||||||
{
|
{
|
||||||
|
SDL_DestroyRenderer(screen->render);
|
||||||
|
SDL_DestroyWindow(screen->window);
|
||||||
free(screen);
|
free(screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
vm_screen_active(vm_screen *screen)
|
vm_screen_active(vm_screen *screen)
|
||||||
{
|
{
|
||||||
|
static int counter = 5;
|
||||||
|
|
||||||
|
if (counter--) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
vm_screen_refresh(vm_screen *screen)
|
vm_screen_refresh(vm_screen *screen)
|
||||||
{
|
{
|
||||||
|
SDL_RenderPresent(screen->render);
|
||||||
|
SDL_Delay(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -72,15 +110,12 @@ vm_screen_refresh(vm_screen *screen)
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
vm_screen_set_color(vm_screen *screen,
|
vm_screen_set_color(vm_screen *screen,
|
||||||
int red,
|
uint8_t red,
|
||||||
int green,
|
uint8_t green,
|
||||||
int blue,
|
uint8_t blue,
|
||||||
int alpha)
|
uint8_t alpha)
|
||||||
{
|
{
|
||||||
screen->color_red = red;
|
SDL_SetRenderDrawColor(screen->render, red, green, blue, alpha);
|
||||||
screen->color_green = green;
|
|
||||||
screen->color_blue = blue;
|
|
||||||
screen->color_alpha = alpha;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -94,5 +129,13 @@ vm_screen_draw_rect(vm_screen *screen,
|
|||||||
int xsize,
|
int xsize,
|
||||||
int ysize)
|
int ysize)
|
||||||
{
|
{
|
||||||
// FIXME: NOOP
|
// We need to scale the position and sizes, since the presumption is
|
||||||
|
// that we are plotting based on the literal x and y coordinates in
|
||||||
|
// the screen.
|
||||||
|
screen->rect.x = xpos * screen->scale;
|
||||||
|
screen->rect.y = ypos * screen->scale;
|
||||||
|
screen->rect.w = xsize * screen->scale;
|
||||||
|
screen->rect.h = ysize * screen->scale;
|
||||||
|
|
||||||
|
SDL_RenderFillRect(screen->render, &screen->rect);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user