Code archives/3D Graphics - Misc/Retrieve the kind (listname), the id (index), of a pickable or of a collidable after a linepick or after a collision (vDim arrays)
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| How to know in which list to search and which id (index) to search after a linepick or after a collision (vDim arrays) | |||||
;Retrieve the kind (listname), the id (index), of a pickable or of a collidable after a linepick or after a collision
;This is useful to know in which list to search and which id (index) to search after a linepick or after a collision
;with different lists of different kinds
;with entities stored in Dim arrays
;Notes :
;by "pickable" i mean a pivot (with EntityRadius Or EntityBox) or a mesh set as pickable (with EntityPickMode)
;by "collidable" i mean a pivot (with EntityRadius Or EntityBox) or a mesh set as collidable (with EntityType and Collisions)
;The Camera (start point of the linepick) must be near enough a pickable to be able to pick it (less than 10units)
;The ColliderE must be near enough a collidable to be able to provoke a collision (less than 10units)
;Hit the MouseKeyLeft to throw a linepick and maybe see the results of a pick
;Hit the MouseKeyRight to throw a colliderE and maybe see the results of a collision
Graphics3D(800,600,32,2)
SeedRnd(MilliSecs())
Origine = CreateCube()
ScaleMesh(Origine,0.01/2,0.01/2,0.01/2)
EntityColor(Origine,255,000,000)
Global Camera = CreateCamera()
CameraRange(Camera,0.1,100)
Global CameraPitch# = 0
Global CameraYaw# = 0
Const GroupColliderE% = 1
Const GroupTerrain% = 2
Const GroupBalls% = 3
Const GroupCrates% = 4
Const GroupBarrels% = 5
;Terrain
Global TerrainB3D = CreateTerrain(32)
For VX% = 0 To 31
For VZ% = 0 To 31
HeightRGB% = Rand(030,033)
Height# = 1.0/255*HeightRGB
ModifyTerrain(TerrainB3D,VX,VZ,Height,False)
Next
Next
ScaleEntity(TerrainB3D,1,25.5,1)
TerrainDetail(TerrainB3D,2048,True)
TerrainShading(TerrainB3D,True)
PositionEntity(TerrainB3D,0,0,0)
EntityColor(TerrainB3D,Rnd(125,255),Rnd(125,255),Rnd(125,255))
NameEntity(TerrainB3D,"TER"+Str(1))
EntityType(TerrainB3D,GroupTerrain)
;Balls
Global BallsCount% = 0
Dim BallMesh(10)
For i% = 1 To 10
BallsCount = BallsCount + 1
BId% = BallsCount
BallMesh(BId) = CreateSphere(8)
ScaleMesh(BallMesh(BId),0.25/2,0.25/2,0.25/2)
PositionMesh(BallMesh(BId),0,0.25/2,0)
.LineChooseBallPosition
X# = Rnd(1,31)
Z# = Rnd(1,31)
Y# = TerrainY(TerrainB3D,X,0,Z)
PositionEntity(BallMesh(BId),X,Y,Z)
If(BallsCount > 1)
For OBId% = 1 To BallsCount
If(OBId <> BId)
Distance# = EntityDistance(BallMesh(BId),BallMesh(OBId))
If(Distance <= 0.125+0.125)
Goto LineChooseBallPosition
EndIf
EndIf
Next
EndIf
EntityColor(BallMesh(BId),Rnd(125,255),Rnd(125,255),Rnd(125,255))
NameEntity(BallMesh(BId),"BAL"+Str(BId))
EntityType(BallMesh(BId),GroupBalls)
Next
;Crates
Global CratesCount% = 0
Dim CrateMesh(10)
For i% = 1 To 10
CratesCount = CratesCount + 1
CId% = CratesCount
CrateMesh(CId) = CreateCube()
ScaleMesh(CrateMesh(CId),0.5/2,0.5/2,0.5/2)
PositionMesh(CrateMesh(CId),0,0.5/2,0)
.LineChooseCratePosition
X# = Rnd(1,31)
Z# = Rnd(1,31)
Y# = TerrainY(TerrainB3D,X,0,Z)
PositionEntity(CrateMesh(CId),X,Y,Z)
For BId% = 1 To BallsCount
Distance# = EntityDistance(CrateMesh(CId),BallMesh(BId))
If(Distance <= 0.25+0.125)
Goto LineChooseCratePosition
EndIf
Next
If(CratesCount > 1)
For OCId% = 1 To CratesCount
If(OCId <> CId)
Distance# = EntityDistance(CrateMesh(CId),CrateMesh(OCId))
If(Distance <= 0.25+0.25)
Goto LineChooseCratePosition
EndIf
EndIf
Next
EndIf
EntityColor(CrateMesh(CId),Rnd(125,255),Rnd(125,255),Rnd(125,255))
NameEntity(CrateMesh(CId),"CRA"+Str(CId))
EntityType(CrateMesh(CId),GroupCrates)
Next
;Barrels
Global BarrelsCount% = 0
Dim BarrelMesh(10)
For i% = 1 To 10
BarrelsCount = BarrelsCount + 1
BId% = BarrelsCount
BarrelMesh(BId) = CreateCylinder(8)
ScaleMesh(BarrelMesh(BId),0.5/2,0.75/2,0.5/2)
PositionMesh(BarrelMesh(BId),0,0.75/2,0)
.LineChooseBarrelPosition
X# = Rnd(1,31)
Z# = Rnd(1,31)
Y# = TerrainY(TerrainB3D,X,0,Z)
PositionEntity(BarrelMesh(BId),X,Y,Z)
For BaId% = 1 To BallsCount
Distance# = EntityDistance(BarrelMesh(BId),BallMesh(BaId))
If(Distance <= 0.25+0.125)
Goto LineChooseBarrelPosition
EndIf
Next
For CId% = 1 To CratesCount
Distance# = EntityDistance(BarrelMesh(BId),CrateMesh(CId))
If(Distance <= 0.25+0.25)
Goto LineChooseBarrelPosition
EndIf
Next
If(BarrelsCount > 1)
For OBId% = 1 To BarrelsCount
If(OBId <> BId)
Distance# = EntityDistance(BarrelMesh(BId),BarrelMesh(OBId))
If(Distance <= 0.25+0.25)
Goto LineChooseBarrelPosition
EndIf
EndIf
Next
EndIf
EntityColor(BarrelMesh(BId),Rnd(125,255),Rnd(125,255),Rnd(125,255))
NameEntity(BarrelMesh(BId),"BAR"+Str(BId))
EntityType(BarrelMesh(BId),GroupBarrels)
Next
Global PickedPickable%
Global PickedName$
Global PickedKind$
Global PickedId%
Global CollidedCollidable%
Global CollidedName$
Global CollidedKind$
Global CollidedId%
PositionEntity(Camera,16,3.3+1.6,0)
DLight = CreateLight(1)
LightColor(DLight,255,255,255)
PositionEntity(DLight,-1000,1000,-1000)
RotateEntity(DLight,45,-45,0)
AmbientLight(050,050,050)
Repeat
UpdateCamera()
If(KeyDown(2)=1)
WireFrame(True)
Else
WireFrame(False)
EndIf
SetBuffer(BackBuffer())
RenderWorld()
Text(0,0,"PickedPickable = "+Str(PickedPickable))
Text(0,20,"PickedName = "+PickedName)
Text(0,40,"PickedKind = "+PickedKind)
Text(0,60,"PickedId = "+Str(PickedId))
Text(0,100,"CollidedCollidable = "+Str(CollidedCollidable))
Text(0,120,"CollidedName = "+CollidedName)
Text(0,140,"CollidedKind = "+CollidedKind)
Text(0,160,"CollidedId = "+Str(CollidedId))
Flip(1)
Until(KeyDown(1)=1)
EndGraphics()
End()
Function UpdateCamera()
MXSpeed# = MouseXSpeed()
MYSpeed# = MouseYSpeed()
MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2)
CameraPitch = CameraPitch + MYSpeed*0.1
If(CameraPitch > 89)
CameraPitch = 89
EndIf
If(CameraPitch < -89)
CameraPitch = -89
EndIf
CameraYaw = CameraYaw - MXSpeed*0.1
RotateEntity(Camera,CameraPitch,CameraYaw,0)
If(KeyDown(17)=1)
MoveEntity(Camera,0,0,0.1)
ElseIf(KeyDown(31)=1)
MoveEntity(Camera,0,0,-0.1)
EndIf
If(MouseHit(1)>0)
ThrowLinePick()
ElseIf(MouseHit(2)>0)
ThrowColliderE()
EndIf
End Function
Function ThrowLinePick()
EntityPickMode(TerrainB3D,2)
For BId = 1 To BallsCount
EntityPickMode(BallMesh(BId),2)
Next
For CId = 1 To CratesCount
EntityPickMode(CrateMesh(CId),2)
Next
For BId = 1 To BarrelsCount
EntityPickMode(BarrelMesh(BId),2)
Next
TFormVector(0,0,10,Camera,0)
LinePick(EntityX(Camera,True),EntityY(Camera,True),EntityZ(Camera,True),TFormedX(),TFormedY(),TFormedZ())
PickedPickable = PickedEntity()
If(PickedPickable <> 0)
DebugPickedPoint = CreateCube()
ScaleMesh(DebugPickedPoint,0.01/2,0.01/2,0.01/2)
PositionEntity(DebugPickedPoint,PickedX(),PickedY(),PickedZ())
EntityColor(DebugPickedPoint,255,000,000)
PickedName$ = EntityName(PickedPickable)
PickedKind$ = Left(PickedName,3)
PickedId% = Right(PickedName,Len(PickedName)-3)
If(PickedKind = "TER")
EntityColor(TerrainB3D,Rnd(125,255),Rnd(125,255),Rnd(125,255))
ElseIf(PickedKind = "BAL")
EntityColor(BallMesh(PickedId),Rnd(125,255),Rnd(125,255),Rnd(125,255))
ElseIf(PickedKind = "CRA")
EntityColor(CrateMesh(PickedId),Rnd(125,255),Rnd(125,255),Rnd(125,255))
ElseIf(PickedKind = "BAR")
EntityColor(BarrelMesh(PickedId),Rnd(125,255),Rnd(125,255),Rnd(125,255))
EndIf
EndIf
EntityPickMode(TerrainB3D,0)
For BId = 1 To BallsCount
EntityPickMode(BallMesh(BId),0)
Next
For CId = 1 To CratesCount
EntityPickMode(CrateMesh(CId),0)
Next
For BId = 1 To BarrelsCount
EntityPickMode(BarrelMesh(BId),0)
Next
End Function
Function ThrowColliderE()
ColliderE = CreatePivot()
EntityRadius(ColliderE,0.251)
PositionEntity(ColliderE,EntityX(Camera,True),EntityY(Camera,True),EntityZ(Camera,True))
RotateEntity(ColliderE,EntityPitch(Camera,True),EntityYaw(Camera,True),EntityRoll(Camera,True))
EntityType(ColliderE,GroupColliderE)
Collisions(GroupColliderE,GroupTerrain,2,1)
Collisions(GroupColliderE,GroupBalls,2,1)
Collisions(GroupColliderE,GroupCrates,2,1)
Collisions(GroupColliderE,GroupBarrels,2,1)
For i% = 1 To 10.0/0.25 Step 1
MoveEntity(ColliderE,0,0,0.25)
UpdateWorld()
CC% = CountCollisions(ColliderE)
If(CC% > 0)
CollidedCollidable = CollisionEntity(ColliderE,1)
If(CollidedCollidable <> 0)
DebugCollidedPoint = CreateCube()
ScaleMesh(DebugCollidedPoint,0.01/2,0.01/2,0.01/2)
PositionEntity(DebugCollidedPoint,CollisionX(ColliderE,1),CollisionY(ColliderE,1),CollisionZ(ColliderE,1))
EntityColor(DebugCollidedPoint,255,000,255)
CollidedName$ = EntityName(CollidedCollidable)
CollidedKind$ = Left(CollidedName,3)
CollidedId% = Right(CollidedName,Len(CollidedName)-3)
If(CollidedKind = "TER")
EntityColor(TerrainB3D,Rnd(125,255),Rnd(125,255),Rnd(125,255))
ElseIf(CollidedKind = "BAL")
EntityColor(BallMesh(CollidedId),Rnd(125,255),Rnd(125,255),Rnd(125,255))
ElseIf(CollidedKind = "CRA")
EntityColor(CrateMesh(CollidedId),Rnd(125,255),Rnd(125,255),Rnd(125,255))
ElseIf(CollidedKind = "BAR")
EntityColor(BarrelMesh(CollidedId),Rnd(125,255),Rnd(125,255),Rnd(125,255))
EndIf
EndIf
EndIf
Next
DebugColliderE = CreateSphere(16)
ScaleMesh(DebugColliderE,0.5/2,0.5/2,0.5/2)
PositionEntity(DebugColliderE,EntityX(ColliderE,True),EntityY(ColliderE,True),EntityZ(ColliderE,True))
RotateEntity(DebugColliderE,EntityPitch(ColliderE,True),EntityYaw(ColliderE,True),EntityRoll(ColliderE,True))
EntityAlpha(DebugColliderE,0.5)
ClearCollisions()
FreeEntity(ColliderE)
End Function |
Comments
None.
Code Archives Forum