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)
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);
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... :/
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
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]
- Tu jest kod tego co zmajstrowalem, na razie jest to tylko wyswietlanie menu i proby nad tym nieszczesnym modelem 3d :/ http:*www.migajek.com/ekspert/OGL_3ds.rar
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 !)
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?
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
DZIĘKI [browar] :)