void RayScreenMenuTool::display(GLContextData&) const
	{
	if(insideWidget||widgetActive||isActive())
		{
		/* Draw the menu selection ray: */
		glPushAttrib(GL_ENABLE_BIT|GL_LINE_BIT);
		glDisable(GL_LIGHTING);
		glColor3f(1.0f,0.0f,0.0f);
		glLineWidth(3.0f);
		glBegin(GL_LINES);
		glVertex(selectionRay.getOrigin());
		glVertex(selectionRay(getDisplaySize()*Scalar(5)));
		glEnd();
		glPopAttrib();
		}
	}
void RayScreenMenuTool::frame(void)
	{
	/* Update the selection ray: */
	selectionRay=calcSelectionRay();
	
	if(factory->interactWithWidgets)
		insideWidget=getWidgetManager()->findPrimaryWidget(selectionRay)!=0;
	
	if(widgetActive)
		{
		/* Deliver the event: */
		GLMotif::Event event(true);
		event.setWorldLocation(selectionRay);
		getWidgetManager()->pointerMotion(event);
		
		if(dragging)
			{
			/* Find the closest intersection with any screen: */
			std::pair<VRScreen*,Scalar> si=findScreen(selectionRay);
			
			if(si.first!=0)
				{
				/* Update the dragged widget's transformation: */
				NavTrackerState current=NavTrackerState::translateFromOriginTo(selectionRay(si.second));
				current*=preScale;
				getWidgetManager()->setPrimaryWidgetTransformation(draggedWidget,GLMotif::WidgetManager::Transformation(current));
				}
			}
		}
	else if(isActive())
		{
		/* Update the selection ray: */
		selectionRay=calcSelectionRay();
		
		/* Deliver the event: */
		GLMotif::Event event(true);
		event.setWorldLocation(selectionRay);
		getWidgetManager()->pointerMotion(event);
		}
	}
void DaisyWheelTool::display(GLContextData&) const
	{
	if(active)
		{
		/* Save OpenGL state: */
		glPushAttrib(GL_ENABLE_BIT|GL_LINE_BIT);
		
		/* Draw the daisy wheel: */
		glPushMatrix();
		glMultMatrix(wheelTransform);
		
		/* Set up OpenGL state: */
		glDisable(GL_LIGHTING);
		
		glBegin(GL_QUADS);
		Scalar angle0=Scalar(0);
		Scalar angleDiff=zoomAngle-angle0;
		if(angleDiff<-Math::Constants<Scalar>::pi)
			angleDiff+=Scalar(2)*Math::Constants<Scalar>::pi;
		else if(angleDiff>Math::Constants<Scalar>::pi)
			angleDiff-=Scalar(2)*Math::Constants<Scalar>::pi;
		Scalar weight=Math::abs(angleDiff)/Math::Constants<Scalar>::pi;
		angleDiff*=Math::pow(weight,Scalar(1)-zoomStrength)/weight;
		Scalar wAngle0=zoomAngle-angleDiff;
		Scalar c0=Math::cos(wAngle0);
		Scalar s0=Math::sin(wAngle0);
		for(int i=0;i<numCharacters;++i)
			{
			Scalar angle1=angle0+dynamicWeights[i]*Scalar(2)*Math::Constants<Scalar>::pi/dynamicWeightSum;
			angleDiff=zoomAngle-angle1;
			if(angleDiff<-Math::Constants<Scalar>::pi)
				angleDiff+=Scalar(2)*Math::Constants<Scalar>::pi;
			else if(angleDiff>Math::Constants<Scalar>::pi)
				angleDiff-=Scalar(2)*Math::Constants<Scalar>::pi;
			weight=Math::abs(angleDiff)/Math::Constants<Scalar>::pi;
			angleDiff*=Math::pow(weight,Scalar(1)-zoomStrength)/weight;
			Scalar wAngle1=zoomAngle-angleDiff;
			Scalar c1=Math::cos(wAngle1);
			Scalar s1=Math::sin(wAngle1);
			
			if(i%2==0)
				glColor3f(1.0f,0.5f,0.5f);
			else
				glColor3f(0.0f,0.5f,1.0f);
			glVertex3f(s0*factory->innerRadius,0.0f,c0*factory->innerRadius);
			glVertex3f(s1*factory->innerRadius,0.0f,c1*factory->innerRadius);
			glVertex3f(s1*factory->outerRadius,0.0f,c1*factory->outerRadius);
			glVertex3f(s0*factory->outerRadius,0.0f,c0*factory->outerRadius);
			
			angle0=angle1;
			wAngle0=wAngle1;
			c0=c1;
			s0=s1;
			}
		glEnd();
		
		glPopMatrix();
		
		/* Draw the menu selection ray: */
		glLineWidth(3.0f);
		glColor3f(1.0f,0.0f,0.0f);
		glBegin(GL_LINES);
		glVertex(selectionRay.getOrigin());
		glVertex(selectionRay(getDisplaySize()*Scalar(5)));
		glEnd();
		
		/* Restore OpenGL state: */
		glPopAttrib();
		}
	}