void LLMorphView::updateCamera() { if (!mCameraTargetJoint) { setCameraTargetJoint(gAgent.getAvatarObject()->getJoint("mHead")); } LLVOAvatar* avatar = gAgent.getAvatarObject(); if( !avatar ) { return; } LLJoint* root_joint = avatar->getRootJoint(); if( !root_joint ) { return; } const LLQuaternion& avatar_rot = root_joint->getWorldRotation(); LLVector3d joint_pos = gAgent.getPosGlobalFromAgent(mCameraTargetJoint->getWorldPosition()); LLVector3d target_pos = joint_pos + mCameraTargetOffset * avatar_rot; LLQuaternion camera_rot_yaw(mCameraYaw, LLVector3::z_axis); LLQuaternion camera_rot_pitch(mCameraPitch, LLVector3::y_axis); LLVector3d camera_pos = joint_pos + mCameraOffset * camera_rot_pitch * camera_rot_yaw * avatar_rot; gAgent.setCameraPosAndFocusGlobal( camera_pos, target_pos, gAgent.getID() ); }
//----------------------------------------------------------------------------- // render() //----------------------------------------------------------------------------- BOOL LLVisualParamHint::render() { LLVisualParamReset::sDirty = TRUE; LLVOAvatar* avatarp = gAgent.getAvatarObject(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); LLGLSUIDefault gls_ui; //LLGLState::verify(TRUE); mBackgroundp->draw(0, 0, mWidth, mHeight); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); mNeedsUpdate = FALSE; mIsVisible = TRUE; LLViewerJointMesh* cam_target_joint = NULL; const std::string& cam_target_mesh_name = mVisualParam->getCameraTargetName(); if( !cam_target_mesh_name.empty() ) { cam_target_joint = (LLViewerJointMesh*)avatarp->getJoint( cam_target_mesh_name ); } if( !cam_target_joint ) { cam_target_joint = (LLViewerJointMesh*)gMorphView->getCameraTargetJoint(); } if( !cam_target_joint ) { cam_target_joint = (LLViewerJointMesh*)avatarp->getJoint("mHead"); } LLQuaternion avatar_rotation; LLJoint* root_joint = avatarp->getRootJoint(); if( root_joint ) { avatar_rotation = root_joint->getWorldRotation(); } LLVector3 target_joint_pos = cam_target_joint->getWorldPosition(); LLVector3 target_offset( 0, 0, mVisualParam->getCameraElevation() ); LLVector3 target_pos = target_joint_pos + (target_offset * avatar_rotation); F32 cam_angle_radians = mVisualParam->getCameraAngle() * DEG_TO_RAD; LLVector3 camera_snapshot_offset( mVisualParam->getCameraDistance() * cosf( cam_angle_radians ), mVisualParam->getCameraDistance() * sinf( cam_angle_radians ), mVisualParam->getCameraElevation() ); LLVector3 camera_pos = target_joint_pos + (camera_snapshot_offset * avatar_rotation); gGL.flush(); LLViewerCamera::getInstance()->setAspect((F32)mWidth / (F32)mHeight); LLViewerCamera::getInstance()->setOriginAndLookAt( camera_pos, // camera LLVector3(0.f, 0.f, 1.f), // up target_pos ); // point of interest LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE); if (avatarp->mDrawable.notNull()) { LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool(); LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE); gGL.setAlphaRejectSettings(LLRender::CF_ALWAYS); gGL.setSceneBlendType(LLRender::BT_REPLACE); avatarPoolp->renderAvatars(avatarp); // renders only one avatar gGL.setSceneBlendType(LLRender::BT_ALPHA); gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight); gGL.color4f(1,1,1,1); mTexture->setGLTextureCreated(true); return TRUE; }