[bb] Quad functions by Beaker [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:38

Previous topic - Next topic

BlitzBot

Title : Quad functions
Author : Beaker
Posted : 1+ years ago

Description : Lets you handle meshes built of quads (4 sides/vertices) instead of triangles (3 sides/vertices).  Replicates all the standard commands you have for handling triangles:
AddQuad()
CountQuads()
QuadVertex()
PickedQuad()

NB. Meshes must be basically built of quads, luckily most of the surfaces in Blitz3Ds standard primitives are.  Your loaded meshes might not.

Try the sample to work out what everything does.  Also, includes a PickedVertex() function.


Code :
Code (blitzbasic) Select
Graphics3D 640,480,0,2

cam = CreateCamera()
MoveEntity cam,0,0,-6

lit = CreateLight()
TurnEntity lit,30,45,0

ball = CreateSphere(10)
PositionEntity ball,3,0,0
EntityPickMode ball,2

cube = CreateCube()
EntityPickMode cube,2

cone = CreateCylinder(14)
PositionEntity cone,-3,0,0
EntityPickMode cone,2

Local tfx#[4]
Local tfy#[4]
Local tfz#[4]

cursor = CreateMesh()
cursorsurf = CreateSurface(cursor)
EntityColor cursor,255,0,0
EntityOrder cursor,-9

While Not KeyDown(1)

RenderWorld
If PickedEntity()
Text 5,5,"picked quad = "+PickedQuad()+"/"+CountQuads(PickedSurface())
Text 5,35,"quad verts:"
Text 15,50,QuadVertex(PickedSurface(),PickedQuad(),0)
Text 15,65,QuadVertex(PickedSurface(),PickedQuad(),1)
Text 15,80,QuadVertex(PickedSurface(),PickedQuad(),2)
Text 15,95,QuadVertex(PickedSurface(),PickedQuad(),3)
EndIf

Text 320,440,"Use mouse to click on objects",True

Flip

If MouseDown(1)
CameraPick cam,MouseX(),MouseY()
If PickedEntity()
surf = PickedSurface()

For f = 0 To 3
qv = QuadVertex(surf,PickedQuad(),f)
TFormPoint VertexX(surf,qv),VertexY(surf,qv),VertexZ(surf,qv),PickedEntity(),0
tfx[f] = TFormedX()
tfy[f] = TFormedY()
tfz[f] = TFormedZ()
Next

ClearSurface cursorsurf
AddQuad2(cursorsurf, tfx[0],tfy[0],tfz[0], tfx[1],tfy[1],tfz[1], tfx[2],tfy[2],tfz[2], tfx[3],tfy[3],tfz[3])
UpdateNormals cursor

EndIf
Else
ClearSurface cursorsurf
EndIf

TurnEntity cube,0.3,0.4,0
Wend
End


Function AddQuad(surf,v0,v1,v2,v3) ; similar to AddTriangle()
Local tri = AddTriangle(surf,v0,v1,v2)
AddTriangle(surf,v0,v2,v3)
Return tri / 2
End Function

Function AddQuad2(surf, x0#,y0#,z0#, x1#,y1#,z1#, x2#,y2#,z2#, x3#,y3#,z3#) ; alternative to above func
Local v0 = AddVertex(surf,x0,y0,z0, 0,0)
Local v1 = AddVertex(surf,x1,y1,z1, 1,0)
Local v2 = AddVertex(surf,x2,y2,z2, 1,1)
Local v3 = AddVertex(surf,x3,y3,z3, 0,1)
Local tri = AddTriangle(surf,v0,v1,v2)
AddTriangle(surf,v0,v2,v3)
Return tri / 2
End Function


Function CountQuads(surf) ; similar to CountTriangles()
Return CountTriangles(surf) / 2
End Function

Function QuadVertex(surf,index,vertex) ; similar to TriangleVertex()
If vertex < 3
Return TriangleVertex(surf,index*2,vertex)
EndIf
Return TriangleVertex(surf,index*2+1,2)
End Function


Function PickedQuad() ; similar to PickedTriangle()
Return PickedTriangle() / 2
End Function



Function PickedVertex() ; similar to PickedTriangle()/PickedSurface() etc
Local f, pv
Local dx#,dy#,dz#
Local vert, dist#, nearest# = -1.0
Local surf = PickedSurface()

TFormPoint PickedX(),PickedY(),PickedZ(),0,PickedEntity()
For f = 0 To 2
vert = TriangleVertex(surf,PickedTriangle(),f)
dx = TFormedX()-VertexX(surf,vert)
dy = TFormedY()-VertexY(surf,vert)
dz = TFormedZ()-VertexZ(surf,vert)
dist = dx*dx + dy*dy + dz*dz
If dist < nearest Or nearest < 0.0
pv = vert
nearest = dist
EndIf
Next
Return pv
End Function


Comments :


RiverRatt(Posted 1+ years ago)

 Thank you very much, this just might help me with a little project of mine. Just what I needed.


ShadowTurtle(Posted 1+ years ago)

 this use realy quaT math
Code removed


Beaker(Posted 1+ years ago)

 quat <> quad.quad = quadrangle = 2 triangles making a square.


ShadowTurtle(Posted 1+ years ago)

 ui.. sorry.. this was a long day for me -.- [/i]