Author Topic: help with OpenGL  (Read 2287 times)

0 Members and 1 Guest are viewing this topic.

Offline egons

  • C= 64
  • **
  • Posts: 31
  • Karma: 0
    • View Profile
help with OpenGL
« on: May 21, 2012 »
hi there!
i'm used 4k Framework, guys at the purebasic forum said they see nothing.
help me to understand what's wrong.
attach:code+compiled.exe
thank u.

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: help with OpenGL
« Reply #1 on: May 21, 2012 »
Is your window zero pixels in size?

hDC = GetDC_ ( CreateWindow_("edit", 0, #WS_POPUP | #WS_VISIBLE | #WS_MAXIMIZE, 0, 0 ,0 ,0, 0 ,0 ,0, 0 ) )

->

hDC = GetDC_ ( CreateWindow_("edit", 0, #WS_POPUP | #WS_VISIBLE | #WS_MAXIMIZE, 0, 0 ,800,600, 0 ,0 ,0, 0 ) )

Jim
Challenge Trophies Won:

Offline egons

  • C= 64
  • **
  • Posts: 31
  • Karma: 0
    • View Profile
Re: help with OpenGL
« Reply #2 on: May 21, 2012 »
Is your window zero pixels in size?

hDC = GetDC_ ( CreateWindow_("edit", 0, #WS_POPUP | #WS_VISIBLE | #WS_MAXIMIZE, 0, 0 ,0 ,0, 0 ,0 ,0, 0 ) )

->

hDC = GetDC_ ( CreateWindow_("edit", 0, #WS_POPUP | #WS_VISIBLE | #WS_MAXIMIZE, 0, 0 ,800,600, 0 ,0 ,0, 0 ) )

Jim

iduunno, someone said - everything is ok and i got someone on da screeen O0

Offline jace_stknights

  • Amiga 1200
  • ****
  • Posts: 399
  • Karma: 32
  • PEEK & POKE are not MOVEM!
    • View Profile
    • ST Knights WebSite
Re: help with OpenGL
« Reply #3 on: May 21, 2012 »
The problem with your code is there are a lot of things missing! These are Windows stuff like : instances, windows messages, etc... The code is working, but there is no interaction with the UI. This is like you make a car running alone in the street -> there is no driver that can react with the environment.

As it is supposed to be a 4k, I think the original coder has removed tons of things. You should try to include things step by step and see by yourside.


Here is a part of the create window from the opengl4.1 pb examples(http://ftp//ftp-developpez.com/purebasic/sources/fichiers/3d/opengl/nehe-tutoriels.zip, you can see there are much more things inside. There are some part of the code you should try to insert in yours like GetModuleHandle_, RegisterClass_
Code: [Select]
Procedure.b CreateGLWindow(title.s,width.l,height.l,bits.l,fullscreenflag.b)

 Protected PixelFormat.l ;Holds The Results After Searching For A Match
 Protected wc.WNDCLASS ;Windows Class Structure
 Protected dwExStyle.l ;Window Extended Style
 Protected dwStyle.l ;Window Style
 Protected WindowRect.RECT ;Grabs Rectangle Upper Left / Lower Right Values
 Protected wpos.POINT ;Window position
 
 WindowRect\left=0 ;Set Left Value To 0
 WindowRect\right=width ;Set Right Value To Requested Width
 WindowRect\top=0 ;Set Top Value To 0
 WindowRect\bottom=height ;Set Bottom Value To Requested Height
 
 fullscreen=fullscreenflag ;Set The Global Fullscreen Flag
 
 hInstance=GetModuleHandle_(#Null) ;Grab An Instance For Our Window
 
 wc\style=#CS_HREDRAW | #CS_VREDRAW | #CS_OWNDC ;Redraw On Size, And Own DC For Window
 wc\lpfnWndProc=@WndProc() ;WndProc Handles Messages
 wc\cbClsExtra=0 ;No Extra Window Data
 wc\cbWndExtra=0 ;No Extra Window Data
 wc\hInstance=hInstance ;Set The Instance
 wc\hIcon=LoadIcon_(#Null,#IDI_WINLOGO) ;Load The Default Icon
 wc\hCursor=LoadCursor_(#Null,#IDC_ARROW) ;Load The Arrow Pointer
 wc\hbrBackground=#Null ;No Background Required For GL
 wc\lpszMenuName=#Null ;We Don't Want A Menu
 wc\lpszClassName=@"OpenGL" ;Set The Class Name
 
 If RegisterClass_(wc)=0 ;Attempt To Register The Window Class
  MessageBox_(#Null,"Failed To Register The Window Class.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
  ProcedureReturn #False
 EndIf
 
 If fullscreen ;Attempt Fullscreen Mode?
 
  Protected dmScreenSettings.DEVMODE ;Device Mode
  dmScreenSettings\dmSize=SizeOf(DEVMODE) ;Size Of The Devmode Structure
  dmScreenSettings\dmFields=#DM_BITSPERPEL | #DM_PELSWIDTH | #DM_PELSHEIGHT ;bit flags to specify the members of DEVMODE that were initialized
  dmScreenSettings\dmBitsPerPel=bits ;Selected Bits Per Pixel
  dmScreenSettings\dmPelsWidth=width ;Selected Screen Width in pixels
  dmScreenSettings\dmPelsHeight=height ;Selected Screen Height in pixels
 
  ;Try To Set Selected Mode And Get Results. Note: CDS_FULLSCREEN Gets Rid Of Start Bar
  If ChangeDisplaySettings_(dmScreenSettings,#CDS_FULLSCREEN)<>#DISP_CHANGE_SUCCESSFUL
   ;If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode
   If MessageBox_(#Null,"The Requested Fullscreen Mode Is Not Supported By"+Chr(10)+"Your Video Card. Use Windowed Mode Instead?","NeHe GL",#MB_YESNO | #MB_ICONEXCLAMATION)=#IDYES
    fullscreen=#False ;Windowed Mode Selected.  Fullscreen = FALSE
   Else
    ;Pop Up A Message Box Letting User Know The Program Is Closing
    MessageBox_(#Null,"Program Will Now Close.","ERROR",#MB_OK | #MB_ICONSTOP)
    ProcedureReturn #False
   EndIf
  EndIf
 
 EndIf
 
 If fullscreen ;Are We Still In Fullscreen Mode?
  dwExStyle=#WS_EX_APPWINDOW ;Window Extended Style
  dwStyle=#WS_POPUP ;Windows Style
  ShowCursor_(#False) ;Hide Mouse Pointer
 Else
  dwExStyle=#WS_EX_APPWINDOW | #WS_EX_WINDOWEDGE ;Window Extended Style
  dwStyle=#WS_OVERLAPPEDWINDOW ;Windows Style
 EndIf
 
 AdjustWindowRectEx_(WindowRect,dwStyle,#False,dwExStyle) ;Adjust Window To True Requested Size
 
 If fullscreen=0 ;if not fullscreen mode calculate screen centered window
  wpos\x=(GetSystemMetrics_(#SM_CXSCREEN)/2)-((WindowRect\right-WindowRect\left)/2)
  wpos\y=(GetSystemMetrics_(#SM_CYSCREEN)/2)-((WindowRect\bottom-WindowRect\top)/2)
 EndIf
 
 ;CreateWindowEx_(Extended Window Style, Class Name, Window Title, Window Style, Window X Position, Window Y Position, Width, Height, No Parent Window, No Menu, Instance, No Creation Data)
 hWnd=CreateWindowEx_(dwExStyle,"OpenGL",title,dwStyle | #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN,wpos\x,wpos\y,WindowRect\right-WindowRect\left,WindowRect\bottom-WindowRect\top,#Null,#Null,hInstance,#Null)
 If hWnd=0
  KillGLWindow() ;Reset The Display
  MessageBox_(#Null,"Window Creation Error.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
  ProcedureReturn #False
 EndIf
 
 Protected pfd.PIXELFORMATDESCRIPTOR ;pfd Tells Windows How We Want Things To Be
 pfd\nSize=SizeOf(PIXELFORMATDESCRIPTOR) ;Size Of This Structure
 pfd\nVersion=1 ;Version Number
 pfd\dwFlags=#PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW ;Format Must Support Window, OpenGL, Double Buffering
 pfd\iPixelType=#PFD_TYPE_RGBA ;Request An RGBA Format
 pfd\cColorBits=bits ;Select Our Color Depth
 pfd\cRedBits=0 ;Color Bits Ignored
 pfd\cRedShift=0
 pfd\cGreenBits=0
 pfd\cGreenShift=0
 pfd\cBlueBits=0
 pfd\cBlueShift=0
 pfd\cAlphaBits=0 ;No Alpha Buffer
 pfd\cAlphaShift=0 ;Shift Bit Ignored
 pfd\cAccumBits=0 ;No Accumulation Buffer
 pfd\cAccumRedBits=0 ;Accumulation Bits Ignored
 pfd\cAccumGreenBits=0
 pfd\cAccumBlueBits=0
 pfd\cAccumAlphaBits=0
 pfd\cDepthBits=16 ;16Bit Z-Buffer (Depth Buffer)
 pfd\cStencilBits=0 ;No Stencil Buffer
 pfd\cAuxBuffers=0 ;No Auxiliary Buffer
 pfd\iLayerType=#PFD_MAIN_PLANE ;Main Drawing Layer
 pfd\bReserved=0 ;Reserved
 pfd\dwLayerMask=0 ;Layer Masks Ignored
 pfd\dwVisibleMask=0
 pfd\dwDamageMask=0
 
 hDC=GetDC_(hWnd)
 If hDC=0 ;Did We Get A Device Context?
  KillGLWindow() ;Reset The Display
  MessageBox_(#Null,"Can't Create A GL Device Context.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
  ProcedureReturn #False
 EndIf
 
 PixelFormat=ChoosePixelFormat_(hDC,pfd)
 If PixelFormat=0 ;Did Windows Find A Matching Pixel Format?
  KillGLWindow() ;Reset The Display
  MessageBox_(#Null,"Can't Find A Suitable PixelFormat.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
  ProcedureReturn #False
 EndIf
 
 If SetPixelFormat_(hDC,PixelFormat,pfd)=0 ;Are We Able To Set The Pixel Format?
  KillGLWindow() ;Reset The Display
  MessageBox_(#Null,"Can't Set The PixelFormat.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
  ProcedureReturn #False
 EndIf
 
 hRC=wglCreateContext_(hDC)
 If hRC=0 ;Are We Able To Get A Rendering Context?
  KillGLWindow() ;Reset The Display
  MessageBox_(#Null,"Can't Create A GL Rendering Context.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
  ProcedureReturn #False
 EndIf
 
 If wglMakeCurrent_(hDC,hRC)=0 ;Try To Activate The Rendering Context
  KillGLWindow() ;Reset The Display
  MessageBox_(#Null,"Can't Activate The GL Rendering Context.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
  ProcedureReturn #False
 EndIf
 
 ShowWindow_(hWnd,#SW_SHOW) ;Show The Window
 SetForegroundWindow_(hWnd) ;Slightly Higher Priority
 SetFocus_(hWnd) ;Sets Keyboard Focus To The Window
 ReSizeGLScene(width,height) ;Set Up Our Perspective GL Screen
 
 If InitGL()=0 ;Initialize Our Newly Created GL Window
  KillGLWindow() ;Reset The Display
  MessageBox_(#Null,"Initialization Failed.","ERROR",#MB_OK | #MB_ICONEXCLAMATION)
  ProcedureReturn #False
 EndIf

 ProcedureReturn #True ;Success
 
EndProcedure

and don't forget to include the window message reception in the main loop, this cause you windows not responding to the system:
Code: [Select]

  msg.MSG ;Windows Message Structure

 While done=#False ;Loop That Runs While done=FALSE
 
  If PeekMessage_(msg,#Null,0,0,#PM_REMOVE) ;Is There A Message Waiting?
 
   If msg\message=#WM_QUIT ;Have We Received A Quit Message?
    done=#True ;If So done=TRUE
   Else ;If Not, Deal With Window Messages
    TranslateMessage_(msg) ;Translate The Message
    DispatchMessage_(msg) ;Dispatch The Message
   EndIf

 else
   ;drawing stuff

 endif

 wend

« Last Edit: May 21, 2012 by jace_stknights »
Challenge Trophies Won:

Offline energy

  • Amiga 1200
  • ****
  • Posts: 280
  • Karma: 25
    • View Profile
Re: help with OpenGL
« Reply #4 on: May 21, 2012 »
Here's the corrected file.

One tip:
If yu are going to code 4k's with PB, forget it. PB compile with its own libs,
so yu wont be able to produce it in 4k.

cheers eNeRGy

coding: jwasm,masm
hobby: www.scd2003.de

Offline jace_stknights

  • Amiga 1200
  • ****
  • Posts: 399
  • Karma: 32
  • PEEK & POKE are not MOVEM!
    • View Profile
    • ST Knights WebSite
Re: help with OpenGL
« Reply #5 on: May 22, 2012 »
Well done Energy  ;) You just managed to make it work with SetPixelFormat_ !

Here it has worked, but after some heavy add...  :-[

But it is not better to manage the windows messages?
Challenge Trophies Won:

Offline egons

  • C= 64
  • **
  • Posts: 31
  • Karma: 0
    • View Profile
Re: help with OpenGL
« Reply #6 on: May 22, 2012 »
thank u!

One tip:
If yu are going to code 4k's with PB, forget it. PB compile with its own libs,
so yu wont be able to produce it in 4k.
i've tried once 4klang+PB code, if you see thread on pouёt.

Offline Jim

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 5301
  • Karma: 402
    • View Profile
Re: help with OpenGL
« Reply #7 on: May 22, 2012 »
Quote
But it is not better to manage the windows messages?
Sure!  But if <4k is the aim and noone is moving the mouse or typing, it almost certainly won't crash for a while :P

Jim
Challenge Trophies Won:

Offline energy

  • Amiga 1200
  • ****
  • Posts: 280
  • Karma: 25
    • View Profile
Re: help with OpenGL
« Reply #8 on: May 22, 2012 »
so , as Jim said.
and as its announced it should be a 4k framework, so all "unneeded" stuff is removed,
to produce a small but working framework.

Quote
You just managed to make it work with SetPixelFormat_ !
watch here:
http://msdn.microsoft.com/en-us/library/dd369049(v=vs.85).aspx

I think some variables should also be global like hdc which will be needed in perhaps
disfferent functions.
coding: jwasm,masm
hobby: www.scd2003.de

Offline jace_stknights

  • Amiga 1200
  • ****
  • Posts: 399
  • Karma: 32
  • PEEK & POKE are not MOVEM!
    • View Profile
    • ST Knights WebSite
Re: help with OpenGL
« Reply #9 on: May 22, 2012 »
 :clap:
I'm not a clean coder, you know, but I'm still trying to make all as it should be. This example just reminds me that sometimes you can make it smaller and smarter  ;D
Challenge Trophies Won:

Offline egons

  • C= 64
  • **
  • Posts: 31
  • Karma: 0
    • View Profile
Re: help with OpenGL
« Reply #10 on: May 22, 2012 »
well, thank u. guyz said program works properly. how code is related to 4k framework?
and last thing: i want to calculate midpoint of triangle:

Code: [Select]
Restore icosavert
  ;glBegin_(#GL_TRIANGLES)
  For i=0 To 19
  ;  glColor3f_(i/19,0,0.0)
   Read.b a
   Read.b b
   Read.b c
   
   xs=(x(a)+x(b)+x(c))/3
   ys=(y(a)+y(b)+y(c))/3
   zs=(z(a)+z(b)+z(c))/3
   
   glBegin_(#GL_TRIANGLES);#GL_lines);
   glColor3f_(0.0,0.0,1.0);
   glVertex3f_(x(a),y(a),z(a))
   glColor3f_(0.0,1.0,0.0);
   glVertex3f_(x(b),y(b),z(b))
   glColor3f_(1.0,0.0,0.0);
   glVertex3f_(x(c),y(c),z(c))
   glEnd_()
   
   glBegin_(#GL_lines);
   glColor3f_(1.0,1.0,1.0);
   glVertex3f_(0,0,0)
   glVertex3f_(xs,ys,zs)
   glEnd_()

  Next i
a purpose is to determine an edges of dodecahedron, but.. you know how  scene seems(
what's wrong? :diablo: