FreePascal and OGL

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

Ответить
Sniper
постоялец
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Sniper »

давай мыло, зашлю glAux
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

ANDREY.EXE
Я надеюсь что ты не одно из тупых детей, пробравшихся с ГДР, поэтому советую тебе не язвить, твои вопросы решаются путём 15 минутного гугления или на крайняк яндексения... Задавай их, пожалуйста, на специализированных форумах...
Да, и если не затруднит, оформь пожалусто тот исходник свой тегами [code][/code]

Romtek
Полезное дело делаешь. Для быстрых в разработке проектов, редакторов всяких... - глут весьма полезен. Статьи доступно написаны.
ANDREY.EXE
новенький
Сообщения: 60
Зарегистрирован: 18.03.2006 21:06:35

Сообщение ANDREY.EXE »

andreyexe@rambler.ru Здеся моё мыло,а на счёт гугления сам попробуй погугли я нагуглелся там ничё нету.
Romtek
Есть один глюк научи свои программы корректно закрыватся а то чёта каждый раз после запуска преходится диспетчером пользоватся.

Код: Выделить всё

Так как ты не телепат вот ошибки и код.

553 / 9 pandem~1.pas
 Error: Variable identifier expected
553 / 18 pandem~1.pas
 Error: Incompatible types: got "Extended" expected "ShortInt"
554 / 9 pandem~1.pas
 Fatal: Syntax error, ";" expected but "ELSE" found
554 / 9 pandem~1.pas
 Fatal: Compilation aborted
Ну а это код для ясности.Компилилось на FP с использыванием Dev-Pas IDE
                    
{$mode delphi}{$H+}
program Sample;
uses
  Windows,
  Messages,
  Glu,
  GL;


const
  WND_TITLE = 'OpenGL';
  FPS_TIMER = 1;
  FPS_INTERVAL = 1000;
  Go = 3;


var
  h_Wnd  : HWND;
  h_DC   : HDC;
  h_RC   : HGLRC;
  keys : Array[0..255] of Boolean;
  FPSCount : Integer = 0;
  ElapsedTime : Integer;
  rtri: GLfloat;
  rquad: GLfloat;
  //=====================FOG_SETUP==================================
   filter: gluint;
  fogmode: array [0..2] of gluint = (GL_EXP,GL_EXP2,GL_LINEAR);
  fogcolor: array [0..3] of GLfloat = (0.5,0.5,0.5,1.0);
  fogfilter:gluint = 1;
//===================================================================



procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;


function IntToStr(Num : Integer) : String;
begin
  Str(Num, result);
end;
function Clear3DWorld();
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
end;

//==========================OGL_DRAW===============================
//P2Dquads();-nicaaiea 2A ?aoa??ooaieuieea
//P2DTriangle();-nicaaiea 2A o?aoaieuieea
//P3DCube();-nicaaiea 3A eoaa
//P3Dpiramid();-nicaaiea 3A ie?aieau
//================================================================




//=============================END OGL DRAW========================
//============================OPENGL INIT==========================
procedure glInit();
begin

//============================FOG==================================
glClearColor(0.5,0.5,0.5,1.0); //Oaao ooiaia
glEnable(GL_FOG);                       // Aee??aao ooiai (GL_FOG)
glFogi(GL_FOG_MODE, fogMode[fogfilter]);// Auae?aai oei ooiaia
glFogfv(GL_FOG_COLOR, fogColor);        // Onoaiaaeeaaai oaao ooiaia
glFogf(GL_FOG_DENSITY, 0.1);          // Ianeieuei aonoui aoaao ooiai
glHint(GL_FOG_HINT, GL_DONT_CARE);      // Aniiiiaaoaeuiay onoaiiaea ooiaia
glFogf(GL_FOG_START, 1.0);             // Aeoaeia, n eioi?ie ia?eiaaony ooiai
glFogf(GL_FOG_END, 5.0);               // Aeoaeia, aaa ooiai caeai?eaaaony.
//===================================================================
glShadeModel(GL_SMOOTH);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

end;

procedure glResizeWnd(Width, Height : Integer);
begin
  if (Height = 0) then
    Height := 1;
  glViewport(0, 0, Width, Height);
  glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
  gluPerspective(45.0, Width/Height, 1.0, 100.0);
   //==========================Camera==================================
   gluLookAt(0,0,Go, 0,0,0, 0,1,0);
   //=================================================================
 glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

end;

//==================================WINODOW PROCEDURE======================
function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam: LPARAM): LRESULT; stdcall;
begin
  case (Msg) of
    WM_CREATE:
      begin
      end;
    WM_CLOSE:
      begin
        PostQuitMessage(0);
        Result := 0
      end;
    WM_KEYDOWN:
      begin
        keys[wParam] := True;
        Result := 0;
      end;
    WM_KEYUP:
      begin
        keys[wParam] := False;
        Result := 0;
      end;
    WM_SIZE:
      begin
        glResizeWnd(LOWORD(lParam),HIWORD(lParam));
        Result := 0;
      end;
    WM_TIMER :
      begin
        if wParam = FPS_TIMER then
        begin
          FPSCount :=Round(FPSCount * 1000/FPS_INTERVAL);
          SetWindowText(h_Wnd, PChar(WND_TITLE + '   [' + intToStr(FPSCount) + ' FPS]'));
          FPSCount := 0;
          Result := 0;
        end;
      end;
    else
      Result := DefWindowProc(hWnd, Msg, wParam, lParam);
  end;
end;

procedure glKillWnd(Fullscreen : Boolean);
begin
  if Fullscreen then
  begin
    ChangeDisplaySettings(devmode(nil^), 0);
    ShowCursor(True);
  end;
//==============================ERROR=======================================
  if (not wglMakeCurrent(h_DC, 0)) then
    MessageBox(0, 'Release of DC and RC failed!', 'Error', MB_OK or MB_ICONERROR);

  if (not wglDeleteContext(h_RC)) then
  begin
    MessageBox(0, 'Release of rendering context failed!', 'Error', MB_OK or MB_ICONERROR);
    h_RC := 0;
  end;

  if ((h_DC > 0) and (ReleaseDC(h_Wnd, h_DC) = 0)) then
  begin
    MessageBox(0, 'Release of device context failed!', 'Error', MB_OK or MB_ICONERROR);
    h_DC := 0;
  end;

  if ((h_Wnd <> 0) and (not DestroyWindow(h_Wnd))) then
  begin
    MessageBox(0, 'Unable to destroy window!', 'Error', MB_OK or MB_ICONERROR);
    h_Wnd := 0;
  end;

  if (not UnRegisterClass('OpenGL', hInstance)) then
  begin
    MessageBox(0, 'Unable to unregister window class!', 'Error', MB_OK or MB_ICONERROR);
   // hInstance := 0;
  end;
end;

//==============================CREATE WINDOW===========================
function glCreateWnd(Width, Height : Integer; Fullscreen : Boolean; PixelDepth : Integer) : Boolean;
var
  wndClass : TWndClass;
  dwStyle : DWORD;
  dwExStyle : DWORD;
  dmScreenSettings : DEVMODE;
  PixelFormat : GLuint;
  h_Instance : HINST;
  pfd : TPIXELFORMATDESCRIPTOR;
begin
  h_Instance := GetModuleHandle(nil);
  ZeroMemory(@wndClass, SizeOf(wndClass));

  with wndClass do
  begin
    style         := CS_HREDRAW or
                     CS_VREDRAW or
                     CS_OWNDC;
    lpfnWndProc   := @WndProc;
    hInstance     := h_Instance;
    hCursor       := LoadCursor(0, IDC_ARROW);
    lpszClassName := 'OpenGL';
  end;

  if (RegisterClass(wndClass) = 0) then
  begin
    MessageBox(0, 'Failed to register the window class!', 'Error', MB_OK or MB_ICONERROR);
    Result := False;
    Exit
  end;


  if Fullscreen then
  begin
    ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
    with dmScreenSettings do begin
      dmSize       := SizeOf(dmScreenSettings);
      dmPelsWidth  := Width;
      dmPelsHeight := Height;
      dmBitsPerPel := PixelDepth;
      dmFields     := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL;
    end;


    if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
    begin
      MessageBox(0, 'Unable to switch to fullscreen!', 'Error', MB_OK or MB_ICONERROR);
      Fullscreen := False;
    end;
  end;


  if (Fullscreen) then
  begin
    dwStyle := WS_POPUP or
               WS_CLIPCHILDREN
               or WS_CLIPSIBLINGS;
    dwExStyle := WS_EX_APPWINDOW;
    ShowCursor(False);
  end
  else
  begin
    dwStyle := WS_OVERLAPPEDWINDOW or
               WS_CLIPCHILDREN or
               WS_CLIPSIBLINGS;
    dwExStyle := WS_EX_APPWINDOW or
                 WS_EX_WINDOWEDGE;
  end;


  h_Wnd := CreateWindowEx(dwExStyle,
                          'Opengl',
                          WND_TITLE,
                          dwStyle,
                          0, 0,
                          Width, Height,
                          0,
                          0,
                          h_Instance,
                          nil);
  if h_Wnd = 0 then
  begin
    glKillWnd(Fullscreen);
    MessageBox(0, 'Unable to create window!', 'Error', MB_OK or MB_ICONERROR);
    Result := False;
    Exit;
  end;


  h_DC := GetDC(h_Wnd);
  if (h_DC = 0) then
  begin
    glKillWnd(Fullscreen);
    MessageBox(0, 'Unable to get a device context!', 'Error', MB_OK or MB_ICONERROR);
    Result := False;
    Exit;
  end;

//=======================PIXEL FORMAT================================//
  with pfd do
  begin
    nSize           := SizeOf(TPIXELFORMATDESCRIPTOR);
    nVersion        := 1;
    dwFlags         := PFD_DRAW_TO_WINDOW
                       or PFD_SUPPORT_OPENGL
                       or PFD_DOUBLEBUFFER;
    iPixelType      := PFD_TYPE_RGBA;
    cColorBits      := PixelDepth;
    cRedBits        := 0;
    cRedShift       := 0;
    cGreenBits      := 0;
    cGreenShift     := 0;
    cBlueBits       := 0;
    cBlueShift      := 0;
    cAlphaBits      := 0;
    cAlphaShift     := 0;
    cAccumBits      := 0;
    cAccumRedBits   := 0;
    cAccumGreenBits := 0;
    cAccumBlueBits  := 0;
    cAccumAlphaBits := 0;
    cDepthBits      := 32;
    cStencilBits    := 0;
    cAuxBuffers     := 0;
    iLayerType      := PFD_MAIN_PLANE;
    bReserved       := 0;
    dwLayerMask     := 0;
    dwVisibleMask   := 0;
    dwDamageMask    := 0;
  end;


  PixelFormat := ChoosePixelFormat(h_DC, @pfd);
  if (PixelFormat = 0) then
  begin
    glKillWnd(Fullscreen);
    MessageBox(0, 'Unable to find a suitable pixel format', 'Error', MB_OK or MB_ICONERROR);
    Result := False;
    Exit;
  end;


  if (not SetPixelFormat(h_DC, PixelFormat, @pfd)) then
  begin
    glKillWnd(Fullscreen);
    MessageBox(0, 'Unable to set the pixel format', 'Error', MB_OK or MB_ICONERROR);
    Result := False;
    Exit;
  end;

  h_RC := wglCreateContext(h_DC);
  if (h_RC = 0) then
  begin
    glKillWnd(Fullscreen);
    MessageBox(0, 'Unable to create an OpenGL rendering context', 'Error', MB_OK or MB_ICONERROR);
    Result := False;
    Exit;
  end;


  if (not wglMakeCurrent(h_DC, h_RC)) then
  begin
    glKillWnd(Fullscreen);
    MessageBox(0, 'Unable to activate OpenGL rendering context', 'Error', MB_OK or MB_ICONERROR);
    Result := False;
    Exit;
  end;


  SetTimer(h_Wnd, FPS_TIMER, FPS_INTERVAL, nil);
  ShowWindow(h_Wnd, SW_SHOW);
  SetForegroundWindow(h_Wnd);
  SetFocus(h_Wnd);


  glResizeWnd(Width, Height);
  glInit();

  Result := True;
end;



function WinMain(hInstance : HINST; hPrevInstance : HINST;
                 lpCmdLine : PChar; nCmdShow : Integer) : Integer; stdcall;
var
  msg : TMsg;
  finished : Boolean;
  DemoStart, LastTime : DWord;
begin
  finished := False;

//====================GRAPHICS SET MODE=========================
  if not glCreateWnd(1042,768,true,32) then
  begin
    Result := 0;
    Exit;
  end;
//==============================================================

  DemoStart := GetTickCount();


  while not finished do
  begin
    if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then
    begin
      if (msg.message = WM_QUIT) then
        finished := True
      else
      begin
     TranslateMessage(msg);
        DispatchMessage(msg);
      end;
    end
    else
    begin
      Inc(FPSCount);

      LastTime :=ElapsedTime;
      ElapsedTime :=GetTickCount() - DemoStart;
      ElapsedTime :=(LastTime + ElapsedTime) DIV 2;
//=================================Rendering====================================
//Ana ooieoee ?eniaaiey aie?iu i?ioiaeou ia?ao Clear3DWorld() e SwapBuffers(h_DC);

Clear3DWorld();
//------------------------------------------------------------------------
P3DCube();
P2DTriangle();
P2Dquads();
P3Dpiramid();
//-------------------------------------------------------------------------
SwapBuffers(h_DC);// Ia?aee??aiea aooa?ia (Aaieiay aooa?ecaoey)
//=========================================================================
//Это и есть клава
         if keys[VK_UP] then
        go := go + 1.0;
        else

        end;

      if (keys[VK_ESCAPE]) then
        finished := True
      else

    end;

end;
//А здесь клава кончается

  glKillWnd(FALSE);
  Result := msg.wParam;
end;


begin
  WinMain( hInstance, hPrevInst, CmdLine, CmdShow );
end.


SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

ANDREY.EXE
Кто ищет тот....

А тег правильный такой [/code] а то привычки я вижу бейсиковские "code end"...
ANDREY.EXE
новенький
Сообщения: 60
Зарегистрирован: 18.03.2006 21:06:35

Сообщение ANDREY.EXE »

P3DCube();
P2DTriangle();
P2Dquads();
P3Dpiramid();
Я убрал функции рисования сами допишите.
SovNarKom
А привычки есть изучал когдато. :D
Sniper
Ну давай шли на E-mail
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

ANDREY.EXE
Ещё такая кнопка смешная есть... "редактировать", будь другом а? Поправь пожалуйста...

go := go + 1.0;
go - константа, объяви в варе как Single ну короче дробное.

Дальше куча просто синтактических ошибок... нет моих сил
Научись чтоли код форматировать нормально, а книжку купи... и лучше купи учебник для ВУЗА... Я не хочу тебя обидеть, но так нельзя как ты делать... Это не программирование а садомазахизм... Твоя проблема - незнание языка этого.
Аватара пользователя
Romtek
постоялец
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган
Контактная информация:

Сообщение Romtek »

<!--QuoteBegin-ANDREY.EXE+--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата (ANDREY.EXE)</td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->Есть один глюк научи свои программы корректно закрыватся а то чёта каждый раз после запуска преходится диспетчером пользоватся.[/quote]Вот по этому поводу я и хочу обсудить проблему. Смотрите тему <a href='http://freepascal.ru/forum/index.php?showtopic=782' target='_blank'>Приложение с glut не удаляется из памяти</a>
Аватара пользователя
Romtek
постоялец
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган
Контактная информация:

Сообщение Romtek »

Кстати, предпочитаю избавлять программы от WinAPI, применяя библиотеку GLUT. В результате они получаются гораздо компактнее и понятнее, а таакже их легче изменять.
ANDREY.EXE
новенький
Сообщения: 60
Зарегистрирован: 18.03.2006 21:06:35

Сообщение ANDREY.EXE »

SovNarKom
Ещё такая кнопка смешная есть... "редактировать", будь другом а? Поправь пожалуйста...
Совершенно непойму о чём ты.
ANDREY.EXE
новенький
Сообщения: 60
Зарегистрирован: 18.03.2006 21:06:35

Сообщение ANDREY.EXE »

SovNarKom
Дальше куча просто синтактических ошибок... нет моих сил
Научись чтоли код форматировать нормально, а книжку купи... и лучше купи учебник для ВУЗА... Я не хочу тебя обидеть, но так нельзя как ты делать... Это не программирование а садомазахизм... Твоя проблема - незнание языка этого.
Заметь я никогда и ниде неговорил что я спец я только начал изучать Паскаль.Но полностью с тобой согласен на счёт книги.
ANDREY.EXE
новенький
Сообщения: 60
Зарегистрирован: 18.03.2006 21:06:35

Сообщение ANDREY.EXE »

SovNarKom
go := go + 1.0;
go - константа, объяви в варе как Single ну короче дробное.
А с этого места попрошу поподробней :D
Sniper
постоялец
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Sniper »

ANDREY.EXE писал(а): SovNarKom
go := go + 1.0;
go - константа, объяви в варе как Single ну короче дробное.
А с этого места попрошу поподробней :D

И чё тут не ясного?

var
go: single=0;
ANDREY.EXE
новенький
Сообщения: 60
Зарегистрирован: 18.03.2006 21:06:35

Сообщение ANDREY.EXE »

Sniper
И чё тут не ясного?
Как чё я ж ещё книгу некупил :D .Спасибо.
ANDREY.EXE
новенький
Сообщения: 60
Зарегистрирован: 18.03.2006 21:06:35

Сообщение ANDREY.EXE »

Всё работает компилица толь камера нехочит двигаться.

Код: Выделить всё

 if keys[VK_UP] then
        go := go + 0.1;
       if (keys[VK_ESCAPE]) then
       finished := True
else

    end;

end;
ANDREY.EXE
новенький
Сообщения: 60
Зарегистрирован: 18.03.2006 21:06:35

Сообщение ANDREY.EXE »

Помогите!
Ответить