From 7dbdc48ead036277d57a6a6ad61d6056c3b39a07 Mon Sep 17 00:00:00 2001 From: Adeel Kazmi Date: Tue, 26 May 2015 18:23:13 +0100 Subject: [PATCH 1/1] Update contents of programming guide Change-Id: I36b3fa9c2de0874d5589f027c0d46213574a1075 --- docs/content/images/architecture.png | Bin 0 -> 35760 bytes docs/content/images/dali-threads.png | Bin 0 -> 24880 bytes docs/content/main.md | 195 +++++++++++---------- docs/content/programming-guide/custom-actor.h | 32 ---- docs/content/programming-guide/dali-application.h | 126 +------------ docs/content/programming-guide/dynamics-bodies.h | 140 --------------- .../programming-guide/dynamics-collisions.h | 133 -------------- .../programming-guide/dynamics-initialization.h | 101 ----------- docs/content/programming-guide/dynamics-intro.h | 21 --- docs/content/programming-guide/dynamics-joints.h | 108 ------------ .../{image-mesh-actor.h => image-actor.h} | 41 +---- .../dali-introduction.md | 30 ++++ .../fundamentals.md | 6 +- .../high-level-design.md | 26 +++ .../programming-languages.md | 83 +++++++++ 15 files changed, 255 insertions(+), 787 deletions(-) create mode 100644 docs/content/images/architecture.png create mode 100644 docs/content/images/dali-threads.png delete mode 100644 docs/content/programming-guide/custom-actor.h delete mode 100644 docs/content/programming-guide/dynamics-bodies.h delete mode 100644 docs/content/programming-guide/dynamics-collisions.h delete mode 100644 docs/content/programming-guide/dynamics-initialization.h delete mode 100644 docs/content/programming-guide/dynamics-intro.h delete mode 100644 docs/content/programming-guide/dynamics-joints.h rename docs/content/programming-guide/{image-mesh-actor.h => image-actor.h} (73%) create mode 100644 docs/content/shared-javascript-and-cpp-documentation/dali-introduction.md create mode 100644 docs/content/shared-javascript-and-cpp-documentation/high-level-design.md create mode 100644 docs/content/shared-javascript-and-cpp-documentation/programming-languages.md diff --git a/docs/content/images/architecture.png b/docs/content/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..d9aaa26be0703d2fa29790ef4ba422b51454a9f9 GIT binary patch literal 35760 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 literal 0 HcmV?d00001 diff --git a/docs/content/images/dali-threads.png b/docs/content/images/dali-threads.png new file mode 100644 index 0000000000000000000000000000000000000000..997d2386979d895cd37cfee7dff12c0fb4729358 GIT binary patch literal 24880 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 literal 0 HcmV?d00001 diff --git a/docs/content/main.md b/docs/content/main.md index e76d89e..1289468 100644 --- a/docs/content/main.md +++ b/docs/content/main.md @@ -1,94 +1,103 @@ -# DALi introduction - -## DALi 3D ( Dynamic Animation Library ) - -DALi is a quick and easy way of allowing developers to create Rich UI Applications like: - - + Image & Video galleries - + Music players - + Games - + Maps - + Homescreens / launch pads - + Advanced watch faces for wearable devices - -DALi is based on OpenGL ES 2.0 & 3.0, however it hides the complexity of -the OpenGL API from developers and provides a clean cross-platform C++ & JavaScript framework. - -+ Create Images, Text and Meshes -+ Create shaders using GLSL -+ Provide multiple cameras and render targets -+ Provides Layers to aid in 2D UI layout -+ Easy to use Animation framework -+ Automatic background loading of resources ( images / text / meshes ) -+ Runs all animations in a seperate thread. This helps maintain 60 FPS even if JavaScript is performing a long operation ( e.g. Garbage Collection ). -+ Provides keyboard / touch / mouse handling - -![ ](screen-shot.png) - -## Introduction -- \link fundamentals Dali Fundamentals \endlink -- \link dali-application Dali Application and Adaptor \endlink -- \link hello-world Hello World - explained \endlink -- \link handle-body-idiom Handle – body idiom \endlink - -## Actors - - \link image-mesh-actor Image and Mesh actors \endlink - - \link event-system Event Handling \endlink - - \link custom-actor Custom Actor \endlink - - ## ShaderEffects - - \link shader-intro Shader Effects\endlink - - ## Animation - - \link animation-example Example and Usage\endlink - - \link animation-rotation Rotation with quaternions \endlink - - \link animation-shader Shader Animation \endlink - - \link animation-multi-threading-notes Multi-threading Notes \endlink - - ## Constraints - - \link constraints Introduction to Constraints \endlink - -## Size Negotation - - \link size-negotiation Size Negotiation \endlink - - ## UI Controls - - \link text-label Text Label\endlink - - \link scroll-view Scroll View \endlink - - \link size-negotiation-controls Size Negotiation for Controls \endlink - - \link type-registration Type Registration \endlink - - \link properties Properties \endlink - - \link background Background \endlink - - ## Dynamics - - \link dynamics-intro Introduction to Dynamics\endlink - - \link dynamics-initialization Initializing the Simulation\endlink - - \link dynamics-bodies Bodies - adding and controlling dynamic objects \endlink - - \link dynamics-joints Joints - linking objects\endlink - - \link dynamics-collisions Collision Detection and Filtering\endlink - - ## Scripting - - \link scriptoverview JSON and JavaScript Overview \endlink - - \link script-json-specification JSON Specification\endlink - - \link script-hello Hello World in script \endlink - - \link javascriptwrapping JavaScript Wrapping Guide for DALi developers\endlink - - ## Rendering - - \link viewing-modes Viewing modes \endlink - - ## Profiling - - \link performanceprofiling Performance Profiling \endlink - - \link resourcetracking Resource Tracking \endlink - - ## Performance - - \link performancetips Performance Tips \endlink - - \link textureatlases Texture Atlases \endlink - - \link texturecompression Compressing Textures \endlink - -## Testing - See [Automated Tests](@ref auto_testing) for instructions. - - -## Modifying this documentation -- \link documentationguide Modifying this documentation \endlink - +# DALi Introduction + +### Introduction + + [What is DALi?](@ref dali-introduction) + + [Features](@ref dali-features) + + [High Level Design](@ref dali-hld) + + [Components](@ref dali-components) + + [Main, Update & Render Threads](@ref dali-threads) + + [DALi Fundamentals](@ref fundamentals) + + [Actors & Stage](@ref actors-and-stage) + + [Coordinate System](@ref coordinate-system) + + Units & the Default Camera (default unit 1 is 1 pixel with default camera) + + [Handle / Body Idiom](@ref handle-body-idiom) + + Signals + + [Properties](@ref properties) + + Actions + + Tutorial + + [Hello World](@ref hello-world) + +### Getting Started + + How to build DALi on Ubuntu Desktop + +### Programming Guide + + [Programming Languages:](@ref programming-languages) + + [C++](@ref c-plus-plus) + + [JavaScript](@ref java-script-support) + + [JSON](@ref json-support) + + [Application](@ref dali-application) + + Actors + + [Positioning](@ref positioning-actors) + + [Event Handling](@ref event-system) + + [Layouting](@ref size-negotiation) + + [Image Actor](@ref image-actor) + + Animation + + AnimateTo + + AnimateBy + + Key Frame Animations + + Path Animations + + [Constraints](@ref constraints) + + Equal To Constraint + + Relative To Constraint + + Linear Constrainer + + Path Constrainer + + [Multi-threading Notes](@ref animation-multi-threading-notes) + + [Shader Animation](@ref animation-shader) + + [Example and Usage](@ref animation-example) + + [Rotation with quaternions](@ref animation-rotation) + +### Resources + + Resource Image + + 9 Patch Image + + Buffer Image + +### Control Base Class + + [Background Feature](@ref background) + + Keyboard Focus + + Accessibility + +### UI Controls + + [Text Label](@ref text-label) + + TextEntry + + Buttons + + TableView + + [Scroll View](@ref scroll-view) + + ItemView + +### RenderTasks + +### Shader Effects + + [Overview](@ref shader-intro) + +### Scripting + + [JSON and JavaScript Overview](@ref scriptoverview) + + [JSON Syntax](@ref script-json-specification) + + [Scripting Hello World](@ref script-hello) + +### Tools + + Environment Variables + + [Resource Tracking](@ref resourcetracking) + + Logging + + GUI Builder + + Stagehand + +### Viewing Modes + + [Overview](@ref viewing-modes) + +### Extending DALi + + Control Base Class Services + + How to write Custom UI Controls + + [Size Negotiation for Controls](@ref size-negotiation-controls) + + [Type Registration](@ref type-registration) + + How to make Controls Scriptable + + [Automated Tests](@ref auto_testing) + + [Programming Guide](@ref documentationguide) + + [JavaScript Wrapping Guide for DALi developers](@ref javascriptwrapping) + +### Application Optimization Guide + + [Texture Atlases](@ref textureatlases) + + [Texture Compression](@ref texturecompression) + + Performance & Debugging + + [Performance Tips](@ref performancetips) + + [Performance Profiling](@ref performanceprofiling) diff --git a/docs/content/programming-guide/custom-actor.h b/docs/content/programming-guide/custom-actor.h deleted file mode 100644 index 808bfca..0000000 --- a/docs/content/programming-guide/custom-actor.h +++ /dev/null @@ -1,32 +0,0 @@ -/*! \page custom-actor Custom Actor - * The Dali::CustomActor is used as a base class for UI controls. It is a proxy object to enable derived classes access - * to a subset of the methods defined in the internal Actor class. - * - * Classes deriving from Custom Actor should follow the same handle - body design principle as the rest of the Dali API. - * - * One class of the new UI control should inherit from Dali::CustomActor, while a second should inherit - * Dali::CustomActorImpl. This implementation class contains a number of pure virtual methods that enable the new UI - * control to respond to a variety of events such as touch and notification of being added to the stage. - * - * For example, if creating a new button widget called myNewButton, the user would create two classes, myNewButton which - * derives from Dali::CustomActor and an implementation part myNewButtonImpl which would derive from Dali::CustomActorImpl. - * - * In the New() method for the myNewButton class, the user should then create a new instance of the myNewButtonImpl class - * and pass this to the constructor of the myNewButton object. Internally the connection will be made - * between the new widget actor and Dali, thus allowing messages such as OnPropertySet to be received by the new actor. - * - * It is the responsibility of the implementation of the new UI control to implement the method bodies for the inherited - * pure virtual methods from Dali::CustomActorImpl. Obviously the application won't compile if the methods are not - * overidden, but the user does not need to fill in the code for methods they don't want or need to use. - * - * After the implementation object is created it is passed back to the basic Text View through the constructor,the - * constructor uses this passed in object to initialise the internal implementation objects. - * - * After both the objects are created it calls an init method on the implementation which is used to initialise - * objects. THis is the preferred way to do things so to avoid errors in the constructors. - * - * If desired, the user can then use the myNewButtonImpl implementation class to handle only the callback message - * handler methods, and do all the rest of their widget processing the the main myNewButton class. Access to the - * implementation class can be gained using the GetImpl(*this) method. For example: - * - */ diff --git a/docs/content/programming-guide/dali-application.h b/docs/content/programming-guide/dali-application.h index 07cc934..3921284 100644 --- a/docs/content/programming-guide/dali-application.h +++ b/docs/content/programming-guide/dali-application.h @@ -1,10 +1,12 @@ -/*! \page dali-application Dali Application and Adaptor +/*! \page dali-application DALi Application *

Creating an Application

-The Adaptor framework provides several classes which intialises and sets up Dali appropriately so that the application writer does not have to. These classes also provides many platform related services (e.g. orienation change notifications, timer services etc.). +The Adaptor framework provides provides a Dali::Application class which initialises and sets up Dali appropriately so that the application writer does not have to. +This provides many platform related services. -The simplest way to create an application that uses Dali is to utilise the Dali::Application class. In addition to initialising the environment used by Dali, it also provides several signals which the user can connect to when certain platform related activities occur. It also ensures that, upon system events, Dali is called in a thread-safe manner. +Several signals can be connected to so that the application writer is informed when certain platform related activities occur. +It also ensures that, upon system events, DALi is called in a thread-safe manner. The following example shows how to create a Dali::Application instance and connect to its initialise signal (which is where a Dali::Actor hierarchy should be created). @@ -18,7 +20,7 @@ void CreateProgram(Application& app) int main (int argc, char **argv) { - Application app = Application::New(&argc, &argv); + Dali::Application app = Application::New(&argc, &argv); app.InitSignal().Connect(&CreateProgram); app.MainLoop(); } @@ -26,98 +28,8 @@ int main (int argc, char **argv) Please see the Dali::Application class for other signals to which the application can connect. -

Using an Adaptor or EvasPlugin instead of the Application class

- -If the application requires finer grained control, an Dali::Adaptor can be created instead. This allows the application writer to create other platform related functionality themselves (e.g managing the main loop, providing a surface to render to etc.). - -When using the Adaptor, the application writer can specify the use of normal window creation and drawing by using the New method with an appropriate Window. - -If the application writer wants Dali to draw to a specific surface then they need to create a Dali::RenderSurface instance and use the Adaptor constructor which takes the Dali::RenderSurface as the parameter. - -The only signal provided by the adaptors is a surface resized signal; the application writer will have to handle system signals like initialise, pause, terminate etc. themselves. It is also important that any calls to Dali are made in a thread-safe manner from your application when using the adaptor directly. - -An adaptor can be created as shown below: - -@code -void CreateProgram(void* data) -{ - // Start Adaptor - Dali::Adaptor* adaptor = reinterpret_cast(data); - adaptor->Start(); - - // Create Dali components... - // Can instantiate here, if required -} - -int main () -{ - // Initialise platform - MyPlatform.Init(); - - // Create an 800 by 1280 window positioned at (0,0). - Dali::PositionSize positionSize(0, 0, 800, 1280); - Dali::Window window = Dali::Window::New( positionSize, "My Application" ); - Dali::Adaptor& adaptor = Dali::Adaptor::New( window ); - - // Assuming second parameter takes in data which is passed back to the callback function - MyPlatform.InitialisationConnection(&CreateProgram, &adaptor); - - // Start Main Loop of your platform - MyPlatform.StartMainLoop(); - - return 0; -} -@endcode - -A Dali::EvasPlugin instance can be created by EFL applications that wish to use Dali. Like the Adaptor, it also provides a means for initialising the resources required by the Dali::Core. - -The Dali::EvasPlugin emits several signals which the user can connect to. The user should not create any Dali objects in the main function and instead should connect to the Init signal of the EvasPlugin and create the Dali objects in the connected callback. - -A Dali::EvasPlugin can be used in an EFL application as shown below: - -@code -void Created(EvasPlugin& evasPlugin) -{ - // Create Dali components... - // Can instantiate here, if required -} - -void Resized(EvasPlugin& evasPlugin) -{ - // Set size properties of Dali components - // Set screen layout -} - -int main (int argc, char **argv) -{ - // Initialise Elementary - elm_init(&argc, &argv); - - // Create an Evas Window - Evas_Object* win = elm_win_add(...); - - // Get the actual window - Evas* e = evas_object_evas_get(win); - - // Create the EvasPlugin and pass the actual window - Dali::EvasPlugin evasPlugin = Dali::EvasPlugin(e); - - evasPlugin.SignalInit().Connect(&Created); - evasPlugin.SignalResize().Connect(&Resized); - - // Retrieve the Evas_Object from the plugin and show it. - Evas_Object* evasObject = evasPlugin.GetEvasObject(); - evas_object_show(evasObject); - - // add evasObject to layout such as elm_box - - // Start main loop - elm_run(); -} -@endcode -

Window

-Dali provides a Window class to manage drawing to a default surface. It is also responsible for drawing the Indicator bar if required. The Application class automatically creates a Window which the application author can access after the SignalInit has fired. +DALi provides a Window class to manage drawing to a default surface. It is also responsible for drawing the Indicator bar if required. The Application class automatically creates a Window which the application author can access after the SignalInit has fired. @code void CreateProgram(Application& app) @@ -127,32 +39,12 @@ void CreateProgram(Application& app) int main (int argc, char **argv) { - Application app = Application::New(argc, argv); + Dali::Application app = Application::New(argc, argv); app.SignalInit().Connect(&CreateProgram); app.MainLoop(); } @endcode -

Orientation

- -The Adaptor Framework also provides a means of retrieving the current device orientation and connection to a signal when the orientation of the device changes. The Dali::Application class provides access to an already created Dali::Orientation object. If using a Dali::Adaptor, an instance of the Dali::Orientation class has to be created in the application. - -The following example shows how to connect to an orientation changed signal through the Dali::Application class: - -@code -void OrientationChanged(const Orientation& orientation) -{ - int degrees = orientation.GetDegrees(); - ... -} - -int main(int argc, char **argv) -{ - Application app = Application::New(&argc, &argv); - app.GetWindow().GetOrientation().SignalChanged().Connect(&OrientationChanged); -} -@endcode -

Timers

Timers are also provided by the Adaptor Framework so that the application writer can execute a portion of their code periodically or just once, after a delay. The example below shows how a Dali::Timer can be created and used: @@ -167,7 +59,7 @@ bool Tick() ... // Elsewhere -Timer timer = Timer::New(2000); // 2 second timeout +Dali::Timer timer = Dali::Timer::New(2000); // 2 second timeout timer.SignalTick().Connect(&Tick); ... @endcode diff --git a/docs/content/programming-guide/dynamics-bodies.h b/docs/content/programming-guide/dynamics-bodies.h deleted file mode 100644 index 42c8195..0000000 --- a/docs/content/programming-guide/dynamics-bodies.h +++ /dev/null @@ -1,140 +0,0 @@ -/** - * \page dynamics-bodies Dynamics - Bodies - * A Dali::DynamicsBody can be "Rigid" or "Soft". Rigid bodies require much less processing and should be used - * in preference to a soft body.\n - * All bodies are controlled by the simulation, the application developer can influence them by setting their - * linear or angular velocities, but direct control of their position is not possible until the Dali::DynamicsBody is flagged - * as a \ref kinematic-body "kinematic object".\n - * - * \section create-body Creating a body - *

- * Each Dali::DynamicsBody is created by an Dali::Actor through its Dali::Actor::EnableDynamics method using a - * Dali::DynamicsBodyConfig object to specify options for the Dali::DynamicsBody. - * \code - * // Initialize and get a handle to the Dali::DynamicsWorld - * Dali::DynamicsWorldConfig worldConfig( Dali::DynamicsWorldConfig::New() ); - * Dali::DynamicsWorld dynamicsWorld( Dali::Stage::GetCurrent().InitializeDynamics( worldConfig ) ); - * // Create an actor to represent the world - * Dali::Actor dynamicsRootActor( Dali::Actor::New() ); - * dynamicsWorld.SetRootActor( dynamicsRootActor ); - * Dali::Stage::GetCurrent().Add( dynamicsRootActor ); - * - * // create an actor to represent a rigid body - * Dali::Actor actor( Dali::Actor::New() ); - * actor.SetParentOrigin( Dali::ParentOrigin::CENTER ); - * dynamicsRootActor.Add( actor ); - * // Enable dynamics for the actor, creating a rigid body with default configuration - * actor.EnableDynamics( Dali::DynamicsBodyConfig::New() ); - * \endcode - * - * \section create-body-advanced Specifying options - *

Mass

- * Use Dali::DynamicsBodyConfig::SetMass to specify the mass of the body [default: 1]. - *

Elasticity

- * Use Dali::DynamicsBodyConfig::SetElasticity to specify the elasticity of the body [default: 0.85].\n - * This may also be known as the co-efficient of restitution or 'bounciness'. - *

Damping

- * Use Dali::DynamicsBodyConfig::SetLinearDamping to specify the linear damping coefficient [default: 0].\n - * and Dali::DynamicsBodyConfig::SetAngularDamping to specify the angular damping coefficient [default: 0].\n - *

Friction

- * Use Dali::DynamicsBodyConfig::SetFriction to specify the friction of the body [default: 0.5].\n - *

Collision Filtering

- * See \link dynamics-collisions Collision Detection and Filtering \endlink\n\n - * Use Dali::DynamicsBodyConfig::SetCollisionGroup to specify the collision filter group.\n - * Use Dali::DynamicsBodyConfig::SetCollisionMask to specify the collision filter mask.\n - *

Soft body specific options

- *

Stiffness

- * Use Dali::DynamicsBodyConfig::SetStiffness to specify the stiffness of the links between the mesh vertices used to - * define the soft body. Values clamped between 0 and 1 [default: 1].\n - *

Anchor hardness

- * Use Dali::DynamicsBodyConfig::SetAnchorHardness to specify the hardness or drift correction applied to anchors. - * Values clamped between 0 and 1 [default: 0.7]. Smaller values mean less drift correction.\n - *

Conservation

- * Use Dali::DynamicsBodyConfig::SetShapeConservation to specify the shape conservation coefficient, - * or the magnitude of the force which will attempt to maintain the soft bodies shape (see \ref Dali::DynamicsBody::ConserveShape).\n - * Use Dali::DynamicsBodyConfig::SetVolumeConservation to specify the volume conservation coefficient, - * or the magnitude of the force which will attempt to maintain the soft bodies volume (see \ref Dali::DynamicsBody::ConserveVolume). - * Smaller values mean less conservation.\n - *

Create a rigid body with advanced options

- * \code - * Dali::DynamicsBodyConfig bodyConfig( Dali::DynamicsBodyConfig::New() ); - * // increase mass from the default - * bodyConfig.SetMass( 2.5f ); - * // set elasticity so that the velocity of the object will be halved after a collision - * // (assuming the other body has a mass = 1 and a velocity 0f 0). - * bodyConfig.SetElasticity( 0.5f ); - * // increase the rate at which a bodies linear velocity will decrease - * bodyConfig.SetLinearDamping( 0.5f ); - * // reduce the friction to zero - * bodyConfig.SetFriction( 0.0f ); - * // Ignore all collisions - * bodyConfig.SetCollisionGroup( 0 ); - * bodyConfig.SetCollisionMask( 0 ); - * - * // create an actor for the Dali::DynamicsBody - * Actor actor( Actor::New() ); - * actor.SetParentOrigin( Dali::ParentOrigin::CENTER ); - * // create the Dali::DynamicsBody - * actor.EnableDynamics( bodyConfig ); - * - * // add to the simulation - * dynamicsRootActor.Add( actor ); - * \endcode - *

Create a soft body with advanced options

- * \code - * // Create a unit mesh with 25 vertices - * Dali::Mesh mesh( Dali::Mesh::NewPlane(1.0f, 1.0f, 5, 5) ); - * - * Dali::DynamicsBodyConfig bodyConfig( Dali::DynamicsBodyConfig::New() ); - * // select a soft body - * bodyConfig.SetType( Dali::DynamicsBodyConfig::SOFT ); - * // set the mesh as the soft body shape - * bodyConfig.SetShape( Dali::DynamicsShape::NewMesh( mesh ) ); - * // decrease the stiffness of the links between the soft body vertices - * bodyConfig.SetStiffness( 0.25f ); - * // Make anchors very loose/weak - * bodyConfig.SetAnchorHardness( 0.1f ); - * - * // create an actor for the Dali::DynamicsBody - * Actor actor( MeshActor::New(mesh) ); - * actor.SetParentOrigin( Dali::ParentOrigin::CENTER ); - * // create the Dali::DynamicsBody - * actor.EnableDynamics( bodyConfig ); - * - * // add to the simulation - * dynamicsRootActor.Add( actor ); - * \endcode - * \image html dynamics/dynamics-soft.png "A soft body (with debug rendering enabled)" - * \section kinematic-body Kinematic bodies - * A kinematic body is not controlled by the simulation, there is a one-way interaction with other dynamic objects - * under control of the simulation, where other objects will be pushed away, but the kinematic object will be unaffected.\n - * Kinematic objects can be animated with DALi's \ref animation-example "animation system", each DALi update the simulation will - * get the current position of associated DALi actor.\n Use Dali::DynamicsBody::SetKinematic to make a kinematic object. - *

Animating a kinematic object

- * Other dynamics enabled actors that collide with the kinematic object during the animation will be pushed - * away. - * \code - * ... - * // create an actor to represent a rigid body - * Dali::Actor actor( Dali::Actor::New() ); - * dynamicsRootActor.Add( actor ); - * // Enable dynamics for the actor, creating a rigid body with default configuration - * actor.EnableDynamics( Dali::DynamicsBodyConfig::New() ); - * // get the DynamicsBody handle - * DynamicsBody body( actor.GetDynamicsBody() ); - * body.SetKinematic( true ); - * // create a second animation to move the actor 100 units to the right - * Animation animation( Animation::New( 1 ) ); - * animation.AnimateBy( Property( actor, Actor::Property::POSITION ), Vector3( 100, 0, 0 ), AlphaFunction::LINEAR ); - * animation.Play(); - * \endcode - *
- *

See also - *

    - *
  • Dali::DynamicsBodyConfig
  • - *
  • Dali::Actor::EnableDynamics
  • - *
  • \link dynamics-initialization DynamicsWorld Initialization and Usage\endlink
  • - *
- *

- */ - diff --git a/docs/content/programming-guide/dynamics-collisions.h b/docs/content/programming-guide/dynamics-collisions.h deleted file mode 100644 index 3dc6d14..0000000 --- a/docs/content/programming-guide/dynamics-collisions.h +++ /dev/null @@ -1,133 +0,0 @@ -/** - * \page dynamics-collisions Collisions - * \section collision-detection Collision Detection - *

- * Collision detection is automatic and occurs between all Dali::DynamicsBody objects in the simulation.@n - * To respond to a detected collisions, the application developer can connect to a signal provided by - * a Dali::DynamicsWorld object. - * \code - * ... - * - * // DynamicsWorld initialization code - * - * ... - * - * // Connect a signal handler to the signal - * Dali::DynamicsWorld theWorld( Stage::GetCurrent().GetDynamicsWorld() ); - * theWorld.SignalCollision().Connect( this, &myClass::OnDynamicsCollision ); - * - * ... - * - * // Implement a signal handler - * void myClass::OnDynamicsCollision( Dali::DynamicsWorld world, Dali::DynamicsCollision collisionData ) - * { - * std::cout << "Collision between " - * << collisionData.GetActorA().GetName() << " and " - * << collisionData.GetActorB().GetName() << " "; - * - * if( collisionData.GetImpactForce() != 0.0f ) - * { - * std::cout << "detected (impact force: " << collisionData.GetImpactForce() << " )"; - * } - * else - * { - * std::cout << "ended"; - * } - * std::cout << std::endl; - * } - * \endcode - * - *


- * \section collision-filtering Collision Filtering - * - *

- * When a large number of Dali::DynamicsBody objects are added to the simulation, collision detection can become a - * significant performance drain, where every possible pairing of objects needs to be checked for collisions.

- *

You can significantly reduce the number of pairs considered for collision detection by using a collision filter.

- *

Each Dali::DynamicsBody can belong to a user defined collision filter group and have a user defined collision filter mask.

- *

A Dali::DynamicsBody pair are considered for collision detection if one or more bits in the filter group from each Dali::DynamicsBody - * matches one or more bits in the filter mask of the other Dali::DynamicsBody. - *

- *
- * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
Truth table
 P  Q tested for collision?
0 - * 0 - * no - *
0 - * 1 - * no - *
1 - * 0 - * no - *
1 - * 1 - * yes - *
- *

- * where P = bitwise AND of the collision group from the first Dali::DynamicsBody and the collision mask from the second Dali::DynamicsBody\n - * and Q = bitwise AND of the collision group from the second Dali::DynamicsBody and the collision mask from the first Dali::DynamicsBody. - *


- *

- * Pseudo code for the filter check. - * \code - * const bool canCollide( ( firstBody->GetCollisionGroup() & secondBody->GetCollisionMask() && - * ( secondBody->GetCollisionGroup() & firstBody->GetCollisionMask() ); - * \endcode - *

- *

Code example - Illustrating how to create multiple filter groups and masks.

- * \code - * // Define some collision groups - * const short int group0( 1 << 1 ); - * const short int group1( 1 << 2 ); - * const short int group2( 1 << 3 ); - * - * // Create some Dali::DynamicsBodyConfig objects - * Dali::DynamicsBodyConfig bodyConfig0( Dali::DynamicsBodyConfig::New() ); - * Dali::DynamicsBodyConfig bodyConfig1( Dali::DynamicsBodyConfig::New() ); - * Dali::DynamicsBodyConfig bodyConfig2( Dali::DynamicsBodyConfig::New() ); - * - * // Assign the collision filters to the configurations - * bodyConfig0->SetCollisionGroup(group0); - * bodyConfig0->SetCollisionMask( group1 | group2 ); - * bodyConfig1->SetCollisionGroup(group1); - * bodyConfig1->SetCollisionMask(group0); - * bodyConfig2->SetCollisionGroup(group2); - * bodyConfig2->SetCollisionMask(group0 | group2); - * \endcode - *

- * Collision detection is \b enabled between Dali::DynamicsBody pairs of... - *

    - *
  • group0 and group1 objects.
  • - *
  • group0 and group2 objects.
  • - *
  • group2 objects.
  • - *
- * Collision detection is \b disabled between Dali::DynamicsBody pairs of... - *
    - *
  • group0 objects.
  • - *
  • group1 objects.
  • - *
  • group1 and group2 objects.
  • - *
- *

- * - * See - *
    - *
  • Dali::DynamicsWorld::SignalCollision
  • - *
  • Dali::DynamicsCollision
  • - *
  • \ref Dali::DynamicsBodyConfig::SetCollisionGroup - to set the collision group
  • - *
  • \ref Dali::DynamicsBodyConfig::SetCollisionMask - to set the collision mask
  • - *
- */ - diff --git a/docs/content/programming-guide/dynamics-initialization.h b/docs/content/programming-guide/dynamics-initialization.h deleted file mode 100644 index 638bd31..0000000 --- a/docs/content/programming-guide/dynamics-initialization.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * \page dynamics-initialization Initializing the Simulation - * \section dynamics-prerequisites Dynamics prerequisites - *

- * In order to reduce binary size on devices, by default Dali core is built without Dynamics support. \n - * This can be enabled by adding the --enable-debug option to configure. The configure command should output this: \n - * \code - * Configuration - * ------------- - * Dynamics support: yes - * \endcode - *

In addition to rebuilding Dali, a physics plugin (e.g. bullet, havok) should be installed on the target device. - * Dali adaptor provides the bullet plugin e.g. install dali-adaptor-dali-bullet-plugin-X.armv7l.rpm. - * - * \section initializing-world Initializing the World - *

- * The simulation is encapsulated and controlled by a instance of a Dali::DynamicsWorld object.\n - * \code - * // DynamicsWorld initialisation code - * Dali::DynamicsWorldConfig worldConfig( Dali::DynamicsWorldConfig::New() ); - * Dali::Stage::GetCurrent().InitializeDynamics( worldConfig ); - * \endcode - *

If the DynamicsWorld handle empty, then a prerequisite is missing (see above). - * Use a Dali::DynamicsWorldConfig object to specify options for the type of simulation required.\n - * Dali::DynamicsWorldConfig::RIGID supports rigid body dynamics only, while Dali::DynamicsWorldConfig::SOFT supports - * both rigid and soft body dynamics. Rigid body dynamics uses less CPU than soft body dynamics and is simpler to set up. - * \code - * // DynamicsWorld initialisation code - * Dali::DynamicsWorldConfig worldConfig( Dali::DynamicsWorldConfig::New() ); - * // Choose a rigid body capable simulation - * worldConfig.SetType( Dali::DynamicsWorldConfig::RIGID ); - * // or a soft and rigid body simulation - * worldConfig.SetType( Dali::DynamicsWorldConfig::SOFT ); - * // Request Dali::Stage to create an instance of the DynamicsWorld - * Dali::Stage::GetCurrent().InitializeDynamics( worldConfig ); - * \endcode - * - * \section initializing-world-advanced Advanced Initialization - *

Units

- *

All distance units in the simulation are based on meters, so positioning an actor at (0, -500, -1000) - * will position it 0.5km in the air and 1km away from the camera.\n So if the actor was to fall under - * the control of gravity it will seem to fall in slow motion. To counteract this the simulation units can - * be modified using Dali::DynamicsWorldConfig::SetUnit. The default value is set to 0.01 to change the - * simulation units to centimeters. - *

- * \code - * // change simulation back to meters - * worldConfig.SetUnit(1.0f); - * // or change simulation unit to millimeters - * worldConfig.SetUnit(1.0f/1000.0f); - * \endcode - * - *

Simulation update ticks

- *

The application developer can set the number of simulation time steps / DALi update tick using - * Dali::DynamicsWorldConfig::SetSimulationSubSteps.\n - * Use this to advance the simulation in smaller time steps, thus gaining a more accurate - * simulation for collision detection.\n - * Using this API may adversely affect performance, as the dynamics simulation is performing many more - * calculations each DAli tick than normal.

- * \code - * // Assume DAli is updating at 60Hz (16.667ms / update) - * //Setting subSteps to 1 will update the simulation once per DALi update. - * worldConfig.SetSimulationSubSteps(1); - * //Setting subSteps to 4 will perform 4 simulation updates per DALi update each with a time step of Approx 4.2ms. - * worldConfig.SetSimulationSubSteps(1); - * \endcode - * \section manipulating-world Using the World - *

The Dynamics Simulation Root Actor

- *

To manipulate the world within the scene-graph it must be connected to a Dali::Actor.\n - * All Rigid or Soft bodies that will be simulated must each be connected to a Dali::Actor which is a - * direct child of the dynamics root actor.

- * \code - * // Create an actor to represent our view of the simulation - * Dali::Actor dynamicsRootActor( Dali::Actor::New() ); - * // retrieve a handle to the DynamicsWorld object initialized previously - * Dali::DynamicsWorld dynamicsWorld( Dali::Stage::GetCurrent().GetDynamicsWorld() ); - * // Connect the Dali::DynamicsWorld and the Dali::Actor - * dynamicsWorld.SetRootActor( dynamicsRootActor ); - * // Add root actor to Dali::Stage - * Dali::Stage::GetCurrent().Add( dynamicsRootActor ); - * \endcode - *

Gravity

- *

The gravity applicable to the entire simulation can be set through Dali::DynamicsWorld::SetGravity.\n - * The gravity will apply a constant force on all Dali::DynamicsBody objects added to the world which have a - * non zero mass and are not flagged as kinematic.

- * \code - * // Set gravity to apply a force on the negative Y axis - * dynamicsWorld.SetGravity( Vector3( 0.0f, -10.0f, 0.0f ) ); - * \endcode - *
- *

See also -*

See - *

    - *
  • Dali::DynamicsWorldConfig
  • - *
  • Dali::DynamicsWorld
  • - *
  • Dali::Stage::InitializeDynamics
  • - *
- *

- * - */ - diff --git a/docs/content/programming-guide/dynamics-intro.h b/docs/content/programming-guide/dynamics-intro.h deleted file mode 100644 index 3f444b1..0000000 --- a/docs/content/programming-guide/dynamics-intro.h +++ /dev/null @@ -1,21 +0,0 @@ -/*! \page dynamics-intro Dynamics - Introduction - * - * Dynamics gives the application developer a means to simulate physical kinetic properties on solid shapes. - * Simple physical shapes can be associated with a given actor, e.g., an actor representing a ball would have - * a spherical shape. Other simple shapes include cube, cone, cylinder and capsule (a pill or lozenge shape). - * \image html dynamics/dynamics-shapes.png "Simple Shapes" - * The application developer can provide more complex shapes using arbitrary meshes, however, this will use more - * CPU than the simple shapes.\n\n - * Dali supports both rigid body and soft body simulations. - *
    - *
  • Rigid body simulation means that the shapes used in the simulation cannot deform. This is simpler, and requires - * less processing power.
  • - *
  • Soft body simulation allows the shapes used in the simulation to deform, e.g. a rubber ball will squash and change - * shape when it hits a wall; or a cloth flag will flutter, etc.
  • - *
- * Both forms of simulation provide automatic collision detection, and can be detected on all bodies in the simulation. - * The application developer can use signals to listen for detected collisions. - * - * \image html dynamics/dynamics-rigid.png "Example application" - */ - diff --git a/docs/content/programming-guide/dynamics-joints.h b/docs/content/programming-guide/dynamics-joints.h deleted file mode 100644 index 3cf8d2e..0000000 --- a/docs/content/programming-guide/dynamics-joints.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * \page dynamics-joints Joints - * A Dali::DynamicsJoint represents a connection (or link) between a Dali::DynamicsBody pair. - * A Joint can optionally allow \ref linear "linear motion" and/or \ref angular "angular rotation" around its origin on one or more axis, and - * can have a \ref motors "motor" or \ref springs "spring" enabled on those axis. - * \image html dynamics/dynamics-joint2.png - * \section create-joint Creating a joint - *

Each Dali::DynamicsJoint is created by a Dali::Actor through its Dali::Actor::AddDynamicsJoint method.\n - * This method takes two parameters\n - * 1. The other Dali::Actor in the joint relationship.\n - * 2. A Dali::Vector3 relative offset from the owning Dali::Actor's current position.\n - * A joint is active in the simulation when both of the actors are connected to the Stage via the Dali::Actor - * set with Dali::DynamicsWorld::SetRootActorDynamics. - *

- *

A code example creating two actors connected by a joint

- * \code - * // create an actor to represent a rigid body - * Dali::Actor actor1( Dali::Actor::New() ); - * // Enable dynamics for the actor, creating a rigid body with default configuration - * actor1.EnableDynamics( Dali::DynamicsBodyConfig::New() ); - * actor1.SetPosition( Vector3( 0, 0, 0 ) ); - * // create an actor to represent a second rigid body - * Dali::Actor actor2( Dali::Actor::New() ); - * actor1.SetPosition( Vector3( 100, 0, 0 ) ); - * // Enable dynamics for the actor, creating a rigid body with default configuration - * actor2.EnableDynamics( Dali::DynamicsBodyConfig::New() ); - * // create the joint - * Vector3 relativeOffset( 25, 0, 0 ); - * actor1.AddDynamicsJoint( actor2, relativeOffset ); - * \endcode - * The joint is 25 units to the right of actor1 and 75 units to the left of actor2. If - * either actor is moved the joint will follow pulling the other actor with it. - * \section linear Linear Limits - * \image html dynamics/dynamics-joint.png "A joint allowing linear motion on the Y Axis" - * Limits control how much translation is allowed relative to the joints origin point, use Dali::DynamicsJoint::SetLinearLimit - * to set linear limits. - * \code - * ... - * actor1.AddDynamicsJoint( actor2, Vector3(0, 0, 0) ); - * DynamicsJoint joint( actor1.GetDynamicsJoint(actor2) ); - * - * // Allow translation from the joint's origin along the X axis of +/- 50 units - * joint.SetLinearLimit( Dali::DynamicsJoint::LINEAR_X, -50, 50); - * \endcode - * \section angular Angular Limits - * Limits control how much rotation is allowed around the joint's origin point, use Dali::DynamicsJoint::SetAngularLimit - * to set angular limits. - * \code - * ... - * actor1.AddDynamicsJoint( actor2, Vector3(0, 0, 0) ); - * DynamicsJoint joint( actor1.GetDynamicsJoint(actor2) ); - * - * // Allow rotation around the joint's origin on the Z axis of - 45 degrees and +90 degrees - * joint.SetAngularLimit( Dali::DynamicsJoint::ANGULAR_Z, -Dali::Degree(45), Dali::Degree(90) ); - * \endcode - * \section motors Motors - * Motors apply a force along a given axis towards the lower or upper limit set on that axis.\n - * Use Dali::DynamicsJoint::EnableMotor to enable/disable a motor.\n - * The torque of the motor can be set with Dali::DynamicsJoint::SetMotorForce and the velocity - * with Dali::DynamicsJoint::SetMotorVelocity. - * \code - * ... - * actor1.AddDynamicsJoint( actor2, Vector3(0, 0, 0) ); - * DynamicsJoint joint( actor1.GetDynamicsJoint(actor2) ); - * - * // allow angular rotation on the Z axis - * joint.SetAngularLimit(Dali::DynamicsJoint::ANGULAR_Z, -Dali::Degree(90), Dali::Degree(90)); - * // enable the Z axis angular motor - * joint.EnableMotor(Dali::DynamicsJoint::ANGULAR_Z, true); - * // set the motor torque - * joint.SetMotorForce(Dali::DynamicsJoint::ANGULAR_Z, 0.5f); - * // set the motor velocity (acts towards lower limit) - * joint.SetMotorVelocity(Dali::DynamicsJoint::ANGULAR_Z, -10.0f); - * \endcode - * \section springs Springs - * Springs apply a force to keep the Dali::DynamicsJoint origin at the spring's center point. - * A spring can be enabled for a given axis using Dali::DynamicsJoint::EnableSpring.\n - * The center point is set as a ratio between the lower and upper limits on the given axis using - * Dali::DynamicsJoint::SetSpringCenterPoint.\n - * The magnitude of the spring's centering force can be set with Dali::DynamicsJoint::SetSpringStiffness.\n - * Dali::DynamicsJoint::SetSpringDamping can be used to limit the amount of overshoot and oscillations - * of the spring as it settles at its center point. - * \code - * ... - * actor1.AddDynamicsJoint( actor2, Vector3(0, 0, 0) ); - * DynamicsJoint joint( actor1.GetDynamicsJoint(actor2) ); - * - * // allow linear motion on Y axis - * joint.SetLinearLimit(Dali::DynamicsJoint::LINEAR_Y, -50, 50); - * // enable the Y axis linear spring - * joint.EnableSpring(Dali::DynamicsJoint::LINEAR_Y, true); - * // set the center point of the spring at -40 ( 10% of the limits set ) - * joint.SetSpringCenterPoint(Dali::DynamicsJoint::LINEAR_Y, 0.1f); - * // set the springs stiffness or centering force - * joint.SetSpringStiffness(Dali::DynamicsJoint::LINEAR_Y, 40.0f); - * // allow more oscillations before the spring comes to reset - * joint.SetSpringDamping(Dali::DynamicsJoint::LINEAR_Y, 0.1f); - * \endcode - *
- *

See also - *

    - *
  • Dali::DynamicsJoint
  • - *
  • Dali::Actor::AddDynamicsJoint
  • - *
  • Dali::Actor::GetDynamicsJoint
  • - *
- *

- */ - diff --git a/docs/content/programming-guide/image-mesh-actor.h b/docs/content/programming-guide/image-actor.h similarity index 73% rename from docs/content/programming-guide/image-mesh-actor.h rename to docs/content/programming-guide/image-actor.h index c579101..437e5a8 100644 --- a/docs/content/programming-guide/image-mesh-actor.h +++ b/docs/content/programming-guide/image-actor.h @@ -1,12 +1,11 @@ -/*! \page image-mesh-actor Image and Mesh actors +/*! \page image-actor Image Actors * * *

Overview

- * The Dali::ImageActor & Dali::MeshActor are inherited from Dali::Actor and provide means to display resources like Images and Geometries (Triangle meshes) on the stage. + * The Dali::ImageActor inherits from Dali::Actor and provide means to display resources like Images on the stage. * All the Dali::Actor methods can be called on them.
* * - ImageActor: An actor for displaying Images. It allows the developer to display a Dali::Image object on the stage.
- * - MeshActor: An actor for displaying one or more mesh geometries. It may have children, which may be plain actors or other mesh actors.
* *

Image Actor

* @@ -93,41 +92,5 @@ * myImageActor.SetImage( newImage ); * @endcode * - *

Fade in

- * It's possible to fade in the image gradually when first rendered. - * @code - * if (!myImageActor.GetFadeIn()) - * { - * myImageActor.SetFadeIn(true); - * } - * - * // default : 1 Second - * myImageActor.SetFadeInDuration(seconds); - * @endcode - * - * - *

Mesh Actor

- * - *

Construction

- * The mesh actor is created by passing a reference to Dali::Mesh object - * - * @code - * Dali::Mesh mesh = Dali::Mesh::New(); - * Dali::MeshActor myMeshActor = Dali::MeshActor::New(mesh); - * @endcode - - * - *

Modifying material

- * The developer can change the material of mesh actor using the material entity name. - * - * @code - * Dali::Image image = Dali::Image::New(myTextureFile); - * myCustomMaterial = Dali::Material::New("CustomMaterial"); - * myCustomMaterial.SetDiffuseTexture(image); - * Dali::MeshActor::SetMaterial(myMeshActor, materialEntityNameInModel, 0, myCustomMaterial); - * - * @endcode - * - * */ diff --git a/docs/content/shared-javascript-and-cpp-documentation/dali-introduction.md b/docs/content/shared-javascript-and-cpp-documentation/dali-introduction.md new file mode 100644 index 0000000..50262f9 --- /dev/null +++ b/docs/content/shared-javascript-and-cpp-documentation/dali-introduction.md @@ -0,0 +1,30 @@ +/** + * +# DALi 3D ( Dynamic Animation Library ) {#dali-introduction} + +DALi is a quick and easy way of allowing developers to create Rich UI Applications like: + + + Image & Video galleries + + Music players + + Games + + Maps + + Homescreens / launch pads + + Advanced watch faces for wearable devices + +DALi is based on OpenGL ES 2.0 & 3.0, however it hides the complexity of +the OpenGL API from developers and provides a clean cross-platform C++ & JavaScript framework. + +## Features {#dali-features} + + + Create Images & Text + + Create shaders using GLSL + + Provide multiple cameras and render targets + + Provides Layers to aid in 2D UI layout + + Easy to use Animation framework + + Automatic background loading of resources ( images / text / meshes ) + + Runs all animations in a seperate thread. This helps maintain 60 FPS even if JavaScript is performing a long operation ( e.g. Garbage Collection ). + + Provides keyboard / touch / mouse handling + +![ ](screen-shot.png) + +*/ diff --git a/docs/content/shared-javascript-and-cpp-documentation/fundamentals.md b/docs/content/shared-javascript-and-cpp-documentation/fundamentals.md index 115001b..8a243cc 100644 --- a/docs/content/shared-javascript-and-cpp-documentation/fundamentals.md +++ b/docs/content/shared-javascript-and-cpp-documentation/fundamentals.md @@ -2,7 +2,7 @@ * # Dali Fundamentals {#fundamentals} -## Actors and the Stage +## Actors and the Stage {#actors-and-stage} A Dali application uses a hierachy of Dali::Actor objects to position visible content. An actor inherits a position relative to its parent, and can be moved relative to this point. UI controls can be built by combining multiple actors. @@ -20,7 +20,7 @@ var actor = new dali.Actor(); dali.stage.add( actor ); ~~~ -## The Coordinate System +## The Coordinate System {#coordinate-system} The Stage has a 2D size, which matches the size of the application window. The default coordinate system in Dali has the origin at the top-left corner, with positive X to right, and position Y going downwards. This is intended to be convenient when laying-out 2D views. @@ -28,7 +28,7 @@ downwards. This is intended to be convenient when laying-out 2D views. ![ ](../assets/img/coordinate-system-and-stage.png) ![ ](coordinate-system-and-stage.png) -## Positioning Actors +## Positioning Actors {#positioning-actors} An actor inherits its parent's position. The relative position between the actor & parent is determined by 3 properties: 1) ParentOrigin. This Vector3 property defines a point within the parent actor's area. diff --git a/docs/content/shared-javascript-and-cpp-documentation/high-level-design.md b/docs/content/shared-javascript-and-cpp-documentation/high-level-design.md new file mode 100644 index 0000000..81f4877 --- /dev/null +++ b/docs/content/shared-javascript-and-cpp-documentation/high-level-design.md @@ -0,0 +1,26 @@ +/** + * + +# High Level Design {#dali-hld} + +## Components {#dali-components} + + + **DALi Core:** Event handling, Scene Graph, Rendering, Resource Management + + **DALi Adaptor:** Threading Model, Integration with the main loop. + + **DALi Platform Abstraction:** Resource loading & decoding in multiple threads (part of dali-adaptor) + + **DALi Toolkit:** Reusable UI Controls, Effects & Scripting Support + +![ ](architecture.png) + +## Main, Update & Render Threads {#dali-threads} + +DALi uses a multithreaded architecture in order to provide the best performance and scalability. + + + **Event Thread:** The main thread in which application code and event handling runs. + + **Update Thread:** Updates the nodes on the scene as well as running animations & constraints + + **Render Thread:** OpenGL drawing, texture and geometry uploading etc. + + **Resource Threads:** Loads images and decodes into bitmaps etc. + +![ ](dali-threads.png) + +*/ diff --git a/docs/content/shared-javascript-and-cpp-documentation/programming-languages.md b/docs/content/shared-javascript-and-cpp-documentation/programming-languages.md new file mode 100644 index 0000000..545d6c2 --- /dev/null +++ b/docs/content/shared-javascript-and-cpp-documentation/programming-languages.md @@ -0,0 +1,83 @@ +/** + * +# Programming Languages {#programming-languages} + +DALi applications can be written in several different programming languages. + +## C++ {#c-plus-plus} + +~~~{.cpp} +Dali::Actor actor = Dali::Actor::New(); +actor.SetParentOrigin( Dali::ParentOrigin::CENTER ); +actor.SetAnchorPoint( Dali::AnchorPoint::CENTER ); +Dali::Stage::GetCurrent().Add( actor ); +... +bool OnPressed( Dali::Actor, const TouchEvent& event ) +{ + Dali::Animation anim = Dali::Animation::New( 1.5f ); + anim.AnimateTo( Property( actor, Actor::Property::POSITION ), Vector3( 200,-100,0), AlphaFunctions::Bounce ); + anim.play(); + return true; // consume the touch event +} +... +actor.TouchedSignal().Connect( &OnPressed ); +~~~ + +*/ + +## JavaScript {#java-script-support} + +~~~{.js} +var actor = new dali.Actor(); +actor.parentOrigin = dali.CENTER; +actor.anchorPoint = dali.CENTER; +dali.stage.add( actor ); +... +function onPressed( actor, touchEvent ) +{ + var animOptions = { alpha: "bounce", delay: 0, duration: 15 }; + var anim = new dali.Animation(); + anim.animateTo( actor, "position", [ 200,-100,0], animOptions ); + anim.play(); + return true; // consume the touch event +} +... +actor.connect( "touched", onPressed ); + +~~~ + +## JSON {#json-support} + +~~~{.json} +{ + "animations": + { + "move": + { + "duration": 1.5, + "properties": + [ + { + "actor":"image", + "property":"position", + "value":[200,-100,0], + "alpha-function": "BOUNCE" + } + ] + } + }, + "stage": + [ + { + "name":"image", + "type":"Actor", + "anchor-point": "CENTER", + "parent-origin": "CENTER", + "signals" : + [ + { "name" : "touched", "action": "play", "animation": "move" } + ] + } + ] +} +~~~ \ No newline at end of file -- 2.7.4