![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OpenGL. проблемы c SelectBuffer
WondeRu © (2005-05-16 13:34:00)Здравствуйте, уважаемые!
Появилась странная проблема с SelectBuffer:
как только я делаю область выбора большой, то информация в буфере становится левой!
вот мой код:
function GetPickedItem(X, Y: Real; XSize: Real = 5; YSize: Real = 5): Integer;
var
hits, i, Depth: Integer;
SelectBuf: array [0..64] of Integer;
vp: array [0..3] of Integer;
ABasicGraphic : TABasicGraphic;
begin
try
Result := -1;
glSelectBuffer(sizeof(SelectBuf), @SelectBuf);
glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
Map.SetOrthoProjection;
glGetIntegerv(GL_VIEWPORT, @vp);
gluPickMatrix(X, Height — Y, XSize, YSize, @vp);
glMatrixMode(GL_MODELVIEW);
GLPaint(True); //рисование примитивов с glLoadName
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopName();
hits := glRenderMode(GL_SELECT);
if (hits > 0) then
begin
Result := SelectBuf[3];
if (XSize > 20) or (YSize > 20) then
begin
for i := 1 to hits -1 do
begin
Depth := SelectBuf[(i * 4) + 1];
Result := SelectBuf[(i * 4) + 3];
..............добавление в список выбранного
end;
end;
end;
finally
glRenderMode(GL_RENDER);
end;
end;
когда область выбора 5х5, то все замечательно: выбирается один элемент; но когда (XSize > 20) or (YSize > 20), то в SelectBuf попадают "левые" значения и hits имеет неверное число!
Помогите, в чем трабл?
WondeRu (2005-06-01 08:02:00) [1]grouzd[E]v © (31.05.05 17:28) [10]
скорее не упорный, а ленивый - другую работу искать лень ;)
Спасибо, что поддержал в трудную минуту ;)
grouzd[E]v (2005-05-31 17:28:00) [2]Молоток! Поздравляю! А ты упорный - я бы плюнул на это дело =)
WondeRu (2005-05-31 13:10:00) [3]все решилось, когда глянул в хелп внимательнее...
в моем коде [0], необходимо поставить Map.SetOrthoProjection после gluPickMatrix, тогда все замечательно :)
AlterEgo of WondeRu (2005-05-23 10:42:00) [4]grouzd[E]v © (19.05.05 15:04) [7]
Попробуй с другими видами и перспективой
никак... видимо барабашка!
grouzd[E]v (2005-05-19 15:04:00) [5]Че правда не получается? Тогда Х.З... Ладно, если будет время, попробую твой вариант ф-ии, хотя до 4-го вряд ли получится - конец учебного года, а тут еще Lines. Слушай, а тебе обязательно Орто? Попробуй с другими видами и перспективой
AlterEgo of WondeRu (2005-05-18 23:00:00) [6]grouzd[E]v © (18.05.05 16:14) [5]
когда делаю Прямоугольник, то значения XSize, YSize переопределятся, а когда нужен один элемент, то функция вызывается только с двумя параметрами. Насчет центра - знаю... так и делаю... проблема именно в использовании glOrtho
grouzd[E]v (2005-05-18 16:14:00) [7]Погоди, так тебе надо ПРЯМОУГОЛЬНИК для выделения сделать? Так как же ты его определяешь с ДВУМЯ координатами? У тебя ж получается квадрат с цетром (X,Y) и диагональю (XSize/2, YSize/2)
Кстати, ты только в примере в заголовке ф-ии написал
XSize: Real = 5; YSize: Real = 5;
или у тебя так стоит везде ( вот уж тогда ТОЧНО будут левые значения =) )
WondeRu (2005-05-18 08:53:00) [8]grouzd[E]v © (17.05.05 15:52) [3]
процедура перерисовки и выбора - одна и та же, просто во втором случае добавляются glLoadName и не рисуются текстуры и др элементы, которые нельзя выбрать!
grouzd[E]v (2005-05-17 15:52:00) [9]А ты уверен, что в своей функции выбора ты используешь те же команды, что и при перерисовке? Допустим, если в функции у тебя будет Орто, а в рендеринге Перспектива, то то что видим мы и что "видит" OpenGL будет разным! Проверь лучше все команды и там и там (а еще лучше, напиши свою процедуру рендеринга)
WondeRu (2005-05-16 17:01:00) [10]grouzd[E]v © (16.05.05 16:14) [1]
вот именно! когда один элемент у меня значения 5х5 (это чтоб юзер мог маленькие элементы двигать), а вот когда я делаю прямоугольник выделения, чтоб выделить кучу объектов, тоSelectBufимеет странные значения (иногда туда попадают элементы из вне). Такой эффект проявляется, когда начинаю играть с функциейglOrtho
grouzd[E]v (2005-05-16 16:14:00) [11]20 на 20? Ну ты загнул! Если тебе нужен только один элемент, то ставь намного меньше (лично у меня - 2х2), а так он находит ВСЕ объекты в радиусе 20 пикселов. Если надо несколько значений, тебе придется проверять каждое значение из SelectBuf