Move warp lanes to their own 3d group
authorTheSaminator <thesaminator@users.noreply.github.com>
Tue, 5 Jul 2022 14:48:34 +0000 (10:48 -0400)
committerTheSaminator <thesaminator@users.noreply.github.com>
Tue, 5 Jul 2022 14:54:35 +0000 (10:54 -0400)
src/jsMain/kotlin/net/starshipfights/campaign/render_data.kt
src/jsMain/kotlin/net/starshipfights/campaign/space_render.kt

index 5852de7f30983ec759b1e7dfe676397e29b21a4a..3083bc495418f64ab058d0d0ddb48983bd6b079b 100644 (file)
@@ -10,12 +10,31 @@ fun WarpLane.resolve(cluster: StarClusterView): WarpLaneData? =
                }
        }
 
+fun WarpLane.withData(cluster: StarClusterView): WarpLaneWithData? =
+       systemA.resolve(cluster)?.let { a ->
+               systemB.resolve(cluster)?.let { b ->
+                       WarpLaneWithData(StarSystemWithId(systemA, a), StarSystemWithId(systemB, b))
+               }
+       }
+
 @Serializable
 data class WarpLaneData(
        val systemA: StarSystem,
        val systemB: StarSystem,
 )
 
+@Serializable
+data class WarpLaneWithData(
+       val systemA: StarSystemWithId,
+       val systemB: StarSystemWithId,
+) {
+       val lane: WarpLane
+               get() = WarpLane(systemA.id, systemB.id)
+       
+       val data: WarpLaneData
+               get() = WarpLaneData(systemA.starSystem, systemB.starSystem)
+}
+
 fun Id<StarSystem>.resolve(cluster: StarClusterView): StarSystem? = cluster.systems[this]
 
 @Serializable
index 15f149fdbb4b6c0dbf00e2e4f1f49b46b61e8180..715fdb43be5c99a5ee33ca224272206dd0cbabfd 100644 (file)
@@ -29,13 +29,16 @@ object CampaignResources {
        
        private lateinit var starSystem: CustomRenderFactory<StarSystemWithId>
        
-       private lateinit var warpLane: CustomRenderFactory<WarpLaneData>
+       private lateinit var warpLane: CustomRenderFactory<WarpLaneWithData>
+       private lateinit var warpLanes: CustomRenderFactory<StarClusterView>
        
        lateinit var starCluster: CustomRenderFactory<StarClusterView>
                private set
        
        suspend fun load() {
-               warpLane = CustomRenderFactory { (systemA, systemB) ->
+               warpLane = CustomRenderFactory { laneWithData ->
+                       val (systemA, systemB) = laneWithData.data
+                       
                        val warpLaneMaterial = MeshBasicMaterial(configure { color = Color("#FFFFFF") })
                        
                        val aToBCenter = systemB.position - systemA.position
@@ -58,7 +61,18 @@ object CampaignResources {
                                false
                        )
                        
-                       Mesh(warpLaneGeometry, warpLaneMaterial)
+                       Mesh(warpLaneGeometry, warpLaneMaterial).apply {
+                               userData = WarpLaneRender(laneWithData.lane)
+                       }
+               }
+               
+               warpLanes = CustomRenderFactory { cluster ->
+                       Group().apply {
+                               for (lane in cluster.lanes)
+                                       add(warpLane.generate(lane.withData(cluster) ?: continue))
+                               
+                               userData = WARP_LANES_UD
+                       }
                }
                
                coroutineScope {
@@ -336,7 +350,7 @@ object CampaignResources {
                                                for (systemFleets in systemsFleets)
                                                        add(systemFleets)
                                                
-                                               userData = "fleet counters"
+                                               userData = CLUSTER_FLEETS_UD
                                        }
                                }
                        }
@@ -382,12 +396,10 @@ object CampaignResources {
                                for ((id, system) in cluster.systems)
                                        add(starSystem.generate(StarSystemWithId(id, system)))
                                
-                               for (lane in cluster.lanes)
-                                       add(warpLane.generate(lane.resolve(cluster) ?: continue))
-                               
+                               add(warpLanes.generate(cluster))
                                add(fleetCountersInCluster.generate(cluster))
                                
-                               userData = "star cluster"
+                               userData = STAR_CLUSTER_UD
                        }
                }
        }
@@ -481,6 +493,27 @@ val Object3D.fleetPresenceRender: FleetPresencePointer?
        else
                parent?.fleetPresenceRender
 
+external interface WarpLaneRender {
+       var isWarpLane: Boolean
+       var systemAId: String
+       var systemBId: String
+}
+
+fun WarpLaneRender(lane: WarpLane) = configure<WarpLaneRender> {
+       isWarpLane = true
+       systemAId = lane.systemA.id
+       systemBId = lane.systemB.id
+}
+
+val WarpLaneRender.warpLane: WarpLane
+       get() = WarpLane(Id(systemAId), Id(systemBId))
+
+val Object3D.warpLaneRender: WarpLane?
+       get() = if (userData.isWarpLane == true)
+               userData.unsafeCast<WarpLaneRender>().warpLane
+       else
+               null
+
 val StarClusterBackground.ambientColor: IntColor
        get() = when (this) {
                StarClusterBackground.BLUE -> IntColor(34, 51, 85)
@@ -493,10 +526,16 @@ val StarClusterBackground.ambientColor: IntColor
                StarClusterBackground.RED -> IntColor(85, 0, 0)
        }
 
+const val STAR_CLUSTER_UD = "star cluster"
 val Object3D.isStarCluster: Boolean
-       get() = userData == "star cluster"
+       get() = userData == STAR_CLUSTER_UD
+
+const val WARP_LANES_UD = "warp lanes"
+val Object3D.isStarClusterWarpLanes: Boolean
+       get() = userData == WARP_LANES_UD
 
+const val CLUSTER_FLEETS_UD = "fleet counters"
 val Object3D.isStarClusterFleets: Boolean
-       get() = userData == "fleet counters"
+       get() = userData == CLUSTER_FLEETS_UD
 
 fun Object3D.isStarSystemFleets(system: Id<StarSystem>) = (parent?.isStarClusterFleets == true) && userData == system.id