I'm currently doing some test with RayCast() and it doesn't work as (I) expected. In the following code I try to test connections of waypoints via RayCast and it seems they can (almost) all see each other. Mustn't the ray be interrupted by the walls? Am I doing something wrong? And why does the RayCast return 0? I think it should only return 5 or 8 (the wall entities).
Code: Select all
InitEngine3D()
InitSprite()
Structure Str_PathConnection
*Waypoint
Distance.d
EndStructure
Structure Str_PathWaypoint
Entity.l
List Connection.Str_PathConnection()
EndStructure
Global NewList Waypoint.Str_PathWaypoint()
#WallPick = 1 << 1
;WorldDebug(#PB_World_DebugEntity)
OpenWindow(0,100,100,800,600,"Test")
OpenWindowedScreen(WindowID(0),0,0,800,600)
; Camera
CreateCamera(1,0,0,100,100)
MoveCamera(1,0,100,100,#PB_Relative)
RotateCamera(1,-50,0,0)
; Materials
CreateTexture(0,256,256)
StartDrawing(TextureOutput(0))
Box(0,0,255,255,RGB(200,0,0))
StopDrawing()
CreateTexture(1,256,256)
StartDrawing(TextureOutput(1))
Box(0,0,255,255,RGB(0,0,200))
StopDrawing()
CreateTexture(2,256,256)
StartDrawing(TextureOutput(2))
Box(0,0,255,255,RGB(0,200,200))
StopDrawing()
CreateMaterial(0,TextureID(0))
CreateMaterial(1,TextureID(1))
CreateMaterial(2,TextureID(2))
; Floor
CreatePlane(2,100,100,10,10,1,1)
CreateEntity(3,MeshID(2),MaterialID(0))
; Walls
CreateCube(4,10)
CreateEntity(5,MeshID(4),MaterialID(1),0,0,0,#WallPick)
ScaleEntity(5,5,2,0.3)
CreateEntity(8,MeshID(4),MaterialID(1),20,0,0,#WallPick)
ScaleEntity(8,0.3,2,5)
; Light
CreateLight(6,RGB(255,255,255),0,100,0)
AmbientColor(RGB(25, 25, 25))
Global WaypointMesh=CreateCylinder(#PB_Any,0.2,15)
Hero=CreateEntity(#PB_Any,MeshID(WaypointMesh),MaterialID(2),10,0,20,0)
ScaleEntity(Hero,3,1,10)
Aim=CreateEntity(#PB_Any,MeshID(WaypointMesh),MaterialID(2),0,0,-20,0)
Procedure Pathfinding_Init(StartMesh,AimMesh)
Protected *TempWaypoint.Str_PathWaypoint
Protected LineCount=0
; Add Start and Aim to the waypoint graph
AddElement(Waypoint())
Waypoint()\Entity=StartMesh
AddElement(Waypoint())
Waypoint()\Entity=AimMesh
; Check all connections between waypoints
ForEach Waypoint()
ClearList(Waypoint()\Connection())
*TempWaypoint=@Waypoint()
PushListPosition(Waypoint())
ForEach Waypoint()
If @Waypoint()<>*TempWaypoint
Res=RayCast(EntityX(*TempWaypoint\Entity),EntityY(*TempWaypoint\Entity)+4,EntityZ(*TempWaypoint\Entity),EntityX(Waypoint()\Entity),EntityY(Waypoint()\Entity)+4,EntityZ(Waypoint()\Entity),#WallPick)
Debug "Cast ("+StrD(EntityX(*TempWaypoint\Entity))+", "+StrD(EntityY(*TempWaypoint\Entity))+", "+StrD(EntityZ(*TempWaypoint\Entity))+") - ("+StrD(EntityX(Waypoint()\Entity))+", "+StrD(EntityY(Waypoint()\Entity))+", "+StrD(EntityZ(Waypoint()\Entity))+")"
If Res<0
AddElement(*TempWaypoint\Connection())
*TempWaypoint\Connection()\Waypoint=@Waypoint()
*TempWaypoint\Connection()\Distance=Sqr(Pow(EntityX(*TempWaypoint\Entity)+EntityX(Waypoint()\Entity),2.0) + Pow(EntityY(*TempWaypoint\Entity)+EntityY(Waypoint()\Entity),2.0) + Pow(EntityZ(*TempWaypoint\Entity)+EntityZ(Waypoint()\Entity),2.0))
CreateLine3D(100+LineCount,EntityX(*TempWaypoint\Entity),EntityY(*TempWaypoint\Entity)+4,EntityZ(*TempWaypoint\Entity),RGB(255,255,255),EntityX(Waypoint()\Entity),EntityY(Waypoint()\Entity)+4,EntityZ(Waypoint()\Entity),RGB(255,255,255))
LineCount+1
Debug "Connection!"
Else
Debug "No Connection - Wall: "+Str(Res)
EndIf
EndIf
Next
PopListPosition(Waypoint())
Next
EndProcedure
Procedure Add_Waypoint(x.d,y.d,z.d)
AddElement(Waypoint())
Waypoint()\Entity=CreateEntity(#PB_Any,MeshID(WaypointMesh),MaterialID(1),x,y,z)
EndProcedure
; Add some waypoints
Add_Waypoint(30,0,10)
Add_Waypoint(-30,0,10)
Add_Waypoint(-30,0,-30)
; Render world has to be called once, otherwise RayCast does not work
RenderWorld()
Pathfinding_Init(Hero,Aim)
; Create overlay sprite for text output
Overlay=CreateSprite(#PB_Any,800,600)
StartDrawing(SpriteOutput(Overlay))
DrawingMode(#PB_2DDrawing_Transparent)
ForEach Waypoint()
DrawText(CameraProjectionX(1,EntityX(Waypoint()\Entity),EntityY(Waypoint()\Entity),EntityZ(Waypoint()\Entity)),CameraProjectionY(1,EntityX(Waypoint()\Entity),EntityY(Waypoint()\Entity),EntityZ(Waypoint()\Entity)),"("+StrD(EntityX(Waypoint()\Entity))+", "+StrD(EntityY(Waypoint()\Entity))+", "+StrD(EntityZ(Waypoint()\Entity))+")")
Next
StopDrawing()
; Main loop
Repeat
RenderWorld()
DisplayTransparentSprite(Overlay,0,0)
FlipBuffers()
Until WindowEvent()=#PB_Event_CloseWindow
MAC