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 DALI_SCRIPT_EXCEPTION( isolate, "Target property not found" );
125 DALI_SCRIPT_EXCEPTION( isolate, "Target property not specified" );
129 //Get source property
130 member = obj->Get( v8::String::NewFromUtf8( isolate, "sourceProperty" ) );
131 if( member->IsString() )
133 std::string propertyName = V8Utils::v8StringToStdString( member );
134 sourcePropertyIndex = targetActor.GetPropertyIndex( propertyName );
135 if( sourcePropertyIndex == Property::INVALID_INDEX )
137 DALI_SCRIPT_EXCEPTION( isolate, "Source property not found" );
143 DALI_SCRIPT_EXCEPTION( isolate, "Source property not specified" );
148 member = obj->Get( v8::String::NewFromUtf8( isolate, "range" ) );
149 if( member->IsObject() )
151 v8::Local<v8::Object> rangeObject = member->ToObject();
152 Property::Value value = V8Utils::GetPropertyValueFromObject( found, isolate, rangeObject );
157 DALI_SCRIPT_EXCEPTION( isolate, "Range not specified" );
162 member = obj->Get( v8::String::NewFromUtf8( isolate, "wrap" ) );
163 if( member->IsObject() )
165 v8::Local<v8::Object> wrapObject = member->ToObject();
166 Property::Value value = V8Utils::GetPropertyValueFromObject( found, isolate, wrapObject );
171 wrap = Vector2(-FLT_MAX, FLT_MAX);
178 DALI_SCRIPT_EXCEPTION( isolate, "Bad parameter (Object)" );
183 } // un-named namespace
186 * Apply the constraint
187 * @method applyConstraint
188 * @for PathConstrainer and LinearConstrainer
189 * @param {Object} Constraint
190 * @param {Object} Constraint.targetActor
191 * @param {String} Constraint.targetProperty
192 * @param {String} Constraint.sourceProperty
193 * @param {Vector2} Constraint.range
194 * @param {Vector2} Constraint.wrap
198 * var constraintPosition = { "target":targetActor,
199 * "targetProperty":"position",
200 * "source":sourceActor,
201 * "sourceProperty":"colorAlpha",
205 * pathConstrainer.applyConstraint( constraintPosition );
207 void ConstrainerApi::Apply( const v8::FunctionCallbackInfo< v8::Value >& args )
209 v8::Isolate* isolate = args.GetIsolate();
210 v8::HandleScope handleScope( isolate );
212 Actor target, source;
213 Property::Index targetPropertyIndex = Property::INVALID_INDEX;
214 Property::Index sourcePropertyIndex = Property::INVALID_INDEX;
217 if( GetApplyParameters(args, target, targetPropertyIndex, source, sourcePropertyIndex, range, wrap ) )
220 PathConstrainer pathConstrainer = GetPathConstrainer( isolate, args );
221 if( pathConstrainer )
223 pathConstrainer.Apply( Property(target, targetPropertyIndex),
224 Property(source, sourcePropertyIndex),
229 LinearConstrainer linearConstrainer = GetLinearConstrainer( isolate, args );
230 if( linearConstrainer )
232 linearConstrainer.Apply( Property(target, targetPropertyIndex),
233 Property(source, sourcePropertyIndex),
241 * Remove the constraint
243 * @for PathConstrainer
244 * @param {Object} Actor
246 * pathConstrainer.remove( targetActor );
248 void ConstrainerApi::Remove( const v8::FunctionCallbackInfo< v8::Value >& args )
250 v8::Isolate* isolate = args.GetIsolate();
251 v8::HandleScope handleScope( isolate );
255 Actor targetActor = V8Utils::GetActorParameter( PARAMETER_0, found, isolate, args );
258 DALI_SCRIPT_EXCEPTION( isolate, "bad parameter 0 (Actor)" );
263 PathConstrainer pathConstrainer = GetPathConstrainer( isolate, args );
264 if( pathConstrainer )
266 pathConstrainer.Remove(targetActor);
270 LinearConstrainer linearConstrainer = GetLinearConstrainer( isolate, args );
271 if( linearConstrainer )
273 linearConstrainer.Remove(targetActor);
278 } // namespace V8Plugin