Water.extm: Difference between revisions
imported>Zephenryus m (Fix material index table) |
(→Water Map Data: Fix offsets) |
||
(7 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
{{lowercase}} | |||
<onlyinclude> | <onlyinclude> | ||
[[File:5000000000.water.extm.png|alt=Generated water material map of Hyrule Main Field|thumb|Generated water material map of Hyrule Main Field]] | [[File:5000000000.water.extm.png|alt=Generated water material map of Hyrule Main Field|thumb|Generated water material map of Hyrule Main Field]] | ||
Line 4: | 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 28: | 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 | ||
|- | |- | ||
| | |0x06 | ||
|1 | |1 | ||
|Unsigned Byte | |Unsigned Byte | ||
|<code>materialIndex + 3</code>. This may act as a checksum? | |<code>materialIndex + 3</code>. This may act as a checksum? | ||
|- | |- | ||
| | |0x07 | ||
|1 | |1 | ||
|Unsigned Byte | |Unsigned Byte | ||
Line 46: | Line 47: | ||
|} | |} | ||
<code>height</code> and <code> | <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 57: | Line 58: | ||
<syntaxhighlight lang="c" line="line"> | <syntaxhighlight lang="c" line="line"> | ||
for (int index = 0; index < | for (int index = 0; index < 64 * 64; index++) { | ||
uint x = index % | uint x = index % 64; | ||
uint z = index / | uint z = index / 64; | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 65: | 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 78: | 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 146: | Line 147: | ||
[[Category:File formats]] | [[Category:File formats]] | ||
[[Category:File extensions]] | |||
[[Category:File extensions (STERA)]] |
Latest revision as of 16:37, 26 August 2024
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
|
0x06 | 1 | Unsigned Byte | materialIndex + 3 . This may act as a checksum?
|
0x07 | 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 |
- ↑
z
is expected to be an integer quotient. Thefloor
function can be used if integer division is not supported.