bool ActorSceneCanvas::frameStarted(const Ogre::FrameEvent& evt) { if(GetDataManipulator()->mAnimParam->animState!=NULL&& GetDataManipulator()->mAnimParam->stateEnabled==true) { GetDataManipulator()->mAnimParam->animState->addTime(evt.timeSinceLastFrame); } //if(GetEditorUIMpt()) //{ // Fairy::WXModel* pMainModel = GetEditorUIMpt()->FindModel(GetEditorUIMpt()->m_CurEntFile); // if(NULL == pMainModel) // { // if(GetEditorUIMpt()->m_bAvataring) // { // pMainModel = GetEditorUIMpt()->m_AvatarModel; // } // } // if(pMainModel) // { // pMainModel->Execute(evt.timeSinceLastFrame); // } // Fairy::LogicModel* pLogicModel = Fairy::LogicModelManager::getSingleton().getModelByName(GetEditorUIMpt()->m_CurObjName); // if(pLogicModel) // { // pLogicModel->execute(evt.timeSinceLastFrame); // } //} //m_lLastTime = Ogre::Root::getSingleton().getTimer()->getMilliseconds(); return FrameListener::frameStarted(evt); }
void ActorSceneCanvas::_resetAxisMaterial() { if (mXax) { GetDataManipulator()->m_pMaterialX->setSelfIllumination(1,0,0); } else if (mYax) { GetDataManipulator()->m_pMaterialY->setSelfIllumination(0,1,0); } else if(mZax) { GetDataManipulator()->m_pMaterialZ->setSelfIllumination(0,0,1); } }
void AnimationSelector::OnBtn(wxCommandEvent & e) { if (e.GetId() == ID_BTN_PLAY) { if (!m_bPause) { return; } } else { if (m_bPause) { return; } } m_bPause = !m_bPause; m_btnPause->Enable(!m_bPause); m_btnPlay->Enable(m_bPause); Fairy::LogicModel* pObjModel = GetDataManipulator()->m_pObjTemplate; if ( pObjModel && !pObjModel->getCurrentAnimName().empty()) { pObjModel->setAnimEditing(m_bPause); } }
void AnimationSelector::OnAnimationListSelChanged(wxTreeEvent& e) { // reset the state resetState(); wxTreeItemId item = e.GetItem(); wxASSERT(item.IsOk()); wxTreeCtrl* tree = wxStaticCast(e.GetEventObject(), wxTreeCtrl); mActivedItem = e.GetItem(); wxArrayTreeItemIds selections; int nCount = tree->GetSelections(selections); if(nCount <= 0) return; if (mIsMeshAnim) { GetDataManipulator()->changeMeshAnimation(DoActiveItem(item)); return; } GetDataManipulator()->changeAnimation(DoActiveItem(item),0.0); Fairy::LogicModel* pObjModel = GetDataManipulator()->m_pObjTemplate; if ( pObjModel && !pObjModel->getCurrentAnimName().empty()) { m_btnPause->Enable(true); pObjModel->setAnimEditing(m_bPause); Ogre::String animationName = pObjModel->getCurrentAnimName(); bool bLoop = pObjModel->getAnimationLoop(); Ogre::Real timeTotal = pObjModel->getAnimationLength(animationName); m_endTimeText->SetValue(Ogre::StringConverter::toString(timeTotal)); m_endFrameText->SetValue(Ogre::StringConverter::toString(timeTotal*STATIC_FPS)); } }
void AnimationSelector::pauseAnimation(bool bPause) { if (!GetDataManipulator()) { return; } Fairy::LogicModel* pObjModel = GetDataManipulator()->m_pObjTemplate; if ( !pObjModel || pObjModel->getCurrentAnimName().empty()) { return; } if (!bPause) { if (!m_bPause) { return; } } else { if (m_bPause) { return; } } m_bPause = !m_bPause; m_btnPause->Enable(!m_bPause); m_btnPlay->Enable(m_bPause); if ( pObjModel && !pObjModel->getCurrentAnimName().empty()) { pObjModel->setAnimEditing(m_bPause); } }
void AnimationSelector::OnSliderUpdate(wxCommandEvent & e) { if (!m_bPause) { return; } int pos = m_slider->GetValue(); Fairy::LogicModel* pObjModel = GetDataManipulator()->m_pObjTemplate; if ( pObjModel && !pObjModel->getCurrentAnimName().empty()) { Ogre::Real timeTotal = pObjModel->getAnimationLength(pObjModel->getCurrentAnimName()); Ogre::Real posValue = ((Ogre::Real)pos)/m_slider->GetMax(); pObjModel->setAnimTimePos(posValue); m_curTimeText->SetValue(Ogre::StringConverter::toString(posValue*timeTotal)); m_curFrameText->SetValue(Ogre::StringConverter::toString(posValue*timeTotal*STATIC_FPS)); } }
void ActorSceneCanvas::OnLeftUp(wxMouseEvent& e) { if (!GetSceneManipulator()) return; mDragStarted = false; mDragOrigin =Ogre::Vector2(e.GetX(), e.GetY()) ; Ogre::Ray ray = GetSceneManipulator()->getWindowToViewportRay(e.GetX(),e.GetY()); bool bAxis = false; std::pair<bool, Ogre::Real> result = Fairy::rayCollide(ray, ( Ogre::MovableObject*) Fairy::CDataManipulator::mAxis_x, true); if (result.first) { _resetAxisMaterial(); mXax = !mXax; mYax = mZax = false; if (mXax) { GetDataManipulator()->m_pMaterialX->setSelfIllumination(1.0,1.0,0); } bAxis = true; } if (!bAxis) { result = Fairy::rayCollide(ray, ( Ogre::MovableObject*) Fairy::CDataManipulator::mAxis_y, true); if (result.first) { _resetAxisMaterial(); mYax = !mYax; mXax = mZax = false; if (mYax) { GetDataManipulator()->m_pMaterialY->setSelfIllumination(1.0,1.0,0); } bAxis = true; } } if (!bAxis) { result = Fairy::rayCollide(ray, ( Ogre::MovableObject*) Fairy::CDataManipulator::mAxis_z, true); if (result.first) { _resetAxisMaterial(); mZax = !mZax; mXax = mYax = false; if (mZax) { GetDataManipulator()->m_pMaterialZ->setSelfIllumination(1.0,1.0,0); } bAxis = true; } } if (!HasCapture()) return; if (mDragButton == wxMOUSE_BTN_NONE || !e.Button(mDragButton)) return; wxASSERT(GetActiveAction()); GetActiveAction()->onEnd(e.GetX(), e.GetY(), false); m_pUpdateListener->disable(); mDragButton = wxMOUSE_BTN_NONE; ReleaseCapture(); }
void ActorSceneCanvas::OnKeyDown(wxKeyEvent& e) { switch(e.GetKeyCode()) { case 'w': case 'W': { Ogre::Camera* camera = GetSceneManipulator()->getCamera(); assert (camera); Ogre::Vector3 oldPos = camera->getPosition(); Ogre::Vector3 offsetPos = camera->getDirection() * GetSceneManipulator()->getMoveSpeed(); Ogre::Vector3 newPos = oldPos; newPos.x += offsetPos.x; newPos.z += offsetPos.z; GetSceneManipulator()->setCameraPosition(newPos); e.Skip(false); } break; case 's': case 'S': { Ogre::Camera* camera = GetSceneManipulator()->getCamera(); assert (camera); Ogre::Vector3 oldPos = camera->getPosition(); Ogre::Vector3 offsetPos = camera->getDirection() * -(GetSceneManipulator()->getMoveSpeed()); Ogre::Vector3 newPos = oldPos; newPos.x += offsetPos.x; newPos.z += offsetPos.z; GetSceneManipulator()->setCameraPosition(newPos); e.Skip(false); } break; case 'a': case 'A': { Ogre::Camera* camera = GetSceneManipulator()->getCamera(); assert (camera); Ogre::Radian yawAngle( GetSceneManipulator()->getRotateSpeed() / 360.0f ); camera->yaw(yawAngle); e.Skip(false); } break; case 'd': case 'D': { Ogre::Camera* camera = GetSceneManipulator()->getCamera(); assert (camera); Ogre::Radian yawAngle( -(GetSceneManipulator()->getRotateSpeed() / 360.0f) ); camera->yaw(yawAngle); e.Skip(false); } break; case 'h': case 'H': { mHideAxis = !mHideAxis; Fairy::CDataManipulator::m_baseNode->setVisible(!mHideAxis); Fairy::CDataManipulator::mAxisNode_x->setVisible(!mHideAxis); Fairy::CDataManipulator::mAxisNode_y->setVisible(!mHideAxis); Fairy::CDataManipulator::mAxisNode_z->setVisible(!mHideAxis); } break; case 'b': case 'B': { GetDataManipulator()->switchBoundingBox(true); } break; case 't': case 'T': { GetSceneManipulator()->setTerrainVisible(!GetSceneManipulator()->getTerrainVisible()); } break; case 'g': case 'G': { GetSceneManipulator()->setGridVisible(!GetSceneManipulator()->getGridVisible()); } break; case 'r': case 'R': { mRotFirst = !mRotFirst; } break; //case 'C': // case 'c': // { // Fairy::LogicModelManager::getSingleton().showModelBoundingBox(!Fairy::LogicModelManager::getSingleton().isShowBoundingBox()); // } // break; // // case 'y': // case 'Y': // { // mYax = !mYax; // mXax = mZax = false; // } // break; // // case 'z': // case 'Z': // { // mZax = !mZax; // mXax = mYax = false; // } //break; //case 'z': //case 'Z': // { // GetSceneManipulator()->setActiveAction("ManipObjectAction"); // GetSceneManipulator()->setUseAxis(!GetSceneManipulator()->getUseAxis()); // } // e.Skip(false); // break; } }
void ActorSceneCanvas::OnMouseMove(wxMouseEvent& e) { ShowPos(e.GetX(), e.GetY()); if (!GetSceneManipulator()) return; if (m_pCameraManip) { wxASSERT(mDragButton != wxMOUSE_BTN_NONE); m_pCameraManip->onMotion(e.GetX(), e.GetY()); } if (mDragStarted && e.LeftIsDown()) { mDragCurrent =Ogre::Vector2(e.GetX(), e.GetY()) ; mDragDelta = mDragCurrent - mDragOrigin; mDragOrigin = mDragCurrent; if (Fairy::CDataManipulator::GetDataManipulator() && mCanManipulateAxis) { Ogre::Camera* camera = GetSceneManipulator()->getCamera(); assert (camera); Ogre::Vector3 oldPos = camera->getPosition(); Fairy::LogicModel* pModel = GetDataManipulator()->m_pObjTemplate; if (pModel) { Ogre::Vector3 objPos = pModel->getPosition(); Ogre::Real distance = oldPos.distance(objPos); Ogre::Real factor = distance*0.1/150.0; Ogre::Vector3 pos=Fairy::CDataManipulator::m_baseNode->getPosition(); Ogre::Vector3 fdeltaxi = Ogre::Vector3::ZERO; Ogre::Quaternion qRot = Fairy::CDataManipulator::m_baseNode->getOrientation(); //david-<< if(mXax) fdeltaxi = /*qRot**/(mDragDelta.x*0.1*Ogre::Vector3::UNIT_X); if(mYax) fdeltaxi = /*qRot**/(mDragDelta.x*0.1*Ogre::Vector3::UNIT_Y); if(mZax) fdeltaxi = /*qRot**/(mDragDelta.x*0.1*Ogre::Vector3::UNIT_Z); //david->> Fairy::CDataManipulator::GetDataManipulator()->_updateCurLocatorTrans(fdeltaxi,Ogre::Quaternion::IDENTITY,true); } } } if(mDragRightStarted && e.RightIsDown()) { mDragCurrent =Ogre::Vector2(e.GetX(), e.GetY()) ; mDragDelta = mDragCurrent - mDragOrigin; mDragOrigin = mDragCurrent; // Ogre::Radian x = Ogre::Degree(mDragDelta.val[0]); // Ogre::Radian y = Ogre::Degree(mDragDelta.val[1]); // Fairy::CDataManipulator::m_axex->yaw(y); // Fairy::CDataManipulator::m_axex->pitch(x); if ( Fairy::CDataManipulator::GetDataManipulator() &&(mXax || mYax || mZax) && mCanManipulateAxis) { Ogre::Vector3 fBaseAxis = Ogre::Vector3::ZERO; Ogre::Quaternion fBaseRot = Fairy::CDataManipulator::m_baseNode->getOrientation(); if(mXax) fBaseAxis =/* fBaseRot**/Ogre::Vector3::UNIT_X; if(mYax) fBaseAxis =/* fBaseRot**/Ogre::Vector3::UNIT_Y; if(mZax) fBaseAxis =/* fBaseRot**/Ogre::Vector3::UNIT_Z; //david-<< Ogre::Radian angle = Ogre::Degree(mDragDelta.y); //david->> Ogre::Quaternion rot(angle, fBaseAxis); if(mRotFirst) { Fairy::CDataManipulator::GetDataManipulator()->_updateCurLocatorTrans(Ogre::Vector3::ZERO, rot, false); } else { Fairy::CDataManipulator::GetDataManipulator()->_updateCurLocatorRot(rot); } } } if (GetActiveAction()) { //GetActiveAction()->onMotion(e.GetX(), e.GetY()); if (e.ControlDown()) { GetActiveAction()->setParameter("FUNC_KEY", "CTRL"); } if(e.AltDown()) { GetActiveAction()->setParameter("FUNC_KEY", "ATL"); } if(e.ShiftDown()) { GetActiveAction()->setParameter("FUNC_KEY", "SHIFT"); } } else { //GetSceneManipulator()->getHitIndicator("IntersectPoint")->setHitPoint(e.GetX(), e.GetY()); } // 显示标准模型 //if ( GetSceneManipulator()->getShowStandardModel() ) // GetSceneManipulator()->getHitIndicator("StandardModelIndicator")->setHitPoint(0.5,0.5); //else // GetSceneManipulator()->getHitIndicator("StandardModelIndicator")->hide(); m_CurrentMousePos.x = e.GetX(); m_CurrentMousePos.y = e.GetY(); Ogre::Vector3 position; bool hit = GetSceneManipulator()->getTerrainIntersects(m_CurrentMousePos.x, m_CurrentMousePos.y, position); std::pair<int, int> gridCoord = GetSceneManipulator()->getTerrainData()->getGrid(position.x, position.z); if (hit) { mParentFrame->SetStatusText("World Coordinate : " + Ogre::StringConverter::toString((int)(position.x)) + " " + Ogre::StringConverter::toString((int)(position.y)) + " " + Ogre::StringConverter::toString((int)(position.z)), 0); mParentFrame->SetStatusText("Grid Coordinate : " + Ogre::StringConverter::toString(gridCoord.first) + " " + Ogre::StringConverter::toString(gridCoord.second), 1); } }
void AnimationSelector::Reload(void) { resetState(); if (!Ogre::ResourceGroupManager::getSingletonPtr()) return; if(NULL == GetDataManipulator()) return; mAnimationList->Freeze(); wxTreeItemId root = mAnimationList->GetRootItem(); mAnimationList->Unselect(); mAnimationList->DeleteChildren(root); if (mIsMeshAnim) { // Get animation list of current mesh Fairy::ObjectPtr pCurMesh = GetDataManipulator()->m_pMeshObject; if (!pCurMesh) { mAnimationList->Thaw(); return; } Fairy::StaticEntityObject* entity = static_cast<Fairy::StaticEntityObject*>((pCurMesh).get()); Ogre::Entity* pCurEntity = entity->getEntity(); if(pCurEntity && pCurEntity->hasSkeleton()) { //更新动画列表 unsigned short numAnim = pCurEntity->getSkeleton()->getNumAnimations(); for(int i=0;i<numAnim;++i) { Ogre::String AniName = pCurEntity->getSkeleton()->getAnimation(i)->getName(); wxTreeItemId item = AddLeaf(root, AniName); mAnimationList->SetItemData(item, new AnimationItemData(AniName)); } } mAnimationList->Thaw(); } else { Fairy::LogicModel* pObjModel = GetDataManipulator()->m_pObjTemplate; if (!pObjModel) { mAnimationList->Thaw(); return; } Fairy::LogicModelManager::AnimationSkeletonLinks* pAniLinks = GetDataManipulator()->_getCurAniLinks(); if (!pAniLinks) { mAnimationList->Thaw(); return; } for ( Fairy::LogicModelManager::AnimationSkeletonLinks::iterator iter = pAniLinks->begin(); iter!= pAniLinks->end(); ++iter) { Ogre::String AniName(iter->first); wxTreeItemId item = AddLeaf(root, AniName); mAnimationList->SetItemData(item, new AnimationItemData(AniName)); } mAnimationList->Thaw(); } }