2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "constrainer-api.h"
22 #include <cfloat> //For FLT_MAX
25 #include <animation/linear-constrainer-wrapper.h>
26 #include <animation/path-constrainer-wrapper.h>
27 #include <object/property-value-wrapper.h>
36 namespace // un named namespace
39 PathConstrainer GetPathConstrainer( v8::Isolate* isolate, const v8::FunctionCallbackInfo< v8::Value >& args )
41 v8::HandleScope handleScope( isolate );
43 v8::Local<v8::Object> object = args.This();
44 v8::Local<v8::External> field = v8::Local<v8::External>::Cast( object->GetInternalField( 0 ) );
45 void* ptr = field->Value();
47 PathConstrainerWrapper* wrapper = static_cast<PathConstrainerWrapper *>( ptr );
48 return wrapper->GetPathConstrainer();
51 LinearConstrainer GetLinearConstrainer( v8::Isolate* isolate, const v8::FunctionCallbackInfo< v8::Value >& args )
53 v8::HandleScope handleScope( isolate );
55 v8::Local<v8::Object> object = args.This();
56 v8::Local<v8::External> field = v8::Local<v8::External>::Cast( object->GetInternalField( 0 ) );
57 void* ptr = field->Value();
59 LinearConstrainerWrapper* wrapper = static_cast<LinearConstrainerWrapper *>( ptr );
60 return wrapper->GetLinearConstrainer();
63 bool GetApplyParameters( const v8::FunctionCallbackInfo< v8::Value >& args, Actor& targetActor, Property::Index& targetPropertyIndex,
64 Actor& sourceActor, Property::Index& sourcePropertyIndex, Vector2& range, Vector2& wrap )
66 v8::Isolate* isolate = args.GetIsolate();
67 v8::HandleScope handleScope( isolate );
69 if( args[0]->IsObject() )
73 v8::Local<v8::Object> obj = args[0]->ToObject();
74 v8::Local<v8::Value> member = obj->Get( v8::String::NewFromUtf8( isolate, "target" ) );
77 if( member->IsObject() )
79 v8::Local<v8::Object> targetActorObject = member->ToObject();
80 targetActor = V8Utils::GetActorFromObject( isolate, found, targetActorObject );
83 DALI_SCRIPT_EXCEPTION( isolate, "Target actor not found" );
89 DALI_SCRIPT_EXCEPTION( isolate, "Target actor not specified" );
94 member = obj->Get( v8::String::NewFromUtf8( isolate, "source" ) );
95 if( member->IsObject() )
97 v8::Local<v8::Object> sourceActorObject = member->ToObject();
98 sourceActor = V8Utils::GetActorFromObject( isolate, found, sourceActorObject );
101 DALI_SCRIPT_EXCEPTION( isolate, "Source actor not found" );
107 DALI_SCRIPT_EXCEPTION( isolate, "Source actor not specified" );
111 //Get target property
112 member = obj->Get( v8::String::NewFromUtf8( isolate, "targetProperty" ) );
113 if( member->IsString() )
115 std::string propertyName = V8Utils::v8StringToStdString( member );
116 targetPropertyIndex = targetActor.GetPropertyIndex( propertyName );
117 if( targetPropertyIndex == Property::INVALID_INDEX )
119 std::string convertedName = V8Utils::JavaScriptNameToPropertyName( propertyName );
120 targetPropertyIndex = targetActor.GetPropertyIndex( convertedName );
122 if( targetPropertyIndex == Property::INVALID_INDEX )
124 DALI_SCRIPT_EXCEPTION( isolate, "Target property not found" );
131 DALI_SCRIPT_EXCEPTION( isolate, "Target property not specified" );
135 //Get source property
136 member = obj->Get( v8::String::NewFromUtf8( isolate, "sourceProperty" ) );
137 if( member->IsString() )
139 std::string propertyName = V8Utils::v8StringToStdString( member );
140 sourcePropertyIndex = targetActor.GetPropertyIndex( propertyName );
141 if( sourcePropertyIndex == Property::INVALID_INDEX )
143 std::string convertedName = V8Utils::JavaScriptNameToPropertyName( propertyName );
144 sourcePropertyIndex = targetActor.GetPropertyIndex( convertedName );
146 if( sourcePropertyIndex == Property::INVALID_INDEX )
148 DALI_SCRIPT_EXCEPTION( isolate, "Source property not found" );
155 DALI_SCRIPT_EXCEPTION( isolate, "Source property not specified" );
160 member = obj->Get( v8::String::NewFromUtf8( isolate, "range" ) );
161 if( member->IsObject() )
163 v8::Local<v8::Object> rangeObject = member->ToObject();
164 Property::Value value = V8Utils::GetPropertyValueFromObject( found, isolate, rangeObject );
169 DALI_SCRIPT_EXCEPTION( isolate, "Range not specified" );
174 member = obj->Get( v8::String::NewFromUtf8( isolate, "wrap" ) );
175 if( member->IsObject() )
177 v8::Local<v8::Object> wrapObject = member->ToObject();
178 Property::Value value = V8Utils::GetPropertyValueFromObject( found, isolate, wrapObject );
183 wrap = Vector2(-FLT_MAX, FLT_MAX);
190 DALI_SCRIPT_EXCEPTION( isolate, "Bad parameter (Object)" );
195 } // un-named namespace
198 * Apply the constraint
199 * @method applyConstraint
200 * @for PathConstrainer and LinearConstrainer
201 * @param {Object} Constraint
202 * @param {Object} Constraint.targetActor
203 * @param {String} Constraint.targetProperty
204 * @param {String} Constraint.sourceProperty
205 * @param {Vector2} Constraint.range
206 * @param {Vector2} Constraint.wrap
210 * var constraintPosition = { "target":targetActor,
211 * "targetProperty":"position",
212 * "source":sourceActor,
213 * "sourceProperty":"color-alpha",
217 * pathConstrainer.applyConstraint( constraintPosition );
219 void ConstrainerApi::Apply( const v8::FunctionCallbackInfo< v8::Value >& args )
221 v8::Isolate* isolate = args.GetIsolate();
222 v8::HandleScope handleScope( isolate );
224 Actor target, source;
225 Property::Index targetPropertyIndex = Property::INVALID_INDEX;
226 Property::Index sourcePropertyIndex = Property::INVALID_INDEX;
229 if( GetApplyParameters(args, target, targetPropertyIndex, source, sourcePropertyIndex, range, wrap ) )
232 PathConstrainer pathConstrainer = GetPathConstrainer( isolate, args );
233 if( pathConstrainer )
235 pathConstrainer.Apply( Property(target, targetPropertyIndex),
236 Property(source, sourcePropertyIndex),
241 LinearConstrainer linearConstrainer = GetLinearConstrainer( isolate, args );
242 if( linearConstrainer )
244 linearConstrainer.Apply( Property(target, targetPropertyIndex),
245 Property(source, sourcePropertyIndex),
253 * Remove the constraint
255 * @for PathConstrainer
256 * @param {Object} Actor
258 * pathConstrainer.remove( targetActor );
260 void ConstrainerApi::Remove( const v8::FunctionCallbackInfo< v8::Value >& args )
262 v8::Isolate* isolate = args.GetIsolate();
263 v8::HandleScope handleScope( isolate );
267 Actor targetActor = V8Utils::GetActorParameter( PARAMETER_0, found, isolate, args );
270 DALI_SCRIPT_EXCEPTION( isolate, "bad parameter 0 (Actor)" );
275 PathConstrainer pathConstrainer = GetPathConstrainer( isolate, args );
276 if( pathConstrainer )
278 pathConstrainer.Remove(targetActor);
282 LinearConstrainer linearConstrainer = GetLinearConstrainer( isolate, args );
283 if( linearConstrainer )
285 linearConstrainer.Remove(targetActor);
290 } // namespace V8Plugin