2013년 5월 22일

kami2d 라이브러리 (멀티터치)

아래 글에서는 멀티터치및 OpenGL에 대해 간략히 소개하였는데, 이를 응용하여 만든  kami2dlib 라는 라이브러리를 소개드립니다.



* 테스트한 멀티 터치 모니터가 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;
}

onRender 함수는 화면에 새로 그릴일이 있을때마다 callback 되는 함수로, 리턴값은 렌더링에 걸린 시간을 되돌려주면 됩니다. 
함수의 시작은 renderbegin , 끝은 renderend 해주시면 되며, 각각의 엔티티(점, 선, 사각형등의 figure)를 그릴때는 시작부분에 drawbegin, 끝에 drawend를 호출하여 사용가능합니다.

4. 오픈소스 프로젝트


kami2d 라이브러리는 GitHub 를 통해 오픈소스로 공개해 놓았습니다. 

댓글 없음:

댓글 쓰기

시리우스 라이브러리 홈페이지 오픈

현재 시리우스(Sirius) 라이브러리라는 제품을 개발하고 이를 소개하는 홈페이지를 오픈 하였습니다. 관심있는 분들의 많은 방문 요청드립니다. 앞으로 업데이트 소식및 변경사항은 스파이럴랩 홈페이지를 통해 진행할 예정입니다. 스파이럴랩 홈페이지 :  h...