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