I would like to make an interactive world map that consists of clickable regions , just like the maps in Paradox Interactive’s Europa Universalis IV and Hearts of Iron IV.
The game would, just as in EUI4 and HOI4, consist of just the map and menus that have actions. Below is a screenshot of Europa Universalis with its world map (the game revolves around the 15-19th centuries, that’s why the map looks like that).
I found out that Paradox (the developer of this game) uses several bitmap files, each that have their own role, to finally draw up this map. For example, one of the bitmap files defines where the different provinces (clickable regions) are:
Every single province has a unique RGB value. There is a seperate file called definition.csv that defines a name for all of the RGB values. For example, if there are a few pixels in the .bmp file that have the RGB value of (50,32, 120). In the definition.csv, there would be a line defining what province name goes with that specific RGB value.
So, how would i go on creating something similar in Unreal? All I want currently is a map with defined regions that I select (the selection can be graphically represented by the borders of the selected region glowing, for example), and from there i can take it. Should I do something similar to what paradox did with the bitmaps and build a parser that parses .bmp files and checks every pixel’s value? If I do that, how would I graphically build the map after i’ve extracted the values? Or is there a simpler route that I can try? Should I also do this purely with UMG?
Of course i’m not asking for step-by-step but more of a general idea of the route I should take.
I looked into this before and you pretty much are on the right track. They use texture lookup with unique, indexed color values. So if you click on the map, the Clausewitz engine returns you a color value. They then check what ID this color value is mapped to and from there they can find all the information of the province using the found ID.
So the biggest task would be to find a way to translate your mouse cursor position to a color and then to a province ID.
Step 1: Find the world location of you mouse on the map. You can find how to do it (and how not to do it) [here].
Step 2: Then you need to translate the mouse world location to the maps local coordinate system using: [InverseTransformLocation] or [FTransform’s InverseTransformLocation].
Step 3: Now you need to transform the local coordinate to UV space, which is 0-1 for both U and V of your texture.
Step 4: the hardest part now, is to find the actual color value with the UV coordinate. There is an answer for that already [here]. Just multiply your U and V with width and height of the texture respectively and you will find your color at that pixel.
Step 5: from here take the color and find the province index from a list.
That is the logic behind it. Visualization of this is another beast. There are few ways to achieve this. The terrain could be 2D or 3D (using the landscape tool or a custom terrain solution). The borders could be visualized by building an alpha mask from the province bitmap.
Every time you hover/select a province you could create a dynamic alpha map to either outline or highlight provinces or their borders.
I have the same problem, have you solved it?