| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- ;Lod Mesh
- ;David Bird
- ;[email protected]
- Graphics3D 640,480
- SetBuffer BackBuffer()
- lit=CreateLight()
- cam=CreateCamera()
- CameraRange cam,1,1000
- PositionEntity cam,0,0,-100
- ;Load in mesh and texture
- mesh=LoadMesh("dolphin.x")
- tex=LoadTexture("dolphin.bmp")
- EntityTexture mesh,tex
- ScaleMesh mesh,.2,.2,.2
- Get_Data(mesh) ;Store mesh inforamtion
- ;mesh=Create_New_Mesh(mesh,1) ;Reduce mesh by 1 triangle
- ;WireFrame True
- While Not KeyDown(1)
- TurnEntity mesh,0,1,0
- If KeyDown(57) Then
- mesh=Create_New_Mesh(mesh,1) ; Reduce mesh by 1 triangle
- EntityTexture mesh,tex
- End If
- tri_s=CountTriangles(GetSurface(mesh,CountSurfaces(mesh)))
- UpdateWorld
- RenderWorld
- Text 0,0,"Lod Mesh. (c)2001 David Bird, [email protected]"
- Text 0,16,"Press space to reduce triangles in mesh"
- Text 0,32,"Current triangle count="+tri_s
- Flip
- Wend
- FreeEntity cam
- EndGraphics
- End
- Type vert
- Field x#
- Field y#
- Field z#
- Field u#
- Field v#
- Field oindex
- Field index
- Field nindex
- Field use
- Field cost#
- Field nei.vert
- End Type
- Type tri
- Field ind[3]
- Field mv[2]
- Field index
- Field tcost#
- Field use
- End Type
- Function Get_Data(mesh)
- surf=GetSurface(mesh,CountSurfaces(mesh))
- For index=0 To CountVertices(surf)-1
- a.vert=New vert
- a\index=index
- a\oindex=index
- a\use=True
- a\cost=1000000
- a\x=VertexX(surf,index)
- a\y=VertexY(surf,index)
- a\z=VertexZ(surf,index)
- a\u=VertexU(surf,index)
- a\v=VertexV(surf,index)
- Next
- For index=0 To CountTriangles(surf)-1
- b.tri=New tri
- b\use=True
- For c=0 To 2
- b\ind[c]=TriangleVertex(surf,index,c)
- Next
- Get_Tri_Cost#(b)
- cnt=cnt+1
- b\index=index
- Next
-
- End Function
- Function Find_Vert.vert(index)
- For a.vert=Each vert
- If a\index=index Then Return a
- Next
- Return Null
- End Function
- Function Create_New_Mesh(mesh,red)
- For it=1 To red
- del.tri=Get_Lowest_Cost_Tri()
- If del<>Null Then
- del\use=False
- reindex_tris(del\ind[del\mv[0]],del\ind[del\mv[1]])
- End If
- Next
- ;find the lowest cost (used vert)
- rol#=EntityRoll(mesh)
- pit#=EntityPitch(mesh)
- yaw#=EntityYaw(mesh)
- px#=EntityX(mesh,True)
- py#=EntityY(mesh,True)
- pz#=EntityZ(mesh,True)
- surf=GetSurface(mesh,1)
- ClearSurface surf,False,True
- For b.tri=Each tri
- If b\use=True Then
- AddTriangle surf,b\ind[0],b\ind[1],b\ind[2]
- End If
- Next
- UpdateNormals mesh
- RotateEntity mesh,pit,yaw,rol
- PositionEntity mesh,px,py,pz
- Return mesh
- End Function
- Function Get_Lowest_Cost_Tri.tri()
- cost#=100000
- pnt.tri=Null
- For a.tri=Each tri
- If a\use=True Then
- If a\tcost<cost Then
- cost=a\tcost
- pnt.tri=a
- End If
- End If
- Next
- Return pnt.tri
- End Function
- Function ReIndex_Tris(oldtri,newtri)
- For a.tri=Each tri
- p=0
- If a\ind[0]=oldtri Then a\ind[0]=newtri:p=1
- If a\ind[1]=oldtri Then a\ind[1]=newtri:p=1
- If a\ind[2]=oldtri Then a\ind[2]=newtri:p=1
- If p=1 Then Get_Tri_Cost(a)
- Next
- End Function
- Function Get_Tri_Cost#(a.tri)
- v0.vert=Find_Vert(a\ind[0])
- v1.vert=Find_Vert(a\ind[1])
- v2.vert=Find_Vert(a\ind[2])
- x0#=v0\x:y0#=v0\y:z0#=v0\z
- x1#=v1\x:y1#=v1\y:z1#=v1\z
- x2#=v2\x:y2#=v2\y:z2#=v2\z
- coord0#=Sqr((x0-x1)^2+(y0-y1)^2+(z0-z1)^2)
- coord1#=Sqr((x1-x2)^2+(y1-y2)^2+(z1-z2)^2)
- coord2#=Sqr((x2-x0)^2+(y2-y0)^2+(z2-z0)^2)
-
- If coord0<coord1 And coord0<coord2 Then p=0
- If coord1<coord0 And coord1<coord2 Then p=1
- If coord2<coord0 And coord2<coord1 Then p=2
- Select p
- Case 0
- a\mv[0]=1:a\mv[1]=0
- Case 1
- a\mv[0]=2:a\mv[1]=1
- Case 2
- a\mv[0]=0:a\mv[1]=2
- End Select
- a\tcost=coord1+coord2+coord3
- Return a\tcost
- End Function
|