Skip to content

Instantly share code, notes, and snippets.

@Shfty
Last active December 18, 2019 01:30
Show Gist options
  • Save Shfty/3d9a41e772f95b7436f742b8494beb8c to your computer and use it in GitHub Desktop.
Save Shfty/3d9a41e772f95b7436f742b8494beb8c to your computer and use it in GitHub Desktop.
Qodot Changelog

Qodot Changelog

1.5.0

Note

Qodot 1.5.0 introduces changes to the build system and geometry generation pipelines. In order to benefit from the optimizations and fixes, you will need to reinstance any QodotMap nodes and rebuild your maps.

New Features
  • New build pipeline system
    • Map building is now orchestrated by a pipeline, which defines a list of build steps that operate on a shared context
    • Build steps can operate on data inside the context, add data to the context, and attach nodes to QodotMap's subtree using nested string-keyed paths
    • Build steps represent things like parsing the map file, loading textures, generating mesh and collision geometry, etc
    • This can be used to mix-and-match existing build functionality, as well as implement game-specific custom build pipelines
    • Build speed is further improved
    • The tree will now populate as each build step completes, resulting in reduced editor hangs
    • QodotMap can now output per-step profiling data to the log
  • Upgraded QodotMap inspector UI
    • Assembles a build pipeline from a set of property dropdowns
    • Support for mix-matching different sub-pipelines (ex. visuals, collision, triggers, etc)
    • Pipeline assembly can be overridden with a custom build pipeline
  • Atlased mesh support
    • Trades draw calls for raw rasterization cost by aggregating geometry into a single mesh with a texture atlas
    • Higher performance than mesh-per-material
    • Currently limited - no static light baking, PBR texturing or shader support
  • Concave collision support
    • Multiple brushes can now be packed into a single concave collision mesh
    • This can be done on a single, per-entity or per-brush basis
  • Single / per-entity / per-brush splitting for both visuals and collision
  • Static lighting support
    • Meshes can now have their UV2 unwrapped for static light baking
  • Import support for palette.lmp and texture .WAD files
    • QodotMap can now be given a set of WAD files to consider during texture building
  • Map file format is now detected automatically
  • Basic support for Quake-style light entities
  • QodotSpatial nodes are now locked by default in the editor to prevent accidental interaction
Fixes
  • Generated mesh tangents are now correct
    • Skewed textures in Valve format will still show artifacts
      • This is a Godot limitation, as the engine does not support non-transverse vertex tangents
      • Can be worked around by calculating tangents in a custom shader
  • Fixed incorrect rotation application for standard-format UVs
  • Rare cases of brush faces with less than 3 vertices are culled, thus preventing geometry errors
  • Fix thread pool attempting to join inactive threads
  • Inverse scale factor is now applied at parse-time, reducing dependencies throughout the build process
  • Proper parent class checking for QodotMap child clearing
Misc
  • Overhauled wiki documentation

1.4.0

Note

Qodot 1.4.0 introduces further changes to both the import and map generation systems. In order to benefit from the optimizations and fixes, you will need to reimport your .map files (preferably wiping their inline .import files as well as any entries in the .imports folder), reinstance any QodotMap nodes, and rebuild your maps.

New Features
  • Restructured build system

    • The map build is now decomposed into QodotBuildStep classes that operate on a shared context
    • Individual build steps can output nodes for tree attachment, and/or arbitrary data for later use
    • Each step has a _run method that can be overridden to implement thread-pooled operations
    • Each step also has a _finalize method that runs on the main thread at the end of the build
      • This can be used to bring together generated data and add it to the scene tree in a thread-safe manner
    • Tree structure is no longer enforced, allowing nodes to attach themselves at arbitrarily nested child indices
  • QodotMap now has an option to output messages to the log during the build

    • These include build steps, entity and face counts, and a total build time for profiling purposes
  • QodotMap now has a configurable 'bucket size' option, allowing the user to define how many jobs a thread should execute before fetching a new set from the pending list

    • This can be used to reduce time spent fetching data for maps with many entities and brushes
Fixes
  • Heavily optimized build pipeline
    • Threading is now safer, faster, and outputs no unnecessary errors to the log
      • Threads are no longer joined upon finishing a job, and instead operate on-demand using semaphores
      • Thread data is returned to the main thread using a deferred function call
      • All threads are properly disposed of upon job completion
      • Thread-unsafe visual and physics interactions (creating meshes, collision objects) has been moved to the main thread build finalization step
    • Brush meshes are now aggregated based on their material, instead of being created individually per-face
      • This massively reduces draw calls, and should provide a performance boost on low-to-mid-end hardware
      • Textures are now read from the .map file, loaded and assigned materials in a build prepass, preventing any unnecessary loads during geometry building
      • Per-face behaviour is still available via the QodotBuildBrushFaceMeshes build step for debugging purposes
    • QodotMap's max thread count option is now properly respected, rather than locking to 4 at all times
    • The QuakeMapFile import plugin no longer specifies an invalid resource class
      • This prevents error log spam upon opening the project
      • Also prevents a potential lockup upon interacting with the editor during the aforementioned log spam
    • Due to the new thread-safe tree population, the map will no longer populate the scene in real-time during build
      • As a trade-off, build speed has been markedly improved
Misc
  • Non-plugin files have been excluded from .zip downloads via .gitattributes, making for considerably smaller downloads via the Godot Asset Library
  • Documentation has been moved from README.md into the GitHub wiki
  • Tidied up unused code

1.3.0

Note

Qodot 1.3.0 introduces several major new features and critical fixes, including changes to the map import workflow. This means all maps will need to be reimported under the new format, and QodotMap nodes will need to be updated with new parameters and regenerated.

New Features
  • Threaded geometry generation

    • Geometry building is now done on a per-entity job basis with pooled worker threads
    • This means the editor no longer locks up during load, and results are shown in real-time
    • Larger maps (such as ad_chapters) can now be loaded more reliably
      • Be aware, truly massive maps like ad_sepulcher are likely to run into memory issues
    • Maximum thread count defaults to 4, and is exposed as a QodotNode editor property
  • Automatic PBR texture / SpatialMaterial workflow

    • The geometry generator now prioritizes SpatialMaterial assets over textures, and will apply them if one is found with the appropriate texture path and name.
    • If no material is present, the generator will check for a folder with the same name as the texture and scan it for the following PBR textures:
      • *_normal
      • *_metallic
      • *_roughness
      • *_emissive
      • *_ao
      • *_depth
    • If found, these textures will be applied to the default material provided in the inspector
      • If no default material is present, a new SpatialMaterial will be generated and the textures applied to it
  • Overhauled map import pipeline

    • Map file data is no longer saved to the .import folder as an intermediary .tres
      • This is due to the godot Resource type not being designed for massive nested datasets
      • Loading so much information (ex. E1M1.MAP) causes the editor to lock on load due to UI element instantiation
    • Instead, .map files are read into intermediary format just before parse
      • This is several orders of magnitude faster, resulting in a ~1s parse time for E1M1.MAP
      • Map format is now governed by a dropdown on the QodotMap node
    • A skeleton import format is still present for the sake of having the editor recognize .map files
      • For now, it contains only an auto-incrementing revision number for convenience
  • Overhauled custom node spawning

    • The inheritance interface has been separated out into entity, brush and face-specific *Mapper classes
    • Currently, these govern the spawning of visual geometry, collision geometry, entities, and collision objects
    • All existing functions have been upgraded to receive the full entity / brush / face data object instead of an arbitrary subset of its properties
  • Support for the CLIP and SKIP special texture names

    • Brushes that are fully-textured with a texture name containing "clip" will omit their visual component, but retain collision
    • Faces textured with a texture name containing "skip" will omit their visual component, but still contribute to the collision mesh
Fixes
  • Fixed plane intersection algorithm losing accuracy if not close to the origin

    • Vertices will no longer be missing for mid-to-far-away brushes
  • Entity brushes no longer spawn rotated about the world Y axis

    • EntityMapper-created nodes now spawn rotated around their local Y axis
  • Qodot no longer throws a script error on case-sensitive operating systems

  • Import plugin no longer attempts to force-reload saved .map files

  • Convex collision no longer generates duplicate vertices

Misc
  • Switched from CC-BY 4.0 to the MIT license

  • Codebase switched from Plane to Face nomenclature

1.2.0

Note

Qodot 1.2.0 introduces breaking changes, so any existing maps will need to be reimported under the Standard preset, and any instances of the QuakeMapNode script will need to be replaced with the new (renamed) QodotMap script.

Changes
  • Full support for all Quake 1-derived map formats

    • Valve 220 UV mapping system
    • Brush face bitmasks for Quake 2, Quake 3, Quake 3 (Legacy), and Daikatana
    • An undocumented Hexen 2 face property, parsed as an integer for now
    • Per-format editor import presets
    • Updated TrenchBroom game definition with support for all map formats
  • QuakeMapNode has been renamed to QodotMap for consistency between Quake* classes that represent map file data and Qodot* classes that form a map's Godot-side representation.

  • Restructured entity node layout

    • Entity nodes are now fully Qodot-owned and managed throughout their lifecycle
    • Entity nodes are now QodotEntity instances, and expose their map file-defined properties to the inspector for easy browsing
    • QodotMap now identifies its children by class when clearing and recreating its internal node hierarchy, so any direct non-Qodot children will no longer be destroyed on reconstruction
  • Rewritten custom node setup

    • Added QodotEntityMapper to control node spawning based on entity data
    • Custom nodes now exist separately from entity nodes
      • This has the pleasant side-effect of preserving the initial level state directly in the hierarchy, which could be used alongside game-specific cleanup code for instant map restarts
  • Brand new example map showing off Valve-format texture skewing

  • Resource scripts have been moved into an appropriately-named folder

  • Double-quotes replaced with single-quotes throughout the codebase

1.1.0

  • Reformatted repo as an example project with Qodot in the addons folder

1.0.0

  • Initial implementation
  • Geometry support for all Quake-derived map formats
  • Texture and UV support for Quake 1, Quake 2, Quake 3, Hexen 2 and Daikatana maps
  • Basic entity spawning support that can be extended with game-specific behavior
  • Automated trimesh collision generation
  • Basic TrenchBroom game profile
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment