void RecorderDlg::InsertKey(int index, double duration, int interpolation) { VRenderFrame* vr_frame = (VRenderFrame*)m_frame; if (!vr_frame) return; if (!m_view) { if (vr_frame && vr_frame->GetView(0)) m_view = vr_frame->GetView(0); else return; } DataManager* mgr = vr_frame->GetDataManager(); if (!mgr) return; Interpolator *interpolator = vr_frame->GetInterpolator(); if (!interpolator) return; KeyCode keycode; FlKeyDouble* flkey = 0; FlKeyQuaternion* flkeyQ = 0; FlKeyBoolean* flkeyB = 0; FlKeyInt* flkeyI = 0; double t = interpolator->GetLastT(); t = t<0.0?0.0:t+duration; interpolator->Begin(t); //for all volumes for (int i=0; i<mgr->GetVolumeNum() ; i++) { VolumeData* vd = mgr->GetVolumeData(i); keycode.l0 = 1; keycode.l0_name = m_view->GetName(); keycode.l1 = 2; keycode.l1_name = vd->GetName(); //display keycode.l2 = 0; keycode.l2_name = "display"; flkeyB = new FlKeyBoolean(keycode, vd->GetDisp()); interpolator->AddKey(flkeyB); //clipping planes vector<Plane*> * planes = vd->GetVR()->get_planes(); if (!planes) continue; if (planes->size() != 6) continue; Plane* plane = 0; double abcd[4]; //x1 plane = (*planes)[0]; plane->get_copy(abcd); keycode.l2 = 0; keycode.l2_name = "x1_val"; flkey = new FlKeyDouble(keycode, abs(abcd[3])); interpolator->AddKey(flkey); //x2 plane = (*planes)[1]; plane->get_copy(abcd); keycode.l2 = 0; keycode.l2_name = "x2_val"; flkey = new FlKeyDouble(keycode, abs(abcd[3])); interpolator->AddKey(flkey); //y1 plane = (*planes)[2]; plane->get_copy(abcd); keycode.l2 = 0; keycode.l2_name = "y1_val"; flkey = new FlKeyDouble(keycode, abs(abcd[3])); interpolator->AddKey(flkey); //y2 plane = (*planes)[3]; plane->get_copy(abcd); keycode.l2 = 0; keycode.l2_name = "y2_val"; flkey = new FlKeyDouble(keycode, abs(abcd[3])); interpolator->AddKey(flkey); //z1 plane = (*planes)[4]; plane->get_copy(abcd); keycode.l2 = 0; keycode.l2_name = "z1_val"; flkey = new FlKeyDouble(keycode, abs(abcd[3])); interpolator->AddKey(flkey); //z2 plane = (*planes)[5]; plane->get_copy(abcd); keycode.l2 = 0; keycode.l2_name = "z2_val"; flkey = new FlKeyDouble(keycode, abs(abcd[3])); interpolator->AddKey(flkey); } //for the view keycode.l0 = 1; keycode.l0_name = m_view->GetName(); keycode.l1 = 1; keycode.l1_name = m_view->GetName(); //rotation keycode.l2 = 0; keycode.l2_name = "rotation"; double rotx, roty, rotz; m_view->GetRotations(rotx, roty, rotz); Quaternion q; q.FromEuler(rotx, roty, rotz); flkeyQ = new FlKeyQuaternion(keycode, q); interpolator->AddKey(flkeyQ); //translation double tx, ty, tz; m_view->GetTranslations(tx, ty, tz); //x keycode.l2_name = "translation_x"; flkey = new FlKeyDouble(keycode, tx); interpolator->AddKey(flkey); //y keycode.l2_name = "translation_y"; flkey = new FlKeyDouble(keycode, ty); interpolator->AddKey(flkey); //z keycode.l2_name = "translation_z"; flkey = new FlKeyDouble(keycode, tz); interpolator->AddKey(flkey); //centers m_view->GetCenters(tx, ty, tz); //x keycode.l2_name = "center_x"; flkey = new FlKeyDouble(keycode, tx); interpolator->AddKey(flkey); //y keycode.l2_name = "center_y"; flkey = new FlKeyDouble(keycode, ty); interpolator->AddKey(flkey); //z keycode.l2_name = "center_z"; flkey = new FlKeyDouble(keycode, tz); interpolator->AddKey(flkey); //obj traslation m_view->GetObjTrans(tx, ty, tz); //x keycode.l2_name = "obj_trans_x"; flkey = new FlKeyDouble(keycode, tx); interpolator->AddKey(flkey); //y keycode.l2_name = "obj_trans_y"; flkey = new FlKeyDouble(keycode, ty); interpolator->AddKey(flkey); //z keycode.l2_name = "obj_trans_z"; flkey = new FlKeyDouble(keycode, tz); interpolator->AddKey(flkey); //scale double scale = m_view->m_glview->m_scale_factor; keycode.l2_name = "scale"; flkey = new FlKeyDouble(keycode, scale); interpolator->AddKey(flkey); //intermixing mode int ival = m_view->GetVolMethod(); keycode.l2_name = "volmethod"; flkeyI = new FlKeyInt(keycode, ival); interpolator->AddKey(flkeyI); interpolator->End(); FlKeyGroup* group = interpolator->GetKeyGroup(interpolator->GetLastIndex()); if (group) group->type = interpolation; //insert //if (index >= 0) // interpolator->MoveKeyBefore(interpolator->GetLastIndex(), index+1); }