FREE - 3D Text System based on Single Surface

Blitz3D Forums/Blitz3D Programming/FREE - 3D Text System based on Single Surface

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Cool, I have dones as you said, and yep, it works, awesome, here is the code, and many many thanks.

I will tidy up, make generic and document for all to use

;      Standard, used for 3D Calculations
Type vector
	Field	x#
	Field	y#
	Field	z#
End Type

;   Mesh (or emitter) for lettersprites
Type text3D_lettermesh
	Field mesh%
	Field surface%
	field ent%
end type

;   Sprites
Type text3D_lettersprite
     field index%
     field pos.vector
     field movex#
     field movey#
end type

;   640x480
global nScale#=.005

Graphics3D 640,480,32,0

SetBuffer BackBuffer()

camera=CreateCamera()
;cameraclscolor camera,255,0,0
CameraRange camera, 0.1, 0.2
CameraClsMode camera, False, False
EntityOrder camera, -1

mylettermesh.text3D_lettermesh = Text3D_CreateLetterMesh("letters2.bmp")

cube=createcube()
positionentity cube,0,0,3

maincamera=createcamera()
positionentity maincamera,0,0,-6

scalemesh mylettermesh\mesh,.005,.005,1
;PositionEntity mylettermesh\mesh,0,0,.1
;moveentity camera,0,0,-5

;for mycount = 1 to 2
restore robdata

read x$
n%=0


for z%=1 to len(x$)
     if mid$(x$,z%,1) <> " "

     	for b%=0 to 23
	      myletter.text3D_lettersprite = Text3D_AddLetter(mylettermesh,n%,b%,0,rnd(0,255),rnd(0,255),rnd(0,255))
	      Text3D_SetLetter(mylettermesh,myletter,asc(mid$(x$,z%,1)))
       	      Text3D_PositionLetter mylettermesh,myletter,rnd(0,39),rnd(0,24)
	next

      end if
       n% = n% + 1
next

;next


   nStart%=millisecs()
While Not KeyHit(1)

   ;TurnEntity mylettermesh\mesh,0,0,.3



   ;if keyhit(57)
   nCount%=0
   for o.text3D_lettersprite = each text3D_letterSprite
       nCount%=nCount%+1
       r%=r%+1
       if r>255 then r=0
       ;Text3D_ColorLetter mylettermesh,o,rnd(0,255),rnd(0,255),rnd(0,255)
       Text3D_PositionLetter mylettermesh,o,o\pos\x+o\movex,o\pos\y+o\movey
       if o\pos\y > 24 then o\movey=-o\MoveY
       if o\pos\y <0 then o\movey=-o\movey
       if o\pos\x <0 then o\movex=-o\movex
       if o\pos\x >39 then o\movex=-o\movex
   next
   ;end if
   if keydown(200)
      moveentity maincamera,0,0,.1
   end if
   if millisecs()-nStart% > 1000
      nFPS=nCounter
      nCounter = 0
      nStart=millisecs()
   end if
   turnentity cube,0,1,1
   UpdateWorld
   RenderWorld
   text 0,0,nCount%
   text 0,16,nFPS
   nCounter = nCounter + 1
   Flip

Wend
End

function Text3D_SetLetter(mylettermesh.text3D_lettermesh,myletter.text3D_lettersprite,nAsc%)

      nAsc% = nAsc% - 33
      ny% = nAsc%/8
      nx% = nAsc% - (ny%*8)
      u# = nx% * .125
      v# = ny% * .125

      VertexTexCoords(mylettermesh\surface,myletter\index,u#,v#)
      VertexTexCoords(mylettermesh\surface,myletter\index+1,u#+.125,v#)
      VertexTexCoords(mylettermesh\surface,myletter\index+2,u#+.125,v#+.125)
      VertexTexCoords(mylettermesh\surface,myletter\index+3,u#,v#+.125)


end function

function Text3D_CreateLetterMesh.text3d_lettermesh(strTexture$)

	 t.text3D_lettermesh = new text3D_lettermesh

	 t\ent = createpivot(camera)
	 moveentity t\ent,0,0,.1
	 t\mesh = createmesh(t\ent)
	 t\surface = createsurface(t\mesh)

	 Tex=LoadTexture(strTexture$,4)
         brush=CreateBrush()
         BrushFX brush,3
	 BrushTexture brush,tex
         PaintMesh t\mesh,brush
	 freebrush brush
	 freetexture tex

	 return t



end function

function Text3D_AddLetter.text3D_lettersprite(t.text3D_lettermesh,x#,y#,z#,r%=255,g%=255,b%=255)

   ;nOffset#=.5
   mytempletter.text3D_lettersprite = new text3D_lettersprite
   ;X# = X# - 20
   ;Y#=(14-(Y#*1.25))
   i%=AddVertex(t\surface,x#-1+nOffset#,y#+1+nOffset#,0, 0,0)
   AddVertex t\surface,x#+1+nOffset#,y#+1+nOffset#,0, .125,0
   AddVertex t\surface,x#+1+nOffset#,y#-1+nOffset#,0, .125,.125
   AddVertex t\surface,x#-1+nOffset#,y#-1+nOffset#,0, 0,.125

   AddTriangle t\surface,i%+0,i%+1,i%+2
   AddTriangle t\surface,i%+0,i%+2,i%+3

   UpdateNormals t\mesh
   mytempletter\index = i%

   Text3D_ColorLetter(t,mytempletter,r,g,b)
   mytempletter\pos = new vector
   Text3D_PositionLetter(t,mytempletter,rnd(0,39),rnd(0,24))
   mytempletter\movex=rnd(-.5,.5)
      mytempletter\movey=rnd(-.5,.5)


   return mytempletter

 end function

function Text3D_ColorLetter(t.text3D_lettermesh,l.text3D_lettersprite,r%,g%,b%,gradient%=false)

	 vertexcolor t\surface,l\index,255,255,255
	 vertexcolor t\surface,l\index+1,255,255,255
	 vertexcolor t\surface,l\index+2,r%,g%,b%
	 vertexcolor t\surface,l\index+3,r%,g%,b%

end function

 
Function Text3D_PositionLetter (t.text3D_lettermesh,l.text3D_lettersprite, x#,y#)

            l\pos\x = x#
   l\pos\y = y#
   l\pos\z = 0

    	 nOffset#=.5*nScale
    	 X# = X# - 20
   	 Y#=(14-(Y#*1.25))

	 x#=x#*nScale
    	 y#=y#*nScale
	 nInc#=nScale

	VertexCoords t\surface,l\index,x-nInc+nOffset,y+nInc+nOffset, 0
	VertexCoords t\surface,l\index+1,x+nInc+nOffset,y+nInc+nOffset, 0
	VertexCoords t\surface,l\index+2,x+nInc+nOffset,y-nInc+nOffset, 0
	VertexCoords t\surface,l\index+3,x-nInc+nOffset,y-nInc+nOffset, 0



End Function

.robdata
data "0123456789012345678901234567890123456789"