Тема: Как из viewportDraw определять перерисовки 3D Orbit?

В команде 3D-orbit на каждый шаг прогрутки вызывается метод viewportDraw у объектов... Все бы ничего, но если viewportDraw - достаточно сложный, то возникают ничем не оправданные тормоза при вращении модели из большого кол-ва объектов.
Более того при dragginge и вращении в 3d-orbit у меня вообще нет необходимости рисовать viewportDraw... однако если в есть метод isDragging - то для dragginga - он работает и можно не делать отрисовку viewportDraw, а вот при 3d-orbit isDragging == false.
Как отследить и не рисовать во viewportDraw при 3d-orbit?

Re: Как из viewportDraw определять перерисовки 3D Orbit?

блин... :(
Написал тест - viewportDraw - зовется безбожно при вращении в 3d orbit. Для 20 объектов за пол минуты - вызывается 140.000 раз :(
Даже относительно несложные действия во viewportDraw - это конвульсии при вращении в 3d orbit...
Тестировал под 2002 акадом... может в >= 2004 что-то и изменилось, но все равно хочу знать при отрисовке - камера вращается или просто перерисовка при смене вида...

Re: Как из viewportDraw определять перерисовки 3D Orbit?

Пока поборол эти тормоза так...
bool isWD = false;
worldDraw()
{
    isWD = true;
    ...
}
viewportDraw()
{
   if ( !isWD )
     return;
   isWD = false;
}

Re: Как из viewportDraw определять перерисовки 3D Orbit?

Вижу два алтернативных варианта:
1) Проверять переменную системную CMDNAMES на предмет 3DORBIT.
2) Установить минимальный интервал времени между перерисовками в viewportDraw()
А вообще эти варианты можно и объединить.

Re: Как из viewportDraw определять перерисовки 3D Orbit?

Насколько я смог убедиться из собственной практики, то AutoCAD не вызывает viewportDraw для каждого поворота орбиты. А для того чтобы он таки да это делал, нужно переопределить метод
Adesk::UInt32 MyEntity::setAttributes(AcGiDrawableTraits* traits)
{
   const Adesk::UInt32 parentAttributes = AcDbEntity::setAttributes();
   return parentAttributes | AcGiDrawable::kDrawableRegenDraw;
}
Попробуйте такой вариант:
Adesk::UInt32 MyEntity::setAttributes(AcGiDrawableTraits* traits)
{
   const Adesk::UInt32 parentAttributes = AcDbEntity::setAttributes();
   return parentAttributes | AcGiDrawable::kDrawableViewIndependentViewportDraw;
}
Это должно "Instructs the graphics system that it may cache viewportDraw geometry."

Re: Как из viewportDraw определять перерисовки 3D Orbit?

:( А на моей практике он это делает (по умолчанию). Поставил counter в viewportDraw() и при кручениях в 3D_Orbit буквально чуть-чуть получаю сотни тысяч вызовов. Если учесть что viewportDraw() сложный, то быстродействие приказывает долго жить.
К тому же я это как-то победил (уже не помню) - сейчас все нормально.
Попробую переопределить - посмотрю. Спасибо.