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.

57 lines
1.9 KiB

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 scala.reflect.ClassTag
  3. import cats.Show
  4. import cats.kernel.Eq
  5. import com.jme3.asset.AssetLoadException
  6. import com.jme3.asset.AssetLocator
  7. import com.jme3.asset.AssetNotFoundException
  8. import com.jme3.scene.Spatial
  9. import com.jme3.{asset => jmea}
  10. import monix.bio.IO
  11. import monix.bio.UIO
  12. class AssetManager(assetManager: jmea.AssetManager) {
  13. import AssetManager._
  14. def loadModel(path: os.RelPath): IO[Error, Spatial] =
  15. IO(assetManager.loadModel(path.toString)).onErrorHandleWith {
  16. case ex: AssetNotFoundException =>
  17. IO.raiseError(AssetNotFound(ex.getMessage))
  18. case ex: AssetLoadException =>
  19. IO.raiseError(AssetLoadError(ex.getMessage))
  20. }
  21. def loadModelAs[T <: Spatial](
  22. path: os.RelPath
  23. )(implicit ct: ClassTag[T]): IO[Error, T] =
  24. loadModel(path).flatMap(model =>
  25. if (model.getClass == ct.runtimeClass)
  26. UIO(model.asInstanceOf[T])
  27. else IO.raiseError(CouldNotCastError)
  28. )
  29. def loadAssetAs[T](path: os.RelPath)(implicit ct: ClassTag[T]): IO[Error, T] =
  30. IO(assetManager.loadAsset(path.toString))
  31. .onErrorHandleWith {
  32. case ex: AssetNotFoundException =>
  33. IO.raiseError(AssetNotFound(ex.getMessage))
  34. case ex: AssetLoadException =>
  35. IO.raiseError(AssetLoadError(ex.getMessage))
  36. }
  37. .flatMap(asset =>
  38. if (asset.getClass == ct.runtimeClass)
  39. UIO(asset.asInstanceOf[T])
  40. else IO.raiseError(CouldNotCastError)
  41. )
  42. def registerLocator(path: os.RelPath, locator: Class[_ <: AssetLocator]) =
  43. UIO(assetManager.registerLocator(path.toString, locator))
  44. }
  45. object AssetManager {
  46. sealed trait Error
  47. case class AssetNotFound(message: String) extends Error
  48. case class AssetLoadError(message: String) extends Error
  49. case object CouldNotCastError extends Error
  50. object Error {
  51. implicit val show = Show.fromToString[Error]
  52. implicit val eq = Eq.fromUniversalEquals[Error]
  53. }
  54. }