ANESE/CMakeLists.txt
Daniel Prilik 67cfa183f8 re-enterant scenes!
wowie this was a trickyboi to figure out, but I think I managed to
get a decent-working solution.

The algorithm consists of 2 parts: 1) detecting scene transitions,
and 2) figuring out if the new scene is a duplicate.

Part 1) was solved using perceptual hashing, and watching the delta
of the frame hash between frames. When it spikes, odds are that's a
scene change.

Part 2) was a bit trickier, but boils down to hashing every frame
and associating it with a scene + scroll values. That way, when a
scene transition is detected, I can check the hash-maps to see if
the "new" frame is actually one I've seen before.
There is a bit of extra work that gets the technique working with
elaborate fade-in animations / animated backgrounds, but it's not
magic or anything.

What's left?

Well, 1) needs to be improved, since the current delta threshold
value i'm using has been pulled out of thin air, and while it gives
reasonable results on many games, ideally, it should be more robust

2) is pretty good though!

All that I need to do now to be super happy with it is serialize
the scene data and enable loading / saving it to disk! Once that's
done, the initial vision of being able to automatically map out a
game will have come true!

exciting!
2018-07-20 15:23:31 -07:00

115 lines
4 KiB
CMake

# I have no idea how cmake works, this is pretty much me copying and pasting
# stuff from around the web until things "work"
# I mean, that's how you learn, right?
project(anese)
cmake_minimum_required(VERSION 2.8.3)
if(APPLE)
set(GUI_TYPE MACOSX_BUNDLE)
endif(APPLE)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${anese_SOURCE_DIR}/cmake")
set(BIN_DIR ${anese_SOURCE_DIR}/bin)
# anese source
include_directories(src)
file(GLOB_RECURSE SRC_FILES
src/*.cc
src/*.cpp
src/*.h
src/*.hpp
)
# ANESE executable
add_executable(anese ${SRC_FILES})
# Set a default build type if none was specified
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif(NOT CMAKE_BUILD_TYPE)
# Setup compiler flags for different platforms
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -fno-exceptions -fno-rtti -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -g -fsanitize=undefined -fsanitize=address")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3 -g")
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /O2 /fp:fast")
# suppress some MSVC warnings
# suppress warnings about "unsafe" funcs (fprintf and such)
target_compile_definitions(anese PRIVATE _CRT_SECURE_NO_WARNINGS)
# 4458 - declaration of 'x' hides class member
# * non issue, since I always refer to class members through `this`
# 4310 - cast truncates constant value
# 4068 - unknown pragma
# 4244 - type conversion may lead to loss of data
# 4127 - conditianal expression is constant
# 4800 - forcing value to bool 'true' or 'false' (performance warning)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4458 /wd4310 /wd4068 /wd4244 /wd4127 /wd4800")
# add icon manifest to windows builds
set(SRC_FILES ${SRC_FILES} resources/icons/anese.rc)
endif()
# handle various debug options
option(NESTEST "test CPU against NESTEST golden log" OFF)
if (NESTEST)
target_compile_definitions(anese PRIVATE NESTEST)
endif()
# And now, for some shit-tier dependency management
# ---- header only libs ---- #
include_directories(thirdparty/headeronly)
# ---- SDL2 ---- #
# since there is no standard install directory for sdl2 on windows, change this
# variable to point to _your_ SDL2 dev lib directory
set(SDL2_MORE_INCLUDE_DIR "C:/sdl2")
find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIR})
# ---- SDL_inprint ---- #
include_directories(thirdparty/SDL_inprint)
add_library(SDL_inprint STATIC thirdparty/SDL_inprint/SDL_inprint2.cc)
# ---- SimpleINI ---- #
include_directories(thirdparty/SimpleINI)
add_library(SimpleINI STATIC thirdparty/SimpleINI/ConvertUTF.c)
# ---- miniz ---- #
add_subdirectory(thirdparty/miniz)
include_directories(thirdparty/miniz)
# Finally, link up!
target_link_libraries(anese
${SDL2_LIBRARY}
SDL_inprint
SimpleINI
miniz
)
if (APPLE)
# Do some spooky macOS bundle magic that took far to long to figure out...
# note: this is a brittle system, as it relies on the SDL2 version on homebrew
# to stay constant! Not ideal!
install(CODE "
set(CMAKE_INSTALL_LOCAL_ONLY true) # no need to install miniz!
execute_process(COMMAND sh -c \"
cp /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib ../resources/ANESE.app/Contents/Frameworks/
chmod 755 ../resources/ANESE.app/Contents/Frameworks/libSDL2-2.0.0.dylib
cp ./anese ../resources/ANESE.app/Contents/MacOS/
install_name_tool -change /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib @executable_path/../Frameworks/libSDL2-2.0.0.dylib ../resources/ANESE.app/Contents/MacOS/anese
mkdir ../bin/
cp -R ../resources/ANESE.app ../bin/
echo 'Success! ANESE.app built in `bin` directory.'
\")
" COMPONENT Runtime)
else()
install(CODE "set(CMAKE_INSTALL_LOCAL_ONLY true)") # no need to install miniz!
install(TARGETS anese RUNTIME DESTINATION ${BIN_DIR})
endif()