*.B3D Textures ignore the VertexNormal

Blitz3D Forums/Blitz3D Programming/*.B3D Textures ignore the VertexNormal

Jürgen(Posted 2003) [#1]
In *.B3D there is the ability to store the VertexNormals for each Vertex in the file. But Blitz only loads the Vertexes for non-textured surfaces ... textured surfaces are simply full-bright (but The FX-Value is 0)
I could post the code if it would help you...


TeraBit(Posted 2003) [#2]
Are you talking about vertex normals or vertex colors? Go ahead, post the code if it will make it more clear..


Jürgen(Posted 2003) [#3]
I'm only talking about the vertex normals.

Here's the code (you can be shure that the functions ChunkEnd, Chunkbegin, WriteStringC are working correctly)

Dim ChunkStart(100) :Global chunkebene=0

function ExportIt(mesh)         ;I call this function
name$="sample.b3d"
file=WriteFile(name$)
If file=0 Then Return

ChunkBegin(file,"BB3D")
  WriteInt(file,1)      ;version
  ChunkBegin(file,"TEXS")              ;-----Textures-------------
  For i=1 To texcount                      ;there are about 3 textures
    WriteStringC(file,texname$(i))            ;name  (a field of texturenames)
    masked=4+1
    WriteInt(file,masked)                ;flags (alpha..)
    WriteInt(file,1)                     ;blend 1
    WriteFloat(file,0)                   ;X    ;def:0
    WriteFloat(file,0)                   ;Y
    WriteFloat(file,1)                   ;X Scale ;def:1
    WriteFloat(file,1)                   ;Y Scale
    WriteFloat(file,0)                   ;Rotation
  Next
  ChunkEnd(file)                       ;-----Textures end---------
  ChunkBegin(file,"BRUS")              ;+++++Brush++++++++++++++++
  WriteInt(file,1)                     ;1 textures per brush
  WriteStringC(file,"Default")         ;Dname
  WriteFloat(file,1)		       ;Dred
  WriteFloat(file,0.3)       	       ;Dgreen
  WriteFloat(file,0.3)	               ;Dblue
  WriteFloat(file,1)		       ;Dalpha
  WriteFloat(file,0)   		       ;Dshininess
  WriteInt(file,0)		       ;Dblend
  WriteInt(file,0)		       ;DFX
  WriteInt(file,-1)                    ;DTextureNr (-1=no?)
  For i=1 To texcount
    WriteStringC(file,"Brush"+i)      ;name
    WriteFloat(file,0)	              ;red
    WriteFloat(file,0)                ;green
    WriteFloat(file,0)	              ;blue
    WriteFloat(file,1)                ;alpha
    WriteFloat(file,0)                ;shininess
    WriteInt(file,0)                  ;blend
    WriteInt(file,0)                  ;FX
    WriteInt(file,i-1)                 ;TextureNr (from 0)
  End If
  Next
  ChunkEnd(file)                    ;End of BRUS chunk
  ChunkBegin(file,"NODE" )          ;+++++Entities+++++++++++++
    WriteStringC(file,"TheEntity")     ;name
    WriteFloat(file,0)                 ;x
    WriteFloat(file,0)    	       ;y
    WriteFloat(file,0)                 ;z
    WriteFloat(file,1)	               ;x_scale
    WriteFloat(file,1)	               ;y_scale
    WriteFloat(file,1)	               ;z_scale
    WriteFloat(file,1)	               ;rot_w
    WriteFloat(file,0)	               ;rot_x
    WriteFloat(file,0)	               ;rot_y
    WriteFloat(file,0)	               ;rot_z
    ChunkBegin(file,"MESH")         ;+++++Meshes+++++++++++++++
      WriteInt(file,-1)		      ;no 'entity' brush
      ChunkBegin(file,"VRTS" )      ;+++++Vertexes+++++++++++++
        WriteInt(file,1 )			;flags - 0=no 1=with normals / 2=with color
        WriteInt(file,1 )			;1 tex_coord sets
        WriteInt(file,2 )			;2 coords per set
        surfacecount=CountSurfaces(mesh)
        For k=1 To surfacecount
          surf=GetSurface(mesh,k )
          vertexcount=CountVertices( surf )-1
          For j=0 To vertexcount
            TFormPoint VertexX(surf,j),VertexY(surf,j),VertexZ(surf,j),stone(i),0
            WriteFloat(file,TFormedX() )       ;X
            WriteFloat(file,TFormedY() )       ;Y
            WriteFloat(file,TFormedZ() )       ;Z
            WriteFloat(file,VertexNX#(surf,j))     ;NormalX
            WriteFloat(file,VertexNY#(surf,j))      ;NormalY
            WriteFloat(file,VertexNZ#(surf,j))      ;NormalZ
            WriteFloat(file,VertexU( surf,j ) );TextureU
            WriteFloat(file,VertexV( surf,j ) );TextureV
          Next
        Next
      ChunkEnd(file)                ;-----Vertexes end---------
      first_vert=0
      surfacecount=CountSurfaces(mesh)
      For k=1 To surfacecount
        surf=GetSurface( mesh,k )
        triscount=CountTriangles( surf )-1
        ChunkBegin(file,"TRIS" )    ;++++++Tris++++++++++++++++
        WriteInt(file,SurfaceTexNr(k) )	        ;The Textur Nr corresponds to the brush number (they go from 1 to texquantity)
        For j=0 To triscount
          WriteInt(file,first_vert+TriangleVertex( surf,j,0 ) )
          WriteInt(file,first_vert+TriangleVertex( surf,j,1 ) )
          WriteInt(file,first_vert+TriangleVertex( surf,j,2 ) )
        Next
        ChunkEnd(file)              ;-----Tris end------------
        first_vert=first_vert+CountVertices( surf )
      Next
    ChunkEnd(file)                  ;-----Mesh end------------
  ChunkEnd(file)                    ;-----Entity end----------                  
ChunkEnd(file)	                    ;-----BB3D end------------
CloseFile file
End Function

;***********************************
Function ChunkBegin(file,tag$)
	chunkebene=chunkebene+1
	For k=1 To 4
		WriteByte(file,Asc(Mid$( tag$,k,1 )))
	Next
	WriteInt(file,0)
	ChunkStart(ChunkEbene)=FilePos(file)
End Function
;**********************************
Function ChunkEnd(file)
    aha=ChunkStart(ChunkEbene)
	n=FilePos(file)
	SeekFile file,ChunkStart(ChunkEbene)-4
	WriteInt(file,n-ChunkStart(ChunkEbene))
	SeekFile file,n
	ChunkEbene=ChunkEbene-1
End Function
;*********************************
Function WriteStringC(file,t$)
	For k=1 To Len( t$ )
		ch=Asc(Mid$(t$,k,1))
		WriteByte(file,ch)
		If ch=0 Return
	Next
	WriteByte(file,0)
End Function



;I've shortened the code a bit for you, so there could be
some typing errors. The Exportfunktion does it's stuff very
well, it even exports the right textures and right
coordinates, except the problem, that masking doesn't work
and that Vertex Normals don't work with Textured Surfaces.

;(To write this I used Marks makeb3d.bb)



Drago(Posted 2003) [#4]
looking at the code you have all normals set to -1,0,0 is this what you want?


Jürgen(Posted 2003) [#5]
Sorry, that was only a normal test, I've corrected this above now.

I want to point out the fact that untextured entities make all the vertexNormal-stuff as they should, so the program works in general and there are no big typing errors, but the same object with a texture is fullbright.

[in my main code I simply write xyz=LoadMesh("sample.b3d") ]