[Delphi] OpenGL -> model 3ds.

0

Czy ktos moglby mi doradzic z jakiego loadera plikow 3ds skozystac? Probowalem tego z Sulaco.co.za ale niestety, nie dziala on tylko kiedy tworze progs pod VCLem... A teraz akurat zalezy mi by byl on w czystym WinAPI, i za chiny nie chce dzialac. Tzn po prostu nie wyswietla obiektu, mimo ze kod jest identyczny jak kod z przykladu VCL. Patrzylem do źródła tego loadera i w zasadzie nie znalazlem niczego co by sie moglo wiazac z VCL (zadnych odwolan do parentow etc)

0

No mi dziala - tak na chama! (1 - SimpleLoad)

//----window.pas
unit window;

interface

uses Windows;

procedure WinMain;

implementation



uses Messages,UglContext,OpenGL,Unit3DS;

const
 ClassName = 'WindowTemp';

var
// ********************************** NEW NEW **********************************
    Model:T3DModel;  // Variable for instancing T3DModel
// ********************************** END NEW **********************************

function WindowProc(Window: Longint; Message: UINT; WPram: WPARAM;  LPram: LPARAM): LRESULT; stdcall; StdCall;
begin
  WindowProc := 0;
  case Message of
    wm_Create:begin
      CreateGLContext(Window); // Pass the window handle to create opengl context
// ********************************** NEW NEW **********************************
  Model:=T3DModel.Create;            // Instance of T3DModel
  Model.LoadFromFile('sulaco.3ds');  // Load the 3DS file
// ********************************** END NEW **********************************
  glEnable(GL_LIGHT0);    // Enable Light0
  glEnable(GL_LIGHTING);  // Enable Lighting
   ResizeGL(800, 500);
    end;

    WM_Paint:begin
      ClearGL;     // Clear frame buffer
// ********************************** NEW NEW **********************************
  Model.Draw;  // Draws the complete 3DS file
// ********************************** END NEW **********************************
  SwapGL;     // Swap buffers
        exit;
    end;

   wm_Destroy:
     begin
     // ********************************** NEW NEW **********************************
  Model.Free;        // Free instance (and memory)
// ********************************** END NEW **********************************
  DestroyGLContext; // Free device context created for opengl
  
       PostQuitMessage(0);

       Exit;
     end;
  end;
  WindowProc := DefWindowProc(Window, Message, WPram, LPram);
end;

procedure WinMain;
var
  Window: HWND;
  Message: TMsg;
  WindowClass: TWndClass;
begin

  WindowClass.style:= 0;
  WindowClass.lpfnWndProc:= @WindowProc;
  WindowClass.cbClsExtra:= 0;
  WindowClass.cbWndExtra:= 0;
  WindowClass.hIcon:= 0;
  WindowClass.hCursor:= LoadCursor(0, IDC_ARROW);
  WindowClass.hbrBackground:= COLOR_APPWORKSPACE;
  WindowClass.lpszMenuName:= nil;
  WindowClass.lpszClassName:= ClassName;
  WindowClass.hInstance := HInstance;

  RegisterClass(WindowClass);
  Window := CreateWindow(
    ClassName,
    '',
     WS_OVERLAPPEDWINDOW	,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    800,
    500,
    0,
    0,
    HInstance,
    nil);
  ShowWindow(Window, SW_SHOW);


  while GetMessage(Message, 0, 0, 0) do
  begin
    TranslateMessage(Message);
    DispatchMessage(Message);
  end;


  Halt(Message.wParam);  
 
end;

end.
//------------------- main.dpr
program main
uses Window;
begin
WinMain;
end.

moze -> ResizeGL(800, 500);

0

Hmm... Czyli ze to nie zalezy od VCLa tylko od sposobu inicjalizacji OGL (w jaki robi UglContext... :/ Bo ja kozystalem tylko z wlasnych procedur, i wszystko mi pieknie dzialalo (nawet loadery innych formatow).
Dzieki za pomoc, cos z tym pogrzebie... :P
// Hmm... kod ktory podales dziala, ale mi zalezy na tym zeby bylo bez tego unitu UglContext... A jak ustawilem identyczny sposob inizjalizacji, to widze czarny ekran... :/

0

no to dziwne bo UglContext.pas to duzo w sobie nie ma (na pewno nic z VCL !
tylko Windows (winapi) i OpenGL !)

moze zmienne takie jak (w ugl...)
Dc:hDc;
glContext:hglrc;

wkladasz do funkcji WindowProc (a ona za kazdym razem jest wywolywana z pustymi - nie wiem jak to napisac mam nadzieje ze domyslisz sie o co mi chodzi ?!)

moze zapodaj fragment ?! (jaj jak wpakowalem to do srodka z unitu - wywalajac funkcje to jest OK)

Ten nie dziala !!!!!!!!!!

function WindowProc(Window: Longint; message: UINT; WPram: WPARAM;  LPram: LPARAM): LRESULT; stdcall; stdcall;
      var Pfd: TPixelFormatDescriptor;
    iFormat: Integer;
var Dc:hDc;
    glContext:hglrc;

begin

a ten dziala !

var Dc:hDc;
    glContext:hglrc;
function WindowProc(Window: Longint; message: UINT; WPram: WPARAM;  LPram: LPARAM): LRESULT; stdcall; stdcall;
      var Pfd: TPixelFormatDescriptor;
    iFormat: Integer;
begin
0
reichel napisał(a)

moze zmienne takie jak (w ugl...)
Dc:hDc;
glContext:hglrc;

nic z tego nie ma...
Masz racje, w tym kodzie naprawde nie ma nic waznego... a jednak [sciana]

0

Nie do konca przekonany jestem do metody (twojej? ale po prostu nie uzywalem w taki sposob ?!) z idle. jak dalem w paint to zadzialalo ?! i generalnie jak w idle
to tez ok
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

ale nie do konca i tak wiem - troche tego kodu jest !

no jeszcze to
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity() ;

trzeba zobaczyc z jakimi ustwaieniami mozna pracowac (a jest sporo parametrow i az tak dobrze na openGL sie nie znam !)

0
reichel napisał(a)

Nie do konca przekonany jestem do metody (twojej?) z idle jak dalem w paint to zadzialalo ?! i generalnie jak w idle
to tez ok
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

ale nie do konca i tak wiem - troche tego kodu jest !

To zagmatwanie jest z idle i render jest stad, ze na poczatku robilem to z biblioteczka glut. I w niej ustawiasz wlasnie IdleFunct i RenderFunct -> a potem postanowilem nieco ambitniej, czyli w samym WinAPI ... :P Mowisz zeby dac w OnPaint?

0

no i jescze to co wspomnialem
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
i jak sie zakomentuje to drugie to rusza

ps. dwa razy przydzielasz pamiec do obj ->> LoadGraphicsData();
to
gluLookAt(0, 20, 120, 0, 30, 0, 0, 1, 0); // Set position and orientation
i warto swiatlo dodac ! (no nie wiem jak na koncu)

generalnie trzebazrobic porzadek z tym jak skalowac i co bedzie widac (i to jest powod czemu nie ma obiektu)

tu brutalnie pozmieniany kod ! (nie mialem tekstur - i zrobilem tak aby bylo cokolwiek - dziala bez paint - nie warto mieszac glutowych sposobow z winapi albo jedno albo drugie)
http://rudy.mif.pg.gda.pl/~reichel/brutal.rar

0

DZIĘKI [browar] :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1