diff --git a/src/engine/metaprogramming.h b/src/engine/metaprogramming.h index 6414785cd..ed5fa4ec6 100644 --- a/src/engine/metaprogramming.h +++ b/src/engine/metaprogramming.h @@ -34,30 +34,8 @@ struct IsSame enum { result = true }; }; -template struct ResultOf; -template struct ResultOf { using Type = R; }; -template struct ResultOf { using Type = R; }; - -template struct Arg1Type; -template struct Arg1Type { using Type = A1; }; -template struct Arg1Type { using Type = A1; }; - -template struct ClassOf; -template -struct ClassOf -{ - using Type = C; -}; -template -struct ClassOf -{ - using Type = C; -}; - - template struct Indices {}; - template struct BuildIndices { @@ -198,4 +176,23 @@ constexpr void apply(const F& f, Tuple& t) apply_impl(f, t, typename BuildIndices<-1, TupleSize::result>::result{}); } + +template struct ResultOf; +template struct ResultOf { using Type = R; }; +template struct ResultOf { using Type = R; }; + +template struct ArgCount; +template struct ArgCount { static const int result = sizeof...(Args); }; +template struct ArgCount { static const int result = sizeof...(Args); }; + +template struct ArgNType; +template struct ArgNType { using Type = typename TupleElement>::Head; }; +template struct ArgNType { using Type = typename TupleElement>::Head; }; + +template struct ClassOf; +template struct ClassOf { using Type = C; }; +template struct ClassOf { using Type = C; }; +template struct ClassOf { using Type = C; }; + + } // namespace Lumix \ No newline at end of file diff --git a/src/engine/properties.h b/src/engine/properties.h index 517cd80b6..52a649e24 100644 --- a/src/engine/properties.h +++ b/src/engine/properties.h @@ -11,6 +11,8 @@ #define LUMIX_PROP(Scene, Getter, Setter) \ &Scene::Getter, #Scene "::" #Getter, &Scene::Setter, #Scene "::" #Setter +#define LUMIX_FUNC(Func)\ + &Func, #Func namespace Lumix { @@ -278,10 +280,18 @@ struct ISimpleComponentVisitor : IComponentVisitor }; +struct IFunctionVisitor +{ + virtual void visit(const struct FunctionBase& func) = 0; +}; + + struct ComponentBase { virtual int getPropertyCount() const = 0; + virtual int getFunctionCount() const = 0; virtual void visit(IComponentVisitor&) const = 0; + virtual void visit(IFunctionVisitor&) const = 0; const char* name; ComponentType component_type; @@ -682,10 +692,11 @@ struct Scene }; -template +template struct Component : ComponentBase { - int getPropertyCount() const override { return sizeof...(Props); } + int getPropertyCount() const override { return TupleSize::result; } + int getFunctionCount() const override { return TupleSize::result; } void visit(IComponentVisitor& visitor) const override @@ -696,7 +707,14 @@ struct Component : ComponentBase } - Tuple properties; + void visit(IFunctionVisitor& visitor) const override + { + apply([&](auto& x) { visitor.visit(x); }, functions); + } + + + Props properties; + Funcs functions; }; @@ -710,10 +728,99 @@ auto scene(const char* name, Components... components) } +struct FunctionBase +{ + const char* decl_code; + + virtual int getArgCount() const = 0; + virtual const char* getReturnType() const = 0; + virtual const char* getArgType(int i) const = 0; +}; + + +namespace internal +{ + static const unsigned int FRONT_SIZE = sizeof("Lumix::Properties::internal::GetTypeNameHelper<") - 1u; + static const unsigned int BACK_SIZE = sizeof(">::GetTypeName") - 1u; + + template + struct GetTypeNameHelper + { + static const char* GetTypeName(void) + { + static const size_t size = sizeof(__FUNCTION__) - FRONT_SIZE - BACK_SIZE; + static char typeName[size] = {}; + memcpy(typeName, __FUNCTION__ + FRONT_SIZE, size - 1u); + + return typeName; + } + }; +} + + +template +const char* getTypeName(void) +{ + return internal::GetTypeNameHelper::GetTypeName(); +} + + +template struct Function; + + +template +struct Function : FunctionBase +{ + using F = R(C::*)(Args...); + F function; + + int getArgCount() const override { return ArgCount::result; } + const char* getReturnType() const override { return getTypeName::Type>(); } + + const char* getArgType(int i) const override + { + const char* expand[] = { + getTypeName()... + }; + return expand[i]; + } +}; + + +template +auto function(F func, const char* decl_code) +{ + Function ret; + ret.function = func; + ret.decl_code = decl_code; + return ret; +} + + +template +auto functions(F... functions) +{ + Tuple f = makeTuple(functions...); + return f; +} + + +template +auto component(const char* name, Tuple functions, Props... props) +{ + Component, Tuple> cmp; + cmp.name = name; + cmp.functions = functions; + cmp.properties = makeTuple(props...); + cmp.component_type = getComponentType(name); + return cmp; +} + + template auto component(const char* name, Props... props) { - Component cmp; + Component, Tuple> cmp; cmp.name = name; cmp.properties = makeTuple(props...); cmp.component_type = getComponentType(name); diff --git a/src/physics/physics_system.cpp b/src/physics/physics_system.cpp index dd59c7490..62621e967 100644 --- a/src/physics/physics_system.cpp +++ b/src/physics/physics_system.cpp @@ -118,6 +118,9 @@ namespace Lumix RadiansAttribute()) ), component("physical_controller", + functions( + function(LUMIX_FUNC(PhysicsScene::moveController)) + ), property("Layer", LUMIX_PROP(PhysicsScene, getControllerLayer, setControllerLayer)) ), component("rigid_actor", diff --git a/src/studio/win/main.cpp b/src/studio/win/main.cpp index 1b5479151..bc5175a05 100644 --- a/src/studio/win/main.cpp +++ b/src/studio/win/main.cpp @@ -5,7 +5,6 @@ #define MF_RESOURCE_DONT_INCLUDE_WINDOWS_H #include "stb/mf_resource.h" - INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT) { SetProcessDPIAware();