Beispiel #1
0
static void DrawFiles(int x, int y)
{
    DrawHat(x, y, "Файл : %d/%d", numCurFile + ((numFiles == 0) ? 0 : 1), numFiles);
    char nameFile[255];
    StructForReadDir sfrd;
    y += 12;
    if (FDrive_GetNameFile(currentDir, numFirstFile, nameFile, &sfrd))
    {
        int drawingFiles = 0;
        DrawLongString(x, y, nameFile, gBF.cursorInDirs == 0 && (numFirstFile + drawingFiles == numCurFile));
        while (drawingFiles < (RECS_ON_PAGE - 1) && FDrive_GetNextNameFile(nameFile, &sfrd))
        {
            drawingFiles++;
            DrawLongString(x, y + drawingFiles * 9, nameFile, gBF.cursorInDirs == 0 && (numFirstFile + drawingFiles == numCurFile));
        }
    }
}
Beispiel #2
0
static void DrawDirs(int x, int y)
{
    FDrive_GetNumDirsAndFiles(currentDir, &numDirs, &numFiles);
    DrawHat(x, y, "Каталог : %d/%d", numCurDir + ((numDirs == 0) ? 0 : 1), numDirs);
    char nameDir[255];
    StructForReadDir sfrd;
    y += 12;
    if (FDrive_GetNameDir(currentDir, numFirstDir, nameDir, &sfrd))
    {
        int  drawingDirs = 0;
        DrawLongString(x, y, nameDir, gBF.cursorInDirs == 1 && ( numFirstDir + drawingDirs == numCurDir));
        while (drawingDirs < (RECS_ON_PAGE - 1) && FDrive_GetNextNameDir(nameDir, &sfrd))
        {
            drawingDirs++;
            DrawLongString(x, y + drawingDirs * 9, nameDir, gBF.cursorInDirs == 1 && ( numFirstDir + drawingDirs == numCurDir));
        }
    }
}
Beispiel #3
0
void RwrClass::DrawSymbol (VirtualDisplay *display, int symbolID, int boxed)
{
	static int flash = FALSE;
	// Do we draw flashing things this frame?
	flash = vuxRealTime & 0x200;
	static int show = 0;
	static bool oldcount = FALSE;
	if (flash && oldcount == show)
	{
		show++;
		if (show >3) show = oldcount = 0;
	}
	if (!flash && show != oldcount) 
	{	
		show++;
		oldcount = show;
	}

	display->ZeroRotationAboutOrigin();//me123 make sure we are not rotated

	static const float	basicAir[][2] = {
	   { 0.00F,  0.06F},
	   { 0.09F, -0.03F},
	   { 0.00F,  0.01F},
	   {-0.09F, -0.03F},
	   { 0.00F,  0.06F}};
	static const int	NUM_BASIC_AIR_POINTS = sizeof(basicAir)/sizeof(basicAir[0]);

	static const float	advAir[][2] =  {
	   { 0.00F,  0.09F},
	   { 0.09F, -0.01F},
	   { 0.03F,  0.01F},
	   { 0.00F, -0.06F},
	   {-0.03F,  0.01F},
	   {-0.09F, -0.01F},
	   { 0.00F,  0.09F}};
	static const int	NUM_ADV_AIR_POINTS = sizeof(advAir)/sizeof(advAir[0]);

	static const float	theBoat[][2] = {
	   {-0.06F, -0.04F},
	   {-0.08F,  0.00F},
	   {-0.03F,  0.00F},
	   {-0.03F,  0.04F},
	   { 0.03F,  0.04F},
	   { 0.03F,  0.00F},
	   { 0.06F,  0.00F},
	   { 0.06F, -0.04F},
	   {-0.06F, -0.04F}};
	static const int	NUM_BOAT_POINTS = sizeof(theBoat)/sizeof(theBoat[0]);

	int		i;
	float	verticalTextCenter = 0.5f*display->TextHeight();
	switch (symbolID)
	{
	  case RWRSYM_ADVANCED_INTERCEPTOR://
	  	for (i=1; i<NUM_ADV_AIR_POINTS; i++)
	      display->Line( advAir[i][0], advAir[i][1], advAir[i-1][0], advAir[i-1][1] );
		break;

	  case RWRSYM_BASIC_INTERCEPTOR:
		for (i=1; i<NUM_BASIC_AIR_POINTS; i++)
			display->Line( basicAir[i][0], basicAir[i][1], basicAir[i-1][0], basicAir[i-1][1] );
		break;

	  case RWRSYM_NAVAL:
		for (i=1; i<NUM_BOAT_POINTS; i++)
			display->Line( theBoat[i][0], theBoat[i][1], theBoat[i-1][0], theBoat[i-1][1] );
		break;

	  case RWRSYM_ACTIVE_MISSILE:
	  display->TextCenter (0.0F, verticalTextCenter, "M", boxed);
		break;

	  case RWRSYM_CHAPARAL: case RWRSYM_KSAM:
		display->TextCenter (0.0F, verticalTextCenter, "C", boxed);
		break;

	  case RWRSYM_HAWK:
		display->TextCenter (0.0F, verticalTextCenter, "H", boxed);
		break;

	  case RWRSYM_PATRIOT:
		display->TextCenter (0.0F, verticalTextCenter, "P", boxed);
		break;

	  case RWRSYM_NIKE:
		display->TextCenter (0.0F, verticalTextCenter, "N", boxed);
		break;

	  case RWRSYM_SA2:

		display->TextCenter (0.0F, verticalTextCenter, "2", boxed);
		break;

	  case RWRSYM_SA3:

		display->TextCenter (0.0F, verticalTextCenter, "3", boxed);
		break;

	  case RWRSYM_SA4:

		display->TextCenter (0.0F, verticalTextCenter, "4", boxed);
		break;

	  case RWRSYM_SA5:
		display->TextCenter (0.0F, verticalTextCenter, "5", boxed);
		break;

	  case RWRSYM_SA6:

		display->TextCenter (0.0F, verticalTextCenter, "6", boxed);
		break;

	  case RWRSYM_SA8:
		display->TextCenter (0.0F, verticalTextCenter, "8", boxed);
		break;

	  case RWRSYM_SA9:
		display->TextCenter (0.0F, verticalTextCenter, "9", boxed);
		break;

	  case RWRSYM_SA10:
		display->TextCenter (0.0F, verticalTextCenter, "10", boxed);
		break;

	  case RWRSYM_SA13:
		display->TextCenter (0.0F, verticalTextCenter, "13", boxed);
		break;

	  case RWRSYM_SA15:
		if (show)
			display->TextCenter (0.0F, verticalTextCenter, "15", boxed);
		else 
			display->TextCenter (0.0F, verticalTextCenter, "M", boxed);
		break;

	  case RWRSYM_AAA:
		if (flash)
			display->TextCenter (0.0F, verticalTextCenter, "A", boxed);
		else
		  display->TextCenter (0.0F, verticalTextCenter, "S", boxed);
		break;

	  case RWRSYM_SEARCH:
		display->TextCenter (0.0F, verticalTextCenter, "S", boxed);
		break;

	  case RWRSYM_UNK1:
		display->TextCenter (0.0F, verticalTextCenter, "U", boxed);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, ".", boxed);
		break;

	  case RWRSYM_UNK2:
		display->TextCenter (0.0F, verticalTextCenter, "U", boxed);
		display->TextCenter (0.02F, verticalTextCenter-0.04F, ".", boxed);
		display->TextCenter (-0.02F, verticalTextCenter-0.04F, ".", boxed);
		break;

	  case RWRSYM_UNK3:
		display->TextCenter (0.0F, verticalTextCenter, "U", boxed);
		display->TextCenter (-0.03F, verticalTextCenter-0.04F, ".", boxed);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, ".", boxed);
		display->TextCenter (0.03F, verticalTextCenter-0.04F, ".", boxed);
		break;

	  case RWRSYM_PDOT :
		display->TextCenter (0.0F, verticalTextCenter, "P", boxed);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, ".", boxed);
		break;
	  
	  case RWRSYM_PSLASH:
		display->TextCenter (0.0F, verticalTextCenter, "P", boxed);
		display->TextCenter (0.01F, verticalTextCenter, "|", boxed);
		break;
	  
	  case RWRSYM_A1:
		display->TextCenter (0.0F, verticalTextCenter, "A", boxed);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, ".", boxed);
		break;
	  
	  case RWRSYM_A2:
		display->TextCenter (0.0F, verticalTextCenter, "A", boxed);
		display->TextCenter (0.02F, verticalTextCenter-0.04F, ".", boxed);
		display->TextCenter (-0.02F, verticalTextCenter-0.04F, ".", boxed);
		break;
	  
	  case RWRSYM_V4 :
		DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "4", boxed);
		break;

	  case RWRSYM_V5 :
		DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "5", boxed);
		break;

	  case RWRSYM_V14 :
		DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "14", boxed);
		break;

	  case RWRSYM_V15:
		DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "15", boxed);
		break;

	  case RWRSYM_V16 :
		DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "16", boxed);
		break;

	  case RWRSYM_V18 :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "18", boxed);
		break;

	  case RWRSYM_V19 :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "19", boxed);
		break;

	  case RWRSYM_V20 :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "20", boxed);
		break;

	  case RWRSYM_V21 :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "21", boxed);
		break;

	  case RWRSYM_V22 :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "22", boxed);
		break;

	  case RWRSYM_V23 :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "23", boxed);
		break;

	  case RWRSYM_V25:
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "25", boxed);
		break;

	  case RWRSYM_V27:
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "27", boxed);
		break;

	  case RWRSYM_V29 :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "29", boxed);
		break;

	  case RWRSYM_V30 :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "30", boxed);
		break;

	  case RWRSYM_V31 :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "31", boxed);
		break;

	  case RWRSYM_VA :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "A", boxed);
		break;

	  case RWRSYM_VB :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "B", boxed);
		break;

	  case RWRSYM_VP :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "P", boxed);
		break;

	  case RWRSYM_VPD :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "PD", boxed);
		break;

	  case RWRSYM_VS :
	  DrawHat(display);
		display->TextCenter (0.0F, verticalTextCenter-0.04F, "S", boxed);
		break;

	  case RWRSYM_Aa :
		display->TextCenter (0.0F, verticalTextCenter, "A", boxed);
		display->TextCenter (0.01F, verticalTextCenter, "|", boxed);
		break;

	  case RWRSYM_Ab :
		display->TextCenter (0.01F, verticalTextCenter, "A", boxed);
		display->TextCenter (0.02F, verticalTextCenter, "|", boxed);
		display->TextCenter (0.0F, verticalTextCenter, "|", boxed);
		break;

	  case RWRSYM_Ac :
		display->TextCenter (0.1F, verticalTextCenter, "A", boxed);
		display->TextCenter (-0.01F, verticalTextCenter, "|", boxed);
		display->TextCenter (0.1F, verticalTextCenter, "|", boxed);
		display->TextCenter (0.03F, verticalTextCenter, "|", boxed);
		break;

	  case RWRSYM_MIB_F_S:
		if (!show)
			display->TextCenter (0.0F, verticalTextCenter, "F", boxed);
		else 
			display->TextCenter (0.0F, verticalTextCenter, "S", boxed);
	  break;

	  case RWRSYM_MIB_F_A||66:
		if (show)
			display->TextCenter (0.0F, verticalTextCenter, "F", boxed);
		else 
			display->TextCenter (0.0F, verticalTextCenter, "A", boxed);
		break;

	  case RWRSYM_MIB_F_M:
	  if (!show)
			display->TextCenter (0.0F, verticalTextCenter, "F", boxed);
		else 
			display->TextCenter (0.0F, verticalTextCenter, "M", boxed);
		break;

	  case RWRSYM_MIB_F_U:
	  if (show)
			display->TextCenter (0.0F, verticalTextCenter, "F", boxed);
		else 
			display->TextCenter (0.0F, verticalTextCenter, "U", boxed);
		break;

	  case RWRSYM_MIB_F_BW:
		if (!show)
			display->TextCenter (0.0F, verticalTextCenter, "F", boxed);
		else 
			// RWRSYM_BASIC_INTERCEPTOR:
			for (i=1; i<NUM_BASIC_AIR_POINTS; i++)
				display->Line( basicAir[i][0], basicAir[i][1], basicAir[i-1][0], basicAir[i-1][1] );
		break;		 

		case RWRSYM_MIB_BW_S:
		if (show)
			display->TextCenter (0.0F, verticalTextCenter, "S", boxed);
		else 
			// RWRSYM_BASIC_INTERCEPTOR:
			for (i=1; i<NUM_BASIC_AIR_POINTS; i++)
				display->Line( basicAir[i][0], basicAir[i][1], basicAir[i-1][0], basicAir[i-1][1] );
		break;

		case RWRSYM_MIB_BW_A:
		if (!show)
			display->TextCenter (0.0F, verticalTextCenter, "A", boxed);
		else 
			// RWRSYM_BASIC_INTERCEPTOR:
			for (i=1; i<NUM_BASIC_AIR_POINTS; i++)
				display->Line( basicAir[i][0], basicAir[i][1], basicAir[i-1][0], basicAir[i-1][1] );
		break;

		case RWRSYM_MIB_BW_M:
		if (!show)
			display->TextCenter (0.0F, verticalTextCenter, "M", boxed);
		else 
			// RWRSYM_BASIC_INTERCEPTOR:
			for (i=1; i<NUM_BASIC_AIR_POINTS; i++)
				display->Line( basicAir[i][0], basicAir[i][1], basicAir[i-1][0], basicAir[i-1][1] );
		break;

	  default:
		// JB 010727
		if (symbolID >= 100)
		{
			char buffer[4];
			itoa(symbolID - 100, buffer, 10);
			display->TextCenter (0.0F, verticalTextCenter, buffer, boxed);
		}
		else if (symbolID >= 65)
		{
			char buffer[2];
			buffer[0] = symbolID;
			buffer[1] = 0;
			display->TextCenter (0.0F, verticalTextCenter, buffer, boxed);
		}
		else
			display->TextCenter (0.0F, verticalTextCenter, "U", boxed);
		break;
	}
}
Beispiel #4
0
void SampleViewer::Display()
{
	nite::UserTrackerFrameRef userTrackerFrame;
	openni::VideoFrameRef depthFrame;
	nite::Status rc = m_pUserTracker->readFrame(&userTrackerFrame);
	if (rc != nite::STATUS_OK)
	{
		printf("GetNextData failed\n");
		return;
	}

	depthFrame = userTrackerFrame.getDepthFrame();
	m_colorStream.readFrame(&m_colorFrame);

	if (m_pTexMap == NULL)
	{
		// Texture map init
		m_nTexMapX = MIN_CHUNKS_SIZE(depthFrame.getVideoMode().getResolutionX(), TEXTURE_SIZE);
		m_nTexMapY = MIN_CHUNKS_SIZE(depthFrame.getVideoMode().getResolutionY(), TEXTURE_SIZE);
		m_pTexMap = new openni::RGB888Pixel[m_nTexMapX * m_nTexMapY];
	}

	const nite::UserMap& userLabels = userTrackerFrame.getUserMap();

	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();
	glOrtho(0, GL_WIN_SIZE_X, GL_WIN_SIZE_Y, 0, -2000.0, 2000.0);

	if (depthFrame.isValid() && g_drawDepth)
	{
		calculateHistogram(m_pDepthHist, MAX_DEPTH, depthFrame);
	}

	memset(m_pTexMap, 0, m_nTexMapX*m_nTexMapY*sizeof(openni::RGB888Pixel));

	// check if we need to draw image frame to texture
	if (m_eViewState == DISPLAY_MODE_IMAGE && m_colorFrame.isValid())
	{
		const openni::RGB888Pixel* pImageRow = (const openni::RGB888Pixel*)m_colorFrame.getData();
		openni::RGB888Pixel* pTexRow = m_pTexMap + m_colorFrame.getCropOriginY() * m_nTexMapX;
		int rowSize = m_colorFrame.getStrideInBytes() / sizeof(openni::RGB888Pixel);

		for (int y = 0; y < m_colorFrame.getHeight(); ++y)
		{
			const openni::RGB888Pixel* pImage = pImageRow;
			openni::RGB888Pixel* pTex = pTexRow + m_colorFrame.getCropOriginX();

			for (int x = 0; x < m_colorFrame.getWidth(); ++x, ++pImage, ++pTex)
			{
				*pTex = *pImage;
			}

			pImageRow += rowSize;
			pTexRow += m_nTexMapX;
		}
	}

	float factor[3] = {1, 1, 1};
	// check if we need to draw depth frame to texture
	if (depthFrame.isValid() && g_drawDepth)
	{
		const nite::UserId* pLabels = userLabels.getPixels();

		const openni::DepthPixel* pDepthRow = (const openni::DepthPixel*)depthFrame.getData();
		openni::RGB888Pixel* pTexRow = m_pTexMap + depthFrame.getCropOriginY() * m_nTexMapX;
		int rowSize = depthFrame.getStrideInBytes() / sizeof(openni::DepthPixel);

		for (int y = 0; y < depthFrame.getHeight(); ++y)
		{
			const openni::DepthPixel* pDepth = pDepthRow;
			openni::RGB888Pixel* pTex = pTexRow + depthFrame.getCropOriginX();

			for (int x = 0; x < depthFrame.getWidth(); ++x, ++pDepth, ++pTex, ++pLabels)
			{
				if (*pDepth != 0)
				{
					if (*pLabels == 0)
					{
						if (!g_drawBackground)
						{
							factor[0] = factor[1] = factor[2] = 0;

						}
						else
						{
							factor[0] = Colors[colorCount][0];
							factor[1] = Colors[colorCount][1];
							factor[2] = Colors[colorCount][2];
						}
					}
					else
					{
						factor[0] = Colors[*pLabels % colorCount][0];
						factor[1] = Colors[*pLabels % colorCount][1];
						factor[2] = Colors[*pLabels % colorCount][2];
					}
//					// Add debug lines - every 10cm
// 					else if ((*pDepth / 10) % 10 == 0)
// 					{
// 						factor[0] = factor[2] = 0;
// 					}

					int nHistValue = m_pDepthHist[*pDepth];
					pTex->r = nHistValue*factor[0];
					pTex->g = nHistValue*factor[1];
					pTex->b = nHistValue*factor[2];

					factor[0] = factor[1] = factor[2] = 1;
				}
			}

			pDepthRow += rowSize;
			pTexRow += m_nTexMapX;
		}
	}

	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_nTexMapX, m_nTexMapY, 0, GL_RGB, GL_UNSIGNED_BYTE, m_pTexMap);

	// Display the OpenGL texture map
	glColor4f(1,1,1,1);

	glEnable(GL_TEXTURE_2D);
	glBegin(GL_QUADS);

	g_nXRes = depthFrame.getVideoMode().getResolutionX();
	g_nYRes = depthFrame.getVideoMode().getResolutionY();

	// upper left
	glTexCoord2f(0, 0);
	glVertex2f(0, 0);
	// upper right
	glTexCoord2f((float)g_nXRes/(float)m_nTexMapX, 0);
	glVertex2f(GL_WIN_SIZE_X, 0);
	// bottom right
	glTexCoord2f((float)g_nXRes/(float)m_nTexMapX, (float)g_nYRes/(float)m_nTexMapY);
	glVertex2f(GL_WIN_SIZE_X, GL_WIN_SIZE_Y);
	// bottom left
	glTexCoord2f(0, (float)g_nYRes/(float)m_nTexMapY);
	glVertex2f(0, GL_WIN_SIZE_Y);

	glEnd();
	glDisable(GL_TEXTURE_2D);

	const nite::Array<nite::UserData>& users = userTrackerFrame.getUsers();
	for (int i = 0; i < users.getSize(); ++i)
	{
		const nite::UserData& user = users[i];

		updateUserState(user, userTrackerFrame.getTimestamp());
		if (user.isNew())
		{
			m_pUserTracker->startSkeletonTracking(user.getId());
			m_pUserTracker->startPoseDetection(user.getId(), nite::POSE_CROSSED_HANDS);
		}
		else if (!user.isLost())
		{
			if (g_drawStatusLabel)
			{
				DrawStatusLabel(m_pUserTracker, user);
			}
			if (g_drawCenterOfMass)
			{
				DrawCenterOfMass(m_pUserTracker, user);
			}
			if (g_drawBoundingBox)
			{
				DrawBoundingBox(user);
			}

			if (users[i].getSkeleton().getState() == nite::SKELETON_TRACKED && g_drawSkeleton)
			{
				DrawSkeleton(m_pUserTracker, user);
			}
			if (users[i].getSkeleton().getState() == nite::SKELETON_TRACKED && g_drawHat)
			{
				DrawHat(m_pUserTracker, user);
			}
			if (users[i].getSkeleton().getState() == nite::SKELETON_TRACKED && g_drawCube)
			{
				DrawCube(m_pUserTracker, user);
			}
			if (users[i].getSkeleton().getState() == nite::SKELETON_TRACKED && g_drawCubeFront)
			{
				DrawCubeFront(m_pUserTracker, user);
			}
		}

		if (m_poseUser == 0 || m_poseUser == user.getId())
		{
			const nite::PoseData& pose = user.getPose(nite::POSE_CROSSED_HANDS);

			if (pose.isEntered())
			{
				// Start timer
				sprintf(g_generalMessage, "In exit pose. Keep it for %d second%s to exit\n", g_poseTimeoutToExit/1000, g_poseTimeoutToExit/1000 == 1 ? "" : "s");
				printf("Counting down %d second to exit\n", g_poseTimeoutToExit/1000);
				m_poseUser = user.getId();
				m_poseTime = userTrackerFrame.getTimestamp();
			}
			else if (pose.isExited())
			{
				memset(g_generalMessage, 0, sizeof(g_generalMessage));
				printf("Count-down interrupted\n");
				m_poseTime = 0;
				m_poseUser = 0;
			}
			else if (pose.isHeld())
			{
				// tick
				if (userTrackerFrame.getTimestamp() - m_poseTime > g_poseTimeoutToExit * 1000)
				{
					printf("Count down complete. Exit...\n");
					Finalize();
					exit(2);
				}
			}
		}
	}

	if (g_drawFrameId)
	{
		DrawFrameId(userTrackerFrame.getFrameIndex());
	}

	if (g_generalMessage[0] != '\0')
	{
		char *msg = g_generalMessage;
		glColor3f(1.0f, 0.0f, 0.0f);
		glRasterPos2i(100, 20);
		glPrintString(GLUT_BITMAP_HELVETICA_18, msg);
	}

	// Swap the OpenGL display buffers
	glutSwapBuffers();

}