Skip to content

Releases: QodotPlugin/qodot-plugin

Qodot 1.5.5

06 Feb 20:50
Compare
Choose a tag to compare

Features

  • Brush entity normals can now be smoothed by applying a property with key _phong and value 1

Qodot 1.5.4

02 Feb 17:20
aca910d
Compare
Choose a tag to compare

Features

  • Unhandled entity classnames are now created as QodotEntity nodes with a dictionary of properties

  • Basic FGD entity definition export system

    • Currently only supports point entities
    • Create a QodotEntityDefinitionSet resource from the inspector and save it as a file
    • Create QodotPointEntityDefinition resources from the inspector and save them as files
      • Assign instanced scenes to these resources to determine what will be spawned
    • Plug QodotPointEntityDefinition resources into the QodotEntityDefinitionSet
    • Select an output file path in the QodotEntityDefinitionSet
    • Use the Export File checkbox to export an FGD
    • Thanks to DistractedMOSFET

Fixes

  • Prevent material meshes build step from erroring out when encountering a ShaderMaterial

Misc

  • Qodot's primary target is now Godot 3.2
    • No code changes were needed, so it's still compatible with 3.1 for now

Qodot 1.5.3

17 Jan 19:24
Compare
Choose a tag to compare

Features

  • New set_map_file and set_texture_wads setters in QodotMap
    • Allows for file picker UIs to be hooked in via signal/slot

Fixes

  • Prevent collision build step from trying to build with no data
  • Prevent finalize params from being read if they don't exist

Qodot 1.5.2

20 Dec 02:26
Compare
Choose a tag to compare

Fixes

  • Fixed threading behavior under Godot 3.2 beta 4

Qodot 1.5.0

18 Dec 00:49
Compare
Choose a tag to compare

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

Qodot 1.4.0

08 Dec 21:52
Compare
Choose a tag to compare

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

Qodot 1.3.0

04 Dec 23:15
fd6e967
Compare
Choose a tag to compare

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

Qodot 1.2.0

02 Dec 04:59
Compare
Choose a tag to compare

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

Qodot 1.1.0

30 Nov 17:49
Compare
Choose a tag to compare

The first packaged release of Qodot's example content.