Circular Progress на OpenGL

Тема в разделе "WASM.OpenGL", создана пользователем Relic, 1 июн 2009.

  1. Relic

    Relic Member

    Публикаций:
    0
    Регистрация:
    10 сен 2003
    Сообщения:
    79
    В SQL 2005 есть типа прогрессбара, появляющееся при выполнении длительной операции. Парни из TMS даже смастрячили Delphi/C++ компонент: http://www.tmssoftware.com/site/acp.asp TАdvCirculаrPrоgress.
    Можно ли сделать аналогичную анимацию на OpenGL? Да так еще, что бы использовать в своих проектах на Delphi?
    (опыт работы с OpenGL практически нулевой :dntknw: )
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А нафига вам такое на OpenGL? Навороченную демо сцену хотите туда запиндрячить?
     
  4. Relic

    Relic Member

    Публикаций:
    0
    Регистрация:
    10 сен 2003
    Сообщения:
    79
    Подумалось, что это легче сделать на нем, чем на win api :) Мне навороты не нужны, просто что-то типа сегментного колеса, в котором бегает по кругу один сегмент другого цвета, типа показать, что процесс идет. И всё! Это можно реализовать десятком-двумя строк кода? Или это потребует дней для реализации?
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Сделать можно и так и эдак, в обоих случаях не сложно. На OpenGL конечно побыстрее будет работать.
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Можно взять анимированную гифку и отобразить её (не знаю какой дельфе-компонент для этого нужен).
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А разве такого нет в стандарных компонентах? Или Rx, или как его?
     
  8. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Relic
    на флэше - 2 часа
    на блендере - 2 часа
    на вынь апи - 2 часа
    на директХ - 3 часа
    на огл - не знаю. не имел дела

    Booster
    а какие скорости от прелоадера требуются? на выньапи имхо короче будет
     
  9. Relic

    Relic Member

    Публикаций:
    0
    Регистрация:
    10 сен 2003
    Сообщения:
    79
    Дело в том, что окно, в котором надо сделать этот прогресс, создается без помощи VCL (т.е. компонентов). А как нарисовать сие при помощи только win api, я не знаю (с графикой не дружу :)), подумалось, что можно заюзать OpenGL - несколько строчек и вуаля! Все готово :)
     
  10. Relic

    Relic Member

    Публикаций:
    0
    Регистрация:
    10 сен 2003
    Сообщения:
    79
    Хорошо. Сам круг (колесо) можно сделать так:
    Код (Text):
    1.   quadObj := gluNewQuadric;
    2.   gluQuadricDrawStyle(quadObj, GLU_FILL);
    3.   gluDisk(quadObj, 2,3,10,10); // <--
    4.   gluDeleteQuadric(quadObj);
    Но как его сегментировать?
     
  11. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    читаем в мсдн про
    GetDC
    PolyDraw (контур цветом текущего пера, заливка - текущей заливкой)

    выводить по
    SetTimer

    массивы точек вам полюбому готовить по WM_SIZE и хранить в SetWindowLong с GWL_USERDATA

    все очень даже просто
     
  12. Relic

    Relic Member

    Публикаций:
    0
    Регистрация:
    10 сен 2003
    Сообщения:
    79
    _basmp_
    Чего-то не соображу, как с помощью PolyDraw нарисовать такое:

    [​IMG]
     
  13. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    делаете массив массивов точек каждого сектора.
    скам 12 массивов по, для начала, 4 точки
    координаты точек рассчитываем в обработчике WM_SIZE
    как
    x1 = X0 + R*cos( (360/12)*n - (360/24) + da)
    y1 = Y0 + R*sin( (360/12)*n - (360/24) + da)

    x2 = X0 + R*cos( (360/12)*n + (360/24) - da)
    y2 = Y0 + R*sin( (360/12)*n + (360/24) - da)

    x3 = X0 + r*cos( (360/12)*n + (360/24) - da)
    y3 = Y0 + r*sin( (360/12)*n + (360/24) - da)

    x4 = X0 + r*cos( (360/12)*n - (360/24) + da)
    y4 = Y0 + r*sin( (360/12)*n - (360/24) + da)

    где n - порядковый номер сегмента (0..11), (X0, Y0) - центр прелоадера, R - наружный радиус, r - внутренний радиус, da - угол пробела между секторами, углы в sin|cos заданы в градусах (double)

    перед выводом сектора в WM_PAINT ставите нужную кисть
    по WM_TIMER перерисовываете контол. и GetDC не надо
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Imho, не судьба...
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Relic

    И шейдеры 4.0 на него, чтобы только с последними видяхами работали!
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    OpenGL в основном годится для 3D. Рисуется параллелепипед. Далее вращаем систему координат, рисуем следующий, с так далее по окружности рисуются все фигуры. По таймеру пусть меняют цвета.
    Примеры в сети есть , рисования кубиков в OpenGL. Вот так - гуглим и читаем книжки по графике.
     
  17. Relic

    Relic Member

    Публикаций:
    0
    Регистрация:
    10 сен 2003
    Сообщения:
    79
    Всем спасибо, буду разбираться.
     
  18. Relic

    Relic Member

    Публикаций:
    0
    Регистрация:
    10 сен 2003
    Сообщения:
    79
    _basmp_
    Забыли про 5-ю точку, замыкающую :)
    Но как-то некрасиво это выглядит:
    [​IMG]

    Промежуток между секторами получается не равномерным (увеличивается от центра) и скруглить бы еще сами сектора. Только как?
    Вот тестовый код на Delphi:
    Код (Text):
    1. procedure TForm5.Button3Click(Sender: TObject);
    2. var n: integer;
    3.     a_pt: array[0..119] of integer;
    4.     a_t: array[0..59] of byte;
    5. begin // рисуем на панели
    6.   H := GetDC(Panel1.Handle);
    7.  
    8.   for n := 0 to 11 do begin
    9.     a_pt[10*n]   := X0 + Floor(Ro*cos( DegToRad((360/12)*n - (360/24) + da)));
    10.     a_pt[10*n+1] := Y0 + Floor(Ro*sin( DegToRad((360/12)*n - (360/24) + da)));
    11.     a_t[5*n]     := PT_MOVETO;
    12.  
    13.     a_pt[10*n+2] := X0 + Floor(Ro*cos( DegToRad((360/12)*n + (360/24) - da)));
    14.     a_pt[10*n+3] := Y0 + Floor(Ro*sin( DegToRad((360/12)*n + (360/24) - da)));
    15.     a_t[5*n+1]   := PT_LINETO;
    16.  
    17.     a_pt[10*n+4] := X0 + Floor(ri*cos( DegToRad((360/12)*n + (360/24) - da)));
    18.     a_pt[10*n+5] := Y0 + Floor(ri*sin( DegToRad((360/12)*n + (360/24) - da)));
    19.     a_t[5*n+2]   := PT_LINETO;
    20.  
    21.     a_pt[10*n+6] := X0 + Floor(ri*cos( DegToRad((360/12)*n - (360/24) + da)));
    22.     a_pt[10*n+7] := Y0 + Floor(ri*sin( DegToRad((360/12)*n - (360/24) + da)));
    23.     a_t[5*n+3]   := PT_LINETO;
    24.  
    25.     a_pt[10*n+8] := a_pt[10*n];
    26.     a_pt[10*n+9] := a_pt[10*n+1];
    27.     a_t[5*n+4]   := PT_LINETO;
    28.   end;
    29.  
    30.   PolyDraw(H, a_pt, a_t, 60);
    31.  
    32.   ReleaseDC(Panel1.Handle, H);
    33. end;
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    C параллаксом, ambient occlusion-ом, deferred shading-ом.
     
  20. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Relic
    сделайте промежуток побольше, а высоту сектора поменьше. или разные углы. или фиксированое смещение
    скруглить - просто. добавьте еще по нескольку точек сверху и снизу на промежуточные углы

    я вобщем то не знаю делфей, но как округляет floor? отбрасывает дробную?

    и чтото мне подсказывает, что разумнее сразу все писать в радианах вместо DegToRad, те вместо
    DegToRad((360/12)*n + (360/24) - da))
    --->
    (Pi*(double)n + Pi/2.0)/12.0 - (double)da

    а лучше все константы вычислить заранее, тк делфи