From 6b54b5d6726f46e538513711e67d3b3747ceda4f Mon Sep 17 00:00:00 2001 From: TheSaminator Date: Tue, 5 Jul 2022 10:48:34 -0400 Subject: [PATCH] Move warp lanes to their own 3d group --- .../starshipfights/campaign/render_data.kt | 19 ++++++ .../starshipfights/campaign/space_render.kt | 59 +++++++++++++++---- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/jsMain/kotlin/net/starshipfights/campaign/render_data.kt b/src/jsMain/kotlin/net/starshipfights/campaign/render_data.kt index 5852de7..3083bc4 100644 --- a/src/jsMain/kotlin/net/starshipfights/campaign/render_data.kt +++ b/src/jsMain/kotlin/net/starshipfights/campaign/render_data.kt @@ -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.resolve(cluster: StarClusterView): StarSystem? = cluster.systems[this] @Serializable diff --git a/src/jsMain/kotlin/net/starshipfights/campaign/space_render.kt b/src/jsMain/kotlin/net/starshipfights/campaign/space_render.kt index 15f149f..715fdb4 100644 --- a/src/jsMain/kotlin/net/starshipfights/campaign/space_render.kt +++ b/src/jsMain/kotlin/net/starshipfights/campaign/space_render.kt @@ -29,13 +29,16 @@ object CampaignResources { private lateinit var starSystem: CustomRenderFactory - private lateinit var warpLane: CustomRenderFactory + private lateinit var warpLane: CustomRenderFactory + private lateinit var warpLanes: CustomRenderFactory lateinit var starCluster: CustomRenderFactory 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 { + 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().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) = (parent?.isStarClusterFleets == true) && userData == system.id -- 2.25.1