Dark Bit Factory & Gravity

PROGRAMMING => General coding questions => Topic started by: Shockwave on October 03, 2008

Title: Really need to fix this..
Post by: Shockwave on October 03, 2008
This program uses the very small framework, but because the framework uses some tricks it is not compatible enough for this program which I am giving to a friend to run on computers in his computer shop.

Rbz kindly posted a larger, more compatible framework and I susequently tried to port this code into Rbz's framework.

Problems however arose initially as I could not include glu.bi, I tend to use glu.bi to build mipmaps and also I like to use some of the features of glut.bi too.

The other thing is that because the programming style of the better layout is much different to my own more procedural approach to programming, I could not grasp it at all.

I don't have a clue how the larger framework works, I cant even work out what part of the framework is the main draw loop.. Where I should be setting up my textures and materials etc, I am ashamed to say that I have looked very hard and I have to finally admit failure and ask for help. Sorry.

What I would like to know is how can I make the listing I have attached more compatible with vista?

For example I want to make sure that the window is properly destroyed on exit.

Also I would ideally like to be able to change the framework I am using so that I can specify a screen resolution in pixels and not to just grab the dimensions of the desktop as it does now.

I have tried, I suspect it wouldn't need many changes but I am buggered if I can work it out.

All apologies and thanks for taking a look.

Btw it doesnt matter to me at all if the exe increases even by 100k.
Title: Re: Really need to fix this..
Post by: Rbz on October 03, 2008
The main loop for compatible framework is here:
Code: [Select]
    '
    ' Process windows messages
    '
    while(wMsg.message <> WM_QUIT)
       
        if (PeekMessage (@wMsg,NULL,0,0,PM_REMOVE) <> 0) then
            DispatchMessage(@wMsg)
        else
            glDraw()
            SwapBuffers (hdcWin)
        end if
   
    wend
You can add all your rendering comands inside glDraw() function.
To init your opengl just call a glInit() function before this main loop and it should work fine.

For some reason you need to include your gl libs first or it will give you an error:
Code: [Select]
    #INCLUDE "GL/gl.bi"
    #INCLUDE "GL/glu.bi"
    #INCLUDE "GL/glut.bi"
    #INCLUDE "windows.bi"
Title: Re: Really need to fix this..
Post by: Shockwave on October 03, 2008
Ok, that helps quite a bit Rbz, but I dont really relish the idea of moving this particular intro over to it. I'll use the better framework in the future, what I am really after is to make this one a little safer just for now so that I can give the intro to its new owner and carry on with some of the other things I have to make.
Title: Re: Really need to fix this..
Post by: Rbz on October 03, 2008
Ok, I misunderstand you :)

Code: [Select]
For example I want to make sure that the window is properly destroyed on exit.
Just add ExitProcess(0)  after your main loop.

Code: [Select]
Also I would ideally like to be able to change the framework I am using so that I can specify a screen resolution in pixels and not to just grab the dimensions of the desktop as it does now.
You need to add this code below, and then just call ChangeScreenResolution with correct screen size, inside InitOGL() subroutione.

Code: [Select]
'DEVMODE bug, found the cure here --> http://www.freebasic.net/forum/viewtopic.php?t=5659&highlight=devmode
'Will be corrected by Victor in the next freebasic update
#undef DEVMODE
Type DEVMODE
    dmDeviceName As Zstring * CCHDEVICENAME
    dmSpecVersion As WORD
    dmDriverVersion As WORD
    dmSize As WORD
    dmDriverExtra As WORD
    dmFields As DWORD
    dmOrientation As Short
    dmPaperSize As Short
    dmPaperLength As Short
    dmPaperWidth As Short
    dmScale As Short
    dmCopies As Short
    dmDefaultSource As Short
    dmPrintQuality As Short
    dmColor As Short
    dmDuplex As Short
    dmYResolution As Short
    dmTTOption As Short
    dmCollate As Short
    dmFormName As Zstring * CCHFORMNAME
    dmLogPixels As WORD
    dmBitsPerPel As DWORD
    dmPelsWidth As DWORD
    dmPelsHeight As DWORD
    dmDisplayFlags As DWORD
    dmDisplayFrequency As DWORD
    dmICMMethod As DWORD
    dmICMIntent As DWORD
    dmMediaType As DWORD
    dmDitherType As DWORD
    dmReserved1 As DWORD
    dmReserved2 As DWORD
    dmPanningWidth As DWORD
    dmPanningHeight As DWORD
End Type

'Change The Screen Resolution
sub ChangeScreenResolution (byval wwidth as integer, byval hheight as integer, byval bitsPerPixel as integer)
dim dmScreenSettings as DEVMODE
ZeroMemory(@dmScreenSettings, sizeof (DEVMODE))
dmScreenSettings.dmSize = sizeof(DEVMODE)
dmScreenSettings.dmPelsWidth = wwidth
dmScreenSettings.dmPelsHeight = hheight
dmScreenSettings.dmBitsPerPel = bitsPerPixel
dmScreenSettings.dmFields = DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT

    if (ChangeDisplaySettings (cast(LPDEVMODE,@dmScreenSettings), CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL) then
        MessageBox(NULL,"Change Display Error!", szAppName,MB_OK or MB_ICONEXCLAMATION)
end -1
end if
   
end sub
Title: Re: Really need to fix this..
Post by: Shockwave on October 03, 2008
K+ Thanks RBZ :)

Title: Re: Really need to fix this..
Post by: Jim on October 03, 2008
I think the other problem with the tiny framework is the HWND/Window that is created is sub-classed off the "Edit" control.  When the Window gets minimised or changes size in another way the edit control class doesn't know what to do and it gets screwed up.  You should create a new class for all your application's windows, like this:
Code: [Select]
Dim wc as WNDCLASS
Dim classname as String

classname="COCKSHAVE"

wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC
wc.lpfnWndProc = cast(WNDPROC, DefWindowProc)
wc.cbClsExtra = 0
wc.cbWndExtra = 0
wc.hInstance = GetModuleHandle(NULL)
wc.hIcon = 0
wc.hCursor = LoadCursor( NULL, IDC_ARROW )
wc.hbrBackground = 0
wc.lpszMenuName = NULL
wc.lpszClassName = classname
RegisterClass(@wc)

dim as integer style = WS_OVERLAPPED Or WS_SYSMENU Or WS_CAPTION
dim as integer exstyle = WS_EX_APPWINDOW
gameWindow = CreateWindowEx(
0,
classname, // class
"Shockwave's Demo",
style,
CW_USEDEFAULT,CW_USEDEFAULT, // init. x,y pos
SCREEN_WIDTH,SCREEN_HEIGHT,
NULL, // parent window
NULL, // menu handle
wc.hInstance, // program handle
NULL // create parms
)
Forgive me, it was in C and I've tried to do the port to FB without testing it...
At the moment the tiny code has 'classname' set to "EDIT" which is a built-in class.

At some point you should create your own WindowProc to go where DefWindowProc goes so you can handle messages Windows sends you - like paint messages, keyboard messages, mouse move etc.

Jim

Title: Re: Really need to fix this..
Post by: Shockwave on October 03, 2008
Fair play to you Jim.

You and Rbz have saved my bacon more times than I'd like to admit :) Thanks very much.
Title: Re: Really need to fix this..
Post by: Shockwave on October 04, 2008
Ok, I have almost got it working :)

After I tried what Rbz advised it wouldn't compile, I realised then that I needed memset so I included crt.bi as well which fixed that.

The screen resolution changes niecely now but the viewport is messed up with the screen having a black border, I have tried several ways to fix this, I'll keep trying but in the meantime here it is;

(needs the attachments from the first post)
Code: [Select]
'
'                              (STUS COMPUTERS)
'
'
'-------------------------------------------------------------------------------

    #INCLUDE "GL/gl.bi"
    #INCLUDE "GL/glu.bi"
    #INCLUDE "GL/glut.bi"
    #INCLUDE "windows.bi"
    #include "crt.bi"
   
    #INCLUDE "comp2pal.bas"
    #INCLUDE "comp2raw.bas"
   
'-------------------------------------------------------------------------------
'   FIXED SIZE ARRAYS, DECLARE ALL VARIABLES;
'-------------------------------------------------------------------------------

    OPTION STATIC
    OPTION EXPLICIT
 

#undef DEVMODE
Type DEVMODE
    dmDeviceName As Zstring * CCHDEVICENAME
    dmSpecVersion As WORD
    dmDriverVersion As WORD
    dmSize As WORD
    dmDriverExtra As WORD
    dmFields As DWORD
    dmOrientation As Short
    dmPaperSize As Short
    dmPaperLength As Short
    dmPaperWidth As Short
    dmScale As Short
    dmCopies As Short
    dmDefaultSource As Short
    dmPrintQuality As Short
    dmColor As Short
    dmDuplex As Short
    dmYResolution As Short
    dmTTOption As Short
    dmCollate As Short
    dmFormName As Zstring * CCHFORMNAME
    dmLogPixels As WORD
    dmBitsPerPel As DWORD
    dmPelsWidth As DWORD
    dmPelsHeight As DWORD
    dmDisplayFlags As DWORD
    dmDisplayFrequency As DWORD
    dmICMMethod As DWORD
    dmICMIntent As DWORD
    dmMediaType As DWORD
    dmDitherType As DWORD
    dmReserved1 As DWORD
    dmReserved2 As DWORD
    dmPanningWidth As DWORD
    dmPanningHeight As DWORD
End Type
declare sub ChangeScreenResolution (byval wwidth as integer, byval hheight as integer, byval bitsPerPixel as integer)

'-------------------------------------------------------------------------------
'   FIXED SIZE ARRAYS, DECLARE ALL VARIABLES;
'-------------------------------------------------------------------------------

    '--------------
    '--Image size--
    '--------------
   
    Const imgX = 512
    Const imgY = 256

    Declare Sub DrawImage(byval imxpos as integer,byval imypos as integer)
    Declare Sub LoadDataImage()   
    'Picture buffer
    Dim Shared img_buffer( imgx * imgy ) as integer   
    'RGB color palette buffer
    Dim Shared img_r(256), img_g(256), img_b(256) as short   
    LoadDataImage()


'-------------------------------------------------------------------------------
'   MESSAGEBOX REQUESTER, FULLSCREEN / WINDOWED.
'-------------------------------------------------------------------------------

    DIM SHARED FS_WN AS INTEGER
   
    FS_WN=MessageBox (NULL,"Screen Mode"+CHR$(13)+"Selector"+CHR$(13)+chr$(13)+"Fullscreen?", "UNFINISHED PREVIEW", MB_YESNO)
    DIM SHARED AS BYTE  W_FULLSCREEN =0 : ' 1 = FULLSCREEN
    IF FS_WN=6 THEN W_FULLSCREEN =1
   

'-------------------------------------------------------------------------------
'   SCREEN RELATED STUFF;
'-------------------------------------------------------------------------------

    DIM SHARED AS INTEGER W_XW =800     : ' Width  (WINDOWED MODE).
    DIM SHARED AS INTEGER W_YH =600     : ' Height (WINDOWED MODE).
    DIM SHARED pfd as PIXELFORMATDESCRIPTOR
    DIM SHARED HDC as HDC

    DECLARE SUB DRAWCUBE (BYVAL XRR AS DOUBLE , BYVAL YRR AS DOUBLE, BYVAL ZRR AS DOUBLE, BYVAL XP AS DOUBLE, BYVAL YP AS DOUBLE , BYVAL ZP AS DOUBLE , BYVAL MAT AS INTEGER )
    DECLARE SUB DRAWCUBE2(BYVAL XRR AS DOUBLE , BYVAL YRR AS DOUBLE, BYVAL ZRR AS DOUBLE, BYVAL XP AS DOUBLE, BYVAL YP AS DOUBLE , BYVAL ZP AS DOUBLE , BYVAL MAT AS INTEGER )
    DECLARE SUB DRAWCUBE3(BYVAL XRR AS DOUBLE , BYVAL YRR AS DOUBLE, BYVAL ZRR AS DOUBLE, BYVAL XP AS DOUBLE, BYVAL YP AS DOUBLE , BYVAL ZP AS DOUBLE , BYVAL MAT AS INTEGER )
    DECLARE SUB COPPERFRONT()
    DECLARE SUB MASKED_LOGO(byval ro as double)

'-------------------------------------------------------------------------------
'   LIGHTING AND MATERIALS;
'-------------------------------------------------------------------------------

    DIM SHARED lightambient(0 to 3) AS SINGLE => { .9, .9, .9,1.0}   
    DIM SHARED lightambient2(0 to 3) AS SINGLE => { .2, .2, .2,.2}   
    DIM SHARED lightambient3(0 to 3) AS SINGLE => { .2, .2, .2,.2}   
   
    ' shadow;
    DIM SHARED MATERIALT(0 to 3) AS SINGLE => { 0.02, 0.02, 0.02,.2}
   
    'CUBES;
   
    DIM SHARED MATERIAL1A(0 to 3) AS SINGLE => { 0.75, 0.10 , 0.25,.3}
    '25
    DIM SHARED MATERIAL1B(0 to 3) AS SINGLE => { 0.25, 0.75 , 0.15,.3}
    DIM SHARED MATERIAL1C(0 to 3) AS SINGLE => { 0.10, 0.40 , 0.75,.3}

    DIM SHARED MATERIAL1D(0 to 3) AS SINGLE => { 0.35, 0.10 , 0.40,.6}
    DIM SHARED MATERIAL1E(0 to 3) AS SINGLE => { 0.25, 0.55 , 0.25,.6}
    DIM SHARED MATERIAL1F(0 to 3) AS SINGLE => { 0.05, 0.20 , 0.30,.6}

    ' chessboard;
    DIM SHARED MATERIAL3(0 to 3) AS SINGLE => { 0.05,  0.05,  0.05,.2}
    DIM SHARED MATERIAL5(0 to 3) AS SINGLE => { 0.05,  0.05 , 0.05,.2}     
    ' top dark
    DIM SHARED MATERIAL4(0 to 3) AS SINGLE => { 0.5, 0.5, 0.5,.5}
    DIM SHARED MATERIAL2(0 to 3) AS SINGLE => { 0.5, 0.5, 0.5,.5}


    DIM SHARED MATERIALA(0 to 3) AS SINGLE => { 0.4, 0.4, 0.4,.7}
    DIM SHARED MATERIALB(0 to 3) AS SINGLE => { 0.2, 0.2, 0.2,.8}     
   
   
    DIM SHARED LIGHTPOS1(0 TO 3) AS SINGLE => { 150,-170,80,1 }
    DIM SHARED LIGHTPOS2(0 TO 3) AS SINGLE => { -150,70,80,1 }
   
    DIM SHARED LIGHTPOS(0 TO 3) AS SINGLE => { 0,70,90,1 }
    DIM SHARED SPECREF (0 TO 3) AS SINGLE => {0.9,0.9,0.9,.9}
    DIM SHARED SPECREF2(0 TO 3) AS SINGLE => {0.2,0.2,0.2,.9}
   
    DIM SHARED LOGI(0 to 3) AS SINGLE =>  {0.25, 0.30, 0.85,0.55}   :' logo
    DIM SHARED LOGIA(0 to 3) AS SINGLE => {0.25, 0.30, 0.85,0.55}   :' logo
    DIM SHARED LOGIB(0 to 3) AS SINGLE => {0.25, 0.30, 0.85,0.55}   :' logo
    DIM SHARED LOGIC(0 to 3) AS SINGLE => {0.25, 0.30, 0.85,0.55}   :' logo
   
   
    DIM SHARED AS INTEGER ROWS=40
    DIM SHARED AS INTEGER COLS=40
   
    DIM SHARED AS DOUBLE SQ_XP ( ROWS , COLS )
    DIM SHARED AS DOUBLE SQ_YP ( ROWS , COLS )

'-------------------------------------------------------------------------------

    DECLARE SUB PREP_GRID()
    DECLARE SUB DRAW_GRID()

'-------------------------------------------------------------------------------

    DIM SHARED AS INTEGER CUBES=100
   
    DIM SHARED AS DOUBLE  CBX(CUBES)
    DIM SHARED AS DOUBLE  CBY(CUBES)
    DIM SHARED AS DOUBLE  CBZ(CUBES)

    DIM SHARED AS DOUBLE  CRX(CUBES)
    DIM SHARED AS DOUBLE  CRY(CUBES)
    DIM SHARED AS DOUBLE  CRZ(CUBES)
   
    DIM SHARED AS DOUBLE  CRA(CUBES)
    DIM SHARED AS INTEGER CRM(CUBES)

    DECLARE SUB PREPCUBES()
    DECLARE SUB DRAWCUBES()

'-------------------------------------------------------------------------------
'   START OPENGL;
'-------------------------------------------------------------------------------
    DIM SHARED AS INTEGER CYL1
    DECLARE SUB InitOGL()   
   
    INITOGL()
    PREP_GRID()
    PREPCUBES()
   
    DIM SHARED AS INTEGER MT,MTS
    DIM SHARED AS DOUBLE MV=0
   
    DIM SHARED AS UINTEGER LOGOBUFFER22( 512 * 256 )
    DIM SHARED tex22 AS GLUINT
' DIM AS UINTEGER X,Y,PIXEL
   
    DRAWIMAGE(0,0)


glGenTextures 1, @tex22
glBindTexture(GL_TEXTURE_2D, tex22)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
gluBuild2DMipmaps (GL_TEXTURE_2D, 4, 512, 256,GL_RGBA, GL_UNSIGNED_BYTE, @LOGOBUFFER22(0)) 



'===============================================================================
' LOGO XOR TEXTURE GENERATION;
'===============================================================================
dim shared tsiz as integer
tsiz=128
    DIM SHARED AS UINTEGER LOGOBUFFER ( tsiz * tsiz )
    DIM SHARED tex1 AS GLUINT
DIM AS UINTEGER X,Y,PIXEL,ALPHA,START,clit
for y = 0 TO tsiz-1
for x = 0 TO tsiz
IF Y>=TSIZ/2 THEN
IF X> TSIZ/2 THEN LOGOBUFFER((y * tsiz)+X) = RGBA(150,150,150,255)           
IF X<=TSIZ/2 THEN LOGOBUFFER((y * tsiz)+X) = RGBA(255,255,255,255)                   
    ELSE
IF X<= TSIZ/2 THEN LOGOBUFFER((y * tsiz)+X) = RGBA(150,150,150,255)           
IF X>TSIZ/2 THEN LOGOBUFFER((y * tsiz)+X) = RGBA(255,255,255,255)                   
    END IF
        NEXT
    NEXT
glGenTextures 1, @tex1
glBindTexture(GL_TEXTURE_2D, tex1)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)

gluBuild2DMipmaps (GL_TEXTURE_2D, 1, tsiz, tsiz,GL_RGBA, GL_UNSIGNED_BYTE, @LOGOBUFFER(0)) 






dim shared tsiz3 as integer
tsiz3=128
    DIM SHARED AS UINTEGER LOGOBUFFER ( tsiz3 * tsiz3 )
    DIM SHARED tex3 AS GLUINT

for y = 0 TO tsiz3-1
for x = 0 TO tsiz3
IF Y>=TSIZ3/2 THEN
IF X< TSIZ3/2 THEN LOGOBUFFER((y * tsiz)+X) = RGBA(150,150,150,255)           
IF X>=TSIZ3/2 THEN LOGOBUFFER((y * tsiz)+X) = RGBA(255,255,255,255)                   
    ELSE
IF X>= TSIZ3/2 THEN LOGOBUFFER((y * tsiz)+X) = RGBA(150,150,150,255)           
IF X<TSIZ3/2 THEN LOGOBUFFER((y * tsiz)+X) = RGBA(255,255,255,255)                   
    END IF
        NEXT
    NEXT
glGenTextures 1, @tex3
glBindTexture(GL_TEXTURE_2D, tex3)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)

gluBuild2DMipmaps (GL_TEXTURE_2D, 3, tsiz3, tsiz3,GL_RGBA, GL_UNSIGNED_BYTE, @LOGOBUFFER(0)) 

'===============================================================================
' LOGO XOR TEXTURE GENERATION;
'===============================================================================
dim shared tsiz2 as integer
    tsiz2=64
    DIM SHARED AS UINTEGER LOGOBUFFER2 ( tsiz * tsiz )
    DIM SHARED tex2 AS GLUINT
    'dim shared as integer clit
' DIM AS UINTEGER X,Y,PIXEL,ALPHA,START
for y = 0 TO tsiz-1
for x = 0 TO tsiz
    PIXEL=INT(RND(1)*6)     
    clit =((x*3) xor (y*3))/11
    SELECT CASE PIXEL
   
    CASE 1
    LOGOBUFFER2((y * tsiz)+X) = RGBA(220,180+clit,180+clit,250)           
    CASE 2
    LOGOBUFFER2((y * tsiz)+X) = RGBA(220,190+clit,190+clit,250)           
    CASE 3
    LOGOBUFFER2((y * tsiz)+X) = RGBA(220,200+clit,200+clit,250)           
    CASE 4
    LOGOBUFFER2((y * tsiz)+X) = RGBA(220,210+clit,210+clit,250)           
    CASE ELSE
    LOGOBUFFER2((y * tsiz)+X) = RGBA(220,220+clit,220+clit,250)           
   
    END SELECT


        NEXT
    NEXT
glGenTextures 1, @tex2
glBindTexture(GL_TEXTURE_2D, tex2)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)

gluBuild2DMipmaps (GL_TEXTURE_2D, 1, tsiz2, tsiz2,GL_RGBA, GL_UNSIGNED_BYTE, @LOGOBUFFER2(0)) 




    DIM SHARED AS DOUBLE BVC


'-------------------------------------------------------------------------------
'   MAIN LOOP;
'-------------------------------------------------------------------------------

    DIM SHARED AS DOUBLE ADDD,MOVE,DV,OLD
    DV=.1
    dim ld as integer
   
WHILE((GetAsyncKeyState(VK_ESCAPE)<>-32767))
    IF BVC>0 THEN BVC=BVC-.001
    IF BVC<0 THEN BVC=0
    MV=MV-((dv*8))
    IF MV<0 THEN MV=MV+4
            OLD=TIMER           
            ADDD=ADDD+(dv/2)+.0001
            GLLOADIDENTITY
            GLCLEAR(GL_DEPTH_BUFFER_BIT + GL_COLOR_BUFFER_BIT )   
           
            DRAW_GRID()
            DRAWCUBES()
            COPPERFRONT()

            masked_logo(0)

            SWAPBUFFERS(hDC)                             

'            sleep 50
'            WHILE (TIMER-OLD)<.01
'            WEND


            DV=(TIMER-OLD)
           
WEND
ExitProcess(0)
END



SUB MASKED_LOGO(byval ro as double)
dim As double qo
   
    glenable(gl_alpha_test)
    glalphafunc(GL_LEQUAL,.5)
    GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@LOGI(0))
    glLoadIdentity() 
    glTranslatef(0, 0.75, -3.0)
    glRotatef(.3*sin(ADDD*2),  1.0, 0.0, 0.0)   
    glRotatef(13*sin(ADDD*3),  0.0, 1.0, 0.0)   
    glRotatef(.3*sin(ADDD*3), 0.0, 0.0, 1.0)     
    glscalef( 1+.05*sin(ADDD*3),1+.05*sin(ADDD*2),1)
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, TEX22)
    gldisable gl_depth_test
    glenable gl_blend
   
    GLBEGIN GL_QUADS
   
        GLMATERIALFV (GL_FRONT,GL_SPECULAR,@SPECREF2(0))
        GLMATERIALI (GL_FRONT,GL_SHININESS,26)   
   
      glNormal3f  0.0f, 0.0f, 1.0f
      GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@LOGI(0))
      glTexCoord2f 0.0, 0.0
      glVertex3f -(1.0+qo), -1.0f,  1.0f
      GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@LOGIA(0))
      glTexCoord2f 1.0, 0.0
      glVertex3f  (1.0+qo), -1.0f,  1.0f
      GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@LOGIB(0))
      glTexCoord2f 1.0, 1.0
      glVertex3f  (1.0+qo),  1.0f,  1.0f
      GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@LOGIC(0))
      glTexCoord2f 0.0, 1.0
      glVertex3f -(1.0+qo),  1.0f,  1.0f     
    GLEND
   
gldisable gl_blend
glenable gl_depth_test
glDISable(GL_TEXTURE_2D)
gldisable(gl_alpha_test)
'
'
'
END SUB


'-------------------------------------------------------------------------------
SUB PREPCUBES()
DIM X
dim as double addfactor,addpos,CCYNOT
CCYNOT=1
addfactor=40/cubes
addpos=0
FOR X=1 TO CUBES
    WHILE CBX(X)>-.4 AND CBX(X)<.4
    CBX(X)=(RND(1)*10)-5
    WEND
    CBY(X)=1+RND(13)
    CRA(X)=(RND(1)*50)
    CBZ(X)=addpos   
    CRX(X)=RND(1)*360   
    CRY(X)=RND(1)*360
    CRZ(X)=RND(1)*360
    CRM(X)=CCYNOT
    CCYNOT=CCYNOT+1
    IF CCYNOT>3 THEN CCYNOT=1
    addpos=addpos+addfactor
NEXT

END SUB

SUB DRAWCUBES()
DIM X

FOR X=1 TO CUBES       
    CBZ(X)=CBZ(X)+((dv*4))
    IF CBZ(X)>20 THEN CBZ(X)=CBZ(X)-40
NEXT



'
' BOTTOM
'
GLDISABLE GL_LIGHT0
GLDISABLE GL_DEPTH_TEST
GLENABLE GL_BLEND
FOR X=1 TO CUBES       
    GLLOADIDENTITY 
    DRAWCUBE2(CRX(X),CRY(X),CRZ(X),CBX(X),CBY(X),CBZ(X)-CBY(X),CRM(X))   
NEXT
GLDISABLE GL_BLEND
GLENABLE GL_DEPTH_TEST
GLENABLE GL_LIGHT0
'
' TOP
'
glenable gl_blend
'glpolygonmode(gl_back,gl_line)
glcullface(gl_front)
FOR X=1 TO CUBES       
    GLLOADIDENTITY 
    DRAWCUBE3(CRX(X),CRY(X),CRZ(X),CBX(X),CBY(X),CBZ(X),CRM(X))   
next
glcullface(gl_back)


'glcullface(gl_front)
FOR X=1 TO CUBES       
    GLLOADIDENTITY 
    DRAWCUBE(CRX(X),CRY(X),CRZ(X),CBX(X),CBY(X),CBZ(X),CRM(X))   
next
'glcullface(gl_back)

FOR X=1 TO CUBES       
    CRX(X)=CRX(X)+((dv*62))
    CRY(X)=CRY(X)+((dv*173))
    CRZ(X)=CRZ(X)+((dv*284))
NEXT
gldisable gl_blend


FOR X=1 TO CUBES       
   
'        CBY(X)=CBY(X)-CRA(X)       
        CRA(X)=CRA(X)+(DV*6)
'       
'        'IF CRA(X)>.035 THEN CRA(X)=.035
'        IF CBY(X)<=-.5 THEN
'            CBY(X)=-.5           
'            CRA(X)=-(cra(x))
'            IF CRA(X)<-.025 THEN CRA(X)=-.025
'            BVC=.5
'        END IF
CBY(X)=1.2*SIN(CRA(X))
IF CBY(X)<0 THEN CBY(X)=-CBY(X)
CBY(X)=CBY(X)-.5
NEXT

END SUB


SUB COPPERFRONT()
    GLENABLE GL_BLEND
    GLLOADIDENTITY
    glTranslatef(0, 0, -.1)     
   
   
    GLBEGIN GL_QUADS
    GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIALA(0))
    GLVERTEX3F -3,-.13,0
    GLVERTEX3F  3,-.13,0
    GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIALB(0))
    GLVERTEX3F  3, .13,0
    GLVERTEX3F -3, .13,0
    GLEND
   
    GLDISABLE GL_BLEND
END SUB

SUB DRAW_GRID()
    DIM AS INTEGER X,Y
    GLLOADIDENTITY 
    glTranslatef(0, -.75, -10)     
    glRotatef(275,  1.0, 0.0, 0.0)   
    glRotatef(6*sin(ADDD*3),  0.0, 1.0, 0.0)   
    glRotatef(0,  0.0, 0.0, 1.0)   
    MTS=1
    MT=MTS
        MT=MTS
        MTS=MTS+1
        IF MTS>2 THEN MT=1
    FOR Y=1 TO ROWS-1
       

       
        FOR X=1 TO COLS-1

            MT=MT+1
            IF MT>2 THEN MT=1
                glEnable(GL_TEXTURE_2D)
                glBindTexture(GL_TEXTURE_2D, TEX2)               
    GLMATERIALFV (GL_FRONT,GL_SPECULAR,@SPECREF2(0))
    GLMATERIALI (GL_FRONT,GL_SHININESS,26)         
            GLBEGIN GL_QUADS
                IF MT=2 THEN GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL2(0))           
                IF MT=1 THEN GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL3(0))   
               
               
                GLNORMAL3F SQ_XP(X,Y),SQ_YP(X,Y)+MV,1               
               
                'IF MT=1 THEN

                glTexCoord2f 0.0, 0.0
                GLVERTEX3F SQ_XP(X,Y),SQ_YP(X,Y)+MV,0               
                glTexCoord2f 1.0, 0.0
                GLVERTEX3F SQ_XP(X+1,Y),SQ_YP(X+1,Y)+MV,0
                glTexCoord2f 1.0, 1.0
                GLVERTEX3F SQ_XP(X+1,Y+1),SQ_YP(X+1,Y+1)+MV,0
                glTexCoord2f 0.0, 1.0
                GLVERTEX3F SQ_XP(X,Y+1),SQ_YP(X,Y+1)+MV,0
               
                'END IF

               
                'IF MT=2 THEN
                   
                'GLVERTEX3F SQ_XP(X,Y),SQ_YP(X,Y)+MV,0               
                'GLVERTEX3F SQ_XP(X+1,Y),SQ_YP(X+1,Y)+MV,0
                'GLVERTEX3F SQ_XP(X+1,Y+1),SQ_YP(X+1,Y+1)+MV,0
                'GLVERTEX3F SQ_XP(X,Y+1),SQ_YP(X,Y+1)+MV,0
                'END IF

                IF MT=2 THEN GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL4(0))           
                IF MT=1 THEN GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL5(0))   
                GLNORMAL3F SQ_XP(X,Y),SQ_YP(X,Y)+MV,1
                'GLVERTEX3F SQ_XP(X+1,Y+1),SQ_YP(X+1,Y+1)+MV,0
                'GLNORMAL3F SQ_XP(X,Y),SQ_YP(X,Y)+MV,1
                'GLVERTEX3F SQ_XP(X,Y+1),SQ_YP(X,Y+1)+MV,0
            GLEND
            glDISable(GL_TEXTURE_2D)
        NEXT
    NEXT

END SUB




SUB PREP_GRID()
DIM AS INTEGER X,Y
DIM AS DOUBLE XST,YST,XADD,YADD,XACT,YACT

    XST=-20.
    YST=-20.
    XADD=40/ROWS
    YADD=40/COLS
   

    YACT=YST
   
FOR Y=1 TO ROWS
   
    XACT=XST
   
    FOR X=1 TO COLS
        XACT=XACT+XADD
       
        SQ_XP(X,Y)=XACT
        SQ_YP(X,Y)=YACT
       
    NEXT
   
    YACT=YACT+YADD
   
NEXT

END SUB




SUB DRAWCUBE(BYVAL XRR AS DOUBLE , BYVAL YRR AS DOUBLE, BYVAL ZRR AS DOUBLE, BYVAL XP AS DOUBLE, BYVAL YP AS DOUBLE , BYVAL ZP AS DOUBLE , BYVAL MAT AS INTEGER )
DIM SCALE AS DOUBLE
    SCALE=.25   
'    GLLOADIDENTITY
'    glTranslatef(-XP, -YP, -ZP)     

    glTranslatef(XP, YP, ZP)     
    glRotatef(XRR,  1.0, 0.0, 0.0)   
    glRotatef(YRR,  0.0, 1.0, 0.0)   
    glRotatef(ZRR,  0.0, 0.0, 1.0)   
   
    glRotatef(275,  1.0, 0.0, 0.0)   
    glRotatef(6*sin(ADDD*3),  0.0, 1.0, 0.0)   
    glRotatef(0,  0.0, 0.0, 1.0)       
    GLMATERIALFV (GL_FRONT,GL_SPECULAR,@SPECREF(0))
    GLMATERIALI (GL_FRONT,GL_SHININESS,128)
IF MAT=1 THEN    GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL1A(0))
IF MAT=2 THEN    GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL1B(0))
IF MAT=3 THEN    GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL1C(0))
glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, TEX3)
    GLBEGIN GL_QUADS
       


        GLNORMAL3F 0,0,1
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,-1*SCALE,1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F 1*SCALE,-1*SCALE,1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F 1*SCALE,1*SCALE,1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F -1*SCALE,1*SCALE,1*SCALE
       
        GLNORMAL3F 0,0,-1
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F 1*SCALE,1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F 1*SCALE,-1*SCALE,-1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F -1*SCALE,-1*SCALE,-1*SCALE
       
'        GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL2(0))
        GLNORMAL3F 1,0,0
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F 1*SCALE,-1*SCALE,1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F 1*SCALE,-1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F 1*SCALE,1*SCALE,-1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F 1*SCALE,1*SCALE,1*SCALE
       
        GLNORMAL3F -1,0,0
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,1*SCALE,1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F -1*SCALE,1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F -1*SCALE,-1*SCALE,-1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F -1*SCALE,-1*SCALE,1*SCALE

'        GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL3(0))
        GLNORMAL3F 0,1,0
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,1*SCALE,1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F 1*SCALE,1*SCALE,1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F 1*SCALE,1*SCALE,-1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F -1*SCALE,1*SCALE,-1*SCALE

        GLNORMAL3F 0,-1,0
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,-1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F  1*SCALE,-1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F  1*SCALE,-1*SCALE,1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F -1*SCALE,-1*SCALE,1*SCALE
       
    GLEND
    glDISable(GL_TEXTURE_2D)
END SUB








SUB DRAWCUBE2(BYVAL XRR AS DOUBLE , BYVAL YRR AS DOUBLE, BYVAL ZRR AS DOUBLE, BYVAL XP AS DOUBLE, BYVAL YP AS DOUBLE , BYVAL ZP AS DOUBLE , BYVAL MAT AS INTEGER )
DIM SCALE AS DOUBLE
    SCALE=.3-(YP/10)
'    GLLOADIDENTITY
'    glTranslatef(-XP, -YP, -ZP)     
    YP=.7
   
    glTranslatef(XP, -YP, ZP)     
    GLSCALEF 1, 0,1
   
    glRotatef(XRR,  1.0, 0.0, 0.0)   
    glRotatef(YRR,  0.0, 1.0, 0.0)   
 
    glRotatef(ZRR,  0.0, 0.0, 1.0)   
       
   
   
    glRotatef(275,  1.0, 0.0, 0.0)   
    glRotatef(6*sin(ADDD*3),  0.0, 1.0, 0.0)   
    glRotatef(0,  0.0, 0.0, 1.0)       
   
GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIALT(0))

    GLBEGIN GL_QUADS
       


        GLNORMAL3F 0,0,1
        GLVERTEX3F -1*SCALE,-1*SCALE,1*SCALE
        GLVERTEX3F 1*SCALE,-1*SCALE,1*SCALE
        GLVERTEX3F 1*SCALE,1*SCALE,1*SCALE
        GLVERTEX3F -1*SCALE,1*SCALE,1*SCALE
       
        GLNORMAL3F 0,0,-1
        GLVERTEX3F -1*SCALE,1*SCALE,-1*SCALE
        GLVERTEX3F 1*SCALE,1*SCALE,-1*SCALE
        GLVERTEX3F 1*SCALE,-1*SCALE,-1*SCALE
        GLVERTEX3F -1*SCALE,-1*SCALE,-1*SCALE
       
'        GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL2(0))
        GLNORMAL3F 1,0,0
        GLVERTEX3F 1*SCALE,-1*SCALE,1*SCALE
        GLVERTEX3F 1*SCALE,-1*SCALE,-1*SCALE
        GLVERTEX3F 1*SCALE,1*SCALE,-1*SCALE
        GLVERTEX3F 1*SCALE,1*SCALE,1*SCALE
       
        GLNORMAL3F -1,0,0
        GLVERTEX3F -1*SCALE,1*SCALE,1*SCALE
        GLVERTEX3F -1*SCALE,1*SCALE,-1*SCALE
        GLVERTEX3F -1*SCALE,-1*SCALE,-1*SCALE
        GLVERTEX3F -1*SCALE,-1*SCALE,1*SCALE

'        GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL3(0))
        GLNORMAL3F 0,1,0
        GLVERTEX3F -1*SCALE,1*SCALE,1*SCALE
        GLVERTEX3F 1*SCALE,1*SCALE,1*SCALE
        GLVERTEX3F 1*SCALE,1*SCALE,-1*SCALE
        GLVERTEX3F -1*SCALE,1*SCALE,-1*SCALE

        GLNORMAL3F 0,-1,0
        GLVERTEX3F -1*SCALE,-1*SCALE,-1*SCALE
        GLVERTEX3F  1*SCALE,-1*SCALE,-1*SCALE
        GLVERTEX3F  1*SCALE,-1*SCALE,1*SCALE
        GLVERTEX3F -1*SCALE,-1*SCALE,1*SCALE
       
    GLEND

END SUB








SUB DRAWCUBE3(BYVAL XRR AS DOUBLE , BYVAL YRR AS DOUBLE, BYVAL ZRR AS DOUBLE, BYVAL XP AS DOUBLE, BYVAL YP AS DOUBLE , BYVAL ZP AS DOUBLE , BYVAL MAT AS INTEGER )
DIM SCALE AS DOUBLE
    SCALE=.25   
'    GLLOADIDENTITY
'    glTranslatef(-XP, -YP, -ZP)     

    glTranslatef(XP, YP, ZP)     
    glRotatef(XRR,  1.0, 0.0, 0.0)   
    glRotatef(YRR,  0.0, 1.0, 0.0)   
    glRotatef(ZRR,  0.0, 0.0, 1.0)   
   
    glRotatef(275,  1.0, 0.0, 0.0)   
    glRotatef(6*sin(ADDD*3),  0.0, 1.0, 0.0)   
    glRotatef(0,  0.0, 0.0, 1.0)       
    GLMATERIALFV (GL_FRONT,GL_SPECULAR,@SPECREF(0))
    GLMATERIALI (GL_FRONT,GL_SHININESS,128)
IF MAT=1 THEN    GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL1D(0))
IF MAT=2 THEN    GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL1E(0))
IF MAT=3 THEN    GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL1F(0))

glEnable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, TEX1)

    GLBEGIN GL_QUADS
       
       
        GLNORMAL3F 0,0,-1
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,-1*SCALE,1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F 1*SCALE,-1*SCALE,1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F 1*SCALE,1*SCALE,1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F -1*SCALE,1*SCALE,1*SCALE
               
        GLNORMAL3F 0,0,1       
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,1*SCALE,-1*SCALE       
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F 1*SCALE,1*SCALE,-1*SCALE       
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F 1*SCALE,-1*SCALE,-1*SCALE       
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F -1*SCALE,-1*SCALE,-1*SCALE
       
       
        GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL2(0))
        GLNORMAL3F -1,0,0
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F 1*SCALE,-1*SCALE,1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F 1*SCALE,-1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F 1*SCALE,1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F 1*SCALE,1*SCALE,1*SCALE
       
       
        GLNORMAL3F 1,0,0
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,1*SCALE,1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F -1*SCALE,1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F -1*SCALE,-1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F -1*SCALE,-1*SCALE,1*SCALE

'        GLMATERIALFV (GL_FRONT,GL_AMBIENT_AND_DIFFUSE,@MATERIAL3(0))
        GLNORMAL3F 0,-1,0
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,1*SCALE,1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F 1*SCALE,1*SCALE,1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F 1*SCALE,1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F -1*SCALE,1*SCALE,-1*SCALE

        GLNORMAL3F 0,1,0
        glTexCoord2f 0.0, 0.0
        GLVERTEX3F -1*SCALE,-1*SCALE,-1*SCALE
        glTexCoord2f 0.0, 1.0
        GLVERTEX3F  1*SCALE,-1*SCALE,-1*SCALE
        glTexCoord2f 1.0, 1.0
        GLVERTEX3F  1*SCALE,-1*SCALE,1*SCALE
        glTexCoord2f 1.0, 0.0
        GLVERTEX3F -1*SCALE,-1*SCALE,1*SCALE
       
    GLEND
gldisable(GL_TEXTURE_2D)

END SUB



'-------------------------------------------------------------------------------
'   SMALL OPENGL FRAMEWORK, BY DBFINTERACTIVE.COM MEMBERS INCLUDING;
'   JIM, AULD, RBRAZ, SHOCKWAVE AMONGST OTHERS.
'-------------------------------------------------------------------------------

SUB InitOGL()
    dim xxx as integer
    dim yyy as integer

'-------------------------------------------------------------------------------   

    IF W_FULLSCREEN=1 THEN
       
                    'XXX=0
                    'YYY=(-(W_YH))+(W_YH/2)
    ELSE
       
'-------------------------------------------------------------------------------

    XXX=GetSystemMetrics(SM_CXSCREEN)
    yyy=GetSystemMetrics(SM_CYSCREEN)       
    xxx=(xxx-W_XW)/2
    yyy=(yyy-W_YH)/2

    end if
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR)
    pfd.nVersion = 1
    pfd.dwFlags = PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER
    pfd.dwLayerMask = PFD_MAIN_PLANE
    pfd.iPixelType = PFD_TYPE_RGBA
    pfd.cColorBits = 32
    pfd.cDepthBits = 32
   
   
   
    IF W_FULLSCREEN=1 THEN hDC = GetDC(CreateWindow( "Edit", "FGHF",WS_POPUP+WS_VISIBLE+WS_MAXIMIZE, 0 , 0 , 0 , 0, 0, 0, 0, 0))
    IF W_FULLSCREEN<>1 THEN hDC = GetDC(CreateWindow("Edit", "FGHF",WS_POPUP+WS_VISIBLE,xxx, yyy, W_XW , W_YH, 0, 0, 0, 0))   
SetPixelFormat ( hDC, ChoosePixelFormat ( hDC, @pfd) , @pfd )
wglMakeCurrent ( hDC, wglCreateContext(hDC) )
    ShowCursor(FALSE)
   
    IF W_FULLSCREEN=1 THEN
    ChangeScreenResolution(W_XW,W_YH,32)
    GLVIEWPORT 0, 0, w_xw, w_yh                         '' Reset The Current Viewport
    ELSE
    GLVIEWPORT 0, 0, w_xw, w_yh                         '' Reset The Current Viewport
    END IF



    GLLOADIDENTITY
    GLMATRIXMODE GL_PROJECTION                          '' Select The Projection Matrix
GLLOADIDENTITY
   
    GLUPERSPECTIVE 75.0, W_XW / W_YH, .01, 120.0       '' Calculate The Aspect Ratio Of The Window   
GLMATRIXMODE GL_MODELVIEW                           '' Select The Modelview Matrix
GLLOADIDENTITY                                      '' Reset The Modelview Matrix
GLSHADEMODEL GL_smooth                              '' Enable Smooth Shading
GLCLEARCOLOR .00, .00, .00,0
GLCLEARDEPTH 1.0                                    '' Depth Buffer Setup
GLENABLE GL_DEPTH_TEST                              '' Enables Depth Testing
GLDEPTHFUNC GL_LEQUAL                               '' The Type Of Depth Testing To Do
GLHINT GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST    '' Really Nice Perspective Calculations
    GLBLENDFUNC(GL_ONE_MINUS_SRC_ALPHA,GL_SRC_ALPHA)


    GLDISABLE GL_BLEND
    GLENABLE GL_CULL_FACE   
   
GLLOADIDENTITY                                     

    glLightfv( GL_LIGHT0, GL_AMBIENT, @LightAmbient(0))
    GLLIGHTFV (GL_LIGHT0, GL_POSITION, @LIGHTPOS(0))
    glLightfv( GL_LIGHT1, GL_AMBIENT, @LightAmbient2(0))
    GLLIGHTFV (GL_LIGHT1, GL_POSITION, @LIGHTPOS1(0))
    glLightfv( GL_LIGHT2, GL_AMBIENT, @LightAmbient2(0))
    GLLIGHTFV (GL_LIGHT2, GL_POSITION, @LIGHTPOS2(0))


    GLENABLE(GL_LIGHTING)   
    glEnable(GL_LIGHT0)
    glEnable(GL_LIGHT1)
    glEnable(GL_LIGHT2)
   
'    GLLINEWIDTH 24.0
GLENABLE GL_SMOOTH
    GLENABLE GL_NORMALIZE
    GLENABLE GL_CULL_FACE
   

    GLENABLE GL_FOG
    GLHINT (GL_FOG_HINT,GL_NICEST)
    GLFOGF (GL_FOG_START,1.0)
    GLFOGF (GL_FOG_END, 18.0)
    GLFOGF (GL_FOG_DENSITY, 0.01)
    GLFOGI (GL_FOG_MODE,GL_LINEAR)                       
end sub



Sub LoadDataImage()
    dim i as integer
    'Loads Color palette
    for i = 0 to 255
         img_r( i ) = comp2.bmp.pal (i*3) 'Red color
         img_g( i ) = comp2.bmp.pal (i*3+1)'Green color
         img_b( i ) = comp2.bmp.pal (i*3+2)'Blue color
         
         if img_r( i) >255 then img_r( i) =255
         if img_g( i) >255 then img_g( i) =255
         if img_b( i) >255 then img_b( i) =255
         'img_r( i ) =(img_b(i) Shl 16) Or (img_g(i) Shl 8 )  Or img_r(i)

        if img_r(i)<>0 or img_g(i)<>0 or img_b(i)<>0 then
        img_r(i)=rgba(img_b( i ),img_g( i ),img_r( i ),90)
        else
        img_r(i)=rgba(img_b( i ),img_g( i ),img_r( i ),250)
        end if
    Next       
    for i = 1 to (imgx*imgy) - 1
         img_buffer(i) = comp2.bmp.raw (i)
    next 
       
End Sub


Sub DrawImage(byval xpos as integer,byval ypos as integer)
    dim as uinteger x,y,pixel,mong,y2
    DIM AS UINTEGER PTR PP,PP2
    y2=255
    for Y = 0 to imgy-1
        PP=@logoBUFFER22(Y*IMGX)
        pp2 = @img_buffer((Y2*IMGX))
        for X = 0 to imgx-1
            mong = (img_r(*pp2) )
                *PP = MONG
            PP  +=1
            pp2 +=1
        next
        YPOS=YPOS+1
        Y2=Y2-1
    next
   
End Sub



sub ChangeScreenResolution (byval wwidth as integer, byval hheight as integer, byval bitsPerPixel as integer)
dim dmScreenSettings as DEVMODE
ZeroMemory(@dmScreenSettings, sizeof (DEVMODE))
dmScreenSettings.dmSize = sizeof(DEVMODE)
dmScreenSettings.dmPelsWidth = wwidth
dmScreenSettings.dmPelsHeight = hheight
dmScreenSettings.dmBitsPerPel = bitsPerPixel
dmScreenSettings.dmFields = DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT

    if (ChangeDisplaySettings (cast(LPDEVMODE,@dmScreenSettings), CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL) then
end -1
end if
   
end sub

Thanks,

Cock Shave.
Title: Re: Really need to fix this..
Post by: benny! on October 04, 2008
Still crashes sometimes when clicking dozen time with the
mouse ?

Not quite sure - but how is the window messaging handled
atm ? Concerning WinAPI I guess there should be something
like this in the code <not 100% sure though> ?

Code: [Select]
    MSG wmsg;
    while( GetMessage(&wmsg, NULL, 0, 0) )
    {
        TranslateMessage(&wmsg);
        DispatchMessage(&wmsg);
    }

Otherwise the normal exiting and switching to fullscreen runs
way better now!
Title: Re: Really need to fix this..
Post by: Hezad on October 04, 2008
Hey :) I can't help about windows API sry, but i'd like to see this in action ! Could someone compile it ? (I don't have comp2pal.bas nor comp2raw.bas")
Title: Re: Really need to fix this..
Post by: Rbz on October 04, 2008
Quote
The screen resolution changes niecely now but the viewport is messed up with the screen having a black border, I have tried several ways to fix this, I'll keep trying but in the meantime here it is;
I forgot to mention that you need to modify your createwindow code to switch fullscreen:
Code: [Select]
    IF W_FULLSCREEN=1 THEN     
        hDC = GetDC(CreateWindow( "Edit", "FGHF",WS_POPUP+WS_VISIBLE, 0 , 0 , W_XW , W_YH, 0, 0, 0, 0))
        ChangeScreenResolution(W_XW,W_YH,32)
    end if
    IF W_FULLSCREEN<>1 THEN hDC = GetDC(CreateWindow("Edit", "FGHF",WS_POPUP+WS_VISIBLE,xxx, yyy, W_XW , W_YH, 0, 0, 0, 0))   
SetPixelFormat ( hDC, ChoosePixelFormat ( hDC, @pfd) , @pfd )
wglMakeCurrent ( hDC, wglCreateContext(hDC) )
    ShowCursor(FALSE)

@Hezad: attached one example here for you..
Title: Re: Really need to fix this..
Post by: Shockwave on October 04, 2008
Works really well :)

How do I send a beer to Brazil?
Title: Re: Really need to fix this..
Post by: Hezad on October 04, 2008
rbz > thanks :)

shockwave > wow very cool stuff :D
Title: Re: Really need to fix this..
Post by: DrewPee on October 04, 2008
That looks amazing to be honest - the checkerboard just looks stunning! Along with bouncing cubes - wicked!

Nice colours too!

Wicked framework Shockwave! and nice work RBZ and Jim!

Andy
Title: Re: Really need to fix this..
Post by: Shockwave on October 04, 2008
Kind comments :)

Title: Re: Really need to fix this..
Post by: Jim on October 04, 2008
->shockwave - i dunno if you've done this already, but you should replace "Edit" in CreateWindow with the class you made by calling RegisterClass.

>benny - yup, you do normally have code like that to pump the message queue, else it can fill up and crash like you see when you click the mouse.
If you can, Shockwave, you should make your code like this
Code: [Select]
    dim msg as MSG
    repeat

if PeekMessage(@msg, NULL, 0, 0, PM_REMOVE) then

TranslateMessage(@msg)
DispatchMessage(@msg)
end if

   drawframe()

until msg.message == WM_QUIT

Jim
Title: Re: Really need to fix this..
Post by: benny! on October 05, 2008
@Jim:
Thanks for clearing this and  providing FB version.

@Shocky:
Maybe you can add it - so I can test it again ?
Title: Re: Really need to fix this..
Post by: Shockwave on October 05, 2008
Adding Jims code unfortunately meant that it was not possible to kill the process unless I used the task manager. Anyway the source is there if you want to play with it Benny, feel free :) I don't mind.

I am really happy that the death on exit in vista and resolution problems were resolved tbh. And the framework is still nice and small too!
Title: Re: Really need to fix this..
Post by: Jim on October 06, 2008
I converted it from C on the hoof and probably made a mistake!  Sorry!
It's worth fixing it.  If you go one more step to handling your own messages that practically makes you a win32 coder ;)

Jim

Title: Re: Really need to fix this..
Post by: Shockwave on October 06, 2008
Hehehe Me a coder? Never :)

I'm going to be using a different framework for my future stuff for sure Jim.
This one has been very good, it gave a stable(ish) launchpad and allowed me to learn a little bit of Opengl but you are right, it's time I became more compatible.
Title: Re: Really need to fix this..
Post by: Hotshot on October 06, 2008
very nice...the checkboard is smooth and nice screeny

welldone :cheers: