Implement a Quartz 2D (aka Core Graphics) output renderer for the Wx
interface as a subclass of BasicDrawingPanel called
Quartz2DDrawingPanel.
Split BasicDrawingPanel's DrawArea() into DrawArea() and DrawImage(),
with DrawImage() receiving both the wxPaintDC and the wxImage, the
wxImage is created with a direct pointer to the frame buffer when
possible (24bpp).
Implement Quartz2DDrawingPanel in macsupport.mm based on the code here:
http://www.cocoabuilder.com/archive/cocoa/309165-how-to-quickly-paint-to-cocoa-view-from-bitmap-in-memory.html
and here:
http://stackoverflow.com/questions/2261177/cgimage-from-byte-array
the GetData() method of wxImage is used to avoid copying the frame
buffer.
Add RND_QUARTZ2D to the renderers enum and update all config stuff and
the XRC to support it. As well as the DrawingPanel instantiation code in
GameArea::OnIdle().
* Bump minimum cmake required to 3.3.2, to make sure generator
expressions work.
* Force CMAKE_BUILD_TYPE to "Release" if unset, not sure if this
actually works.
* Merge the older compile flags block with the new one and use generator
expressions to make sure the relevant flags apply only to C, C++ or
nasm.
* Add -lssp to the end of the link commands for the -fstack-protector*
options, this is only needed/done for gcc.
* Add -lversion and -limm32 to SDL2_LIBRARY (Zach asked for this.)
* Builds on msys2 again!
I maintain it here:
https://github.com/rkitover/bin2c
In terms of functionality, this version is pretty much the same as the
original, just nicer argument handling, a usage screen, etc.
Make ASM_CORE, ASM_SCALERS and ENABLE_MMX the defaults for 32bit builds
on intel hosts (the host can be AMD64, as long as the target is 32bits.)
Move mac nasm search into the mac section of the cmake code and stop
defaulting to /usr/bin/nasm, this was screwing up the build on msys2.
Fix src/filters/2xSaImmx.asm to compile and link correctly.
Add nasm to list of mingw deps for ./installdeps-msys2 .
Tested that msys2-built Wx binary runs, including with 2xSaI.
Keyboard doesn't work yet on msys2 builds, but that's a completely
different issue.
* Enable ffmpeg by default only on linux and msys2, it will be disabled
for normal windows builds and on mac.
* Set SFML_STATIC_LIBRARIES only for normal non-msys2 windows builds,
because msys2 does not currently have static versions of the SFML
sub-libraries, e.g. system, network, etc.. Dynamic linking works fine
for now.
* Fix quoting for -DLOCALEDIR, on windows spaces were causing errors in
make on msys2.
* Update to upstream FindSFML.cmake .
* Add an ./installdeps-msys2 script to install all necessary tools and
libraries on msys2 for building both 64 and 32 bit windows Wx binaries.
* Add the dependencies/mingw-xaudio/include directory to
INCLUDE_DIRECTORIES so that XAudio compiles on msys2, as mingw-w64 does
not currently have XAudio headers. Also check that the user pulled the
git submodule in the process (the ./installdeps-msys2 script does this
for you.)
TODO:
* Generalize ./installdeps to work on more platforms.
* Make console Wx app in debug mode so that debug prints will work.
* Fix game keyboard input for msys2 builds.
* Add HiDPI support for Windows.
* Fix the -D*DIR defines to have the correct paths on windows.
Replace bin2c.cmake script with one written in C and compiled as an
intermediate target.
The C version is roughly 12000 times faster.
On msys2, the cmake version takes 7.5 minutes on this system, while the
C version takes 0.037 seconds.
Add GetRealPixelClientSize() method to HiDPIAware and implement using
wx GetClientSize() in panel.cpp for the generic version, and using
convertSizeToBacking: in macsupport.mm .
Add an AdjustViewport() method to GLDrawingPanel that sets glViewport()
using GetRealPixelClientSize(), and call it for the SIZE event. Debug
print the viewport size here instead of in DrawingPanelInit().
Build improvements:
* default to Cairo off for all platforms, currently libcairo2-dev does
not install on Ubuntu
* default to ON for ENABLE_LINK and ENABLE_FFMPEG (for game recording),
this will allow for more fully-featured default builds
* do not set SFML_STATIC_LIBRARIES on Mac because this is currently
broken
* fix the Mac bundling/linking script to deal with links in dependent
libs that already use @rpath (very minor change.)
Pass the keyboard modifiers to process_key_press so that it only
registers a game key if the modifiers match. That is, if e.g. ENTER is a
game key, then ALT+ENTER gets passed to other Wx controls and does not
register as a game key.
Move Objective-C++ Mac code for Wx into macsupport.mm with stub methods
in panel.cpp, and stop compiling all C++ as Objective-C++.
cmake -G Xcode # now works fine
Make a custom cstdint.h header file that includes <tr1/cstdint> if
<cstdint> is not available, because the clang 3.x used on Lion does not
have it. Change all references to <cstdint> to use it instead.
Add missing OpenGL header for older OS X in sdl/SDL.cpp .
When calling HiDPI methods, use respondsToSelector: to check if the
methods are available first.
Fix the bundling/linking script to support multiple copies of the same
dylib with different versions. Necessary to include both the Lion system
libpng and the brew libpng. Including the system libpng is necessary
because it is removed in later versions of OS X.
After creating the drawing panel, call SetFocus() on it and use
Connect() to bind keyboard events from it. Add the wxWANTS_CHARS flag to
all DrawingArea subclasses so that wxEVT_CHAR_HOOK can be used instead
of wxEVT_KEY_DOWN, because it is more general and catches more keys.
Change the process_key_press function to return a bool indicating
whether a game control is currently pressed or not, this is used in the
key events to determine whether the event should be propagated or not.
If in a game key, do not propagate the event, otherwise it hits one of
the other controls and generates a beep sound.
The menu open/closed/highlighted events had to be turned off for Mac,
because the menubar is catching all keyboard events for some reason even
before they reach the drawing panel event handler. So on Mac the game
will not be paused when the menu is being used, this is not really a big
deal and can be fixed later.
Other improvements:
* do not bundle and link dylibs when CMAKE_BUILD_TYPE is not "Release",
this makes for quicker debug builds
* finally make a generic PaintEv for the DrawingPanel abstract base
class using dynamic_cast<> and Bind(), unfortunately this is not wx
2.8 compatible
* set the default audio_buffers to 10 instead of 5, this completely or
almost completely fixes sound stuttering during normal game play on
Mac with OpenAL
* spew path info on startup only once
The resulting Mac wX .app build is now completely independent and
redistributable, only needs to be codesigned.
Necessary dylibs are bundled and linked in a POST_BUILD step using
third_party_libs_tool (included) for which I created a separate repo
here as well:
http://github.com/rkitover/mac-third-party-libs-tool
Turn off Cairo on Mac because it does not work for now.
Set RPATH on the executable to @loader_path/../Frameworks, the bundling
tool also does this.
Update .gitignore for Finder .DS_Store files.
TOOD:
* write a ./quickbuild for Mac and other platforms such as msys2 and
linux
Move closer to allowing an "out of the box" distributable build for Mac:
* fix the icon for the .app
* link SDL2 statically, a PR has been sent to the original repo here:
https://github.com/tcbrindle/sdl2-cmake-scripts/pull/9
* link SFML statically
TODO:
For a releasable build on OS X, system libs must be linked
dynamically while third party libs are linked statically or bundled. The
goal is to link them statically.
The two remaining libs that need static linking are PNG and wX.
For PNG a similar approach to the one used for SDL2 using pkg-config
should work fine and be simple to implement.
For wX things are more complicated. The default build of wX does not
include static libs, I will need to submit a PR for Homebrew to change
the default build to include both dynamic and static versions.
Change the Scale control in the DisplayConfig dialog from a SpinCtrl to
a TextCtrl (for a simple text field) because GenericValidator does not
support using a double* with a SpinCtrl.
Also force adjustment on minimum size and resize the window when
necessary on panel creation, so that when the user sets the value
higher, the window size automatically adjusts.
Use dynamic_cast<wxWindow*>(this) in the DrawingPanel abstract class to
implement GetWindow() and Delete() so that all concrete classes do not
have to duplicate the code.
Only load config files with the app name set to "visualboyadvance-m" on
Windows and Mac, on unix keep the default of "vbam" for now so that
users' ~/.vbam directories are found correctly.
TODO:
* migrate all of this properly to XDG paths on unix, giving users the
option to move their config
Use a high-res surface on HiDPI (e.g. retina) Macs for the OpenGL
renderer, and scale window accordingly. Also fix fullscreen toggle not
working in HiDPI mode. And some other stuff.
Aside from the .app not being linked statically, the app is now fully
functional on Mac and ready to ship.
Full change details:
* add -DDEBUG or -DNDEBUG based on CMAKE_BUILD_TYPE (-DNDEBUG for
Release and -DDEBUG for Debug)
* properly search for homebrew/macports/fink directories, and only add
them if they exist
* fix building with wx debug support, when available
* use explicit OpenGL context on Mac too for new versions of wx
* add main_frame pointer in GameArea back to MainFrame, and a
SetMainFrame(MainFrame* parent) public method to set it in guinit
* add full support for reading and writing double value config options
(the GUI still needs to be updated for options that can take doubles,
such as video_scale)
* change video_scale option (Display/Scale) to a double, putting a
double value such as 3.6 in the config file works correctly
* add a HiDPIAware mixin class for GameArea and DrawingPanel, with the
method HiDPIScaleFactor which returns the current window's
backingScaleFactor
* change the GameArea sizing methods (DelBorder(), AdjustMinSize() and
AdjustSize()) to divide the window size by the
HiDPIAware::HiDPIScaleFactor so that the window is scaled properly
* change GameArea::ShowFullScreen to ignore fullscreen events for a
maximized window on Mac, because maximized windows on OS X are
actually native fullscreen windows
* change scale variables to double from int, and use std::ceil() to
round scaled pixel or memory size values
* make a default base class DrawingPane::DrawingPanelInit() virtual
method, call by all concrete class constructors based on the did_init
flag
* call setWantsBestResolutionOpenGLSurface:YES on the view backing the
wxGLCanvas for the OpenGL renderer (GLDrawingPanel) to get a high res
OpenGL surface in HiDPI mode
* remove GLDrawingPanel::OnSize event, the OpenGL viewport resizes
automatically without the need to call glViewport()
* do not hide the mouse pointer if the main frame has menus or dialogs
open
* add variadic vbamDebug(const char* format, ...) function, active only
#ifdef DEBUG, which sets the wx log target to STDERR and logs a
message to it
* use full name of app "visualboyadvance-m" instead of "vbam" when
getting configuration paths, this way the config is saved to
~/Library/Application Support/visualboyadvance-m rather than
~/Library/Application Support/vbam
* listen to the MENU_HIGHLIGHT_ALL event as well, as an extra way to
check when the menus are open
* add public MainFrame::SetMenusOpened(bool state) method to force the
main frame to change the internal menus_opened state, this is
necessary because in HiDPI mode on Mac the keyboard accelerator for
toggle fullscreen sends a menu open event, but not a menu close event,
so on switch to fullscreen the state is changed to menus closed and
the emu is unpaused
TODO:
* GUI option to change toggle fullscreen behavior between native and
non-native fullscreen on Mac
* GUI support for double config values like Display/Scale
* add HiDPI support to simple renderer
* fix SDL sound, or disable the option
* fix Cairo suport on Mac, or disable the option
* use dynamic_cast<> to implement GetWindow() for DrawingPanel instead
of pure virtual method, likewise for Delete()
* link .app statically by default so it can be shipped
* add Homebrew formula
On OS X, the F11 key is by default bound to "show desktop", so is a poor
choice for the "ToggleFullscreen" accelerator.
The default key combo to take apps fullscreen should be Ctrl+Cmd+F
according to:
https://support.apple.com/kb/PH18744?locale=en_US
Fortunately, this was very easy to fix by using the "platform" attribute
in MainMenu.xrc .
NOTE: this does not give us "real" OS X fullscreen yet, where the app is
on its own space, like native fullscreen apps. In the future it would be
nice to add an option to do this.
Currently the "simple" render method is way too slow on OS X, while
Cairo is completely broken. The OpenGL renderer, on the other hand, runs
with almost no stuttering.
Also fix dangling icon file after OS X build.
Fix the dynamic library path for OpenAL to the framework included with
OS X.
Make option initialization set the AudioAPI to OpenAL on mac by default,
since SDL sound is currently completely broken.
There is a lot of stuttering, will have to look at that next.
see: http://dev.vba-m.com/T2
> Every time I launch a server it defaults to the locahost IP instead of my
> actual IP. This is preventing me from linking with friends over Hamachi. When
> they enter my IP it errors on their end and they cannot connect. [report taken
> from <https://sourceforge.net/p/vbam/bugs/219/>]
Also, by chance, added the build folder to `.gitignore` so as to not pollute the
git repo. I meant to do them as separate commits, but I forgot to do so.
Signed-off-by: Jonathan Sifuentes <jayands2k11@ymail.com>
See comment in FindSDL2.cmake:
Note that the header path has changed from SDL2/SDL.h to just SDL.h
This needed to change because "proper" SDL convention
is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability
reasons because not all systems place things in SDL2/ (see FreeBSD).
Previously this function returned true for `if(saveDir)` when `saveDir` was simply a zero length string following a branch that returned `/<savepath>` which doesn't work when the user isn't a root user.
Add Homebrew and MacPorts paths for findings headers and libraries.
Add -x objective-c++ to the C++ compile command so that conditionally
compiled ObjectiveC code for OS X can be supported.
Throw a fatal error if the user tries to enable ENABLE_ASM_CORE,
ENABLE_ASM_SCALERS or ENABLE_MMX on AMD64, as this is not supported yet.
If ENABLE_ASM_SCALERS is enabled, try to find a Homebrew or MacPorts
nasm before using the outdated XCode nasm.
For the future, if the user has only the old XCode nasm which does not
support 64 bit objects and the build is 64 bit, throw a fatal error.
For 32 bit builds with the old XCode nasm, use -f macho instead of -f
macho32, which is used if the version of nasm is > 2.0 .
Pass -DMACHO instead of -DELF and, on AMD64 (for the future) -D__AMD64__
for nasm on OS X.
Pass -D__AMD64__ to C++ compilation as well on AMD64, this will help
when we support AMD64 inline assembly.
Add support for automatically linking Homebrew keg-only gettext from
/usr/local/opt/gettext for ENABLE_NLS.
Fix copying Info.plist and vbam.icns to the .app bundle.
Add a key to the Info.plist to support sharp text on retina displays, as
per:
https://wiki.wxwidgets.org/WxMac-specific_topics#Retina_display_support
Set wxWidgets_USE_DEBUG to ON if CMAKE_BUILD_TYPE is "Debug". I'm not
sure this does anything or if I'm doing this correctly though.
Also set wxWidgets_USE_UNICODE to ON. Again, I'm not sure this does
anything or is in the right place.
Fix a bug in the config dir finding code in
wxvbamApp::GetConfigurationPath() updated in 8b8f2f7 to only use the
more top level dirs if there is a vbam.ini in them, not if they are
writable as well, and use the reverse order (starting with user local
dirs) to check for writable dirs and their writable parents. This fixes
a problem with the vbam.ini being written to the Plugins directory of
the .app bundle if it's writable instead of ~/Library/Application
Support/vbam as was intended.
Write vbam.ini to ~/Library/Application Support/vbam on OSX.
Do not create ~/.vbam on OSX in common/ConfigManager.cpp .
Make get_config_path and wxvbamApp::GetConfigurationPath return
directories with a writable parent in reverse search order when no
writable directories in the current search order are available since the
directory is created in OnInit.
This prefers to create the user-local directory and write the vbam.ini
there.
It is utilized by Phantasy Star Collection at intro. I don't know any other games using this BIOS driver, so I just implemented the parts that Phantasy Star Collection uses.
This patch is far away from perfect yet. Sound quality is not the same as with original BIOS. Also code is horrible to read, since I just kept translating arm instructions to C without thinking too much. Got it done quickly so if anyone has keen interest on continuing from here.
Patch by Juha Laukkanen
There are two config params:
rewind_count_max => how many blocks are reserved maximum, higher value leads to greater memory usage naturally but longer rewind log
rewind_interval => default interval is 165ms and higher value leads to more inaccurate rewind but longer rewind log
Also fixes memtell() telling incorrect size because data is not flushed.
wxWidgets front end having too small buffer for rewinds resulting overflows.
It appears that SetExt() doesn't require a leading period in the extension. This makes auto-loading of ups patches work (at least, for the one I tried).
Updated the comment too, for grepablility.
Added a command line project based on SDL.
Added getopt from MinGW.
Added SDL 1.2.15 to the dependencies.
Rearranged the OutDir and IntDir to Binary and Build folders.