Guys. Once again i'm stuck. Please help out.
I'm writing a race track editor and have got stuck on with the mesh generated having flipped faces.
Look at this example. Arrow shows the problem.

Here is the simplified code. Use left hand mouse button to draw a series of points in a clockwise circle starting from the bottem then use the tab key to generate the mesh.
How can I solve this.
I'm writing a race track editor and have got stuck on with the mesh generated having flipped faces.
Look at this example. Arrow shows the problem.

Here is the simplified code. Use left hand mouse button to draw a series of points in a clockwise circle starting from the bottem then use the tab key to generate the mesh.
How can I solve this.
Graphics3D 800,600,16,2 SetBuffer BackBuffer() camPiv = CreatePivot() camera = CreateCamera(camPiv) PositionEntity(camera, 0,500,0) RotateEntity camera, 90, 0,0 CameraRange camera,1,9000 light=CreateLight() RotateEntity light,100,100,1000 EntityY camera ;set up a non visible cursor entity test_sphere=CreateSphere () ScaleMesh test_sphere,20,20,20 EntityColor test_sphere, 255,100,100 EntityAlpha test_sphere, 0.4 ;*** Transparece CreateCube() Global piv_target=CreatePivot() Global piv_pointer=CreatePivot() Global piv_tracker=CreatePivot() Global campitch#,camyaw#,timer,yheight# cam_z=0 Dim pos(100,2) ;storage for the hand drawn lines. Dim angles(100,2) Dim T_Points(100,5) Dim verts(100) V_Pos = 0; the first start to array ; Mainloop While Not KeyDown(1) Cls ; Clear screen ;half of screen dimensions needed w=GraphicsWidth() : h=GraphicsHeight() ;Mouse Related bits;positions x#=MouseX() : y#=MouseY() xs=MouseXSpeed() : ys=MouseYSpeed() ; see how far the mouse has been moved yheight#= Abs(EntityY (camera)) If MouseHit (1) Then PositionEntityFromZ2D (camera, test_sphere, x, y) PositionEntityFromZ2D (camera, piv_target, x, y) pos(V_Pos, 0) = EntityX (piv_target) pos(V_Pos, 1) = EntityY (piv_target) pos(V_Pos, 2) = EntityZ (piv_target) prev_angle = EntityYaw (piv_target,True) ;now draw intersects etc.. If V_Pos = 1 ; must be second anchor point ;position piv_target to last anchor point and point to new position PositionEntity piv_target, pos(V_Pos-1,0),pos(V_Pos-1,1),pos(V_Pos-1,2) PositionEntity piv_pointer, pos(V_Pos,0),pos(V_Pos,1),pos(V_Pos,2) PointEntity piv_target,piv_pointer,0 ElseIf V_Pos > 1 ;calculate the diffence in angles between 2 lines dx#=(pos(V_Pos, 0)-pos(V_Pos-1, 0)) dy#=(pos(V_Pos, 2)-pos(V_Pos-1, 2)) angle1#=ATan2(dy,dx) dx#=(pos(V_Pos-2, 0)-pos(V_Pos-1, 0)) dy#=(pos(V_Pos-2, 2)-pos(V_Pos-1, 2)) angle2#=ATan2(dy,dx) angle = (angle1 + angle2)/2 ;now position and rotate the pivot PositionEntity piv_target, pos(V_Pos-1, 0),pos(V_Pos-1, 1),pos(V_Pos-1, 2) RotateEntity piv_target,0,angle,0 EndIf TFormPoint -60,0,0,piv_target,0 x1 = TFormedX() y1 = TFormedY() z1 = TFormedZ() T_Points(V_Pos,0)=x1 T_Points(V_Pos,1)=y1 T_Points(V_Pos,2)=z1 TFormPoint 10,0,0,piv_target,0 x2 = TFormedX() y2 = TFormedY() z2 = TFormedZ() T_Points(V_Pos,3)=x2 T_Points(V_Pos,4)=y2 T_Points(V_Pos,5)=z2 V_Pos=V_Pos + 1 EndIf If KeyDown( 205 )=True Then TurnEntity camera,0,-180,0 If KeyDown( 203 )=True Then TurnEntity camera,0,180,0 If KeyDown( 208 )=True Then PositionEntity camera,0,-500,0 PointEntity camera,piv_tracker Delay 50 EndIf If KeyDown( 200 )=True Then ;push forward then flip PositionEntity camera,0,500,0 PointEntity camera,piv_tracker Delay 50 EndIf MoveEntity camera,0,0,+MouseZSpeed()*80; move the depth and ramp with distance ;PositionEntity camera,xview,yview,cam_z RenderWorld If V_Pos > 1 Then ; draw the interconnecting lines For loop = 1 To V_Pos-1 Line3d(pos(loop-1, 0),pos(loop-1, 1),pos(loop-1, 2),pos(loop, 0),pos(loop, 1),pos(loop, 2), camera) Line3d(T_Points(loop,0),T_Points(loop,1),T_Points(loop,2),T_Points(loop,3),T_Points(loop,4),T_Points(loop,5), camera) Next EndIf If KeyHit(15) ;tab key - now generate the mesh mesh=CreateMesh() he=CreateBrush(255,255,255) surf=CreateSurface(mesh,he) FreeBrush he vertex_offset=0 For loop = 2 To V_Pos - 1 ;Step 2 AddVertex surf,T_Points(loop,0),T_Points(loop,1),T_Points(loop,2), 0,0 AddVertex surf,T_Points(loop,3),T_Points(loop,4),T_Points(loop,5),1,0 AddVertex surf,T_Points(loop-1,0),T_Points(loop-1,1),T_Points(loop-1,2),0,1 AddVertex surf,T_Points(loop-1,3),T_Points(loop-1,4),T_Points(loop-1,5),1,1 AddTriangle surf,vertex_offset+2,vertex_offset,vertex_offset+1 ; and 2 triangles... AddTriangle surf,vertex_offset+2,vertex_offset+1,vertex_offset+3 vertex_offset=vertex_offset+4 Next bgtexture=CreateTexture(128,128,9) ; Set the drawing buffer to the graphic frame so we can write on it SetBuffer TextureBuffer(bgtexture) ; draw the grid Color 244,255,255 : Rect 0,0,128,128 Color 50,99,201 : Rect 1,1,126,126 Color 244,255,255 : Line 0,64,128,64 Line 64,0,64,128 ; Double buffer mode for smooth screen drawing SetBuffer BackBuffer() UpdateNormals mesh EntityTexture mesh,bgtexture EndIf Flip ; Flip backbuffer to frontbuffer Wend End Function PositionEntityFromZ2D (usecam, entity, x2d#, y2d#) gw = GraphicsWidth () gh = GraphicsHeight () x# = -((gw / 2) - x2d) z# = (gh / 2) - y2d div# = (1/(Abs(EntityY (usecam))/4))*100 PositionEntity entity, x / div, 0, z / div,0 End Function ;================================================================================= ;Draws a 3d line. Use after renderworld. ;================================================================================= Function Line3d(x0#,y0#,z0#,x1#,y1#,z1#, camera) CameraProject (camera,x0,y0,z0) px0#=ProjectedX# ( ) py0#=ProjectedY# ( ) pz0#=ProjectedZ# ( ) CameraProject (camera,x1,y1,z1) Color 255,55,55 If ProjectedZ#( ) >0 And pz0>0 Then Line px0,py0,ProjectedX# ( ) ,ProjectedY# ( ) End Function