Запуск программ из OpenGL Red Book в Tao Framework + С#

Здравствуйте, поробовал переделать программу из руководства по программированию без корректной реакции на изменение размеров окна, но на экран ничего не выводится : он даже не очищается в заданный цвет. В чем может быть проблема ?
[spoiler]
Вот исходный код из книжки ( листинг 2-5) :

/*http://esate.ru, ZaoTin*/


#define drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES);glVertex2f((x1),(y1));glVertex2f((x2),(y2));glEnd();

void init(void)
{
   glClearColor(1.0,1.0,1.0,0.0);
   glShadeModel(GL_FLAT);
}
 
void display(void)
{
   int i;
 
   glClear(GL_COLOR_BUFFER_BIT);

   //Черный цвет для всех линий
   glColor3f(0.0,0.0,0.0);

   glEnable(GL_LINE_STIPPLE);

   //В первом ряду три линии с разными шаблонами
   glLineWidth(1.0);
   glLineStipple(1,0x0101); //Пунктирная
   drawOneLine(50.0,125.0,150.0,125.0);
   glLineStipple(1,0x00FF); //Штриховая
   drawOneLine(150.0,125.0,250.0,125.0);
   glLineStipple(1,0x1C47); //Штрих-пунктирная
   drawOneLine(250.0,125.0,350.0,125.0);

   //Во втором ряду три толстые линии с аналогичными шаблонами
   glLineWidth(5.0);
   glLineStipple(1,0x0101); //Пунктирная
   drawOneLine(50.0,100.0,150.0,100.0);
   glLineStipple(1,0x00FF); //Штриховая
   drawOneLine(150.0,100.0,250.0,100.0);
   glLineStipple(1,0x1C47); //Штрих-пунктирная
   drawOneLine(250.0,100.0,350.0,100.0);
 
   //В третьем ряду шесть штрих-пунктирных линий, объединенных в ломаную
   glLineWidth(1.0);
   glLineStipple(1,0x1C47); //Штрих-пунктирная
   glBegin(GL_LINE_STRIP);
   for (i=0;i<7;i++)
    glVertex2f(50.0+((GLfloat)i*50.0),75.0);
   glEnd();

   //В четвертом ряду шесть независимых линий того же шаблона
   for (i=0;i<6;i++)
   {
    drawOneLine(50.0+((GLfloat)i*50.0),50.0,50.0+((GLfloat)(i+1)*50.0),50.0);
   }

   //В пятом ряду 1 штрих-пунктирная линия с фактором повторения=5
   glLineStipple(5,0x1c47);
   drawOneLine(50.0,25.0,350.0,25.0);
 
   glDisable(GL_LINE_STIPPLE);
   glFlush();
}
 
void reshape(int w,int h)
{
   glViewport(0,0,(GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluOrtho2D(0.0,400.0,0.0,150.0);
}
 
int main(int argc, char **argv)
{
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
   glutInitWindowSize(400,150);
   glutInitWindowPosition(100,100);
   glutCreateWindow("Line Stipple Patterns");
   init();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutMainLoop();
   return 0;
}




Как переделал (WindowsFormApplication по аналогии уроков с сайта)



/*http://esate.ru, ZaoTin*/

namespace _2_5_
{
   public partial class Form1 : Form
   {
      public Form1()
      {
        InitializeComponent();
        AnT.InitializeContexts();
      }

      private void Form1_Load(object sender, EventArgs e)
      {
        // инициализация библиотеки GLUT 
        Glut.glutInit();
        // инициализация режима окна 

        Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

        // устанавливаем цвет очистки окна 
        Gl.glClearColor(255, 255, 255, 1);

      //   Gl.glShadeModel(Gl.GL_FLAT);

        // устанавливаем порт вывода, основываясь на размерах   элемента управления AnT 
        Gl.glViewport(0, 0, AnT.Width, AnT.Height);

        // устанавливаем проекционную матрицу 
        Gl.glMatrixMode(Gl.GL_PROJECTION);
        // очищаем ее 
        Gl.glLoadIdentity();       

        Glu.gluOrtho2D(0.0, AnT.Width, 0.0, AnT.Height);
    
        timer1.Start();

      }

      private void drawOneLine(double x1, double y1, 
       double x2,    double y2)
      {
        Gl.glBegin(Gl.GL_LINES);
        Gl.glVertex2d(x1, y1);
        Gl.glVertex2d(x2, y2);
        Gl.glEnd();
      }

      private void Draw()
      {
        int i;
        // Очищаем буфер цвета
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

        Gl.glColor3d(0.0, 0.0, 0.0);

        Gl.glEnable(Gl.GL_LINE_STIPPLE);

        Gl.glLineWidth((float)1.0);
        Gl.glLineStipple(1, 0x0101);
        drawOneLine(50.0, 125.0, 150.0, 125.0);
        Gl.glLineStipple(1, 0x00FF); //Штриховая
        drawOneLine(150.0, 125.0, 250.0, 125.0);
        Gl.glLineStipple(1, 0x1C47); //Штрих-пунктирная
        drawOneLine(250.0, 125.0, 350.0, 125.0);

        //Во втором ряду три толстые 
        // линии с аналогичными шаблонами
        Gl.glLineWidth((float)5.0);
        Gl.glLineStipple(1, 0x0101); //Пунктирная
        drawOneLine(50.0, 100.0, 150.0, 100.0);
        Gl.glLineStipple(1, 0x00FF); //Штриховая
        drawOneLine(150.0, 100.0, 250.0, 100.0);
        Gl.glLineStipple(1, 0x1C47); //Штрих-пунктирная
        drawOneLine(250.0, 100.0, 350.0, 100.0);

        //В третьем ряду шесть штрих-пунктирных линий,
        //   объединенных в ломаную
        Gl.glLineWidth((float)1.0);
        Gl.glLineStipple(1, 0x1C47); //Штрих-пунктирная
        Gl.glBegin(Gl.GL_LINE_STRIP);
        for (i = 0; i < 7; i++)
           Gl.glVertex2d(50.0 + ((float)i * 50.0), 75.0);
        Gl.glEnd();
        Gl.glFlush();

        AnT.Invalidate();
      }

      private void timer1_Tick(object sender, EventArgs e)
      {
        Draw();
      }
   }
}
0      2317        29.08.2010        4

0 
29.08.2010 00:00:00
хм… Что то я сначала совсем не то подумал и не то ответил :) Утром постараюсь глянуть )
0 
29.08.2010 00:00:00
Опытным путем было определено, что таймер не стартует из функции Form1_Load
Чтобы решить проблему, надо сразу поставить в настройках таймера enabled — true.

Самое интересное, что ранее я никогда не встречался с этой проблемой, хотя в нескольких уроках таймер инициализировался именно в функции Form1_Load.

Надо будет почитать документацию по классу Timer. Мне кажется что проблема либо в том, что у меня всегда был enabled таймер (и я проглядел такую серьезную ошибку), либо дело в том, что до недавнего времени у меня стояла VS 2008 SP1, сейчас просто VS 2008 — и это баг.
0 
29.08.2010 00:00:00
Блин, оказалось что я не поставил тип проекта в х86 ( Windows 7 x64, MVS 2008 sp1), так стало работать.=). Таймер стартует из Form1_Load и при enabled — true, и при enabled — false. =)
0 
29.08.2010 00:00:00
Обычно, если не стоит x86, а ось x64, то после компиляции вообще валится приложение, а вопрос был в неработающем рендере :)

Кстати, у меня проблема с таймером пока осталась актуальной. Надо поставить VS с SP1, что-то мне кажется тут собака зарыта :)
^
Регистрация
Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 
×
Восстановление пароля
Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш Email. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

или Email
Логин*
Код подтверждения*
Новый пароль*
Подтверждение пароля*
×
Авторизация
  • Используйте вашу учетную запись на Facebook.com для входа на сайт.
  • Используйте вашу учетную запись VKontakte для входа на сайт.
  • Используйте вашу учетную запись Google для входа на сайт.
Авторизуйтесь с помощью соц. сети или с помощью аккаунта на сайте:
×