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.

61 lines
2.1 KiB

3 years ago
  1. package wow.doge.mygame.utils.wrappers.jme
  2. import scala.reflect.ClassTag
  3. import com.jme3.asset.AssetLoadException
  4. import com.jme3.asset.AssetLocator
  5. import com.jme3.asset.AssetNotFoundException
  6. import com.jme3.scene.Spatial
  7. import com.jme3.{asset => jmea}
  8. import monix.bio.IO
  9. import monix.bio.UIO
  10. class AssetManager(assetManager: jmea.AssetManager) {
  11. import AssetManager._
  12. def loadModel(path: os.RelPath): IO[Error, Spatial] =
  13. IO(assetManager.loadModel(path.toString)).onErrorHandleWith {
  14. case ex: AssetNotFoundException =>
  15. IO.raiseError(AssetNotFound(ex.getMessage))
  16. case ex: AssetLoadException =>
  17. IO.raiseError(AssetLoadError(ex.getMessage))
  18. }
  19. def loadModelAs[T <: Spatial](
  20. path: os.RelPath
  21. )(implicit ct: ClassTag[T]): IO[Error, T] =
  22. loadModel(path).flatMap(model =>
  23. if (model.getClass == ct.runtimeClass)
  24. UIO(model.asInstanceOf[T])
  25. else IO.raiseError(CouldNotCastError)
  26. )
  27. def loadAssetAs[T](path: os.RelPath)(implicit ct: ClassTag[T]): IO[Error, T] =
  28. IO(assetManager.loadAsset(path.toString))
  29. .onErrorHandleWith {
  30. case ex: AssetNotFoundException =>
  31. IO.raiseError(AssetNotFound(ex.getMessage))
  32. case ex: AssetLoadException =>
  33. IO.raiseError(AssetLoadError(ex.getMessage))
  34. }
  35. .flatMap(asset =>
  36. if (asset.getClass == ct.runtimeClass)
  37. UIO(asset.asInstanceOf[T])
  38. else IO.raiseError(CouldNotCastError)
  39. )
  40. def registerLocator(path: os.RelPath, locator: Class[_ <: AssetLocator]) =
  41. UIO(assetManager.registerLocator(path.toString, locator))
  42. }
  43. object AssetManager {
  44. sealed trait Error
  45. case class AssetNotFound(message: String) extends Error
  46. case class AssetLoadError(message: String) extends Error
  47. case object CouldNotCastError extends Error
  48. import cats.data.ReaderT
  49. type IoReaderT[S, E, A] = ReaderT[UIO, S, Either[E, A]]
  50. val IoReaderT = ReaderT
  51. val t =
  52. ReaderT[UIO, String, Either[Error, Unit]](s => UIO.unit.attempt)
  53. .run("s")
  54. .rethrow
  55. val r: IoReaderT[String, Error, Unit] = IoReaderT(s => UIO.unit.attempt)
  56. val t2 = r.run("s").rethrow
  57. // Kleisli[IO, String, Unit](s => IO.unit)
  58. }