123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /* SINGLE CPP FILE TO GENERATE SEAMLESS BRIDGE BETWEEN BINARIES < SHARED ENGINE LIBRARY WITH ABSTRACT EXTERN FUNCTIONS> | < PLAYER EXECUTABLE WITH ABSTRACT FUNCTION IMPLEMENTATION >
- 1. if building shared engine library this file will:
- define body for Unity* methods that proxy call to actual method
- actual method will be set later from outside with respective call to SetUnity*Body
- defines SetUnity*Body method to set actual method for call, theese functions are exported from library
- 2. if building player against shared engine library this file will:
- calls SetUnity*Body providing actual method to be called by shared engine library later
- wraps all SetUnity*Body calls in one single method SetAllUnityFunctionsForDynamicPlayerLib
- - notes:
- file will be included only if development / il2ccp and:
- - for xcode project if BuildSettings.UseDynamicPlayerLib is true
- - for player if (build.pl staticLib=1, jam BUILD_IOS_DYNAMIC_PLAYER=1)
- DynamicLibEngineAPI-functions.h include list of functions to proxy calls from player to trampoline
- - each function inlist is defined with UnityExternCall or UnityExternCall4StaticMember
- */
- // deal with __VA_ARGS__ to convert them to formated lists with provided M macro
- #define VA_ARGS_COUNT(...) INTERNAL_GET_ARG_COUNT_PRIVATE(0, ## __VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
- #define INTERNAL_GET_ARG_COUNT_PRIVATE(_0, _1_, _2_, _3_, _4_, _5_, _6_, _7_, _8_, _9_, _10_, _11_, _12_, _13_, _14_, _15_, _16_, _17_, _18_, _19_, _20_, count, ...) count
- #define JOIN_VA_ARGS_0(M, ...)
- #define JOIN_VA_ARGS_1(M, T1) M(T1,1)
- #define JOIN_VA_ARGS_2(M, T1, T2) M(T1,1), M(T2,2)
- #define JOIN_VA_ARGS_3(M, T1, T2, T3) M(T1,1), M(T2,2), M(T3,3)
- #define JOIN_VA_ARGS_4(M, T1, T2, T3, T4) M(T1,1), M(T2,2), M(T3,3), M(T4,4)
- #define JOIN_VA_ARGS_5(M, T1, T2, T3, T4, T5) M(T1,1), M(T2,2), M(T3,3), M(T4,4), M(T5,5)
- #define JOIN_VA_ARGS_6(M, T1, T2, T3, T4, T5, T6) M(T1,1), M(T2,2), M(T3,3), M(T4,4), M(T5,5), M(T6,6)
- #define JOIN_VA_ARGS_7(M, T1, T2, T3, T4, T5, T6, T7) M(T1,1), M(T2,2), M(T3,3), M(T4,4), M(T5,5), M(T6,6), M(T7,7)
- #define JOIN_VA_ARGS_8(M, T1, T2, T3, T4, T5, T6, T7, T8) M(T1,1), M(T2,2), M(T3,3), M(T4,4), M(T5,5), M(T6,6), M(T7,7), M(T8,8)
- #define JOIN_VA_ARGS_9(M, T1, T2, T3, T4, T5, T6, T7, T8, T9) M(T1,1), M(T2,2), M(T3,3), M(T4,4), M(T5,5), M(T6,6), M(T7,7), M(T8,8), M(T9,9)
- #define JOIN_VA_ARGS___(M, N, ...) JOIN_VA_ARGS_##N(M, __VA_ARGS__ )
- #define JOIN_VA_ARGS__(M, N, ...) JOIN_VA_ARGS___(M,N,__VA_ARGS__)
- #define JOIN_VA_ARGS_(M, ...) JOIN_VA_ARGS__(M,VA_ARGS_COUNT(__VA_ARGS__), __VA_ARGS__)
- #define JOIN_VA_ARGS(M, ...) JOIN_VA_ARGS_(M,__VA_ARGS__)
- // convert to function definition params:
- // egz: VA_ARGS_TO_PARAMS(int, char, bool) expands to: int p3, char p2, bool p1
- #define VA_JOIN_AS_PARAMS(type, index) type p##index
- #define VA_ARGS_TO_PARAMS(...) JOIN_VA_ARGS(VA_JOIN_AS_PARAMS,__VA_ARGS__)
- // convert to function call params
- // egz: VA_ARGS_TO_CALL(int,char,bool) exapnds to: p3, p2, p1
- #define VA_JOIN_AS_CALL(type, index) p##index
- #define VA_ARGS_TO_CALL(...) JOIN_VA_ARGS(VA_JOIN_AS_CALL,__VA_ARGS__)
- #ifndef UNITY_ENGINE_DYNAMICLIB_MODE
- #define UNITY_ENGINE_DYNAMICLIB_MODE 0
- #endif
- #if UNITY_ENGINE_DYNAMICLIB_MODE
- // [ part of Unity Player ]
- // this part generates Unity* functions that act as proxy to call actual function from trampoline
- // for each function in DynamicLibEngineAPI-functions.h will be generated proxy function
- // proxy for extern "C" function
- // egz: UnityExternCall(int, UnityTestFunctionName, int);
- // will expand to:
- // static int(*gPtrUnityTestFunctionName)(int) = nullptr;
- // extern "C" int UnityTestFunctionName(int p1) {
- // assert(gPtrUnityTestFunctionName) != nullptr);
- // return gPtrUnityTestFunctionName(p1);
- // }
- // __attribute__((visibility("default")))
- // extern "C" void SetUnityTestFunctionNameBody(decltype(&UnityTestFunctionName) fPtr) {
- // gPtrUnityTestFunctionName = fPtr;
- // }
- #define UnityExternCall(returnType, funcName, ...) \
- static returnType(*gPtr##funcName)(__VA_ARGS__) = nullptr; \
- extern "C" returnType funcName(VA_ARGS_TO_PARAMS(__VA_ARGS__)) {\
- assert(gPtr##funcName != nullptr); \
- return gPtr##funcName(VA_ARGS_TO_CALL(__VA_ARGS__)); \
- } \
- __attribute__((visibility("default"))) \
- extern "C" void Set##funcName##Body(decltype(&funcName) fPtr) { \
- gPtr##funcName = fPtr; \
- }
- // proxy for class static methods
- // egz: UnityExternCall4StaticMember(int, MyClass MyMethod, int);
- // will expand to:
- // static int(*gPtrMyClassMyMethod)(int) = nullptr;
- // int MyClass::MyMethod(int p1) {
- // assert(gPtrMyClassMyMethod) != nullptr);
- // return gPtrMyClassMyMethod(p1);
- // }
- // __attribute__((visibility("default")))
- // extern "C" void SetMyClassMyMethodBody(decltype(gPtrMyClassMyMethod) fPtr) {
- // gPtrMyClassMyMethod = fPtr;
- // }
- #define UnityExternCall4StaticMember(returnType, className, funcName, ...) \
- static returnType(*gPtr##className##funcName)(__VA_ARGS__) = nullptr; \
- returnType className::funcName(VA_ARGS_TO_PARAMS(__VA_ARGS__)) { \
- assert(gPtr##className##funcName != nullptr); \
- return gPtr##className##funcName(VA_ARGS_TO_CALL(__VA_ARGS__)); \
- } \
- __attribute__((visibility("default"))) \
- extern "C" void Set##className##funcName##Body(decltype(gPtr##className##funcName) fPtr) { \
- gPtr##className##funcName = fPtr; \
- }
- #include "PlatformDependent/iPhonePlayer/Trampoline/Classes/Unity/UnitySharedDecls.h"
- #include "PlatformDependent/iPhonePlayer/Trampoline/Classes/Unity/UnityRendering.h"
- #include "PlatformDependent/iPhonePlayer/TrampolineInterface.h"
- #include "Runtime/Graphics/DisplayManager.h"
- #include "Runtime/Input/LocationService.h"
- #import <UIKit/UIKit.h>
- #include "Configuration/UndefinePlatforms.h"
- #include <mach-o/ldsyms.h>
- #include "Configuration/RedefinePlatforms.h"
- #include "DynamicLibEngineAPI-functions.h"
- #undef UnityExternCall
- #undef UnityExternCall4StaticMember
- #else
- // [ part of Xcode project ]
- // for each function defined in DynamicLibEngineAPI-functions.h will be generated SetUnity*Body function
- // for extern "C" functions
- // egz: UnityExternCall(int, UnityTestFunctionName, int);
- // will expand to:
- // extern "C" UnityTestFunctionName(int);
- // extern "C" SetUnityTestFunctionName(decltype(&UnityTestFunctionName));
- #define UnityExternCall(returnType, funcName, ...) \
- extern "C" returnType funcName(__VA_ARGS__); \
- extern "C" void Set##funcName##Body(decltype(&funcName));
- // for class static method
- // egz: UnityExternCall4StaticMember(int, MyClass MyMethod, int);
- // will expand to:
- // extern "C" void SetMyClassMyMethodBody(decltype(&MyClass::MyMethod));
- #define UnityExternCall4StaticMember(returnType, className, funcName, ...) \
- extern "C" void Set##className##funcName##Body(decltype(&className::funcName));
- #include "UnityRendering.h"
- #include "Classes/iPhone_Sensors.h"
- #include "UndefinePlatforms.h"
- #include <mach-o/ldsyms.h>
- #include "RedefinePlatforms.h"
- #include "DynamicLibEngineAPI-functions.h"
- #undef UnityExternCall
- #undef UnityExternCall4StaticMember
- // single function to call every Set*Body function from DynamicLibEngineAPI-functions.h
- #define UnityExternCall(returnType, funcName, ...) Set##funcName##Body(funcName);
- #define UnityExternCall4StaticMember(returnType, className, funcName, ...) Set##className##funcName##Body(className::funcName)
- extern "C" void SetAllUnityFunctionsForDynamicPlayerLib()
- {
- #include "DynamicLibEngineAPI-functions.h"
- }
- #undef UnityExternCall
- #undef UnityExternCall4StaticMember
- #endif
|