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.

106 lines
3.0 KiB

4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
3 years ago
4 years ago
  1. package wow.doge.mygame.executors
  2. import java.util.Collections
  3. import java.util.concurrent.AbstractExecutorService
  4. import java.util.concurrent.Executor
  5. import java.util.concurrent.ExecutorService
  6. import java.util.concurrent.ThreadFactory
  7. import java.util.concurrent.TimeUnit
  8. import javax.swing.SwingUtilities
  9. import scala.concurrent.ExecutionContext
  10. import akka.dispatch.DispatcherPrerequisites
  11. import akka.dispatch.ExecutorServiceConfigurator
  12. import akka.dispatch.ExecutorServiceFactory
  13. import com.jme3.app.Application
  14. import com.typesafe.config.Config
  15. import javafx.application.Platform
  16. import monix.execution.Scheduler
  17. // First we wrap invokeLater/runLater as an ExecutorService
  18. trait GUIExecutorService extends AbstractExecutorService {
  19. def execute(command: Runnable): Unit
  20. def shutdown(): Unit = ()
  21. def shutdownNow() = Collections.emptyList[Runnable]
  22. def isShutdown = false
  23. def isTerminated = false
  24. def awaitTermination(l: Long, timeUnit: TimeUnit) = true
  25. }
  26. object JavaFXExecutorService extends GUIExecutorService {
  27. override def execute(command: Runnable) = Platform.runLater(command)
  28. }
  29. object SwingExecutorService extends GUIExecutorService {
  30. override def execute(command: Runnable) = SwingUtilities.invokeLater(command)
  31. }
  32. object JMEExecutorService extends GUIExecutorService {
  33. override def execute(command: Runnable) =
  34. JMERunner.runner.enqueue(command)
  35. }
  36. object JMERunner {
  37. var runner: Application = null
  38. }
  39. class JavaFXEventThreadExecutorServiceConfigurator(
  40. config: Config,
  41. prerequisites: DispatcherPrerequisites
  42. ) extends ExecutorServiceConfigurator(config, prerequisites) {
  43. private val f = new ExecutorServiceFactory {
  44. def createExecutorService: ExecutorService = JavaFXExecutorService
  45. }
  46. def createExecutorServiceFactory(
  47. id: String,
  48. threadFactory: ThreadFactory
  49. ): ExecutorServiceFactory = f
  50. }
  51. class JMEThreadExecutorServiceConfigurator(
  52. config: Config,
  53. prerequisites: DispatcherPrerequisites
  54. ) extends ExecutorServiceConfigurator(config, prerequisites) {
  55. private val f = new ExecutorServiceFactory {
  56. def createExecutorService: ExecutorService = JMEExecutorService
  57. }
  58. def createExecutorServiceFactory(
  59. id: String,
  60. threadFactory: ThreadFactory
  61. ): ExecutorServiceFactory = f
  62. }
  63. // Then we create an ExecutorServiceConfigurator so that Akka can use our SwingExecutorService for the dispatchers
  64. class SwingEventThreadExecutorServiceConfigurator(
  65. config: Config,
  66. prerequisites: DispatcherPrerequisites
  67. ) extends ExecutorServiceConfigurator(config, prerequisites) {
  68. private val f = new ExecutorServiceFactory {
  69. def createExecutorService: ExecutorService = SwingExecutorService
  70. }
  71. def createExecutorServiceFactory(
  72. id: String,
  73. threadFactory: ThreadFactory
  74. ): ExecutorServiceFactory = f
  75. }
  76. object JFXExecutionContexts {
  77. val javaFxExecutionContext: ExecutionContext =
  78. ExecutionContext.fromExecutor(new Executor {
  79. def execute(command: Runnable): Unit =
  80. Platform.runLater(command)
  81. })
  82. val fxScheduler =
  83. Scheduler(javaFxExecutionContext)
  84. }