diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2013-10-30 17:22:02 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2013-10-30 17:22:34 +0100 |
commit | 2af0ddbcf5cf32e4f6e8e1e3993a1aca0c409c90 (patch) | |
tree | b32c4bfbfdeafcdcad72e383edbb04b8f8ada797 /opentrack-api | |
parent | ea2660dd167a853e704f167410037da162eccc6f (diff) |
add initial, untested opentrack-api.dll
Signed-off-by: Stanislaw Halik <sthalik@misaki.pl>
Diffstat (limited to 'opentrack-api')
-rw-r--r-- | opentrack-api/context.cpp | 108 | ||||
-rw-r--r-- | opentrack-api/opentrack-api.cpp | 13 | ||||
-rw-r--r-- | opentrack-api/opentrack-guts.h | 40 | ||||
-rw-r--r-- | opentrack-api/opentrack.h | 57 | ||||
-rw-r--r-- | opentrack-api/trackers.cpp | 38 |
5 files changed, 256 insertions, 0 deletions
diff --git a/opentrack-api/context.cpp b/opentrack-api/context.cpp new file mode 100644 index 00000000..100acf5c --- /dev/null +++ b/opentrack-api/context.cpp @@ -0,0 +1,108 @@ +#include "opentrack-guts.h" +#include "opentrack.h" + +#if defined(__APPLE__) +# define SONAME "dylib" +#elif defined(_WIN32) +# define SONAME "dll" +#else +# define SONAME "so" +#endif + +#include <iostream> + +#ifdef _MSC_VER +# define LIB_PREFIX "" +#else +# define LIB_PREFIX "lib" +#endif + +// shamelessly copied from core +static Metadata* get_metadata(DynamicLibrary* lib, QString& longName, QIcon& icon) +{ + Metadata* meta; + if (!lib->Metadata || ((meta = lib->Metadata()), !meta)) + return NULL; + meta->getFullName(&longName); + meta->getIcon(&icon); + return meta; +} + +static QList<opentrack_meta> list_files(QDir& dir, QString filter) +{ + QList<opentrack_meta> ret; + QStringList filenames = dir.entryList( QStringList() << (LIB_PREFIX + filter + ("*." SONAME)), QDir::Files, QDir::Name ); + for ( int i = 0; i < filenames.size(); i++) { + QIcon icon; + QString long_name; + QString str = filenames.at(i); + DynamicLibrary* lib = new DynamicLibrary(str); + qDebug() << "Loading" << str; + std::cout.flush(); + Metadata* meta; + if (!(meta = get_metadata(lib, long_name, icon))) + { + delete lib; + continue; + } + QString prefix(LIB_PREFIX + filter); + QString suffix("*." SONAME); + if (str.size() > prefix.size() + suffix.size() && str.startsWith(prefix) && str.endsWith(suffix)) + { + auto str2 = str.mid(prefix.size(), str.size() - prefix.size() - suffix.size()); + opentrack_meta item(meta, str2, lib); + ret.push_back(item); + } + } + + return ret; +} + +opentrack_ctx::opentrack_ctx(QDir& dir) : + dir(dir), + meta_list(list_files(dir, "opentrack-tracker-")) +{ + const int count = meta_list.size(); + list = new char*[count + 1]; + for (int i = 0; i < count; i++) + { + QByteArray tmp = meta_list.at(i).path.toUtf8(); + int len = tmp.size(); + auto foo = new char[len+1]; + for (int j = 0; j < len; j++) + foo[j] = tmp.at(j); + foo[len] = '\0'; + list[i] = foo; + } + list[count] = NULL; +} + +opentrack_ctx::~opentrack_ctx() +{ + for (int i = 0; list[i]; i++) + { + delete list[i]; + } + delete list; +} + +extern "C" +{ + +const char** OPENTRACK_EXPORT opentrack_enum_trackers(opentrack ctx) +{ + return const_cast<const char**>(ctx->list); +} + +opentrack OPENTRACK_EXPORT opentrack_make_ctx(const char *dir) +{ + QDir d(dir); + return new opentrack_ctx(d); +} + +void OPENTRACK_EXPORT opentrack_finalize_ctx(opentrack foo) +{ + delete foo; +} + +} diff --git a/opentrack-api/opentrack-api.cpp b/opentrack-api/opentrack-api.cpp new file mode 100644 index 00000000..acb6d823 --- /dev/null +++ b/opentrack-api/opentrack-api.cpp @@ -0,0 +1,13 @@ +#include "opentrack-guts.h" +#include "opentrack.h" + +opentrack opentrack_make_ctx(const char *dir) +{ + QDir d(dir); + return new opentrack_ctx(d); +} + +void opentrack_finalize_ctx(opentrack bye_bye) +{ + delete bye_bye; +} diff --git a/opentrack-api/opentrack-guts.h b/opentrack-api/opentrack-guts.h new file mode 100644 index 00000000..1061d75d --- /dev/null +++ b/opentrack-api/opentrack-guts.h @@ -0,0 +1,40 @@ +#pragma once + +#include "ftnoir_tracker_base/ftnoir_tracker_base.h" +#include "facetracknoir/global-settings.h" +#include <QString> +#include <QDir> +#include <QList> +#include <QStringList> +#include <QDebug> +#include <QIcon> +#include <iostream> +#include <cstring> + +typedef ITracker* opentrack_tracker; + +class opentrack_meta { +public: + Metadata* meta; + QString path; + DynamicLibrary* lib; + + opentrack_meta(Metadata* meta, QString& path, DynamicLibrary* lib) : + meta(meta), path(path), lib(lib) + {} + ~opentrack_meta() + { + delete meta; + delete lib; + } +}; + +typedef class opentrack_ctx { +public: + QDir dir; + char** list; + QList<opentrack_meta> meta_list; + QFrame fake_frame; + opentrack_ctx(QDir& dir); + ~opentrack_ctx(); +} *opentrack; diff --git a/opentrack-api/opentrack.h b/opentrack-api/opentrack.h new file mode 100644 index 00000000..afd5506b --- /dev/null +++ b/opentrack-api/opentrack.h @@ -0,0 +1,57 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif +#ifndef IN_OPENTRACK + /* opaque pointers, forward definitions */ + struct opentrack_opaque_ctx; + typedef opentrack_opaque_ctx* opentrack; + struct opentrack_opaque_tracker; + typedef opentrack_opaque_tracker* opentrack_tracker; +#endif + +#ifdef IN_OPENTRACK +# ifdef _WIN32 +# define OPENTRACK_EXPORT __declspec(dllexport) +# else +# define OPENTRACK_EXPORT +# endif +#else +# ifdef _WIN32 +# define OPENTRACK_EXPORT __declspec(dllimport) +# else +# define OPENTRACK_EXPORT +# endif +#endif + + /* for `opentrack_tracker_tick', individual headpose elts */ +#ifndef IN_OPENTRACK + enum opentrack_dof { + TX = 0, + TY, + TZ, + Yaw, + Pitch, + Roll, + DOF_count + }; +#endif + + opentrack opentrack_make_ctx(const char* dir); + void opentrack_finalize_ctx(opentrack self); + + /* no need to free the return value; invalid to modify it */ + const char** opentrack_enum_trackers(opentrack self); + + /* + * don't `opentrack_tracker_tick an unstarted tracker, it's invalid to do so + * it's also invalid to start a finalized tracker + */ + opentrack_tracker opentrack_make_tracker(opentrack ctx, const char* name); + void opentrack_tracker_start(opentrack self, opentrack_tracker tracker); + int opentrack_tracker_tick(opentrack_tracker tracker, double* headpose); + void opentrack_finalize_tracker(opentrack_tracker tracker); +#ifdef __cplusplus +} +#endif diff --git a/opentrack-api/trackers.cpp b/opentrack-api/trackers.cpp new file mode 100644 index 00000000..2527017b --- /dev/null +++ b/opentrack-api/trackers.cpp @@ -0,0 +1,38 @@ +#include "opentrack-guts.h" +#include "opentrack.h" + +extern "C" { + +opentrack_tracker OPENTRACK_EXPORT opentrack_make_tracker(opentrack ctx, const char* name) +{ + QString n(name); + for (int i = 0; i < ctx->meta_list.size(); i++) + { + auto meta = ctx->meta_list[i]; + if (ctx->meta_list.at(i).path == name) + { + ITracker* foo = reinterpret_cast<ITracker*>(meta.lib->Constructor()); + return foo; + } + } + return NULL; +} + +void OPENTRACK_EXPORT opentrack_finalize_tracker(opentrack_tracker tracker) +{ + delete tracker; +} + +void OPENTRACK_EXPORT opentrack_tracker_start(opentrack self, opentrack_tracker tracker) +{ + // hot damn, this is problematic! + // need to pass QFrame from somewhere + return tracker->StartTracker(&self->fake_frame); +} + +int OPENTRACK_EXPORT opentrack_tracker_tick(opentrack_tracker tracker, double* headpose) +{ + return tracker->GiveHeadPoseData(headpose); +} + +} |