* 테스트한 멀티 터치 모니터가 IR 방식이라 허접합니다. 양해해 주시길...
1. 기능
- 오픈지엘 기반으로 H/W (GPU) 가속 렌더링
- 렌더러 선택가능 (OpenGL, GDI, GDI+, D2D 등 :현재는 OGL 만 적용. 다른건 귀찮아서 -_-)
- 2차원 벡터 그리기 지원 (점, 선, 삼각형, 사각형, 원, 호, 타원, 베지어 곡선, 폴리곤 등)
- 알파 블랜딩 지원
- 펜 및 선 스타일 변경 지원 (선 두께, 대쉬등의 스타일)
- 줌, 팬, 회전 등의 이벤트 처리 지원 (마우스및 터치 인터페이스)
- 오픈지엘 리스트 버퍼지원으로 고속 렌더링 가능
- 행렬 입력 지원으로 다양한 선형변환 가능
- 멀티 터치 시연 (데모 프로그램)
- 활용 분야 : 2차원 데이타 고속 뷰어, 에디터 개발 등
2. 환경
- Win32 지원
- DLL 등의 라이브러리로 개발
- C++ 빌더/ M$ VS 환경
- C++ 빌더용 데모 프로그램에 멀티터치 기능을 연결해 놓음
3. 사용방법
사용방법은 View2d 를 상속받아 화면에 실제 그리는 부분(onRender) 함수를 구현해 주면 됩니다.
testview.h
#ifndef testviewH
#define testviewH
#include <windows.h>
#include "kami2dlib.h"
class TestView : public View2d
{
public:
virtual DWORD onRender();
private:
Painter2d* _pPainter;
public:
TestView()
: View2d(_pPainter = new Opengl2dPainter)
{}
virtual ~TestView()
{
delete _pPainter;
_pPainter = NULL;
}
};
#endif
Painter 를 직접 생성하여 지정하는 이유는 (new Opengl2dPainter), 추후에 OpenGL 대신 다른 렌더링 라이브러리(Direct2D, GDI, GDI+) 를 사용할 경우에도 지원가능하도록 하기 위해 설계되었습니다.
testview.cpp
#include "testview.h"
DWORD TestView::onRender()
{
DWORD dwTickCount = ::GetTickCount();
Pen pen;
pen.setColor(30, 30, 30);
_pPainter->rotate( _pPainter->getRotate());
_pPainter->renderBegin(pen);
// draw grids
{
Pen pen;
pen.setColor(50, 50, 50);
//10mm
_pPainter->drawBegin(pen);
for (float i = -200; i <= 200; i+=10)
_pPainter->drawLine( i, 200, i, -200);
_pPainter->drawEnd();
_pPainter->drawBegin(pen);
for (float i = -200; i <= 200; i+=10)
_pPainter->drawLine( -200, i, 200, i);
_pPainter->drawEnd();
}
// draw axis
{
Pen pen;
pen.setColor(255, 0, 0);
_pPainter->drawBegin(pen);
_pPainter->drawLine( -200,0, 200,0);
_pPainter->drawEnd();
pen.setColor(0, 255, 0);
_pPainter->drawBegin(pen);
_pPainter->drawLine( 0, 200, 0, -200);
_pPainter->drawEnd();
}
// draw entities
{
for(int i=0; i< 11; ++i)
{
for(int j=0; j< 11; ++j)
{
Matrix3 m;
m.Translate( -100 +20*j, 100 - i*20);
Pen pen(255, 255, 255);
_pPainter->drawBegin(pen, m);
_pPainter->drawRectangle( -7, 7, 7, -7);
_pPainter->drawRectangle( -5, 5, 5, -5, true);
_pPainter->drawEnd();
}
}
}
_pPainter->renderEnd();
return ::GetTickCount() - dwTickCount;
}
DWORD TestView::onRender()
{
DWORD dwTickCount = ::GetTickCount();
Pen pen;
pen.setColor(30, 30, 30);
_pPainter->rotate( _pPainter->getRotate());
_pPainter->renderBegin(pen);
// draw grids
{
Pen pen;
pen.setColor(50, 50, 50);
//10mm
_pPainter->drawBegin(pen);
for (float i = -200; i <= 200; i+=10)
_pPainter->drawLine( i, 200, i, -200);
_pPainter->drawEnd();
_pPainter->drawBegin(pen);
for (float i = -200; i <= 200; i+=10)
_pPainter->drawLine( -200, i, 200, i);
_pPainter->drawEnd();
}
// draw axis
{
Pen pen;
pen.setColor(255, 0, 0);
_pPainter->drawBegin(pen);
_pPainter->drawLine( -200,0, 200,0);
_pPainter->drawEnd();
pen.setColor(0, 255, 0);
_pPainter->drawBegin(pen);
_pPainter->drawLine( 0, 200, 0, -200);
_pPainter->drawEnd();
}
// draw entities
{
for(int i=0; i< 11; ++i)
{
for(int j=0; j< 11; ++j)
{
Matrix3 m;
m.Translate( -100 +20*j, 100 - i*20);
Pen pen(255, 255, 255);
_pPainter->drawBegin(pen, m);
_pPainter->drawRectangle( -7, 7, 7, -7);
_pPainter->drawRectangle( -5, 5, 5, -5, true);
_pPainter->drawEnd();
}
}
}
_pPainter->renderEnd();
return ::GetTickCount() - dwTickCount;
}
onRender 함수는 화면에 새로 그릴일이 있을때마다 callback 되는 함수로, 리턴값은 렌더링에 걸린 시간을 되돌려주면 됩니다.
함수의 시작은 renderbegin , 끝은 renderend 해주시면 되며, 각각의 엔티티(점, 선, 사각형등의 figure)를 그릴때는 시작부분에 drawbegin, 끝에 drawend를 호출하여 사용가능합니다.
4. 오픈소스 프로젝트
kami2d 라이브러리는 GitHub 를 통해 오픈소스로 공개해 놓았습니다.
소스 저장소 : https://github.com/sepwind/kami2d
코드 프로젝트 트랙백 : http://www.codeproject.com/Articles/599517/kami2d-library
코드 프로젝트 트랙백 : http://www.codeproject.com/Articles/599517/kami2d-library