JSComponent.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #pragma once
  2. #include "../Scene/Component.h"
  3. namespace Atomic
  4. {
  5. class Javascript;
  6. class JSFile;
  7. class JSVM;
  8. /// Inbuilt scripted component methods.
  9. enum JSScriptMethod
  10. {
  11. JSMETHOD_START = 0,
  12. JSMETHOD_STOP,
  13. JSMETHOD_DELAYEDSTART,
  14. JSMETHOD_UPDATE,
  15. JSMETHOD_POSTUPDATE,
  16. JSMETHOD_FIXEDUPDATE,
  17. JSMETHOD_FIXEDPOSTUPDATE,
  18. JSMETHOD_LOAD,
  19. JSMETHOD_SAVE,
  20. JSMETHOD_READNETWORKUPDATE,
  21. JSMETHOD_WRITENETWORKUPDATE,
  22. JSMETHOD_APPLYATTRIBUTES,
  23. JSMETHOD_TRANSFORMCHANGED,
  24. MAX_JSSCRIPT_METHODS
  25. };
  26. class ATOMIC_API JSComponent : public Component
  27. {
  28. OBJECT(JSComponent);
  29. public:
  30. /// Construct.
  31. JSComponent(Context* context);
  32. /// Destruct.
  33. virtual ~JSComponent();
  34. /// Register object factory.
  35. static void RegisterObject(Context* context);
  36. /// Return class name.
  37. const String& GetClassName() const { return className_; }
  38. /// Return script file attribute.
  39. ResourceRef GetScriptFileAttr() const;
  40. void SetScriptFileAttr(ResourceRef value);
  41. void SetClassName(const String& className);
  42. /// Handle enabled/disabled state change.
  43. virtual void OnSetEnabled();
  44. void OnNodeSet(Node *node);
  45. void SetDestroyed() { destroyed_ = true; }
  46. /// Create object of certain class from the script file. Return true if successful.
  47. bool CreateObject(JSFile* scriptFile, const String& className);
  48. /// Set script file only. Recreate object if necessary.
  49. void SetScriptFile(JSFile* scriptFile);
  50. void ListenToEvent(Object* sender, StringHash eventType, JS_HEAP_PTR __duk_function);
  51. private:
  52. /// (Re)create the script object and check for supported methods if successfully created.
  53. void CreateObject();
  54. void ReleaseObject();
  55. void ClearScriptMethods();
  56. void UpdateEventSubscription();
  57. void GetScriptMethods();
  58. /// Handle scene update event.
  59. void HandleSceneUpdate(StringHash eventType, VariantMap& eventData);
  60. /// Handle scene post-update event.
  61. void HandleScenePostUpdate(StringHash eventType, VariantMap& eventData);
  62. #ifdef ATOMIC_PHYSICS
  63. /// Handle physics pre-step event.
  64. void HandlePhysicsPreStep(StringHash eventType, VariantMap& eventData);
  65. /// Handle physics post-step event.
  66. void HandlePhysicsPostStep(StringHash eventType, VariantMap& eventData);
  67. #endif
  68. /// Handle an event in script.
  69. void HandleScriptEvent(StringHash eventType, VariantMap& eventData);
  70. /// Class name.
  71. String className_;
  72. /// Script subsystem.
  73. SharedPtr<Javascript> script_;
  74. WeakPtr<JSVM> vm_;
  75. HashMap<StringHash, JS_HEAP_PTR> scriptEventFunctions_;
  76. /// Script object.
  77. void* scriptObject_;
  78. /// Pointers to supported inbuilt methods.
  79. void* methods_[MAX_JSSCRIPT_METHODS];
  80. /// Subscribed to scene update events flag.
  81. bool subscribed_;
  82. /// Subscribed to scene post and fixed update events flag.
  83. bool subscribedPostFixed_;
  84. bool started_;
  85. bool destroyed_;
  86. };
  87. }