Code archives/3D Graphics - Mesh/Form3D
This code has been declared by its author to be Public Domain code.
Download source code
| Form3D - a Free pixel perfect 3d gui Free Public Domain This is a free public opensource Blitz3D project. You can derive your own works form it or even help add gui functionality to this. It's 100% free! [Note] I currently have no plans to update this code. I want to redo it all. I will leave this code here for learning/idea generating purposes. The way the mesh is created to display the pixel perfect textures I will still use in the same way. - F3D_Input is not 100% complete. You can edit text, select text position with mouse click, use backspace... but needs more keyboard controls like delete, end, home, etc... - Added automated mouse graphic Have fun! :) First the include file: Form3D.bb ; Form3D.bb ; Form3D - a Free pixel perfect 3d gui ; Free Public Domain ; Note: ; This is a free public opensource Blitz3D project. You can derive your ; own works form it or even help add gui functionality to this. It's 100% free! ; this global helps with mouse z order Global int_gCURRENTZORDERPOS=0 ; Form type constants describing what the basic form's purpose is ; To be used with the formtype field of Type formInfo Const FT_TEXT=0 ; Text Const FT_NAG=1 ; non-animated graphic Const FT_NHPB=2 ; non-highlighted push button Const FT_HPB=3 ; highlighted push button style Const FT_NHT=4 ; non-highlighted (true/false) toggle Const FT_HT=5 ; highlighted (true/false) toggle Const FT_INPUT=6; Input Const FT_PANEL=7; Panel Type formInfo Field formtype ; Form Type values - use FT_ constants Field thisFont.fontInfo ; stores what font this 3d text form uses Field zorder ; store z order position Field active ; Field visible ; !!! not implemented yet Field lock ; !!! not implemented yet Field alpha# ; 3d form's vertex alpha# component Field red ; " red component Field green ; " green component Field blue ; " blue component Field alphamask ; true/false - sets see through pixels(color 0,0,0) ; to alpha 0 on textures when setting new texture image ; during runtime(aka: F3D_SetState). When set to FALSE there is no ; speed hit when setting a new texture, but if new texture is different ; in size from previous texture (for example smaller in size) ; then you will most likely see left over graphics from previous ; texture. If you keep the textures the same size and same graphical ; shape (like buttons for example), then you will not notice any ; left over graphics when texture switching. ; If you must have it clean looking for textures that are not the same ; size and same graphical shape then set this to TRUE. In this case, the ; bigger the texture, the bigger the speed hit when animating textures ; for gadgets like buttons as an example. ; [---> USE the F3D_SetAlphaMask to set alphamask <---] Field mdooba ; 0=no mousedown, 1=mouse down out of box area, 2=mouse down inside of box area Field x# ; World X# cordinates Field y# ; World Y# cordinates Field screenx ; Screen X position Field screeny ; Screen Y position Field width ; width of visible graphic Field height ; height of visible graphic Field txt$ ; text to be displayed (ie: F3D_CreateText, F3D_UpdateText, F3D_Input ) Field parent.formInfo ; Type Handle to Parent 3D form this 3d form will attach to Field numchildren ; This form must be a parent with >0 children 3d forms Field childbank ; bank stores children 3d form handles Field childpos ; from parent zordor position Field hsize ; internal use Field vsize ; internal use Field tsize ; internal use Field state ; gives state values according to mouse over and clicks Field texture1 ; textures used for differen 3d form states Field texture2 ; Field texture3 ; Field texture4 ; Field shadow ; used for F3D_Mouse Field mesh ; mesh to create 3d form with Field numsurfs ; Field surfbank ; Field numtex ; Field texbank ; End Type Global mousepointerHandle Global mousepointer2Handle Global int_gOldMouseX=0 Global int_gOldMouseY=0 Global cursorHandle Global cursorThis3DForm.formInfo cursorThis3DForm = Null Global cursorBlinkTime=MilliSecs() Global cursorBlink=True Global cursorBlinkDelay Global cursorInit = False Global cursorpos = 0 Global gInputkey Global FORMZ#=10.0 ; Distance from camera the create plane entity will be moved to Type zOrder Field this3DForm.formInfo End Type Global zList.zOrder Type zParentOrder Field thisParent.formInfo End Type Global zPList.zParentOrder Type fontInfo Field maxcol Field maxrow Field chrw Field chrh Field texsize Field font Field fonttexture Field fontname$ Field fontsize End Type Global defaultfont.fontInfo ; characters wanted for use with text Global gcharlist$ gcharlist$=" 0123456789!"+Chr$(34)+"#$%^&'()*+,_-./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@[]{}|\<>?=:;~`" ; var help to save unique font texture names Global ftnum ftnum=1 ; F3D_Setup ; thisCamera - main camera entity to set invisible plane on Function F3D_Setup(thisCamera) ; make invisible plane to help place Form3d gadgets/text correctly terr=CreatePlane(1,thisCamera) EntityPickMode terr,2 PositionEntity terr,0,0,FORMZ# RotateEntity terr,-90,0,0 EntityColor terr,0,0,0 EntityAlpha terr,0 End Function ; F3D_CreateFont ; fontname$ - font to use. Will create a bmp of characters using this font. ; fontsize - size of font ; chrw,chrh - characters spaced within the texture, example: 16x16 ; texsize - size of texture, for example 256 = 256x256 ; RETURN: ; Font Handle to a fontInfo type Function F3D_CreateFont(fontname$,fontsize,chrw,chrh,texsize) thisFont.fontInfo = New fontInfo thisfnt=LoadFont(fontname$,fontsize) SetFont thisfnt thisFont\font=thisfnt thisFont\fontname$=fontname$ thisFont\fontsize=fontsize ; create font texture fontimage=CreateImage(texsize,texsize) fontbuf=ImageBuffer(fontimage) xpos=0 ypos=0 cpos=1 SetBuffer fontbuf ClsColor 0,0,0 Cls Color 255,255,255 slen=Len(gcharlist$) While cpos<slen+1 Text xpos,ypos,Mid$(gcharlist$,cpos,1) cpos=cpos+1 xpos=xpos+chrw If xpos=>texsize xpos=0 ypos=ypos+chrh EndIf Wend SetBuffer BackBuffer() SaveImage(fontimage,"fonttexture"+ftnum+".bmp") thisFont\fonttexture = LoadTexture("fonttexture"+ftnum+".bmp",1+2+16+32+256) ftnum=ftnum+1 thisFont\chrw=chrw thisFont\chrh=chrh thisFont\texsize=texsize thisFont\maxcol=texsize/chrw thisFont\maxrow=texsize/chrh If defaultfont=Null Then defaultfont=thisFont Return Handle(thisFont) End Function ; F3D_SetFont ; thisFontHandle - Font Handle to set before calling F3D_CreateText Function F3D_SetFont(thisFontHandle) Local thisFont.fontInfo thisFont.fontInfo = Object.fontInfo( thisFontHandle ) defaultfont=thisFont SetFont defaultfont\font End Function ; F3D_CreateText ; txt$ - Text to display ; formXp - screen X position ; formYp - screen Y position ; width - width of form ; height - height of form ; parent - a parent handle that this object will attach itself to ; minpow - minimum surface size to split up form by. example: use 5 for: 2^5=32 ; maxpow - maximum surface size to split up form by. example: use 8 for: 2^8=256 ; RETURN: ; Text Handle to a formInfo type Function F3D_CreateText(txt$,formXp,formYp,width,height=0,parent=0,minpow=5,maxpow=8) Local this3DForm.formInfo, thisMesh, tsw, tsh, numoftextures this3DForm.formInfo = New formInfo this3DForm\formtype=FT_TEXT this3DForm\thisFont=defaultfont this3DForm\alphamask=False this3DForm\shadow=False this3DForm\parent=Null this3DForm\childpos=0 this3DForm\numchildren=0 this3DForm\childbank=CreateBank(0) thisMesh=CreateMesh(camera) this3DForm\mesh=thisMesh this3DForm\txt$=txt$ tsw=width tsh=height If height=0 SetFont this3DForm\thisFont\font tsh=FontHeight() EndIf this3DForm\screenx=formXp this3DForm\screeny=formYp this3DForm\width=tsw this3DForm\height=tsh sizepow=minpow qsize=2^sizepow splitv=False While tsh>qsize sizepow=sizepow+1 qsize=2^sizepow Wend If qsize>2^maxpow ; split vertical and horizontal qsize=2^maxpow splitv=True Else ; split horizontal only splitv=False EndIf hqsize=0 While (hqsize*qsize)<tsw hqsize=hqsize+1 Wend vqsize=0 If splitv=True While (vqsize*qsize)<tsh vqsize=vqsize+1 Wend Else vqsize=1 EndIf this3DForm\hsize=hqsize this3DForm\vsize=vqsize this3DForm\tsize=qsize CameraPick(camera,formXp,formYp) x1#=PickedX#() y1#=PickedY#() CameraPick(camera,formXp+(hqsize*qsize),formYp+(vqsize*qsize)) x2#=PickedX#() y2#=PickedY#() this3DForm\x#=x1# this3DForm\y#=y1# tw#=Abs(x2#-x1#) th#=Abs(y2#-y1#) txs#=tw#/Float(hqsize*qsize) tys#=th#/Float(vqsize*qsize) min#=0.5/Float(qsize) max#=(Float(qsize)+0.5)/Float(qsize) fontbuf=TextureBuffer(this3DForm\thisFont\fonttexture) SetFont this3DForm\thisFont\font numoftextures=0 this3DForm\texbank=CreateBank(0) numofsurfaces=0 this3DForm\surfbank=CreateBank(0) thisBrush = CreateBrush() For j=0 To vqsize-1 For i=0 To hqsize-1 Surf=CreateSurface(thisMesh) numofsurfaces=numofsurfaces+1 this3DForm\numsurfs=numofsurfaces ResizeBank this3DForm\surfbank,numofsurfaces*4 PokeInt this3DForm\surfbank,numofsurfaces*4-4,Surf ; Create and store texture for possible later updates ti=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(ti) numoftextures=numoftextures+1 this3DForm\numtex=numoftextures ResizeBank this3DForm\texbank,numoftextures*4 PokeInt this3DForm\texbank,numoftextures*4-4,ti int_ManualAlpha(tibuf,qsize) placetext=0-(i*qsize) For z=1 To Len(txt$) location=Instr(gcharlist$,Mid$(txt$,z,1),1) If location>0 Or Mid$(txt$,z,1)=Chr$(32) thisrow=(location/this3DForm\thisFont\maxrow) ;Y thiscol=location Mod this3DForm\thisFont\maxcol ;X ; *** brain fart lazy hotfix hack *** ; stops it from it placing last column characters from fonttexture in ; front, negative area on the next row. ; Rem out to see it not print characters to get a better idea. If thiscol=0 thiscol=this3DForm\thisFont\maxcol thisrow=thisrow-1 EndIf CopyRect (thiscol*this3DForm\thisFont\chrw)-this3DForm\thisFont\chrw,thisrow*this3DForm\thisFont\chrh,this3DForm\thisFont\chrw,this3DForm\thisFont\chrh,placetext,0-(j*qsize),fontbuf,tibuf placetext=placetext+StringWidth(Mid$(txt$,z,1)) EndIf Next tv0=AddVertex(Surf,x1#+(txs#*(i*qsize)) ,y1#-(tys#*(j*qsize)),FORMZ#,min#,min#) tv1=AddVertex(Surf,x1#+(txs#*(((i+1)*qsize))) ,y1#-(tys#*(j*qsize)),FORMZ#,max#,min#) tv2=AddVertex(Surf,x1#+(txs#*(((i+1)*qsize))) ,y1#-(tys#*(((j+1)*qsize))),FORMZ#,max#,max#) tv3=AddVertex(Surf,x1#+(txs#*(i*qsize)) ,y1#-(tys#*(((j+1)*qsize))),FORMZ#,min#,max#) tri0=AddTriangle(Surf,tv0,tv1,tv2) tri1=AddTriangle(Surf,tv0,tv2,tv3) VertexColor Surf,tv0,255,255,255 VertexColor Surf,tv1,255,255,255 VertexColor Surf,tv2,255,255,255 VertexColor Surf,tv3,255,255,255 BrushTexture thisBrush, ti BrushFX thisBrush, 3 PaintSurface Surf,thisBrush Next Next FreeBrush thisBrush int_Add2zList(Handle(this3DForm),parent) Return Handle(this3DForm) End Function ; F3D_UpdateText ; this3DFormHandle - Text handle to be updated ; txt$ - text to be updated Function F3D_UpdateText(this3DFormHandle,txt$) Local this3DForm.formInfo Local thisSurf, thisTexture, brushnum brushnum=0 this3DForm.formInfo = Object.formInfo(this3DFormHandle) this3DForm\txt$=txt$ fontbuf=TextureBuffer(this3DForm\thisFont\fonttexture) SetFont this3DForm\thisFont\font thisBrush = CreateBrush() For j=0 To this3DForm\vsize-1 For i=0 To this3DForm\hsize-1 brushnum=brushnum+4 thisSurf=PeekInt(this3DForm\surfbank,brushnum-4) thisTexture=PeekInt(this3DForm\texbank,brushnum-4) tibuf=TextureBuffer(thisTexture) placetext=0-(i*this3DForm\tsize) For z=1 To Len(txt$) location=Instr(gcharlist$,Mid$(txt$,z,1),1) If location>0 ;Or Mid$(txt$,z,1)=Chr$(32) thisrow=(location/this3DForm\thisFont\maxrow) ;Y thiscol=location Mod this3DForm\thisFont\maxcol ;X If thiscol=0 thiscol=this3DForm\thisFont\maxcol thisrow=thisrow-1 EndIf CopyRect(thiscol*this3DForm\thisFont\chrw)-this3DForm\thisFont\chrw,thisrow*this3DForm\thisFont\chrh,this3DForm\thisFont\chrw,this3DForm\thisFont\chrh,placetext,0-(j*this3DForm\tsize),fontbuf,tibuf placetext=placetext+StringWidth(Mid$(txt$,z,1)) EndIf Next location=Instr(gcharlist$," ",1) thisrow=(location/this3DForm\thisFont\maxrow) ;Y thiscol=location Mod this3DForm\thisFont\maxcol ;X If thiscol=0 thiscol=this3DForm\thisFont\maxcol thisrow=thisrow-1 EndIf While placetext<this3DForm\width CopyRect(thiscol*this3DForm\thisFont\chrw)-this3DForm\thisFont\chrw,thisrow*this3DForm\thisFont\chrh,this3DForm\thisFont\chrw,this3DForm\thisFont\chrh,placetext,0-(j*this3DForm\tsize),fontbuf,tibuf placetext=placetext+StringWidth(" ") Wend BrushTexture thisBrush, thisTexture BrushFX thisBrush, 3 PaintSurface thisSurf,thisBrush Next Next FreeBrush thisBrush Return End Function ; F3D_VColor ; this3DFormHandle - 3D Form Handle ( can be a text handle ) ; red - red component value of 3d form's vertices ; green - red component value of 3d form's vertices ; blue - red component value of 3d form's vertices ; alpha# - alpha component value of 3d form's vertices Function F3D_VColor(this3DFormHandle,red,green,blue,alpha#=1.0) Local thisSurf,numsurf,thisVertex,numverts Local this3DForm.formInfo this3DForm.formInfo = Object.formInfo(this3DFormHandle) this3DForm\alpha#=alpha# this3DForm\red=red this3DForm\green=green this3DForm\blue=blue numsurf=CountSurfaces(this3DForm\mesh) For i=1 To numsurf thisSurf=GetSurface(this3DForm\mesh,i) numverts=CountVertices(thisSurf) For j=0 To numverts-1 VertexColor thisSurf,j,red,green,blue,alpha# Next Next End Function ; F3D_CreateForm ; formXp - screen X position ; formYp - screen Y position ; formtype - type of button styles ; tex1 - default texture ; tex2 - 2nd ; tex3 - 3rd ; tex4 - 4th ; parent - a parent handle that this object will attach itself to ; minpow - minimum surface size to split up form by. example: use 5 for: 2^5=32 ; maxpow - maximum surface size to split up form by. example: use 8 for: 2^8=256 ; RETURN: ; 3D Form handle to a formInfo type Function F3D_CreateForm(formXp,formYp,formtype,tex1,tex2=0,tex3=0,tex4=0,parent=0,minpow=5,maxpow=8) Local this3DForm.formInfo, thisMesh, tsw, tsh, numoftextures Local thisParent.formInfo this3DForm.formInfo = New formInfo this3DForm\formtype=formtype this3DForm\alphamask=False this3DForm\shadow=False this3DForm\parent=Null this3DForm\childpos=0 this3DForm\numchildren=0 this3DForm\childbank=CreateBank(0) thisMesh=CreateMesh(camera) this3DForm\mesh=thisMesh this3DForm\txt$="" tsw=TextureWidth(tex1) tsh=TextureHeight(tex1) If tex2<>0 tsw2=TextureWidth(tex2) tsh2=TextureHeight(tex2) If tsw<tsw2 Then tsw=tsw2 If tsh<tsh2 Then tsh=tsh2 EndIf If tex3<>0 tsw3=TextureWidth(tex3) tsh3=TextureHeight(tex3) If tsw<tsw3 Then tsw=tsw3 If tsh<tsh3 Then tsh=tsh3 EndIf If tex4<>0 tsw4=TextureWidth(tex4) tsh4=TextureHeight(tex4) If tsw<tsw4 Then tsw=tsw4 If tsh<tsh4 Then tsh=tsh4 EndIf this3DForm\screenx=formXp this3DForm\screeny=formYp this3DForm\width=tsw this3DForm\height=tsh sizepow=minpow qsize=2^sizepow splitv=False While tsh>qsize sizepow=sizepow+1 qsize=2^sizepow Wend If qsize>2^maxpow ; split vertical and horizontal qsize=2^maxpow splitv=True Else ; split horizontal only splitv=False EndIf hqsize=0 While (hqsize*qsize)<tsw hqsize=hqsize+1 Wend vqsize=0 If splitv=True While (vqsize*qsize)<tsh vqsize=vqsize+1 Wend Else vqsize=1 EndIf this3DForm\hsize=hqsize this3DForm\vsize=vqsize this3DForm\tsize=qsize CameraPick(camera,formXp,formYp) x1#=PickedX#() y1#=PickedY#() CameraPick(camera,formXp+(hqsize*qsize),formYp+(vqsize*qsize)) x2#=PickedX#() y2#=PickedY#() this3DForm\x#=x1# this3DForm\y#=y1# tw#=Abs(x2#-x1#) th#=Abs(y2#-y1#) txs#=tw#/Float(hqsize*qsize) tys#=th#/Float(vqsize*qsize) min#=0.5/Float(qsize) max#=(Float(qsize)+0.5)/Float(qsize) texbuf=TextureBuffer(tex1) this3DForm\state=0 this3DForm\texture1=tex1 this3DForm\texture2=tex2 this3DForm\texture3=tex3 this3DForm\texture4=tex4 numoftextures=0 this3DForm\texbank=CreateBank(0) numofsurfaces=0 this3DForm\surfbank=CreateBank(0) thisBrush = CreateBrush() For j=0 To vqsize-1 For i=0 To hqsize-1 Surf=CreateSurface(thisMesh) numofsurfaces=numofsurfaces+1 this3DForm\numsurfs=numofsurfaces ResizeBank this3DForm\surfbank,numofsurfaces*4 PokeInt this3DForm\surfbank,numofsurfaces*4-4,Surf ; Create and store texture for possible later updates ti=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(ti) numoftextures=numoftextures+1 this3DForm\numtex=numoftextures ResizeBank this3DForm\texbank,numoftextures*4 PokeInt this3DForm\texbank,numoftextures*4-4,ti CopyRect 0,0,tsw,tsh,0-(i*qsize),0-(j*qsize),texbuf,tibuf int_ManualAlpha(tibuf,qsize) tv0=AddVertex(Surf,x1#+(txs#*(i*qsize)) ,y1#-(tys#*(j*qsize)),FORMZ#,min#,min#) tv1=AddVertex(Surf,x1#+(txs#*(((i+1)*qsize))) ,y1#-(tys#*(j*qsize)),FORMZ#,max#,min#) tv2=AddVertex(Surf,x1#+(txs#*(((i+1)*qsize))) ,y1#-(tys#*(((j+1)*qsize))),FORMZ#,max#,max#) tv3=AddVertex(Surf,x1#+(txs#*(i*qsize)) ,y1#-(tys#*(((j+1)*qsize))),FORMZ#,min#,max#) tri0=AddTriangle(Surf,tv0,tv1,tv2) tri1=AddTriangle(Surf,tv0,tv2,tv3) VertexColor Surf,tv0,255,255,255 VertexColor Surf,tv1,255,255,255 VertexColor Surf,tv2,255,255,255 VertexColor Surf,tv3,255,255,255 BrushTexture thisBrush, ti BrushFX thisBrush, 3 PaintSurface Surf,thisBrush Next Next FreeBrush thisBrush int_Add2zList(Handle(this3DForm),parent) Return Handle(this3DForm) End Function Function F3D_SetAlphaMask(this3DFormHandle,alphamask) Local this3DForm.formInfo this3DForm.formInfo = Object.formInfo(this3DFormHandle) this3DForm\alphamask=alphamask Return End Function ; F3D_SetState ; this3DFormHandle - 3d form handle to be updated ; state - set to 0, 1, 2 or 3 for desired state Function F3D_SetState(this3DFormHandle, state) Local thisSurf, thisTexture, brushnum Local this3DForm.formInfo this3DForm.formInfo = Object.formInfo(this3DFormHandle) brushnum=0 this3DForm\state=state If this3DForm\state=0 If this3DForm\texture1>0 texbuf=TextureBuffer(this3DForm\texture1) Else Return EndIf EndIf If this3DForm\state=1 If this3DForm\texture2>0 texbuf=TextureBuffer(this3DForm\texture2) Else Return EndIf EndIf If this3DForm\state=2 If this3DForm\texture3>0 texbuf=TextureBuffer(this3DForm\texture3) Else Return EndIf EndIf If this3DForm\state=3 If this3DForm\texture4>0 texbuf=TextureBuffer(this3DForm\texture4) Else Return EndIf EndIf thisBrush = CreateBrush() For j=0 To this3DForm\vsize-1 For i=0 To this3DForm\hsize-1 brushnum=brushnum+4 thisSurf=PeekInt(this3DForm\surfbank,brushnum-4) thisTexture=PeekInt(this3DForm\texbank,brushnum-4) tibuf=TextureBuffer(thisTexture) If this3DForm\alphamask=True SetBuffer tibuf ClsColor 0,0,0 Cls SetBuffer BackBuffer() int_ManualAlpha(tibuf,this3DForm\tsize) EndIf CopyRect 0,0,this3DForm\width,this3DForm\height,0-(i*this3DForm\tsize),0-(j*this3DForm\tsize),texbuf,tibuf BrushTexture thisBrush, thisTexture BrushFX thisBrush, 3 PaintSurface thisSurf,thisBrush Next Next FreeBrush thisBrush Return End Function ; F3D_GetState ; this3DFormHandle - 3d form handle Function F3D_GetState(this3DFormHandle) Local this3DForm.formInfo this3DForm.formInfo = Object.formInfo(this3DFormHandle) Return this3DForm\state End Function ; F3D_Position ; this3DFormHandle - 3d form handle ; formXp - screen X position to be updated ; formYp - screen Y position to be updated Function F3D_Position(this3DFormHandle,formXp,formYp) Local this3DForm.formInfo this3DForm.formInfo = Object.formInfo(this3DFormHandle) CameraPick(camera,formXp,formYp) x1#=PickedX#() y1#=PickedY#() MoveEntity this3DForm\mesh,x1#-this3DForm\x#,y1#-this3DForm\y#,0.0 this3DForm\screenx=formXp this3DForm\screeny=formYp this3DForm\x#=x1# this3DForm\y#=y1# End Function ; F3D_FocusParent ; thisParentHandle - Valid parent 3d form handle Function F3D_FocusParent(thisParentHandle) Local thisChild.formInfo, thisChildHandle Local thisParent.formInfo Local mousepointer.formInfo mousepointer.formInfo = Object.formInfo(mousepointerHandle) thisParent.formInfo = Object.formInfo(thisParentHandle) ;delete parent from zList to be put into zPList For zPList.zParentOrder = Each zParentOrder If zPList\thisParent = thisParent Insert zPList After Last zParentOrder Insert zPList\thisParent After Last formInfo ; set children zorder For childlist=1 To zPList\thisParent\numchildren thisChildHandle=PeekInt(zPList\thisParent\childbank,childlist*4-4) thisChild.formInfo = Object.formInfo(thisChildHandle) Insert thisChild After Last formInfo Next Exit EndIf Next int_CleanZOrder() If mousepointer<>Null int_UpdateMouseZOrder() EndIf End Function ;F3D_UpdateGui ; // Update gui states Function F3D_UpdateGui() Local this3DForm.formInfo Local legalParent.formInfo Local mousepointer.formInfo Local mousepointer2.formInfo mousepointer.formInfo = Object.formInfo(mousepointerHandle) mousepointer2.formInfo = Object.formInfo(mousepointer2Handle) ; update mouse If MouseX()<>int_gOldMouseX Or MouseY()<>int_gOldMouseY If mousepointer<>Null F3D_Position(Handle(mousepointer),MouseX(),MouseY()-2) mousepointer\zorder=int_gCURRENTZORDERPOS-2 If mousepointer2\shadow=True F3D_Position(Handle(mousepointer2),MouseX()+2,MouseY()) mousepointer2\zorder=int_gCURRENTZORDERPOS-1 EndIf int_UpdateMouseZOrder() EndIf int_gOldMouseX=MouseX() int_gOldMouseY=MouseY() EndIf ; hide cursor if no input gadgets are active thisCursor.formInfo = Object.formInfo(cursorHandle) If thisCursor.formInfo <> Null thisCursor\visible = False thisCursor\zorder=int_gCURRENTZORDERPOS-3 EndIf gui_ops=False isParentInFront=False isChild=False legalParent=Null this3DForm.formInfo = Last formInfo While (this3DForm.formInfo<>Null) ; check if parent group selected to be switched to front If (MouseX()>this3DForm\screenx) And (MouseX()<this3DForm\screenx+this3DForm\width) And (MouseY()>this3DForm\screeny) And (MouseY()<this3DForm\screeny+this3DForm\height) If this3DForm\parent<>Null If legalParent=Null legalParent=this3DForm\parent isChild=True EndIf EndIf If legalParent=Null If this3DForm\numchildren>0 And isChild=False legalParent=this3DForm EndIf EndIf If (legalParent=this3DForm\parent And isChild=True) Or (legalParent=this3DForm And isChild=False) gui_ops=True isParentInFront=True If MouseDown(1)=True F3D_FocusParent(Handle(legalParent)) EndIf Else gui_ops=False EndIf EndIf If isParentInFront=False And this3DForm\numchildren=0 And legalParent=Null gui_ops=True EndIf If gui_ops=True ;legalParent=this3DForm\parent Or legalParent=this3DForm ; Panel If this3DForm\formtype=FT_PANEL If (MouseX()>this3DForm\screenx) And (MouseX()<this3DForm\screenx+this3DForm\width) And (MouseY()>this3DForm\screeny) And (MouseY()<this3DForm\screeny+this3DForm\height) If MouseDown(1)=True And this3DForm\state=0 And (this3DForm\mdooba=0 Or this3DForm\mdooba=2) F3D_SetState(Handle(this3DForm),1) this3DForm\mdooba=2 ; mouse inside of box area Else If MouseDown(1)=False If this3DForm\state=1 F3D_SetState(Handle(this3DForm),0) EndIf If this3DForm\mdooba=1 ; mousedown was outside of box area this3DForm\mdooba=0 ; no mousedown EndIf EndIf EndIf Else If this3DForm\mdooba<2 ; mouse outside of box If MouseDown(1)=True this3DForm\mdooba=1 ; mousedown outside of box area Else this3DForm\mdooba=0 ; no mousedown EndIf Else If MouseDown(1)=False this3DForm\mdooba=0 ; mousedown was inside of box area EndIf EndIf If this3DForm\state>0 ; mouse outside of box = default texture F3D_SetState(Handle(this3DForm),0) EndIf EndIf EndIf ; input If this3DForm\formtype=FT_INPUT If (MouseX()>this3DForm\screenx) And (MouseX()<this3DForm\screenx+this3DForm\width) And (MouseY()>this3DForm\screeny) And (MouseY()<this3DForm\screeny+this3DForm\height) If MouseDown(1)=True And this3DForm\state=0 And (this3DForm\mdooba=0 Or this3DForm\mdooba=2) F3D_SetState(Handle(this3DForm),1) this3DForm\mdooba=2 ; mouse inside of box area this3DForm\active=True cursorThis3DForm=this3DForm cursorInit=True Else If MouseDown(1)=False If this3DForm\state=1 F3D_SetState(Handle(this3DForm),0) EndIf If this3DForm\mdooba=1 ; mousedown was outside of box area this3DForm\mdooba=0 ; no mousedown EndIf EndIf EndIf Else If this3DForm\mdooba<2 ; mouse outside of box If MouseDown(1)=True this3DForm\mdooba=1 ; mousedown outside of box area this3DForm\active=False If cursorThis3DForm = this3DForm cursorThis3DForm = Null EndIf Else this3DForm\mdooba=0 ; no mousedown EndIf Else If MouseDown(1)=False this3DForm\mdooba=0 ; mousedown was inside of box area EndIf EndIf If this3DForm\state>0 ; mouse outside of box = default texture F3D_SetState(Handle(this3DForm),0) EndIf EndIf EndIf ; non-highlighted push button style If this3DForm\formtype=FT_NHPB If (MouseX()>this3DForm\screenx) And (MouseX()<this3DForm\screenx+this3DForm\width) And (MouseY()>this3DForm\screeny) And (MouseY()<this3DForm\screeny+this3DForm\height) If MouseDown(1)=True And this3DForm\state=0 And (this3DForm\mdooba=0 Or this3DForm\mdooba=2) F3D_SetState(Handle(this3DForm),1) this3DForm\mdooba=2 ; mouse inside of box area Else If MouseDown(1)=False If this3DForm\state=1 F3D_SetState(Handle(this3DForm),0) EndIf If this3DForm\mdooba=1 ; mousedown was outside of box area this3DForm\mdooba=0 ; no mousedown EndIf EndIf EndIf Else If this3DForm\mdooba<2 ; mouse outside of box If MouseDown(1)=True this3DForm\mdooba=1 ; mousedown outside of box area Else this3DForm\mdooba=0 ; no mousedown EndIf Else If MouseDown(1)=False this3DForm\mdooba=0 ; mousedown was inside of box area EndIf EndIf If this3DForm\state>0 ; mouse outside of box = default texture F3D_SetState(Handle(this3DForm),0) EndIf EndIf EndIf ; highlighted push button style If this3DForm\formtype=FT_HPB If (MouseX()>this3DForm\screenx) And (MouseX()<this3DForm\screenx+this3DForm\width) And (MouseY()>this3DForm\screeny) And (MouseY()<this3DForm\screeny+this3DForm\height) If this3DForm\state=0 F3D_SetState(Handle(this3DForm),2) EndIf If MouseDown(1)=True And this3DForm\state=2 And (this3DForm\mdooba=0 Or this3DForm\mdooba=2) F3D_SetState(Handle(this3DForm),1) this3DForm\mdooba=2 ; mouse inside of box area Else If MouseDown(1)=False If this3DForm\state=1 F3D_SetState(Handle(this3DForm),2) EndIf If this3DForm\mdooba=1 ; mousedown was outside of box area this3DForm\mdooba=0 ; no mousedown EndIf EndIf EndIf Else If this3DForm\mdooba<2 ; mouse outside of box If MouseDown(1)=True this3DForm\mdooba=1 ; mousedown outside of box area Else this3DForm\mdooba=0 ; no mousedown EndIf Else If MouseDown(1)=False this3DForm\mdooba=0 ; mousedown was inside of box area EndIf EndIf If this3DForm\state>0 ; mouse outside of box = default texture F3D_SetState(Handle(this3DForm),0) EndIf EndIf EndIf ; non-highlighted toggle true/false style If this3DForm\formtype=FT_NHT If (MouseX()>this3DForm\screenx) And (MouseX()<this3DForm\screenx+this3DForm\width) And (MouseY()>this3DForm\screeny) And (MouseY()<this3DForm\screeny+this3DForm\height) If MouseDown(1)=True And this3DForm\state=0 And this3DForm\mdooba=0 F3D_SetState(Handle(this3DForm),1) this3DForm\mdooba=2 ; mouse inside of box area EndIf If MouseDown(1)=True And this3DForm\state=1 And this3DForm\mdooba=0 F3D_SetState(Handle(this3DForm),0) this3DForm\mdooba=2 ; mouse inside of box area EndIf If MouseDown(1)=False If this3DForm\mdooba>0 ; mousedown was outside of box area this3DForm\mdooba=0 ; no mousedown EndIf EndIf Else If this3DForm\mdooba<2 ; mouse outside of box If MouseDown(1)=True this3DForm\mdooba=1 ; mousedown outside of box area Else this3DForm\mdooba=0 ; no mousedown EndIf Else If MouseDown(1)=False this3DForm\mdooba=0 ; mousedown was inside of box area EndIf EndIf EndIf EndIf ; highlighted toggle true/false style If this3DForm\formtype=FT_HT If (MouseX()>this3DForm\screenx) And (MouseX()<this3DForm\screenx+this3DForm\width) And (MouseY()>this3DForm\screeny) And (MouseY()<this3DForm\screeny+this3DForm\height) If MouseDown(1)=True And (this3DForm\state=0 Or this3DForm\state=2) And this3DForm\mdooba=0 F3D_SetState(Handle(this3DForm),1) this3DForm\mdooba=2 ; mouse inside of box area EndIf If MouseDown(1)=True And (this3DForm\state=1 Or this3DForm\state=3) And this3DForm\mdooba=0 F3D_SetState(Handle(this3DForm),0) this3DForm\mdooba=2 ; mouse inside of box area EndIf If MouseDown(1)=False If this3DForm\mdooba>0 ; mousedown was outside of box area this3DForm\mdooba=0 ; no mousedown inside of box area EndIf EndIf If this3DForm\state=0 F3D_SetState(Handle(this3DForm),2) EndIf If this3DForm\state=1 F3D_SetState(Handle(this3DForm),3) EndIf Else If this3DForm\mdooba<2 ; mouse outside of box If MouseDown(1)=True this3DForm\mdooba=1 ; mousedown outside of box area Else this3DForm\mdooba=0 ; no mousedown EndIf Else If MouseDown(1)=False this3DForm\mdooba=0 ; mousedown was inside of box area EndIf EndIf If this3DForm\state=2 F3D_SetState(Handle(this3DForm),0) EndIf If this3DForm\state=3 F3D_SetState(Handle(this3DForm),1) EndIf EndIf EndIf EndIf this3DForm = Before this3DForm Wend ; If Input focused then update text when needed... If cursorThis3DForm <> Null F3D_SetFont(Handle(cursorThis3DForm\thisFont)) If cursorInit=True cursorInit=False strlen=Len(cursorThis3DForm\txt$) strpos=0 fnthalf=(FontWidth()/2) For i=1 To strlen strpos=cursorThis3DForm\screenx+StringWidth(Left$(cursorThis3DForm\txt$,i)) If strpos>MouseX() If strpos-fnthalf<MouseX() cursorpos = i Else strpos=cursorThis3DForm\screenx+StringWidth(Left$(cursorThis3DForm\txt$,i-1)) cursorpos = i-1 EndIf Exit EndIf If i=strlen If strpos<MouseX() cursorpos = i EndIf EndIf Next formXp=strpos formYp=cursorThis3DForm\screeny F3D_Position(cursorHandle,formXp,formYp) Else strpos=cursorThis3DForm\screenx+StringWidth(Left$(cursorThis3DForm\txt$,cursorpos)) formXp=strpos formYp=cursorThis3DForm\screeny F3D_Position(cursorHandle,formXp,formYp) EndIf If thisCursor.formInfo <> Null cursorBlinkDelay=MilliSecs()-cursorBlinkTime If cursorBlinkDelay>500 cursorBlinkTime=MilliSecs() If cursorBlink=True cursorBlink=False HideEntity thisCursor\mesh Else cursorBlink=True ShowEntity thisCursor\mesh EndIf EndIf EndIf ; Get input Inputkey=GetKey() If Inputkey>0 If Inputkey=8 If cursorpos>0 strleft$=Left$(cursorThis3DForm\txt$,cursorpos-1) If Len(cursorThis3DForm\txt$)-cursorpos>0 strright$=Right$(cursorThis3DForm\txt$,Len(cursorThis3DForm\txt$)-cursorpos) strleft$=strleft$+strright$ EndIf cursorpos=cursorpos-1 If cursorpos>0 cursorThis3DForm\txt$=strleft$ F3D_UpdateText(Handle(cursorThis3DForm),cursorThis3DForm\txt$) Else If Len(cursorThis3DForm\txt$)>1 cursorThis3DForm\txt$=strleft$ F3D_UpdateText(Handle(cursorThis3DForm),cursorThis3DForm\txt$) Else ;cursorThis3DForm\txt$=Chr$(32) ;F3D_UpdateText(Handle(cursorThis3DForm),cursorThis3DForm\txt$) cursorThis3DForm\txt$="" F3D_UpdateText(Handle(cursorThis3DForm),cursorThis3DForm\txt$) EndIf EndIf EndIf Else If Inputkey=13 cursorThis3DForm=Null cursorBlink=False If thisCursor.formInfo <> Null Then HideEntity thisCursor\mesh Else If Inputkey>31 And InputKey<128 strleft$=Left$(cursorThis3DForm\txt$,cursorpos) If Len(cursorThis3DForm\txt$)-cursorpos>0 strright$=Right$(cursorThis3DForm\txt$,Len(cursorThis3DForm\txt$)-cursorpos) cursorThis3DForm\txt$=strleft$+Chr$(Inputkey)+strright$ Else cursorThis3DForm\txt$=strleft$+Chr$(Inputkey) EndIf F3D_UpdateText(Handle(cursorThis3DForm),cursorThis3DForm\txt$) cursorpos=cursorpos+1 EndIf EndIf EndIf gInputkey=Inputkey EndIf Else cursorBlink=False If thisCursor.formInfo <> Null Then HideEntity thisCursor\mesh EndIf Return End Function ;################################################################### ;################################################################### ; Custom Functions ; F3D_Mouse Function F3D_Mouse(formXp,formYp,mousetex,mouseshadow=False,minpow=5,maxpow=8) Local mousepointer2.formInfo If mousetex=0 Restore F3D_MousePointer Read mtw Read mth mousetex=CreateTexture(mtw,mth,1+2+16+32+256) mtb=TextureBuffer(mousetex) SetBuffer mtb For j=0 To mth-1 For i=0 To mtw-1 Read mred Read mgreen Read mblue Color mred,mgreen,mblue Plot i,j Next Next SetBuffer BackBuffer() EndIf If mouseshadow=True mousepointer2Handle=F3D_CreateForm(0,0,FT_NAG,mousetex) mousepointer2.formInfo = Object.formInfo(mousepointer2Handle) mousepointer2\shadow=True F3D_VColor(Handle(mousepointer2),0,0,0,.3) EndIf mousepointerHandle=F3D_CreateForm(0,0,FT_NAG,mousetex) End Function ; F3D_Panel Function F3D_Panel(formXp,formYp,width,height,parent=0,minpow=5,maxpow=8) Local this3DForm.formInfo,qsize hcr=255 hcg=255 hcb=255 mcr=196 mcg=196 mcb=196 scr=64 scg=64 scb=64 If width>height qsize=width Else qsize=height EndIf temp=CreateImage(width,height) tempbuf=ImageBuffer(temp) SetBuffer tempbuf ClsColor 0,0,0 SetBuffer tempbuf Cls Color mcr,mcg,mcb Rect 0, 0, width-1, height-1, True Color hcr,hcg,hcb Line 0,0,0,height-1 Line 0,0,width-1,0 Color scr,scg,scb Line 0,height-1,width-1,height-1 Line width-1,0,width-1,height-1 SetBuffer BackBuffer() ; tex1=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(tex1) int_WritePixelWithAlpha(tempbuf,height,width,tibuf,qsize) FreeImage temp this3DFormHandle=F3D_CreateForm(formXp,formYp,FT_PANEL,tex1,0,0,0,parent,minpow,maxpow) this3DForm.formInfo = Object.formInfo(this3DFormHandle) this3DForm\width=width this3DForm\height=height Return Handle(this3DForm) End Function Function F3D_Button(formXp,formYp,width,height,highlight=False,parent=0,minpow=5,maxpow=8) Local this3DForm.formInfo,qsize hcr=255 hcg=255 hcb=255 mcr=196 mcg=196 mcb=196 scr=64 scg=64 scb=64 If width>height qsize=width Else qsize=height EndIf temp=CreateImage(width,height) tempbuf=ImageBuffer(temp) SetBuffer tempbuf ClsColor 0,0,0 SetBuffer tempbuf Cls Color mcr,mcg,mcb Rect 0, 0, width-1, height-1, True Color hcr,hcg,hcb Line 0,0,0,height-1 Line 0,0,width-1,0 Color scr,scg,scb Line 0,height-1,width-1,height-1 Line width-1,0,width-1,height-1 SetBuffer BackBuffer() ; tex1=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(tex1) int_WritePixelWithAlpha(tempbuf,height,width,tibuf,qsize) FreeImage temp ;texture 2 temp=CreateImage(width,height) tempbuf=ImageBuffer(temp) SetBuffer tempbuf ClsColor 0,0,0 SetBuffer tempbuf Cls Color mcr,mcg,mcb Rect 0, 0, width-1, height-1, True Color scr,scg,scb Line 0,0,0,height-1 Line 0,0,width-1,0 Color hcr,hcg,hcb Line 0,height-1,width-1,height-1 Line width-1,0,width-1,height-1 SetBuffer BackBuffer() ; tex2=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(tex2) int_WritePixelWithAlpha(tempbuf,height,width,tibuf,qsize) FreeImage temp If highlight=False this3DFormHandle=F3D_CreateForm(formXp,formYp,FT_NHPB,tex1,tex2,0,0,parent,minpow,maxpow) this3DForm.formInfo = Object.formInfo(this3DFormHandle) Else ;texture 3 temp=CreateImage(width,height) tempbuf=ImageBuffer(temp) SetBuffer tempbuf ClsColor 0,0,0 SetBuffer tempbuf Cls Color mcr+32,mcg+32,mcb+32 Rect 0, 0, width-1, height-1, True Color hcr,hcg,hcb Line 0,0,0,height-1 Line 0,0,width-1,0 Color scr,scg,scb Line 0,height-1,width-1,height-1 Line width-1,0,width-1,height-1 SetBuffer BackBuffer() ; tex3=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(tex3) int_WritePixelWithAlpha(tempbuf,height,width,tibuf,qsize) FreeImage temp this3DFormHandle=F3D_CreateForm(formXp,formYp,FT_HPB,tex1,tex2,tex3,0,parent,minpow,maxpow) this3DForm.formInfo = Object.formInfo(this3DFormHandle) EndIf this3DForm\width=width this3DForm\height=height Return Handle(this3DForm) End Function Function F3D_Toggle(formXp,formYp,width,height,highlight=False,parent=0,minpow=5,maxpow=8) Local this3DForm.formInfo,qsize hcr=255 hcg=255 hcb=255 mcr=196 mcg=196 mcb=196 scr=64 scg=64 scb=64 If width>height qsize=width Else qsize=height EndIf temp=CreateImage(width,height) tempbuf=ImageBuffer(temp) SetBuffer tempbuf ClsColor 0,0,0 SetBuffer tempbuf Cls Color mcr,mcg,mcb Rect 0, 0, width-1, height-1, True Color hcr,hcg,hcb Line 0,0,0,height-1 Line 0,0,width-1,0 Color scr,scg,scb Line 0,height-1,width-1,height-1 Line width-1,0,width-1,height-1 SetBuffer BackBuffer() ; tex1=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(tex1) int_WritePixelWithAlpha(tempbuf,height,width,tibuf,qsize) FreeImage temp ;texture 2 temp=CreateImage(width,height) tempbuf=ImageBuffer(temp) SetBuffer tempbuf ClsColor 0,0,0 SetBuffer tempbuf Cls Color mcr,mcg,mcb Rect 0, 0, width-1, height-1, True Color scr,scg,scb Line 0,0,0,height-1 Line 0,0,width-1,0 Color hcr,hcg,hcb Line 0,height-1,width-1,height-1 Line width-1,0,width-1,height-1 SetBuffer BackBuffer() ; tex2=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(tex2) int_WritePixelWithAlpha(tempbuf,height,width,tibuf,qsize) FreeImage temp If highlight=False this3DFormHandle=F3D_CreateForm(formXp,formYp,FT_NHT,tex1,tex2,0,0,parent,minpow,maxpow) this3DForm.formInfo = Object.formInfo(this3DFormHandle) Else ;texture 3 temp=CreateImage(width,height) tempbuf=ImageBuffer(temp) SetBuffer tempbuf ClsColor 0,0,0 SetBuffer tempbuf Cls Color mcr+32,mcg+32,mcb+32 Rect 0, 0, width-1, height-1, True Color hcr,hcg,hcb Line 0,0,0,height-1 Line 0,0,width-1,0 Color scr,scg,scb Line 0,height-1,width-1,height-1 Line width-1,0,width-1,height-1 SetBuffer BackBuffer() ; tex3=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(tex3) int_WritePixelWithAlpha(tempbuf,height,width,tibuf,qsize) FreeImage temp ;texture 4 temp=CreateImage(width,height) tempbuf=ImageBuffer(temp) SetBuffer tempbuf ClsColor 0,0,0 SetBuffer tempbuf Cls Color mcr+32,mcg+32,mcb+32 Rect 0, 0, width-1, height-1, True Color scr,scg,scb Line 0,0,0,height-1 Line 0,0,width-1,0 Color hcr,hcg,hcb Line 0,height-1,width-1,height-1 Line width-1,0,width-1,height-1 SetBuffer BackBuffer() ; tex4=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(tex4) int_WritePixelWithAlpha(tempbuf,height,width,tibuf,qsize) FreeImage temp this3DFormHandle=F3D_CreateForm(formXp,formYp,FT_HT,tex1,tex2,tex3,tex4,parent,minpow,maxpow) this3DForm.formInfo = Object.formInfo(this3DFormHandle) EndIf this3DForm\width=width this3DForm\height=height Return Handle(this3DForm) End Function Function F3D_Input(txt$,formXp,formYp,width,thisFontHandle,textrect=False,parent=0,minpow=5,maxpow=8) Local qsize Local this3DForm.formInfo Local thisCursor.formInfo Local thisFont.fontInfo thisFont.fontInfo = Object.fontInfo( thisFontHandle ) F3D_SetFont(thisFontHandle) FlushKeys() this3DFormHandle=F3D_CreateText(txt$,formXp,formYp,width) this3DForm.formInfo = Object.formInfo(this3DFormHandle) this3DForm\thisFont=thisFont this3DForm\formtype=FT_INPUT this3DForm\active=False ; create a cursor graphic for use with input If cursorHandle=0 If FontWidth()>FontHeight() qsize=FontWidth() Else qsize=FontHeight() EndIf temp=CreateImage(FontWidth(),FontHeight()) tempbuf=ImageBuffer(temp) SetBuffer tempbuf ClsColor 0,0,0 SetBuffer tempbuf Cls Color 221,170,136 Line 0,0,0,FontHeight()-1 SetBuffer BackBuffer() ; cursortex=CreateTexture(qsize,qsize,1+2+16+32+256) tibuf=TextureBuffer(cursortex) int_WritePixelWithAlpha(tempbuf,FontHeight(),FontWidth(),tibuf,qsize) FreeImage temp cursorHandle=F3D_CreateForm(0,0,FT_NAG,cursortex) thisCursor.formInfo = Object.formInfo(cursorHandle) thisCursor\visible = False HideEntity thisCursor\mesh EndIf Return Handle(this3DForm) End Function ;################################################################### ;################################################################### ; Set fps vars Function int_ManualAlpha(texbuffer,texsize) ; manually alpha out texture LockBuffer texbuffer For jj=0 To texsize-1 For ii=0 To texsize-1 val=ReadPixelFast(ii,jj,texbuffer) If Str(val And $00FFFFFF)="0" WritePixelFast ii,jj,$00FFFFFF,texbuffer EndIf Next Next UnlockBuffer texbuffer End Function Function int_WritePixelWithAlpha(tempbuffer,height,width,texbuffer,texsize) LockBuffer tempbuffer LockBuffer texbuffer For jj=0 To texsize-1 For ii=0 To texsize-1 If jj<height And ii<width val=ReadPixelFast(ii,jj,tempbuffer) Else val=0 EndIf If Str(val And $00FFFFFF)="0" WritePixelFast ii,jj,$00FFFFFF,texbuffer Else WritePixelFast ii,jj,val,texbuffer;$00FFFFFF,tibuf EndIf Next Next UnlockBuffer texbuffer UnlockBuffer tempbuffer End Function Function int_Add2zList(this3DFormHandle,thisParentHandle=0) Local thisParent.formInfo Local this3DForm.formInfo this3DForm.formInfo = Object.formInfo(this3DFormHandle) If(thisParentHandle=0) ; ## Set non parent ## zList.zOrder = New zOrder zList\this3DForm = this3DForm int_CleanZOrder() Else ; ### Set Parent/Child Info ### ; Set parent info thisParent.formInfo = Object.formInfo(thisParentHandle) this3DForm\parent=thisParent ; ### NEW PARENT ### ; if new parent has 0 children, must be still in zList... ; take it out of there and put it in the zPList... If thisParent\numchildren=0 ;delete parent from zList to be put into zPList For zList.zOrder = Each zOrder If zList\this3DForm = thisParent Delete zList Exit EndIf Next ; Place New Parent into zPList zPList.zParentOrder = New zParentOrder zPList\thisParent = thisParent EndIf ; ### NEW CHILD ### thisParent\numchildren=thisParent\numchildren+1 this3DForm\childpos=thisParent\numchildren ResizeBank thisParent\childbank,thisParent\numchildren*4 PokeInt thisParent\childbank,thisParent\numchildren*4-4,Handle(this3DForm) int_CleanZOrder() EndIf End Function Function int_CleanZOrder() Local thisChild.formInfo, thisChildHandle Local zListPos zListPos=-2 ; set zList position for zPList starting position For zList.zOrder = Each zOrder zListPos=zListPos-1 zList\this3DForm\zorder=zListPos EntityOrder zList\this3DForm\mesh,zList\this3DForm\zorder Next For zPList.zParentOrder = Each zParentOrder zListPos=zListPos-1 zPList\thisParent\zorder=zListPos EntityOrder zPList\thisParent\mesh,zPList\thisParent\zorder zListPos=zListPos-zPList\thisParent\numchildren ; set children zorder For childlist=1 To zPList\thisParent\numchildren thisChildHandle=PeekInt(zPList\thisParent\childbank,childlist*4-4) thisChild.formInfo = Object.formInfo(thisChildHandle) thisChild\zorder=zPList\thisParent\zorder-thisChild\childpos EntityOrder thisChild\mesh,thisChild\zorder Next Next int_gCURRENTZORDERPOS=zListPos End Function Function int_UpdateMouseZOrder() ; validate mouse hack Local mousepointer.formInfo Local mousepointer2.formInfo mousepointer.formInfo = Object.formInfo(mousepointerHandle) mousepointer2.formInfo = Object.formInfo(mousepointer2Handle) mousepointer\zorder=int_gCURRENTZORDERPOS-2 EntityOrder mousepointer\mesh,mousepointer\zorder If mousepointer2\shadow=True mousepointer2\zorder=int_gCURRENTZORDERPOS-1 EntityOrder mousepointer2\mesh,mousepointer2\zorder EndIf End Function ; ext_WriteTextureData ; ? look at F3D_Mouse code on how to read the data Function ext_WriteTextureData(ext_texturefilename$,ext_labelname$) Local ext_mstr$ Local ext_tex ext_fileout=WriteFile(ext_labelname$+".txt") WriteLine(ext_fileout,"."+ext_labelname$+Chr$(13)) ext_tex=LoadTexture(ext_texturefilename$,1+2+16+32+256) ext_tbmt=TextureBuffer(ext_tex) SetBuffer ext_tbmt ext_mtwidth=TextureWidth(ext_tex) ext_mtheight=TextureHeight(ext_tex) WriteLine(ext_fileout,"Data "+ext_mtwidth+","+ext_mtheight+Chr$(13)) For j=0 To ext_mtheight-1 ext_mstr$="Data " For i=0 To ext_mtwidth-1 GetColor i,j ext_mstr$=ext_mstr$+ColorRed()+","+ColorGreen()+","+ColorBlue() If i<ext_mtwidth-1 ext_mstr$=ext_mstr$+"," EndIf Next ext_mstr$=ext_mstr$+Chr$(13) WriteLine(ext_fileout,ext_mstr$) Next SetBuffer BackBuffer() CloseFile ext_fileout End Function .F3D_MousePointer Data 32,32 Data 16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,255,255,255,16,16,16,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,255,255,255,16,16,16,16,16,16,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,255,255,255,16,16,16,0,0,0,0,0,0,16,16,16,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,16,16,16,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,255,255,255,255,255,255,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 An example of gadgets: F3D_Example2.bb Include "Form3D.bb" ;################################################################### ;################################################################### ; Set fps vars Global newtime#=MilliSecs() Global oldtime#=newtime# Global AdjTime#=(MilliSecs()/1000.0)-newtime# Global tick=0 Global myfps=0 Function fps() AdjTime# = (MilliSecs()-newtime#)/1000.0 newtime# = MilliSecs() If (newtime#-oldtime#)>1000 oldtime=newtime myfps=tick tick=0 EndIf tick=tick+1 End Function ;################################################################### ;################################################################### ; Setup Graphics3D 640,480,32,2 HidePointer SetBuffer BackBuffer() light=CreateLight() Global camera camera=CreateCamera() CameraRange camera,1,10000 PositionEntity camera,0,0,0 CameraClsColor camera,0,96,128 F3D_Setup(camera) ;; Font Type Handles Global myfont1 Global myfont2 ; First Create A Font to use with displaying text with ; ex: "courier new", font size of 16, 16x16 spaced in a 256x256 texture myfont1=F3D_CreateFont("courier new",16,16,16,256) myfont2=F3D_CreateFont("blitz",24,32,32,512) ; Create static text Global textmesh Global textmesh2 txt$="Form3D - A Pixel Perfect 3D GUI Library" F3D_SetFont(myfont2) textmesh=F3D_CreateText(txt$,12,22,StringWidth(txt$)) textmesh2=F3D_CreateText(txt$,10,20,StringWidth(txt$)) F3D_VColor(textmesh,0,0,0) F3D_VColor(textmesh2,0,255,0) F3D_SetFont(myfont1) ; Create text to be updated Global tmfps myfps=8888 txt$="FPS="+myfps tmfps=F3D_CreateText(txt$,0,0,StringWidth(txt$)) F3D_VColor(tmfps,255,255,0) ;Global mousetex ;mousetex=LoadTexture("pointer1.bmp",1+2+16+32+256) ;F3D_Mouse(0,0,mousetex,True) ; Create and use Form3D's mouse graphic F3D_Mouse(0,0,0,True) ;Global buttex1,buttex2,buttex3,buttex4 ;buttex1=LoadTexture("buttonup.bmp",1+2+16+32+256) ;buttex2=LoadTexture("buttondown.bmp",1+2+16+32+256) ;buttex3=LoadTexture("buttonuph.bmp",1+2+16+32+256) ;buttex4=LoadTexture("buttondownh.bmp",1+2+16+32+256) ;Global togtex1,togtex2,togtex3,togtex4 ;togtex1=LoadTexture("togglegreen.bmp",1+2+16+32+256) ;togtex2=LoadTexture("togglered.bmp",1+2+16+32+256) ;togtex3=LoadTexture("togglegreenh.bmp",1+2+16+32+256) ;togtex4=LoadTexture("toggleredh.bmp",1+2+16+32+256) ;Global button1, b1state ;Global button2, b2state ;Global button3, b3state ;Global button4, b4state ;button1=F3D_CreateForm(50,50,FT_NHPB,buttex1,buttex2) ;b1state=F3D_CreateText("##",120,50,StringWidth("##")) ;button2=F3D_CreateForm(50,150,FT_NHT,buttex1,buttex2) ;b2state=F3D_CreateText("##",120,150,StringWidth("##")) ;button3=F3D_CreateForm(50,250,FT_HT,togtex1,togtex2,togtex3,togtex4) ;b3state=F3D_CreateText("##",120,250,StringWidth("##")) ;button4=F3D_CreateForm(50,350,FT_HPB,buttex1,buttex4,buttex3) ;b4state=F3D_CreateText("##",120,350,StringWidth("##")) Global autobutton1, abstate1 autobutton1=F3D_Button(250,50,128,32,True) abstate1=F3D_CreateText("##",200,50,StringWidth("##")) F3D_VColor(abstate1,0,255,255) Global autotoggle1, atstate1 autotoggle1=F3D_Toggle(250,100,32,32,True) atstate1=F3D_CreateText("##",200,100,StringWidth("##")) F3D_VColor(atstate1,0,255,255) Global autopanel1, apstate1, static1 autopanel1=F3D_Panel(250,200,200,200) apstate1=F3D_CreateText("##",200,200,StringWidth("##")) F3D_VColor(apstate1,0,255,255) static1=F3D_CreateText("Testing Parent 1",260,210,StringWidth("Testing Parent 1"),0,autopanel1) F3D_VColor(static1,32,32,32) Global autopanel2, apstate2, static2 autopanel2=F3D_Panel(350,300,200,200) apstate2=F3D_CreateText("##",200,300,StringWidth("##")) F3D_VColor(autopanel2,200,200,255) F3D_VColor(apstate2,0,255,255) static2=F3D_CreateText("Testing Parent 2",360,310,StringWidth("Testing Parent 2"),0,autopanel2) F3D_VColor(static2,32,32,32) ;################################################################### ;################################################################### ; MAIN loop While Not KeyHit(1) UpdateWorld RenderWorld F3D_UpdateGui() ; gui interaction ;F3D_UpdateText(b1state,F3D_GetState(button1)) ;F3D_UpdateText(b2state,F3D_GetState(button2)) ;F3D_UpdateText(b3state,F3D_GetState(button3)) ;F3D_UpdateText(b4state,F3D_GetState(button4)) F3D_UpdateText(abstate1,F3D_GetState(autobutton1)) F3D_UpdateText(atstate1,F3D_GetState(autotoggle1)) F3D_UpdateText(apstate1,F3D_GetState(autopanel1)) F3D_UpdateText(apstate2,F3D_GetState(autopanel2)) fps() F3D_UpdateText(tmfps,"FPS="+myfps) Flip False Wend End An example of input: F3D_Example3.bb Include "Form3D.bb" ;################################################################### ;################################################################### ; Setup Graphics3D 640,480,32,2 HidePointer SetBuffer BackBuffer() light=CreateLight() Global camera camera=CreateCamera() CameraRange camera,1,10000 PositionEntity camera,0,0,0 CameraClsColor camera,0,96,128 ; Need to setup Form3D to be able to place 3d forms corretly F3D_Setup(camera) ; Set fps vars Global newtime#=MilliSecs() Global oldtime#=newtime# Global AdjTime#=(MilliSecs()/1000.0)-newtime# Global tick=0 Global myfps=0 ;; Font Handles Global myfont1 Global myfont2 ; First Create A Font to use with displaying text with ; ex: "courier new", font size of 16, 16x16 spaced in a 256x256 texture myfont1=F3D_CreateFont("courier new",16,16,16,256) myfont2=F3D_CreateFont("blitz",24,32,32,512) ; Create static text Global textmesh Global textmesh2 txt$="Form3D - Testing Input" F3D_SetFont(myfont2) textmesh=F3D_CreateText(txt$,52,12,StringWidth(txt$)) textmesh2=F3D_CreateText(txt$,50,10,StringWidth(txt$)) F3D_VColor(textmesh,0,0,0) F3D_VColor(textmesh2,0,255,0) F3D_SetFont(myfont1) ; Create FPS text Global tmfps txt$="FPS=" tmfps=F3D_CreateText(txt$,0,0,128) F3D_VColor(tmfps,255,255,0) ; Create and use Form3D's mouse graphic F3D_Mouse(0,0,0,True) ; Create Input (!!!Not fully Implemented yet!!! ) Global autoInput1, aInputstate1 autoInput1=F3D_Input("Input Test",200,250,240,myfont1,True) aInputstate1=F3D_CreateText("##",125,250,StringWidth("##")) F3D_VColor(aInputstate1,0,255,255) Global autoInput2, aInputstate2 autoInput2=F3D_Input("Input Test 2",200,270,240,myfont1,True) aInputstate2=F3D_CreateText("##",125,270,StringWidth("##")) F3D_VColor(aInputstate2,0,255,255) Global akeyinputstate akeyinputstate=F3D_CreateText("Key input = ###",125,290,StringWidth("Key input = ###")) F3D_VColor(akeyinputstate,0,255,255) Global acurtxt acurtxt=F3D_CreateText("cursorThis3DForm\txt$",125,330,StringWidth("cursorThis3DForm\txt$")) F3D_VColor(acurtxt,0,255,255) ;Global valCursorBlinkTime,valCursorBlink,valCursorBlinkDelay ;valCursorBlinkTime=F3D_CreateText("cursorBlinkTime=#######",10,50,StringWidth("cursorBlinkTime=#######")) ;valCursorBlink=F3D_CreateText("cursorBlink=#######",10,70,StringWidth("cursorBlink=#######")) ;valCursorBlinkDelay=F3D_CreateText("cursorBlinkDelay=#######",10,90,StringWidth("cursorBlinkDelay=#######")) ;################################################################### ;################################################################### ; MAIN loop Global thisL3DForm.formInfo While Not KeyHit(1) UpdateWorld RenderWorld F3D_UpdateGui() ; gui interaction F3D_UpdateText(aInputstate1,F3D_GetState(autoInput1)) F3D_UpdateText(aInputstate2,F3D_GetState(autoInput2)) F3D_UpdateText(akeyinputstate,"Key input="+gInputkey) ;F3D_UpdateText(valCursorBlinkTime,"cursorBlinkTime="+cursorBlinkTime) ;F3D_UpdateText(valCursorBlink,"cursorBlink="+cursorBlink) ;F3D_UpdateText(valCursorBlinkDelay,"cursorBlinkDelay="+cursorBlinkDelay) If cursorThis3DForm<>Null F3D_UpdateText(acurtxt,cursorThis3DForm\txt$) EndIf fps() F3D_UpdateText(tmfps,"FPS="+myfps) Flip False Wend End ;################################################################### ;################################################################### ; Functions Function fps() AdjTime# = (MilliSecs()-newtime#)/1000.0 newtime# = MilliSecs() If (newtime#-oldtime#)>1000 oldtime=newtime myfps=tick tick=0 EndIf tick=tick+1 End Function |
.. |