diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css
index 5a6dd193..b286e5e3 100644
--- a/docs/assets/stylesheets/extra.css
+++ b/docs/assets/stylesheets/extra.css
@@ -17,3 +17,116 @@
.md-typeset :focus-within > .md-annotation__index > ::before {
transform: none;
}
+
+.sp-list {
+ padding: 0 !important;
+ margin: 0 !important;
+ list-style-type: none;
+}
+
+.sp-prop {
+ margin-top: -1em;
+ margin-bottom: 1em;
+ font-family: monospace;
+ font-size: 0.7em;
+ border: 1px solid #333333;
+ padding: 5px 0.5rem;
+}
+
+.t-int::before {
+ content: url("/assets/icons/spacer-int.png");
+}
+
+.t-float::before {
+ content: url("/assets/icons/spacer-float.png");
+}
+
+.t-str::before {
+ content: url("/assets/icons/spacer-string.png");
+}
+
+.t-raw::before {
+ content: url("/assets/icons/spacer-misc.png");
+}
+
+.t-vec::before {
+ content: url("/assets/icons/spacer-vec.png");
+}
+
+.t-bool::before {
+ content: url("/assets/icons/spacer-bool.png");
+}
+
+.t-enum::before {
+ content: url("/assets/icons/spacer-enum.png");
+}
+
+.sp-folder {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-folder.png');
+ font-family: monospace;
+}
+
+.sp-type {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-type.png');
+ font-family: monospace;
+}
+
+.sp-int {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-int.png');
+ font-family: monospace;
+}
+
+.sp-string {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-string.png');
+ font-family: monospace;
+}
+
+.sp-misc {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-misc.png');
+ font-family: monospace;
+}
+
+.sp-bool {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-bool.png');
+ font-family: monospace;
+}
+
+.sp-enum {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-enum.png');
+ font-family: monospace;
+}
+
+.sp-vec {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-vec.png');
+ font-family: monospace;
+}
+
+.sp-float {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-float.png');
+ font-family: monospace;
+}
+
+.sp-save {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ list-style-image: url('/assets/icons/spacer-save.png');
+ font-family: monospace;
+}
diff --git a/docs/engine/objects/zCVob.md b/docs/engine/objects/zCVob.md
new file mode 100644
index 00000000..90ad2508
--- /dev/null
+++ b/docs/engine/objects/zCVob.md
@@ -0,0 +1,227 @@
+# zCVob
+
+!!! abstract inline end "Quick Infos"
+ **Type:** Virtual Object
+ **Format Name:** ZenGin Archive
+ **File Extension:** `.ZEN`
+ **Class Name:** `zCVob`
+ **Version Identifier:**
+ — Gothic I: `12289`
+ — Gothic II: `52224`
+ **ZenKit Class:** `VirtualObject`
+
+Represents so-called virtual objects which appear in the game world. `zCVob` is the base class for all virtual
+objects which include everything from static models like boxes to interactive elements like doors and chests and
+invisible trigger objects. They are also referred to as VObjects in this documentation.
+
+
Indicates that the object should be animated as if shifting in strong wind. Used mostly for /// animating grass and other small foliage.
- /// - /// \see http://www.gothic-library.ru/publ/class_zcvob/1-1-0-467#visualAniMode WIND = 1, /// \brief Light wind animation. /// ///Indicates that the object should be animated as if shifting in light wind. Used mostly for /// animating trees.
- /// - /// \see http://www.gothic-library.ru/publ/class_zcvob/1-1-0-467#visualAniMode WIND_ALT = 2, // Deprecated entries. @@ -100,6 +96,8 @@ namespace zenkit { /// ///This field conains the name of the source file of the visual. A mesh visual, for example, will end in /// `.3DS` since that is the original file format of the mesh.
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#visual std::string name; }; @@ -272,6 +270,7 @@ namespace zenkit { /// /// \note Virtual objects should not be loaded manually. They are embedded into world archives and are automatically /// loaded when the world is loaded. + /// \see https://zk.gothickit.dev/engine/objects/zCVob/ struct VirtualObject : Object { ZK_OBJECT(ObjectType::zCVob); @@ -303,15 +302,19 @@ namespace zenkit { uint32_t id ZKREM("scheduled for removal; refer to documentation") = 0; /// \brief The bounding box of this VObject. + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#bbox3dws AxisAlignedBoundingBox bbox = AxisAlignedBoundingBox::zero(); /// \brief The position of this VObject in virtual space. + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#trafoostowspos glm::vec3 position = glm::vec3 {0}; /// \brief The rotation of this VObject in virtual space. + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#trafoostowsrot glm::mat3x3 rotation = glm::identityThe value of this field indicates, if and how this VObject should align itself with the camera. This may /// be used with grass or flowers which only consist of a 2-dimensional sprite to have it always face the /// camera, for example. See zenkit::SpriteAlignment for additional details.
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#visualcamalign SpriteAlignment sprite_camera_facing_mode = SpriteAlignment::NONE; /// \brief Indicates whether this VObject should collide with other VObjects. @@ -326,12 +331,16 @@ namespace zenkit { ///This is used for placing the object in the ZenGin map editor, the Spacer, where it will prevent /// the VObject being placed wither other VObjects. This setting is irrelevant for runtime collision /// detection
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#cdstatic bool cd_static = true; /// \brief Indicates whether this VObject should collide with dynamic objects. /// ///For this purpose, dynamic objects are the player, NPCs and items. If this flag is set, implementations /// should apply collision detection to this VObject.
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#cddyn bool cd_dynamic = true; /// \brief Indicates whether this VObject should be included during static lighting calculations. @@ -339,11 +348,15 @@ namespace zenkit { ///These lighting calculations are done at compile-time and will bake VObjects with this flag into the /// light-maps available from the world mesh. If set to `true`, this VObject may be excluded from dynamic /// lighting if the light-maps are used.
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#vobstatic bool vob_static = false; /// \brief The type of dynamic shadow to be used. /// ///See zenkit::ShadowType for information about available shadow types.
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#dynShadow ShadowType dynamic_shadows = ShadowType::NONE; /// \brief Indicates whether this VObject has enabled physics. @@ -351,40 +364,59 @@ namespace zenkit { ///This field represents internal state of the ZenGin which is written to disk only for a certain world /// format type. It is not possible to set this field ZenGin's world editor, the Spacer, for example. /// This makes this field unreliable, since it is only available for some VObjects.
- bool physics_enabled = true; + ZKREM("Unreliable. No alternative available yet.") bool physics_enabled = true; /// \brief The type of wind animation to apply to the VObject. + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#visualanimode AnimationType anim_mode = AnimationType::NONE; /// \brief The depth-bias for this VObject. /// ///This value is passed directly to Direct3D when rendering the associated visual of this VObject. Sadly, - /// because documentation is not really available for the very old Direct3D version used by the ZenGin, the + /// because documentation is not available for the very old Direct3D version used by the ZenGin, the /// exact behavior it would have resulted in are unknown.
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#zbias std::int32_t bias = 0; /// \brief Indicates that this VObject is ambient. /// - ///It looks like this VObject setting was a system used duing development when access to the game's source + ///
It looks like this VObject setting was a system used during development when access to the game's source /// code was available. Basically, the global variable `zCWorld::s_bAmbientVobsEnabled` could be used to hide or /// show VObjects which have the `isAmbient` flag set. In release builds, this variable is always set to `true`, - /// thus the `isAmbient` flag does not have any percievable effect on the game.
+ /// thus the `isAmbient` flag does not have any perceivable effect on the game. ///It follows, that this field should be ignored by most implementations.
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#isambient bool ambient = false; /// \brief Indicates the strength of the animation set through #anim_mode. /// ///Essentialy, this controls the strength of the wind to be animated using the given #anim_mode. This value /// is ignored if #anim_mode is AnimationType::NONE
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#visualanimodestrength float anim_strength = 0; + + /// \brief Indicates the draw distance of this VObject. + /// + ///Its value should be between 0 and 2. 0 Means, that this object is never drawn on screen but collisions + /// are still calculated. A value of 2 means, that the the draw distance of this VObject is the same as the draw + /// distance specified in the zenkit::VZoneFarPlane object
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#vobfarclipzscale float far_clip_scale = 2.0; + /// \brief The name of the template used to create this VObject in the Spacer. + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#presetname std::string preset_name; /// \brief The name of this VObject. /// - ///The name of this VObject. VObject names are not necessarily unique but are sometimes helpful for + ///
VObject names are not necessarily unique but are sometimes helpful for /// identfying them in ZenGin's original map editor, the Spacer.
+ /// + /// \see https://zk.gothickit.dev/engine/objects/zCVob/#vobname std::string vob_name; std::string visual_name ZKREM("use VirtualObject::visual::name instead") {}; @@ -394,7 +426,7 @@ namespace zenkit { /// \brief The visual data associated with this VObject. /// ///All supported visuals except the zenkit::VisualDecal do not contain any additional information. To - /// determine the type of attached visual, simply access zenkit::VisualDecal::type
+ /// determine the type of attached visual, check zenkit::VisualDecal::type std::shared_ptr