// 최초 draw전에 호출되서 새화면이 백버퍼에 그려져 있다고 가정함 BOOL XOverlap::Create( void ) { if( XE::IsEmpty( m_szImgTo ) ) // 이미지파일이 없으면 이전화면 프레임버퍼에서 새화면 프레임버퍼로 오버랩되는것이다. SetpSurface2( GRAPHICS->CreateScreenToSurface( GetbHighReso() ) ); // to 현재 백버퍼에 새화면이 그려져있어야 한다 else SetpSurface2( IMAGE_MNG->Load( /*GetbHighReso(), */m_szImgTo ) ); return 1; }
// 이전화면과 현재화면을 오버랩시킴 XOverlap::XOverlap( BOOL bHighReso, float fSec ) : XTransition( bHighReso, fSec, TRUE ) { Init(); SetpSurface1( GRAPHICS->s_pLastBackBuffer ); // from 이전화면을 XGraphics로부터 받아온다 if( GetpSurface1() == NULL ) // 최초로 띄워지는 씬이 오버랩으로 시작한다면 캡쳐해놓은게 없을거다. 그럼 현재 백버퍼를 그냥 캡쳐함 SetpSurface1( GRAPHICS->CreateScreenToSurface( GetbHighReso() ) ); GRAPHICS->s_pLastBackBuffer = NULL; // 포인터를 옮겨옴 }
BOOL XSurfaceOpenGL::CreatePNG( LPCTSTR szFilename, BOOL bSrcKeep ) { // g_Pool.AllocMark(5); XImage<DWORD> *pImage = new XImageiOS<DWORD>( GetbHighReso() ); pImage->Load( szFilename ); // 빈 텍스쳐 만듬. SetSrcImg( NULL, pImage->GetMemWidth(), pImage->GetMemHeight() ); int memw = GetMemWidth(); int memh = GetMemHeight(); // m_nWidth = pImage->GetWidth(); // m_nHeight = pImage->GetHeight(); // w,h값을 2^단위로 정렬한다. GLsizei alignedW = pImage->GetMemWidth(); GLsizei alignedH = pImage->GetMemHeight(); GRAPHICS->AlignPowSize( &alignedW, &alignedH ); m_nAlignedWidth = alignedW; m_nAlignedHeight = alignedH; // 정렬된 크기로 버텍스버퍼생성. CreateVertexBuffer( GetWidth(), GetHeight(), 0, 0, memw, memh, alignedW, alignedH ); glGenTextures( 1, &m_textureID ); XBREAK( m_textureID == 0 ); glBindTexture(GL_TEXTURE_2D, m_textureID ); if( m_textureID == 0 ) { XERROR( "memw:%d memh:%d", GetMemWidth(), GetMemHeight() ); return FALSE; } // gl텍스쳐로 쓰기 위해 크기를 정렬한다 { // g_Pool.AllocMark(4); DWORD *temp, *_temp, *src; temp = _temp = new DWORD[ alignedW * alignedH ]; memset( temp, 0, alignedW * alignedH * sizeof(DWORD) ); int i, j; src = pImage->GetTextureData(); for( i = 0; i < memh; i ++ ) { for( j = 0; j < memw; j ++ ) { *_temp++ = *src++; } _temp += (alignedW - memw); } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, alignedW, alignedH, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp ); SAFE_DELETE( temp ); // g_Pool.RestoreMark(4); } // 클래스내 보관용 이미지를 가져옴 if( bSrcKeep ) { DWORD *pSrcImg; pImage->MovePtr( &pSrcImg ); // Image메모리 소유권을 가져온다 SetSrcImg( pSrcImg, memw, memh ); } SAFE_DELETE( pImage ); // g_Pool.RestoreMark(5); /* if( bSrcKeep == FALSE ) { SAFE_DELETE( temp ); } else m_pSrcImg = temp; */ return TRUE; }
BOOL XSlideInOut::Create( void ) { // 스크린에서 픽셀얻어오는건 반드시 Create()에서 해야한다. 오버랩같은건 씬을 한번 그리고 다음턴에서 그화면을 얻어와야 하기때문에 생성자에서 스크린픽셀을 잡으면 안되기 때문이다 GRAPHICS->ScreenToSurface( GetbHighReso(), GetpSurface2() ); return 1; }