BsScriptAsyncOp.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "BsScriptAsyncOp.h"
  2. #include "BsMonoManager.h"
  3. #include "BsMonoClass.h"
  4. #include "BsMonoUtil.h"
  5. #include "BsCoreThread.h"
  6. namespace BansheeEngine
  7. {
  8. ScriptAsyncOp::ScriptAsyncOp(MonoObject* instance)
  9. :ScriptObject(instance)
  10. { }
  11. void ScriptAsyncOp::initRuntimeData()
  12. {
  13. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptAsyncOp::internal_createInstance);
  14. metaData.scriptClass->addInternalCall("Internal_IsComplete", &ScriptAsyncOp::internal_isComplete);
  15. metaData.scriptClass->addInternalCall("Internal_GetReturnValue", &ScriptAsyncOp::internal_getReturnValue);
  16. metaData.scriptClass->addInternalCall("Internal_BlockUntilComplete", &ScriptAsyncOp::internal_blockUntilComplete);
  17. }
  18. MonoObject* ScriptAsyncOp::create(const AsyncOp& op,
  19. std::function<MonoObject*(const AsyncOp&)> asyncOpToReturnValue)
  20. {
  21. MonoObject* managedInstance = metaData.scriptClass->createInstance();
  22. ScriptAsyncOp* scriptAsyncOp = toNative(managedInstance);
  23. scriptAsyncOp->initialize(op, asyncOpToReturnValue);
  24. return managedInstance;
  25. }
  26. void ScriptAsyncOp::initialize(const AsyncOp& op, std::function<MonoObject*(const AsyncOp&)> asyncOpToReturnValue)
  27. {
  28. mAsyncOp = op;
  29. mConvertCallback = asyncOpToReturnValue;
  30. }
  31. void ScriptAsyncOp::internal_createInstance(MonoObject* managedInstance)
  32. {
  33. ScriptAsyncOp* scriptAsyncOp = new (bs_alloc<ScriptAsyncOp>()) ScriptAsyncOp(managedInstance);
  34. }
  35. void ScriptAsyncOp::internal_isComplete(ScriptAsyncOp* thisPtr, bool* value)
  36. {
  37. *value = thisPtr->mAsyncOp.hasCompleted();
  38. }
  39. MonoObject* ScriptAsyncOp::internal_getReturnValue(ScriptAsyncOp* thisPtr)
  40. {
  41. if (!thisPtr->mAsyncOp.hasCompleted())
  42. return nullptr;
  43. if (thisPtr->mConvertCallback == nullptr)
  44. return nullptr;
  45. return thisPtr->mConvertCallback(thisPtr->mAsyncOp);
  46. }
  47. void ScriptAsyncOp::internal_blockUntilComplete(ScriptAsyncOp* thisPtr)
  48. {
  49. thisPtr->mAsyncOp.blockUntilComplete();
  50. }
  51. }