Blitz3D+ Command Reference

FindSurface ( mesh,brush )

Parameters

mesh - mesh handle
brush - brush handle

Description

Finds the surface of a mesh that matches a brush, returning the surface handle, or 0 if none matches.

The comparison is by the brush's properties - colour, texture, blend and so on - against the brush each surface was created or painted with. A typical use is picking one material out of a loaded model: load the same texture into a brush, then FindSurface to grab the surface using it, ready for repainting or vertex tweaks.

If you just want to visit every surface, or you know the position of the one you want, CountSurfaces and GetSurface are the simpler pair.

See also: GetSurface, CountSurfaces, CreateSurface, PaintSurface, CreateBrush.

Example

; FindSurface Example
; -------------------

; FindSurface retrieves the surface of a mesh that was created with a
; given brush - handy for picking one material group out of a mesh.
; It returns the surface handle, or 0 if no surface matches.

Graphics3D 640,480
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,0,-5

; Two brushes: grey stone and glowing lava
stone=CreateBrush()
BrushColor stone,130,130,140
lava=CreateBrush()
BrushColor lava,255,120,0

; One mesh with two surfaces, one per brush
mesh=CreateMesh()

; Left quad: created with the stone brush
s1=CreateSurface(mesh,stone)
v0=AddVertex(s1,-2.1,1,0)
v1=AddVertex(s1,-0.1,1,0)
v2=AddVertex(s1,-0.1,-1,0)
v3=AddVertex(s1,-2.1,-1,0)
AddTriangle s1,v0,v1,v2
AddTriangle s1,v0,v2,v3

; Right quad: created with the lava brush
s2=CreateSurface(mesh,lava)
v0=AddVertex(s2,0.1,1,0)
v1=AddVertex(s2,2.1,1,0)
v2=AddVertex(s2,2.1,-1,0)
v3=AddVertex(s2,0.1,-1,0)
AddTriangle s2,v0,v1,v2
AddTriangle s2,v0,v2,v3

; Fullbright so the brush colours show without lighting setup
EntityFX mesh,1

; The documented command: fetch whichever surface used the lava brush
found=FindSurface(mesh,lava)

While Not KeyDown(1)

    ; Bob the FOUND surface's vertices up and down to prove we
    ; grabbed the right one - the stone quad is untouched
    wob#=Sin(MilliSecs()*0.3)*0.2
    VertexCoords found,0,0.1,1+wob,0
    VertexCoords found,1,2.1,1+wob,0
    VertexCoords found,2,2.1,-1+wob,0
    VertexCoords found,3,0.1,-1+wob,0

    ; Arrow keys move the camera
    If KeyDown(200) Then MoveEntity camera,0,0,0.1
    If KeyDown(208) Then MoveEntity camera,0,0,-0.1
    If KeyDown(203) Then TurnEntity camera,0,1,0
    If KeyDown(205) Then TurnEntity camera,0,-1,0

    RenderWorld

    Text 0,0,"Arrow keys: move camera   Esc: exit"
    Text 0,20,"FindSurface(mesh,lava) = "+found+" (0 would mean not found)"
    Text 0,40,"Only the found (orange) surface is animated"

    Flip

Wend

End

Index