Water.extm: Difference between revisions

From ZeldaMods (Breath of the Wild)
Jump to navigation Jump to search
imported>Zephenryus
m (added lowercase template)
mNo edit summary
 
(5 intermediate revisions by 5 users not shown)
Line 5: Line 5:
</onlyinclude>
</onlyinclude>


== water.extm File Specification ==
==water.extm File Specification==


=== water.extm File Layout ===
===water.extm File Layout===


Each file contains a 64×64 grid. For each vertex there is 8 bytes of data that describe the height of the mesh, the material type and flow speed.
Each file contains a 64×64 grid. For each vertex there is 8 bytes of data that describe the height of the mesh, the material type and flow speed.


=== Water Map Data ===
===Water Map Data===


Each entry in the water data table is 8 bytes long.
Each entry in the water data table is 8 bytes long.
Line 29: Line 29:
|2
|2
|Unsigned Short
|Unsigned Short
|<code>xAxisFlowRate</code>
|<code>xAxisFlowRate</code> 128 = no flow
|-
|-
|0x04
|0x04
|2
|2
|Unsigned Short
|Unsigned Short
|<code>zAxisFlowRate</code>
|<code>zAxisFlowRate</code> 128 = no flow
|-
|-
|0x05
|0x05
Line 47: Line 47:
|}
|}


<code>height</code> and <code>flowSpeed</code> are stored as unsigned shorts, but seem to map to float values. These can be calculated by dividing by the max size of an unsigned short:
<code>height</code> and <code>flowRate</code> are stored as unsigned shorts, but seem to map to float values. These can be calculated by dividing by the max size of an unsigned short:


<syntaxhighlight lang="c" line="line">
<syntaxhighlight lang="c" line="line">
Line 58: Line 58:


<syntaxhighlight lang="c" line="line">
<syntaxhighlight lang="c" line="line">
for (int index = 0; index < 256 * 256; index++) {
for (int index = 0; index < 64 * 64; index++) {
     uint x = index % 256;
     uint x = index % 64;
     uint z = index / 256;
     uint z = index / 64;
}
}
</syntaxhighlight>
</syntaxhighlight>
Line 66: Line 66:
Flow Rates are calculated as <code>(flowRate * 2) - 1</code> and ranges from <code>-1</code> to <code>1</code>. On the x-axis this changes flow direction from East (<code>-1</code>) to West (<code>+1</code>) and on the z-axis from North (<code>-1</code>) to South (<code>+1</code>).
Flow Rates are calculated as <code>(flowRate * 2) - 1</code> and ranges from <code>-1</code> to <code>1</code>. On the x-axis this changes flow direction from East (<code>-1</code>) to West (<code>+1</code>) and on the z-axis from North (<code>-1</code>) to South (<code>+1</code>).


=== Material Index ===
===Material Index===


This data is stored in Terrain.Tex1.bfres.
This data is stored in Terrain.Tex1.bfres.
Line 79: Line 79:
!Google Translated
!Google Translated
|-
|-
|0  
|0
|Water  
|Water
|水  
|水
|Water  
|Water
|Water  
|Water
|0  
|0
|Water
|Water
|-
|-
|1  
|1
|HotWater  
|HotWater
|熱湯  
|熱湯
|Water  
|Water
|Water_Hot  
|Water_Hot
|0  
|0
|Hot water
|Hot water
|-
|-
|2  
|2
|Poison  
|Poison
|毒水  
|毒水
|Water  
|Water
|Water_Poison  
|Water_Poison
|0  
|0
|Poison water
|Poison water
|-
|-
|3  
|3
|Lava  
|Lava
|溶岩  
|溶岩
|Lava  
|Lava
|Lava  
|Lava
|0  
|0
|Lava
|Lava
|-
|-
|4  
|4
|IceWater  
|IceWater
|冷たい水  
|冷たい水
|Water  
|Water
|Water_Ice  
|Water_Ice
|0  
|0
|Cold water
|Cold water
|-
|-
|5  
|5
|Mud  
|Mud
|泥沼  
|泥沼
|Bog  
|Bog
|Bog  
|Bog
|0  
|0
|Bog
|Bog
|-
|-
|6  
|6
|Clear01  
|Clear01
|透明水01  
|透明水01
|Water  
|Water
|Water  
|Water
|0  
|0
|Clear water 01
|Clear water 01
|-
|-
|7  
|7
|Sea  
|Sea
|海  
|海
|Water  
|Water
|Water  
|Water
|0  
|0
|Ocean
|Ocean
|}
|}
Line 147: Line 147:


[[Category:File formats]]
[[Category:File formats]]
[[Category:File extensions]]
[[Category:File extensions (STERA)]]

Latest revision as of 15:16, 10 October 2022

Generated water material map of Hyrule Main Field
Generated water material map of Hyrule Main Field

water.extm files describe the water heightmap and the texture of the main field and add-on content field.


water.extm File Specification

water.extm File Layout

Each file contains a 64×64 grid. For each vertex there is 8 bytes of data that describe the height of the mesh, the material type and flow speed.

Water Map Data

Each entry in the water data table is 8 bytes long.

Offset (h) Size Data Type Description
0x00 2 Unsigned Short height (Vertex y component)
0x02 2 Unsigned Short xAxisFlowRate 128 = no flow
0x04 2 Unsigned Short zAxisFlowRate 128 = no flow
0x05 1 Unsigned Byte materialIndex + 3. This may act as a checksum?
0x06 1 Unsigned Byte materialIndex

height and flowRate are stored as unsigned shorts, but seem to map to float values. These can be calculated by dividing by the max size of an unsigned short:

32767 / 0xffff = 0.5

height is further multiplied by another constant to get the final height (the constant is unknown at this time, but is close to 0x300 / 0xffff).

x and z[1] can be calculated, while iterating through the data table:

for (int index = 0; index < 64 * 64; index++) {
    uint x = index % 64;
    uint z = index / 64;
}

Flow Rates are calculated as (flowRate * 2) - 1 and ranges from -1 to 1. On the x-axis this changes flow direction from East (-1) to West (+1) and on the z-axis from North (-1) to South (+1).

Material Index

This data is stored in Terrain.Tex1.bfres.

id file name attribute attribute_sub flag Google Translated
0 Water Water Water 0 Water
1 HotWater 熱湯 Water Water_Hot 0 Hot water
2 Poison 毒水 Water Water_Poison 0 Poison water
3 Lava 溶岩 Lava Lava 0 Lava
4 IceWater 冷たい水 Water Water_Ice 0 Cold water
5 Mud 泥沼 Bog Bog 0 Bog
6 Clear01 透明水01 Water Water 0 Clear water 01
7 Sea Water Water 0 Ocean
  1. z is expected to be an integer quotient. The floor function can be used if integer division is not supported.