3D rendering: Difference between revisions
Marius851000 (talk | contribs) More info on the table. |
Adding some use cases |
||
| (4 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
== 3D Rendering engine == | == 3D Rendering engine == | ||
The Nintendo DS dispose of hardware that can perform 3D rendering in addition to | The Nintendo DS dispose of hardware that can perform 3D rendering in addition to its dedicated 2D system. EoS mostly use the 2D system, but occasionally make use of the 3D engine for some effects. Those are: | ||
* The dialogue box border and background | * The dialogue box border and background | ||
| Line 7: | Line 7: | ||
* Boss transition wipe | * Boss transition wipe | ||
* A few other effect during cutscenes | * A few other effect during cutscenes | ||
| Line 14: | Line 12: | ||
The 3D engine is capable of rendering in 2D, simply by rendering rectangle in front of the virtual camera, which is what EoS always does. The way this game work is by first buffering the elements to render to a buffer and then a function will submit those to render (probably during VBlank), which will then take effect on the next frame. | The 3D engine is capable of rendering in 2D, simply by rendering rectangle in front of the virtual camera, which is what EoS always does. The way this game work is by first buffering the elements to render to a buffer and then a function will submit those to render (probably during VBlank), which will then take effect on the next frame. | ||
The 3D | The DS 3D hardware can only render on the main screen, which in EoS is the bottom screen. Some game (but not EoS) render on both screen by switching the main screen every frame, dividing by two the frame rate from 60 to 30 FPS. | ||
=== Memory management === | |||
The bank D is dedicated to storing the textures used for the 3D render, and bank F is used to store the palettes. Bank D is 128KiB large, and bank F is 16KiB large. The game seems to mostly allocate texture on a multiple of 1KiB, and palette on a multiple of 0x100 bytes, thought it is possible to perform allocation not aligned on those arbitrary values (but it still (maybe, untested) need to be 4-bytes aligned). | |||
The game store its 3D data in WTE files. It contain the texture and the palette, but not where the file will be stored in the RAM, which is specified in the game’s code. Here is table of the (known) allocation the game make. It is probably exhaustive. | The game store its 3D data in WTE files. It contain the texture and the palette, but not where the file will be stored in the RAM, which is specified in the game’s code. Here is table of the (known) allocation the game make. It is probably exhaustive. | ||
ProcessWTE is the function used to load them ( | ProcessWTE is the function used to load them (function address is for EU ROM, but palette and texture allocation have no reason to be different). | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ | |+ | ||
| Line 46: | Line 42: | ||
|1007 to 1011 in dungeon pack | |1007 to 1011 in dungeon pack | ||
|dungeon | |dungeon | ||
| | |Numbers and "Miss" text. Used to display damage taken and misses. | ||
|overlay_29::02336200 | |overlay_29::02336200 | ||
|0x0 | |0x0 | ||
| Line 55: | Line 51: | ||
|1031 or 1003 in dungeon pack | |1031 or 1003 in dungeon pack | ||
|dungeon | |dungeon | ||
| | |1031: Mist/Steam texture. Visual-only effect paired with some tilesets.<br>1003: Poison mist texture used only during Sky Peak boss fight. | ||
|overlay_29::023394e4 or overlay_29::023395f8 | |overlay_29::023394e4 or overlay_29::023395f8 | ||
|0xB000 | |0xB000 | ||
|0x2000 | |0x2000 | ||
|0x1400 | |0x1400 | ||
|unknown how which one is | |unknown how which one is chosen | ||
|- | |- | ||
|1005 in dungeon pack | |1005 in dungeon pack | ||
|dungeon | |dungeon | ||
| | |Sandstorm texture used during its weather condition. | ||
|overlay_29::023394e4 | |overlay_29::023394e4 | ||
|0xD000 | |0xD000 | ||
| Line 73: | Line 69: | ||
|1001 in dungeon pack | |1001 in dungeon pack | ||
|dungeon | |dungeon | ||
| | |Fog texture used during its weather condition. | ||
|overlay_29::023394e4 | |overlay_29::023394e4 | ||
|0xF000 | |0xF000 | ||
| Line 82: | Line 78: | ||
|some between 1012 to 1020 in dungeon pack | |some between 1012 to 1020 in dungeon pack | ||
|dungeon | |dungeon | ||
| | |Level/HP display text and HP bar. | ||
|overlay_29::0233614c | |overlay_29::0233614c | ||
|0x1000 | |0x1000 | ||
|0x400 | |0x400 | ||
|0x200 | |0x200 | ||
|which one depend on language | |which one is loaded depend on language | ||
|- | |- | ||
|c_wipe.wte or w_wipe2.wte | |c_wipe.wte or w_wipe2.wte | ||
| | | | ||
| | |Horizontal bar of differing colors, used by Team Charm's special wipe effect in SE4. | ||
|0x0206afb0 | |0x0206afb0 | ||
| | | | ||
|0x8000 | |0x8000 | ||
| | |0x0 | ||
| | | | ||
|- | |- | ||
|w_heart.wte | |w_heart.wte | ||
| | | | ||
| | |Multiple hearts symbol, filled and shaded. More Team Charm. | ||
|0x0206b000 | |0x0206b000 | ||
| | | | ||
|0x2000 | |0x2000 | ||
| | |0x100 | ||
| | | | ||
|- | |- | ||
|circle.wte | |circle.wte | ||
| | | | ||
| | |Heart symbol, not filled. More Team Charm. | ||
|0x0206b050 | |0x0206b050 | ||
| | | | ||
|0x2000 | |0x2000 | ||
| | |0x200 | ||
| | | | ||
|- | |- | ||
| Line 122: | Line 118: | ||
|0x8000 | |0x8000 | ||
|0x8000 | |0x8000 | ||
| | |0x100 | ||
| | | | ||
|- | |- | ||
|d04p31t1.wte | |d04p31t1.wte | ||
|overworld | |overworld | ||
|waterfall cave diamond | |big wave of the waterfall cave diamond | ||
|overlay_11::02314b9c | |overlay_11::02314b9c | ||
|0x0 | |0x0 | ||
|0x4800 | |0x4800 | ||
| | |0x0 | ||
| | | | ||
|- | |- | ||
| Line 140: | Line 136: | ||
|0x0 | |0x0 | ||
|0x8000 | |0x8000 | ||
| | |0x0 | ||
| | | | ||
|- | |- | ||
|p03p01t1.wte | |p03p01t1.wte | ||
|overworld | |overworld | ||
| | |Fog texture for Groudon Statue cutscene. | ||
|overlay_11::02314eec | |overlay_11::02314eec | ||
overlay_11::022f33d8 | overlay_11::022f33d8 | ||
|0x0 | |0x0 | ||
|0x6000 | |0x6000 | ||
| | |0x0 | ||
| | | | ||
|- | |- | ||
|frameX.wte (where X is | |frameX.wte (where X is between 0 to 4) | ||
|both | |both | ||
|dialog box frame | |dialog box frame | ||
| Line 164: | Line 160: | ||
|t01p01t1.wte | |t01p01t1.wte | ||
|overworld | |overworld | ||
| | |Treasure Town cloud shadows. | ||
|overlay_11::022f3368 (loading weather 1) | |overlay_11::022f3368 (loading weather 1) | ||
|0x0 | |0x0 | ||
|0x4000 | |0x4000 | ||
| | |0x0 | ||
| | | | ||
|- | |- | ||
|t01p01t2.wte | |t01p01t2.wte | ||
|overworld | |overworld | ||
| | |More Treasure Town cloud shadows. | ||
|overlay_11::022f3394 (loading weather 1) | |overlay_11::022f3394 (loading weather 1) | ||
|0x4000 | |0x4000 | ||
|0x4000 | |0x4000 | ||
| | |0x100 | ||
| | | | ||
|- | |- | ||
|d73p41t1.wte | |d73p41t1.wte | ||
|overworld | |overworld | ||
| | |Poison mist. Only used on top of Sky Peak on first visit. | ||
|overlay_11::022f341c (loading weather 3) | |overlay_11::022f341c (loading weather 3) | ||
|0x0 | |0x0 | ||
|0x6000 | |0x6000 | ||
| | |0x0 | ||
| | | | ||
|} | |} | ||
Based on those allocations, it seems that VRAM from 0x11000 to 0x1EFFF (included) are free to be used both in overworld and dungeon. For the palette, it seems everything from 0x300 to 0x13FF (included) are unused. | |||
==== Loading texture ==== | |||
Once you have your texture in the WTE format saved in the rom, you need to call a function to load WTE ('''LoadWteFromRom''') and then copy stuff to the appropriate texture RAM with '''ProcessWTEWrapper''' (this will create a task to process the copy, once access to texture-RAM is safe), and then call '''DelayWTEFree''' (to make sure the original texture is freed once copy to texture-RAM is finished). | |||
Latest revision as of 19:22, 6 October 2025
3D Rendering engine
The Nintendo DS dispose of hardware that can perform 3D rendering in addition to its dedicated 2D system. EoS mostly use the 2D system, but occasionally make use of the 3D engine for some effects. Those are:
- The dialogue box border and background
- Rendering of the quick status at the top of the bottom screen during a dungeon
- The various weather effect
- Boss transition wipe
- A few other effect during cutscenes
The 3D engine is capable of rendering in 2D, simply by rendering rectangle in front of the virtual camera, which is what EoS always does. The way this game work is by first buffering the elements to render to a buffer and then a function will submit those to render (probably during VBlank), which will then take effect on the next frame.
The DS 3D hardware can only render on the main screen, which in EoS is the bottom screen. Some game (but not EoS) render on both screen by switching the main screen every frame, dividing by two the frame rate from 60 to 30 FPS.
Memory management
The bank D is dedicated to storing the textures used for the 3D render, and bank F is used to store the palettes. Bank D is 128KiB large, and bank F is 16KiB large. The game seems to mostly allocate texture on a multiple of 1KiB, and palette on a multiple of 0x100 bytes, thought it is possible to perform allocation not aligned on those arbitrary values (but it still (maybe, untested) need to be 4-bytes aligned).
The game store its 3D data in WTE files. It contain the texture and the palette, but not where the file will be stored in the RAM, which is specified in the game’s code. Here is table of the (known) allocation the game make. It is probably exhaustive.
ProcessWTE is the function used to load them (function address is for EU ROM, but palette and texture allocation have no reason to be different).
| file location | dungeon or overworld | description | call to ProcessWTE | texture offset | texture size (bytes) | palette offset | note |
|---|---|---|---|---|---|---|---|
| 1025 in dungeon pack | dungeon | overlay_29::022eda20 | 0x400 | 0xc00 | 0x1d00 | ||
| 1007 to 1011 in dungeon pack | dungeon | Numbers and "Miss" text. Used to display damage taken and misses. | overlay_29::02336200 | 0x0 | 0x400 | 0x0 | which one is loaded depend on language |
| 1031 or 1003 in dungeon pack | dungeon | 1031: Mist/Steam texture. Visual-only effect paired with some tilesets. 1003: Poison mist texture used only during Sky Peak boss fight. |
overlay_29::023394e4 or overlay_29::023395f8 | 0xB000 | 0x2000 | 0x1400 | unknown how which one is chosen |
| 1005 in dungeon pack | dungeon | Sandstorm texture used during its weather condition. | overlay_29::023394e4 | 0xD000 | 0x2000 | 0x1500 | |
| 1001 in dungeon pack | dungeon | Fog texture used during its weather condition. | overlay_29::023394e4 | 0xF000 | 0x2000 | 0x1600 | |
| some between 1012 to 1020 in dungeon pack | dungeon | Level/HP display text and HP bar. | overlay_29::0233614c | 0x1000 | 0x400 | 0x200 | which one is loaded depend on language |
| c_wipe.wte or w_wipe2.wte | Horizontal bar of differing colors, used by Team Charm's special wipe effect in SE4. | 0x0206afb0 | 0x8000 | 0x0 | |||
| w_heart.wte | Multiple hearts symbol, filled and shaded. More Team Charm. | 0x0206b000 | 0x2000 | 0x100 | |||
| circle.wte | Heart symbol, not filled. More Team Charm. | 0x0206b050 | 0x2000 | 0x200 | |||
| s13p01t1.wte | overworld | boss wipe graphic | overlay_11::02316d4c | 0x8000 | 0x8000 | 0x100 | |
| d04p31t1.wte | overworld | big wave of the waterfall cave diamond | overlay_11::02314b9c | 0x0 | 0x4800 | 0x0 | |
| v15p03t1.wte | overworld | Some crystal cave crystals | overlay_11::02314d20 | 0x0 | 0x8000 | 0x0 | |
| p03p01t1.wte | overworld | Fog texture for Groudon Statue cutscene. | overlay_11::02314eec
overlay_11::022f33d8 |
0x0 | 0x6000 | 0x0 | |
| frameX.wte (where X is between 0 to 4) | both | dialog box frame | 0x020274e4 | 0x1F000 | 0x800 | 0x1F00 | |
| t01p01t1.wte | overworld | Treasure Town cloud shadows. | overlay_11::022f3368 (loading weather 1) | 0x0 | 0x4000 | 0x0 | |
| t01p01t2.wte | overworld | More Treasure Town cloud shadows. | overlay_11::022f3394 (loading weather 1) | 0x4000 | 0x4000 | 0x100 | |
| d73p41t1.wte | overworld | Poison mist. Only used on top of Sky Peak on first visit. | overlay_11::022f341c (loading weather 3) | 0x0 | 0x6000 | 0x0 |
Based on those allocations, it seems that VRAM from 0x11000 to 0x1EFFF (included) are free to be used both in overworld and dungeon. For the palette, it seems everything from 0x300 to 0x13FF (included) are unused.
Loading texture
Once you have your texture in the WTE format saved in the rom, you need to call a function to load WTE (LoadWteFromRom) and then copy stuff to the appropriate texture RAM with ProcessWTEWrapper (this will create a task to process the copy, once access to texture-RAM is safe), and then call DelayWTEFree (to make sure the original texture is freed once copy to texture-RAM is finished).