inline DesktopServerUI::DesktopServerUI() : impl(new Impl(this)) { const uint8 blankColor [] = { 0, 0, 0, 0 }; setColorImage(blankColor, 1, 1); const uint16 blankDepth [] = { 0 }; setDepthImage(blankDepth, 1, 1); }
void storeNuiImage(void) { NUI_IMAGE_FRAME imageFrame; if(WAIT_OBJECT_0 != WaitForSingleObject(hNextColorFrameEvent, 0)) return; HRESULT hr = pNuiSensor->NuiImageStreamGetNextFrame( pVideoStreamHandle, 0, &imageFrame ); if( FAILED( hr ) ){ return; } if(imageFrame.eImageType != NUI_IMAGE_TYPE_COLOR) STDERR("Image type is not match with the color\r\n"); INuiFrameTexture *pTexture = imageFrame.pFrameTexture; NUI_LOCKED_RECT LockedRect; pTexture->LockRect( 0, &LockedRect, NULL, 0 ); if( LockedRect.Pitch != 0 ){ byte * pBuffer = (byte *)LockedRect.pBits; #if defined(USE_FACETRACKER) setColorImage(LockedRect.pBits, LockedRect.size); #endif NUI_SURFACE_DESC pDesc; pTexture->GetLevelDesc(0, &pDesc); //printf("w: %d, h: %d, byte/pixel: %d\r\n", pDesc.Width, pDesc.Height, LockedRect.Pitch/pDesc.Width); typedef struct t_RGBA{ byte r; byte g; byte b; byte a; }; t_RGBA *p = (t_RGBA *)pBuffer; for(int i=0;i<pTexture->BufferLen()/4;i++){ byte b = p->b; p->b = p->r; p->r = b; p->a = (byte)255; p++; } glBindTexture(GL_TEXTURE_2D, bg_texture[IMAGE_TEXTURE]); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pDesc.Width, pDesc.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pBuffer); pTexture->UnlockRect(0); }else{ STDERR("Buffer length of received texture is bogus\r\n"); } pNuiSensor->NuiImageStreamReleaseFrame( pVideoStreamHandle, &imageFrame ); }