Refactoring Arx Fatalis: Difference between revisions
No edit summary |
(Update done items) |
||
(5 intermediate revisions by one other user not shown) | |||
Line 3: | Line 3: | ||
== Scripting == | == Scripting == | ||
* Parse scripts into some form of IR instead of executing directly. | * Parse scripts into some form of IR instead of executing directly. | ||
* Share loaded scripts between IOs | * Share loaded scripts between IOs | ||
* Match timers by name when loading savegames | * Match timers by name when loading savegames | ||
== Savegames == | == Savegames == | ||
Line 17: | Line 15: | ||
== Audio == | == Audio == | ||
* Implement environmental effects (reverb) for the OpenAL backend using the EFX OpenAL extension. Reverb | * Implement environmental effects (reverb) for the OpenAL backend using the EFX OpenAL extension. Reverb was available in the DirectSound backend when EAX is available (Creative drivers only?) | ||
== Interface == | == Interface == | ||
Line 36: | Line 34: | ||
* Vertex transformation is done on the CPU, except for static scene meshes | * Vertex transformation is done on the CPU, except for static scene meshes | ||
** Animation is done on the CPU | ** Animation is done on the CPU | ||
* Vertices are already managed in vertex buffers, there is little of the immediate mode GL API | * Vertices are already managed in vertex buffers, there is little of the immediate mode GL API | ||
Line 43: | Line 39: | ||
* We don't have any shader infrastructure | * We don't have any shader infrastructure | ||
** Possibly useful project: [https://github.com/scrawl/shiny shiny] | ** Possibly useful project: [https://github.com/scrawl/shiny shiny] | ||
* We have no infrastructure for post-processing effects | * We have no infrastructure for post-processing effects | ||
Line 54: | Line 48: | ||
* '''Hardware transform & lighting''' | * '''Hardware transform & lighting''' | ||
* What '''OpenGL | * What '''OpenGL versions''' do we want to target? | ||
** Under Linux we should support the open-source Mesa drivers, but for what chipsets | ** Under Linux we should support the open-source Mesa drivers, but for what chipsets | ||
** For OpenGL we may currently technically be able to run with GL 1.5 but really need some extensions to run well | ** For OpenGL we may currently technically be able to run with GL 1.5 but really need some extensions to run well | ||
** OpenGL ES support would be really useful | ** OpenGL ES support would be really useful | ||
* Will we be using '''forward rendering''' (used now) or '''deferred shading''' | * Will we be using '''forward rendering''' (used now) or '''deferred shading''' | ||
Line 87: | Line 79: | ||
== Time == | == Time == | ||
Mostly sane by now: | |||
* Minor issues still exits | |||
* e.g. in the animation system | |||
** look of uses of 'ofRaw' outside TimeTypes.h | |||
Arx has three different concepts of time: | |||
{| class="wikitable sortable center_1 center_2" | |||
! Timer | |||
! Pause | |||
! Slowdown | |||
! Current impl | |||
! Notes | |||
|- | |||
| Interface | |||
| {{N}} | |||
| {{N}} | |||
| ARXTimeMenu | |||
| no abs value needed | |||
|- | |||
| Game | |||
| {{Y}} | |||
| {{Y}} | |||
| delta_time_us (abs) / framedelay (frame) | |||
| abs value stored in save games | |||
|- | |||
| Player | |||
| {{Y}} | |||
| {{N}} | |||
| Original_framedelay | |||
| frame time only, no abs value | |||
|} | |||
'''Interface time''' is only used to animate the GUI - it should not respect any game state such as pause or slowdown. | |||
'''Game time''' is the in-game time (duh!). It is used for in game animations, NPC movements, etc. The speed can be affected by spells such as {{Spell|slow time|userparam=dash}} and it can be stopped completely (when the menu is open). | |||
'''Player time''' is the same as game time, but without any slowdown by spells. This is needeed so that player movement and attacks are not affected by the [[Slow time]] spell. Maybe this is best implemented by applying a player speedup on top of the game time though? | |||
[[Category:Development information]] | [[Category:Development information]] |
Latest revision as of 19:48, 10 February 2018
Subsystems - Discussion regarding the engine initialization and its major components
Scripting
- Parse scripts into some form of IR instead of executing directly.
- Share loaded scripts between IOs
- Match timers by name when loading savegames
Savegames
- Keep the SaveBlock instance open througout the game (and create it at game start to simplify things)
- Autosave when changing levels - almost all needed information is already saved here
- Track which IOs changed and don't always save all of them!
Audio
- Implement environmental effects (reverb) for the OpenAL backend using the EFX OpenAL extension. Reverb was available in the DirectSound backend when EAX is available (Creative drivers only?)
Interface
- Rewrite that mess.
- Fix aspect ratio of some interface elements for non-5:4 resolutions.
Renderer
Current state
- Lighting is done on the CPU
- Static light components are pre-calculated for static scene meshes
- Other lighting is done per frame
- Lighting is per vertex only - there is no support for per-fragment lighting effect (normal maps, ...)
- Vertex transformation is done on the CPU, except for static scene meshes
- Animation is done on the CPU
- Vertices are already managed in vertex buffers, there is little of the immediate mode GL API
- We don't have any shader infrastructure
- Possibly useful project: shiny
- We have no infrastructure for post-processing effects
- This could remove the need for he normal rendering code to know about some spell effects
- This could be useful to reimplement brightness/contrast/gamma, at least in windowed mode or when not otherwise supported.
Goals
- Hardware transform & lighting
- What OpenGL versions do we want to target?
- Under Linux we should support the open-source Mesa drivers, but for what chipsets
- For OpenGL we may currently technically be able to run with GL 1.5 but really need some extensions to run well
- OpenGL ES support would be really useful
- Will we be using forward rendering (used now) or deferred shading
- Transparent objects are in the minority (and often are emissive or don't have normal lighting) while there are many small lights, so deferred shading could be a good option
- However, we probably need to deal with the lights anyway for the shadows and separate real light sources from those that are used to simulate global illumination
- Transparent objects are in the minority (and often are emissive or don't have normal lighting) while there are many small lights, so deferred shading could be a good option
- We want to upgrade the visuals while also staying true to the original game atmosphere
- Some effects that could be nice
- Parallax bump mapping, Legend of Grimrock style :)
- Improved fog
- Nicer water
- Have actual text rendered on in-game notices/signs (just so we have an excuse to implement distance field text rendering)
- Some effects that could be nice
- Long-term goals to keep in mind:
- Support for offscreen rendering and post-processing (with depth buffer available)
- Supports for real shadows (shadow mapping or shadow volumes?)
- Support for HDR rendering
- Support for stereographic rendering
- This means separating updating (physics, animations, ...) and rendering, which is a good idea anyway!
Also see the List of Milestones.
Roadmap
- Separate game logic and rendering code
- TODO
Time
Mostly sane by now:
- Minor issues still exits
- e.g. in the animation system
- look of uses of 'ofRaw' outside TimeTypes.h
Arx has three different concepts of time:
Timer | Pause | Slowdown | Current impl | Notes |
---|---|---|---|---|
Interface | ✗ | ✗ | ARXTimeMenu | no abs value needed |
Game | ✓ | ✓ | delta_time_us (abs) / framedelay (frame) | abs value stored in save games |
Player | ✓ | ✗ | Original_framedelay | frame time only, no abs value |
Interface time is only used to animate the GUI - it should not respect any game state such as pause or slowdown.
Game time is the in-game time (duh!). It is used for in game animations, NPC movements, etc. The speed can be affected by spells such as Slow time () and it can be stopped completely (when the menu is open).
Player time is the same as game time, but without any slowdown by spells. This is needeed so that player movement and attacks are not affected by the Slow time spell. Maybe this is best implemented by applying a player speedup on top of the game time though?