걍 혼잣말 2009. 7. 8. 04:02
솔직히 나는 감동받았다.

1984년생인 내가 PC를 만져봐야 얼마나 만져봤겠냐만은.....

초등학생때부터 XT(허큘레스)시절떄부터 그 이후의 모델은 거의 다 만져 보았으니

왠만한 모델은 다 만져본거같다.

당시엔 DOS라는 운영체제가 주로 사용되었었는데 MSDOS 4.X 버젼부터 6.2버젼때까지는

다 써본거같다.

그 때에도 K-DOS라는 국내도스가 있었으나, 큰 호응을 얻진 못했다.

그리고 나서 내가 어느정도 컴퓨터전공을 선택하고 공부를 하고있던 어느날....

국내 중소기업에서 운영체제를 개발한다라는 소식을 접했다.

그야말로 쇼크였다. 물론 한컴에서 리눅스와같은 운영체제를 개발하긴했었으나, 이는

배포판의 개발개념이었고, 티맥스의 경우에는 원천기술로 개발이라는 좀 다른방향의 시도였다.

개인적으로 운영체제쪽에 관심이 많은터라 굉장히 놀라지 않을수 없었다.

리눅스와같은 OS의 API호환 및 MS windows의 API의 호환이라는..엄청난 조건이라니.......

그리고 2007년 7월 7일 그 베일이 벗겨졌다.

시연장소에 직접가서 볼순없었지만, 웹영상을통하여 확인할 수 있었다.

전반적으로 프레젠테이션은 OS이론 같은 느낌을 받았다.

오피스, 브라우저, 운영체제, 미디어재생기 를 공개했다.

사실 운영체제로서 필요한 가장 기본적인 기능이라고 할 수 있는 것들이다.

UI측을 살펴보면 마치 WINDOWS XP에 어떤 테마를 입힌듯한 깔끔한 느낌을 받았다.

이는 익숙하던 UI인지라 언급을 안하겠다.

둘째, 부팅속도...뭐 물론 시스템이 좋아서라고도 할순 있지만 부팅속도자체는 굉장히 빨랐다.

마치 예전의 윈미를 보는 느낌이랄까?? 저정도 부팅속도만 유지해준다면 좋을듯도하다.

셋째. 문제의 API호환........사실 이부분이 상당히 기대되었다. 결과는 일단 돌아는 가더라는 것이다.

스타크래프트, 마소오피스, 익스플로러를 시연했다. 스타크래프트의경우 로딩이 너무느려서 뭐라

말할수가 없었다. 파일시스템이 느려서 로딩이 느렸던건지 아니면 내부적 커널의 기능중 구현이 컴

팩트 하지못해서 느렸던건지, 호환 API콜이 늦어서 느렸던건지는 알수가 없다.

하지만 중요한것은 윈도우즈가 아닌 다른 운영체제에서 원래 바이너리 그대로 실행이 "가능"했다

라는 사실이다.

이는 사실 많은 의미를 가진다고 생각한다. 리눅스 계열에서 와인을 통하여 익스플로러가 구동되는

데에 걸린 시간은 10년가까이나 된다.

하지만 티맥스 사는 이를 5년 이내의 시간내에 어느정도 이룩해내었다. 물론 참조할 프로젝트가

있었기에 가능한 일이었다라고 생각하지만, 결과에는 박수를 보내고싶다.

하지만 불안정한 그 작동 결과에 대해서는 티맥스 사에서도 할말이 없을것이다. 이는 계속 보완해

나가야할 점이라고 생각한다. 왜냐하면 그토록 강조했던점이 윈도우즈, 리눅스계열의 어플리케이

션을 그대로 사용가능하다라는점이 강점이었기 떄문이다.

셋째. 알파수준도 안되는 완성도이다. 공개시연시에 보여준 퀄리티는 어느정도 틀은 잡혔다라고 할
수 있으나, 알파수준이 안되는 퀄리티였다. 부팅이되고, 어플리케이션을 로딩하여 작동은 하지만,

전체적인 구성상 많은 부분이 미구현되어있는 상태였다고 할수 있을것 같다. 작업관리자 하며,

로딩속도 하며, 드라이버의 구성 정도까지....이런 부분들이 단시간내에 해결이 가능할까 라는

생각이 드는 부분이기도하다. 윈도우즈98을 빌게이츠가 처음 발표하던 날 시연당일날 블루스크린

이 발생했다. 그리고는 웃음거리가 되었다. 빌게이츠 본인도 당황한듯 보였었다. 마치 그런 상황이

이번 티맥스 시연때에 나타났다. 개인적으로는 높은 완성도를 가지고 나오길 바랬지만. 아쉽다.

발표중간중간 그리도 강조하던 마이크로커널의 강점인 안정성... 핵심부분을 제외하고 유저부분으

로 넘김으로써 커널의 크래쉬를 감소시킨다라는 점은 운영체제론을 공부한 학생이라면 누구나 알

법한 내용이다. 하지만, 티맥스 윈도우가보여준 모습은 그렇지 못했다. 구현상의 문제라고 생각하

지만 이점 역시 심각한 문제라고 생각한다.

넷째. 시연을 보며 또하나 느낀점은, 너무 이른 시연이 아니냐라는 생각이 들었다. 마치 개발이 아

직 남았는데, 경영진측에서 공개해라고 강압적 일정을 잡은것이 아니냐는 느낌을 받았다. 이 이유

역시 완성도이다. 개발자라면, 자신이 만든 코드라면 적어도 이정도쯤되면 어느정도는 잘돌아간다,
혹은 아직은 시연하기엔 부족하다. 라고 느낄텐데, 그런 상황이라면 어느정도 일정을 제대로 잡았

을법도한데 그러지 못했다라는 느낌을 받았기 떄문이다. 아쉬운 대목이며, 한편으로는 씁쓸한 대목

이다.

다섯째. 윈도우즈XP라는 오래된 운영체제 그리고 안정화된 운영체제가 독점에 가깝게 자리잡은 상

태에서, 적어도 XP정도는 되어야 틈을 비집고 들어올수 있을텐데라는 생각이 들어서 아쉬웠다. 물

론 운영체제 개발이 그리 쉬운작업이 아니고, 단시간에 이루어지는 작업이 아니라는건 알고있다.

하지만, 어느정도 목표를 가지고 시작했다면 그에 걸맞는 결과물을 가져왔어야 되지않나 라는 생각

이 든다. 개인적으로 너무나도 잘만든 OS라고 생각하는 XP, 그리고 곧 나올 윈7의 벽이 너무나도

높아보이는건 사실이다. 첫술에 어찌 배부를수 있겠냐라고 생각한다. 운영체제에 대한 기본적 바탕

을 깔아놨으니, 언제가 될지는 몰라도 안정적이고 멋진 국산GUI방식의 운영체제가 나올거라 생각

한다.

여섯째. 티맥스 자체의 바이너리 포맷으로 왜 시연을 하지않았냐 라는 것이다. 이점 역시 좀 모호하

다. 유닉스/리눅스, 윈도우즈 바이너리가 호환되고 API가 호환되는건 발표로 인해 그렇겠거니 라

고 생각하지만 자체의 포맷에 대한 시연도 없고 발표도 없다.(못본걸수도있지만..) 이점이 조금 의

아하다. 오히려 자체의 구조라면 작동이 빠르지 않았을까라는 생각이 들기떄문이다. 여로모로 아쉬

운 대목이다.



현재 많은 포럼, 그리고 블로그에는 이에 대한 글들이 속속 올라오고있다. 개인적인 생각은 뚜껑은

열렸지만 아직 안정화된 버젼이 아니라는 점이다. 블로거들과 워리어들이 그리 숭배하는 윈도우즈

도 초창기버젼은 불안정하기 그지없다라는 사실을 생각하면, 어느정도 참아줄만하지않을까? 비록

언론을 통해 발표한 과대포장에 비해 조금 초라하긴했지만 이정도 시작이라면 기대해볼만 하다라

는것이 나의 생각이다. 대신, 개발자들을 너무 혹사시키지 않았으면 한다. 그정도 기간에 저정도를

가져오기위해 얼마나 혹사했을지 뻔히 보이기 떄문이다. 막무가내식의 까대기로 자주보인다.

그것도 국내전문 포럼에서 말이다. 의견은 다를수 있으니 뭐라 할 수는 없지만 적어도, 자신이 직접

써본이후에 까대도 까대는것이 맞지않을까? 올해연말즈음되면 직접 사용해본 유저들이 나올듯하

다. 그러면 정말로 까대도 까댈수 있을듯하지만 아직은 아니다. 그리고 쥐뿔도 제대로 모르면서

설레발치는 네티즌들의 글에도 문제가 있다. 정확하지않은 추측이 마치 정보인것마냥 떠든느 행태,

아쉽다. 성숙하지못한 문화랄까....; ReactOS를 베꼈다라는 증거도 없고, wine을 베꼈다라는 증거

도 없고, 결과를 보아도 조금은 틀리다란 느낌을 받았다. 소스를 직접 본것도 아니면서 무슨 근거로

그렇게 말을 하는지를 모르겠다. 물론 내가 무지해서 그렇게 생각하는걸수도 있지만....ReactOS를
직접 돌려봤던 나로서는 그 불안정함을 알기에 이렇게 말을하는것이다.

앞으로 걸어나가야할 길이 멀기는 하지만, 그래도 기대한다. 1년6개월동안 두근거리며 기다렸던

티맥스윈도우9, 그리고 그 두근거림을 어느정도는 보답해준 결과에 안정화되어 멋진모습으로

나오길바라며 다시 기대를 시작한다.....
posted by Sense.J
:
OpenGL 2009. 6. 3. 02:29

4-1학기(원래는 3-1학기) 그래픽스 과제로 개발중인 녀석이다...
일리히트 게임엔진과 Bullet 물리엔진을 사용했다.....

사용자 삽입 이미지


캐릭터는 그릴 재주가 없어 샘플 가져다쓰고....여러가지 효과는 일리히트를 조작하여 만들어냈다.
화면상으로는 볼순없지만 내부적 충돌처리도있어 이동에 대한 처리도 가능하고....뭐 그럴싸하다.

개인적으로 존경하는 존카멕 형님이 공개해주신 퀘이크 소스코드에서 추출한 BSP Loader, BSP CONVERTER를 적용시켰다. 그렇게라도 하지않으면 정말 느리다....;; 발로짯기때문이랄까...;; (발코..발코...)
Bullet Phsyx 물리엔진 붙여서 사용하고, Plane wave기능 적용시켜서 물효과주고..., 3인칭 카메라 매니저 작성해서 붙여서 따라다니는 카메라 구현했다...(디아블로시점이랄까)

posted by Sense.J
:
OpenGL 2009. 4. 21. 03:45

예전의 약속대로 공개합니다.
기본적인 드로잉에 대한 코드가 구현되어있습니다.
소스코드 자체가 난잡하므로...(내공이 없어서....)
참고하실분은 알아서 잘 추려서 참고하세요..

posted by Sense.J
:
걍 혼잣말 2009. 4. 8. 01:59
True라는 밴드의 싱글앨범들이다....

정말이지 내가 좋아하는 스타일의 음악을 하는듯한데 유명하진않은듯하다.

조금은 아까운 밴드인듯.....

엠넷에 있는걸 알고선, 다운로드했다...

정규1집이 안나온게 아까울정도.....시디도 절판되어 구하기도힘든앨범.....

아무튼..고음질의 음원을 구해서 기분이 무척좋다..
posted by Sense.J
:
OpenGL 2009. 4. 6. 02:30
Line, Rectangle, Circle, Sphere, Cube 의 각각의 객체에 대하여 구조체를 선언
각각의 구조체에는 좌표값을 위한변수, 로테이션을 위한 값, 그룹을 위한 할당값,
선택여부판단을 위한 Boolean 등이 들어있다.

이러한 객체를 관리하기위해 Vector를 이용하여 리스트를 구성하였다.
그러면 각각의 객체를 관리할수 있기때문이다.

드로우 에서는 두가지 펑션이 호출되게 해놓았는데,
하나는 오브젝트를 리스트를 돌면서 화면에 출력하는 것이고
하나는 마우스의 클릭&드래그를 통한 러버밴딩을 위한 출력을 위한 함수 두개를 호출.

다른 객체들을 그리는 부분은 모두들 쉽게 구현을 했으리라 생각한다. 하지만
많은 사람들이 glTranslatef 를 통한 중점 이동을 한후에 어떠한 문제가 발생했으리라 추측된다.

아마도 화면이 계속 밀리듯이 하다가 객체가 안보이는 현상이 생겼을것이다.

이는 매트릭스 모드의 복구가 이루어지지 않았기 떄문이다.
즉 무슨말인고 하니 , glTranslatef(0.5, 0.5, 0); 을 했다치면은 객체를 그린후
glTranslatef(-0.5, -0.5, 0) 를 해주어야 된다라는거다.

하지만 이짓을 상당히 귀찮은 짓이다.

그래서 glPushMatrix(); 를 통해서 현재 매트리스 상태를 저장하고 어떠한 작업을 한후에(중점 옮기기 라던지, 로테이션이라던지 이런것들) glPopMatrix()를 통해서
원래 상태로 되돌리면 위와같은 문제는 간단히 해결된다.

객체 변환의 기능의 경우 각각의 객체가 리스트르 통해서 따로관리되기에 각각의 값을 불러와서
그대로 로테이션, 해주고 출력하면 모든것이 해결된다. 단, 스케일의 변화같은경우에는 직접 객체를 그리기위한 반지름의 값, 혹은 사각형 등을 그리기위한 좌표값을 수정해서 저장해야만 반영이 되므로 이점을 유의하면 나머지도 무사히 구현가능하리라 생각한다.

러버벤딩을 이용한 처리의 경우에는, 마우스의 처음 클릭 값과, 마우스 버튼을 떼었을때의 경우를
생각해서 드로잉 하면되겠다. 이러면 별 문제가 발생하지않고 다 해결된다.

만약, 객체를 그렸는데 나타나지않는다면 이 경우를 의심해보자.
중심좌표를 이동할때 (마우스좌표값/화면축의 길이값)과 같이 적용했는지를 확인해보면 간단히 나온다.
무슨말인고하니 glOrthogo와 같이 투영값을 지정해줄시에 화면에 맵핑되는 값을 -1 ~ 1, 이런식으로 값을 지정하게되는데 거기게 맞는 값으로 매핑을 해주어야 윈도우 좌표계와 매핑되어 나오기 떄문이다. 즉 저값을 벗어나면 그냥 뷰의 화면에선 보이지않게된다. 이점을 잘 생각해보면 출력이 되지않는 경우를 제대로 할수있을것이다.

객체의 복사 붙이기 기능의 경우 역시 버퍼를 이용하면 단순하다.
어떠한 객체가 지정되면, 객체의 리스트의 정보에 셀렉트의 bool값이 true가 될것이고 이정보들을
컨트롤+c와같이 명령어를 먹이는순간 카피버퍼에리스트에 다 복사한다.
 그리고 붙이기를 할때, 그 값을 해당하는 리스트에 다시 삽입하면 되는것이다. 그러면 화면에는
겹쳐져서 안보일지 몰라도 객체가 그려져 있을것이다.

잘라내기 역시 위와같으나, 버퍼에 옮김후에 원래 내용을 지워주면 해결된다.(간단한 문제임..)

드래그를 통한 객체이동의 경우 조금 귀찮은 방법을 사용해서 구현했다.
객체의 구조체에 처음에 그려진 좌표값이 있고, 드래그중에 이동될 x,y 변화값을 기록을 통해
드래그시에 이값을 참조하여 이동시켜 뿌리면 해결된다.
단 마우스 버튼을 떼는순간 이 값을 적용한 값을 좌표에 기록해주고, 그 이후 이 변화값을 0으로 해주면 말끔하게 드래그를 통한 객체 이동이 구현된다.

워낙 두서없이 글을 써서 정보를 얻을수 있으려나 모르겠지만, 한번쯤 디버깅을 해본 사람이라면
약간의 단서는 제공했으리라 생각된다.
posted by Sense.J
:
OpenGL 2009. 3. 29. 23:33
사용자 삽입 이미지

(사진을 클릭하면 확대됩니다)


MFC + OPENGL 로 연동중인 화면이다.
아직 세부적인 기능을 다 구현하지 않았기에 개발 스크린샷만 공개한다.
개발이 완료되면, 세부적 기능을 어떻게 구현했는지와 소스코드를 올리겠다.(제출지난후에)
posted by Sense.J
:
OpenGL 2009. 3. 28. 13:38
소스코드는 레포트제출이 완료된 이후에 올리겠음.

레포트 자료는 아니나, 실습과제가 실습레포트1이랑 관련이 있기에

추후 공개하고, 실행파일만 공개함.
posted by Sense.J
:
걍 혼잣말 2009. 3. 20. 02:34

사용자 삽입 이미지
 
유입경로 단어들을 보았더니 재미나는구나.
탁성우 교수님도 유입경로 단어에 포함되어있다니.....깜놀...;;
2학년 아이들이 힘든건가.....그정도 시련쯤이야...!!;;
SIC/XE가 검색되는걸보니 다른학교에서 SIC/XE를 하는듯....
내 소스 발로 짠건데,  블로그에 먹이떼를 찾아다니는 하이에나 처럼 우르르 몰려오신
손님들을을 위해 쓰지않을 코드를 공개하는것도 나쁘진않겠지?


posted by Sense.J
:
OpenGL 2009. 3. 20. 01:55

#include <glut.h>    
#include <gl.h>      
#include <glu.h>
#include <stdlib.h>
#include <stdio.h>
#include <vector>

using namespace std;
// Define for Enum value
enum Drawtype {points, line, triangle, polygons};
#define vertexcnt vertice.size()


// Structure for Vertex Information
struct vertex
{
 GLint x,y,z;
};

// Vertex Matrix Information
vector<vertex> vertice;

// Menu Type
int type = points;

// Wire information
bool wire=false;

// 동적으로 찍을수 있게 하기위한 창의 사이즈 값.
GLint width,height;
GLfloat thick=1.0f;

// 컬러 설정을 위한 값.
GLfloat r=0.5,g=0.5,b=0.5;

//---------------------------------------------------------------------------------------------

// 화면 렌더링펑션
void MyDisplay( ){  
 int cnt=0;
   
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(r, g, b);

 // 여기에서 드로잉
 if(type == points)
 {
  glPointSize(thick);
  for(cnt=0; cnt<vertexcnt; cnt++)
   {    
    glBegin(GL_POINTS);
    glVertex3f((GLfloat)vertice[cnt].x/width,(GLfloat)vertice[cnt].y/height,0.0);    
    glEnd();  
   }  
 }

 else if(type == line)
 {
  glLineWidth(thick);
  if(vertexcnt >1)
  for(cnt=0; cnt<vertexcnt-1; cnt+=2)
   {    
    glBegin(GL_LINES);  
    glVertex2f((GLfloat)vertice[cnt].x/width,(GLfloat)vertice[cnt].y/height);    
    glVertex2f((GLfloat)vertice[cnt+1].x/width,(GLfloat)vertice[cnt+1].y/height);
    glEnd();  
   }  
 }

 else if(type == triangle)
 {
   if(vertexcnt>2)
   for(cnt=0; cnt<vertexcnt; cnt+=3)
   {
    if(!wire)
    glBegin(GL_TRIANGLES);
    else
     glBegin(GL_LINE_LOOP);
    if(cnt+2 < vertexcnt)
    {
     glVertex3f((GLfloat)vertice[cnt].x/width,(GLfloat)vertice[cnt].y/height,0.0);        
     glVertex3f((GLfloat)vertice[cnt+2].x/width,(GLfloat)vertice[cnt+2].y/height,0.0);  
     glVertex3f((GLfloat)vertice[cnt+1].x/width,(GLfloat)vertice[cnt+1].y/height,0.0);    
    }
    glEnd();    
   }  
 }
 else if(type == polygons)
 {    
   if(wire)
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
   else
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);  
   
   glBegin(GL_POLYGON);  
   for(cnt=0; cnt<vertexcnt; cnt++)
    glVertex3f((GLfloat)vertice[cnt].x/width,(GLfloat)vertice[cnt].y/height,0.0);      
   glEnd();  

 }
    glFlush( );  
}

// 리사이징 이벤트
void MyReshape(int NewWidth, int NewHeight)
{  
 glViewport(0, 0, NewWidth, NewHeight); 
 width = NewWidth;
 height = NewHeight;

 printf("창사이즈 변경 : %d %d\n",NewWidth,NewHeight);
 glMatrixMode(GL_PROJECTION); //투상행렬을 변환대상으로 설정
 glLoadIdentity();
 glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 1.0);   
}

// 키보드 일반키 이벤트
void keyboard(unsigned char pressed, int x, int y)
{
 switch(pressed)
 {
 case 'w' :
  if(wire)
   wire = false;
  else
   wire = true;
  break;
 case ']':
  thick += 0.15f;
  break;
 case '[' :
  thick -= 0.15f;
  break;
 case 'q' :
 case 'Q':
  exit(0);
  break;
 case 'a':
  r+=0.01;
  break;
 case 'z':
  r-=0.01;
  break;
 case 's':
  g+=0.01;
  break;
 case 'x':
  g-=0.01;
  break;
 case 'd':
  b+=0.01;
  break;
 case 'c':
  b-=0.01;
  break;
 }
 if(thick <= 0)
  thick = 0;
 if(thick >=5)
  thick =5;
 glutPostRedisplay();
}

// 마우스 클릭이벤트
void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y){
    int cnt=0;
 if(Button==GLUT_LEFT_BUTTON && State==GLUT_DOWN){
  vertex temp;
  temp.x=X;
  temp.y=Y;
  temp.z=0;
  vertice.push_back(temp);
  //vertexcnt = vertice.size();
  printf("[%d] ( %d,  %d,  %d)\n",vertexcnt,X,Y,0);
    }
 glutPostRedisplay();
}

void MyMainMenu(int entryID){    
    if(entryID == 1)
 {      
  vertice.clear();
  system("cls");
 }
 if(entryID == 2)
        exit(0);    //프로그램 종료
    glutPostRedisplay();
}  

void MySubMenu(int entryID){    
    if(entryID == points)
        type = points;   // 점그리기
    else if (entryID == line)
  type = line;   // 선그리기
 else if (entryID == triangle)
  type = triangle;   // 삼각형
 else if (entryID == polygons)
  type = polygons;   // 폴리곤
    glutPostRedisplay();
}  
void setup()
{
 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 glColor3f(0.0f, 1.0f, 0.0f);
}

int main(int argc, char** argv) {
    glutInit(&argc,argv);  
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(300, 300);     
    glutInitWindowPosition(0, 0);
    glutCreateWindow("OpenGL Mj's Report");
    glClearColor (1.0, 1.0, 1.0, 1.0);  
    glMatrixMode(GL_PROJECTION);   
    glLoadIdentity( );   
 glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 1.0); 
 // 서브메뉴등록
    GLint MySubMenuID = glutCreateMenu(MySubMenu);
    glutAddMenuEntry("Points", 0);
    glutAddMenuEntry("Lines", 1);
 glutAddMenuEntry("Triangle", 2);
 glutAddMenuEntry("Polygones", 3);

 // 메뉴등록
    GLint MyMainMenuID = glutCreateMenu(MyMainMenu);    
    glutAddSubMenu("Drawing", MySubMenuID);  
 glutAddMenuEntry("Clear", 1);
    glutAddMenuEntry("Exit", 2);
 // 버튼에대한 메뉴등록
    glutAttachMenu(GLUT_RIGHT_BUTTON);

 // 드로잉 펑션 등록
    glutDisplayFunc(MyDisplay);   
 setup();

 // 마우스 클릭이벤트 콜백함수 등록
 glutMouseFunc(MyMouseClick);

 // 키보드 이벤트 콜백함수 등록
 glutKeyboardFunc(keyboard);

 // 리사이징 이벤트 콜백함수 등록
 glutReshapeFunc(MyReshape); //reshape callback

    glutMainLoop( );  
    return 0;  
}

// 추가된기능
// [, ] 키를 이용한 굵기조절
// az  sx  dc  를 이용한 r,g,b 색상조정
// w키를 이용한 와이어프레임 렌더링 조정 기능 추가
// 라인모드일시에 쭉 이어지는게 아니라 한 쌍씩 되게끔 수정.
// STL의 벡터를 이용한 다중 버텍스정보입력
// 창의 사이즈 조절에 따른 확장기능


posted by Sense.J
:
OpenGL 2009. 3. 17. 23:24

#include <glut.h>    
#include <gl.h>      
#include <glu.h>
#include <stdlib.h>
#include <stdio.h>

struct vertex
{
 GLint x,y,z;
};

int vertexcnt=0;

struct vertex vertice[10000];
GLint TopLeftX, TopLeftY, BottomRightX, BottomRightY;
int type = 0;
 
void MyDisplay( ){  
 int cnt=0;
    glViewport(0, 0, 300, 300);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.5, 0.5, 0.5);

 // 여기에서 드로잉
 if(type == 0)
 {
  glPointSize(3.0f);
  for(cnt=0; cnt<vertexcnt; cnt++)
   {    
    glBegin(GL_POINTS);
    glVertex3f((GLfloat)vertice[cnt].x/300,(GLfloat)vertice[cnt].y/300,0.0);    
    glEnd();  
   }  
 }

 if(type == 1)
 {
  glLineWidth(1.0f);
  if(vertexcnt >1)
  for(cnt=0; cnt<vertexcnt-1; cnt++)
   {    
    glBegin(GL_LINES);  
    glVertex2f((GLfloat)vertice[cnt].x/300,(GLfloat)vertice[cnt].y/300);    
    glVertex2f((GLfloat)vertice[cnt+1].x/300,(GLfloat)vertice[cnt+1].y/300);
    glEnd();  
   }  
 }

 if(type == 2)
 {
   if(vertexcnt>2)
   for(cnt=0; cnt<vertexcnt; cnt+=3)
   {    
    glBegin(GL_TRIANGLES);
    if(cnt+2 < vertexcnt)
    {
     glVertex3f((GLfloat)vertice[cnt].x/300,(GLfloat)vertice[cnt].y/300,0.0);    
     glVertex3f((GLfloat)vertice[cnt+1].x/300,(GLfloat)vertice[cnt+1].y/300,0.0);    
     glVertex3f((GLfloat)vertice[cnt+2].x/300,(GLfloat)vertice[cnt+2].y/300,0.0);    
    }
    glEnd();    
   }  
 }
 if(type == 3)
 {  
   glBegin(GL_POLYGON);
   for(cnt=0; cnt<vertexcnt; cnt++)
   {    
    glVertex3f((GLfloat)vertice[cnt].x/300,(GLfloat)vertice[cnt].y/300,0.0);      
   }
   glEnd();
 }
    glFlush( );  
}

// 마우스 클릭이벤트
void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y){
    int cnt=0;
 if(Button==GLUT_LEFT_BUTTON && State==GLUT_DOWN){
  vertice[vertexcnt].x=X;
  vertice[vertexcnt].y=Y;
  vertice[vertexcnt++].z=0;
  printf("[%d] (%d, %d %d)\n",vertexcnt-1,X,Y,0);
    }
 glutPostRedisplay();
}

void MyMainMenu(int entryID){    
    if(entryID == 1)
 {
        vertexcnt=0;   // 초기화
  system("cls");
 }
 if(entryID == 2)
        exit(0);    //프로그램 종료

    glutPostRedisplay();
}  

void MySubMenu(int entryID){    
    if(entryID == 1)
        type = 0;   // 점그리기
    else if (entryID == 2)
  type = 1;   // 선그리기
 else if (entryID == 3)
  type = 2;   // 삼각형
 else if (entryID == 4)
  type = 3;   // 폴리곤
    glutPostRedisplay();
}  
void setup()
{
 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 glColor3f(0.0f, 1.0f, 0.0f);
}
int main(int argc, char** argv) {
    glutInit(&argc,argv);  
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(300, 300);     
    glutInitWindowPosition(0, 0);
    glutCreateWindow("OpenGL Mj's Report");
    glClearColor (1.0, 1.0, 1.0, 1.0);  
    glMatrixMode(GL_PROJECTION);   
    glLoadIdentity( );   
 glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 1.0); 
 // 서브메뉴등록
    GLint MySubMenuID = glutCreateMenu(MySubMenu);
    glutAddMenuEntry("Points", 1);
    glutAddMenuEntry("Lines", 2);
 glutAddMenuEntry("Triangle", 3);
 glutAddMenuEntry("Polygones", 4);

 // 메뉴등록
    GLint MyMainMenuID = glutCreateMenu(MyMainMenu);    
    glutAddSubMenu("Drawing", MySubMenuID);  
 glutAddMenuEntry("Clear", 1);
    glutAddMenuEntry("Exit", 2);
 // 버튼에대한 메뉴등록
    glutAttachMenu(GLUT_RIGHT_BUTTON);

 // 드로잉 펑션 등록
    glutDisplayFunc(MyDisplay);   
 setup();

 // 마우스 클릭이벤트 콜백함수 등록
 glutMouseFunc(MyMouseClick);  
    glutMainLoop( );  
    return 0;  
}

posted by Sense.J
: