//returning all data necessary to re-generate timer // uint32 contextId // double period // double timeUntil timer expires // bool isSuspended // bool isCleared // func cb v8::Handle<v8::Value> JSTimerStruct::struct_getAllData() { v8::HandleScope handle_scope; uint32 contId = jsContStruct->getContextID(); bool issusp = getIsSuspended(); bool isclear = getIsCleared(); double period = -1; double tUntil = -1; v8::Handle<v8::Function> cbFunc; if (! isclear) { cbFunc = cb; period = timeUntil.toSeconds(); if (issusp) tUntil = timeUntil.toSeconds(); else { Duration pt = mDeadlineTimer->expiresFromNow(); tUntil = pt.seconds(); } } v8::Handle<v8::Object> returner = v8::Object::New(); if (isclear) { returner->Set(v8::String::New("isCleared"),v8::Boolean::New(isclear)); returner->Set(v8::String::New("contextId"), v8::Integer::NewFromUnsigned(contId)); return handle_scope.Close(returner); } returner->Set(v8::String::New("period"), v8::Number::New(period)); returner->Set(v8::String::New("callback"),cbFunc); returner->Set(v8::String::New("timeRemaining"),v8::Number::New(tUntil)); returner->Set(v8::String::New("isSuspended"),v8::Boolean::New(issusp)); return handle_scope.Close(returner); }
void Camera::tick(const Time& t, const Duration& dt) { if (!haveGoal()) return; Vector3d goalPos = getGoalPosition(); Quaternion goalOrient = getGoalOrientation(); Vector3d pos; Quaternion orient; if (mMode == FirstPerson) { // In first person mode we are tied tightly to the position of // the object. pos = goalPos; orient = goalOrient; } else { // In third person mode, the target is offset so we'll be behind and // above ourselves and we need to interpolate to the target. // Offset the goal. BoundingSphere3f following_bounds = getGoalBounds(); goalPos += Vector3d(following_bounds.center()); // > 1 factor gets us beyond the top of the object goalPos += mOffset * (following_bounds.radius()); // Restore the current values from the scene node. pos = fromOgre(mSceneNode->getPosition(), mScene->getOffset()); orient = fromOgre(mSceneNode->getOrientation()); // And interpolate. Vector3d toGoal = goalPos-pos; double toGoalLen = toGoal.length(); if (toGoalLen < 1e-06) { pos = goalPos; orient = goalOrient; } else { double step = exp(-dt.seconds()*2.f); pos = goalPos - (toGoal/toGoalLen)*(toGoalLen*step); orient = (goalOrient*(1.f-step) + orient*step).normal(); } } mSceneNode->setPosition(toOgre(pos, mScene->getOffset())); mSceneNode->setOrientation(toOgre(orient)); }