X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Fupdate-manager.h;h=a2bed89253967d2a47846c40b42690c755b80157;hb=86d50396aaa49828f4f0e3b333f0211e8765cb4f;hp=410396bf10d0fc831d30e9f295ccb642c32fe0c8;hpb=950921c0adb4efda49fc5e92f2a58a38356a4d46;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/manager/update-manager.h b/dali/internal/update/manager/update-manager.h index 410396b..a2bed89 100644 --- a/dali/internal/update/manager/update-manager.h +++ b/dali/internal/update/manager/update-manager.h @@ -21,20 +21,23 @@ // INTERNAL INCLUDES #include #include + #include + #include -#include -#include -#include -#include -#include +#include +#include +#include #include +#include #include -#include -#include +#include +#include +#include #include -#include -#include +#include +#include +#include namespace Dali { @@ -43,7 +46,6 @@ namespace Integration { class GlSyncAbstraction; class RenderController; -struct DynamicsWorldSettings; } // namespace Integration @@ -51,13 +53,15 @@ namespace Internal { class PropertyNotifier; -class EventToUpdate; -struct DynamicsWorldSettings; class NotificationManager; class CompleteNotificationInterface; class ResourceManager; class TouchResampler; +namespace Render +{ +class Sampler; +} // value types used by messages template <> struct ParameterType< PropertyNotification::NotifyMode > : public BasicType< PropertyNotification::NotifyMode > {}; @@ -65,25 +69,26 @@ template <> struct ParameterType< PropertyNotification::NotifyMode > namespace SceneGraph { -class AnimatableMesh; class Animation; class DiscardQueue; -class Material; class PanGesture; class RenderManager; class RenderTaskList; class RenderQueue; -class DynamicsWorld; class TextureCache; -typedef OwnerContainer< AnimatableMesh* > AnimatableMeshContainer; -typedef OwnerContainer< Material* > MaterialContainer; +class Geometry; +class PropertyBuffer; +class Material; /** - * UpdateManager holds a scene graph i.e. a tree of nodes. + * UpdateManager maintains a scene graph i.e. a tree of nodes and attachments and + * other property owner objects. * It controls the Update traversal, in which nodes are repositioned/animated, * and organizes the the culling and rendering of the scene. + * It also maintains the lifecycle of nodes and other property owners that are + * disconnected from the scene graph. */ -class UpdateManager +class UpdateManager : public ShaderSaver { public: @@ -114,24 +119,9 @@ public: TouchResampler& touchResampler ); /** - * Destructor. Not virtual as this is not a base class - */ - ~UpdateManager(); - - /** - * The event-thread uses this interface to queue messages for the next update. - * @return The event-to-update interface. + * Destructor. */ - EventToUpdate& GetEventToUpdate(); - - /** - * @return the event buffer index - */ - BufferIndex GetEventBufferIndex() const - { - // inlined as its called often - return mSceneGraphBuffers.GetEventBufferIndex(); - } + virtual ~UpdateManager(); // Node connection methods @@ -164,10 +154,9 @@ public: * Connect a Node to the scene-graph. * A disconnected Node has has no parent or children, and its properties cannot be animated/constrained. * @pre The node does not already have a parent. - * @param[in] node The new parent node. - * @param[in] node The node to connect. + * @param[in] parent The new parent node. */ - void ConnectNode( Node* parent, Node* node, int index ); + void ConnectNode( Node* parent, Node* node ); /** * Disconnect a Node from the scene-graph. @@ -264,13 +253,30 @@ public: */ void PropertyNotificationSetNotify( PropertyNotification* propertyNotification, PropertyNotification::NotifyMode notifyMode ); - // Shaders + /** + * @brief Get the geometry owner + * + * @return The geometry owner + */ + ObjectOwnerContainer< Geometry >& GetGeometryOwner(); + ObjectOwnerContainer< Renderer >& GetRendererOwner(); /** - * Retrieve the default shader. - * @return The default shader. + * @brief Get the material owner + * + * @return The material owner */ - Shader* GetDefaultShader(); + ObjectOwnerContainer< Material >& GetMaterialOwner(); + + /** + * @brief Get the property buffer owner + * + * @return The property buffer owner + */ + ObjectOwnerContainer< PropertyBuffer >& GetPropertyBufferOwner(); + + + // Shaders /** * Add a newly created shader. @@ -288,43 +294,27 @@ public: void RemoveShader(Shader* shader); /** - * Set the shader program for a specified GeometryType to a Shader object + * Set the shader program for a Shader object * @param[in] shader The shader to modify - * @param[in] geometryType The GeometryType to map to the program - * @param[in] subType The program subtype - * @param[in] resourceId A ResourceManager ticket ID for the program data (source and compiled binary) - * @param[in] shaderHash hash key created with vertex and fragment shader code + * @param[in] shaderData Source code, hash over source, and optional compiled binary for the shader program * @param[in] modifiesGeometry True if the vertex shader modifies geometry */ - void SetShaderProgram( Shader* shader, GeometryType geometryType, ShaderSubTypes subType, Integration::ResourceId resourceId, size_t shaderHash, bool modifiesGeometry ); + void SetShaderProgram( Shader* shader, Internal::ShaderDataPtr shaderData, bool modifiesGeometry ); /** - * Add an animatable mesh - * @param[in] animatableMesh The animatable mesh to add. - * @post the animatableMesh is owned by the UpdateManager. + * @brief Accept compiled shaders passed back on render thread for saving. + * @param[in] shaderData Source code, hash over source, and corresponding compiled binary to be saved. */ - void AddAnimatableMesh( AnimatableMesh* animatableMesh ); + virtual void SaveBinary( Internal::ShaderDataPtr shaderData ); /** - * Remove an animatable mesh - * @pre The animatable mesh has been added to the update manager - * @param[in] animatableMesh The animatable mesh to add. + * @brief Set the destination for compiled shader binaries to be passed on to. + * The dispatcher passed in will be called from the update thread. + * @param[in] upstream A sink for ShaderDatas to be passed into. */ - void RemoveAnimatableMesh( AnimatableMesh* animatableMesh ); + void SetShaderSaver( ShaderSaver& upstream ); - /** - * Add a material - * @param[in] material The material to add - * @post the material remains owned by its event object - */ - void AddMaterial(Material* material); - - /** - * Remove a material - * @pre The material has been added to the UpdateManager - * @param[in] material The material to remove - */ - void RemoveMaterial(Material* material); + // Gestures /** * Add a newly created gesture. @@ -341,6 +331,112 @@ public: */ void RemoveGesture( PanGesture* gesture ); +// Message queue handling + + /** + * Reserve space for another message in the queue; this must then be initialized by the caller. + * The message will be read from the update-thread after the next FlushMessages is called. + * @post Calling this method may invalidate any previously returned slots. + * @param[in] size The message size with respect to the size of type "char". + * @param[in] updateScene A flag, when true denotes that the message will cause the scene-graph node tree to require an update. + * @note the default value of updateScene should match that in EventThreadServices::ReserveMessageSlot. + * @return A pointer to the first char allocated for the message. + */ + unsigned int* ReserveMessageSlot( std::size_t size, bool updateScene = true ); + + /** + * @return the current event-buffer index. + */ + BufferIndex GetEventBufferIndex() const + { + // inlined as its called often from event thread + return mSceneGraphBuffers.GetEventBufferIndex(); + } + + /** + * Called by the event-thread to signal that FlushQueue will be called + * e.g. when it has finished event processing. + */ + void EventProcessingStarted(); + + /** + * Flush the set of messages, which were previously stored with QueueMessage(). + * Calls to this thread-safe method should be minimized, to avoid thread blocking. + * + * @return True if there are messages to process. + */ + bool FlushQueue(); + + /** + * Add a new sampler to RenderManager + * @param[in] sampler The sampler to add + * @post Sends a message to RenderManager to add the sampler. + * The sampler will be owned by RenderManager + */ + void AddSampler( Render::Sampler* sampler ); + + /** + * Removes an existing sampler from RenderManager + * @param[in] sampler The sampler to remove + * @post The sampler will be destroyed in the render thread + */ + void RemoveSampler( Render::Sampler* sampler ); + + /** + * Sets the filter modes for an existing sampler + * @param[in] sampler The sampler + * @param[in] minFilterMode The filter to use under minification + * @param[in] magFilterMode The filter to use under magnification + */ + void SetFilterMode( Render::Sampler* sampler, unsigned int minFilterMode, unsigned int magFilterMode ); + + /** + * Sets the wrap mode for an existing sampler + * @param[in] sampler The sampler + * @param[in] uWrapMode Wrapping mode in x direction + * @param[in] vWrapMode Wrapping mode in y direction + */ + void SetWrapMode( Render::Sampler* sampler, unsigned int uWrapMode, unsigned int vWrapMode ); + + /** + * Add a new sampler to RenderManager + * @param[in] propertryBuffer The property buffer to add + * @post Sends a message to RenderManager to add the property buffer. + * The property buffer will be owned by RenderManager + */ + void AddPropertyBuffer( Render::PropertyBuffer* propertryBuffer ); + + /** + * Removes an existing PropertyBuffer from RenderManager + * @param[in] propertryBuffer The property buffer to remove + * @post The property buffer will be destroyed in the render thread + */ + void RemovePropertyBuffer( Render::PropertyBuffer* propertryBuffer ); + + /** + * Sets the format of an existing property buffer + * @param[in] propertyBuffer The property buffer. + * @param[in] format The new format of the buffer + * @post Sends a message to RenderManager to set the new format to the property buffer. + */ + void SetPropertyBufferFormat(Render::PropertyBuffer* propertyBuffer, Render::PropertyBuffer::Format* format ); + + /** + * Sets the data of an existing property buffer + * @param[in] propertyBuffer The property buffer. + * @param[in] data The new data of the buffer + * @post Sends a message to RenderManager to set the new data to the property buffer. + */ + void SetPropertyBufferData(Render::PropertyBuffer* propertyBuffer, Dali::Vector* data); + + /** + * Sets the size of an existing property buffer + * @param[in] propertyBuffer The property buffer. + * @param[in] size The new size of the buffer + * @post Sends a message to RenderManager to set the new size to the property buffer. + */ + void SetPropertyBufferSize(Render::PropertyBuffer* propertyBuffer, size_t size ); + public: /** @@ -376,23 +472,6 @@ public: */ void SetLayerDepths( const std::vector< Layer* >& layers, bool systemLevel ); -#ifdef DYNAMICS_SUPPORT - - /** - * Initialize the dynamics world - * @param[in] world The dynamics world - * @param[in] worldSettings The dynamics world settings - * @param[in] debugShader The shader used for rendering dynamics debug information - */ - void InitializeDynamicsWorld( DynamicsWorld* world, Integration::DynamicsWorldSettings* worldSettings ); - - /** - * Terminate the dynamics world - */ - void TerminateDynamicsWorld(); - -#endif // DYNAMICS_SUPPORT - private: // Undefined @@ -420,41 +499,45 @@ private: void PostProcessResources(); /** - * Helper to reset a Node properties. - * @param[in] node The node. - */ - void ResetNodeProperty( Node& node ); - - /** * Helper to reset all Node properties + * @param[in] bufferIndex to use */ - void ResetProperties(); + void ResetProperties( BufferIndex bufferIndex ); /** * Perform gesture updates. - * @param[in] lastVSyncTime The last VSync time in milliseconds. - * @param[in] nextVSyncTime The estimated time of the next VSync in milliseconds. + * @param[in] bufferIndex to use + * @param[in] lastVSyncTime The last VSync time in milliseconds. + * @param[in] nextVSyncTime The estimated time of the next VSync in milliseconds. * @return true, if any properties were updated. */ - bool ProcessGestures( unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds ); + bool ProcessGestures( BufferIndex bufferIndex, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds ); /** * Perform animation updates + * @param[in] bufferIndex to use * @param[in] elapsedSeconds time since last frame */ - void Animate( float elapsedSeconds ); + void Animate( BufferIndex bufferIndex, float elapsedSeconds ); /** * Perform constraint updates. * @note Applies constraints to nodes first (depth first search order). * Then shader constraints second (construction order) + * @param[in] bufferIndex to use */ - void ApplyConstraints(); + void ApplyConstraints( BufferIndex bufferIndex ); /** * Perform property notification updates + * @param[in] bufferIndex to use */ - void ProcessPropertyNotifications(); + void ProcessPropertyNotifications( BufferIndex bufferIndex ); + + /** + * Pass shader binaries queued here on to event thread. + */ + void ForwardCompiledShadersToEventThread(); /** * Update the default camera. @@ -465,24 +548,15 @@ private: /** * Update node shaders, opacity, geometry etc. + * @param[in] bufferIndex to use */ - void UpdateNodes(); - - /** - * Update animatable meshes - */ - void UpdateMeshes( BufferIndex updateBufferIndex, AnimatableMeshContainer& meshes ); + void UpdateNodes( BufferIndex bufferIndex ); /** - * Update materials - Ensure all render materials are updated with texture pointers - * when ready. + * Update Renderers + * @param[in] bufferIndex to use */ - void UpdateMaterials( BufferIndex updateBufferIndex, MaterialContainer& materials ); - - /** - * PrepareMaterials - Ensure updated material properties are sent to render materials - */ - void PrepareMaterials( BufferIndex updateBufferIndex, MaterialContainer& materials ); + void UpdateRenderers( BufferIndex bufferIndex ); private: @@ -501,7 +575,7 @@ inline void InstallRootMessage( UpdateManager& manager, Layer& root, bool system typedef MessageValue2< UpdateManager, Layer*, bool > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::InstallRoot, &root, systemLevel ); @@ -512,25 +586,25 @@ inline void AddNodeMessage( UpdateManager& manager, Node& node ) typedef MessageValue1< UpdateManager, OwnerPointer > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::AddNode, &node ); } -inline void ConnectNodeMessage( UpdateManager& manager, const Node& constParent, const Node& constChild, int index ) +inline void ConnectNodeMessage( UpdateManager& manager, const Node& constParent, const Node& constChild ) { // Update thread can edit the object Node& parent = const_cast< Node& >( constParent ); Node& child = const_cast< Node& >( constChild ); - typedef MessageValue3< UpdateManager, Node*, Node*, int > LocalType; + typedef MessageValue2< UpdateManager, Node*, Node* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::ConnectNode, &parent, &child, index ); + new (slot) LocalType( &manager, &UpdateManager::ConnectNode, &parent, &child ); } inline void DisconnectNodeMessage( UpdateManager& manager, const Node& constNode ) @@ -541,7 +615,7 @@ inline void DisconnectNodeMessage( UpdateManager& manager, const Node& constNode typedef MessageValue1< UpdateManager, Node* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::DisconnectNode, &node ); @@ -555,7 +629,7 @@ inline void DestroyNodeMessage( UpdateManager& manager, const Node& constNode ) typedef MessageValue1< UpdateManager, Node* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::DestroyNode, &node ); @@ -569,7 +643,7 @@ inline void AttachToNodeMessage( UpdateManager& manager, const Node& constParent typedef MessageValue2< UpdateManager, Node*, NodeAttachmentOwner > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::AttachToNode, &parent, attachment ); @@ -580,7 +654,7 @@ inline void AddObjectMessage( UpdateManager& manager, PropertyOwner* object ) typedef MessageValue1< UpdateManager, OwnerPointer > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::AddObject, object ); @@ -591,7 +665,7 @@ inline void RemoveObjectMessage( UpdateManager& manager, PropertyOwner* object ) typedef MessageValue1< UpdateManager, PropertyOwner* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::RemoveObject, object ); @@ -602,7 +676,7 @@ inline void AddAnimationMessage( UpdateManager& manager, Animation* animation ) typedef MessageValue1< UpdateManager, Animation* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::AddAnimation, animation ); @@ -616,7 +690,7 @@ inline void StopAnimationMessage( UpdateManager& manager, const Animation& const typedef MessageValue1< UpdateManager, Animation* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::StopAnimation, &animation ); @@ -630,7 +704,7 @@ inline void RemoveAnimationMessage( UpdateManager& manager, const Animation& con typedef MessageValue1< UpdateManager, Animation* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::RemoveAnimation, &animation ); @@ -641,7 +715,7 @@ inline void AddPropertyNotificationMessage( UpdateManager& manager, PropertyNoti typedef MessageValue1< UpdateManager, PropertyNotification* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::AddPropertyNotification, propertyNotification ); @@ -655,7 +729,7 @@ inline void RemovePropertyNotificationMessage( UpdateManager& manager, const Pro typedef MessageValue1< UpdateManager, PropertyNotification* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::RemovePropertyNotification, &propertyNotification ); @@ -671,7 +745,7 @@ inline void PropertyNotificationSetNotifyModeMessage( UpdateManager& manager, typedef MessageValue2< UpdateManager, PropertyNotification*, PropertyNotification::NotifyMode > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::PropertyNotificationSetNotify, propertyNotification, notifyMode ); @@ -683,7 +757,7 @@ inline void AddShaderMessage( UpdateManager& manager, Shader& shader ) typedef MessageValue1< UpdateManager, OwnerPointer< Shader > > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::AddShader, &shader ); @@ -695,7 +769,7 @@ inline void RemoveShaderMessage( UpdateManager& manager, Shader& shader ) typedef MessageValue1< UpdateManager, Shader* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::RemoveShader, &shader ); @@ -703,52 +777,24 @@ inline void RemoveShaderMessage( UpdateManager& manager, Shader& shader ) inline void SetShaderProgramMessage( UpdateManager& manager, Shader& shader, - GeometryType geometryType, - ShaderSubTypes subType, - Integration::ResourceId resourceId, - size_t shaderHash, + Internal::ShaderDataPtr shaderData, bool modifiesGeometry ) { - typedef MessageValue6< UpdateManager, Shader*, GeometryType, ShaderSubTypes, Integration::ResourceId, size_t, bool > LocalType; - - // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); - - // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::SetShaderProgram, &shader, geometryType, subType, resourceId, shaderHash, modifiesGeometry ); -} - -// The render thread can safely change the AnimatableMesh -inline void AddAnimatableMeshMessage( UpdateManager& manager, AnimatableMesh& animatableMesh ) -{ - typedef MessageValue1< UpdateManager, AnimatableMesh* > LocalType; - - // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); - - // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::AddAnimatableMesh, &animatableMesh ); -} - -// The render thread can safely change the AnimatableMesh -inline void RemoveAnimatableMeshMessage( UpdateManager& manager, AnimatableMesh& animatableMesh ) -{ - typedef MessageValue1< UpdateManager, AnimatableMesh* > LocalType; + typedef MessageValue3< UpdateManager, Shader*, Internal::ShaderDataPtr, bool > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::RemoveAnimatableMesh, &animatableMesh ); + new (slot) LocalType( &manager, &UpdateManager::SetShaderProgram, &shader, shaderData, modifiesGeometry ); } - inline void SetBackgroundColorMessage( UpdateManager& manager, const Vector4& color ) { typedef MessageValue1< UpdateManager, Vector4 > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::SetBackgroundColor, color ); @@ -759,7 +805,7 @@ inline void SetDefaultSurfaceRectMessage( UpdateManager& manager, const Rect > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::SetDefaultSurfaceRect, rect ); @@ -770,7 +816,7 @@ inline void KeepRenderingMessage( UpdateManager& manager, float durationSeconds typedef MessageValue1< UpdateManager, float > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::KeepRendering, durationSeconds ); @@ -787,82 +833,155 @@ inline void SetLayerDepthsMessage( UpdateManager& manager, const std::vector< La typedef MessageValue2< UpdateManager, std::vector< Layer* >, bool > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &manager, &UpdateManager::SetLayerDepths, layers, systemLevel ); } -inline void AddMaterialMessage( UpdateManager& manager, Material* material ) +inline void AddGestureMessage( UpdateManager& manager, PanGesture* gesture ) { - typedef MessageValue1< UpdateManager, Material* > LocalType; + typedef MessageValue1< UpdateManager, PanGesture* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::AddMaterial, material ); + new (slot) LocalType( &manager, &UpdateManager::AddGesture, gesture ); } -inline void RemoveMaterialMessage( UpdateManager& manager, Material* material ) +inline void RemoveGestureMessage( UpdateManager& manager, PanGesture* gesture ) { - typedef MessageValue1< UpdateManager, Material* > LocalType; + typedef MessageValue1< UpdateManager, PanGesture* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::RemoveMaterial, material ); + new (slot) LocalType( &manager, &UpdateManager::RemoveGesture, gesture ); } -inline void AddGestureMessage( UpdateManager& manager, PanGesture* gesture ) +template< typename T > +inline void AddMessage( UpdateManager& manager, ObjectOwnerContainer& owner, T& object ) { - typedef MessageValue1< UpdateManager, PanGesture* > LocalType; + typedef MessageValue1< ObjectOwnerContainer, OwnerPointer< T > > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &owner, &ObjectOwnerContainer::Add, &object ); +} +template< typename T > +inline void RemoveMessage( UpdateManager& manager, ObjectOwnerContainer& owner, T& object ) +{ + typedef MessageValue1< ObjectOwnerContainer, T* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::AddGesture, gesture ); + new (slot) LocalType( &owner, &ObjectOwnerContainer::Remove, &object ); } -inline void RemoveGestureMessage( UpdateManager& manager, PanGesture* gesture ) +inline void AddSamplerMessage( UpdateManager& manager, Render::Sampler& sampler ) { - typedef MessageValue1< UpdateManager, PanGesture* > LocalType; + typedef MessageValue1< UpdateManager, Render::Sampler* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::RemoveGesture, gesture ); + new (slot) LocalType( &manager, &UpdateManager::AddSampler, &sampler ); +} + +inline void RemoveSamplerMessage( UpdateManager& manager, Render::Sampler& sampler ) +{ + typedef MessageValue1< UpdateManager, Render::Sampler* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemoveSampler, &sampler ); +} + +inline void SetFilterModeMessage( UpdateManager& manager, Render::Sampler& sampler, unsigned int minFilterMode, unsigned int magFilterMode ) +{ + typedef MessageValue3< UpdateManager, Render::Sampler*, unsigned int, unsigned int > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::SetFilterMode, &sampler, minFilterMode, magFilterMode ); } -#ifdef DYNAMICS_SUPPORT +inline void SetWrapModeMessage( UpdateManager& manager, Render::Sampler& sampler, unsigned int uWrapMode, unsigned int vWrapMode ) +{ + typedef MessageValue3< UpdateManager, Render::Sampler*, unsigned int, unsigned int > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::SetWrapMode, &sampler, uWrapMode, vWrapMode ); +} + +inline void AddPropertyBuffer( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer ) +{ + typedef MessageValue1< UpdateManager, Render::PropertyBuffer* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AddPropertyBuffer, &propertyBuffer ); +} + +inline void RemovePropertyBuffer( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer ) +{ + typedef MessageValue1< UpdateManager, Render::PropertyBuffer* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemovePropertyBuffer, &propertyBuffer ); +} + +inline void SetPropertyBufferFormat( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, Render::PropertyBuffer::Format* format ) +{ + typedef MessageValue2< UpdateManager, Render::PropertyBuffer*, Render::PropertyBuffer::Format* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferFormat, &propertyBuffer, format ); +} -// Dynamics messages -inline void InitializeDynamicsWorldMessage( UpdateManager& manager, DynamicsWorld* dynamicsworld, Integration::DynamicsWorldSettings* worldSettings ) +inline void SetPropertyBufferData( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, Vector* data ) { - typedef MessageValue2< UpdateManager, DynamicsWorld*, Integration::DynamicsWorldSettings* > LocalType; + typedef MessageValue2< UpdateManager, Render::PropertyBuffer*, Vector* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::InitializeDynamicsWorld, dynamicsworld, worldSettings ); + new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferData, &propertyBuffer, data ); } -inline void TerminateDynamicsWorldMessage(UpdateManager& manager) +inline void SetPropertyBufferSize( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, size_t size ) { - typedef Message< UpdateManager > LocalType; + typedef MessageValue2< UpdateManager, Render::PropertyBuffer*, size_t > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = manager.GetEventToUpdate().ReserveMessageSlot( sizeof( LocalType ) ); + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::TerminateDynamicsWorld ); + new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferSize, &propertyBuffer, size ); } -#endif // DYNAMICS_SUPPORT } // namespace SceneGraph