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