블로그 이동

http://orangecode.tistory.com

by kiho | 2008/12/10 02:18 | 트랙백 | 덧글(0)

DirectMove 선곡화면

여기에 몇가지를 추가하는 것으로 만들 예정

by kiho | 2007/12/21 02:48 | 작업물 | 트랙백 | 덧글(2)

Visual C++ 확장기능: 클래스 속성 만들기

c#에 보면 property란게 있어서 코딩시에 변수처럼 사용하면서 값을 대입하거나 가져올때의 동작을 작성할 수가 있다.
이런 property는 vc++에서도 확장기능으로 지원한다... 상당히 예전부터 지원하던거라 새로운 내용은 아니다..

msdn에 의한 스펙을 보면 다음과 같다.

__declspec( property( get=get_func_name ) ) declarator
__declspec( property( put=put_func_name ) ) declarator
__declspec( property( get=get_func_name, put=put_func_name ) ) declarator

클래스 선언안에 위와 같은 형식으로 적으면 되는데, property() 의 괄호안에 get항목만 적으면 읽기전용 속성이 되는것이고
put항목만 적으면 쓰기전용, get,put둘다 적으면 읽기,쓰기가 다 되는 속성을 만드는 것이다.













msdn에 있는 예제보기

by kiho | 2007/12/19 15:57 | 프로그래밍 팁 | 트랙백 | 덧글(1)

스트리밍...

점점 나은 스트리밍 방법을 생각해내서 새로 짜긴 하는데...

안된다는 사람이 자꾸 나오면 어쩌자는건지...

정 안되면 direct show로 다시 돌아가야지-_-

by kiho | 2006/12/22 17:01 | 오늘얘기 | 트랙백 | 덧글(2)

워드 2007로 포스팅~

워드 2007 설치 기념

by kiho | 2006/12/13 23:35 | 오늘얘기 | 트랙백 | 덧글(0)

스트리밍 완성..

예전 KSF변속지원이나, 텍스트 출력부분등을 계속 손보다가

결국 스트리밍 기능에 손을 데서 곧 완성했다...

이제 로딩시간도 빠르고 메모리양도 적게먹는다..

곡 길이도 상관없고...

나중에 정리해서 프로그래밍팁란에 올려야겠음...
 

by kiho | 2006/12/13 15:00 | 오늘얘기 | 트랙백 | 덧글(0)

아아.. 메모리 부족...

direct move 테스트 도중, 재생시간이 긴 음악의 경우,
시작하자마자 바로 꺼지는걸 확인했다..

direct sound로 재생하려하면 메모리부족 오류를 내면서 연주가 되지 않는다..

결국은 스트리밍을 구현해야 된다는 소리..
랙이 생길경우 때문에 상당히 불안한 부분인데.. 어떻게 될지 모르겠다..


게다가 곡이 길어지면 메모리를 100메가 가까이 잡아먹기 때문에..
임시파일에 저장해놓고, 조금씩 읽으면서 스트리밍하는 방법을 써야할 것 같다..
속도는 떨어지겠지..


시간도 얼마 없는데.. 문제만 더 생기는구나...

by kiho | 2006/12/05 05:13 | 오늘얘기 | 트랙백 | 덧글(0)

DirectMove, 또다시 C++로...



또... 다시 만들었다 C++로

Direct Move 1.0은 C++로 나오려다가, 올해 초 java로 작성되다가,
올해 중반에 C#으로 작성되다가, 다시 C++로 다시 작성됐다... -_-;;

C#을 거친덕인지.. 0.5보다는 코드가 나아진듯 하긴 하다..

 

by kiho | 2006/12/03 18:32 | 작업물 | 트랙백 | 덧글(0)

DIrect3D 화면 텍스쳐에 그리기

화면에 보여줄 내용을 백버퍼 대신 사용자가 지정한 서피스(Surface)에 그리게 하는 기능이다.

IDirect3DDevice9 의 함수중에 쓸것은..

CreateRenderTarget
SetRenderTarget
GetRenderTarget

CreateRenderTarget으로 surface를 만든다.
GetRenderTarget으로 원본 백 버퍼를 가져와 보관하고...
SetRenderTarget으로 위에서 만든 서피스를 지정한다...
그 후
BeginScene, EndScene으로 원래 하던 렌더링을 한다..
그 내용이 지정한 서피스안에 들어가게 된다..
그 후 SetRenderTarget으로 원래 백 버퍼를 복구시키고..

이 과정에서 얻은 서피스의 내용을 텍스쳐로 옮겨서
그대로 화면에 렌더링한다.. (안 그러면.. 당연히 그 프레임에는 아무것도 안나오게된다.... 서피스에만 그렸으니까)


CreateRenderTarget 함수를 쓰지 않고
RenderTarget옵션을 줘서 CreateTexture를 호출하여 텍스쳐를 바로 만들어도 된다...
대신 D3DPOOL_DEFAULT 옵션만을 지원하므로.. 귀찮은 점이 있다.. (D3DPOOL_MANAGED 가 편하다..)

나는 요청이 들어올때 마다 캡쳐를 하여 새로운 텍스쳐에 복사하도록 코딩하였다..

밑은 내가 작성한 코드를 정리한것이다.


LPDIRECT3DSURFACE9 originalTarget; // 백 버퍼
LPDIRECT3DSURFACE9 capturingTarget; // 캡쳐된 내용이 들어갈 서피스
device->GetRenderTarget(0, &originalTarget); // 가져온다..(백업?)

// 백 버퍼와 같은 속성으로 렌더타겟을 만든다.
D3DSURFACE_DESC desc;
originalTarget->GetDesc(&desc);
device->CreateRenderTarget(desc.Width, desc.Height, desc.Format, 0, 0, TRUE, &capturingTarget, NULL);

// 렌더타겟 설정후 그림.
device->SetRenderTarget(0, this->capturingTarget);
device->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1, 0);
device->BeginScene();
// 그릴 내용이 여기에..
device->EndScene();

// 여기서 텍스쳐를 만들어 캡쳐된 서피스의 내용을 복사한다...

// 원래대로 되돌린다.
device->SetRenderTarget(0, originalTarget);
device->BeginScene();
// 위에서 만든 텍스쳐를 전체화면에 그림.. 혹은 맘대로..
device->EndScene();
device->Present(NULL, NULL, NULL, NULL);

capturingTarget->Release(); // 다 쓴 건 release....

아 실제로는.. capturingTarget은 한번 만들고 계속 쓰게 했다.. 마지막에 release하고..

by kiho | 2006/11/23 01:20 | 프로그래밍 팁 | 트랙백 | 덧글(3)

아나 짜증나....

동아리방에서 DirectShow 책 가져와서, 좀 읽어보고 이것저것 해보는데...

ISampleGrabber란게 있었는데... 이걸 쓰면 재생 직전의 데이터를 얻을 수 있는거야..

나는 mp3 -> wav를 원하기 때문에, 나에게 필요한거지..

그래서 얼른 코드를 베껴 옮기고, 중간에 가져온 데이터를 wav파일로 저장시키는 코드를 작성했는데..

잡음이 엄청 심하네..

그래서 검색하고, 책찾아보고 이리저리 고쳐보다가...

코드를 정리할겸.. ofstream을 fopen류 함수로 바꿨는데..

잘 나오네...

...

그렇다면 범인은 ofstream?

아니다, 나다....

ofstream를 만들때, 바이너리로 만드는걸 깜빡해버렸다.... (fopen때는 "wb"로 잘 썼으면서...)

ofstream를 자주 쓰지 않아서 익숙치 않은게 문제였다... 평소처럼 fopen 쓸 걸...

by kiho | 2006/11/12 06:27 | 오늘얘기 | 트랙백 | 덧글(1)

◀ 이전 페이지          다음 페이지 ▶