# /\ +------------------------------------------------------------+ # ____/ \____ /| zlib/MIT/Unlicenced game framework licensed to freely use, | # \ / / | copy, modify and sell without restriction | # +--\ ^__^ /--+ | | # | ~/ \~ | | created for | # | ~~~~~~~~~~~~ | +------------------------------------------------------------+ # | SPACE ~~~~~ | / # | ~~~~~~~ BOX |/ # +--------------+ # # Camera input display demo for Linux and Android using OpenCV with SPACEBOX. Linux and Android targets are supported. # The OpenCV library for the desired target must be installed. The sections marked "Paths", "Linux build", and "Android # build" each contain paths that may need to be configured. ######### # Paths # ######### # Location of project specific source files SRC_DIR := ./ # Locations of [SPACEBOX] source and dependencies required to be compiled from source. These # locations are configured to match the structure of the [SPACEBOX] repository but can be # modified as necessary. SB_DIR := ../../ SB_SRC_DIR := $(SB_DIR)src/ SB_LIB_DIR := $(SB_DIR)lib/ SDLGFX2_DIR := $(SB_LIB_DIR)sdl2-gfx/ GLEW_DIR := $(SB_LIB_DIR)glew/ # C and C++ compiler commands CC := clang CXX := clang++ # Location of SDL config program SDLCONFIG := $(HOME)/local/sdl/bin/sdl2-config # Include BPmono.ttf in the project CREATE_FONT_SYMLINK := ln -nsf $(SB_DIR)"BPmono.ttf" . ############# # SDL flags # ############# SDL_CFLAGS = $(shell $(SDLCONFIG) --cflags) SDL_LFLAGS := $(shell $(SDLCONFIG) --libs) ########################### # Header and object files # ########################### SB_H_FILES := $(wildcard $(addprefix $(SB_SRC_DIR),*.hpp)) SB_O_FILES := $(filter-out $(addprefix $(SB_SRC_DIR),filesystem.o Connection.o Carousel.o),$(SB_H_FILES:.hpp=.o)) SRC_H_FILES := $(wildcard $(addprefix $(SRC_DIR),*.hpp)) SRC_O_FILES := camera.o $(SRC_H_FILES:.hpp=.o) #################################################################### # Targets for building [SPACEBOX], dependencies and project source # #################################################################### $(SDLGFX2_DIR)%.o: $(SDLGFX2_DIR)%.c $(SDLGFX2_DIR)%.h $(GLEW_DIR)%.o: $(GLEW_DIR)%.c $(GLEW_DIR)%.h $(CC) $< $(CFLAGS) -c -o $@ $(SB_SRC_DIR)extension.o : $(addprefix $(SB_SRC_DIR),Box.hpp Segment.hpp Color.hpp filesystem.hpp Pixels.hpp Log.hpp) $(SB_SRC_DIR)Node.o : $(addprefix $(SB_SRC_DIR),Game.hpp Configuration.hpp Delegate.hpp Display.hpp Input.hpp Box.hpp Audio.hpp Log.hpp) $(SB_SRC_DIR)Game.o : $(addprefix $(SB_SRC_DIR),extension.hpp Node.hpp Recorder.hpp Input.hpp Configuration.hpp Delegate.hpp Audio.hpp Log.hpp) $(SB_SRC_DIR)Animation.o : $(addprefix $(SB_SRC_DIR),Node.hpp Timer.hpp) $(SB_SRC_DIR)Recorder.o : $(addprefix $(SB_SRC_DIR),Node.hpp Game.hpp Configuration.hpp Delegate.hpp Animation.hpp extension.hpp) $(SB_SRC_DIR)Input.o : $(addprefix $(SB_SRC_DIR),Node.hpp Animation.hpp Configuration.hpp Delegate.hpp) $(SB_SRC_DIR)Configuration.o : $(addprefix $(SB_SRC_DIR),Node.hpp Animation.hpp Log.hpp) $(SB_SRC_DIR)Delegate.o : $(addprefix $(SB_SRC_DIR),Node.hpp Game.hpp Input.hpp) $(SB_SRC_DIR)Display.o : $(addprefix $(SB_SRC_DIR),Node.hpp Game.hpp Box.hpp Configuration.hpp Delegate.hpp Log.hpp) $(SB_SRC_DIR)Box.o : $(addprefix $(SB_SRC_DIR),extension.hpp Segment.hpp) $(SB_SRC_DIR)Segment.o : $(addprefix $(SB_SRC_DIR),extension.hpp Box.hpp) $(SB_SRC_DIR)Pixels.o : $(addprefix $(SB_SRC_DIR),Box.hpp extension.hpp Log.hpp utility.hpp) $(SB_SRC_DIR)Audio.o : $(addprefix $(SB_SRC_DIR),Node.hpp Display.hpp Configuration.hpp Box.hpp filesystem.hpp extension.hpp) $(SB_SRC_DIR)GLObject.o : $(addprefix $(SB_SRC_DIR),Log.hpp) $(SB_SRC_DIR)Texture.o : $(addprefix $(SB_SRC_DIR),GLObject.hpp filesystem.hpp Log.hpp) $(SB_SRC_DIR)VBO.o : $(addprefix $(SB_SRC_DIR),Log.hpp GLObject.hpp Attributes.hpp extension.hpp) $(SB_SRC_DIR)Attributes.o : $(addprefix $(SB_SRC_DIR),Log.hpp extension.hpp) $(SB_SRC_DIR)Model.o : $(addprefix $(SB_SRC_DIR),extension.hpp Attributes.hpp Texture.hpp utility.hpp Carousel.hpp) $(SRC_DIR)*.o : $(SRC_H_FILES) $(SB_H_FILES) %.o : %.cpp %.hpp $(CXX) $(CXXFLAGS) $< -c -o $@ ############### # Linux build # ############### # OpenCV Linux headers OPENCV_INCPATH := $(HOME)/local/opencv/include/opencv4 # OpenCV Linux library (necessary if building for Linux) OPENCV_LINUX_LDPATH := $(HOME)/local/opencv/lib camera : CFLAGS = -g -Wall -Wextra -O1 -c -I$(SB_LIB_DIR) -I$(SB_SRC_DIR) $(SDL_CFLAGS) -I $(OPENCV_INCPATH) camera : CXXFLAGS = $(CFLAGS) --std=c++17 camera : LFLAGS = $(SDL_LFLAGS) -Wl,--enable-new-dtags -lpthread -lGL -lGLESv2 -lSDL2_image -lSDL2_ttf -lSDL2_mixer -lstdc++fs \ -L$(OPENCV_LINUX_LDPATH) -Wl,-rpath,$(OPENCV_LINUX_LDPATH) -lopencv_videoio -lopencv_core -lopencv_highgui -lopencv_imgproc camera : $(GLEW_DIR)glew.o $(addprefix $(SDLGFX2_DIR),SDL2_rotozoom.o SDL2_gfxPrimitives.o) $(SB_O_FILES) $(SRC_O_FILES) $(CREATE_FONT_SYMLINK) $(CXX) $^ $(LFLAGS) -D__LINUX__ -o camera ################# # Android build # ################# # Detailed info on how this build target was originally created for the fill_screen demo is in README.md at the root of the repository. It # requires the Android SDK and the source packages for SDL. The paths below should be edited to match the local system. Icon creation requires # Imagemagick's convert tool from . OpenCV Android SDK is also required (see the main SPACEBOX README for how to # build). OPENCV_ANDROID_SDK := $(HOME)/ext/software/opencv-4.7.0/build_android/OpenCV-android-sdk/ SDL_SRC := $(HOME)/ext/software/SDL2-2.26.3 SDL_IMAGE_SRC := $(HOME)/ext/software/SDL2_image-2.6.2-android SDL_MIXER_SRC := $(HOME)/ext/software/SDL2_mixer-2.6.2-android SDL_TTF_SRC := $(HOME)/ext/software/SDL2_ttf-2.20.1-android SDL_ANDROID_PROJECT := $(SDL_SRC)/android-project ANDROID_MK := app/jni/src/Android.mk ANDROID_APP_MK := app/jni/Application.mk ANDROID_MANIFEST := app/src/main/AndroidManifest.xml ANDROID_SDK := $(HOME)/local/Android ANDROID_PACKAGE := ooo.shampoo.foam ANDROID_BUILD_DIR := build/android/$(ANDROID_PACKAGE) ANDROID_CLASS := Camera ANDROID_CLASS_DIR := app/src/main/java/$(subst .,/,$(ANDROID_PACKAGE)) # The skeleton for the Android build is based on the SDL android-project. The libraries are symlinked in. If the script that rewrites the skeleton # has changed, start with a fresh skeleton. Use the SPACEBOX revise skeleton script to edit the SDL android-project parameters. Then add OpenCV to # the android-project include and library paths. $(ANDROID_BUILD_DIR): $(SDL_SRC)/android-project/ $(SB_SRC_DIR)/android/revise_skeleton.sh -mkdir -p $(ANDROID_BUILD_DIR) rsync -ar $(SDL_SRC)/android-project/ $(ANDROID_BUILD_DIR) ln -nsf $(SDL_SRC) $(ANDROID_BUILD_DIR)/app/jni/SDL ln -nsf $(SDL_IMAGE_SRC) $(ANDROID_BUILD_DIR)/app/jni/SDL2_image ln -nsf $(SDL_MIXER_SRC) $(ANDROID_BUILD_DIR)/app/jni/SDL2_mixer ln -nsf $(SDL_TTF_SRC) $(ANDROID_BUILD_DIR)/app/jni/SDL2_ttf $(SB_SRC_DIR)/android/revise_skeleton.sh $(ANDROID_PACKAGE) $(ANDROID_BUILD_DIR) $(ANDROID_MANIFEST) $(ANDROID_APP_MK) $(ANDROID_MK) $(ANDROID_CLASS) \ $(ANDROID_APP_NAME) $(ANDROID_MIN_TARGET) $(ANDROID_NDK) "Camera Capture Test" "21" "24.0.8215888" $(SB_SRC_DIR) $(SB_LIB_DIR) $(SRC_DIR) ln -nsf $(OPENCV_ANDROID_SDK)/sdk/native/libs $(ANDROID_BUILD_DIR)/app/jni/src/opencv sed -i "2i\include $$\(CLEAR_VARS\)" "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i "3i\LOCAL_MODULE := tbb" "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i "4i\LOCAL_SRC_FILES := opencv/$$\(TARGET_ARCH_ABI\)/libtbb.so" "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i "5i\include $$\(PREBUILT_SHARED_LIBRARY\)" "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i "6i\include $$\(CLEAR_VARS\)" "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i "7i\LOCAL_MODULE := opencv_world" "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i "8i\LOCAL_SRC_FILES := opencv/$$\(TARGET_ARCH_ABI\)/libopencv_world.so" "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i "9i\LOCAL_EXPORT_C_INCLUDES := $(OPENCV_ANDROID_SDK)/sdk/native/jni/include" "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i "10i\include $$\(PREBUILT_SHARED_LIBRARY\)" "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i 's/^LOCAL_SHARED_LIBRARIES.*/& tbb opencv_world/' "$(ANDROID_BUILD_DIR)/$(ANDROID_MK)" sed -i "s/^APP_CPPFLAGS.*/& -nostartfiles/" "$(ANDROID_BUILD_DIR)/$(ANDROID_APP_MK)" sed -i "s/org.libsdl.app/$(ANDROID_PACKAGE)/" "$(ANDROID_BUILD_DIR)/app/build.gradle" "$(ANDROID_BUILD_DIR)/$(ANDROID_MANIFEST)" sed -i '10i\' "$(ANDROID_BUILD_DIR)/$(ANDROID_MANIFEST)" # Extend the SDLActivity class $(ANDROID_BUILD_DIR)/$(ANDROID_CLASS_DIR)/$(ANDROID_CLASS).java: $(SB_SRC_DIR)/android/main_class.sh $(SB_SRC_DIR)/android/main_class.sh $(ANDROID_PACKAGE) $(ANDROID_CLASS) $(ANDROID_BUILD_DIR)/$(ANDROID_CLASS_DIR) # Generate icon $(ANDROID_BUILD_DIR)/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: $(SB_SRC_DIR)/android/generate_icon.sh $(SB_DIR)/icon $(SB_SRC_DIR)/android/generate_icon.sh $(ANDROID_BUILD_DIR) "../../icon/foreground.png" "../../icon/background.png" # Custom assets $(ANDROID_BUILD_DIR)/app/src/main/assets: config.json shaders/* -mkdir -p $(ANDROID_BUILD_DIR)/app/src/main/assets rsync -ar shaders config.json $(ANDROID_BUILD_DIR)/app/src/main/assets # Add OpenCV libraries to the gradle project, then run gradle and generate an APK $(ANDROID_BUILD_DIR)/app-debug.apk: $(ANDROID_BUILD_DIR) $(ANDROID_BUILD_DIR)/$(ANDROID_CLASS_DIR)/$(ANDROID_CLASS).java \ $(ANDROID_BUILD_DIR)/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml $(ANDROID_BUILD_DIR)/app/src/main/assets ANDROID_SDK_ROOT=$(ANDROID_SDK) $(ANDROID_BUILD_DIR)/gradlew -p $(ANDROID_BUILD_DIR) build ln -nsf app/build/outputs/apk/debug/app-debug.apk $(ANDROID_BUILD_DIR) ln -nsf app/build/outputs/apk/debug/app-release-unsigned.apk $(ANDROID_BUILD_DIR) ######################### # Clean up object files # ######################### clean : -find $(SRC_DIR) -iname "*.o" -delete clean-all : clean -find $(SB_SRC_DIR) -iname "*.o" -delete -find $(SB_LIB_DIR) -iname "*.o" -delete ############# # compiledb # ############# # Generate a clang JSON compilation database file. This can be useful for example for code completion. It requires # compiledb (https://github.com/nickdiego/compiledb.git). It should be generated manually every time a file is added, # renamed, or the compilation flags change. The generated database is based on the Linux build. PATH_TO_COMPILEDB = $(HOME)/ext/software/compiledb/bin/compiledb compiledb : -$(PATH_TO_COMPILEDB) -n make camera -k