diff --git a/makePiRoot.sh b/makePiRoot.sh index 38c5c4c32..fbab82d8f 100755 --- a/makePiRoot.sh +++ b/makePiRoot.sh @@ -26,5 +26,6 @@ sudo umount /tmp/mnt-${DIST} proot -S ${DIST} -q qemu-arm apt-get -y update proot -S ${DIST} -q qemu-arm apt-get -y upgrade proot -S ${DIST} -q qemu-arm apt-get -y install libxv-dev libx11-dev libxext-dev libxi-dev +proot -S ${DIST} -q qemu-arm apt-get -y install libopenal-dev libasound2-dev touch ${DIST}/usr/include/immintrin.h diff --git a/singe/buildRelease.sh b/singe/buildRelease.sh index 51f227959..a28de3149 100755 --- a/singe/buildRelease.sh +++ b/singe/buildRelease.sh @@ -65,7 +65,7 @@ function doBuild() { popd } - +:< 100)) showUsage(argv[0], "Display scale must be between 50 and 100 percent."); + // Sinden light gun? + if (sindenString) { + if (_confScaleFactor != 100) showUsage(argv[0], "Cannot use --sinden and --scalefactor together."); + // Was it wrapped in quotes? + if ((sindenString[0] == '"') || (sindenString[0] == '\'')) { + sindenString[0] = ' '; + } + // Ok, this thing can have a mess of different arguments: + // WW - Just the width of the white border + // WW WB - Width of white border and then black border + // RW GW BW WW - Custom color "white" border and width + // RW GW BW WW WB - Custom color "white" border and width then width of black border + // RW GW BW WW RB GB BB WB - Custom color "white" border and width then custom color "black" border and width + temp = strtok(sindenString, " "); + while (temp != NULL) { + _confSindenArgv[_confSindenArgc++] = atoi(temp); + temp = strtok(NULL, " "); + if ((temp != NULL) && (_confSindenArgc > SINDEN_OPTION_COUNT)) showUsage(argv[0], "Too many arguments to --sinden."); + } + // Did we get a sane number of arguments? + if ((_confSindenArgc != SINDEN_WHITE) && (_confSindenArgc != SINDEN_WHITE_BLACK) && (_confSindenArgc != SINDEN_CUSTOM_WHITE) && (_confSindenArgc != SINDEN_CUSTOM_WHITE_BLACK) && (_confSindenArgc != SINDEN_CUSTOM_WHITE_CUSTOM_BLACK)) showUsage(argv[0], "Bad argument count to --sinden."); + free(sindenString); + } + // Init SDL if (SDL_Init(SDL_INIT_EVERYTHING) != 0) utilDie("%s", SDL_GetError()); if (SDL_GetCurrentDisplayMode(0, &mode) < 0) utilDie("%s", SDL_GetError()); @@ -428,6 +461,7 @@ int main(int argc, char *argv[]) { x++; } } + free(aspectString); } else { // Find our current aspect ratio x = 0; diff --git a/singe/preBuild.sh b/singe/preBuild.sh index fb43088f3..99ae93615 100755 --- a/singe/preBuild.sh +++ b/singe/preBuild.sh @@ -124,14 +124,15 @@ function autoBuild() { if [[ ! -z ${G_SYSROOT} ]]; then MORE_CFLAGS="--sysroot=${G_SYSROOT} ${MORE_CFLAGS}" + MORE_LIBS="--sysroot=${G_SYSROOT} ${MORE_LIBS}" fi export CC=${G_CCOMPILER} export CXX=${G_CPPCOMPILER} - export CFLAGS="-isystem${G_INSTALLED}/include ${MORE_CFLAGS}" - export CXXFLAGS="-isystem${G_INSTALLED}/include ${MORE_CFLAGS}" - export CPPFLAGS="-isystem${G_INSTALLED}/include ${MORE_CFLAGS}" - export LDFLAGS="-L${G_INSTALLED}/lib ${MORE_LIBS}" + export CFLAGS="${MORE_CFLAGS} -isystem${G_INSTALLED}/include" + export CXXFLAGS="${MORE_CFLAGS} -isystem${G_INSTALLED}/include" + export CPPFLAGS="${MORE_CFLAGS} -isystem${G_INSTALLED}/include" + export LDFLAGS="${MORE_LIBS} -L${G_INSTALLED}/lib" export LD_LIBRARY_PATH=${G_INSTALLED}/lib export PKG_CONFIG_LIBDIR=${G_INSTALLED}/lib/pkgconfig @@ -162,6 +163,9 @@ function autoBuild() { fi fi + MORE_CFLAGS="" + MORE_LIBS="" + export CC=${O_CC} export CXX=${O_CXX} export CFLAGS=${O_CFLAGS} @@ -388,18 +392,36 @@ autoBuild libfreetype.a freetype2 --without-harfbuzz autoBuild libharfbuzz.a harfbuzz "--with-glib=no --with-icu=builtin --with-cairo=no --with-fontconfig=no --with-freetype=yes -with-icu=no" # === SDL2 === -autoBuild libSDL2.a SDL2 +if [[ "${G_PLATFORM}" == "pi" ]]; then + MORE_CFLAGS="-I${G_SYSROOT}/opt/vc/include -I${G_SYSROOT}/usr/include -I${G_SYSROOT}/opt/vc/include/interface/vcos/pthreads -I${G_SYSROOT}/opt/vc/include/interface/vmcs_host/linux" + MORE_LIBS="-Wl,-rpath,/opt/vc/lib -L${G_SYSROOT}/opt/vc/lib -lbcm_host -lpthread -lm -ldl -lrt" + autoBuild libSDL2.a SDL2 "--disable-pulseaudio --disable-esd --disable-video-wayland --enable-video-rpi --enable-alsa" +else + autoBuild libSDL2.a SDL2 +fi # === SDL2_image === *** Not finding libtiff *** +if [[ "${G_PLATFORM}" == "pi" ]]; then + MORE_CFLAGS="-I${G_SYSROOT}/opt/vc/include -I${G_SYSROOT}/usr/include -I${G_SYSROOT}/opt/vc/include/interface/vcos/pthreads -I${G_SYSROOT}/opt/vc/include/interface/vmcs_host/linux" + MORE_LIBS="-Wl,-rpath,/opt/vc/lib -L${G_SYSROOT}/opt/vc/lib -lbcm_host" +fi autoBuild libSDL2_image.a SDL2_image "--disable-jpg-shared --disable-png-shared --disable-tif-shared --disable-webp-shared" # === SDL2_mixer === +if [[ "${G_PLATFORM}" == "pi" ]]; then + MORE_CFLAGS="-I${G_SYSROOT}/opt/vc/include -I${G_SYSROOT}/usr/include -I${G_SYSROOT}/opt/vc/include/interface/vcos/pthreads -I${G_SYSROOT}/opt/vc/include/interface/vmcs_host/linux" + MORE_LIBS="-Wl,-rpath,/opt/vc/lib -L${G_SYSROOT}/opt/vc/lib -lbcm_host" +fi MODPLUG_CFLAGS="-I${G_INSTALLED}/include -DMODPLUG_STATIC" \ MODPLUG_LIBS="-L${G_INSTALLED}/lib -lmodplug -lstdc++ -lm" \ autoBuild libSDL2_mixer.a SDL2_mixer "--disable-music-midi-fluidsynth --disable-music-ogg-shared --disable-music-flac-shared --disable-music-mod-modplug-shared --disable-music-mp3-mpg123-shared --disable-music-opus-shared" # === SDL2_ttf === -MORE_CFLAGS="-I${G_INSTALLED}/include/SDL2" \ +if [[ "${G_PLATFORM}" == "pi" ]]; then + MORE_CFLAGS="-I${G_SYSROOT}/opt/vc/include -I${G_SYSROOT}/usr/include -I${G_SYSROOT}/opt/vc/include/interface/vcos/pthreads -I${G_SYSROOT}/opt/vc/include/interface/vmcs_host/linux" + MORE_LIBS="-Wl,-rpath,/opt/vc/lib -L${G_SYSROOT}/opt/vc/lib -lbcm_host" +fi +MORE_CFLAGS="${MORE_CFLAGS} -I${G_INSTALLED}/include/SDL2" \ autoBuild libSDL2_ttf.a SDL2_ttf "--with-ft-prefix=\"${G_INSTALLED}\" --with-sdl-prefix=\"${G_INSTALLED}\"" "libSDL2_ttf.la install-libLTLIBRARIES install-libSDL2_ttfincludeHEADERS" # === Combine all dependencies into one big mess === diff --git a/singe/singe.c b/singe/singe.c index d90edd818..b672bf37b 100644 --- a/singe/singe.c +++ b/singe/singe.c @@ -162,6 +162,8 @@ int32_t _confVolumeNonVldp = 100; int32_t _confScaleFactor = 100; int32_t _confXResolution = -1; int32_t _confYResolution = -1; +int32_t _confSindenArgc = 0; +int32_t _confSindenArgv[SINDEN_OPTION_COUNT]; // Other globals @@ -2051,6 +2053,11 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { int32_t intReturn = 0; int64_t thisFrame = -1; int64_t lastFrame = -1; + SDL_Rect windowTarget; + SDL_Rect sindenWhite; + SDL_Rect sindenBlack; + SDL_Color sindenWhiteColor; + SDL_Color sindenBlackColor; SDL_Texture *overlayTexture = NULL; SpriteT *sprite = NULL; SpriteT *spriteTemp = NULL; @@ -2172,6 +2179,88 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { // Should we resize the window? //***TODO*** + // Default render location is the entire window + windowTarget.x = 0; + windowTarget.y = 0; + windowTarget.w = videoGetWidth(_videoHandle); + windowTarget.h = videoGetHeight(_videoHandle); + sindenWhite.x = -1; + sindenBlack.x = -1; + + // Overscan compensation + if (_confScaleFactor < 100) { + windowTarget.w = videoGetWidth(_videoHandle) * _confScaleFactor / 100; + windowTarget.h = videoGetHeight(_videoHandle) * _confScaleFactor / 100; + windowTarget.x = (videoGetWidth(_videoHandle) - windowTarget.w) / 2; + windowTarget.y = (videoGetHeight(_videoHandle) - windowTarget.h) / 2; + } + + // Sinden Light Gun Border Setup + if (_confSindenArgc > 0) { + //***TODO*** ADD MOUSE SCALING TO COMPENSATE FOR BORDER + sindenWhiteColor.r = 255; + sindenWhiteColor.g = 255; + sindenWhiteColor.b = 255; + sindenWhiteColor.a = 255; + sindenBlackColor.r = 0; + sindenBlackColor.g = 0; + sindenBlackColor.b = 0; + sindenBlackColor.a = 255; + // Ok, this thing can have a mess of different arguments: + switch(_confSindenArgc) { + // WW - Just the width of the white border + case SINDEN_WHITE: + sindenWhite.x = _confSindenArgv[0]; + break; + // WW WB - Width of white border and then black border + case SINDEN_WHITE_BLACK: + sindenWhite.x = _confSindenArgv[0]; + sindenBlack.x = _confSindenArgv[1]; + break; + // RW GW BW WW - Custom color "white" border and width + case SINDEN_CUSTOM_WHITE: + sindenWhiteColor.r = _confSindenArgv[0]; + sindenWhiteColor.g = _confSindenArgv[1]; + sindenWhiteColor.b = _confSindenArgv[2]; + sindenWhite.x = _confSindenArgv[3]; + break; + // RW GW BW WW WB - Custom color "white" border and width then width of black border + case SINDEN_CUSTOM_WHITE_BLACK: + sindenWhiteColor.r = _confSindenArgv[0]; + sindenWhiteColor.g = _confSindenArgv[1]; + sindenWhiteColor.b = _confSindenArgv[2]; + sindenWhite.x = _confSindenArgv[3]; + sindenBlack.x = _confSindenArgv[4]; + break; + // RW GW BW WW RB GB BB WB - Custom color "white" border and width then custom color "black" border and width + case SINDEN_CUSTOM_WHITE_CUSTOM_BLACK: + sindenWhiteColor.r = _confSindenArgv[0]; + sindenWhiteColor.g = _confSindenArgv[1]; + sindenWhiteColor.b = _confSindenArgv[2]; + sindenWhite.x = _confSindenArgv[3]; + sindenBlackColor.r = _confSindenArgv[4]; + sindenBlackColor.g = _confSindenArgv[5]; + sindenBlackColor.b = _confSindenArgv[6]; + sindenBlack.x = _confSindenArgv[7]; + break; + } + if (sindenWhite.x >= 0) { + sindenWhite.y = sindenWhite.x; + sindenWhite.w = videoGetWidth(_videoHandle) - (sindenWhite.x * 2); + sindenWhite.h = videoGetHeight(_videoHandle) - (sindenWhite.y * 2); + } + if (sindenBlack.x >= 0) { + sindenBlack.y = sindenBlack.x; + sindenBlack.w = videoGetWidth(_videoHandle) - (sindenBlack.x * 2); + sindenBlack.h = videoGetHeight(_videoHandle) - (sindenBlack.y * 2); + sindenWhite.x += sindenBlack.x; + sindenWhite.y += sindenBlack.y; + sindenWhite.w -= (sindenBlack.x * 2); + sindenWhite.h -= (sindenBlack.y * 2); + } + windowTarget = sindenWhite; //***TODO*** We don't really need sindenWhite + } + // Create overlay surface _overlayScaleX = 0.5; _overlayScaleY = 0.5; @@ -2379,6 +2468,22 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { // Update display if (_refreshDisplay || _discStopped) { + // Sinden Gun Border + if (sindenWhite.x >= 0) { + if (sindenBlack.x >= 0) { + // Black and White + SDL_SetRenderDrawColor(_renderer, sindenBlackColor.r, sindenBlackColor.g, sindenBlackColor.b, sindenBlackColor.a); + SDL_RenderClear(_renderer); + SDL_SetRenderDrawColor(_renderer, sindenWhiteColor.r, sindenWhiteColor.g, sindenWhiteColor.b, sindenWhiteColor.a); + SDL_RenderFillRect(_renderer, &sindenBlack); + } else { + // Only white + SDL_SetRenderDrawColor(_renderer, sindenWhiteColor.r, sindenWhiteColor.g, sindenWhiteColor.b, sindenWhiteColor.a); + SDL_RenderClear(_renderer); + } + SDL_RenderFillRect(_renderer, &windowTarget); + } + // Laserdisc Video if (_discStopped) { // Stopped discs display blue like the good old days SDL_SetRenderTarget(_renderer, _videoTexture); @@ -2386,15 +2491,17 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { SDL_RenderClear(_renderer); SDL_SetRenderTarget(_renderer, NULL); } - SDL_RenderCopy(_renderer, _videoTexture, NULL, NULL); + SDL_RenderCopy(_renderer, _videoTexture, NULL, &windowTarget); + // Overlay overlayTexture = SDL_CreateTextureFromSurface(_renderer, _overlay); if (!overlayTexture) utilDie("%s", SDL_GetError()); if (!_confStretchVideo) { SDL_RenderSetLogicalSize(renderer, videoGetWidth(_videoHandle), videoGetHeight(_videoHandle)); } - SDL_RenderCopy(_renderer, overlayTexture, NULL, NULL); + SDL_RenderCopy(_renderer, overlayTexture, NULL, &windowTarget); SDL_DestroyTexture(overlayTexture); overlayTexture = NULL; + // Show it SDL_RenderPresent(_renderer); _refreshDisplay = false; } diff --git a/singe/singe.h b/singe/singe.h index db07b8de8..72fe1d7ee 100644 --- a/singe/singe.h +++ b/singe/singe.h @@ -35,6 +35,16 @@ #define COPYRIGHT_END_YEAR "2020" +enum { + SINDEN_WHITE = 1, + SINDEN_WHITE_BLACK = 2, + SINDEN_CUSTOM_WHITE = 4, + SINDEN_CUSTOM_WHITE_BLACK = 5, + SINDEN_CUSTOM_WHITE_CUSTOM_BLACK = 8, + SINDEN_OPTION_COUNT = 8 +}; + + // Command line options extern char *_confVideoFile; extern char *_confScriptFile; @@ -53,6 +63,8 @@ extern int32_t _confVolumeNonVldp; extern int32_t _confScaleFactor; extern int32_t _confXResolution; extern int32_t _confYResolution; +extern int32_t _confSindenArgc; +extern int32_t _confSindenArgv[SINDEN_OPTION_COUNT]; void singe(SDL_Window *window, SDL_Renderer *renderer); diff --git a/singe/singe.rc b/singe/singe.rc index 5461fad8d..83e2810ff 100644 --- a/singe/singe.rc +++ b/singe/singe.rc @@ -8,7 +8,7 @@ BEGIN BLOCK "040904E4" BEGIN VALUE "CompanyName", "Kangaroo Punch Studios" - VALUE "FileDescription", "Somewhat Interactive Nostalgic Game Emulator" + VALUE "FileDescription", "Somewhat Interactive Nostalgic Game Engine" VALUE "FileVersion", "2.00b8" VALUE "InternalName", "Singe" VALUE "LegalCopyright", "Copyright 2006-2020 Scott C. Duensing" diff --git a/singe/thirdparty/SDL2_mixer/external/opusfile-0.11/Makefile.in b/singe/thirdparty/SDL2_mixer/external/opusfile-0.11/Makefile.in index 9a32b3c27..2ce5de6c0 100644 --- a/singe/thirdparty/SDL2_mixer/external/opusfile-0.11/Makefile.in +++ b/singe/thirdparty/SDL2_mixer/external/opusfile-0.11/Makefile.in @@ -1018,9 +1018,9 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -@HAVE_DOXYGEN_FALSE@install-data-local: @HAVE_DOXYGEN_FALSE@clean-local: @HAVE_DOXYGEN_FALSE@uninstall-local: +@HAVE_DOXYGEN_FALSE@install-data-local: clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \