Oxygen Basic
Programming => Problems & Solutions => Topic started by: Frankolinox on March 16, 2013, 01:57:17 AM
-
I wanted to convert openGL "nehe lesson 7" for oxygen. as I could see nobody has done before any chapter for oxygen.
but I used as basis an example from powerbasic with gdiplus include file before and see that's a big problem to convert for example
a) "gdiplusloadtexture" (it's a function for converting present) for oxygenbasic.
it's not a problem to load an image (png, bmb, jpg) with "imgwin.inc" here.
b) or here's another way to bind a simple 256x256 texture in openGL modus on a cube (for example)? perhaps there's an example here at board or at sample folders?
forgotten to say that I didn't want to use "freeglut" include files! ;) I wanted more to use the "cGLWindow3.inc" from my last pyramid example :)
any tipp is welcome about a) gdiplusloadtexture or b) binding openGL textures for primitives for me, thanks!
best regards, frank
-
Hi Frank,
I think FreeImage lib is your destiny here , i used it many times , supporting many image file format.
-
thanks for feedback, but that's not correct way for my purpose with openGL and load image files in this case. I already know freeImage since some years :-)
#case capital
includepath "..\..\inc\"
'$ FileName "t.exe"
'include "RTL32.inc"
title="Rotating Textured Quad"
include "OpenglSceneFrame.inc"
sys texn[16]
Sub MakeTexture(sys pPixelArray, xSize, ySize, Texnum )
'======================================================
'
glBindTexture GL_TEXTURE_2D, texNum
'
'GL_NEAREST
'GL_LINEAR
'
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR
'
'GL_NEAREST
'GL_LINEAR
'GL_NEAREST_MIPMAP_NEAREST 0x2700
'GL_LINEAR_MIPMAP_NEAREST 0x2701
'GL_NEAREST_MIPMAP_LINEAR 0x2702
'GL_LINEAR_MIPMAP_LINEAR 0x2703
'
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR
glTexImage2D GL_TEXTURE_2D, 0, 4, xSize, ySize, 0, GL_RGBA, GL_UNSIGNED_BYTE, pPixelArray
'
End Sub
sub MakePatternA(sys n)
'======================
'
static long pixels[4096], tx=64, ty=64, x, y, p, c
'
for y=1 to 64
for x=1 to 64
if x<33 and y<33
c=0xff00ff00 'GREEN BOTTOM LEFT
elseif x>32 and y>32
c=0xffff0000 'BLUE TOP RIGHT
else
c=0xff0000ff 'RED
end if
p=y*64-64+x
pixels[p]=c
next
next
'
'GL_NEAREST
'GL_LINEAR
glBindTexture GL_TEXTURE_2D, texn[n]
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR
'
'GL_NEAREST
'GL_LINEAR
'GL_NEAREST_MIPMAP_NEAREST 0x2700
'GL_LINEAR_MIPMAP_NEAREST 0x2701
'GL_NEAREST_MIPMAP_LINEAR 0x2702
'GL_LINEAR_MIPMAP_LINEAR 0x2703
'
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR
glTexImage2D GL_TEXTURE_2D, 0, 4, tx, ty, 0, GL_RGBA, GL_UNSIGNED_BYTE, @Pixels
'
end sub
'
'
sub Initialize(sys hWnd)
'=======================
glGenTextures 2, texn
MakePatternA 1
SetTimer hWnd,1,10,NULL
end sub 'initialize
sub Release(sys hWnd)
'====================
killTimer hwnd, 1
glDeleteTextures 1, texn
'
end sub
sub Scene(sys hWnd)
'==================
'
static single ang1, angi1=1
static single sx,sy,sz
'
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
glClearColor 0.5, 0, 0, 0
glLoadIdentity
'
'ACTIVATE TEXTURE
'----------------
'
glEnable GL_TEXTURE_2D
glBindTexture GL_TEXTURE_2D,texn[1]
'
sx=0.2 : sy=0.16 : sz=-1
'
'
'MOVEMENT
'--------
'
'glrotatef ang1, 0,0,1
single x=cos(rad(ang1))*.1
single y=sin(rad(ang1))*.1
single z=0
gltranslatef x,y,z
'
'DRAW SHAPE
'----------
'
'this quad is drawn clockwise
'
glbegin GL_QUADS
'
glTexCoord2f 0,0 : glvertex3f -sx, -sy, sZ 'BOTTOM LEFT
glTexCoord2f 0,1 : glvertex3f -sx, sy, sZ 'TOP LEFT
glTexCoord2f 1,1 : glvertex3f sx, sy, sZ 'TOP RIGHT
glTexCoord2f 1,0 : glvertex3f sx, -sy, sZ 'BOTTOM RIGHT
'
glend
'
glDisable GL_TEXTURE_2D
'
'
'UPDATE ROTATION ANGLES
'----------------------
'
ang1+=angi1 : if ang1>=360 then ang1-=360
'
'
end sub
if anybody knows a way how to implement "gdiploadtexture" with 256x256 format I am glad to see that. I checked gdip.inc files and other ones, but the function from powerbasic (gdipflat.inc, gdiputils.inc, gdipinit.inc) is no compatible with oxygen (at the moment) ;)
best regards, frank
-
hello, I am needing help again how to convert this commands
a) "IIF" and (not found)
b) "Tally" to oxygen :) may be tally was mentioned before at another place at this board (ok, I've found it! :) )
c) "swap" (not found)
IF IIF&(TALLY(BIN$(TextureWidth), "1") = 1, 1, 0) = %FALSE THEN hStatus = %ERROR_INVALID_DATA
thanks in advance, frank
-
Hi Frank,
The meaning of this line is not clear but you can expand iif to an if..then.. else..endif construct
It actually simplifies to:
if TALLY(BIN$(TextureWidth), "1") <> 1
hStatus = %ERROR_INVALID_DATA
end if
We don't have tally or bin
swap is something I should implement for all types, as it is often useful
Here it is in macro form
macro swap(a,b)
scope
typeof a v=a
a=b : b=v
end scope
end macro
float f=1.5,g=2.5
swap(f,g)
print f
-
Frank , i was and still member of BCX Basic to c Translatore , which has many features ported from PowerBasic
So.
IF IIF&(TALLY(BIN$(TextureWidth), "1") = 1, 1, 0) = %FALSE THEN hStatus = %ERROR_INVALID_DATA
Means that
IIF function is the same as C expression a= (k>t) : 1 ? 2 ,that means a will be 1 if k>t is true and a will be 2
if not k > t.
in your post IIF will return 1 (second param) if this term &(TALLY(BIN$(TextureWidth), "1") = 1 is true and
return 0 (last param) if the term is not true.
hope that help you. :)
-
thank you charles for swap example, it works here fine :)
thanks emil for you advice too.
my little progress about loadTexture (gdiplus) looks like this, but it's not perfect.
function loadtexture(wstring wszFileName,sys TextureWidth, sys TextureHeight, string strTextureData) as sys
sys bInitGdiPlus,hStatus,hr, token,pImage,pThumb,pTextureData,x,y,i
string s
macro swap(a,b)
scope
typeof a v=a
a=b : b=v
end scope
end macro
'pTextureData+=1
GdiplusStartupInput StartupInput ' // Structure to initialize GDI+
GDIP_BGRA_UNION pixColor ' // Union uses to swap colors
'pTextureData AS SYS 'PTR ' // Pointer to the texture data
sys hr,hdlg,token
GdiplusStartupInput StartupInput
StartupInput.GdiplusVersion = 1
hStatus=GdiplusStartup token, StartupInput, byval 0
'
if hStatus then
print "Error initializing GDIplus: " hex hStatus
exit function
end if
hStatus = GdipLoadImageFromFile(wszFileName, pImage)
print wszFilename
hStatus = GdipGetImageWidth(pImage, TextureWidth)
hStatus = GdipGetImageHeight(pImage, TextureHeight)
hStatus = GdipGetImageThumbnail(pImage, TextureWidth, TextureHeight, pThumb, 0, 0)
hStatus = GdipImageRotateFlip(pThumb, 6) ' 6 = %RotateNoneFlipY
'NUL$(TextureWidth * TextureHeight * 4)
strTextureData = str(TextureWidth * TextureHeight * 4)
'strTextureData = NULS(TextureWidth * TextureHeight * 4)
'strTextureData = NUL$(TextureWidth * TextureHeight * 4)
'pTextureData = STRPTR(strTextureData)
pTextureData = @strTextureData
for y=0 to TextureWidth - 1
for x=0 to TextureHeight - 1
GdipBitmapGetPixel(pThumb, x, y, pixColor.color)
swap(pixColor.red, pixColor.blue)
@pTextureData = pixColor.color
'INCR pTextureData
pTextureData+=1
next
next
GdipDisposeImage(pImage)
GdipDisposeImage(pThumb)
print "ok: " wszFilename
return hStatus
GdiplusShutdown token
end function
how to set
a)
pTextureData AS SYS PTR ' ?
as a pointer ?
b) how to convert NUL$
strTextureData = NUL$(TextureWidth * TextureHeight * 4)
?
I converted this one with "str", "NULS" doesn't exists for oxygen?
c) if I really need tally (I meant the function charles, that I've found about another topic at board, the command doesn't exists you are right!) that's not perhaps important.
I will check if I can load another gdiplus example (with "thumbnails") and load (replace) it with my "loadTexture" and if there's an image for showing I will implement this new function for an openGL example. I noticed that's not often smart to convert all stuff from powerbasic (for example) to oxygenbasic ;)
nice evening, frank
-
pTextureData AS SYS PTR ' ?
You will find the answer in FreeBasic forum.
A macro inside a function is new to me!
I think it is nothing as a SUb declaration and must be at the beginning.
-
one way I've found with openGL + gdiplus :), but without using the damned "loadtexture" (gdiplus) function. My supposition was that's sufficient to load an image file only with
GdipLoadImageFromFile(wszFileName, pImage)
and that's the right way, I am sure.
anybody can check my "image-openGL" cube demo below if that's running on your machine, would be good to get feedback.
thanks peter for your info, I will check this evening.
best regards, frank
X
-
Hi Frank,
It's running here! But the frontage is at the wrong place!
The cube looks as if it floats in water. Is a bit slowly here.
-
Frank,
if you move the mouse back and forth, the cube rotates faster!
the colour isn't correct. I think you must take BGRA_EXT.
-
a) many thanks peter for testing :-) one cube texture face isn't correct, I will see to fix it although it's translated correct from powerbasic. I am working with an old pc machine so I didn't know the reaction times or smothness ;) I will check for optimation the openGL code.
b) I am going over the wall and hurdles. use it at own risc.
code snippet "loadtexture" (function for gdiplus). as I have tested for standard winapi (sdk) plus "ImgWin.inc" I haven't still tested for openGL and there's only missing a little function for making the texture (bind texture) for openGL window frame. but this code snippet should work.
'deleted code because of update :-)
the code above is a mixing of jose roca's "gdiploadtexture" function (gdiputils.inc) and my own exploring search engine with little knowledge on oxygen :)
best regards, frank
-
I've got it! :)
here's the correct working example for "loadingTexture" (gdiplus) for images and openGL examples.
'' oxygen
'' function for loading texture for gdiplus and openGL by frankolinox
'' issue two and correct :-), 21.march.2013
''
type ColorPixel
sys colorx
byte red,green,blue,alpha
end type
'-----------------------------------------------------
function loadTexture(wstring wszfilename, sys textureWidth, sys textureHeight, string*strTextureData) as sys
'=====================================================
'
sys hstatus,pImage,pThumb,token
sys width,height,picflip,picdim,ref,xw,yw,xww,yww
macro swap(a,b)
scope
typeof a v=a
a=b : b=v
end scope
end macro
'
GdiplusStartupInput StartupInput
StartupInput.GdiplusVersion = 1
hStatus=GdiplusStartup token, StartupInput, byval 0
'
if hStatus then
print "Error initializing GDIplus: " hex hStatus
exit function
end if
hStatus = GdipLoadImageFromFile wszfilename, pImage
hStatus = GdipGetImageThumbnail pImage, textureWidth, textureHeight, pThumb, NULL, NULL
picflip=pthumb
hStatus = GdipImageRotateFlip (picflip,6) ' RotateNoneFlipY =6 invert
colorpixel colpix
strTextureData=nuls 4*textureWidth*textureHeight
xww=textureWidth-1
yww=xww
picdim=*strTextureData
for yw=0 to yww ' first y: right flip direction!
for xw=0 to xww
GdipBitmapGetPixel picflip, xw, yw, colpix.colorx
swap colpix.red, colpix.blue
*picdim=colpix.colorx
picdim+=4 'increase
next
next
'
'Cleanup
'
if pThumb then GdipDisposeImage pThumb
if pImage then GdipDisposeImage pImage
print "ok: " wszFilename '' only for testpurpose!
return hStatus
GdiplusShutdown token
end Function
that take a while to fix all problems and lines they needed to erase because of troubles and nonsens ;)
best regards, frank
X
-
Hi Frank,
I've got an improved swap macro, slightly faster and more secure
macro swap(a,b)
scope
let _v_ = a : a=b : b= _v_
end scope
end macro
Another tip for creating unions: Using '=' resets the internal offset.
type pixel
byte red,green,blue,alpha
=
dword color
end type
Charles
-
thanks charles for updated commands :-)
here my working example (it's like nehe 7 not exactly same example) for a rotating cube with texture. I am learning with oxygenbasic, it's very interesting but sometimes hard work (*smile*) and the success is on my side.
place the openGL example into /example/GUI folder for running
''
'' OPENGL NEHE Example Chapter 7 (nearly same content) for oxygen basic,
'' modificated by frank brĂ¼bach alias frankolinox, 21.march.2013
''
#case capital
def NULL null
includepath "..\..\inc\"
'$ FileName "t.exe"
'include "RTL32.inc"
title = "Nehe 7 or Cube Rotation + Gdiplus_Texture Loading"
include "OpenglSceneFrame.inc"
include "imgwin.inc"
sys GdiplusToken
sys texn[16]
'CREATE OPENGL TEXTURE
'=====================
type ColorPixel
byte red,green,blue,alpha
=
dword colorx
end type
'------------------------------------------------------
Sub MakeTexture(sys pPixelArray, TextureWidth, TextureHeight, Texnum )
'======================================================
'
string LOCAL strTextureData AS STRING
glBindTexture GL_TEXTURE_2D, texNum
'
'GL_NEAREST
'GL_LINEAR
'
glEnable GL_TEXTURE_2D
'glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR
'############################################
'GL_NEAREST
'GL_LINEAR
'GL_NEAREST_MIPMAP_NEAREST 0x2700
'GL_LINEAR_MIPMAP_NEAREST 0x2701
'GL_NEAREST_MIPMAP_LINEAR 0x2702
'GL_LINEAR_MIPMAP_LINEAR 0x2703
'
'glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST
'############################################
'
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR
glTexImage2D GL_TEXTURE_2D, 0, 4, TextureWidth, TextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, pPixelArray
'
'---------------- important for all 6 faces to show in openGL scene --------- //
glClearDepth 1.0
' Specify the value used for depth-buffer comparisons
glDepthFunc GL_LESS
' Enable depth comparisons and update the depth buffer
glEnable GL_DEPTH_TEST
' Select smooth shading
glShadeModel GL_SMOOTH
'
'---------------- important for all 6 faces to show in openGL scene --------- //
End Sub
'============================
'GDIPLUS TEXTURE IMAGE LOADER
'============================
'-----------------------------------------------------
function loadTexture(wstring wszfilename, sys textureWidth, sys textureHeight, string*strTextureData) as sys
'=====================================================
'
sys hstatus,pImage,pThumb,token
sys width,height,picflip,picdim,ref,xw,yw,xww,yww
macro swap(a,b)
scope
let _v_ = a : a=b : b= _v_
end scope
end macro
'
GdiplusStartupInput StartupInput
StartupInput.GdiplusVersion = 1
hStatus=GdiplusStartup token, StartupInput, byval 0
'
if hStatus then
print "Error initializing GDIplus: " hex hStatus
exit function
end if
hStatus = GdipLoadImageFromFile wszfilename, pImage
hStatus = GdipGetImageThumbnail pImage, textureWidth, textureHeight, pThumb, NULL, NULL
picflip=pthumb
hStatus = GdipImageRotateFlip (picflip,6) ' RotateNoneFlipY =6 invert
colorpixel colpix
strTextureData=nuls 4*textureWidth*textureHeight
xww=textureWidth-1
yww=xww
picdim=*strTextureData
for yw=0 to yww ' first y: right flip direction
for xw=0 to xww
GdipBitmapGetPixel picflip, xw, yw, colpix.colorx
swap colpix.red, colpix.blue
*picdim=colpix.colorx
picdim+=4 'increase
next
next
'
'Cleanup
'
if pThumb then GdipDisposeImage pThumb
if pImage then GdipDisposeImage pImage
print "ok: " wszFilename '' only for testpurpose
return hStatus
GdiplusShutdown token
end Function
'-----------------------
sub Initialize(sys hWnd)
'=======================
'GDIPLUS
'=======
string txt
sys hr
GdiplusStartupInput StartupInput
StartupInput.GdiplusVersion = 1
hr=GdiplusStartup GdiplusToken, StartupInput, byval 0
'
if hr then
print "Error initializing GDIplus: " hex hr
exit function
end if
'
'Prepare Textures
'----------------
'
glGenTextures 2, texn
'
static sys res=512
string txt, imgs[1]=""
loadTexture "crate.bmp",res,res, imgs[1]
MakeTexture *imgs[1],res,res,texn[1]
'
SetTimer hWnd,1,10,NULL
end sub
sub Release(sys hWnd)
'====================
killTimer hwnd, 1
glDeleteTextures 1, texn
GdiplusShutdown GdiplusToken
'
end sub
sub scene(sys hWnd)
'==================
'
static single ang1, angi1=1
static single sx,sy,sz
sys xrot,xspeed,yrot,yspeed
static float rotation = 0
'
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
glClearColor 0, 0, 0, 0 '0.5, 0, 0, 0
glLoadIdentity
'
'ACTIVATE TEXTURE
'----------------
'
glEnable GL_TEXTURE_2D
glBindTexture GL_TEXTURE_2D,texn[1]
'
sx=0.2 : sy=0.16 : sz=-1
'sx=0.2 : sy=0.16 : sz=-1
'
'
'MOVEMENT
'--------
'
'glrotatef ang1, 0,0,1
single x=cos(rad(ang1))*.1 ,y=sin(rad(ang1))*.1,z=0
glTranslatef x+0, y+0, z-5
glRotatef rotation, 0, 1, 0 ''glRotatef rotation, 0.2, 1, 0.2
rotation+=.5
if rotation > 360 then
rotation -= 360
end if
'
'DRAW SHAPE
'----------
'
'this quad is drawn clockwise
'
glbegin GL_QUADS
'
''glTexCoord2f 0,0 : glvertex3f -sx, -sy, sZ
''glTexCoord2f 0,1 : glvertex3f -sx, sy, sZ
''glTexCoord2f 1,1 : glvertex3f sx, sy, sZ
''glTexCoord2f 1,0 : glvertex3f sx, -sy, sZ
'
' Front Face
glNormal3f 0.0 , 0.0 , 1.0
glTexCoord2f 0.0 , 0.0 : glVertex3f -1.0 , -1.0 , 1.0
glTexCoord2f 1.0 , 0.0 : glVertex3f 1.0 , -1.0 , 1.0
glTexCoord2f 1.0 , 1.0 : glVertex3f 1.0 , 1.0 , 1.0
glTexCoord2f 0.0 , 1.0 : glVertex3f -1.0 , 1.0 , 1.0
' Back Face
glNormal3f 0.0 , 0.0 , -1.0
glTexCoord2f 1.0 , 0.0 : glVertex3f -1.0 , -1.0 , -1.0
glTexCoord2f 1.0 , 1.0 : glVertex3f -1.0 , 1.0 , -1.0
glTexCoord2f 0.0 , 1.0 : glVertex3f 1.0 , 1.0 , -1.0
glTexCoord2f 0.0 , 0.0 : glVertex3f 1.0 , -1.0 , -1.0
' Top Face
''glNormal3f 0.0 , 1.0 , 0.0
glTexCoord2f 0.0 , 1.0 : glVertex3f -1.0 , 1.0 , -1.0
glTexCoord2f 0.0 , 0.0 : glVertex3f -1.0 , 1.0 , 1.0
glTexCoord2f 1.0 , 0.0 : glVertex3f 1.0 , 1.0 , 1.0
glTexCoord2f 1.0 , 1.0 : glVertex3f 1.0 , 1.0 , -1.0
' Bottom Face
''glNormal3f 0.0 ,-1.0 , 0.0
glTexCoord2f 1.0 , 1.0 : glVertex3f -1.0 , -1.0 , -1.0
glTexCoord2f 0.0 , 1.0 : glVertex3f 1.0 , -1.0 , -1.0
glTexCoord2f 0.0 , 0.0 : glVertex3f 1.0 , -1.0 , 1.0
glTexCoord2f 1.0 , 0.0 : glVertex3f -1.0 , -1.0 , 1.0
' Right face
''glNormal3f 1.0 , 0.0 , 0.0
glTexCoord2f 1.0 , 0.0 : glVertex3f 1.0 , -1.0 , -1.0
glTexCoord2f 1.0 , 1.0 : glVertex3f 1.0 , 1.0 , -1.0
glTexCoord2f 0.0 , 1.0 : glVertex3f 1.0 , 1.0 , 1.0
glTexCoord2f 0.0 , 0.0 : glVertex3f 1.0 , -1.0 , 1.0
' Left Face
''glNormal3f -1.0 , 0.0 , 0.0
glTexCoord2f 0.0 , 0.0 : glVertex3f -1.0 , -1.0 , -1.0
glTexCoord2f 1.0 , 0.0 : glVertex3f -1.0 , -1.0 , 1.0
glTexCoord2f 1.0 , 1.0 : glVertex3f -1.0 , 1.0 , 1.0
glTexCoord2f 0.0 , 1.0 : glVertex3f -1.0 , 1.0 , -1.0
glEnd
'xrot = xrot + xspeed
'yrot = yrot + yspeed
glend
'
glDisable GL_TEXTURE_2D
'
'
'UPDATE ROTATION ANGLES
'----------------------
'
'ang1+=angi1 : if ang1>=360 then ang1-=360
'
'
end sub
in zip folder you find the "crate.bmp" image file, both include files, oxygen.dll for that example and of course the openGL example. but you need only to copy the openGL example into GUI folder and the "crate.bmp" image file for running. must work on your machine ;)
nice week end, best regards, frank
X