Вопросы по LCL

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Вопросы по LCL

Сообщение zub » 20.06.2010 15:40:36

Эээ, а это как?

Весь чертеж каждый раз перерисовывать долго (зависит от насыщенности чертежа, в общем случае - долго), поэтаму запоминаю результат работы рендера в картинку и при небольших изменениях вывожу картинку + рисую изменения. например так поступаю при добавлении линии на чертеж - после указания первой точки на экране появляется резиновая линия к курсору линия
У меня тоже простая прорисовка. Просто ради изучения. Но VBO легче, удобнее и быстрее.

С VBO геометрия хранится на GPU, - для большой статической геометрии - самое то. Для небольших динамических примитивов ИМХО не подходит. Допустим имеем 100000 отрезков разного цвета, пользователь может в любой момент изменить любой отрезок, или все сразу. как тут построить буфера? О вбо буду думать когда появится поддержка типов линий - т.е. когда простая линия будет состоять из множества отрезков - пунктирная, зигзагная и т.д.

Так, вроде, это и не наворот, а стандартная функция.

Я дополнительно к средствам OpenGL на CPU считаю видимость примитивов.

Кстати, в lazarus/components/opengl есть кроссплатформенные компоненты для работы с OpenGL.

Спасибо, учту когда дойду до портирования GL окна
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопросы по LCL

Сообщение А.Н. » 20.06.2010 16:29:38

Весь чертеж каждый раз перерисовывать долго (зависит от насыщенности чертежа, в общем случае - долго), поэтаму запоминаю результат работы рендера в картинку и при небольших изменениях вывожу картинку + рисую изменения.

Хм... Интересно. А картинка точно рисуется быстрее?
Честно говоря, "тянет" немного. Мышь двигается как-бы маленькими рывками, "тяжело".
Вроде, там нет такой уж навороченной графики, должно, вообще, без тормозов работать даже на старых системах (как у меня).

например так поступаю при добавлении линии на чертеж - после указания первой точки на экране появляется резиновая линия к курсору линия

А дисплейные списки, в этом случае, не быстрее?

С VBO геометрия хранится на GPU, - для большой статической геометрии - самое то.

Как раз, у вас, большая часть геометрии. Ведь объекты изменяются не самостоятельно, пользователем.
Он может изменить за раз один объект.
По мере усложнения схемы, всё меньшая часть объектов меняется.

Допустим имеем 100000 отрезков разного цвета, пользователь может в любой момент изменить любой отрезок, или все сразу.

Все сразу? Т.е., например, цвет одной трассы со сложной конфигурацией?

как тут построить буфера? О вбо буду думать когда появится поддержка типов линий - т.е.

Ну, возможно меньше линии использовать?

когда простая линия будет состоять из множества отрезков - пунктирная, зигзагная и т.д.

Учитывая то, что я с ним не работал, сказать ничего не могу. Но, кажется, там есть не только массивы координат, но и массивы свойств?
В любом случае, вроде как, glBegin()/glEnd() - самый медленный способ.
Даже, если не использовать VBO, гораздо быстрее через массивы вершин.
У меня сделано через glBegin()/glEnd().
Но, вначале компилируются дисплейные списки, которые потом перекомпилируются только при изменениях.
Не знаю что быстрее: дисплейные списки или массивы вершин, поскольку, это уже зависит от внутреннего устройства OpenGL и, вероятно, от того оптимизирует ли он каким-то образом передачу вершин в дисплейных списках (может, даже от конкретной реализации). Надо искать, короче.
Но, как я думаю, использование текстур, вместо них - медленнее.

P.S.:
К слову, ещё потыкал там немного (всё на первом проекте, который сразу открывается):
1.) Меню->Создание схемы подключения извещателей выкидывает AccessViolation.
2.) Создание принципиальной схемы сети. Кнопка разместить: AV.
3.) Создал журнал. Покликал по меню. Кликнул "Прокладка кабельной трассы".
Три точки. Ни с чем не связаны. Кликнул правой кнопкой, кликнул средней. Нажал Enter.
Трасса нарисовалась.
Кликнул на трассу (может, попал в пустое место). Повисло. Через несколько секунд гавкнул DEP.
Завершилась.
4.) Расстановка оборудования. Название пишет неверно. Видимо, проблемы с UTF.
Аналогично с маркерами кабелей.
5.) Неплохо бы добавить манифест. Один клик, и нормально выглядящий интерфейс.

Добавлено спустя 56 секунд:
Я дополнительно к средствам OpenGL на CPU считаю видимость примитивов.

В смысле, zOrder, кто что перекрывает? А для чего?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Вопросы по LCL

Сообщение zub » 20.06.2010 20:03:58

>>Хм... Интересно. А картинка точно рисуется быстрее?
когда в кадре мало объектов - перерисовка быстрее. с насыщением чертежа - картинка выходит вперед.
поддерживается несколько режимов восстановления изображения: AUX (не на всём железе), ACCUM (не на всём железе), сохранение в память, перерисовка, сохранение в текстуру. Переключение режимов - Рендер\Восстановление изображения. Попробуйте загрузить чертеж побольше (например **debug**\Загрузить пример ОПС), прозуммировать чтобы в кадре были все объекты и посмотреть различные режимы - перерисовка будет хуже всех.

>>Честно говоря, "тянет" немного. Мышь двигается как-бы маленькими рывками, "тяжело".
>>Вроде, там нет такой уж навороченной графики, должно, вообще, без тормозов работать даже на старых системах (как у меня).
Я не претендую на супербыстрость)), но элементарные вещи конечно тормозить не должны. Что за система? Контекст опенГЛ апаратный? что пишет на вкладке "Рендер"?

>>А дисплейные списки, в этом случае, не быстрее?
Вполне возможно, но они вроде объявлены deprecated

>>Ведь объекты изменяются не самостоятельно, пользователем.
вот именно, пользователь может выбрать хоть что и изменить. Если делать 1 большой VBO на все объекты чертежа - его придется постоянно пересоздавать - это всеравно что glBegin()/glEnd(). если делать на каждый объект отдельный VBO- это оправдано только на объекты с большим количеством вершин, 1000 VBO на 1000 линий?

>>Все сразу? Т.е., например, цвет одной трассы со сложной конфигурацией?
Например можно выделить все и поменять цвет или навыделять "ручек" и изменить геометрию.

>>Но, как я думаю, использование текстур, вместо них - медленнее.
зато скорость не зависит от кол-ва примитивов. ИМХО в первую очерередь стоит думать над алгоритмами оптимизации, а уж потом повышать скорость "прямого" вывода. например было бы неплохо приделать чтонибудь типа OCTREE или более оптимальное разбитие пространства.

>>К слову, ещё потыкал там немного (всё на первом проекте, который сразу открывается):
Сейчас нет "стабильной" версии какраз перед переходом на LCL было изменено несколько принципиальных моментов и до конца не отлажено. Сейчас переход в самом разгаре и вообще мало что работает))

>>В смысле, zOrder, кто что перекрывает? А для чего?
Оптсечение по пирамиде видимости. Чтоб не слать на GPU и не проверять на выбор мышкой заведомо невидимые примитивы. конечно когда чертеж состоит из обычных линий - толку от него немного, когда из сложных блоков - результат на лицо))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопросы по LCL

Сообщение А.Н. » 20.06.2010 23:15:36

когда в кадре мало объектов - перерисовка быстрее. с насыщением чертежа - картинка выходит вперед.
поддерживается несколько режимов восстановления изображения: AUX (не на всём железе), ACCUM (не на всём железе), сохранение в память, перерисовка, сохранение в текстуру. Переключение режимов - Рендер\Восстановление изображения. Попробуйте загрузить чертеж побольше (например **debug**\Загрузить пример ОПС), прозуммировать чтобы в кадре были все объекты и посмотреть различные режимы - перерисовка будет хуже всех.

"Перерисовка" и "В памяти" - тормозят сильнее всех.
AUX сглючил. Я приложил скриншот.

Я не претендую на супербыстрость)), но элементарные вещи конечно тормозить не должны. Что за система? Контекст опенГЛ апаратный? что пишет на вкладке "Рендер"?

P-IV/RAM 768 Мб/GeForce MX440, OGL программный (у меня драйвера не установлены по-человечески).
Но тянет при движении мыши над поверхностью. Т.е., "прицел" за мышью не успевает.

Вполне возможно, но они вроде объявлены deprecated

Поискал:
http://ru.wikipedia.org/wiki/OpenGL_3.0
Да, и правда, убрали. :( Я не знал. Очень много убрали.
Интересно, ПО, использующее старую версию как будет работать с новым OpenGL?
Хотя, какое-то расширение GL_ARB_compatability есть...

ИМХО в первую очерередь стоит думать над алгоритмами оптимизации, а уж потом повышать скорость "прямого" вывода.

Да, наверное.

>>Ведь объекты изменяются не самостоятельно, пользователем.
вот именно, пользователь может выбрать хоть что и изменить. Если делать 1 большой VBO на все объекты чертежа - его придется постоянно пересоздавать - это всеравно что glBegin()/glEnd().

Я имел ввиду, что пользователь за одно действие изменяет один объект.
Обычно (ну, вряд ли, ему потребуется менять цвета сотни линий каждый раз).
Т.е., большая часть схемы получается - статическая.
А меняется небольшое число объектов.
Причём, чем их больше на схеме, тем меньший процент объектов будет меняться.

если делать на каждый объект отдельный VBO- это оправдано только на объекты с большим количеством вершин, 1000 VBO на 1000 линий?

500, максимум. :) Если, конечно, нет линий из одной точки.

Сейчас нет "стабильной" версии какраз перед переходом на LCL было изменено несколько принципиальных моментов и до конца не отлажено. Сейчас переход в самом разгаре и вообще мало что работает))

Так, я понимаю. Но, про что нашёл, - написал. На будущее. :)
Ещё "Видеонаблюдение->Видеокамера". AV.

Оптсечение по пирамиде видимости. Чтоб не слать на GPU и не проверять на выбор мышкой заведомо невидимые примитивы. конечно когда чертеж состоит из обычных линий - толку от него немного, когда из сложных блоков - результат на лицо))

А, выбор объектов? Понятно.

P.S.: Кстати, не очень понятно где я нахожусь, при движении чертежа.
Скроллбары бы, по-моему, не помешали (а ещё лучше - уменьшенная "карта" чертежа).
И, уменьшение неограниченно. В итоге, возможно сделать весь чертёж одной точкой и долго крутить обратно. :)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Вопросы по LCL

Сообщение zub » 21.06.2010 00:10:12

P-IV/RAM 768 Мб/GeForce MX440, OGL программный (у меня драйвера не установлены по-человечески).

у Вас софтовый контекст GDI Generic. Аппаратный GL - обязателен! без него можно не запускать. Я конечно понимаю - это смешное требование для чертежа из нескольких линий, но мелкософтный драйвер тормозит очень жестко((, хотя в программе всё считается на CPU, OGL только рисует уже посчитанные линии. Возможно когданибудь будет "мультирендер" - но пока так.
На скрине типичная ситуация с не поддерживаем железом AUXbuffer`ом (его не держат из мною виденого: M$ и встроенное видео INTEL), при выборе режима обновления AUX.

Я имел ввиду, что пользователь за одно действие изменяет один объект.

на то он и пользователь - его не предскажешь. и не факт что 1 объект, можно все сразу. модель статическая до поры до времени, всё спихнуть на ГПУ не выйдет полюбому, наоборот функции ГПУ потихоньку переезжают на ЦПУ, изза всяких мелких ограничений. конечно VBO - современней и производительней, но его реализация для данной задачи не проста, пока glBegin не является "узким местом". В идеале хотелось бы получить систему работающую вообще без OpenGL

Да, и правда, убрали. Я не знал. Очень много убрали.

Последние стандарты - OpenGL для игрушек. О сапр (насколько знаю GL изначально был для САПР и серъезной визуализации) забыли. например GL_SELECT на ATI вообще "работает" мягко сказать - очень медленно.

И, уменьшение неограниченно. В итоге, возможно сделать весь чертёж одной точкой и долго крутить обратно.

Скролбары - возможно надо, но толку от них будет мало, модель в размерах не ограничена, если только по габаритам.
Уменьшенная копия - тоже надо, но отдельной командой и в отдельном окне.
Не ограниченое уменьшени увеличениее - это по просьбам трудящихся. Целевой контингент не понимает что средствами OpenGL невозможно отобразить без сложной математической-алгоритмической обработки очень малые - очень большие объекты или примитивы сильно удаленные от начала координат (порядка 10E+-9) - Автокад подобное позволяет - значит так и должно быть, пришлось делать ужасный костыль и то, только частично решающий подобные проблемы)). Кстати правый даблклик масштабирует и сдвигает модель чтобы было всё видно на экране.
"Геймплей" я копирую с автокада, как ИМХО наиболее удобной программы для чертежных дел

Но мы ушли от темы, по прежнему интересует как отключить WM_ERASEBACKGROUND. с ним перерисовки инициализированные Windows жутко мелькают.

Добавлено спустя 1 час 41 минуту 24 секунды:
Свойств отвечающих за стирание фона не нашел (вернее нашел FWinControlFlags: TWinControlFlags; но не помогло). Ничего умнее не придумалось:
Код: Выделить всё
  TGDBObjInsp=class(tpanel)
   ................
    procedure EraseBackground(DC: HDC); override;
  end;

implementation

procedure TGDBObjInsp.EraseBackground(DC: HDC);
begin
end;

Вроде не мелькает. Под linux`ом есть аналог WM_ERASEBACKGROUND или это winonly?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопросы по LCL

Сообщение А.Н. » 21.06.2010 08:34:29

без него можно не запускать.

Тем не менее, - работает.

Я конечно понимаю - это смешное требование для чертежа из нескольких линий, но мелкософтный драйвер тормозит очень жестко((, хотя в программе всё считается на CPU, OGL только рисует уже посчитанные линии.

Просто, у меня есть подозрение, что возможно сделать быстрее. Может, я ошибаюсь.

на то он и пользователь - его не предскажешь. и не факт что 1 объект, можно все сразу.

Ну, если пользователь не болен и это не бета-тестер... :)
Он будет действовать по определённому сценарию. Почти всегда.
Поэтому, думаю, что нельзя говорить однозначно, про непредсказуемое поведение пользователя.

модель статическая до поры до времени, всё спихнуть на ГПУ не выйдет полюбому, наоборот функции ГПУ потихоньку переезжают на ЦПУ, изза всяких мелких ограничений.

Ээээ... А всякие шейдеры :shock: и т.д и т.п., если на будущее? Может, мелкие ограничения возможно обойти?

конечно VBO - современней и производительней, но его реализация для данной задачи не проста, пока glBegin не является "узким местом".

Так это понятно. Просто на будущее, я так думаю, единственное на что возможно ориентироваться - это VBO.

В идеале хотелось бы получить систему работающую вообще без OpenGL

Почему? И что используя?

Последние стандарты - OpenGL для игрушек. О сапр (насколько знаю GL изначально был для САПР и серъезной визуализации) забыли. например GL_SELECT на ATI вообще "работает" мягко сказать - очень медленно.

Да, похоже. :( Хотя, их dx поджимает. На хомячковой "системе".
А учитывая то, что большинство игр на ней, если не будет соответствовать, OpenGL просто вытеснят, вообще.
А ATI - это г., по-моему. Выбор, кстати, тоже убрали в OpenGL 3.

Скролбары - возможно надо, но толку от них будет мало, модель в размерах не ограничена, если только по габаритам.

Ну, обычные скроллбары, как вариант. Ведь возможно и "линейку" рисованную сделать. Чтобы было понятно где находишься и не теряться.

Кстати правый даблклик масштабирует и сдвигает модель чтобы было всё видно на экране.

Кстати, только хотел вспомнить про масштабирование в 1 и центрирование. :)
Почему-то у меня средний даблклик...

Но мы ушли от темы, по прежнему интересует как отключить WM_ERASEBACKGROUND. с ним перерисовки инициализированные Windows жутко мелькают.

Я уж не помню ни фига. TPanel, вроде, всё-таки не стандартный контрол... %-|
Покопался в LCL.

1. Есть защищённое поле: FWinControlFlags. Оно доступно из любого оконного контрола.
Тип:
Код: Выделить всё
  TWinControlFlag = (
    wcfClientRectNeedsUpdate,
    wcfColorChanged,
    wcfFontChanged,          // Set if font was changed before handle creation
    wcfReAlignNeeded,
    wcfAligningControls,
    wcfEraseBackground,
    wcfCreatingHandle,       // Set while constructing the handle of this control
    wcfInitializing,         // Set while initializing during handle creation
    wcfCreatingChildHandles, // Set while constructing the handles of the childs
    wcfHandleVisible
    );
  TWinControlFlags = set of TWinControlFlag;


Очевидно: Exclude(FWinControlFlags, wcfEraseBackground);

Ещё, не самые лучшие, пожалуй, варианты (кто-то из наследников или предков, в особых случаях, теоретически может использовать эти методы напрямую) - перегрузить, как вы и сделали:
Код: Выделить всё
procedure TWinControl.WMEraseBkgnd(var Message: TLMEraseBkgnd);
procedure TWinControl.EraseBackground(DC: HDC);


Зато, их перегрузка будет всегда работать, в отличие от FWinControlFlags. Со всеми вытекающими.
Насчёт "вытекающих", посмотрите на код WMPaint (я, не относящееся к делу, убрал), всё примерно понятно:
Код: Выделить всё
procedure TWinControl.WMPaint(var Msg: TLMPaint);
var
  DC,MemDC: HDC;
  PS : TPaintStruct;
  ClientBoundRect: TRect;
begin

  if (Msg.DC <> 0) then
  begin
    if not (csCustomPaint in ControlState) and (ControlCount = 0) then
      begin
        DefaultHandler(Msg);
      end
    else
      PaintHandler(Msg);
  end
  else begin
    // NOTE: not every interface uses this part
    try
      // Fetch a DC of the whole Handle (including client area)
      DC := BeginPaint(Handle, PS);
      if DC=0 then exit;
      // erase background
      Include(FWinControlFlags,wcfEraseBackground);
      Perform(LM_ERASEBKGND, WParam(MemDC), 0);
      Exclude(FWinControlFlags,wcfEraseBackground);
      // create a paint message to paint the child controls.
      // WMPaint expects the DC origin to be equal to the client origin of its
      // parent
      // -> Move the DC Origin to the client origin
      if not GetClientBounds(Handle,ClientBoundRect) then exit;
      MoveWindowOrgEx(MemDC,ClientBoundRect.Left,ClientBoundRect.Top);
      // handle the paint message
      Msg.DC := MemDC;
      Perform(LM_PAINT, WParam(MemDC), 0);
      Msg.DC := 0;
      // restore the DC origin
      MoveWindowOrgEx(MemDC,-ClientBoundRect.Left,-ClientBoundRect.Top);
      EndPaint(Handle, PS);
    finally
      Exclude(FWinControlFlags,wcfEraseBackground);
    end;
  end;
end;


Зачем - не очень понятно. Надо просто проверить на Linux и подобном.

2. Для windaw$ посмотрите на стиль окна CS_OWNDC, если он у вас не устанавливается при создании.

Вроде не мелькает. Под linux`ом есть аналог WM_ERASEBACKGROUND или это winonly?

Вряд ли он, в таком виде, он есть под Linux. Точнее, под X. Не знаю. Но, в lazarus, он, скорее всего, - кросс.

P.S.:
А PDF вы чем делали?
Мануал смотрится, мне тоже надо будет делать тут, а с PDF я дела ни разу не имел.
Понравилось. И, тогда придётся искать чем в в-де возможно создать PDF.

Добавлено спустя 58 минут 22 секунды:
Ёлки-палки, ну я и отстал. Уже есть OpenGL 4.0. :(
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Вопросы по LCL

Сообщение zub » 21.06.2010 12:23:54

Просто, у меня есть подозрение, что возможно сделать быстрее. Может, я ошибаюсь.

можно, отказавшись от OGL и используя DX или GDI(что там в линуксе вместо него).

Ээээ... А всякие шейдеры и т.д и т.п., если на будущее? Может, мелкие ограничения возможно обойти?

Пока шейдеры мне не нужны, это не игровой движек)).
Вот обход этих ограничений и спускает всё на CPU:
Тормозит GL_SELECT на ATI - пришлось переписать((
Ограничен стек матриц - пришлось сделать свой((
Пропадает точность отображения сильно удаленных объектов - свои процедуры работы с матрицами
В итоге от огл остался только непосредственно вывод графики

Так это понятно. Просто на будущее, я так думаю, единственное на что возможно ориентироваться - это VBO.

Ну я думаю совесть дровосоздателей не позволит им отказаться от glBegin/glEnd)). В любом случае нужно ядро с отрывом от конкретной реализации "финального" вывода графики + разные варианты реализации этого "финального" вывода, чтоб пользователь мог выбрать на "овощном" компе GDI, на продвинутом GL+glBegin/glEnd или GL+VBO. То что в zcad всё было завязано на GL - не правильно.

Ну, обычные скроллбары, как вариант. Ведь возможно и "линейку" рисованную сделать. Чтобы было понятно где находишься и не теряться.

Линейка зло (ИМХО), это я как давний пользователь автокада заявляю. Удаляю у себя все программы если обнаруживаю в них линейку)). Ну и затрудняюсь представить себе линейку в 3D+перспективная проекция))
Хотя надеюсь если нужна, ее потом ктонибудь сделает))

Почему-то у меня средний даблклик...

забыл, у себя я всегда переназначаю кнопки мыши в драйвере. конечно средний даблклик.

Очевидно: Exclude(FWinControlFlags, wcfEraseBackground);

это не работает, так как WMPaint инклудит\ексклудит сам, как ему надо

А PDF вы чем делали?

word+печать на PDFCreator
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопросы по LCL

Сообщение А.Н. » 21.06.2010 13:42:06

можно, отказавшись от OGL и используя DX или GDI(что там в линуксе вместо него).

Используя OpenGL. Через GDI, скорее всего, не будет быстрее. Хотя... Есть CrossGL...
А DirectX - во-первых, непереносимо (во всех смыслах), во-вторых - сложно. К тому же, есть движки, использующие OpenGL с успехом (к примеру, Ogre3D). Т.е., быстро возможно сделать и на нём.
Кстати, Ogre - кросс.

Тормозит GL_SELECT на ATI - пришлось переписать((

Да ну этот Select. Лучше уж свой. Не потеря.

Ограничен стек матриц - пришлось сделать свой((

Хм... Странно.

Ну я думаю совесть дровосоздателей не позволит им отказаться от glBegin/glEnd)).

:mrgreen: Извините, что им не позволит?

В любом случае нужно ядро с отрывом от конкретной реализации "финального" вывода графики + разные варианты реализации этого "финального" вывода, чтоб пользователь мог выбрать на "овощном" компе GDI, на продвинутом GL+glBegin/glEnd или GL+VBO. То что в zcad всё было завязано на GL - не правильно.

Так-то, конечно, правильно. Но уж больно это сложно. Нужно делать дополнительный "слой" независимый от подсистемы, который будет оперировать каким-либо универсальными для всех подсистем примитивами, потом ещё "слой" для связи с подсистемой (для каждой свой), который эти примитивы предоставляет.
Затем, всё переписывать на использование методов этого "слоя", вместо работы OpenGL.
При том, что OpenGL кроссплатформенный и где только его нет (аж на QNX и иже с ним).
А стоит ли?

Линейка зло (ИМХО), это я как давний пользователь автокада заявляю. Удаляю у себя все программы если обнаруживаю в них линейку)).

Почему?

Ну и затрудняюсь представить себе линейку в 3D+перспективная проекция))

Обычный сдвиг, как и при нажатии средней кнопки.

это не работает, так как WMPaint инклудит\ексклудит сам, как ему надо

Если DC = 0. Странно, на window$, хотя бы, должно работать. Просто, если он его устанавливает, в каком-то случае, это зачем-то нужно...
Тогда остаётся только перегрузка EraseBackground, поскольку WMPaint перегружать - изврат.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Вопросы по LCL

Сообщение zub » 21.06.2010 14:29:21

При том, что OpenGL кроссплатформенный и где только его нет (аж на QNX и иже с ним).

при всех плюсах и распространенности, его нет на 90% целевых компов (там где не установлены драйвера производителей видеокарт. например у Вас :D )
Так-то, конечно, правильно. Но уж больно это сложно.

Не настолько сложно. базовых примитивов (из которых состоят все остальные) мало: линия, треугольник (возможно квад), полилиния, сеть - их реализации сделать для всех "платформ". Пользовательским примитивам остается перекрыть метод "рисования" себя базовыми примитивами и предоставить методы для манипуляции своими параметрами. Ненадо заботится о выделении мышью, пересчете координат в разных системах, определении видимости и т.д. Сейчас с это всё хозяйство приходится писать для каждого примитива. Я не говорю о отказе от OGL, говорю об абстрактной "графической" реализации примитивов - при таком подходе будет плюсом легкая смена OGL на любой другой стандарт. (это так... мечты...)

Тогда остаётся только перегрузка EraseBackground, поскольку WMPaint перегружать - изврат.

согласен
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопросы по LCL

Сообщение А.Н. » 22.06.2010 11:50:56

при всех плюсах и распространенности, его нет на 90% целевых компов (там где не установлены драйвера производителей видеокарт. например у Вас :D )

Ну, у меня есть программный. :)

Не настолько сложно. базовых примитивов (из которых состоят все остальные) мало: линия, треугольник, возможно квад - их реализации сделать для всех "платформ". Пользовательским примитивам остается перекрыть метод "рисования" себя базовыми примитивами и предоставить методы для манипуляции своими параметрами.

Может, лучше использовать как "слой", тогда уж, а не как предка?
Поскольку, всё-таки, базовые примитивы - не предки для основных, а их элементы.

Ненадо заботится о выделении мышью, пересчете координат в разных системах, определении видимости и т.д. Сейчас с это всё хозяйство приходится писать для каждого примитива

В смысле, для каждого?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Вопросы по LCL

Сообщение zub » 22.06.2010 12:35:10

Может, лучше использовать как "слой", тогда уж, а не как предка?
Поскольку, всё-таки, базовые примитивы - не предки для основных, а их элементы.

Я про это и говорю. Разные иерархии классов для DXF примитивов и для "элементарныйх" графических.
Графическая подсистема должна знать только о "элементарных", обрабатывать их и отображать. DXF примитивы должны уметь нарисовать себя с помощью элементарных, и ничего незнать о графической системе.

В смысле, для каждого?

В смысле для каждого типа. Чем сложнее примитив, тем сложнее код для "сопутствующих" операций - выделенье, пересчеты, габариты и т.д. А сложный примитив один фиг расуется простыми: окружность, элипс, дуга по факту полилинии, текст - набор полилиний и отрезков и т.д. Наследование частично помогает, но не всегда

Ну и по теме:
Как у контрола в дочерних элементах найти контрол определенного типа (в смысле класса)?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопросы по LCL

Сообщение А.Н. » 22.06.2010 14:07:26

В смысле для каждого типа. Чем сложнее примитив, тем сложнее код для "сопутствующих" операций - выделенье, пересчеты, габариты и т.д. А сложный примитив один фиг расуется простыми: окружность, элипс, дуга по факту полилинии, текст - набор полилиний и отрезков и т.д. Наследование частично помогает, но не всегда

Не знаю, что конкретно понимается под пересчётом координат и определением видимости...
Но насчёт выделения мышью.
А не проще сделать одну функцию в базовом классе? Да, наверное, сложно.
Но, по сравнению с созданием методов для каждого класса (и сопряжёнными с этим ошибками и отладкой), это может быть проще.
Если говорить о двух координатах, включение точки в каждый примитив определяется элементарно (как я понял, многоугольники вы не используете, но даже если с ними).
А, если точка входит в какой-либо примитив, значит она входит и в фигуру.
Остаётся с третьей координатой разобраться. Список же примитивов для каждого объекта известен.
Т.е., возможно сделать универсальный метод. Или я ошибаюсь?

Как у контрола в дочерних элементах найти контрол определенного типа (в смысле класса)?

Пример, функция, очищающая эдиты в форме поиска:
Код: Выделить всё
procedure ClearEdits(const Parent: TWinControl; const WithChildGbs: boolean);

  procedure ClearEditsInControl(const ctrl: TWinControl);
  var i: integer;
  begin
    for i := 0 to ctrl.ControlCount - 1 do
      if (ctrl.Controls[i].ClassName = 'TEdit') then
         (ctrl.Controls[i] as TEdit).Clear;
  end;

var i: integer;
begin
  ClearEditsInControl(Parent);
  if (WithChildGbs) then
    for i := 0 to Parent.ControlCount - 1
      do
        if (Parent.Controls[i].ClassName = 'TGroupBox') then
          ClearEditsInControl(Parent.Controls[i] as TWinControl);
end;


Добавлено спустя 1 минуту 51 секунду:
текст - набор полилиний и отрезков

Кхм, а зачем? Я так понял, вы используете какие-то автокадные шрифты? Стоит ли оно того?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Вопросы по LCL

Сообщение zub » 22.06.2010 15:05:44

Но насчёт выделения мышью.
А не проще сделать одну функцию в базовом классе? Да, наверное, сложно.

Оно пока так и сделано. для наследуемых объектов метод выделения переодически переопределяется, чтото добавляется-убирается-заменяется. Мне это сделать каждый раз не трудно)), но по большому счету это лишняя работа.
Предположим Вы решили мне помочь и написать объект СУПЕРЛИНИЯ (таже линия но чертится 3мя линиями - основной и дополнительными на 1мм выше и 1мм ниже). унаследовав его от стандартной линии
Чтобы СУПЕРЛИНИЯ хоть както работала при текущем положении дел вам придется переопределить минимум 2 метода: рисования и выделения. Либо наследовать не от линии а от сложного объекта физически состоящего из нескольких примитивов (что в данном случае будет жирно - под верхнюю и нижнюю линию получится лишний расход памяти и CPU).
Если оторвать графическую реализацию - нужно будет переопределить только метод генерации примитива для графической системы (рисования себя элементарными примитивами). Пользовательские объекты вообще не будут знать что их выделяют, это проблемы графической системы и элементарных объектов.
Т.е., возможно сделать универсальный метод. Или я ошибаюсь?

нет, не ошибаетесь. тут множество подходов - везде свои плюсы-минусы.

Пример, функция, очищающая эдиты в форме поиска:

Спасибо.

Кхм, а зачем? Я так понял, вы используете какие-то автокадные шрифты? Стоит ли оно того?

Да, используются shx шрифты - совместимость с автокадом. ttf тоже надо конечно поддрживать - пока не до него.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Вопросы по LCL

Сообщение А.Н. » 23.06.2010 11:40:03

Оно пока так и сделано. для наследуемых объектов метод выделения переодически переопределяется, чтото добавляется-убирается-заменяется. Мне это сделать каждый раз не трудно)), но по большому счету это лишняя работа.
Предположим Вы решили мне помочь и написать объект СУПЕРЛИНИЯ (таже линия но чертится 3мя линиями - основной и дополнительными на 1мм выше и 1мм ниже). унаследовав его от стандартной линии
Чтобы СУПЕРЛИНИЯ хоть както работала при текущем положении дел вам придется переопределить минимум 2 метода: рисования и выделения. Либо наследовать не от линии а от сложного объекта физически состоящего из нескольких примитивов (что в данном случае будет жирно - под верхнюю и нижнюю линию получится лишний расход памяти и CPU).

Метод рисования, это понятно. Но вот метод выделения. Если эти три линии не образуют "замкнутый" объект, то зачем переопределять? Точка принадлежит объекту, если она принадлежит какой-либо линии (вопрос о принадлежности к линии уже лежит в компетенции базового класса или классов, используемых элементов).
Если же линии образуют замкнутый объект, тут, конечно, сложнее.
Для конкретного примера, этот объект возможно выделить, что сходу придумалось (для плоскости):
а.) Очертив его четырьмя линиями: сверху, снизу, справа и слева.
Верхняя линия, например, может строится из отрезков, одна точка которых лежит на границе левого примитива (начиная с крайнего) и имеющей максимальный Y и такой же точкой следующего справа примитива, не входящей в левый примитив (массив примитивов возможно определить в базовом классе).
И так по цепочке.
Аналогично для трёх оставшихся линий.
б.) Для линий, как в примере (допущу, что это три параллельные линии), по кратчайшему расстоянию между крайними левыми, затем крайними правыми точками, составляющих объектов. Аналогично для верхних и нижних точек. Т.е., точка будет принадлежать объекту, если она лежит в части плоскости, ограниченной крайними верхней и нижней линиями и перпендикулярами. Но, вообще, это какая-то бредовая идея (что-то у меня с головой :( ).
в.) Самый нормальный, универсальный и простой способ - это просто взять объект и ограничить его прямоугольником, крайние точки которого будут являться крайними точками объекта. Прямоугольник при выделении объекта возможно показывать, например, какой-нибудь пунктирной линией.

Понятно, что работать именно так это не будет, но ведь возможно дифференцировать методы, в зависимости от базового класса. Или придумать что-то более правильное.

Минус в том, что как-то всё это не очевидно. Если есть линии, то объект, составленный из них должен выбираться, только когда точка лежит на линии. Если есть прямоугольник или круг, они должны выбираться только когда точка лежит внутри них. И т.д.
Т.е., объект сам должен "очерчивать" свои границы.
Если это замкнутый квадратный блок, то, пусть чертятся его границы. А, если это линии, то пусть они и выбираются, как линии, а не как замкнутая фигура.
По-моему, такое поведение очевидно. Или оно не подходит?

Если оторвать графическую реализацию - нужно будет переопределить только метод генерации примитива для графической системы (рисования себя элементарными примитивами). Пользовательские объекты вообще не будут знать что их выделяют, это проблемы графической системы и элементарных объектов.

Вот примерно про то я и говорю. Только почему бы пользовательским объектам об этом не знать?
А сейчас как?

Да, используются shx шрифты - совместимость с автокадом.

Она требуется?

ttf тоже надо конечно поддрживать - пока не до него.

У меня есть мелкий классик для поддержки ttf (что-то передрано, что-то изменено под себя, но оно работает).
Правда, на c++. Могу выложить, если нужно.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Вопросы по LCL

Сообщение zub » 23.06.2010 13:55:57

Метод рисования, это понятно. Но вот метод выделения. Если эти три линии не образуют "замкнутый" объект, то зачем переопределять? Точка принадлежит объекту, если она принадлежит какой-либо линии (вопрос о принадлежности к линии уже лежит в компетенции базового класса или классов, используемых элементов).

Базовый класс (простая линия) знает только об одной линии. а тут их 3. Метод выделения базового класса проверял попадание средней линии под мышь, тут нужно еще проверить линии выше и ниже.

чето в пункты а и б я не въехал)). в - вроде понял, но он не честный. площадь прямоугольника может быть гораздо больше площади выделяемого объекта (если он вытянут и расположен по диагонали) - соответствеео выделение будет работать не правильно. выделение должно быть честным - попадание части объекта в "квадрат" выделения, методы с boundingbox`ами годятся только для быстрого отсеивания сложных объектов которые точно не под мышью. Кроме того, выделение происходит в 3д - т.к. если постоянно проекцировать объекты - будет очень тормозно.

По-моему, такое поведение очевидно. Или оно не подходит?

пока планирую поведение с выделением только по границе (т.е. замкнутые объекты не выделяются по щелчку внутри, только на границе), из замкнутых объектов с заполнением у ченя пока только 3DFace, он недавно добавлен и еще толком не работает.

Вот примерно про то я и говорю. Только почему бы пользовательским объектам об этом не знать? А сейчас как?

сейчас объекты знают про всё, сами себя рисуют на GL контексте, сами выделяют и т.д. Для создание нового объекта - соответственно нужно знать GL и математику.

Она требуется?

Мне требуется, ну и вообще должна быть поддержка общепринятых CAD форматов.

У меня есть мелкий классик для поддержки ttf (что-то передрано, что-то изменено под себя, но оно работает).
Правда, на c++. Могу выложить, если нужно.

Нужно. но позже.

Насколько я понял в LCL класс TPanel не может обработать колесо мышки... как быть?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 220

Рейтинг@Mail.ru