• Welcome to Dark Bit Factory & Gravity.
 

help with OpenGL

Started by egons, May 21, 2012

Previous topic - Next topic

0 Members and 0 Guests are viewing this topic.

egons

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.

Jim

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:

egons

Quote from: Jim 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

jace_stknights

#3
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_

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:


  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

Challenge Trophies Won:

energy

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

jace_stknights

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:

egons

thank u!

Quote from: energy on May 21, 2012
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.

Jim

QuoteBut 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:

energy

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.

QuoteYou 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

jace_stknights

 :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:

egons

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:

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: