commit fbc2b295a275de1d1d9c9451b1fa8ae3f0ad74f8 Author: cailean Date: Wed Aug 21 10:38:08 2024 +0100 inital commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b8cf17a --- /dev/null +++ b/.gitignore @@ -0,0 +1,91 @@ +#.gitignore is a file which makes git ignore files which should +# not go into version control in the first place +# Questions? See +# http://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository#Ignoring-Files +# http://git-scm.com/docs/gitignore + +########################### +# ignore generated binaries +# but not the data folder +########################### + +/bin/* +!/bin/data/ + +######### +# general +######### + +[Bb]uild/ +[Oo]bj/ +*.o +[Dd]ebug*/ +[Rr]elease*/ +*.mode* +*.app/ +*.pyc +.svn/ +*.log + +######################## +# IDE files which should +# be ignored +######################## + +# XCode +*.pbxuser +*.perspective +*.perspectivev3 +*.mode1v3 +*.mode2v3 +# XCode 4 +*.xccheckout +xcuserdata/ + +# Visual Studio +*.sdf +*.opensdf +*.suo +*.pdb +*.ilk +*.aps +ipch/ + +# Eclipse +.metadata +local.properties +.externalToolBuilders + +# Android Studio +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries + +################## +# operating system +################## + +# Linux +*~ +# KDE +.directory +.AppleDouble + +# OSX +.DS_Store +*.swp +*~.nib +# Thumbnails +._* + +# Windows +# Image file caches +Thumbs.db +# Folder config file +Desktop.ini + +# Android +.csettings + +/bin/data/ \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..cfa02d2 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,178 @@ +{ + "configurations": [ + { + "name": "Mac", + "includePath": [ + "/usr/include", + "/usr/local/include", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1", + "${workspaceRoot}/../../../addons/ofxGui", + "${workspaceRoot}/../../../libs/openFrameworks", + "${workspaceRoot}/../../../libs/openFrameworks/3d", + "${workspaceRoot}/../../../libs/openFrameworks/app", + "${workspaceRoot}/../../../libs/openFrameworks/communication", + "${workspaceRoot}/../../../libs/openFrameworks/events", + "${workspaceRoot}/../../../libs/openFrameworks/gl", + "${workspaceRoot}/../../../libs/openFrameworks/graphics", + "${workspaceRoot}/../../../libs/openFrameworks/math", + "${workspaceRoot}/../../../libs/openFrameworks/sound", + "${workspaceRoot}/../../../libs/openFrameworks/types", + "${workspaceRoot}/../../../libs/openFrameworks/utils", + "${workspaceRoot}/../../../libs/openFrameworks/video", + "${workspaceRoot}/../../../libs/boost/include", + "${workspaceRoot}/../../../libs/cairo/include", + "${workspaceRoot}/../../../libs/curl/include", + "${workspaceRoot}/../../../libs/fmod/include", + "${workspaceRoot}/../../../libs/FreeImage/include", + "${workspaceRoot}/../../../libs/freetype/include", + "${workspaceRoot}/../../../libs/glew/include", + "${workspaceRoot}/../../../libs/glfw/include", + "${workspaceRoot}/../../../libs/glm/include", + "${workspaceRoot}/../../../libs/json/include", + "${workspaceRoot}/../../../libs/pugixml/include", + "${workspaceRoot}/../../../libs/rtAudio/include", + "${workspaceRoot}/../../../libs/tess2/include", + "${workspaceRoot}/../../../libs/uriparser/include", + "${workspaceRoot}/../../../libs/utf8/include" + ], + "browse": { + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "${workspaceRoot}/.vscode/browse.db", + "path": [ + "/usr/include", + "/usr/local/include", + "/System/Library/Frameworks", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/", + "${workspaceRoot}/../../../libs", + "${workspaceRoot}/../../../addons", + "${workspaceRoot}/../../../libs/openFrameworks" + ] + }, + "intelliSenseMode": "clang-x64", + "macFrameworkPath": [ + "/System/Library/Frameworks", + "/Library/Frameworks" + ], + "compilerPath": "/usr/local/bin/gcc-8", + "cStandard": "c11", + "cppStandard": "c++17" + }, + { + "name": "Linux", + "includePath": [ + "/usr/include", + "/usr/local/include", + "/usr/include/c++/5", + "/usr/include/c++/5/backward", + "/usr/lib/gcc/x86_64-linux-gnu/5/include", + "/usr/lib/x86_64-linux-gnu/glib-2.0/include", + "/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include", + "/usr/local/include", + "/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed", + "/usr/include/x86_64-linux-gnu", + "${workspaceRoot}/../../../libs/openFrameworks", + "${workspaceRoot}/../../../libs/openFrameworks/3d", + "${workspaceRoot}/../../../libs/openFrameworks/app", + "${workspaceRoot}/../../../libs/openFrameworks/communication", + "${workspaceRoot}/../../../libs/openFrameworks/events", + "${workspaceRoot}/../../../libs/openFrameworks/gl", + "${workspaceRoot}/../../../libs/openFrameworks/graphics", + "${workspaceRoot}/../../../libs/openFrameworks/math", + "${workspaceRoot}/../../../libs/openFrameworks/sound", + "${workspaceRoot}/../../../libs/openFrameworks/types", + "${workspaceRoot}/../../../libs/openFrameworks/utils", + "${workspaceRoot}/../../../libs/openFrameworks/video", + "${workspaceRoot}/../../../libs/boost/include", + "${workspaceRoot}/../../../libs/cairo/include", + "${workspaceRoot}/../../../libs/curl/include", + "${workspaceRoot}/../../../libs/fmod/include", + "${workspaceRoot}/../../../libs/FreeImage/include", + "${workspaceRoot}/../../../libs/freetype/include", + "${workspaceRoot}/../../../libs/glew/include", + "${workspaceRoot}/../../../libs/glfw/include", + "${workspaceRoot}/../../../libs/glm/include", + "${workspaceRoot}/../../../libs/json/include", + "${workspaceRoot}/../../../libs/pugixml/include", + "${workspaceRoot}/../../../libs/rtAudio/include", + "${workspaceRoot}/../../../libs/tess2/include", + "${workspaceRoot}/../../../libs/uriparser/include", + "${workspaceRoot}/../../../libs/utf8/include", + "${workspaceRoot}/../../../libs/poco/include", + "${workspaceRoot}/../../../libs/kiss/include", + "/usr/include/x86_64-linux-gnu/c++/5", + "/usr/include/pulse", + "/usr/include/cairo", + "/usr/include/gstreamer-1.0", + "/usr/include/glib-2.0", + "${workspaceRoot}", + "${workspaceRoot}/../../../addons/ofxGui/src" + ], + "browse": { + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "", + "path": [ + "/usr/include", + "/usr/local/include", + "${workspaceRoot}/../../../libs", + "${workspaceRoot}/../../../addons", + "${workspaceRoot}/../../../libs/openFrameworks" + ] + }, + "intelliSenseMode": "clang-x64", + "compilerPath": "/usr/local/bin/gcc-8", + "cStandard": "c11", + "cppStandard": "c++17" + }, + { + "name": "Win32", + "includePath": [ + "C:/msys64/mingw32/include/c++/7.4.0", + "C:/msys64/mingw32/i686-w64-mingw32/include", + "${workspaceRoot}/../../../libs", + "${workspaceRoot}/../../../addons", + "${workspaceRoot}/../../../libs/openFrameworks", + "${workspaceRoot}/../../../libs/openFrameworks/3d", + "${workspaceRoot}/../../../libs/openFrameworks/app", + "${workspaceRoot}/../../../libs/openFrameworks/communication", + "${workspaceRoot}/../../../libs/openFrameworks/events", + "${workspaceRoot}/../../../libs/openFrameworks/gl", + "${workspaceRoot}/../../../libs/openFrameworks/graphics", + "${workspaceRoot}/../../../libs/openFrameworks/math", + "${workspaceRoot}/../../../libs/openFrameworks/sound", + "${workspaceRoot}/../../../libs/openFrameworks/types", + "${workspaceRoot}/../../../libs/openFrameworks/utils", + "${workspaceRoot}/../../../libs/openFrameworks/video", + "${workspaceRoot}/../../../libs/boost/include", + "${workspaceRoot}/../../../libs/cairo/include", + "${workspaceRoot}/../../../libs/curl/include", + "${workspaceRoot}/../../../libs/fmod/include", + "${workspaceRoot}/../../../libs/FreeImage/include", + "${workspaceRoot}/../../../libs/freetype/include", + "${workspaceRoot}/../../../libs/glew/include", + "${workspaceRoot}/../../../libs/glfw/include", + "${workspaceRoot}/../../../libs/glm/include", + "${workspaceRoot}/../../../libs/json/include", + "${workspaceRoot}/../../../libs/pugixml/include", + "${workspaceRoot}/../../../libs/rtAudio/include", + "${workspaceRoot}/../../../libs/tess2/include", + "${workspaceRoot}/../../../libs/uriparser/include", + "${workspaceRoot}/../../../libs/utf8/include" + ], + "browse": { + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "", + "path": [ + "${workspaceRoot}/../../../libs", + "${workspaceRoot}/../../../addons", + "${workspaceRoot}/../../../libs/openFrameworks" + ] + }, + "intelliSenseMode": "clang-x64", + "compilerPath": "C:/msys64/mingw32/bin/g++.exe", + "cStandard": "c11", + "cppStandard": "c++17" + } + ], + "version": 4 +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e535136 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,72 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C++ Launch", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceRoot}", + "environment": [], + "externalConsole": false, + "linux": { + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "program": "${workspaceRoot}/bin/${workspaceFolderBasename}_debug" + }, + "osx": { + "MIMode": "lldb", + "program": "${workspaceRoot}/bin/${workspaceFolderBasename}_debug.app/Contents/MacOS/${workspaceFolderBasename}_debug" + }, + "windows": { + "MIMode": "gdb", + "miDebuggerPath": "gdb.exe", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "program": "${workspaceRoot}/bin/${workspaceFolderBasename}_debug" + } + }, + { + "name": "C++ Attach", + "type": "cppdbg", + "request": "attach", + "program": "enter program name, for example ${workspaceRoot}/a.out", + "processId": "${command:pickProcess}", + "linux": { + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + }, + "osx": { + "MIMode": "lldb" + }, + "windows": { + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..2de3ce0 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,133 @@ +{ + "version": "2.0.0", + "shell":{ + "task": true + }, + "tasks": [ + { + "type": "shell", + "label": "Build RELEASE", + "presentation": { + "reveal": "always", + "panel": "shared" + }, + "command": "make -j -s 2>&1 && make RunRelease", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": { + "owner": "cpp", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": { + "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + } + }, + { + "type": "shell", + "label": "Build DEBUG", + "presentation": { + "reveal": "always", + "panel": "shared" + }, + "command": "make Debug -j -s 2>&1 || exit 1", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": { + "owner": "cpp", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": { + "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + } + }, + { + "type": "shell", + "label": "Clean DEBUG", + "presentation": { + "reveal": "always", + "panel": "shared" + }, + "command": "make CleanDebug", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": { + "owner": "cpp", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": { + "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + } + }, + { + "type": "shell", + "label": "Clean RELEASE", + "presentation": { + "reveal": "always", + "panel": "shared" + }, + "command": "make CleanRelease", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": { + "owner": "cpp", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": { + "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + } + }, + { + "type": "shell", + "label": "Clean ALL", + "presentation": { + "reveal": "always", + "panel": "shared" + }, + "command": "make clean", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": { + "owner": "cpp", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": { + "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + } + } + ] +} diff --git a/Demo.code-workspace b/Demo.code-workspace new file mode 100644 index 0000000..aca06f2 --- /dev/null +++ b/Demo.code-workspace @@ -0,0 +1,101 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "${workspaceRoot}/../../../../libs/openFrameworks" + }, + { + "path": "${workspaceRoot}/../../../../addons" + } + ], + "settings": { + "files.associations": { + "ostream": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "any": "cpp", + "array": "cpp", + "atomic": "cpp", + "strstream": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "cfenv": "cpp", + "charconv": "cpp", + "chrono": "cpp", + "codecvt": "cpp", + "compare": "cpp", + "complex": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "forward_list": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "expected": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", + "source_location": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "numbers": "cpp", + "ranges": "cpp", + "semaphore": "cpp", + "shared_mutex": "cpp", + "span": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeindex": "cpp", + "typeinfo": "cpp", + "valarray": "cpp", + "variant": "cpp", + "format": "cpp", + "stdfloat": "cpp", + "__nullptr": "cpp" + } + } +} \ No newline at end of file diff --git a/Demo.qbs b/Demo.qbs new file mode 100644 index 0000000..e5cc53b --- /dev/null +++ b/Demo.qbs @@ -0,0 +1,71 @@ +import qbs +import qbs.Process +import qbs.File +import qbs.FileInfo +import qbs.TextFile +import "../../../libs/openFrameworksCompiled/project/qtcreator/ofApp.qbs" as ofApp + +Project{ + property string of_root: "../../.." + + ofApp { + name: { return FileInfo.baseName(sourceDirectory) } + + files: [ + 'src/Player.cpp', + 'src/Player.h', + 'src/main.cpp', + 'src/ofApp.cpp', + 'src/ofApp.h', + ] + + of.addons: [ + 'ofxGui', + 'ofxGui', + ] + + // additional flags for the project. the of module sets some + // flags by default to add the core libraries, search paths... + // this flags can be augmented through the following properties: + of.pkgConfigs: [] // list of additional system pkgs to include + of.includePaths: [] // include search paths + of.cFlags: [] // flags passed to the c compiler + of.cxxFlags: [] // flags passed to the c++ compiler + of.linkerFlags: [] // flags passed to the linker + of.defines: [] // defines are passed as -D to the compiler + // and can be checked with #ifdef or #if in the code + of.frameworks: [] // osx only, additional frameworks to link with the project + of.staticLibraries: [] // static libraries + of.dynamicLibraries: [] // dynamic libraries + + // other flags can be set through the cpp module: http://doc.qt.io/qbs/cpp-module.html + // eg: this will enable ccache when compiling + // + // cpp.compilerWrapper: 'ccache' + + Depends{ + name: "cpp" + } + + // common rules that parse the include search paths, core libraries... + Depends{ + name: "of" + } + + // dependency with the OF library + Depends{ + name: "openFrameworks" + } + } + + property bool makeOF: true // use makfiles to compile the OF library + // will compile OF only once for all your projects + // otherwise compiled per project with qbs + + + property bool precompileOfMain: false // precompile ofMain.h + // faster to recompile when including ofMain.h + // but might use a lot of space per project + + references: [FileInfo.joinPaths(of_root, "/libs/openFrameworksCompiled/project/qtcreator/openFrameworks.qbs")] +} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..177e172 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +# Attempt to load a config.make file. +# If none is found, project defaults in config.project.make will be used. +ifneq ($(wildcard config.make),) + include config.make +endif + +# make sure the the OF_ROOT location is defined +ifndef OF_ROOT + OF_ROOT=$(realpath ../../..) +endif + +# call the project makefile! +include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk diff --git a/addons.make b/addons.make new file mode 100644 index 0000000..4d88fa0 --- /dev/null +++ b/addons.make @@ -0,0 +1,2 @@ +ofxGui +ofxGui diff --git a/config.make b/config.make new file mode 100644 index 0000000..920d2f1 --- /dev/null +++ b/config.make @@ -0,0 +1,142 @@ +################################################################################ +# CONFIGURE PROJECT MAKEFILE (optional) +# This file is where we make project specific configurations. +################################################################################ + +################################################################################ +# OF ROOT +# The location of your root openFrameworks installation +# (default) OF_ROOT = ../../.. +################################################################################ +OF_ROOT = ../../.. + +################################################################################ +# PROJECT ROOT +# The location of the project - a starting place for searching for files +# (default) PROJECT_ROOT = . (this directory) +# +################################################################################ +# PROJECT_ROOT = . + +################################################################################ +# PROJECT SPECIFIC CHECKS +# This is a project defined section to create internal makefile flags to +# conditionally enable or disable the addition of various features within +# this makefile. For instance, if you want to make changes based on whether +# GTK is installed, one might test that here and create a variable to check. +################################################################################ +# None + +################################################################################ +# PROJECT EXTERNAL SOURCE PATHS +# These are fully qualified paths that are not within the PROJECT_ROOT folder. +# Like source folders in the PROJECT_ROOT, these paths are subject to +# exlclusion via the PROJECT_EXLCUSIONS list. +# +# (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXTERNAL_SOURCE_PATHS = + +################################################################################ +# PROJECT EXCLUSIONS +# These makefiles assume that all folders in your current project directory +# and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations +# to look for source code. The any folders or files that match any of the +# items in the PROJECT_EXCLUSIONS list below will be ignored. +# +# Each item in the PROJECT_EXCLUSIONS list will be treated as a complete +# string unless teh user adds a wildcard (%) operator to match subdirectories. +# GNU make only allows one wildcard for matching. The second wildcard (%) is +# treated literally. +# +# (default) PROJECT_EXCLUSIONS = (blank) +# +# Will automatically exclude the following: +# +# $(PROJECT_ROOT)/bin% +# $(PROJECT_ROOT)/obj% +# $(PROJECT_ROOT)/%.xcodeproj +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXCLUSIONS = + +################################################################################ +# PROJECT LINKER FLAGS +# These flags will be sent to the linker when compiling the executable. +# +# (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ + +# Currently, shared libraries that are needed are copied to the +# $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to +# add a runtime path to search for those shared libraries, since they aren't +# incorporated directly into the final executable application binary. +# TODO: should this be a default setting? +# PROJECT_LDFLAGS=-Wl,-rpath=./libs + +################################################################################ +# PROJECT DEFINES +# Create a space-delimited list of DEFINES. The list will be converted into +# CFLAGS with the "-D" flag later in the makefile. +# +# (default) PROJECT_DEFINES = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_DEFINES = + +################################################################################ +# PROJECT CFLAGS +# This is a list of fully qualified CFLAGS required when compiling for this +# project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS +# defined in your platform specific core configuration files. These flags are +# presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. +# +# (default) PROJECT_CFLAGS = (blank) +# +# Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in +# your platform specific configuration file will be applied by default and +# further flags here may not be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CFLAGS = + +################################################################################ +# PROJECT OPTIMIZATION CFLAGS +# These are lists of CFLAGS that are target-specific. While any flags could +# be conditionally added, they are usually limited to optimization flags. +# These flags are added BEFORE the PROJECT_CFLAGS. +# +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) +# +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) +# +# Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the +# PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration +# file will be applied by default and further optimization flags here may not +# be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE = +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG = + +################################################################################ +# PROJECT COMPILERS +# Custom compilers can be set for CC and CXX +# (default) PROJECT_CXX = (blank) +# (default) PROJECT_CC = (blank) +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CXX = +# PROJECT_CC = diff --git a/src/ImageViewer.cpp b/src/ImageViewer.cpp new file mode 100644 index 0000000..6805202 --- /dev/null +++ b/src/ImageViewer.cpp @@ -0,0 +1,66 @@ +#include "ImageViewer.h" + +ImageViewer::ImageViewer(){ + +} + +void ImageViewer::setup(){ + fbo.allocate(ofGetWindowWidth() / 2, ofGetWindowHeight() / 2, GL_RGBA); +} + +void ImageViewer::update(string imagePath){ + currentImage = imagePath; + if (currentImage != lastImage){ + setImage(currentImage); + lastImage = currentImage; + } +} + +void ImageViewer::draw(){ + if(displayImage.isAllocated()) + calcImageScalePos(); +} + +void ImageViewer::setImage(std::string imagePath){ + if(displayImage.isAllocated()) + displayImage.clear(); + displayImage.load("images/rte-archive-football/" + imagePath); +} + +void ImageViewer::calcImageScalePos(){ + // Get the window dimensions + int windowWidth = ofGetWidth(); + int windowHeight = ofGetHeight(); + + // Calculate the target width and height for the bottom left quadrant + int targetWidth = windowWidth / 3; + int targetHeight = windowHeight / 3; + + // Calculate scaling factors to cover the entire quadrant + float scaleX = (float)targetWidth / (float)displayImage.getWidth(); + float scaleY = (float)targetHeight / (float)displayImage.getHeight(); + + // Choose the larger scale factor to ensure the image covers the quadrant + float scale = std::max(scaleX, scaleY); + + // Calculate the scaled width and height of the image + int scaledWidth = displayImage.getWidth() * scale; + int scaledHeight = displayImage.getHeight() * scale; + + // Calculate the position offsets to center the image in the quadrant + int offsetX = (scaledWidth - targetWidth) / 2; + int offsetY = (scaledHeight - targetHeight) / 2; + + // Begin drawing into the FBO + fbo.begin(); + ofClear(0, 0, 0, 0); // Clear the FBO with a transparent color + + // Draw the image, scaled and centered, into the FBO + displayImage.draw(-offsetX, -offsetY, scaledWidth, scaledHeight); + + // End drawing into the FBO + fbo.end(); + + // Draw the FBO onto the screen at the bottom-left quadrant + fbo.draw(0, 2 * windowHeight / 3); +} \ No newline at end of file diff --git a/src/ImageViewer.h b/src/ImageViewer.h new file mode 100644 index 0000000..24c0de8 --- /dev/null +++ b/src/ImageViewer.h @@ -0,0 +1,27 @@ +#ifndef _IMAGEVIEWER +#define _IMAGEVIEWER + +#include "ofMain.h" + +class ImageViewer { + + public: + + void setup(); + void update(string imagePath); + void draw(); + + void setImage(std::string imageName); + void calcImageScalePos(); + + ofImage displayImage; + ofFbo fbo; + + string currentImage; + string lastImage; + + ImageViewer(); + +}; + +#endif \ No newline at end of file diff --git a/src/Player.cpp b/src/Player.cpp new file mode 100644 index 0000000..51b8534 --- /dev/null +++ b/src/Player.cpp @@ -0,0 +1,152 @@ +#include "Player.h" + +Player::Player(){ + hasVideo = false; + playerVideoIndex = 0; + req.setup("192.168.0.54", 2000, "search"); + + resp.filename = "fingers.mp4"; + resp.frame = 50; + resp.index = 0; +} + +void Player::setup(){ + videoPlayer.setLoopState(OF_LOOP_NONE); + setupGUI(); + + int windowW = ofGetWindowWidth(); + int windowH = ofGetWindowHeight(); + + fbo.allocate(windowW * 2 / 3, windowH, GL_RGBA); +} + +void Player::update(){ + if(videoPlayer.isLoaded()) + hasVideo = true; + updateGUI(); + videoPlayer.update(); + playerCurrentFrame = videoPlayer.getCurrentFrame(); +} + +void Player::draw(){ + if(videoPlayer.isLoaded()){ + // Begin drawing into the FBO + fbo.begin(); + ofClear(0, 0, 0, 0); // Clear the FBO with a transparent color + + // Draw the video, scaled and centered, into the FBO + videoPlayer.draw(centerPosition.x, centerPosition.y, videoPlayer.getWidth() * std::max(fbo.getWidth() / videoPlayer.getWidth(), fbo.getHeight() / videoPlayer.getHeight()), videoPlayer.getHeight() * std::max(fbo.getWidth() / videoPlayer.getWidth(), fbo.getHeight() / videoPlayer.getHeight())); + + // End drawing into the FBO + fbo.end(); + + // Draw the FBO onto the screen, at 1/3 from the left (i.e., right 2/3 of the screen) + fbo.draw(ofGetWidth() / 3, 0); + } + + gui.draw(); +} + +void Player::setVideo(VPQuery query){ + videoPath = query.filename; + videoPlayer.load("movies/" + videoPath); + + videoPlayer.setFrame(query.frame); + setVideoPosition(); + + currentVideoLabel = query.filename; + currentIndexLabel = ofToString(query.index); + + videoPlayer.play(); +} + +void Player::setVideoPosition(){ + int playerW = videoPlayer.getWidth(); + int playerH = videoPlayer.getHeight(); + + // Calculate the scaling to fit the 2/3 width and full height area + float targetWidth = fbo.getWidth(); + float targetHeight = fbo.getHeight(); + + float scaleX = targetWidth / playerW; + float scaleY = targetHeight / playerH; + + // Use the larger scaling factor to ensure coverage + float scale = std::max(scaleX, scaleY); + + // Calculate scaled dimensions + int scaledWidth = playerW * scale; + int scaledHeight = playerH * scale; + + // Center the video within the FBO + centerPosition = glm::vec2((targetWidth - scaledWidth) / 2, (targetHeight - scaledHeight) / 2); +} + +void Player::setRandomFrame(){ + int randomFrame = ofRandom(0, videoPlayer.getTotalNumFrames()); + videoPlayer.setFrame(randomFrame); +} + + +string Player::getFrameName(){ + string imagePath = resp.imagePath; + return imagePath; +} + +void Player::setupGUI(){ + gui.setup("Embeddings"); + + + gui.setSize(300, 500); + + gui.add(angrySlider.setup("Angry", 0.0, 0.0, 1.0)); + gui.add(disgustSlider.setup("Disgust", 0.0, 0.0, 1.0)); + gui.add(fearSlider.setup("Fear", 0.0, 0.0, 1.0)); + gui.add(happySlider.setup("Happy", 0.0, 0.0, 1.0)); + gui.add(sadSlider.setup("Sad", 0.0, 0.0, 1.0)); + gui.add(surpriseSlider.setup("Surprise", 0.0, 0.0, 1.0)); + gui.add(neutralSlider.setup("Neutral", 0.0, 0.0, 1.0)); + + gui.add(currentFrameLabel.setup("Current Frame", ofToString(playerCurrentFrame))); + gui.add(currentVideoLabel.setup("Video Name", videoPath)); + gui.add(currentIndexLabel.setup("Index", ofToString(playerVideoIndex))); + + currentVector.angry = angrySlider; + currentVector.disgust = disgustSlider; + currentVector.fear = fearSlider; + currentVector.happy = happySlider; + currentVector.neutral = neutralSlider; + currentVector.sad = sadSlider; + currentVector.surprise = surpriseSlider; + + lastVector = currentVector; + + float guiWidth = gui.getWidth(); + + gui.setPosition(ofGetWindowWidth() - guiWidth, 0); +} + + +// Updates GUI with new values, and if it is different, send a POST query + +void Player::updateGUI(){ + currentVector.angry = angrySlider; + currentVector.disgust = disgustSlider; + currentVector.fear = fearSlider; + currentVector.happy = happySlider; + currentVector.neutral = neutralSlider; + currentVector.sad = sadSlider; + currentVector.surprise = surpriseSlider; + + if(currentVector != lastVector){ + // Send a request + resp = req.query(currentVector); + if(resp.frame != lastResp.frame){ + setVideo(resp); + lastResp = resp; + } + lastVector = currentVector; + } + + currentFrameLabel = ofToString(playerCurrentFrame); +} diff --git a/src/Player.h b/src/Player.h new file mode 100644 index 0000000..bc1bef1 --- /dev/null +++ b/src/Player.h @@ -0,0 +1,62 @@ +#ifndef _PLAYER +#define _PLAYER + +#include "ofMain.h" +#include "ofxGui.h" +#include "Request.h" + +class Player { + + public: + + void setup(); + void update(); + void draw(); + void setVideo(VPQuery query); + void setVideoPosition(); + void setRandomFrame(); + void setupGUI(); + void updateGUI(); + void updateVector(); + void checkNewFrame(); + string getFrameName(); + + ofVideoPlayer videoPlayer; + + int playerCurrentFrame; + int playerTotalFrameNum; + int playerVideoIndex; + std::string videoPath; + bool hasVideo; + + glm::vec2 centerPosition; + + ofxPanel gui; + + ofxFloatSlider angrySlider; + ofxFloatSlider disgustSlider; + ofxFloatSlider fearSlider; + ofxFloatSlider happySlider; + ofxFloatSlider sadSlider; + ofxFloatSlider surpriseSlider; + ofxFloatSlider neutralSlider; + + ofxLabel currentFrameLabel; + ofxLabel currentVideoLabel; + ofxLabel currentIndexLabel; + + Vector7D currentVector; + Vector7D lastVector; + + Request req; + + VPQuery resp; + VPQuery lastResp; + + ofFbo fbo; + + Player(); + +}; + +#endif \ No newline at end of file diff --git a/src/Request.cpp b/src/Request.cpp new file mode 100644 index 0000000..276cb6b --- /dev/null +++ b/src/Request.cpp @@ -0,0 +1,33 @@ +#include "Request.h" + +Request::Request(){ + +} + +void Request::setup(std::string ip, int port, std::string page){ + request.method = ofHttpRequest::POST; + request.url = "http://" + ip + ":" + ofToString(port) + "/" + page; + request.headers["Content-Type"] = "application/json"; +} + +VPQuery Request::query(Vector7D input){ + request.body = "{\"vector\": [" + + ofToString(input.angry) + "," + + ofToString(input.disgust) + "," + + ofToString(input.fear) + "," + + ofToString(input.happy) + "," + + ofToString(input.sad) + "," + + ofToString(input.surprise) + "," + + ofToString(input.neutral) + "]}"; + + auto response = http.handleRequest(request); + jsonResponse = ofJson::parse(response.data.getText()); + + VPQuery queryResponse; + queryResponse.filename = jsonResponse["filename"]; + queryResponse.imagePath = jsonResponse["imagePath"]; + queryResponse.frame = ofToInt(jsonResponse["frame"]) + 10; + queryResponse.index = jsonResponse["index"]; + + return queryResponse; +} \ No newline at end of file diff --git a/src/Request.h b/src/Request.h new file mode 100644 index 0000000..46eda3e --- /dev/null +++ b/src/Request.h @@ -0,0 +1,52 @@ +#ifndef _REQUEST +#define _REQUEST + +#include "ofMain.h" + +// Embeddings structure + +struct Vector7D{ + float angry; + float disgust; + float fear; + float happy; + float sad; + float surprise; + float neutral; + + bool operator!=(const Vector7D &other) const { + return angry != other.angry || + disgust != other.disgust || + fear != other.fear || + happy != other.happy || + sad != other.sad || + surprise != other.surprise || + neutral != other.neutral; + } +}; + +// JSON -> Struct + +struct VPQuery{ + std::string filename; + std::string imagePath; + int frame; + int index; +}; + +class Request { + + public: + + void setup(std::string ip, int port, std::string page); + VPQuery query(Vector7D input); + + ofHttpRequest request; + ofURLFileLoader http; + ofJson jsonResponse; + + Request(); + +}; + +#endif \ No newline at end of file diff --git a/src/TSNEMap.cpp b/src/TSNEMap.cpp new file mode 100644 index 0000000..71722cb --- /dev/null +++ b/src/TSNEMap.cpp @@ -0,0 +1,137 @@ +#include "TSNEMap.h" + +TSNEMap::TSNEMap(){ + image.load("images/happy.jpeg"); + zoomLevel = 1.0; +} + +void TSNEMap::setup(){ + for (int i = 0; i < 5; ++i) { + + ofImage img; + ImageObject obj; + ofPlanePrimitive plane; + + img.load("images/happy.png"); + + int imageW = image.getWidth(); + int imageH = image.getHeight(); + + // Maximum allowed dimensions for the plane + int maxWidth = 100; + int maxHeight = 100; + + // Calculate aspect ratio + float aspectRatio = (float)imageW / (float)imageH; + + // Determine plane dimensions based on aspect ratio and constraints + float planeW, planeH; + if (aspectRatio > (float)maxWidth / maxHeight) { + // Image is wider relative to the max constraints + planeW = maxWidth; + planeH = maxWidth / aspectRatio; + } else { + // Image is taller relative to the max constraints + planeH = maxHeight; + planeW = maxHeight * aspectRatio; + } + + // Ensure that dimensions do not exceed constraints + if (planeH > maxHeight) { + planeH = maxHeight; + planeW = maxHeight * aspectRatio; + } + if (planeW > maxWidth) { + planeW = maxWidth; + planeH = maxWidth / aspectRatio; + } + + plane.set(planeW, planeH); // Random width and height + plane.setPosition(ofRandom(-200, 200), ofRandom(-200, 200), 0); // Random position on XZ plane + plane.setResolution(2, 2); + plane.mapTexCoordsFromTexture(img.getTexture()); + + obj.texture = img; + obj.plane = plane; + obj.speedX = ofRandom(1, 5); // Random speed + obj.speedY = ofRandom(1, 5); // Random speed + obj.amplitudeX = ofRandom(0.01, 0.02); // Random amplitude + obj.amplitudeY = ofRandom(0.01, 0.02); // Random amplitude + obj.phaseX = ofRandom(0, TWO_PI); // Random phase + obj.phaseY = ofRandom(0, TWO_PI); // Random phase + + objects.push_back(obj); + } + + // Setup FBO + fbo.allocate(ofGetWindowWidth() / 3, ofGetWindowHeight() / 3 * 2, GL_RGBA); + cam.removeAllInteractions(); + cam.addInteraction(ofEasyCam::TRANSFORM_TRANSLATE_XY,OF_MOUSE_BUTTON_LEFT); + cam.enableOrtho(); + // Setup top-down orthographic camera + cam.setNearClip(-1000000); + cam.setFarClip(1000000); +} + +void TSNEMap::update(){ + if (!image.isAllocated()){ + ofLogError() << "Image not found"; + } + + // Update oscillation + float time = ofGetElapsedTimef(); + for (size_t i = 0; i < objects.size(); ++i) { + auto& object = objects[i]; + + float offsetX = object.amplitudeX * sin(object.speedX * time ); + float offsetY = object.amplitudeY * sin(object.speedY * time ); + + object.plane.setPosition(object.plane.getPosition().x + offsetX, object.plane.getPosition().y + offsetY, 0); + } +} + +void TSNEMap::draw(){ + + float time = ofGetElapsedTimef(); + + // Render the top-down view into the FBO + fbo.begin(); + ofClear(0, 0, 0, 0); // Clear the FBO + + cam.begin(); + + // ofEnableDepthTest(); + + // Render the planes + for (auto& object : objects) { + ofPushMatrix(); + object.texture.getTexture().bind(); + ofFill(); + object.plane.draw(); // Draw the wireframe for visibility + object.texture.getTexture().unbind();; + ofPopMatrix(); + } + + // ofDisableDepthTest(); + + cam.end(); + + fbo.end(); + + // Draw the FBO to the screen + fbo.draw(0, 0, ofGetWindowWidth() / 3, ofGetWindowHeight() / 3 * 2); +} + +void TSNEMap::setTexture(std::string imagePath){ + image.load("images/rte-archive-football/" + imagePath); +} + +void TSNEMap::keyPressed(int key) { + if (key == OF_KEY_UP) { + zoomLevel *= 0.9; // Zoom in + cam.setScale(zoomLevel, zoomLevel, zoomLevel); + } else if (key == OF_KEY_DOWN) { + zoomLevel *= 1.1; // Zoom out + cam.setScale(zoomLevel, zoomLevel, zoomLevel); + } +} diff --git a/src/TSNEMap.h b/src/TSNEMap.h new file mode 100644 index 0000000..3f0087b --- /dev/null +++ b/src/TSNEMap.h @@ -0,0 +1,40 @@ +#ifndef _TSNEMAP +#define _TSNEMAP + +#include "ofMain.h" + +struct ImageObject { + float speedX; + float speedY; + float amplitudeX; + float amplitudeY; + float phaseX; + float phaseY; + + ofPlanePrimitive plane; + ofImage texture; +}; + +class TSNEMap{ + + public: + + void setup(); + void draw(); + void update(); + void setTexture(std::string imagePath); + void updateCameraProjection(); + void keyPressed(int key); + + ofFbo fbo; + vector planes; + vector objects; + ofEasyCam cam; + ofTexture demoTex; + ofImage image; + float zoomLevel; + + TSNEMap(); +}; + +#endif diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..f8563b2 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,17 @@ +#include "ofMain.h" +#include "ofApp.h" + +//======================================================================== +int main( ){ + + //Use ofGLFWWindowSettings for more options like multi-monitor fullscreen + ofGLWindowSettings settings; + settings.setSize(1920, 1080); + settings.windowMode = OF_WINDOW; //can also be OF_FULLSCREEN + + auto window = ofCreateWindow(settings); + + ofRunApp(window, make_shared()); + ofRunMainLoop(); + +} diff --git a/src/ofApp.cpp b/src/ofApp.cpp new file mode 100644 index 0000000..cf43a01 --- /dev/null +++ b/src/ofApp.cpp @@ -0,0 +1,83 @@ +#include "ofApp.h" + +//-------------------------------------------------------------- + +using namespace glm; + +void ofApp::setup(){ + ofBackground(ofColor(0, 0, 0)); + ofSetVerticalSync(true); + player.setup(); + imageViewer.setup(); + map.setup(); +} + +//-------------------------------------------------------------- +void ofApp::update(){ + player.update(); + std::string imagePath = player.getFrameName(); + imageViewer.update(imagePath); + map.update(); +} + +//-------------------------------------------------------------- +void ofApp::draw(){ + player.draw(); + imageViewer.draw(); + map.draw(); +} + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key){ + map.keyPressed(key); +} + +//-------------------------------------------------------------- +void ofApp::keyReleased(int key){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseMoved(int x, int y ){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseDragged(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mousePressed(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseReleased(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseEntered(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseExited(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void ofApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void ofApp::dragEvent(ofDragInfo dragInfo){ + +} diff --git a/src/ofApp.h b/src/ofApp.h new file mode 100644 index 0000000..e5e1bdc --- /dev/null +++ b/src/ofApp.h @@ -0,0 +1,31 @@ +#pragma once + +#include "ofMain.h" +#include "Player.h" +#include "Request.h" +#include "ImageViewer.h" +#include "TSNEMap.h" + +class ofApp : public ofBaseApp{ + + public: + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y ); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void mouseEntered(int x, int y); + void mouseExited(int x, int y); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + private: + Player player; + ImageViewer imageViewer; + TSNEMap map; +};