Render byte buffers from the application
This commit is contained in:
parent
ce01974243
commit
a4b81c2603
|
@ -0,0 +1,12 @@
|
||||||
|
#ifndef SHROOMS_VB_NATIVE_ASSETS_
|
||||||
|
#define SHROOMS_VB_NATIVE_ASSETS_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
extern const uint8_t asset_lefteye_start;
|
||||||
|
const uint8_t *LEFT_EYE_DEFAULT = &asset_lefteye_start;
|
||||||
|
|
||||||
|
extern const uint8_t asset_righteye_start;
|
||||||
|
const uint8_t *RIGHT_EYE_DEFAULT = &asset_righteye_start;
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,15 @@
|
||||||
|
.section .note.GNU-stack,"",@progbits
|
||||||
|
.section .bindata, "a", @progbits
|
||||||
|
|
||||||
|
.global asset_lefteye_start
|
||||||
|
.type asset_lefteye_start, @object
|
||||||
|
.global asset_righteye_start
|
||||||
|
.type asset_righteye_start, @object
|
||||||
|
|
||||||
|
.section .bindata
|
||||||
|
.balign 64
|
||||||
|
asset_lefteye_start:
|
||||||
|
.incbin "assets/lefteye.bin"
|
||||||
|
.balign 64
|
||||||
|
asset_righteye_start:
|
||||||
|
.incbin "assets/righteye.bin"
|
Binary file not shown.
Binary file not shown.
9
game.c
9
game.c
|
@ -1,3 +1,4 @@
|
||||||
|
#include <assets.h>
|
||||||
#include <game.h>
|
#include <game.h>
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
@ -11,13 +12,17 @@ int sleepNanos(long int ns) {
|
||||||
|
|
||||||
#define MAX_STEP_CLOCKS 20000
|
#define MAX_STEP_CLOCKS 20000
|
||||||
|
|
||||||
int runGame(VB *sim) {
|
int runGame(VB *sim, GraphicsContext *gfx) {
|
||||||
uint32_t clocks;
|
uint32_t clocks;
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
|
||||||
|
gfxUpdateLeftEye(gfx, LEFT_EYE_DEFAULT);
|
||||||
|
gfxUpdateRightEye(gfx, RIGHT_EYE_DEFAULT);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
clocks = MAX_STEP_CLOCKS;
|
clocks = MAX_STEP_CLOCKS;
|
||||||
vbEmulate(sim, &clocks);
|
vbEmulate(sim, &clocks);
|
||||||
|
gfxRender(gfx);
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
if (event.type == SDL_QUIT) {
|
if (event.type == SDL_QUIT) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -25,4 +30,4 @@ int runGame(VB *sim) {
|
||||||
}
|
}
|
||||||
sleepNanos((MAX_STEP_CLOCKS - clocks) * 50);
|
sleepNanos((MAX_STEP_CLOCKS - clocks) * 50);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
3
game.h
3
game.h
|
@ -1,8 +1,9 @@
|
||||||
#ifndef SHROOMS_VB_NATIVE_GAME_
|
#ifndef SHROOMS_VB_NATIVE_GAME_
|
||||||
#define SHROOMS_VB_NATIVE_GAME_
|
#define SHROOMS_VB_NATIVE_GAME_
|
||||||
|
|
||||||
|
#include "graphics.h"
|
||||||
#include "shrooms-vb-core/core/vb.h"
|
#include "shrooms-vb-core/core/vb.h"
|
||||||
|
|
||||||
int runGame(VB *sim);
|
int runGame(VB *sim, GraphicsContext *gfx);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -0,0 +1,92 @@
|
||||||
|
#include <graphics.h>
|
||||||
|
|
||||||
|
static void copyScreenTexture(uint8_t *dst, const uint8_t *src, int pitch) {
|
||||||
|
int x, y, i;
|
||||||
|
uint8_t color;
|
||||||
|
int delta = pitch / 384;
|
||||||
|
for (y = 0; y < 224; ++y) {
|
||||||
|
for (x = 0; x < 384; x += 1) {
|
||||||
|
color = src[(y * 384) + x];
|
||||||
|
for (i = 0; i < delta; ++i) {
|
||||||
|
dst[(y * pitch) + (x * delta) + i] = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int gfxInit(GraphicsContext *gfx) {
|
||||||
|
gfx->window = SDL_CreateWindow("Shrooms VB",
|
||||||
|
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||||
|
1536, 896, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
|
||||||
|
if (!gfx->window) {
|
||||||
|
fprintf(stderr, "Error creating window: %s\n", SDL_GetError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx->winSurface = SDL_GetWindowSurface(gfx->window);
|
||||||
|
if (!gfx->winSurface) {
|
||||||
|
fprintf(stderr, "Error getting surface: %s\n", SDL_GetError());
|
||||||
|
goto cleanup_window;
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx->renderer = SDL_GetRenderer(gfx->window);
|
||||||
|
if (!gfx->renderer) {
|
||||||
|
fprintf(stderr, "Error getting renderer: %s\n", SDL_GetError());
|
||||||
|
goto cleanup_window;
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx->leftEye = SDL_CreateTexture(gfx->renderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_STREAMING, 384, 224);
|
||||||
|
if (!gfx->leftEye) {
|
||||||
|
fprintf(stderr, "Error creating left eye texture: %s\n", SDL_GetError());
|
||||||
|
goto cleanup_window;
|
||||||
|
}
|
||||||
|
SDL_SetTextureColorMod(gfx->leftEye, 255, 0, 0);
|
||||||
|
|
||||||
|
gfx->rightEye = SDL_CreateTexture(gfx->renderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_STREAMING, 384, 224);
|
||||||
|
if (!gfx->rightEye) {
|
||||||
|
fprintf(stderr, "Error creating left eye texture: %s\n", SDL_GetError());
|
||||||
|
goto cleanup_left_eye;
|
||||||
|
}
|
||||||
|
SDL_SetTextureColorMod(gfx->rightEye, 0, 0, 255);
|
||||||
|
SDL_SetTextureBlendMode(gfx->rightEye, SDL_BLENDMODE_ADD);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cleanup_left_eye:
|
||||||
|
SDL_DestroyTexture(gfx->leftEye);
|
||||||
|
cleanup_window:
|
||||||
|
SDL_DestroyWindow(gfx->window);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gfxDestroy(GraphicsContext *gfx) {
|
||||||
|
SDL_DestroyTexture(gfx->rightEye);
|
||||||
|
SDL_DestroyTexture(gfx->leftEye);
|
||||||
|
SDL_DestroyWindow(gfx->window);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gfxUpdateEye(SDL_Texture *eye, const uint8_t *bytes) {
|
||||||
|
void *target;
|
||||||
|
int pitch;
|
||||||
|
if (SDL_LockTexture(eye, NULL, &target, &pitch)) {
|
||||||
|
fprintf(stderr, "Error locking buffer for eye: %s\n", SDL_GetError());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
copyScreenTexture(target, bytes, pitch);
|
||||||
|
SDL_UnlockTexture(eye);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gfxUpdateLeftEye(GraphicsContext *gfx, const uint8_t *bytes) {
|
||||||
|
gfxUpdateEye(gfx->leftEye, bytes);
|
||||||
|
}
|
||||||
|
void gfxUpdateRightEye(GraphicsContext *gfx, const uint8_t *bytes) {
|
||||||
|
gfxUpdateEye(gfx->rightEye, bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gfxRender(GraphicsContext *gfx) {
|
||||||
|
SDL_RenderClear(gfx->renderer);
|
||||||
|
SDL_RenderCopy(gfx->renderer, gfx->leftEye, NULL, NULL);
|
||||||
|
SDL_RenderCopy(gfx->renderer, gfx->rightEye, NULL, NULL);
|
||||||
|
SDL_RenderPresent(gfx->renderer);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
#ifndef SHROOMS_VB_NATIVE_GRAPHICS_
|
||||||
|
#define SHROOMS_VB_NATIVE_GRAPHICS_
|
||||||
|
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SDL_Window *window;
|
||||||
|
SDL_Surface *winSurface;
|
||||||
|
SDL_Renderer *renderer;
|
||||||
|
SDL_Texture *leftEye;
|
||||||
|
SDL_Texture *rightEye;
|
||||||
|
} GraphicsContext;
|
||||||
|
|
||||||
|
int gfxInit(GraphicsContext *gfx);
|
||||||
|
void gfxDestroy(GraphicsContext *gfx);
|
||||||
|
|
||||||
|
void gfxUpdateLeftEye(GraphicsContext *gfx, const uint8_t *bytes);
|
||||||
|
void gfxUpdateRightEye(GraphicsContext *gfx, const uint8_t *bytes);
|
||||||
|
|
||||||
|
void gfxRender(GraphicsContext *gfx);
|
||||||
|
|
||||||
|
#endif
|
25
main.c
25
main.c
|
@ -1,5 +1,6 @@
|
||||||
#include <cli.h>
|
#include <cli.h>
|
||||||
#include <game.h>
|
#include <game.h>
|
||||||
|
#include <graphics.h>
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include "shrooms-vb-core/core/vb.h"
|
#include "shrooms-vb-core/core/vb.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -51,8 +52,7 @@ int main(int argc, char **argv) {
|
||||||
VB *sim;
|
VB *sim;
|
||||||
uint8_t *rom;
|
uint8_t *rom;
|
||||||
uint32_t romSize;
|
uint32_t romSize;
|
||||||
SDL_Surface *winSurface;
|
GraphicsContext gfx;
|
||||||
SDL_Window *window;
|
|
||||||
CLIArgs args;
|
CLIArgs args;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
@ -74,27 +74,12 @@ int main(int argc, char **argv) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
window = SDL_CreateWindow("Shrooms VB",
|
if (gfxInit(&gfx)) {
|
||||||
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
SDL_Quit();
|
||||||
384, 224, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
|
|
||||||
if (!window) {
|
|
||||||
fprintf(stderr, "Error creating window: %s\n", SDL_GetError());
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
winSurface = SDL_GetWindowSurface(window);
|
status = runGame(sim, &gfx);
|
||||||
if (!winSurface) {
|
|
||||||
fprintf(stderr, "Error getting surface: %s\n", SDL_GetError());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_FillRect(winSurface, NULL, SDL_MapRGB(winSurface->format, 255, 0, 0));
|
|
||||||
SDL_UpdateWindowSurface(window);
|
|
||||||
|
|
||||||
status = runGame(sim);
|
|
||||||
|
|
||||||
SDL_DestroyWindow(window);
|
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
2
makefile
2
makefile
|
@ -11,7 +11,7 @@ else
|
||||||
endif
|
endif
|
||||||
|
|
||||||
build:
|
build:
|
||||||
@$(CC) cli.c game.c main.c -I . \
|
@$(CC) cli.c game.c graphics.c main.c assets/assets.s -I . \
|
||||||
$(SHROOMSFLAGS) $(SDL2FLAGS) \
|
$(SHROOMSFLAGS) $(SDL2FLAGS) \
|
||||||
-D POSIX_C_SOURCE=199309L \
|
-D POSIX_C_SOURCE=199309L \
|
||||||
-o shrooms-vb \
|
-o shrooms-vb \
|
||||||
|
|
Loading…
Reference in New Issue