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; }
// // 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; }
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; }
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 ); }
// // 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; }
// // 지정된영역의 백버퍼데이타를 읽어서 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()내부에서 뽀개주도록 바꿔야 한다. 버그날까봐 일단 이상태로 놔둠" ) }
// // 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; }
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 ); }
// 바이너리 포맷으로 읽기 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; }
// 백버퍼의 픽셀을 읽어서 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; }
// 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; }
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; }
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); } }
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; }
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; }
// 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; }
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!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 {
// // 오브젝트 로딩. 모션을 읽지 않은 상태에서도 독립적으로 동작한다. // 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; }
/** @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
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; }
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; }
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; }