음 알수없는 css의 세계…
위키랑 블로그 디자인 맞추가기 너무 빡시다…
가장 좋은 방법은 헤더에 해당하는 파일을 만들고 공통적으로 쓰일 스타일시트를 만들어서 사용하는 방법인데 음…. 어렵다 어려워
뭔가 알수 없는것 때문에 정상적으로 적용이 안된다. 알수 없는 곳에서 css를 막 링크하는것 같기도 하고…
조금씩 미묘하게 위치가 달라지니 -_-;
음 알수없는 css의 세계…
위키랑 블로그 디자인 맞추가기 너무 빡시다…
가장 좋은 방법은 헤더에 해당하는 파일을 만들고 공통적으로 쓰일 스타일시트를 만들어서 사용하는 방법인데 음…. 어렵다 어려워
뭔가 알수 없는것 때문에 정상적으로 적용이 안된다. 알수 없는 곳에서 css를 막 링크하는것 같기도 하고…
조금씩 미묘하게 위치가 달라지니 -_-;
?에 ?던 ?페???로보드 기반?었?데 ?제 ????에 발맞추어 ?도 블로?는?려결심?다. ???무?도 문서???업???는???어?는 ?키가 좋다?각???서 ??치?해???력
?친?고 ?도 ?자?을 비슷?게 ?는 ?도??을?다.
?단 개발??관??간단???용? ‘메모’ 기록???고 ?중???키??문서???는 방식???각?고 ?다. 근데 막상 ?터?을 깔고 블로그에 글 추는 ?을 보니 ?키보다 ???할같다???각???기???다. ??
#pragma once#include <windows.h>
#include <stdio.h>// 콘솔 디버그를 사용할경우는 디파인하고 사용하지 않을경우 주석처리
#ifdef _DEBUG // 디버그 모드에서 사용
#define _DBG_MOD_
#endif
#ifndef _DEBUG // 릴리즈 모드에서 사용
//#define _DBG_MOD_
#endif// 콘솔 디버그를 사용할경우
#ifdef _DBG_MOD_
#define _cdbg ConsoleDebugLine
#define _cdbgi ConsoleDebug
#define _dbgcode(CODE) CODE
#endif// 콘솔 디버그를 사용하지 않을 경우
#ifndef _DBG_MOD_
#define _cdbg //
#define _cdbgi //
#define _dbgcode(CODE)
#endif// 콘솔디버그 함수내의 문자열 버퍼 사이즈 -> 버퍼가 모자라면 에러난다.
#define BUFSIZE 4096//_dbgcode(AllocConsole()); 를 한후에 함수호출
void ConsoleDebugLine(char* pFormat, … );
void ConsoleDebug(char* pFormat, … );
Begin | 스프라이트를 드로잉(Drawing) 할 수 있도록(듯이) 장치를 준비한다. | |
Draw | 스크린 공간에 단순한 스프라이트를 드로잉(Drawing) 한다. | |
DrawTransform | 지정한 행렬에 의해 변환 한 스프라이트를 드로잉(Drawing)하기 위한 구조를 제공한다. | |
End | ID3DXSprite::Begin 가 불려 간 시점의 장치 스테이트를 복원한다. | |
GetDevice | 스프라이트 개체에 관련지을 수 있는 Direct3D 장치를 얻어온다. | |
OnLostDevice | 비디오 메모리 리소스에의 참조를 모두 릴리즈 해, 모든 스테이트 블록을 삭제한다. | |
OnResetDevice | 장치가 리셋 된 후에 호출할 필요가 있다.| |
IDirect3DDevice9::BeginScene
ID3DXSprite::Begin<< 여기다가 그리는걸 호출 >>>
ID3DXSprite::End
IDirect3DDevice9::EndScene
HRESULT Draw(LPDIRECT3DTEXTURE9 pSrcTexture,
CONST RECT *pSrcRect,
CONST D3DXVECTOR2 *pScaling,
CONST D3DXVECTOR2 *pRotationCenter,
FLOAT Rotation,
CONST D3DVECTOR2 *pTranslation,
D3DCOLOR Color
);
D3DPRESENT_PARAMETERS d3dpp;를 이용해 D3DDevice 를 초기화 시킬때
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER를 설정해준다.
HDC hdc;
LPDIRECT3DSURFACE9 BackBuffer;
g_pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &BackBuffer )
BackBuffer->GetDC(&hdc);<< 여기서 DC를 이용한 출력문을 사용하면 된다. >>
BackBuffer->ReleaseDC(hdc);
방금 구현해본 바로는 졸라 꼬리다 이건 사용할 방법이 못된다. 더블버퍼링이 꼬리다는 소리가 아니고 DC를 얻어 쓰는 방법이 꼬리다. 음 웬지 깜밖 거리기도 하고 카메라를 돌리면 어째서 인지 출력이 안될때도 있다. by yoway 2004/6/4 |
#ifndef _ASYNC_CONNECTOR_
#define _ASYNC_CONNECTOR_#include <iostream.h>
#include <winsock2.h>class CAsyncConnector
{
public:
CAsyncConnector();
virtual ~CAsyncConnector();// 소켓초기화 및 종료화 함수 // 뽀대나게 스태틱으로
static int Cleanup();
static int Startup();// 소켓초기화 함수 : 언제나 TCP 비동기소켓을 생성한다.
SOCKET InitializeSocket();
// 소켓을 닫는 함수
int CloseSocket();// 소켓 연결함수
int ConnectToIP(LPCSTR lpcIP, UINT uPort);
int ConnectToDomain(LPCSTR lpcDomain, UINT uPort);// send, recv API 함수
int Receive(byte* pDataBuf, int nBufSize);
int Send(byte* pSendData, int nDataSize);// bind, listen API 함수 :: 서버만 사용
int Binding(UINT uPort);// 클래스 맴버변수를 얻는 함수
WSAEVENT* GetEvenHandle();
SOCKET GetSocket();// domain 으로 부터 IP를 얻는 함수
BOOL GetIPfromDomain(LPCSTR lpcDomain);// 소켓이벤트 처리 스레드
HANDLE StartThreadEventSelect();
int StopThreadEventSelect();
static DWORD WINAPI EventSelectThread(LPVOID lpArg);private:
// 클래스 인스턴스의 개수
static int m_nCountInstance;// 이 연결자가 사용하는 소켓
SOCKET m_Socket;
sockaddr_in m_SockAddr;// 소켓 이벤트핸들 0=소켓이벤트 1=스레드증료
WSAEVENT m_hEvent[2];// EventSelect 스레드를 관리하는 변수
HANDLE m_hEventSelectThreadHandle;
DWORD m_dwEventSelectThreadId;protected:
// 오버라이딩용 함수들
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
virtual void OnOutOfBandData(int nErrorCode);
virtual void OnAccept(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnClose(int nErrorCode);
};#endif
날자 | 내용 | 비고 |
2017년 1월 2014년 2월 2009년 5월 |
넥슨지티 모바일 사업쪽이 넥슨레드로 분사 넥스토릭이 게임하이와 합병 넥슨지티가됨 넥슨에서 넥스토릭으로 분사 |
|
2008년 4월 | 국방부 산하 인더스트리 테크니컬 에이젼트 소집해제 | |
2006년 9월 | 넥슨 입사 | |
2006년 8월 | ECMiner 퇴사 | |
2005년 6월 | 국방부 산하 인더스트리 테크니컬 에이젼트 편입 | |
2004년 12월 | ECMiner 솔루션 개발팀 입사 | |
2004년 9월 | SmartWind 에서 WinCE.NET(모바일) 용 어플리케이션 개발 | 계산기, 녹음기 |
2003년 7월 | SKYDATA(하늘데이타)에서 리커버리매직 네트워크 모듈개발 |
하다가 삽질한점은 RPG책에서 구현한 마우스 인풋이 MFC에서 안먹힌다는 점과 현재 랜더링을 APP::OnIdle 에서 하고 있는데 가만히 있으면 이게 호출이 안된다는 점이다. 마우스 인풋은 View의 마우스 이벤트로 처리 (그리고 기타 UI쪽에서 개삽질… 이제 제일 짜증난다!)
CIndexBufferManager |
CHeightMapTileManager |
CHeightMapTextureManager |
위의 세가지 클래스들의 문제점은 서로 간의 인터페이스가 너무 난잡하다는 점. 3개 정도는 괜찮겠지 하고 그냥 짰는데 막상 짜다보니 좀 지지분한 생각이 들었다. CHeightMapTileManager , CHeightMapTextureManager 를 하나로 합쳐서 관리하는 하는 클래스를 만드는게 좋을지도 모르겠다.
너무 오랜만의 업데이트… 그동안 열심히 구현하고 싶었지만 여러가지 다른 사정이 겹쳐서 근 20일간 스크린샷을 못올리다니… 사실 내부적으로 구현은 했지만 외부적으로 보일게 별로 없어서 안한것도 있다. 그나저나 하이트맵을 구현하기 시작했을때 부터 한달 후에 지금 이정도면 꽤 열심히 한것 같기도 하고… 처음 10일간 한게 이후 20일동안 한것보도 많은것 같아서 아쉽기도 하고,…
이제 구현할건 둥글게 지형 변화를 비롯한 “지형변화 부분” 파일 저장 (맵과 타일셋을 따로) 그리고…짜잘한 버그들…
지금 어째서 인지 맵이 반투명 하게 되는 부분이 있는데 그 이유를 모르겠다 -_-;;;;;
흠 스크린샷의 우측하단 부분에 푸르스름한것이 브러쉬!
사실 지금 정리하고 있는 시점이 2005년 4월 말이라 -_-; 기억이 안난다.
일단 8월달 과의 가장큰 차이점은 지형에 변화를 줄때 둥글둥글하게 변화를 준다는것. 사실 뭐 거창한 곡면 함수 이런게 필요할줄 알았지만 그냥 2차함수로 해결했다. X축으로 한번 적용해주고 Y축으로 한번 적용해주면 적당하게 둥글둥글한 지형변환 효과를 줄수 있다.
일단은 여기서 하이트맵 에디터는 대충 마무리를 지었다. 더 추가하기 위해서는 최적화 코드를 넣어야 하고 현재 구조가 별로 맘에도 안들고. 후…지금 당장 여건이 이걸 붙잡고 있기에 허락하지도 않고. 영천이형은 이것 보다는 일단 맥스익스포터와 그거 랜더러를 구현해 보라고 하셔서 나중에 다시 공부하게 된다면 그쪽으로 생각하고 있다.
실행에 필요한 DLL이 포함되어 있지 않다 -_-; 비주얼스튜디오 6.0을 깔도록…..
2004년 7월 22일
카메라가 바라보는 방향이 화면에 나오고 있을때 마우스의 위치로 화면안쪽으로 향하는 반직선을 만들고 그 반직선과 교차하는 폴리곤을 선택하는 것을 Picking 이라고 한다.
이후 설명하는 대부분의 것이 제가 잘 모르는 관계로 틀린 내용일수 있습니다
즉 간단히 마우스로 가져다가 댔을때 그 바로 아래있는 폴리곤이나 오브젝트를 선택할수 있는 방법이다. 음 위의 Picking을 구현하기 위해서는 현재 자신이 바라보는 화면에 랜더링 파이프라인에서 프로젝션 단계를 거친 화면임을 이해해야 한다. 으음 나도 잘 모르니 넘어가도록 하자… 사실 나는 설명할게 없다. 일단 간단하게 내가 구현한 Picking화면을 보자
위의 스크린샷중에 Picking 이라고 되고 재대로 텍스쳐가 입혀져 있는 곳에 원래는 마우스가 있다. 흐음 딱히 설명할게 없으니 내 코드좀 올리고… 전체 프로젝트 파일올리고 여기저기 소스 배껴온 Reference 주소를 올리고 끝내자..
참고문서
BOOL IntersectTriangle( const D3DXVECTOR3& orig, const D3DXVECTOR3& dir, D3DXVECTOR3& v0, D3DXVECTOR3& v1, D3DXVECTOR3& v2, FLOAT* t, FLOAT* u, FLOAT* v ) { // Find vectors for two edges sharing vert0 D3DXVECTOR3 edge1 = v1 - v0; D3DXVECTOR3 edge2 = v2 - v0; // Begin calculating determinant - also used to calculate U parameter D3DXVECTOR3 pvec; D3DXVec3Cross( &pvec, &dir, &edge2 ); // If determinant is near zero, ray lies in plane of triangle FLOAT det = D3DXVec3Dot( &edge1, &pvec ); D3DXVECTOR3 tvec; if( det > 0 ) { tvec = orig - v0; } else { tvec = v0 - orig; det = -det; } if( det < 0.0001f ) return FALSE; // Calculate U parameter and test bounds *u = D3DXVec3Dot( &tvec, &pvec ); if( *u < 0.0f || *u > det ) return FALSE; // Prepare to test V parameter D3DXVECTOR3 qvec; D3DXVec3Cross( &qvec, &tvec, &edge1 ); // Calculate V parameter and test bounds *v = D3DXVec3Dot( &dir, &qvec ); if( *v < 0.0f || *u + *v > det ) return FALSE; // Calculate t, scale parameters, ray intersects triangle *t = D3DXVec3Dot( &edge2, &qvec ); FLOAT fInvDet = 1.0f / det; *t *= fInvDet; *u *= fInvDet; *v *= fInvDet; return TRUE; }
참고문서 http://www.gamza.net/ez2000/ezboard.exe?db=Algorithm&action=read&dbf=14&page=0&depth=1
BOOL Picking(HWND hWnd) { POINT ptCursor; D3DXVECTOR3 vPickRayDir; D3DXVECTOR3 vPickRayOrig; INTERSECTION_HEIGHTMAP Intersection; ZeroMemory(&Intersection, sizeof(INTERSECTION_HEIGHTMAP)); Intersection.m_fDist = FAR_DISTANCE; _cdbg("Picking Start"); // 마우스 포인터로 부터 3D객체를 향해서 뻗는 3D직선의 백터를 얻는다. 언프로젝션부분 D3DVIEWPORT9 vp; m_pGraphics->GetDeviceCOM()->GetViewport(&vp); D3DXMATRIXA16 matProj; m_pGraphics->GetDeviceCOM()->GetTransform( D3DTS_PROJECTION, &matProj ); GetCursorPos( &ptCursor ); ScreenToClient( hWnd, &ptCursor ); D3DXVECTOR3 v; v.x = (( (((ptCursor.x-vp.X)*2.0f/vp.Width ) - 1.0f)) - matProj._31 ) / matProj._11; v.y = ((- (((ptCursor.y-vp.Y)*2.0f/vp.Height) - 1.0f)) - matProj._32 ) / matProj._22; v.z = 1.0f; // Get the inverse view matrix D3DXMATRIXA16 matView, m; m_pGraphics->GetDeviceCOM()->GetTransform( D3DTS_VIEW, &matView ); D3DXMatrixInverse( &m, NULL, &matView ); // Transform the screen space pick ray into 3D space vPickRayDir.x = v.x*m._11 + v.y*m._21 + v.z*m._31; vPickRayDir.y = v.x*m._12 + v.y*m._22 + v.z*m._32; vPickRayDir.z = v.x*m._13 + v.y*m._23 + v.z*m._33; vPickRayOrig.x = m._41; vPickRayOrig.y = m._42; vPickRayOrig.z = m._43; // 위에서 얻는 백터와 Picking의 대상이 되는 오브젝트의 충돌 체크를 한다. FVF_HEIGHTMAP* pVerHeightMap; WORD* pIndexHeightMap; GetVertexBuffer()->Lock(); pVerHeightMap = (FVF_HEIGHTMAP*)m_pVB->GetPtr(); GetIndexBuffer()->Lock(); pIndexHeightMap = (WORD*)m_pIB->GetPtr(); FLOAT fBary1, fBary2, fDist; for( DWORD i=0; i<m_dwPrimitives; i++ ) { D3DXVECTOR3 v0 = pVerHeightMap[pIndexHeightMap[3*i+0]].p; D3DXVECTOR3 v1 = pVerHeightMap[pIndexHeightMap[3*i+1]].p; D3DXVECTOR3 v2 = pVerHeightMap[pIndexHeightMap[3*i+2]].p; // Check if the pick ray passes through this point // 충돌이 있다면 if( IntersectTriangle( vPickRayOrig, vPickRayDir, v0, v1, v2, &fDist, &fBary1, &fBary2 ) ) { _cdbg("Intersection occour"); // 일단 가장 가까운 값을 유지 해야 한다 if(Intersection.m_fDist > fDist) { Intersection.m_fDist = fDist; Intersection.m_verHeightMap[0].p = v0; Intersection.m_verHeightMap[1].p = v1; Intersection.m_verHeightMap[2].p = v2; Intersection.m_dwPrimitiveIndex = i; } } } m_pIB->Unlock(); m_pVB->Unlock(); // Picking 된 버텍스로 출력할 것 설정 WORD Indexs[3] = {0,1,2}; m_pVBIntersect->Set(0,3,Intersection.m_verHeightMap); m_pIBIntersect->Set(0,3,Indexs); // Debug /////////////////////////////////// sprintf(m_szDebugBuff, "Primitive Index : %d, Picking Distance : %f\nMouse Position X : %d, Mouse Position Y : %d", Intersection.m_dwPrimitiveIndex, Intersection.m_fDist, ptCursor.x, ptCursor.y); // Debug /////////////////////////////////// return TRUE; }
아 그러고 보니 위의 Picking 소스는 카메라의 위치가 0,0,0 이 아니면 재대로 돌아가지 않는데 흐음… 어떤 행렬값이나 백터값에 보정을 해줘야 할것 같다. 아마도 v 백터값에 카메라 포지션을 더해주는게 아닐까 하는데… 사실 정확히는 모르겠다. -_-;;
현재는 실행시키면 돌아가기는 하지만… 카메라의 위치를 바꾸거나 윈도우의 크기를 변화시키면 안된다. 이 문제에 대해서는 Picking에서 사용하는 수학적 지식을 완전히 익혀야 해결할수 있을듯…
2004년 7월 27일 카메라의 위치와 윈도우 크기를 바꿀때 생기는 오차를 해결
D3DVIEWPORT9 vp; m_pGraphics->GetDeviceCOM()->GetViewport(&vp); D3DXMATRIXA16 matProj; m_pGraphics->GetDeviceCOM()->GetTransform( D3DTS_PROJECTION, &matProj ); GetCursorPos( &ptCursor ); ScreenToClient( hWnd, &ptCursor ); D3DXVECTOR3 v; v.x = (( (((ptCursor.x-vp.X)*2.0f/vp.Width ) - 1.0f)) - matProj._31 ) / matProj._11; v.y = ((- (((ptCursor.y-vp.Y)*2.0f/vp.Height) - 1.0f)) - matProj._32 ) / matProj._22; v.z = 1.0f;
이 부분을
RECT rt; GetClientRect( hWnd, &rt ); D3DXMATRIXA16 matProj; m_pGraphics->GetDeviceCOM()->GetTransform( D3DTS_PROJECTION, &matProj ); GetCursorPos( &ptCursor ); ScreenToClient( hWnd, &ptCursor ); D3DXVECTOR3 v; v.x = (( (((ptCursor.x-rt.left)*2.0f/rt.right ) - 1.0f)) - matProj._31 ) / matProj._11; v.y = ((- (((ptCursor.y-rt.top)*2.0f/rt.bottom) - 1.0f)) - matProj._32 ) / matProj._22; v.z = 1.0f;
으로 바꿔 줘야 한다. 그리고 카메라의 위치가 바꼈을때의 오차 해결은 vPickRayOrig 값의 오차를 보정해 줘야 하는데 보정값은 당연히 카메라의 위치가 된다. 위의 백터값에서 카메라의 위치값을 빼주면 된다!!
raw 파일에서 64*64 크기의 높이 정보를 읽어와서 버텍스들을 생성하고 인덱스버퍼를 만들어 랜더링한다. 랜더링 상태를 SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME) 으로 설정해서 와이어프레임이 꽉꽉차서 보인다.(과거 이 옵션을 몰라서 랜더링 옵션을 D3DPT_LINESTRIP 으로 하고 랜더링된 와이어프래임을 보고 “어째서 나의 와이어 프레임은 부실하게 나올까” 하고 고민한적이있다….)
음 하이트맵의 데이타를 생성하는 코드를 써보면
unsigned char TmpHeight; // 버텍스버퍼와 인덱스버퍼를 위한 중간 버퍼들 FVF_HEIGHTMAP* pVertexData = new FVF_HEIGHTMAP[m_dwVertices]; WORD* pIndexData = new WORD[m_dwPrimitives*3]; //파일에서 높이 정보를 읽어오고 버텍스정보를 삽입한다. FILE* pFile; UINT nIndex = 0; pFile = fopen(szFilename, "rb"); for(unsigned y = 0;y < (HEIMAP_Y + 1); y++) { for(unsigned x = 0;x < (HEIMAP_X + 1); x++) { TmpHeight = fgetc(pFile); // 버텍스 데이타 구성 pVertexData[x + y * (HEIMAP_X+1)].fX = (float)x; pVertexData[x + y * (HEIMAP_X+1)].fY = (float)TmpHeight / 15.0f - 40; pVertexData[x + y * (HEIMAP_X+1)].fZ = (float)y; pVertexData[x + y * (HEIMAP_X+1)].dwColor = 0xffffffff; if( (y < HEIMAP_Y) && (x < HEIMAP_X) ) { // 인덱스 데이타 구성 pIndexData[(x+y*(HEIMAP_X))*6 +0] = x + y * (HEIMAP_X+1); pIndexData[(x+y*(HEIMAP_X))*6 +1] = x+1 + y * (HEIMAP_X+1); pIndexData[(x+y*(HEIMAP_X))*6 +2] = x + (y+1) * (HEIMAP_X+1); pIndexData[(x+y*(HEIMAP_X))*6 +3] = x + y * (HEIMAP_X+1); pIndexData[(x+y*(HEIMAP_X))*6 +4] = x+1 + (y+1) * (HEIMAP_X+1); pIndexData[(x+y*(HEIMAP_X))*6 +5] = x + (y+1) * (HEIMAP_X+1); } } } fclose(pFile); // 버텍스버퍼를 구성한다. m_pVB->Create(m_pGraphics, m_dwVertices, sizeof(FVF_HEIGHTMAP), D3DFVF_HEIGHTMAP); m_pVB->Set(0, m_dwVertices, pVertexData); //인덱스데이타를 구성한다. m_pIB->Create(m_pGraphics, m_dwPrimitives*3); m_pIB->Set(0, m_dwPrimitives*3, pIndexData); // 버덱스데이타, 인덱스데이타 메모리를 해재한다. delete [] pVertexData; delete [] pIndexData;
이정도… 간단하다. 밑은 스크린샷 이제는 텍스쳐 매트릭스를 적용하여 한 중류의 텍스쳐로 덥어보자
http://myevan.net/phpBB/viewtopic.php?t=1445 (빗자루님의 포럼) 에 텍스쳐 메트릭스에 관한 내용이 있다.
음 위의 내용을 이해하면 텍스쳐매트릭스를 사용하는데는 지장이 없을듯 하다. 문제는 다이렉트X SDK인데… 나만 그러는지 모르겠지만 D3DXMatrixDeterminant 를 사용했을때 런타임에러가 발생한다. 그래서 2003 Summer Update로 업데이트를 했는데 일단 위의 문제는 해결됐다. 다만 인테페이스가 바뀐게 좀 있어서 짜증이 난다. -_-;;; 쓰던 코드를 좀 손봐야 할듯하다.
위의 화면처럼 나오는데… 여러종류의 텍스쳐를 입히는것도 아주 쉬울듯하다. 그냥 텍스쳐별로 따로따로 인덱스버퍼를 구성하면 되니… 그런데 그렇게 할려면 맵의 파일 포멧이 좀 바껴야 할태고 그럴려면 이왕에 전용 에디터를 만드는쪽이 좆타… 라는 결론이 나와서 -_-;;; 좀 귀찮다. 일단 위의 하이트맵을 랜더링하는 코드를 보면
void CHeightMap::Rendering(HEIGHTMAP_DRAW_OPTION hdOption) { D3DXMATRIX matrixView; m_pGraphics->GetDeviceCOM()->GetTransform(D3DTS_VIEW, &matrixView); FLOAT fDeterminantMatView = D3DXMatrixDeterminant(&matrixView); D3DXMATRIX matViewInv; D3DXMatrixInverse(&matViewInv, &fDeterminantMatView, &matrixView); D3DXMATRIX matScale; ZeroMemory(&matScale, sizeof(D3DXMATRIX)); matScale._11=1.0f/1.0f; matScale._32=1.0f/1.0f; D3DXMATRIX matTex; D3DXMatrixMultiply(&matTex, &matViewInv, &matScale); // 텍스쳐 좌표 자동생성을 위한 세팅 m_pGraphics->GetDeviceCOM()->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); m_pGraphics->GetDeviceCOM()->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); m_pGraphics->GetDeviceCOM()->SetTransform(D3DTS_TEXTURE0, &matTex); // 랜더링 옵션이 WIRE이면 랜더링 상태를 설정 if(hdOption == RENDER_WIRE) m_pGraphics->GetDeviceCOM()->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); m_pIB->Render( D3DPT_TRIANGLELIST, 0, 0, m_pVB->GetNumVertices(), 0, m_dwPrimitives, m_pVB, m_pTextureDefault ); // 랜더링 옵션이 WIRE이면 랜더링 상태를 해제 if(hdOption == RENDER_WIRE) m_pGraphics->GetDeviceCOM()->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); // 텍스쳐 좌표 자동생성을 위한 세팅 해제 m_pGraphics->GetDeviceCOM()->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU); m_pGraphics->GetDeviceCOM()->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); }
이정도… 자세한 내용은 빗자루님의 글을 참고하는게 좋다. 간단히 설명하면 카메라의 위치와 버텍스의 위치값으로 UV값을 자동 생성해서 텍스쳐를 입히는 것이다.
자 그럼 다음은 맵에디터다