Версия: 0.9.28.2
FPC: 2.2.4
Используется OpenGLContext, GL, GLU. Есть главное окно (конт1), есть созданное в главном окно (конт2)
Главное окно:
- Код: Выделить всё
procedure TFrmMpD.OGLCtrlMpRPaint(Sender: TObject);
var
ForXK, ForYK, trashLok: Integer;
PntX, PntY :GLfloat;//PntZ
begin
if OGLCtrlMpR.MakeCurrent then AreaInitialized:=true;
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT or GL_STENCIL_BUFFER_BIT);
glClearDepth(1.0); // Разрешить очистку буфера глубины
glDepthFunc(GL_LESS); // Тип теста глубины
glEnable(GL_DEPTH_TEST); // разрешить тест глубины
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glShadeModel(GL_SMOOTH); // разрешить плавное цветовое сглаживание
glMatrixMode(GL_PROJECTION); // Выбор матрицы проекции
glLoadIdentity(); // Сброс матрицы проекции
gluPerspective(45.0,GLfloat(OGLCtrlMpR.Width)/GLfloat(OGLCtrlMpR.Height),0.1,100.0);
// Вычислить соотношение геометрических размеров для окна
glMatrixMode(GL_MODELVIEW); // Выбор матрицы просмотра модели
glLoadIdentity();
glTranslatef((ScrollBar1.Position-127)*0.1,(127 - ScrollBar2.Position)*0.1,TrackBar1.Position*0.5);
glEnable(GL_TEXTURE_2D); // Разрешение наложение текстуры
glBindTexture(GL_TEXTURE_2D, Texture[4]);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if MapWasGenerate then
for ForYK := (127 - (TrackBar2.Position Div 2)) to (127+ TrackBar2.Position Div 2) do
for ForXK := (127- TrackBar2.Position Div 2) to (127 + TrackBar2.Position Div 2) do
begin
//Центр это 127х127х7
//Х = (ForXK - 127)*0,3
//Y = (ForYK - 127)*0,3
//Z = (HeightMap[(ForYK*256)+ForXK])
PntX := (ForXK - 127)*0.3;
PntY := (ForYK - 127)*0.3;
if not CheckBox1.Checked then
glBindTexture(GL_TEXTURE_2D, Texture[0])
else if (HeightMap[(ForYK*256)+ForXK]+1) < 6 then
glBindTexture(GL_TEXTURE_2D, Texture[HeightMap[(ForYK*256)+ForXK]+1])
else glBindTexture(GL_TEXTURE_2D, Texture[6]);
glBegin(GL_QUADS);
glTexCoord2f(1.0, 1.0);
glVertex3f(PntX,PntY,CalkZPoint(ForYK,ForXK,1, false)*0.1);
glTexCoord2f(1.0, 0.0);
glVertex3f( PntX, (PntY - 0.3) , CalkZPoint(ForYK,ForXK,4, false)*0.1);
glTexCoord2f(0.0, 0.0);
glVertex3f((PntX - 0.3),(PntY - 0.3),CalkZPoint(ForYK,ForXK,3, false)*0.1);
glTexCoord2f( 0.0, 1.0);
glVertex3f((PntX - 0.3),PntY,CalkZPoint(ForYK,ForXK,2, false)*0.1);
glEnd();
end;
glDisable(GL_TEXTURE_2D);
OGLCtrlMapRed.SwapBuffers;
OpenGLIsPain := true;
end;
Создание второго окна:
- Код: Выделить всё
procedure TFrmMapDesigner.MenuItem7Click(Sender: TObject);
var
CNTLok: Integer;
LokTex: TOneTexture;
LokNameTex: String;
begin
if not Assigned(ObjDesigner) then
begin
Application.CreateForm(TFrmObjDesigner, ObjDesigner);
end;
ObjDesigner.ListBox1.Clear;
//Копируем список текстур
for CNTLok := 0 to (LBxTexture.Count - 1) do
begin
LokTex := TOneTexture(LBxTexture.Items.Objects[CNTLok]);
LokNameTex := LBxTexture.Items.Strings[CNTLok];
ObjDesigner.ListBox1.Items.AddObject(LokNameTex,LokTex);
end;
ObjDesigner.Show;
end;
Вывод текстур во втором окне сделан совершенно аналогично:
- Код: Выделить всё
procedure TFrmObjDesigner.OGLViewPaint(Sender: TObject);
begin
if OGLView.MakeCurrent(true) then AreaInitialized:=true;
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT or GL_STENCIL_BUFFER_BIT);
glClearDepth(1.0); // Разрешить очистку буфера глубины
glDepthFunc(GL_LESS); // Тип теста глубины
glEnable(GL_DEPTH_TEST); // разрешить тест глубины
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glShadeModel(GL_SMOOTH); // разрешить плавное цветовое сглаживание
glMatrixMode(GL_PROJECTION); // Выбор матрицы проекции
glLoadIdentity(); // Сброс матрицы проекции
gluPerspective(45.0,GLfloat(OGLView.Width)/GLfloat(OGLView.Height),0.1,100.0);
// Вычислить соотношение геометрических размеров для окна
glMatrixMode(GL_MODELVIEW); // Выбор матрицы просмотра модели
glLoadIdentity();
glTranslatef(0.0,0.0,-3.1);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D); // Разрешение наложение текстуры
glBindTexture(GL_TEXTURE_2D, texture0); //[b]Могут не передаться текстуры главного - сделаю новую для проверки[/b]
glBegin(GL_QUADS);
glColor3f(1.0,0.0,0.0); // Red
glTexCoord2f(1.0, 1.0);
glVertex3f(1,1,0);
glTexCoord2f(1.0, 0.0);
glVertex3f( 1,-1,0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1,-1,0);
glTexCoord2f( 0.0, 1.0);
glVertex3f(-1,1,0);
glEnd();
OGLView.SwapBuffers;
end;
Проблему решил. Как удалить тему?