NAP
sequenceservice.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "sequenceplayer.h"
9 
10 // External Includes
11 #include <nap/service.h>
12 #include <entity.h>
13 #include <nap/datetime.h>
14 #include <rtti/factory.h>
15 
16 namespace nap
17 {
19 
20  // forward declares
21  class SequenceController;
22  class SequenceEditor;
23  class SequencePlayerAdapter;
24  class SequencePlayerStandardClock;
25 
26  // shortcuts
27  using SequenceControllerFactoryFunc = std::function<std::unique_ptr<SequenceController>(SequencePlayer&, SequenceEditor &)>;
28  using SequenceControllerFactoryMap = std::unordered_map<rtti::TypeInfo, SequenceControllerFactoryFunc>;
29  using DefaultSequenceTrackFactoryMap = std::unordered_map<rtti::TypeInfo, std::function<std::unique_ptr<SequenceTrack>(const SequencePlayerOutput*)>>;
30  using SequencePlayerAdapterFactoryFunc = std::function<std::unique_ptr<SequencePlayerAdapter>(const SequenceTrack&,
32  const SequencePlayer&)>;
33  using SequencePlayerAdapterFactoryMap = std::unordered_map<rtti::TypeInfo, SequencePlayerAdapterFactoryFunc>;
34 
42  class NAPAPI SequenceService final : public Service
43  {
44  friend class SequencePlayerOutput;
45 
46  RTTI_ENABLE(Service)
47  public:
51  SequenceService(ServiceConfiguration *configuration);
52 
56  ~SequenceService() override;
57 
65  bool registerDefaultTrackCreatorForOutput(rtti::TypeInfo outputType,
66  std::function<std::unique_ptr<SequenceTrack>(const SequencePlayerOutput*)> func);
67 
75  Sequence *createDefaultSequence(std::vector<std::unique_ptr<rtti::Object>>& createdObjects,
76  std::unordered_set<std::string>& objectIDs,
77  const std::vector<ResourcePtr<SequencePlayerOutput>>& outputs);
78 
85  bool registerControllerTypeForTrackType(rtti::TypeInfo trackType, rtti::TypeInfo controllerType);
86 
92  rtti::TypeInfo getControllerTypeForTrackType(rtti::TypeInfo trackType);
93 
100  bool registerControllerFactoryFunc(rtti::TypeInfo controllerType, SequenceControllerFactoryFunc factory);
101 
108  bool registerAdapterFactoryFunc(rtti::TypeInfo typeInfo, SequencePlayerAdapterFactoryFunc factory);
109 
118  std::unique_ptr<SequencePlayerAdapter> invokeAdapterFactory(rtti::TypeInfo type, const SequenceTrack& track,
119  SequencePlayerOutput& output,
120  const SequencePlayer& player);
121 
129  std::unique_ptr<SequenceController> invokeControllerFactory(rtti::TypeInfo controllerType,
130  SequencePlayer& player, SequenceEditor& editor);
131 
136  std::vector<rtti::TypeInfo> getRegisteredControllerTypes() const;
137 
144  std::string generateUniqueID(std::unordered_set<std::string>& objectIDs,
145  const std::string& baseID = "Generated");
146 
151  void registerStandardClock(SequencePlayerStandardClock* standardClock);
152 
157  void unregisterStandardClock(SequencePlayerStandardClock* standardClock);
158 
159  protected:
164  void registerObjectCreators(rtti::Factory& factory) override;
165 
171  bool init(nap::utility::ErrorState& errorState) override;
172 
177  void update(double deltaTime) override;
178 
179  private:
184  void registerOutput(SequencePlayerOutput& output);
185 
190  void removeOutput(SequencePlayerOutput& output);
191 
192  // vector holding raw pointers to outputs
193  std::vector<SequencePlayerOutput*> mOutputs;
194 
195  // factory map for default creation of tracks
196  DefaultSequenceTrackFactoryMap mDefaultTrackCreatorMap;
197 
198  // map of controller type information for each track type
199  std::unordered_map<rtti::TypeInfo, rtti::TypeInfo> mControllerTypesTrackTypeMap;
200 
201  // map of controller factory functions
202  SequenceControllerFactoryMap mControllerFactory;
203 
204  // map of sequence player adapter factory functions
205  SequencePlayerAdapterFactoryMap mAdapterFactory;
206 
207  // clocks that need updating
208  std::vector<SequencePlayerStandardClock*> mClocks;
209  };
210 }
nap::SequencePlayer
Definition: sequenceplayer.h:36
nap::SequenceEditor
Definition: sequenceeditor.h:32
nap::rtti::ObjectPtr
Definition: objectptr.h:154
nap::SequenceService
Definition: sequenceservice.h:42
nap::utility::ErrorState
Definition: errorstate.h:19
nap::SequenceControllerFactoryFunc
std::function< std::unique_ptr< SequenceController >(SequencePlayer &, SequenceEditor &)> SequenceControllerFactoryFunc
Definition: sequenceservice.h:27
nap::ServiceConfiguration
Definition: service.h:28
nap::SequencePlayerAdapterFactoryMap
std::unordered_map< rtti::TypeInfo, SequencePlayerAdapterFactoryFunc > SequencePlayerAdapterFactoryMap
Definition: sequenceservice.h:33
nap::SequenceTrack
Definition: sequencetrack.h:22
nap::SequencePlayerOutput
Definition: sequenceplayeroutput.h:23
nap::Service
Definition: templateservice.h:8
nap::rtti::Factory
Definition: factory.h:78
nap::SequencePlayerAdapterFactoryFunc
std::function< std::unique_ptr< SequencePlayerAdapter >(const SequenceTrack &, SequencePlayerOutput &, const SequencePlayer &)> SequencePlayerAdapterFactoryFunc
Definition: sequenceservice.h:32
nap
Definition: templateapp.h:17
nap::SequenceControllerFactoryMap
std::unordered_map< rtti::TypeInfo, SequenceControllerFactoryFunc > SequenceControllerFactoryMap
Definition: sequenceservice.h:28
nap::Sequence
Definition: sequence.h:22
nap::SequencePlayerStandardClock
Definition: sequenceplayerclock.h:59
nap::rtti::TypeInfo
rttr::type TypeInfo
Definition: typeinfo.h:140
nap::DefaultSequenceTrackFactoryMap
std::unordered_map< rtti::TypeInfo, std::function< std::unique_ptr< SequenceTrack >(const SequencePlayerOutput *)> > DefaultSequenceTrackFactoryMap
Definition: sequenceservice.h:29