Code archives/3D Graphics - Mesh/Quad functions
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
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. | |||||
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
| ||
Thank you very much, this just might help me with a little project of mine. Just what I needed. |
| ||
this use realy quaT mathCode removed |
| ||
quat <> quad. quad = quadrangle = 2 triangles making a square. |
| ||
ui.. sorry.. this was a long day for me -.- |
Code Archives Forum