PMG

Форумы по созданию игр
Текущее время: 23 июл 2024 04:21

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Ничего не отрисовывается внутри функции
СообщениеДобавлено: 27 мар 2006 23:00 
Не в сети
Постоянный
Аватара пользователя

Зарегистрирован: 27 мар 2006 22:26
Сообщения: 63
Откуда: Москва
Дело вот в чем:
в программе есть класс который реализует отрисовку CRender.
В нем есть массив указателей на другой класс CPosition: там координаты того что надо рисовать + флажок само оно рисуеться или функцией по-умолчанию.
В цикле получения сообщения вызыветься Функция DrawScene
Код:
int DrawGLScene(CRenderClass Render)                           
{
   
   static CFlag flag1(20,20,BLUE_FLAG);
   static CFlag flag2(30,30,RED_FLAG);
   static BOOL init=FALSE;

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   
   glLoadIdentity();

   if(!init)
   {
      Render.AddObject((CPosition*)&flag1);
      Render.AddObject((CPosition*)&flag2);
      init=TRUE;
   }
   
   Render.UpdateCamera();
      
   Render.RenderAll();            

   return TRUE;
}

Она добавляет два объекта для отрисовки и соответственно рисует
Рисование сводиться к рисованию ландшафта и объектов на нем (в данном случае flag1/2)
UpdateCamera просто делает
Код:
void CRenderClass::UpdateCamera(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   
   glLoadIdentity();                              
   
   glRotatef(xspin,1,0,0);
      
   glRotatef(-yspin,0,1,0);

   glTranslatef(-x,-y,-z);
}


А вот реализация RenderAll:
Код:
void CRenderClass::RenderAll(void)
{
   CSelfDrawable *draw;

   RenderHeightMap();   

   
   for (int i=0;i<objCount;i++)   
      if(objects[i]->drawfunc)      
      {
         draw=reinterpret_cast<CSelfDrawable*>(objects[i]);
         draw->Draw();
      }
}

И тут начинаеться самое интересное:
Если мы просто берем реализацию ф-ции Draw и подставляем в RenderAll (т.е просто код вставить),то все работает без проблем.
Если же оставить так то ландшафт рисуеться а вот флаги - нет.
Если же мы уберем из UpdateCamera
Код:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   
   glLoadIdentity();

и вставим в реализацию ф-ции драв то флаги отрисовываются, ну соответсвенно ландшафт рисуется не там но факт в том что флаги отрисовываются. Если даже закоментить RenderHeightMap то получается что внутри процедуры Draw отрисовка идет только со сбрасыванием битов глубины и цвета, а если поместить код внутрь метода RenderAll То работает без проблем...
Может кто подскажет в чем дело?
Если что-то не понятно в изложении, то поясню.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 29 мар 2006 15:32 
Не в сети
Постоянный
Аватара пользователя

Зарегистрирован: 27 мар 2006 22:26
Сообщения: 63
Откуда: Москва
Неужели никто не знает в чем тут дело? Или я просто не очень понятно изложил?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 29 мар 2006 17:01 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 авг 2004 17:00
Сообщения: 283
Откуда: Москва
Ну хотя бы код функции Draw привели - ведь ссылаетесь на нее. К тому же из приведенного кода не видно, где у вас вызываются функции glBegin glEnd. Абсолютно нет котнтроля возвращаемых функциями значений. А в связи вот с этим фрагментом
if(objects[i]->drawfunc)
{
draw=reinterpret_cast<CSelfDrawable*>(objects[i]);
draw->Draw();
}
хотелось бы увидеть объявления object[] и CSelfDrawable.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 29 мар 2006 21:44 
Не в сети
Постоянный
Аватара пользователя

Зарегистрирован: 27 мар 2006 22:26
Сообщения: 63
Откуда: Москва
Реализация функции Draw Значения не имеет: там может быть все что угодно просто прямоугольник, треугольник - не важно.
Важно то что при вызове этой функции инструкции в ней выполняються (в отладчике смотрел), а эффекта 0. Если мы просто методом cut->past заменяем вызов Draw кодом Draw или очищаем бит глубины и цвета в самой Draw то инструкции отрисовываються.
Что касается CselfDrawable то это класс унаследованный от CPosition
а objects это массив указателей на CPosition.
Больше всего меня интересует почему необходимо очищение буфера глубины и цвета в САМОЙ ф-ции, а не до нее... даже если поставить очистук НЕПОСРЕДСТВЕННО перед вызовом Draw Отрисовки не будет.
Я не очень силен в OpenGL поэтому за советом к вам и обращаюсь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 мар 2006 09:00 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
В функции DrawGLScene у тебя два раза проходит:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
В этом и проблема. Добавь вывод флагов как обычные объекты и проблем не будет.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 мар 2006 23:49 
Не в сети
Постоянный
Аватара пользователя

Зарегистрирован: 27 мар 2006 22:26
Сообщения: 63
Откуда: Москва
Не совсем понял что значит вывод флагов как обычных объектов... Не могли бы вы пояснить.
Попробовал убрать
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
из DrawGLScene, оставив только в UpdateCamera (я правильно понял это имелось ввиду?) результат аналогичен отрисовка кода происходит только при помещении этого самого кода непосредственно в RenderAll.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 31 мар 2006 00:00 
Не в сети
Постоянный
Аватара пользователя

Зарегистрирован: 27 мар 2006 22:26
Сообщения: 63
Откуда: Москва
Обнаружил еще один парадокс:
Код:
void CRenderClass::RenderAll(void)
{
   CSelfDrawable *draw;

   RenderHeightMap();

//   DrawQuad();
   
   for (int i=0;i<objCount;i++)   
      if(objects[i]->drawfunc)      
      {
         DrawQuad();
         draw=reinterpret_cast<CSelfDrawable*>(objects[i]);
         draw->Draw();
      //   DrawQuad();
      }
}

DrawQuad() рисует квадрат.
Если мы вызываем эту ф-цию до цикла то она отрисовывает, если внутри цикла до или после вызова виртуальной Draw() то не отрисовывает... Ничего не понимаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 31 мар 2006 00:12 
Не в сети
Постоянный
Аватара пользователя

Зарегистрирован: 27 мар 2006 22:26
Сообщения: 63
Откуда: Москва
Вопрос снят решение найдено. Дело оказалось в том что объекты удалялись после и добавлялись не совсем корректно... Но вопрос с функцией DrawQuad()
которая просто описана выше в фаиле как рисовалка квадрата отсался не понятым до сих пор...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB