Beispiel #1
0
XE::xRESULT	CDefine :: AddDefine( LPCTSTR szDefine, int nVal, LPCTSTR szRemark )
{
	int		nIdx = m_nMaxDef;

	if( Find( szDefine ) )
	{
		XERROR( "%s 가 이미 정의 되어 있다.  다른이름으로 할 것!", szDefine );
		return XE::xFAIL;
	}

	if( _tcslen( szDefine ) >= MAX_NAME )		// TODO: 매크로로 만들것
		XERROR( "버퍼 오버플로우 %s=%d buffSize=%d", szDefine, _tcslen( szDefine ), MAX_NAME );
	_tcscpy_s( m_pList[nIdx].m_strName, szDefine );	// OBJECT_DAO
	m_pList[nIdx].m_nValue = nVal;					// 1
	if( szRemark && XE::IsHave(szRemark) ) {
		if( _tcslen( szRemark ) >= MAX_REMARK )		// TODO: 매크로로 만들것
			XERROR( "버퍼 오버플로우 %s=%d buffSize=%d", szRemark, _tcslen( szRemark ), MAX_REMARK );
		_tcscpy_s( m_pList[nIdx].m_szRemark, szRemark );
	}
	else {
		if( _tcslen( szDefine ) >= MAX_REMARK )		// TODO: 매크로로 만들것
			XERROR( "버퍼 오버플로우 %s=%d buffSize=%d", szDefine, _tcslen( szDefine ), MAX_REMARK );
		_tcscpy_s( m_pList[nIdx].m_szRemark, szDefine );
	}

	m_nMaxDef ++;
	if( m_nMaxDef >= MAX_DEFINE )
	{
		return XE::xFAIL;
	}

	return XE::xSUCCESS;
}
Beispiel #2
0
//
// Constant.h를 읽어 #define name value들을 모두 메모리에 적재
// Load()를 연속적으로 읽는다면 m_nMaxDef부터 추가로 읽게 된다.
// ex)  Load( "constant1.h" );	0 ~ 300 인덱스
//      Load( "constant2.h" );	301 ~ 600 인덱스
XE::xRESULT CDefine::Load( LPCTSTR strFileName )
{
	CToken	Token;
	TCHAR szName[256];

	if( Token.LoadFile( strFileName, TXT_EUCKR ) == XE::xFAIL )
		return XE::xFAIL;
	while(1)
	{
		if( Token.GetToken() == NULL )	break;
		if( Token == _T("define") )
		{
			Token.GetToken();
			// ex) #define OBJECT_DAO	1
			if( Token.m_Token[0] != '_' )		// #define _HUHU같이 첫자가밑줄 붙은건 읽지 않음
			{
				_tcscpy_s( szName, Token.m_Token );
				int		nVal = Token.GetNumber();
				// 읽어 메모리로 올릴때는 주석을 읽지 않는다.  
				// Object.inc에 있는 NAME부분을 가지고 저장할때만 기록한다.
				if( XE::xFAIL == AddDefine( szName, nVal, Token.GetRemark() ) )			// define 추가
				{
					XERROR( "%s 읽던중 CDefine의 최대 버퍼%d를 넘었다", strFileName, MAX_DEFINE );
					break;
				}
			} else
				XLOG( "define %s skip", Token.m_Token );
		}
	}
	return XE::xSUCCESS;
}
Beispiel #3
0
static int load_panel_theme(struct panel_theme *theme, struct config_format_tree *tree)
{
	CLEAR_STRUCT(theme);
	struct config_format_entry *e = find_config_format_entry(&tree->root, "panel");
	if (!e)
		return XERROR("Failed to find 'panel' section in theme format file");


	theme->position = PANEL_POSITION_TOP; /* default */
	const char *v = find_config_format_entry_value(e, "position");
	if (v)
		theme->position = parse_position(v);

	theme->background = parse_image_part_named("background", e, tree, 1);
	if (!theme->background)
		return -1;

	theme->separator = parse_image_part_named("separator", e, tree, 0);
	theme->transparent = parse_bool("transparent", e);
	theme->align = parse_align("align", e);
	theme->height = parse_int("height", e, -1);
	theme->width = parse_int_or_percents("width", e, -1,
					     &theme->width_in_percents);
	return 0;
}
Beispiel #4
0
void	CModelObject::TakeOffParts( int nParts )
{
#ifdef __XDEBUG
	if( nParts < 0 )
		XERROR( "CModelObject::TakeOffParts : nParts 에러 - nParts = %d", nParts );
//		XERROR( "CModelObject::TakeOffParts : nParts 에러 - nParts = %d", nParts );
#endif
	if( nParts >= MAX_ELEMENT )
		return;
	// 파츠를 제거했는데, 아래 부분을 안해주면 old 파츠에서 매모리 릭 발생 - vampyre
	O3D_ELEMENT	*pElem;
	pElem = &m_Element[ nParts ];
	if( pElem->m_pnGL_VB )
	{
		pElem->m_pObject3D->SetLOD(0);
		int j;
		for( j = 0; j < pElem->m_pObject3D->GetMaxObject(); j ++ )		// 
			glDeleteTextures( 1, &pElem->m_pnGL_VB1[j] );
		pElem->m_pObject3D->SetLOD(1);
		for( j = 0; j < pElem->m_pObject3D->GetMaxObject(); j ++ )
			glDeleteTextures( 1, &pElem->m_pnGL_VB2[j] );
		pElem->m_pObject3D->SetLOD(2);
		for( j = 0; j < pElem->m_pObject3D->GetMaxObject(); j ++ )
			glDeleteTextures( 1, &pElem->m_pnGL_VB3[j] );
		pElem->m_pObject3D->SetLOD(0);
		SAFE_DELETE_ARRAY( pElem->m_pnGL_VB );		// 전체 메모리 풀을 한꺼번에 날림.
	}
	Init( nParts );
}
Beispiel #5
0
//
//		LoadBone
//
int		CModelObject::LoadBone( LPCTSTR szFileName )
{
#ifdef __XDEBUG
	if( m_pBone )
		XLOG( "CModelObject::LoadBone ; 이미 본이 로딩되어 있다. 0x%08x", (int)m_pBone );
#endif
	// Bone 관리자를 통해 본을 로딩한후 그 포인터를 받아온다.
	m_pBone = g_BonesMng.LoadBone( szFileName );

	// 본을 못읽었다.
	if( m_pBone == NULL )
	{
		XERROR( "%s : 찾을 수 없음", szFileName );
		return FAIL;
	}

	m_bSkin = TRUE;		// 스키닝 오브젝트라는 플래그
#ifdef _DEBUG
	if( m_mUpdateBone )
		XLOG( "CModelObject::LoadBone : %s 이미 읽었는데 또 읽은것 같다.", szFileName );
#endif

	// 오브젝트의 계층구조가 애니메이션되면서 실시간으로 변환되는 매트릭스 배열
//	if( m_mUpdateBone == NULL )		// 모션을 재로딩을 할 수 있으므로 이미 할당 받았으면 다시 받지 않음.
	m_mUpdateBone = new MATRIX[ m_pBone->m_nMaxBone * 2 ];	// Inv랑 같이 쓰려고 * 2로 잡는다,.
	m_pBaseBoneInv = m_mUpdateBone + m_pBone->m_nMaxBone;
	
	int		i;
	for( i = 0; i < m_pBone->m_nMaxBone; i ++ )
	{
		m_mUpdateBone[i] = m_pBone->m_pBones[i].m_mTM;		// 기본셋은 미리 카피해둠.
		m_pBaseBoneInv[i] = m_pBone->m_pBones[i].m_mInverseTM;	// Inv도 미리 받아둠.
	}
	return SUCCESS;
}
Beispiel #6
0
//
// 지정된영역의 백버퍼데이타를 읽어서 surface에 옮긴다.
// GL은 프론트만 읽을수 있는줄알았는데 반대였다. 백버퍼만 읽을수 있다
// w,y,width,height: 스크린 좌표
void	XGraphicsOpenGL::ScreenToSurface( int x, int y, int width, int height, XSurface *pSurface )
{
	if( GetPixelFormat() != xPIXELFORMAT_RGB565 )
		XERROR( "아직은 RGB565포맷만 사용가능함." );
	int px, py, pw, ph;		// 물리적스크린크기와 좌표.
	float fRatioX, fRatioY;
	// phyScreen과 screen의 비율로 좌표들을 변환.
	fRatioX = (float)GetPhyScreenWidth() / GetScreenWidth();
	fRatioY = (float)GetPhyScreenHeight() / GetScreenHeight();
	px = x * fRatioX;		py = y * fRatioY;	// screen->physcreen 좌표로 변환
	pw = width * fRatioX;	ph = height * fRatioY;
	//GL_NO_ERROR
	DWORD *pdwBuffer = new DWORD[ pw * ph ];	
	glReadPixels(px, py, pw, ph, GL_RGBA, GL_UNSIGNED_BYTE, pdwBuffer );	// 위아래 뒤집혀진 이미지
	DWORD *pDst = new DWORD[ pw * ph ];
    // 위아래를 바꿈
	for( int i = 0; i < ph; i ++ )
		for( int j = 0; j < pw; j ++ )
			pDst[ i * pw + j ] = pdwBuffer[ (ph-1-i) * pw + j ];	
	SAFE_DELETE_ARRAY( pdwBuffer );
	
    
	pSurface->Create( pw, ph, 0, 0, xALPHA, pDst, sizeof(DWORD), 0, 0 );
#pragma messages( "pdwBuffer를 XSurfaceOpenGL::Create()내부에서 뽀개주도록 바꿔야 한다. 버그날까봐 일단 이상태로 놔둠" )
}
Beispiel #7
0
//
//	LoadMotion
// 오브젝트를 로딩하지않고도 독립적으로 동작해야한다.
// 
int		CModelObject::LoadMotion( LPCTSTR szFileName )
{
	int		i;
	// 본이 아직 할당 되어 있지 않으면 애니를 읽을수 없다.
	if( m_pBone == NULL )		
	{
#ifdef	__XDEBUG
		XERROR( "%s : 본을 로딩하지 않고 모션을 읽음", szFileName );
#endif
		return FAIL;
	}
	m_pMotionOld = m_pMotion;		// 예전 모션받아둠.
	m_nFrameOld = (int)m_fFrameCurrent;
	// Motion관리자를 통해 동작을 로딩한후 그 포인터를 받아온다.
	m_pMotion = g_MotionMng.LoadMotion( szFileName );
	if( m_pMotion == NULL )		// 모션을 못읽었다.
	{
		return FAIL;
	}
	if( m_pMotionOld == NULL )
		m_pMotionOld = m_pMotion;		// 이전프레임이 없으면 현재 프레임을 Old로 쓴다.  NULL이 되는상황이 없게 할것.

	InitAnimate();

	m_nFrameMax = m_pMotion->GetMaxFrame();
	m_fPerSlerp = (float)((int)(m_pMotion->m_fPerSlerp * 1000.0f)) / 1000.0f;		// 소숫점 3째 이하에서 오차가 생길수 있으므로 3째까지 에서 잘라버린다,.
//	m_vLastKeyPos = Vec3( 65535.0f, 65535.0f, 65535.0f );
//	m_vLastPath.x = m_vLastPath.y = m_vLastPath.z = 0;

  #ifdef __XDEBUG
	if( m_pMotionOld->m_nMaxBone != m_pMotion->m_nMaxBone )		// 이전에 읽은 모션의 본개수와 다르면 에러냄.
	{
		XERROR( "CModelObject::LoadElement - %s가 사용하는 뼈대개수(%d)가 이전에 읽은 뼈대개수(%d)와 다르다.", szFileName, m_pMotion->m_nMaxBone, m_pMotionOld->m_nMaxBone );
	}
  #endif

//	if( m_mUpdateBone == NULL )		// 모션을 재로딩을 할 수 있으므로 이미 할당 받았으면 다시 받지 않음.
//		m_mUpdateBone = new MATRIX[ m_pMotion->m_nMaxBone ];
	
	// 이미 스킨 오브젝트가 로딩되어 있는 상태면 m_mUpdateBone을 그 오브젝트에 등록시킴.
	for( i = 0; i < MAX_ELEMENT; i ++ )
	{
		if( m_Element[i].m_pObject3D )
			m_Element[i].m_pObject3D->SetExternBone( m_mUpdateBone, m_pBaseBoneInv );	// 함수내부에서 스킨인넘만 등록시킨다.
	}
	return SUCCESS;
}
Beispiel #8
0
BOOL XBaseProp::Load( LPCTSTR szFilename, XE::xtENCODING encode )
{
	CToken token;
	if( token.LoadFile( szFilename, XE::TXT_UTF16 ) == xFAIL )
	{
		XERROR( "%s 읽기 실패", szFilename );
		return FALSE;
	}
	return LoadBlock( token, NULL, NULL );
}
Beispiel #9
0
// 바이너리 포맷으로 읽기
XE::xRESULT	CDefine :: LoadBIN( LPCTSTR szFileName )
{
	int		nNum = 0;
	int		nLen = 0;
	TCHAR buff[256];
	int		nMaxDef = 0;

	XResFile file, *pRes = &file;
	if( pRes->Open( szFileName, XBaseRes::xREAD ) == 0 ) {
		XERROR( "%s가 없다", szFileName );
		return XE::xFAIL;
	}
		
//	FILE	*fp = _tfopen( szFileName, _T("rb") );
//	if( fp == NULL )	
//	{
//		XERROR( "%s가 없다", szFileName );
//		return XE::xFAIL;
//	}

	int		i;
//	DEFINE	*pList = m_pList;

	memset( buff, 0, 256 );
	pRes->Read( &nMaxDef, 4 );
	for( i = 0; i < nMaxDef; i ++ )
	{
		pRes->Read( &nLen, 4 );
		pRes->Read( buff, nLen );
		pRes->Read( &nNum, 4 );
		if( XE::xFAIL == AddDefine( buff, nNum ) )			// define 추가
		{
			XERROR( "%s 읽던중 CDefine의 최대 버퍼%d를 넘었다", szFileName, MAX_DEFINE );
			break;
		}
	}

#ifdef	_LE
	g_pWatchView->Message( "%s 로딩완료", szFileName );
#endif

	return XE::xSUCCESS;
}
Beispiel #10
0
// 백버퍼의 픽셀을 읽어서 pBuffer에 담아줌.
// m_nWidth는 논리적서피스의 크기이고 work와 같고, back,frame 버퍼는 실제물리적 해상도인것으로 구분해줄 필요 있다.
void*	XGraphicsOpenGL::ReadBackBuffer( int phywidth, int phyheight, void *pBuffer )
{
	if( GetPixelFormat() != xPIXELFORMAT_RGB565 )
		XERROR( "아직은 RGB565포맷만 사용가능함." );

//	glReadBufferOES( GL_BACK );	// gl1.2 ES엔 없는듯.
    // gl1.x에선 프론트가 아니고 백버퍼만 읽을수 있는듯 하다. 잘못알고 있었음-_-;;
	glReadPixels(0, 0, phywidth, phyheight, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pBuffer );
	return pBuffer;
}
Beispiel #11
0
// pLayer가 널이면 레이어를 초기화 상태로 만든다.
XBaseLayer *XActObj::CreateLayer( int idx, xSpr::xtLayer type, int nLayer, float fAdjAxisX, float fAdjAxisY )
{
	const XE::VEC2 vAdjAxis( fAdjAxisX, fAdjAxisY );
#ifdef _XDEBUG
	if( idx >= m_nNumLayers ) {
		XLOG( "%s id=%d ACT %s(%d) idx(%d) >= m_nNumLayers(%d)", m_pSprObj->GetSprFilename(), m_pSprObj->GetdwID(),
					m_pAction->GetszActName(), m_pAction->GetID(), idx, m_nNumLayers );
		return NULL;
	}

#endif

	XBaseLayer *pLayer = nullptr;
	{
		// 이거 나중에 XBaseLayer의스태틱 함수로 집어넣자. 안그러면 레이어종류가 추가될때마다 일일히 이런곳 찾아서 수정해줘야 한다
		switch( type ) {
		case xSpr::xLT_IMAGE:
			pLayer = new XLayerImage;
			((XLayerImage *)pLayer)->SetvAdjAxis( vAdjAxis );
			break;
		case xSpr::xLT_OBJ:
			pLayer = new XLayerObject;
			((XLayerObject *)pLayer)->SetvAdjAxis( vAdjAxis );
			break;
		case xSpr::xLT_SOUND:
			pLayer = new XLayerSound;
			break;
		case xSpr::xLT_EVENT:
			// 이벤트레이어는 게임에서 생성시킬 필요 없다
			break;
		case xSpr::xLT_DUMMY:
			pLayer = new XLayerDummy;
			((XLayerMove *)pLayer)->SetvAdjAxis( vAdjAxis );
			break;
		case xSpr::xLT_PARTICLE: {
			pLayer = new XLayerParticle( m_pSprObj );
			((XLayerMove *)pLayer)->SetvAdjAxis( vAdjAxis );
		} break;
		default:
			pLayer = NULL;
			XERROR( "layer 생성타입이 잘못되었음. %d", (int)type );
			break;
		}
		if( pLayer ) {
			pLayer->SetnLayer( nLayer );								// 지정한 레이어번호로 생성
		}
		m_ppLayers[idx] = pLayer;		// 널이 들어갈수도 있다
	}
	return pLayer;
}
Beispiel #12
0
BOOL XGraphicsOpenGL::LoadImg( LPCTSTR szFilename, int *pWidth, int *pHeight, DWORD **ppImage )
{
	
	XImage image(TRUE);
	BOOL bRet = FALSE;
	if( image.Load( szFilename ) ) {
		*pWidth = image.GetMemWidth();
		*pHeight = image.GetMemHeight();
		if( (*pWidth) & 1 ) {
			XERROR( "경고: %s의 가로크기가 2로 나누어 떨어지지 않습니다", szFilename );
		}
		DWORD **pp = (DWORD **)ppImage;
		image.MovePtr( pp );
		*ppImage = (DWORD *)*pp;
		bRet = TRUE;
	}
	return bRet;
}
Beispiel #13
0
void HttpService::start()
{
    QCoreApplication *app = application();

    quint16 port = (app->argc() > 1) ?
        QString::fromLocal8Bit(app->argv()[1]).toUShort() : m_listenPort;
    daemon = new HttpBridger(port, app);

    if (!daemon->isListening()) {
        XERROR("Failed to bind to port %d", daemon->serverPort());
        app->quit();
    }

    if (Configer::getFirsttime())
    {
        //默认设置为自动开启
        setStartupType(QtServiceController::AutoStartup);
        Configer::setFirstTime(false);
    }
}
Beispiel #14
0
BOOL XPropHero::ReadProp( CToken& token )
{

	ID idProp = TokenGetNumber( token );
	if( GetpProp( idProp ) )
	{
		XERROR( "%s: duplication Mob ID. %d", GetstrFilename().c_str(), idProp );
		return FALSE;
	}
	if( idProp == TOKEN_EOF )
		return FALSE;		// false를 리턴해야 루프를 빠져나옴
	
	xPROP *pProp = new xPROP;		
	pProp->idProp = idProp;				// ID
	XBREAK( pProp->idProp > 0xffff );		// 이렇게 큰숫자를 쓰는건 권장하지 않음.
	
	pProp->strIdentifier = GetTokenIdentifier( token );					// 식별자
	int idText			= TokenGetNumber( token );						// 텍스트 ID
	pProp->strName		= XTEXT(idText);								// 이름
	pProp->attack		= token.GetNumberF();							// 공격력
	pProp->defense		= token.GetNumberF();							// 방어력
	pProp->hp			= token.GetNumberF();							// 체력
	pProp->attackSpeed	= token.GetNumberF();							// 공격속도
	pProp->moveSpeed		= token.GetNumberF();							// 이동속도
	
	pProp->strSpr = GetTokenString( token );							// spr 파일
	if( pProp->strSpr.empty() == false )
		pProp->strSpr += _T(".spr");
	else
		CONSOLE( "warning: identifier=%s, szSpr is empty", pProp->strIdentifier.c_str() );
	pProp->strIcon = GetTokenString( token );							// 아이콘 파일
	if( pProp->strIcon.empty() == false )
		pProp->strIcon += _T(".png");

	// 추가
	Add( pProp->strIdentifier, pProp );

	return TRUE;
}
Beispiel #15
0
evsql_err_t evsql_result_begin (struct evsql_result_info *info, struct evsql_result *res) {
    struct evsql_item_info *col;
    size_t cols = 0, nrows;
    err_t err;

    // count info columns
    for (col = info->columns; col->type; col++)
        cols++;

    // number of rows returned/affected
    nrows = evsql_result_rows(res) || evsql_result_affected(res);

    // did the query fail outright?
    if (res->error)
        // dump error message
        NXERROR(err = EIO, evsql_result_error(res));

/*
    // SELECT/DELETE/UPDATE WHERE didn't match any rows -> ENOENT
    if (nrows == 0)
        XERROR(err = ENOENT, "no rows returned/affected");
*/

    // correct number of columns
    if (evsql_result_cols(res) != cols)
        XERROR(err = EINVAL, "wrong number of columns: %zu, should be %zu", evsql_result_cols(res), cols);
    
    // assign
    res->info = info;
    res->row_offset = 0;

    // good
    return 0;

error:
    return err;

}
Beispiel #16
0
// Define내용을 모두 bin으로 저장
XE::xRESULT	CDefine :: SaveBIN( LPCTSTR szFileName )
{
	int		nLen = 0;

	XResFile file, *pRes = &file;
	if( pRes->Open( szFileName, XBaseRes::xWRITE ) == 0 )
	{
		XERROR( "%s open failed", szFileName );
		return XE::xFAIL;
	}
/*
	FILE	*fp = _tfopen( szFileName, _T("wb") );
	if( fp == NULL )	
	{
//		XERROR( "%s open failed", GetLastMakePath() );
		XERROR( "%s open failed", szFileName );
		return XE::xFAIL;
	}
*/
	int		i;
	DEFINE	*pList = m_pList;

	pRes->Write( &m_nMaxDef, 4 );
	for( i = 0; i < m_nMaxDef; i ++ )
	{
		nLen = _tcslen(pList[i].m_strName) + 1;
		pRes->Write( &nLen, 4 );						// strlen
		pRes->Write( pList[i].m_strName, nLen );		// Name
		pRes->Write( &pList[i].m_nValue, 4 );		// Value
	}

#ifdef	_LE
	g_pWatchView->Message( "%s 저장완료", szFileName );
#endif

	return XE::xSUCCESS;
}
Beispiel #17
0
/*
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
만약에 Render했는데 화면에 안나온다!!! 그러면!
static VECTOR4 vConst( 1.0f, 1.0f, 1.0f, 100.0f );
m_pd3dDevice->SetVertexShaderConstantF( 95, (float*)&vConst, 1 );
SetTransformView( matView );
SetTransformProj( matProj );
SetDiffuse( 1.0, 1.0, 1.0 );
SetAmbient( 1.0, 1.0, 1.0 );

이걸 렌더 하기전에 불러줬는지 확인해라!!!!!!!!!!!!!!!!!!!!! 크아아악!
좆도 고생했네!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
 */
BOOL		CModelObject::Render( const MATRIX *mWorld )
{
	CObject3D	*pObject3D;
	O3D_ELEMENT	*pElem;
	int		i;
	int		nNextFrame;
	MATRIX m1;

#ifdef	_DEBUG
	if( m_nLoop == 0 )
		XERROR( "경고 : %s : CModelObject::m_nLoop가 지정되지 않았다.", m_pMotion->m_szName );
#endif

	if( m_pMotion )		// m_pMotion이 널이라면 m_mUpdateBone도 널이다.
		m_pMotion->AnimateBone( m_mUpdateBone, m_pMotionOld, m_fFrameCurrent, GetNextFrame(), m_nFrameOld, m_bMotionBlending, m_fBlendWeight );		// 일단 뼈대가 있다면 뼈대 애니메이션 시킴
//		AnimateBone( NULL );		// 일단 뼈대가 있다면 뼈대 애니메이션 시킴

	if( m_pBone )		// m_pBone이 있다면 뼈대가 있다는 얘기. VS를 써야 한다.
	{
		MATRIX *pmBones;
		MATRIX m1;
		MATRIX *pmBonesInv = m_pBaseBoneInv ;
		pmBones = m_mUpdateBone;

		if( m_pBone->m_bSendVS )	// 뼈대개수가 MAX_VS_BONE이하라서 한번에 다 전송한다.
		{
			int		nMaxBone = m_pBone->m_nMaxBone;
			const MATRIX *pmView = GetTransformView();
#ifdef	__XDEBUG
			if( nMaxBone > MAX_VS_BONE )	
				XERROR( "CModelObject::Render : 뼈대개수가 최대치를 초과했다. %d", nMaxBone );
#endif
			for( i = 0; i < nMaxBone; i ++ )	// MAX_VS_BONE개 이하	
			{
				MatrixMultiply( m1, pmBonesInv[i], pmBones[i] );
				
				glCurrentPaletteMatrixOES( i );
				MatrixMultiply( m1, m1, *mWorld );
				MatrixMultiply( m1, m1, *pmView );
				glLoadMatrixf( m1.f );
				
			}
		}
/*		
		MATRIX	mView, mProj;
		MATRIX	mViewProj, mViewProjTranspose, mInvWorld;

		VECTOR4 vLight = s_vLight;
		VECTOR4 vLightPos = s_vLightPos;

		mViewProj = *mWorld * s_mView * s_mProj;
		
		MATRIXTranspose( &mViewProjTranspose, &mViewProj );
		MATRIXTranspose( &mWorldTranspose, mWorld );

		MATRIXInverse( &mInvWorld, NULL, mWorld );
		Vec4Transform( &vLight, &vLight, &mInvWorld );
		Vec4Normalize( &vLight, &vLight );
		Vec4Transform( &vLightPos, &vLightPos, &mInvWorld );
//		Vec4Transform( &vEyePos, &vEyePos, &mInvWorld );

		m_pd3dDevice->SetVertexShaderConstantF( 84, (float*)&mViewProjTranspose, 4 );
//		m_pd3dDevice->SetVertexShaderConstantF( 88, (float*)&mWorldTranspose, 4 );
//		m_pd3dDevice->SetVertexShaderConstantF( 88, (float*)&vEyePos,  1 );		// specular use
//		m_pd3dDevice->SetVertexShaderConstantF( 89, (float*)&fSpecular, 1 );	// specular use
//		m_pd3dDevice->SetVertexShaderConstantF( 90, (float*)&fLightCol, 1 );	// specular use
		m_pd3dDevice->SetVertexShaderConstantF( 91, (float*)&vLightPos, 1 );
		m_pd3dDevice->SetVertexShaderConstantF( 92, (float*)&vLight,   1 );
		m_pd3dDevice->SetVertexShaderConstantF( 93, (float*)&s_fDiffuse, 1 );
		m_pd3dDevice->SetVertexShaderConstantF( 94, (float*)&s_fAmbient, 1 );
//		m_pd3dDevice->SetVertexShaderConstant( 95, &vConst, 1 );
 */
	}
/*
*/
	if( m_nNoEffect == 0 )
	{
		// 기본 설정 
//		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
//		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
//		pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
		
//		pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );
		glAlphaFunc( GL_GEQUAL, 0 );
		glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
//		pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL   );		
//		pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA  );
//		pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
		
	}
	DWORD dwBlendFactor = m_dwColor | ( m_dwBlendFactor << 24 );
	//DWORD dwBlendFactor = 0xffff0000 ;//| ( m_dwBlendFactor << 24 );
	// 오브젝트의 반투명 효과 세팅 
	if( m_dwBlendFactor < 255 || m_dwColor )
	{
		const GLfloat fAmbient[] = { 0, 0, 0, 1.0f };
		const GLfloat fDiffuse[] = { 1.0f, 1.0f, 1.0f, (float)((dwBlendFactor>>24)&0xff)/255.0f };
		glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, fAmbient );
		glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, fDiffuse );
		glEnable( GL_BLEND );
		glEnable( GL_ALPHA_TEST );
	} else 
	{
Beispiel #18
0
//
//	오브젝트 로딩.  모션을 읽지 않은 상태에서도 독립적으로 동작한다.
//
int		CModelObject::LoadElement( LPCTSTR szFileName, int nParts )
{
	CObject3D	*pObject3D;
	O3D_ELEMENT	*pElem;
#ifdef __XDEBUG
	if( nParts < 0 )
	{
		XERROR( "CModelObject::LoadElement : nParts 에러 - nParts = %d, %s", nParts, szFileName );
		return FAIL;
	}
	if( nParts >= MAX_ELEMENT )
		return FAIL;
//		XERROR( "CModelObject::LoadElement : nParts 에러 - nParts = %d, %s", nParts, szFileName );
#endif

	Destroy( nParts );

		
	pObject3D = g_Object3DMng.LoadObject3D( szFileName );
	//TRACE( "new Object 3D%p\n", pObject3D);
	
	if( pObject3D == NULL )
	{
		XERROR( "%s : 찾을 수 없음", MakePath( DIR_MODEL, szFileName ) );
		return FAIL;
	}

	// 스킨파츠의 경우 외부본을 읽었는지 검사.
	if( pObject3D->IsUseExternBone() )		// 외장본을 사용하는 오브젝이다.
	{
		if( m_pBone == NULL )			// 본을 아직 안읽은 상태다...
		{
#ifdef	__XDEBUG
			XERROR( "%s : 본을 로딩하지 않고 메쉬를 읽음", szFileName );		// 에러...
#endif
			return FAIL;
		}
	}
	
	pElem = &m_Element[ nParts ];
	pElem->m_pObject3D = pObject3D;
	

	memset( &g_szLastFile, 0, sizeof(char)*512 );
	strcpy( g_szLastFile, szFileName );

	if( pObject3D->GetGMOBJECT() == NULL )
	{
		XERROR( "CModelObject::LoadElement에서 튕김 : 읽은 파일명 %s", MakePath( DIR_MODEL, szFileName ) );
		return FAIL;
	}
	
	if( pObject3D->GetGMOBJECT()->m_bOpacity )
		m_dwRenderEffect = REFF_ALPHA;
//	if( pObject3D->GetGMOBJECT()->m_bReflection )
//		m_dwRenderEffect = REFF_REFLECT;
	m_bCollObj = pObject3D->IsHaveCollObj();
	if( pObject3D->m_nHavePhysique )	m_bSkin = TRUE;

	if( m_nFrameMax > 0 )	// 이미 모션이나 오브젝을 읽어서 maxframe이 있을때 이번에 읽은 오브젝틔 maxframe하고 비교. 틀리면 에러.
	{
		if( pObject3D->GetMaxFrame() )
			if( m_nFrameMax != pObject3D->GetMaxFrame() )
			{
				XERROR( "CModelObject::LoadElement - %s의 MaxFrame(%d)과 이전에 읽은 MaxFrame(%d)이 다르다.", szFileName, pObject3D->GetMaxFrame(), m_nFrameMax );
			}
	}
	if( m_nFrameMax == 0 )	// maxframe이 세팅된적이 없을때만 최초 세팅함.
		m_nFrameMax = pObject3D->GetMaxFrame();

	// 애니메이션 속도
	m_fPerSlerp = (float)((int)(pObject3D->m_fPerSlerp * 1000.0f)) / 1000.0f;		// 소숫점 3째 이하에서 오차가 생길수 있으므로 3째까지 에서 잘라버린다,.


	// 이미 본이 로딩되어 있는 상태면 m_pUpdateBone을 오브젝트의 외부뼈대로 등록함.
	if( m_pBone )
		pObject3D->SetExternBone( m_mUpdateBone, m_pBaseBoneInv );


	// 새로 읽은 Mesh의  BB를 기준으로 CModelObject의 BB를 갱신
	// 이부분계산은 현재 정확하지 않다.  Min,Max모두 Local기준인데다가
	// 사람이 창을 쥐고 있을경우 창까지 바운딩 박스에 포함되고 있다.
	if( pObject3D->m_vBBMin.x < m_vMin.x )	m_vMin.x = pObject3D->m_vBBMin.x;
	if( pObject3D->m_vBBMin.y < m_vMin.y )	m_vMin.y = pObject3D->m_vBBMin.y;
	if( pObject3D->m_vBBMin.z < m_vMin.z )	m_vMin.z = pObject3D->m_vBBMin.z;
	if( pObject3D->m_vBBMax.x > m_vMax.x )	m_vMax.x = pObject3D->m_vBBMax.x;
	if( pObject3D->m_vBBMax.y > m_vMax.y )	m_vMax.y = pObject3D->m_vBBMax.y;
	if( pObject3D->m_vBBMax.z > m_vMax.z )	m_vMax.z = pObject3D->m_vBBMax.z;
	SetBB( m_BB.m_vPos, m_vMin, m_vMax );


	// 읽어온 엘리먼트는 this의 뼈대에 부모지정이 안되어 있게 한다.
	// 만약 칼을 읽어왔다면 수동으로 SetParent()하도록 한다.
	pElem->m_nParentIdx = -1;
/*	
	// 읽은 오브젝트가 부모인덱스를 가진다면 그것을 지정함.
	// 일반적으로 오른손이 부모로 되어 있다.
	int nParentIdx = pObject3D->GetGMOBJECT()->m_nParentIdx;
	if( nParentIdx != -1 )
		SetParent( nParts, nParentIdx );
	else
		pElem->m_nParentIdx = -1;
*/
	if( pObject3D->m_nHavePhysique )	// 피지크를 가지고 있다면 스킨은 버텍스버퍼를 따로 가짐
	{
#ifdef __XDEBUG
		if( pElem->m_pnGL_VB )
			XLOG( "CModelObject::LoadElement: %s pElem->m_pnGL_VB가 남아 있다", szFileName );
#endif
		int nTotal = 0;
		pObject3D->SetLOD(0);	nTotal += pObject3D->GetMaxObject();
		pObject3D->SetLOD(1);	nTotal += pObject3D->GetMaxObject();
		pObject3D->SetLOD(2);	nTotal += pObject3D->GetMaxObject();
		pObject3D->SetLOD(0);
		
		if( nTotal <= 0 )
			XERROR( "%s LoadElement : nTotal=%d", pObject3D->m_szFileName, nTotal );

		pElem->m_pnGL_VB = new GLuint[ nTotal ];
		memset( pElem->m_pnGL_VB, 0, sizeof(GLuint) * nTotal );
		GLuint *pnGL_VB = pElem->m_pnGL_VB;
		pObject3D->SetLOD(0);		pElem->m_pnGL_VB1 = pnGL_VB;		pnGL_VB += pObject3D->GetMaxObject();
		pObject3D->SetLOD(1);		pElem->m_pnGL_VB2 = pnGL_VB;		pnGL_VB += pObject3D->GetMaxObject();
		pObject3D->SetLOD(2);		pElem->m_pnGL_VB3 = pnGL_VB;		
		pObject3D->SetLOD(0);
		pElem->m_pnGL_VBSel = pElem->m_pnGL_VB1;
	}
	
	// 버텍스 버퍼 생성
//	if( pObject3D->GetGMOBJECT()->m_Type == GMT_SKIN )
//		pObject3D->RestoreDeviceObjects( D3DPOOL_SYSTEMMEM );		// 이걸 여기서 하면 안되는 이유가 있어서 안한건데 그 이유가 기억이 안난다 -_-;;;
//	else
		pObject3D->RestoreDeviceObjects( pElem->m_pnGL_VB );		// 이걸 여기서 하면 안되는 이유가 있어서 안한건데 그 이유가 기억이 안난다 -_-;;;
	return SUCCESS;
}
Beispiel #19
0
/**
 @brief openGL 디바이스 텍스쳐를 생성하고 pSrc의 이미지를 로딩시킨다.
*/
GLuint XGraphicsOpenGL::CreateTextureGL( void* const pImgSrc
																			, int wSrc, int hSrc
																			, XE::xtPixelFormat formatImgSrc
																			, int wSrcAligned, int hSrcAligned
																			, XE::xtPixelFormat formatSurface ) const
{
	
	//	XBREAK( pImgSrc == nullptr );
	const int bppImgSrc = XE::GetBpp( formatImgSrc );
	const int bppSurface = XE::GetBpp( formatSurface );
	const auto glFormatSurface = XGraphicsOpenGL::sToGLFormat( formatSurface );
	const auto glTypeSurface = XGraphicsOpenGL::sToGLType( formatSurface );
	XBREAK( pImgSrc && bppImgSrc == 2 );		// 아직 16bit픽셀소스는 지원하지 않음.
	GLuint idTexture = 0;
	glGenTextures( 1, &idTexture );
	CHECK_GL_ERROR();
	
	if( idTexture == 0 ) {
		XERROR( "failed create texture: sizeSrc(%d,%d)", wSrc, hSrc );
		return 0;
	}
	XGraphicsOpenGL::sBindTexture( idTexture );
	CHECK_GL_ERROR();
	const int sizeSrcAligned = wSrcAligned * hSrcAligned;
	//////////////////////////////////////////////////////////////////////////
	if( bppSurface == 4 ) {
		DWORD *temp = nullptr;
		if( pImgSrc ) {
			// gl텍스쳐로 쓰기 위해 정렬된 사이즈의 메모리에 이미지를 복사
			DWORD* _temp = temp = new DWORD[sizeSrcAligned];
			memset( _temp, 0, sizeSrcAligned * bppSurface );
			int i, j;
			DWORD *src = (DWORD* const)pImgSrc;
			for( i = 0; i < hSrc; i++ ) {
				for( j = 0; j < wSrc; j++ ) {
					*_temp++ = *src++;
				}
				_temp += (wSrcAligned - wSrc);
			}
		}
		glTexImage2D( GL_TEXTURE_2D,
									0,
									GL_RGBA,
									wSrcAligned,
									hSrcAligned,
									0,
									GL_RGBA,
									GL_UNSIGNED_BYTE,
									temp );
		s_glFmt = GL_RGBA;
		s_glType = GL_UNSIGNED_BYTE;
#ifdef _DEBUG
		auto glErr = glGetError();
		XASSERT( glErr == GL_NO_ERROR );
#endif // _DEBUG
		SAFE_DELETE_ARRAY( temp );
	} else
	//////////////////////////////////////////////////////////////////////////
	if( bppSurface == 2 ) {
		WORD *pDst = nullptr;
			// gl텍스쳐로 쓰기 위해 정렬된 사이즈의 메모리에 이미지를 복사
		if( pImgSrc ) {
			WORD *_pDst = pDst = new WORD[ sizeSrcAligned ];
			memset( _pDst, 0, sizeSrcAligned * bppSurface );
			if( formatSurface == XE::xPF_RGB565 
				|| formatSurface == XE::xPF_RGB555 ) {
				XE::ConvertBlockABGR8888ToRGB565( pDst, wSrcAligned, hSrcAligned, (DWORD*)pImgSrc, wSrc, hSrc );
			} else
			if( formatSurface == XE::xPF_ARGB4444 ) {
				// 현재 WIN32 opengl에서는 RGBA4444로 넘겨야 제대로 나오지만 기기 opengl에서는 어떤게 맞는지 알수없음. 아마도 같지 않을까 함.
				XE::ConvertBlockABGR8888ToRGBA4444( pDst, wSrcAligned, hSrcAligned, (DWORD*)pImgSrc, wSrc, hSrc );
			} else
			if( formatSurface == XE::xPF_ARGB1555 ) {
				XE::ConvertBlockABGR8888ToRGBA1555( pDst, wSrcAligned, hSrcAligned, (DWORD*)pImgSrc, wSrc, hSrc );
			} else {
				XBREAK(1);
			}
		}
		const auto glFormatImgSrc = glFormatSurface;
		const auto glTypeSrc = glTypeSurface;
		glTexImage2D( GL_TEXTURE_2D,
									0,
									glFormatSurface,		// internal format
									wSrcAligned,
									hSrcAligned,
									0,
									glFormatImgSrc,	// pImgSrc의 포맷이지만 위에거랑 맞춰야 해서 같은걸 씀.
									glTypeSrc,
									pDst );
		s_glFmt = glFormatSurface;
		s_glType = glTypeSrc;
		CHECK_GL_ERROR();
		SAFE_DELETE_ARRAY( pDst );
	}
// 	XGraphicsOpenGL::sBindTexture( 0 );
	CHECK_GL_ERROR();
	
	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_CLAMP_TO_EDGE );
	glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
	//
//	XSurface::sAddSizeTotalVMem( sizeSrcAligned * bppSurface );
	CHECK_GL_ERROR();
	
	//
	return idTexture;
} // CreateTextureGL
Beispiel #20
0
int		CDefine :: SaveOBJECT( LPCTSTR szFileName )
{
	// 백업
	char	buff[256];
	strcpy( buff, MakePath(SCRIPT_DIR, "DefineObject.h02") );	CopyFile( buff, MakePath(SCRIPT_DIR, "DefineObject.h03"), FALSE );		// 백업
	strcpy( buff, MakePath(SCRIPT_DIR, "DefineObject.h01") );	CopyFile( buff, MakePath(SCRIPT_DIR, "DefineObject.h02"), FALSE );		// 백업
	strcpy( buff, MakePath(SCRIPT_DIR, "DefineObject.h") );		CopyFile( buff,   MakePath(SCRIPT_DIR, "DefineObject.h01"), FALSE );		// 백업


	FILE	*fp = fopen( MakePath(SCRIPT_DIR, szFileName), "wt" );
	if( fp == NULL )	
	{
		XERROR( "%s open failed", GetLastMakePath() );
		return FAIL;
	}

	fprintf( fp, "#ifndef		__DEFINEOBJECT_H__\n" );
	fprintf( fp, "#define		__DEFINEOBJECT_H__\n" );
	fprintf( fp, "\n" );

	fprintf( fp, "// #define name은 64자를 넘지 말것\n" );
	fprintf( fp, "// 이 파일은 LE에서 자동으로 저장된다.\n" );
	fprintf( fp, "\n" );

	fprintf( fp, "// 아무것도 없는 오브젝트\n" );
	fprintf( fp, "#define		OBJECT_EMPTY		0\n" );
	fprintf( fp, "\n" );

	int		i;
	DEFINE	**pList;

	pList = m_pFriend;
	fprintf( fp, "// 주인공\n" );
	for( i = 0; i < m_nMaxFriend; i ++ )
	{
		fprintf( fp, "#define \t" );						// #define
		fprintf( fp, "%s",	pList[i]->m_strName );			// OBJECT_DAO
		AutoTab( fp , strlen(pList[i]->m_strName) );
		fprintf( fp, "%d",		pList[i]->m_nValue );		// 1
		fprintf( fp, "\t\t// %s", pList[i]->m_szRemark );	// 주석
		fprintf( fp, "\n" );
	}
	fprintf( fp, "\n" );

	pList = m_pEnemy;
	fprintf( fp, "// 몬스터\n" );
	for( i = 0; i < m_nMaxEnemy; i ++ )
	{
		fprintf( fp, "#define \t" );					// #define
		fprintf( fp, "%s",	pList[i]->m_strName );		// OBJECT_DAO
		AutoTab( fp , strlen(pList[i]->m_strName) );
		fprintf( fp, "%d",		pList[i]->m_nValue );		// 1
		fprintf( fp, "\t\t// %s", pList[i]->m_szRemark );	// 주석
		fprintf( fp, "\n" );
	}
	fprintf( fp, "\n" );

	pList = m_pWeapon;
	fprintf( fp, "// 공격무기류 \n" );
	for( i = 0; i < m_nMaxWeapon; i ++ )
	{
		fprintf( fp, "#define \t" );					// #define
		fprintf( fp, "%s",	pList[i]->m_strName );		// OBJECT_DAO
		AutoTab( fp , strlen(pList[i]->m_strName) );
		fprintf( fp, "%d",		pList[i]->m_nValue );		// 1
		fprintf( fp, "\t\t// %s", pList[i]->m_szRemark );	// 주석
		fprintf( fp, "\n" );
	}
	fprintf( fp, "\n" );

	pList = m_pItem;
	fprintf( fp, "// 아이템 \n" );
	for( i = 0; i < m_nMaxItem; i ++ )
	{
		fprintf( fp, "#define \t" );					// #define
		fprintf( fp, "%s",	pList[i]->m_strName );		// OBJECT_DAO
		AutoTab( fp , strlen(pList[i]->m_strName) );
		fprintf( fp, "%d",		pList[i]->m_nValue );		// 1
		fprintf( fp, "\t\t// %s", pList[i]->m_szRemark );	// 주석
		fprintf( fp, "\n" );
	}
	fprintf( fp, "\n" );

	pList = m_pEtc;
	fprintf( fp, "// ETC object \n" );
	for( i = 0; i < m_nMaxEtc; i ++ )
	{
		fprintf( fp, "#define \t" );					// #define
		fprintf( fp, "%s",	pList[i]->m_strName );		// OBJECT_DAO
		AutoTab( fp , strlen(pList[i]->m_strName) );
		fprintf( fp, "%d",		pList[i]->m_nValue );		// 1
		fprintf( fp, "\t\t// %s", pList[i]->m_szRemark );	// 주석
		fprintf( fp, "\n" );
	}
	fprintf( fp, "\n" );

	pList = m_pIA;
	fprintf( fp, "// Interact object\n" );
	for( i = 0; i < m_nMaxIA; i ++ )
	{
		fprintf( fp, "#define \t" );					// #define
		fprintf( fp, "%s",	pList[i]->m_strName );		// OBJECT_DAO
		AutoTab( fp , strlen(pList[i]->m_strName) );
		fprintf( fp, "%d",		pList[i]->m_nValue );		// 1
		fprintf( fp, "\t\t// %s", pList[i]->m_szRemark );	// 주석
		fprintf( fp, "\n" );
	}
	fprintf( fp, "\n" );


	fprintf( fp, "#endif\n" );


	pRes->Close();
#ifdef	_LE
	g_pWatchView->Message( "%s 저장완료", szFileName );
#endif

	return SUCCESS;
}
Beispiel #21
0
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;
}
Beispiel #22
0
int evsql_result_next (struct evsql_result *res, ...) {
    va_list vargs;
    struct evsql_item_info *col;
    size_t col_idx, row_idx = res->row_offset;
    err_t err;
    
    // ensure that evsql_result_begin has been called
    assert(res->info);
    
    // check if we're past the end
    if (row_idx >= evsql_result_rows(res))
        return 0;
    
    // varargs
    va_start(vargs, res);

    for (col = res->info->columns, col_idx = 0; col->type; col++, col_idx++) {
        const char *value = NULL;
        size_t length = 0;
        
        // check for NULLs, then try and get the field value
        if (evsql_result_null(res, row_idx, col_idx)) {
            if (!col->flags.null_ok)
                XERROR(err = EINVAL, "r%zu:c%zu: NULL", row_idx, col_idx);

        } else if (evsql_result_field(res, row_idx, col_idx, &value, &length)) {
            SERROR(err = EINVAL);

        }
        
        // read the arg
        switch (col->type) {
            case EVSQL_TYPE_BINARY: {
                struct evsql_item_binary *item_ptr = va_arg(vargs, struct evsql_item_binary *);

                if (value) {
                    item_ptr->ptr = value;
                    item_ptr->len = length;
                }
            } break;

            case EVSQL_TYPE_STRING: {
                const char **str_ptr = va_arg(vargs, const char **);

                if (value) {
                    *str_ptr = value;
                }

            } break;

            case EVSQL_TYPE_UINT16: {
                uint16_t *uval_ptr = va_arg(vargs, uint16_t *);

                if (!value) break;

                if (length != sizeof(uint16_t)) XERROR(err = EINVAL, "r%zu:c%zu: wrong size for uint16_t: %zu", row_idx, col_idx, length);

                int16_t sval = ntohs(*((int16_t *) value));

                if (sval < 0) XERROR(err = ERANGE, "r%zu:c%zu: out of range for uint16_t: %hd", row_idx, col_idx, (signed short) sval);

                *uval_ptr = sval;
            } break;
            
            case EVSQL_TYPE_UINT32: {
                uint32_t *uval_ptr = va_arg(vargs, uint32_t *);

                if (!value) break;

                if (length != sizeof(uint32_t)) XERROR(err = EINVAL, "r%zu:c%zu: wrong size for uint32_t: %zu", row_idx, col_idx, length);

                int32_t sval = ntohl(*((int32_t *) value));

                if (sval < 0) XERROR(err = ERANGE, "r%zu:c%zu: out of range for uint32_t: %ld", row_idx, col_idx, (signed long) sval);

                *uval_ptr = sval;
            } break;
            
            case EVSQL_TYPE_UINT64: {
                uint64_t *uval_ptr = va_arg(vargs, uint64_t *);

                if (!value) break;

                if (length != sizeof(uint64_t)) XERROR(err = EINVAL, "r%zu:c%zu: wrong size for uint64_t: %zu", row_idx, col_idx, length);

                int64_t sval = ntohq(*((int64_t *) value));

                if (sval < 0) XERROR(err = ERANGE, "r%zu:c%zu: out of range for uint64_t: %lld", row_idx, col_idx, (signed long long) sval);

                *uval_ptr = sval;
            } break;
            
            default:
                XERROR(err = EINVAL, "r%zu:c%zu: invalid type: %d", row_idx, col_idx, col->type);
        }
    }

    // advance row index
    res->row_offset++;

    // row handled succesfully
    return 1;

error:
    return -err;
}