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.

Hi,

I am almost complete in writing my 3D text system based on a single surface.

Image to download is here:

Download...

or right click on this image and save as "letters2.bmp"



Now, the problem is, this works fine when working with the camera at 0,0,0.

But, as soon as I move the camera, the letter dissapear.

In fact, even if i entityparent it, still it dissapears.

It is something to do with TForming the CAMERA and subtracting the vertexcoards from it, but my head hurts.

PLEASE SOLVE THIS FOR ME !!! ;-)

Many thanks

;      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%
end type

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

;   640x480
global nScale#=.005

Graphics3D 640,480,32,3

SetBuffer BackBuffer()

camera=CreateCamera()
cameraclscolor camera,255,0,0
CameraRange camera, 0.1, 1000

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


scalemesh mylettermesh\mesh,.005,.005,1
PositionEntity mylettermesh\mesh,0,0,.1
;positionentity camera,0,0,-5
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


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


While Not KeyHit(1)

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

   nStart%=millisecs()

   ;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,rnd(0,39),rnd(0,23)
   next
   ;end if
   nStart%=millisecs()=nStart%
   turnentity cube,0,1,1
   UpdateWorld
   RenderWorld
   text 0,0,nCount%
   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\mesh = createmesh()
	 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))



   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"