Weird texture problem!

Blitz3D Forums/Blitz3D Programming/Weird texture problem!

Ok, here's the test app.
Graphics3D 640,480,32,2
SetBuffer BackBuffer()
; Test APP: testing a mesh for Clone Triangles.
; Use a decorator mesh with about 10k Tris to test. Also it needs to be one that was 
; edited in about 10 or more Decorator sessions (save, then restart Decorator) and has multiple surfaces/textures.

mesh_name$="camp2_dec18weld2.b3d"

mesh=LoadMesh(mesh_name$)

;Goto test_walk


surfs=CountSurfaces(mesh)

Dim s(surfs),s2(surfs),tris(surfs),brush(surfs),texturepath$(surfs,1)
Dim same(100000,3)
same_count=0

b=1000

seenflag=990

Print "surfaces: "+ surfs

; --------------------- first read all surfaces and triangle data to some arrays and banks ---------
For i=1 To surfs

 s(i)=GetSurface(mesh,i)
 bru=GetSurfaceBrush(s(i))
 brush(i)=bru

 texture=GetBrushTexture( bru,0)
 name$=TextureName$(texture)
 texturepath$(i,0)=name$
 FreeTexture texture

 texture=GetBrushTexture( bru,1)
 name$=TextureName$(texture)
 texturepath$(i,1)=name$
 FreeTexture texture

 Print texturepath$(i,0)
 Print texturepath$(i,1)

 Print "surface "+i+" has "+CountTriangles(s(i))+" tris"
 tris(i)=CreateBank(CountTriangles(s(i))*b)
 total_tris=total_tris+CountTriangles(s(i))
 For j=0 To CountTriangles(s(i))-1

  PokeFloat tris(i),(j*b)+  0,VertexX		(s(i),TriangleVertex(s(i),j,0))
  PokeFloat tris(i),(j*b)+  4,VertexY		(s(i),TriangleVertex(s(i),j,0))
  PokeFloat tris(i),(j*b)+  8,VertexZ		(s(i),TriangleVertex(s(i),j,0))
  PokeFloat tris(i),(j*b)+ 12,VertexU		(s(i),TriangleVertex(s(i),j,0),0)
  PokeFloat tris(i),(j*b)+ 16,VertexV		(s(i),TriangleVertex(s(i),j,0),0)
  PokeFloat tris(i),(j*b)+ 20,VertexU		(s(i),TriangleVertex(s(i),j,0),1)
  PokeFloat tris(i),(j*b)+ 24,VertexV		(s(i),TriangleVertex(s(i),j,0),1)
  PokeFloat tris(i),(j*b)+ 28,VertexNX		(s(i),TriangleVertex(s(i),j,0))
  PokeFloat tris(i),(j*b)+ 32,VertexNY		(s(i),TriangleVertex(s(i),j,0))
  PokeFloat tris(i),(j*b)+ 36,VertexNZ		(s(i),TriangleVertex(s(i),j,0))
  PokeFloat tris(i),(j*b)+ 40,VertexRed		(s(i),TriangleVertex(s(i),j,0))
  PokeFloat tris(i),(j*b)+ 44,VertexGreen	(s(i),TriangleVertex(s(i),j,0))
  PokeFloat tris(i),(j*b)+ 48,VertexBlue	(s(i),TriangleVertex(s(i),j,0))
  PokeFloat tris(i),(j*b)+ 52,VertexAlpha	(s(i),TriangleVertex(s(i),j,0))

  PokeFloat tris(i),(j*b)+100,VertexX		(s(i),TriangleVertex(s(i),j,1))
  PokeFloat tris(i),(j*b)+104,VertexY		(s(i),TriangleVertex(s(i),j,1))
  PokeFloat tris(i),(j*b)+108,VertexZ		(s(i),TriangleVertex(s(i),j,1))
  PokeFloat tris(i),(j*b)+112,VertexU		(s(i),TriangleVertex(s(i),j,1),0)
  PokeFloat tris(i),(j*b)+116,VertexV		(s(i),TriangleVertex(s(i),j,1),0)
  PokeFloat tris(i),(j*b)+120,VertexU		(s(i),TriangleVertex(s(i),j,1),1)
  PokeFloat tris(i),(j*b)+124,VertexV		(s(i),TriangleVertex(s(i),j,1),1)
  PokeFloat tris(i),(j*b)+128,VertexNX		(s(i),TriangleVertex(s(i),j,1))
  PokeFloat tris(i),(j*b)+132,VertexNY		(s(i),TriangleVertex(s(i),j,1))
  PokeFloat tris(i),(j*b)+136,VertexNZ		(s(i),TriangleVertex(s(i),j,1))
  PokeFloat tris(i),(j*b)+140,VertexRed		(s(i),TriangleVertex(s(i),j,1))
  PokeFloat tris(i),(j*b)+144,VertexGreen	(s(i),TriangleVertex(s(i),j,1))
  PokeFloat tris(i),(j*b)+148,VertexBlue	(s(i),TriangleVertex(s(i),j,1))
  PokeFloat tris(i),(j*b)+152,VertexAlpha	(s(i),TriangleVertex(s(i),j,1))

  PokeFloat tris(i),(j*b)+200,VertexX		(s(i),TriangleVertex(s(i),j,2))
  PokeFloat tris(i),(j*b)+204,VertexY		(s(i),TriangleVertex(s(i),j,2))
  PokeFloat tris(i),(j*b)+208,VertexZ		(s(i),TriangleVertex(s(i),j,2))
  PokeFloat tris(i),(j*b)+212,VertexU		(s(i),TriangleVertex(s(i),j,2),0)
  PokeFloat tris(i),(j*b)+216,VertexV		(s(i),TriangleVertex(s(i),j,2),0)
  PokeFloat tris(i),(j*b)+220,VertexU		(s(i),TriangleVertex(s(i),j,2),1)
  PokeFloat tris(i),(j*b)+224,VertexV		(s(i),TriangleVertex(s(i),j,2),1)
  PokeFloat tris(i),(j*b)+228,VertexNX		(s(i),TriangleVertex(s(i),j,2))
  PokeFloat tris(i),(j*b)+232,VertexNY		(s(i),TriangleVertex(s(i),j,2))
  PokeFloat tris(i),(j*b)+236,VertexNZ		(s(i),TriangleVertex(s(i),j,2))
  PokeFloat tris(i),(j*b)+240,VertexRed		(s(i),TriangleVertex(s(i),j,2))
  PokeFloat tris(i),(j*b)+244,VertexGreen	(s(i),TriangleVertex(s(i),j,2))
  PokeFloat tris(i),(j*b)+248,VertexBlue	(s(i),TriangleVertex(s(i),j,2))
  PokeFloat tris(i),(j*b)+252,VertexAlpha	(s(i),TriangleVertex(s(i),j,2))

 Next
Next

;Goto quicky

Print "-------------------------"


; --------- then compare every single triangle to all other triangles if they are identical --------
; this is a brute force thing, may take a minute or so. You can abort the app with ESC
For i=1 To surfs
 For j=0 To CountTriangles(s(i))-1

  If PeekFloat(tris(i),(j*b)+seenflag)=0
   x0#=PeekFloat(tris(i),(j*b)+ 0)
   y0#=PeekFloat(tris(i),(j*b)+ 4)
   z0#=PeekFloat(tris(i),(j*b)+ 8)
   x1#=PeekFloat(tris(i),(j*b)+100)
   y1#=PeekFloat(tris(i),(j*b)+104)
   z1#=PeekFloat(tris(i),(j*b)+108)
   x2#=PeekFloat(tris(i),(j*b)+200)
   y2#=PeekFloat(tris(i),(j*b)+204)
   z2#=PeekFloat(tris(i),(j*b)+208)
   For ii=1 To surfs
    For jj=0 To CountTriangles(s(ii))-1
     If (ii<>i) Or (jj<>j); don't compare with myself
      xx0#=PeekFloat(tris(ii),(jj*b)+ 0)
      yy0#=PeekFloat(tris(ii),(jj*b)+ 4)
      zz0#=PeekFloat(tris(ii),(jj*b)+ 8)
      xx1#=PeekFloat(tris(ii),(jj*b)+100)
      yy1#=PeekFloat(tris(ii),(jj*b)+104)
      zz1#=PeekFloat(tris(ii),(jj*b)+108)
      xx2#=PeekFloat(tris(ii),(jj*b)+200)
      yy2#=PeekFloat(tris(ii),(jj*b)+204)
      zz2#=PeekFloat(tris(ii),(jj*b)+208)
      If (x0=xx0) And (y0=yy0) And (z0=zz0) And (x1=xx1) And (y1=yy1) And (z1=zz1) And (x2=xx2) And (y2=yy2) And (z2=zz2)
       Print "In surface:"+i+" of "+surfs
       Print "Found identic Triangle: surf:"+i+" Tri:"+j+" is the same as surf:"+ii+" Tri:"+jj
       PokeFloat tris(ii),(jj*b)+seenflag,1 ; set this triangle to "seen"
       same(same_count,0)=i
       same(same_count,1)=j
       same(same_count,2)=ii
       same(same_count,3)=jj
       same_count=same_count+1
      EndIf
     EndIf
    Next
   Next
  EndIf
  If KeyDown(1)<>0 Then End
 Next
Next

Print "double tris: "+same_count
Print "total tris in mesh: "+total_tris
Print "And I really didn't take any drugs o_O"
Print "Press Space for a wallktrough test"
WaitKey()


; ----------------------------- recreate the mesh without the clone tris! ---------------------
.quicky


mesh2=CreateMesh()


For i=1 To surfs
 s2(i)=CreateSurface(mesh2,brush(i))
Next


For i=1 To surfs
 For j=0 To CountTriangles(s(i))-1
  If PeekFloat(tris(i),(j*b)+seenflag)=0

   x0#=		PeekFloat(tris(i),(j*b)+0)
   y0#=		PeekFloat(tris(i),(j*b)+4)
   z0#=		PeekFloat(tris(i),(j*b)+8)
   ua0#=	PeekFloat(tris(i),(j*b)+12)
   va0#=	PeekFloat(tris(i),(j*b)+16)
   ub0#=	PeekFloat(tris(i),(j*b)+20)
   vb0#=	PeekFloat(tris(i),(j*b)+24)
   nx0#=	PeekFloat(tris(i),(j*b)+28)
   ny0#=	PeekFloat(tris(i),(j*b)+32)
   nz0#=	PeekFloat(tris(i),(j*b)+36)
   red0#=	PeekFloat(tris(i),(j*b)+40)
   gre0#=	PeekFloat(tris(i),(j*b)+44)
   blu0#=	PeekFloat(tris(i),(j*b)+48)
   alp0#=	PeekFloat(tris(i),(j*b)+52)

   x1#=		PeekFloat(tris(i),(j*b)+100)
   y1#=		PeekFloat(tris(i),(j*b)+104)
   z1#=		PeekFloat(tris(i),(j*b)+108)
   ua1#=	PeekFloat(tris(i),(j*b)+112)
   va1#=	PeekFloat(tris(i),(j*b)+116)
   ub1#=	PeekFloat(tris(i),(j*b)+120)
   vb1#=	PeekFloat(tris(i),(j*b)+124)
   nx1#=	PeekFloat(tris(i),(j*b)+128)
   ny1#=	PeekFloat(tris(i),(j*b)+132)
   nz1#=	PeekFloat(tris(i),(j*b)+136)
   red1#=	PeekFloat(tris(i),(j*b)+140)
   gre1#=	PeekFloat(tris(i),(j*b)+144)
   blu1#=	PeekFloat(tris(i),(j*b)+148)
   alp1#=	PeekFloat(tris(i),(j*b)+152)

   x2#=		PeekFloat(tris(i),(j*b)+200)
   y2#=		PeekFloat(tris(i),(j*b)+204)
   z2#=		PeekFloat(tris(i),(j*b)+208)
   ua2#=	PeekFloat(tris(i),(j*b)+212)
   va2#=	PeekFloat(tris(i),(j*b)+216)
   ub2#=	PeekFloat(tris(i),(j*b)+220)
   vb2#=	PeekFloat(tris(i),(j*b)+224)
   nx2#=	PeekFloat(tris(i),(j*b)+228)
   ny2#=	PeekFloat(tris(i),(j*b)+232)
   nz2#=	PeekFloat(tris(i),(j*b)+236)
   red2#=	PeekFloat(tris(i),(j*b)+240)
   gre2#=	PeekFloat(tris(i),(j*b)+244)
   blu2#=	PeekFloat(tris(i),(j*b)+248)
   alp2#=	PeekFloat(tris(i),(j*b)+252)

    vr0=AddVertex(s2(i),x0,y0,z0)
   VertexTexCoords s2(i),vr0,ua0,va0,0,0 
   VertexTexCoords s2(i),vr0,ub0,vb0,0,1 
   VertexNormal s2(i),vr0,nx0,ny0,nz0
   VertexColor  s2(i),vr0,red0,gre0,blu0,alp0

   vr1=AddVertex(s2(i),x1,y1,z1)
   VertexTexCoords s2(i),vr1,ua1,va1,0,0 
   VertexTexCoords s2(i),vr1,ub1,vb1,0,1 
   VertexNormal s2(i),vr1,nx1,ny1,nz1
   VertexColor  s2(i),vr1,red1,gre1,blu1,alp1

   vr2=AddVertex(s2(i),x2,y2,z2)
   VertexTexCoords s2(i),vr2,ua2,va2,0,0 
   VertexTexCoords s2(i),vr2,ub2,vb2,0,1 
   VertexNormal s2(i),vr2,nx2,ny2,nz2
   VertexColor  s2(i),vr2,red2,gre2,blu2,alp2

   AddTriangle (s2(i),vr0,vr1,vr2)

  EndIf
  If KeyDown(1)<>0 Then End
 Next
Next


FreeEntity mesh ; original Mesh not needed anymore

mesh=mesh2

; ---------------------------------- a walktrough test code -------------------------------
.test_walk

Collisions 1,2,2,2

player=CreatePivot()
PositionEntity player,0,100,-1
EntityRadius player,0.2,0.9
EntityType player,1

camera=CreateCamera( player )
CameraRange camera,.1,200
TranslateEntity camera,0,1.8,0
CameraClsColor camera,180,200,255

light=CreateLight()
LightColor light,32,32,32
TurnEntity light,45,45,0


EntityFX mesh,1
EntityType mesh,2

sp#=.5
ey#=EntityY(player)

; walktrough loop
While Not KeyHit(1)
	If KeyHit(17)
	 wire=1-wire
	 WireFrame wire
	EndIf
	yv#=EntityY(player)-ey
	ey=EntityY(player)
	If KeyHit(57) Then jump#=1.0
	MoveEntity player,0,-Abs(yv-.005),0
	If jump>0 Then
	 jump=jump-.1
 	 If jump<0 Then jump=0
	 MoveEntity player,0,Sin(jump)*30.0,0
	EndIf
	mxa#=-MouseXSpeed()/4.0
	mya#=MouseYSpeed()/4.0
	MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
	TurnEntity player,0,mxa,0
	TurnEntity camera,mya,0,0
	If KeyDown(205) MoveEntity player,sp,0,0
	If KeyDown(203) MoveEntity player,-sp,0,0
	If KeyDown(200) MoveEntity player,0,0,sp
	If KeyDown(208) MoveEntity player,0,0,-sp
	UpdateWorld
	RenderWorld
	Text 0,0,TrisRendered()
	Flip
Wend
End