Testing out JmonkeyEngine to make a game in Scala with Akka Actors within a pure FP layer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
2.4 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package wow.doge.mygame.utils.wrappers.jme
  2. import com.jme3.bullet.control.PhysicsControl
  3. import com.jme3.bullet.joints.PhysicsJoint
  4. import com.jme3.{bullet => jmeb}
  5. import com.jme3.{scene => jmes}
  6. import monix.bio.UIO
  7. import wow.doge.mygame.implicits._
  8. final class PhysicsSpace(space: jmeb.PhysicsSpace) {
  9. def add[T](addable: T)(implicit P: PhysicsSpaceAddable[T]) =
  10. UIO(P.addToSpace(addable, space))
  11. def remove(anyObject: Any) = UIO(space.remove(anyObject))
  12. def addAll(spatial: jmes.Spatial) = UIO(space.addAll(spatial))
  13. def removeAll(spatial: jmes.Spatial) = UIO(space.removeAll(spatial))
  14. def collisionObservable = space.collisionObservable()
  15. // space.enqueue(() => ())
  16. def physicsTickObservable = space.physicsTickObservable()
  17. def prePhysicsTickObservable = space.prePhysicsTickObservable()
  18. }
  19. object PhysicsSpace {
  20. implicit final class PhysicsSpaceOps(private val space: PhysicsSpace)
  21. extends AnyVal {
  22. def +=[T: PhysicsSpaceAddable](addable: T) = space.add(addable)
  23. def :+[T: PhysicsSpaceAddable](addable: T) =
  24. for {
  25. _ <- space.add(addable)
  26. } yield space
  27. def -(anyObject: Any) =
  28. for {
  29. _ <- space.remove(anyObject)
  30. } yield space
  31. def -=(anyObject: Any) = space.remove(anyObject)
  32. def +=(spatial: jmes.Spatial) = space.addAll(spatial)
  33. // def :+(spatial: jmes.Spatial) = {
  34. // space.addAll(spatial)
  35. // space
  36. // }
  37. // def -(spatial: jmes.Spatial) = {
  38. // space.removeAll(spatial)
  39. // space
  40. // }
  41. def -=(spatial: jmes.Spatial) = space.removeAll(spatial)
  42. }
  43. }
  44. trait PhysicsSpaceAddable[-T] {
  45. def addToSpace(inst: T, space: jmeb.PhysicsSpace): Unit
  46. }
  47. object PhysicsSpaceAddable {
  48. implicit val physicsSpaceAddableForPhysControl =
  49. new PhysicsSpaceAddable[PhysicsControl] {
  50. override def addToSpace(
  51. inst: PhysicsControl,
  52. space: jmeb.PhysicsSpace
  53. ): Unit = space.add(inst)
  54. }
  55. implicit val physicsSpaceAddableForSpatial =
  56. new PhysicsSpaceAddable[jmes.Spatial] {
  57. override def addToSpace(
  58. inst: jmes.Spatial,
  59. space: jmeb.PhysicsSpace
  60. ): Unit = space.add(inst)
  61. }
  62. implicit val physicsSpaceAddableForPhysJoint =
  63. new PhysicsSpaceAddable[PhysicsJoint] {
  64. override def addToSpace(
  65. inst: PhysicsJoint,
  66. space: jmeb.PhysicsSpace
  67. ): Unit = space.add(inst)
  68. }
  69. }