BsScriptAsyncOp.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptAsyncOp.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoUtil.h"
  7. #include "BsCoreThread.h"
  8. namespace bs
  9. {
  10. ScriptAsyncOp::ScriptAsyncOp(MonoObject* instance)
  11. :ScriptObject(instance)
  12. { }
  13. void ScriptAsyncOp::initRuntimeData()
  14. {
  15. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptAsyncOp::internal_createInstance);
  16. metaData.scriptClass->addInternalCall("Internal_IsComplete", &ScriptAsyncOp::internal_isComplete);
  17. metaData.scriptClass->addInternalCall("Internal_GetReturnValue", &ScriptAsyncOp::internal_getReturnValue);
  18. metaData.scriptClass->addInternalCall("Internal_BlockUntilComplete", &ScriptAsyncOp::internal_blockUntilComplete);
  19. }
  20. MonoObject* ScriptAsyncOp::create(const AsyncOp& op,
  21. std::function<MonoObject*(const AsyncOp&)> asyncOpToReturnValue)
  22. {
  23. MonoObject* managedInstance = metaData.scriptClass->createInstance();
  24. ScriptAsyncOp* scriptAsyncOp = toNative(managedInstance);
  25. scriptAsyncOp->initialize(op, asyncOpToReturnValue);
  26. return managedInstance;
  27. }
  28. void ScriptAsyncOp::initialize(const AsyncOp& op, std::function<MonoObject*(const AsyncOp&)> asyncOpToReturnValue)
  29. {
  30. mAsyncOp = op;
  31. mConvertCallback = asyncOpToReturnValue;
  32. }
  33. void ScriptAsyncOp::internal_createInstance(MonoObject* managedInstance)
  34. {
  35. new (bs_alloc<ScriptAsyncOp>()) ScriptAsyncOp(managedInstance);
  36. }
  37. void ScriptAsyncOp::internal_isComplete(ScriptAsyncOp* thisPtr, bool* value)
  38. {
  39. *value = thisPtr->mAsyncOp.hasCompleted();
  40. }
  41. MonoObject* ScriptAsyncOp::internal_getReturnValue(ScriptAsyncOp* thisPtr)
  42. {
  43. if (!thisPtr->mAsyncOp.hasCompleted())
  44. return nullptr;
  45. if (thisPtr->mConvertCallback == nullptr)
  46. return nullptr;
  47. return thisPtr->mConvertCallback(thisPtr->mAsyncOp);
  48. }
  49. void ScriptAsyncOp::internal_blockUntilComplete(ScriptAsyncOp* thisPtr)
  50. {
  51. if (!thisPtr->mAsyncOp.hasCompleted())
  52. {
  53. gCoreThread().submit();
  54. thisPtr->mAsyncOp.blockUntilComplete();
  55. }
  56. }
  57. }