October 28, 2021, 12:55:03

Author Topic: [bb] ClusterizeMesh Revisited by RifRaf [ 1+ years ago ]  (Read 964 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : ClusterizeMesh Revisited
Author : RifRaf
Posted : 1+ years ago

Description : Original author was JFK, his entry is below in the archives.  I made several changes and additions to the routine.  
   I call it chunkterrain as i use it mainly for mesh terrains made with FLE and the likes. but you can use it on anything
  Unlike JKFs original version, with this version you are not limited to any spacial area.  You can also tell the function how many times to divide each axis.  so if you call ChunkTerrain (mesh,2,2,2) it will divide each axis by 2, and give you 2x2x2 cube chunks. (2 meaning (meshsize/2)).

 theres a update_chunks() function is there if you want to use it.. wich  hides chunks out of range.

Aside from the original function modifications, other functions created to make it all work were RemoveSurface() NeareastPower() and ChunkDistance().     Nearestpower just snaps any number to the nearest X multiplier.  and allows the function to put triangles into cube chunks regardless of mesh size or position.

This will also work on scaled meshes. with scalemesh or even ScaleEntity.


Code :
Code: BlitzBasic
  1. Type remove_surf
  2.         Field id
  3.         End Type
  4.  
  5. Type Cluster
  6.         Field XC#, YC#, ZC#
  7.         Field Mesh, Surf[200]
  8.         End Type
  9.  
  10. Function ChunkTerrain(mesh,xsize=50,ysize=1,zsize=50)
  11.         Delete Each Cluster
  12.     Delete Each Remove_surf
  13.         ; First we'll need to get the original terrain scale for matching scale after the chunking
  14.     vx# = GetMatElement#(Mesh, 0, 0)
  15.         vy# = GetMatElement#(Mesh, 0, 1)
  16.         vz# = GetMatElement#(Mesh, 0, 2)
  17.         XScale# = Sqr(vx# * vx# + vy# * vy# + vz# * vz#)
  18.         vx# = GetMatElement#(Mesh, 1, 0)
  19.         vy# = GetMatElement#(Mesh, 1, 1)
  20.         vz# = GetMatElement#(Mesh, 1, 2)
  21.         YScale# = Sqr(vx# * vx# + vy# * vy# + vz# * vz#)
  22.         vx# = GetMatElement#(Mesh, 2, 0)
  23.         vy# = GetMatElement#(Mesh, 2, 1)
  24.         vz# = GetMatElement#(Mesh, 2, 2)
  25.         ZScale# = Sqr(vx# * vx# + vy# * vy# + vz# * vz#)
  26.  
  27.         cx# = Int((MeshWidth#(Mesh)) / xsize)
  28.         cy# = Int((MeshHeight#(Mesh)) / ysize)
  29.         cz# = Int((MeshDepth#(Mesh)) / zsize)
  30.  
  31.         ; Let the chunking begin
  32.         sos = CountSurfaces(mesh)
  33.         For s = 1 To sos
  34.                 surf = GetSurface(mesh, s)
  35.                 brush = GetSurfaceBrush(surf)
  36.  
  37.                 For t = 0 To CountTriangles(surf) - 1
  38.                         x0#  = VertexX#(surf, TriangleVertex(surf, t, 0))
  39.                         y0#  = VertexY#(surf, TriangleVertex(surf, t, 0))
  40.                         z0#  = VertexZ#(surf, TriangleVertex(surf, t, 0))
  41.                         nx0# = VertexNX#(surf, TriangleVertex(surf, t, 0))
  42.                         ny0# = VertexNY#(surf, TriangleVertex(surf, t, 0))
  43.                         nz0# = VertexNZ#(surf, TriangleVertex(surf, t, 0))
  44.                         al0# = VertexAlpha#(surf, TriangleVertex(surf, t, 0))
  45.                         cr0# = VertexRed#(surf, TriangleVertex(surf, t, 0))
  46.                         cg0# = VertexGreen#(surf, TriangleVertex(surf, t, 0))
  47.                         cb0# = VertexBlue#(surf, TriangleVertex(surf, t, 0))
  48.                         x1#  = VertexX#(surf, TriangleVertex(surf, t, 1))
  49.                         y1#  = VertexY#(surf, TriangleVertex(surf, t, 1))
  50.                         z1#  = VertexZ#(surf, TriangleVertex(surf, t, 1))
  51.                         nx1# = VertexNX#(surf, TriangleVertex(surf, t, 1))
  52.                         ny1# = VertexNY#(surf, TriangleVertex(surf, t, 1))
  53.                         nz1# = VertexNZ#(surf, TriangleVertex(surf, t, 1))
  54.                         al1# = VertexAlpha#(surf, TriangleVertex(surf, t, 1))
  55.                         cr1# = VertexRed#(surf, TriangleVertex(surf, t, 1))
  56.                         cg1# = VertexGreen#(surf, TriangleVertex(surf, t, 1))
  57.                         cb1# = VertexBlue#(surf, TriangleVertex(surf, t, 1))
  58.                         x2#  = VertexX#(surf, TriangleVertex(surf, t, 2))
  59.                         y2#  = VertexY#(surf, TriangleVertex(surf, t, 2))
  60.                         z2#  = VertexZ#(surf, TriangleVertex(surf, t, 2))
  61.                         u0a# = VertexU#(surf, TriangleVertex(surf, t, 0), 0)
  62.                         v0a# = VertexV#(surf, TriangleVertex(surf, t, 0), 0)
  63.                         u1a# = VertexU#(surf, TriangleVertex(surf, t, 1), 0)
  64.                         v1a# = VertexV#(surf, TriangleVertex(surf, t, 1), 0)
  65.                         u2a# = VertexU#(surf, TriangleVertex(surf, t, 2), 0)
  66.                         v2a# = VertexV#(surf, TriangleVertex(surf, t, 2), 0)
  67.                         nx2# = VertexNX#(surf, TriangleVertex(surf, t, 2))
  68.                         ny2# = VertexNY#(surf, TriangleVertex(surf, t, 2))
  69.                         nz2# = VertexNZ#(surf, TriangleVertex(surf, t, 2))
  70.                         al2# = VertexAlpha#(surf, TriangleVertex(surf, t, 2))
  71.                         cr2# = VertexRed#(surf, TriangleVertex(surf, t, 2))
  72.                         cg2# = VertexGreen#(surf, TriangleVertex(surf, t, 2))
  73.                         cb2# = VertexBlue#(surf, TriangleVertex(surf, t, 2))
  74.  
  75.                         ; Let's see which chunk we'll assign this vert to
  76.                         x_c# = NearestPower(VertexX#(surf, TriangleVertex(surf, t, 0)), CX)
  77.                         y_c# = NearestPower(VertexY#(surf, TriangleVertex(surf, t, 0)), CY)
  78.                         z_c# = NearestPower(VertexZ#(surf, TriangleVertex(surf, t, 0)), CZ)
  79.                         Found = False
  80.                         For cl.cluster = Each cluster
  81.                                 If x_c = clxc And y_c = clyc And z_c = clzc
  82.                                         If clsurf[s] <> 0
  83.                                                 Found = True
  84.                                                 v0 = AddVertex(clsurf[s], x0, y0, z0)
  85.                                                 VertexTexCoords clsurf[s], v0, u0a, v0a, 0
  86.                                                 VertexColor clsurf[s], v0, cr0, cg0, cb0, al0
  87.                                                 VertexNormal clsurf[s], v0, nx0, ny0, nz0
  88.                                                 v1 = AddVertex(clsurf[s], x1, y1, z1)
  89.                                                 VertexTexCoords clsurf[s], v1, u1a, v1a, 0
  90.                                                 VertexColor clsurf[s], v1, cr1, cg1, cb1, al1
  91.                                                 VertexNormal clsurf[s], v1, nx1, ny1, nz1
  92.                                                 v2 = AddVertex(clsurf[s], x2, y2, z2)
  93.                                                 VertexTexCoords clsurf[s], v2, u2a, v2a, 0
  94.                                                 VertexColor clsurf[s], v2, cr2, cg2, cb2, al2
  95.                                                 VertexNormal clsurf[s], v2, nx2, ny2, nz2
  96.                                                 nope = AddTriangle(clsurf[s], v0, v1, v2)
  97.                                                 Exit
  98.                                         EndIf
  99.                                 EndIf
  100.                         Next
  101.  
  102.                         ; If there was no chunk for that area, we'll make it here
  103.                         If Found = False
  104.                                 cl.cluster = New cluster
  105.                                 nsegs = nsegs + 1
  106.                                 clxc# = x_c
  107.                                 clyc# = y_c
  108.                                 clzc# = z_c
  109.                                 clmesh = CreateMesh()
  110.                                 For ss = 1 To sos
  111.                                         clsurf[ss] = CreateSurface(clmesh)
  112.                                         surf2 = GetSurface(mesh, ss)
  113.                                         brush = GetSurfaceBrush(surf2)
  114.                     PaintSurface clsurf[ss], brush
  115.                                 Next
  116.                                 v0 = AddVertex(clsurf[s], x0, y0, z0)
  117.                                 VertexTexCoords clsurf[s], v0, u0a, v0a, 0
  118.                                 VertexColor clsurf[s], v0, cr0, cg0, cb0, al0
  119.                                 VertexNormal clsurf[s], v0, nx0, ny0, nz0
  120.                                 v1 = AddVertex(clsurf[s], x1, y1, z1)
  121.                                 VertexTexCoords clsurf[s], v1, u1a, v1a, 0
  122.                                 VertexColor clsurf[s], v1, cr1, cg1, cb1, al1
  123.                                 VertexNormal clsurf[s], v1, nx1, ny1, nz1
  124.                                 v2 = AddVertex(clsurf[s], x2, y2, z2)
  125.                                 VertexTexCoords clsurf[s], v2, u2a, v2a, 0
  126.                                 VertexColor clsurf[s], v2, cr2, cg2, cb2, al2
  127.                                 VertexNormal clsurf[s], v2, nx2, ny2, nz2
  128.                                 nope = AddTriangle(clsurf[s], v0, v1, v2)
  129.                         EndIf
  130.                 Next
  131.         Next
  132.  
  133. ;remove blank surfaces from chunk
  134.         For cl.Cluster = Each Cluster
  135.         For rems.remove_surf=Each remove_surf
  136.              Delete rems
  137.                Next
  138.             For scn=1 To CountSurfaces(clmesh)
  139.             sf=GetSurface(clmesh,scn)
  140.                         vn=CountVertices(sf)-1
  141.             If vn=<0 Then
  142.                rems.Remove_surf=New remove_surf
  143.                remsid=scn      
  144.                EndIf
  145.                Next
  146.             fb=fb*-1
  147.             clmesh=removesurface(clmesh)
  148.             EntityPickMode clmesh,2,True
  149.                         Next
  150.  
  151.  
  152. ;free the original large mesh        
  153.         FreeEntity Mesh
  154.  
  155. End Function
  156.  
  157.  
  158. Function NearestPower(N#, Snapper#)
  159.  
  160.         Return Float#(Int(Abs(N#) / Snapper#)) * Snapper# * Sgn(N#)
  161.  
  162. End Function
  163.  
  164. Function uPdate_clusters(ent,maxdist#=500)
  165. For C.CLUSTER=Each CLUSTER
  166.                                 dist# = chunk_distance(ent,cmesh)
  167.                                 If dist>maxdist# Then
  168.                                   HideEntity cmesh
  169.                  Else
  170.                    ShowEntity cmesh
  171.                   EndIf
  172.                                 Next
  173.                                 End Function
  174.                                
  175.  
  176. Function Chunk_distance(entity1,entity2)
  177.         s=GetSurface(entity2,1)
  178.         Return Sqr#((EntityX#(entity1,1) - VertexX#(s,1))^2 + (EntityZ#(entity1,1) - VertexZ(s,1))^2)
  179.     End Function
  180.  
  181. Function removesurface(ent)
  182. DebugLog "testing removal"
  183. ;ok we need to rebuild the mesh
  184. DebugLog "creating mesh target"
  185.  newmesh=CreateMesh()
  186.  ns=CountSurfaces(ent)
  187. DebugLog ns+" original surfaces"
  188.  
  189. For i=1 To ns
  190. nogo=0
  191. For rems.remove_surf=Each remove_surf
  192.   If i=remsid Then nogo=1
  193.   Next
  194.  If nogo=0  Then
  195.     DebugLog "making surf"
  196.           surf=GetSurface(ent,i)       
  197.           newsurf=CreateSurface(newmesh)
  198.           brush = GetSurfaceBrush(surf)
  199.  
  200.                 tc=CountTriangles(surf)
  201.              For tri=0 To tc-1
  202.                             v_r1#=VertexRed(surf,TriangleVertex(Surf,tri,0) )
  203.                             v_g1#=VertexGreen(surf,TriangleVertex(Surf,tri,0))
  204.                             v_b1#=VertexBlue(surf,TriangleVertex(Surf,tri,0) )
  205.                             v_r2#=VertexRed(surf,TriangleVertex(Surf,tri,1) )
  206.                             v_g2#=VertexGreen(surf,TriangleVertex(Surf,tri,1))
  207.                             v_b2#=VertexBlue(surf,TriangleVertex(Surf,tri,1) )
  208.                             v_r3#=VertexRed(surf,TriangleVertex(Surf,tri,2) )
  209.                             v_g3#=VertexGreen(surf,TriangleVertex(Surf,tri,2))
  210.                             v_b3#=VertexBlue(surf,TriangleVertex(Surf,tri,2) )
  211.  
  212.                             v_x0#=VertexX(surf,TriangleVertex(surf,tri,0))
  213.                             v_x1#=VertexX(surf,TriangleVertex(surf,tri,1))
  214.                             v_x2#=VertexX(surf,TriangleVertex(surf,tri,2))
  215.  
  216.                             v_y0#=VertexY(surf,TriangleVertex(surf,tri,0))
  217.                             v_y1#=VertexY(surf,TriangleVertex(surf,tri,1))
  218.                             v_y2#=VertexY(surf,TriangleVertex(surf,tri,2))
  219.  
  220.                             v_z0#=VertexZ(surf,TriangleVertex(surf,tri,0))
  221.                             v_z1#=VertexZ(surf,TriangleVertex(surf,tri,1))
  222.                             v_z2#=VertexZ(surf,TriangleVertex(surf,tri,2))
  223.  
  224.                             v_u0#=VertexU(surf,TriangleVertex(surf,tri,0))
  225.                             v_u1#=VertexU(surf,TriangleVertex(surf,tri,1))
  226.                             v_u2#=VertexU(surf,TriangleVertex(surf,tri,2))
  227.  
  228.                             v_v0#=VertexV(surf,TriangleVertex(surf,tri,0))
  229.                             v_v1#=VertexV(surf,TriangleVertex(surf,tri,1))
  230.                             v_v2#=VertexV(surf,TriangleVertex(surf,tri,2))
  231.  
  232.                             v_a0#=VertexAlpha(surf,TriangleVertex(surf,tri,0))
  233.                         v_a1#=VertexAlpha(surf,TriangleVertex(surf,tri,1))
  234.                             v_a2#=VertexAlpha(surf,TriangleVertex(surf,tri,2))
  235.  
  236.                  v0=AddVertex(newsurf,v_x0,v_y0,v_z0,v_u0,v_v0)
  237.                              v1=AddVertex(newsurf,v_x1,v_y1,v_z1,v_u1,v_v1)
  238.                              v2=AddVertex(newsurf,v_x2,v_y2,v_z2,v_u2,v_v2)
  239.                              AddTriangle(newsurf,v0,v1,v2)
  240.  
  241.                             VertexColor newsurf, v0,v_r1,v_g1,v_b1,v_a0
  242.                             VertexColor newsurf, v1,v_r2,v_g2,v_b2,v_a1
  243.                             VertexColor newsurf, v2,v_r3,v_g3,v_b3,v_a2
  244.               Next
  245.              PaintSurface newsurf,brush
  246.              UpdateNormals newmesh
  247.        EndIf
  248.        Next
  249. ;free the old mesh
  250. FreeEntity ent
  251. ;return the updated mesh
  252. Return newmesh
  253. End Function


Comments :


Damien Sturdy(Posted 1+ years ago)

 Sweet, just a week too late! :P (made my own)However, this will come in handy :D


jfk EO-11110(Posted 1+ years ago)

 Good to see somebody is using it. Well done.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal